0000: 23 69 66 64 65 66 20 48 41 56 45 5f 43 4f 4e 46 #ifdef HAVE_CONF
0010: 49 47 5f 48 0a 23 69 6e 63 6c 75 64 65 20 22 63 IG_H.#include "c
0020: 6f 6e 66 69 67 2e 68 22 0a 23 65 6e 64 69 66 0a onfig.h".#endif.
0030: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 57 49 4e .#ifdef HAVE_WIN
0040: 54 59 50 45 53 5f 48 0a 23 20 20 69 6e 63 6c 75 TYPES_H.# inclu
0050: 64 65 20 3c 77 69 6e 74 79 70 65 73 2e 68 3e 0a de <wintypes.h>.
0060: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 #endif.#ifdef HA
0070: 56 45 5f 50 43 53 43 4c 49 54 45 5f 48 0a 23 20 VE_PCSCLITE_H.#
0080: 20 69 6e 63 6c 75 64 65 20 3c 70 63 73 63 6c 69 include <pcscli
0090: 74 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 te.h>.#endif.#if
00a0: 64 65 66 20 48 41 56 45 5f 57 49 4e 53 43 41 52 def HAVE_WINSCAR
00b0: 44 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c D_H.# include <
00c0: 77 69 6e 73 63 61 72 64 2e 68 3e 0a 23 65 6e 64 winscard.h>.#end
00d0: 69 66 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 if.#ifdef HAVE_S
00e0: 54 44 49 4e 54 5f 48 0a 23 20 20 69 6e 63 6c 75 TDINT_H.# inclu
00f0: 64 65 20 3c 73 74 64 69 6e 74 2e 68 3e 0a 23 65 de <stdint.h>.#e
0100: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45 ndif.#ifdef HAVE
0110: 5f 49 4e 54 54 59 50 45 53 5f 48 0a 23 20 20 69 _INTTYPES_H.# i
0120: 6e 63 6c 75 64 65 20 3c 69 6e 74 74 79 70 65 73 nclude <inttypes
0130: 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 .h>.#endif.#ifde
0140: 66 20 48 41 56 45 5f 53 54 44 4c 49 42 5f 48 0a f HAVE_STDLIB_H.
0150: 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c # include <stdl
0160: 69 62 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 ib.h>.#endif.#if
0170: 64 65 66 20 48 41 56 45 5f 55 4e 49 53 54 44 5f def HAVE_UNISTD_
0180: 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 75 6e H.# include <un
0190: 69 73 74 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 istd.h>.#endif.#
01a0: 69 66 64 65 66 20 48 41 56 45 5f 53 54 52 49 4e ifdef HAVE_STRIN
01b0: 47 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c G_H.# include <
01c0: 73 74 72 69 6e 67 2e 68 3e 0a 23 65 6e 64 69 66 string.h>.#endif
01d0: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 50 54 48 .#ifdef HAVE_PTH
01e0: 52 45 41 44 5f 48 0a 23 20 20 69 6e 63 6c 75 64 READ_H.# includ
01f0: 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 65 e <pthread.h>.#e
0200: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45 ndif.#ifdef HAVE
0210: 5f 4c 49 4d 49 54 53 5f 48 0a 23 20 20 69 6e 63 _LIMITS_H.# inc
0220: 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a lude <limits.h>.
0230: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 #endif.#ifdef HA
0240: 56 45 5f 53 54 44 49 4f 5f 48 0a 23 20 20 69 6e VE_STDIO_H.# in
0250: 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a clude <stdio.h>.
0260: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 48 #endif.#define H
0270: 41 56 45 5f 45 52 52 4e 4f 5f 48 20 31 0a 23 69 AVE_ERRNO_H 1.#i
0280: 66 64 65 66 20 48 41 56 45 5f 45 52 52 4e 4f 5f fdef HAVE_ERRNO_
0290: 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 65 72 H.# include <er
02a0: 72 6e 6f 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 rno.h>.#endif.#i
02b0: 66 64 65 66 20 48 41 56 45 5f 5a 4c 49 42 5f 48 fdef HAVE_ZLIB_H
02c0: 0a 23 20 20 69 66 64 65 66 20 48 41 56 45 5f 4c .# ifdef HAVE_L
02d0: 49 42 5a 0a 23 20 20 20 20 69 6e 63 6c 75 64 65 IBZ.# include
02e0: 20 3c 7a 6c 69 62 2e 68 3e 0a 23 20 20 65 6e 64 <zlib.h>.# end
02f0: 69 66 0a 23 65 6c 73 65 0a 23 20 20 69 66 64 65 if.#else.# ifde
0300: 66 20 48 41 56 45 5f 4c 49 42 5a 0a 23 20 20 20 f HAVE_LIBZ.#
0310: 20 75 6e 64 65 66 20 48 41 56 45 5f 4c 49 42 5a undef HAVE_LIBZ
0320: 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 .# endif.#endif
0330: 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44 .#ifdef CACKEY_D
0340: 45 42 55 47 5f 53 45 41 52 43 48 5f 53 50 45 45 EBUG_SEARCH_SPEE
0350: 44 54 45 53 54 0a 23 20 20 69 6e 63 6c 75 64 65 DTEST.# include
0360: 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a 23 65 <sys/time.h>.#e
0370: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 43 4b ndif..#define CK
0380: 5f 50 54 52 20 2a 0a 23 64 65 66 69 6e 65 20 43 _PTR *.#define C
0390: 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f K_DEFINE_FUNCTIO
03a0: 4e 28 72 65 74 75 72 6e 54 79 70 65 2c 20 6e 61 N(returnType, na
03b0: 6d 65 29 20 72 65 74 75 72 6e 54 79 70 65 20 6e me) returnType n
03c0: 61 6d 65 0a 23 64 65 66 69 6e 65 20 43 4b 5f 44 ame.#define CK_D
03d0: 45 43 4c 41 52 45 5f 46 55 4e 43 54 49 4f 4e 28 ECLARE_FUNCTION(
03e0: 72 65 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d 65 returnType, name
03f0: 29 20 72 65 74 75 72 6e 54 79 70 65 20 6e 61 6d ) returnType nam
0400: 65 0a 23 64 65 66 69 6e 65 20 43 4b 5f 44 45 43 e.#define CK_DEC
0410: 4c 41 52 45 5f 46 55 4e 43 54 49 4f 4e 5f 50 4f LARE_FUNCTION_PO
0420: 49 4e 54 45 52 28 72 65 74 75 72 6e 54 79 70 65 INTER(returnType
0430: 2c 20 6e 61 6d 65 29 20 72 65 74 75 72 6e 54 79 , name) returnTy
0440: 70 65 20 28 2a 20 6e 61 6d 65 29 0a 23 64 65 66 pe (* name).#def
0450: 69 6e 65 20 43 4b 5f 43 41 4c 4c 42 41 43 4b 5f ine CK_CALLBACK_
0460: 46 55 4e 43 54 49 4f 4e 28 72 65 74 75 72 6e 54 FUNCTION(returnT
0470: 79 70 65 2c 20 6e 61 6d 65 29 20 72 65 74 75 72 ype, name) retur
0480: 6e 54 79 70 65 20 28 2a 20 6e 61 6d 65 29 0a 23 nType (* name).#
0490: 69 66 6e 64 65 66 20 4e 55 4c 4c 5f 50 54 52 0a ifndef NULL_PTR.
04a0: 23 20 20 64 65 66 69 6e 65 20 4e 55 4c 4c 5f 50 # define NULL_P
04b0: 54 52 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69 6e TR 0.#endif..#in
04c0: 63 6c 75 64 65 20 22 70 6b 63 73 31 31 2e 68 22 clude "pkcs11.h"
04d0: 0a 23 69 6e 63 6c 75 64 65 20 22 70 6b 63 73 31 .#include "pkcs1
04e0: 31 6e 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 1n.h".#include "
04f0: 61 73 6e 31 2d 78 35 30 39 2e 68 22 0a 23 69 6e asn1-x509.h".#in
0500: 63 6c 75 64 65 20 22 73 68 61 31 2e 68 22 0a 23 clude "sha1.h".#
0510: 69 6e 63 6c 75 64 65 20 22 6d 64 35 2e 68 22 0a include "md5.h".
0520: 0a 23 69 66 6e 64 65 66 20 43 41 43 4b 45 59 5f .#ifndef CACKEY_
0530: 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e CRYPTOKI_VERSION
0540: 5f 43 4f 44 45 0a 23 20 20 64 65 66 69 6e 65 20 _CODE.# define
0550: 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f CACKEY_CRYPTOKI_
0560: 56 45 52 53 49 4f 4e 5f 43 4f 44 45 20 30 78 30 VERSION_CODE 0x0
0570: 32 31 65 30 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 21e00.#endif../*
0580: 20 47 53 43 2d 49 53 20 76 32 2e 31 20 44 65 66 GSC-IS v2.1 Def
0590: 69 6e 69 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 2a 20 initions */./**
05a0: 43 6c 61 73 73 65 73 20 2a 2a 2f 0a 23 64 65 66 Classes **/.#def
05b0: 69 6e 65 20 47 53 43 49 53 5f 43 4c 41 53 53 5f ine GSCIS_CLASS_
05c0: 49 53 4f 37 38 31 36 20 20 20 20 20 20 20 20 20 ISO7816
05d0: 20 20 30 78 30 30 0a 23 64 65 66 69 6e 65 20 47 0x00.#define G
05e0: 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 SCIS_CLASS_GLOBA
05f0: 4c 5f 50 4c 41 54 46 4f 52 4d 20 20 20 30 78 38 L_PLATFORM 0x8
0600: 30 0a 0a 2f 2a 2a 20 49 6e 73 74 72 75 63 74 69 0../** Instructi
0610: 6f 6e 73 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 ons **/.#define
0620: 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f GSCIS_INSTR_GET_
0630: 52 45 53 50 4f 4e 53 45 20 20 20 20 20 20 30 78 RESPONSE 0x
0640: 43 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 C0.#define GSCIS
0650: 5f 49 4e 53 54 52 5f 52 45 41 44 5f 42 49 4e 41 _INSTR_READ_BINA
0660: 52 59 20 20 20 20 20 20 20 30 78 42 30 0a 23 64 RY 0xB0.#d
0670: 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 efine GSCIS_INST
0680: 52 5f 55 50 44 41 54 45 5f 42 49 4e 41 52 59 20 R_UPDATE_BINARY
0690: 20 20 20 20 30 78 44 36 0a 23 64 65 66 69 6e 65 0xD6.#define
06a0: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c GSCIS_INSTR_SEL
06b0: 45 43 54 20 20 20 20 20 20 20 20 20 20 20 20 30 ECT 0
06c0: 78 41 34 0a 23 64 65 66 69 6e 65 20 47 53 43 49 xA4.#define GSCI
06d0: 53 5f 49 4e 53 54 52 5f 45 58 54 45 52 4e 41 4c S_INSTR_EXTERNAL
06e0: 5f 41 55 54 48 20 20 20 20 20 30 78 38 32 0a 23 _AUTH 0x82.#
06f0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 define GSCIS_INS
0700: 54 52 5f 47 45 54 5f 43 48 41 4c 4c 45 4e 47 45 TR_GET_CHALLENGE
0710: 20 20 20 20 20 30 78 38 34 0a 23 64 65 66 69 6e 0x84.#defin
0720: 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 49 4e e GSCIS_INSTR_IN
0730: 54 45 52 4e 41 4c 5f 41 55 54 48 20 20 20 20 20 TERNAL_AUTH
0740: 30 78 38 38 0a 23 64 65 66 69 6e 65 20 47 53 43 0x88.#define GSC
0750: 49 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 20 IS_INSTR_VERIFY
0760: 20 20 20 20 20 20 20 20 20 20 20 30 78 32 30 0a 0x20.
0770: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e #define GSCIS_IN
0780: 53 54 52 5f 43 48 41 4e 47 45 5f 52 45 46 45 52 STR_CHANGE_REFER
0790: 45 4e 43 45 20 20 30 78 32 34 0a 23 64 65 66 69 ENCE 0x24.#defi
07a0: 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 ne GSCIS_INSTR_S
07b0: 49 47 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 IGN
07c0: 20 30 78 32 41 0a 23 64 65 66 69 6e 65 20 47 53 0x2A.#define GS
07d0: 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 50 52 CIS_INSTR_GET_PR
07e0: 4f 50 20 20 20 20 20 20 20 20 20 20 30 78 35 36 OP 0x56
07f0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 .#define GSCIS_I
0800: 4e 53 54 52 5f 47 45 54 5f 41 43 52 20 20 20 20 NSTR_GET_ACR
0810: 20 20 20 20 20 20 20 30 78 34 43 0a 23 64 65 66 0x4C.#def
0820: 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f ine GSCIS_INSTR_
0830: 52 45 41 44 5f 42 55 46 46 45 52 20 20 20 20 20 READ_BUFFER
0840: 20 20 30 78 35 32 0a 23 64 65 66 69 6e 65 20 47 0x52.#define G
0850: 53 43 49 53 5f 49 4e 53 54 52 5f 53 49 47 4e 44 SCIS_INSTR_SIGND
0860: 45 43 52 59 50 54 20 20 20 20 20 20 20 30 78 34 ECRYPT 0x4
0870: 32 0a 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 2..#define GSCIS
0880: 5f 50 41 52 41 4d 5f 53 45 4c 45 43 54 5f 41 50 _PARAM_SELECT_AP
0890: 50 4c 45 54 20 20 20 20 20 30 78 30 34 0a 0a 2f PLET 0x04../
08a0: 2a 2a 20 54 61 67 73 20 2a 2a 2f 0a 2f 2a 2a 2a ** Tags **/./***
08b0: 20 43 43 43 20 54 61 67 73 20 2a 2a 2a 2f 0a 23 CCC Tags ***/.#
08c0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 define GSCIS_TAG
08d0: 5f 43 41 52 44 49 44 20 20 20 20 20 20 20 20 20 _CARDID
08e0: 20 20 20 20 20 30 78 46 30 0a 23 64 65 66 69 6e 0xF0.#defin
08f0: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 43 43 5f e GSCIS_TAG_CCC_
0900: 56 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 VER
0910: 30 78 46 31 0a 23 64 65 66 69 6e 65 20 47 53 43 0xF1.#define GSC
0920: 49 53 5f 54 41 47 5f 43 43 47 5f 56 45 52 20 20 IS_TAG_CCG_VER
0930: 20 20 20 20 20 20 20 20 20 20 20 30 78 46 32 0a 0xF2.
0940: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 #define GSCIS_TA
0950: 47 5f 43 41 52 44 55 52 4c 20 20 20 20 20 20 20 G_CARDURL
0960: 20 20 20 20 20 20 30 78 46 33 0a 23 64 65 66 69 0xF3.#defi
0970: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 ne GSCIS_TAG_PKC
0980: 53 31 35 20 20 20 20 20 20 20 20 20 20 20 20 20 S15
0990: 20 30 78 46 34 0a 23 64 65 66 69 6e 65 20 47 53 0xF4.#define GS
09a0: 43 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 41 CIS_TAG_REG_DATA
09b0: 5f 4d 4f 44 45 4c 20 20 20 20 20 20 30 78 46 35 _MODEL 0xF5
09c0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 .#define GSCIS_T
09d0: 41 47 5f 41 43 52 5f 54 41 42 4c 45 20 20 20 20 AG_ACR_TABLE
09e0: 20 20 20 20 20 20 20 30 78 46 36 0a 23 64 65 66 0xF6.#def
09f0: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 ine GSCIS_TAG_CA
0a00: 52 44 5f 41 50 44 55 20 20 20 20 20 20 20 20 20 RD_APDU
0a10: 20 20 30 78 46 37 0a 23 64 65 66 69 6e 65 20 47 0xF7.#define G
0a20: 53 43 49 53 5f 54 41 47 5f 52 45 44 49 52 45 43 SCIS_TAG_REDIREC
0a30: 54 49 4f 4e 20 20 20 20 20 20 20 20 20 30 78 46 TION 0xF
0a40: 41 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f A.#define GSCIS_
0a50: 54 41 47 5f 43 54 20 20 20 20 20 20 20 20 20 20 TAG_CT
0a60: 20 20 20 20 20 20 20 20 30 78 46 42 0a 23 64 65 0xFB.#de
0a70: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53 fine GSCIS_TAG_S
0a80: 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 T
0a90: 20 20 20 30 78 46 43 0a 23 64 65 66 69 6e 65 20 0xFC.#define
0aa0: 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54 43 43 GSCIS_TAG_NEXTCC
0ab0: 43 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 C 0x
0ac0: 46 44 0a 0a 2f 2a 2a 2a 20 47 65 6e 65 72 61 6c FD../*** General
0ad0: 20 2d 20 45 46 20 32 32 30 30 20 2a 2a 2a 2f 0a - EF 2200 ***/.
0ae0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 #define GSCIS_TA
0af0: 47 5f 46 4e 41 4d 45 20 20 20 20 20 20 20 20 20 G_FNAME
0b00: 20 20 20 20 20 20 30 78 30 31 0a 23 64 65 66 69 0x01.#defi
0b10: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41 ne GSCIS_TAG_MNA
0b20: 4d 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ME
0b30: 20 30 78 30 32 0a 23 64 65 66 69 6e 65 20 47 53 0x02.#define GS
0b40: 43 49 53 5f 54 41 47 5f 4c 4e 41 4d 45 20 20 20 CIS_TAG_LNAME
0b50: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30 33 0x03
0b60: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 .#define GSCIS_T
0b70: 41 47 5f 53 55 46 46 49 58 20 20 20 20 20 20 20 AG_SUFFIX
0b80: 20 20 20 20 20 20 20 30 78 30 34 0a 23 64 65 66 0x04.#def
0b90: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 47 4f ine GSCIS_TAG_GO
0ba0: 56 54 5f 41 47 45 4e 43 59 20 20 20 20 20 20 20 VT_AGENCY
0bb0: 20 20 30 78 30 35 0a 23 64 65 66 69 6e 65 20 47 0x05.#define G
0bc0: 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 20 SCIS_TAG_BUREAU
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30 0x0
0be0: 36 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 6.#define GSCIS_
0bf0: 54 41 47 5f 42 55 52 45 41 55 5f 43 4f 44 45 20 TAG_BUREAU_CODE
0c00: 20 20 20 20 20 20 20 20 30 78 30 37 0a 23 64 65 0x07.#de
0c10: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 44 fine GSCIS_TAG_D
0c20: 45 50 54 5f 43 4f 44 45 20 20 20 20 20 20 20 20 EPT_CODE
0c30: 20 20 20 30 78 30 38 0a 23 64 65 66 69 6e 65 20 0x08.#define
0c40: 47 53 43 49 53 5f 54 41 47 5f 54 49 54 4c 45 20 GSCIS_TAG_TITLE
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 0x
0c60: 30 39 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 09.#define GSCIS
0c70: 5f 54 41 47 5f 42 55 49 4c 44 49 4e 47 20 20 20 _TAG_BUILDING
0c80: 20 20 20 20 20 20 20 20 20 30 78 31 30 0a 23 64 0x10.#d
0c90: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f efine GSCIS_TAG_
0ca0: 4f 46 46 49 43 45 5f 41 44 44 52 31 20 20 20 20 OFFICE_ADDR1
0cb0: 20 20 20 20 30 78 31 31 0a 23 64 65 66 69 6e 65 0x11.#define
0cc0: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 GSCIS_TAG_OFFIC
0cd0: 45 5f 41 44 44 52 32 20 20 20 20 20 20 20 20 30 E_ADDR2 0
0ce0: 78 31 32 0a 23 64 65 66 69 6e 65 20 47 53 43 49 x12.#define GSCI
0cf0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54 S_TAG_OFFICE_CIT
0d00: 59 20 20 20 20 20 20 20 20 20 30 78 31 33 0a 23 Y 0x13.#
0d10: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 define GSCIS_TAG
0d20: 5f 4f 46 46 49 43 45 5f 53 54 41 54 45 20 20 20 _OFFICE_STATE
0d30: 20 20 20 20 20 30 78 31 34 0a 23 64 65 66 69 6e 0x14.#defin
0d40: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 e GSCIS_TAG_OFFI
0d50: 43 45 5f 5a 49 50 20 20 20 20 20 20 20 20 20 20 CE_ZIP
0d60: 30 78 31 35 0a 23 64 65 66 69 6e 65 20 47 53 43 0x15.#define GSC
0d70: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 4f IS_TAG_OFFICE_CO
0d80: 55 4e 54 52 59 20 20 20 20 20 20 30 78 31 36 0a UNTRY 0x16.
0d90: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 #define GSCIS_TA
0da0: 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 20 20 G_OFFICE_PHONE
0db0: 20 20 20 20 20 20 30 78 31 37 0a 23 64 65 66 69 0x17.#defi
0dc0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 ne GSCIS_TAG_OFF
0dd0: 49 43 45 5f 50 48 4f 4e 45 5f 45 58 54 20 20 20 ICE_PHONE_EXT
0de0: 20 30 78 31 38 0a 23 64 65 66 69 6e 65 20 47 53 0x18.#define GS
0df0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 46 CIS_TAG_OFFICE_F
0e00: 41 58 20 20 20 20 20 20 20 20 20 20 30 78 31 39 AX 0x19
0e10: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 .#define GSCIS_T
0e20: 41 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c 20 AG_OFFICE_EMAIL
0e30: 20 20 20 20 20 20 20 30 78 31 41 0a 23 64 65 66 0x1A.#def
0e40: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 ine GSCIS_TAG_OF
0e50: 46 49 43 45 5f 52 4f 4f 4d 20 20 20 20 20 20 20 FICE_ROOM
0e60: 20 20 30 78 31 42 0a 23 64 65 66 69 6e 65 20 47 0x1B.#define G
0e70: 53 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f SCIS_TAG_NONGOV_
0e80: 41 47 45 4e 43 59 20 20 20 20 20 20 20 30 78 31 AGENCY 0x1
0e90: 43 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f C.#define GSCIS_
0ea0: 54 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41 54 TAG_SSN_DESIGNAT
0eb0: 4f 52 20 20 20 20 20 20 30 78 31 44 0a 0a 2f 2a OR 0x1D../*
0ec0: 2a 2a 20 50 49 49 20 2d 20 45 46 20 32 31 30 30 ** PII - EF 2100
0ed0: 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 ***/.#define GS
0ee0: 43 49 53 5f 54 41 47 5f 53 53 4e 20 20 20 20 20 CIS_TAG_SSN
0ef0: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 32 30 0x20
0f00: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 .#define GSCIS_T
0f10: 41 47 5f 44 4f 42 20 20 20 20 20 20 20 20 20 20 AG_DOB
0f20: 20 20 20 20 20 20 20 30 78 32 31 0a 23 64 65 66 0x21.#def
0f30: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 47 45 ine GSCIS_TAG_GE
0f40: 4e 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 NDER
0f50: 20 20 30 78 32 32 0a 0a 2f 2a 2a 2a 20 4c 6f 67 0x22../*** Log
0f60: 69 6e 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d in Information -
0f70: 20 45 46 20 34 30 30 30 20 2a 2a 2a 2f 0a 23 64 EF 4000 ***/.#d
0f80: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f efine GSCIS_TAG_
0f90: 55 53 45 52 49 44 20 20 20 20 20 20 20 20 20 20 USERID
0fa0: 20 20 20 20 30 78 34 30 0a 23 64 65 66 69 6e 65 0x40.#define
0fb0: 20 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49 GSCIS_TAG_DOMAI
0fc0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 N 0
0fd0: 78 34 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49 x41.#define GSCI
0fe0: 53 5f 54 41 47 5f 50 41 53 53 57 4f 52 44 20 20 S_TAG_PASSWORD
0ff0: 20 20 20 20 20 20 20 20 20 20 30 78 34 32 0a 0a 0x42..
1000: 2f 2a 2a 2a 20 43 61 72 64 20 49 6e 66 6f 72 6d /*** Card Inform
1010: 61 74 69 6f 6e 20 2d 20 45 46 20 35 30 30 30 20 ation - EF 5000
1020: 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 ***/.#define GSC
1030: 49 53 5f 54 41 47 5f 49 53 53 55 45 52 49 44 20 IS_TAG_ISSUERID
1040: 20 20 20 20 20 20 20 20 20 20 20 30 78 35 30 0a 0x50.
1050: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 #define GSCIS_TA
1060: 47 5f 53 45 52 4e 4f 20 20 20 20 20 20 20 20 20 G_SERNO
1070: 20 20 20 20 20 20 30 78 35 31 0a 23 64 65 66 69 0x51.#defi
1080: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53 ne GSCIS_TAG_ISS
1090: 55 45 5f 44 41 54 45 20 20 20 20 20 20 20 20 20 UE_DATE
10a0: 20 30 78 35 32 0a 23 64 65 66 69 6e 65 20 47 53 0x52.#define GS
10b0: 43 49 53 5f 54 41 47 5f 45 58 50 49 52 45 5f 44 CIS_TAG_EXPIRE_D
10c0: 41 54 45 20 20 20 20 20 20 20 20 20 30 78 35 33 ATE 0x53
10d0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 .#define GSCIS_T
10e0: 41 47 5f 43 41 52 44 5f 54 59 50 45 20 20 20 20 AG_CARD_TYPE
10f0: 20 20 20 20 20 20 20 30 78 35 34 0a 23 64 65 66 0x54.#def
1100: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53 45 ine GSCIS_TAG_SE
1110: 43 55 52 49 54 59 5f 43 4f 44 45 20 20 20 20 20 CURITY_CODE
1120: 20 20 30 78 35 37 0a 23 64 65 66 69 6e 65 20 47 0x57.#define G
1130: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f SCIS_TAG_CARDID_
1140: 41 49 44 20 20 20 20 20 20 20 20 20 20 30 78 35 AID 0x5
1150: 38 0a 0a 2f 2a 2a 2a 20 50 49 56 20 43 6f 64 65 8../*** PIV Code
1160: 73 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e s ***/.#define N
1170: 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 49 4e ISTSP800_73_3_IN
1180: 53 54 52 5f 47 45 54 5f 44 41 54 41 20 30 78 43 STR_GET_DATA 0xC
1190: 42 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53 50 B.#define NISTSP
11a0: 38 30 30 5f 37 33 5f 33 5f 49 4e 53 54 52 5f 47 800_73_3_INSTR_G
11b0: 45 4e 41 55 54 48 20 20 30 78 38 37 0a 0a 2f 2a ENAUTH 0x87../*
11c0: 2a 2a 20 50 4b 49 20 49 6e 66 6f 72 6d 61 74 69 ** PKI Informati
11d0: 6f 6e 20 2d 20 45 46 20 37 30 30 30 20 2a 2a 2a on - EF 7000 ***
11e0: 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f /.#define GSCIS_
11f0: 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 20 TAG_CERTIFICATE
1200: 20 20 20 20 20 20 20 20 30 78 37 30 0a 23 64 65 0x70.#de
1210: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 fine GSCIS_TAG_C
1220: 45 52 54 5f 49 53 53 55 45 5f 44 41 54 45 20 20 ERT_ISSUE_DATE
1230: 20 20 20 30 78 37 31 0a 23 64 65 66 69 6e 65 20 0x71.#define
1240: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 45 GSCIS_TAG_CERT_E
1250: 58 50 49 52 45 5f 44 41 54 45 20 20 20 20 30 78 XPIRE_DATE 0x
1260: 37 32 0a 0a 2f 2a 2a 20 41 70 70 6c 65 74 20 49 72../** Applet I
1270: 44 73 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 Ds **/.#define G
1280: 53 43 49 53 5f 41 49 44 5f 43 43 43 20 20 20 20 SCIS_AID_CCC
1290: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 41 0xA
12a0: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 0, 0x00, 0x00, 0
12b0: 78 30 31 2c 20 30 78 31 36 2c 20 30 78 44 42 2c x01, 0x16, 0xDB,
12c0: 20 30 78 30 30 0a 23 64 65 66 69 6e 65 20 4e 49 0x00.#define NI
12d0: 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 50 49 56 STSP800_73_3_PIV
12e0: 5f 41 49 44 20 20 20 20 20 20 20 20 30 78 41 30 _AID 0xA0
12f0: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 , 0x00, 0x00, 0x
1300: 30 33 2c 20 30 78 30 38 2c 20 30 78 30 30 2c 20 03, 0x08, 0x00,
1310: 30 78 30 30 2c 20 30 78 31 30 2c 20 30 78 30 30 0x00, 0x10, 0x00
1320: 2c 20 30 78 30 31 2c 20 30 78 30 30 0a 0a 2f 2a , 0x01, 0x00../*
1330: 20 50 49 56 20 49 44 73 20 2a 2f 0a 2f 2a 2a 20 PIV IDs */./**
1340: 4b 65 79 20 49 64 65 6e 74 69 66 69 65 72 73 20 Key Identifiers
1350: 28 4e 49 53 54 20 53 50 20 38 30 30 2d 37 38 2d (NIST SP 800-78-
1360: 33 2c 20 54 61 62 6c 65 20 36 2d 31 20 2a 2a 2f 3, Table 6-1 **/
1370: 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38 .#define NISTSP8
1380: 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 50 49 56 41 00_78_3_KEY_PIVA
1390: 55 54 48 20 20 20 30 78 39 41 0a 23 64 65 66 69 UTH 0x9A.#defi
13a0: 6e 65 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f ne NISTSP800_78_
13b0: 33 5f 4b 45 59 5f 53 49 47 4e 41 54 55 52 45 20 3_KEY_SIGNATURE
13c0: 30 78 39 43 0a 23 64 65 66 69 6e 65 20 4e 49 53 0x9C.#define NIS
13d0: 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f TSP800_78_3_KEY_
13e0: 4b 45 59 4d 47 54 20 20 20 20 30 78 39 44 0a 23 KEYMGT 0x9D.#
13f0: 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30 define NISTSP800
1400: 5f 37 38 5f 33 5f 4b 45 59 5f 43 41 52 44 41 55 _78_3_KEY_CARDAU
1410: 54 48 20 20 30 78 39 45 0a 0a 2f 2a 2a 20 41 6c TH 0x9E../** Al
1420: 67 6f 72 69 74 68 6d 20 49 64 65 6e 74 69 66 69 gorithm Identifi
1430: 65 72 73 20 28 4e 49 53 54 20 53 50 20 38 30 30 ers (NIST SP 800
1440: 2d 37 38 2d 33 2c 20 54 61 62 6c 65 20 36 2d 32 -78-3, Table 6-2
1450: 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 49 53 **/.#define NIS
1460: 54 53 50 38 30 30 5f 37 38 5f 33 5f 41 4c 47 4f TSP800_78_3_ALGO
1470: 5f 52 53 41 31 30 32 34 20 20 30 78 30 36 0a 23 _RSA1024 0x06.#
1480: 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30 define NISTSP800
1490: 5f 37 38 5f 33 5f 41 4c 47 4f 5f 52 53 41 32 30 _78_3_ALGO_RSA20
14a0: 34 38 20 20 30 78 30 37 0a 0a 2f 2a 2a 20 4f 62 48 0x07../** Ob
14b0: 6a 65 63 74 20 49 64 65 6e 74 69 66 69 65 72 73 ject Identifiers
14c0: 20 28 4e 49 53 54 20 53 50 20 38 30 30 2d 37 33 (NIST SP 800-73
14d0: 2d 33 20 50 61 72 74 20 31 2c 20 54 61 62 6c 65 -3 Part 1, Table
14e0: 20 32 29 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 2) **/.#define
14f0: 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f NISTSP800_73_3_O
1500: 49 44 5f 50 49 56 41 55 54 48 20 20 20 30 78 35 ID_PIVAUTH 0x5
1510: 46 2c 20 30 78 43 31 2c 20 30 78 30 35 0a 23 64 F, 0xC1, 0x05.#d
1520: 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f efine NISTSP800_
1530: 37 33 5f 33 5f 4f 49 44 5f 53 49 47 4e 41 54 55 73_3_OID_SIGNATU
1540: 52 45 20 30 78 35 46 2c 20 30 78 43 31 2c 20 30 RE 0x5F, 0xC1, 0
1550: 78 30 41 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 x0A.#define NIST
1560: 53 50 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 4b SP800_73_3_OID_K
1570: 45 59 4d 47 54 20 20 20 20 30 78 35 46 2c 20 30 EYMGT 0x5F, 0
1580: 78 43 31 2c 20 30 78 30 42 0a 23 64 65 66 69 6e xC1, 0x0B.#defin
1590: 65 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 e NISTSP800_73_3
15a0: 5f 4f 49 44 5f 43 41 52 44 41 55 54 48 20 20 30 _OID_CARDAUTH 0
15b0: 78 35 46 2c 20 30 78 43 31 2c 20 30 78 30 31 0a x5F, 0xC1, 0x01.
15c0: 0a 2f 2a 20 4d 61 78 69 6d 75 6d 20 73 69 7a 65 ./* Maximum size
15d0: 20 6f 66 20 64 61 74 61 20 70 6f 72 74 69 6f 6e of data portion
15e0: 20 6f 66 20 41 50 44 55 73 20 2a 2f 0a 2f 2a 2a of APDUs */./**
15f0: 20 44 6f 20 6e 6f 74 20 73 65 74 20 74 68 69 73 Do not set this
1600: 20 61 62 6f 76 65 20 32 35 30 20 2a 2a 2f 0a 23 above 250 **/.#
1610: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 41 50 define CACKEY_AP
1620: 44 55 5f 4d 54 55 20 20 20 20 20 20 20 20 20 20 DU_MTU
1630: 20 20 20 20 20 32 35 30 0a 0a 2f 2a 20 41 54 52 250../* ATR
1640: 20 49 66 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c If not availabl
1650: 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4d 41 58 e */.#ifndef MAX
1660: 5f 41 54 52 5f 53 49 5a 45 0a 23 64 65 66 69 6e _ATR_SIZE.#defin
1670: 65 20 4d 41 58 5f 41 54 52 5f 53 49 5a 45 20 31 e MAX_ATR_SIZE 1
1680: 30 32 34 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 024.#endif..#ifd
1690: 65 66 20 43 41 43 4b 45 59 5f 44 45 42 55 47 0a ef CACKEY_DEBUG.
16a0: 23 20 20 69 66 64 65 66 20 48 41 56 45 5f 54 49 # ifdef HAVE_TI
16b0: 4d 45 5f 48 0a 23 20 20 20 20 69 6e 63 6c 75 64 ME_H.# includ
16c0: 65 20 3c 74 69 6d 65 2e 68 3e 0a 73 74 61 74 69 e <time.h>.stati
16d0: 63 20 74 69 6d 65 5f 74 20 63 61 63 6b 65 79 5f c time_t cackey_
16e0: 64 65 62 75 67 5f 73 74 61 72 74 5f 74 69 6d 65 debug_start_time
16f0: 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 75 6e 73 = 0;.static uns
1700: 69 67 6e 65 64 20 6c 6f 6e 67 20 43 41 43 4b 45 igned long CACKE
1710: 59 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45 28 Y_DEBUG_GETTIME(
1720: 76 6f 69 64 29 20 7b 0a 09 69 66 20 28 63 61 63 void) {..if (cac
1730: 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72 74 5f key_debug_start_
1740: 74 69 6d 65 20 3d 3d 20 30 29 20 7b 0a 09 09 63 time == 0) {...c
1750: 61 63 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72 ackey_debug_star
1760: 74 5f 74 69 6d 65 20 3d 20 74 69 6d 65 28 4e 55 t_time = time(NU
1770: 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e LL);..}...return
1780: 28 74 69 6d 65 28 4e 55 4c 4c 29 20 2d 20 63 61 (time(NULL) - ca
1790: 63 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72 74 ckey_debug_start
17a0: 5f 74 69 6d 65 29 3b 0a 7d 0a 23 20 20 65 6c 73 _time);.}.# els
17b0: 65 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 e.static unsigne
17c0: 64 20 6c 6f 6e 67 20 43 41 43 4b 45 59 5f 44 45 d long CACKEY_DE
17d0: 42 55 47 5f 47 45 54 54 49 4d 45 28 76 6f 69 64 BUG_GETTIME(void
17e0: 29 20 7b 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a ) {..return(0);.
17f0: 7d 0a 23 20 20 65 6e 64 69 66 0a 0a 23 20 20 64 }.# endif..# d
1800: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 efine CACKEY_DEB
1810: 55 47 5f 50 52 49 4e 54 46 28 78 2e 2e 2e 29 20 UG_PRINTF(x...)
1820: 7b 20 5c 0a 09 73 74 61 74 69 63 20 63 68 61 72 { \..static char
1830: 20 62 75 66 5f 75 73 65 72 5b 34 30 39 36 5d 20 buf_user[4096]
1840: 3d 20 7b 30 7d 3b 20 5c 0a 09 73 6e 70 72 69 6e = {0}; \..snprin
1850: 74 66 28 62 75 66 5f 75 73 65 72 2c 20 73 69 7a tf(buf_user, siz
1860: 65 6f 66 28 62 75 66 5f 75 73 65 72 29 2c 20 78 eof(buf_user), x
1870: 29 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72 5b 73 ); \..buf_user[s
1880: 69 7a 65 6f 66 28 62 75 66 5f 75 73 65 72 29 20 izeof(buf_user)
1890: 2d 20 31 5d 20 3d 20 27 5c 30 27 3b 20 5c 0a 09 - 1] = '\0'; \..
18a0: 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 fprintf(cackey_d
18b0: 65 62 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75 ebug_fd(), "[%lu
18c0: 5d 3a 20 25 73 28 29 3a 25 69 3a 20 25 73 5c 6e ]: %s():%i: %s\n
18d0: 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ", CACKEY_DEBUG_
18e0: 47 45 54 54 49 4d 45 28 29 2c 20 5f 5f 66 75 6e GETTIME(), __fun
18f0: 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 2c 20 62 c__, __LINE__, b
1900: 75 66 5f 75 73 65 72 29 3b 20 5c 0a 09 66 66 6c uf_user); \..ffl
1910: 75 73 68 28 63 61 63 6b 65 79 5f 64 65 62 75 67 ush(cackey_debug
1920: 5f 66 64 28 29 29 3b 20 5c 0a 7d 0a 23 20 20 64 _fd()); \.}.# d
1930: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 efine CACKEY_DEB
1940: 55 47 5f 50 52 49 4e 54 42 55 46 28 66 2c 20 78 UG_PRINTBUF(f, x
1950: 2c 20 79 29 20 7b 20 5c 0a 09 73 74 61 74 69 63 , y) { \..static
1960: 20 63 68 61 72 20 62 75 66 5f 75 73 65 72 5b 34 char buf_user[4
1970: 30 39 36 5d 20 3d 20 7b 30 7d 2c 20 2a 62 75 66 096] = {0}, *buf
1980: 5f 75 73 65 72 5f 70 2c 20 2a 62 75 66 5f 75 73 _user_p, *buf_us
1990: 65 72 5f 70 72 69 6e 74 3b 20 5c 0a 09 75 6e 73 er_print; \..uns
19a0: 69 67 6e 65 64 20 6c 6f 6e 67 20 62 75 66 5f 75 igned long buf_u
19b0: 73 65 72 5f 73 69 7a 65 3b 20 5c 0a 09 75 6e 73 ser_size; \..uns
19c0: 69 67 6e 65 64 20 63 68 61 72 20 2a 54 4d 50 42 igned char *TMPB
19d0: 55 46 3b 20 5c 0a 09 75 6e 73 69 67 6e 65 64 20 UF; \..unsigned
19e0: 6c 6f 6e 67 20 69 64 78 3b 20 5c 0a 09 69 6e 74 long idx; \..int
19f0: 20 73 6e 70 72 69 6e 74 66 5f 72 65 74 3b 20 5c snprintf_ret; \
1a00: 0a 09 54 4d 50 42 55 46 20 3d 20 28 75 6e 73 69 ..TMPBUF = (unsi
1a10: 67 6e 65 64 20 63 68 61 72 20 2a 29 20 28 78 29 gned char *) (x)
1a20: 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72 5b 30 5d ; \..buf_user[0]
1a30: 20 3d 20 30 3b 20 5c 0a 09 62 75 66 5f 75 73 65 = 0; \..buf_use
1a40: 72 5b 32 5d 20 3d 20 30 3b 20 5c 0a 09 62 75 66 r[2] = 0; \..buf
1a50: 5f 75 73 65 72 5f 70 20 3d 20 62 75 66 5f 75 73 _user_p = buf_us
1a60: 65 72 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72 5f er; \..buf_user_
1a70: 73 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 62 75 size = sizeof(bu
1a80: 66 5f 75 73 65 72 29 3b 20 5c 0a 09 66 6f 72 20 f_user); \..for
1a90: 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 (idx = 0; idx <
1aa0: 28 79 29 3b 20 69 64 78 2b 2b 29 20 7b 20 5c 0a (y); idx++) { \.
1ab0: 09 09 69 66 20 28 62 75 66 5f 75 73 65 72 5f 73 ..if (buf_user_s
1ac0: 69 7a 65 20 3c 3d 20 30 29 20 7b 20 5c 0a 09 09 ize <= 0) { \...
1ad0: 09 62 72 65 61 6b 3b 20 5c 0a 09 09 7d 3b 20 5c .break; \...}; \
1ae0: 0a 09 09 73 6e 70 72 69 6e 74 66 5f 72 65 74 20 ...snprintf_ret
1af0: 3d 20 73 6e 70 72 69 6e 74 66 28 62 75 66 5f 75 = snprintf(buf_u
1b00: 73 65 72 5f 70 2c 20 62 75 66 5f 75 73 65 72 5f ser_p, buf_user_
1b10: 73 69 7a 65 2c 20 22 2c 20 25 30 32 78 22 2c 20 size, ", %02x",
1b20: 54 4d 50 42 55 46 5b 69 64 78 5d 29 3b 20 5c 0a TMPBUF[idx]); \.
1b30: 09 09 69 66 20 28 73 6e 70 72 69 6e 74 66 5f 72 ..if (snprintf_r
1b40: 65 74 20 3c 3d 20 30 29 20 7b 20 5c 0a 09 09 09 et <= 0) { \....
1b50: 62 72 65 61 6b 3b 20 5c 0a 09 09 7d 3b 20 5c 0a break; \...}; \.
1b60: 09 09 62 75 66 5f 75 73 65 72 5f 70 20 2b 3d 20 ..buf_user_p +=
1b70: 73 6e 70 72 69 6e 74 66 5f 72 65 74 3b 20 5c 0a snprintf_ret; \.
1b80: 09 09 62 75 66 5f 75 73 65 72 5f 73 69 7a 65 20 ..buf_user_size
1b90: 2d 3d 20 73 6e 70 72 69 6e 74 66 5f 72 65 74 3b -= snprintf_ret;
1ba0: 20 5c 0a 09 7d 3b 20 5c 0a 09 62 75 66 5f 75 73 \..}; \..buf_us
1bb0: 65 72 5b 73 69 7a 65 6f 66 28 62 75 66 5f 75 73 er[sizeof(buf_us
1bc0: 65 72 29 20 2d 20 31 5d 20 3d 20 27 5c 30 27 3b er) - 1] = '\0';
1bd0: 20 5c 0a 09 62 75 66 5f 75 73 65 72 5f 70 72 69 \..buf_user_pri
1be0: 6e 74 20 3d 20 62 75 66 5f 75 73 65 72 20 2b 20 nt = buf_user +
1bf0: 32 3b 20 5c 0a 09 66 70 72 69 6e 74 66 28 63 61 2; \..fprintf(ca
1c00: 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c ckey_debug_fd(),
1c10: 20 22 5b 25 6c 75 5d 3a 20 25 73 28 29 3a 25 69 "[%lu]: %s():%i
1c20: 3a 20 25 73 20 20 28 25 73 2f 25 6c 75 20 3d 20 : %s (%s/%lu =
1c30: 7b 25 73 7d 29 5c 6e 22 2c 20 43 41 43 4b 45 59 {%s})\n", CACKEY
1c40: 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45 28 29 _DEBUG_GETTIME()
1c50: 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 , __func__, __LI
1c60: 4e 45 5f 5f 2c 20 66 2c 20 23 78 2c 20 28 75 6e NE__, f, #x, (un
1c70: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 79 29 signed long) (y)
1c80: 2c 20 62 75 66 5f 75 73 65 72 5f 70 72 69 6e 74 , buf_user_print
1c90: 29 3b 20 5c 0a 09 66 66 6c 75 73 68 28 63 61 63 ); \..fflush(cac
1ca0: 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 29 3b key_debug_fd());
1cb0: 20 5c 0a 7d 0a 23 20 20 64 65 66 69 6e 65 20 66 \.}.# define f
1cc0: 72 65 65 28 78 29 20 7b 20 43 41 43 4b 45 59 5f ree(x) { CACKEY_
1cd0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 52 DEBUG_PRINTF("FR
1ce0: 45 45 28 25 70 29 20 28 25 73 29 22 2c 20 28 76 EE(%p) (%s)", (v
1cf0: 6f 69 64 20 2a 29 20 78 2c 20 23 78 29 3b 20 66 oid *) x, #x); f
1d00: 72 65 65 28 78 29 3b 20 7d 0a 0a 73 74 61 74 69 ree(x); }..stati
1d10: 63 20 46 49 4c 45 20 2a 63 61 63 6b 65 79 5f 64 c FILE *cackey_d
1d20: 65 62 75 67 5f 66 64 28 76 6f 69 64 29 20 7b 0a ebug_fd(void) {.
1d30: 09 73 74 61 74 69 63 20 46 49 4c 45 20 2a 66 64 .static FILE *fd
1d40: 20 3d 20 4e 55 4c 4c 3b 0a 09 63 68 61 72 20 2a = NULL;..char *
1d50: 6c 6f 67 66 69 6c 65 3b 0a 0a 09 69 66 20 28 66 logfile;...if (f
1d60: 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 d != NULL) {...r
1d70: 65 74 75 72 6e 28 66 64 29 3b 0a 09 7d 0a 0a 09 eturn(fd);..}...
1d80: 2f 2a 0a 09 20 2a 20 4c 6f 67 20 74 6f 20 73 74 /*.. * Log to st
1d90: 64 65 72 72 20 69 6e 69 74 69 61 6c 6c 79 20 73 derr initially s
1da0: 6f 20 77 65 20 63 61 6e 20 75 73 65 20 64 65 62 o we can use deb
1db0: 75 67 67 69 6e 67 20 77 69 74 68 69 6e 0a 09 20 ugging within..
1dc0: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 * this function
1dd0: 77 69 74 68 6f 75 74 20 67 65 74 74 69 6e 67 20 without getting
1de0: 69 6e 74 6f 20 61 6e 20 69 6e 66 69 6e 69 74 65 into an infinite
1df0: 20 6c 6f 6f 70 0a 09 20 2a 2f 0a 09 66 64 20 3d loop.. */..fd =
1e00: 20 73 74 64 65 72 72 3b 0a 0a 09 6c 6f 67 66 69 stderr;...logfi
1e10: 6c 65 20 3d 20 67 65 74 65 6e 76 28 22 43 41 43 le = getenv("CAC
1e20: 4b 45 59 5f 44 45 42 55 47 5f 4c 4f 47 46 49 4c KEY_DEBUG_LOGFIL
1e30: 45 22 29 3b 0a 09 69 66 20 28 6c 6f 67 66 69 6c E");..if (logfil
1e40: 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 e != NULL) {...C
1e50: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1e60: 54 46 28 22 46 6f 75 6e 64 20 65 6e 76 69 72 6f TF("Found enviro
1e70: 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 3a 20 nment variable:
1e80: 25 73 22 2c 20 6c 6f 67 66 69 6c 65 29 3b 0a 0a %s", logfile);..
1e90: 09 09 6c 6f 67 66 69 6c 65 20 3d 20 73 74 72 63 ..logfile = strc
1ea0: 68 72 28 6c 6f 67 66 69 6c 65 2c 20 27 3d 27 29 hr(logfile, '=')
1eb0: 3b 0a 09 09 69 66 20 28 6c 6f 67 66 69 6c 65 20 ;...if (logfile
1ec0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 6c 6f == NULL) {....lo
1ed0: 67 66 69 6c 65 20 3d 20 67 65 74 65 6e 76 28 22 gfile = getenv("
1ee0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 4c 4f 47 CACKEY_DEBUG_LOG
1ef0: 46 49 4c 45 22 29 3b 0a 09 09 7d 20 65 6c 73 65 FILE");...} else
1f00: 20 7b 0a 09 09 09 6c 6f 67 66 69 6c 65 2b 2b 3b {....logfile++;
1f10: 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20 ...}..}..#ifdef
1f20: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 4c 4f 47 CACKEY_DEBUG_LOG
1f30: 46 49 4c 45 0a 09 69 66 20 28 6c 6f 67 66 69 6c FILE..if (logfil
1f40: 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6c e == NULL) {...l
1f50: 6f 67 66 69 6c 65 20 3d 20 43 41 43 4b 45 59 5f ogfile = CACKEY_
1f60: 44 45 42 55 47 5f 4c 4f 47 46 49 4c 45 3b 0a 09 DEBUG_LOGFILE;..
1f70: 7d 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28 6c }.#endif...if (l
1f80: 6f 67 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 ogfile != NULL)
1f90: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
1fa0: 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 6c _PRINTF("Found l
1fb0: 6f 67 20 66 69 6c 65 3a 20 25 73 22 2c 20 6c 6f og file: %s", lo
1fc0: 67 66 69 6c 65 29 3b 0a 0a 09 09 66 64 20 3d 20 gfile);....fd =
1fd0: 66 6f 70 65 6e 28 6c 6f 67 66 69 6c 65 2c 20 22 fopen(logfile, "
1fe0: 61 22 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 66 64 a");..}...if (fd
1ff0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 64 == NULL) {...fd
2000: 20 3d 20 73 74 64 65 72 72 3b 0a 09 7d 0a 0a 09 = stderr;..}...
2010: 69 66 20 28 66 64 20 3d 3d 20 73 74 64 65 72 72 if (fd == stderr
2020: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
2030: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
2040: 6e 69 6e 67 20 73 74 64 65 72 72 22 29 3b 0a 09 ning stderr");..
2050: 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b 45 } else {...CACKE
2060: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
2070: 52 65 74 75 72 6e 69 6e 67 20 25 70 22 2c 20 28 Returning %p", (
2080: 76 6f 69 64 20 2a 29 20 66 64 29 3b 0a 09 7d 0a void *) fd);..}.
2090: 0a 09 72 65 74 75 72 6e 28 66 64 29 3b 0a 7d 0a ..return(fd);.}.
20a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 43 41 .static void *CA
20b0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f CKEY_DEBUG_FUNC_
20c0: 4d 41 4c 4c 4f 43 28 73 69 7a 65 5f 74 20 73 69 MALLOC(size_t si
20d0: 7a 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a ze, const char *
20e0: 66 75 6e 63 2c 20 69 6e 74 20 6c 69 6e 65 29 20 func, int line)
20f0: 7b 0a 09 76 6f 69 64 20 2a 72 65 74 76 61 6c 3b {..void *retval;
2100: 0a 0a 09 72 65 74 76 61 6c 20 3d 20 6d 61 6c 6c ...retval = mall
2110: 6f 63 28 73 69 7a 65 29 3b 0a 0a 09 66 70 72 69 oc(size);...fpri
2120: 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67 ntf(cackey_debug
2130: 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d 3a 20 25 _fd(), "[%lu]: %
2140: 73 28 29 3a 25 69 3a 20 4d 41 4c 4c 4f 43 28 29 s():%i: MALLOC()
2150: 20 3d 20 25 70 5c 6e 22 2c 20 43 41 43 4b 45 59 = %p\n", CACKEY
2160: 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45 28 29 _DEBUG_GETTIME()
2170: 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 2c 20 72 65 , func, line, re
2180: 74 76 61 6c 29 3b 0a 09 66 66 6c 75 73 68 28 63 tval);..fflush(c
2190: 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 ackey_debug_fd()
21a0: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 );...return(retv
21b0: 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 al);.}..static v
21c0: 6f 69 64 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 oid *CACKEY_DEBU
21d0: 47 5f 46 55 4e 43 5f 52 45 41 4c 4c 4f 43 28 76 G_FUNC_REALLOC(v
21e0: 6f 69 64 20 2a 70 74 72 2c 20 73 69 7a 65 5f 74 oid *ptr, size_t
21f0: 20 73 69 7a 65 2c 20 63 6f 6e 73 74 20 63 68 61 size, const cha
2200: 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20 6c 69 6e r *func, int lin
2210: 65 29 20 7b 0a 09 76 6f 69 64 20 2a 72 65 74 76 e) {..void *retv
2220: 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20 72 al;...retval = r
2230: 65 61 6c 6c 6f 63 28 70 74 72 2c 20 73 69 7a 65 ealloc(ptr, size
2240: 29 3b 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20 );...if (retval
2250: 21 3d 20 70 74 72 29 20 7b 0a 09 09 66 70 72 69 != ptr) {...fpri
2260: 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67 ntf(cackey_debug
2270: 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d 3a 20 25 _fd(), "[%lu]: %
2280: 73 28 29 3a 25 69 3a 20 52 45 41 4c 4c 4f 43 28 s():%i: REALLOC(
2290: 25 70 29 20 3d 20 25 70 5c 6e 22 2c 20 43 41 43 %p) = %p\n", CAC
22a0: 4b 45 59 5f 44 45 42 55 47 5f 47 45 54 54 49 4d KEY_DEBUG_GETTIM
22b0: 45 28 29 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 2c E(), func, line,
22c0: 20 70 74 72 2c 20 72 65 74 76 61 6c 29 3b 0a 09 ptr, retval);..
22d0: 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f 64 .fflush(cackey_d
22e0: 65 62 75 67 5f 66 64 28 29 29 3b 0a 09 7d 0a 0a ebug_fd());..}..
22f0: 09 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 4e .if (retval == N
2300: 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f ULL) {...CACKEY_
2310: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2a DEBUG_PRINTF(" *
2320: 2a 2a 20 45 52 52 4f 52 20 2a 2a 2a 20 72 65 61 ** ERROR *** rea
2330: 6c 6c 6f 63 20 72 65 74 75 72 6e 65 64 20 4e 55 lloc returned NU
2340: 4c 4c 20 28 73 69 7a 65 20 3d 20 25 6c 75 29 22 LL (size = %lu)"
2350: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
2360: 29 20 73 69 7a 65 29 3b 0a 09 7d 0a 0a 09 72 65 ) size);..}...re
2370: 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a turn(retval);.}.
2380: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 43 41 .static char *CA
2390: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f CKEY_DEBUG_FUNC_
23a0: 53 54 52 44 55 50 28 63 6f 6e 73 74 20 63 68 61 STRDUP(const cha
23b0: 72 20 2a 70 74 72 2c 20 63 6f 6e 73 74 20 63 68 r *ptr, const ch
23c0: 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20 6c 69 ar *func, int li
23d0: 6e 65 29 20 7b 0a 09 63 68 61 72 20 2a 72 65 74 ne) {..char *ret
23e0: 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20 val;...retval =
23f0: 73 74 72 64 75 70 28 70 74 72 29 3b 0a 0a 09 66 strdup(ptr);...f
2400: 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 printf(cackey_de
2410: 62 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d bug_fd(), "[%lu]
2420: 3a 20 25 73 28 29 3a 25 69 3a 20 53 54 52 44 55 : %s():%i: STRDU
2430: 50 5f 4d 41 4c 4c 4f 43 28 29 20 3d 20 25 70 5c P_MALLOC() = %p\
2440: 6e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 n", CACKEY_DEBUG
2450: 5f 47 45 54 54 49 4d 45 28 29 2c 20 66 75 6e 63 _GETTIME(), func
2460: 2c 20 6c 69 6e 65 2c 20 72 65 74 76 61 6c 29 3b , line, retval);
2470: 0a 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f ..fflush(cackey_
2480: 64 65 62 75 67 5f 66 64 28 29 29 3b 0a 0a 09 72 debug_fd());...r
2490: 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d eturn(retval);.}
24a0: 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 ..static const c
24b0: 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 har *CACKEY_DEBU
24c0: 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 G_FUNC_TAG_TO_ST
24d0: 52 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 R(unsigned char
24e0: 74 61 67 29 20 7b 0a 09 73 77 69 74 63 68 20 28 tag) {..switch (
24f0: 74 61 67 29 20 7b 0a 09 09 63 61 73 65 20 47 53 tag) {...case GS
2500: 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 3a 0a CIS_TAG_CARDID:.
2510: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 ...return("GSCIS
2520: 5f 54 41 47 5f 43 41 52 44 49 44 22 29 3b 0a 09 _TAG_CARDID");..
2530: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f .case GSCIS_TAG_
2540: 43 43 43 5f 56 45 52 3a 0a 09 09 09 72 65 74 75 CCC_VER:....retu
2550: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 43 rn("GSCIS_TAG_CC
2560: 43 5f 56 45 52 22 29 3b 0a 09 09 63 61 73 65 20 C_VER");...case
2570: 47 53 43 49 53 5f 54 41 47 5f 43 43 47 5f 56 45 GSCIS_TAG_CCG_VE
2580: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 R:....return("GS
2590: 43 49 53 5f 54 41 47 5f 43 43 47 5f 56 45 52 22 CIS_TAG_CCG_VER"
25a0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f );...case GSCIS_
25b0: 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09 TAG_CARDURL:....
25c0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 return("GSCIS_TA
25d0: 47 5f 43 41 52 44 55 52 4c 22 29 3b 0a 09 09 63 G_CARDURL");...c
25e0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b ase GSCIS_TAG_PK
25f0: 43 53 31 35 3a 0a 09 09 09 72 65 74 75 72 6e 28 CS15:....return(
2600: 22 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 53 31 "GSCIS_TAG_PKCS1
2610: 35 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 5");...case GSCI
2620: 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 41 5f 4d S_TAG_REG_DATA_M
2630: 4f 44 45 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 ODEL:....return(
2640: 22 47 53 43 49 53 5f 54 41 47 5f 52 45 47 5f 44 "GSCIS_TAG_REG_D
2650: 41 54 41 5f 4d 4f 44 45 4c 22 29 3b 0a 09 09 63 ATA_MODEL");...c
2660: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43 ase GSCIS_TAG_AC
2670: 52 5f 54 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 R_TABLE:....retu
2680: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 41 43 rn("GSCIS_TAG_AC
2690: 52 5f 54 41 42 4c 45 22 29 3b 0a 09 09 63 61 73 R_TABLE");...cas
26a0: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 e GSCIS_TAG_CARD
26b0: 5f 41 50 44 55 3a 0a 09 09 09 72 65 74 75 72 6e _APDU:....return
26c0: 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 ("GSCIS_TAG_CARD
26d0: 5f 41 50 44 55 22 29 3b 0a 09 09 63 61 73 65 20 _APDU");...case
26e0: 47 53 43 49 53 5f 54 41 47 5f 52 45 44 49 52 45 GSCIS_TAG_REDIRE
26f0: 43 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72 6e CTION:....return
2700: 28 22 47 53 43 49 53 5f 54 41 47 5f 52 45 44 49 ("GSCIS_TAG_REDI
2710: 52 45 43 54 49 4f 4e 22 29 3b 0a 09 09 63 61 73 RECTION");...cas
2720: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 54 3a 0a e GSCIS_TAG_CT:.
2730: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 ...return("GSCIS
2740: 5f 54 41 47 5f 43 54 22 29 3b 0a 09 09 63 61 73 _TAG_CT");...cas
2750: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 54 3a 0a e GSCIS_TAG_ST:.
2760: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 ...return("GSCIS
2770: 5f 54 41 47 5f 53 54 22 29 3b 0a 09 09 63 61 73 _TAG_ST");...cas
2780: 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54 e GSCIS_TAG_NEXT
2790: 43 43 43 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 CCC:....return("
27a0: 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54 43 43 GSCIS_TAG_NEXTCC
27b0: 43 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 C");...case GSCI
27c0: 53 5f 54 41 47 5f 46 4e 41 4d 45 3a 0a 09 09 09 S_TAG_FNAME:....
27d0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 return("GSCIS_TA
27e0: 47 5f 46 4e 41 4d 45 22 29 3b 0a 09 09 63 61 73 G_FNAME");...cas
27f0: 65 20 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41 4d e GSCIS_TAG_MNAM
2800: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 E:....return("GS
2810: 43 49 53 5f 54 41 47 5f 4d 4e 41 4d 45 22 29 3b CIS_TAG_MNAME");
2820: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 ...case GSCIS_TA
2830: 47 5f 4c 4e 41 4d 45 3a 0a 09 09 09 72 65 74 75 G_LNAME:....retu
2840: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4c 4e rn("GSCIS_TAG_LN
2850: 41 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 AME");...case GS
2860: 43 49 53 5f 54 41 47 5f 53 55 46 46 49 58 3a 0a CIS_TAG_SUFFIX:.
2870: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 ...return("GSCIS
2880: 5f 54 41 47 5f 53 55 46 46 49 58 22 29 3b 0a 09 _TAG_SUFFIX");..
2890: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f .case GSCIS_TAG_
28a0: 47 4f 56 54 5f 41 47 45 4e 43 59 3a 0a 09 09 09 GOVT_AGENCY:....
28b0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 return("GSCIS_TA
28c0: 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59 22 29 3b G_GOVT_AGENCY");
28d0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 ...case GSCIS_TA
28e0: 47 5f 42 55 52 45 41 55 3a 0a 09 09 09 72 65 74 G_BUREAU:....ret
28f0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 42 urn("GSCIS_TAG_B
2900: 55 52 45 41 55 22 29 3b 0a 09 09 63 61 73 65 20 UREAU");...case
2910: 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 GSCIS_TAG_BUREAU
2920: 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75 72 6e _CODE:....return
2930: 28 22 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45 ("GSCIS_TAG_BURE
2940: 41 55 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61 73 AU_CODE");...cas
2950: 65 20 47 53 43 49 53 5f 54 41 47 5f 44 45 50 54 e GSCIS_TAG_DEPT
2960: 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75 72 6e _CODE:....return
2970: 28 22 47 53 43 49 53 5f 54 41 47 5f 44 45 50 54 ("GSCIS_TAG_DEPT
2980: 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61 73 65 20 _CODE");...case
2990: 47 53 43 49 53 5f 54 41 47 5f 54 49 54 4c 45 3a GSCIS_TAG_TITLE:
29a0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 ....return("GSCI
29b0: 53 5f 54 41 47 5f 54 49 54 4c 45 22 29 3b 0a 09 S_TAG_TITLE");..
29c0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f .case GSCIS_TAG_
29d0: 42 55 49 4c 44 49 4e 47 3a 0a 09 09 09 72 65 74 BUILDING:....ret
29e0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 42 urn("GSCIS_TAG_B
29f0: 55 49 4c 44 49 4e 47 22 29 3b 0a 09 09 63 61 73 UILDING");...cas
2a00: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 e GSCIS_TAG_OFFI
2a10: 43 45 5f 41 44 44 52 31 3a 0a 09 09 09 72 65 74 CE_ADDR1:....ret
2a20: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f urn("GSCIS_TAG_O
2a30: 46 46 49 43 45 5f 41 44 44 52 31 22 29 3b 0a 09 FFICE_ADDR1");..
2a40: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f .case GSCIS_TAG_
2a50: 4f 46 46 49 43 45 5f 41 44 44 52 32 3a 0a 09 09 OFFICE_ADDR2:...
2a60: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 .return("GSCIS_T
2a70: 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 32 22 AG_OFFICE_ADDR2"
2a80: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f );...case GSCIS_
2a90: 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54 59 3a TAG_OFFICE_CITY:
2aa0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 ....return("GSCI
2ab0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54 S_TAG_OFFICE_CIT
2ac0: 59 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 Y");...case GSCI
2ad0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53 54 41 S_TAG_OFFICE_STA
2ae0: 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 TE:....return("G
2af0: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f SCIS_TAG_OFFICE_
2b00: 53 54 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 STATE");...case
2b10: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 GSCIS_TAG_OFFICE
2b20: 5f 5a 49 50 3a 0a 09 09 09 72 65 74 75 72 6e 28 _ZIP:....return(
2b30: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 "GSCIS_TAG_OFFIC
2b40: 45 5f 5a 49 50 22 29 3b 0a 09 09 63 61 73 65 20 E_ZIP");...case
2b50: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 GSCIS_TAG_OFFICE
2b60: 5f 43 4f 55 4e 54 52 59 3a 0a 09 09 09 72 65 74 _COUNTRY:....ret
2b70: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f urn("GSCIS_TAG_O
2b80: 46 46 49 43 45 5f 43 4f 55 4e 54 52 59 22 29 3b FFICE_COUNTRY");
2b90: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 ...case GSCIS_TA
2ba0: 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 3a 0a G_OFFICE_PHONE:.
2bb0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 ...return("GSCIS
2bc0: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e _TAG_OFFICE_PHON
2bd0: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 E");...case GSCI
2be0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f S_TAG_OFFICE_PHO
2bf0: 4e 45 5f 45 58 54 3a 0a 09 09 09 72 65 74 75 72 NE_EXT:....retur
2c00: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 n("GSCIS_TAG_OFF
2c10: 49 43 45 5f 50 48 4f 4e 45 5f 45 58 54 22 29 3b ICE_PHONE_EXT");
2c20: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 ...case GSCIS_TA
2c30: 47 5f 4f 46 46 49 43 45 5f 46 41 58 3a 0a 09 09 G_OFFICE_FAX:...
2c40: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 .return("GSCIS_T
2c50: 41 47 5f 4f 46 46 49 43 45 5f 46 41 58 22 29 3b AG_OFFICE_FAX");
2c60: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 ...case GSCIS_TA
2c70: 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c 3a 0a G_OFFICE_EMAIL:.
2c80: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 ...return("GSCIS
2c90: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 _TAG_OFFICE_EMAI
2ca0: 4c 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 L");...case GSCI
2cb0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52 4f 4f S_TAG_OFFICE_ROO
2cc0: 4d 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 M:....return("GS
2cd0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52 CIS_TAG_OFFICE_R
2ce0: 4f 4f 4d 22 29 3b 0a 09 09 63 61 73 65 20 47 53 OOM");...case GS
2cf0: 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f 41 CIS_TAG_NONGOV_A
2d00: 47 45 4e 43 59 3a 0a 09 09 09 72 65 74 75 72 6e GENCY:....return
2d10: 28 22 47 53 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 ("GSCIS_TAG_NONG
2d20: 4f 56 5f 41 47 45 4e 43 59 22 29 3b 0a 09 09 63 OV_AGENCY");...c
2d30: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53 53 ase GSCIS_TAG_SS
2d40: 4e 5f 44 45 53 49 47 4e 41 54 4f 52 3a 0a 09 09 N_DESIGNATOR:...
2d50: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 .return("GSCIS_T
2d60: 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41 54 4f AG_SSN_DESIGNATO
2d70: 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 R");...case GSCI
2d80: 53 5f 54 41 47 5f 53 53 4e 3a 0a 09 09 09 72 65 S_TAG_SSN:....re
2d90: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f turn("GSCIS_TAG_
2da0: 53 53 4e 22 29 3b 0a 09 09 63 61 73 65 20 47 53 SSN");...case GS
2db0: 43 49 53 5f 54 41 47 5f 44 4f 42 3a 0a 09 09 09 CIS_TAG_DOB:....
2dc0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 return("GSCIS_TA
2dd0: 47 5f 44 4f 42 22 29 3b 0a 09 09 63 61 73 65 20 G_DOB");...case
2de0: 47 53 43 49 53 5f 54 41 47 5f 47 45 4e 44 45 52 GSCIS_TAG_GENDER
2df0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 :....return("GSC
2e00: 49 53 5f 54 41 47 5f 47 45 4e 44 45 52 22 29 3b IS_TAG_GENDER");
2e10: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 ...case GSCIS_TA
2e20: 47 5f 55 53 45 52 49 44 3a 0a 09 09 09 72 65 74 G_USERID:....ret
2e30: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 55 urn("GSCIS_TAG_U
2e40: 53 45 52 49 44 22 29 3b 0a 09 09 63 61 73 65 20 SERID");...case
2e50: 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49 4e GSCIS_TAG_DOMAIN
2e60: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 :....return("GSC
2e70: 49 53 5f 54 41 47 5f 44 4f 4d 41 49 4e 22 29 3b IS_TAG_DOMAIN");
2e80: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 ...case GSCIS_TA
2e90: 47 5f 50 41 53 53 57 4f 52 44 3a 0a 09 09 09 72 G_PASSWORD:....r
2ea0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 eturn("GSCIS_TAG
2eb0: 5f 50 41 53 53 57 4f 52 44 22 29 3b 0a 09 09 63 _PASSWORD");...c
2ec0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53 ase GSCIS_TAG_IS
2ed0: 53 55 45 52 49 44 3a 0a 09 09 09 72 65 74 75 72 SUERID:....retur
2ee0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 49 53 53 n("GSCIS_TAG_ISS
2ef0: 55 45 52 49 44 22 29 3b 0a 09 09 63 61 73 65 20 UERID");...case
2f00: 47 53 43 49 53 5f 54 41 47 5f 53 45 52 4e 4f 3a GSCIS_TAG_SERNO:
2f10: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 ....return("GSCI
2f20: 53 5f 54 41 47 5f 53 45 52 4e 4f 22 29 3b 0a 09 S_TAG_SERNO");..
2f30: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f .case GSCIS_TAG_
2f40: 49 53 53 55 45 5f 44 41 54 45 3a 0a 09 09 09 72 ISSUE_DATE:....r
2f50: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 eturn("GSCIS_TAG
2f60: 5f 49 53 53 55 45 5f 44 41 54 45 22 29 3b 0a 09 _ISSUE_DATE");..
2f70: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f .case GSCIS_TAG_
2f80: 45 58 50 49 52 45 5f 44 41 54 45 3a 0a 09 09 09 EXPIRE_DATE:....
2f90: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 return("GSCIS_TA
2fa0: 47 5f 45 58 50 49 52 45 5f 44 41 54 45 22 29 3b G_EXPIRE_DATE");
2fb0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 ...case GSCIS_TA
2fc0: 47 5f 43 41 52 44 5f 54 59 50 45 3a 0a 09 09 09 G_CARD_TYPE:....
2fd0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 return("GSCIS_TA
2fe0: 47 5f 43 41 52 44 5f 54 59 50 45 22 29 3b 0a 09 G_CARD_TYPE");..
2ff0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f .case GSCIS_TAG_
3000: 53 45 43 55 52 49 54 59 5f 43 4f 44 45 3a 0a 09 SECURITY_CODE:..
3010: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f ..return("GSCIS_
3020: 54 41 47 5f 53 45 43 55 52 49 54 59 5f 43 4f 44 TAG_SECURITY_COD
3030: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 E");...case GSCI
3040: 53 5f 54 41 47 5f 43 41 52 44 49 44 5f 41 49 44 S_TAG_CARDID_AID
3050: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 :....return("GSC
3060: 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f 41 49 IS_TAG_CARDID_AI
3070: 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 D");...case GSCI
3080: 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 S_TAG_CERTIFICAT
3090: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 E:....return("GS
30a0: 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 CIS_TAG_CERTIFIC
30b0: 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 ATE");...case GS
30c0: 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 49 53 53 CIS_TAG_CERT_ISS
30d0: 55 45 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75 UE_DATE:....retu
30e0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 45 rn("GSCIS_TAG_CE
30f0: 52 54 5f 49 53 53 55 45 5f 44 41 54 45 22 29 3b RT_ISSUE_DATE");
3100: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 ...case GSCIS_TA
3110: 47 5f 43 45 52 54 5f 45 58 50 49 52 45 5f 44 41 G_CERT_EXPIRE_DA
3120: 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 TE:....return("G
3130: 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 45 58 SCIS_TAG_CERT_EX
3140: 50 49 52 45 5f 44 41 54 45 22 29 3b 0a 09 7d 0a PIRE_DATE");..}.
3150: 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 ..return("UNKNOW
3160: 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 N");.}..static c
3170: 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43 4b 45 onst char *CACKE
3180: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 Y_DEBUG_FUNC_SCA
3190: 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 4c 4f 4e RDERR_TO_STR(LON
31a0: 47 20 72 65 74 63 6f 64 65 29 20 7b 0a 09 73 77 G retcode) {..sw
31b0: 69 74 63 68 20 28 72 65 74 63 6f 64 65 29 20 7b itch (retcode) {
31c0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 53 5f ...case SCARD_S_
31d0: 53 55 43 43 45 53 53 3a 0a 09 09 09 72 65 74 75 SUCCESS:....retu
31e0: 72 6e 28 22 53 43 41 52 44 5f 53 5f 53 55 43 43 rn("SCARD_S_SUCC
31f0: 45 53 53 22 29 3b 0a 09 09 63 61 73 65 20 53 43 ESS");...case SC
3200: 41 52 44 5f 45 5f 43 41 4e 43 45 4c 4c 45 44 3a ARD_E_CANCELLED:
3210: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 ....return("SCAR
3220: 44 5f 45 5f 43 41 4e 43 45 4c 4c 45 44 22 29 3b D_E_CANCELLED");
3230: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f ...case SCARD_E_
3240: 43 41 4e 54 5f 44 49 53 50 4f 53 45 3a 0a 09 09 CANT_DISPOSE:...
3250: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 .return("SCARD_E
3260: 5f 43 41 4e 54 5f 44 49 53 50 4f 53 45 22 29 3b _CANT_DISPOSE");
3270: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f ...case SCARD_E_
3280: 49 4e 53 55 46 46 49 43 49 45 4e 54 5f 42 55 46 INSUFFICIENT_BUF
3290: 46 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 FER:....return("
32a0: 53 43 41 52 44 5f 45 5f 49 4e 53 55 46 46 49 43 SCARD_E_INSUFFIC
32b0: 49 45 4e 54 5f 42 55 46 46 45 52 22 29 3b 0a 09 IENT_BUFFER");..
32c0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e .case SCARD_E_IN
32d0: 56 41 4c 49 44 5f 41 54 52 3a 0a 09 09 09 72 65 VALID_ATR:....re
32e0: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e turn("SCARD_E_IN
32f0: 56 41 4c 49 44 5f 41 54 52 22 29 3b 0a 09 09 63 VALID_ATR");...c
3300: 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 ase SCARD_E_INVA
3310: 4c 49 44 5f 48 41 4e 44 4c 45 3a 0a 09 09 09 72 LID_HANDLE:....r
3320: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 eturn("SCARD_E_I
3330: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 22 29 3b NVALID_HANDLE");
3340: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f ...case SCARD_E_
3350: 49 4e 56 41 4c 49 44 5f 50 41 52 41 4d 45 54 45 INVALID_PARAMETE
3360: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 R:....return("SC
3370: 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 50 41 ARD_E_INVALID_PA
3380: 52 41 4d 45 54 45 52 22 29 3b 0a 09 09 63 61 73 RAMETER");...cas
3390: 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 e SCARD_E_INVALI
33a0: 44 5f 54 41 52 47 45 54 3a 0a 09 09 09 72 65 74 D_TARGET:....ret
33b0: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 urn("SCARD_E_INV
33c0: 41 4c 49 44 5f 54 41 52 47 45 54 22 29 3b 0a 09 ALID_TARGET");..
33d0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e .case SCARD_E_IN
33e0: 56 41 4c 49 44 5f 56 41 4c 55 45 3a 0a 09 09 09 VALID_VALUE:....
33f0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f return("SCARD_E_
3400: 49 4e 56 41 4c 49 44 5f 56 41 4c 55 45 22 29 3b INVALID_VALUE");
3410: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f ...case SCARD_E_
3420: 4e 4f 5f 4d 45 4d 4f 52 59 3a 0a 09 09 09 72 65 NO_MEMORY:....re
3430: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f turn("SCARD_E_NO
3440: 5f 4d 45 4d 4f 52 59 22 29 3b 0a 09 09 63 61 73 _MEMORY");...cas
3450: 65 20 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 e SCARD_E_UNKNOW
3460: 4e 5f 52 45 41 44 45 52 3a 0a 09 09 09 72 65 74 N_READER:....ret
3470: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e 4b urn("SCARD_E_UNK
3480: 4e 4f 57 4e 5f 52 45 41 44 45 52 22 29 3b 0a 09 NOWN_READER");..
3490: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 54 49 .case SCARD_E_TI
34a0: 4d 45 4f 55 54 3a 0a 09 09 09 72 65 74 75 72 6e MEOUT:....return
34b0: 28 22 53 43 41 52 44 5f 45 5f 54 49 4d 45 4f 55 ("SCARD_E_TIMEOU
34c0: 54 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 T");...case SCAR
34d0: 44 5f 45 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c D_E_SHARING_VIOL
34e0: 41 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72 6e ATION:....return
34f0: 28 22 53 43 41 52 44 5f 45 5f 53 48 41 52 49 4e ("SCARD_E_SHARIN
3500: 47 5f 56 49 4f 4c 41 54 49 4f 4e 22 29 3b 0a 09 G_VIOLATION");..
3510: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f .case SCARD_E_NO
3520: 5f 53 4d 41 52 54 43 41 52 44 3a 0a 09 09 09 72 _SMARTCARD:....r
3530: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e eturn("SCARD_E_N
3540: 4f 5f 53 4d 41 52 54 43 41 52 44 22 29 3b 0a 09 O_SMARTCARD");..
3550: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 55 4e .case SCARD_E_UN
3560: 4b 4e 4f 57 4e 5f 43 41 52 44 3a 0a 09 09 09 72 KNOWN_CARD:....r
3570: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55 eturn("SCARD_E_U
3580: 4e 4b 4e 4f 57 4e 5f 43 41 52 44 22 29 3b 0a 09 NKNOWN_CARD");..
3590: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 50 52 .case SCARD_E_PR
35a0: 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 3a 0a 09 09 OTO_MISMATCH:...
35b0: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 .return("SCARD_E
35c0: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 22 _PROTO_MISMATCH"
35d0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f );...case SCARD_
35e0: 45 5f 4e 4f 54 5f 52 45 41 44 59 3a 0a 09 09 09 E_NOT_READY:....
35f0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f return("SCARD_E_
3600: 4e 4f 54 5f 52 45 41 44 59 22 29 3b 0a 09 09 63 NOT_READY");...c
3610: 61 73 65 20 53 43 41 52 44 5f 45 5f 53 59 53 54 ase SCARD_E_SYST
3620: 45 4d 5f 43 41 4e 43 45 4c 4c 45 44 3a 0a 09 09 EM_CANCELLED:...
3630: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 .return("SCARD_E
3640: 5f 53 59 53 54 45 4d 5f 43 41 4e 43 45 4c 4c 45 _SYSTEM_CANCELLE
3650: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 D");...case SCAR
3660: 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41 43 54 D_E_NOT_TRANSACT
3670: 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 ED:....return("S
3680: 43 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 CARD_E_NOT_TRANS
3690: 41 43 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20 ACTED");...case
36a0: 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55 SCARD_E_READER_U
36b0: 4e 41 56 41 49 4c 41 42 4c 45 3a 0a 09 09 09 72 NAVAILABLE:....r
36c0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 52 eturn("SCARD_E_R
36d0: 45 41 44 45 52 5f 55 4e 41 56 41 49 4c 41 42 4c EADER_UNAVAILABL
36e0: 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 E");...case SCAR
36f0: 44 5f 57 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f D_W_UNSUPPORTED_
3700: 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 CARD:....return(
3710: 22 53 43 41 52 44 5f 57 5f 55 4e 53 55 50 50 4f "SCARD_W_UNSUPPO
3720: 52 54 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63 RTED_CARD");...c
3730: 61 73 65 20 53 43 41 52 44 5f 57 5f 55 4e 52 45 ase SCARD_W_UNRE
3740: 53 50 4f 4e 53 49 56 45 5f 43 41 52 44 3a 0a 09 SPONSIVE_CARD:..
3750: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f ..return("SCARD_
3760: 57 5f 55 4e 52 45 53 50 4f 4e 53 49 56 45 5f 43 W_UNRESPONSIVE_C
3770: 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 ARD");...case SC
3780: 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f ARD_W_UNPOWERED_
3790: 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 CARD:....return(
37a0: 22 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 "SCARD_W_UNPOWER
37b0: 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 ED_CARD");...cas
37c0: 65 20 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f e SCARD_W_RESET_
37d0: 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 CARD:....return(
37e0: 22 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f 43 "SCARD_W_RESET_C
37f0: 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 ARD");...case SC
3800: 41 52 44 5f 57 5f 52 45 4d 4f 56 45 44 5f 43 41 ARD_W_REMOVED_CA
3810: 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 RD:....return("S
3820: 43 41 52 44 5f 57 5f 52 45 4d 4f 56 45 44 5f 43 CARD_W_REMOVED_C
3830: 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 ARD");...case SC
3840: 41 52 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f 53 4d ARD_E_PCI_TOO_SM
3850: 41 4c 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 ALL:....return("
3860: 53 43 41 52 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f SCARD_E_PCI_TOO_
3870: 53 4d 41 4c 4c 22 29 3b 0a 09 09 63 61 73 65 20 SMALL");...case
3880: 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55 SCARD_E_READER_U
3890: 4e 53 55 50 50 4f 52 54 45 44 3a 0a 09 09 09 72 NSUPPORTED:....r
38a0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 52 eturn("SCARD_E_R
38b0: 45 41 44 45 52 5f 55 4e 53 55 50 50 4f 52 54 45 EADER_UNSUPPORTE
38c0: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 D");...case SCAR
38d0: 44 5f 45 5f 44 55 50 4c 49 43 41 54 45 5f 52 45 D_E_DUPLICATE_RE
38e0: 41 44 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 ADER:....return(
38f0: 22 53 43 41 52 44 5f 45 5f 44 55 50 4c 49 43 41 "SCARD_E_DUPLICA
3900: 54 45 5f 52 45 41 44 45 52 22 29 3b 0a 09 09 63 TE_READER");...c
3910: 61 73 65 20 53 43 41 52 44 5f 45 5f 43 41 52 44 ase SCARD_E_CARD
3920: 5f 55 4e 53 55 50 50 4f 52 54 45 44 3a 0a 09 09 _UNSUPPORTED:...
3930: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 .return("SCARD_E
3940: 5f 43 41 52 44 5f 55 4e 53 55 50 50 4f 52 54 45 _CARD_UNSUPPORTE
3950: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 D");...case SCAR
3960: 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45 3a 0a D_E_NO_SERVICE:.
3970: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 ...return("SCARD
3980: 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45 22 29 3b _E_NO_SERVICE");
3990: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f ...case SCARD_E_
39a0: 53 45 52 56 49 43 45 5f 53 54 4f 50 50 45 44 3a SERVICE_STOPPED:
39b0: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 ....return("SCAR
39c0: 44 5f 45 5f 53 45 52 56 49 43 45 5f 53 54 4f 50 D_E_SERVICE_STOP
39d0: 50 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 PED");...case SC
39e0: 41 52 44 5f 45 5f 55 4e 53 55 50 50 4f 52 54 45 ARD_E_UNSUPPORTE
39f0: 44 5f 46 45 41 54 55 52 45 3a 0a 09 09 09 72 65 D_FEATURE:....re
3a00: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e turn("SCARD_E_UN
3a10: 53 55 50 50 4f 52 54 45 44 5f 46 45 41 54 55 52 SUPPORTED_FEATUR
3a20: 45 22 29 3b 0a 23 69 66 64 65 66 20 53 43 41 52 E");.#ifdef SCAR
3a30: 44 5f 57 5f 49 4e 53 45 52 54 45 44 5f 43 41 52 D_W_INSERTED_CAR
3a40: 44 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 57 D...case SCARD_W
3a50: 5f 49 4e 53 45 52 54 45 44 5f 43 41 52 44 3a 0a _INSERTED_CARD:.
3a60: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 ...return("SCARD
3a70: 5f 57 5f 49 4e 53 45 52 54 45 44 5f 43 41 52 44 _W_INSERTED_CARD
3a80: 22 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 ");.#endif.#ifde
3a90: 66 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 52 45 41 f SCARD_E_NO_REA
3aa0: 44 45 52 53 5f 41 56 41 49 4c 41 42 4c 45 0a 09 DERS_AVAILABLE..
3ab0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f .case SCARD_E_NO
3ac0: 5f 52 45 41 44 45 52 53 5f 41 56 41 49 4c 41 42 _READERS_AVAILAB
3ad0: 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 LE:....return("S
3ae0: 43 41 52 44 5f 45 5f 4e 4f 5f 52 45 41 44 45 52 CARD_E_NO_READER
3af0: 53 5f 41 56 41 49 4c 41 42 4c 45 22 29 3b 0a 23 S_AVAILABLE");.#
3b00: 65 6e 64 69 66 0a 09 7d 0a 0a 09 72 65 74 75 72 endif..}...retur
3b10: 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a n("UNKNOWN");.}.
3b20: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 .static const ch
3b30: 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 ar *CACKEY_DEBUG
3b40: 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 _FUNC_OBJID_TO_S
3b50: 54 52 28 75 69 6e 74 31 36 5f 74 20 6f 62 6a 69 TR(uint16_t obji
3b60: 64 29 20 7b 0a 09 73 77 69 74 63 68 20 28 6f 62 d) {..switch (ob
3b70: 6a 69 64 29 20 7b 0a 09 09 63 61 73 65 20 30 78 jid) {...case 0x
3b80: 32 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 2000:....return(
3b90: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 "CACKEY_TLV_OBJI
3ba0: 44 5f 47 45 4e 45 52 41 4c 49 4e 46 4f 22 29 3b D_GENERALINFO");
3bb0: 0a 09 09 63 61 73 65 20 30 78 32 31 30 30 3a 0a ...case 0x2100:.
3bc0: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 ...return("CACKE
3bd0: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 50 52 4f 50 Y_TLV_OBJID_PROP
3be0: 45 52 53 4f 4e 41 4c 49 4e 46 4f 22 29 3b 0a 09 ERSONALINFO");..
3bf0: 09 63 61 73 65 20 30 78 33 30 30 30 3a 0a 09 09 .case 0x3000:...
3c00: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f .return("CACKEY_
3c10: 54 4c 56 5f 4f 42 4a 49 44 5f 41 43 43 45 53 53 TLV_OBJID_ACCESS
3c20: 43 4f 4e 54 52 4f 4c 22 29 3b 0a 09 09 63 61 73 CONTROL");...cas
3c30: 65 20 30 78 34 30 30 30 3a 0a 09 09 09 72 65 74 e 0x4000:....ret
3c40: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f urn("CACKEY_TLV_
3c50: 4f 42 4a 49 44 5f 4c 4f 47 49 4e 22 29 3b 0a 09 OBJID_LOGIN");..
3c60: 09 63 61 73 65 20 30 78 35 30 30 30 3a 0a 09 09 .case 0x5000:...
3c70: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f .return("CACKEY_
3c80: 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 52 44 49 4e TLV_OBJID_CARDIN
3c90: 46 4f 22 29 3b 0a 09 09 63 61 73 65 20 30 78 36 FO");...case 0x6
3ca0: 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 000:....return("
3cb0: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 CACKEY_TLV_OBJID
3cc0: 5f 42 49 4f 4d 45 54 52 49 43 53 22 29 3b 0a 09 _BIOMETRICS");..
3cd0: 09 63 61 73 65 20 30 78 37 30 30 30 3a 0a 09 09 .case 0x7000:...
3ce0: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f .return("CACKEY_
3cf0: 54 4c 56 5f 4f 42 4a 49 44 5f 44 49 47 49 54 41 TLV_OBJID_DIGITA
3d00: 4c 53 49 47 43 45 52 54 22 29 3b 0a 09 09 63 61 LSIGCERT");...ca
3d10: 73 65 20 30 78 30 32 30 30 3a 0a 09 09 09 72 65 se 0x0200:....re
3d20: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 turn("CACKEY_TLV
3d30: 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f _OBJID_CAC_PERSO
3d40: 4e 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32 N");...case 0x02
3d50: 30 32 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 02:....return("C
3d60: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f ACKEY_TLV_OBJID_
3d70: 43 41 43 5f 42 45 4e 45 46 49 54 53 22 29 3b 0a CAC_BENEFITS");.
3d80: 09 09 63 61 73 65 20 30 78 30 32 30 33 3a 0a 09 ..case 0x0203:..
3d90: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 ..return("CACKEY
3da0: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f _TLV_OBJID_CAC_O
3db0: 54 48 45 52 42 45 4e 45 46 49 54 53 22 29 3b 0a THERBENEFITS");.
3dc0: 09 09 63 61 73 65 20 30 78 30 32 30 31 3a 0a 09 ..case 0x0201:..
3dd0: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 ..return("CACKEY
3de0: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 _TLV_OBJID_CAC_P
3df0: 45 52 53 4f 4e 4e 45 4c 22 29 3b 0a 09 09 63 61 ERSONNEL");...ca
3e00: 73 65 20 30 78 30 32 46 45 3a 0a 09 09 09 72 65 se 0x02FE:....re
3e10: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 turn("CACKEY_TLV
3e20: 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 4b 49 43 45 _OBJID_CAC_PKICE
3e30: 52 54 22 29 3b 0a 09 7d 0a 09 0a 09 72 65 74 75 RT");..}....retu
3e40: 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d rn("UNKNOWN");.}
3e50: 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 ..static const c
3e60: 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 har *CACKEY_DEBU
3e70: 47 5f 46 55 4e 43 5f 41 50 50 54 59 50 45 5f 54 G_FUNC_APPTYPE_T
3e80: 4f 5f 53 54 52 28 75 69 6e 74 38 5f 74 20 61 70 O_STR(uint8_t ap
3e90: 70 74 79 70 65 29 20 7b 0a 09 73 77 69 74 63 68 ptype) {..switch
3ea0: 20 28 61 70 70 74 79 70 65 29 20 7b 0a 09 09 63 (apptype) {...c
3eb0: 61 73 65 20 30 78 30 30 3a 0a 09 09 09 72 65 74 ase 0x00:....ret
3ec0: 75 72 6e 28 22 4e 4f 4e 45 22 29 3b 0a 09 09 63 urn("NONE");...c
3ed0: 61 73 65 20 30 78 30 31 3a 0a 09 09 09 72 65 74 ase 0x01:....ret
3ee0: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f urn("CACKEY_TLV_
3ef0: 41 50 50 5f 47 45 4e 45 52 49 43 22 29 3b 0a 09 APP_GENERIC");..
3f00: 09 63 61 73 65 20 30 78 30 32 3a 0a 09 09 09 72 .case 0x02:....r
3f10: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c eturn("CACKEY_TL
3f20: 56 5f 41 50 50 5f 53 4b 49 22 29 3b 0a 09 09 63 V_APP_SKI");...c
3f30: 61 73 65 20 30 78 30 33 3a 0a 09 09 09 72 65 74 ase 0x03:....ret
3f40: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f urn("CACKEY_TLV_
3f50: 41 50 50 5f 47 45 4e 45 52 49 43 20 7c 20 43 41 APP_GENERIC | CA
3f60: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 CKEY_TLV_APP_SKI
3f70: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 34 3a ");...case 0x04:
3f80: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b ....return("CACK
3f90: 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29 EY_TLV_APP_PKI")
3fa0: 3b 0a 09 09 63 61 73 65 20 30 78 30 35 3a 0a 09 ;...case 0x05:..
3fb0: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 ..return("CACKEY
3fc0: 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 _TLV_APP_GENERIC
3fd0: 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 | CACKEY_TLV_AP
3fe0: 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 P_PKI");...case
3ff0: 30 78 30 36 3a 0a 09 09 09 72 65 74 75 72 6e 28 0x06:....return(
4000: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f "CACKEY_TLV_APP_
4010: 53 4b 49 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 SKI | CACKEY_TLV
4020: 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61 _APP_PKI");...ca
4030: 73 65 20 30 78 30 37 3a 0a 09 09 09 72 65 74 75 se 0x07:....retu
4040: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 rn("CACKEY_TLV_A
4050: 50 50 5f 47 45 4e 45 52 49 43 20 7c 20 43 41 43 PP_GENERIC | CAC
4060: 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 20 KEY_TLV_APP_SKI
4070: 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 | CACKEY_TLV_APP
4080: 5f 50 4b 49 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 _PKI");..}...ret
4090: 75 72 6e 28 22 49 4e 56 41 4c 49 44 22 29 3b 0a urn("INVALID");.
40a0: 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 }..static const
40b0: 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 char *CACKEY_DEB
40c0: 55 47 5f 46 55 4e 43 5f 41 54 54 52 49 42 55 54 UG_FUNC_ATTRIBUT
40d0: 45 5f 54 4f 5f 53 54 52 28 43 4b 5f 41 54 54 52 E_TO_STR(CK_ATTR
40e0: 49 42 55 54 45 5f 54 59 50 45 20 61 74 74 72 29 IBUTE_TYPE attr)
40f0: 20 7b 0a 09 73 77 69 74 63 68 20 28 61 74 74 72 {..switch (attr
4100: 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 41 5f 43 ) {...case CKA_C
4110: 4c 41 53 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 LASS:....return(
4120: 22 43 4b 41 5f 43 4c 41 53 53 22 29 3b 0a 09 09 "CKA_CLASS");...
4130: 63 61 73 65 20 43 4b 41 5f 54 4f 4b 45 4e 3a 0a case CKA_TOKEN:.
4140: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 54 ...return("CKA_T
4150: 4f 4b 45 4e 22 29 3b 0a 09 09 63 61 73 65 20 43 OKEN");...case C
4160: 4b 41 5f 50 52 49 56 41 54 45 3a 0a 09 09 09 72 KA_PRIVATE:....r
4170: 65 74 75 72 6e 28 22 43 4b 41 5f 50 52 49 56 41 eturn("CKA_PRIVA
4180: 54 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 TE");...case CKA
4190: 5f 4c 41 42 45 4c 3a 0a 09 09 09 72 65 74 75 72 _LABEL:....retur
41a0: 6e 28 22 43 4b 41 5f 4c 41 42 45 4c 22 29 3b 0a n("CKA_LABEL");.
41b0: 09 09 63 61 73 65 20 43 4b 41 5f 41 50 50 4c 49 ..case CKA_APPLI
41c0: 43 41 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72 CATION:....retur
41d0: 6e 28 22 43 4b 41 5f 41 50 50 4c 49 43 41 54 49 n("CKA_APPLICATI
41e0: 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 ON");...case CKA
41f0: 5f 56 41 4c 55 45 3a 0a 09 09 09 72 65 74 75 72 _VALUE:....retur
4200: 6e 28 22 43 4b 41 5f 56 41 4c 55 45 22 29 3b 0a n("CKA_VALUE");.
4210: 09 09 63 61 73 65 20 43 4b 41 5f 4f 42 4a 45 43 ..case CKA_OBJEC
4220: 54 5f 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 T_ID:....return(
4230: 22 43 4b 41 5f 4f 42 4a 45 43 54 5f 49 44 22 29 "CKA_OBJECT_ID")
4240: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52 ;...case CKA_CER
4250: 54 49 46 49 43 41 54 45 5f 54 59 50 45 3a 0a 09 TIFICATE_TYPE:..
4260: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 43 45 ..return("CKA_CE
4270: 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 22 29 RTIFICATE_TYPE")
4280: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 49 53 53 ;...case CKA_ISS
4290: 55 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 UER:....return("
42a0: 43 4b 41 5f 49 53 53 55 45 52 22 29 3b 0a 09 09 CKA_ISSUER");...
42b0: 63 61 73 65 20 43 4b 41 5f 53 45 52 49 41 4c 5f case CKA_SERIAL_
42c0: 4e 55 4d 42 45 52 3a 0a 09 09 09 72 65 74 75 72 NUMBER:....retur
42d0: 6e 28 22 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 n("CKA_SERIAL_NU
42e0: 4d 42 45 52 22 29 3b 0a 09 09 63 61 73 65 20 43 MBER");...case C
42f0: 4b 41 5f 41 43 5f 49 53 53 55 45 52 3a 0a 09 09 KA_AC_ISSUER:...
4300: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 41 43 5f .return("CKA_AC_
4310: 49 53 53 55 45 52 22 29 3b 0a 09 09 63 61 73 65 ISSUER");...case
4320: 20 43 4b 41 5f 4f 57 4e 45 52 3a 0a 09 09 09 72 CKA_OWNER:....r
4330: 65 74 75 72 6e 28 22 43 4b 41 5f 4f 57 4e 45 52 eturn("CKA_OWNER
4340: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 41 ");...case CKA_A
4350: 54 54 52 5f 54 59 50 45 53 3a 0a 09 09 09 72 65 TTR_TYPES:....re
4360: 74 75 72 6e 28 22 43 4b 41 5f 41 54 54 52 5f 54 turn("CKA_ATTR_T
4370: 59 50 45 53 22 29 3b 0a 09 09 63 61 73 65 20 43 YPES");...case C
4380: 4b 41 5f 54 52 55 53 54 45 44 3a 0a 09 09 09 72 KA_TRUSTED:....r
4390: 65 74 75 72 6e 28 22 43 4b 41 5f 54 52 55 53 54 eturn("CKA_TRUST
43a0: 45 44 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 ED");...case CKA
43b0: 5f 4b 45 59 5f 54 59 50 45 3a 0a 09 09 09 72 65 _KEY_TYPE:....re
43c0: 74 75 72 6e 28 22 43 4b 41 5f 4b 45 59 5f 54 59 turn("CKA_KEY_TY
43d0: 50 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 PE");...case CKA
43e0: 5f 53 55 42 4a 45 43 54 3a 0a 09 09 09 72 65 74 _SUBJECT:....ret
43f0: 75 72 6e 28 22 43 4b 41 5f 53 55 42 4a 45 43 54 urn("CKA_SUBJECT
4400: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 49 ");...case CKA_I
4410: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b D:....return("CK
4420: 41 5f 49 44 22 29 3b 0a 09 09 63 61 73 65 20 43 A_ID");...case C
4430: 4b 41 5f 53 45 4e 53 49 54 49 56 45 3a 0a 09 09 KA_SENSITIVE:...
4440: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 45 4e .return("CKA_SEN
4450: 53 49 54 49 56 45 22 29 3b 0a 09 09 63 61 73 65 SITIVE");...case
4460: 20 43 4b 41 5f 45 4e 43 52 59 50 54 3a 0a 09 09 CKA_ENCRYPT:...
4470: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 4e 43 .return("CKA_ENC
4480: 52 59 50 54 22 29 3b 0a 09 09 63 61 73 65 20 43 RYPT");...case C
4490: 4b 41 5f 44 45 43 52 59 50 54 3a 0a 09 09 09 72 KA_DECRYPT:....r
44a0: 65 74 75 72 6e 28 22 43 4b 41 5f 44 45 43 52 59 eturn("CKA_DECRY
44b0: 50 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 PT");...case CKA
44c0: 5f 57 52 41 50 3a 0a 09 09 09 72 65 74 75 72 6e _WRAP:....return
44d0: 28 22 43 4b 41 5f 57 52 41 50 22 29 3b 0a 09 09 ("CKA_WRAP");...
44e0: 63 61 73 65 20 43 4b 41 5f 55 4e 57 52 41 50 3a case CKA_UNWRAP:
44f0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f ....return("CKA_
4500: 55 4e 57 52 41 50 22 29 3b 0a 09 09 63 61 73 65 UNWRAP");...case
4510: 20 43 4b 41 5f 53 49 47 4e 3a 0a 09 09 09 72 65 CKA_SIGN:....re
4520: 74 75 72 6e 28 22 43 4b 41 5f 53 49 47 4e 22 29 turn("CKA_SIGN")
4530: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53 49 47 ;...case CKA_SIG
4540: 4e 5f 52 45 43 4f 56 45 52 3a 0a 09 09 09 72 65 N_RECOVER:....re
4550: 74 75 72 6e 28 22 43 4b 41 5f 53 49 47 4e 5f 52 turn("CKA_SIGN_R
4560: 45 43 4f 56 45 52 22 29 3b 0a 09 09 63 61 73 65 ECOVER");...case
4570: 20 43 4b 41 5f 56 45 52 49 46 59 3a 0a 09 09 09 CKA_VERIFY:....
4580: 72 65 74 75 72 6e 28 22 43 4b 41 5f 56 45 52 49 return("CKA_VERI
4590: 46 59 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 FY");...case CKA
45a0: 5f 56 45 52 49 46 59 5f 52 45 43 4f 56 45 52 3a _VERIFY_RECOVER:
45b0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f ....return("CKA_
45c0: 56 45 52 49 46 59 5f 52 45 43 4f 56 45 52 22 29 VERIFY_RECOVER")
45d0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 44 45 52 ;...case CKA_DER
45e0: 49 56 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 IVE:....return("
45f0: 43 4b 41 5f 44 45 52 49 56 45 22 29 3b 0a 09 09 CKA_DERIVE");...
4600: 63 61 73 65 20 43 4b 41 5f 53 54 41 52 54 5f 44 case CKA_START_D
4610: 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 ATE:....return("
4620: 43 4b 41 5f 53 54 41 52 54 5f 44 41 54 45 22 29 CKA_START_DATE")
4630: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 4e 44 ;...case CKA_END
4640: 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e _DATE:....return
4650: 28 22 43 4b 41 5f 45 4e 44 5f 44 41 54 45 22 29 ("CKA_END_DATE")
4660: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 ;...case CKA_MOD
4670: 55 4c 55 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 ULUS:....return(
4680: 22 43 4b 41 5f 4d 4f 44 55 4c 55 53 22 29 3b 0a "CKA_MODULUS");.
4690: 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55 4c ..case CKA_MODUL
46a0: 55 53 5f 42 49 54 53 3a 0a 09 09 09 72 65 74 75 US_BITS:....retu
46b0: 72 6e 28 22 43 4b 41 5f 4d 4f 44 55 4c 55 53 5f rn("CKA_MODULUS_
46c0: 42 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20 43 BITS");...case C
46d0: 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45 KA_PUBLIC_EXPONE
46e0: 4e 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 NT:....return("C
46f0: 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45 KA_PUBLIC_EXPONE
4700: 4e 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 NT");...case CKA
4710: 5f 50 52 49 56 41 54 45 5f 45 58 50 4f 4e 45 4e _PRIVATE_EXPONEN
4720: 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b T:....return("CK
4730: 41 5f 50 52 49 56 41 54 45 5f 45 58 50 4f 4e 45 A_PRIVATE_EXPONE
4740: 4e 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 NT");...case CKA
4750: 5f 50 52 49 4d 45 5f 31 3a 0a 09 09 09 72 65 74 _PRIME_1:....ret
4760: 75 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f 31 urn("CKA_PRIME_1
4770: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 ");...case CKA_P
4780: 52 49 4d 45 5f 32 3a 0a 09 09 09 72 65 74 75 72 RIME_2:....retur
4790: 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f 32 22 29 n("CKA_PRIME_2")
47a0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 58 50 ;...case CKA_EXP
47b0: 4f 4e 45 4e 54 5f 31 3a 0a 09 09 09 72 65 74 75 ONENT_1:....retu
47c0: 72 6e 28 22 43 4b 41 5f 45 58 50 4f 4e 45 4e 54 rn("CKA_EXPONENT
47d0: 5f 31 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 _1");...case CKA
47e0: 5f 45 58 50 4f 4e 45 4e 54 5f 32 3a 0a 09 09 09 _EXPONENT_2:....
47f0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 58 50 4f return("CKA_EXPO
4800: 4e 45 4e 54 5f 32 22 29 3b 0a 09 09 63 61 73 65 NENT_2");...case
4810: 20 43 4b 41 5f 43 4f 45 46 46 49 43 49 45 4e 54 CKA_COEFFICIENT
4820: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 :....return("CKA
4830: 5f 43 4f 45 46 46 49 43 49 45 4e 54 22 29 3b 0a _COEFFICIENT");.
4840: 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49 4d 45 ..case CKA_PRIME
4850: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 :....return("CKA
4860: 5f 50 52 49 4d 45 22 29 3b 0a 09 09 63 61 73 65 _PRIME");...case
4870: 20 43 4b 41 5f 53 55 42 50 52 49 4d 45 3a 0a 09 CKA_SUBPRIME:..
4880: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 55 ..return("CKA_SU
4890: 42 50 52 49 4d 45 22 29 3b 0a 09 09 63 61 73 65 BPRIME");...case
48a0: 20 43 4b 41 5f 42 41 53 45 3a 0a 09 09 09 72 65 CKA_BASE:....re
48b0: 74 75 72 6e 28 22 43 4b 41 5f 42 41 53 45 22 29 turn("CKA_BASE")
48c0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49 ;...case CKA_PRI
48d0: 4d 45 5f 42 49 54 53 3a 0a 09 09 09 72 65 74 75 ME_BITS:....retu
48e0: 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f 42 49 rn("CKA_PRIME_BI
48f0: 54 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 TS");...case CKA
4900: 5f 53 55 42 5f 50 52 49 4d 45 5f 42 49 54 53 3a _SUB_PRIME_BITS:
4910: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f ....return("CKA_
4920: 53 55 42 5f 50 52 49 4d 45 5f 42 49 54 53 22 29 SUB_PRIME_BITS")
4930: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56 41 4c ;...case CKA_VAL
4940: 55 45 5f 42 49 54 53 3a 0a 09 09 09 72 65 74 75 UE_BITS:....retu
4950: 72 6e 28 22 43 4b 41 5f 56 41 4c 55 45 5f 42 49 rn("CKA_VALUE_BI
4960: 54 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 TS");...case CKA
4970: 5f 56 41 4c 55 45 5f 4c 45 4e 3a 0a 09 09 09 72 _VALUE_LEN:....r
4980: 65 74 75 72 6e 28 22 43 4b 41 5f 56 41 4c 55 45 eturn("CKA_VALUE
4990: 5f 4c 45 4e 22 29 3b 0a 09 09 63 61 73 65 20 43 _LEN");...case C
49a0: 4b 41 5f 45 58 54 52 41 43 54 41 42 4c 45 3a 0a KA_EXTRACTABLE:.
49b0: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 ...return("CKA_E
49c0: 58 54 52 41 43 54 41 42 4c 45 22 29 3b 0a 09 09 XTRACTABLE");...
49d0: 63 61 73 65 20 43 4b 41 5f 4c 4f 43 41 4c 3a 0a case CKA_LOCAL:.
49e0: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4c ...return("CKA_L
49f0: 4f 43 41 4c 22 29 3b 0a 09 09 63 61 73 65 20 43 OCAL");...case C
4a00: 4b 41 5f 4e 45 56 45 52 5f 45 58 54 52 41 43 54 KA_NEVER_EXTRACT
4a10: 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 ABLE:....return(
4a20: 22 43 4b 41 5f 4e 45 56 45 52 5f 45 58 54 52 41 "CKA_NEVER_EXTRA
4a30: 43 54 41 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 CTABLE");...case
4a40: 20 43 4b 41 5f 41 4c 57 41 59 53 5f 53 45 4e 53 CKA_ALWAYS_SENS
4a50: 49 54 49 56 45 3a 0a 09 09 09 72 65 74 75 72 6e ITIVE:....return
4a60: 28 22 43 4b 41 5f 41 4c 57 41 59 53 5f 53 45 4e ("CKA_ALWAYS_SEN
4a70: 53 49 54 49 56 45 22 29 3b 0a 09 09 63 61 73 65 SITIVE");...case
4a80: 20 43 4b 41 5f 4b 45 59 5f 47 45 4e 5f 4d 45 43 CKA_KEY_GEN_MEC
4a90: 48 41 4e 49 53 4d 3a 0a 09 09 09 72 65 74 75 72 HANISM:....retur
4aa0: 6e 28 22 43 4b 41 5f 4b 45 59 5f 47 45 4e 5f 4d n("CKA_KEY_GEN_M
4ab0: 45 43 48 41 4e 49 53 4d 22 29 3b 0a 09 09 63 61 ECHANISM");...ca
4ac0: 73 65 20 43 4b 41 5f 4d 4f 44 49 46 49 41 42 4c se CKA_MODIFIABL
4ad0: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b E:....return("CK
4ae0: 41 5f 4d 4f 44 49 46 49 41 42 4c 45 22 29 3b 0a A_MODIFIABLE");.
4af0: 09 09 63 61 73 65 20 43 4b 41 5f 45 43 44 53 41 ..case CKA_ECDSA
4b00: 5f 50 41 52 41 4d 53 3a 0a 09 09 09 72 65 74 75 _PARAMS:....retu
4b10: 72 6e 28 22 43 4b 41 5f 45 43 44 53 41 5f 50 41 rn("CKA_ECDSA_PA
4b20: 52 41 4d 53 22 29 3b 0a 09 09 63 61 73 65 20 43 RAMS");...case C
4b30: 4b 41 5f 45 43 5f 50 4f 49 4e 54 3a 0a 09 09 09 KA_EC_POINT:....
4b40: 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 43 5f 50 return("CKA_EC_P
4b50: 4f 49 4e 54 22 29 3b 0a 09 09 63 61 73 65 20 43 OINT");...case C
4b60: 4b 41 5f 53 45 43 4f 4e 44 41 52 59 5f 41 55 54 KA_SECONDARY_AUT
4b70: 48 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b H:....return("CK
4b80: 41 5f 53 45 43 4f 4e 44 41 52 59 5f 41 55 54 48 A_SECONDARY_AUTH
4b90: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 41 ");...case CKA_A
4ba0: 55 54 48 5f 50 49 4e 5f 46 4c 41 47 53 3a 0a 09 UTH_PIN_FLAGS:..
4bb0: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 41 55 ..return("CKA_AU
4bc0: 54 48 5f 50 49 4e 5f 46 4c 41 47 53 22 29 3b 0a TH_PIN_FLAGS");.
4bd0: 09 09 63 61 73 65 20 43 4b 41 5f 48 57 5f 46 45 ..case CKA_HW_FE
4be0: 41 54 55 52 45 5f 54 59 50 45 3a 0a 09 09 09 72 ATURE_TYPE:....r
4bf0: 65 74 75 72 6e 28 22 43 4b 41 5f 48 57 5f 46 45 eturn("CKA_HW_FE
4c00: 41 54 55 52 45 5f 54 59 50 45 22 29 3b 0a 09 09 ATURE_TYPE");...
4c10: 63 61 73 65 20 43 4b 41 5f 52 45 53 45 54 5f 4f case CKA_RESET_O
4c20: 4e 5f 49 4e 49 54 3a 0a 09 09 09 72 65 74 75 72 N_INIT:....retur
4c30: 6e 28 22 43 4b 41 5f 52 45 53 45 54 5f 4f 4e 5f n("CKA_RESET_ON_
4c40: 49 4e 49 54 22 29 3b 0a 09 09 63 61 73 65 20 43 INIT");...case C
4c50: 4b 41 5f 48 41 53 5f 52 45 53 45 54 3a 0a 09 09 KA_HAS_RESET:...
4c60: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 48 41 53 .return("CKA_HAS
4c70: 5f 52 45 53 45 54 22 29 3b 0a 09 09 63 61 73 65 _RESET");...case
4c80: 20 43 4b 41 5f 56 45 4e 44 4f 52 5f 44 45 46 49 CKA_VENDOR_DEFI
4c90: 4e 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 NED:....return("
4ca0: 43 4b 41 5f 56 45 4e 44 4f 52 5f 44 45 46 49 4e CKA_VENDOR_DEFIN
4cb0: 45 44 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 ED");..}...retur
4cc0: 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a n("UNKNOWN");.}.
4cd0: 0a 23 20 20 64 65 66 69 6e 65 20 6d 61 6c 6c 6f .# define mallo
4ce0: 63 28 78 29 20 43 41 43 4b 45 59 5f 44 45 42 55 c(x) CACKEY_DEBU
4cf0: 47 5f 46 55 4e 43 5f 4d 41 4c 4c 4f 43 28 78 2c G_FUNC_MALLOC(x,
4d00: 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e __func__, __LIN
4d10: 45 5f 5f 29 0a 23 20 20 64 65 66 69 6e 65 20 72 E__).# define r
4d20: 65 61 6c 6c 6f 63 28 78 2c 20 79 29 20 43 41 43 ealloc(x, y) CAC
4d30: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 52 KEY_DEBUG_FUNC_R
4d40: 45 41 4c 4c 4f 43 28 78 2c 20 79 2c 20 5f 5f 66 EALLOC(x, y, __f
4d50: 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 unc__, __LINE__)
4d60: 0a 23 20 20 69 66 64 65 66 20 73 74 72 64 75 70 .# ifdef strdup
4d70: 0a 23 20 20 20 20 75 6e 64 65 66 20 73 74 72 64 .# undef strd
4d80: 75 70 0a 23 20 20 65 6e 64 69 66 0a 23 20 20 64 up.# endif.# d
4d90: 65 66 69 6e 65 20 73 74 72 64 75 70 28 78 29 20 efine strdup(x)
4da0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e CACKEY_DEBUG_FUN
4db0: 43 5f 53 54 52 44 55 50 28 78 2c 20 5f 5f 66 75 C_STRDUP(x, __fu
4dc0: 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a nc__, __LINE__).
4dd0: 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 #else.# define
4de0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
4df0: 4e 54 46 28 78 2e 2e 2e 29 20 2f 2a 2a 2f 0a 23 NTF(x...) /**/.#
4e00: 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f define CACKEY_
4e10: 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 66 DEBUG_PRINTBUF(f
4e20: 2c 20 78 2c 20 79 29 20 2f 2a 2a 2f 0a 23 20 20 , x, y) /**/.#
4e30: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 define CACKEY_DE
4e40: 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f BUG_FUNC_TAG_TO_
4e50: 53 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 STR(x) "DEBUG_DI
4e60: 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e SABLED".# defin
4e70: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 e CACKEY_DEBUG_F
4e80: 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f UNC_SCARDERR_TO_
4e90: 53 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 STR(x) "DEBUG_DI
4ea0: 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e SABLED".# defin
4eb0: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 e CACKEY_DEBUG_F
4ec0: 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 UNC_OBJID_TO_STR
4ed0: 28 78 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 (x) "DEBUG_DISAB
4ee0: 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43 LED".# define C
4ef0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 ACKEY_DEBUG_FUNC
4f00: 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53 54 52 28 _APPTYPE_TO_STR(
4f10: 78 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c x) "DEBUG_DISABL
4f20: 45 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43 41 ED".# define CA
4f30: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f CKEY_DEBUG_FUNC_
4f40: 41 54 54 52 49 42 55 54 45 5f 54 4f 5f 53 54 52 ATTRIBUTE_TO_STR
4f50: 28 78 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 (x) "DEBUG_DISAB
4f60: 4c 45 44 22 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a LED".#endif../*.
4f70: 20 2a 20 49 6e 63 6c 75 64 65 20 74 68 65 73 65 * Include these
4f80: 20 73 6f 75 72 63 65 20 66 69 6c 65 73 20 69 6e source files in
4f90: 20 74 68 69 73 20 74 72 61 6e 73 6c 61 74 69 6f this translatio
4fa0: 6e 20 75 6e 69 74 20 73 6f 20 74 68 61 74 20 77 n unit so that w
4fb0: 65 20 63 61 6e 20 62 69 6e 64 20 74 6f 0a 20 2a e can bind to. *
4fc0: 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e functions and n
4fd0: 6f 74 20 69 6e 63 6c 75 64 65 20 61 6e 79 20 73 ot include any s
4fe0: 79 6d 62 6f 6c 73 20 69 6e 20 74 68 65 20 6f 75 ymbols in the ou
4ff0: 74 70 75 74 20 73 68 61 72 65 64 20 6f 62 6a 65 tput shared obje
5000: 63 74 2e 0a 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 ct.. */.#include
5010: 20 22 61 73 6e 31 2d 78 35 30 39 2e 63 22 0a 23 "asn1-x509.c".#
5020: 69 6e 63 6c 75 64 65 20 22 73 68 61 31 2e 63 22 include "sha1.c"
5030: 0a 23 69 6e 63 6c 75 64 65 20 22 6d 64 35 2e 63 .#include "md5.c
5040: 22 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20 "..typedef enum
5050: 7b 0a 09 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 {..CACKEY_ID_TYP
5060: 45 5f 43 41 43 2c 0a 09 43 41 43 4b 45 59 5f 49 E_CAC,..CACKEY_I
5070: 44 5f 54 59 50 45 5f 50 49 56 2c 0a 09 43 41 43 D_TYPE_PIV,..CAC
5080: 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 KEY_ID_TYPE_CERT
5090: 5f 4f 4e 4c 59 0a 7d 20 63 61 63 6b 65 79 5f 70 _ONLY.} cackey_p
50a0: 63 73 63 5f 69 64 5f 74 79 70 65 3b 0a 0a 73 74 csc_id_type;..st
50b0: 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 ruct cackey_pcsc
50c0: 5f 69 64 65 6e 74 69 74 79 20 7b 0a 09 63 61 63 _identity {..cac
50d0: 6b 65 79 5f 70 63 73 63 5f 69 64 5f 74 79 70 65 key_pcsc_id_type
50e0: 20 69 64 5f 74 79 70 65 3b 0a 0a 09 73 69 7a 65 id_type;...size
50f0: 5f 74 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c _t certificate_l
5100: 65 6e 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 en;..unsigned ch
5110: 61 72 20 2a 63 65 72 74 69 66 69 63 61 74 65 3b ar *certificate;
5120: 0a 0a 09 73 73 69 7a 65 5f 74 20 6b 65 79 73 69 ...ssize_t keysi
5130: 7a 65 3b 0a 0a 09 75 6e 69 6f 6e 20 7b 0a 09 09 ze;...union {...
5140: 73 74 72 75 63 74 20 7b 0a 09 09 09 75 6e 73 69 struct {....unsi
5150: 67 6e 65 64 20 63 68 61 72 20 61 70 70 6c 65 74 gned char applet
5160: 5b 37 5d 3b 0a 09 09 09 75 69 6e 74 31 36 5f 74 [7];....uint16_t
5170: 20 66 69 6c 65 3b 0a 09 09 7d 20 63 61 63 3b 0a file;...} cac;.
5180: 0a 09 09 73 74 72 75 63 74 20 7b 0a 09 09 09 75 ...struct {....u
5190: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6b 65 79 nsigned char key
51a0: 5f 69 64 3b 0a 09 09 09 63 68 61 72 20 6c 61 62 _id;....char lab
51b0: 65 6c 5b 33 32 5d 3b 0a 09 09 7d 20 70 69 76 3b el[32];...} piv;
51c0: 0a 09 7d 20 63 61 72 64 3b 0a 7d 3b 0a 0a 73 74 ..} card;.};..st
51d0: 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e ruct cackey_iden
51e0: 74 69 74 79 20 7b 0a 09 73 74 72 75 63 74 20 63 tity {..struct c
51f0: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 ackey_pcsc_ident
5200: 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e 74 69 ity *pcsc_identi
5210: 74 79 3b 0a 0a 09 43 4b 5f 41 54 54 52 49 42 55 ty;...CK_ATTRIBU
5220: 54 45 20 2a 61 74 74 72 69 62 75 74 65 73 3b 0a TE *attributes;.
5230: 09 43 4b 5f 55 4c 4f 4e 47 20 61 74 74 72 69 62 .CK_ULONG attrib
5240: 75 74 65 73 5f 63 6f 75 6e 74 3b 0a 7d 3b 0a 0a utes_count;.};..
5250: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 65 struct cackey_se
5260: 73 73 69 6f 6e 20 7b 0a 09 69 6e 74 20 61 63 74 ssion {..int act
5270: 69 76 65 3b 0a 0a 09 43 4b 5f 53 4c 4f 54 5f 49 ive;...CK_SLOT_I
5280: 44 20 73 6c 6f 74 49 44 3b 0a 0a 09 43 4b 5f 53 D slotID;...CK_S
5290: 54 41 54 45 20 73 74 61 74 65 3b 0a 09 43 4b 5f TATE state;..CK_
52a0: 46 4c 41 47 53 20 66 6c 61 67 73 3b 0a 09 43 4b FLAGS flags;..CK
52b0: 5f 55 4c 4f 4e 47 20 75 6c 44 65 76 69 63 65 45 _ULONG ulDeviceE
52c0: 72 72 6f 72 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 rror;..CK_VOID_P
52d0: 54 52 20 70 41 70 70 6c 69 63 61 74 69 6f 6e 3b TR pApplication;
52e0: 0a 09 43 4b 5f 4e 4f 54 49 46 59 20 4e 6f 74 69 ..CK_NOTIFY Noti
52f0: 66 79 3b 0a 0a 09 73 74 72 75 63 74 20 63 61 63 fy;...struct cac
5300: 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 key_identity *id
5310: 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73 69 67 entities;..unsig
5320: 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 ned long identit
5330: 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69 6e 74 ies_count;...int
5340: 20 73 65 61 72 63 68 5f 61 63 74 69 76 65 3b 0a search_active;.
5350: 09 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 .CK_ATTRIBUTE_PT
5360: 52 20 73 65 61 72 63 68 5f 71 75 65 72 79 3b 0a R search_query;.
5370: 09 43 4b 5f 55 4c 4f 4e 47 20 73 65 61 72 63 68 .CK_ULONG search
5380: 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b 0a 09 75 _query_count;..u
5390: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 65 61 nsigned long sea
53a0: 72 63 68 5f 63 75 72 72 5f 69 64 3b 0a 0a 09 69 rch_curr_id;...i
53b0: 6e 74 20 73 69 67 6e 5f 61 63 74 69 76 65 3b 0a nt sign_active;.
53c0: 09 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59 .CK_MECHANISM_TY
53d0: 50 45 20 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 PE sign_mechanis
53e0: 6d 3b 0a 09 43 4b 5f 42 59 54 45 5f 50 54 52 20 m;..CK_BYTE_PTR
53f0: 73 69 67 6e 5f 62 75 66 3b 0a 09 75 6e 73 69 67 sign_buf;..unsig
5400: 6e 65 64 20 6c 6f 6e 67 20 73 69 67 6e 5f 62 75 ned long sign_bu
5410: 66 6c 65 6e 3b 0a 09 75 6e 73 69 67 6e 65 64 20 flen;..unsigned
5420: 6c 6f 6e 67 20 73 69 67 6e 5f 62 75 66 75 73 65 long sign_bufuse
5430: 64 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 d;..struct cacke
5440: 79 5f 69 64 65 6e 74 69 74 79 20 2a 73 69 67 6e y_identity *sign
5450: 5f 69 64 65 6e 74 69 74 79 3b 0a 0a 09 69 6e 74 _identity;...int
5460: 20 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 3b decrypt_active;
5470: 0a 09 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 ..CK_MECHANISM_T
5480: 59 50 45 20 64 65 63 72 79 70 74 5f 6d 65 63 68 YPE decrypt_mech
5490: 61 6e 69 73 6d 3b 0a 09 43 4b 5f 56 4f 49 44 5f anism;..CK_VOID_
54a0: 50 54 52 20 64 65 63 72 79 70 74 5f 6d 65 63 68 PTR decrypt_mech
54b0: 5f 70 61 72 6d 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 _parm;..CK_ULONG
54c0: 20 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61 decrypt_mech_pa
54d0: 72 6d 6c 65 6e 3b 0a 09 73 74 72 75 63 74 20 63 rmlen;..struct c
54e0: 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a ackey_identity *
54f0: 64 65 63 72 79 70 74 5f 69 64 65 6e 74 69 74 79 decrypt_identity
5500: 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 ;.};..struct cac
5510: 6b 65 79 5f 73 6c 6f 74 20 7b 0a 09 69 6e 74 20 key_slot {..int
5520: 61 63 74 69 76 65 3b 0a 09 69 6e 74 20 69 6e 74 active;..int int
5530: 65 72 6e 61 6c 3b 0a 0a 09 63 68 61 72 20 2a 70 ernal;...char *p
5540: 63 73 63 5f 72 65 61 64 65 72 3b 0a 0a 09 69 6e csc_reader;...in
5550: 74 20 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e t pcsc_card_conn
5560: 65 63 74 65 64 3b 0a 09 53 43 41 52 44 48 41 4e ected;..SCARDHAN
5570: 44 4c 45 20 70 63 73 63 5f 63 61 72 64 3b 0a 0a DLE pcsc_card;..
5580: 09 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e .int transaction
5590: 5f 64 65 70 74 68 3b 0a 09 69 6e 74 20 74 72 61 _depth;..int tra
55a0: 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 nsaction_need_hw
55b0: 5f 6c 6f 63 6b 3b 0a 0a 09 69 6e 74 20 73 6c 6f _lock;...int slo
55c0: 74 5f 72 65 73 65 74 3b 0a 0a 09 43 4b 5f 46 4c t_reset;...CK_FL
55d0: 41 47 53 20 74 6f 6b 65 6e 5f 66 6c 61 67 73 3b AGS token_flags;
55e0: 0a 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 ...unsigned char
55f0: 20 2a 6c 61 62 65 6c 3b 0a 0a 09 44 57 4f 52 44 *label;...DWORD
5600: 20 70 72 6f 74 6f 63 6f 6c 3b 0a 0a 09 75 6e 73 protocol;...uns
5610: 69 67 6e 65 64 20 69 6e 74 20 63 61 63 68 65 64 igned int cached
5620: 5f 63 65 72 74 73 5f 63 6f 75 6e 74 3b 0a 09 73 _certs_count;..s
5630: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 truct cackey_pcs
5640: 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 61 63 68 c_identity *cach
5650: 65 64 5f 63 65 72 74 73 3b 0a 7d 3b 0a 0a 74 79 ed_certs;.};..ty
5660: 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43 41 pedef enum {..CA
5670: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e CKEY_TLV_APP_GEN
5680: 45 52 49 43 20 3d 20 30 78 30 31 2c 0a 09 43 41 ERIC = 0x01,..CA
5690: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 CKEY_TLV_APP_SKI
56a0: 20 20 20 20 20 3d 20 30 78 30 32 2c 0a 09 43 41 = 0x02,..CA
56b0: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 CKEY_TLV_APP_PKI
56c0: 20 20 20 20 20 3d 20 30 78 30 34 0a 7d 20 63 61 = 0x04.} ca
56d0: 63 6b 65 79 5f 74 6c 76 5f 61 70 70 74 79 70 65 ckey_tlv_apptype
56e0: 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20 ;..typedef enum
56f0: 7b 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 {..CACKEY_TLV_OB
5700: 4a 49 44 5f 47 45 4e 45 52 41 4c 49 4e 46 4f 20 JID_GENERALINFO
5710: 20 20 20 20 20 20 3d 20 30 78 32 30 30 30 2c 0a = 0x2000,.
5720: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 .CACKEY_TLV_OBJI
5730: 44 5f 50 52 4f 50 45 52 53 4f 4e 41 4c 49 4e 46 D_PROPERSONALINF
5740: 4f 20 20 20 3d 20 30 78 32 31 30 30 2c 0a 09 43 O = 0x2100,..C
5750: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f ACKEY_TLV_OBJID_
5760: 41 43 43 45 53 53 43 4f 4e 54 52 4f 4c 20 20 20 ACCESSCONTROL
5770: 20 20 3d 20 30 78 33 30 30 30 2c 0a 09 43 41 43 = 0x3000,..CAC
5780: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 4c 4f KEY_TLV_OBJID_LO
5790: 47 49 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 GIN
57a0: 3d 20 30 78 34 30 30 30 2c 0a 09 43 41 43 4b 45 = 0x4000,..CACKE
57b0: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 52 44 Y_TLV_OBJID_CARD
57c0: 49 4e 46 4f 20 20 20 20 20 20 20 20 20 20 3d 20 INFO =
57d0: 30 78 35 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 0x5000,..CACKEY_
57e0: 54 4c 56 5f 4f 42 4a 49 44 5f 42 49 4f 4d 45 54 TLV_OBJID_BIOMET
57f0: 52 49 43 53 20 20 20 20 20 20 20 20 3d 20 30 78 RICS = 0x
5800: 36 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 6000,..CACKEY_TL
5810: 56 5f 4f 42 4a 49 44 5f 44 49 47 49 54 41 4c 53 V_OBJID_DIGITALS
5820: 49 47 43 45 52 54 20 20 20 20 3d 20 30 78 37 30 IGCERT = 0x70
5830: 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 00,..CACKEY_TLV_
5840: 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e OBJID_CAC_PERSON
5850: 20 20 20 20 20 20 20 20 3d 20 30 78 30 32 30 30 = 0x0200
5860: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 ,..CACKEY_TLV_OB
5870: 4a 49 44 5f 43 41 43 5f 42 45 4e 45 46 49 54 53 JID_CAC_BENEFITS
5880: 20 20 20 20 20 20 3d 20 30 78 30 32 30 32 2c 0a = 0x0202,.
5890: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 .CACKEY_TLV_OBJI
58a0: 44 5f 43 41 43 5f 4f 54 48 45 52 42 45 4e 45 46 D_CAC_OTHERBENEF
58b0: 49 54 53 20 3d 20 30 78 30 32 30 33 2c 0a 09 43 ITS = 0x0203,..C
58c0: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f ACKEY_TLV_OBJID_
58d0: 43 41 43 5f 50 45 52 53 4f 4e 4e 45 4c 20 20 20 CAC_PERSONNEL
58e0: 20 20 3d 20 30 78 30 32 30 31 2c 0a 09 43 41 43 = 0x0201,..CAC
58f0: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 KEY_TLV_OBJID_CA
5900: 43 5f 50 4b 49 43 45 52 54 20 20 20 20 20 20 20 C_PKICERT
5910: 3d 20 30 78 30 32 46 45 0a 7d 20 63 61 63 6b 65 = 0x02FE.} cacke
5920: 79 5f 74 6c 76 5f 6f 62 6a 65 63 74 69 64 3b 0a y_tlv_objectid;.
5930: 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a .typedef enum {.
5940: 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 .CACKEY_PCSC_S_T
5950: 4f 4b 45 4e 50 52 45 53 45 4e 54 20 20 20 20 3d OKENPRESENT =
5960: 20 31 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 1,..CACKEY_PCSC
5970: 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 20 _S_OK
5980: 20 20 20 3d 20 30 2c 0a 09 43 41 43 4b 45 59 5f = 0,..CACKEY_
5990: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 PCSC_E_GENERIC
59a0: 20 20 20 20 20 20 20 3d 20 2d 31 2c 0a 09 43 41 = -1,..CA
59b0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 CKEY_PCSC_E_BADP
59c0: 49 4e 20 20 20 20 20 20 20 20 20 20 3d 20 2d 32 IN = -2
59d0: 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 ,..CACKEY_PCSC_E
59e0: 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 _LOCKED
59f0: 20 3d 20 2d 33 2c 0a 09 43 41 43 4b 45 59 5f 50 = -3,..CACKEY_P
5a00: 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 20 CSC_E_NEEDLOGIN
5a10: 20 20 20 20 20 20 3d 20 2d 34 2c 0a 09 43 41 43 = -4,..CAC
5a20: 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e KEY_PCSC_E_TOKEN
5a30: 41 42 53 45 4e 54 20 20 20 20 20 3d 20 2d 36 2c ABSENT = -6,
5a40: 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f ..CACKEY_PCSC_E_
5a50: 52 45 54 52 59 20 20 20 20 20 20 20 20 20 20 20 RETRY
5a60: 3d 20 2d 37 2c 0a 09 43 41 43 4b 45 59 5f 50 43 = -7,..CACKEY_PC
5a70: 53 43 5f 45 5f 4e 4f 44 41 54 41 20 20 20 20 20 SC_E_NODATA
5a80: 20 20 20 20 20 3d 20 2d 38 0a 7d 20 63 61 63 6b = -8.} cack
5a90: 65 79 5f 72 65 74 3b 0a 0a 73 74 72 75 63 74 20 ey_ret;..struct
5aa0: 63 61 63 6b 65 79 5f 74 6c 76 5f 63 61 72 64 75 cackey_tlv_cardu
5ab0: 72 6c 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 rl {..unsigned c
5ac0: 68 61 72 20 20 20 20 20 20 20 20 72 69 64 5b 35 har rid[5
5ad0: 5d 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76 5f 61 ];..cackey_tlv_a
5ae0: 70 70 74 79 70 65 20 20 20 61 70 70 74 79 70 65 pptype apptype
5af0: 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 ;..cackey_tlv_ob
5b00: 6a 65 63 74 69 64 20 20 6f 62 6a 65 63 74 69 64 jectid objectid
5b10: 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 ;..cackey_tlv_ob
5b20: 6a 65 63 74 69 64 20 20 61 70 70 69 64 3b 0a 09 jectid appid;..
5b30: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 20 20 unsigned char
5b40: 20 20 20 20 20 70 69 6e 69 64 3b 0a 7d 3b 0a 0a pinid;.};..
5b50: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c struct cackey_tl
5b60: 76 5f 65 6e 74 69 74 79 3b 0a 73 74 72 75 63 74 v_entity;.struct
5b70: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 cackey_tlv_enti
5b80: 74 79 20 7b 0a 09 75 69 6e 74 38 5f 74 20 74 61 ty {..uint8_t ta
5b90: 67 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 67 74 g;..size_t lengt
5ba0: 68 3b 0a 0a 09 75 6e 69 6f 6e 20 7b 0a 09 09 76 h;...union {...v
5bb0: 6f 69 64 20 2a 76 61 6c 75 65 3b 0a 09 09 73 74 oid *value;...st
5bc0: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f ruct cackey_tlv_
5bd0: 63 61 72 64 75 72 6c 20 2a 76 61 6c 75 65 5f 63 cardurl *value_c
5be0: 61 72 64 75 72 6c 3b 0a 09 09 75 69 6e 74 38 5f ardurl;...uint8_
5bf0: 74 20 76 61 6c 75 65 5f 62 79 74 65 3b 0a 09 7d t value_byte;..}
5c00: 3b 0a 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 ;...struct cacke
5c10: 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 5f 6e y_tlv_entity *_n
5c20: 65 78 74 3b 0a 7d 3b 0a 0a 2f 2a 20 43 41 43 4b ext;.};../* CACK
5c30: 45 59 20 47 6c 6f 62 61 6c 20 48 61 6e 64 6c 65 EY Global Handle
5c40: 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 s */.static void
5c50: 20 2a 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b *cackey_biglock
5c60: 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20 = NULL;.static
5c70: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 65 struct cackey_se
5c80: 73 73 69 6f 6e 20 63 61 63 6b 65 79 5f 73 65 73 ssion cackey_ses
5c90: 73 69 6f 6e 73 5b 31 32 38 5d 3b 0a 73 74 61 74 sions[128];.stat
5ca0: 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 ic struct cackey
5cb0: 5f 73 6c 6f 74 20 63 61 63 6b 65 79 5f 73 6c 6f _slot cackey_slo
5cc0: 74 73 5b 31 32 38 5d 3b 0a 73 74 61 74 69 63 20 ts[128];.static
5cd0: 69 6e 74 20 63 61 63 6b 65 79 5f 69 6e 69 74 69 int cackey_initi
5ce0: 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 73 74 61 74 alized = 0;.stat
5cf0: 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 62 69 ic int cackey_bi
5d00: 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d 20 30 3b 0a glock_init = 0;.
5d10: 43 4b 5f 43 5f 49 4e 49 54 49 41 4c 49 5a 45 5f CK_C_INITIALIZE_
5d20: 41 52 47 53 20 63 61 63 6b 65 79 5f 61 72 67 73 ARGS cackey_args
5d30: 3b 0a 0a 2f 2a 2a 20 45 78 74 72 61 20 63 65 72 ;../** Extra cer
5d40: 74 69 66 69 63 61 74 65 73 20 74 6f 20 69 6e 63 tificates to inc
5d50: 6c 75 64 65 20 69 6e 20 74 6f 6b 65 6e 20 2a 2a lude in token **
5d60: 2f 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f /.struct cackey_
5d70: 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 65 78 pcsc_identity ex
5d80: 74 72 61 5f 63 65 72 74 73 5b 5d 20 3d 20 7b 0a tra_certs[] = {.
5d90: 23 69 6e 63 6c 75 64 65 20 22 63 61 63 6b 65 79 #include "cackey
5da0: 5f 62 75 69 6c 74 69 6e 5f 63 65 72 74 73 2e 68 _builtin_certs.h
5db0: 22 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 43 41 ".};..#define CA
5dc0: 43 4b 45 59 5f 4d 41 43 52 4f 5f 44 45 46 41 55 CKEY_MACRO_DEFAU
5dd0: 4c 54 5f 58 53 54 52 28 73 74 72 29 20 43 41 43 LT_XSTR(str) CAC
5de0: 4b 45 59 5f 4d 41 43 52 4f 5f 44 45 46 41 55 4c KEY_MACRO_DEFAUL
5df0: 54 5f 53 54 52 28 73 74 72 29 0a 23 64 65 66 69 T_STR(str).#defi
5e00: 6e 65 20 43 41 43 4b 45 59 5f 4d 41 43 52 4f 5f ne CACKEY_MACRO_
5e10: 44 45 46 41 55 4c 54 5f 53 54 52 28 73 74 72 29 DEFAULT_STR(str)
5e20: 20 23 73 74 72 0a 0a 2f 2a 20 50 72 6f 74 65 63 #str../* Protec
5e30: 74 65 64 20 41 75 74 68 65 6e 74 69 63 61 74 69 ted Authenticati
5e40: 6f 6e 20 50 61 74 68 20 63 6f 6d 6d 61 6e 64 20 on Path command
5e50: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a */.static char *
5e60: 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 cackey_pin_comma
5e70: 6e 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 2f 2a 20 52 nd = NULL;../* R
5e80: 65 61 64 65 72 20 45 78 63 6c 75 73 69 6f 6e 20 eader Exclusion
5e90: 6f 72 20 49 6e 63 6c 75 64 65 2d 6f 6e 6c 79 20 or Include-only
5ea0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a */.static char *
5eb0: 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69 cackey_readers_i
5ec0: 6e 63 6c 75 64 65 5f 6f 6e 6c 79 20 3d 20 4e 55 nclude_only = NU
5ed0: 4c 4c 3b 0a 73 74 61 74 69 63 20 63 68 61 72 20 LL;.static char
5ee0: 2a 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f *cackey_readers_
5ef0: 65 78 63 6c 75 64 65 20 3d 20 4e 55 4c 4c 3b 0a exclude = NULL;.
5f00: 0a 2f 2a 20 50 43 53 43 20 47 6c 6f 62 61 6c 20 ./* PCSC Global
5f10: 48 61 6e 64 6c 65 73 20 2a 2f 0a 73 74 61 74 69 Handles */.stati
5f20: 63 20 4c 50 53 43 41 52 44 43 4f 4e 54 45 58 54 c LPSCARDCONTEXT
5f30: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e cackey_pcsc_han
5f40: 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 73 74 61 dle = NULL;..sta
5f50: 74 69 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e tic unsigned lon
5f60: 67 20 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 g cackey_getvers
5f70: 69 6f 6e 28 76 6f 69 64 29 20 7b 0a 09 73 74 61 ion(void) {..sta
5f80: 74 69 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e tic unsigned lon
5f90: 67 20 72 65 74 76 61 6c 20 3d 20 32 35 35 3b 0a g retval = 255;.
5fa0: 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6d .unsigned long m
5fb0: 61 6a 6f 72 20 3d 20 30 3b 0a 09 75 6e 73 69 67 ajor = 0;..unsig
5fc0: 6e 65 64 20 6c 6f 6e 67 20 6d 69 6e 6f 72 20 3d ned long minor =
5fd0: 20 30 3b 0a 09 63 68 61 72 20 2a 6d 61 6a 6f 72 0;..char *major
5fe0: 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b 0a 09 63 68 _str = NULL;..ch
5ff0: 61 72 20 2a 6d 69 6e 6f 72 5f 73 74 72 20 3d 20 ar *minor_str =
6000: 4e 55 4c 4c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 NULL;...CACKEY_D
6010: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
6020: 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 72 65 led.");...if (re
6030: 74 76 61 6c 20 21 3d 20 32 35 35 29 20 7b 0a 09 tval != 255) {..
6040: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
6050: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
6060: 30 78 25 6c 78 20 28 63 61 63 68 65 64 29 2e 22 0x%lx (cached)."
6070: 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 72 65 , retval);....re
6080: 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 09 7d turn(retval);..}
6090: 0a 0a 09 72 65 74 76 61 6c 20 3d 20 30 3b 0a 0a ...retval = 0;..
60a0: 23 69 66 64 65 66 20 50 41 43 4b 41 47 45 5f 56 #ifdef PACKAGE_V
60b0: 45 52 53 49 4f 4e 0a 20 20 20 20 20 20 20 20 6d ERSION. m
60c0: 61 6a 6f 72 5f 73 74 72 20 3d 20 50 41 43 4b 41 ajor_str = PACKA
60d0: 47 45 5f 56 45 52 53 49 4f 4e 3b 0a 09 69 66 20 GE_VERSION;..if
60e0: 28 6d 61 6a 6f 72 5f 73 74 72 29 20 7b 0a 09 20 (major_str) {..
60f0: 20 20 20 20 20 20 20 6d 61 6a 6f 72 20 3d 20 73 major = s
6100: 74 72 74 6f 75 6c 28 6d 61 6a 6f 72 5f 73 74 72 trtoul(major_str
6110: 2c 20 26 6d 69 6e 6f 72 5f 73 74 72 2c 20 31 30 , &minor_str, 10
6120: 29 3b 0a 0a 09 09 69 66 20 28 6d 69 6e 6f 72 5f );....if (minor_
6130: 73 74 72 29 20 7b 0a 09 09 09 6d 69 6e 6f 72 20 str) {....minor
6140: 3d 20 73 74 72 74 6f 75 6c 28 6d 69 6e 6f 72 5f = strtoul(minor_
6150: 73 74 72 20 2b 20 31 2c 20 4e 55 4c 4c 2c 20 31 str + 1, NULL, 1
6160: 30 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 0);...}..}...ret
6170: 76 61 6c 20 3d 20 28 6d 61 6a 6f 72 20 3c 3c 20 val = (major <<
6180: 31 36 29 20 7c 20 28 6d 69 6e 6f 72 20 3c 3c 20 16) | (minor <<
6190: 38 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 8);.#endif...CAC
61a0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
61b0: 28 22 52 65 74 75 72 6e 69 6e 67 20 30 78 25 6c ("Returning 0x%l
61c0: 78 22 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 x", retval);...r
61d0: 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d eturn(retval);.}
61e0: 0a 0a 2f 2a 20 50 43 2f 53 43 20 52 65 6c 61 74 ../* PC/SC Relat
61f0: 65 64 20 46 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a ed Functions */.
6200: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 /*. * SYNPOSIS.
6210: 2a 20 20 20 20 20 76 6f 69 64 20 63 61 63 6b 65 * void cacke
6220: 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 y_slots_disconne
6230: 63 74 5f 61 6c 6c 28 76 6f 69 64 29 3b 0a 20 2a ct_all(void);. *
6240: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a . * ARGUMENTS. *
6250: 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 None. *. *
6260: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 RETURN VALUE. *
6270: 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e None. *. * N
6280: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 OTES. * This
6290: 20 66 75 6e 63 74 69 6f 6e 20 64 69 73 63 6f 6e function discon
62a0: 6e 65 63 74 73 20 66 72 6f 6d 20 61 6c 6c 20 63 nects from all c
62b0: 61 72 64 73 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 ards.. *. */.sta
62c0: 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f tic void cackey_
62d0: 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 slots_disconnect
62e0: 5f 61 6c 6c 28 76 6f 69 64 29 20 7b 0a 09 75 69 _all(void) {..ui
62f0: 6e 74 33 32 5f 74 20 69 64 78 3b 0a 0a 09 43 41 nt32_t idx;...CA
6300: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
6310: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
6320: 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 for (idx = 0; id
6330: 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b x < (sizeof(cack
6340: 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 ey_slots) / size
6350: 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b of(cackey_slots[
6360: 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 0])); idx++) {..
6370: 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 .if (cackey_slot
6380: 73 5b 69 64 78 5d 2e 69 6e 74 65 72 6e 61 6c 29 s[idx].internal)
6390: 20 7b 0a 09 09 09 2f 2a 20 53 6b 69 70 20 69 6e {..../* Skip in
63a0: 74 65 72 6e 61 6c 20 73 6c 6f 74 73 20 2a 2f 0a ternal slots */.
63b0: 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d ...continue;...}
63c0: 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 ....if (cackey_s
63d0: 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 63 lots[idx].pcsc_c
63e0: 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b ard_connected) {
63f0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
6400: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 44 69 _PRINTF("SCardDi
6410: 73 63 6f 6e 6e 65 63 74 28 25 6c 75 29 20 63 61 sconnect(%lu) ca
6420: 6c 6c 65 64 22 2c 20 28 75 6e 73 69 67 6e 65 64 lled", (unsigned
6430: 20 6c 6f 6e 67 29 20 69 64 78 29 3b 0a 0a 09 09 long) idx);....
6440: 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 .SCardDisconnect
6450: 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 (cackey_slots[id
6460: 78 5d 2e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 x].pcsc_card, SC
6470: 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b ARD_LEAVE_CARD);
6480: 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b ...}....if (cack
6490: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 ey_slots[idx].la
64a0: 62 65 6c 29 20 7b 0a 09 09 09 66 72 65 65 28 63 bel) {....free(c
64b0: 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d ackey_slots[idx]
64c0: 2e 6c 61 62 65 6c 29 3b 0a 0a 09 09 09 63 61 63 .label);.....cac
64d0: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c key_slots[idx].l
64e0: 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d abel = NULL;...}
64f0: 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 ....cackey_slots
6500: 5b 69 64 78 5d 2e 70 63 73 63 5f 63 61 72 64 5f [idx].pcsc_card_
6510: 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09 connected = 0;..
6520: 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 .cackey_slots[id
6530: 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 x].transaction_d
6540: 65 70 74 68 20 3d 20 30 3b 0a 09 09 63 61 63 6b epth = 0;...cack
6550: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 ey_slots[idx].tr
6560: 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 ansaction_need_h
6570: 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 0a 09 09 69 w_lock = 0;....i
6580: 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b f (cackey_slots[
6590: 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 idx].active) {..
65a0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
65b0: 52 49 4e 54 46 28 22 4d 61 72 6b 69 6e 67 20 61 RINTF("Marking a
65c0: 63 74 69 76 65 20 73 6c 6f 74 20 25 6c 75 20 61 ctive slot %lu a
65d0: 73 20 62 65 69 6e 67 20 72 65 73 65 74 22 2c 20 s being reset",
65e0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
65f0: 69 64 78 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 idx);...}....cac
6600: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 73 key_slots[idx].s
6610: 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 lot_reset = 1;..
6620: 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 }...CACKEY_DEBUG
6630: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
6640: 6e 67 22 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a ng");...return;.
6650: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 }../*. * SYNPOSI
6660: 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f S. * cackey_
6670: 72 65 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f ret cackey_pcsc_
6680: 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 3b 0a 20 connect(void);.
6690: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 *. * ARGUMENTS.
66a0: 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a * None. *. *
66b0: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a RETURN VALUE. *
66c0: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 CACKEY_PCSC
66d0: 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e _S_OK On
66e0: 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 success. *
66f0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 CACKEY_PCSC_E_GE
6700: 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f NERIC On erro
6710: 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a r. *. * NOTES. *
6720: 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 This functi
6730: 6f 6e 20 63 6f 6e 6e 65 63 74 73 20 74 6f 20 74 on connects to t
6740: 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e 65 63 74 he PC/SC Connect
6750: 69 6f 6e 20 4d 61 6e 61 67 65 72 20 61 6e 64 20 ion Manager and
6760: 75 70 64 61 74 65 73 20 74 68 65 0a 20 2a 20 20 updates the. *
6770: 20 20 20 67 6c 6f 62 61 6c 20 68 61 6e 64 6c 65 global handle
6780: 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 .. *. */.static
6790: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 cackey_ret cacke
67a0: 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 76 y_pcsc_connect(v
67b0: 6f 69 64 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 oid) {..LONG sca
67c0: 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 rd_est_context_r
67d0: 65 74 3b 0a 23 69 66 64 65 66 20 48 41 56 45 5f et;.#ifdef HAVE_
67e0: 53 43 41 52 44 49 53 56 41 4c 49 44 43 4f 4e 54 SCARDISVALIDCONT
67f0: 45 58 54 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f EXT..LONG scard_
6800: 69 73 76 61 6c 69 64 5f 72 65 74 3b 0a 23 65 6e isvalid_ret;.#en
6810: 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 dif...CACKEY_DEB
6820: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
6830: 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b d.");...if (cack
6840: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d ey_pcsc_handle =
6850: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b = NULL) {...cack
6860: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d ey_pcsc_handle =
6870: 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a malloc(sizeof(*
6880: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 cackey_pcsc_hand
6890: 6c 65 29 29 3b 0a 09 09 69 66 20 28 63 61 63 6b le));...if (cack
68a0: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d ey_pcsc_handle =
68b0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 43 41 43 = NULL) {....CAC
68c0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
68d0: 28 22 43 61 6c 6c 20 74 6f 20 6d 61 6c 6c 6f 63 ("Call to malloc
68e0: 28 29 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 () failed, retur
68f0: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 ning in failure"
6900: 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c );.....cackey_sl
6910: 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 ots_disconnect_a
6920: 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e ll();.....return
6930: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 (CACKEY_PCSC_E_G
6940: 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 ENERIC);...}....
6950: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
6960: 4e 54 46 28 22 53 43 61 72 64 45 73 74 61 62 6c NTF("SCardEstabl
6970: 69 73 68 43 6f 6e 74 65 78 74 28 29 20 63 61 6c ishContext() cal
6980: 6c 65 64 22 29 3b 0a 09 09 73 63 61 72 64 5f 65 led");...scard_e
6990: 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 3d st_context_ret =
69a0: 20 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 SCardEstablishC
69b0: 6f 6e 74 65 78 74 28 53 43 41 52 44 5f 53 43 4f ontext(SCARD_SCO
69c0: 50 45 5f 53 59 53 54 45 4d 2c 20 4e 55 4c 4c 2c PE_SYSTEM, NULL,
69d0: 20 4e 55 4c 4c 2c 20 63 61 63 6b 65 79 5f 70 63 NULL, cackey_pc
69e0: 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 69 66 sc_handle);...if
69f0: 20 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 (scard_est_cont
6a00: 65 78 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44 ext_ret != SCARD
6a10: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 _S_SUCCESS) {...
6a20: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
6a30: 49 4e 54 46 28 22 43 61 6c 6c 20 74 6f 20 53 43 INTF("Call to SC
6a40: 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 ardEstablishCont
6a50: 65 78 74 20 66 61 69 6c 65 64 20 28 72 65 74 75 ext failed (retu
6a60: 72 6e 65 64 20 25 73 2f 25 6c 69 29 2c 20 72 65 rned %s/%li), re
6a70: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 turning in failu
6a80: 72 65 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 re", CACKEY_DEBU
6a90: 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f G_FUNC_SCARDERR_
6aa0: 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 65 73 74 TO_STR(scard_est
6ab0: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 2c 20 28 _context_ret), (
6ac0: 6c 6f 6e 67 29 20 73 63 61 72 64 5f 65 73 74 5f long) scard_est_
6ad0: 63 6f 6e 74 65 78 74 5f 72 65 74 29 3b 0a 0a 09 context_ret);...
6ae0: 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 70 63 ..free(cackey_pc
6af0: 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 09 63 sc_handle);....c
6b00: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c ackey_pcsc_handl
6b10: 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 63 61 e = NULL;.....ca
6b20: 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f ckey_slots_disco
6b30: 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 nnect_all();....
6b40: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 .return(CACKEY_P
6b50: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a CSC_E_GENERIC);.
6b60: 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20 48 ..}..}..#ifdef H
6b70: 41 56 45 5f 53 43 41 52 44 49 53 56 41 4c 49 44 AVE_SCARDISVALID
6b80: 43 4f 4e 54 45 58 54 0a 09 43 41 43 4b 45 59 5f CONTEXT..CACKEY_
6b90: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 DEBUG_PRINTF("SC
6ba0: 61 72 64 49 73 56 61 6c 69 64 43 6f 6e 74 65 78 ardIsValidContex
6bb0: 74 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09 73 t() called");..s
6bc0: 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 card_isvalid_ret
6bd0: 20 3d 20 53 43 61 72 64 49 73 56 61 6c 69 64 43 = SCardIsValidC
6be0: 6f 6e 74 65 78 74 28 2a 63 61 63 6b 65 79 5f 70 ontext(*cackey_p
6bf0: 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 69 66 csc_handle);..if
6c00: 20 28 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f (scard_isvalid_
6c10: 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 ret != SCARD_S_S
6c20: 55 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43 4b UCCESS) {...CACK
6c30: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
6c40: 22 48 61 6e 64 6c 65 20 68 61 73 20 62 65 63 6f "Handle has beco
6c50: 6d 65 20 69 6e 76 61 6c 69 64 20 28 53 43 61 72 me invalid (SCar
6c60: 64 49 73 56 61 6c 69 64 43 6f 6e 74 65 78 74 20 dIsValidContext
6c70: 3d 20 25 73 2f 25 6c 69 29 2c 20 74 72 79 69 6e = %s/%li), tryin
6c80: 67 20 74 6f 20 72 65 2d 65 73 74 61 62 6c 69 73 g to re-establis
6c90: 68 2e 2e 2e 22 2c 20 43 41 43 4b 45 59 5f 44 45 h...", CACKEY_DE
6ca0: 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 BUG_FUNC_SCARDER
6cb0: 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 69 R_TO_STR(scard_i
6cc0: 73 76 61 6c 69 64 5f 72 65 74 29 2c 20 28 6c 6f svalid_ret), (lo
6cd0: 6e 67 29 20 73 63 61 72 64 5f 69 73 76 61 6c 69 ng) scard_isvali
6ce0: 64 5f 72 65 74 29 3b 0a 0a 09 09 43 41 43 4b 45 d_ret);....CACKE
6cf0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
6d00: 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f SCardEstablishCo
6d10: 6e 74 65 78 74 28 29 20 63 61 6c 6c 65 64 22 29 ntext() called")
6d20: 3b 0a 09 09 73 63 61 72 64 5f 65 73 74 5f 63 6f ;...scard_est_co
6d30: 6e 74 65 78 74 5f 72 65 74 20 3d 20 53 43 61 72 ntext_ret = SCar
6d40: 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 dEstablishContex
6d50: 74 28 53 43 41 52 44 5f 53 43 4f 50 45 5f 53 59 t(SCARD_SCOPE_SY
6d60: 53 54 45 4d 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c STEM, NULL, NULL
6d70: 2c 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 , cackey_pcsc_ha
6d80: 6e 64 6c 65 29 3b 0a 09 09 69 66 20 28 73 63 61 ndle);...if (sca
6d90: 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 rd_est_context_r
6da0: 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 et != SCARD_S_SU
6db0: 43 43 45 53 53 29 20 7b 0a 09 09 09 43 41 43 4b CCESS) {....CACK
6dc0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
6dd0: 22 43 61 6c 6c 20 74 6f 20 53 43 61 72 64 45 73 "Call to SCardEs
6de0: 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 20 66 tablishContext f
6df0: 61 69 6c 65 64 20 28 72 65 74 75 72 6e 65 64 20 ailed (returned
6e00: 25 73 2f 25 6c 69 29 2c 20 72 65 74 75 72 6e 69 %s/%li), returni
6e10: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 2c 20 ng in failure",
6e20: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e CACKEY_DEBUG_FUN
6e30: 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 C_SCARDERR_TO_ST
6e40: 52 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 R(scard_est_cont
6e50: 65 78 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 ext_ret), (long)
6e60: 20 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 scard_est_conte
6e70: 78 74 5f 72 65 74 29 3b 0a 0a 09 09 09 66 72 65 xt_ret);.....fre
6e80: 65 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 e(cackey_pcsc_ha
6e90: 6e 64 6c 65 29 3b 0a 09 09 09 63 61 63 6b 65 79 ndle);....cackey
6ea0: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e _pcsc_handle = N
6eb0: 55 4c 4c 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f ULL;.....cackey_
6ec0: 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 slots_disconnect
6ed0: 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75 _all();.....retu
6ee0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 rn(CACKEY_PCSC_E
6ef0: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a _GENERIC);...}..
6f00: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
6f10: 52 49 4e 54 46 28 22 48 61 6e 64 6c 65 20 68 61 RINTF("Handle ha
6f20: 73 20 62 65 65 6e 20 72 65 2d 65 73 74 61 62 6c s been re-establ
6f30: 69 73 68 65 64 22 29 3b 0a 09 7d 0a 23 65 6e 64 ished");..}.#end
6f40: 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 if...CACKEY_DEBU
6f50: 47 5f 50 52 49 4e 54 46 28 22 53 75 63 65 73 73 G_PRINTF("Sucess
6f60: 66 75 6c 6c 79 20 63 6f 6e 6e 65 63 74 65 64 20 fully connected
6f70: 74 6f 20 50 43 2f 53 43 2c 20 72 65 74 75 72 6e to PC/SC, return
6f80: 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 22 29 ing in success")
6f90: 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 ;...return(CACKE
6fa0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a Y_PCSC_S_OK);.}.
6fb0: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a ./*. * SYNPOSIS.
6fc0: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 * cackey_re
6fd0: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 t cackey_pcsc_di
6fe0: 73 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 3b 0a sconnect(void);.
6ff0: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a *. * ARGUMENTS.
7000: 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 * None. *.
7010: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 * RETURN VALUE.
7020: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 * CACKEY_PCS
7030: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f C_S_OK O
7040: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 n success. *
7050: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 CACKEY_PCSC_E_G
7060: 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 ENERIC On err
7070: 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 or. *. * NOTES.
7080: 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 * This funct
7090: 69 6f 6e 20 64 69 73 63 6f 6e 6e 65 63 74 73 20 ion disconnects
70a0: 66 72 6f 6d 20 74 68 65 20 50 43 2f 53 43 20 43 from the PC/SC C
70b0: 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65 onnection manage
70c0: 72 20 61 6e 64 20 75 70 64 61 74 65 73 0a 20 2a r and updates. *
70d0: 20 20 20 20 20 74 68 65 20 67 6c 6f 62 61 6c 20 the global
70e0: 68 61 6e 64 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a 73 handle.. *. */.s
70f0: 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 tatic cackey_ret
7100: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 cackey_pcsc_dis
7110: 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 20 7b 0a connect(void) {.
7120: 09 4c 4f 4e 47 20 73 63 61 72 64 5f 72 65 6c 5f .LONG scard_rel_
7130: 63 6f 6e 74 65 78 74 5f 72 65 74 3b 0a 0a 09 43 context_ret;...C
7140: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
7150: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
7160: 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63 .if (cackey_pcsc
7170: 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 _handle == NULL)
7180: 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b {...return(CACK
7190: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 EY_PCSC_S_OK);..
71a0: 7d 0a 0a 09 73 63 61 72 64 5f 72 65 6c 5f 63 6f }...scard_rel_co
71b0: 6e 74 65 78 74 5f 72 65 74 20 3d 20 53 43 61 72 ntext_ret = SCar
71c0: 64 52 65 6c 65 61 73 65 43 6f 6e 74 65 78 74 28 dReleaseContext(
71d0: 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e *cackey_pcsc_han
71e0: 64 6c 65 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b dle);...if (cack
71f0: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 20 ey_pcsc_handle)
7200: 7b 0a 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f {...free(cackey_
7210: 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 0a pcsc_handle);...
7220: 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 ..cackey_pcsc_ha
7230: 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a ndle = NULL;..}.
7240: 0a 09 69 66 20 28 73 63 61 72 64 5f 72 65 6c 5f ..if (scard_rel_
7250: 63 6f 6e 74 65 78 74 5f 72 65 74 20 21 3d 20 53 context_ret != S
7260: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 CARD_S_SUCCESS)
7270: 7b 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 {...return(CACKE
7280: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 Y_PCSC_E_GENERIC
7290: 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 43 );..}...return(C
72a0: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 ACKEY_PCSC_S_OK)
72b0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f ;.}../*. * SYNPO
72c0: 53 49 53 0a 20 2a 20 20 20 20 20 76 6f 69 64 20 SIS. * void
72d0: 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 cackey_mark_slot
72e0: 5f 72 65 73 65 74 28 73 74 72 75 63 74 20 63 61 _reset(struct ca
72f0: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 ckey_slot *slot)
7300: 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 ;. *. * ARGUMENT
7310: 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a S. * None. *
7320: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 . * RETURN VALUE
7330: 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a . * None. *.
7340: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 * NOTES. *
7350: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 This function ma
7360: 72 6b 73 20 61 20 73 6c 6f 74 20 68 61 73 20 68 rks a slot has h
7370: 61 76 69 6e 67 20 62 65 65 6e 20 72 65 73 65 74 aving been reset
7380: 2c 20 74 6f 20 6c 61 74 65 72 20 62 65 20 63 6c , to later be cl
7390: 65 61 6e 65 64 20 75 70 2e 0a 20 2a 20 20 20 20 eaned up.. *
73a0: 20 43 6c 65 61 6e 75 70 20 6f 6e 6c 79 20 68 61 Cleanup only ha
73b0: 70 70 65 6e 73 20 77 68 65 6e 20 61 20 50 4b 43 ppens when a PKC
73c0: 53 23 31 31 20 63 6c 69 65 6e 74 20 63 61 6c 6c S#11 client call
73d0: 73 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 s C_FindObjectsI
73e0: 6e 69 74 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 nit.. *. */.stat
73f0: 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 6d ic void cackey_m
7400: 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 ark_slot_reset(s
7410: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f truct cackey_slo
7420: 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 69 66 20 28 t *slot) {..if (
7430: 73 6c 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a slot == NULL) {.
7440: 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 43 ..return;..}...C
7450: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
7460: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
7470: 09 69 66 20 28 73 6c 6f 74 2d 3e 70 63 73 63 5f .if (slot->pcsc_
7480: 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 card_connected)
7490: 7b 0a 09 09 53 43 61 72 64 44 69 73 63 6f 6e 6e {...SCardDisconn
74a0: 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 ect(slot->pcsc_c
74b0: 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 ard, SCARD_LEAVE
74c0: 5f 43 41 52 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f _CARD);..}...slo
74d0: 74 2d 3e 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 t->slot_reset =
74e0: 31 3b 0a 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 1;..slot->pcsc_c
74f0: 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 ard_connected =
7500: 30 3b 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70 0;..if (cackey_p
7510: 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 3d 20 4e 55 in_command == NU
7520: 4c 4c 29 20 7b 0a 09 09 73 6c 6f 74 2d 3e 74 6f LL) {...slot->to
7530: 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f ken_flags = CKF_
7540: 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a LOGIN_REQUIRED;.
7550: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 73 6c 6f 74 .} else {...slot
7560: 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 ->token_flags =
7570: 30 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 0;..}...CACKEY_D
7580: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
7590: 75 72 6e 69 6e 67 2e 22 29 3b 0a 0a 09 72 65 74 urning.");...ret
75a0: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 urn;.}../*. * SY
75b0: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 4c 4f NPOSIS. * LO
75c0: 4e 47 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e NG cackey_reconn
75d0: 65 63 74 5f 63 61 72 64 28 73 74 72 75 63 74 20 ect_card(struct
75e0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f cackey_slot *slo
75f0: 74 2c 20 44 57 4f 52 44 20 64 65 66 61 75 6c 74 t, DWORD default
7600: 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 20 2a 0a 20 _protocol);. *.
7610: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 * ARGUMENTS. *
7620: 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a cackey_slot *
7630: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 slot. *
7640: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d Slot to send com
7650: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 mands to. *. *
7660: 20 20 20 44 57 4f 52 44 20 64 65 66 61 75 6c 74 DWORD default
7670: 5f 70 72 6f 74 6f 63 6f 6c 0a 20 2a 20 20 20 20 _protocol. *
7680: 20 20 20 20 20 50 72 6f 74 6f 63 6f 6c 20 74 6f Protocol to
7690: 20 61 74 74 65 6d 70 74 20 66 69 72 73 74 0a 20 attempt first.
76a0: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 *. * RETURN VALU
76b0: 45 0a 20 2a 20 20 20 20 20 54 68 65 20 72 65 74 E. * The ret
76c0: 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 53 urn value from S
76d0: 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 0a CardReconnect().
76e0: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 *. * NOTES. *
76f0: 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e This function
7700: 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72 is a wrapper ar
7710: 6f 75 6e 64 20 53 43 61 72 64 52 65 63 6f 6e 6e ound SCardReconn
7720: 65 63 74 28 29 0a 20 2a 0a 20 2a 20 20 20 20 20 ect(). *. *
7730: 54 68 65 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 The SCardReconne
7740: 63 74 28 29 20 66 75 6e 63 74 69 6f 6e 20 63 61 ct() function ca
7750: 6c 6c 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 ll will be calle
7760: 64 20 66 69 72 73 74 20 77 69 74 68 20 74 68 65 d first with the
7770: 0a 20 2a 20 20 20 20 20 64 77 50 72 65 66 65 72 . * dwPrefer
7780: 72 65 64 50 72 6f 74 6f 63 6f 6c 73 20 6f 66 20 redProtocols of
7790: 22 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f "default_protoco
77a0: 6c 22 2e 20 20 49 66 20 74 68 61 74 20 63 61 6c l". If that cal
77b0: 6c 20 72 65 74 75 72 6e 73 0a 20 2a 20 20 20 20 l returns. *
77c0: 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d SCARD_E_PROTO_M
77d0: 49 53 4d 41 54 43 48 20 74 72 79 20 61 67 61 69 ISMATCH try agai
77e0: 6e 20 77 69 74 68 20 61 20 70 72 6f 74 6f 63 6f n with a protoco
77f0: 6c 20 6f 66 20 54 3d 30 2c 20 61 6e 64 20 66 61 l of T=0, and fa
7800: 69 6c 69 6e 67 0a 20 2a 20 20 20 20 20 74 68 61 iling. * tha
7810: 74 20 54 3d 31 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 t T=1.. *. */.st
7820: 61 74 69 63 20 4c 4f 4e 47 20 63 61 63 6b 65 79 atic LONG cackey
7830: 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 _reconnect_card(
7840: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c struct cackey_sl
7850: 6f 74 20 2a 73 6c 6f 74 2c 20 44 57 4f 52 44 20 ot *slot, DWORD
7860: 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c default_protocol
7870: 29 20 7b 0a 09 44 57 4f 52 44 20 73 65 6c 65 63 ) {..DWORD selec
7880: 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 3b 0a 09 4c ted_protocol;..L
7890: 4f 4e 47 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 ONG scard_conn_r
78a0: 65 74 3b 0a 0a 09 73 65 6c 65 63 74 65 64 5f 70 et;...selected_p
78b0: 72 6f 74 6f 63 6f 6c 20 3d 20 30 3b 0a 0a 09 73 rotocol = 0;...s
78c0: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 card_conn_ret =
78d0: 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 73 SCardReconnect(s
78e0: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 lot->pcsc_card,
78f0: 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 SCARD_SHARE_SHAR
7900: 45 44 2c 20 64 65 66 61 75 6c 74 5f 70 72 6f 74 ED, default_prot
7910: 6f 63 6f 6c 2c 20 53 43 41 52 44 5f 52 45 53 45 ocol, SCARD_RESE
7920: 54 5f 43 41 52 44 2c 20 26 73 65 6c 65 63 74 65 T_CARD, &selecte
7930: 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 69 d_protocol);...i
7940: 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 f (scard_conn_re
7950: 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f t == SCARD_E_PRO
7960: 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 TO_MISMATCH) {..
7970: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
7980: 49 4e 54 46 28 22 53 43 61 72 64 52 65 63 6f 6e INTF("SCardRecon
7990: 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 20 nect() returned
79a0: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 SCARD_E_PROTO_MI
79b0: 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77 SMATCH, trying w
79c0: 69 74 68 20 6a 75 73 74 20 54 3d 30 22 29 0a 09 ith just T=0")..
79d0: 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 .scard_conn_ret
79e0: 3d 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 = SCardReconnect
79f0: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 (slot->pcsc_card
7a00: 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 , SCARD_SHARE_SH
7a10: 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 ARED, SCARD_PROT
7a20: 4f 43 4f 4c 5f 54 30 2c 20 53 43 41 52 44 5f 52 OCOL_T0, SCARD_R
7a30: 45 53 45 54 5f 43 41 52 44 2c 20 26 73 65 6c 65 ESET_CARD, &sele
7a40: 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a cted_protocol);.
7a50: 0a 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e ...if (scard_con
7a60: 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 n_ret == SCARD_E
7a70: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 _PROTO_MISMATCH)
7a80: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 {....CACKEY_DEB
7a90: 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 UG_PRINTF("SCard
7aa0: 52 65 63 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 Reconnect() retu
7ab0: 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f rned SCARD_E_PRO
7ac0: 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 TO_MISMATCH, try
7ad0: 69 6e 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d ing with just T=
7ae0: 31 22 29 0a 09 09 09 73 63 61 72 64 5f 63 6f 6e 1")....scard_con
7af0: 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 52 65 63 n_ret = SCardRec
7b00: 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 onnect(slot->pcs
7b10: 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 53 48 c_card, SCARD_SH
7b20: 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52 ARE_SHARED, SCAR
7b30: 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 53 D_PROTOCOL_T1, S
7b40: 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52 44 2c CARD_RESET_CARD,
7b50: 20 26 73 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f &selected_proto
7b60: 63 6f 6c 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 col);...}..}...i
7b70: 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 f (scard_conn_re
7b80: 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 t == SCARD_S_SUC
7b90: 43 45 53 53 29 20 7b 0a 09 09 73 6c 6f 74 2d 3e CESS) {...slot->
7ba0: 70 72 6f 74 6f 63 6f 6c 20 3d 20 73 65 6c 65 63 protocol = selec
7bb0: 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 3b 0a 09 7d ted_protocol;..}
7bc0: 0a 0a 09 72 65 74 75 72 6e 28 73 63 61 72 64 5f ...return(scard_
7bd0: 63 6f 6e 6e 5f 72 65 74 29 3b 0a 7d 0a 0a 2f 2a conn_ret);.}../*
7be0: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 . * SYNPOSIS. *
7bf0: 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 cackey_ret c
7c00: 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 ackey_connect_ca
7c10: 72 64 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 rd(struct cackey
7c20: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a _slot *slot);. *
7c30: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a . * ARGUMENTS. *
7c40: 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 cackey_slot
7c50: 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 *slot. *
7c60: 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 Slot to send c
7c70: 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a ommands to. *. *
7c80: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a RETURN VALUE. *
7c90: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 CACKEY_PCSC
7ca0: 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e _S_OK On
7cb0: 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 success. *
7cc0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 CACKEY_PCSC_E_GE
7cd0: 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f NERIC On erro
7ce0: 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a r. *. * NOTES. *
7cf0: 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f None. *. */
7d00: 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 .static cackey_r
7d10: 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 et cackey_connec
7d20: 74 5f 63 61 72 64 28 73 74 72 75 63 74 20 63 61 t_card(struct ca
7d30: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 ckey_slot *slot)
7d40: 20 7b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 70 {..cackey_ret p
7d50: 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b csc_connect_ret;
7d60: 0a 09 44 57 4f 52 44 20 70 72 6f 74 6f 63 6f 6c ..DWORD protocol
7d70: 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 63 6f ;..LONG scard_co
7d80: 6e 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 nn_ret;...CACKEY
7d90: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 _DEBUG_PRINTF("C
7da0: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 alled.");...if (
7db0: 21 73 6c 6f 74 29 20 7b 0a 09 09 43 41 43 4b 45 !slot) {...CACKE
7dc0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
7dd0: 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 73 70 65 Invalid slot spe
7de0: 63 69 66 69 65 64 2c 20 72 65 74 75 72 6e 69 6e cified, returnin
7df0: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a g in failure");.
7e00: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 ...return(CACKEY
7e10: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 _PCSC_E_GENERIC)
7e20: 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e ;..}...pcsc_conn
7e30: 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 ect_ret = cackey
7e40: 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b _pcsc_connect();
7e50: 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 ..if (pcsc_conne
7e60: 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 ct_ret != CACKEY
7e70: 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 _PCSC_S_OK) {...
7e80: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
7e90: 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 NTF("Connection
7ea0: 74 6f 20 50 43 2f 53 43 20 66 61 69 6c 65 64 2c to PC/SC failed,
7eb0: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 returning in fa
7ec0: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 ilure");....retu
7ed0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 rn(CACKEY_PCSC_E
7ee0: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 _GENERIC);..}...
7ef0: 2f 2a 20 43 6f 6e 6e 65 63 74 20 74 6f 20 72 65 /* Connect to re
7f00: 61 64 65 72 2c 20 69 66 20 6e 65 65 64 65 64 20 ader, if needed
7f10: 2a 2f 0a 09 69 66 20 28 21 73 6c 6f 74 2d 3e 70 */..if (!slot->p
7f20: 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 csc_card_connect
7f30: 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...CACKEY_D
7f40: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 EBUG_PRINTF("SCa
7f50: 72 64 43 6f 6e 6e 65 63 74 28 25 73 29 20 63 61 rdConnect(%s) ca
7f60: 6c 6c 65 64 20 66 6f 72 20 73 6c 6f 74 20 25 70 lled for slot %p
7f70: 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 ", slot->pcsc_re
7f80: 61 64 65 72 2c 20 73 6c 6f 74 29 3b 0a 09 09 73 ader, slot);...s
7f90: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 card_conn_ret =
7fa0: 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 SCardConnect(*ca
7fb0: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 ckey_pcsc_handle
7fc0: 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 , slot->pcsc_rea
7fd0: 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45 der, SCARD_SHARE
7fe0: 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 _SHARED, SCARD_P
7ff0: 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 41 ROTOCOL_T0 | SCA
8000: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 RD_PROTOCOL_T1,
8010: 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 &slot->pcsc_card
8020: 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 , &protocol);...
8030: 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f .if (scard_conn_
8040: 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 ret == SCARD_E_P
8050: 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b ROTO_MISMATCH) {
8060: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
8070: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f _PRINTF("SCardCo
8080: 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 nnect() returned
8090: 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d SCARD_E_PROTO_M
80a0: 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20 ISMATCH, trying
80b0: 77 69 74 68 20 6a 75 73 74 20 54 3d 30 22 29 0a with just T=0").
80c0: 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 ...scard_conn_re
80d0: 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 t = SCardConnect
80e0: 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 (*cackey_pcsc_ha
80f0: 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 ndle, slot->pcsc
8100: 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53 _reader, SCARD_S
8110: 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41 HARE_SHARED, SCA
8120: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20 RD_PROTOCOL_T0,
8130: 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 &slot->pcsc_card
8140: 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 , &protocol);...
8150: 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e ..if (scard_conn
8160: 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f _ret == SCARD_E_
8170: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 PROTO_MISMATCH)
8180: 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 {.....CACKEY_DEB
8190: 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 UG_PRINTF("SCard
81a0: 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e Connect() return
81b0: 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f ed SCARD_E_PROTO
81c0: 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e _MISMATCH, tryin
81d0: 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d 31 22 g with just T=1"
81e0: 29 0a 09 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e ).....scard_conn
81f0: 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e _ret = SCardConn
8200: 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 ect(*cackey_pcsc
8210: 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 _handle, slot->p
8220: 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41 52 csc_reader, SCAR
8230: 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20 D_SHARE_SHARED,
8240: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 SCARD_PROTOCOL_T
8250: 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 1, &slot->pcsc_c
8260: 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b ard, &protocol);
8270: 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 ....}...}....if
8280: 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 (scard_conn_ret
8290: 3d 3d 20 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57 == SCARD_W_UNPOW
82a0: 45 52 45 44 5f 43 41 52 44 29 20 7b 0a 09 09 09 ERED_CARD) {....
82b0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
82c0: 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 NTF("SCardConnec
82d0: 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 t() returned SCA
82e0: 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43 RD_W_UNPOWERED_C
82f0: 41 52 44 2c 20 74 72 79 69 6e 67 20 74 6f 20 72 ARD, trying to r
8300: 65 2d 63 6f 6e 6e 65 63 74 2e 2e 2e 22 29 3b 0a e-connect...");.
8310: 0a 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 ....scard_conn_r
8320: 65 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 et = SCardConnec
8330: 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 t(*cackey_pcsc_h
8340: 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 andle, slot->pcs
8350: 63 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f c_reader, SCARD_
8360: 53 48 41 52 45 5f 44 49 52 45 43 54 2c 20 53 43 SHARE_DIRECT, SC
8370: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 ARD_PROTOCOL_T0
8380: 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c | SCARD_PROTOCOL
8390: 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 _T1, &slot->pcsc
83a0: 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c _card, &protocol
83b0: 29 3b 0a 0a 09 09 09 69 66 20 28 73 63 61 72 64 );.....if (scard
83c0: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 _conn_ret == SCA
83d0: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 RD_E_PROTO_MISMA
83e0: 54 43 48 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 TCH) {.....CACKE
83f0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
8400: 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 72 SCardConnect() r
8410: 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f eturned SCARD_E_
8420: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 PROTO_MISMATCH,
8430: 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73 74 trying with just
8440: 20 54 3d 30 22 29 0a 09 09 09 09 73 63 61 72 64 T=0").....scard
8450: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 _conn_ret = SCar
8460: 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 dConnect(*cackey
8470: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c _pcsc_handle, sl
8480: 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c ot->pcsc_reader,
8490: 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 SCARD_SHARE_SHA
84a0: 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f RED, SCARD_PROTO
84b0: 43 4f 4c 5f 54 30 2c 20 26 73 6c 6f 74 2d 3e 70 COL_T0, &slot->p
84c0: 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f csc_card, &proto
84d0: 63 6f 6c 29 3b 0a 0a 09 09 09 09 69 66 20 28 73 col);......if (s
84e0: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d card_conn_ret ==
84f0: 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d SCARD_E_PROTO_M
8500: 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 09 09 09 ISMATCH) {......
8510: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
8520: 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 NTF("SCardConnec
8530: 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 t() returned SCA
8540: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 RD_E_PROTO_MISMA
8550: 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68 TCH, trying with
8560: 20 6a 75 73 74 20 54 3d 31 22 29 0a 09 09 09 09 just T=1").....
8570: 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 .scard_conn_ret
8580: 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a = SCardConnect(*
8590: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 cackey_pcsc_hand
85a0: 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 le, slot->pcsc_r
85b0: 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41 eader, SCARD_SHA
85c0: 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 RE_SHARED, SCARD
85d0: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 _PROTOCOL_T1, &s
85e0: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 lot->pcsc_card,
85f0: 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09 09 &protocol);.....
8600: 7d 0a 09 09 09 7d 0a 0a 09 09 09 73 63 61 72 64 }....}.....scard
8610: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 61 63 6b _conn_ret = cack
8620: 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72 ey_reconnect_car
8630: 64 28 73 6c 6f 74 2c 20 70 72 6f 74 6f 63 6f 6c d(slot, protocol
8640: 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 63 );...}....if (sc
8650: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 21 3d 20 ard_conn_ret !=
8660: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 SCARD_S_SUCCESS)
8670: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 {....CACKEY_DEB
8680: 55 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65 UG_PRINTF("Conne
8690: 63 74 69 6f 6e 20 74 6f 20 63 61 72 64 20 66 61 ction to card fa
86a0: 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 iled, returning
86b0: 69 6e 20 66 61 69 6c 75 72 65 20 28 53 43 61 72 in failure (SCar
86c0: 64 43 6f 6e 6e 65 63 74 28 29 20 3d 20 25 73 2f dConnect() = %s/
86d0: 25 6c 69 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 %li)", CACKEY_DE
86e0: 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 BUG_FUNC_SCARDER
86f0: 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 63 R_TO_STR(scard_c
8700: 6f 6e 6e 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 onn_ret), (long)
8710: 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 29 scard_conn_ret)
8720: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 ;.....return(CAC
8730: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 KEY_PCSC_E_GENER
8740: 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 73 6c 6f 74 IC);...}....slot
8750: 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e ->pcsc_card_conn
8760: 65 63 74 65 64 20 3d 20 31 3b 0a 09 09 73 6c 6f ected = 1;...slo
8770: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 t->transaction_d
8780: 65 70 74 68 20 3d 20 30 3b 0a 09 09 73 6c 6f 74 epth = 0;...slot
8790: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 ->transaction_ne
87a0: 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a ed_hw_lock = 0;.
87b0: 09 09 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c ..slot->protocol
87c0: 20 3d 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 7d 0a = protocol;..}.
87d0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
87e0: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
87f0: 20 69 6e 20 73 75 63 63 65 73 73 22 29 3b 0a 0a in success");..
8800: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 .return(CACKEY_P
8810: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a CSC_S_OK);.}../*
8820: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 . * SYNPOSIS. *
8830: 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 cackey_ret c
8840: 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e ackey_begin_tran
8850: 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20 63 saction(struct c
8860: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 ackey_slot *slot
8870: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e );. *. * ARGUMEN
8880: 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 TS. * cackey
8890: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 _slot *slot. *
88a0: 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 Slot to s
88b0: 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a end commands to.
88c0: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c *. * RETURN VAL
88d0: 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 UE. * CACKEY
88e0: 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 _PCSC_S_OK
88f0: 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a On success. *
8900: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 CACKEY_PCSC
8910: 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e _E_GENERIC On
8920: 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 error. *. * NOT
8930: 45 53 0a 20 2a 20 20 20 20 20 54 68 65 20 74 72 ES. * The tr
8940: 61 6e 73 61 63 74 69 6f 6e 20 73 68 6f 75 6c 64 ansaction should
8950: 20 62 65 20 74 65 72 6d 69 6e 61 74 65 64 20 75 be terminated u
8960: 73 69 6e 67 20 22 63 61 63 6b 65 79 5f 65 6e 64 sing "cackey_end
8970: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 0a 20 2a _transaction". *
8980: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b . */.static cack
8990: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 62 65 ey_ret cackey_be
89a0: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 gin_transaction(
89b0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c struct cackey_sl
89c0: 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63 ot *slot) {..cac
89d0: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 63 key_ret cackey_c
89e0: 6f 6e 6e 5f 72 65 74 3b 0a 09 4c 4f 4e 47 20 73 onn_ret;..LONG s
89f0: 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 3b 0a card_trans_ret;.
8a00: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
8a10: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
8a20: 3b 0a 0a 09 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f ;...cackey_conn_
8a30: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e ret = cackey_con
8a40: 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b nect_card(slot);
8a50: 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 63 6f 6e ..if (cackey_con
8a60: 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f n_ret != CACKEY_
8a70: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 PCSC_S_OK) {...C
8a80: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
8a90: 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f TF("Unable to co
8aa0: 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72 nnect to card, r
8ab0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f eturning in erro
8ac0: 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 r");....return(C
8ad0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e ACKEY_PCSC_E_GEN
8ae0: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 ERIC);..}...slot
8af0: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 ->transaction_de
8b00: 70 74 68 2b 2b 3b 0a 0a 09 69 66 20 28 73 6c 6f pth++;...if (slo
8b10: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 t->transaction_d
8b20: 65 70 74 68 20 3e 20 31 20 26 26 20 21 73 6c 6f epth > 1 && !slo
8b30: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e t->transaction_n
8b40: 65 65 64 5f 68 77 5f 6c 6f 63 6b 29 20 7b 0a 09 eed_hw_lock) {..
8b50: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
8b60: 49 4e 54 46 28 22 41 6c 72 65 61 64 79 20 69 6e INTF("Already in
8b70: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 a transaction,
8b80: 70 65 72 66 6f 72 6d 69 6e 67 20 6e 6f 20 61 63 performing no ac
8b90: 74 69 6f 6e 20 28 6e 65 77 20 64 65 70 74 68 20 tion (new depth
8ba0: 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72 = %i)", slot->tr
8bb0: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 29 ansaction_depth)
8bc0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b ;....return(CACK
8bd0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 EY_PCSC_S_OK);..
8be0: 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 }...slot->transa
8bf0: 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f ction_need_hw_lo
8c00: 63 6b 20 3d 20 30 3b 0a 0a 09 73 63 61 72 64 5f ck = 0;...scard_
8c10: 74 72 61 6e 73 5f 72 65 74 20 3d 20 53 43 61 72 trans_ret = SCar
8c20: 64 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f dBeginTransactio
8c30: 6e 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 n(slot->pcsc_car
8c40: 64 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 74 d);..if (scard_t
8c50: 72 61 6e 73 5f 72 65 74 20 21 3d 20 53 43 41 52 rans_ret != SCAR
8c60: 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 D_S_SUCCESS) {..
8c70: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
8c80: 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 INTF("Unable to
8c90: 62 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f begin transactio
8ca0: 6e 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 n, returning in
8cb0: 65 72 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75 error");....retu
8cc0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 rn(CACKEY_PCSC_E
8cd0: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 _GENERIC);..}...
8ce0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
8cf0: 4e 54 46 28 22 53 75 63 65 73 73 66 75 6c 6c 79 NTF("Sucessfully
8d00: 20 62 65 67 61 6e 20 74 72 61 6e 73 61 63 74 69 began transacti
8d10: 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28 25 73 29 22 on on slot (%s)"
8d20: 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 , slot->pcsc_rea
8d30: 64 65 72 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 der);...return(C
8d40: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 ACKEY_PCSC_S_OK)
8d50: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f ;.}../*. * SYNPO
8d60: 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 SIS. * cacke
8d70: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 65 6e 64 y_ret cackey_end
8d80: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 _transaction(str
8d90: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 uct cackey_slot
8da0: 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 *slot);. *. * AR
8db0: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63 GUMENTS. * c
8dc0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 ackey_slot *slot
8dd0: 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 . * Slot
8de0: 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 to send command
8df0: 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45 54 55 52 s to. *. * RETUR
8e00: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 N VALUE. * C
8e10: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 ACKEY_PCSC_S_OK
8e20: 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 On succe
8e30: 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 ss. * CACKEY
8e40: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 _PCSC_E_GENERIC
8e50: 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 On error. *.
8e60: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 * NOTES. * T
8e70: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 71 his function req
8e80: 75 69 72 65 73 20 22 63 61 63 6b 65 79 5f 62 65 uires "cackey_be
8e90: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 gin_transaction"
8ea0: 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 66 69 to be called fi
8eb0: 72 73 74 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 rst. *. */.stati
8ec0: 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 c cackey_ret cac
8ed0: 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 key_end_transact
8ee0: 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65 ion(struct cacke
8ef0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a y_slot *slot) {.
8f00: 09 4c 4f 4e 47 20 73 63 61 72 64 5f 74 72 61 6e .LONG scard_tran
8f10: 73 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f s_ret;...CACKEY_
8f20: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
8f30: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 lled.");...if (!
8f40: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f slot->pcsc_card_
8f50: 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09 43 connected) {...C
8f60: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
8f70: 54 46 28 22 43 61 72 64 20 69 73 20 6e 6f 74 20 TF("Card is not
8f80: 63 6f 6e 6e 65 63 74 65 64 2c 20 75 6e 61 62 6c connected, unabl
8f90: 65 20 74 6f 20 65 6e 64 20 74 72 61 6e 73 61 63 e to end transac
8fa0: 74 69 6f 6e 20 6f 6e 20 63 61 72 64 22 29 3b 0a tion on card");.
8fb0: 0a 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 ...if (slot->tra
8fc0: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e nsaction_depth >
8fd0: 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 0) {....CACKEY_
8fe0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 44 65 DEBUG_PRINTF("De
8ff0: 63 72 65 61 73 69 6e 67 20 74 72 61 6e 73 61 63 creasing transac
9000: 74 69 6f 6e 20 64 65 70 74 68 20 61 6e 64 20 61 tion depth and a
9010: 73 6b 69 6e 67 20 66 6f 72 20 61 20 68 61 72 64 sking for a hard
9020: 77 61 72 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 ware lock on the
9030: 20 6e 65 78 74 20 62 65 67 69 6e 20 74 72 61 6e next begin tran
9040: 73 61 63 74 69 6f 6e 20 28 63 75 72 72 65 6e 74 saction (current
9050: 20 64 65 70 74 68 20 3d 20 25 69 29 22 2c 20 73 depth = %i)", s
9060: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e lot->transaction
9070: 5f 64 65 70 74 68 29 3b 0a 0a 09 09 09 73 6c 6f _depth);.....slo
9080: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 t->transaction_d
9090: 65 70 74 68 2d 2d 3b 0a 0a 09 09 09 69 66 20 28 epth--;.....if (
90a0: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f slot->transactio
90b0: 6e 5f 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 n_depth > 0) {..
90c0: 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 ...slot->transac
90d0: 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 tion_need_hw_loc
90e0: 6b 20 3d 20 31 3b 0a 09 09 09 7d 0a 09 09 7d 0a k = 1;....}...}.
90f0: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 ...return(CACKEY
9100: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 _PCSC_E_GENERIC)
9110: 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 2d ;..}...if (slot-
9120: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 >transaction_dep
9130: 74 68 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 th == 0) {...CAC
9140: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
9150: 28 22 54 65 72 6d 69 6e 61 74 69 6e 67 20 61 20 ("Terminating a
9160: 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 transaction that
9170: 20 68 61 73 20 6e 6f 74 20 62 65 67 75 6e 21 22 has not begun!"
9180: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 );....return(CAC
9190: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 KEY_PCSC_E_GENER
91a0: 49 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e IC);..}...slot->
91b0: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 transaction_dept
91c0: 68 2d 2d 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d h--;...if (slot-
91d0: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 >transaction_dep
91e0: 74 68 20 3e 20 30 29 20 7b 0a 09 09 43 41 43 4b th > 0) {...CACK
91f0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
9200: 22 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 "Transactions st
9210: 69 6c 6c 20 69 6e 20 70 72 6f 67 72 65 73 73 2c ill in progress,
9220: 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 69 6e 67 not terminating
9230: 20 6f 6e 2d 63 61 72 64 20 54 72 61 6e 73 61 63 on-card Transac
9240: 74 69 6f 6e 20 28 63 75 72 72 65 6e 74 20 64 65 tion (current de
9250: 70 74 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74 pth = %i)", slot
9260: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 ->transaction_de
9270: 70 74 68 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 pth);....return(
9280: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b CACKEY_PCSC_S_OK
9290: 29 3b 0a 09 7d 0a 0a 09 73 63 61 72 64 5f 74 72 );..}...scard_tr
92a0: 61 6e 73 5f 72 65 74 20 3d 20 53 43 61 72 64 45 ans_ret = SCardE
92b0: 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c ndTransaction(sl
92c0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 ot->pcsc_card, S
92d0: 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 CARD_LEAVE_CARD)
92e0: 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 74 72 61 ;..if (scard_tra
92f0: 6e 73 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f ns_ret != SCARD_
9300: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43 S_SUCCESS) {...C
9310: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
9320: 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 65 6e TF("Unable to en
9330: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72 d transaction, r
9340: 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f eturning in erro
9350: 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 r");....return(C
9360: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e ACKEY_PCSC_E_GEN
9370: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b ERIC);..}...CACK
9380: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
9390: 22 53 75 63 65 73 73 66 75 6c 6c 79 20 74 65 72 "Sucessfully ter
93a0: 6d 69 6e 61 74 65 64 20 74 72 61 6e 73 61 63 74 minated transact
93b0: 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28 25 73 29 ion on slot (%s)
93c0: 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 ", slot->pcsc_re
93d0: 61 64 65 72 29 3b 0a 0a 09 72 65 74 75 72 6e 28 ader);...return(
93e0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b CACKEY_PCSC_S_OK
93f0: 29 3b 0a 7d 0a 0a 2f 2a 20 41 50 44 55 20 52 65 );.}../* APDU Re
9400: 6c 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 73 20 lated Functions
9410: 2a 2f 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 */./*. * SYNPOSI
9420: 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f S. * cackey_
9430: 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f ret cackey_send_
9440: 61 70 64 75 28 73 74 72 75 63 74 20 63 61 63 6b apdu(struct cack
9450: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 ey_slot *slot, u
9460: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6c 61 nsigned char cla
9470: 73 73 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 ss, unsigned cha
9480: 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 75 r instruction, u
9490: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 31 2c nsigned char p1,
94a0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 unsigned char p
94b0: 32 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2, unsigned char
94c0: 20 6c 63 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 lc, unsigned ch
94d0: 61 72 20 2a 64 61 74 61 2c 20 75 6e 73 69 67 6e ar *data, unsign
94e0: 65 64 20 63 68 61 72 20 6c 65 2c 20 75 69 6e 74 ed char le, uint
94f0: 31 36 5f 74 20 2a 72 65 73 70 63 6f 64 65 2c 20 16_t *respcode,
9500: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 72 unsigned char *r
9510: 65 73 70 64 61 74 61 2c 20 73 69 7a 65 5f 74 20 espdata, size_t
9520: 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a *respdata_len);.
9530: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a *. * ARGUMENTS.
9540: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c * cackey_sl
9550: 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 ot *slot. *
9560: 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 Slot to send
9570: 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a commands to. *.
9580: 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 * unsigned
9590: 63 68 61 72 20 63 6c 61 73 73 0a 20 2a 20 20 20 char class. *
95a0: 20 20 20 20 20 20 41 50 44 55 20 43 6c 61 73 73 APDU Class
95b0: 20 28 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 (GSCIS_CLASS_IS
95c0: 4f 37 38 31 36 20 6f 72 20 47 53 43 49 53 5f 43 O7816 or GSCIS_C
95d0: 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 LASS_GLOBAL_PLAT
95e0: 46 4f 52 4d 0a 20 2a 20 20 20 20 20 20 20 20 20 FORM. *
95f0: 75 73 75 61 6c 6c 79 29 2c 20 28 43 4c 41 29 0a usually), (CLA).
9600: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e *. * unsign
9610: 65 64 20 63 68 61 72 20 69 6e 73 74 72 75 63 74 ed char instruct
9620: 69 6f 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 41 ion. * A
9630: 50 44 55 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 PDU Instruction
9640: 28 49 4e 53 29 0a 20 2a 0a 20 2a 20 20 20 20 20 (INS). *. *
9650: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 31 unsigned char p1
9660: 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 . * APDU
9670: 20 50 61 72 61 6d 65 74 65 72 20 31 20 28 50 31 Parameter 1 (P1
9680: 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 ). *. * unsi
9690: 67 6e 65 64 20 63 68 61 72 20 70 32 0a 20 2a 20 gned char p2. *
96a0: 20 20 20 20 20 20 20 20 41 50 44 55 20 50 61 72 APDU Par
96b0: 61 6d 65 74 65 72 20 32 20 28 50 32 29 0a 20 2a ameter 2 (P2). *
96c0: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 . * unsigned
96d0: 20 63 68 61 72 20 6c 63 0a 20 2a 20 20 20 20 20 char lc. *
96e0: 20 20 20 20 41 50 44 55 20 4c 65 6e 67 74 68 20 APDU Length
96f0: 6f 66 20 43 6f 6e 74 65 6e 74 20 28 4c 63 29 20 of Content (Lc)
9700: 2d 2d 20 74 68 69 73 20 69 73 20 74 68 65 20 6c -- this is the l
9710: 65 6e 67 74 68 20 6f 66 20 22 64 61 74 61 22 0a ength of "data".
9720: 20 2a 20 20 20 20 20 20 20 20 20 70 61 72 61 6d * param
9730: 65 74 65 72 2e 20 20 49 66 20 22 64 61 74 61 22 eter. If "data"
9740: 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73 is specified as
9750: 20 4e 55 4c 4c 2c 20 74 68 69 73 20 70 61 72 61 NULL, this para
9760: 6d 65 74 65 72 20 77 69 6c 6c 0a 20 2a 20 20 20 meter will. *
9770: 20 20 20 20 20 20 62 65 20 69 67 6e 6f 72 65 64 be ignored
9780: 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 .. *. * unsi
9790: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 0a gned char *data.
97a0: 20 2a 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74 * Point
97b0: 65 72 20 74 6f 20 62 75 66 66 65 72 20 74 6f 20 er to buffer to
97c0: 73 65 6e 64 2e 20 20 49 74 20 73 68 6f 75 6c 64 send. It should
97d0: 20 62 65 20 22 4c 63 22 20 62 79 74 65 73 20 6c be "Lc" bytes l
97e0: 6f 6e 67 2e 20 20 49 66 0a 20 2a 20 20 20 20 20 ong. If. *
97f0: 20 20 20 20 73 70 65 63 69 66 69 65 64 20 61 73 specified as
9800: 20 4e 55 4c 4c 2c 20 22 4c 63 22 20 77 69 6c 6c NULL, "Lc" will
9810: 20 6e 6f 74 20 62 65 20 73 65 6e 74 2c 20 61 6e not be sent, an
9820: 64 20 74 68 69 73 20 62 75 66 66 65 72 20 77 69 d this buffer wi
9830: 6c 6c 20 62 65 0a 20 2a 20 20 20 20 20 20 20 20 ll be. *
9840: 20 69 67 6e 6f 72 65 64 2e 0a 20 2a 0a 20 2a 20 ignored.. *. *
9850: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 unsigned cha
9860: 72 20 6c 65 0a 20 2a 20 20 20 20 20 20 20 20 20 r le. *
9870: 41 50 44 55 20 4c 65 6e 67 74 68 20 6f 66 20 45 APDU Length of E
9880: 78 70 65 63 74 61 74 69 6f 6e 20 28 4c 65 29 20 xpectation (Le)
9890: 2d 2d 20 74 68 69 73 20 69 73 20 74 68 65 20 6c -- this is the l
98a0: 65 6e 67 74 68 20 6f 66 20 74 68 65 0a 20 2a 20 ength of the. *
98b0: 20 20 20 20 20 20 20 20 65 78 70 65 63 74 65 64 expected
98c0: 20 72 65 70 6c 79 2e 20 20 49 66 20 74 68 69 73 reply. If this
98d0: 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73 is specified as
98e0: 20 30 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 0 then it will
98f0: 6e 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 62 not. * b
9900: 65 20 73 65 6e 74 2e 0a 20 2a 0a 20 2a 20 20 20 e sent.. *. *
9910: 20 20 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 70 uint16_t *resp
9920: 63 6f 64 65 0a 20 2a 20 20 20 20 20 20 20 20 20 code. *
9930: 5b 4f 55 54 5d 20 50 6f 69 6e 74 65 72 20 74 6f [OUT] Pointer to
9940: 20 73 74 6f 72 61 67 65 20 6f 66 20 41 50 44 55 storage of APDU
9950: 20 72 65 73 70 6f 6e 73 65 20 63 6f 64 65 2e 20 response code.
9960: 20 49 66 20 74 68 69 73 20 69 73 0a 20 2a 20 20 If this is. *
9970: 20 20 20 20 20 20 20 73 70 65 63 69 66 69 65 64 specified
9980: 20 61 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 as NULL, the re
9990: 73 70 6f 6e 73 65 20 63 6f 64 65 20 77 69 6c 6c sponse code will
99a0: 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20 be discarded..
99b0: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 *. * unsigne
99c0: 64 20 63 68 61 72 20 2a 72 65 73 70 64 61 74 61 d char *respdata
99d0: 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54 . * [OUT
99e0: 5d 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74 6f ] Pointer to sto
99f0: 72 61 67 65 20 6f 66 20 41 50 44 55 20 72 65 73 rage of APDU res
9a00: 70 6f 6e 73 65 20 64 61 74 61 2e 20 20 49 66 20 ponse data. If
9a10: 74 68 69 73 20 69 73 0a 20 2a 20 20 20 20 20 20 this is. *
9a20: 20 20 20 73 70 65 63 69 66 69 65 64 20 61 73 20 specified as
9a30: 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 70 6f 6e NULL, the respon
9a40: 73 65 20 64 61 74 61 20 77 69 6c 6c 20 62 65 20 se data will be
9a50: 64 69 73 63 61 72 64 65 64 2e 20 20 49 66 0a 20 discarded. If.
9a60: 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 22 72 * the "r
9a70: 65 73 70 64 61 74 61 5f 6c 65 6e 22 20 70 61 72 espdata_len" par
9a80: 61 6d 65 74 65 72 20 69 73 20 73 70 65 63 69 66 ameter is specif
9a90: 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68 69 ied as NULL, thi
9aa0: 73 20 62 75 66 66 65 72 0a 20 2a 20 20 20 20 20 s buffer. *
9ab0: 20 20 20 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 will not be
9ac0: 75 70 64 61 74 65 64 2e 0a 20 2a 0a 20 2a 20 20 updated.. *. *
9ad0: 20 20 20 73 69 7a 65 5f 74 20 2a 72 65 73 70 64 size_t *respd
9ae0: 61 74 61 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20 ata_len. *
9af0: 20 20 20 5b 49 4e 2c 20 4f 55 54 5d 20 50 6f 69 [IN, OUT] Poi
9b00: 6e 74 65 72 20 69 6e 69 74 69 61 6c 69 6e 67 20 nter initialing
9b10: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 containing the s
9b20: 69 7a 65 20 6f 66 20 74 68 65 20 22 72 65 73 70 ize of the "resp
9b30: 64 61 74 61 22 0a 20 2a 20 20 20 20 20 20 20 20 data". *
9b40: 20 62 75 66 66 65 72 2e 20 20 42 65 66 6f 72 65 buffer. Before
9b50: 20 72 65 74 75 72 6e 69 6e 67 2c 20 74 68 65 20 returning, the
9b60: 70 6f 69 6e 74 65 64 20 74 6f 20 76 61 6c 75 65 pointed to value
9b70: 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 74 is updated to t
9b80: 68 65 0a 20 2a 20 20 20 20 20 20 20 20 20 6e 75 he. * nu
9b90: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 mber of bytes wr
9ba0: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 62 75 66 itten to the buf
9bb0: 66 65 72 2e 20 20 49 66 20 74 68 69 73 20 69 73 fer. If this is
9bc0: 20 73 70 65 63 69 66 69 65 64 20 61 73 0a 20 2a specified as. *
9bd0: 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 69 NULL, i
9be0: 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 t will not be up
9bf0: 64 61 74 65 64 2c 20 61 6e 64 20 22 72 65 73 70 dated, and "resp
9c00: 64 61 74 61 22 20 77 69 6c 6c 20 62 65 20 69 67 data" will be ig
9c10: 6e 6f 72 65 64 20 63 61 75 73 69 6e 67 0a 20 2a nored causing. *
9c20: 20 20 20 20 20 20 20 20 20 74 68 65 20 72 65 73 the res
9c30: 70 6f 6e 73 65 20 64 61 74 61 20 74 6f 20 62 65 ponse data to be
9c40: 20 64 69 73 63 61 72 64 65 64 2e 0a 20 2a 0a 20 discarded.. *.
9c50: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 * RETURN VALUE.
9c60: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 * CACKEY_PCS
9c70: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 C_S_OK
9c80: 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 On success. *
9c90: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 CACKEY_PCSC_E
9ca0: 5f 47 45 4e 45 52 49 43 20 20 20 20 20 20 4f 6e _GENERIC On
9cb0: 20 65 72 72 6f 72 0a 20 2a 20 20 20 20 20 43 41 error. * CA
9cc0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 CKEY_PCSC_E_TOKE
9cd0: 4e 41 42 53 45 4e 54 20 20 49 66 20 74 68 65 20 NABSENT If the
9ce0: 73 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 20 62 sending failed b
9cf0: 65 63 61 75 73 65 20 74 68 65 20 74 6f 6b 65 6e ecause the token
9d00: 20 69 73 0a 20 2a 20 20 20 20 20 20 20 20 20 20 is. *
9d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9d20: 20 20 20 20 20 20 61 62 73 65 6e 74 0a 20 2a 20 absent. *
9d30: 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f CACKEY_PCSC_
9d40: 45 5f 52 45 54 52 59 20 20 20 20 20 20 20 20 49 E_RETRY I
9d50: 66 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 f something that
9d60: 20 6c 6f 6f 6b 73 20 72 65 74 72 79 27 61 62 6c looks retry'abl
9d70: 65 20 77 65 6e 74 0a 20 2a 20 20 20 20 20 20 20 e went. *
9d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9d90: 20 20 20 20 20 20 20 20 20 77 72 6f 6e 67 20 2d wrong -
9da0: 2d 20 74 72 79 20 74 68 65 20 77 68 6f 6c 65 20 - try the whole
9db0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 76 65 72 transaction over
9dc0: 0a 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 . *
9dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9de0: 20 20 20 61 67 61 69 6e 0a 20 2a 0a 20 2a 20 4e again. *. * N
9df0: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 OTES. * This
9e00: 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 63 function will c
9e10: 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20 50 43 onnect to the PC
9e20: 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 4d /SC Connection M
9e30: 61 6e 61 67 65 72 20 76 69 61 0a 20 2a 20 20 20 anager via. *
9e40: 20 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f cackey_pcsc_co
9e50: 6e 6e 65 63 74 28 29 20 69 66 20 6e 65 65 64 65 nnect() if neede
9e60: 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 49 74 20 d.. *. * It
9e70: 77 69 6c 6c 20 63 6f 6e 6e 65 63 74 20 74 6f 20 will connect to
9e80: 74 68 65 20 63 61 72 64 20 69 6e 20 74 68 65 20 the card in the
9e90: 72 65 61 64 65 72 20 61 74 74 61 63 68 65 64 20 reader attached
9ea0: 74 6f 20 74 68 65 20 73 6c 6f 74 0a 20 2a 20 20 to the slot. *
9eb0: 20 20 20 73 70 65 63 69 66 69 65 64 2e 20 20 49 specified. I
9ec0: 74 20 77 69 6c 6c 20 72 65 63 6f 6e 6e 65 63 74 t will reconnect
9ed0: 20 74 6f 20 74 68 65 20 63 61 72 64 20 69 66 20 to the card if
9ee0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 the connection.
9ef0: 2a 20 20 20 20 20 67 6f 65 73 20 61 77 61 79 2e * goes away.
9f00: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 . *. */.static c
9f10: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 ackey_ret cackey
9f20: 5f 73 65 6e 64 5f 61 70 64 75 28 73 74 72 75 63 _send_apdu(struc
9f30: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 t cackey_slot *s
9f40: 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 lot, unsigned ch
9f50: 61 72 20 63 6c 61 73 73 2c 20 75 6e 73 69 67 6e ar class, unsign
9f60: 65 64 20 63 68 61 72 20 69 6e 73 74 72 75 63 74 ed char instruct
9f70: 69 6f 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 ion, unsigned ch
9f80: 61 72 20 70 31 2c 20 75 6e 73 69 67 6e 65 64 20 ar p1, unsigned
9f90: 63 68 61 72 20 70 32 2c 20 75 6e 73 69 67 6e 65 char p2, unsigne
9fa0: 64 20 69 6e 74 20 6c 63 2c 20 75 6e 73 69 67 6e d int lc, unsign
9fb0: 65 64 20 63 68 61 72 20 2a 64 61 74 61 2c 20 75 ed char *data, u
9fc0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 2c 20 nsigned int le,
9fd0: 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f uint16_t *respco
9fe0: 64 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 de, unsigned cha
9ff0: 72 20 2a 72 65 73 70 64 61 74 61 2c 20 73 69 7a r *respdata, siz
a000: 65 5f 74 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 e_t *respdata_le
a010: 6e 29 20 7b 0a 09 75 69 6e 74 38 5f 74 20 6d 61 n) {..uint8_t ma
a020: 6a 6f 72 5f 72 63 2c 20 6d 69 6e 6f 72 5f 72 63 jor_rc, minor_rc
a030: 3b 0a 09 73 69 7a 65 5f 74 20 62 79 74 65 73 5f ;..size_t bytes_
a040: 74 6f 5f 63 6f 70 79 2c 20 74 6d 70 5f 72 65 73 to_copy, tmp_res
a050: 70 64 61 74 61 5f 6c 65 6e 3b 0a 09 4c 50 43 53 pdata_len;..LPCS
a060: 43 41 52 44 5f 49 4f 5f 52 45 51 55 45 53 54 20 CARD_IO_REQUEST
a070: 70 69 6f 53 65 6e 64 50 63 69 3b 0a 09 44 57 4f pioSendPci;..DWO
a080: 52 44 20 78 6d 69 74 5f 6c 65 6e 2c 20 72 65 63 RD xmit_len, rec
a090: 76 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61 v_len;..LONG sca
a0a0: 72 64 5f 78 6d 69 74 5f 72 65 74 2c 20 73 63 61 rd_xmit_ret, sca
a0b0: 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b 0a 09 rd_reconn_ret;..
a0c0: 42 59 54 45 20 78 6d 69 74 5f 62 75 66 5b 31 30 BYTE xmit_buf[10
a0d0: 32 34 5d 2c 20 72 65 63 76 5f 62 75 66 5b 31 30 24], recv_buf[10
a0e0: 32 34 5d 3b 0a 09 69 6e 74 20 70 63 73 63 5f 63 24];..int pcsc_c
a0f0: 6f 6e 6e 65 63 74 5f 72 65 74 2c 20 70 63 73 63 onnect_ret, pcsc
a100: 5f 67 65 74 72 65 73 70 5f 72 65 74 3b 0a 09 69 _getresp_ret;..i
a110: 6e 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 nt idx;...CACKEY
a120: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 _DEBUG_PRINTF("C
a130: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 alled.");...if (
a140: 21 73 6c 6f 74 29 20 7b 0a 09 09 43 41 43 4b 45 !slot) {...CACKE
a150: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
a160: 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 73 70 65 Invalid slot spe
a170: 63 69 66 69 65 64 2e 22 29 3b 0a 0a 09 09 72 65 cified.");....re
a180: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 turn(CACKEY_PCSC
a190: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a _E_GENERIC);..}.
a1a0: 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 ..pcsc_connect_r
a1b0: 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e et = cackey_conn
a1c0: 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a ect_card(slot);.
a1d0: 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 .if (pcsc_connec
a1e0: 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f t_ret != CACKEY_
a1f0: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 PCSC_S_OK) {...C
a200: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
a210: 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f TF("Unable to co
a220: 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72 nnect to card, r
a230: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c eturning in fail
a240: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ure");....return
a250: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 (CACKEY_PCSC_E_G
a260: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a ENERIC);..}.../*
a270: 20 44 65 74 65 72 6d 69 6e 65 20 77 68 69 63 68 Determine which
a280: 20 70 72 6f 74 6f 63 6f 6c 20 74 6f 20 73 65 6e protocol to sen
a290: 64 20 75 73 69 6e 67 20 2a 2f 0a 09 73 77 69 74 d using */..swit
a2a0: 63 68 20 28 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 ch (slot->protoc
a2b0: 6f 6c 29 20 7b 0a 09 09 63 61 73 65 20 53 43 41 ol) {...case SCA
a2c0: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 3a 0a RD_PROTOCOL_T0:.
a2d0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
a2e0: 50 52 49 4e 54 46 28 22 50 72 6f 74 6f 63 6f 6c PRINTF("Protocol
a2f0: 20 74 6f 20 73 65 6e 64 20 64 61 74 61 67 72 61 to send datagra
a300: 6d 20 69 73 20 54 3d 30 22 29 3b 0a 0a 09 09 09 m is T=0");.....
a310: 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53 43 41 pioSendPci = SCA
a320: 52 44 5f 50 43 49 5f 54 30 3b 0a 0a 09 09 09 62 RD_PCI_T0;.....b
a330: 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 53 43 41 reak;...case SCA
a340: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 3a 0a RD_PROTOCOL_T1:.
a350: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
a360: 50 52 49 4e 54 46 28 22 50 72 6f 74 6f 63 6f 6c PRINTF("Protocol
a370: 20 74 6f 20 73 65 6e 64 20 64 61 74 61 67 72 61 to send datagra
a380: 6d 20 69 73 20 54 3d 31 22 29 3b 0a 0a 09 09 09 m is T=1");.....
a390: 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53 43 41 pioSendPci = SCA
a3a0: 52 44 5f 50 43 49 5f 54 31 3b 0a 0a 09 09 09 62 RD_PCI_T1;.....b
a3b0: 72 65 61 6b 3b 0a 09 09 64 65 66 61 75 6c 74 3a reak;...default:
a3c0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
a3d0: 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 _PRINTF("Invalid
a3e0: 20 70 72 6f 74 6f 63 6f 6c 20 66 6f 75 6e 64 2c protocol found,
a3f0: 20 61 62 6f 72 74 69 6e 67 2e 22 29 3b 0a 0a 09 aborting.");...
a400: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f ..return(CACKEY_
a410: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b PCSC_E_GENERIC);
a420: 0a 09 7d 0a 0a 09 2f 2a 20 54 72 61 6e 73 6d 69 ..}.../* Transmi
a430: 74 20 2a 2f 0a 09 78 6d 69 74 5f 6c 65 6e 20 3d t */..xmit_len =
a440: 20 30 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d 0;..xmit_buf[xm
a450: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 63 6c 61 73 it_len++] = clas
a460: 73 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 s;..xmit_buf[xmi
a470: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 69 6e 73 74 72 t_len++] = instr
a480: 75 63 74 69 6f 6e 3b 0a 09 78 6d 69 74 5f 62 75 uction;..xmit_bu
a490: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 f[xmit_len++] =
a4a0: 70 31 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d p1;..xmit_buf[xm
a4b0: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 70 32 3b 0a it_len++] = p2;.
a4c0: 09 69 66 20 28 64 61 74 61 29 20 7b 0a 09 09 69 .if (data) {...i
a4d0: 66 20 28 6c 63 20 3e 20 32 35 35 29 20 7b 0a 09 f (lc > 255) {..
a4e0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
a4f0: 52 49 4e 54 46 28 22 43 41 55 54 49 4f 4e 21 20 RINTF("CAUTION!
a500: 20 55 73 69 6e 67 20 61 6e 20 4c 63 20 67 72 65 Using an Lc gre
a510: 61 74 65 72 20 74 68 61 6e 20 32 35 35 20 69 73 ater than 255 is
a520: 20 75 6e 74 65 73 74 65 64 2e 20 20 4c 63 20 3d untested. Lc =
a530: 20 25 75 22 2c 20 6c 63 29 3b 0a 0a 09 09 09 78 %u", lc);.....x
a540: 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e mit_buf[xmit_len
a550: 2b 2b 5d 20 3d 20 30 78 38 32 3b 20 2f 2a 20 58 ++] = 0x82; /* X
a560: 58 58 20 55 4e 54 45 53 54 45 44 20 2a 2f 0a 09 XX UNTESTED */..
a570: 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f ..xmit_buf[xmit_
a580: 6c 65 6e 2b 2b 5d 20 3d 20 28 6c 63 20 26 20 30 len++] = (lc & 0
a590: 78 66 66 30 30 29 20 3e 3e 20 38 3b 0a 09 09 09 xff00) >> 8;....
a5a0: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 xmit_buf[xmit_le
a5b0: 6e 2b 2b 5d 20 3d 20 6c 63 20 26 20 30 78 66 66 n++] = lc & 0xff
a5c0: 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 ;...} else {....
a5d0: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 xmit_buf[xmit_le
a5e0: 6e 2b 2b 5d 20 3d 20 6c 63 3b 0a 09 09 7d 0a 09 n++] = lc;...}..
a5f0: 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 .for (idx = 0; i
a600: 64 78 20 3c 20 6c 63 3b 20 69 64 78 2b 2b 29 20 dx < lc; idx++)
a610: 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d {....xmit_buf[xm
a620: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 64 61 74 61 it_len++] = data
a630: 5b 69 64 78 5d 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 [idx];...}..}...
a640: 69 66 20 28 6c 65 20 21 3d 20 30 78 30 30 29 20 if (le != 0x00)
a650: 7b 0a 09 09 69 66 20 28 6c 65 20 3e 20 32 35 36 {...if (le > 256
a660: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 ) {....CACKEY_DE
a670: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 41 55 54 BUG_PRINTF("CAUT
a680: 49 4f 4e 21 20 20 55 73 69 6e 67 20 61 6e 20 4c ION! Using an L
a690: 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 32 e greater than 2
a6a0: 35 36 20 69 73 20 75 6e 74 65 73 74 65 64 2e 20 56 is untested.
a6b0: 20 4c 65 20 3d 20 25 75 22 2c 20 6c 65 29 3b 0a Le = %u", le);.
a6c0: 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 ....xmit_buf[xmi
a6d0: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 30 78 38 32 3b t_len++] = 0x82;
a6e0: 20 2f 2a 20 58 58 58 20 55 4e 54 45 53 54 45 44 /* XXX UNTESTED
a6f0: 20 2a 2f 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b */....xmit_buf[
a700: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 28 6c xmit_len++] = (l
a710: 65 20 26 20 30 78 66 66 30 30 29 20 3e 3e 20 38 e & 0xff00) >> 8
a720: 3b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d ;....xmit_buf[xm
a730: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 65 20 26 it_len++] = le &
a740: 20 30 78 66 66 3b 0a 09 09 7d 20 65 6c 73 65 20 0xff;...} else
a750: 69 66 20 28 6c 65 20 3d 3d 20 32 35 36 29 20 7b if (le == 256) {
a760: 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 ....xmit_buf[xmi
a770: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 30 78 30 30 3b t_len++] = 0x00;
a780: 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 78 ...} else {....x
a790: 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e mit_buf[xmit_len
a7a0: 2b 2b 5d 20 3d 20 6c 65 3b 0a 09 09 7d 0a 09 7d ++] = le;...}..}
a7b0: 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 53 6d 61 72 .../* Begin Smar
a7c0: 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f tcard Transactio
a7d0: 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 62 65 67 n */..cackey_beg
a7e0: 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 in_transaction(s
a7f0: 6c 6f 74 29 3b 0a 0a 09 69 66 20 28 63 6c 61 73 lot);...if (clas
a800: 73 20 3d 3d 20 47 53 43 49 53 5f 43 4c 41 53 53 s == GSCIS_CLASS
a810: 5f 49 53 4f 37 38 31 36 20 26 26 20 28 69 6e 73 _ISO7816 && (ins
a820: 74 72 75 63 74 69 6f 6e 20 3d 3d 20 47 53 43 49 truction == GSCI
a830: 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 20 7c S_INSTR_VERIFY |
a840: 7c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 3d 3d | instruction ==
a850: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 43 48 41 GSCIS_INSTR_CHA
a860: 4e 47 45 5f 52 45 46 45 52 45 4e 43 45 29 20 26 NGE_REFERENCE) &
a870: 26 20 70 31 20 3d 3d 20 30 78 30 30 29 20 7b 0a & p1 == 0x00) {.
a880: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
a890: 52 49 4e 54 46 28 22 53 65 6e 64 69 6e 67 20 41 RINTF("Sending A
a8a0: 50 44 55 3a 20 3c 3c 63 65 6e 73 6f 72 65 64 3e PDU: <<censored>
a8b0: 3e 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 >");..} else {..
a8c0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
a8d0: 49 4e 54 42 55 46 28 22 53 65 6e 64 69 6e 67 20 INTBUF("Sending
a8e0: 41 50 44 55 3a 22 2c 20 78 6d 69 74 5f 62 75 66 APDU:", xmit_buf
a8f0: 2c 20 78 6d 69 74 5f 6c 65 6e 29 3b 0a 09 7d 0a , xmit_len);..}.
a900: 0a 09 72 65 63 76 5f 6c 65 6e 20 3d 20 73 69 7a ..recv_len = siz
a910: 65 6f 66 28 72 65 63 76 5f 62 75 66 29 3b 0a 09 eof(recv_buf);..
a920: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d scard_xmit_ret =
a930: 20 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28 73 SCardTransmit(s
a940: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 lot->pcsc_card,
a950: 70 69 6f 53 65 6e 64 50 63 69 2c 20 78 6d 69 74 pioSendPci, xmit
a960: 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20 _buf, xmit_len,
a970: 4e 55 4c 4c 2c 20 72 65 63 76 5f 62 75 66 2c 20 NULL, recv_buf,
a980: 26 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 69 66 &recv_len);...if
a990: 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 (scard_xmit_ret
a9a0: 20 3d 3d 20 53 43 41 52 44 5f 45 5f 4e 4f 54 5f == SCARD_E_NOT_
a9b0: 54 52 41 4e 53 41 43 54 45 44 29 20 7b 0a 09 09 TRANSACTED) {...
a9c0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
a9d0: 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73 NTF("Failed to s
a9e0: 65 6e 64 20 41 50 44 55 20 74 6f 20 63 61 72 64 end APDU to card
a9f0: 20 28 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28 (SCardTransmit(
aa00: 29 20 3d 20 25 73 2f 25 6c 78 29 2c 20 77 69 6c ) = %s/%lx), wil
aa10: 6c 20 61 73 6b 20 63 61 6c 6c 69 6e 67 20 66 75 l ask calling fu
aa20: 6e 63 74 69 6f 6e 20 74 6f 20 72 65 74 72 79 20 nction to retry
aa30: 28 6e 6f 74 20 72 65 73 65 74 74 69 6e 67 20 63 (not resetting c
aa40: 61 72 64 29 2e 2e 2e 22 2c 20 43 41 43 4b 45 59 ard)...", CACKEY
aa50: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 _DEBUG_FUNC_SCAR
aa60: 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 DERR_TO_STR(scar
aa70: 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28 75 6e d_xmit_ret), (un
aa80: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 63 61 signed long) sca
aa90: 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a 09 rd_xmit_ret);...
aaa0: 09 2f 2a 20 42 65 67 69 6e 20 53 6d 61 72 74 63 ./* Begin Smartc
aab0: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 ard Transaction
aac0: 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f */...cackey_end_
aad0: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 transaction(slot
aae0: 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 72 65 63 );....cackey_rec
aaf0: 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 onnect_card(slot
ab00: 2c 20 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c , slot->protocol
ab10: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 );....return(CAC
ab20: 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 KEY_PCSC_E_RETRY
ab30: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 63 61 72 );..}...if (scar
ab40: 64 5f 78 6d 69 74 5f 72 65 74 20 21 3d 20 53 43 d_xmit_ret != SC
ab50: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b ARD_S_SUCCESS) {
ab60: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
ab70: 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 PRINTF("Failed t
ab80: 6f 20 73 65 6e 64 20 41 50 44 55 20 74 6f 20 63 o send APDU to c
ab90: 61 72 64 20 28 53 43 61 72 64 54 72 61 6e 73 6d ard (SCardTransm
aba0: 69 74 28 29 20 3d 20 25 73 2f 25 6c 78 29 22 2c it() = %s/%lx)",
abb0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 CACKEY_DEBUG_FU
abc0: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 NC_SCARDERR_TO_S
abd0: 54 52 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 TR(scard_xmit_re
abe0: 74 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f t), (unsigned lo
abf0: 6e 67 29 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 ng) scard_xmit_r
ac00: 65 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 et);....CACKEY_D
ac10: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 61 72 EBUG_PRINTF("Mar
ac20: 6b 69 6e 67 20 73 6c 6f 74 20 61 73 20 68 61 76 king slot as hav
ac30: 69 6e 67 20 62 65 65 6e 20 72 65 73 65 74 22 29 ing been reset")
ac40: 3b 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f ;...cackey_mark_
ac50: 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 slot_reset(slot)
ac60: 3b 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 78 ;....if (scard_x
ac70: 6d 69 74 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 mit_ret == SCARD
ac80: 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 29 20 7b _W_RESET_CARD) {
ac90: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
aca0: 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 72 _PRINTF("Reset r
acb0: 65 71 75 69 72 65 64 2c 20 70 6c 65 61 73 65 20 equired, please
acc0: 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73 hold...");.....s
acd0: 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 card_reconn_ret
ace0: 3d 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 = cackey_reconne
acf0: 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20 53 43 ct_card(slot, SC
ad00: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 ARD_PROTOCOL_T0
ad10: 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c | SCARD_PROTOCOL
ad20: 5f 54 31 29 3b 0a 0a 09 09 09 69 66 20 28 73 63 _T1);.....if (sc
ad30: 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d ard_reconn_ret =
ad40: 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 = SCARD_S_SUCCES
ad50: 53 29 20 7b 0a 09 09 09 09 73 77 69 74 63 68 20 S) {.....switch
ad60: 28 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 29 (slot->protocol)
ad70: 20 7b 0a 09 09 09 09 09 63 61 73 65 20 53 43 41 {......case SCA
ad80: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 3a 0a RD_PROTOCOL_T0:.
ad90: 09 09 09 09 09 09 70 69 6f 53 65 6e 64 50 63 69 ......pioSendPci
ada0: 20 3d 20 53 43 41 52 44 5f 50 43 49 5f 54 30 3b = SCARD_PCI_T0;
adb0: 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 ........break;..
adc0: 09 09 09 09 63 61 73 65 20 53 43 41 52 44 5f 50 ....case SCARD_P
add0: 52 4f 54 4f 43 4f 4c 5f 54 31 3a 0a 09 09 09 09 ROTOCOL_T1:.....
ade0: 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53 ..pioSendPci = S
adf0: 43 41 52 44 5f 50 43 49 5f 54 31 3b 0a 0a 09 09 CARD_PCI_T1;....
ae00: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 ....break;......
ae10: 64 65 66 61 75 6c 74 3a 0a 09 09 09 09 09 09 43 default:.......C
ae20: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
ae30: 54 46 28 22 49 6e 76 61 6c 69 64 20 70 72 6f 74 TF("Invalid prot
ae40: 6f 63 6f 6c 20 66 6f 75 6e 64 2c 20 62 75 74 20 ocol found, but
ae50: 74 6f 6f 20 6c 61 74 65 20 74 6f 20 64 6f 20 61 too late to do a
ae60: 6e 79 74 68 69 6e 67 20 61 62 6f 75 74 20 69 74 nything about it
ae70: 20 6e 6f 77 20 2d 2d 20 74 72 79 69 6e 67 20 61 now -- trying a
ae80: 6e 79 77 61 79 2e 22 29 3b 0a 0a 09 09 09 09 09 nyway.");.......
ae90: 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 .break;.....}...
aea0: 09 09 09 2f 2a 20 52 65 2d 65 73 74 61 62 6c 69 .../* Re-establi
aeb0: 73 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 sh transaction,
aec0: 69 66 20 69 74 20 77 61 73 20 70 72 65 73 65 6e if it was presen
aed0: 74 20 2a 2f 0a 09 09 09 09 69 66 20 28 73 6c 6f t */.....if (slo
aee0: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 t->transaction_d
aef0: 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09 09 epth > 0) {.....
af00: 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 .slot->transacti
af10: 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 09 09 09 09 on_depth--;.....
af20: 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 .slot->transacti
af30: 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 on_need_hw_lock
af40: 3d 20 31 3b 0a 09 09 09 09 09 63 61 63 6b 65 79 = 1;......cackey
af50: 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 _begin_transacti
af60: 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09 09 09 7d 0a on(slot);.....}.
af70: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
af80: 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 G_PRINTF("Reset
af90: 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 72 successful, retr
afa0: 61 6e 73 6d 69 74 74 69 6e 67 22 29 3b 0a 0a 09 ansmitting");...
afb0: 09 09 09 72 65 63 76 5f 6c 65 6e 20 3d 20 73 69 ...recv_len = si
afc0: 7a 65 6f 66 28 72 65 63 76 5f 62 75 66 29 3b 0a zeof(recv_buf);.
afd0: 09 09 09 09 73 63 61 72 64 5f 78 6d 69 74 5f 72 ....scard_xmit_r
afe0: 65 74 20 3d 20 53 43 61 72 64 54 72 61 6e 73 6d et = SCardTransm
aff0: 69 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 it(slot->pcsc_ca
b000: 72 64 2c 20 70 69 6f 53 65 6e 64 50 63 69 2c 20 rd, pioSendPci,
b010: 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69 74 5f 6c xmit_buf, xmit_l
b020: 65 6e 2c 20 4e 55 4c 4c 2c 20 72 65 63 76 5f 62 en, NULL, recv_b
b030: 75 66 2c 20 26 72 65 63 76 5f 6c 65 6e 29 3b 0a uf, &recv_len);.
b040: 0a 09 09 09 09 69 66 20 28 73 63 61 72 64 5f 78 .....if (scard_x
b050: 6d 69 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44 mit_ret != SCARD
b060: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 _S_SUCCESS) {...
b070: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
b080: 50 52 49 4e 54 46 28 22 52 65 74 72 61 6e 73 6d PRINTF("Retransm
b090: 69 74 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 it failed, retur
b0a0: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20 ning in failure
b0b0: 61 66 74 65 72 20 64 69 73 63 6f 6e 6e 65 63 74 after disconnect
b0c0: 69 6e 67 20 74 68 65 20 63 61 72 64 20 28 53 43 ing the card (SC
b0d0: 61 72 64 54 72 61 6e 73 6d 69 74 20 3d 20 25 73 ardTransmit = %s
b0e0: 2f 25 6c 69 29 22 2c 20 43 41 43 4b 45 59 5f 44 /%li)", CACKEY_D
b0f0: 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 EBUG_FUNC_SCARDE
b100: 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f RR_TO_STR(scard_
b110: 78 6d 69 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 xmit_ret), (long
b120: 29 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 ) scard_xmit_ret
b130: 29 3b 0a 0a 09 09 09 09 09 53 43 61 72 64 44 69 );.......SCardDi
b140: 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 sconnect(slot->p
b150: 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f csc_card, SCARD_
b160: 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 09 09 LEAVE_CARD);....
b170: 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 ..slot->pcsc_car
b180: 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b d_connected = 0;
b190: 0a 0a 09 09 09 09 09 2f 2a 20 45 6e 64 20 53 6d ......./* End Sm
b1a0: 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 artcard Transact
b1b0: 69 6f 6e 20 2a 2f 0a 09 09 09 09 09 73 6c 6f 74 ion */......slot
b1c0: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 ->transaction_de
b1d0: 70 74 68 20 3d 20 31 3b 0a 09 09 09 09 09 63 61 pth = 1;......ca
b1e0: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 ckey_end_transac
b1f0: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 tion(slot);.....
b200: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f ..return(CACKEY_
b210: 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 PCSC_E_TOKENABSE
b220: 4e 54 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 NT);.....}....}
b230: 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45 else {.....CACKE
b240: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
b250: 44 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20 63 61 Disconnecting ca
b260: 72 64 22 29 3b 0a 0a 09 09 09 09 53 43 61 72 64 rd");......SCard
b270: 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d Disconnect(slot-
b280: 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 >pcsc_card, SCAR
b290: 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 D_LEAVE_CARD);..
b2a0: 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 ...slot->pcsc_ca
b2b0: 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 rd_connected = 0
b2c0: 3b 0a 0a 09 09 09 09 2f 2a 20 45 6e 64 20 53 6d ;....../* End Sm
b2d0: 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 artcard Transact
b2e0: 69 6f 6e 20 2a 2f 0a 09 09 09 09 73 6c 6f 74 2d ion */.....slot-
b2f0: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 >transaction_dep
b300: 74 68 20 3d 20 31 3b 0a 09 09 09 09 63 61 63 6b th = 1;.....cack
b310: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 ey_end_transacti
b320: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 43 on(slot);......C
b330: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
b340: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e TF("Returning in
b350: 20 66 61 69 6c 75 72 65 22 29 3b 0a 09 09 09 09 failure");.....
b360: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 return(CACKEY_PC
b370: 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 SC_E_TOKENABSENT
b380: 29 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 );....}...} else
b390: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 {....CACKEY_DEB
b3a0: 55 47 5f 50 52 49 4e 54 46 28 22 44 69 73 63 6f UG_PRINTF("Disco
b3b0: 6e 6e 65 63 74 69 6e 67 20 63 61 72 64 22 29 3b nnecting card");
b3c0: 0a 0a 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e .....SCardDiscon
b3d0: 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f nect(slot->pcsc_
b3e0: 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 card, SCARD_LEAV
b3f0: 45 5f 43 41 52 44 29 3b 0a 09 09 09 73 6c 6f 74 E_CARD);....slot
b400: 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e ->pcsc_card_conn
b410: 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09 2f ected = 0;...../
b420: 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 * End Smartcard
b430: 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 Transaction */..
b440: 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 ..slot->transact
b450: 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a 09 ion_depth = 1;..
b460: 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 ..cackey_end_tra
b470: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a nsaction(slot);.
b480: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
b490: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
b4a0: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b ng in failure");
b4b0: 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 ....return(CACKE
b4c0: 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 Y_PCSC_E_TOKENAB
b4d0: 53 45 4e 54 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 SENT);...}..}...
b4e0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
b4f0: 4e 54 42 55 46 28 22 52 65 74 75 72 6e 65 64 20 NTBUF("Returned
b500: 56 61 6c 75 65 3a 22 2c 20 72 65 63 76 5f 62 75 Value:", recv_bu
b510: 66 2c 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 f, recv_len);...
b520: 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20 32 if (recv_len < 2
b530: 29 20 7b 0a 09 09 2f 2a 20 4d 69 6e 69 6d 61 6c ) {.../* Minimal
b540: 20 72 65 73 70 6f 6e 73 65 20 6c 65 6e 67 74 68 response length
b550: 20 69 73 20 32 20 62 79 74 65 73 2c 20 72 65 74 is 2 bytes, ret
b560: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 urning in failur
b570: 65 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 e */...CACKEY_DE
b580: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 70 BUG_PRINTF("Resp
b590: 6f 6e 73 65 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 onse too small,
b5a0: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 returning in fai
b5b0: 6c 75 72 65 20 28 72 65 63 76 5f 6c 65 6e 20 3d lure (recv_len =
b5c0: 20 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 %lu)", (unsigne
b5d0: 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e d long) recv_len
b5e0: 29 3b 0a 0a 09 09 2f 2a 20 45 6e 64 20 53 6d 61 );..../* End Sma
b5f0: 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 rtcard Transacti
b600: 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 on */...cackey_e
b610: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 nd_transaction(s
b620: 6c 6f 74 29 3b 0a 0a 09 09 2f 2a 20 53 75 70 70 lot);..../* Supp
b630: 6c 79 20 61 6e 20 69 6e 76 61 6c 69 64 20 72 65 ly an invalid re
b640: 73 70 6f 6e 73 65 20 63 6f 64 65 20 2a 2f 0a 09 sponse code */..
b650: 09 69 66 20 28 72 65 73 70 63 6f 64 65 29 20 7b .if (respcode) {
b660: 0a 09 09 09 2a 72 65 73 70 63 6f 64 65 20 3d 20 ....*respcode =
b670: 30 3b 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 0;...}....return
b680: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e (CACKEY_PCSC_E_N
b690: 4f 44 41 54 41 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 ODATA);..}.../*
b6a0: 44 65 74 65 72 6d 69 6e 65 20 72 65 73 75 6c 74 Determine result
b6b0: 20 63 6f 64 65 20 2a 2f 0a 09 6d 61 6a 6f 72 5f code */..major_
b6c0: 72 63 20 3d 20 72 65 63 76 5f 62 75 66 5b 72 65 rc = recv_buf[re
b6d0: 63 76 5f 6c 65 6e 20 2d 20 32 5d 3b 0a 09 6d 69 cv_len - 2];..mi
b6e0: 6e 6f 72 5f 72 63 20 3d 20 72 65 63 76 5f 62 75 nor_rc = recv_bu
b6f0: 66 5b 72 65 63 76 5f 6c 65 6e 20 2d 20 31 5d 3b f[recv_len - 1];
b700: 0a 09 69 66 20 28 72 65 73 70 63 6f 64 65 29 20 ..if (respcode)
b710: 7b 0a 09 09 2a 72 65 73 70 63 6f 64 65 20 3d 20 {...*respcode =
b720: 28 6d 61 6a 6f 72 5f 72 63 20 3c 3c 20 38 29 20 (major_rc << 8)
b730: 7c 20 6d 69 6e 6f 72 5f 72 63 3b 0a 09 7d 0a 0a | minor_rc;..}..
b740: 09 2f 2a 20 41 64 6a 75 73 74 20 6d 65 73 73 61 ./* Adjust messa
b750: 67 65 20 62 75 66 66 65 72 20 2a 2f 0a 09 72 65 ge buffer */..re
b760: 63 76 5f 6c 65 6e 20 2d 3d 20 32 3b 0a 0a 09 2f cv_len -= 2;.../
b770: 2a 20 41 64 64 20 62 79 74 65 73 20 74 6f 20 72 * Add bytes to r
b780: 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 09 eturn value */..
b790: 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e tmp_respdata_len
b7a0: 20 3d 20 30 3b 0a 09 69 66 20 28 72 65 73 70 64 = 0;..if (respd
b7b0: 61 74 61 20 26 26 20 72 65 73 70 64 61 74 61 5f ata && respdata_
b7c0: 6c 65 6e 29 20 7b 0a 09 09 74 6d 70 5f 72 65 73 len) {...tmp_res
b7d0: 70 64 61 74 61 5f 6c 65 6e 20 3d 20 2a 72 65 73 pdata_len = *res
b7e0: 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 62 79 pdata_len;....by
b7f0: 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 2a 72 tes_to_copy = *r
b800: 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 espdata_len;....
b810: 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20 62 if (recv_len < b
b820: 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a ytes_to_copy) {.
b830: 09 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 ...bytes_to_copy
b840: 20 3d 20 72 65 63 76 5f 6c 65 6e 3b 0a 09 09 7d = recv_len;...}
b850: 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
b860: 5f 50 52 49 4e 54 46 28 22 43 6f 70 79 69 6e 67 _PRINTF("Copying
b870: 20 25 6c 75 20 62 79 74 65 73 20 74 6f 20 74 68 %lu bytes to th
b880: 65 20 62 75 66 66 65 72 20 28 72 65 63 76 27 64 e buffer (recv'd
b890: 20 25 6c 75 20 62 79 74 65 73 2c 20 62 75 74 20 %lu bytes, but
b8a0: 6f 6e 6c 79 20 25 6c 75 20 62 79 74 65 73 20 6c only %lu bytes l
b8b0: 65 66 74 20 69 6e 20 6f 75 72 20 62 75 66 66 65 eft in our buffe
b8c0: 72 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c r)", (unsigned l
b8d0: 6f 6e 67 29 20 62 79 74 65 73 5f 74 6f 5f 63 6f ong) bytes_to_co
b8e0: 70 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f py, (unsigned lo
b8f0: 6e 67 29 20 72 65 63 76 5f 6c 65 6e 2c 20 28 75 ng) recv_len, (u
b900: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 72 nsigned long) *r
b910: 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 0a 09 espdata_len);...
b920: 09 6d 65 6d 63 70 79 28 72 65 73 70 64 61 74 61 .memcpy(respdata
b930: 2c 20 72 65 63 76 5f 62 75 66 2c 20 62 79 74 65 , recv_buf, byte
b940: 73 5f 74 6f 5f 63 6f 70 79 29 3b 0a 09 09 72 65 s_to_copy);...re
b950: 73 70 64 61 74 61 20 2b 3d 20 62 79 74 65 73 5f spdata += bytes_
b960: 74 6f 5f 63 6f 70 79 3b 0a 0a 09 09 2a 72 65 73 to_copy;....*res
b970: 70 64 61 74 61 5f 6c 65 6e 20 3d 20 62 79 74 65 pdata_len = byte
b980: 73 5f 74 6f 5f 63 6f 70 79 3b 0a 09 09 74 6d 70 s_to_copy;...tmp
b990: 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 2d 3d _respdata_len -=
b9a0: 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a bytes_to_copy;.
b9b0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 .} else {...if (
b9c0: 72 65 63 76 5f 6c 65 6e 20 21 3d 20 30 29 20 7b recv_len != 0) {
b9d0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
b9e0: 5f 50 52 49 4e 54 46 28 22 54 68 72 6f 77 69 6e _PRINTF("Throwin
b9f0: 67 20 61 77 61 79 20 25 6c 75 20 62 79 74 65 73 g away %lu bytes
ba00: 2c 20 6e 6f 77 68 65 72 65 20 74 6f 20 70 75 74 , nowhere to put
ba10: 20 74 68 65 6d 21 22 2c 20 28 75 6e 73 69 67 6e them!", (unsign
ba20: 65 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65 ed long) recv_le
ba30: 6e 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 n);...}..}...if
ba40: 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d 20 30 78 36 (major_rc == 0x6
ba50: 31 29 20 7b 0a 09 09 2f 2a 20 57 65 20 6e 65 65 1) {.../* We nee
ba60: 64 20 74 6f 20 52 45 41 44 20 2a 2f 0a 09 09 43 d to READ */...C
ba70: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
ba80: 54 46 28 22 42 75 66 66 65 72 20 72 65 61 64 20 TF("Buffer read
ba90: 72 65 71 75 69 72 65 64 22 29 3b 0a 0a 09 09 69 required");....i
baa0: 66 20 28 6d 69 6e 6f 72 5f 72 63 20 3d 3d 20 30 f (minor_rc == 0
bab0: 78 30 30 29 20 7b 0a 09 09 09 6d 69 6e 6f 72 5f x00) {....minor_
bac0: 72 63 20 3d 20 43 41 43 4b 45 59 5f 41 50 44 55 rc = CACKEY_APDU
bad0: 5f 4d 54 55 3b 0a 09 09 7d 0a 0a 09 09 70 63 73 _MTU;...}....pcs
bae0: 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20 3d 20 c_getresp_ret =
baf0: 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 cackey_send_apdu
bb00: 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 (slot, GSCIS_CLA
bb10: 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49 SS_ISO7816, GSCI
bb20: 53 5f 49 4e 53 54 52 5f 47 45 54 5f 52 45 53 50 S_INSTR_GET_RESP
bb30: 4f 4e 53 45 2c 20 30 78 30 30 2c 20 30 78 30 30 ONSE, 0x00, 0x00
bb40: 2c 20 30 2c 20 4e 55 4c 4c 2c 20 6d 69 6e 6f 72 , 0, NULL, minor
bb50: 5f 72 63 2c 20 72 65 73 70 63 6f 64 65 2c 20 72 _rc, respcode, r
bb60: 65 73 70 64 61 74 61 2c 20 26 74 6d 70 5f 72 65 espdata, &tmp_re
bb70: 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 0a 09 09 spdata_len);....
bb80: 69 66 20 28 70 63 73 63 5f 67 65 74 72 65 73 70 if (pcsc_getresp
bb90: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 _ret != CACKEY_P
bba0: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 CSC_S_OK) {....C
bbb0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
bbc0: 54 46 28 22 42 75 66 66 65 72 20 72 65 61 64 20 TF("Buffer read
bbd0: 66 61 69 6c 65 64 21 20 20 52 65 74 75 72 6e 69 failed! Returni
bbe0: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b ng in failure");
bbf0: 0a 0a 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 ...../* End Smar
bc00: 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f tcard Transactio
bc10: 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 65 n */....cackey_e
bc20: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 nd_transaction(s
bc30: 6c 6f 74 29 3b 0a 0a 09 09 09 69 66 20 28 70 63 lot);.....if (pc
bc40: 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20 3d sc_getresp_ret =
bc50: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f = CACKEY_PCSC_E_
bc60: 52 45 54 52 59 29 20 7b 0a 09 09 09 09 72 65 74 RETRY) {.....ret
bc70: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f urn(CACKEY_PCSC_
bc80: 45 5f 52 45 54 52 59 29 3b 0a 09 09 09 7d 0a 0a E_RETRY);....}..
bc90: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 ...return(CACKEY
bca0: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 _PCSC_E_GENERIC)
bcb0: 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72 65 73 ;...}....if (res
bcc0: 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 09 09 pdata_len) {....
bcd0: 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 2b 3d *respdata_len +=
bce0: 20 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 tmp_respdata_le
bcf0: 6e 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 45 6e 64 n;...}..../* End
bd00: 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 Smartcard Trans
bd10: 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b action */...cack
bd20: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 ey_end_transacti
bd30: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 43 41 43 on(slot);....CAC
bd40: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
bd50: 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 ("Returning in s
bd60: 75 63 63 65 73 73 20 28 62 75 66 66 65 72 20 72 uccess (buffer r
bd70: 65 61 64 20 63 6f 6d 70 6c 65 74 65 29 22 29 3b ead complete)");
bd80: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 ...return(CACKEY
bd90: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a _PCSC_S_OK);..}.
bda0: 0a 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 ../* End Smartca
bdb0: 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a rd Transaction *
bdc0: 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 /..cackey_end_tr
bdd0: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b ansaction(slot);
bde0: 0a 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 72 63 20 ...if (major_rc
bdf0: 3d 3d 20 30 78 39 30 29 20 7b 0a 09 09 2f 2a 20 == 0x90) {.../*
be00: 53 75 63 63 65 73 73 20 2a 2f 0a 09 09 43 41 43 Success */...CAC
be10: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
be20: 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 ("Returning in s
be30: 75 63 63 65 73 73 20 28 6d 61 6a 6f 72 5f 72 63 uccess (major_rc
be40: 20 3d 20 30 78 39 30 29 22 29 3b 0a 0a 09 09 72 = 0x90)");....r
be50: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 eturn(CACKEY_PCS
be60: 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 0a 09 43 C_S_OK);..}....C
be70: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
be80: 54 46 28 22 41 50 44 55 20 52 65 74 75 72 6e 65 TF("APDU Returne
be90: 64 20 61 6e 20 65 72 72 6f 72 2c 20 72 65 74 75 d an error, retu
bea0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 rning in failure
beb0: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 ");...return(CAC
bec0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 KEY_PCSC_E_GENER
bed0: 49 43 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75 IC);.}..static u
bee0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 61 nsigned char *ca
bef0: 63 6b 65 79 5f 72 65 61 64 5f 62 65 72 74 6c 76 ckey_read_bertlv
bf00: 5f 74 61 67 28 75 6e 73 69 67 6e 65 64 20 63 68 _tag(unsigned ch
bf10: 61 72 20 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 ar *buffer, size
bf20: 5f 74 20 2a 62 75 66 66 65 72 5f 6c 65 6e 5f 70 _t *buffer_len_p
bf30: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 , unsigned char
bf40: 74 61 67 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 tag, unsigned ch
bf50: 61 72 20 2a 6f 75 74 62 75 66 66 65 72 2c 20 73 ar *outbuffer, s
bf60: 69 7a 65 5f 74 20 2a 6f 75 74 62 75 66 66 65 72 ize_t *outbuffer
bf70: 5f 6c 65 6e 5f 70 29 20 7b 0a 09 75 6e 73 69 67 _len_p) {..unsig
bf80: 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 ned char *buffer
bf90: 5f 70 3b 0a 09 73 69 7a 65 5f 74 20 6f 75 74 62 _p;..size_t outb
bfa0: 75 66 66 65 72 5f 6c 65 6e 2c 20 62 75 66 66 65 uffer_len, buffe
bfb0: 72 5f 6c 65 6e 3b 0a 09 73 69 7a 65 5f 74 20 73 r_len;..size_t s
bfc0: 69 7a 65 3b 0a 09 69 6e 74 20 69 64 78 3b 0a 0a ize;..int idx;..
bfd0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
bfe0: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
bff0: 0a 0a 09 69 66 20 28 62 75 66 66 65 72 5f 6c 65 ...if (buffer_le
c000: 6e 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 n_p == NULL) {..
c010: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
c020: 49 4e 54 46 28 22 62 75 66 66 65 72 5f 6c 65 6e INTF("buffer_len
c030: 5f 70 20 69 73 20 4e 55 4c 4c 2e 20 20 52 65 74 _p is NULL. Ret
c040: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 urning in failur
c050: 65 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 e.");....return(
c060: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 NULL);..}...if (
c070: 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20 outbuffer_len_p
c080: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 == NULL) {...CAC
c090: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
c0a0: 28 22 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 5f ("outbuffer_len_
c0b0: 70 20 69 73 20 4e 55 4c 4c 2e 20 20 52 65 74 75 p is NULL. Retu
c0c0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 rning in failure
c0d0: 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e .");....return(N
c0e0: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 62 75 66 66 65 ULL);..}...buffe
c0f0: 72 5f 6c 65 6e 20 3d 20 2a 6f 75 74 62 75 66 66 r_len = *outbuff
c100: 65 72 5f 6c 65 6e 5f 70 3b 0a 09 6f 75 74 62 75 er_len_p;..outbu
c110: 66 66 65 72 5f 6c 65 6e 20 3d 20 2a 6f 75 74 62 ffer_len = *outb
c120: 75 66 66 65 72 5f 6c 65 6e 5f 70 3b 0a 0a 09 69 uffer_len_p;...i
c130: 66 20 28 62 75 66 66 65 72 5f 6c 65 6e 20 3c 20 f (buffer_len <
c140: 32 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 2) {...CACKEY_DE
c150: 42 55 47 5f 50 52 49 4e 54 46 28 22 62 75 66 66 BUG_PRINTF("buff
c160: 65 72 5f 6c 65 6e 20 69 73 20 6c 65 73 73 20 74 er_len is less t
c170: 68 61 6e 20 32 2c 20 73 6f 20 77 65 20 63 61 6e han 2, so we can
c180: 27 74 20 72 65 61 64 20 61 6e 79 20 74 61 67 2e 't read any tag.
c190: 20 20 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 Returning in f
c1a0: 61 69 6c 75 72 65 2e 22 29 3b 0a 0a 09 09 72 65 ailure.");....re
c1b0: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a turn(NULL);..}..
c1c0: 09 62 75 66 66 65 72 5f 70 20 3d 20 62 75 66 66 .buffer_p = buff
c1d0: 65 72 3b 0a 09 69 66 20 28 62 75 66 66 65 72 5f er;..if (buffer_
c1e0: 70 5b 30 5d 20 21 3d 20 74 61 67 29 20 7b 0a 09 p[0] != tag) {..
c1f0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
c200: 49 4e 54 46 28 22 54 61 67 20 66 6f 75 6e 64 20 INTF("Tag found
c210: 77 61 73 20 6e 6f 74 20 74 61 67 20 65 78 70 65 was not tag expe
c220: 63 74 65 64 2e 20 20 54 61 67 20 3d 20 25 30 32 cted. Tag = %02
c230: 78 2c 20 45 78 70 65 63 74 65 64 20 3d 20 25 30 x, Expected = %0
c240: 32 78 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 69 2x. Returning i
c250: 6e 20 66 61 69 6c 75 72 65 2e 22 2c 20 28 75 6e n failure.", (un
c260: 73 69 67 6e 65 64 20 69 6e 74 29 20 62 75 66 66 signed int) buff
c270: 65 72 5f 70 5b 30 5d 2c 20 74 61 67 29 3b 0a 0a er_p[0], tag);..
c280: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a ..return(NULL);.
c290: 09 7d 0a 0a 09 62 75 66 66 65 72 5f 70 2b 2b 3b .}...buffer_p++;
c2a0: 0a 09 62 75 66 66 65 72 5f 6c 65 6e 2d 2d 3b 0a ..buffer_len--;.
c2b0: 0a 09 69 66 20 28 28 62 75 66 66 65 72 5f 70 5b ..if ((buffer_p[
c2c0: 30 5d 20 26 20 30 78 38 30 29 20 3d 3d 20 30 78 0] & 0x80) == 0x
c2d0: 38 30 29 20 7b 0a 09 09 73 69 7a 65 20 3d 20 30 80) {...size = 0
c2e0: 3b 0a 09 09 69 64 78 20 3d 20 28 62 75 66 66 65 ;...idx = (buffe
c2f0: 72 5f 70 5b 30 5d 20 26 20 30 78 37 66 29 3b 0a r_p[0] & 0x7f);.
c300: 0a 09 09 69 66 20 28 69 64 78 20 3e 20 62 75 66 ...if (idx > buf
c310: 66 65 72 5f 6c 65 6e 29 20 7b 0a 09 09 09 43 41 fer_len) {....CA
c320: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
c330: 46 28 22 4d 61 6c 66 6f 72 6d 65 64 20 42 45 52 F("Malformed BER
c340: 20 76 61 6c 75 65 20 2d 2d 20 6e 6f 74 20 65 6e value -- not en
c350: 6f 75 67 68 20 62 79 74 65 73 20 61 76 61 69 6c ough bytes avail
c360: 61 62 6c 65 20 74 6f 20 72 65 61 64 20 6c 65 6e able to read len
c370: 67 74 68 20 28 69 64 78 20 3d 20 25 69 2c 20 62 gth (idx = %i, b
c380: 75 66 66 65 72 5f 6c 65 6e 20 3d 20 25 6c 75 29 uffer_len = %lu)
c390: 22 2c 20 69 64 78 2c 20 28 75 6e 73 69 67 6e 65 ", idx, (unsigne
c3a0: 64 20 6c 6f 6e 67 29 20 62 75 66 66 65 72 5f 6c d long) buffer_l
c3b0: 65 6e 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 en);.....return(
c3c0: 4e 55 4c 4c 29 3b 0a 09 09 7d 0a 0a 09 09 66 6f NULL);...}....fo
c3d0: 72 20 28 3b 20 69 64 78 20 3e 20 30 3b 20 69 64 r (; idx > 0; id
c3e0: 78 2d 2d 29 20 7b 0a 09 09 09 62 75 66 66 65 72 x--) {....buffer
c3f0: 5f 70 2b 2b 3b 0a 09 09 09 62 75 66 66 65 72 5f _p++;....buffer_
c400: 6c 65 6e 2d 2d 3b 0a 0a 09 09 09 73 69 7a 65 20 len--;.....size
c410: 3c 3c 3d 20 38 3b 0a 09 09 09 73 69 7a 65 20 7c <<= 8;....size |
c420: 3d 20 62 75 66 66 65 72 5f 70 5b 30 5d 3b 0a 09 = buffer_p[0];..
c430: 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 73 .}..} else {...s
c440: 69 7a 65 20 3d 20 62 75 66 66 65 72 5f 70 5b 30 ize = buffer_p[0
c450: 5d 3b 0a 09 7d 0a 0a 09 62 75 66 66 65 72 5f 70 ];..}...buffer_p
c460: 2b 2b 3b 0a 09 62 75 66 66 65 72 5f 6c 65 6e 2d ++;..buffer_len-
c470: 2d 3b 0a 0a 09 69 66 20 28 73 69 7a 65 20 3e 20 -;...if (size >
c480: 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 29 20 7b outbuffer_len) {
c490: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
c4a0: 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 PRINTF("Unable t
c4b0: 6f 20 63 6f 70 79 20 76 61 6c 75 65 20 62 75 66 o copy value buf
c4c0: 66 65 72 20 74 6f 20 6f 75 74 62 75 66 66 65 72 fer to outbuffer
c4d0: 2c 20 6e 6f 74 20 65 6e 6f 75 67 68 20 72 6f 6f , not enough roo
c4e0: 6d 2e 20 20 56 61 6c 75 65 20 62 75 66 66 65 72 m. Value buffer
c4f0: 20 6c 65 6e 67 74 68 20 3d 20 25 6c 75 2c 20 6f length = %lu, o
c500: 75 74 20 62 75 66 66 65 72 20 6c 65 6e 67 74 68 ut buffer length
c510: 20 3d 20 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e = %lu", (unsign
c520: 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65 2c 20 28 ed long) size, (
c530: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f unsigned long) o
c540: 75 74 62 75 66 66 65 72 5f 6c 65 6e 29 3b 0a 0a utbuffer_len);..
c550: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a ..return(NULL);.
c560: 09 7d 0a 0a 09 2a 6f 75 74 62 75 66 66 65 72 5f .}...*outbuffer_
c570: 6c 65 6e 5f 70 20 3d 20 73 69 7a 65 3b 0a 09 69 len_p = size;..i
c580: 66 20 28 6f 75 74 62 75 66 66 65 72 29 20 7b 0a f (outbuffer) {.
c590: 09 09 6d 65 6d 63 70 79 28 6f 75 74 62 75 66 66 ..memcpy(outbuff
c5a0: 65 72 2c 20 62 75 66 66 65 72 5f 70 2c 20 73 69 er, buffer_p, si
c5b0: 7a 65 29 3b 0a 09 09 62 75 66 66 65 72 5f 70 20 ze);...buffer_p
c5c0: 2b 3d 20 73 69 7a 65 3b 0a 09 09 62 75 66 66 65 += size;...buffe
c5d0: 72 5f 6c 65 6e 20 2d 3d 20 73 69 7a 65 3b 0a 0a r_len -= size;..
c5e0: 09 09 2a 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20 ..*buffer_len_p
c5f0: 3d 20 62 75 66 66 65 72 5f 6c 65 6e 3b 0a 0a 09 = buffer_len;...
c600: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
c610: 49 4e 54 42 55 46 28 22 42 45 52 2d 54 4c 56 20 INTBUF("BER-TLV
c620: 72 65 73 75 6c 74 73 3a 22 2c 20 6f 75 74 62 75 results:", outbu
c630: 66 66 65 72 2c 20 73 69 7a 65 29 3b 0a 09 7d 20 ffer, size);..}
c640: 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 6d 6f 76 65 else {...memmove
c650: 28 62 75 66 66 65 72 2c 20 62 75 66 66 65 72 5f (buffer, buffer_
c660: 70 2c 20 73 69 7a 65 29 3b 0a 09 09 62 75 66 66 p, size);...buff
c670: 65 72 5f 70 20 3d 20 62 75 66 66 65 72 3b 0a 0a er_p = buffer;..
c680: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
c690: 52 49 4e 54 42 55 46 28 22 42 45 52 2d 54 4c 56 RINTBUF("BER-TLV
c6a0: 20 72 65 73 75 6c 74 73 3a 22 2c 20 62 75 66 66 results:", buff
c6b0: 65 72 2c 20 73 69 7a 65 29 3b 0a 09 7d 0a 0a 09 er, size);..}...
c6c0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
c6d0: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 NTF("Returning i
c6e0: 6e 20 73 75 63 63 65 73 73 2e 20 20 53 69 7a 65 n success. Size
c6f0: 20 6f 66 20 63 6f 6e 74 65 6e 74 73 20 66 6f 72 of contents for
c700: 20 74 61 67 20 25 30 32 78 20 69 73 20 25 6c 75 tag %02x is %lu
c710: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 ", (unsigned int
c720: 29 20 74 61 67 2c 20 28 75 6e 73 69 67 6e 65 64 ) tag, (unsigned
c730: 20 6c 6f 6e 67 29 20 73 69 7a 65 29 3b 0a 0a 09 long) size);...
c740: 72 65 74 75 72 6e 28 62 75 66 66 65 72 5f 70 29 return(buffer_p)
c750: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f ;.}../*. * SYNPO
c760: 53 49 53 0a 20 2a 20 20 20 20 20 73 73 69 7a 65 SIS. * ssize
c770: 5f 74 20 63 61 63 6b 65 79 5f 67 65 74 5f 64 61 _t cackey_get_da
c780: 74 61 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 ta(struct cackey
c790: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 _slot *slot, uns
c7a0: 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 igned char *buff
c7b0: 65 72 2c 20 73 69 7a 65 5f 74 20 62 75 66 66 65 er, size_t buffe
c7c0: 72 5f 6c 65 6e 2c 20 75 6e 73 69 67 6e 65 64 20 r_len, unsigned
c7d0: 63 68 61 72 20 6f 69 64 5b 33 5d 29 3b 0a 20 2a char oid[3]);. *
c7e0: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a . * ARGUMENTS. *
c7f0: 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63 6b struct cack
c800: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a ey_slot *slot. *
c810: 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f Slot to
c820: 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 send commands t
c830: 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 o. *. * unsi
c840: 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 gned char *buffe
c850: 72 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 r. * [OU
c860: 54 5d 20 42 75 66 66 65 72 0a 20 2a 0a 20 2a 20 T] Buffer. *. *
c870: 20 20 20 20 73 69 7a 65 5f 74 20 62 75 66 66 65 size_t buffe
c880: 72 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20 20 r_len. *
c890: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 Number of bytes
c8a0: 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 72 to attempt to r
c8b0: 65 61 64 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e ead. *. * un
c8c0: 73 69 67 6e 65 64 20 63 68 61 72 20 6f 69 64 5b signed char oid[
c8d0: 33 5d 0a 20 2a 20 20 20 20 20 20 20 20 20 33 2d 3]. * 3-
c8e0: 62 79 74 65 20 4f 49 44 20 74 6f 20 72 65 61 64 byte OID to read
c8f0: 0a 20 2a 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e . *. *. * RETURN
c900: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 54 68 VALUE. * Th
c910: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 is function retu
c920: 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f rns the number o
c930: 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 f bytes actually
c940: 20 72 65 61 64 2c 20 6f 72 20 2d 31 20 6f 6e 20 read, or -1 on
c950: 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 error.. *. * NOT
c960: 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 ES. * None.
c970: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 *. */.static ssi
c980: 7a 65 5f 74 20 63 61 63 6b 65 79 5f 67 65 74 5f ze_t cackey_get_
c990: 64 61 74 61 28 73 74 72 75 63 74 20 63 61 63 6b data(struct cack
c9a0: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 ey_slot *slot, u
c9b0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 nsigned char *bu
c9c0: 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 62 75 66 ffer, size_t buf
c9d0: 66 65 72 5f 6c 65 6e 2c 20 75 6e 73 69 67 6e 65 fer_len, unsigne
c9e0: 64 20 63 68 61 72 20 6f 69 64 5b 33 5d 29 20 7b d char oid[3]) {
c9f0: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 ..unsigned char
ca00: 63 6d 64 5b 5d 20 3d 20 7b 30 78 35 43 2c 20 30 cmd[] = {0x5C, 0
ca10: 78 30 33 2c 20 30 78 30 30 2c 20 30 78 30 30 2c x03, 0x00, 0x00,
ca20: 20 30 78 30 30 7d 3b 0a 09 75 6e 73 69 67 6e 65 0x00};..unsigne
ca30: 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 5f 70 d char *buffer_p
ca40: 3b 0a 09 73 69 7a 65 5f 74 20 69 6e 69 74 5f 62 ;..size_t init_b
ca50: 75 66 66 65 72 5f 6c 65 6e 2c 20 73 69 7a 65 3b uffer_len, size;
ca60: 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70 63 ..uint16_t respc
ca70: 6f 64 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 ode;..int send_r
ca80: 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 et;...CACKEY_DEB
ca90: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
caa0: 64 2e 22 29 3b 0a 0a 09 69 6e 69 74 5f 62 75 66 d.");...init_buf
cab0: 66 65 72 5f 6c 65 6e 20 3d 20 62 75 66 66 65 72 fer_len = buffer
cac0: 5f 6c 65 6e 3b 0a 0a 09 63 6d 64 5b 32 5d 20 3d _len;...cmd[2] =
cad0: 20 6f 69 64 5b 30 5d 3b 0a 09 63 6d 64 5b 33 5d oid[0];..cmd[3]
cae0: 20 3d 20 6f 69 64 5b 31 5d 3b 0a 09 63 6d 64 5b = oid[1];..cmd[
caf0: 34 5d 20 3d 20 6f 69 64 5b 32 5d 3b 0a 0a 09 2f 4] = oid[2];.../
cb00: 2a 20 32 35 36 20 74 6f 20 69 6e 64 69 63 61 74 * 256 to indicat
cb10: 65 20 74 68 65 20 6c 61 72 67 65 73 74 20 6d 65 e the largest me
cb20: 73 73 61 67 65 20 73 69 7a 65 20 2d 2d 20 6e 6f ssage size -- no
cb30: 74 20 63 6c 65 61 72 20 69 66 20 74 68 69 73 20 t clear if this
cb40: 77 69 6c 6c 20 77 6f 72 6b 20 77 69 74 68 20 61 will work with a
cb50: 6c 6c 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 09 ll messages */..
cb60: 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 send_ret = cacke
cb70: 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 y_send_apdu(slot
cb80: 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 , GSCIS_CLASS_IS
cb90: 4f 37 38 31 36 2c 20 4e 49 53 54 53 50 38 30 30 O7816, NISTSP800
cba0: 5f 37 33 5f 33 5f 49 4e 53 54 52 5f 47 45 54 5f _73_3_INSTR_GET_
cbb0: 44 41 54 41 2c 20 30 78 33 46 2c 20 30 78 46 46 DATA, 0x3F, 0xFF
cbc0: 2c 20 73 69 7a 65 6f 66 28 63 6d 64 29 2c 20 63 , sizeof(cmd), c
cbd0: 6d 64 2c 20 32 35 36 2c 20 26 72 65 73 70 63 6f md, 256, &respco
cbe0: 64 65 2c 20 62 75 66 66 65 72 2c 20 26 62 75 66 de, buffer, &buf
cbf0: 66 65 72 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 fer_len);...if (
cc00: 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b send_ret == CACK
cc10: 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29 EY_PCSC_E_RETRY)
cc20: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
cc30: 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20 53 G_PRINTF("ADPU S
cc40: 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 2c 20 72 ending failed, r
cc50: 65 74 72 79 69 6e 67 20 72 65 61 64 20 62 75 66 etrying read buf
cc60: 66 65 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e fer");....return
cc70: 28 63 61 63 6b 65 79 5f 67 65 74 5f 64 61 74 61 (cackey_get_data
cc80: 28 73 6c 6f 74 2c 20 62 75 66 66 65 72 2c 20 69 (slot, buffer, i
cc90: 6e 69 74 5f 62 75 66 66 65 72 5f 6c 65 6e 2c 20 nit_buffer_len,
cca0: 6f 69 64 29 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 oid));..}...if (
ccb0: 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b send_ret != CACK
ccc0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a EY_PCSC_S_OK) {.
ccd0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
cce0: 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 73 65 RINTF("cackey_se
ccf0: 6e 64 5f 61 70 64 75 28 29 20 66 61 69 6c 65 64 nd_apdu() failed
cd00: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 , returning in f
cd10: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 ailure");....ret
cd20: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 23 69 66 urn(-1);..}..#if
cd30: 64 65 66 20 43 41 43 4b 45 59 5f 50 41 52 41 4e def CACKEY_PARAN
cd40: 4f 49 44 0a 23 20 20 69 66 64 65 66 20 5f 50 4f OID.# ifdef _PO
cd50: 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69 SIX_SSIZE_MAX..i
cd60: 66 20 28 62 75 66 66 65 72 5f 6c 65 6e 20 3e 20 f (buffer_len >
cd70: 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 _POSIX_SSIZE_MAX
cd80: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
cd90: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 61 64 20 UG_PRINTF("Read
cda0: 62 79 74 65 73 20 28 62 75 66 66 65 72 5f 6c 65 bytes (buffer_le
cdb0: 6e 29 20 65 78 63 65 65 64 73 20 6d 61 78 69 6d n) exceeds maxim
cdc0: 75 6d 20 76 61 6c 75 65 2c 20 72 65 74 75 72 6e um value, return
cdd0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 ing in failure.
cde0: 28 6d 61 78 20 3d 20 25 6c 69 2c 20 62 75 66 66 (max = %li, buff
cdf0: 65 72 5f 6c 65 6e 20 3d 20 25 6c 75 29 22 2c 20 er_len = %lu)",
ce00: 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53 (long) _POSIX_SS
ce10: 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e IZE_MAX, (unsign
ce20: 65 64 20 6c 6f 6e 67 29 20 62 75 66 66 65 72 5f ed long) buffer_
ce30: 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 len);....return(
ce40: 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69 66 -1);..}.# endif
ce50: 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28 62 75 .#endif...if (bu
ce60: 66 66 65 72 5f 6c 65 6e 20 3c 20 32 29 20 7b 0a ffer_len < 2) {.
ce70: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
ce80: 52 49 4e 54 46 28 22 41 50 44 55 20 47 45 54 20 RINTF("APDU GET
ce90: 44 41 54 41 20 72 65 74 75 72 6e 65 64 20 25 6c DATA returned %l
cea0: 75 20 62 79 74 65 73 2c 20 77 68 69 63 68 20 69 u bytes, which i
ceb0: 73 20 74 6f 6f 20 73 68 6f 72 74 20 66 6f 72 20 s too short for
cec0: 61 20 42 45 52 2d 54 4c 56 20 72 65 73 70 6f 6e a BER-TLV respon
ced0: 73 65 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c se", (unsigned l
cee0: 6f 6e 67 29 20 62 75 66 66 65 72 5f 6c 65 6e 29 ong) buffer_len)
cef0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b ;....return(-1);
cf00: 0a 09 7d 0a 0a 09 73 69 7a 65 20 3d 20 62 75 66 ..}...size = buf
cf10: 66 65 72 5f 6c 65 6e 3b 0a 09 62 75 66 66 65 72 fer_len;..buffer
cf20: 5f 70 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 _p = cackey_read
cf30: 5f 62 65 72 74 6c 76 5f 74 61 67 28 62 75 66 66 _bertlv_tag(buff
cf40: 65 72 2c 20 26 62 75 66 66 65 72 5f 6c 65 6e 2c er, &buffer_len,
cf50: 20 30 78 35 33 2c 20 4e 55 4c 4c 2c 20 26 73 69 0x53, NULL, &si
cf60: 7a 65 29 3b 0a 0a 09 69 66 20 28 62 75 66 66 65 ze);...if (buffe
cf70: 72 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 r_p == NULL) {..
cf80: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
cf90: 49 4e 54 46 28 22 54 61 67 20 64 65 63 6f 64 69 INTF("Tag decodi
cfa0: 6e 67 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 ng failed, retur
cfb0: 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 2e 22 29 ning in error.")
cfc0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b ;....return(-1);
cfd0: 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 ..}...CACKEY_DEB
cfe0: 55 47 5f 50 52 49 4e 54 42 55 46 28 22 47 45 54 UG_PRINTBUF("GET
cff0: 20 44 41 54 41 20 72 65 73 75 6c 74 22 2c 20 62 DATA result", b
d000: 75 66 66 65 72 2c 20 73 69 7a 65 29 3b 0a 0a 09 uffer, size);...
d010: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
d020: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 NTF("Returning i
d030: 6e 20 73 75 63 63 65 73 73 2c 20 72 65 61 64 20 n success, read
d040: 25 6c 75 20 62 79 74 65 73 22 2c 20 28 75 6e 73 %lu bytes", (uns
d050: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65 igned long) size
d060: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 73 69 7a 65 );...return(size
d070: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 );.}../*. * SYNP
d080: 4f 53 49 53 0a 20 2a 20 20 20 20 20 73 73 69 7a OSIS. * ssiz
d090: 65 5f 74 20 63 61 63 6b 65 79 5f 72 65 61 64 5f e_t cackey_read_
d0a0: 62 75 66 66 65 72 28 73 74 72 75 63 74 20 63 61 buffer(struct ca
d0b0: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c ckey_slot *slot,
d0c0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
d0d0: 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 63 buffer, size_t c
d0e0: 6f 75 6e 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 ount, unsigned c
d0f0: 68 61 72 20 74 5f 6f 72 5f 76 2c 20 73 69 7a 65 har t_or_v, size
d100: 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 _t initial_offse
d110: 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 t);. *. * ARGUME
d120: 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63 NTS. * struc
d130: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 t cackey_slot *s
d140: 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 lot. * S
d150: 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d lot to send comm
d160: 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 ands to. *. *
d170: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 unsigned char
d180: 2a 62 75 66 66 65 72 0a 20 2a 20 20 20 20 20 20 *buffer. *
d190: 20 20 20 5b 4f 55 54 5d 20 42 75 66 66 65 72 0a [OUT] Buffer.
d1a0: 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 *. * size_t
d1b0: 20 63 6f 75 6e 74 0a 20 2a 20 20 20 20 20 20 20 count. *
d1c0: 20 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 Number of byte
d1d0: 73 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 s to attempt to
d1e0: 72 65 61 64 0a 20 2a 0a 20 2a 20 20 20 20 20 75 read. *. * u
d1f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 5f 6f nsigned char t_o
d200: 72 5f 76 0a 20 2a 20 20 20 20 20 20 20 20 20 53 r_v. * S
d210: 65 6c 65 63 74 20 74 68 65 20 54 2d 62 75 66 66 elect the T-buff
d220: 65 72 20 28 30 31 29 20 6f 72 20 56 2d 62 75 66 er (01) or V-buf
d230: 66 65 72 20 28 30 32 29 20 74 6f 20 72 65 61 64 fer (02) to read
d240: 20 66 72 6f 6d 2e 20 20 0a 20 2a 0a 20 2a 20 20 from. . *. *
d250: 20 20 20 73 69 7a 65 5f 74 20 69 6e 69 74 69 61 size_t initia
d260: 6c 5f 6f 66 66 73 65 74 0a 20 2a 20 20 20 20 20 l_offset. *
d270: 20 20 20 20 53 70 65 63 69 66 79 20 74 68 65 20 Specify the
d280: 6f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e 20 offset to begin
d290: 74 68 65 20 72 65 61 64 20 66 72 6f 6d 0a 20 2a the read from. *
d2a0: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 . *. * RETURN VA
d2b0: 4c 55 45 0a 20 2a 20 20 20 20 20 54 68 69 73 20 LUE. * This
d2c0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 function returns
d2d0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 the number of b
d2e0: 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 ytes actually re
d2f0: 61 64 2c 20 6f 72 20 2d 31 20 6f 6e 20 65 72 72 ad, or -1 on err
d300: 6f 72 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a or.. *. * NOTES.
d310: 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 * None. *.
d320: 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f */.static ssize_
d330: 74 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 t cackey_read_bu
d340: 66 66 65 72 28 73 74 72 75 63 74 20 63 61 63 6b ffer(struct cack
d350: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 ey_slot *slot, u
d360: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 nsigned char *bu
d370: 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 63 6f 75 ffer, size_t cou
d380: 6e 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nt, unsigned cha
d390: 72 20 74 5f 6f 72 5f 76 2c 20 73 69 7a 65 5f 74 r t_or_v, size_t
d3a0: 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 29 initial_offset)
d3b0: 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 {..unsigned cha
d3c0: 72 20 2a 69 6e 69 74 5f 62 75 66 66 65 72 3b 0a r *init_buffer;.
d3d0: 09 73 69 7a 65 5f 74 20 69 6e 69 74 5f 63 6f 75 .size_t init_cou
d3e0: 6e 74 3b 0a 09 73 69 7a 65 5f 74 20 69 6e 69 74 nt;..size_t init
d3f0: 5f 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 3b _initial_offset;
d400: 0a 0a 09 73 69 7a 65 5f 74 20 6f 66 66 73 65 74 ...size_t offset
d410: 20 3d 20 30 2c 20 6d 61 78 5f 6f 66 66 73 65 74 = 0, max_offset
d420: 2c 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09 75 6e , max_count;..un
d430: 73 69 67 6e 65 64 20 63 68 61 72 20 63 6d 64 5b signed char cmd[
d440: 32 5d 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 2];..uint16_t re
d450: 73 70 63 6f 64 65 3b 0a 09 69 6e 74 20 73 65 6e spcode;..int sen
d460: 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f d_ret;...CACKEY_
d470: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
d480: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 6e 69 74 5f lled.");...init_
d490: 62 75 66 66 65 72 20 3d 20 62 75 66 66 65 72 3b buffer = buffer;
d4a0: 0a 09 69 6e 69 74 5f 63 6f 75 6e 74 20 3d 20 63 ..init_count = c
d4b0: 6f 75 6e 74 3b 0a 09 69 6e 69 74 5f 69 6e 69 74 ount;..init_init
d4c0: 69 61 6c 5f 6f 66 66 73 65 74 20 3d 20 69 6e 69 ial_offset = ini
d4d0: 74 69 61 6c 5f 6f 66 66 73 65 74 3b 0a 0a 09 6d tial_offset;...m
d4e0: 61 78 5f 6f 66 66 73 65 74 20 3d 20 63 6f 75 6e ax_offset = coun
d4f0: 74 3b 0a 09 6d 61 78 5f 63 6f 75 6e 74 20 3d 20 t;..max_count =
d500: 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 3b CACKEY_APDU_MTU;
d510: 0a 0a 09 69 66 20 28 74 5f 6f 72 5f 76 20 21 3d ...if (t_or_v !=
d520: 20 31 20 26 26 20 74 5f 6f 72 5f 76 20 21 3d 20 1 && t_or_v !=
d530: 32 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 2) {...CACKEY_DE
d540: 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 BUG_PRINTF("Inva
d550: 6c 69 64 20 54 20 6f 72 20 56 20 70 61 72 61 6d lid T or V param
d560: 65 74 65 72 20 73 70 65 63 69 66 69 65 64 2c 20 eter specified,
d570: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 returning in fai
d580: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 lure");....retur
d590: 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 63 6d 64 5b n(-1);..}...cmd[
d5a0: 30 5d 20 3d 20 74 5f 6f 72 5f 76 3b 0a 0a 09 77 0] = t_or_v;...w
d5b0: 68 69 6c 65 20 28 31 29 20 7b 0a 09 09 69 66 20 hile (1) {...if
d5c0: 28 6f 66 66 73 65 74 20 3e 3d 20 6d 61 78 5f 6f (offset >= max_o
d5d0: 66 66 73 65 74 29 20 7b 0a 09 09 09 43 41 43 4b ffset) {....CACK
d5e0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
d5f0: 22 42 75 66 66 65 72 20 74 6f 6f 20 73 6d 61 6c "Buffer too smal
d600: 6c 2c 20 72 65 74 75 72 6e 69 6e 67 20 77 68 61 l, returning wha
d610: 74 20 77 65 20 67 6f 74 2e 2e 2e 22 29 3b 0a 0a t we got...");..
d620: 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 ...break;...}...
d630: 09 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 6f 66 66 .count = max_off
d640: 73 65 74 20 2d 20 6f 66 66 73 65 74 3b 0a 09 09 set - offset;...
d650: 69 66 20 28 63 6f 75 6e 74 20 3e 20 6d 61 78 5f if (count > max_
d660: 63 6f 75 6e 74 29 20 7b 0a 09 09 09 63 6f 75 6e count) {....coun
d670: 74 20 3d 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09 t = max_count;..
d680: 09 7d 0a 0a 09 09 63 6d 64 5b 31 5d 20 3d 20 63 .}....cmd[1] = c
d690: 6f 75 6e 74 3b 0a 0a 09 09 73 65 6e 64 5f 72 65 ount;....send_re
d6a0: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f t = cackey_send_
d6b0: 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 apdu(slot, GSCIS
d6c0: 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c _CLASS_GLOBAL_PL
d6d0: 41 54 46 4f 52 4d 2c 20 47 53 43 49 53 5f 49 4e ATFORM, GSCIS_IN
d6e0: 53 54 52 5f 52 45 41 44 5f 42 55 46 46 45 52 2c STR_READ_BUFFER,
d6f0: 20 28 28 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 ((initial_offse
d700: 74 20 2b 20 6f 66 66 73 65 74 29 20 3e 3e 20 38 t + offset) >> 8
d710: 29 20 26 20 30 78 66 66 2c 20 28 69 6e 69 74 69 ) & 0xff, (initi
d720: 61 6c 5f 6f 66 66 73 65 74 20 2b 20 6f 66 66 73 al_offset + offs
d730: 65 74 29 20 26 20 30 78 66 66 2c 20 73 69 7a 65 et) & 0xff, size
d740: 6f 66 28 63 6d 64 29 2c 20 63 6d 64 2c 20 30 78 of(cmd), cmd, 0x
d750: 30 30 2c 20 26 72 65 73 70 63 6f 64 65 2c 20 62 00, &respcode, b
d760: 75 66 66 65 72 20 2b 20 6f 66 66 73 65 74 2c 20 uffer + offset,
d770: 26 63 6f 75 6e 74 29 3b 0a 0a 09 09 69 66 20 28 &count);....if (
d780: 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b send_ret == CACK
d790: 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29 EY_PCSC_E_RETRY)
d7a0: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 {....CACKEY_DEB
d7b0: 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20 UG_PRINTF("ADPU
d7c0: 53 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 2c 20 Sending failed,
d7d0: 72 65 74 72 79 69 6e 67 20 72 65 61 64 20 62 75 retrying read bu
d7e0: 66 66 65 72 22 29 3b 0a 0a 09 09 09 72 65 74 75 ffer");.....retu
d7f0: 72 6e 28 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 rn(cackey_read_b
d800: 75 66 66 65 72 28 73 6c 6f 74 2c 20 69 6e 69 74 uffer(slot, init
d810: 5f 62 75 66 66 65 72 2c 20 69 6e 69 74 5f 63 6f _buffer, init_co
d820: 75 6e 74 2c 20 74 5f 6f 72 5f 76 2c 20 69 6e 69 unt, t_or_v, ini
d830: 74 5f 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 t_initial_offset
d840: 29 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 ));...}....if (s
d850: 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 end_ret != CACKE
d860: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 Y_PCSC_S_OK) {..
d870: 09 09 69 66 20 28 72 65 73 70 63 6f 64 65 20 3d ..if (respcode =
d880: 3d 20 30 78 36 41 38 36 29 20 7b 0a 09 09 09 09 = 0x6A86) {.....
d890: 69 66 20 28 6d 61 78 5f 63 6f 75 6e 74 20 3d 3d if (max_count ==
d8a0: 20 31 29 20 7b 0a 09 09 09 09 09 62 72 65 61 6b 1) {......break
d8b0: 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 6d 61 78 ;.....}......max
d8c0: 5f 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 63 6f 75 _count = max_cou
d8d0: 6e 74 20 2f 20 32 3b 0a 0a 09 09 09 09 63 6f 6e nt / 2;......con
d8e0: 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 tinue;....}.....
d8f0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
d900: 4e 54 46 28 22 63 61 63 6b 65 79 5f 73 65 6e 64 NTF("cackey_send
d910: 5f 61 70 64 75 28 29 20 66 61 69 6c 65 64 2c 20 _apdu() failed,
d920: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 returning in fai
d930: 6c 75 72 65 22 29 3b 0a 0a 09 09 09 72 65 74 75 lure");.....retu
d940: 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 6f rn(-1);...}....o
d950: 66 66 73 65 74 20 2b 3d 20 63 6f 75 6e 74 3b 0a ffset += count;.
d960: 0a 09 09 69 66 20 28 63 6f 75 6e 74 20 3c 20 6d ...if (count < m
d970: 61 78 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43 ax_count) {....C
d980: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
d990: 54 46 28 22 53 68 6f 72 74 20 72 65 61 64 20 2d TF("Short read -
d9a0: 2d 20 63 6f 75 6e 74 20 3d 20 25 69 2c 20 63 6d - count = %i, cm
d9b0: 64 5b 31 5d 20 3d 20 25 69 22 2c 20 28 69 6e 74 d[1] = %i", (int
d9c0: 29 20 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63 ) count, (int) c
d9d0: 6d 64 5b 31 5d 29 3b 0a 0a 09 09 09 62 72 65 61 md[1]);.....brea
d9e0: 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 k;...}..}..#ifde
d9f0: 66 20 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49 f CACKEY_PARANOI
da00: 44 0a 23 20 20 69 66 64 65 66 20 5f 50 4f 53 49 D.# ifdef _POSI
da10: 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20 X_SSIZE_MAX..if
da20: 28 6f 66 66 73 65 74 20 3e 20 5f 50 4f 53 49 58 (offset > _POSIX
da30: 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 _SSIZE_MAX) {...
da40: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
da50: 4e 54 46 28 22 4f 66 66 73 65 74 20 65 78 63 65 NTF("Offset exce
da60: 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 eds maximum valu
da70: 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 e, returning in
da80: 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20 failure. (max =
da90: 25 6c 69 2c 20 6f 66 66 73 65 74 20 3d 20 25 6c %li, offset = %l
daa0: 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 u)", (long) _POS
dab0: 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75 IX_SSIZE_MAX, (u
dac0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 66 nsigned long) of
dad0: 66 73 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e fset);....return
dae0: 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69 (-1);..}.# endi
daf0: 66 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 f.#endif...CACKE
db00: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
db10: 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 Returning in suc
db20: 63 65 73 73 2c 20 72 65 61 64 20 25 6c 75 20 62 cess, read %lu b
db30: 79 74 65 73 22 2c 20 28 75 6e 73 69 67 6e 65 64 ytes", (unsigned
db40: 20 6c 6f 6e 67 29 20 6f 66 66 73 65 74 29 3b 0a long) offset);.
db50: 0a 09 72 65 74 75 72 6e 28 6f 66 66 73 65 74 29 ..return(offset)
db60: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f ;.}../*. * SYNPO
db70: 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 SIS. * cacke
db80: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6c y_ret cackey_sel
db90: 65 63 74 5f 61 70 70 6c 65 74 28 73 74 72 75 63 ect_applet(struc
dba0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 t cackey_slot *s
dbb0: 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 lot, unsigned ch
dbc0: 61 72 20 2a 61 69 64 2c 20 73 69 7a 65 5f 74 20 ar *aid, size_t
dbd0: 61 69 64 5f 6c 65 6e 29 3b 0a 20 2a 0a 20 2a 20 aid_len);. *. *
dbe0: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 ARGUMENTS. *
dbf0: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 struct cackey_s
dc00: 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 lot *slot. *
dc10: 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e Slot to sen
dc20: 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a d commands to. *
dc30: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 . * unsigned
dc40: 20 63 68 61 72 20 2a 61 69 64 0a 20 2a 20 20 20 char *aid. *
dc50: 20 20 20 20 20 20 42 75 66 66 65 72 20 63 6f 6e Buffer con
dc60: 74 61 69 6e 69 6e 67 20 41 70 70 6c 65 74 20 49 taining Applet I
dc70: 44 20 74 6f 20 73 65 6c 65 63 74 0a 20 2a 0a 20 D to select. *.
dc80: 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 61 69 64 * size_t aid
dc90: 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 _len. *
dca0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 Number of bytes
dcb0: 69 6e 20 74 68 65 20 22 61 69 64 22 20 28 41 70 in the "aid" (Ap
dcc0: 70 6c 65 74 20 49 44 29 20 70 61 72 61 6d 65 74 plet ID) paramet
dcd0: 65 72 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 er. *. * RETURN
dce0: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 VALUE. * CAC
dcf0: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 KEY_PCSC_S_OK
dd00: 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 On success
dd10: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 . * CACKEY_P
dd20: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 CSC_E_GENERIC
dd30: 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 On error. *. *
dd40: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e NOTES. * Non
dd50: 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 e. *. */.static
dd60: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 cackey_ret cacke
dd70: 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 y_select_applet(
dd80: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c struct cackey_sl
dd90: 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e ot *slot, unsign
dda0: 65 64 20 63 68 61 72 20 2a 61 69 64 2c 20 73 69 ed char *aid, si
ddb0: 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 29 20 7b 0a ze_t aid_len) {.
ddc0: 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a .int send_ret;..
ddd0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
dde0: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
ddf0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
de00: 50 52 49 4e 54 42 55 46 28 22 53 65 6c 65 63 74 PRINTBUF("Select
de10: 69 6e 67 20 61 70 70 6c 65 74 3a 22 2c 20 61 69 ing applet:", ai
de20: 64 2c 20 61 69 64 5f 6c 65 6e 29 3b 0a 0a 09 73 d, aid_len);...s
de30: 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 end_ret = cackey
de40: 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c _send_apdu(slot,
de50: 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f GSCIS_CLASS_ISO
de60: 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 54 7816, GSCIS_INST
de70: 52 5f 53 45 4c 45 43 54 2c 20 47 53 43 49 53 5f R_SELECT, GSCIS_
de80: 50 41 52 41 4d 5f 53 45 4c 45 43 54 5f 41 50 50 PARAM_SELECT_APP
de90: 4c 45 54 2c 20 30 78 30 30 2c 20 61 69 64 5f 6c LET, 0x00, aid_l
dea0: 65 6e 2c 20 61 69 64 2c 20 30 78 30 30 2c 20 4e en, aid, 0x00, N
deb0: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 ULL, NULL, NULL)
dec0: 3b 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 ;...if (send_ret
ded0: 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f == CACKEY_PCSC_
dee0: 45 5f 52 45 54 52 59 29 20 7b 0a 09 09 43 41 43 E_RETRY) {...CAC
def0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
df00: 28 22 41 44 50 55 20 53 65 6e 64 69 6e 67 20 66 ("ADPU Sending f
df10: 61 69 6c 65 64 2c 20 72 65 74 72 79 69 6e 67 20 ailed, retrying
df20: 73 65 6c 65 63 74 20 61 70 70 6c 65 74 22 29 3b select applet");
df30: 0a 0a 09 09 72 65 74 75 72 6e 28 63 61 63 6b 65 ....return(cacke
df40: 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 y_select_applet(
df50: 73 6c 6f 74 2c 20 61 69 64 2c 20 61 69 64 5f 6c slot, aid, aid_l
df60: 65 6e 29 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 en));..}...if (s
df70: 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 end_ret != CACKE
df80: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 Y_PCSC_S_OK) {..
df90: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
dfa0: 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 INTF("Failed to
dfb0: 6f 70 65 6e 20 61 70 70 6c 65 74 2c 20 72 65 74 open applet, ret
dfc0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 urning in failur
dfd0: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 e");....return(C
dfe0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e ACKEY_PCSC_E_GEN
dff0: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b ERIC);..}...CACK
e000: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
e010: 22 53 75 63 63 65 73 73 66 75 6c 6c 79 20 73 65 "Successfully se
e020: 6c 65 63 74 65 64 20 66 69 6c 65 22 29 3b 0a 0a lected file");..
e030: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 .return(CACKEY_P
e040: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a CSC_S_OK);.}../*
e050: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 . * SYNPOSIS. *
e060: 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 cackey_ret c
e070: 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c ackey_select_fil
e080: 65 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f e(struct cackey_
e090: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74 slot *slot, uint
e0a0: 31 36 5f 74 20 65 66 29 3b 0a 20 2a 0a 20 2a 20 16_t ef);. *. *
e0b0: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 ARGUMENTS. *
e0c0: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 struct cackey_s
e0d0: 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 lot *slot. *
e0e0: 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e Slot to sen
e0f0: 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a d commands to. *
e100: 0a 20 2a 20 20 20 20 20 75 69 6e 74 31 36 5f 74 . * uint16_t
e110: 20 65 66 0a 20 2a 20 20 20 20 20 20 20 20 20 45 ef. * E
e120: 6c 65 6d 65 6e 74 61 6c 20 46 69 6c 65 20 74 6f lemental File to
e130: 20 73 65 6c 65 63 74 0a 20 2a 0a 20 2a 20 52 45 select. *. * RE
e140: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 TURN VALUE. *
e150: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f CACKEY_PCSC_S_
e160: 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 OK On su
e170: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 ccess. * CAC
e180: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 KEY_PCSC_E_GENER
e190: 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 IC On error.
e1a0: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 *. * NOTES. *
e1b0: 20 20 54 68 69 73 20 73 65 6c 65 63 74 73 20 61 This selects a
e1c0: 6e 20 45 6c 65 6d 65 6e 74 61 72 79 20 46 69 6c n Elementary Fil
e1d0: 65 20 28 45 46 29 20 75 6e 64 65 72 20 74 68 65 e (EF) under the
e1e0: 20 63 75 72 72 65 6e 74 6c 79 20 73 65 6c 65 63 currently selec
e1f0: 74 65 64 0a 20 2a 20 20 20 20 20 44 65 64 69 63 ted. * Dedic
e200: 61 74 65 64 20 46 69 6c 65 20 28 44 46 29 0a 20 ated File (DF).
e210: 2a 0a 20 2a 20 20 20 20 20 54 79 70 69 63 61 6c *. * Typical
e220: 6c 79 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 ly this is calle
e230: 64 20 61 66 74 65 72 20 73 65 6c 65 63 74 69 6e d after selectin
e240: 67 20 74 68 65 20 63 6f 72 72 65 63 74 20 41 70 g the correct Ap
e250: 70 6c 65 74 20 28 75 73 69 6e 67 0a 20 2a 20 20 plet (using. *
e260: 20 20 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 cackey_select
e270: 5f 61 70 70 6c 65 74 29 20 66 6f 72 20 56 4d 20 _applet) for VM
e280: 63 61 72 64 73 0a 20 2a 0a 20 2a 2f 0a 73 74 61 cards. *. */.sta
e290: 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 tic cackey_ret c
e2a0: 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c ackey_select_fil
e2b0: 65 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f e(struct cackey_
e2c0: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74 slot *slot, uint
e2d0: 31 36 5f 74 20 65 66 29 20 7b 0a 09 75 6e 73 69 16_t ef) {..unsi
e2e0: 67 6e 65 64 20 63 68 61 72 20 66 69 64 5f 62 75 gned char fid_bu
e2f0: 66 5b 32 5d 3b 0a 09 69 6e 74 20 73 65 6e 64 5f f[2];..int send_
e300: 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ret;...CACKEY_DE
e310: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
e320: 65 64 2e 22 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e ed.");.../* Open
e330: 20 74 68 65 20 65 6c 65 6d 65 6e 74 61 72 79 20 the elementary
e340: 66 69 6c 65 20 2a 2f 0a 09 66 69 64 5f 62 75 66 file */..fid_buf
e350: 5b 30 5d 20 3d 20 28 65 66 20 3e 3e 20 38 29 20 [0] = (ef >> 8)
e360: 26 20 30 78 66 66 3b 0a 09 66 69 64 5f 62 75 66 & 0xff;..fid_buf
e370: 5b 31 5d 20 3d 20 65 66 20 26 20 30 78 66 66 3b [1] = ef & 0xff;
e380: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
e390: 50 52 49 4e 54 46 28 22 53 65 6c 65 63 74 69 6e PRINTF("Selectin
e3a0: 67 20 66 69 6c 65 3a 20 25 30 34 6c 78 22 2c 20 g file: %04lx",
e3b0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
e3c0: 65 66 29 3b 0a 0a 09 73 65 6e 64 5f 72 65 74 20 ef);...send_ret
e3d0: 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 = cackey_send_ap
e3e0: 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 du(slot, GSCIS_C
e3f0: 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 LASS_ISO7816, GS
e400: 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54 CIS_INSTR_SELECT
e410: 2c 20 30 78 30 32 2c 20 30 78 30 43 2c 20 73 69 , 0x02, 0x0C, si
e420: 7a 65 6f 66 28 66 69 64 5f 62 75 66 29 2c 20 66 zeof(fid_buf), f
e430: 69 64 5f 62 75 66 2c 20 30 78 30 30 2c 20 4e 55 id_buf, 0x00, NU
e440: 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b LL, NULL, NULL);
e450: 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21 ..if (send_ret !
e460: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f = CACKEY_PCSC_S_
e470: 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 OK) {...CACKEY_D
e480: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69 EBUG_PRINTF("Fai
e490: 6c 65 64 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 led to open file
e4a0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 , returning in f
e4b0: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 ailure");....ret
e4c0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f urn(CACKEY_PCSC_
e4d0: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a E_GENERIC);..}..
e4e0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
e4f0: 49 4e 54 46 28 22 53 75 63 63 65 73 73 66 75 6c INTF("Successful
e500: 6c 79 20 73 65 6c 65 63 74 65 64 20 66 69 6c 65 ly selected file
e510: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 ");...return(CAC
e520: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a KEY_PCSC_S_OK);.
e530: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 }../*. * SYNPOSI
e540: 53 0a 20 2a 20 20 20 20 20 76 6f 69 64 20 63 61 S. * void ca
e550: 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 73 74 ckey_free_tlv(st
e560: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f ruct cackey_tlv_
e570: 65 6e 74 69 74 79 20 2a 72 6f 6f 74 29 3b 0a 20 entity *root);.
e580: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 *. * ARGUMENTS.
e590: 2a 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63 * struct cac
e5a0: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a key_tlv_entity *
e5b0: 72 6f 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 root. *
e5c0: 52 6f 6f 74 20 6f 66 20 74 68 65 20 54 4c 56 20 Root of the TLV
e5d0: 6c 69 73 74 20 74 6f 20 73 74 61 72 74 20 66 72 list to start fr
e5e0: 65 65 69 6e 67 0a 20 2a 0a 20 2a 20 52 45 54 55 eeing. *. * RETU
e5f0: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 RN VALUE. *
e600: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 None. *. * NOTES
e610: 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e . * This fun
e620: 63 74 69 6f 6e 20 66 72 65 65 73 20 74 68 65 20 ction frees the
e630: 54 4c 56 20 6c 69 6e 6b 65 64 20 6c 69 73 74 65 TLV linked liste
e640: 64 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 0a d returned from.
e650: 20 2a 20 20 20 20 20 22 63 61 63 6b 65 79 5f 72 * "cackey_r
e660: 65 61 64 5f 74 6c 76 22 0a 20 2a 0a 20 2a 2f 0a ead_tlv". *. */.
e670: 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b static void cack
e680: 65 79 5f 66 72 65 65 5f 74 6c 76 28 73 74 72 75 ey_free_tlv(stru
e690: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e ct cackey_tlv_en
e6a0: 74 69 74 79 20 2a 72 6f 6f 74 29 20 7b 0a 09 73 tity *root) {..s
e6b0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 truct cackey_tlv
e6c0: 5f 65 6e 74 69 74 79 20 2a 63 75 72 72 2c 20 2a _entity *curr, *
e6d0: 6e 65 78 74 3b 0a 0a 09 69 66 20 28 72 6f 6f 74 next;...if (root
e6e0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 == NULL) {...re
e6f0: 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 turn;..}...for (
e700: 63 75 72 72 20 3d 20 72 6f 6f 74 3b 20 63 75 72 curr = root; cur
e710: 72 3b 20 63 75 72 72 20 3d 20 6e 65 78 74 29 20 r; curr = next)
e720: 7b 0a 09 09 6e 65 78 74 20 3d 20 63 75 72 72 2d {...next = curr-
e730: 3e 5f 6e 65 78 74 3b 0a 0a 09 09 73 77 69 74 63 >_next;....switc
e740: 68 20 28 63 75 72 72 2d 3e 74 61 67 29 20 7b 0a h (curr->tag) {.
e750: 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 ...case GSCIS_TA
e760: 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 G_ACR_TABLE:....
e770: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 case GSCIS_TAG_C
e780: 45 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09 09 ERTIFICATE:.....
e790: 69 66 20 28 63 75 72 72 2d 3e 76 61 6c 75 65 29 if (curr->value)
e7a0: 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75 72 {......free(cur
e7b0: 72 2d 3e 76 61 6c 75 65 29 3b 0a 09 09 09 09 7d r->value);.....}
e7c0: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 .....break;....c
e7d0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 ase GSCIS_TAG_CA
e7e0: 52 44 55 52 4c 3a 0a 09 09 09 09 69 66 20 28 63 RDURL:.....if (c
e7f0: 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 urr->value_cardu
e800: 72 6c 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28 rl) {......free(
e810: 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 curr->value_card
e820: 75 72 6c 29 3b 0a 09 09 09 09 7d 0a 09 09 09 09 url);.....}.....
e830: 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 66 72 break;...}....fr
e840: 65 65 28 63 75 72 72 29 3b 0a 09 7d 0a 0a 09 72 ee(curr);..}...r
e850: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 eturn;.}../*. *
e860: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 SYNPOSIS. *
e870: 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 .... *. * ARGUME
e880: 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 NTS. * ....
e890: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 *. * RETURN VALU
e8a0: 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a E. * .... *.
e8b0: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 * NOTES. *
e8c0: 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 .... *. */.stati
e8d0: 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f c struct cackey_
e8e0: 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 61 63 6b tlv_entity *cack
e8f0: 65 79 5f 72 65 61 64 5f 74 6c 76 28 73 74 72 75 ey_read_tlv(stru
e900: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a ct cackey_slot *
e910: 73 6c 6f 74 29 20 7b 0a 09 73 74 72 75 63 74 20 slot) {..struct
e920: 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 cackey_tlv_entit
e930: 79 20 2a 63 75 72 72 5f 65 6e 74 69 74 79 2c 20 y *curr_entity,
e940: 2a 72 6f 6f 74 20 3d 20 4e 55 4c 4c 2c 20 2a 6c *root = NULL, *l
e950: 61 73 74 20 3d 20 4e 55 4c 4c 3b 0a 09 75 6e 73 ast = NULL;..uns
e960: 69 67 6e 65 64 20 63 68 61 72 20 74 6c 65 6e 5f igned char tlen_
e970: 62 75 66 5b 32 5d 2c 20 74 76 61 6c 5f 62 75 66 buf[2], tval_buf
e980: 5b 31 30 32 34 5d 2c 20 2a 74 76 61 6c 3b 0a 09 [1024], *tval;..
e990: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 76 6c unsigned char vl
e9a0: 65 6e 5f 62 75 66 5b 32 5d 2c 20 76 76 61 6c 5f en_buf[2], vval_
e9b0: 62 75 66 5b 38 31 39 32 5d 2c 20 2a 76 76 61 6c buf[8192], *vval
e9c0: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 ;..unsigned char
e9d0: 20 2a 74 6d 70 62 75 66 3b 0a 09 75 6e 73 69 67 *tmpbuf;..unsig
e9e0: 6e 65 64 20 6c 6f 6e 67 20 74 6d 70 62 75 66 6c ned long tmpbufl
e9f0: 65 6e 3b 0a 09 73 73 69 7a 65 5f 74 20 74 6c 65 en;..ssize_t tle
ea00: 6e 2c 20 76 6c 65 6e 3b 0a 09 73 73 69 7a 65 5f n, vlen;..ssize_
ea10: 74 20 72 65 61 64 5f 72 65 74 3b 0a 09 73 69 7a t read_ret;..siz
ea20: 65 5f 74 20 6f 66 66 73 65 74 5f 74 20 3d 20 30 e_t offset_t = 0
ea30: 2c 20 6f 66 66 73 65 74 5f 76 20 3d 20 30 3b 0a , offset_v = 0;.
ea40: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 .unsigned char t
ea50: 61 67 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 67 ag;..size_t leng
ea60: 74 68 3b 0a 23 69 66 64 65 66 20 48 41 56 45 5f th;.#ifdef HAVE_
ea70: 4c 49 42 5a 0a 09 69 6e 74 20 75 6e 63 6f 6d 70 LIBZ..int uncomp
ea80: 72 65 73 73 5f 72 65 74 3b 0a 23 65 6e 64 69 66 ress_ret;.#endif
ea90: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
eaa0: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
eab0: 29 3b 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20 );...read_ret =
eac0: 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 cackey_read_buff
ead0: 65 72 28 73 6c 6f 74 2c 20 74 6c 65 6e 5f 62 75 er(slot, tlen_bu
eae0: 66 2c 20 73 69 7a 65 6f 66 28 74 6c 65 6e 5f 62 f, sizeof(tlen_b
eaf0: 75 66 29 2c 20 31 2c 20 6f 66 66 73 65 74 5f 74 uf), 1, offset_t
eb00: 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74 );..if (read_ret
eb10: 20 21 3d 20 73 69 7a 65 6f 66 28 74 6c 65 6e 5f != sizeof(tlen_
eb20: 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 buf)) {...CACKEY
eb30: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
eb40: 65 61 64 20 66 61 69 6c 65 64 2c 20 72 65 74 75 ead failed, retu
eb50: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 rning in failure
eb60: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 ");....return(NU
eb70: 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 6c 65 6e 20 3d LL);..}...tlen =
eb80: 20 28 74 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c (tlen_buf[1] <<
eb90: 20 38 29 20 7c 20 74 6c 65 6e 5f 62 75 66 5b 30 8) | tlen_buf[0
eba0: 5d 3b 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20 ];...read_ret =
ebb0: 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 cackey_read_buff
ebc0: 65 72 28 73 6c 6f 74 2c 20 76 6c 65 6e 5f 62 75 er(slot, vlen_bu
ebd0: 66 2c 20 73 69 7a 65 6f 66 28 76 6c 65 6e 5f 62 f, sizeof(vlen_b
ebe0: 75 66 29 2c 20 32 2c 20 6f 66 66 73 65 74 5f 76 uf), 2, offset_v
ebf0: 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74 );..if (read_ret
ec00: 20 21 3d 20 73 69 7a 65 6f 66 28 76 6c 65 6e 5f != sizeof(vlen_
ec10: 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 buf)) {...CACKEY
ec20: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
ec30: 65 61 64 20 66 61 69 6c 65 64 2c 20 72 65 74 75 ead failed, retu
ec40: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 rning in failure
ec50: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 ");....return(NU
ec60: 4c 4c 29 3b 0a 09 7d 0a 0a 09 76 6c 65 6e 20 3d LL);..}...vlen =
ec70: 20 28 76 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c (vlen_buf[1] <<
ec80: 20 38 29 20 7c 20 76 6c 65 6e 5f 62 75 66 5b 30 8) | vlen_buf[0
ec90: 5d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 ];...CACKEY_DEBU
eca0: 47 5f 50 52 49 4e 54 46 28 22 54 61 67 20 4c 65 G_PRINTF("Tag Le
ecb0: 6e 67 74 68 20 3d 20 25 6c 75 2c 20 56 61 6c 75 ngth = %lu, Valu
ecc0: 65 20 4c 65 6e 67 74 68 20 3d 20 25 6c 75 22 2c e Length = %lu",
ecd0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
ece0: 20 74 6c 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64 tlen, (unsigned
ecf0: 20 6c 6f 6e 67 29 20 76 6c 65 6e 29 3b 0a 0a 09 long) vlen);...
ed00: 6f 66 66 73 65 74 5f 74 20 2b 3d 20 32 3b 0a 09 offset_t += 2;..
ed10: 6f 66 66 73 65 74 5f 76 20 2b 3d 20 32 3b 0a 0a offset_v += 2;..
ed20: 09 69 66 20 28 74 6c 65 6e 20 3e 20 73 69 7a 65 .if (tlen > size
ed30: 6f 66 28 74 76 61 6c 5f 62 75 66 29 29 20 7b 0a of(tval_buf)) {.
ed40: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
ed50: 52 49 4e 54 46 28 22 54 61 67 20 6c 65 6e 67 74 RINTF("Tag lengt
ed60: 68 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20 h is too large,
ed70: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 returning in fai
ed80: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 lure");....retur
ed90: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 n(NULL);..}...if
eda0: 20 28 76 6c 65 6e 20 3e 20 73 69 7a 65 6f 66 28 (vlen > sizeof(
edb0: 76 76 61 6c 5f 62 75 66 29 29 20 7b 0a 09 09 43 vval_buf)) {...C
edc0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
edd0: 54 46 28 22 56 61 6c 75 65 20 6c 65 6e 67 74 68 TF("Value length
ede0: 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20 72 is too large, r
edf0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c eturning in fail
ee00: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ure");....return
ee10: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61 (NULL);..}...rea
ee20: 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 d_ret = cackey_r
ee30: 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c ead_buffer(slot,
ee40: 20 74 76 61 6c 5f 62 75 66 2c 20 74 6c 65 6e 2c tval_buf, tlen,
ee50: 20 31 2c 20 6f 66 66 73 65 74 5f 74 29 3b 0a 09 1, offset_t);..
ee60: 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20 if (read_ret !=
ee70: 74 6c 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59 tlen) {...CACKEY
ee80: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 _DEBUG_PRINTF("U
ee90: 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20 65 6e nable to read en
eea0: 74 69 72 65 20 54 2d 62 75 66 66 65 72 2c 20 72 tire T-buffer, r
eeb0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c eturning in fail
eec0: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ure");....return
eed0: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61 (NULL);..}...rea
eee0: 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 d_ret = cackey_r
eef0: 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c ead_buffer(slot,
ef00: 20 76 76 61 6c 5f 62 75 66 2c 20 76 6c 65 6e 2c vval_buf, vlen,
ef10: 20 32 2c 20 6f 66 66 73 65 74 5f 76 29 3b 0a 09 2, offset_v);..
ef20: 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20 if (read_ret !=
ef30: 76 6c 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59 vlen) {...CACKEY
ef40: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 _DEBUG_PRINTF("U
ef50: 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20 65 6e nable to read en
ef60: 74 69 72 65 20 56 2d 62 75 66 66 65 72 2c 20 72 tire V-buffer, r
ef70: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c eturning in fail
ef80: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ure");....return
ef90: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 76 61 (NULL);..}...tva
efa0: 6c 20 3d 20 74 76 61 6c 5f 62 75 66 3b 0a 09 76 l = tval_buf;..v
efb0: 76 61 6c 20 3d 20 76 76 61 6c 5f 62 75 66 3b 0a val = vval_buf;.
efc0: 09 77 68 69 6c 65 20 28 74 6c 65 6e 20 3e 20 30 .while (tlen > 0
efd0: 20 26 26 20 76 6c 65 6e 20 3e 20 30 29 20 7b 0a && vlen > 0) {.
efe0: 09 09 74 61 67 20 3d 20 2a 74 76 61 6c 3b 0a 09 ..tag = *tval;..
eff0: 09 74 76 61 6c 2b 2b 3b 0a 09 09 74 6c 65 6e 2d .tval++;...tlen-
f000: 2d 3b 0a 0a 09 09 69 66 20 28 2a 74 76 61 6c 20 -;....if (*tval
f010: 3d 3d 20 30 78 66 66 29 20 7b 0a 09 09 09 6c 65 == 0xff) {....le
f020: 6e 67 74 68 20 3d 20 28 74 76 61 6c 5b 32 5d 20 ngth = (tval[2]
f030: 3c 3c 20 38 29 20 7c 20 74 76 61 6c 5b 31 5d 3b << 8) | tval[1];
f040: 0a 09 09 09 74 76 61 6c 20 2b 3d 20 33 3b 0a 09 ....tval += 3;..
f050: 09 09 74 6c 65 6e 20 2d 3d 20 33 3b 0a 09 09 7d ..tlen -= 3;...}
f060: 20 65 6c 73 65 20 7b 0a 09 09 09 6c 65 6e 67 74 else {....lengt
f070: 68 20 3d 20 2a 74 76 61 6c 3b 0a 09 09 09 74 76 h = *tval;....tv
f080: 61 6c 2b 2b 3b 0a 09 09 09 74 6c 65 6e 2d 2d 3b al++;....tlen--;
f090: 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 ...}....CACKEY_D
f0a0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67 EBUG_PRINTF("Tag
f0b0: 3a 20 25 73 20 28 25 30 32 78 29 22 2c 20 43 41 : %s (%02x)", CA
f0c0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f CKEY_DEBUG_FUNC_
f0d0: 54 41 47 5f 54 4f 5f 53 54 52 28 74 61 67 29 2c TAG_TO_STR(tag),
f0e0: 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 (unsigned int)
f0f0: 74 61 67 29 3b 0a 09 09 43 41 43 4b 45 59 5f 44 tag);...CACKEY_D
f100: 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 56 EBUG_PRINTBUF("V
f110: 61 6c 75 65 3a 22 2c 20 76 76 61 6c 2c 20 6c 65 alue:", vval, le
f120: 6e 67 74 68 29 3b 0a 0a 09 09 63 75 72 72 5f 65 ngth);....curr_e
f130: 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 ntity = NULL;...
f140: 73 77 69 74 63 68 20 28 74 61 67 29 20 7b 0a 09 switch (tag) {..
f150: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 ..case GSCIS_TAG
f160: 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09 09 63 75 _CARDURL:.....cu
f170: 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c rr_entity = mall
f180: 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f oc(sizeof(*curr_
f190: 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 63 75 entity));.....cu
f1a0: 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 rr_entity->value
f1b0: 5f 63 61 72 64 75 72 6c 20 3d 20 6d 61 6c 6c 6f _cardurl = mallo
f1c0: 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 c(sizeof(*curr_e
f1d0: 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 ntity->value_car
f1e0: 64 75 72 6c 29 29 3b 0a 0a 09 09 09 09 6d 65 6d durl));......mem
f1f0: 63 70 79 28 63 75 72 72 5f 65 6e 74 69 74 79 2d cpy(curr_entity-
f200: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e >value_cardurl->
f210: 72 69 64 2c 20 76 76 61 6c 2c 20 35 29 3b 0a 09 rid, vval, 5);..
f220: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e ...curr_entity->
f230: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 value_cardurl->a
f240: 70 70 74 79 70 65 20 3d 20 76 76 61 6c 5b 35 5d pptype = vval[5]
f250: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 ;.....curr_entit
f260: 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c y->value_cardurl
f270: 2d 3e 6f 62 6a 65 63 74 69 64 20 3d 20 28 76 76 ->objectid = (vv
f280: 61 6c 5b 36 5d 20 3c 3c 20 38 29 20 7c 20 76 76 al[6] << 8) | vv
f290: 61 6c 5b 37 5d 3b 0a 09 09 09 09 63 75 72 72 5f al[7];.....curr_
f2a0: 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 entity->value_ca
f2b0: 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 3d 20 28 rdurl->appid = (
f2c0: 76 76 61 6c 5b 38 5d 20 3c 3c 20 38 29 20 7c 20 vval[8] << 8) |
f2d0: 76 76 61 6c 5b 39 5d 3b 0a 0a 09 09 09 09 63 75 vval[9];......cu
f2e0: 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d rr_entity->tag =
f2f0: 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 tag;.....curr_e
f300: 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e ntity->_next = N
f310: 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b ULL;......break;
f320: 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 ....case GSCIS_T
f330: 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09 AG_ACR_TABLE:...
f340: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 ..curr_entity =
f350: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 malloc(sizeof(*c
f360: 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 09 09 urr_entity));...
f370: 09 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f ..tmpbuf = mallo
f380: 63 28 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 09 09 c(length);......
f390: 6d 65 6d 63 70 79 28 74 6d 70 62 75 66 2c 20 76 memcpy(tmpbuf, v
f3a0: 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 0a 09 val, length);...
f3b0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e ...curr_entity->
f3c0: 74 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 tag = tag;.....c
f3d0: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e 67 urr_entity->leng
f3e0: 74 68 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09 th = length;....
f3f0: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 .curr_entity->va
f400: 6c 75 65 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09 lue = tmpbuf;...
f410: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f ..curr_entity->_
f420: 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 next = NULL;....
f430: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 ..break;....case
f440: 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 GSCIS_TAG_CERTI
f450: 46 49 43 41 54 45 3a 0a 09 09 09 09 63 75 72 72 FICATE:.....curr
f460: 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 _entity = malloc
f470: 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e (sizeof(*curr_en
f480: 74 69 74 79 29 29 3b 0a 0a 23 69 66 64 65 66 20 tity));..#ifdef
f490: 48 41 56 45 5f 4c 49 42 5a 0a 09 09 09 09 74 6d HAVE_LIBZ.....tm
f4a0: 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 pbuflen = length
f4b0: 20 2a 20 32 3b 0a 09 09 09 09 74 6d 70 62 75 66 * 2;.....tmpbuf
f4c0: 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 66 = malloc(tmpbuf
f4d0: 6c 65 6e 29 3b 0a 0a 09 09 09 09 75 6e 63 6f 6d len);......uncom
f4e0: 70 72 65 73 73 5f 72 65 74 20 3d 20 75 6e 63 6f press_ret = unco
f4f0: 6d 70 72 65 73 73 28 74 6d 70 62 75 66 2c 20 26 mpress(tmpbuf, &
f500: 74 6d 70 62 75 66 6c 65 6e 2c 20 76 76 61 6c 2c tmpbuflen, vval,
f510: 20 6c 65 6e 67 74 68 29 3b 0a 09 09 09 09 69 66 length);.....if
f520: 20 28 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 (uncompress_ret
f530: 20 21 3d 20 5a 5f 4f 4b 29 20 7b 0a 09 09 09 09 != Z_OK) {.....
f540: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
f550: 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 INTF("Failed to
f560: 64 65 63 6f 6d 70 72 65 73 73 2c 20 75 6e 63 6f decompress, unco
f570: 6d 70 72 65 73 73 28 29 20 72 65 74 75 72 6e 65 mpress() returne
f580: 64 20 25 69 20 2d 2d 20 72 65 73 6f 72 74 69 6e d %i -- resortin
f590: 67 20 74 6f 20 64 69 72 65 63 74 20 63 6f 70 79 g to direct copy
f5a0: 22 2c 20 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 ", uncompress_re
f5b0: 74 29 3b 0a 0a 09 09 09 09 09 74 6d 70 62 75 66 t);.......tmpbuf
f5c0: 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 len = length;...
f5d0: 09 09 09 6d 65 6d 63 70 79 28 74 6d 70 62 75 66 ...memcpy(tmpbuf
f5e0: 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b , vval, length);
f5f0: 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b .....}......CACK
f600: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 EY_DEBUG_PRINTBU
f610: 46 28 22 44 65 63 6f 6d 70 72 65 73 73 65 64 20 F("Decompressed
f620: 74 6f 3a 22 2c 20 74 6d 70 62 75 66 2c 20 74 6d to:", tmpbuf, tm
f630: 70 62 75 66 6c 65 6e 29 3b 0a 23 65 6c 73 65 0a pbuflen);.#else.
f640: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
f650: 5f 50 52 49 4e 54 46 28 22 4d 69 73 73 69 6e 67 _PRINTF("Missing
f660: 20 5a 4c 49 42 20 53 75 70 70 6f 72 74 2c 20 74 ZLIB Support, t
f670: 68 69 73 20 63 65 72 74 69 66 69 63 61 74 65 20 his certificate
f680: 69 73 20 6c 69 6b 65 6c 79 20 75 73 65 6c 65 73 is likely useles
f690: 73 2e 2e 2e 22 29 3b 0a 0a 09 09 09 09 74 6d 70 s...");......tmp
f6a0: 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 3b buflen = length;
f6b0: 0a 09 09 09 09 6d 65 6d 63 70 79 28 74 6d 70 62 .....memcpy(tmpb
f6c0: 75 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 uf, vval, length
f6d0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 09 09 09 63 );.#endif......c
f6e0: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20 urr_entity->tag
f6f0: 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f = tag;.....curr_
f700: 65 6e 74 69 74 79 2d 3e 6c 65 6e 67 74 68 20 3d entity->length =
f710: 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 09 09 09 tmpbuflen;.....
f720: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c curr_entity->val
f730: 75 65 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09 ue = tmpbuf;....
f740: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e .curr_entity->_n
f750: 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 ext = NULL;.....
f760: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 .break;....case
f770: 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 53 31 35 GSCIS_TAG_PKCS15
f780: 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 :.....curr_entit
f790: 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f y = malloc(sizeo
f7a0: 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29 f(*curr_entity))
f7b0: 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 ;......curr_enti
f7c0: 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09 ty->tag = tag;..
f7d0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e ...curr_entity->
f7e0: 76 61 6c 75 65 5f 62 79 74 65 20 3d 20 76 76 61 value_byte = vva
f7f0: 6c 5b 30 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65 l[0];.....curr_e
f800: 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e ntity->_next = N
f810: 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b ULL;......break;
f820: 0a 09 09 7d 0a 0a 09 09 76 76 61 6c 20 2b 3d 20 ...}....vval +=
f830: 6c 65 6e 67 74 68 3b 0a 09 09 76 6c 65 6e 20 2d length;...vlen -
f840: 3d 20 6c 65 6e 67 74 68 3b 0a 0a 09 09 69 66 20 = length;....if
f850: 28 63 75 72 72 5f 65 6e 74 69 74 79 20 21 3d 20 (curr_entity !=
f860: 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28 72 NULL) {....if (r
f870: 6f 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 oot == NULL) {..
f880: 09 09 09 72 6f 6f 74 20 3d 20 63 75 72 72 5f 65 ...root = curr_e
f890: 6e 74 69 74 79 3b 0a 09 09 09 7d 0a 0a 09 09 09 ntity;....}.....
f8a0: 69 66 20 28 6c 61 73 74 20 21 3d 20 4e 55 4c 4c if (last != NULL
f8b0: 29 20 7b 0a 09 09 09 09 6c 61 73 74 2d 3e 5f 6e ) {.....last->_n
f8c0: 65 78 74 20 3d 20 63 75 72 72 5f 65 6e 74 69 74 ext = curr_entit
f8d0: 79 3b 0a 09 09 09 7d 0a 0a 09 09 09 6c 61 73 74 y;....}.....last
f8e0: 20 3d 20 63 75 72 72 5f 65 6e 74 69 74 79 3b 0a = curr_entity;.
f8f0: 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 ..}..}...return(
f900: 72 6f 6f 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 root);.}../*. *
f910: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 SYNPOSIS. *
f920: 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 .... *. * ARGUME
f930: 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 NTS. * ....
f940: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 *. * RETURN VALU
f950: 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a E. * .... *.
f960: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 * NOTES. *
f970: 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 .... *. */.stati
f980: 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72 c void cackey_fr
f990: 65 65 5f 63 65 72 74 73 28 73 74 72 75 63 74 20 ee_certs(struct
f9a0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e cackey_pcsc_iden
f9b0: 74 69 74 79 20 2a 73 74 61 72 74 2c 20 73 69 7a tity *start, siz
f9c0: 65 5f 74 20 63 6f 75 6e 74 2c 20 69 6e 74 20 66 e_t count, int f
f9d0: 72 65 65 5f 73 74 61 72 74 29 20 7b 0a 09 73 69 ree_start) {..si
f9e0: 7a 65 5f 74 20 69 64 78 3b 0a 0a 09 69 66 20 28 ze_t idx;...if (
f9f0: 73 74 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b start == NULL) {
fa00: 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 ...return;..}...
fa10: 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 for (idx = 0; id
fa20: 78 20 3c 20 63 6f 75 6e 74 3b 20 69 64 78 2b 2b x < count; idx++
fa30: 29 20 7b 0a 09 09 69 66 20 28 73 74 61 72 74 5b ) {...if (start[
fa40: 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 idx].certificate
fa50: 29 20 7b 0a 09 09 09 66 72 65 65 28 73 74 61 72 ) {....free(star
fa60: 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 t[idx].certifica
fa70: 74 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 te);...}..}...if
fa80: 20 28 66 72 65 65 5f 73 74 61 72 74 29 20 7b 0a (free_start) {.
fa90: 09 09 66 72 65 65 28 73 74 61 72 74 29 3b 0a 09 ..free(start);..
faa0: 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 }...return;.}..s
fab0: 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63 tatic struct cac
fac0: 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 key_pcsc_identit
fad0: 79 20 2a 63 61 63 6b 65 79 5f 63 6f 70 79 5f 63 y *cackey_copy_c
fae0: 65 72 74 73 28 73 74 72 75 63 74 20 63 61 63 6b erts(struct cack
faf0: 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 ey_pcsc_identity
fb00: 20 2a 64 65 73 74 2c 20 73 74 72 75 63 74 20 63 *dest, struct c
fb10: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 ackey_pcsc_ident
fb20: 69 74 79 20 2a 73 74 61 72 74 2c 20 73 69 7a 65 ity *start, size
fb30: 5f 74 20 63 6f 75 6e 74 29 20 7b 0a 09 73 69 7a _t count) {..siz
fb40: 65 5f 74 20 69 64 78 3b 0a 0a 09 69 66 20 28 73 e_t idx;...if (s
fb50: 74 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a tart == NULL) {.
fb60: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a ..return(NULL);.
fb70: 09 7d 0a 0a 09 69 66 20 28 64 65 73 74 20 3d 3d .}...if (dest ==
fb80: 20 4e 55 4c 4c 29 20 7b 0a 09 09 64 65 73 74 20 NULL) {...dest
fb90: 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 = malloc(sizeof(
fba0: 2a 64 65 73 74 29 20 2a 20 63 6f 75 6e 74 29 3b *dest) * count);
fbb0: 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d ..}...for (idx =
fbc0: 20 30 3b 20 69 64 78 20 3c 20 63 6f 75 6e 74 3b 0; idx < count;
fbd0: 20 69 64 78 2b 2b 29 20 7b 0a 09 09 64 65 73 74 idx++) {...dest
fbe0: 5b 69 64 78 5d 2e 69 64 5f 74 79 70 65 20 3d 20 [idx].id_type =
fbf0: 73 74 61 72 74 5b 69 64 78 5d 2e 69 64 5f 74 79 start[idx].id_ty
fc00: 70 65 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 64 pe;....switch (d
fc10: 65 73 74 5b 69 64 78 5d 2e 69 64 5f 74 79 70 65 est[idx].id_type
fc20: 29 20 7b 0a 09 09 09 63 61 73 65 20 43 41 43 4b ) {....case CACK
fc30: 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a 0a EY_ID_TYPE_CAC:.
fc40: 09 09 09 09 6d 65 6d 63 70 79 28 64 65 73 74 5b ....memcpy(dest[
fc50: 69 64 78 5d 2e 63 61 72 64 2e 63 61 63 2e 61 70 idx].card.cac.ap
fc60: 70 6c 65 74 2c 20 73 74 61 72 74 5b 69 64 78 5d plet, start[idx]
fc70: 2e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 .card.cac.applet
fc80: 2c 20 73 69 7a 65 6f 66 28 64 65 73 74 5b 69 64 , sizeof(dest[id
fc90: 78 5d 2e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c x].card.cac.appl
fca0: 65 74 29 29 3b 0a 09 09 09 09 64 65 73 74 5b 69 et));.....dest[i
fcb0: 64 78 5d 2e 63 61 72 64 2e 63 61 63 2e 66 69 6c dx].card.cac.fil
fcc0: 65 20 3d 20 73 74 61 72 74 5b 69 64 78 5d 2e 63 e = start[idx].c
fcd0: 61 72 64 2e 63 61 63 2e 66 69 6c 65 3b 0a 09 09 ard.cac.file;...
fce0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 ..break;....case
fcf0: 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f CACKEY_ID_TYPE_
fd00: 50 49 56 3a 0a 09 09 09 09 64 65 73 74 5b 69 64 PIV:.....dest[id
fd10: 78 5d 2e 63 61 72 64 2e 70 69 76 2e 6b 65 79 5f x].card.piv.key_
fd20: 69 64 20 3d 20 73 74 61 72 74 5b 69 64 78 5d 2e id = start[idx].
fd30: 63 61 72 64 2e 70 69 76 2e 6b 65 79 5f 69 64 3b card.piv.key_id;
fd40: 0a 09 09 09 09 6d 65 6d 63 70 79 28 64 65 73 74 .....memcpy(dest
fd50: 5b 69 64 78 5d 2e 63 61 72 64 2e 70 69 76 2e 6c [idx].card.piv.l
fd60: 61 62 65 6c 2c 20 73 74 61 72 74 5b 69 64 78 5d abel, start[idx]
fd70: 2e 63 61 72 64 2e 70 69 76 2e 6c 61 62 65 6c 2c .card.piv.label,
fd80: 20 73 69 7a 65 6f 66 28 64 65 73 74 5b 69 64 78 sizeof(dest[idx
fd90: 5d 2e 63 61 72 64 2e 70 69 76 2e 6c 61 62 65 6c ].card.piv.label
fda0: 29 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 ));.....break;..
fdb0: 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 ..case CACKEY_ID
fdc0: 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 3a _TYPE_CERT_ONLY:
fdd0: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a .....break;...}.
fde0: 09 09 64 65 73 74 5b 69 64 78 5d 2e 63 65 72 74 ..dest[idx].cert
fdf0: 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 73 74 ificate_len = st
fe00: 61 72 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 art[idx].certifi
fe10: 63 61 74 65 5f 6c 65 6e 3b 0a 09 09 64 65 73 74 cate_len;...dest
fe20: 5b 69 64 78 5d 2e 6b 65 79 73 69 7a 65 20 3d 20 [idx].keysize =
fe30: 73 74 61 72 74 5b 69 64 78 5d 2e 6b 65 79 73 69 start[idx].keysi
fe40: 7a 65 3b 0a 0a 09 09 64 65 73 74 5b 69 64 78 5d ze;....dest[idx]
fe50: 2e 63 65 72 74 69 66 69 63 61 74 65 20 3d 20 6d .certificate = m
fe60: 61 6c 6c 6f 63 28 64 65 73 74 5b 69 64 78 5d 2e alloc(dest[idx].
fe70: 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 certificate_len)
fe80: 3b 0a 09 09 6d 65 6d 63 70 79 28 64 65 73 74 5b ;...memcpy(dest[
fe90: 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 idx].certificate
fea0: 2c 20 73 74 61 72 74 5b 69 64 78 5d 2e 63 65 72 , start[idx].cer
feb0: 74 69 66 69 63 61 74 65 2c 20 64 65 73 74 5b 69 tificate, dest[i
fec0: 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f dx].certificate_
fed0: 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 len);..}...retur
fee0: 6e 28 64 65 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 n(dest);.}../*.
fef0: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 * SYNPOSIS. *
ff00: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 .... *. * ARGU
ff10: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e MENTS. * ...
ff20: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 . *. * RETURN VA
ff30: 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 LUE. * ....
ff40: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 *. * NOTES. *
ff50: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 .... *. */.sta
ff60: 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 tic struct cacke
ff70: 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 y_pcsc_identity
ff80: 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 *cackey_read_cer
ff90: 74 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 ts(struct cackey
ffa0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 73 74 72 _slot *slot, str
ffb0: 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f uct cackey_pcsc_
ffc0: 69 64 65 6e 74 69 74 79 20 2a 63 65 72 74 73 2c identity *certs,
ffd0: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a unsigned long *
ffe0: 63 6f 75 6e 74 29 20 7b 0a 09 73 74 72 75 63 74 count) {..struct
fff0: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 cackey_pcsc_ide
10000 6e 74 69 74 79 20 2a 63 75 72 72 5f 69 64 3b 0a ntity *curr_id;.
10010 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 .struct cackey_t
10020 6c 76 5f 65 6e 74 69 74 79 20 2a 63 63 63 5f 74 lv_entity *ccc_t
10030 6c 76 2c 20 2a 63 63 63 5f 63 75 72 72 2c 20 2a lv, *ccc_curr, *
10040 61 70 70 5f 74 6c 76 2c 20 2a 61 70 70 5f 63 75 app_tlv, *app_cu
10050 72 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 rr;..unsigned ch
10060 61 72 20 63 63 63 5f 61 69 64 5b 5d 20 3d 20 7b ar ccc_aid[] = {
10070 47 53 43 49 53 5f 41 49 44 5f 43 43 43 7d 2c 20 GSCIS_AID_CCC},
10080 70 69 76 5f 61 69 64 5b 5d 20 3d 20 7b 4e 49 53 piv_aid[] = {NIS
10090 54 53 50 38 30 30 5f 37 33 5f 33 5f 50 49 56 5f TSP800_73_3_PIV_
100a0 41 49 44 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 AID};..unsigned
100b0 63 68 61 72 20 2a 70 69 76 5f 6f 69 64 2c 20 70 char *piv_oid, p
100c0 69 76 5f 6f 69 64 5f 70 69 76 61 75 74 68 5b 5d iv_oid_pivauth[]
100d0 20 3d 20 7b 4e 49 53 54 53 50 38 30 30 5f 37 33 = {NISTSP800_73
100e0 5f 33 5f 4f 49 44 5f 50 49 56 41 55 54 48 7d 2c _3_OID_PIVAUTH},
100f0 20 70 69 76 5f 6f 69 64 5f 73 69 67 6e 61 74 75 piv_oid_signatu
10100 72 65 5b 5d 20 3d 20 7b 4e 49 53 54 53 50 38 30 re[] = {NISTSP80
10110 30 5f 37 33 5f 33 5f 4f 49 44 5f 53 49 47 4e 41 0_73_3_OID_SIGNA
10120 54 55 52 45 7d 2c 20 70 69 76 5f 6f 69 64 5f 6b TURE}, piv_oid_k
10130 65 79 6d 67 74 5b 5d 20 3d 20 7b 4e 49 53 54 53 eymgt[] = {NISTS
10140 50 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 4b 45 P800_73_3_OID_KE
10150 59 4d 47 54 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 YMGT};..unsigned
10160 20 63 68 61 72 20 63 75 72 72 5f 61 69 64 5b 37 char curr_aid[7
10170 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 ];..unsigned cha
10180 72 20 62 75 66 66 65 72 5b 38 31 39 32 5d 2c 20 r buffer[8192],
10190 2a 62 75 66 66 65 72 5f 70 2c 20 2a 74 6d 70 62 *buffer_p, *tmpb
101a0 75 66 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f uf;..unsigned lo
101b0 6e 67 20 6f 75 74 69 64 78 20 3d 20 30 3b 0a 09 ng outidx = 0;..
101c0 63 68 61 72 20 2a 70 69 76 5f 6c 61 62 65 6c 3b char *piv_label;
101d0 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 74 72 61 ..cackey_ret tra
101e0 6e 73 61 63 74 69 6f 6e 5f 72 65 74 3b 0a 09 73 nsaction_ret;..s
101f0 73 69 7a 65 5f 74 20 72 65 61 64 5f 72 65 74 3b size_t read_ret;
10200 0a 09 73 69 7a 65 5f 74 20 62 75 66 66 65 72 5f ..size_t buffer_
10210 6c 65 6e 2c 20 74 6d 70 62 75 66 6c 65 6e 3b 0a len, tmpbuflen;.
10220 09 69 6e 74 20 63 65 72 74 73 5f 72 65 73 69 7a .int certs_resiz
10230 61 62 6c 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f able;..int send_
10240 72 65 74 2c 20 73 65 6c 65 63 74 5f 72 65 74 3b ret, select_ret;
10250 0a 09 69 6e 74 20 70 69 76 5f 6b 65 79 2c 20 70 ..int piv_key, p
10260 69 76 20 3d 20 30 3b 0a 09 69 6e 74 20 69 64 78 iv = 0;..int idx
10270 3b 0a 23 69 66 64 65 66 20 48 41 56 45 5f 4c 49 ;.#ifdef HAVE_LI
10280 42 5a 0a 09 69 6e 74 20 75 6e 63 6f 6d 70 72 65 BZ..int uncompre
10290 73 73 5f 72 65 74 3b 0a 09 7a 5f 73 74 72 65 61 ss_ret;..z_strea
102a0 6d 20 67 7a 69 70 5f 73 74 72 65 61 6d 3b 0a 23 m gzip_stream;.#
102b0 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 endif...CACKEY_D
102c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
102d0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 6f led.");...if (co
102e0 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 unt == NULL) {..
102f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
10300 49 4e 54 46 28 22 63 6f 75 6e 74 20 69 73 20 4e INTF("count is N
10310 55 4c 4c 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 ULL, returning i
10320 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 n failure");....
10330 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d return(NULL);..}
10340 0a 0a 09 69 66 20 28 63 65 72 74 73 20 21 3d 20 ...if (certs !=
10350 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28 2a 63 NULL) {...if (*c
10360 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 09 ount == 0) {....
10370 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
10380 4e 54 46 28 22 52 65 71 75 65 73 74 65 64 20 77 NTF("Requested w
10390 65 20 72 65 74 75 72 6e 20 30 20 6f 62 6a 65 63 e return 0 objec
103a0 74 73 2c 20 73 68 6f 72 74 2d 63 69 72 63 75 69 ts, short-circui
103b0 74 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 t");.....return(
103c0 63 65 72 74 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a certs);...}..}..
103d0 09 69 66 20 28 21 73 6c 6f 74 2d 3e 73 6c 6f 74 .if (!slot->slot
103e0 5f 72 65 73 65 74 29 20 7b 0a 09 09 69 66 20 28 _reset) {...if (
103f0 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 slot->cached_cer
10400 74 73 29 20 7b 0a 09 09 09 69 66 20 28 63 65 72 ts) {....if (cer
10410 74 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 ts == NULL) {...
10420 09 09 63 65 72 74 73 20 3d 20 6d 61 6c 6c 6f 63 ..certs = malloc
10430 28 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 (sizeof(*certs)
10440 2a 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 * slot->cached_c
10450 65 72 74 73 5f 63 6f 75 6e 74 29 3b 0a 09 09 09 erts_count);....
10460 09 2a 63 6f 75 6e 74 20 3d 20 73 6c 6f 74 2d 3e .*count = slot->
10470 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 cached_certs_cou
10480 6e 74 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a nt;....} else {.
10490 09 09 09 09 69 66 20 28 2a 63 6f 75 6e 74 20 3e ....if (*count >
104a0 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 slot->cached_ce
104b0 72 74 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 rts_count) {....
104c0 09 09 2a 63 6f 75 6e 74 20 3d 20 73 6c 6f 74 2d ..*count = slot-
104d0 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f >cached_certs_co
104e0 75 6e 74 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a unt;.....}....}.
104f0 0a 09 09 09 63 61 63 6b 65 79 5f 63 6f 70 79 5f ....cackey_copy_
10500 63 65 72 74 73 28 63 65 72 74 73 2c 20 73 6c 6f certs(certs, slo
10510 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 2c t->cached_certs,
10520 20 2a 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 72 65 *count);.....re
10530 74 75 72 6e 28 63 65 72 74 73 29 3b 0a 09 09 7d turn(certs);...}
10540 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e ..}...if (slot->
10550 63 61 63 68 65 64 5f 63 65 72 74 73 29 20 7b 0a cached_certs) {.
10560 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 ..cackey_free_ce
10570 72 74 73 28 73 6c 6f 74 2d 3e 63 61 63 68 65 64 rts(slot->cached
10580 5f 63 65 72 74 73 2c 20 73 6c 6f 74 2d 3e 63 61 _certs, slot->ca
10590 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 ched_certs_count
105a0 2c 20 31 29 3b 0a 0a 09 09 73 6c 6f 74 2d 3e 63 , 1);....slot->c
105b0 61 63 68 65 64 5f 63 65 72 74 73 20 3d 20 4e 55 ached_certs = NU
105c0 4c 4c 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 LL;..}.../* Begi
105d0 6e 20 61 20 53 6d 61 72 74 43 61 72 64 20 74 72 n a SmartCard tr
105e0 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 74 72 ansaction */..tr
105f0 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74 20 3d 20 ansaction_ret =
10600 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 cackey_begin_tra
10610 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a nsaction(slot);.
10620 09 69 66 20 28 74 72 61 6e 73 61 63 74 69 6f 6e .if (transaction
10630 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 _ret != CACKEY_P
10640 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 CSC_S_OK) {...CA
10650 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
10660 46 28 22 55 6e 61 62 6c 65 20 62 65 67 69 6e 20 F("Unable begin
10670 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 transaction, ret
10680 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 urning in failur
10690 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e e");....return(N
106a0 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 ULL);..}.../* Se
106b0 6c 65 63 74 20 74 68 65 20 43 43 43 20 41 70 70 lect the CCC App
106c0 6c 65 74 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74 let */..send_ret
106d0 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 = cackey_select
106e0 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63 63 _applet(slot, cc
106f0 63 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 63 63 c_aid, sizeof(cc
10700 63 5f 61 69 64 29 29 3b 0a 09 69 66 20 28 73 65 c_aid));..if (se
10710 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 nd_ret != CACKEY
10720 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 _PCSC_S_OK) {...
10730 2f 2a 20 54 72 79 20 50 49 56 20 61 70 70 6c 69 /* Try PIV appli
10740 63 61 74 69 6f 6e 20 2a 2f 0a 09 09 73 65 6e 64 cation */...send
10750 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 _ret = cackey_se
10760 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 lect_applet(slot
10770 2c 20 70 69 76 5f 61 69 64 2c 20 73 69 7a 65 6f , piv_aid, sizeo
10780 66 28 70 69 76 5f 61 69 64 29 29 3b 0a 09 09 69 f(piv_aid));...i
10790 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 f (send_ret == C
107a0 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 ACKEY_PCSC_S_OK)
107b0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 {....CACKEY_DEB
107c0 55 47 5f 50 52 49 4e 54 46 28 22 57 65 20 68 61 UG_PRINTF("We ha
107d0 76 65 20 61 20 50 49 56 20 63 61 72 64 20 2d 2d ve a PIV card --
107e0 20 6e 6f 74 20 75 73 69 6e 67 20 74 68 65 20 43 not using the C
107f0 43 43 2c 20 70 75 6c 6c 69 6e 67 20 70 72 65 2d CC, pulling pre-
10800 73 65 6c 65 63 74 65 64 20 6b 65 79 73 22 29 3b selected keys");
10810 0a 0a 09 09 09 70 69 76 20 3d 20 31 3b 0a 09 09 .....piv = 1;...
10820 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b } else {....CACK
10830 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
10840 22 55 6e 61 62 6c 65 20 74 6f 20 73 65 6c 65 63 "Unable to selec
10850 74 20 43 43 43 20 41 70 70 6c 65 74 2c 20 72 65 t CCC Applet, re
10860 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 turning in failu
10870 72 65 22 29 3b 0a 0a 09 09 09 2f 2a 20 54 65 72 re");...../* Ter
10880 6d 69 6e 61 74 65 20 53 6d 61 72 74 43 61 72 64 minate SmartCard
10890 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a Transaction */.
108a0 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 ...cackey_end_tr
108b0 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b ansaction(slot);
108c0 0a 0a 09 09 09 69 66 20 28 63 65 72 74 73 20 3d .....if (certs =
108d0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 2a 63 = NULL) {.....*c
108e0 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 09 7d 0a 0a ount = 0;....}..
108f0 09 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b ...return(NULL);
10900 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 63 65 ...}..}...if (ce
10910 72 74 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 rts == NULL) {..
10920 09 63 65 72 74 73 20 3d 20 6d 61 6c 6c 6f 63 28 .certs = malloc(
10930 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 2a sizeof(*certs) *
10940 20 35 29 3b 0a 09 09 2a 63 6f 75 6e 74 20 3d 20 5);...*count =
10950 35 3b 0a 09 09 63 65 72 74 73 5f 72 65 73 69 7a 5;...certs_resiz
10960 61 62 6c 65 20 3d 20 31 3b 0a 09 7d 20 65 6c 73 able = 1;..} els
10970 65 20 7b 0a 09 09 63 65 72 74 73 5f 72 65 73 69 e {...certs_resi
10980 7a 61 62 6c 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 zable = 0;..}...
10990 69 66 20 28 70 69 76 29 20 7b 0a 09 09 66 6f 72 if (piv) {...for
109a0 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c (idx = 0; idx <
109b0 20 33 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 09 3; idx++) {....
109c0 73 77 69 74 63 68 20 28 69 64 78 29 20 7b 0a 09 switch (idx) {..
109d0 09 09 09 63 61 73 65 20 30 3a 0a 09 09 09 09 09 ...case 0:......
109e0 70 69 76 5f 6f 69 64 20 3d 20 70 69 76 5f 6f 69 piv_oid = piv_oi
109f0 64 5f 70 69 76 61 75 74 68 3b 0a 09 09 09 09 09 d_pivauth;......
10a00 70 69 76 5f 6b 65 79 20 3d 20 4e 49 53 54 53 50 piv_key = NISTSP
10a10 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 50 49 56 800_78_3_KEY_PIV
10a20 41 55 54 48 3b 0a 09 09 09 09 09 70 69 76 5f 6c AUTH;......piv_l
10a30 61 62 65 6c 20 3d 20 22 41 75 74 68 65 6e 74 69 abel = "Authenti
10a40 63 61 74 69 6f 6e 22 3b 0a 09 09 09 09 09 62 72 cation";......br
10a50 65 61 6b 3b 0a 09 09 09 09 63 61 73 65 20 31 3a eak;.....case 1:
10a60 0a 09 09 09 09 09 70 69 76 5f 6f 69 64 20 3d 20 ......piv_oid =
10a70 70 69 76 5f 6f 69 64 5f 73 69 67 6e 61 74 75 72 piv_oid_signatur
10a80 65 3b 0a 09 09 09 09 09 70 69 76 5f 6b 65 79 20 e;......piv_key
10a90 3d 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33 = NISTSP800_78_3
10aa0 5f 4b 45 59 5f 53 49 47 4e 41 54 55 52 45 3b 0a _KEY_SIGNATURE;.
10ab0 09 09 09 09 09 70 69 76 5f 6c 61 62 65 6c 20 3d .....piv_label =
10ac0 20 22 53 69 67 6e 61 74 75 72 65 22 3b 0a 09 09 "Signature";...
10ad0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 63 61 ...break;.....ca
10ae0 73 65 20 32 3a 0a 09 09 09 09 09 70 69 76 5f 6f se 2:......piv_o
10af0 69 64 20 3d 20 70 69 76 5f 6f 69 64 5f 6b 65 79 id = piv_oid_key
10b00 6d 67 74 3b 0a 09 09 09 09 09 70 69 76 5f 6b 65 mgt;......piv_ke
10b10 79 20 3d 20 4e 49 53 54 53 50 38 30 30 5f 37 38 y = NISTSP800_78
10b20 5f 33 5f 4b 45 59 5f 4b 45 59 4d 47 54 3b 0a 09 _3_KEY_KEYMGT;..
10b30 09 09 09 09 70 69 76 5f 6c 61 62 65 6c 20 3d 20 ....piv_label =
10b40 22 4b 65 79 20 4d 61 6e 61 67 65 6d 65 6e 74 22 "Key Management"
10b50 3b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 ;......break;...
10b60 09 7d 0a 0a 09 09 09 72 65 61 64 5f 72 65 74 20 .}.....read_ret
10b70 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 64 61 74 = cackey_get_dat
10b80 61 28 73 6c 6f 74 2c 20 62 75 66 66 65 72 2c 20 a(slot, buffer,
10b90 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2c 20 sizeof(buffer),
10ba0 70 69 76 5f 6f 69 64 29 3b 0a 0a 09 09 09 69 66 piv_oid);.....if
10bb0 20 28 72 65 61 64 5f 72 65 74 20 3c 3d 20 30 29 (read_ret <= 0)
10bc0 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b {.....continue;
10bd0 0a 09 09 09 7d 0a 0a 09 09 09 63 75 72 72 5f 69 ....}.....curr_i
10be0 64 20 3d 20 26 63 65 72 74 73 5b 6f 75 74 69 64 d = &certs[outid
10bf0 78 5d 3b 0a 09 09 09 6f 75 74 69 64 78 2b 2b 3b x];....outidx++;
10c00 0a 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 6b 65 .....curr_id->ke
10c10 79 73 69 7a 65 20 3d 20 2d 31 3b 0a 09 09 09 63 ysize = -1;....c
10c20 75 72 72 5f 69 64 2d 3e 69 64 5f 74 79 70 65 20 urr_id->id_type
10c30 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 = CACKEY_ID_TYPE
10c40 5f 50 49 56 3b 0a 09 09 09 63 75 72 72 5f 69 64 _PIV;....curr_id
10c50 2d 3e 63 61 72 64 2e 70 69 76 2e 6b 65 79 5f 69 ->card.piv.key_i
10c60 64 20 3d 20 70 69 76 5f 6b 65 79 3b 0a 09 09 09 d = piv_key;....
10c70 6d 65 6d 63 70 79 28 63 75 72 72 5f 69 64 2d 3e memcpy(curr_id->
10c80 63 61 72 64 2e 70 69 76 2e 6c 61 62 65 6c 2c 20 card.piv.label,
10c90 70 69 76 5f 6c 61 62 65 6c 2c 20 73 74 72 6c 65 piv_label, strle
10ca0 6e 28 70 69 76 5f 6c 61 62 65 6c 29 20 2b 20 31 n(piv_label) + 1
10cb0 29 3b 0a 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e );.....curr_id->
10cc0 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 certificate_len
10cd0 3d 20 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 63 = read_ret;....c
10ce0 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 urr_id->certific
10cf0 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 ate = malloc(cur
10d00 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 r_id->certificat
10d10 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 62 75 66 66 e_len);.....buff
10d20 65 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 er_len = sizeof(
10d30 62 75 66 66 65 72 29 3b 0a 09 09 09 62 75 66 66 buffer);....buff
10d40 65 72 5f 70 20 3d 20 63 61 63 6b 65 79 5f 72 65 er_p = cackey_re
10d50 61 64 5f 62 65 72 74 6c 76 5f 74 61 67 28 62 75 ad_bertlv_tag(bu
10d60 66 66 65 72 2c 20 26 62 75 66 66 65 72 5f 6c 65 ffer, &buffer_le
10d70 6e 2c 20 30 78 37 30 2c 20 63 75 72 72 5f 69 64 n, 0x70, curr_id
10d80 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20 26 ->certificate, &
10d90 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 curr_id->certifi
10da0 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 69 cate_len);.....i
10db0 66 20 28 62 75 66 66 65 72 5f 70 20 3d 3d 20 4e f (buffer_p == N
10dc0 55 4c 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 ULL) {.....CACKE
10dd0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
10de0 52 65 61 64 69 6e 67 20 63 65 72 74 69 66 69 63 Reading certific
10df0 61 74 65 20 66 72 6f 6d 20 42 45 52 2d 54 4c 56 ate from BER-TLV
10e00 20 72 65 73 70 6f 6e 73 65 20 66 61 69 6c 65 64 response failed
10e10 2c 20 73 6b 69 70 70 69 6e 67 20 6b 65 79 20 25 , skipping key %
10e20 69 22 2c 20 69 64 78 29 3b 0a 0a 09 09 09 09 66 i", idx);......f
10e30 72 65 65 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 ree(curr_id->cer
10e40 74 69 66 69 63 61 74 65 29 3b 0a 0a 09 09 09 09 tificate);......
10e50 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 curr_id->certifi
10e60 63 61 74 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 cate = NULL;....
10e70 09 09 6f 75 74 69 64 78 2d 2d 3b 0a 0a 09 09 09 ..outidx--;.....
10e80 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a .continue;....}.
10e90 0a 23 69 66 64 65 66 20 48 41 56 45 5f 4c 49 42 .#ifdef HAVE_LIB
10ea0 5a 0a 09 09 09 69 66 20 28 63 75 72 72 5f 69 64 Z....if (curr_id
10eb0 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 ->certificate_le
10ec0 6e 20 3e 20 34 29 20 7b 0a 09 09 09 09 69 66 20 n > 4) {.....if
10ed0 28 6d 65 6d 63 6d 70 28 63 75 72 72 5f 69 64 2d (memcmp(curr_id-
10ee0 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20 22 5c >certificate, "\
10ef0 78 31 66 5c 78 38 62 5c 78 30 38 5c 78 30 30 22 x1f\x8b\x08\x00"
10f00 2c 20 34 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09 , 4) == 0) {....
10f10 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 63 75 ..tmpbuflen = cu
10f20 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 rr_id->certifica
10f30 74 65 5f 6c 65 6e 20 2a 20 32 3b 0a 09 09 09 09 te_len * 2;.....
10f40 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 .tmpbuf = malloc
10f50 28 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 (tmpbuflen);....
10f60 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
10f70 50 52 49 4e 54 42 55 46 28 22 41 74 74 65 6d 70 PRINTBUF("Attemp
10f80 74 69 6e 67 20 74 6f 20 64 65 63 6f 6d 70 72 65 ting to decompre
10f90 73 73 3a 22 2c 20 63 75 72 72 5f 69 64 2d 3e 63 ss:", curr_id->c
10fa0 65 72 74 69 66 69 63 61 74 65 2c 20 63 75 72 72 ertificate, curr
10fb0 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 _id->certificate
10fc0 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 09 67 7a 69 _len);.......gzi
10fd0 70 5f 73 74 72 65 61 6d 2e 7a 61 6c 6c 6f 63 20 p_stream.zalloc
10fe0 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 67 7a 69 = NULL;......gzi
10ff0 70 5f 73 74 72 65 61 6d 2e 7a 66 72 65 65 20 3d p_stream.zfree =
11000 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 67 7a 69 70 NULL;......gzip
11010 5f 73 74 72 65 61 6d 2e 6f 70 61 71 75 65 20 3d _stream.opaque =
11020 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09 67 7a 69 NULL;.......gzi
11030 70 5f 73 74 72 65 61 6d 2e 6e 65 78 74 5f 69 6e p_stream.next_in
11040 20 20 3d 20 63 75 72 72 5f 69 64 2d 3e 63 65 72 = curr_id->cer
11050 74 69 66 69 63 61 74 65 3b 0a 09 09 09 09 09 67 tificate;......g
11060 7a 69 70 5f 73 74 72 65 61 6d 2e 61 76 61 69 6c zip_stream.avail
11070 5f 69 6e 20 3d 20 63 75 72 72 5f 69 64 2d 3e 63 _in = curr_id->c
11080 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a ertificate_len;.
11090 09 09 09 09 09 67 7a 69 70 5f 73 74 72 65 61 6d .....gzip_stream
110a0 2e 6e 65 78 74 5f 6f 75 74 20 3d 20 74 6d 70 62 .next_out = tmpb
110b0 75 66 3b 0a 09 09 09 09 09 67 7a 69 70 5f 73 74 uf;......gzip_st
110c0 72 65 61 6d 2e 61 76 61 69 6c 5f 6f 75 74 20 3d ream.avail_out =
110d0 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 tmpbuflen;.....
110e0 09 09 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 ..uncompress_ret
110f0 20 3d 20 69 6e 66 6c 61 74 65 49 6e 69 74 28 26 = inflateInit(&
11100 67 7a 69 70 5f 73 74 72 65 61 6d 29 3b 0a 09 09 gzip_stream);...
11110 09 09 09 69 66 20 28 75 6e 63 6f 6d 70 72 65 73 ...if (uncompres
11120 73 5f 72 65 74 20 3d 3d 20 5a 5f 4f 4b 29 20 7b s_ret == Z_OK) {
11130 0a 09 09 09 09 09 09 2f 2a 20 54 72 79 20 61 67 ......./* Try ag
11140 61 69 6e 20 61 73 20 61 20 67 7a 69 70 20 62 75 ain as a gzip bu
11150 66 66 65 72 20 2a 2f 0a 09 09 09 09 09 09 75 6e ffer */.......un
11160 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 20 69 compress_ret = i
11170 6e 66 6c 61 74 65 45 6e 64 28 26 67 7a 69 70 5f nflateEnd(&gzip_
11180 73 74 72 65 61 6d 29 3b 0a 09 09 09 09 09 09 69 stream);.......i
11190 66 20 28 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 f (uncompress_re
111a0 74 20 3d 3d 20 5a 5f 4f 4b 29 20 7b 0a 09 09 09 t == Z_OK) {....
111b0 09 09 09 09 67 7a 69 70 5f 73 74 72 65 61 6d 2e ....gzip_stream.
111c0 7a 61 6c 6c 6f 63 20 3d 20 4e 55 4c 4c 3b 0a 09 zalloc = NULL;..
111d0 09 09 09 09 09 09 67 7a 69 70 5f 73 74 72 65 61 ......gzip_strea
111e0 6d 2e 7a 66 72 65 65 20 3d 20 4e 55 4c 4c 3b 0a m.zfree = NULL;.
111f0 09 09 09 09 09 09 09 67 7a 69 70 5f 73 74 72 65 .......gzip_stre
11200 61 6d 2e 6f 70 61 71 75 65 20 3d 20 4e 55 4c 4c am.opaque = NULL
11210 3b 0a 0a 09 09 09 09 09 09 09 67 7a 69 70 5f 73 ;.........gzip_s
11220 74 72 65 61 6d 2e 6e 65 78 74 5f 69 6e 20 20 3d tream.next_in =
11230 20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 curr_id->certif
11240 69 63 61 74 65 3b 0a 09 09 09 09 09 09 09 67 7a icate;........gz
11250 69 70 5f 73 74 72 65 61 6d 2e 61 76 61 69 6c 5f ip_stream.avail_
11260 69 6e 20 3d 20 63 75 72 72 5f 69 64 2d 3e 63 65 in = curr_id->ce
11270 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 rtificate_len;..
11280 09 09 09 09 09 09 67 7a 69 70 5f 73 74 72 65 61 ......gzip_strea
11290 6d 2e 6e 65 78 74 5f 6f 75 74 20 3d 20 74 6d 70 m.next_out = tmp
112a0 62 75 66 3b 0a 09 09 09 09 09 09 09 67 7a 69 70 buf;........gzip
112b0 5f 73 74 72 65 61 6d 2e 61 76 61 69 6c 5f 6f 75 _stream.avail_ou
112c0 74 20 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 t = tmpbuflen;..
112d0 09 09 09 09 09 09 75 6e 63 6f 6d 70 72 65 73 73 ......uncompress
112e0 5f 72 65 74 20 3d 20 69 6e 66 6c 61 74 65 49 6e _ret = inflateIn
112f0 69 74 32 28 26 67 7a 69 70 5f 73 74 72 65 61 6d it2(&gzip_stream
11300 2c 20 33 31 29 3b 0a 09 09 09 09 09 09 7d 0a 09 , 31);.......}..
11310 09 09 09 09 7d 0a 09 09 09 09 09 69 66 20 28 75 ....}......if (u
11320 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 3d ncompress_ret ==
11330 20 5a 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 09 75 Z_OK) {.......u
11340 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 20 ncompress_ret =
11350 69 6e 66 6c 61 74 65 28 26 67 7a 69 70 5f 73 74 inflate(&gzip_st
11360 72 65 61 6d 2c 20 30 29 3b 0a 09 09 09 09 09 7d ream, 0);......}
11370 0a 09 09 09 09 09 69 66 20 28 75 6e 63 6f 6d 70 ......if (uncomp
11380 72 65 73 73 5f 72 65 74 20 3d 3d 20 5a 5f 53 54 ress_ret == Z_ST
11390 52 45 41 4d 5f 45 4e 44 29 20 7b 0a 09 09 09 09 REAM_END) {.....
113a0 09 09 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 ..uncompress_ret
113b0 20 3d 20 69 6e 66 6c 61 74 65 45 6e 64 28 26 67 = inflateEnd(&g
113c0 7a 69 70 5f 73 74 72 65 61 6d 29 3b 0a 09 09 09 zip_stream);....
113d0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 ..} else {......
113e0 09 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 .uncompress_ret
113f0 3d 20 5a 5f 44 41 54 41 5f 45 52 52 4f 52 3b 0a = Z_DATA_ERROR;.
11400 09 09 09 09 09 7d 0a 09 09 09 09 09 69 66 20 28 .....}......if (
11410 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d uncompress_ret =
11420 3d 20 5a 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 09 = Z_OK) {.......
11430 74 6d 70 62 75 66 6c 65 6e 20 3d 20 67 7a 69 70 tmpbuflen = gzip
11440 5f 73 74 72 65 61 6d 2e 74 6f 74 61 6c 5f 6f 75 _stream.total_ou
11450 74 3b 0a 0a 09 09 09 09 09 09 43 41 43 4b 45 59 t;........CACKEY
11460 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 _DEBUG_PRINTBUF(
11470 22 44 65 63 6f 6d 70 72 65 73 73 65 64 20 74 6f "Decompressed to
11480 3a 22 2c 20 74 6d 70 62 75 66 2c 20 74 6d 70 62 :", tmpbuf, tmpb
11490 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 09 09 66 uflen);........f
114a0 72 65 65 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 ree(curr_id->cer
114b0 74 69 66 69 63 61 74 65 29 3b 0a 0a 09 09 09 09 tificate);......
114c0 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 ..curr_id->certi
114d0 66 69 63 61 74 65 20 3d 20 74 6d 70 62 75 66 3b ficate = tmpbuf;
114e0 0a 09 09 09 09 09 09 63 75 72 72 5f 69 64 2d 3e .......curr_id->
114f0 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 certificate_len
11500 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 09 09 = tmpbuflen;....
11510 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 ..} else {......
11520 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
11530 49 4e 54 46 28 22 44 65 63 6f 6d 70 72 65 73 73 INTF("Decompress
11540 69 6e 67 20 66 61 69 6c 65 64 21 20 75 6e 63 6f ing failed! unco
11550 6d 70 72 65 73 73 28 29 20 72 65 74 75 72 6e 65 mpress() returne
11560 64 20 25 69 22 2c 20 75 6e 63 6f 6d 70 72 65 73 d %i", uncompres
11570 73 5f 72 65 74 29 3b 0a 0a 09 09 09 09 09 09 66 s_ret);........f
11580 72 65 65 28 74 6d 70 62 75 66 29 3b 0a 09 09 09 ree(tmpbuf);....
11590 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 23 ..}.....}....}.#
115a0 65 6e 64 69 66 0a 09 09 7d 0a 09 7d 20 65 6c 73 endif...}..} els
115b0 65 20 7b 0a 09 09 2f 2a 20 52 65 61 64 20 61 6c e {.../* Read al
115c0 6c 20 74 68 65 20 61 70 70 6c 65 74 73 20 66 72 l the applets fr
115d0 6f 6d 20 74 68 65 20 43 43 43 27 73 20 54 4c 56 om the CCC's TLV
115e0 20 2a 2f 0a 09 09 63 63 63 5f 74 6c 76 20 3d 20 */...ccc_tlv =
115f0 63 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28 cackey_read_tlv(
11600 73 6c 6f 74 29 3b 0a 0a 09 09 2f 2a 20 4c 6f 6f slot);..../* Loo
11610 6b 20 66 6f 72 20 43 41 52 44 55 52 4c 73 20 74 k for CARDURLs t
11620 68 61 74 20 63 6f 6f 72 65 73 70 6f 6e 64 20 74 hat coorespond t
11630 6f 20 50 4b 49 20 61 70 70 6c 65 74 73 20 2a 2f o PKI applets */
11640 0a 09 09 66 6f 72 20 28 63 63 63 5f 63 75 72 72 ...for (ccc_curr
11650 20 3d 20 63 63 63 5f 74 6c 76 3b 20 63 63 63 5f = ccc_tlv; ccc_
11660 63 75 72 72 3b 20 63 63 63 5f 63 75 72 72 20 3d curr; ccc_curr =
11670 20 63 63 63 5f 63 75 72 72 2d 3e 5f 6e 65 78 74 ccc_curr->_next
11680 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 ) {....CACKEY_DE
11690 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e BUG_PRINTF("Foun
116a0 64 20 74 61 67 3a 20 25 73 20 2e 2e 2e 20 22 2c d tag: %s ... ",
116b0 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 CACKEY_DEBUG_FU
116c0 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 63 63 NC_TAG_TO_STR(cc
116d0 63 5f 63 75 72 72 2d 3e 74 61 67 29 29 3b 0a 0a c_curr->tag));..
116e0 09 09 09 69 66 20 28 63 63 63 5f 63 75 72 72 2d ...if (ccc_curr-
116f0 3e 74 61 67 20 21 3d 20 47 53 43 49 53 5f 54 41 >tag != GSCIS_TA
11700 47 5f 43 41 52 44 55 52 4c 29 20 7b 0a 09 09 09 G_CARDURL) {....
11710 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
11720 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70 INTF(" ... skip
11730 70 69 6e 67 20 69 74 20 28 77 65 20 6f 6e 6c 79 ping it (we only
11740 20 63 61 72 65 20 61 62 6f 75 74 20 43 41 52 44 care about CARD
11750 55 52 4c 73 29 22 29 3b 0a 0a 09 09 09 09 63 6f URLs)");......co
11760 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 ntinue;....}....
11770 09 69 66 20 28 28 63 63 63 5f 63 75 72 72 2d 3e .if ((ccc_curr->
11780 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 value_cardurl->a
11790 70 70 74 79 70 65 20 26 20 43 41 43 4b 45 59 5f pptype & CACKEY_
117a0 54 4c 56 5f 41 50 50 5f 50 4b 49 29 20 21 3d 20 TLV_APP_PKI) !=
117b0 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 CACKEY_TLV_APP_P
117c0 4b 49 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 KI) {.....CACKEY
117d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 _DEBUG_PRINTF("
117e0 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69 74 ... skipping it
117f0 20 28 77 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 (we only care a
11800 62 6f 75 74 20 50 4b 49 20 61 70 70 6c 65 74 73 bout PKI applets
11810 2c 20 74 68 69 73 20 61 70 70 6c 65 74 20 73 75 , this applet su
11820 70 70 6f 72 74 73 3a 20 25 73 2f 25 30 32 78 29 pports: %s/%02x)
11830 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ", CACKEY_DEBUG_
11840 46 55 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f FUNC_APPTYPE_TO_
11850 53 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 STR(ccc_curr->va
11860 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 lue_cardurl->app
11870 74 79 70 65 29 2c 20 28 75 6e 73 69 67 6e 65 64 type), (unsigned
11880 20 69 6e 74 29 20 63 63 63 5f 63 75 72 72 2d 3e int) ccc_curr->
11890 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 value_cardurl->a
118a0 70 70 74 79 70 65 29 3b 0a 0a 09 09 09 09 63 6f pptype);......co
118b0 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 ntinue;....}....
118c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
118d0 49 4e 54 42 55 46 28 22 52 49 44 3a 22 2c 20 63 INTBUF("RID:", c
118e0 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 cc_curr->value_c
118f0 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20 73 69 7a ardurl->rid, siz
11900 65 6f 66 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 eof(ccc_curr->va
11910 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 lue_cardurl->rid
11920 29 29 3b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 ));....CACKEY_DE
11930 42 55 47 5f 50 52 49 4e 54 46 28 22 41 70 70 49 BUG_PRINTF("AppI
11940 44 20 3d 20 25 73 2f 25 30 34 6c 78 22 2c 20 43 D = %s/%04lx", C
11950 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 ACKEY_DEBUG_FUNC
11960 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28 63 63 _OBJID_TO_STR(cc
11970 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 c_curr->value_ca
11980 72 64 75 72 6c 2d 3e 61 70 70 69 64 29 2c 20 28 rdurl->appid), (
11990 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 unsigned long) c
119a0 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 cc_curr->value_c
119b0 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 29 3b 0a ardurl->appid);.
119c0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
119d0 50 52 49 4e 54 46 28 22 4f 62 6a 65 63 74 49 44 PRINTF("ObjectID
119e0 20 3d 20 25 73 2f 25 30 34 6c 78 22 2c 20 43 41 = %s/%04lx", CA
119f0 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f CKEY_DEBUG_FUNC_
11a00 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28 63 63 63 OBJID_TO_STR(ccc
11a10 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 _curr->value_car
11a20 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 2c durl->objectid),
11a30 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
11a40 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 ccc_curr->value
11a50 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 _cardurl->object
11a60 69 64 29 3b 0a 0a 09 09 09 6d 65 6d 63 70 79 28 id);.....memcpy(
11a70 63 75 72 72 5f 61 69 64 2c 20 63 63 63 5f 63 75 curr_aid, ccc_cu
11a80 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 rr->value_cardur
11a90 6c 2d 3e 72 69 64 2c 20 73 69 7a 65 6f 66 28 63 l->rid, sizeof(c
11aa0 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 cc_curr->value_c
11ab0 61 72 64 75 72 6c 2d 3e 72 69 64 29 29 3b 0a 09 ardurl->rid));..
11ac0 09 09 63 75 72 72 5f 61 69 64 5b 73 69 7a 65 6f ..curr_aid[sizeo
11ad0 66 28 63 75 72 72 5f 61 69 64 29 20 2d 20 32 5d f(curr_aid) - 2]
11ae0 20 3d 20 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 = (ccc_curr->va
11af0 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 lue_cardurl->app
11b00 69 64 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b id >> 8) & 0xff;
11b10 0a 09 09 09 63 75 72 72 5f 61 69 64 5b 73 69 7a ....curr_aid[siz
11b20 65 6f 66 28 63 75 72 72 5f 61 69 64 29 20 2d 20 eof(curr_aid) -
11b30 31 5d 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e 76 1] = ccc_curr->v
11b40 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 alue_cardurl->ap
11b50 70 69 64 20 26 20 30 78 66 66 3b 0a 0a 09 09 09 pid & 0xff;.....
11b60 2f 2a 20 53 65 6c 65 63 74 20 66 6f 75 6e 64 20 /* Select found
11b70 61 70 70 6c 65 74 20 2e 2e 2e 20 2a 2f 0a 09 09 applet ... */...
11b80 09 73 65 6c 65 63 74 5f 72 65 74 20 3d 20 63 61 .select_ret = ca
11b90 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c ckey_select_appl
11ba0 65 74 28 73 6c 6f 74 2c 20 63 75 72 72 5f 61 69 et(slot, curr_ai
11bb0 64 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 d, sizeof(curr_a
11bc0 69 64 29 29 3b 0a 09 09 09 69 66 20 28 73 65 6c id));....if (sel
11bd0 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 ect_ret != CACKE
11be0 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 Y_PCSC_S_OK) {..
11bf0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
11c00 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 PRINTF("Failed t
11c10 6f 20 73 65 6c 65 63 74 20 61 70 70 6c 65 74 2c o select applet,
11c20 20 73 6b 69 70 70 69 6e 67 20 70 72 6f 63 65 73 skipping proces
11c30 73 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 62 6a sing of this obj
11c40 65 63 74 22 29 3b 0a 0a 09 09 09 09 63 6f 6e 74 ect");......cont
11c50 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 2f inue;....}...../
11c60 2a 20 2e 2e 2e 20 61 6e 64 20 6f 62 6a 65 63 74 * ... and object
11c70 20 28 66 69 6c 65 29 20 2a 2f 0a 09 09 09 73 65 (file) */....se
11c80 6c 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 lect_ret = cacke
11c90 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 6c y_select_file(sl
11ca0 6f 74 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 ot, ccc_curr->va
11cb0 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a lue_cardurl->obj
11cc0 65 63 74 69 64 29 3b 0a 09 09 09 69 66 20 28 73 ectid);....if (s
11cd0 65 6c 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 elect_ret != CAC
11ce0 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b KEY_PCSC_S_OK) {
11cf0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
11d00 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 G_PRINTF("Failed
11d10 20 74 6f 20 73 65 6c 65 63 74 20 66 69 6c 65 2c to select file,
11d20 20 73 6b 69 70 70 69 6e 67 20 70 72 6f 63 65 73 skipping proces
11d30 73 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 62 6a sing of this obj
11d40 65 63 74 22 29 3b 0a 0a 09 09 09 09 63 6f 6e 74 ect");......cont
11d50 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 2f inue;....}...../
11d60 2a 20 50 72 6f 63 65 73 73 20 74 68 69 73 20 66 * Process this f
11d70 69 6c 65 27 73 20 54 4c 56 20 6c 6f 6f 6b 69 6e ile's TLV lookin
11d80 67 20 66 6f 72 20 63 65 72 74 69 66 69 63 61 74 g for certificat
11d90 65 73 20 2a 2f 0a 09 09 09 61 70 70 5f 74 6c 76 es */....app_tlv
11da0 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 74 = cackey_read_t
11db0 6c 76 28 73 6c 6f 74 29 3b 0a 09 0a 09 09 09 66 lv(slot);......f
11dc0 6f 72 20 28 61 70 70 5f 63 75 72 72 20 3d 20 61 or (app_curr = a
11dd0 70 70 5f 74 6c 76 3b 20 61 70 70 5f 63 75 72 72 pp_tlv; app_curr
11de0 3b 20 61 70 70 5f 63 75 72 72 20 3d 20 61 70 70 ; app_curr = app
11df0 5f 63 75 72 72 2d 3e 5f 6e 65 78 74 29 20 7b 0a _curr->_next) {.
11e00 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
11e10 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 74 _PRINTF("Found t
11e20 61 67 3a 20 25 73 22 2c 20 43 41 43 4b 45 59 5f ag: %s", CACKEY_
11e30 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 DEBUG_FUNC_TAG_T
11e40 4f 5f 53 54 52 28 61 70 70 5f 63 75 72 72 2d 3e O_STR(app_curr->
11e50 74 61 67 29 29 3b 0a 09 09 09 09 69 66 20 28 61 tag));.....if (a
11e60 70 70 5f 63 75 72 72 2d 3e 74 61 67 20 21 3d 20 pp_curr->tag !=
11e70 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 GSCIS_TAG_CERTIF
11e80 49 43 41 54 45 29 20 7b 0a 09 09 09 09 09 43 41 ICATE) {......CA
11e90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
11ea0 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e F(" ... skippin
11eb0 67 20 69 74 20 28 77 65 20 6f 6e 6c 79 20 63 61 g it (we only ca
11ec0 72 65 20 61 62 6f 75 74 20 43 45 52 54 49 46 49 re about CERTIFI
11ed0 43 41 54 45 73 29 22 29 3b 0a 0a 09 09 09 09 09 CATEs)");.......
11ee0 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 09 7d 0a continue;.....}.
11ef0 0a 09 09 09 09 63 75 72 72 5f 69 64 20 3d 20 26 .....curr_id = &
11f00 63 65 72 74 73 5b 6f 75 74 69 64 78 5d 3b 0a 09 certs[outidx];..
11f10 09 09 09 6f 75 74 69 64 78 2b 2b 3b 0a 0a 09 09 ...outidx++;....
11f20 09 09 63 75 72 72 5f 69 64 2d 3e 69 64 5f 74 79 ..curr_id->id_ty
11f30 70 65 20 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54 pe = CACKEY_ID_T
11f40 59 50 45 5f 43 41 43 3b 0a 09 09 09 09 6d 65 6d YPE_CAC;.....mem
11f50 63 70 79 28 63 75 72 72 5f 69 64 2d 3e 63 61 72 cpy(curr_id->car
11f60 64 2e 63 61 63 2e 61 70 70 6c 65 74 2c 20 63 75 d.cac.applet, cu
11f70 72 72 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 63 rr_aid, sizeof(c
11f80 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 urr_id->card.cac
11f90 2e 61 70 70 6c 65 74 29 29 3b 0a 09 09 09 09 63 .applet));.....c
11fa0 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 urr_id->card.cac
11fb0 2e 66 69 6c 65 20 3d 20 63 63 63 5f 63 75 72 72 .file = ccc_curr
11fc0 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d ->value_cardurl-
11fd0 3e 6f 62 6a 65 63 74 69 64 3b 0a 09 09 09 09 63 >objectid;.....c
11fe0 75 72 72 5f 69 64 2d 3e 6b 65 79 73 69 7a 65 20 urr_id->keysize
11ff0 3d 20 2d 31 3b 0a 0a 09 09 09 09 43 41 43 4b 45 = -1;......CACKE
12000 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
12010 46 69 6c 6c 69 6e 67 20 63 75 72 72 5f 69 64 2d Filling curr_id-
12020 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 >card.cac.applet
12030 20 28 25 70 29 20 77 69 74 68 20 25 6c 75 20 62 (%p) with %lu b
12040 79 74 65 73 3a 22 2c 20 63 75 72 72 5f 69 64 2d ytes:", curr_id-
12050 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 >card.cac.applet
12060 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
12070 29 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 69 64 ) sizeof(curr_id
12080 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 ->card.cac.apple
12090 74 29 29 3b 0a 09 09 09 09 43 41 43 4b 45 59 5f t));.....CACKEY_
120a0 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 DEBUG_PRINTBUF("
120b0 56 41 4c 3a 22 2c 20 63 75 72 72 5f 69 64 2d 3e VAL:", curr_id->
120c0 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 2c card.cac.applet,
120d0 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 69 64 2d sizeof(curr_id-
120e0 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 >card.cac.applet
120f0 29 29 3b 0a 0a 09 09 09 09 63 75 72 72 5f 69 64 ));......curr_id
12100 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 ->certificate_le
12110 6e 20 3d 20 61 70 70 5f 63 75 72 72 2d 3e 6c 65 n = app_curr->le
12120 6e 67 74 68 3b 0a 0a 09 09 09 09 63 75 72 72 5f ngth;......curr_
12130 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 20 id->certificate
12140 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72 5f 69 64 = malloc(curr_id
12150 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 ->certificate_le
12160 6e 29 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 63 n);.....memcpy(c
12170 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 urr_id->certific
12180 61 74 65 2c 20 61 70 70 5f 63 75 72 72 2d 3e 76 ate, app_curr->v
12190 61 6c 75 65 2c 20 63 75 72 72 5f 69 64 2d 3e 63 alue, curr_id->c
121a0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b ertificate_len);
121b0 0a 0a 09 09 09 09 69 66 20 28 6f 75 74 69 64 78 ......if (outidx
121c0 20 3e 3d 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 09 >= *count) {...
121d0 09 09 09 69 66 20 28 63 65 72 74 73 5f 72 65 73 ...if (certs_res
121e0 69 7a 61 62 6c 65 29 20 7b 0a 09 09 09 09 09 09 izable) {.......
121f0 2a 63 6f 75 6e 74 20 2a 3d 20 32 3b 0a 09 09 09 *count *= 2;....
12200 09 09 09 69 66 20 28 2a 63 6f 75 6e 74 20 21 3d ...if (*count !=
12210 20 30 29 20 7b 0a 09 09 09 09 09 09 09 63 65 72 0) {........cer
12220 74 73 20 3d 20 72 65 61 6c 6c 6f 63 28 63 65 72 ts = realloc(cer
12230 74 73 2c 20 73 69 7a 65 6f 66 28 2a 63 65 72 74 ts, sizeof(*cert
12240 73 29 20 2a 20 28 2a 63 6f 75 6e 74 29 29 3b 0a s) * (*count));.
12250 09 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 ......} else {..
12260 09 09 09 09 09 09 63 65 72 74 73 20 3d 20 4e 55 ......certs = NU
12270 4c 4c 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 LL;.......}.....
12280 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 .} else {.......
12290 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 break;......}...
122a0 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 ..}....}.....cac
122b0 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 61 70 70 key_free_tlv(app
122c0 5f 74 6c 76 29 3b 0a 0a 09 09 09 69 66 20 28 6f _tlv);.....if (o
122d0 75 74 69 64 78 20 3e 3d 20 2a 63 6f 75 6e 74 29 utidx >= *count)
122e0 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 {.....break;...
122f0 09 7d 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 .}...}....cackey
12300 5f 66 72 65 65 5f 74 6c 76 28 63 63 63 5f 74 6c _free_tlv(ccc_tl
12310 76 29 3b 0a 09 7d 0a 0a 09 2a 63 6f 75 6e 74 20 v);..}...*count
12320 3d 20 6f 75 74 69 64 78 3b 0a 0a 09 69 66 20 28 = outidx;...if (
12330 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 29 certs_resizable)
12340 20 7b 0a 09 09 69 66 20 28 2a 63 6f 75 6e 74 20 {...if (*count
12350 21 3d 20 30 29 20 7b 0a 09 09 09 63 65 72 74 73 != 0) {....certs
12360 20 3d 20 72 65 61 6c 6c 6f 63 28 63 65 72 74 73 = realloc(certs
12370 2c 20 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 , sizeof(*certs)
12380 20 2a 20 28 2a 63 6f 75 6e 74 29 29 3b 0a 09 09 * (*count));...
12390 7d 20 65 6c 73 65 20 7b 0a 09 09 09 66 72 65 65 } else {....free
123a0 28 63 65 72 74 73 29 3b 0a 0a 09 09 09 63 65 72 (certs);.....cer
123b0 74 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 ts = NULL;...}..
123c0 7d 0a 0a 09 73 6c 6f 74 2d 3e 63 61 63 68 65 64 }...slot->cached
123d0 5f 63 65 72 74 73 20 3d 20 63 61 63 6b 65 79 5f _certs = cackey_
123e0 63 6f 70 79 5f 63 65 72 74 73 28 4e 55 4c 4c 2c copy_certs(NULL,
123f0 20 63 65 72 74 73 2c 20 2a 63 6f 75 6e 74 29 3b certs, *count);
12400 0a 09 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 ..slot->cached_c
12410 65 72 74 73 5f 63 6f 75 6e 74 20 3d 20 2a 63 6f erts_count = *co
12420 75 6e 74 3b 0a 0a 09 2f 2a 20 54 65 72 6d 69 6e unt;.../* Termin
12430 61 74 65 20 53 6d 61 72 74 43 61 72 64 20 54 72 ate SmartCard Tr
12440 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 ansaction */..ca
12450 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 ckey_end_transac
12460 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 72 65 tion(slot);...re
12470 74 75 72 6e 28 63 65 72 74 73 29 3b 0a 7d 0a 0a turn(certs);.}..
12480 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 /*. * SYNPOSIS.
12490 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 * .... *. *
124a0 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 ARGUMENTS. *
124b0 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 .... *. * RETUR
124c0 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e N VALUE. * .
124d0 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 ... *. * NOTES.
124e0 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f * .... *. */
124f0 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f 74 20 .static ssize_t
12500 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 cackey_signdecry
12510 70 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 pt(struct cackey
12520 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 73 74 72 _slot *slot, str
12530 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 uct cackey_ident
12540 69 74 79 20 2a 69 64 65 6e 74 69 74 79 2c 20 75 ity *identity, u
12550 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 nsigned char *bu
12560 66 2c 20 73 69 7a 65 5f 74 20 62 75 66 6c 65 6e f, size_t buflen
12570 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 , unsigned char
12580 2a 6f 75 74 62 75 66 2c 20 73 69 7a 65 5f 74 20 *outbuf, size_t
12590 6f 75 74 62 75 66 6c 65 6e 2c 20 69 6e 74 20 70 outbuflen, int p
125a0 61 64 49 6e 70 75 74 2c 20 69 6e 74 20 75 6e 70 adInput, int unp
125b0 61 64 4f 75 74 70 75 74 29 20 7b 0a 09 63 61 63 adOutput) {..cac
125c0 6b 65 79 5f 70 63 73 63 5f 69 64 5f 74 79 70 65 key_pcsc_id_type
125d0 20 69 64 5f 74 79 70 65 3b 0a 09 75 6e 73 69 67 id_type;..unsig
125e0 6e 65 64 20 63 68 61 72 20 64 79 6e 5f 61 75 74 ned char dyn_aut
125f0 68 5f 74 65 6d 70 6c 61 74 65 5b 31 30 5d 2c 20 h_template[10],
12600 2a 64 79 6e 5f 61 75 74 68 5f 74 6d 70 62 75 66 *dyn_auth_tmpbuf
12610 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 ;..unsigned char
12620 20 2a 74 6d 70 62 75 66 2c 20 2a 74 6d 70 62 75 *tmpbuf, *tmpbu
12630 66 5f 73 2c 20 2a 6f 75 74 62 75 66 5f 73 2c 20 f_s, *outbuf_s,
12640 2a 6f 75 74 62 75 66 5f 70 3b 0a 09 75 6e 73 69 *outbuf_p;..unsi
12650 67 6e 65 64 20 63 68 61 72 20 62 79 74 65 73 5f gned char bytes_
12660 74 6f 5f 73 65 6e 64 2c 20 70 31 2c 20 63 6c 61 to_send, p1, cla
12670 73 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 ss;..unsigned ch
12680 61 72 20 62 6c 6f 63 6b 74 79 70 65 3b 0a 09 63 ar blocktype;..c
12690 61 63 6b 65 79 5f 72 65 74 20 73 65 6e 64 5f 72 ackey_ret send_r
126a0 65 74 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 et;..uint16_t re
126b0 73 70 63 6f 64 65 3b 0a 09 73 73 69 7a 65 5f 74 spcode;..ssize_t
126c0 20 72 65 74 76 61 6c 20 3d 20 30 2c 20 75 6e 70 retval = 0, unp
126d0 61 64 6f 66 66 73 65 74 3b 0a 09 73 69 7a 65 5f adoffset;..size_
126e0 74 20 74 6d 70 62 75 66 6c 65 6e 2c 20 70 61 64 t tmpbuflen, pad
126f0 6c 65 6e 2c 20 74 6d 70 6f 75 74 62 75 66 6c 65 len, tmpoutbufle
12700 6e 2c 20 6f 75 74 62 75 66 5f 6c 65 6e 3b 0a 09 n, outbuf_len;..
12710 69 6e 74 20 66 72 65 65 5f 74 6d 70 62 75 66 20 int free_tmpbuf
12720 3d 20 30 3b 0a 09 69 6e 74 20 6c 65 3b 0a 0a 09 = 0;..int le;...
12730 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
12740 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a NTF("Called.");.
12750 0a 09 69 66 20 28 73 6c 6f 74 20 3d 3d 20 4e 55 ..if (slot == NU
12760 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 LL) {...CACKEY_D
12770 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
12780 6f 72 2e 20 20 73 6c 6f 74 20 69 73 20 4e 55 4c or. slot is NUL
12790 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d L");....return(-
127a0 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 62 75 66 1);..}...if (buf
127b0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 == NULL) {...CA
127c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
127d0 46 28 22 45 72 72 6f 72 2e 20 20 62 75 66 20 69 F("Error. buf i
127e0 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 s NULL");....ret
127f0 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 urn(-1);..}...if
12800 20 28 6f 75 74 62 75 66 20 3d 3d 20 4e 55 4c 4c (outbuf == NULL
12810 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
12820 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
12830 2e 20 20 6f 75 74 62 75 66 20 69 73 20 4e 55 4c . outbuf is NUL
12840 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d L");....return(-
12850 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 69 64 65 1);..}...if (ide
12860 6e 74 69 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b ntity == NULL) {
12870 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
12880 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
12890 69 64 65 6e 74 69 74 79 20 69 73 20 4e 55 4c 4c identity is NULL
128a0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 ");....return(-1
128b0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 69 64 65 6e );..}...if (iden
128c0 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 tity->pcsc_ident
128d0 69 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ity == NULL) {..
128e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
128f0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64 INTF("Error. id
12900 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 entity->pcsc_ide
12910 6e 74 69 74 79 20 69 73 20 4e 55 4c 4c 22 29 3b ntity is NULL");
12920 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a ....return(-1);.
12930 09 7d 0a 0a 09 69 64 5f 74 79 70 65 20 3d 20 69 .}...id_type = i
12940 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 dentity->pcsc_id
12950 65 6e 74 69 74 79 2d 3e 69 64 5f 74 79 70 65 3b entity->id_type;
12960 0a 09 69 66 20 28 69 64 5f 74 79 70 65 20 3d 3d ..if (id_type ==
12970 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f CACKEY_ID_TYPE_
12980 43 45 52 54 5f 4f 4e 4c 59 29 20 7b 0a 09 09 43 CERT_ONLY) {...C
12990 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
129a0 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64 65 6e TF("Error. iden
129b0 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 tity->pcsc_ident
129c0 69 74 79 20 69 73 20 43 41 43 4b 45 59 5f 49 44 ity is CACKEY_ID
129d0 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 2c _TYPE_CERT_ONLY,
129e0 20 77 68 69 63 68 20 63 61 6e 6e 6f 74 20 62 65 which cannot be
129f0 20 75 73 65 64 20 66 6f 72 20 73 69 67 6e 2f 64 used for sign/d
12a00 65 63 72 79 70 74 22 29 3b 0a 0a 09 09 72 65 74 ecrypt");....ret
12a10 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 73 77 urn(-1);..}...sw
12a20 69 74 63 68 20 28 69 64 5f 74 79 70 65 29 20 7b itch (id_type) {
12a30 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 ...case CACKEY_I
12a40 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09 63 61 D_TYPE_PIV:...ca
12a50 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 se CACKEY_ID_TYP
12a60 45 5f 43 41 43 3a 0a 09 09 09 62 72 65 61 6b 3b E_CAC:....break;
12a70 0a 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 43 ...default:....C
12a80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
12a90 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64 65 6e TF("Error. iden
12aa0 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 tity->pcsc_ident
12ab0 69 74 79 20 69 73 20 6e 6f 74 20 61 20 73 75 70 ity is not a sup
12ac0 70 6f 72 74 65 64 20 76 61 6c 75 65 2e 20 54 79 ported value. Ty
12ad0 70 65 20 69 73 3a 20 30 78 25 6c 78 20 28 50 49 pe is: 0x%lx (PI
12ae0 56 20 3d 20 30 78 25 6c 78 2c 20 43 41 43 20 3d V = 0x%lx, CAC =
12af0 20 30 78 25 6c 78 29 22 2c 20 28 75 6e 73 69 67 0x%lx)", (unsig
12b00 6e 65 64 20 6c 6f 6e 67 29 20 69 64 5f 74 79 70 ned long) id_typ
12b10 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e e, (unsigned lon
12b20 67 29 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 g) CACKEY_ID_TYP
12b30 45 5f 50 49 56 2c 20 28 75 6e 73 69 67 6e 65 64 E_PIV, (unsigned
12b40 20 6c 6f 6e 67 29 20 43 41 43 4b 45 59 5f 49 44 long) CACKEY_ID
12b50 5f 54 59 50 45 5f 43 41 43 29 3b 0a 0a 09 09 09 _TYPE_CAC);.....
12b60 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a return(-1);..}..
12b70 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 64 ./* Determine id
12b80 65 6e 74 69 74 79 20 4b 65 79 20 73 69 7a 65 20 entity Key size
12b90 2a 2f 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79 */..if (identity
12ba0 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d ->pcsc_identity-
12bb0 3e 6b 65 79 73 69 7a 65 20 3c 20 30 29 20 7b 0a >keysize < 0) {.
12bc0 09 09 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 ..identity->pcsc
12bd0 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 _identity->keysi
12be0 7a 65 20 3d 20 78 35 30 39 5f 74 6f 5f 6b 65 79 ze = x509_to_key
12bf0 73 69 7a 65 28 69 64 65 6e 74 69 74 79 2d 3e 70 size(identity->p
12c00 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 csc_identity->ce
12c10 72 74 69 66 69 63 61 74 65 2c 20 69 64 65 6e 74 rtificate, ident
12c20 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 ity->pcsc_identi
12c30 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f ty->certificate_
12c40 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 50 61 len);..}.../* Pa
12c50 64 20 6d 65 73 73 61 67 65 20 74 6f 20 6b 65 79 d message to key
12c60 20 73 69 7a 65 20 2a 2f 0a 09 69 66 20 28 70 61 size */..if (pa
12c70 64 49 6e 70 75 74 29 20 7b 0a 09 09 69 66 20 28 dInput) {...if (
12c80 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 identity->pcsc_i
12c90 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 dentity->keysize
12ca0 20 3e 20 30 29 20 7b 0a 09 09 09 69 66 20 28 62 > 0) {....if (b
12cb0 75 66 6c 65 6e 20 21 3d 20 69 64 65 6e 74 69 74 uflen != identit
12cc0 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 y->pcsc_identity
12cd0 2d 3e 6b 65 79 73 69 7a 65 29 20 7b 0a 09 09 09 ->keysize) {....
12ce0 09 69 66 20 28 62 75 66 6c 65 6e 20 3e 20 28 69 .if (buflen > (i
12cf0 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 dentity->pcsc_id
12d00 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 entity->keysize
12d10 2d 20 33 29 29 20 7b 0a 09 09 09 09 09 43 41 43 - 3)) {......CAC
12d20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
12d30 28 22 45 72 72 6f 72 2e 20 20 4d 65 73 73 61 67 ("Error. Messag
12d40 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 74 e is too large t
12d50 6f 20 73 69 67 6e 2f 64 65 63 72 79 70 74 22 29 o sign/decrypt")
12d60 3b 0a 0a 09 09 09 09 09 72 65 74 75 72 6e 28 2d ;.......return(-
12d70 31 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 74 1);.....}......t
12d80 6d 70 62 75 66 6c 65 6e 20 3d 20 69 64 65 6e 74 mpbuflen = ident
12d90 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 ity->pcsc_identi
12da0 74 79 2d 3e 6b 65 79 73 69 7a 65 3b 0a 09 09 09 ty->keysize;....
12db0 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 .tmpbuf = malloc
12dc0 28 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 09 09 09 (tmpbuflen);....
12dd0 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 31 .free_tmpbuf = 1
12de0 3b 0a 0a 09 09 09 09 70 61 64 6c 65 6e 20 3d 20 ;......padlen =
12df0 74 6d 70 62 75 66 6c 65 6e 20 2d 20 62 75 66 6c tmpbuflen - bufl
12e00 65 6e 20 2d 20 33 3b 0a 0a 09 09 09 09 43 41 43 en - 3;......CAC
12e10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
12e20 28 22 4e 65 65 64 20 74 6f 20 70 61 64 20 74 68 ("Need to pad th
12e30 65 20 62 75 66 66 65 72 20 77 69 74 68 20 25 6c e buffer with %l
12e40 6c 75 20 62 79 74 65 73 20 28 74 6d 70 62 75 66 lu bytes (tmpbuf
12e50 6c 65 6e 20 3d 20 25 6c 6c 75 2c 20 62 75 66 6c len = %llu, bufl
12e60 65 6e 20 3d 20 25 6c 6c 75 29 22 2c 20 28 75 6e en = %llu)", (un
12e70 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 signed long long
12e80 29 20 70 61 64 6c 65 6e 2c 20 28 75 6e 73 69 67 ) padlen, (unsig
12e90 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 74 ned long long) t
12ea0 6d 70 62 75 66 6c 65 6e 2c 20 28 75 6e 73 69 67 mpbuflen, (unsig
12eb0 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 62 ned long long) b
12ec0 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 2f 2a 20 uflen);....../*
12ed0 52 53 41 20 50 4b 43 53 23 31 20 45 4d 53 41 2d RSA PKCS#1 EMSA-
12ee0 50 4b 43 53 31 2d 76 31 5f 35 20 50 61 64 64 69 PKCS1-v1_5 Paddi
12ef0 6e 67 20 2a 2f 0a 09 09 09 09 74 6d 70 62 75 66 ng */.....tmpbuf
12f00 5b 30 5d 20 3d 20 30 78 30 30 3b 0a 09 09 09 09 [0] = 0x00;.....
12f10 74 6d 70 62 75 66 5b 31 5d 20 3d 20 30 78 30 31 tmpbuf[1] = 0x01
12f20 3b 0a 09 09 09 09 6d 65 6d 73 65 74 28 26 74 6d ;.....memset(&tm
12f30 70 62 75 66 5b 32 5d 2c 20 30 78 46 46 2c 20 70 pbuf[2], 0xFF, p
12f40 61 64 6c 65 6e 29 3b 0a 09 09 09 09 74 6d 70 62 adlen);.....tmpb
12f50 75 66 5b 70 61 64 6c 65 6e 20 2b 20 32 5d 3d 20 uf[padlen + 2]=
12f60 30 78 30 30 3b 0a 09 09 09 09 6d 65 6d 63 70 79 0x00;.....memcpy
12f70 28 26 74 6d 70 62 75 66 5b 70 61 64 6c 65 6e 20 (&tmpbuf[padlen
12f80 2b 20 33 5d 2c 20 62 75 66 2c 20 62 75 66 6c 65 + 3], buf, bufle
12f90 6e 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f n);......CACKEY_
12fa0 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 DEBUG_PRINTBUF("
12fb0 55 6e 70 61 64 64 65 64 3a 22 2c 20 62 75 66 2c Unpadded:", buf,
12fc0 20 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 43 41 buflen);.....CA
12fd0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
12fe0 42 55 46 28 22 50 61 64 64 65 64 3a 22 2c 20 74 BUF("Padded:", t
12ff0 6d 70 62 75 66 2c 20 74 6d 70 62 75 66 6c 65 6e mpbuf, tmpbuflen
13000 29 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 );....} else {..
13010 09 09 09 74 6d 70 62 75 66 20 3d 20 62 75 66 3b ...tmpbuf = buf;
13020 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d .....tmpbuflen =
13030 20 62 75 66 6c 65 6e 3b 0a 09 09 09 09 66 72 65 buflen;.....fre
13040 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09 e_tmpbuf = 0;...
13050 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b 0a 09 09 ..padlen = 0;...
13060 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 .}...} else {...
13070 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
13080 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 INTF("Unable to
13090 64 65 74 65 72 6d 69 6e 65 20 6b 65 79 20 73 69 determine key si
130a0 7a 65 2c 20 68 6f 70 69 6e 67 20 74 68 65 20 6d ze, hoping the m
130b0 65 73 73 61 67 65 20 69 73 20 70 72 6f 70 65 72 essage is proper
130c0 6c 79 20 70 61 64 64 65 64 21 22 29 3b 0a 0a 09 ly padded!");...
130d0 09 09 74 6d 70 62 75 66 20 3d 20 62 75 66 3b 0a ..tmpbuf = buf;.
130e0 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 62 ...tmpbuflen = b
130f0 75 66 6c 65 6e 3b 0a 09 09 09 66 72 65 65 5f 74 uflen;....free_t
13100 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09 09 70 61 mpbuf = 0;....pa
13110 64 6c 65 6e 20 3d 20 30 3b 0a 09 09 7d 0a 09 7d dlen = 0;...}..}
13120 20 65 6c 73 65 20 7b 0a 09 09 74 6d 70 62 75 66 else {...tmpbuf
13130 20 3d 20 62 75 66 3b 0a 09 09 74 6d 70 62 75 66 = buf;...tmpbuf
13140 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 09 09 len = buflen;...
13150 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b free_tmpbuf = 0;
13160 0a 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b 0a 09 ...padlen = 0;..
13170 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 74 72 61 }.../* Begin tra
13180 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 nsaction */..cac
13190 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 key_begin_transa
131a0 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 2f ction(slot);.../
131b0 2a 20 53 65 6c 65 63 74 20 63 6f 72 72 65 63 74 * Select correct
131c0 20 61 70 70 6c 65 74 20 2a 2f 0a 09 73 77 69 74 applet */..swit
131d0 63 68 20 28 69 64 5f 74 79 70 65 29 20 7b 0a 09 ch (id_type) {..
131e0 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f .case CACKEY_ID_
131f0 54 59 50 45 5f 43 41 43 3a 0a 09 09 09 43 41 43 TYPE_CAC:....CAC
13200 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
13210 28 22 53 65 6c 65 63 74 69 6e 67 20 61 70 70 6c ("Selecting appl
13220 65 74 20 66 6f 75 6e 64 20 61 74 20 25 70 20 2e et found at %p .
13230 2e 2e 22 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 ..", identity->p
13240 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 61 csc_identity->ca
13250 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 29 3b 0a rd.cac.applet);.
13260 09 09 09 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 ...cackey_select
13270 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 69 64 _applet(slot, id
13280 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 entity->pcsc_ide
13290 6e 74 69 74 79 2d 3e 63 61 72 64 2e 63 61 63 2e ntity->card.cac.
132a0 61 70 70 6c 65 74 2c 20 73 69 7a 65 6f 66 28 69 applet, sizeof(i
132b0 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 dentity->pcsc_id
132c0 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 63 61 63 entity->card.cac
132d0 2e 61 70 70 6c 65 74 29 29 3b 0a 0a 09 09 09 2f .applet));...../
132e0 2a 20 53 65 6c 65 63 74 20 63 6f 72 72 65 63 74 * Select correct
132f0 20 66 69 6c 65 20 2a 2f 0a 09 09 09 63 61 63 6b file */....cack
13300 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 ey_select_file(s
13310 6c 6f 74 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 lot, identity->p
13320 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 61 csc_identity->ca
13330 72 64 2e 63 61 63 2e 66 69 6c 65 29 3b 0a 09 09 rd.cac.file);...
13340 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 43 .break;...case C
13350 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 ACKEY_ID_TYPE_PI
13360 56 3a 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 V:....dyn_auth_t
13370 65 6d 70 6c 61 74 65 5b 30 5d 20 3d 20 30 78 37 emplate[0] = 0x7
13380 43 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 C;....dyn_auth_t
13390 65 6d 70 6c 61 74 65 5b 31 5d 20 3d 20 30 78 38 emplate[1] = 0x8
133a0 32 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 2;....dyn_auth_t
133b0 65 6d 70 6c 61 74 65 5b 32 5d 20 3d 20 28 28 74 emplate[2] = ((t
133c0 6d 70 62 75 66 6c 65 6e 20 2b 20 36 29 20 26 20 mpbuflen + 6) &
133d0 30 78 66 66 30 30 29 20 3e 3e 20 38 3b 0a 09 09 0xff00) >> 8;...
133e0 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 .dyn_auth_templa
133f0 74 65 5b 33 5d 20 3d 20 28 74 6d 70 62 75 66 6c te[3] = (tmpbufl
13400 65 6e 20 2b 20 36 29 20 26 20 30 78 30 30 66 66 en + 6) & 0x00ff
13410 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65 ;....dyn_auth_te
13420 6d 70 6c 61 74 65 5b 34 5d 20 3d 20 30 78 38 32 mplate[4] = 0x82
13430 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65 ;....dyn_auth_te
13440 6d 70 6c 61 74 65 5b 35 5d 20 3d 20 30 78 30 30 mplate[5] = 0x00
13450 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65 ;....dyn_auth_te
13460 6d 70 6c 61 74 65 5b 36 5d 20 3d 20 30 78 38 31 mplate[6] = 0x81
13470 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65 ;....dyn_auth_te
13480 6d 70 6c 61 74 65 5b 37 5d 20 3d 20 30 78 38 32 mplate[7] = 0x82
13490 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65 ;....dyn_auth_te
134a0 6d 70 6c 61 74 65 5b 38 5d 20 3d 20 28 74 6d 70 mplate[8] = (tmp
134b0 62 75 66 6c 65 6e 20 26 20 30 78 66 66 30 30 29 buflen & 0xff00)
134c0 20 3e 3e 20 38 3b 0a 09 09 09 64 79 6e 5f 61 75 >> 8;....dyn_au
134d0 74 68 5f 74 65 6d 70 6c 61 74 65 5b 39 5d 20 3d th_template[9] =
134e0 20 74 6d 70 62 75 66 6c 65 6e 20 26 20 30 78 30 tmpbuflen & 0x0
134f0 30 66 66 3b 0a 0a 09 09 09 64 79 6e 5f 61 75 74 0ff;.....dyn_aut
13500 68 5f 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f h_tmpbuf = mallo
13510 63 28 74 6d 70 62 75 66 6c 65 6e 20 2b 20 73 69 c(tmpbuflen + si
13520 7a 65 6f 66 28 64 79 6e 5f 61 75 74 68 5f 74 65 zeof(dyn_auth_te
13530 6d 70 6c 61 74 65 29 29 3b 0a 09 09 09 6d 65 6d mplate));....mem
13540 63 70 79 28 64 79 6e 5f 61 75 74 68 5f 74 6d 70 cpy(dyn_auth_tmp
13550 62 75 66 2c 20 64 79 6e 5f 61 75 74 68 5f 74 65 buf, dyn_auth_te
13560 6d 70 6c 61 74 65 2c 20 73 69 7a 65 6f 66 28 64 mplate, sizeof(d
13570 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 yn_auth_template
13580 29 29 3b 0a 09 09 09 6d 65 6d 63 70 79 28 64 79 ));....memcpy(dy
13590 6e 5f 61 75 74 68 5f 74 6d 70 62 75 66 20 2b 20 n_auth_tmpbuf +
135a0 73 69 7a 65 6f 66 28 64 79 6e 5f 61 75 74 68 5f sizeof(dyn_auth_
135b0 74 65 6d 70 6c 61 74 65 29 2c 20 74 6d 70 62 75 template), tmpbu
135c0 66 2c 20 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 0a f, tmpbuflen);..
135d0 09 09 09 69 66 20 28 66 72 65 65 5f 74 6d 70 62 ...if (free_tmpb
135e0 75 66 29 20 7b 0a 09 09 09 09 66 72 65 65 28 74 uf) {.....free(t
135f0 6d 70 62 75 66 29 3b 0a 09 09 09 7d 0a 0a 09 09 mpbuf);....}....
13600 09 74 6d 70 62 75 66 6c 65 6e 20 2b 3d 20 73 69 .tmpbuflen += si
13610 7a 65 6f 66 28 64 79 6e 5f 61 75 74 68 5f 74 65 zeof(dyn_auth_te
13620 6d 70 6c 61 74 65 29 3b 0a 09 09 09 74 6d 70 62 mplate);....tmpb
13630 75 66 20 3d 20 64 79 6e 5f 61 75 74 68 5f 74 6d uf = dyn_auth_tm
13640 70 62 75 66 3b 0a 09 09 09 66 72 65 65 5f 74 6d pbuf;....free_tm
13650 70 62 75 66 20 3d 20 31 3b 0a 0a 09 09 09 62 72 pbuf = 1;.....br
13660 65 61 6b 3b 0a 09 09 63 61 73 65 20 43 41 43 4b eak;...case CACK
13670 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f EY_ID_TYPE_CERT_
13680 4f 4e 4c 59 3a 0a 09 09 09 62 72 65 61 6b 3b 0a ONLY:....break;.
13690 09 7d 0a 0a 09 74 6d 70 62 75 66 5f 73 20 3d 20 .}...tmpbuf_s =
136a0 74 6d 70 62 75 66 3b 0a 09 6f 75 74 62 75 66 5f tmpbuf;..outbuf_
136b0 73 20 3d 20 6f 75 74 62 75 66 3b 0a 09 77 68 69 s = outbuf;..whi
136c0 6c 65 20 28 74 6d 70 62 75 66 6c 65 6e 29 20 7b le (tmpbuflen) {
136d0 0a 09 09 74 6d 70 6f 75 74 62 75 66 6c 65 6e 20 ...tmpoutbuflen
136e0 3d 20 6f 75 74 62 75 66 6c 65 6e 3b 0a 0a 09 09 = outbuflen;....
136f0 69 66 20 28 74 6d 70 62 75 66 6c 65 6e 20 3e 20 if (tmpbuflen >
13700 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 29 CACKEY_APDU_MTU)
13710 20 7b 0a 09 09 09 62 79 74 65 73 5f 74 6f 5f 73 {....bytes_to_s
13720 65 6e 64 20 3d 20 43 41 43 4b 45 59 5f 41 50 44 end = CACKEY_APD
13730 55 5f 4d 54 55 3b 0a 09 09 7d 20 65 6c 73 65 20 U_MTU;...} else
13740 7b 0a 09 09 09 62 79 74 65 73 5f 74 6f 5f 73 65 {....bytes_to_se
13750 6e 64 20 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a nd = tmpbuflen;.
13760 09 09 7d 0a 0a 09 09 73 65 6e 64 5f 72 65 74 20 ..}....send_ret
13770 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f = CACKEY_PCSC_E_
13780 47 45 4e 45 52 49 43 3b 0a 09 09 73 77 69 74 63 GENERIC;...switc
13790 68 20 28 69 64 5f 74 79 70 65 29 20 7b 0a 09 09 h (id_type) {...
137a0 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f .case CACKEY_ID_
137b0 54 59 50 45 5f 43 41 43 3a 0a 09 09 09 09 69 66 TYPE_CAC:.....if
137c0 20 28 74 6d 70 62 75 66 6c 65 6e 20 3e 20 43 41 (tmpbuflen > CA
137d0 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 29 20 7b CKEY_APDU_MTU) {
137e0 0a 09 09 09 09 09 70 31 20 3d 20 30 78 38 30 3b ......p1 = 0x80;
137f0 0a 09 09 09 09 09 6c 65 20 3d 20 30 78 30 30 3b ......le = 0x00;
13800 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 .....} else {...
13810 09 09 09 70 31 20 3d 20 30 78 30 30 3b 0a 09 09 ...p1 = 0x00;...
13820 09 09 09 6c 65 20 3d 20 30 78 30 30 3b 0a 09 09 ...le = 0x00;...
13830 09 09 7d 0a 0a 09 09 09 09 73 65 6e 64 5f 72 65 ..}......send_re
13840 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f t = cackey_send_
13850 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 apdu(slot, GSCIS
13860 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c _CLASS_GLOBAL_PL
13870 41 54 46 4f 52 4d 2c 20 47 53 43 49 53 5f 49 4e ATFORM, GSCIS_IN
13880 53 54 52 5f 53 49 47 4e 44 45 43 52 59 50 54 2c STR_SIGNDECRYPT,
13890 20 70 31 2c 20 30 78 30 30 2c 20 62 79 74 65 73 p1, 0x00, bytes
138a0 5f 74 6f 5f 73 65 6e 64 2c 20 74 6d 70 62 75 66 _to_send, tmpbuf
138b0 2c 20 6c 65 2c 20 26 72 65 73 70 63 6f 64 65 2c , le, &respcode,
138c0 20 6f 75 74 62 75 66 2c 20 26 74 6d 70 6f 75 74 outbuf, &tmpout
138d0 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 62 72 65 buflen);.....bre
138e0 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 41 43 4b ak;....case CACK
138f0 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a EY_ID_TYPE_PIV:.
13900 09 09 09 09 69 66 20 28 74 6d 70 62 75 66 6c 65 ....if (tmpbufle
13910 6e 20 3e 20 43 41 43 4b 45 59 5f 41 50 44 55 5f n > CACKEY_APDU_
13920 4d 54 55 29 20 7b 0a 09 09 09 09 09 63 6c 61 73 MTU) {......clas
13930 73 20 3d 20 30 78 31 30 3b 0a 09 09 09 09 09 6c s = 0x10;......l
13940 65 20 3d 20 30 78 30 30 3b 0a 09 09 09 09 7d 20 e = 0x00;.....}
13950 65 6c 73 65 20 7b 0a 09 09 09 09 09 63 6c 61 73 else {......clas
13960 73 20 3d 20 47 53 43 49 53 5f 43 4c 41 53 53 5f s = GSCIS_CLASS_
13970 49 53 4f 37 38 31 36 3b 0a 09 09 09 09 09 6c 65 ISO7816;......le
13980 20 3d 20 32 35 36 3b 0a 09 09 09 09 7d 0a 0a 09 = 256;.....}...
13990 09 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 ...send_ret = ca
139a0 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 ckey_send_apdu(s
139b0 6c 6f 74 2c 20 63 6c 61 73 73 2c 20 4e 49 53 54 lot, class, NIST
139c0 53 50 38 30 30 5f 37 33 5f 33 5f 49 4e 53 54 52 SP800_73_3_INSTR
139d0 5f 47 45 4e 41 55 54 48 2c 20 4e 49 53 54 53 50 _GENAUTH, NISTSP
139e0 38 30 30 5f 37 38 5f 33 5f 41 4c 47 4f 5f 52 53 800_78_3_ALGO_RS
139f0 41 32 30 34 38 2c 20 69 64 65 6e 74 69 74 79 2d A2048, identity-
13a00 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e >pcsc_identity->
13a10 63 61 72 64 2e 70 69 76 2e 6b 65 79 5f 69 64 2c card.piv.key_id,
13a20 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 2c 20 bytes_to_send,
13a30 74 6d 70 62 75 66 2c 20 6c 65 2c 20 26 72 65 73 tmpbuf, le, &res
13a40 70 63 6f 64 65 2c 20 6f 75 74 62 75 66 2c 20 26 pcode, outbuf, &
13a50 74 6d 70 6f 75 74 62 75 66 6c 65 6e 29 3b 0a 09 tmpoutbuflen);..
13a60 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 ...break;....cas
13a70 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 e CACKEY_ID_TYPE
13a80 5f 43 45 52 54 5f 4f 4e 4c 59 3a 0a 09 09 09 09 _CERT_ONLY:.....
13a90 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66 break;...}....if
13aa0 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 (send_ret != CA
13ab0 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 CKEY_PCSC_S_OK)
13ac0 7b 0a 09 09 09 69 66 20 28 66 72 65 65 5f 74 6d {....if (free_tm
13ad0 70 62 75 66 29 20 7b 0a 09 09 09 09 69 66 20 28 pbuf) {.....if (
13ae0 74 6d 70 62 75 66 5f 73 29 20 7b 0a 09 09 09 09 tmpbuf_s) {.....
13af0 09 66 72 65 65 28 74 6d 70 62 75 66 5f 73 29 3b .free(tmpbuf_s);
13b00 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 .....}....}.....
13b10 2f 2a 20 45 6e 64 20 74 72 61 6e 73 61 63 74 69 /* End transacti
13b20 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f on */....cackey_
13b30 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 end_transaction(
13b40 73 6c 6f 74 29 3b 0a 0a 09 09 09 69 66 20 28 73 slot);.....if (s
13b50 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 end_ret == CACKE
13b60 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29 20 Y_PCSC_E_RETRY)
13b70 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 {.....CACKEY_DEB
13b80 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20 UG_PRINTF("ADPU
13b90 53 65 6e 64 69 6e 67 20 46 61 69 6c 65 64 20 2d Sending Failed -
13ba0 2d 20 72 65 74 72 79 69 6e 67 2e 22 29 3b 0a 0a - retrying.");..
13bb0 09 09 09 09 72 65 74 75 72 6e 28 63 61 63 6b 65 ....return(cacke
13bc0 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28 73 6c y_signdecrypt(sl
13bd0 6f 74 2c 20 69 64 65 6e 74 69 74 79 2c 20 62 75 ot, identity, bu
13be0 66 2c 20 62 75 66 6c 65 6e 2c 20 6f 75 74 62 75 f, buflen, outbu
13bf0 66 2c 20 6f 75 74 62 75 66 6c 65 6e 2c 20 70 61 f, outbuflen, pa
13c00 64 49 6e 70 75 74 2c 20 75 6e 70 61 64 4f 75 74 dInput, unpadOut
13c10 70 75 74 29 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 put));....}.....
13c20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
13c30 4e 54 46 28 22 41 44 50 55 20 53 65 6e 64 69 6e NTF("ADPU Sendin
13c40 67 20 46 61 69 6c 65 64 20 2d 2d 20 72 65 74 75 g Failed -- retu
13c50 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 2e 22 rning in error."
13c60 29 3b 0a 0a 09 09 09 69 66 20 28 72 65 73 70 63 );.....if (respc
13c70 6f 64 65 20 3d 3d 20 30 78 36 39 38 32 20 7c 7c ode == 0x6982 ||
13c80 20 72 65 73 70 63 6f 64 65 20 3d 3d 20 30 78 36 respcode == 0x6
13c90 65 30 30 29 20 7b 0a 09 09 09 09 69 66 20 28 72 e00) {.....if (r
13ca0 65 73 70 63 6f 64 65 20 3d 3d 20 30 78 36 45 30 espcode == 0x6E0
13cb0 30 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 0) {......CACKEY
13cc0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 47 _DEBUG_PRINTF("G
13cd0 6f 74 20 5c 22 57 52 4f 4e 47 20 43 4c 41 53 53 ot \"WRONG CLASS
13ce0 5c 22 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 77 \", this means w
13cf0 65 20 61 72 65 20 74 61 6c 6b 69 6e 67 20 74 6f e are talking to
13d00 20 74 68 65 20 77 72 6f 6e 67 20 6f 62 6a 65 63 the wrong objec
13d10 74 20 28 6c 69 6b 65 6c 79 20 62 65 63 61 75 73 t (likely becaus
13d20 65 20 74 68 65 20 63 61 72 64 20 77 65 6e 74 20 e the card went
13d30 61 77 61 79 29 20 2d 2d 20 72 65 73 65 74 74 69 away) -- resetti
13d40 6e 67 22 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 ng");.....} else
13d50 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 {......CACKEY_D
13d60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 63 EBUG_PRINTF("Sec
13d70 75 72 69 74 79 20 73 74 61 74 75 73 20 6e 6f 74 urity status not
13d80 20 73 61 74 69 73 69 66 69 65 64 20 28 72 65 73 satisified (res
13d90 70 63 6f 64 65 20 3d 20 30 78 25 30 34 78 29 2e pcode = 0x%04x).
13da0 20 20 52 65 74 75 72 6e 69 6e 67 20 4e 45 45 44 Returning NEED
13db0 4c 4f 47 49 4e 22 2c 20 28 69 6e 74 29 20 72 65 LOGIN", (int) re
13dc0 73 70 63 6f 64 65 29 3b 0a 09 09 09 09 7d 0a 0a spcode);.....}..
13dd0 09 09 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f ....cackey_mark_
13de0 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 slot_reset(slot)
13df0 3b 0a 0a 09 09 09 09 73 6c 6f 74 2d 3e 74 6f 6b ;......slot->tok
13e00 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c en_flags = CKF_L
13e10 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 0a OGIN_REQUIRED;..
13e20 09 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 ....return(CACKE
13e30 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 Y_PCSC_E_NEEDLOG
13e40 49 4e 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 IN);....}.....if
13e50 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 (send_ret == CA
13e60 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 CKEY_PCSC_E_TOKE
13e70 4e 41 42 53 45 4e 54 29 20 7b 0a 09 09 09 09 43 NABSENT) {.....C
13e80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
13e90 54 46 28 22 54 6f 6b 65 6e 20 61 62 73 65 6e 74 TF("Token absent
13ea0 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 54 4f 4b . Returning TOK
13eb0 45 4e 41 42 53 45 4e 54 22 29 3b 0a 0a 09 09 09 ENABSENT");.....
13ec0 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f .cackey_mark_slo
13ed0 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a t_reset(slot);..
13ee0 09 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 ....return(CACKE
13ef0 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 Y_PCSC_E_TOKENAB
13f00 53 45 4e 54 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 SENT);....}.....
13f10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
13f20 4e 54 46 28 22 53 6f 6d 65 74 68 69 6e 67 20 77 NTF("Something w
13f30 65 6e 74 20 77 72 6f 6e 67 20 64 75 72 69 6e 67 ent wrong during
13f40 20 73 69 67 6e 69 6e 67 2c 20 72 65 73 65 74 74 signing, resett
13f50 69 6e 67 20 74 68 65 20 73 6c 6f 74 20 61 6e 64 ing the slot and
13f60 20 68 6f 70 69 6e 67 20 66 6f 72 20 74 68 65 20 hoping for the
13f70 62 65 73 74 2e 22 29 3b 0a 0a 09 09 09 63 61 63 best.");.....cac
13f80 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 key_mark_slot_re
13f90 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 72 set(slot);.....r
13fa0 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 eturn(CACKEY_PCS
13fb0 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 C_E_GENERIC);...
13fc0 7d 0a 0a 09 09 74 6d 70 62 75 66 20 2b 3d 20 62 }....tmpbuf += b
13fd0 79 74 65 73 5f 74 6f 5f 73 65 6e 64 3b 0a 09 09 ytes_to_send;...
13fe0 74 6d 70 62 75 66 6c 65 6e 20 2d 3d 20 62 79 74 tmpbuflen -= byt
13ff0 65 73 5f 74 6f 5f 73 65 6e 64 3b 0a 0a 09 09 6f es_to_send;....o
14000 75 74 62 75 66 20 2b 3d 20 74 6d 70 6f 75 74 62 utbuf += tmpoutb
14010 75 66 6c 65 6e 3b 0a 09 09 6f 75 74 62 75 66 6c uflen;...outbufl
14020 65 6e 20 2d 3d 20 74 6d 70 6f 75 74 62 75 66 6c en -= tmpoutbufl
14030 65 6e 3b 0a 09 09 72 65 74 76 61 6c 20 2b 3d 20 en;...retval +=
14040 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 7d tmpoutbuflen;..}
14050 0a 0a 09 69 66 20 28 66 72 65 65 5f 74 6d 70 62 ...if (free_tmpb
14060 75 66 29 20 7b 0a 09 09 69 66 20 28 74 6d 70 62 uf) {...if (tmpb
14070 75 66 5f 73 29 20 7b 0a 09 09 09 66 72 65 65 28 uf_s) {....free(
14080 74 6d 70 62 75 66 5f 73 29 3b 0a 09 09 7d 0a 09 tmpbuf_s);...}..
14090 7d 0a 0a 09 6f 75 74 62 75 66 20 3d 20 6f 75 74 }...outbuf = out
140a0 62 75 66 5f 73 3b 0a 0a 09 2f 2a 20 45 6e 64 20 buf_s;.../* End
140b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 transaction */..
140c0 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 cackey_end_trans
140d0 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 23 action(slot);..#
140e0 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41 52 ifdef CACKEY_PAR
140f0 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20 5f ANOID.# ifdef _
14100 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a POSIX_SSIZE_MAX.
14110 09 69 66 20 28 6f 75 74 62 75 66 6c 65 6e 20 3e .if (outbuflen >
14120 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 _POSIX_SSIZE_MA
14130 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 X) {...CACKEY_DE
14140 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 75 74 62 BUG_PRINTF("Outb
14150 75 66 6c 65 6e 20 65 78 63 65 65 64 73 20 6d 61 uflen exceeds ma
14160 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74 ximum value, ret
14170 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 urning in failur
14180 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 6f e. (max = %li, o
14190 75 74 62 75 66 6c 65 6e 20 3d 20 25 6c 75 29 22 utbuflen = %lu)"
141a0 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f , (long) _POSIX_
141b0 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 SSIZE_MAX, (unsi
141c0 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 75 74 62 75 gned long) outbu
141d0 66 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e flen);....return
141e0 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69 (-1);..}.# endi
141f0 66 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 57 65 f.#endif.../* We
14200 20 6d 75 73 74 20 72 65 6d 6f 76 65 20 74 68 65 must remove the
14210 20 22 37 43 22 20 74 61 67 20 74 6f 20 67 65 74 "7C" tag to get
14220 20 74 6f 20 74 68 65 20 73 69 67 6e 61 74 75 72 to the signatur
14230 65 20 2a 2f 0a 09 73 77 69 74 63 68 20 28 69 64 e */..switch (id
14240 5f 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20 _type) {...case
14250 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 CACKEY_ID_TYPE_P
14260 49 56 3a 0a 09 09 09 6f 75 74 62 75 66 5f 6c 65 IV:....outbuf_le
14270 6e 20 3d 20 72 65 74 76 61 6c 3b 0a 09 09 09 6f n = retval;....o
14280 75 74 62 75 66 5f 70 20 3d 20 63 61 63 6b 65 79 utbuf_p = cackey
14290 5f 72 65 61 64 5f 62 65 72 74 6c 76 5f 74 61 67 _read_bertlv_tag
142a0 28 6f 75 74 62 75 66 2c 20 26 6f 75 74 62 75 66 (outbuf, &outbuf
142b0 5f 6c 65 6e 2c 20 30 78 37 43 2c 20 4e 55 4c 4c _len, 0x7C, NULL
142c0 2c 20 20 26 6f 75 74 62 75 66 5f 6c 65 6e 29 3b , &outbuf_len);
142d0 0a 09 09 09 69 66 20 28 6f 75 74 62 75 66 5f 70 ....if (outbuf_p
142e0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 == NULL) {.....
142f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
14300 4e 54 46 28 22 52 65 73 70 6f 6e 73 65 20 66 72 NTF("Response fr
14310 6f 6d 20 50 49 56 20 66 6f 72 20 47 45 4e 45 52 om PIV for GENER
14320 41 54 45 20 41 55 54 48 45 4e 54 49 43 41 54 49 ATE AUTHENTICATI
14330 4f 4e 20 77 61 73 20 6e 6f 74 20 61 20 30 78 37 ON was not a 0x7
14340 43 20 74 61 67 2c 20 72 65 74 75 72 6e 69 6e 67 C tag, returning
14350 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a in failure");..
14360 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a ....return(-1);.
14370 09 09 09 7d 0a 0a 09 09 09 72 65 74 76 61 6c 20 ...}.....retval
14380 3d 20 6f 75 74 62 75 66 5f 6c 65 6e 3b 0a 0a 09 = outbuf_len;...
14390 09 09 6f 75 74 62 75 66 5f 6c 65 6e 20 3d 20 72 ..outbuf_len = r
143a0 65 74 76 61 6c 3b 0a 09 09 09 6f 75 74 62 75 66 etval;....outbuf
143b0 5f 70 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 _p = cackey_read
143c0 5f 62 65 72 74 6c 76 5f 74 61 67 28 6f 75 74 62 _bertlv_tag(outb
143d0 75 66 2c 20 26 6f 75 74 62 75 66 5f 6c 65 6e 2c uf, &outbuf_len,
143e0 20 30 78 38 32 2c 20 4e 55 4c 4c 2c 20 20 26 6f 0x82, NULL, &o
143f0 75 74 62 75 66 5f 6c 65 6e 29 3b 0a 09 09 09 69 utbuf_len);....i
14400 66 20 28 6f 75 74 62 75 66 5f 70 20 3d 3d 20 4e f (outbuf_p == N
14410 55 4c 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 ULL) {.....CACKE
14420 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
14430 52 65 73 70 6f 6e 73 65 20 66 72 6f 6d 20 50 49 Response from PI
14440 56 20 66 6f 72 20 47 45 4e 45 52 41 54 45 20 41 V for GENERATE A
14450 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 20 77 61 UTHENTICATION wa
14460 73 20 6e 6f 74 20 61 20 30 78 38 32 20 77 69 74 s not a 0x82 wit
14470 68 69 6e 20 61 20 30 78 37 43 20 74 61 67 2c 20 hin a 0x7C tag,
14480 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 returning in fai
14490 6c 75 72 65 22 29 3b 0a 0a 09 09 09 09 72 65 74 lure");......ret
144a0 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 0a 09 urn(-1);....}...
144b0 09 09 72 65 74 76 61 6c 20 3d 20 6f 75 74 62 75 ..retval = outbu
144c0 66 5f 6c 65 6e 3b 0a 0a 09 09 09 62 72 65 61 6b f_len;.....break
144d0 3b 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f ;...case CACKEY_
144e0 49 44 5f 54 59 50 45 5f 43 41 43 3a 0a 09 09 63 ID_TYPE_CAC:...c
144f0 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 ase CACKEY_ID_TY
14500 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 3a 0a 09 09 PE_CERT_ONLY:...
14510 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 2f 2a 20 .break;..}.../*
14520 55 6e 70 61 64 20 72 65 70 6c 79 20 2a 2f 0a 09 Unpad reply */..
14530 69 66 20 28 75 6e 70 61 64 4f 75 74 70 75 74 29 if (unpadOutput)
14540 20 7b 0a 09 09 69 66 20 28 72 65 74 76 61 6c 20 {...if (retval
14550 3c 20 33 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 < 3) {....CACKEY
14560 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
14570 65 70 6c 79 20 69 73 20 74 6f 6f 20 73 6d 61 6c eply is too smal
14580 6c 2c 20 77 65 20 61 72 65 20 6e 6f 74 20 61 62 l, we are not ab
14590 6c 65 20 74 6f 20 75 6e 70 61 64 20 2d 2d 20 70 le to unpad -- p
145a0 61 73 73 69 6e 67 20 62 61 63 6b 20 61 6e 64 20 assing back and
145b0 68 6f 70 69 6e 67 20 66 6f 72 20 74 68 65 20 62 hoping for the b
145c0 65 73 74 21 22 29 3b 0a 0a 09 09 09 43 41 43 4b est!");.....CACK
145d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
145e0 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 "Returning in su
145f0 63 63 65 73 73 2c 20 72 65 74 76 61 6c 20 3d 20 ccess, retval =
14600 25 6c 69 20 28 62 79 74 65 73 29 22 2c 20 28 6c %li (bytes)", (l
14610 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a 09 09 ong) retval);...
14620 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b .return(retval);
14630 0a 09 09 7d 0a 0a 09 09 69 66 20 28 6f 75 74 62 ...}....if (outb
14640 75 66 5b 30 5d 20 21 3d 20 30 78 30 30 29 20 7b uf[0] != 0x00) {
14650 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
14660 5f 50 52 49 4e 54 46 28 22 55 6e 72 65 63 6f 67 _PRINTF("Unrecog
14670 6e 69 7a 65 64 20 70 61 64 64 69 6e 67 20 73 63 nized padding sc
14680 68 65 6d 65 20 2d 2d 20 70 61 73 73 69 6e 67 20 heme -- passing
14690 62 61 63 6b 20 61 6e 64 20 68 6f 70 69 6e 67 20 back and hoping
146a0 66 6f 72 20 74 68 65 20 62 65 73 74 21 22 29 3b for the best!");
146b0 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
146c0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
146d0 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20 ing in success,
146e0 72 65 74 76 61 6c 20 3d 20 25 6c 69 20 28 62 79 retval = %li (by
146f0 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65 tes)", (long) re
14700 74 76 61 6c 29 3b 0a 09 09 09 72 65 74 75 72 6e tval);....return
14710 28 72 65 74 76 61 6c 29 3b 0a 09 09 7d 0a 0a 09 (retval);...}...
14720 09 62 6c 6f 63 6b 74 79 70 65 20 3d 20 6f 75 74 .blocktype = out
14730 62 75 66 5b 31 5d 3b 0a 09 09 75 6e 70 61 64 6f buf[1];...unpado
14740 66 66 73 65 74 20 3d 20 30 3b 0a 0a 09 09 73 77 ffset = 0;....sw
14750 69 74 63 68 20 28 62 6c 6f 63 6b 74 79 70 65 29 itch (blocktype)
14760 20 7b 0a 09 09 09 63 61 73 65 20 30 78 30 30 3a {....case 0x00:
14770 0a 09 09 09 09 2f 2a 20 50 61 64 64 69 6e 67 20 ...../* Padding
14780 53 63 68 65 6d 65 20 31 2c 20 74 68 65 20 66 69 Scheme 1, the fi
14790 72 73 74 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 rst non-zero byt
147a0 65 20 69 73 20 74 68 65 20 73 74 61 72 74 20 6f e is the start o
147b0 66 20 64 61 74 61 20 2a 2f 0a 09 09 09 09 66 6f f data */.....fo
147c0 72 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3d r (unpadoffset =
147d0 20 32 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 20 2; unpadoffset
147e0 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70 61 64 6f < retval; unpado
147f0 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09 09 09 09 ffset++) {......
14800 69 66 20 28 6f 75 74 62 75 66 5b 75 6e 70 61 64 if (outbuf[unpad
14810 6f 66 66 73 65 74 5d 20 21 3d 20 30 78 30 30 29 offset] != 0x00)
14820 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a {.......break;.
14830 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 .....}.....}....
14840 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 .break;....case
14850 30 78 30 31 3a 0a 09 09 09 09 2f 2a 20 50 61 64 0x01:...../* Pad
14860 64 69 6e 67 20 53 63 68 65 6d 65 20 32 2c 20 70 ding Scheme 2, p
14870 61 64 20 62 79 74 65 73 20 61 72 65 20 30 78 46 ad bytes are 0xF
14880 46 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 30 78 F followed by 0x
14890 30 30 20 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75 00 */.....for (u
148a0 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 32 3b 20 npadoffset = 2;
148b0 75 6e 70 61 64 6f 66 66 73 65 74 20 3c 20 72 65 unpadoffset < re
148c0 74 76 61 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65 tval; unpadoffse
148d0 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66 20 28 t++) {......if (
148e0 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 outbuf[unpadoffs
148f0 65 74 5d 20 21 3d 20 30 78 46 46 29 20 7b 0a 09 et] != 0xFF) {..
14900 09 09 09 09 09 69 66 20 28 6f 75 74 62 75 66 5b .....if (outbuf[
14910 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 3d 3d 20 unpadoffset] ==
14920 30 78 30 30 29 20 7b 0a 09 09 09 09 09 09 09 75 0x00) {........u
14930 6e 70 61 64 6f 66 66 73 65 74 2b 2b 3b 0a 0a 09 npadoffset++;...
14940 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 ......break;....
14950 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 ...} else {.....
14960 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
14970 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 PRINTF("Invalid
14980 70 61 64 64 69 6e 67 20 64 61 74 61 20 66 6f 75 padding data fou
14990 6e 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e nd, returning in
149a0 20 66 61 69 6c 75 72 65 2c 20 73 68 6f 75 6c 64 failure, should
149b0 20 68 61 76 65 20 62 65 65 6e 20 30 78 30 30 20 have been 0x00
149c0 66 6f 75 6e 64 20 30 78 25 30 32 78 22 2c 20 28 found 0x%02x", (
149d0 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6f 75 unsigned int) ou
149e0 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 tbuf[unpadoffset
149f0 5d 29 3b 0a 0a 09 09 09 09 09 09 09 72 65 74 75 ]);.........retu
14a00 72 6e 28 2d 31 29 3b 0a 09 09 09 09 09 09 7d 0a rn(-1);.......}.
14a10 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 .....} else {...
14a20 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
14a30 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 _PRINTF("Invalid
14a40 20 70 61 64 64 69 6e 67 20 64 61 74 61 20 66 6f padding data fo
14a50 75 6e 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 und, returning i
14a60 6e 20 66 61 69 6c 75 72 65 2c 20 73 68 6f 75 6c n failure, shoul
14a70 64 20 68 61 76 65 20 62 65 65 6e 20 30 78 46 46 d have been 0xFF
14a80 20 66 6f 75 6e 64 20 30 78 25 30 32 78 22 2c 20 found 0x%02x",
14a90 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6f (unsigned int) o
14aa0 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 utbuf[unpadoffse
14ab0 74 5d 29 3b 0a 0a 09 09 09 09 09 09 72 65 74 75 t]);........retu
14ac0 72 6e 28 2d 31 29 3b 0a 09 09 09 09 09 7d 0a 09 rn(-1);......}..
14ad0 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a ...}.....break;.
14ae0 09 09 09 63 61 73 65 20 30 78 30 32 3a 0a 09 09 ...case 0x02:...
14af0 09 09 2f 2a 20 50 61 64 64 69 6e 67 20 53 63 68 ../* Padding Sch
14b00 65 6d 65 20 33 2c 20 70 61 64 20 62 79 74 65 73 eme 3, pad bytes
14b10 20 61 72 65 20 6e 6f 6e 2d 7a 65 72 6f 20 66 69 are non-zero fi
14b20 72 73 74 20 7a 65 72 6f 20 62 79 74 65 20 66 6f rst zero byte fo
14b30 75 6e 64 20 69 73 20 74 68 65 20 73 65 70 65 72 und is the seper
14b40 61 74 6f 72 20 62 79 74 65 20 2a 2f 0a 09 09 09 ator byte */....
14b50 09 66 6f 72 20 28 75 6e 70 61 64 6f 66 66 73 65 .for (unpadoffse
14b60 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f 66 66 73 t = 2; unpadoffs
14b70 65 74 20 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70 et < retval; unp
14b80 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09 adoffset++) {...
14b90 09 09 09 69 66 20 28 6f 75 74 62 75 66 5b 75 6e ...if (outbuf[un
14ba0 70 61 64 6f 66 66 73 65 74 5d 20 3d 3d 20 30 78 padoffset] == 0x
14bb0 30 30 29 20 7b 0a 09 09 09 09 09 09 75 6e 70 61 00) {.......unpa
14bc0 64 6f 66 66 73 65 74 2b 2b 3b 0a 0a 09 09 09 09 doffset++;......
14bd0 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a ..break;......}.
14be0 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b ....}.....break;
14bf0 0a 09 09 7d 0a 0a 09 09 69 66 20 28 75 6e 70 61 ...}....if (unpa
14c00 64 6f 66 66 73 65 74 20 3e 20 72 65 74 76 61 6c doffset > retval
14c10 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 ) {....CACKEY_DE
14c20 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 66 66 73 BUG_PRINTF("Offs
14c30 65 74 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 et greater than
14c40 72 65 70 6c 79 20 73 69 7a 65 2c 20 61 62 6f 72 reply size, abor
14c50 74 69 6e 67 2e 20 20 28 75 6e 70 61 64 6f 66 66 ting. (unpadoff
14c60 73 65 74 20 3d 20 25 6c 75 2c 20 72 65 74 76 61 set = %lu, retva
14c70 6c 20 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73 69 l = %lu)", (unsi
14c80 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6e 70 61 64 gned long) unpad
14c90 6f 66 66 73 65 74 2c 20 28 75 6e 73 69 67 6e 65 offset, (unsigne
14ca0 64 20 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b d long) retval);
14cb0 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b .....return(-1);
14cc0 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 ...}....CACKEY_D
14cd0 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 50 EBUG_PRINTBUF("P
14ce0 61 64 64 65 64 3a 22 2c 20 6f 75 74 62 75 66 2c added:", outbuf,
14cf0 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 72 65 74 retval);....ret
14d00 76 61 6c 20 2d 3d 20 75 6e 70 61 64 6f 66 66 73 val -= unpadoffs
14d10 65 74 3b 0a 09 09 6d 65 6d 6d 6f 76 65 28 6f 75 et;...memmove(ou
14d20 74 62 75 66 2c 20 6f 75 74 62 75 66 20 2b 20 75 tbuf, outbuf + u
14d30 6e 70 61 64 6f 66 66 73 65 74 2c 20 72 65 74 76 npadoffset, retv
14d40 61 6c 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 al);....CACKEY_D
14d50 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 55 EBUG_PRINTBUF("U
14d60 6e 70 61 64 64 65 64 3a 22 2c 20 6f 75 74 62 75 npadded:", outbu
14d70 66 2c 20 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a f, retval);..}..
14d80 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
14d90 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
14da0 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74 in success, ret
14db0 76 61 6c 20 3d 20 25 6c 69 20 28 62 79 74 65 73 val = %li (bytes
14dc0 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65 74 76 61 )", (long) retva
14dd0 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 l);...return(ret
14de0 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 val);.}../*. * S
14df0 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e YNPOSIS. * .
14e00 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e ... *. * ARGUMEN
14e10 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a TS. * .... *
14e20 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 . * RETURN VALUE
14e30 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 . * .... *.
14e40 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e * NOTES. * .
14e50 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 ... *. */.static
14e60 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b cackey_ret cack
14e70 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 ey_token_present
14e80 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 (struct cackey_s
14e90 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 lot *slot) {..ca
14ea0 63 6b 65 79 5f 72 65 74 20 70 63 73 63 5f 63 6f ckey_ret pcsc_co
14eb0 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 44 57 4f 52 nnect_ret;..DWOR
14ec0 44 20 72 65 61 64 65 72 5f 6c 65 6e 20 3d 20 30 D reader_len = 0
14ed0 2c 20 73 74 61 74 65 20 3d 20 30 2c 20 70 72 6f , state = 0, pro
14ee0 74 6f 63 6f 6c 20 3d 20 30 2c 20 61 74 72 5f 6c tocol = 0, atr_l
14ef0 65 6e 3b 0a 09 42 59 54 45 20 61 74 72 5b 4d 41 en;..BYTE atr[MA
14f00 58 5f 41 54 52 5f 53 49 5a 45 5d 3b 0a 09 4c 4f X_ATR_SIZE];..LO
14f10 4e 47 20 73 74 61 74 75 73 5f 72 65 74 2c 20 73 NG status_ret, s
14f20 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b card_reconn_ret;
14f30 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
14f40 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
14f50 29 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 69 );...if (slot->i
14f60 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 43 41 43 nternal) {...CAC
14f70 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
14f80 28 22 52 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 ("Returning toke
14f90 6e 20 70 72 65 73 65 6e 74 20 28 69 6e 74 65 72 n present (inter
14fa0 6e 61 6c 20 74 6f 6b 65 6e 29 22 29 3b 0a 0a 09 nal token)");...
14fb0 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 .return(CACKEY_P
14fc0 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 CSC_S_TOKENPRESE
14fd0 4e 54 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 63 NT);..}...pcsc_c
14fe0 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63 onnect_ret = cac
14ff0 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 key_connect_card
15000 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28 70 63 73 (slot);..if (pcs
15010 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d c_connect_ret !=
15020 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f CACKEY_PCSC_S_O
15030 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 K) {...CACKEY_DE
15040 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 BUG_PRINTF("Unab
15050 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f le to connect to
15060 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 card, returning
15070 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 22 29 3b token absent");
15080 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 ....return(CACKE
15090 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 Y_PCSC_E_TOKENAB
150a0 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b SENT);..}...CACK
150b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
150c0 22 43 61 6c 6c 69 6e 67 20 53 43 61 72 64 53 74 "Calling SCardSt
150d0 61 74 75 73 28 29 20 74 6f 20 64 65 74 65 72 6d atus() to determ
150e0 69 6e 65 20 63 61 72 64 20 73 74 61 74 75 73 22 ine card status"
150f0 29 3b 0a 0a 09 61 74 72 5f 6c 65 6e 20 3d 20 73 );...atr_len = s
15100 69 7a 65 6f 66 28 61 74 72 29 3b 0a 09 73 74 61 izeof(atr);..sta
15110 74 75 73 5f 72 65 74 20 3d 20 53 43 61 72 64 53 tus_ret = SCardS
15120 74 61 74 75 73 28 73 6c 6f 74 2d 3e 70 63 73 63 tatus(slot->pcsc
15130 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c 20 26 72 65 _card, NULL, &re
15140 61 64 65 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65 ader_len, &state
15150 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72 , &protocol, atr
15160 2c 20 26 61 74 72 5f 6c 65 6e 29 3b 0a 0a 09 69 , &atr_len);...i
15170 66 20 28 73 74 61 74 75 73 5f 72 65 74 20 3d 3d f (status_ret ==
15180 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 SCARD_E_INVALID
15190 5f 48 41 4e 44 4c 45 29 20 7b 0a 09 09 43 41 43 _HANDLE) {...CAC
151a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
151b0 28 22 53 43 61 72 64 53 74 61 74 75 73 28 29 20 ("SCardStatus()
151c0 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45 returned SCARD_E
151d0 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 2c _INVALID_HANDLE,
151e0 20 6d 61 72 6b 69 6e 67 20 69 73 20 6e 6f 74 20 marking is not
151f0 61 6c 72 65 61 64 79 20 63 6f 6e 6e 65 63 74 65 already connecte
15200 64 20 61 6e 64 20 74 72 79 69 6e 67 20 61 67 61 d and trying aga
15210 69 6e 22 29 3b 0a 09 09 63 61 63 6b 65 79 5f 6d in");...cackey_m
15220 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 ark_slot_reset(s
15230 6c 6f 74 29 3b 0a 0a 09 09 70 63 73 63 5f 63 6f lot);....pcsc_co
15240 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b nnect_ret = cack
15250 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 ey_connect_card(
15260 73 6c 6f 74 29 3b 0a 09 09 69 66 20 28 70 63 73 slot);...if (pcs
15270 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d c_connect_ret !=
15280 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f CACKEY_PCSC_S_O
15290 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 K) {....CACKEY_D
152a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 EBUG_PRINTF("Una
152b0 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74 ble to connect t
152c0 6f 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e o card, returnin
152d0 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 22 29 g token absent")
152e0 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 ;.....return(CAC
152f0 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e KEY_PCSC_E_TOKEN
15300 41 42 53 45 4e 54 29 3b 0a 09 09 7d 0a 0a 09 09 ABSENT);...}....
15310 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
15320 4e 54 46 28 22 43 61 6c 6c 69 6e 67 20 53 43 61 NTF("Calling SCa
15330 72 64 53 74 61 74 75 73 28 29 20 61 67 61 69 6e rdStatus() again
15340 22 29 3b 0a 0a 09 09 61 74 72 5f 6c 65 6e 20 3d ");....atr_len =
15350 20 73 69 7a 65 6f 66 28 61 74 72 29 3b 0a 09 09 sizeof(atr);...
15360 73 74 61 74 75 73 5f 72 65 74 20 3d 20 53 43 61 status_ret = SCa
15370 72 64 53 74 61 74 75 73 28 73 6c 6f 74 2d 3e 70 rdStatus(slot->p
15380 63 73 63 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c 20 csc_card, NULL,
15390 26 72 65 61 64 65 72 5f 6c 65 6e 2c 20 26 73 74 &reader_len, &st
153a0 61 74 65 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 ate, &protocol,
153b0 61 74 72 2c 20 26 61 74 72 5f 6c 65 6e 29 3b 0a atr, &atr_len);.
153c0 09 7d 0a 0a 09 69 66 20 28 73 74 61 74 75 73 5f .}...if (status_
153d0 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 ret != SCARD_S_S
153e0 55 43 43 45 53 53 29 20 7b 0a 09 09 63 61 63 6b UCCESS) {...cack
153f0 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 ey_mark_slot_res
15400 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 69 66 20 et(slot);....if
15410 28 73 74 61 74 75 73 5f 72 65 74 20 3d 3d 20 53 (status_ret == S
15420 43 41 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52 CARD_W_RESET_CAR
15430 44 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 D) {....CACKEY_D
15440 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 EBUG_PRINTF("Res
15450 65 74 20 72 65 71 75 69 72 65 64 2c 20 70 6c 65 et required, ple
15460 61 73 65 20 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a ase hold...");..
15470 09 09 09 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f ...scard_reconn_
15480 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 63 ret = cackey_rec
15490 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 onnect_card(slot
154a0 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c , SCARD_PROTOCOL
154b0 5f 54 30 20 7c 20 53 43 41 52 44 5f 50 52 4f 54 _T0 | SCARD_PROT
154c0 4f 43 4f 4c 5f 54 31 29 3b 0a 09 09 09 69 66 20 OCOL_T1);....if
154d0 28 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 (scard_reconn_re
154e0 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 t == SCARD_S_SUC
154f0 43 45 53 53 29 20 7b 0a 09 09 09 09 2f 2a 20 52 CESS) {...../* R
15500 65 2d 65 73 74 61 62 6c 69 73 68 20 74 72 61 6e e-establish tran
15510 73 61 63 74 69 6f 6e 2c 20 69 66 20 69 74 20 77 saction, if it w
15520 61 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 09 09 as present */...
15530 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e ..if (slot->tran
15540 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 saction_depth >
15550 30 29 20 7b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 0) {......slot->
15560 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 transaction_dept
15570 68 2d 2d 3b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e h--;......slot->
15580 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 transaction_need
15590 5f 68 77 5f 6c 6f 63 6b 20 3d 20 31 3b 0a 09 09 _hw_lock = 1;...
155a0 09 09 09 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f ...cackey_begin_
155b0 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 transaction(slot
155c0 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 );.....}......CA
155d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
155e0 46 28 22 52 65 73 65 74 20 73 75 63 63 65 73 73 F("Reset success
155f0 66 75 6c 2c 20 72 65 71 75 65 72 79 69 6e 67 22 ful, requerying"
15600 29 3b 0a 09 09 09 09 73 74 61 74 75 73 5f 72 65 );.....status_re
15610 74 20 3d 20 53 43 61 72 64 53 74 61 74 75 73 28 t = SCardStatus(
15620 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c slot->pcsc_card,
15630 20 4e 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f 6c NULL, &reader_l
15640 65 6e 2c 20 26 73 74 61 74 65 2c 20 26 70 72 6f en, &state, &pro
15650 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74 72 tocol, atr, &atr
15660 5f 6c 65 6e 29 3b 0a 09 09 09 09 69 66 20 28 73 _len);.....if (s
15670 74 61 74 75 73 5f 72 65 74 20 21 3d 20 53 43 41 tatus_ret != SCA
15680 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a RD_S_SUCCESS) {.
15690 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
156a0 47 5f 50 52 49 4e 54 46 28 22 53 74 69 6c 6c 20 G_PRINTF("Still
156b0 75 6e 61 62 6c 65 20 74 6f 20 71 75 65 72 79 20 unable to query
156c0 63 61 72 64 20 73 74 61 74 75 73 2c 20 72 65 74 card status, ret
156d0 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 urning token abs
156e0 65 6e 74 2e 20 20 53 43 61 72 64 53 74 61 74 75 ent. SCardStatu
156f0 73 28 29 20 3d 20 25 73 22 2c 20 43 41 43 4b 45 s() = %s", CACKE
15700 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 Y_DEBUG_FUNC_SCA
15710 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 74 61 RDERR_TO_STR(sta
15720 74 75 73 5f 72 65 74 29 29 3b 0a 0a 09 09 09 09 tus_ret));......
15730 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 .return(CACKEY_P
15740 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e CSC_E_TOKENABSEN
15750 54 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 T);.....}....} e
15760 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 lse {.....CACKEY
15770 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 _DEBUG_PRINTF("U
15780 6e 61 62 6c 65 20 74 6f 20 72 65 63 6f 6e 6e 65 nable to reconne
15790 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75 ct to card, retu
157a0 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 rning token abse
157b0 6e 74 2e 20 20 53 43 61 72 64 52 65 63 6f 6e 6e nt. SCardReconn
157c0 65 63 74 28 29 20 3d 20 25 73 22 2c 20 43 41 43 ect() = %s", CAC
157d0 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 KEY_DEBUG_FUNC_S
157e0 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 CARDERR_TO_STR(s
157f0 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 29 card_reconn_ret)
15800 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 );......return(C
15810 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b ACKEY_PCSC_E_TOK
15820 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 7d 0a ENABSENT);....}.
15830 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 ..} else {....CA
15840 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
15850 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 71 75 65 F("Unable to que
15860 72 79 20 63 61 72 64 20 73 74 61 74 75 73 2c 20 ry card status,
15870 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 returning token
15880 61 62 73 65 6e 74 2e 20 20 53 43 61 72 64 53 74 absent. SCardSt
15890 61 74 75 73 28 29 20 3d 20 25 73 22 2c 20 43 41 atus() = %s", CA
158a0 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f CKEY_DEBUG_FUNC_
158b0 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 SCARDERR_TO_STR(
158c0 73 74 61 74 75 73 5f 72 65 74 29 29 3b 0a 0a 09 status_ret));...
158d0 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f ..return(CACKEY_
158e0 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 PCSC_E_TOKENABSE
158f0 4e 54 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 NT);...}..}...if
15900 20 28 28 73 74 61 74 65 20 26 20 53 43 41 52 44 ((state & SCARD
15910 5f 41 42 53 45 4e 54 29 20 3d 3d 20 53 43 41 52 _ABSENT) == SCAR
15920 44 5f 41 42 53 45 4e 54 29 20 7b 0a 09 09 43 41 D_ABSENT) {...CA
15930 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
15940 46 28 22 43 61 72 64 20 69 73 20 61 62 73 65 6e F("Card is absen
15950 74 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b t, returning tok
15960 65 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09 en absent");....
15970 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 return(CACKEY_PC
15980 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 SC_E_TOKENABSENT
15990 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 );..}...CACKEY_D
159a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
159b0 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 70 72 65 urning token pre
159c0 73 65 6e 74 2e 22 29 3b 0a 0a 09 72 65 74 75 72 sent.");...retur
159d0 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f n(CACKEY_PCSC_S_
159e0 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 3b 0a 7d TOKENPRESENT);.}
159f0 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 ../*. * SYNPOSIS
15a00 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 . * .... *.
15a10 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 * ARGUMENTS. *
15a20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 .... *. * RET
15a30 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 URN VALUE. *
15a40 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 .... *. * NOTES
15a50 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 . * .... *.
15a60 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 */.static cackey
15a70 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65 74 5f _ret cackey_set_
15a80 70 69 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65 pin(struct cacke
15a90 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e y_slot *slot, un
15aa0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 6c 64 signed char *old
15ab0 5f 70 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20 6c _pin, unsigned l
15ac0 6f 6e 67 20 6f 6c 64 5f 70 69 6e 5f 6c 65 6e 2c ong old_pin_len,
15ad0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
15ae0 70 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f pin, unsigned lo
15af0 6e 67 20 70 69 6e 5f 6c 65 6e 29 20 7b 0a 09 73 ng pin_len) {..s
15b00 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 truct cackey_pcs
15b10 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63 c_identity *pcsc
15b20 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e _identities;..un
15b30 73 69 67 6e 65 64 20 63 68 61 72 20 63 61 63 5f signed char cac_
15b40 70 69 6e 5b 38 5d 20 3d 20 7b 30 78 46 46 2c 20 pin[8] = {0xFF,
15b50 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 0xFF, 0xFF, 0xFF
15b60 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 , 0xFF, 0xFF, 0x
15b70 46 46 2c 20 30 78 46 46 7d 3b 0a 09 75 6e 73 69 FF, 0xFF};..unsi
15b80 67 6e 65 64 20 63 68 61 72 20 6f 6c 64 5f 63 61 gned char old_ca
15b90 63 5f 70 69 6e 5b 38 5d 20 3d 20 7b 30 78 46 46 c_pin[8] = {0xFF
15ba0 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 , 0xFF, 0xFF, 0x
15bb0 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 FF, 0xFF, 0xFF,
15bc0 30 78 46 46 2c 20 30 78 46 46 7d 3b 0a 09 75 6e 0xFF, 0xFF};..un
15bd0 73 69 67 6e 65 64 20 63 68 61 72 20 70 69 6e 5f signed char pin_
15be0 75 70 64 61 74 65 5b 73 69 7a 65 6f 66 28 63 61 update[sizeof(ca
15bf0 63 5f 70 69 6e 29 20 2b 20 73 69 7a 65 6f 66 28 c_pin) + sizeof(
15c00 6f 6c 64 5f 63 61 63 5f 70 69 6e 29 5d 3b 0a 09 old_cac_pin)];..
15c10 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 unsigned long nu
15c20 6d 5f 63 65 72 74 73 3b 0a 09 75 69 6e 74 31 36 m_certs;..uint16
15c30 5f 74 20 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 _t response_code
15c40 3b 0a 09 69 6e 74 20 74 72 69 65 73 5f 72 65 6d ;..int tries_rem
15c50 61 69 6e 69 6e 67 3b 0a 09 69 6e 74 20 73 65 6e aining;..int sen
15c60 64 5f 72 65 74 3b 0a 09 69 6e 74 20 6b 65 79 5f d_ret;..int key_
15c70 72 65 66 65 72 65 6e 63 65 20 3d 20 30 78 30 30 reference = 0x00
15c80 3b 0a 0a 09 2f 2a 20 41 70 70 61 72 65 6e 74 6c ;.../* Apparentl
15c90 79 2c 20 43 41 43 20 50 49 4e 73 20 61 72 65 20 y, CAC PINs are
15ca0 2a 45 58 41 43 54 4c 59 2a 20 38 20 62 79 74 65 *EXACTLY* 8 byte
15cb0 73 20 6c 6f 6e 67 20 2d 2d 20 70 61 64 20 77 69 s long -- pad wi
15cc0 74 68 20 30 78 46 46 20 69 66 20 74 6f 6f 20 73 th 0xFF if too s
15cd0 68 6f 72 74 20 2a 2f 0a 09 69 66 20 28 70 69 6e hort */..if (pin
15ce0 5f 6c 65 6e 20 3e 3d 20 38 29 20 7b 0a 09 09 6d _len >= 8) {...m
15cf0 65 6d 63 70 79 28 63 61 63 5f 70 69 6e 2c 20 70 emcpy(cac_pin, p
15d00 69 6e 2c 20 38 29 3b 0a 09 7d 20 65 6c 73 65 20 in, 8);..} else
15d10 7b 0a 09 09 6d 65 6d 63 70 79 28 63 61 63 5f 70 {...memcpy(cac_p
15d20 69 6e 2c 20 70 69 6e 2c 20 70 69 6e 5f 6c 65 6e in, pin, pin_len
15d30 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 6c 64 5f );..}...if (old_
15d40 70 69 6e 5f 6c 65 6e 20 3e 3d 20 38 29 20 7b 0a pin_len >= 8) {.
15d50 09 09 6d 65 6d 63 70 79 28 6f 6c 64 5f 63 61 63 ..memcpy(old_cac
15d60 5f 70 69 6e 2c 20 6f 6c 64 5f 70 69 6e 2c 20 38 _pin, old_pin, 8
15d70 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d );..} else {...m
15d80 65 6d 63 70 79 28 6f 6c 64 5f 63 61 63 5f 70 69 emcpy(old_cac_pi
15d90 6e 2c 20 6f 6c 64 5f 70 69 6e 2c 20 6f 6c 64 5f n, old_pin, old_
15da0 70 69 6e 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 2f pin_len);..}.../
15db0 2a 20 43 6f 6e 63 61 74 65 6e 61 74 65 20 62 6f * Concatenate bo
15dc0 74 68 20 50 49 4e 73 20 74 6f 67 65 74 68 65 72 th PINs together
15dd0 20 74 6f 20 73 65 6e 64 20 61 73 20 61 20 73 69 to send as a si
15de0 6e 67 6c 65 20 69 6e 73 74 72 75 63 74 69 6f 6e ngle instruction
15df0 20 2a 2f 0a 09 6d 65 6d 63 70 79 28 70 69 6e 5f */..memcpy(pin_
15e00 75 70 64 61 74 65 2c 20 6f 6c 64 5f 63 61 63 5f update, old_cac_
15e10 70 69 6e 2c 20 73 69 7a 65 6f 66 28 6f 6c 64 5f pin, sizeof(old_
15e20 63 61 63 5f 70 69 6e 29 29 3b 0a 09 6d 65 6d 63 cac_pin));..memc
15e30 70 79 28 70 69 6e 5f 75 70 64 61 74 65 20 2b 20 py(pin_update +
15e40 73 69 7a 65 6f 66 28 6f 6c 64 5f 63 61 63 5f 70 sizeof(old_cac_p
15e50 69 6e 29 2c 20 63 61 63 5f 70 69 6e 2c 20 73 69 in), cac_pin, si
15e60 7a 65 6f 66 28 63 61 63 5f 70 69 6e 29 29 3b 0a zeof(cac_pin));.
15e70 0a 09 2f 2a 20 52 65 6a 65 63 74 20 50 49 4e 73 ../* Reject PINs
15e80 20 77 68 69 63 68 20 61 72 65 20 74 6f 6f 20 73 which are too s
15e90 68 6f 72 74 20 2a 2f 0a 09 69 66 20 28 70 69 6e hort */..if (pin
15ea0 5f 6c 65 6e 20 3c 20 35 29 20 7b 0a 09 09 43 41 _len < 5) {...CA
15eb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
15ec0 46 28 22 52 65 6a 65 63 74 69 6e 67 20 4e 65 77 F("Rejecting New
15ed0 20 50 49 4e 20 77 68 69 63 68 20 69 73 20 74 6f PIN which is to
15ee0 6f 20 73 68 6f 72 74 20 28 6c 65 6e 67 74 68 20 o short (length
15ef0 3d 20 25 6c 75 2c 20 6d 75 73 74 20 62 65 20 61 = %lu, must be a
15f00 74 6c 65 61 73 74 20 35 29 22 2c 20 70 69 6e 5f tleast 5)", pin_
15f10 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 len);....return(
15f20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 CACKEY_PCSC_E_BA
15f30 44 50 49 4e 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 DPIN);..}...if (
15f40 6f 6c 64 5f 70 69 6e 5f 6c 65 6e 20 3c 20 35 29 old_pin_len < 5)
15f50 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
15f60 47 5f 50 52 49 4e 54 46 28 22 52 65 6a 65 63 74 G_PRINTF("Reject
15f70 69 6e 67 20 4f 6c 64 20 50 49 4e 20 77 68 69 63 ing Old PIN whic
15f80 68 20 69 73 20 74 6f 6f 20 73 68 6f 72 74 20 28 h is too short (
15f90 6c 65 6e 67 74 68 20 3d 20 25 6c 75 2c 20 6d 75 length = %lu, mu
15fa0 73 74 20 62 65 20 61 74 6c 65 61 73 74 20 35 29 st be atleast 5)
15fb0 22 2c 20 6f 6c 64 5f 70 69 6e 5f 6c 65 6e 29 3b ", old_pin_len);
15fc0 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 ....return(CACKE
15fd0 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 Y_PCSC_E_BADPIN)
15fe0 3b 0a 09 7d 0a 0a 09 2f 2a 20 50 49 56 20 61 75 ;..}.../* PIV au
15ff0 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 75 73 65 thentication use
16000 73 20 61 20 22 6b 65 79 5f 72 65 66 65 72 65 6e s a "key_referen
16010 63 65 22 20 6f 66 20 30 78 38 30 20 2a 2f 0a 09 ce" of 0x80 */..
16020 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 pcsc_identities
16030 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 = cackey_read_ce
16040 72 74 73 28 73 6c 6f 74 2c 20 4e 55 4c 4c 2c 20 rts(slot, NULL,
16050 26 6e 75 6d 5f 63 65 72 74 73 29 3b 0a 09 69 66 &num_certs);..if
16060 20 28 6e 75 6d 5f 63 65 72 74 73 20 3e 20 30 20 (num_certs > 0
16070 26 26 20 70 63 73 63 5f 69 64 65 6e 74 69 74 69 && pcsc_identiti
16080 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 es != NULL) {...
16090 73 77 69 74 63 68 20 28 70 63 73 63 5f 69 64 65 switch (pcsc_ide
160a0 6e 74 69 74 69 65 73 5b 30 5d 2e 69 64 5f 74 79 ntities[0].id_ty
160b0 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20 43 41 pe) {....case CA
160c0 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 CKEY_ID_TYPE_PIV
160d0 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 :.....CACKEY_DEB
160e0 55 47 5f 50 52 49 4e 54 46 28 22 57 65 20 68 61 UG_PRINTF("We ha
160f0 76 65 20 50 49 56 20 63 61 72 64 2c 20 73 6f 20 ve PIV card, so
16100 77 65 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 we will attempt
16110 74 6f 20 61 75 74 68 65 6e 74 69 63 61 74 65 20 to authenticate
16120 75 73 69 6e 67 20 74 68 65 20 50 49 56 20 41 70 using the PIV Ap
16130 70 6c 69 63 61 74 69 6f 6e 20 6b 65 79 20 72 65 plication key re
16140 66 65 72 65 6e 63 65 22 29 3b 0a 0a 09 09 09 09 ference");......
16150 6b 65 79 5f 72 65 66 65 72 65 6e 63 65 20 3d 20 key_reference =
16160 30 78 38 30 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0x80;.....break;
16170 0a 09 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 ....default:....
16180 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 63 .break;...}....c
16190 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73 ackey_free_certs
161a0 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 (pcsc_identities
161b0 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b , num_certs, 1);
161c0 0a 09 7d 0a 0a 09 2f 2a 20 49 73 73 75 65 20 61 ..}.../* Issue a
161d0 20 53 65 74 20 50 49 4e 20 28 43 48 41 4e 47 45 Set PIN (CHANGE
161e0 20 52 45 46 45 52 45 4e 43 45 29 20 2a 2f 0a 09 REFERENCE) */..
161f0 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 send_ret = cacke
16200 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 y_send_apdu(slot
16210 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 , GSCIS_CLASS_IS
16220 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 O7816, GSCIS_INS
16230 54 52 5f 43 48 41 4e 47 45 5f 52 45 46 45 52 45 TR_CHANGE_REFERE
16240 4e 43 45 2c 20 30 78 30 30 2c 20 6b 65 79 5f 72 NCE, 0x00, key_r
16250 65 66 65 72 65 6e 63 65 2c 20 73 69 7a 65 6f 66 eference, sizeof
16260 28 70 69 6e 5f 75 70 64 61 74 65 29 2c 20 70 69 (pin_update), pi
16270 6e 5f 75 70 64 61 74 65 2c 20 30 78 30 30 2c 20 n_update, 0x00,
16280 26 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 2c 20 &response_code,
16290 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 NULL, NULL);...i
162a0 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 f (send_ret != C
162b0 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 ACKEY_PCSC_S_OK)
162c0 20 7b 0a 09 09 69 66 20 28 28 72 65 73 70 6f 6e {...if ((respon
162d0 73 65 5f 63 6f 64 65 20 26 20 30 78 36 33 43 30 se_code & 0x63C0
162e0 29 20 3d 3d 20 30 78 36 33 43 30 29 20 7b 0a 09 ) == 0x63C0) {..
162f0 09 09 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e ..tries_remainin
16300 67 20 3d 20 28 72 65 73 70 6f 6e 73 65 5f 63 6f g = (response_co
16310 64 65 20 26 20 30 78 46 29 3b 0a 0a 09 09 09 43 de & 0xF);.....C
16320 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
16330 54 46 28 22 50 49 4e 20 56 65 72 69 66 69 63 61 TF("PIN Verifica
16340 74 69 6f 6e 20 66 61 69 6c 65 64 2c 20 25 69 20 tion failed, %i
16350 74 72 69 65 73 20 72 65 6d 61 69 6e 69 6e 67 22 tries remaining"
16360 2c 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e , tries_remainin
16370 67 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 g);.....return(C
16380 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 ACKEY_PCSC_E_BAD
16390 50 49 4e 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 PIN);...}....if
163a0 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 3d (response_code =
163b0 3d 20 30 78 36 39 38 33 29 20 7b 0a 09 09 09 43 = 0x6983) {....C
163c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
163d0 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 73 65 TF("Unable to se
163e0 74 20 50 49 4e 2c 20 64 65 76 69 63 65 20 69 73 t PIN, device is
163f0 20 6c 6f 63 6b 65 64 20 6f 72 20 63 68 61 6e 67 locked or chang
16400 69 6e 67 20 74 68 65 20 50 49 4e 20 69 73 20 64 ing the PIN is d
16410 69 73 61 62 6c 65 64 22 29 3b 0a 0a 09 09 09 72 isabled");.....r
16420 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 eturn(CACKEY_PCS
16430 43 5f 45 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d C_E_LOCKED);...}
16440 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 ....return(CACKE
16450 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 Y_PCSC_E_GENERIC
16460 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 );..}...CACKEY_D
16470 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e EBUG_PRINTF("PIN
16480 20 43 68 61 6e 67 65 20 73 75 63 63 65 65 64 65 Change succeede
16490 64 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 d");...return(CA
164a0 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b CKEY_PCSC_S_OK);
164b0 0a 0a 09 2f 2a 20 44 69 73 61 62 6c 65 20 61 20 .../* Disable a
164c0 77 61 72 6e 69 6e 67 2c 20 73 69 6e 63 65 20 74 warning, since t
164d0 68 69 73 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 his is only used
164e0 20 69 6e 20 64 65 62 75 67 20 6d 6f 64 65 20 2a in debug mode *
164f0 2f 0a 09 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 /..tries_remaini
16500 6e 67 20 3d 20 74 72 69 65 73 5f 72 65 6d 61 69 ng = tries_remai
16510 6e 69 6e 67 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 ning;.}../*. * S
16520 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e YNPOSIS. * .
16530 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e ... *. * ARGUMEN
16540 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a TS. * .... *
16550 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 . * RETURN VALUE
16560 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 . * .... *.
16570 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e * NOTES. * .
16580 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 ... *. */.static
16590 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b cackey_ret cack
165a0 65 79 5f 6c 6f 67 69 6e 28 73 74 72 75 63 74 20 ey_login(struct
165b0 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f cackey_slot *slo
165c0 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 t, unsigned char
165d0 20 2a 70 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20 *pin, unsigned
165e0 6c 6f 6e 67 20 70 69 6e 5f 6c 65 6e 2c 20 69 6e long pin_len, in
165f0 74 20 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 t *tries_remaini
16600 6e 67 5f 70 2c 20 69 6e 74 20 72 65 74 72 69 65 ng_p, int retrie
16610 73 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 s) {..struct cac
16620 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 key_pcsc_identit
16630 79 20 2a 70 63 73 63 5f 69 64 65 6e 74 69 74 69 y *pcsc_identiti
16640 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 es;..unsigned ch
16650 61 72 20 63 61 63 5f 70 69 6e 5b 38 5d 20 3d 20 ar cac_pin[8] =
16660 7b 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 {0xFF, 0xFF, 0xF
16670 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 F, 0xFF, 0xFF, 0
16680 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 7d xFF, 0xFF, 0xFF}
16690 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 ;..unsigned long
166a0 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 09 75 69 6e num_certs;..uin
166b0 74 31 36 5f 74 20 72 65 73 70 6f 6e 73 65 5f 63 t16_t response_c
166c0 6f 64 65 3b 0a 09 69 6e 74 20 74 72 69 65 73 5f ode;..int tries_
166d0 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 69 6e 74 20 remaining;..int
166e0 73 65 6e 64 5f 72 65 74 3b 0a 09 69 6e 74 20 6b send_ret;..int k
166f0 65 79 5f 72 65 66 65 72 65 6e 63 65 20 3d 20 30 ey_reference = 0
16700 78 30 30 2c 20 68 61 76 65 5f 70 69 76 20 3d 20 x00, have_piv =
16710 30 3b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 63 0;..cackey_ret c
16720 6f 6e 6e 65 63 74 5f 72 65 74 2c 20 74 6f 6b 65 onnect_ret, toke
16730 6e 5f 72 65 74 3b 0a 0a 09 2f 2a 20 49 6e 64 69 n_ret;.../* Indi
16740 63 61 74 65 20 74 68 61 74 20 77 65 20 64 6f 20 cate that we do
16750 6e 6f 74 20 6b 6e 6f 77 20 61 62 6f 75 74 20 68 not know about h
16760 6f 77 20 6d 61 6e 79 20 74 72 69 65 73 20 61 72 ow many tries ar
16770 65 20 72 65 6d 61 69 6e 69 6e 67 20 2a 2f 0a 09 e remaining */..
16780 69 66 20 28 74 72 69 65 73 5f 72 65 6d 61 69 6e if (tries_remain
16790 69 6e 67 5f 70 29 20 7b 0a 09 09 2a 74 72 69 65 ing_p) {...*trie
167a0 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 20 3d 20 s_remaining_p =
167b0 2d 31 3b 0a 09 7d 0a 0a 09 2f 2a 20 41 70 70 61 -1;..}.../* Appa
167c0 72 65 6e 74 6c 79 2c 20 43 41 43 20 50 49 4e 73 rently, CAC PINs
167d0 20 61 72 65 20 2a 45 58 41 43 54 4c 59 2a 20 38 are *EXACTLY* 8
167e0 20 62 79 74 65 73 20 6c 6f 6e 67 20 2d 2d 20 70 bytes long -- p
167f0 61 64 20 77 69 74 68 20 30 78 46 46 20 69 66 20 ad with 0xFF if
16800 74 6f 6f 20 73 68 6f 72 74 20 2a 2f 0a 09 69 66 too short */..if
16810 20 28 70 69 6e 5f 6c 65 6e 20 3e 3d 20 38 29 20 (pin_len >= 8)
16820 7b 0a 09 09 6d 65 6d 63 70 79 28 63 61 63 5f 70 {...memcpy(cac_p
16830 69 6e 2c 20 70 69 6e 2c 20 38 29 3b 0a 09 7d 20 in, pin, 8);..}
16840 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 63 70 79 28 else {...memcpy(
16850 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 70 69 cac_pin, pin, pi
16860 6e 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 n_len);..}.../*
16870 52 65 6a 65 63 74 20 50 49 4e 73 20 77 68 69 63 Reject PINs whic
16880 68 20 61 72 65 20 74 6f 6f 20 73 68 6f 72 74 20 h are too short
16890 2a 2f 0a 09 69 66 20 28 70 69 6e 5f 6c 65 6e 20 */..if (pin_len
168a0 3c 20 35 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f < 5) {...CACKEY_
168b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
168c0 6a 65 63 74 69 6e 67 20 50 49 4e 20 77 68 69 63 jecting PIN whic
168d0 68 20 69 73 20 74 6f 6f 20 73 68 6f 72 74 20 28 h is too short (
168e0 6c 65 6e 67 74 68 20 3d 20 25 6c 75 2c 20 6d 75 length = %lu, mu
168f0 73 74 20 62 65 20 61 74 6c 65 61 73 74 20 35 29 st be atleast 5)
16900 22 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a 0a 09 09 ", pin_len);....
16910 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 return(CACKEY_PC
16920 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09 7d SC_E_BADPIN);..}
16930 0a 0a 09 2f 2a 20 50 49 56 20 61 75 74 68 65 6e .../* PIV authen
16940 74 69 63 61 74 69 6f 6e 20 75 73 65 73 20 61 20 tication uses a
16950 22 6b 65 79 5f 72 65 66 65 72 65 6e 63 65 22 20 "key_reference"
16960 6f 66 20 30 78 38 30 20 2a 2f 0a 09 70 63 73 63 of 0x80 */..pcsc
16970 5f 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61 _identities = ca
16980 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 73 28 ckey_read_certs(
16990 73 6c 6f 74 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d slot, NULL, &num
169a0 5f 63 65 72 74 73 29 3b 0a 09 69 66 20 28 6e 75 _certs);..if (nu
169b0 6d 5f 63 65 72 74 73 20 3e 20 30 20 26 26 20 70 m_certs > 0 && p
169c0 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 21 csc_identities !
169d0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 73 77 69 74 = NULL) {...swit
169e0 63 68 20 28 70 63 73 63 5f 69 64 65 6e 74 69 74 ch (pcsc_identit
169f0 69 65 73 5b 30 5d 2e 69 64 5f 74 79 70 65 29 20 ies[0].id_type)
16a00 7b 0a 09 09 09 63 61 73 65 20 43 41 43 4b 45 59 {....case CACKEY
16a10 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09 _ID_TYPE_PIV:...
16a20 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
16a30 52 49 4e 54 46 28 22 57 65 20 68 61 76 65 20 50 RINTF("We have P
16a40 49 56 20 63 61 72 64 2c 20 73 6f 20 77 65 20 77 IV card, so we w
16a50 69 6c 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 ill attempt to a
16a60 75 74 68 65 6e 74 69 63 61 74 65 20 75 73 69 6e uthenticate usin
16a70 67 20 74 68 65 20 50 49 56 20 41 70 70 6c 69 63 g the PIV Applic
16a80 61 74 69 6f 6e 20 6b 65 79 20 72 65 66 65 72 65 ation key refere
16a90 6e 63 65 22 29 3b 0a 0a 09 09 09 09 68 61 76 65 nce");......have
16aa0 5f 70 69 76 20 3d 20 31 3b 0a 09 09 09 09 62 72 _piv = 1;.....br
16ab0 65 61 6b 3b 0a 09 09 09 64 65 66 61 75 6c 74 3a eak;....default:
16ac0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a .....break;...}.
16ad0 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 ...cackey_free_c
16ae0 65 72 74 73 28 70 63 73 63 5f 69 64 65 6e 74 69 erts(pcsc_identi
16af0 74 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c ties, num_certs,
16b00 20 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 61 1);..}...if (ha
16b10 76 65 5f 70 69 76 20 3d 3d 20 31 29 20 7b 0a 09 ve_piv == 1) {..
16b20 09 6b 65 79 5f 72 65 66 65 72 65 6e 63 65 20 3d .key_reference =
16b30 20 30 78 38 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 49 0x80;..}.../* I
16b40 73 73 75 65 20 50 49 4e 20 56 65 72 69 66 79 20 ssue PIN Verify
16b50 2a 2f 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 */..send_ret = c
16b60 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 ackey_send_apdu(
16b70 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 slot, GSCIS_CLAS
16b80 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53 S_ISO7816, GSCIS
16b90 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 2c 20 30 _INSTR_VERIFY, 0
16ba0 78 30 30 2c 20 6b 65 79 5f 72 65 66 65 72 65 6e x00, key_referen
16bb0 63 65 2c 20 73 69 7a 65 6f 66 28 63 61 63 5f 70 ce, sizeof(cac_p
16bc0 69 6e 29 2c 20 63 61 63 5f 70 69 6e 2c 20 30 78 in), cac_pin, 0x
16bd0 30 30 2c 20 26 72 65 73 70 6f 6e 73 65 5f 63 6f 00, &response_co
16be0 64 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b de, NULL, NULL);
16bf0 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 ...if (send_ret
16c00 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 != CACKEY_PCSC_S
16c10 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28 28 72 65 _OK) {...if ((re
16c20 73 70 6f 6e 73 65 5f 63 6f 64 65 20 26 20 30 78 sponse_code & 0x
16c30 36 33 43 30 29 20 3d 3d 20 30 78 36 33 43 30 29 63C0) == 0x63C0)
16c40 20 7b 0a 09 09 09 74 72 69 65 73 5f 72 65 6d 61 {....tries_rema
16c50 69 6e 69 6e 67 20 3d 20 28 72 65 73 70 6f 6e 73 ining = (respons
16c60 65 5f 63 6f 64 65 20 26 20 30 78 46 29 3b 0a 0a e_code & 0xF);..
16c70 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
16c80 50 52 49 4e 54 46 28 22 50 49 4e 20 56 65 72 69 PRINTF("PIN Veri
16c90 66 69 63 61 74 69 6f 6e 20 66 61 69 6c 65 64 2c fication failed,
16ca0 20 25 69 20 74 72 69 65 73 20 72 65 6d 61 69 6e %i tries remain
16cb0 69 6e 67 22 2c 20 74 72 69 65 73 5f 72 65 6d 61 ing", tries_rema
16cc0 69 6e 69 6e 67 29 3b 0a 0a 09 09 09 69 66 20 28 ining);.....if (
16cd0 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f tries_remaining_
16ce0 70 29 20 7b 0a 09 09 09 09 2a 74 72 69 65 73 5f p) {.....*tries_
16cf0 72 65 6d 61 69 6e 69 6e 67 5f 70 20 3d 20 74 72 remaining_p = tr
16d00 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 ies_remaining;..
16d10 09 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 ..}.....return(C
16d20 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 ACKEY_PCSC_E_BAD
16d30 50 49 4e 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 PIN);...}....if
16d40 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 3d (response_code =
16d50 3d 20 30 78 36 39 38 33 29 20 7b 0a 09 09 09 43 = 0x6983) {....C
16d60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
16d70 54 46 28 22 50 49 4e 20 56 65 72 69 66 69 63 61 TF("PIN Verifica
16d80 74 69 6f 6e 20 66 61 69 6c 65 64 2c 20 64 65 76 tion failed, dev
16d90 69 63 65 20 69 73 20 6c 6f 63 6b 65 64 22 29 3b ice is locked");
16da0 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b .....return(CACK
16db0 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 EY_PCSC_E_LOCKED
16dc0 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72 65 );...}....if (re
16dd0 73 70 6f 6e 73 65 5f 63 6f 64 65 20 3d 3d 20 30 sponse_code == 0
16de0 78 36 64 30 30 29 20 7b 0a 09 09 09 69 66 20 28 x6d00) {....if (
16df0 72 65 74 72 69 65 73 20 3e 20 30 29 20 7b 0a 09 retries > 0) {..
16e00 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
16e10 50 52 49 4e 54 46 28 22 47 6f 74 20 49 53 4f 20 PRINTF("Got ISO
16e20 37 38 31 36 20 52 65 73 70 6f 6e 73 65 20 5c 22 7816 Response \"
16e30 36 44 20 30 30 5c 22 20 69 6e 20 72 65 73 70 6f 6D 00\" in respo
16e40 6e 73 65 20 74 6f 20 61 20 56 45 52 49 46 59 20 nse to a VERIFY
16e50 72 65 71 75 65 73 74 2e 22 29 3b 0a 09 09 09 09 request.");.....
16e60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
16e70 4e 54 46 28 22 57 65 20 64 69 64 20 6e 6f 74 20 NTF("We did not
16e80 65 78 70 65 63 74 20 74 68 69 73 20 62 65 63 61 expect this beca
16e90 75 73 65 20 69 74 20 69 73 20 6e 6f 74 20 6d 65 use it is not me
16ea0 6e 74 69 6f 6e 65 64 20 69 6e 20 4e 49 53 54 20 ntioned in NIST
16eb0 53 50 20 38 30 30 2d 37 33 2d 33 20 50 61 72 74 SP 800-73-3 Part
16ec0 20 32 20 53 65 63 74 69 6f 6e 20 33 2e 32 2e 31 2 Section 3.2.1
16ed0 20 6f 72 20 47 53 43 2d 49 53 20 76 32 2e 31 22 or GSC-IS v2.1"
16ee0 29 3b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 );.....CACKEY_DE
16ef0 42 55 47 5f 50 52 49 4e 54 46 28 22 57 65 20 61 BUG_PRINTF("We a
16f00 72 65 20 67 6f 69 6e 67 20 74 6f 20 74 72 79 20 re going to try
16f10 74 6f 20 72 65 73 65 74 20 74 68 65 20 63 61 72 to reset the car
16f20 64 20 61 6e 64 20 73 65 6c 65 63 74 20 74 68 65 d and select the
16f30 20 61 70 70 6c 65 74 20 61 67 61 69 6e 2e 22 29 applet again.")
16f40 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 61 ;......cackey_ma
16f50 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c rk_slot_reset(sl
16f60 6f 74 29 3b 0a 0a 09 09 09 09 63 6f 6e 6e 65 63 ot);......connec
16f70 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 t_ret = cackey_c
16f80 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 onnect_card(slot
16f90 29 3b 0a 09 09 09 09 69 66 20 28 63 6f 6e 6e 65 );.....if (conne
16fa0 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 ct_ret != CACKEY
16fb0 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 _PCSC_S_OK) {...
16fc0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
16fd0 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 PRINTF("Unable t
16fe0 6f 20 72 65 63 6f 6e 6e 65 63 74 20 61 66 74 65 o reconnect afte
16ff0 72 20 72 65 73 65 74 74 69 6e 67 20 74 68 65 20 r resetting the
17000 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 card, returning
17010 69 6e 20 65 72 72 6f 72 2e 22 29 3b 0a 0a 09 09 in error.");....
17020 09 09 09 72 65 74 75 72 6e 28 63 6f 6e 6e 65 63 ...return(connec
17030 74 5f 72 65 74 29 3b 0a 09 09 09 09 7d 0a 0a 09 t_ret);.....}...
17040 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
17050 50 52 49 4e 54 46 28 22 56 65 72 69 66 79 69 6e PRINTF("Verifyin
17060 67 20 77 65 20 73 74 69 6c 6c 20 68 61 76 65 20 g we still have
17070 61 20 74 6f 6b 65 6e 2e 22 29 3b 0a 09 09 09 09 a token.");.....
17080 74 6f 6b 65 6e 5f 72 65 74 20 3d 20 63 61 63 6b token_ret = cack
17090 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 ey_token_present
170a0 28 73 6c 6f 74 29 3b 0a 09 09 09 09 69 66 20 28 (slot);.....if (
170b0 74 6f 6b 65 6e 5f 72 65 74 20 21 3d 20 43 41 43 token_ret != CAC
170c0 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e KEY_PCSC_S_TOKEN
170d0 50 52 45 53 45 4e 54 29 20 7b 0a 09 09 09 09 09 PRESENT) {......
170e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
170f0 4e 54 46 28 22 54 6f 6b 65 6e 20 6e 6f 74 20 70 NTF("Token not p
17100 72 65 73 65 6e 74 2c 20 72 65 74 75 72 6e 69 6e resent, returnin
17110 67 20 69 6e 20 65 72 72 6f 72 2e 22 29 3b 0a 0a g in error.");..
17120 09 09 09 09 09 72 65 74 75 72 6e 28 74 6f 6b 65 .....return(toke
17130 6e 5f 72 65 74 29 3b 0a 09 09 09 09 7d 0a 0a 0a n_ret);.....}...
17140 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
17150 5f 50 52 49 4e 54 46 28 22 54 72 79 69 6e 67 20 _PRINTF("Trying
17160 74 6f 20 6c 6f 67 69 6e 20 61 67 61 69 6e 22 29 to login again")
17170 3b 0a 09 09 09 09 72 65 74 75 72 6e 28 63 61 63 ;.....return(cac
17180 6b 65 79 5f 6c 6f 67 69 6e 28 73 6c 6f 74 2c 20 key_login(slot,
17190 70 69 6e 2c 20 70 69 6e 5f 6c 65 6e 2c 20 74 72 pin, pin_len, tr
171a0 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 2c ies_remaining_p,
171b0 20 72 65 74 72 69 65 73 20 2d 20 31 29 29 3b 0a retries - 1));.
171c0 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 72 65 74 75 ...}...}....retu
171d0 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 rn(CACKEY_PCSC_E
171e0 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 _GENERIC);..}...
171f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
17200 4e 54 46 28 22 50 49 4e 20 56 65 72 69 66 69 63 NTF("PIN Verific
17210 61 74 69 6f 6e 20 73 75 63 63 65 65 64 65 64 22 ation succeeded"
17220 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b );...return(CACK
17230 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d EY_PCSC_S_OK);.}
17240 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 ../*. * SYNPOSIS
17250 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 . * .... *.
17260 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 * ARGUMENTS. *
17270 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 .... *. * RET
17280 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 URN VALUE. *
17290 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 .... *. * NOTES
172a0 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 . * .... *.
172b0 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f */.static ssize_
172c0 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 t cackey_pcsc_id
172d0 65 6e 74 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28 entity_to_label(
172e0 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 struct cackey_pc
172f0 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 sc_identity *ide
17300 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 20 ntity, unsigned
17310 63 68 61 72 20 2a 6c 61 62 65 6c 5f 62 75 66 2c char *label_buf,
17320 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c unsigned long l
17330 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 29 20 7b 0a abel_buf_len) {.
17340 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 .unsigned long c
17350 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a ertificate_len;.
17360 09 76 6f 69 64 20 2a 6c 61 62 65 6c 5f 61 73 6e .void *label_asn
17370 31 3b 0a 09 76 6f 69 64 20 2a 63 65 72 74 69 66 1;..void *certif
17380 69 63 61 74 65 3b 0a 09 69 6e 74 20 78 35 30 39 icate;..int x509
17390 5f 72 65 61 64 5f 72 65 74 3b 0a 0a 09 63 65 72 _read_ret;...cer
173a0 74 69 66 69 63 61 74 65 20 3d 20 69 64 65 6e 74 tificate = ident
173b0 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 ity->certificate
173c0 3b 0a 09 63 65 72 74 69 66 69 63 61 74 65 5f 6c ;..certificate_l
173d0 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 en = identity->c
173e0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a ertificate_len;.
173f0 0a 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 ..if (certificat
17400 65 5f 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 72 e_len < 0) {...r
17410 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 eturn(-1);..}...
17420 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 x509_read_ret =
17430 78 35 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74 28 x509_to_subject(
17440 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 certificate, cer
17450 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 28 76 tificate_len, (v
17460 6f 69 64 20 2a 2a 29 20 26 6c 61 62 65 6c 5f 61 oid **) &label_a
17470 73 6e 31 29 3b 0a 09 69 66 20 28 78 35 30 39 5f sn1);..if (x509_
17480 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a read_ret < 0) {.
17490 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d ..return(-1);..}
174a0 0a 0a 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 ...x509_read_ret
174b0 20 3d 20 78 35 30 39 5f 64 6e 5f 74 6f 5f 73 74 = x509_dn_to_st
174c0 72 69 6e 67 28 6c 61 62 65 6c 5f 61 73 6e 31 2c ring(label_asn1,
174d0 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 2c 20 x509_read_ret,
174e0 28 63 68 61 72 20 2a 29 20 6c 61 62 65 6c 5f 62 (char *) label_b
174f0 75 66 2c 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 uf, label_buf_le
17500 6e 2c 20 22 43 4e 22 29 3b 0a 09 69 66 20 28 78 n, "CN");..if (x
17510 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 3d 20 509_read_ret <=
17520 30 29 20 7b 0a 09 09 78 35 30 39 5f 72 65 61 64 0) {...x509_read
17530 5f 72 65 74 20 3d 20 78 35 30 39 5f 64 6e 5f 74 _ret = x509_dn_t
17540 6f 5f 73 74 72 69 6e 67 28 6c 61 62 65 6c 5f 61 o_string(label_a
17550 73 6e 31 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 sn1, x509_read_r
17560 65 74 2c 20 28 63 68 61 72 20 2a 29 20 6c 61 62 et, (char *) lab
17570 65 6c 5f 62 75 66 2c 20 6c 61 62 65 6c 5f 62 75 el_buf, label_bu
17580 66 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 f_len, NULL);...
17590 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 .if (x509_read_r
175a0 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09 09 72 65 et <= 0) {....re
175b0 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d turn(-1);...}..}
175c0 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f ..#ifdef CACKEY_
175d0 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 PARANOID.# ifde
175e0 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d f _POSIX_SSIZE_M
175f0 41 58 0a 09 69 66 20 28 78 35 30 39 5f 72 65 61 AX..if (x509_rea
17600 64 5f 72 65 74 20 3e 20 5f 50 4f 53 49 58 5f 53 d_ret > _POSIX_S
17610 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 SIZE_MAX) {...CA
17620 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
17630 46 28 22 78 35 30 39 5f 72 65 61 64 5f 72 65 74 F("x509_read_ret
17640 20 65 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d exceeds maximum
17650 20 76 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e value, returnin
17660 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d g in failure. (m
17670 61 78 20 3d 20 25 6c 69 2c 20 78 35 30 39 5f 72 ax = %li, x509_r
17680 65 61 64 5f 72 65 74 20 3d 20 25 6c 75 29 22 2c ead_ret = %lu)",
17690 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53 (long) _POSIX_S
176a0 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67 SIZE_MAX, (unsig
176b0 6e 65 64 20 6c 6f 6e 67 29 20 78 35 30 39 5f 72 ned long) x509_r
176c0 65 61 64 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 ead_ret);....ret
176d0 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 urn(-1);..}.# e
176e0 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09 72 65 ndif.#endif...re
176f0 74 75 72 6e 28 78 35 30 39 5f 72 65 61 64 5f 72 turn(x509_read_r
17700 65 74 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 et);.}../* Retur
17710 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20 ns 0 on success
17720 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 */.static int ca
17730 63 6b 65 79 5f 6d 75 74 65 78 5f 63 72 65 61 74 ckey_mutex_creat
17740 65 28 76 6f 69 64 20 2a 2a 6d 75 74 65 78 29 20 e(void **mutex)
17750 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 {..pthread_mutex
17760 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 _t *pthread_mute
17770 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f x;..int pthread_
17780 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 retval;..CK_RV c
17790 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 ustom_retval;...
177a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
177b0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a NTF("Called.");.
177c0 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72 ..if ((cackey_ar
177d0 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f gs.flags & CKF_O
177e0 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d S_LOCKING_OK) ==
177f0 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f CKF_OS_LOCKING_
17800 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f OK) {...pthread_
17810 6d 75 74 65 78 20 3d 20 6d 61 6c 6c 6f 63 28 73 mutex = malloc(s
17820 69 7a 65 6f 66 28 2a 70 74 68 72 65 61 64 5f 6d izeof(*pthread_m
17830 75 74 65 78 29 29 3b 0a 09 09 69 66 20 28 21 70 utex));...if (!p
17840 74 68 72 65 61 64 5f 6d 75 74 65 78 29 20 7b 0a thread_mutex) {.
17850 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
17860 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 PRINTF("Failed t
17870 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 o allocate memor
17880 79 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e y.");.....return
17890 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 70 74 68 (-1);...}....pth
178a0 72 65 61 64 5f 72 65 74 76 61 6c 20 3d 20 70 74 read_retval = pt
178b0 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 hread_mutex_init
178c0 28 70 74 68 72 65 61 64 5f 6d 75 74 65 78 2c 20 (pthread_mutex,
178d0 4e 55 4c 4c 29 3b 0a 09 09 69 66 20 28 70 74 68 NULL);...if (pth
178e0 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 read_retval != 0
178f0 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 ) {....CACKEY_DE
17900 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72 BUG_PRINTF("pthr
17910 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 29 ead_mutex_init()
17920 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 returned error
17930 28 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f (%i).", pthread_
17940 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 retval);.....ret
17950 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 urn(-1);...}....
17960 2a 6d 75 74 65 78 20 3d 20 70 74 68 72 65 61 64 *mutex = pthread
17970 5f 6d 75 74 65 78 3b 0a 09 7d 20 65 6c 73 65 20 _mutex;..} else
17980 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 61 {...if (cackey_a
17990 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78 29 rgs.CreateMutex)
179a0 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65 74 {....custom_ret
179b0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72 67 val = cackey_arg
179c0 73 2e 43 72 65 61 74 65 4d 75 74 65 78 28 6d 75 s.CreateMutex(mu
179d0 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 75 tex);.....if (cu
179e0 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43 stom_retval != C
179f0 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 KR_OK) {.....CAC
17a00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
17a10 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 ("cackey_args.Cr
17a20 65 61 74 65 4d 75 74 65 78 28 29 20 72 65 74 75 eateMutex() retu
17a30 72 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29 rned error (%li)
17a40 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f .", (long) custo
17a50 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 m_retval);......
17a60 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d return(-1);....}
17a70 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 ...}..}...CACKEY
17a80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
17a90 65 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66 eturning sucessf
17aa0 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 ully (0)");...re
17ab0 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 turn(0);.}../* R
17ac0 65 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 eturns 0 on succ
17ad0 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e ess */.static in
17ae0 74 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c t cackey_mutex_l
17af0 6f 63 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78 29 ock(void *mutex)
17b00 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65 {..pthread_mute
17b10 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 x_t *pthread_mut
17b20 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64 ex;..int pthread
17b30 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 _retval;..CK_RV
17b40 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a custom_retval;..
17b50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
17b60 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
17b70 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61 ...if ((cackey_a
17b80 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f rgs.flags & CKF_
17b90 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d OS_LOCKING_OK) =
17ba0 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 = CKF_OS_LOCKING
17bb0 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64 _OK) {...pthread
17bc0 5f 6d 75 74 65 78 20 3d 20 6d 75 74 65 78 3b 0a _mutex = mutex;.
17bd0 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74 76 61 ...pthread_retva
17be0 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65 l = pthread_mute
17bf0 78 5f 6c 6f 63 6b 28 70 74 68 72 65 61 64 5f 6d x_lock(pthread_m
17c00 75 74 65 78 29 3b 0a 09 09 69 66 20 28 70 74 68 utex);...if (pth
17c10 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 read_retval != 0
17c20 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 ) {....CACKEY_DE
17c30 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72 BUG_PRINTF("pthr
17c40 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 29 ead_mutex_lock()
17c50 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 returned error
17c60 28 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f (%i).", pthread_
17c70 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 retval);.....ret
17c80 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 20 urn(-1);...}..}
17c90 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 63 61 63 else {...if (cac
17ca0 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 key_args.LockMut
17cb0 65 78 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f ex) {....custom_
17cc0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f retval = cackey_
17cd0 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 28 6d args.LockMutex(m
17ce0 75 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 utex);.....if (c
17cf0 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 ustom_retval !=
17d00 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 CKR_OK) {.....CA
17d10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
17d20 46 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c F("cackey_args.L
17d30 6f 63 6b 4d 75 74 65 78 28 29 20 72 65 74 75 72 ockMutex() retur
17d40 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29 2e ned error (%li).
17d50 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d ", (long) custom
17d60 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72 _retval);......r
17d70 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a eturn(-1);....}.
17d80 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f ..}..}...CACKEY_
17d90 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
17da0 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66 75 turning sucessfu
17db0 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 74 lly (0)");...ret
17dc0 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 urn(0);.}../* Re
17dd0 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 turns 0 on succe
17de0 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 ss */.static int
17df0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e cackey_mutex_un
17e00 6c 6f 63 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78 lock(void *mutex
17e10 29 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 ) {..pthread_mut
17e20 65 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 ex_t *pthread_mu
17e30 74 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 tex;..int pthrea
17e40 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 d_retval;..CK_RV
17e50 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a custom_retval;.
17e60 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
17e70 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
17e80 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f ;...if ((cackey_
17e90 61 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 args.flags & CKF
17ea0 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 _OS_LOCKING_OK)
17eb0 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e == CKF_OS_LOCKIN
17ec0 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 G_OK) {...pthrea
17ed0 64 5f 6d 75 74 65 78 20 3d 20 6d 75 74 65 78 3b d_mutex = mutex;
17ee0 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74 76 ....pthread_retv
17ef0 61 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 al = pthread_mut
17f00 65 78 5f 75 6e 6c 6f 63 6b 28 70 74 68 72 65 61 ex_unlock(pthrea
17f10 64 5f 6d 75 74 65 78 29 3b 0a 09 09 69 66 20 28 d_mutex);...if (
17f20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 21 pthread_retval !
17f30 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 = 0) {....CACKEY
17f40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70 _DEBUG_PRINTF("p
17f50 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c thread_mutex_unl
17f60 6f 63 6b 28 29 20 72 65 74 75 72 6e 65 64 20 65 ock() returned e
17f70 72 72 6f 72 20 28 25 69 29 2e 22 2c 20 70 74 68 rror (%i).", pth
17f80 72 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 read_retval);...
17f90 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 ..return(-1);...
17fa0 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 }..} else {...if
17fb0 20 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e (cackey_args.Un
17fc0 6c 6f 63 6b 4d 75 74 65 78 29 20 7b 0a 09 09 09 lockMutex) {....
17fd0 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 custom_retval =
17fe0 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f cackey_args.Unlo
17ff0 63 6b 4d 75 74 65 78 28 6d 75 74 65 78 29 3b 0a ckMutex(mutex);.
18000 0a 09 09 09 69 66 20 28 63 75 73 74 6f 6d 5f 72 ....if (custom_r
18010 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 etval != CKR_OK)
18020 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 {.....CACKEY_DE
18030 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b BUG_PRINTF("cack
18040 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 ey_args.UnlockMu
18050 74 65 78 28 29 20 72 65 74 75 72 6e 65 64 20 65 tex() returned e
18060 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c rror (%li).", (l
18070 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65 74 76 ong) custom_retv
18080 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e al);......return
18090 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 (-1);....}...}..
180a0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 }...CACKEY_DEBUG
180b0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
180c0 6e 67 20 73 75 63 65 73 73 66 75 6c 6c 79 20 28 ng sucessfully (
180d0 30 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 0)");...return(0
180e0 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 43 4b 5f );.}..static CK_
180f0 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 63 61 ATTRIBUTE_PTR ca
18100 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75 ckey_get_attribu
18110 74 65 73 28 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c tes(CK_OBJECT_CL
18120 41 53 53 20 6f 62 6a 65 63 74 63 6c 61 73 73 2c ASS objectclass,
18130 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 struct cackey_p
18140 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 csc_identity *id
18150 65 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 entity, unsigned
18160 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 79 5f 6e long identity_n
18170 75 6d 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 um, CK_ULONG_PTR
18180 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 73 74 pulCount) {..st
18190 61 74 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b atic CK_BBOOL ck
181a0 5f 74 72 75 65 20 3d 20 31 3b 0a 09 73 74 61 74 _true = 1;..stat
181b0 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 66 ic CK_BBOOL ck_f
181c0 61 6c 73 65 20 3d 20 30 3b 0a 09 73 74 61 74 69 alse = 0;..stati
181d0 63 20 43 4b 5f 54 52 55 53 54 20 63 6b 5f 74 72 c CK_TRUST ck_tr
181e0 75 73 74 65 64 20 3d 20 43 4b 5f 54 52 55 53 54 usted = CK_TRUST
181f0 45 44 5f 44 45 4c 45 47 41 54 4f 52 3b 0a 09 43 ED_DELEGATOR;..C
18200 4b 5f 55 4c 4f 4e 47 20 6e 75 6d 61 74 74 72 73 K_ULONG numattrs
18210 20 3d 20 30 2c 20 72 65 74 76 61 6c 5f 63 6f 75 = 0, retval_cou
18220 6e 74 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 nt;..CK_ATTRIBUT
18230 45 5f 54 59 50 45 20 63 75 72 72 5f 61 74 74 72 E_TYPE curr_attr
18240 5f 74 79 70 65 3b 0a 09 43 4b 5f 41 54 54 52 49 _type;..CK_ATTRI
18250 42 55 54 45 20 63 75 72 72 5f 61 74 74 72 2c 20 BUTE curr_attr,
18260 2a 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 56 4f 49 *retval;..CK_VOI
18270 44 5f 50 54 52 20 70 56 61 6c 75 65 3b 0a 09 43 D_PTR pValue;..C
18280 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c 75 65 4c K_ULONG ulValueL
18290 65 6e 3b 0a 09 43 4b 5f 4f 42 4a 45 43 54 5f 43 en;..CK_OBJECT_C
182a0 4c 41 53 53 20 63 6b 5f 6f 62 6a 65 63 74 5f 63 LASS ck_object_c
182b0 6c 61 73 73 3b 0a 09 43 4b 5f 43 45 52 54 49 46 lass;..CK_CERTIF
182c0 49 43 41 54 45 5f 54 59 50 45 20 63 6b 5f 63 65 ICATE_TYPE ck_ce
182d0 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 3b 0a rtificate_type;.
182e0 09 43 4b 5f 4b 45 59 5f 54 59 50 45 20 63 6b 5f .CK_KEY_TYPE ck_
182f0 6b 65 79 5f 74 79 70 65 3b 0a 09 43 4b 5f 55 54 key_type;..CK_UT
18300 46 38 43 48 41 52 20 75 63 54 6d 70 42 75 66 5b F8CHAR ucTmpBuf[
18310 31 30 32 34 5d 3b 0a 09 53 48 41 31 43 6f 6e 74 1024];..SHA1Cont
18320 65 78 74 20 73 68 61 31 5f 63 74 78 3b 0a 09 4d ext sha1_ctx;..M
18330 44 35 5f 43 54 58 20 6d 64 35 5f 63 74 78 3b 0a D5_CTX md5_ctx;.
18340 09 75 69 6e 74 38 5f 74 20 73 68 61 31 5f 68 61 .uint8_t sha1_ha
18350 73 68 5b 53 48 41 31 48 61 73 68 53 69 7a 65 5d sh[SHA1HashSize]
18360 3b 0a 09 75 69 6e 74 38 5f 74 20 6d 64 35 5f 68 ;..uint8_t md5_h
18370 61 73 68 5b 4d 44 35 48 61 73 68 53 69 7a 65 5d ash[MD5HashSize]
18380 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 ;..unsigned char
18390 20 2a 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 *certificate;..
183a0 73 73 69 7a 65 5f 74 20 63 65 72 74 69 66 69 63 ssize_t certific
183b0 61 74 65 5f 6c 65 6e 20 3d 20 2d 31 2c 20 78 35 ate_len = -1, x5
183c0 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 69 6e 09_read_ret;..in
183d0 74 20 70 56 61 6c 75 65 5f 66 72 65 65 3b 0a 0a t pValue_free;..
183e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
183f0 49 4e 54 46 28 22 43 61 6c 6c 65 64 20 28 6f 62 INTF("Called (ob
18400 6a 65 63 74 43 6c 61 73 73 20 3d 20 25 6c 75 2c jectClass = %lu,
18410 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 3d 20 identity_num =
18420 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 %lu).", (unsigne
18430 64 20 6c 6f 6e 67 29 20 6f 62 6a 65 63 74 63 6c d long) objectcl
18440 61 73 73 2c 20 69 64 65 6e 74 69 74 79 5f 6e 75 ass, identity_nu
18450 6d 29 3b 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 m);...*pulCount
18460 3d 20 30 3b 0a 0a 09 69 66 20 28 6f 62 6a 65 63 = 0;...if (objec
18470 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 tclass != CKO_CE
18480 52 54 49 46 49 43 41 54 45 20 26 26 20 6f 62 6a RTIFICATE && obj
18490 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f ectclass != CKO_
184a0 50 55 42 4c 49 43 5f 4b 45 59 20 26 26 20 6f 62 PUBLIC_KEY && ob
184b0 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f jectclass != CKO
184c0 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 26 26 20 _PRIVATE_KEY &&
184d0 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 objectclass != C
184e0 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 KO_NETSCAPE_TRUS
184f0 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 T) {...CACKEY_DE
18500 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
18510 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 rning 0 objects
18520 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69 64 20 (NULL), invalid
18530 6f 62 6a 65 63 74 20 63 6c 61 73 73 22 29 3b 0a object class");.
18540 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b ...return(NULL);
18550 0a 09 7d 0a 0a 09 2f 2a 20 47 65 74 20 43 65 72 ..}.../* Get Cer
18560 74 20 2a 2f 0a 09 69 66 20 28 69 64 65 6e 74 69 t */..if (identi
18570 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 ty == NULL) {...
18580 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
18590 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 NTF("Returning 0
185a0 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c objects (NULL),
185b0 20 69 6e 76 61 6c 69 64 20 69 64 65 6e 74 69 79 invalid identiy
185c0 20 70 72 6f 76 69 64 65 64 22 29 3b 0a 0a 09 09 provided");....
185d0 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d return(NULL);..}
185e0 0a 0a 09 63 65 72 74 69 66 69 63 61 74 65 20 3d ...certificate =
185f0 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 identity->certi
18600 66 69 63 61 74 65 3b 0a 09 63 65 72 74 69 66 69 ficate;..certifi
18610 63 61 74 65 5f 6c 65 6e 20 3d 20 69 64 65 6e 74 cate_len = ident
18620 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 ity->certificate
18630 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 63 65 72 74 _len;...if (cert
18640 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 3d 20 2d ificate_len == -
18650 31 20 7c 7c 20 63 65 72 74 69 66 69 63 61 74 65 1 || certificate
18660 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 == NULL) {...CA
18670 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
18680 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20 6f F("Returning 0 o
18690 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20 74 bjects (NULL), t
186a0 68 69 73 20 69 64 65 6e 74 69 74 79 20 64 6f 65 his identity doe
186b0 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 58 2e s not have an X.
186c0 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20 509 certificate
186d0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 associated with
186e0 69 74 20 61 6e 64 20 77 69 6c 6c 20 6e 6f 74 20 it and will not
186f0 77 6f 72 6b 22 29 3b 0a 0a 09 09 72 65 74 75 72 work");....retur
18700 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a n(NULL);..}.../*
18710 20 56 65 72 69 66 79 20 74 68 61 74 20 63 65 72 Verify that cer
18720 74 69 66 69 63 61 74 65 20 69 73 20 41 53 4e 2e tificate is ASN.
18730 31 20 65 6e 63 6f 64 65 64 20 58 2e 35 30 39 20 1 encoded X.509
18740 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 certificate */..
18750 69 66 20 28 78 35 30 39 5f 74 6f 5f 73 65 72 69 if (x509_to_seri
18760 61 6c 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 al(certificate,
18770 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c certificate_len,
18780 20 4e 55 4c 4c 29 20 3c 20 30 29 20 7b 0a 09 09 NULL) < 0) {...
18790 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
187a0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 NTF("Returning 0
187b0 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c objects (NULL),
187c0 20 74 68 65 20 58 2e 35 30 39 20 63 65 72 74 69 the X.509 certi
187d0 66 69 63 61 74 65 20 61 73 73 6f 63 69 61 74 65 ficate associate
187e0 64 20 77 69 74 68 20 74 68 69 73 20 69 64 65 6e d with this iden
187f0 74 69 74 79 20 69 73 20 6e 6f 74 20 76 61 6c 69 tity is not vali
18800 64 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e d");....return(N
18810 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 74 76 61 ULL);..}...retva
18820 6c 5f 63 6f 75 6e 74 20 3d 20 36 34 3b 0a 09 72 l_count = 64;..r
18830 65 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f 63 28 72 etval = malloc(r
18840 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 etval_count * si
18850 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a zeof(*retval));.
18860 0a 09 66 6f 72 20 28 63 75 72 72 5f 61 74 74 72 ..for (curr_attr
18870 5f 74 79 70 65 20 3d 20 30 3b 20 63 75 72 72 5f _type = 0; curr_
18880 61 74 74 72 5f 74 79 70 65 20 3c 20 30 78 63 65 attr_type < 0xce
18890 35 33 36 33 62 66 3b 20 63 75 72 72 5f 61 74 74 5363bf; curr_att
188a0 72 5f 74 79 70 65 2b 2b 29 20 7b 0a 09 09 69 66 r_type++) {...if
188b0 20 28 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 (curr_attr_type
188c0 20 3d 3d 20 30 78 38 30 30 29 20 7b 0a 09 09 09 == 0x800) {....
188d0 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3d curr_attr_type =
188e0 20 30 78 63 65 35 33 36 33 30 30 3b 0a 09 09 7d 0xce536300;...}
188f0 0a 0a 09 09 70 56 61 6c 75 65 5f 66 72 65 65 20 ....pValue_free
18900 3d 20 30 3b 0a 09 09 70 56 61 6c 75 65 20 3d 20 = 0;...pValue =
18910 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65 4c NULL;...ulValueL
18920 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d en = (CK_LONG) -
18930 31 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 63 75 1;....switch (cu
18940 72 72 5f 61 74 74 72 5f 74 79 70 65 29 20 7b 0a rr_attr_type) {.
18950 09 09 09 63 61 73 65 20 43 4b 41 5f 43 4c 41 53 ...case CKA_CLAS
18960 53 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 S:.....CACKEY_DE
18970 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 BUG_PRINTF("Requ
18980 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 esting attribute
18990 20 43 4b 41 5f 43 4c 41 53 53 20 28 30 78 25 30 CKA_CLASS (0x%0
189a0 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 8lx) ...", (unsi
189b0 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f gned long) curr_
189c0 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 attr_type);.....
189d0 09 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 .ck_object_class
189e0 20 3d 20 6f 62 6a 65 63 74 63 6c 61 73 73 3b 0a = objectclass;.
189f0 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 .....pValue = &c
18a00 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 3b 0a k_object_class;.
18a10 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d ....ulValueLen =
18a20 20 73 69 7a 65 6f 66 28 63 6b 5f 6f 62 6a 65 63 sizeof(ck_objec
18a30 74 5f 63 6c 61 73 73 29 3b 0a 0a 09 09 09 09 43 t_class);......C
18a40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
18a50 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 TF(" ... returni
18a60 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 ng %lu (%p/%lu)"
18a70 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
18a80 29 20 2a 28 28 43 4b 5f 4f 42 4a 45 43 54 5f 43 ) *((CK_OBJECT_C
18a90 4c 41 53 53 20 2a 29 20 70 56 61 6c 75 65 29 2c LASS *) pValue),
18aa0 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e pValue, (unsign
18ab0 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 ed long) ulValue
18ac0 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b Len);......break
18ad0 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 4f ;....case CKA_TO
18ae0 4b 45 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f KEN:.....CACKEY_
18af0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
18b00 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 questing attribu
18b10 74 65 20 43 4b 41 5f 54 4f 4b 45 4e 20 28 30 78 te CKA_TOKEN (0x
18b20 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e %08lx) ...", (un
18b30 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 signed long) cur
18b40 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 r_attr_type);...
18b50 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f ...pValue = &ck_
18b60 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 true;.....ulValu
18b70 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b eLen = sizeof(ck
18b80 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43 _true);......CAC
18b90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
18ba0 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 (" ... returning
18bb0 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 %lu (%p/%lu)",
18bc0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
18bd0 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 *((CK_BBOOL *) p
18be0 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 Value), pValue,
18bf0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
18c00 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 ulValueLen);....
18c10 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 ..break;....case
18c20 20 43 4b 41 5f 50 52 49 56 41 54 45 3a 0a 09 09 CKA_PRIVATE:...
18c30 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
18c40 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e RINTF("Requestin
18c50 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f g attribute CKA_
18c60 50 52 49 56 41 54 45 20 28 30 78 25 30 38 6c 78 PRIVATE (0x%08lx
18c70 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 ) ...", (unsigne
18c80 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 d long) curr_att
18c90 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 r_type);......if
18ca0 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d (objectclass !=
18cb0 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 CKO_NETSCAPE_TR
18cc0 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b UST) {......CACK
18cd0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
18ce0 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 " ... but not ge
18cf0 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 tting it because
18d00 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 4e 65 we are not a Ne
18d10 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a tscape trust obj
18d20 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 ect");.......bre
18d30 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 70 ak;.....}......p
18d40 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 Value = &ck_fals
18d50 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 e;.....ulValueLe
18d60 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 n = sizeof(ck_fa
18d70 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 lse);......CACKE
18d80 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
18d90 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 ... returning %
18da0 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 lu (%p/%lu)", (u
18db0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 nsigned long) *(
18dc0 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 (CK_BBOOL *) pVa
18dd0 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 lue), pValue, (u
18de0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c nsigned long) ul
18df0 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 ValueLen);......
18e00 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 break;....case C
18e10 4b 41 5f 54 52 55 53 54 45 44 3a 0a 09 09 09 09 KA_TRUSTED:.....
18e20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
18e30 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 NTF("Requesting
18e40 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52 attribute CKA_TR
18e50 55 53 54 45 44 20 28 30 78 25 30 38 6c 78 29 20 USTED (0x%08lx)
18e60 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 ...", (unsigned
18e70 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f long) curr_attr_
18e80 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 type);......if (
18e90 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 objectclass == C
18ea0 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 KO_NETSCAPE_TRUS
18eb0 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 T) {......CACKEY
18ec0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 _DEBUG_PRINTF("
18ed0 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 ... but not gett
18ee0 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 ing it because w
18ef0 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 e are a Netscape
18f00 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b trust object");
18f10 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 .......break;...
18f20 09 09 7d 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 ..}......pValue
18f30 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 = &ck_true;.....
18f40 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a ulValueLen = siz
18f50 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 eof(ck_true);...
18f60 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
18f70 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 PRINTF(" ... ret
18f80 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 urning %lu (%p/%
18f90 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 lu)", (unsigned
18fa0 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f long) *((CK_BBOO
18fb0 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 L *) pValue), pV
18fc0 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 alue, (unsigned
18fd0 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e long) ulValueLen
18fe0 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 );......break;..
18ff0 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 49 46 ..case CKA_MODIF
19000 49 41 42 4c 45 3a 0a 09 09 09 09 43 41 43 4b 45 IABLE:.....CACKE
19010 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
19020 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 Requesting attri
19030 62 75 74 65 20 43 4b 41 5f 4d 4f 44 49 46 49 41 bute CKA_MODIFIA
19040 42 4c 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e BLE (0x%08lx) ..
19050 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f .", (unsigned lo
19060 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 ng) curr_attr_ty
19070 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 pe);......pValue
19080 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 = &ck_false;...
19090 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 ..ulValueLen = s
190a0 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b izeof(ck_false);
190b0 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 ......CACKEY_DEB
190c0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 UG_PRINTF(" ...
190d0 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 returning %lu (%
190e0 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e p/%lu)", (unsign
190f0 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 ed long) *((CK_B
19100 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c BOOL *) pValue),
19110 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e pValue, (unsign
19120 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 ed long) ulValue
19130 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b Len);......break
19140 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4c 41 ;....case CKA_LA
19150 42 45 4c 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f BEL:.....CACKEY_
19160 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
19170 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 questing attribu
19180 74 65 20 43 4b 41 5f 4c 41 42 45 4c 20 28 30 78 te CKA_LABEL (0x
19190 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e %08lx) ...", (un
191a0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 signed long) cur
191b0 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 r_attr_type);...
191c0 09 09 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d ...if (identity-
191d0 3e 69 64 5f 74 79 70 65 20 3d 3d 20 43 41 43 4b >id_type == CACK
191e0 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 29 20 EY_ID_TYPE_PIV)
191f0 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 {......pValue =
19200 69 64 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 70 identity->card.p
19210 69 76 2e 6c 61 62 65 6c 3b 0a 09 09 09 09 09 75 iv.label;......u
19220 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 74 72 6c lValueLen = strl
19230 65 6e 28 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 en(pValue);.....
19240 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 75 6c } else {......ul
19250 56 61 6c 75 65 4c 65 6e 20 3d 20 73 6e 70 72 69 ValueLen = snpri
19260 6e 74 66 28 28 63 68 61 72 20 2a 29 20 75 63 54 ntf((char *) ucT
19270 6d 70 42 75 66 2c 20 73 69 7a 65 6f 66 28 75 63 mpBuf, sizeof(uc
19280 54 6d 70 42 75 66 29 2c 20 22 49 64 65 6e 74 69 TmpBuf), "Identi
19290 74 79 20 23 25 6c 75 22 2c 20 28 75 6e 73 69 67 ty #%lu", (unsig
192a0 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65 6e 74 69 ned long) identi
192b0 74 79 5f 6e 75 6d 29 3b 0a 09 09 09 09 09 70 56 ty_num);......pV
192c0 61 6c 75 65 20 3d 20 75 63 54 6d 70 42 75 66 3b alue = ucTmpBuf;
192d0 0a 0a 09 09 09 09 09 69 66 20 28 75 6c 56 61 6c .......if (ulVal
192e0 75 65 4c 65 6e 20 3e 3d 20 73 69 7a 65 6f 66 28 ueLen >= sizeof(
192f0 75 63 54 6d 70 42 75 66 29 29 20 7b 0a 09 09 09 ucTmpBuf)) {....
19300 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 ...ulValueLen =
19310 30 3b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 0;.......pValue
19320 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 0a 09 = NULL;......}..
19330 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 ...}......CACKEY
19340 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 _DEBUG_PRINTF("
19350 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25 ... returning (%
19360 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c p/%lu)", pValue,
19370 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
19380 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 ulValueLen);...
19390 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 ...break;....cas
193a0 65 20 43 4b 41 5f 56 41 4c 55 45 3a 0a 09 09 09 e CKA_VALUE:....
193b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
193c0 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 INTF("Requesting
193d0 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 56 attribute CKA_V
193e0 41 4c 55 45 20 28 30 78 25 30 38 6c 78 29 20 2e ALUE (0x%08lx) .
193f0 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c ..", (unsigned l
19400 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 ong) curr_attr_t
19410 79 70 65 29 3b 0a 0a 09 09 09 09 73 77 69 74 63 ype);......switc
19420 68 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 29 20 h (objectclass)
19430 7b 0a 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f {......case CKO_
19440 50 52 49 56 41 54 45 5f 4b 45 59 3a 0a 09 09 09 PRIVATE_KEY:....
19450 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
19460 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 PRINTF(" ... but
19470 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 not getting it
19480 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 because we are a
19490 20 70 72 69 76 61 74 65 20 6b 65 79 2e 22 29 3b private key.");
194a0 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 ........break;..
194b0 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 4e 45 54 ....case CKO_NET
194c0 53 43 41 50 45 5f 54 52 55 53 54 3a 0a 09 09 09 SCAPE_TRUST:....
194d0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
194e0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 PRINTF(" ... but
194f0 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 not getting it
19500 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 because we are a
19510 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 Netscape trust
19520 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 object");.......
19530 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73 .break;......cas
19540 65 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 e CKO_PUBLIC_KEY
19550 3a 0a 09 09 09 09 09 09 69 66 20 28 63 65 72 74 :.......if (cert
19560 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 ificate_len >= 0
19570 29 20 7b 0a 09 09 09 09 09 09 09 78 35 30 39 5f ) {........x509_
19580 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f read_ret = x509_
19590 74 6f 5f 70 75 62 6b 65 79 28 63 65 72 74 69 66 to_pubkey(certif
195a0 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 icate, certifica
195b0 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 te_len, &pValue)
195c0 3b 0a 09 09 09 09 09 09 09 69 66 20 28 78 35 30 ;........if (x50
195d0 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 9_read_ret < 0)
195e0 7b 20 0a 09 09 09 09 09 09 09 09 70 56 61 6c 75 { .........pValu
195f0 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 09 e = NULL;.......
19600 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 .} else {.......
19610 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 ..ulValueLen = x
19620 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 509_read_ret;...
19630 09 09 09 09 09 7d 0a 09 09 09 09 09 09 7d 0a 0a .....}.......}..
19640 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 ......break;....
19650 09 09 63 61 73 65 20 43 4b 4f 5f 43 45 52 54 49 ..case CKO_CERTI
19660 46 49 43 41 54 45 3a 0a 09 09 09 09 09 09 70 56 FICATE:.......pV
19670 61 6c 75 65 20 3d 20 63 65 72 74 69 66 69 63 61 alue = certifica
19680 74 65 3b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 te;.......ulValu
19690 65 4c 65 6e 20 3d 20 63 65 72 74 69 66 69 63 61 eLen = certifica
196a0 74 65 5f 6c 65 6e 3b 0a 0a 09 09 09 09 09 09 62 te_len;........b
196b0 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 reak;.....}.....
196c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
196d0 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 INTF(" ... retur
196e0 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 ning %p/%lu", pV
196f0 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 alue, (unsigned
19700 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e long) ulValueLen
19710 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 );......break;..
19720 09 09 63 61 73 65 20 43 4b 41 5f 49 53 53 55 45 ..case CKA_ISSUE
19730 52 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 R:.....CACKEY_DE
19740 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 BUG_PRINTF("Requ
19750 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 esting attribute
19760 20 43 4b 41 5f 49 53 53 55 45 52 20 28 30 78 25 CKA_ISSUER (0x%
19770 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 08lx) ...", (uns
19780 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 igned long) curr
19790 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 _attr_type);....
197a0 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 ..if (objectclas
197b0 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 s != CKO_CERTIFI
197c0 43 41 54 45 20 26 26 20 6f 62 6a 65 63 74 63 6c CATE && objectcl
197d0 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 ass != CKO_NETSC
197e0 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 APE_TRUST) {....
197f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
19800 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 RINTF(" ... but
19810 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 not getting it b
19820 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f ecause we are no
19830 74 20 61 20 63 65 72 74 69 66 69 63 61 74 65 20 t a certificate
19840 6f 72 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 or Netscape trus
19850 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 t object");.....
19860 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a ..break;.....}..
19870 09 09 09 09 69 66 20 28 63 65 72 74 69 66 69 63 ....if (certific
19880 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a ate_len >= 0) {.
19890 09 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 .....x509_read_r
198a0 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 69 73 73 et = x509_to_iss
198b0 75 65 72 28 63 65 72 74 69 66 69 63 61 74 65 2c uer(certificate,
198c0 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e certificate_len
198d0 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 , &pValue);.....
198e0 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 .if (x509_read_r
198f0 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 et < 0) {.......
19900 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 pValue = NULL;..
19910 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 ....} else {....
19920 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 ...ulValueLen =
19930 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 x509_read_ret;..
19940 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 ....}.....}.....
19950 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
19960 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 INTF(" ... retur
19970 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 ning %p/%lu", pV
19980 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 alue, (unsigned
19990 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e long) ulValueLen
199a0 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 );......break;..
199b0 09 09 63 61 73 65 20 43 4b 41 5f 53 45 52 49 41 ..case CKA_SERIA
199c0 4c 5f 4e 55 4d 42 45 52 3a 0a 09 09 09 09 43 41 L_NUMBER:.....CA
199d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
199e0 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 F("Requesting at
199f0 74 72 69 62 75 74 65 20 43 4b 41 5f 53 45 52 49 tribute CKA_SERI
19a00 41 4c 5f 4e 55 4d 42 45 52 20 28 30 78 25 30 38 AL_NUMBER (0x%08
19a10 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 lx) ...", (unsig
19a20 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 ned long) curr_a
19a30 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 ttr_type);......
19a40 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 if (objectclass
19a50 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 != CKO_CERTIFICA
19a60 54 45 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 TE && objectclas
19a70 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 s != CKO_NETSCAP
19a80 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 E_TRUST) {......
19a90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
19aa0 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f NTF(" ... but no
19ab0 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 t getting it bec
19ac0 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 ause we are not
19ad0 61 20 63 65 72 74 69 66 69 63 61 74 65 20 6f 72 a certificate or
19ae0 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 Netscape trust
19af0 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 object");.......
19b00 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 break;.....}....
19b10 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 ..if (certificat
19b20 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 e_len >= 0) {...
19b30 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 ...x509_read_ret
19b40 20 3d 20 78 35 30 39 5f 74 6f 5f 73 65 72 69 61 = x509_to_seria
19b50 6c 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 l(certificate, c
19b60 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 ertificate_len,
19b70 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 &pValue);......i
19b80 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 f (x509_read_ret
19b90 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56 < 0) {.......pV
19ba0 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 alue = NULL;....
19bb0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 ..} else {......
19bc0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 .ulValueLen = x5
19bd0 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09_read_ret;....
19be0 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 ..}.....}......C
19bf0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
19c00 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 TF(" ... returni
19c10 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 56 ng (%p/%lu)", pV
19c20 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 alue, (unsigned
19c30 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e long) ulValueLen
19c40 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 );......break;..
19c50 09 09 63 61 73 65 20 43 4b 41 5f 53 55 42 4a 45 ..case CKA_SUBJE
19c60 43 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 CT:.....CACKEY_D
19c70 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 EBUG_PRINTF("Req
19c80 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 uesting attribut
19c90 65 20 43 4b 41 5f 53 55 42 4a 45 43 54 20 28 30 e CKA_SUBJECT (0
19ca0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 x%08lx) ...", (u
19cb0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 nsigned long) cu
19cc0 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a rr_attr_type);..
19cd0 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c ....if (objectcl
19ce0 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 ass != CKO_CERTI
19cf0 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09 09 43 FICATE) {......C
19d00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
19d10 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 TF(" ... but not
19d20 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 getting it beca
19d30 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 use we are not a
19d40 20 63 65 72 74 69 66 69 63 61 74 65 22 29 3b 0a certificate");.
19d50 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 ......break;....
19d60 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74 .}......if (cert
19d70 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 ificate_len >= 0
19d80 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65 ) {......x509_re
19d90 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f ad_ret = x509_to
19da0 5f 73 75 62 6a 65 63 74 28 63 65 72 74 69 66 69 _subject(certifi
19db0 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 cate, certificat
19dc0 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b e_len, &pValue);
19dd0 0a 09 09 09 09 09 69 66 20 28 78 35 30 39 5f 72 ......if (x509_r
19de0 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 ead_ret < 0) {..
19df0 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 .....pValue = NU
19e00 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 LL;......} else
19e10 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c {.......ulValueL
19e20 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 en = x509_read_r
19e30 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d et;......}.....}
19e40 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 ......CACKEY_DEB
19e50 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 UG_PRINTF(" ...
19e60 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 returning %p/%lu
19e70 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 ", pValue, (unsi
19e80 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c gned long) ulVal
19e90 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 ueLen);......bre
19ea0 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f ak;....case CKA_
19eb0 49 44 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 ID:.....CACKEY_D
19ec0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 EBUG_PRINTF("Req
19ed0 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 uesting attribut
19ee0 65 20 43 4b 41 5f 49 44 20 28 30 78 25 30 38 6c e CKA_ID (0x%08l
19ef0 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e x) ...", (unsign
19f00 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 ed long) curr_at
19f10 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 tr_type);......i
19f20 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d f (objectclass =
19f30 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 = CKO_NETSCAPE_T
19f40 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 RUST) {......CAC
19f50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
19f60 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 (" ... but not g
19f70 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 etting it becaus
19f80 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 e we are a Netsc
19f90 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 ape trust object
19fa0 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b ");.......break;
19fb0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 75 63 54 6d .....}......ucTm
19fc0 70 42 75 66 5b 30 5d 20 3d 20 28 28 69 64 65 6e pBuf[0] = ((iden
19fd0 74 69 74 79 5f 6e 75 6d 20 2b 20 31 29 20 3e 3e tity_num + 1) >>
19fe0 20 38 29 20 26 20 30 78 66 66 3b 0a 09 09 09 09 8) & 0xff;.....
19ff0 75 63 54 6d 70 42 75 66 5b 31 5d 20 3d 20 20 28 ucTmpBuf[1] = (
1a000 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 2b 20 31 identity_num + 1
1a010 29 20 26 20 30 78 66 66 3b 0a 0a 09 09 09 09 70 ) & 0xff;......p
1a020 56 61 6c 75 65 20 3d 20 26 75 63 54 6d 70 42 75 Value = &ucTmpBu
1a030 66 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 f;.....ulValueLe
1a040 6e 20 3d 20 32 3b 0a 0a 09 09 09 09 43 41 43 4b n = 2;......CACK
1a050 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1a060 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 " ... returning
1a070 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c %p/%lu", pValue,
1a080 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
1a090 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 ulValueLen);...
1a0a0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 ...break;....cas
1a0b0 65 20 43 4b 41 5f 43 45 52 54 49 46 49 43 41 54 e CKA_CERTIFICAT
1a0c0 45 5f 54 59 50 45 3a 0a 09 09 09 09 43 41 43 4b E_TYPE:.....CACK
1a0d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1a0e0 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 "Requesting attr
1a0f0 69 62 75 74 65 20 43 4b 41 5f 43 45 52 54 49 46 ibute CKA_CERTIF
1a100 49 43 41 54 45 5f 54 59 50 45 20 28 30 78 25 30 ICATE_TYPE (0x%0
1a110 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 8lx) ...", (unsi
1a120 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f gned long) curr_
1a130 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 attr_type);.....
1a140 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 .if (objectclass
1a150 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 != CKO_CERTIFIC
1a160 41 54 45 29 20 7b 0a 09 09 09 09 09 43 41 43 4b ATE) {......CACK
1a170 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1a180 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 " ... but not ge
1a190 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 tting it because
1a1a0 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65 we are not a ce
1a1b0 72 74 69 66 69 63 61 74 65 2e 22 29 3b 0a 0a 09 rtificate.");...
1a1c0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d ....break;.....}
1a1d0 0a 0a 09 09 09 09 2f 2a 20 57 65 20 6f 6e 6c 79 ....../* We only
1a1e0 20 73 75 70 70 6f 72 74 20 6f 6e 65 20 63 65 72 support one cer
1a1f0 74 69 66 69 63 61 74 65 20 74 79 70 65 20 2a 2f tificate type */
1a200 0a 09 09 09 09 63 6b 5f 63 65 72 74 69 66 69 63 .....ck_certific
1a210 61 74 65 5f 74 79 70 65 20 3d 20 43 4b 43 5f 58 ate_type = CKC_X
1a220 5f 35 30 39 3b 0a 0a 09 09 09 09 70 56 61 6c 75 _509;......pValu
1a230 65 20 3d 20 26 63 6b 5f 63 65 72 74 69 66 69 63 e = &ck_certific
1a240 61 74 65 5f 74 79 70 65 3b 0a 09 09 09 09 75 6c ate_type;.....ul
1a250 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f ValueLen = sizeo
1a260 66 28 63 6b 5f 63 65 72 74 69 66 69 63 61 74 65 f(ck_certificate
1a270 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 43 41 43 _type);......CAC
1a280 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1a290 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 (" ... returning
1a2a0 20 43 4b 43 5f 58 5f 35 30 39 20 28 25 6c 75 29 CKC_X_509 (%lu)
1a2b0 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 (%p/%lu)", (uns
1a2c0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 igned long) *((C
1a2d0 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 K_CERTIFICATE_TY
1a2e0 50 45 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 PE *) pValue), p
1a2f0 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 Value, (unsigned
1a300 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 long) ulValueLe
1a310 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a n);......break;.
1a320 09 09 09 63 61 73 65 20 43 4b 41 5f 4b 45 59 5f ...case CKA_KEY_
1a330 54 59 50 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 TYPE:.....CACKEY
1a340 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
1a350 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 equesting attrib
1a360 75 74 65 20 43 4b 41 5f 4b 45 59 5f 54 59 50 45 ute CKA_KEY_TYPE
1a370 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c (0x%08lx) ...",
1a380 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
1a390 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 curr_attr_type)
1a3a0 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 ;......if (objec
1a3b0 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 52 tclass != CKO_PR
1a3c0 49 56 41 54 45 5f 4b 45 59 20 26 26 20 6f 62 6a IVATE_KEY && obj
1a3d0 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f ectclass != CKO_
1a3e0 50 55 42 4c 49 43 5f 4b 45 59 29 20 7b 0a 09 09 PUBLIC_KEY) {...
1a3f0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1a400 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 PRINTF(" ... but
1a410 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 not getting it
1a420 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e because we are n
1a430 6f 74 20 61 20 6b 65 79 2e 22 29 3b 0a 0a 09 09 ot a key.");....
1a440 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a ...break;.....}.
1a450 0a 09 09 09 09 2f 2a 20 57 65 20 6f 6e 6c 79 20 ...../* We only
1a460 73 75 70 70 6f 72 74 20 6f 6e 65 20 6b 65 79 20 support one key
1a470 74 79 70 65 20 2a 2f 0a 09 09 09 09 63 6b 5f 6b type */.....ck_k
1a480 65 79 5f 74 79 70 65 20 3d 20 43 4b 4b 5f 52 53 ey_type = CKK_RS
1a490 41 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d A;......pValue =
1a4a0 20 26 63 6b 5f 6b 65 79 5f 74 79 70 65 3b 0a 09 &ck_key_type;..
1a4b0 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 ...ulValueLen =
1a4c0 73 69 7a 65 6f 66 28 63 6b 5f 6b 65 79 5f 74 79 sizeof(ck_key_ty
1a4d0 70 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 pe);......CACKEY
1a4e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 _DEBUG_PRINTF("
1a4f0 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 43 4b ... returning CK
1a500 4b 5f 52 53 41 20 28 25 6c 75 29 20 28 25 70 2f K_RSA (%lu) (%p/
1a510 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 %lu)", (unsigned
1a520 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 43 45 52 long) *((CK_CER
1a530 54 49 46 49 43 41 54 45 5f 54 59 50 45 20 2a 29 TIFICATE_TYPE *)
1a540 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 pValue), pValue
1a550 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
1a560 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a ) ulValueLen);..
1a570 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 ....break;....ca
1a580 73 65 20 43 4b 41 5f 53 49 47 4e 3a 0a 09 09 09 se CKA_SIGN:....
1a590 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1a5a0 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 INTF("Requesting
1a5b0 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 attribute CKA_S
1a5c0 49 47 4e 20 28 30 78 25 30 38 6c 78 29 20 2e 2e IGN (0x%08lx) ..
1a5d0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f .", (unsigned lo
1a5e0 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 ng) curr_attr_ty
1a5f0 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 pe);......if (ob
1a600 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f jectclass == CKO
1a610 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 _NETSCAPE_TRUST)
1a620 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 {......CACKEY_D
1a630 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e EBUG_PRINTF(" ..
1a640 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e . but not gettin
1a650 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 g it because we
1a660 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 are a Netscape t
1a670 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a rust object");..
1a680 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 .....break;.....
1a690 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 }......if (objec
1a6a0 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 tclass == CKO_PR
1a6b0 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09 IVATE_KEY) {....
1a6c0 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 ..pValue = &ck_t
1a6d0 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 rue;......ulValu
1a6e0 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b eLen = sizeof(ck
1a6f0 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c _true);.....} el
1a700 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 se {......pValue
1a710 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 = &ck_false;...
1a720 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 ...ulValueLen =
1a730 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 sizeof(ck_false)
1a740 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 ;.....}......CAC
1a750 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1a760 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 (" ... returning
1a770 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 %lu (%p/%lu)",
1a780 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
1a790 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 *((CK_BBOOL *) p
1a7a0 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 Value), pValue,
1a7b0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
1a7c0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 ulValueLen);....
1a7d0 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 ..break;....case
1a7e0 20 43 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56 45 CKA_SIGN_RECOVE
1a7f0 52 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 R:.....CACKEY_DE
1a800 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 BUG_PRINTF("Requ
1a810 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 esting attribute
1a820 20 43 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56 45 CKA_SIGN_RECOVE
1a830 52 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 R (0x%08lx) ..."
1a840 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
1a850 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 ) curr_attr_type
1a860 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 );......if (obje
1a870 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e ctclass == CKO_N
1a880 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b ETSCAPE_TRUST) {
1a890 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 ......CACKEY_DEB
1a8a0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 UG_PRINTF(" ...
1a8b0 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 but not getting
1a8c0 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 it because we ar
1a8d0 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 e a Netscape tru
1a8e0 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 st object");....
1a8f0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a ...break;.....}.
1a900 0a 09 09 09 09 2f 2a 20 57 65 20 63 75 72 72 65 ...../* We curre
1a910 6e 74 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f 72 ntly only suppor
1a920 74 20 22 53 69 67 6e 20 77 69 74 68 20 41 70 70 t "Sign with App
1a930 65 6e 64 69 78 22 20 2a 2f 0a 09 09 09 09 70 56 endix" */.....pV
1a940 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 alue = &ck_false
1a950 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e ;.....ulValueLen
1a960 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c = sizeof(ck_fal
1a970 73 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 se);......CACKEY
1a980 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 _DEBUG_PRINTF("
1a990 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c ... returning %l
1a9a0 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e u (%p/%lu)", (un
1a9b0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 signed long) *((
1a9c0 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c CK_BBOOL *) pVal
1a9d0 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e ue), pValue, (un
1a9e0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 signed long) ulV
1a9f0 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 alueLen);......b
1aa00 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b reak;....case CK
1aa10 41 5f 44 45 43 52 59 50 54 3a 0a 09 09 09 09 43 A_DECRYPT:.....C
1aa20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1aa30 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 TF("Requesting a
1aa40 74 74 72 69 62 75 74 65 20 43 4b 41 5f 44 45 43 ttribute CKA_DEC
1aa50 52 59 50 54 20 28 30 78 25 30 38 6c 78 29 20 2e RYPT (0x%08lx) .
1aa60 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c ..", (unsigned l
1aa70 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 ong) curr_attr_t
1aa80 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f ype);......if (o
1aa90 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b bjectclass == CK
1aaa0 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 O_NETSCAPE_TRUST
1aab0 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f ) {......CACKEY_
1aac0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e DEBUG_PRINTF(" .
1aad0 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 .. but not getti
1aae0 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 ng it because we
1aaf0 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 are a Netscape
1ab00 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a trust object");.
1ab10 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 ......break;....
1ab20 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 .}......if (obje
1ab30 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 ctclass == CKO_P
1ab40 52 49 56 41 54 45 5f 4b 45 59 20 7c 7c 20 6f 62 RIVATE_KEY || ob
1ab50 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f jectclass == CKO
1ab60 5f 50 55 42 4c 49 43 5f 4b 45 59 29 20 7b 0a 09 _PUBLIC_KEY) {..
1ab70 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b ....pValue = &ck
1ab80 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 _true;......ulVa
1ab90 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 lueLen = sizeof(
1aba0 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 ck_true);.....}
1abb0 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c else {......pVal
1abc0 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a ue = &ck_false;.
1abd0 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 .....ulValueLen
1abe0 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 = sizeof(ck_fals
1abf0 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 e);.....}......C
1ac00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1ac10 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 TF(" ... returni
1ac20 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 ng %lu (%p/%lu)"
1ac30 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
1ac40 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 ) *((CK_BBOOL *)
1ac50 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 pValue), pValue
1ac60 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
1ac70 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a ) ulValueLen);..
1ac80 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 ....break;....ca
1ac90 73 65 20 43 4b 41 5f 53 45 4e 53 49 54 49 56 45 se CKA_SENSITIVE
1aca0 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 :.....CACKEY_DEB
1acb0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 UG_PRINTF("Reque
1acc0 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 sting attribute
1acd0 43 4b 41 5f 53 45 4e 53 49 54 49 56 45 20 28 30 CKA_SENSITIVE (0
1ace0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 x%08lx) ...", (u
1acf0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 nsigned long) cu
1ad00 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a rr_attr_type);..
1ad10 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c ....if (objectcl
1ad20 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 ass == CKO_NETSC
1ad30 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 APE_TRUST) {....
1ad40 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1ad50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 RINTF(" ... but
1ad60 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 not getting it b
1ad70 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20 ecause we are a
1ad80 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f Netscape trust o
1ad90 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 bject");.......b
1ada0 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 reak;.....}.....
1adb0 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 .if (objectclass
1adc0 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f == CKO_PRIVATE_
1add0 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c KEY) {......pVal
1ade0 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 ue = &ck_true;..
1adf0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d ....ulValueLen =
1ae00 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 sizeof(ck_true)
1ae10 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 ;.....} else {..
1ae20 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b ....pValue = &ck
1ae30 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 _false;......ulV
1ae40 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 alueLen = sizeof
1ae50 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 (ck_false);.....
1ae60 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 }......CACKEY_DE
1ae70 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e BUG_PRINTF(" ...
1ae80 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 returning %lu (
1ae90 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 %p/%lu)", (unsig
1aea0 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f ned long) *((CK_
1aeb0 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 BBOOL *) pValue)
1aec0 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 , pValue, (unsig
1aed0 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 ned long) ulValu
1aee0 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 eLen);......brea
1aef0 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 45 k;....case CKA_E
1af00 58 54 52 41 43 54 41 42 4c 45 3a 0a 09 09 09 09 XTRACTABLE:.....
1af10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1af20 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 NTF("Requesting
1af30 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 45 58 attribute CKA_EX
1af40 54 52 41 43 54 41 42 4c 45 20 28 30 78 25 30 38 TRACTABLE (0x%08
1af50 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 lx) ...", (unsig
1af60 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 ned long) curr_a
1af70 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 ttr_type);......
1af80 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 if (objectclass
1af90 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f == CKO_NETSCAPE_
1afa0 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 TRUST) {......CA
1afb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
1afc0 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 F(" ... but not
1afd0 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 getting it becau
1afe0 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 se we are a Nets
1aff0 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 cape trust objec
1b000 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b t");.......break
1b010 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 ;.....}......if
1b020 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 (objectclass ==
1b030 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 29 CKO_PRIVATE_KEY)
1b040 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d {......pValue =
1b050 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 &ck_false;.....
1b060 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 .ulValueLen = si
1b070 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09 zeof(ck_true);..
1b080 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 ...} else {.....
1b090 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 .pValue = &ck_tr
1b0a0 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 ue;......ulValue
1b0b0 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f Len = sizeof(ck_
1b0c0 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 false);.....}...
1b0d0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1b0e0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 PRINTF(" ... ret
1b0f0 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 urning %lu (%p/%
1b100 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 lu)", (unsigned
1b110 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f long) *((CK_BBOO
1b120 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 L *) pValue), pV
1b130 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 alue, (unsigned
1b140 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e long) ulValueLen
1b150 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 );......break;..
1b160 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55 4c ..case CKA_MODUL
1b170 55 53 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 US:.....CACKEY_D
1b180 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 EBUG_PRINTF("Req
1b190 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 uesting attribut
1b1a0 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 20 28 30 e CKA_MODULUS (0
1b1b0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 x%08lx) ...", (u
1b1c0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 nsigned long) cu
1b1d0 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a rr_attr_type);..
1b1e0 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c ....if (objectcl
1b1f0 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 ass == CKO_NETSC
1b200 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 APE_TRUST) {....
1b210 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1b220 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 RINTF(" ... but
1b230 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 not getting it b
1b240 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20 ecause we are a
1b250 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f Netscape trust o
1b260 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 bject");.......b
1b270 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 reak;.....}.....
1b280 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65 .if (certificate
1b290 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 _len >= 0) {....
1b2a0 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 ..x509_read_ret
1b2b0 3d 20 78 35 30 39 5f 74 6f 5f 6d 6f 64 75 6c 75 = x509_to_modulu
1b2c0 73 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 s(certificate, c
1b2d0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 ertificate_len,
1b2e0 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 &pValue);......i
1b2f0 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 f (x509_read_ret
1b300 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56 < 0) {.......pV
1b310 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 alue = NULL;....
1b320 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 ..} else {......
1b330 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 .ulValueLen = x5
1b340 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09_read_ret;....
1b350 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 ..}.....}......C
1b360 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1b370 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 TF(" ... returni
1b380 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 56 ng (%p/%lu)", pV
1b390 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 alue, (unsigned
1b3a0 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e long) ulValueLen
1b3b0 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 );......break;..
1b3c0 09 09 63 61 73 65 20 43 4b 41 5f 50 55 42 4c 49 ..case CKA_PUBLI
1b3d0 43 5f 45 58 50 4f 4e 45 4e 54 3a 0a 09 09 09 09 C_EXPONENT:.....
1b3e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1b3f0 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 NTF("Requesting
1b400 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 50 55 attribute CKA_PU
1b410 42 4c 49 43 5f 45 58 50 4f 4e 45 4e 54 20 28 30 BLIC_EXPONENT (0
1b420 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 x%08lx) ...", (u
1b430 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 nsigned long) cu
1b440 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a rr_attr_type);..
1b450 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c ....if (objectcl
1b460 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 ass == CKO_NETSC
1b470 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 APE_TRUST) {....
1b480 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1b490 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 RINTF(" ... but
1b4a0 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 not getting it b
1b4b0 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20 ecause we are a
1b4c0 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f Netscape trust o
1b4d0 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 bject");.......b
1b4e0 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 reak;.....}.....
1b4f0 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65 .if (certificate
1b500 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 _len >= 0) {....
1b510 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 ..x509_read_ret
1b520 3d 20 78 35 30 39 5f 74 6f 5f 65 78 70 6f 6e 65 = x509_to_expone
1b530 6e 74 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 nt(certificate,
1b540 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c certificate_len,
1b550 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 &pValue);......
1b560 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 if (x509_read_re
1b570 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 t < 0) {.......p
1b580 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 Value = NULL;...
1b590 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 ...} else {.....
1b5a0 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 ..ulValueLen = x
1b5b0 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 509_read_ret;...
1b5c0 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 ...}.....}......
1b5d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1b5e0 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e NTF(" ... return
1b5f0 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 ing (%p/%lu)", p
1b600 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 Value, (unsigned
1b610 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 long) ulValueLe
1b620 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a n);......break;.
1b630 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 ...case CKA_TRUS
1b640 54 5f 44 49 47 49 54 41 4c 5f 53 49 47 4e 41 54 T_DIGITAL_SIGNAT
1b650 55 52 45 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 URE:....case CKA
1b660 5f 54 52 55 53 54 5f 4e 4f 4e 5f 52 45 50 55 44 _TRUST_NON_REPUD
1b670 49 41 54 49 4f 4e 3a 0a 09 09 09 63 61 73 65 20 IATION:....case
1b680 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59 5f 45 4e CKA_TRUST_KEY_EN
1b690 43 49 50 48 45 52 4d 45 4e 54 3a 0a 09 09 09 63 CIPHERMENT:....c
1b6a0 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 44 41 ase CKA_TRUST_DA
1b6b0 54 41 5f 45 4e 43 49 50 48 45 52 4d 45 4e 54 3a TA_ENCIPHERMENT:
1b6c0 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 ....case CKA_TRU
1b6d0 53 54 5f 4b 45 59 5f 41 47 52 45 45 4d 45 4e 54 ST_KEY_AGREEMENT
1b6e0 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 :....case CKA_TR
1b6f0 55 53 54 5f 4b 45 59 5f 43 45 52 54 5f 53 49 47 UST_KEY_CERT_SIG
1b700 4e 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 N:....case CKA_T
1b710 52 55 53 54 5f 43 52 4c 5f 53 49 47 4e 3a 0a 09 RUST_CRL_SIGN:..
1b720 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 ..case CKA_TRUST
1b730 5f 53 45 52 56 45 52 5f 41 55 54 48 3a 0a 09 09 _SERVER_AUTH:...
1b740 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f .case CKA_TRUST_
1b750 43 4c 49 45 4e 54 5f 41 55 54 48 3a 0a 09 09 09 CLIENT_AUTH:....
1b760 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 case CKA_TRUST_C
1b770 4f 44 45 5f 53 49 47 4e 49 4e 47 3a 0a 09 09 09 ODE_SIGNING:....
1b780 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 45 case CKA_TRUST_E
1b790 4d 41 49 4c 5f 50 52 4f 54 45 43 54 49 4f 4e 3a MAIL_PROTECTION:
1b7a0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
1b7b0 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 G_PRINTF("Reques
1b7c0 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 ting attribute C
1b7d0 4b 41 5f 54 52 55 53 54 5f 2e 2e 2e 20 28 30 78 KA_TRUST_... (0x
1b7e0 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e %08lx) ...", (un
1b7f0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 signed long) cur
1b800 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 r_attr_type);...
1b810 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f ...pValue = &ck_
1b820 74 72 75 73 74 65 64 3b 0a 09 09 09 09 75 6c 56 trusted;.....ulV
1b830 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 alueLen = sizeof
1b840 28 63 6b 5f 74 72 75 73 74 65 64 29 3b 0a 0a 09 (ck_trusted);...
1b850 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1b860 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 PRINTF(" ... ret
1b870 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 urning %lu (%p/%
1b880 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 lu)", (unsigned
1b890 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 54 52 55 53 long) *((CK_TRUS
1b8a0 54 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 T *) pValue), pV
1b8b0 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 alue, (unsigned
1b8c0 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e long) ulValueLen
1b8d0 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 );......break;..
1b8e0 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52 54 5f ..case CKA_CERT_
1b8f0 53 48 41 31 5f 48 41 53 48 3a 0a 09 09 09 09 43 SHA1_HASH:.....C
1b900 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1b910 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 TF("Requesting a
1b920 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43 45 52 ttribute CKA_CER
1b930 54 5f 53 48 41 31 5f 48 41 53 48 20 28 30 78 25 T_SHA1_HASH (0x%
1b940 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 08lx) ...", (uns
1b950 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 igned long) curr
1b960 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 _attr_type);....
1b970 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 ..if (objectclas
1b980 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 s != CKO_NETSCAP
1b990 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 E_TRUST) {......
1b9a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1b9b0 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f NTF(" ... but no
1b9c0 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 t getting it bec
1b9d0 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 ause we are not
1b9e0 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 a Netscape trust
1b9f0 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 object");......
1ba00 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 .break;.....}...
1ba10 09 09 09 53 48 41 31 52 65 73 65 74 28 26 73 68 ...SHA1Reset(&sh
1ba20 61 31 5f 63 74 78 29 3b 0a 09 09 09 09 53 48 41 a1_ctx);.....SHA
1ba30 31 49 6e 70 75 74 28 26 73 68 61 31 5f 63 74 78 1Input(&sha1_ctx
1ba40 2c 20 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 , certificate, c
1ba50 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b ertificate_len);
1ba60 0a 09 09 09 09 53 48 41 31 52 65 73 75 6c 74 28 .....SHA1Result(
1ba70 26 73 68 61 31 5f 63 74 78 2c 20 73 68 61 31 5f &sha1_ctx, sha1_
1ba80 68 61 73 68 29 3b 0a 0a 09 09 09 09 70 56 61 6c hash);......pVal
1ba90 75 65 20 3d 20 73 68 61 31 5f 68 61 73 68 3b 0a ue = sha1_hash;.
1baa0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d ....ulValueLen =
1bab0 20 73 69 7a 65 6f 66 28 73 68 61 31 5f 68 61 73 sizeof(sha1_has
1bac0 68 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f h);......CACKEY_
1bad0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e DEBUG_PRINTF(" .
1bae0 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f .. returning %p/
1baf0 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 %lu", pValue, (u
1bb00 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c nsigned long) ul
1bb10 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 ValueLen);......
1bb20 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 break;....case C
1bb30 4b 41 5f 43 45 52 54 5f 4d 44 35 5f 48 41 53 48 KA_CERT_MD5_HASH
1bb40 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 :.....CACKEY_DEB
1bb50 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 UG_PRINTF("Reque
1bb60 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 sting attribute
1bb70 43 4b 41 5f 43 45 52 54 5f 4d 44 35 5f 48 41 53 CKA_CERT_MD5_HAS
1bb80 48 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 H (0x%08lx) ..."
1bb90 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
1bba0 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 ) curr_attr_type
1bbb0 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 );......if (obje
1bbc0 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e ctclass != CKO_N
1bbd0 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b ETSCAPE_TRUST) {
1bbe0 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 ......CACKEY_DEB
1bbf0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 UG_PRINTF(" ...
1bc00 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 but not getting
1bc10 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 it because we ar
1bc20 65 20 6e 6f 74 20 61 20 4e 65 74 73 63 61 70 65 e not a Netscape
1bc30 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b trust object");
1bc40 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 .......break;...
1bc50 09 09 7d 0a 0a 09 09 09 09 4d 44 35 49 6e 69 74 ..}......MD5Init
1bc60 28 26 6d 64 35 5f 63 74 78 29 3b 0a 09 09 09 09 (&md5_ctx);.....
1bc70 4d 44 35 55 70 64 61 74 65 28 26 6d 64 35 5f 63 MD5Update(&md5_c
1bc80 74 78 2c 20 63 65 72 74 69 66 69 63 61 74 65 2c tx, certificate,
1bc90 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e certificate_len
1bca0 29 3b 0a 09 09 09 09 4d 44 35 46 69 6e 61 6c 28 );.....MD5Final(
1bcb0 6d 64 35 5f 68 61 73 68 2c 20 26 6d 64 35 5f 63 md5_hash, &md5_c
1bcc0 74 78 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 tx);......pValue
1bcd0 20 3d 20 6d 64 35 5f 68 61 73 68 3b 0a 09 09 09 = md5_hash;....
1bce0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 .ulValueLen = si
1bcf0 7a 65 6f 66 28 6d 64 35 5f 68 61 73 68 29 3b 0a zeof(md5_hash);.
1bd00 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
1bd10 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 G_PRINTF(" ... r
1bd20 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 eturning %p/%lu"
1bd30 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 , pValue, (unsig
1bd40 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 ned long) ulValu
1bd50 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 eLen);......brea
1bd60 6b 3b 0a 09 09 09 64 65 66 61 75 6c 74 3a 0a 09 k;....default:..
1bd70 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c ...pValue = NULL
1bd80 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e ;.....ulValueLen
1bd90 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b = (CK_LONG) -1;
1bda0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a .....break;...}.
1bdb0 0a 09 09 69 66 20 28 28 28 43 4b 5f 4c 4f 4e 47 ...if (((CK_LONG
1bdc0 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 20 21 3d ) ulValueLen) !=
1bdd0 20 28 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 29 29 ((CK_LONG) -1))
1bde0 20 7b 0a 09 09 09 2f 2a 20 50 75 73 68 20 63 75 {..../* Push cu
1bdf0 72 72 5f 61 74 74 72 20 6f 6e 74 6f 20 74 68 65 rr_attr onto the
1be00 20 73 74 61 63 6b 20 2a 2f 0a 09 09 09 63 75 72 stack */....cur
1be10 72 5f 61 74 74 72 2e 74 79 70 65 20 3d 20 63 75 r_attr.type = cu
1be20 72 72 5f 61 74 74 72 5f 74 79 70 65 3b 0a 09 09 rr_attr_type;...
1be30 09 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c .curr_attr.ulVal
1be40 75 65 4c 65 6e 20 3d 20 75 6c 56 61 6c 75 65 4c ueLen = ulValueL
1be50 65 6e 3b 0a 0a 09 09 09 63 75 72 72 5f 61 74 74 en;.....curr_att
1be60 72 2e 70 56 61 6c 75 65 20 3d 20 6d 61 6c 6c 6f r.pValue = mallo
1be70 63 28 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 c(curr_attr.ulVa
1be80 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 6d 65 6d 63 lueLen);....memc
1be90 70 79 28 63 75 72 72 5f 61 74 74 72 2e 70 56 61 py(curr_attr.pVa
1bea0 6c 75 65 2c 20 70 56 61 6c 75 65 2c 20 63 75 72 lue, pValue, cur
1beb0 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65 r_attr.ulValueLe
1bec0 6e 29 3b 0a 0a 09 09 09 69 66 20 28 70 56 61 6c n);.....if (pVal
1bed0 75 65 5f 66 72 65 65 20 26 26 20 70 56 61 6c 75 ue_free && pValu
1bee0 65 29 20 7b 0a 09 09 09 09 66 72 65 65 28 70 56 e) {.....free(pV
1bef0 61 6c 75 65 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 alue);....}.....
1bf00 69 66 20 28 6e 75 6d 61 74 74 72 73 20 3e 3d 20 if (numattrs >=
1bf10 72 65 74 76 61 6c 5f 63 6f 75 6e 74 29 20 7b 0a retval_count) {.
1bf20 09 09 09 09 72 65 74 76 61 6c 20 3d 20 72 65 61 ....retval = rea
1bf30 6c 6c 6f 63 28 72 65 74 76 61 6c 2c 20 72 65 74 lloc(retval, ret
1bf40 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a 65 val_count * size
1bf50 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a 09 09 of(*retval));...
1bf60 09 7d 0a 0a 09 09 09 6d 65 6d 63 70 79 28 26 72 .}.....memcpy(&r
1bf70 65 74 76 61 6c 5b 6e 75 6d 61 74 74 72 73 5d 2c etval[numattrs],
1bf80 20 26 63 75 72 72 5f 61 74 74 72 2c 20 73 69 7a &curr_attr, siz
1bf90 65 6f 66 28 63 75 72 72 5f 61 74 74 72 29 29 3b eof(curr_attr));
1bfa0 0a 09 09 09 6e 75 6d 61 74 74 72 73 2b 2b 3b 0a ....numattrs++;.
1bfb0 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6e 75 6d ..}..}...if (num
1bfc0 61 74 74 72 73 20 21 3d 20 30 29 20 7b 0a 09 09 attrs != 0) {...
1bfd0 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 3d 20 6e retval_count = n
1bfe0 75 6d 61 74 74 72 73 3b 0a 09 09 72 65 74 76 61 umattrs;...retva
1bff0 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 72 65 74 76 l = realloc(retv
1c000 61 6c 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74 al, retval_count
1c010 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74 76 61 * sizeof(*retva
1c020 6c 29 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 l));..} else {..
1c030 09 66 72 65 65 28 72 65 74 76 61 6c 29 3b 0a 0a .free(retval);..
1c040 09 09 72 65 74 76 61 6c 20 3d 20 4e 55 4c 4c 3b ..retval = NULL;
1c050 0a 09 7d 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 ..}...*pulCount
1c060 3d 20 6e 75 6d 61 74 74 72 73 3b 0a 0a 09 43 41 = numattrs;...CA
1c070 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
1c080 46 28 22 52 65 74 75 72 6e 69 6e 67 20 25 6c 75 F("Returning %lu
1c090 20 6f 62 6a 65 63 74 73 20 28 25 70 29 2e 22 2c objects (%p).",
1c0a0 20 6e 75 6d 61 74 74 72 73 2c 20 28 76 6f 69 64 numattrs, (void
1c0b0 20 2a 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 *) retval);...r
1c0c0 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d eturn(retval);.}
1c0d0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 ..static void ca
1c0e0 63 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e 74 69 ckey_free_identi
1c0f0 74 69 65 73 28 73 74 72 75 63 74 20 63 61 63 6b ties(struct cack
1c100 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 ey_identity *ide
1c110 6e 74 69 74 69 65 73 2c 20 75 6e 73 69 67 6e 65 ntities, unsigne
1c120 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 69 65 d long identitie
1c130 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 41 s_count) {..CK_A
1c140 54 54 52 49 42 55 54 45 20 2a 63 75 72 72 5f 61 TTRIBUTE *curr_a
1c150 74 74 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c ttr;..unsigned l
1c160 6f 6e 67 20 69 64 5f 69 64 78 2c 20 61 74 74 72 ong id_idx, attr
1c170 5f 69 64 78 3b 0a 0a 09 69 66 20 28 69 64 65 6e _idx;...if (iden
1c180 74 69 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 20 7c tities == NULL |
1c190 7c 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 | identities_cou
1c1a0 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 72 65 74 nt == 0) {...ret
1c1b0 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 urn;..}...for (i
1c1c0 64 5f 69 64 78 20 3d 20 30 3b 20 69 64 5f 69 64 d_idx = 0; id_id
1c1d0 78 20 3c 20 69 64 65 6e 74 69 74 69 65 73 5f 63 x < identities_c
1c1e0 6f 75 6e 74 3b 20 69 64 5f 69 64 78 2b 2b 29 20 ount; id_idx++)
1c1f0 7b 0a 09 09 69 66 20 28 69 64 65 6e 74 69 74 69 {...if (identiti
1c200 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 es[id_idx].attri
1c210 62 75 74 65 73 29 20 7b 0a 09 09 09 66 6f 72 20 butes) {....for
1c220 28 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 61 (attr_idx = 0; a
1c230 74 74 72 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 ttr_idx < identi
1c240 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 ties[id_idx].att
1c250 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 61 ributes_count; a
1c260 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 ttr_idx++) {....
1c270 09 63 75 72 72 5f 61 74 74 72 20 3d 20 26 69 64 .curr_attr = &id
1c280 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d entities[id_idx]
1c290 2e 61 74 74 72 69 62 75 74 65 73 5b 61 74 74 72 .attributes[attr
1c2a0 5f 69 64 78 5d 3b 0a 0a 09 09 09 09 69 66 20 28 _idx];......if (
1c2b0 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 curr_attr->pValu
1c2c0 65 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 e) {......free(c
1c2d0 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 urr_attr->pValue
1c2e0 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 );.....}....}...
1c2f0 09 09 69 66 20 28 69 64 65 6e 74 69 74 69 65 73 ..if (identities
1c300 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 [id_idx].attribu
1c310 74 65 73 29 20 7b 0a 09 09 09 09 66 72 65 65 28 tes) {.....free(
1c320 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 identities[id_id
1c330 78 5d 2e 61 74 74 72 69 62 75 74 65 73 29 3b 0a x].attributes);.
1c340 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f ...}.....cackey_
1c350 66 72 65 65 5f 63 65 72 74 73 28 69 64 65 6e 74 free_certs(ident
1c360 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 ities[id_idx].pc
1c370 73 63 5f 69 64 65 6e 74 69 74 79 2c 20 31 2c 20 sc_identity, 1,
1c380 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 66 72 65 1);...}..}...fre
1c390 65 28 69 64 65 6e 74 69 74 69 65 73 29 3b 0a 7d e(identities);.}
1c3a0 0a 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 ..static unsigne
1c3b0 64 20 6c 6f 6e 67 20 63 61 63 6b 65 79 5f 72 65 d long cackey_re
1c3c0 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69 65 ad_dod_identitie
1c3d0 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f s(struct cackey_
1c3e0 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 identity *identi
1c3f0 74 69 65 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c ties, unsigned l
1c400 6f 6e 67 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 ong num_dod_cert
1c410 73 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c s) {..unsigned l
1c420 6f 6e 67 20 63 65 72 74 5f 69 64 78 2c 20 69 64 ong cert_idx, id
1c430 5f 69 64 78 20 3d 20 30 3b 0a 0a 09 69 66 20 28 _idx = 0;...if (
1c440 69 64 65 6e 74 69 74 69 65 73 20 3d 3d 20 4e 55 identities == NU
1c450 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 6e LL) {...return(n
1c460 75 6d 5f 64 6f 64 5f 63 65 72 74 73 20 2a 20 33 um_dod_certs * 3
1c470 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 63 65 72 );..}...for (cer
1c480 74 5f 69 64 78 20 3d 20 30 3b 20 63 65 72 74 5f t_idx = 0; cert_
1c490 69 64 78 20 3c 20 6e 75 6d 5f 64 6f 64 5f 63 65 idx < num_dod_ce
1c4a0 72 74 73 3b 20 63 65 72 74 5f 69 64 78 2b 2b 29 rts; cert_idx++)
1c4b0 20 7b 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b {...identities[
1c4c0 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 id_idx].pcsc_ide
1c4d0 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 ntity = NULL;...
1c4e0 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 identities[id_id
1c4f0 78 5d 2e 61 74 74 72 69 62 75 74 65 73 20 3d 20 x].attributes =
1c500 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 cackey_get_attri
1c510 62 75 74 65 73 28 43 4b 4f 5f 43 45 52 54 49 46 butes(CKO_CERTIF
1c520 49 43 41 54 45 2c 20 26 65 78 74 72 61 5f 63 65 ICATE, &extra_ce
1c530 72 74 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 30 rts[cert_idx], 0
1c540 78 66 30 30 30 20 7c 20 63 65 72 74 5f 69 64 78 xf000 | cert_idx
1c550 2c 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64 , &identities[id
1c560 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 _idx].attributes
1c570 5f 63 6f 75 6e 74 29 3b 0a 09 09 69 64 5f 69 64 _count);...id_id
1c580 78 2b 2b 3b 0a 0a 09 09 69 64 65 6e 74 69 74 69 x++;....identiti
1c590 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f es[id_idx].pcsc_
1c5a0 69 64 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b identity = NULL;
1c5b0 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 ...identities[id
1c5c0 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 _idx].attributes
1c5d0 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 = cackey_get_at
1c5e0 74 72 69 62 75 74 65 73 28 43 4b 4f 5f 50 55 42 tributes(CKO_PUB
1c5f0 4c 49 43 5f 4b 45 59 2c 20 26 65 78 74 72 61 5f LIC_KEY, &extra_
1c600 63 65 72 74 73 5b 63 65 72 74 5f 69 64 78 5d 2c certs[cert_idx],
1c610 20 30 78 66 30 30 30 20 7c 20 63 65 72 74 5f 69 0xf000 | cert_i
1c620 64 78 2c 20 26 69 64 65 6e 74 69 74 69 65 73 5b dx, &identities[
1c630 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 id_idx].attribut
1c640 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 09 69 64 5f es_count);...id_
1c650 69 64 78 2b 2b 3b 0a 0a 09 09 69 64 65 6e 74 69 idx++;....identi
1c660 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 ties[id_idx].pcs
1c670 63 5f 69 64 65 6e 74 69 74 79 20 3d 20 4e 55 4c c_identity = NUL
1c680 4c 3b 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b L;...identities[
1c690 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 id_idx].attribut
1c6a0 65 73 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f es = cackey_get_
1c6b0 61 74 74 72 69 62 75 74 65 73 28 43 4b 4f 5f 4e attributes(CKO_N
1c6c0 45 54 53 43 41 50 45 5f 54 52 55 53 54 2c 20 26 ETSCAPE_TRUST, &
1c6d0 65 78 74 72 61 5f 63 65 72 74 73 5b 63 65 72 74 extra_certs[cert
1c6e0 5f 69 64 78 5d 2c 20 30 78 66 30 30 30 20 7c 20 _idx], 0xf000 |
1c6f0 63 65 72 74 5f 69 64 78 2c 20 26 69 64 65 6e 74 cert_idx, &ident
1c700 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 ities[id_idx].at
1c710 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b tributes_count);
1c720 0a 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 09 7d 0a ...id_idx++;..}.
1c730 0a 09 72 65 74 75 72 6e 28 69 64 5f 69 64 78 29 ..return(id_idx)
1c740 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73 74 72 75 ;.}..static stru
1c750 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 ct cackey_identi
1c760 74 79 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f ty *cackey_read_
1c770 69 64 65 6e 74 69 74 69 65 73 28 73 74 72 75 63 identities(struc
1c780 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 t cackey_slot *s
1c790 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f lot, unsigned lo
1c7a0 6e 67 20 2a 69 64 73 5f 66 6f 75 6e 64 29 20 7b ng *ids_found) {
1c7b0 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f ..struct cackey_
1c7c0 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 pcsc_identity *p
1c7d0 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a csc_identities;.
1c7e0 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 .struct cackey_i
1c7f0 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 dentity *identit
1c800 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c ies;..unsigned l
1c810 6f 6e 67 20 6e 75 6d 5f 69 64 73 2c 20 69 64 5f ong num_ids, id_
1c820 69 64 78 2c 20 63 75 72 72 5f 69 64 5f 74 79 70 idx, curr_id_typ
1c830 65 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e e;..unsigned lon
1c840 67 20 6e 75 6d 5f 63 65 72 74 73 2c 20 6e 75 6d g num_certs, num
1c850 5f 64 6f 64 5f 63 65 72 74 73 2c 20 63 65 72 74 _dod_certs, cert
1c860 5f 69 64 78 3b 0a 09 69 6e 74 20 69 6e 63 6c 75 _idx;..int inclu
1c870 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73 20 3d de_extra_certs =
1c880 20 30 2c 20 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 0, include_dod_
1c890 63 65 72 74 73 3b 0a 0a 09 43 41 43 4b 45 59 5f certs;...CACKEY_
1c8a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
1c8b0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 69 lled.");...if (i
1c8c0 64 73 5f 66 6f 75 6e 64 20 3d 3d 20 4e 55 4c 4c ds_found == NULL
1c8d0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
1c8e0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
1c8f0 2e 20 20 69 64 73 5f 66 6f 75 6e 64 20 69 73 20 . ids_found is
1c900 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 NULL");....retur
1c910 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 23 69 66 n(NULL);..}..#if
1c920 64 65 66 20 43 41 43 4b 45 59 5f 43 41 52 44 5f def CACKEY_CARD_
1c930 53 4c 4f 54 5f 49 4e 43 4c 55 44 45 5f 45 58 54 SLOT_INCLUDE_EXT
1c940 52 41 5f 43 45 52 54 53 0a 09 69 6e 63 6c 75 64 RA_CERTS..includ
1c950 65 5f 65 78 74 72 61 5f 63 65 72 74 73 20 3d 20 e_extra_certs =
1c960 31 3b 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28 1;.#endif...if (
1c970 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 44 getenv("CACKEY_D
1c980 4f 44 5f 43 45 52 54 53 5f 4f 4e 5f 48 57 5f 53 OD_CERTS_ON_HW_S
1c990 4c 4f 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20 LOTS") != NULL)
1c9a0 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 65 78 74 72 {...include_extr
1c9b0 61 5f 63 65 72 74 73 20 3d 20 31 3b 0a 09 7d 0a a_certs = 1;..}.
1c9c0 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 43 41 ..if (getenv("CA
1c9d0 43 4b 45 59 5f 4e 4f 5f 44 4f 44 5f 43 45 52 54 CKEY_NO_DOD_CERT
1c9e0 53 5f 4f 4e 5f 48 57 5f 53 4c 4f 54 53 22 29 20 S_ON_HW_SLOTS")
1c9f0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 != NULL) {...inc
1ca00 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73 lude_extra_certs
1ca10 20 3d 20 30 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 = 0;..}..#ifdef
1ca20 20 43 41 43 4b 45 59 5f 4e 4f 5f 45 58 54 52 41 CACKEY_NO_EXTRA
1ca30 5f 43 45 52 54 53 0a 09 69 66 20 28 67 65 74 65 _CERTS..if (gete
1ca40 6e 76 28 22 43 41 43 4b 45 59 5f 45 58 54 52 41 nv("CACKEY_EXTRA
1ca50 5f 43 45 52 54 53 22 29 20 21 3d 20 4e 55 4c 4c _CERTS") != NULL
1ca60 29 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f ) {...include_do
1ca70 64 5f 63 65 72 74 73 20 3d 20 31 3b 0a 09 7d 20 d_certs = 1;..}
1ca80 65 6c 73 65 20 7b 0a 09 09 69 6e 63 6c 75 64 65 else {...include
1ca90 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 30 3b 0a _dod_certs = 0;.
1caa0 09 7d 0a 23 65 6c 73 65 0a 09 69 66 20 28 67 65 .}.#else..if (ge
1cab0 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 4e 4f 5f tenv("CACKEY_NO_
1cac0 45 58 54 52 41 5f 43 45 52 54 53 22 29 20 21 3d EXTRA_CERTS") !=
1cad0 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c 75 NULL) {...inclu
1cae0 64 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 30 de_dod_certs = 0
1caf0 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 6e ;..} else {...in
1cb00 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 20 clude_dod_certs
1cb10 3d 20 31 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a = 1;..}.#endif..
1cb20 09 69 66 20 28 69 6e 63 6c 75 64 65 5f 64 6f 64 .if (include_dod
1cb30 5f 63 65 72 74 73 29 20 7b 0a 09 09 6e 75 6d 5f _certs) {...num_
1cb40 64 6f 64 5f 63 65 72 74 73 20 3d 20 73 69 7a 65 dod_certs = size
1cb50 6f 66 28 65 78 74 72 61 5f 63 65 72 74 73 29 20 of(extra_certs)
1cb60 2f 20 73 69 7a 65 6f 66 28 65 78 74 72 61 5f 63 / sizeof(extra_c
1cb70 65 72 74 73 5b 30 5d 29 3b 0a 09 7d 20 65 6c 73 erts[0]);..} els
1cb80 65 20 7b 0a 09 09 6e 75 6d 5f 64 6f 64 5f 63 65 e {...num_dod_ce
1cb90 72 74 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 rts = 0;..}...if
1cba0 20 28 73 6c 6f 74 2d 3e 69 6e 74 65 72 6e 61 6c (slot->internal
1cbb0 29 20 7b 0a 09 09 6e 75 6d 5f 69 64 73 20 3d 20 ) {...num_ids =
1cbc0 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f cackey_read_dod_
1cbd0 69 64 65 6e 74 69 74 69 65 73 28 4e 55 4c 4c 2c identities(NULL,
1cbe0 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29 3b num_dod_certs);
1cbf0 0a 0a 09 09 69 66 20 28 6e 75 6d 5f 69 64 73 20 ....if (num_ids
1cc00 21 3d 20 30 29 20 7b 0a 09 09 09 69 64 65 6e 74 != 0) {....ident
1cc10 69 74 69 65 73 20 3d 20 6d 61 6c 6c 6f 63 28 6e ities = malloc(n
1cc20 75 6d 5f 69 64 73 20 2a 20 73 69 7a 65 6f 66 28 um_ids * sizeof(
1cc30 2a 69 64 65 6e 74 69 74 69 65 73 29 29 3b 0a 0a *identities));..
1cc40 09 09 09 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 ...cackey_read_d
1cc50 6f 64 5f 69 64 65 6e 74 69 74 69 65 73 28 69 64 od_identities(id
1cc60 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f 64 6f entities, num_do
1cc70 64 5f 63 65 72 74 73 29 3b 0a 09 09 7d 20 65 6c d_certs);...} el
1cc80 73 65 20 7b 0a 09 09 09 69 64 65 6e 74 69 74 69 se {....identiti
1cc90 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a es = NULL;...}..
1cca0 09 09 2a 69 64 73 5f 66 6f 75 6e 64 20 3d 20 6e ..*ids_found = n
1ccb0 75 6d 5f 69 64 73 3b 0a 0a 09 09 72 65 74 75 72 um_ids;....retur
1ccc0 6e 28 69 64 65 6e 74 69 74 69 65 73 29 3b 0a 09 n(identities);..
1ccd0 7d 0a 0a 09 70 63 73 63 5f 69 64 65 6e 74 69 74 }...pcsc_identit
1cce0 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 ies = cackey_rea
1ccf0 64 5f 63 65 72 74 73 28 73 6c 6f 74 2c 20 4e 55 d_certs(slot, NU
1cd00 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73 29 3b LL, &num_certs);
1cd10 0a 09 69 66 20 28 70 63 73 63 5f 69 64 65 6e 74 ..if (pcsc_ident
1cd20 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b ities != NULL) {
1cd30 0a 09 09 2f 2a 20 43 6f 6e 76 65 72 74 20 6e 75 .../* Convert nu
1cd40 6d 62 65 72 20 6f 66 20 43 65 72 74 73 20 74 6f mber of Certs to
1cd50 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 number of objec
1cd60 74 73 20 2a 2f 0a 09 09 6e 75 6d 5f 69 64 73 20 ts */...num_ids
1cd70 3d 20 28 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b = (CKO_PRIVATE_K
1cd80 45 59 20 2d 20 43 4b 4f 5f 43 45 52 54 49 46 49 EY - CKO_CERTIFI
1cd90 43 41 54 45 20 2b 20 31 29 20 2a 20 6e 75 6d 5f CATE + 1) * num_
1cda0 63 65 72 74 73 3b 0a 0a 09 09 69 66 20 28 69 6e certs;....if (in
1cdb0 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74 clude_extra_cert
1cdc0 73 29 20 7b 0a 09 09 09 6e 75 6d 5f 69 64 73 20 s) {....num_ids
1cdd0 2b 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 += cackey_read_d
1cde0 6f 64 5f 69 64 65 6e 74 69 74 69 65 73 28 4e 55 od_identities(NU
1cdf0 4c 4c 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 LL, num_dod_cert
1ce00 73 29 3b 0a 09 09 7d 0a 0a 09 09 69 64 65 6e 74 s);...}....ident
1ce10 69 74 69 65 73 20 3d 20 6d 61 6c 6c 6f 63 28 6e ities = malloc(n
1ce20 75 6d 5f 69 64 73 20 2a 20 73 69 7a 65 6f 66 28 um_ids * sizeof(
1ce30 2a 69 64 65 6e 74 69 74 69 65 73 29 29 3b 0a 0a *identities));..
1ce40 09 09 2f 2a 20 41 64 64 20 63 65 72 74 69 66 69 ../* Add certifi
1ce50 63 61 74 65 73 2c 20 70 75 62 6c 69 63 20 6b 65 cates, public ke
1ce60 79 73 2c 20 61 6e 64 20 70 72 69 76 61 74 65 20 ys, and private
1ce70 6b 65 79 73 20 66 72 6f 6d 20 74 68 65 20 73 6d keys from the sm
1ce80 61 72 74 63 61 72 64 20 2a 2f 0a 09 09 69 64 5f artcard */...id_
1ce90 69 64 78 20 3d 20 30 3b 0a 09 09 66 6f 72 20 28 idx = 0;...for (
1cea0 63 65 72 74 5f 69 64 78 20 3d 20 30 3b 20 63 65 cert_idx = 0; ce
1ceb0 72 74 5f 69 64 78 20 3c 20 6e 75 6d 5f 63 65 72 rt_idx < num_cer
1cec0 74 73 3b 20 63 65 72 74 5f 69 64 78 2b 2b 29 20 ts; cert_idx++)
1ced0 7b 0a 09 09 09 66 6f 72 20 28 63 75 72 72 5f 69 {....for (curr_i
1cee0 64 5f 74 79 70 65 20 3d 20 43 4b 4f 5f 43 45 52 d_type = CKO_CER
1cef0 54 49 46 49 43 41 54 45 3b 20 63 75 72 72 5f 69 TIFICATE; curr_i
1cf00 64 5f 74 79 70 65 20 3c 3d 20 43 4b 4f 5f 50 52 d_type <= CKO_PR
1cf10 49 56 41 54 45 5f 4b 45 59 3b 20 63 75 72 72 5f IVATE_KEY; curr_
1cf20 69 64 5f 74 79 70 65 2b 2b 29 20 7b 0a 09 09 09 id_type++) {....
1cf30 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 .identities[id_i
1cf40 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 20 3d dx].attributes =
1cf50 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 cackey_get_attr
1cf60 69 62 75 74 65 73 28 63 75 72 72 5f 69 64 5f 74 ibutes(curr_id_t
1cf70 79 70 65 2c 20 26 70 63 73 63 5f 69 64 65 6e 74 ype, &pcsc_ident
1cf80 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2c ities[cert_idx],
1cf90 20 63 65 72 74 5f 69 64 78 2c 20 26 69 64 65 6e cert_idx, &iden
1cfa0 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 tities[id_idx].a
1cfb0 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 29 ttributes_count)
1cfc0 3b 0a 0a 09 09 09 09 69 64 65 6e 74 69 74 69 65 ;......identitie
1cfd0 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 s[id_idx].pcsc_i
1cfe0 64 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 dentity = malloc
1cff0 28 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 (sizeof(*identit
1d000 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 ies[id_idx].pcsc
1d010 5f 69 64 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 _identity));....
1d020 09 6d 65 6d 63 70 79 28 69 64 65 6e 74 69 74 69 .memcpy(identiti
1d030 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f es[id_idx].pcsc_
1d040 69 64 65 6e 74 69 74 79 2c 20 26 70 63 73 63 5f identity, &pcsc_
1d050 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f identities[cert_
1d060 69 64 78 5d 2c 20 73 69 7a 65 6f 66 28 2a 69 64 idx], sizeof(*id
1d070 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d entities[id_idx]
1d080 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 29 29 .pcsc_identity))
1d090 3b 0a 0a 09 09 09 09 69 64 65 6e 74 69 74 69 65 ;......identitie
1d0a0 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 s[id_idx].pcsc_i
1d0b0 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 dentity->certifi
1d0c0 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 70 63 cate = malloc(pc
1d0d0 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 sc_identities[ce
1d0e0 72 74 5f 69 64 78 5d 2e 63 65 72 74 69 66 69 63 rt_idx].certific
1d0f0 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 6d 65 ate_len);.....me
1d100 6d 63 70 79 28 69 64 65 6e 74 69 74 69 65 73 5b mcpy(identities[
1d110 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 id_idx].pcsc_ide
1d120 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 ntity->certifica
1d130 74 65 2c 20 70 63 73 63 5f 69 64 65 6e 74 69 74 te, pcsc_identit
1d140 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65 ies[cert_idx].ce
1d150 72 74 69 66 69 63 61 74 65 2c 20 70 63 73 63 5f rtificate, pcsc_
1d160 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f identities[cert_
1d170 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 idx].certificate
1d180 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 69 64 5f 69 _len);......id_i
1d190 64 78 2b 2b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a dx++;....}...}..
1d1a0 09 09 69 66 20 28 69 6e 63 6c 75 64 65 5f 65 78 ..if (include_ex
1d1b0 74 72 61 5f 63 65 72 74 73 29 20 7b 0a 09 09 09 tra_certs) {....
1d1c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1d1d0 4e 54 46 28 22 49 6e 63 6c 75 64 69 6e 67 20 55 NTF("Including U
1d1e0 53 20 47 6f 76 65 72 6e 6d 65 6e 74 20 43 65 72 S Government Cer
1d1f0 74 69 66 69 63 61 74 65 73 20 6f 6e 20 68 61 72 tificates on har
1d200 64 77 61 72 65 20 73 6c 6f 74 22 29 3b 0a 0a 09 dware slot");...
1d210 09 09 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f ..cackey_read_do
1d220 64 5f 69 64 65 6e 74 69 74 69 65 73 28 69 64 65 d_identities(ide
1d230 6e 74 69 74 69 65 73 20 2b 20 69 64 5f 69 64 78 ntities + id_idx
1d240 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29 , num_dod_certs)
1d250 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f ;...}....cackey_
1d260 66 72 65 65 5f 63 65 72 74 73 28 70 63 73 63 5f free_certs(pcsc_
1d270 69 64 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f identities, num_
1d280 63 65 72 74 73 2c 20 31 29 3b 0a 0a 09 09 2a 69 certs, 1);....*i
1d290 64 73 5f 66 6f 75 6e 64 20 3d 20 6e 75 6d 5f 69 ds_found = num_i
1d2a0 64 73 3b 0a 0a 09 09 72 65 74 75 72 6e 28 69 64 ds;....return(id
1d2b0 65 6e 74 69 74 69 65 73 29 3b 0a 09 7d 0a 0a 0a entities);..}...
1d2c0 09 2a 69 64 73 5f 66 6f 75 6e 64 20 3d 20 30 3b .*ids_found = 0;
1d2d0 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a ..return(NULL);.
1d2e0 7d 0a 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 }..static cackey
1d2f0 5f 72 65 74 20 63 61 63 6b 65 79 5f 67 65 74 5f _ret cackey_get_
1d300 70 69 6e 28 63 68 61 72 20 2a 70 69 6e 62 75 66 pin(char *pinbuf
1d310 29 20 7b 0a 09 46 49 4c 45 20 2a 70 69 6e 66 64 ) {..FILE *pinfd
1d320 3b 0a 09 63 68 61 72 20 2a 66 67 65 74 73 5f 72 ;..char *fgets_r
1d330 65 74 3b 0a 09 69 6e 74 20 70 63 6c 6f 73 65 5f et;..int pclose_
1d340 72 65 74 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 ret;...if (cacke
1d350 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 3d y_pin_command ==
1d360 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 NULL) {...retur
1d370 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f n(CACKEY_PCSC_E_
1d380 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 69 GENERIC);..}...i
1d390 66 20 28 70 69 6e 62 75 66 20 3d 3d 20 4e 55 4c f (pinbuf == NUL
1d3a0 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 41 L) {...return(CA
1d3b0 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 CKEY_PCSC_E_GENE
1d3c0 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 RIC);..}...CACKE
1d3d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1d3e0 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 CACKEY_PIN_COMMA
1d3f0 4e 44 20 3d 20 25 73 22 2c 20 63 61 63 6b 65 79 ND = %s", cackey
1d400 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 29 3b 0a 0a _pin_command);..
1d410 09 70 69 6e 66 64 20 3d 20 70 6f 70 65 6e 28 63 .pinfd = popen(c
1d420 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e ackey_pin_comman
1d430 64 2c 20 22 72 22 29 3b 0a 09 69 66 20 28 70 69 d, "r");..if (pi
1d440 6e 66 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 nfd == NULL) {..
1d450 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1d460 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 25 73 INTF("Error. %s
1d470 3a 20 55 6e 61 62 6c 65 20 74 6f 20 72 75 6e 22 : Unable to run"
1d480 2c 20 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d , cackey_pin_com
1d490 6d 61 6e 64 29 3b 0a 0a 09 09 72 65 74 75 72 6e mand);....return
1d4a0 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 (CACKEY_PCSC_E_B
1d4b0 41 44 50 49 4e 29 3b 0a 09 7d 0a 0a 09 66 67 65 ADPIN);..}...fge
1d4c0 74 73 5f 72 65 74 20 3d 20 66 67 65 74 73 28 70 ts_ret = fgets(p
1d4d0 69 6e 62 75 66 2c 20 33 32 2c 20 70 69 6e 66 64 inbuf, 32, pinfd
1d4e0 29 3b 0a 09 69 66 20 28 66 67 65 74 73 5f 72 65 );..if (fgets_re
1d4f0 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 70 t == NULL) {...p
1d500 69 6e 62 75 66 5b 30 5d 20 3d 20 27 5c 30 27 3b inbuf[0] = '\0';
1d510 0a 09 7d 0a 0a 09 70 63 6c 6f 73 65 5f 72 65 74 ..}...pclose_ret
1d520 20 3d 20 70 63 6c 6f 73 65 28 70 69 6e 66 64 29 = pclose(pinfd)
1d530 3b 0a 09 69 66 20 28 70 63 6c 6f 73 65 5f 72 65 ;..if (pclose_re
1d540 74 20 3d 3d 20 2d 31 20 26 26 20 65 72 72 6e 6f t == -1 && errno
1d550 20 3d 3d 20 45 43 48 49 4c 44 29 20 7b 0a 09 09 == ECHILD) {...
1d560 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1d570 4e 54 46 28 22 4e 6f 74 69 63 65 2e 20 20 70 63 NTF("Notice. pc
1d580 6c 6f 73 65 28 29 20 69 6e 64 69 63 61 74 65 64 lose() indicated
1d590 20 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 67 65 it could not ge
1d5a0 74 20 74 68 65 20 73 74 61 74 75 73 20 6f 66 20 t the status of
1d5b0 74 68 65 20 63 68 69 6c 64 2c 20 61 73 73 75 6d the child, assum
1d5c0 69 6e 67 20 69 74 20 73 75 63 63 65 65 65 64 65 ing it succeeede
1d5d0 64 20 21 22 29 3b 0a 0a 09 09 70 63 6c 6f 73 65 d !");....pclose
1d5e0 5f 72 65 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 _ret = 0;..}...i
1d5f0 66 20 28 70 63 6c 6f 73 65 5f 72 65 74 20 21 3d f (pclose_ret !=
1d600 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 0) {...CACKEY_D
1d610 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
1d620 6f 72 2e 20 20 25 73 3a 20 65 78 69 74 65 64 20 or. %s: exited
1d630 77 69 74 68 20 6e 6f 6e 2d 7a 65 72 6f 20 73 74 with non-zero st
1d640 61 74 75 73 20 6f 66 20 25 69 22 2c 20 63 61 63 atus of %i", cac
1d650 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 2c key_pin_command,
1d660 20 70 63 6c 6f 73 65 5f 72 65 74 29 3b 0a 0a 09 pclose_ret);...
1d670 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 .return(CACKEY_P
1d680 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09 CSC_E_BADPIN);..
1d690 7d 0a 0a 09 69 66 20 28 73 74 72 6c 65 6e 28 70 }...if (strlen(p
1d6a0 69 6e 62 75 66 29 20 3c 20 31 29 20 7b 0a 09 09 inbuf) < 1) {...
1d6b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1d6c0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 25 73 3a NTF("Error. %s:
1d6d0 20 72 65 74 75 72 6e 65 64 20 6e 6f 20 64 61 74 returned no dat
1d6e0 61 22 2c 20 63 61 63 6b 65 79 5f 70 69 6e 5f 63 a", cackey_pin_c
1d6f0 6f 6d 6d 61 6e 64 29 3b 0a 0a 09 09 72 65 74 75 ommand);....retu
1d700 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 rn(CACKEY_PCSC_E
1d710 5f 42 41 44 50 49 4e 29 3b 0a 09 7d 0a 0a 09 69 _BADPIN);..}...i
1d720 66 20 28 70 69 6e 62 75 66 5b 73 74 72 6c 65 6e f (pinbuf[strlen
1d730 28 70 69 6e 62 75 66 29 20 2d 20 31 5d 20 3d 3d (pinbuf) - 1] ==
1d740 20 27 5c 6e 27 29 20 7b 0a 09 09 70 69 6e 62 75 '\n') {...pinbu
1d750 66 5b 73 74 72 6c 65 6e 28 70 69 6e 62 75 66 29 f[strlen(pinbuf)
1d760 20 2d 20 31 5d 20 3d 20 27 5c 30 27 3b 0a 09 7d - 1] = '\0';..}
1d770 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 ...return(CACKEY
1d780 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a _PCSC_S_OK);.}..
1d790 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 CK_DEFINE_FUNCTI
1d7a0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 ON(CK_RV, C_Init
1d7b0 69 61 6c 69 7a 65 29 28 43 4b 5f 56 4f 49 44 5f ialize)(CK_VOID_
1d7c0 50 54 52 20 70 49 6e 69 74 41 72 67 73 29 20 7b PTR pInitArgs) {
1d7d0 0a 09 43 4b 5f 43 5f 49 4e 49 54 49 41 4c 49 5a ..CK_C_INITIALIZ
1d7e0 45 5f 41 52 47 53 20 43 4b 5f 50 54 52 20 61 72 E_ARGS CK_PTR ar
1d7f0 67 73 3b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 gs;..uint32_t id
1d800 78 2c 20 68 69 67 68 65 73 74 5f 73 6c 6f 74 3b x, highest_slot;
1d810 0a 09 69 6e 74 20 6d 75 74 65 78 5f 69 6e 69 74 ..int mutex_init
1d820 5f 72 65 74 3b 0a 09 69 6e 74 20 69 6e 63 6c 75 _ret;..int inclu
1d830 64 65 5f 64 6f 64 5f 63 65 72 74 73 3b 0a 0a 09 de_dod_certs;...
1d840 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1d850 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a NTF("Called.");.
1d860 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 69 6e 69 ..if (cackey_ini
1d870 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 tialized) {...CA
1d880 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
1d890 46 28 22 45 72 72 6f 72 2e 20 20 41 6c 72 65 61 F("Error. Alrea
1d8a0 64 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 dy initialized."
1d8b0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
1d8c0 5f 43 52 59 50 54 4f 4b 49 5f 41 4c 52 45 41 44 _CRYPTOKI_ALREAD
1d8d0 59 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a Y_INITIALIZED);.
1d8e0 09 7d 0a 0a 09 69 66 20 28 70 49 6e 69 74 41 72 .}...if (pInitAr
1d8f0 67 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 gs != NULL) {...
1d900 61 72 67 73 20 3d 20 70 49 6e 69 74 41 72 67 73 args = pInitArgs
1d910 3b 0a 09 09 6d 65 6d 63 70 79 28 26 63 61 63 6b ;...memcpy(&cack
1d920 65 79 5f 61 72 67 73 2c 20 61 72 67 73 2c 20 73 ey_args, args, s
1d930 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 61 72 67 izeof(cackey_arg
1d940 73 29 29 3b 0a 0a 09 09 69 66 20 28 61 72 67 73 s));....if (args
1d950 2d 3e 43 72 65 61 74 65 4d 75 74 65 78 20 3d 3d ->CreateMutex ==
1d960 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 44 NULL || args->D
1d970 65 73 74 72 6f 79 4d 75 74 65 78 20 3d 3d 20 4e estroyMutex == N
1d980 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 4c 6f 63 ULL || args->Loc
1d990 6b 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c kMutex == NULL |
1d9a0 7c 20 61 72 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 | args->UnlockMu
1d9b0 74 65 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 tex == NULL) {..
1d9c0 09 09 69 66 20 28 61 72 67 73 2d 3e 43 72 65 61 ..if (args->Crea
1d9d0 74 65 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20 teMutex != NULL
1d9e0 7c 7c 20 61 72 67 73 2d 3e 44 65 73 74 72 6f 79 || args->Destroy
1d9f0 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c Mutex != NULL ||
1da00 20 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74 65 78 args->LockMutex
1da10 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 != NULL || args
1da20 2d 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 21 3d ->UnlockMutex !=
1da30 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 43 41 43 NULL) {.....CAC
1da40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1da50 28 22 45 72 72 6f 72 2e 20 53 6f 6d 65 2c 20 62 ("Error. Some, b
1da60 75 74 20 6e 6f 74 20 41 6c 6c 20 74 68 72 65 61 ut not All threa
1da70 64 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20 ding primitives
1da80 70 72 6f 76 69 64 65 64 2e 22 29 3b 0a 0a 09 09 provided.");....
1da90 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 ..return(CKR_ARG
1daa0 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09 09 UMENTS_BAD);....
1dab0 7d 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a }...}..} else {.
1dac0 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 ..cackey_args.Cr
1dad0 65 61 74 65 4d 75 74 65 78 20 3d 20 4e 55 4c 4c eateMutex = NULL
1dae0 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e ;...cackey_args.
1daf0 44 65 73 74 72 6f 79 4d 75 74 65 78 20 3d 20 4e DestroyMutex = N
1db00 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 ULL;...cackey_ar
1db10 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 20 3d 20 4e gs.LockMutex = N
1db20 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 ULL;...cackey_ar
1db30 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d gs.UnlockMutex =
1db40 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f NULL;...cackey_
1db50 61 72 67 73 2e 66 6c 61 67 73 20 3d 20 30 3b 0a args.flags = 0;.
1db60 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 .}...for (idx =
1db70 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 0; idx < (sizeof
1db80 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 (cackey_sessions
1db90 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 ) / sizeof(cacke
1dba0 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b y_sessions[0]));
1dbb0 20 69 64 78 2b 2b 29 20 7b 0a 09 09 63 61 63 6b idx++) {...cack
1dbc0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d ey_sessions[idx]
1dbd0 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a .active = 0;..}.
1dbe0 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 ..for (idx = 0;
1dbf0 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 idx < (sizeof(ca
1dc00 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 ckey_slots) / si
1dc10 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 zeof(cackey_slot
1dc20 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b s[0])); idx++) {
1dc30 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b ...cackey_slots[
1dc40 69 64 78 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b idx].active = 0;
1dc50 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b ...cackey_slots[
1dc60 69 64 78 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 idx].pcsc_reader
1dc70 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 = NULL;...cacke
1dc80 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 y_slots[idx].tra
1dc90 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d nsaction_depth =
1dca0 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 0;...cackey_slo
1dcb0 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63 74 ts[idx].transact
1dcc0 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b ion_need_hw_lock
1dcd0 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 = 0;...cackey_s
1dce0 6c 6f 74 73 5b 69 64 78 5d 2e 73 6c 6f 74 5f 72 lots[idx].slot_r
1dcf0 65 73 65 74 20 3d 20 30 3b 0a 09 09 63 61 63 6b eset = 0;...cack
1dd00 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 6f ey_slots[idx].to
1dd10 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09 ken_flags = 0;..
1dd20 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 .cackey_slots[id
1dd30 78 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b x].label = NULL;
1dd40 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b ...cackey_slots[
1dd50 69 64 78 5d 2e 69 6e 74 65 72 6e 61 6c 20 3d 20 idx].internal =
1dd60 30 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 0;..}..#ifdef CA
1dd70 43 4b 45 59 5f 4e 4f 5f 45 58 54 52 41 5f 43 45 CKEY_NO_EXTRA_CE
1dd80 52 54 53 0a 09 69 66 20 28 67 65 74 65 6e 76 28 RTS..if (getenv(
1dd90 22 43 41 43 4b 45 59 5f 45 58 54 52 41 5f 43 45 "CACKEY_EXTRA_CE
1dda0 52 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b RTS") != NULL) {
1ddb0 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 ...include_dod_c
1ddc0 65 72 74 73 20 3d 20 31 3b 0a 09 7d 20 65 6c 73 erts = 1;..} els
1ddd0 65 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f e {...include_do
1dde0 64 5f 63 65 72 74 73 20 3d 20 30 3b 0a 09 7d 0a d_certs = 0;..}.
1ddf0 23 65 6c 73 65 0a 09 69 66 20 28 67 65 74 65 6e #else..if (geten
1de00 76 28 22 43 41 43 4b 45 59 5f 4e 4f 5f 45 58 54 v("CACKEY_NO_EXT
1de10 52 41 5f 43 45 52 54 53 22 29 20 21 3d 20 4e 55 RA_CERTS") != NU
1de20 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f LL) {...include_
1de30 64 6f 64 5f 63 65 72 74 73 20 3d 20 30 3b 0a 09 dod_certs = 0;..
1de40 7d 20 65 6c 73 65 20 7b 0a 09 09 69 6e 63 6c 75 } else {...inclu
1de50 64 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 31 de_dod_certs = 1
1de60 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 69 66 ;..}.#endif...if
1de70 20 28 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 (include_dod_ce
1de80 72 74 73 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 rts == 0) {...CA
1de90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
1dea0 46 28 22 41 73 6b 65 64 20 6e 6f 74 20 74 6f 20 F("Asked not to
1deb0 69 6e 63 6c 75 64 65 20 44 6f 44 20 63 65 72 74 include DoD cert
1dec0 69 66 69 63 61 74 65 73 22 29 3b 0a 09 7d 20 65 ificates");..} e
1ded0 6c 73 65 20 7b 0a 09 09 68 69 67 68 65 73 74 5f lse {...highest_
1dee0 73 6c 6f 74 20 3d 20 28 73 69 7a 65 6f 66 28 63 slot = (sizeof(c
1def0 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 ackey_slots) / s
1df00 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f izeof(cackey_slo
1df10 74 73 5b 30 5d 29 29 20 2d 20 31 3b 0a 0a 09 09 ts[0])) - 1;....
1df20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1df30 4e 54 46 28 22 49 6e 63 6c 75 64 69 6e 67 20 44 NTF("Including D
1df40 6f 44 20 63 65 72 74 73 20 69 6e 20 73 6c 6f 74 oD certs in slot
1df50 20 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 %lu", (unsigned
1df60 20 6c 6f 6e 67 29 20 68 69 67 68 65 73 74 5f 73 long) highest_s
1df70 6c 6f 74 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f lot);....cackey_
1df80 73 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f 73 6c slots[highest_sl
1df90 6f 74 5d 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a ot].active = 1;.
1dfa0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 ..cackey_slots[h
1dfb0 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 69 6e 74 ighest_slot].int
1dfc0 65 72 6e 61 6c 20 3d 20 31 3b 0a 09 09 63 61 63 ernal = 1;...cac
1dfd0 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73 key_slots[highes
1dfe0 74 5f 73 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20 t_slot].label =
1dff0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a (unsigned char *
1e000 29 20 22 55 53 20 47 6f 76 65 72 6e 6d 65 6e 74 ) "US Government
1e010 20 43 65 72 74 69 66 69 63 61 74 65 73 22 3b 0a Certificates";.
1e020 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 ..cackey_slots[h
1e030 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 70 63 73 ighest_slot].pcs
1e040 63 5f 72 65 61 64 65 72 20 3d 20 22 43 41 43 4b c_reader = "CACK
1e050 65 79 22 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c ey";...cackey_sl
1e060 6f 74 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74 ots[highest_slot
1e070 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 ].token_flags =
1e080 30 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 69 0;..}...cackey_i
1e090 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a nitialized = 1;.
1e0a0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 62 69 ..if (!cackey_bi
1e0b0 67 6c 6f 63 6b 5f 69 6e 69 74 29 20 7b 0a 09 09 glock_init) {...
1e0c0 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 20 3d mutex_init_ret =
1e0d0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 63 72 cackey_mutex_cr
1e0e0 65 61 74 65 28 26 63 61 63 6b 65 79 5f 62 69 67 eate(&cackey_big
1e0f0 6c 6f 63 6b 29 3b 0a 0a 09 09 69 66 20 28 6d 75 lock);....if (mu
1e100 74 65 78 5f 69 6e 69 74 5f 72 65 74 20 21 3d 20 tex_init_ret !=
1e110 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 0) {....CACKEY_D
1e120 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
1e130 6f 72 2e 20 20 4d 75 74 65 78 20 69 6e 69 74 69 or. Mutex initi
1e140 61 6c 69 7a 61 74 69 6f 6e 20 66 61 69 6c 65 64 alization failed
1e150 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 .");.....return(
1e160 43 4b 52 5f 43 41 4e 54 5f 4c 4f 43 4b 29 3b 0a CKR_CANT_LOCK);.
1e170 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 62 69 ..}....cackey_bi
1e180 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d 20 31 3b 0a glock_init = 1;.
1e190 09 7d 0a 0a 09 2f 2a 20 44 65 66 69 6e 65 20 61 .}.../* Define a
1e1a0 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 70 72 6f 6d command to prom
1e1b0 70 74 20 75 73 65 72 20 66 6f 72 20 61 20 50 49 pt user for a PI
1e1c0 4e 20 2a 2f 0a 23 69 66 64 65 66 20 43 41 43 4b N */.#ifdef CACK
1e1d0 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 44 EY_PIN_COMMAND_D
1e1e0 45 46 41 55 4c 54 0a 09 63 61 63 6b 65 79 5f 70 EFAULT..cackey_p
1e1f0 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 20 73 74 72 in_command = str
1e200 64 75 70 28 43 41 43 4b 45 59 5f 4d 41 43 52 4f dup(CACKEY_MACRO
1e210 5f 44 45 46 41 55 4c 54 5f 58 53 54 52 28 43 41 _DEFAULT_XSTR(CA
1e220 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 CKEY_PIN_COMMAND
1e230 5f 44 45 46 41 55 4c 54 29 29 3b 0a 23 65 6e 64 _DEFAULT));.#end
1e240 69 66 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 if..#ifdef CACKE
1e250 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 58 4f Y_PIN_COMMAND_XO
1e260 4e 4c 59 5f 44 45 46 41 55 4c 54 0a 09 69 66 20 NLY_DEFAULT..if
1e270 28 67 65 74 65 6e 76 28 22 44 49 53 50 4c 41 59 (getenv("DISPLAY
1e280 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 ") != NULL) {...
1e290 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 cackey_pin_comma
1e2a0 6e 64 20 3d 20 73 74 72 64 75 70 28 43 41 43 4b nd = strdup(CACK
1e2b0 45 59 5f 4d 41 43 52 4f 5f 44 45 46 41 55 4c 54 EY_MACRO_DEFAULT
1e2c0 5f 58 53 54 52 28 43 41 43 4b 45 59 5f 50 49 4e _XSTR(CACKEY_PIN
1e2d0 5f 43 4f 4d 4d 41 4e 44 5f 58 4f 4e 4c 59 5f 44 _COMMAND_XONLY_D
1e2e0 45 46 41 55 4c 54 29 29 3b 0a 09 7d 0a 23 65 6e EFAULT));..}.#en
1e2f0 64 69 66 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 dif...if (getenv
1e300 28 22 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d ("CACKEY_PIN_COM
1e310 4d 41 4e 44 22 29 20 21 3d 20 4e 55 4c 4c 29 20 MAND") != NULL)
1e320 7b 0a 09 09 63 61 63 6b 65 79 5f 70 69 6e 5f 63 {...cackey_pin_c
1e330 6f 6d 6d 61 6e 64 20 3d 20 73 74 72 64 75 70 28 ommand = strdup(
1e340 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 50 getenv("CACKEY_P
1e350 49 4e 5f 43 4f 4d 4d 41 4e 44 22 29 29 3b 0a 09 IN_COMMAND"));..
1e360 7d 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 }...if (getenv("
1e370 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 CACKEY_PIN_COMMA
1e380 4e 44 5f 58 4f 4e 4c 59 22 29 20 21 3d 20 4e 55 ND_XONLY") != NU
1e390 4c 4c 20 26 26 20 67 65 74 65 6e 76 28 22 44 49 LL && getenv("DI
1e3a0 53 50 4c 41 59 22 29 20 21 3d 20 4e 55 4c 4c 29 SPLAY") != NULL)
1e3b0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 70 69 6e 5f {...cackey_pin_
1e3c0 63 6f 6d 6d 61 6e 64 20 3d 20 73 74 72 64 75 70 command = strdup
1e3d0 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f (getenv("CACKEY_
1e3e0 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 58 4f 4e 4c PIN_COMMAND_XONL
1e3f0 59 22 29 29 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 Y"));..}..#ifdef
1e400 20 43 41 43 4b 45 59 5f 52 45 41 44 45 52 53 5f CACKEY_READERS_
1e410 49 4e 43 4c 55 44 45 5f 4f 4e 4c 59 5f 44 45 46 INCLUDE_ONLY_DEF
1e420 41 55 4c 54 0a 09 63 61 63 6b 65 79 5f 72 65 61 AULT..cackey_rea
1e430 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c ders_include_onl
1e440 79 20 3d 20 73 74 72 64 75 70 28 43 41 43 4b 45 y = strdup(CACKE
1e450 59 5f 4d 41 43 52 4f 5f 44 45 46 41 55 4c 54 5f Y_MACRO_DEFAULT_
1e460 58 53 54 52 28 43 41 43 4b 45 59 5f 52 45 41 44 XSTR(CACKEY_READ
1e470 45 52 53 5f 49 4e 43 4c 55 44 45 5f 4f 4e 4c 59 ERS_INCLUDE_ONLY
1e480 5f 44 45 46 41 55 4c 54 29 29 3b 0a 23 65 6e 64 _DEFAULT));.#end
1e490 69 66 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 if..#ifdef CACKE
1e4a0 59 5f 52 45 41 44 45 52 53 5f 45 58 43 4c 55 44 Y_READERS_EXCLUD
1e4b0 45 5f 44 45 46 41 55 4c 54 0a 09 63 61 63 6b 65 E_DEFAULT..cacke
1e4c0 79 5f 72 65 61 64 65 72 73 5f 65 78 63 6c 75 64 y_readers_exclud
1e4d0 65 20 3d 20 73 74 72 64 75 70 28 43 41 43 4b 45 e = strdup(CACKE
1e4e0 59 5f 4d 41 43 52 4f 5f 44 45 46 41 55 4c 54 5f Y_MACRO_DEFAULT_
1e4f0 58 53 54 52 28 43 41 43 4b 45 59 5f 52 45 41 44 XSTR(CACKEY_READ
1e500 45 52 53 5f 45 58 43 4c 55 44 45 5f 44 45 46 41 ERS_EXCLUDE_DEFA
1e510 55 4c 54 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 ULT));.#endif...
1e520 69 66 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b if (getenv("CACK
1e530 45 59 5f 52 45 41 44 45 52 53 5f 49 4e 43 4c 55 EY_READERS_INCLU
1e540 44 45 5f 4f 4e 4c 59 22 29 20 21 3d 20 4e 55 4c DE_ONLY") != NUL
1e550 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 72 65 L) {...cackey_re
1e560 61 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e aders_include_on
1e570 6c 79 20 3d 20 73 74 72 64 75 70 28 67 65 74 65 ly = strdup(gete
1e580 6e 76 28 22 43 41 43 4b 45 59 5f 52 45 41 44 45 nv("CACKEY_READE
1e590 52 53 5f 49 4e 43 4c 55 44 45 5f 4f 4e 4c 59 22 RS_INCLUDE_ONLY"
1e5a0 29 29 3b 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 ));....if (cacke
1e5b0 79 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c 75 64 y_readers_includ
1e5c0 65 5f 6f 6e 6c 79 5b 30 5d 20 3d 3d 20 27 5c 30 e_only[0] == '\0
1e5d0 27 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63 ') {....free(cac
1e5e0 6b 65 79 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c key_readers_incl
1e5f0 75 64 65 5f 6f 6e 6c 79 29 3b 0a 0a 09 09 09 63 ude_only);.....c
1e600 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69 6e ackey_readers_in
1e610 63 6c 75 64 65 5f 6f 6e 6c 79 20 3d 20 4e 55 4c clude_only = NUL
1e620 4c 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 L;...}..}...if (
1e630 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 52 getenv("CACKEY_R
1e640 45 41 44 45 52 53 5f 45 58 43 4c 55 44 45 22 29 EADERS_EXCLUDE")
1e650 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 != NULL) {...ca
1e660 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63 ckey_readers_exc
1e670 6c 75 64 65 20 3d 20 73 74 72 64 75 70 28 67 65 lude = strdup(ge
1e680 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 52 45 41 tenv("CACKEY_REA
1e690 44 45 52 53 5f 45 58 43 4c 55 44 45 22 29 29 3b DERS_EXCLUDE"));
1e6a0 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 72 ....if (cackey_r
1e6b0 65 61 64 65 72 73 5f 65 78 63 6c 75 64 65 5b 30 eaders_exclude[0
1e6c0 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 09 09 ] == '\0') {....
1e6d0 66 72 65 65 28 63 61 63 6b 65 79 5f 72 65 61 64 free(cackey_read
1e6e0 65 72 73 5f 65 78 63 6c 75 64 65 29 3b 0a 0a 09 ers_exclude);...
1e6f0 09 09 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 ..cackey_readers
1e700 5f 65 78 63 6c 75 64 65 20 3d 20 4e 55 4c 4c 3b _exclude = NULL;
1e710 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 ...}..}...CACKEY
1e720 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
1e730 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 eturning CKR_OK
1e740 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a (%i)", CKR_OK);.
1e750 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 ..return(CKR_OK)
1e760 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 ;.}..CK_DEFINE_F
1e770 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 UNCTION(CK_RV, C
1e780 5f 46 69 6e 61 6c 69 7a 65 29 28 43 4b 5f 56 4f _Finalize)(CK_VO
1e790 49 44 5f 50 54 52 20 70 52 65 73 65 72 76 65 64 ID_PTR pReserved
1e7a0 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 ) {..uint32_t id
1e7b0 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 x;...CACKEY_DEBU
1e7c0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 G_PRINTF("Called
1e7d0 2e 22 29 3b 0a 0a 09 69 66 20 28 70 52 65 73 65 .");...if (pRese
1e7e0 72 76 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a rved != NULL) {.
1e7f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1e800 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 52 RINTF("Error. pR
1e810 65 73 65 72 76 65 64 20 69 73 20 6e 6f 74 20 4e eserved is not N
1e820 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 ULL.");....retur
1e830 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f n(CKR_ARGUMENTS_
1e840 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 BAD);..}...if (!
1e850 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a cackey_initializ
1e860 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...CACKEY_D
1e870 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
1e880 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c or. Not initial
1e890 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 ized.");....retu
1e8a0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f rn(CKR_CRYPTOKI_
1e8b0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 NOT_INITIALIZED)
1e8c0 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 ;..}...for (idx
1e8d0 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 = 0; idx < (size
1e8e0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f of(cackey_sessio
1e8f0 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 ns) / sizeof(cac
1e900 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 key_sessions[0])
1e910 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 ); idx++) {...if
1e920 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e (cackey_session
1e930 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b s[idx].active) {
1e940 0a 09 09 09 43 5f 43 6c 6f 73 65 53 65 73 73 69 ....C_CloseSessi
1e950 6f 6e 28 69 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a on(idx);...}..}.
1e960 0a 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 ..cackey_slots_d
1e970 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b isconnect_all();
1e980 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b ...for (idx = 0;
1e990 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 idx < (sizeof(c
1e9a0 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 ackey_slots) / s
1e9b0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f izeof(cackey_slo
1e9c0 74 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 ts[0])); idx++)
1e9d0 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 {...if (cackey_s
1e9e0 6c 6f 74 73 5b 69 64 78 5d 2e 69 6e 74 65 72 6e lots[idx].intern
1e9f0 61 6c 29 20 7b 0a 09 09 09 63 6f 6e 74 69 6e 75 al) {....continu
1ea00 65 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 e;...}....if (ca
1ea10 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e ckey_slots[idx].
1ea20 70 63 73 63 5f 72 65 61 64 65 72 29 20 7b 0a 09 pcsc_reader) {..
1ea30 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c ..free(cackey_sl
1ea40 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 ots[idx].pcsc_re
1ea50 61 64 65 72 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 ader);...}....if
1ea60 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 (cackey_slots[i
1ea70 64 78 5d 2e 63 61 63 68 65 64 5f 63 65 72 74 73 dx].cached_certs
1ea80 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 ) {....cackey_fr
1ea90 65 65 5f 63 65 72 74 73 28 63 61 63 6b 65 79 5f ee_certs(cackey_
1eaa0 73 6c 6f 74 73 5b 69 64 78 5d 2e 63 61 63 68 65 slots[idx].cache
1eab0 64 5f 63 65 72 74 73 2c 20 63 61 63 6b 65 79 5f d_certs, cackey_
1eac0 73 6c 6f 74 73 5b 69 64 78 5d 2e 63 61 63 68 65 slots[idx].cache
1ead0 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 2c 20 31 d_certs_count, 1
1eae0 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c );.....cackey_sl
1eaf0 6f 74 73 5b 69 64 78 5d 2e 63 61 63 68 65 64 5f ots[idx].cached_
1eb00 63 65 72 74 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 certs = NULL;...
1eb10 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 70 63 }..}...cackey_pc
1eb20 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 29 3b sc_disconnect();
1eb30 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70 69 ...if (cackey_pi
1eb40 6e 5f 63 6f 6d 6d 61 6e 64 20 21 3d 20 4e 55 4c n_command != NUL
1eb50 4c 29 20 7b 0a 09 09 66 72 65 65 28 63 61 63 6b L) {...free(cack
1eb60 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 29 3b ey_pin_command);
1eb70 0a 0a 09 09 63 61 63 6b 65 79 5f 70 69 6e 5f 63 ....cackey_pin_c
1eb80 6f 6d 6d 61 6e 64 20 3d 20 4e 55 4c 4c 3b 0a 09 ommand = NULL;..
1eb90 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 72 }...if (cackey_r
1eba0 65 61 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f eaders_include_o
1ebb0 6e 6c 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 nly != NULL) {..
1ebc0 09 66 72 65 65 28 63 61 63 6b 65 79 5f 72 65 61 .free(cackey_rea
1ebd0 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c ders_include_onl
1ebe0 79 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 72 65 y);....cackey_re
1ebf0 61 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e aders_include_on
1ec00 6c 79 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 ly = NULL;..}...
1ec10 69 66 20 28 63 61 63 6b 65 79 5f 72 65 61 64 65 if (cackey_reade
1ec20 72 73 5f 65 78 63 6c 75 64 65 20 21 3d 20 4e 55 rs_exclude != NU
1ec30 4c 4c 29 20 7b 0a 09 09 66 72 65 65 28 63 61 63 LL) {...free(cac
1ec40 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63 6c key_readers_excl
1ec50 75 64 65 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f ude);....cackey_
1ec60 72 65 61 64 65 72 73 5f 65 78 63 6c 75 64 65 20 readers_exclude
1ec70 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 63 61 63 = NULL;..}...cac
1ec80 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20 key_initialized
1ec90 3d 20 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 = 0;...CACKEY_DE
1eca0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
1ecb0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 rning CKR_OK (%i
1ecc0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 )", CKR_OK);...r
1ecd0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d eturn(CKR_OK);.}
1ece0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 ..CK_DEFINE_FUNC
1ecf0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 TION(CK_RV, C_Ge
1ed00 74 49 6e 66 6f 29 28 43 4b 5f 49 4e 46 4f 5f 50 tInfo)(CK_INFO_P
1ed10 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61 TR pInfo) {..sta
1ed20 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 tic CK_UTF8CHAR
1ed30 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 5b 5d manufacturerID[]
1ed40 20 3d 20 22 55 2e 53 2e 20 47 6f 76 65 72 6e 6d = "U.S. Governm
1ed50 65 6e 74 22 3b 0a 09 73 74 61 74 69 63 20 43 4b ent";..static CK
1ed60 5f 55 54 46 38 43 48 41 52 20 6c 69 62 72 61 72 _UTF8CHAR librar
1ed70 79 44 65 73 63 72 69 70 74 69 6f 6e 5b 5d 20 3d yDescription[] =
1ed80 20 22 43 41 43 4b 65 79 22 3b 0a 0a 09 43 41 43 "CACKey";...CAC
1ed90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1eda0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 ("Called.");...i
1edb0 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c f (pInfo == NULL
1edc0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
1edd0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
1ede0 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e . pInfo is NULL.
1edf0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
1ee00 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 R_ARGUMENTS_BAD)
1ee10 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b ;..}...if (!cack
1ee20 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 ey_initialized)
1ee30 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
1ee40 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
1ee50 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 Not initialized
1ee60 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
1ee70 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f KR_CRYPTOKI_NOT_
1ee80 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d INITIALIZED);..}
1ee90 0a 0a 09 70 49 6e 66 6f 2d 3e 63 72 79 70 74 6f ...pInfo->crypto
1eea0 6b 69 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 kiVersion.major
1eeb0 3d 20 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54 = ((CACKEY_CRYPT
1eec0 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 OKI_VERSION_CODE
1eed0 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b ) >> 16) & 0xff;
1eee0 0a 09 70 49 6e 66 6f 2d 3e 63 72 79 70 74 6f 6b ..pInfo->cryptok
1eef0 69 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d iVersion.minor =
1ef00 20 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f ((CACKEY_CRYPTO
1ef10 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 KI_VERSION_CODE)
1ef20 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a >> 8) & 0xff;..
1ef30 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d .memset(pInfo->m
1ef40 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 27 anufacturerID, '
1ef50 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f ', sizeof(pInfo
1ef60 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 ->manufacturerID
1ef70 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 ));..memcpy(pInf
1ef80 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 o->manufacturerI
1ef90 44 2c 20 6d 61 6e 75 66 61 63 74 75 72 65 72 49 D, manufacturerI
1efa0 44 2c 20 73 69 7a 65 6f 66 28 6d 61 6e 75 66 61 D, sizeof(manufa
1efb0 63 74 75 72 65 72 49 44 29 20 2d 20 31 29 3b 0a cturerID) - 1);.
1efc0 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d ..pInfo->flags =
1efd0 20 30 78 30 30 3b 0a 0a 09 6d 65 6d 73 65 74 28 0x00;...memset(
1efe0 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65 pInfo->libraryDe
1eff0 73 63 72 69 70 74 69 6f 6e 2c 20 27 20 27 2c 20 scription, ' ',
1f000 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 69 sizeof(pInfo->li
1f010 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e braryDescription
1f020 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 ));..memcpy(pInf
1f030 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73 63 72 69 o->libraryDescri
1f040 70 74 69 6f 6e 2c 20 6c 69 62 72 61 72 79 44 65 ption, libraryDe
1f050 73 63 72 69 70 74 69 6f 6e 2c 20 73 69 7a 65 6f scription, sizeo
1f060 66 28 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 f(libraryDescrip
1f070 74 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09 70 49 tion) - 1);...pI
1f080 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 56 65 72 73 nfo->libraryVers
1f090 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63 61 63 ion.major = (cac
1f0a0 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 key_getversion()
1f0b0 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a >> 16) & 0xff;.
1f0c0 09 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 56 .pInfo->libraryV
1f0d0 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 ersion.minor = (
1f0e0 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f cackey_getversio
1f0f0 6e 28 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 n() >> 8) & 0xff
1f100 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ;...CACKEY_DEBUG
1f110 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
1f120 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c ng CKR_OK (%i)",
1f130 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 CKR_OK);...retu
1f140 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f rn(CKR_OK);.}../
1f150 2a 0a 20 2a 20 50 72 6f 63 65 73 73 20 6c 69 73 *. * Process lis
1f160 74 20 6f 66 20 72 65 61 64 65 72 73 2c 20 61 6e t of readers, an
1f170 64 20 63 72 65 61 74 65 20 6d 61 70 70 69 6e 67 d create mapping
1f180 20 62 65 74 77 65 65 6e 20 72 65 61 64 65 72 20 between reader
1f190 6e 61 6d 65 20 61 6e 64 20 73 6c 6f 74 20 49 44 name and slot ID
1f1a0 0a 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 . */.CK_DEFINE_F
1f1b0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 UNCTION(CK_RV, C
1f1c0 5f 47 65 74 53 6c 6f 74 4c 69 73 74 29 28 43 4b _GetSlotList)(CK
1f1d0 5f 42 42 4f 4f 4c 20 74 6f 6b 65 6e 50 72 65 73 _BBOOL tokenPres
1f1e0 65 6e 74 2c 20 43 4b 5f 53 4c 4f 54 5f 49 44 5f ent, CK_SLOT_ID_
1f1f0 50 54 52 20 70 53 6c 6f 74 4c 69 73 74 2c 20 43 PTR pSlotList, C
1f200 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 43 K_ULONG_PTR pulC
1f210 6f 75 6e 74 29 20 7b 0a 09 73 74 61 74 69 63 20 ount) {..static
1f220 69 6e 74 20 66 69 72 73 74 5f 63 61 6c 6c 20 3d int first_call =
1f230 20 31 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 1;..int mutex_r
1f240 65 74 76 61 6c 3b 0a 09 69 6e 74 20 70 63 73 63 etval;..int pcsc
1f250 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 43 _connect_ret;..C
1f260 4b 5f 55 4c 4f 4e 47 20 63 6f 75 6e 74 2c 20 73 K_ULONG count, s
1f270 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20 30 2c 20 63 lot_count = 0, c
1f280 75 72 72 73 6c 6f 74 2c 20 73 6c 6f 74 5f 69 64 urrslot, slot_id
1f290 78 3b 0a 09 63 68 61 72 20 2a 70 63 73 63 5f 72 x;..char *pcsc_r
1f2a0 65 61 64 65 72 73 2c 20 2a 70 63 73 63 5f 72 65 eaders, *pcsc_re
1f2b0 61 64 65 72 73 5f 73 2c 20 2a 70 63 73 63 5f 72 aders_s, *pcsc_r
1f2c0 65 61 64 65 72 73 5f 65 3b 0a 09 63 68 61 72 20 eaders_e;..char
1f2d0 2a 72 65 61 64 65 72 5f 63 68 65 63 6b 5f 70 61 *reader_check_pa
1f2e0 74 74 65 72 6e 3b 0a 09 44 57 4f 52 44 20 70 63 ttern;..DWORD pc
1f2f0 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 3b 0a sc_readers_len;.
1f300 09 4c 4f 4e 47 20 73 63 61 72 64 5f 6c 69 73 74 .LONG scard_list
1f310 72 65 61 64 65 72 73 5f 72 65 74 3b 0a 09 73 69 readers_ret;..si
1f320 7a 65 5f 74 20 63 75 72 72 5f 72 65 61 64 65 72 ze_t curr_reader
1f330 5f 6c 65 6e 3b 0a 09 69 6e 74 20 73 6c 6f 74 5f _len;..int slot_
1f340 72 65 73 65 74 3b 0a 09 69 6e 74 20 69 6e 63 6c reset;..int incl
1f350 75 64 65 5f 72 65 61 64 65 72 3b 0a 0a 09 43 41 ude_reader;...CA
1f360 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
1f370 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
1f380 69 66 20 28 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 if (pulCount ==
1f390 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 NULL) {...CACKEY
1f3a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
1f3b0 72 72 6f 72 2e 20 70 75 6c 43 6f 75 6e 74 20 69 rror. pulCount i
1f3c0 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 s NULL.");....re
1f3d0 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e turn(CKR_ARGUMEN
1f3e0 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 TS_BAD);..}...if
1f3f0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 (!cackey_initia
1f400 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 lized) {...CACKE
1f410 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1f420 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 Error. Not init
1f430 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 ialized.");....r
1f440 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f eturn(CKR_CRYPTO
1f450 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a KI_NOT_INITIALIZ
1f460 45 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f ED);..}...mutex_
1f470 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f retval = cackey_
1f480 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 mutex_lock(cacke
1f490 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 y_biglock);..if
1f4a0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d (mutex_retval !=
1f4b0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 0) {...CACKEY_D
1f4c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
1f4d0 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 or. Locking fai
1f4e0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 led.");....retur
1f4f0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 n(CKR_GENERAL_ER
1f500 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6c ROR);..}.../* Cl
1f510 65 61 72 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 ear list of slot
1f520 73 20 2a 2f 0a 09 73 6c 6f 74 5f 72 65 73 65 74 s */..slot_reset
1f530 20 3d 20 30 3b 0a 09 69 66 20 28 70 53 6c 6f 74 = 0;..if (pSlot
1f540 4c 69 73 74 29 20 7b 0a 09 09 69 66 20 28 66 69 List) {...if (fi
1f550 72 73 74 5f 63 61 6c 6c 29 20 7b 0a 09 09 09 66 rst_call) {....f
1f560 69 72 73 74 5f 63 61 6c 6c 20 3d 20 30 3b 0a 0a irst_call = 0;..
1f570 09 09 09 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 ...slot_reset =
1f580 31 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 49 66 20 1;...}..../* If
1f590 61 6e 79 20 6f 66 20 74 68 65 20 73 6c 6f 74 73 any of the slots
1f5a0 20 68 61 76 65 20 62 65 65 6e 20 72 65 73 65 74 have been reset
1f5b0 20 74 68 65 6e 20 70 75 72 67 65 20 61 6c 6c 20 then purge all
1f5c0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20 information and
1f5d0 63 68 65 63 6b 20 61 67 61 69 6e 20 2a 2f 0a 09 check again */..
1f5e0 09 66 6f 72 20 28 63 75 72 72 73 6c 6f 74 20 3d .for (currslot =
1f5f0 20 30 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20 28 0; currslot < (
1f600 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c sizeof(cackey_sl
1f610 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 ots) / sizeof(ca
1f620 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b ckey_slots[0]));
1f630 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 currslot++) {..
1f640 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f ..if (cackey_slo
1f650 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 69 6e 74 ts[currslot].int
1f660 65 72 6e 61 6c 29 20 7b 0a 09 09 09 09 63 6f 6e ernal) {.....con
1f670 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 tinue;....}.....
1f680 69 66 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74 if (!cackey_slot
1f690 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 s[currslot].acti
1f6a0 76 65 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e ve) {.....contin
1f6b0 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 ue;....}.....if
1f6c0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 (cackey_slots[cu
1f6d0 72 72 73 6c 6f 74 5d 2e 73 6c 6f 74 5f 72 65 73 rrslot].slot_res
1f6e0 65 74 29 20 7b 0a 09 09 09 09 73 6c 6f 74 5f 72 et) {.....slot_r
1f6f0 65 73 65 74 20 3d 20 31 3b 0a 0a 09 09 09 09 62 eset = 1;......b
1f700 72 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a reak;....}...}..
1f710 09 09 69 66 20 28 73 6c 6f 74 5f 72 65 73 65 74 ..if (slot_reset
1f720 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 ) {....CACKEY_DE
1f730 42 55 47 5f 50 52 49 4e 54 46 28 22 50 75 72 67 BUG_PRINTF("Purg
1f740 69 6e 67 20 61 6c 6c 20 73 6c 6f 74 20 69 6e 66 ing all slot inf
1f750 6f 72 6d 61 74 69 6f 6e 2e 22 29 3b 0a 0a 09 09 ormation.");....
1f760 09 2f 2a 20 4f 6e 6c 79 20 75 70 64 61 74 65 20 ./* Only update
1f770 74 68 65 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 the list of slot
1f780 73 20 69 66 20 77 65 20 61 72 65 20 61 63 74 75 s if we are actu
1f790 61 6c 6c 79 20 62 65 69 6e 67 20 73 75 70 70 6c ally being suppl
1f7a0 79 20 74 68 65 20 73 6c 6f 74 20 69 6e 66 6f 72 y the slot infor
1f7b0 6d 61 74 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 mation */....cac
1f7c0 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e key_slots_discon
1f7d0 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 nect_all();.....
1f7e0 66 6f 72 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 for (currslot =
1f7f0 30 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 0; currslot < (s
1f800 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f izeof(cackey_slo
1f810 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 ts) / sizeof(cac
1f820 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 key_slots[0]));
1f830 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 currslot++) {...
1f840 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f ..if (cackey_slo
1f850 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 69 6e 74 ts[currslot].int
1f860 65 72 6e 61 6c 29 20 7b 0a 09 09 09 09 09 63 6f ernal) {......co
1f870 6e 74 69 6e 75 65 3b 0a 09 09 09 09 7d 0a 0a 09 ntinue;.....}...
1f880 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c ...if (cackey_sl
1f890 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 ots[currslot].pc
1f8a0 73 63 5f 72 65 61 64 65 72 29 20 7b 0a 09 09 09 sc_reader) {....
1f8b0 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c ..free(cackey_sl
1f8c0 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 ots[currslot].pc
1f8d0 73 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09 09 09 sc_reader);.....
1f8e0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 ..cackey_slots[c
1f8f0 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 urrslot].pcsc_re
1f900 61 64 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 ader = NULL;....
1f910 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 61 63 6b .}......if (cack
1f920 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f ey_slots[currslo
1f930 74 5d 2e 6c 61 62 65 6c 29 20 7b 0a 09 09 09 09 t].label) {.....
1f940 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f .free(cackey_slo
1f950 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 ts[currslot].lab
1f960 65 6c 29 3b 0a 0a 09 09 09 09 09 63 61 63 6b 65 el);.......cacke
1f970 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 y_slots[currslot
1f980 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a ].label = NULL;.
1f990 09 09 09 09 7d 0a 0a 09 09 09 09 63 61 63 6b 65 ....}......cacke
1f9a0 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 y_slots[currslot
1f9b0 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 09 ].active = 0;...
1f9c0 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 .}...} else {...
1f9d0 09 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 44 65 ....}..}.../* De
1f9e0 74 65 72 6d 69 6e 65 20 6c 69 73 74 20 6f 66 20 termine list of
1f9f0 72 65 61 64 65 72 73 20 2a 2f 0a 09 70 63 73 63 readers */..pcsc
1fa00 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 _connect_ret = c
1fa10 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 ackey_pcsc_conne
1fa20 63 74 28 29 3b 0a 2f 2a 20 58 58 58 3a 20 43 41 ct();./* XXX: CA
1fa30 4e 20 48 41 4e 47 20 48 45 52 45 20 21 20 2a 2f N HANG HERE ! */
1fa40 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 ..if (pcsc_conne
1fa50 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 ct_ret != CACKEY
1fa60 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 _PCSC_S_OK) {...
1fa70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1fa80 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 NTF("Connection
1fa90 74 6f 20 50 43 2f 53 43 20 66 61 69 6c 65 64 2c to PC/SC failed,
1faa0 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 73 6c 6f assuming no slo
1fab0 74 73 22 29 3b 0a 0a 09 09 73 6c 6f 74 5f 63 6f ts");....slot_co
1fac0 75 6e 74 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 unt = 0;..} else
1fad0 20 7b 0a 09 09 70 63 73 63 5f 72 65 61 64 65 72 {...pcsc_reader
1fae0 73 5f 6c 65 6e 20 3d 20 30 3b 0a 0a 09 09 73 63 s_len = 0;....sc
1faf0 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f ard_listreaders_
1fb00 72 65 74 20 3d 20 53 43 61 72 64 4c 69 73 74 52 ret = SCardListR
1fb10 65 61 64 65 72 73 28 2a 63 61 63 6b 65 79 5f 70 eaders(*cackey_p
1fb20 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c csc_handle, NULL
1fb30 2c 20 4e 55 4c 4c 2c 20 26 70 63 73 63 5f 72 65 , NULL, &pcsc_re
1fb40 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 0a 09 09 69 aders_len);....i
1fb50 66 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 f (scard_listrea
1fb60 64 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 ders_ret == SCAR
1fb70 44 5f 46 5f 43 4f 4d 4d 5f 45 52 52 4f 52 29 20 D_F_COMM_ERROR)
1fb80 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {....CACKEY_DEBU
1fb90 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
1fba0 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 SCardListReader
1fbb0 73 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 s() returned SCA
1fbc0 52 44 5f 46 5f 43 4f 4d 4d 5f 45 52 52 4f 52 2c RD_F_COMM_ERROR,
1fbd0 20 61 73 73 75 6d 69 6e 67 20 43 6f 6e 6e 65 63 assuming Connec
1fbe0 74 69 6f 6e 20 74 6f 20 50 43 2f 53 43 20 77 65 tion to PC/SC we
1fbf0 6e 74 20 61 77 61 79 2e 20 52 65 63 6f 6e 6e 65 nt away. Reconne
1fc00 63 74 69 6e 67 2e 22 29 3b 0a 0a 09 09 09 63 61 cting.");.....ca
1fc10 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e ckey_pcsc_discon
1fc20 6e 65 63 74 28 29 3b 0a 09 09 09 63 61 63 6b 65 nect();....cacke
1fc30 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 y_pcsc_connect()
1fc40 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 ;.....CACKEY_DEB
1fc50 55 47 5f 50 52 49 4e 54 46 28 22 54 72 79 69 6e UG_PRINTF("Tryin
1fc60 67 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 g SCardListReade
1fc70 72 73 28 29 20 61 67 61 69 6e 22 29 3b 0a 09 09 rs() again");...
1fc80 09 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 .scard_listreade
1fc90 72 73 5f 72 65 74 20 3d 20 53 43 61 72 64 4c 69 rs_ret = SCardLi
1fca0 73 74 52 65 61 64 65 72 73 28 2a 63 61 63 6b 65 stReaders(*cacke
1fcb0 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e y_pcsc_handle, N
1fcc0 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63 73 63 ULL, NULL, &pcsc
1fcd0 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 _readers_len);..
1fce0 09 7d 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f .}....if (scard_
1fcf0 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 listreaders_ret
1fd00 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 == SCARD_S_SUCCE
1fd10 53 53 20 26 26 20 70 63 73 63 5f 72 65 61 64 65 SS && pcsc_reade
1fd20 72 73 5f 6c 65 6e 20 21 3d 20 30 29 20 7b 0a 09 rs_len != 0) {..
1fd30 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 20 3d ..pcsc_readers =
1fd40 20 6d 61 6c 6c 6f 63 28 70 63 73 63 5f 72 65 61 malloc(pcsc_rea
1fd50 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 09 70 63 ders_len);....pc
1fd60 73 63 5f 72 65 61 64 65 72 73 5f 73 20 3d 20 70 sc_readers_s = p
1fd70 63 73 63 5f 72 65 61 64 65 72 73 3b 0a 0a 09 09 csc_readers;....
1fd80 09 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 .scard_listreade
1fd90 72 73 5f 72 65 74 20 3d 20 53 43 61 72 64 4c 69 rs_ret = SCardLi
1fda0 73 74 52 65 61 64 65 72 73 28 2a 63 61 63 6b 65 stReaders(*cacke
1fdb0 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e y_pcsc_handle, N
1fdc0 55 4c 4c 2c 20 70 63 73 63 5f 72 65 61 64 65 72 ULL, pcsc_reader
1fdd0 73 2c 20 26 70 63 73 63 5f 72 65 61 64 65 72 73 s, &pcsc_readers
1fde0 5f 6c 65 6e 29 3b 0a 09 09 09 69 66 20 28 73 63 _len);....if (sc
1fdf0 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f ard_listreaders_
1fe00 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 ret == SCARD_S_S
1fe10 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09 70 63 UCCESS) {.....pc
1fe20 73 63 5f 72 65 61 64 65 72 73 5f 65 20 3d 20 70 sc_readers_e = p
1fe30 63 73 63 5f 72 65 61 64 65 72 73 20 2b 20 70 63 csc_readers + pc
1fe40 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 3b 0a sc_readers_len;.
1fe50 0a 09 09 09 09 2f 2a 20 53 74 61 72 74 20 77 69 ...../* Start wi
1fe60 74 68 20 53 6c 6f 74 20 49 44 20 31 2c 20 74 6f th Slot ID 1, to
1fe70 20 61 76 6f 69 64 20 61 20 62 75 67 20 69 6e 20 avoid a bug in
1fe80 47 44 4d 20 6f 6e 20 52 48 45 4c 20 2a 2f 0a 09 GDM on RHEL */..
1fe90 09 09 09 2f 2a 20 42 75 67 20 35 39 34 39 31 31 .../* Bug 594911
1fea0 3a 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c : https://bugzil
1feb0 6c 61 2e 72 65 64 68 61 74 2e 63 6f 6d 2f 73 68 la.redhat.com/sh
1fec0 6f 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d 35 39 ow_bug.cgi?id=59
1fed0 34 39 31 31 20 2a 2f 0a 09 09 09 09 63 75 72 72 4911 */.....curr
1fee0 73 6c 6f 74 20 3d 20 31 3b 0a 09 09 09 09 73 6c slot = 1;.....sl
1fef0 6f 74 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 ot_count = 0;...
1ff00 09 09 77 68 69 6c 65 20 28 70 63 73 63 5f 72 65 ..while (pcsc_re
1ff10 61 64 65 72 73 20 3c 20 70 63 73 63 5f 72 65 61 aders < pcsc_rea
1ff20 64 65 72 73 5f 65 29 20 7b 0a 09 09 09 09 09 2f ders_e) {....../
1ff30 2a 20 46 69 6e 64 20 6e 65 78 74 20 61 76 61 69 * Find next avai
1ff40 6c 61 62 6c 65 20 73 6c 6f 74 20 2a 2f 0a 09 09 lable slot */...
1ff50 09 09 09 66 6f 72 20 28 3b 20 63 75 72 72 73 6c ...for (; currsl
1ff60 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 ot < (sizeof(cac
1ff70 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a key_slots) / siz
1ff80 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 eof(cackey_slots
1ff90 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b [0])); currslot+
1ffa0 2b 29 20 7b 0a 09 09 09 09 09 09 69 66 20 28 21 +) {.......if (!
1ffb0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 cackey_slots[cur
1ffc0 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b rslot].active) {
1ffd0 0a 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 ........break;..
1ffe0 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 0a 0a 09 .....}......}...
1fff0 09 09 09 09 63 75 72 72 5f 72 65 61 64 65 72 5f ....curr_reader_
20000 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 70 63 73 len = strlen(pcs
20010 63 5f 72 65 61 64 65 72 73 29 3b 0a 0a 09 09 09 c_readers);.....
20020 09 09 69 66 20 28 28 70 63 73 63 5f 72 65 61 64 ..if ((pcsc_read
20030 65 72 73 20 2b 20 63 75 72 72 5f 72 65 61 64 65 ers + curr_reade
20040 72 5f 6c 65 6e 29 20 3e 20 70 63 73 63 5f 72 65 r_len) > pcsc_re
20050 61 64 65 72 73 5f 65 29 20 7b 0a 09 09 09 09 09 aders_e) {......
20060 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a .break;......}..
20070 09 09 09 09 09 69 66 20 28 63 75 72 72 5f 72 65 .....if (curr_re
20080 61 64 65 72 5f 6c 65 6e 20 3d 3d 20 30 29 20 7b ader_len == 0) {
20090 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 .......break;...
200a0 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 63 ...}.......if (c
200b0 75 72 72 73 6c 6f 74 20 3e 3d 20 28 73 69 7a 65 urrslot >= (size
200c0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 of(cackey_slots)
200d0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 / sizeof(cackey
200e0 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 _slots[0]))) {..
200f0 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
20100 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 G_PRINTF("Found
20110 6d 6f 72 65 20 72 65 61 64 65 72 73 20 74 68 61 more readers tha
20120 6e 20 73 6c 6f 74 73 20 61 72 65 20 61 76 61 69 n slots are avai
20130 6c 61 62 6c 65 21 22 29 3b 0a 0a 09 09 09 09 09 lable!");.......
20140 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a .break;......}..
20150 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
20160 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 G_PRINTF("Found
20170 72 65 61 64 65 72 3a 20 25 73 20 28 63 75 72 72 reader: %s (curr
20180 73 6c 6f 74 20 3d 20 25 6c 75 29 22 2c 20 70 63 slot = %lu)", pc
20190 73 63 5f 72 65 61 64 65 72 73 2c 20 28 75 6e 73 sc_readers, (uns
201a0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 igned long) curr
201b0 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 09 69 66 20 slot);.......if
201c0 28 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f (cackey_readers_
201d0 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79 20 21 3d 20 include_only !=
201e0 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 09 09 43 41 NULL) {.......CA
201f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
20200 46 28 22 41 73 6b 65 64 20 74 6f 20 69 6e 63 6c F("Asked to incl
20210 75 64 65 20 6f 6e 6c 79 20 72 65 61 64 65 72 73 ude only readers
20220 20 6d 61 74 63 68 69 6e 67 3a 20 25 73 22 2c 20 matching: %s",
20230 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69 cackey_readers_i
20240 6e 63 6c 75 64 65 5f 6f 6e 6c 79 29 3b 0a 0a 09 nclude_only);...
20250 09 09 09 09 09 69 6e 63 6c 75 64 65 5f 72 65 61 .....include_rea
20260 64 65 72 20 3d 20 30 3b 0a 09 09 09 09 09 09 72 der = 0;.......r
20270 65 61 64 65 72 5f 63 68 65 63 6b 5f 70 61 74 74 eader_check_patt
20280 65 72 6e 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 ern = cackey_rea
20290 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c ders_include_onl
202a0 79 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 69 y;......} else i
202b0 66 20 28 63 61 63 6b 65 79 5f 72 65 61 64 65 72 f (cackey_reader
202c0 73 5f 65 78 63 6c 75 64 65 20 21 3d 20 4e 55 4c s_exclude != NUL
202d0 4c 29 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 L) {.......CACKE
202e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
202f0 41 73 6b 65 64 20 74 6f 20 65 78 63 6c 75 64 65 Asked to exclude
20300 20 72 65 61 64 65 72 73 20 6d 61 74 63 68 69 6e readers matchin
20310 67 3a 20 25 73 22 2c 20 63 61 63 6b 65 79 5f 72 g: %s", cackey_r
20320 65 61 64 65 72 73 5f 65 78 63 6c 75 64 65 29 3b eaders_exclude);
20330 0a 0a 09 09 09 09 09 09 69 6e 63 6c 75 64 65 5f ........include_
20340 72 65 61 64 65 72 20 3d 20 31 3b 0a 09 09 09 09 reader = 1;.....
20350 09 09 72 65 61 64 65 72 5f 63 68 65 63 6b 5f 70 ..reader_check_p
20360 61 74 74 65 72 6e 20 3d 20 63 61 63 6b 65 79 5f attern = cackey_
20370 72 65 61 64 65 72 73 5f 65 78 63 6c 75 64 65 3b readers_exclude;
20380 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 ......} else {..
20390 09 09 09 09 09 69 6e 63 6c 75 64 65 5f 72 65 61 .....include_rea
203a0 64 65 72 20 3d 20 31 3b 0a 09 09 09 09 09 09 72 der = 1;.......r
203b0 65 61 64 65 72 5f 63 68 65 63 6b 5f 70 61 74 74 eader_check_patt
203c0 65 72 6e 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 ern = NULL;.....
203d0 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 72 65 61 .}.......if (rea
203e0 64 65 72 5f 63 68 65 63 6b 5f 70 61 74 74 65 72 der_check_patter
203f0 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 n != NULL) {....
20400 09 09 09 69 66 20 28 73 74 72 73 74 72 28 70 63 ...if (strstr(pc
20410 73 63 5f 72 65 61 64 65 72 73 2c 20 72 65 61 64 sc_readers, read
20420 65 72 5f 63 68 65 63 6b 5f 70 61 74 74 65 72 6e er_check_pattern
20430 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 ) != NULL) {....
20440 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
20450 5f 50 52 49 4e 54 46 28 22 54 68 69 73 20 72 65 _PRINTF("This re
20460 61 64 65 72 20 6d 61 74 63 68 65 64 20 74 68 65 ader matched the
20470 20 70 61 74 74 65 72 6e 2e 22 29 3b 0a 09 09 09 pattern.");....
20480 09 09 09 0a 09 09 09 09 09 09 09 69 6e 63 6c 75 ...........inclu
20490 64 65 5f 72 65 61 64 65 72 20 3d 20 21 69 6e 63 de_reader = !inc
204a0 6c 75 64 65 5f 72 65 61 64 65 72 3b 0a 09 09 09 lude_reader;....
204b0 09 09 09 7d 0a 09 09 09 09 09 7d 0a 0a 09 09 09 ...}......}.....
204c0 09 09 69 66 20 28 69 6e 63 6c 75 64 65 5f 72 65 ..if (include_re
204d0 61 64 65 72 20 21 3d 20 31 29 20 7b 0a 09 09 09 ader != 1) {....
204e0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
204f0 50 52 49 4e 54 46 28 22 53 6b 69 70 70 69 6e 67 PRINTF("Skipping
20500 20 74 68 69 73 20 72 65 61 64 65 72 2e 22 29 3b this reader.");
20510 0a 0a 09 09 09 09 09 09 70 63 73 63 5f 72 65 61 ........pcsc_rea
20520 64 65 72 73 20 2b 3d 20 63 75 72 72 5f 72 65 61 ders += curr_rea
20530 64 65 72 5f 6c 65 6e 20 2b 20 31 3b 0a 0a 09 09 der_len + 1;....
20540 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 ....continue;...
20550 09 09 09 7d 0a 0a 09 09 09 09 09 2f 2a 20 4f 6e ...}......./* On
20560 6c 79 20 75 70 64 61 74 65 20 74 68 65 20 6c 69 ly update the li
20570 73 74 20 6f 66 20 73 6c 6f 74 73 20 69 66 20 77 st of slots if w
20580 65 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 62 e are actually b
20590 65 69 6e 67 20 61 73 6b 65 64 20 73 75 70 70 6c eing asked suppl
205a0 79 20 74 68 65 20 73 6c 6f 74 20 69 6e 66 6f 72 y the slot infor
205b0 6d 61 74 69 6f 6e 20 2a 2f 0a 09 09 09 09 09 69 mation */......i
205c0 66 20 28 70 53 6c 6f 74 4c 69 73 74 29 20 7b 0a f (pSlotList) {.
205d0 09 09 09 09 09 09 69 66 20 28 73 6c 6f 74 5f 72 ......if (slot_r
205e0 65 73 65 74 29 20 7b 0a 09 09 09 09 09 09 09 63 eset) {........c
205f0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 ackey_slots[curr
20600 73 6c 6f 74 5d 2e 61 63 74 69 76 65 20 3d 20 31 slot].active = 1
20610 3b 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f ;........cackey_
20620 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e slots[currslot].
20630 69 6e 74 65 72 6e 61 6c 20 3d 20 30 3b 0a 09 09 internal = 0;...
20640 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 .....cackey_slot
20650 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 s[currslot].pcsc
20660 5f 72 65 61 64 65 72 20 3d 20 73 74 72 64 75 70 _reader = strdup
20670 28 70 63 73 63 5f 72 65 61 64 65 72 73 29 3b 0a (pcsc_readers);.
20680 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c .......cackey_sl
20690 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 ots[currslot].pc
206a0 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 sc_card_connecte
206b0 64 20 3d 20 30 3b 0a 09 09 09 09 09 09 09 63 61 d = 0;........ca
206c0 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 ckey_slots[currs
206d0 6c 6f 74 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e lot].transaction
206e0 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 09 09 09 _depth = 0;.....
206f0 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b ...cackey_slots[
20700 63 75 72 72 73 6c 6f 74 5d 2e 74 72 61 6e 73 61 currslot].transa
20710 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f ction_need_hw_lo
20720 63 6b 20 3d 20 30 3b 0a 09 09 09 09 09 09 09 69 ck = 0;........i
20730 66 20 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f f (cackey_pin_co
20740 6d 6d 61 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b mmand == NULL) {
20750 0a 09 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f .........cackey_
20760 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e slots[currslot].
20770 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b token_flags = CK
20780 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 F_LOGIN_REQUIRED
20790 3b 0a 09 09 09 09 09 09 09 7d 20 65 6c 73 65 20 ;........} else
207a0 7b 0a 09 09 09 09 09 09 09 09 63 61 63 6b 65 79 {.........cackey
207b0 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d _slots[currslot]
207c0 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30 .token_flags = 0
207d0 3b 0a 09 09 09 09 09 09 09 7d 0a 09 09 09 09 09 ;........}......
207e0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 ..cackey_slots[c
207f0 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d urrslot].label =
20800 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09 09 09 63 NULL;.........c
20810 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f ackey_mark_slot_
20820 72 65 73 65 74 28 26 63 61 63 6b 65 79 5f 73 6c reset(&cackey_sl
20830 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 29 3b 0a ots[currslot]);.
20840 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 20 65 ......}......} e
20850 6c 73 65 20 7b 0a 09 09 09 09 09 09 69 66 20 28 lse {.......if (
20860 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 !cackey_slots[cu
20870 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20 rrslot].active)
20880 7b 0a 09 09 09 09 09 09 09 2f 2a 20 41 72 74 69 {......../* Arti
20890 66 69 63 69 61 6c 6c 79 20 69 6e 63 72 65 61 73 ficially increas
208a0 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 e the number of
208b0 61 63 74 69 76 65 20 73 6c 6f 74 73 20 62 79 20 active slots by
208c0 77 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 what will become
208d0 20 61 63 74 69 76 65 20 2a 2f 0a 09 09 09 09 09 active */......
208e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
208f0 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 69 6e 2d RINTF("Found in-
20900 61 63 74 69 76 65 20 73 6c 6f 74 20 25 6c 75 2c active slot %lu,
20910 20 62 75 74 20 69 74 20 77 69 6c 6c 20 62 65 20 but it will be
20920 61 63 74 69 76 65 20 61 66 74 65 72 20 61 20 72 active after a r
20930 65 73 65 74 20 2d 2d 20 6d 61 72 6b 69 6e 67 20 eset -- marking
20940 61 73 20 61 63 74 69 76 65 20 66 6f 72 20 61 63 as active for ac
20950 63 6f 75 6e 74 69 6e 67 20 70 75 72 70 6f 73 65 counting purpose
20960 73 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f s", (unsigned lo
20970 6e 67 29 20 63 75 72 72 73 6c 6f 74 29 3b 0a 0a ng) currslot);..
20980 09 09 09 09 09 09 09 73 6c 6f 74 5f 63 6f 75 6e .......slot_coun
20990 74 2b 2b 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 t++;.......}....
209a0 09 09 7d 0a 09 09 09 09 09 63 75 72 72 73 6c 6f ..}......currslo
209b0 74 2b 2b 3b 0a 0a 09 09 09 09 09 70 63 73 63 5f t++;.......pcsc_
209c0 72 65 61 64 65 72 73 20 2b 3d 20 63 75 72 72 5f readers += curr_
209d0 72 65 61 64 65 72 5f 6c 65 6e 20 2b 20 31 3b 0a reader_len + 1;.
209e0 09 09 09 09 7d 0a 0a 09 09 09 09 66 6f 72 20 28 ....}......for (
209f0 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75 currslot = 0; cu
20a00 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 rrslot < (sizeof
20a10 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f (cackey_slots) /
20a20 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 sizeof(cackey_s
20a30 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73 lots[0])); currs
20a40 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66 lot++) {......if
20a50 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 (cackey_slots[c
20a60 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29 urrslot].active)
20a70 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f {.......CACKEY_
20a80 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f DEBUG_PRINTF("Fo
20a90 75 6e 64 20 61 63 74 69 76 65 20 73 6c 6f 74 20 und active slot
20aa0 25 6c 75 2c 20 72 65 61 64 65 72 20 3d 20 25 73 %lu, reader = %s
20ab0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e ", (unsigned lon
20ac0 67 29 20 63 75 72 72 73 6c 6f 74 2c 20 63 61 63 g) currslot, cac
20ad0 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c key_slots[currsl
20ae0 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29 ot].pcsc_reader)
20af0 3b 0a 0a 09 09 09 09 09 09 73 6c 6f 74 5f 63 6f ;........slot_co
20b00 75 6e 74 2b 2b 3b 0a 09 09 09 09 09 7d 0a 09 09 unt++;......}...
20b10 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a ..}....} else {.
20b20 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
20b30 5f 50 52 49 4e 54 46 28 22 53 65 63 6f 6e 64 20 _PRINTF("Second
20b40 63 61 6c 6c 20 74 6f 20 53 43 61 72 64 4c 69 73 call to SCardLis
20b50 74 52 65 61 64 65 72 73 20 66 61 69 6c 65 64 2c tReaders failed,
20b60 20 72 65 74 75 72 6e 20 25 73 2f 25 6c 69 22 2c return %s/%li",
20b70 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 CACKEY_DEBUG_FU
20b80 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 NC_SCARDERR_TO_S
20b90 54 52 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 TR(scard_listrea
20ba0 64 65 72 73 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 ders_ret), (long
20bb0 29 20 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 ) scard_listread
20bc0 65 72 73 5f 72 65 74 29 3b 0a 09 09 09 7d 0a 0a ers_ret);....}..
20bd0 09 09 09 66 72 65 65 28 70 63 73 63 5f 72 65 61 ...free(pcsc_rea
20be0 64 65 72 73 5f 73 29 3b 0a 09 09 7d 20 65 6c 73 ders_s);...} els
20bf0 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 e {....CACKEY_DE
20c00 42 55 47 5f 50 52 49 4e 54 46 28 22 46 69 72 73 BUG_PRINTF("Firs
20c10 74 20 63 61 6c 6c 20 74 6f 20 53 43 61 72 64 4c t call to SCardL
20c20 69 73 74 52 65 61 64 65 72 73 20 66 61 69 6c 65 istReaders faile
20c30 64 2c 20 72 65 74 75 72 6e 20 25 73 2f 25 6c 69 d, return %s/%li
20c40 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ", CACKEY_DEBUG_
20c50 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f FUNC_SCARDERR_TO
20c60 5f 53 54 52 28 73 63 61 72 64 5f 6c 69 73 74 72 _STR(scard_listr
20c70 65 61 64 65 72 73 5f 72 65 74 29 2c 20 28 6c 6f eaders_ret), (lo
20c80 6e 67 29 20 73 63 61 72 64 5f 6c 69 73 74 72 65 ng) scard_listre
20c90 61 64 65 72 73 5f 72 65 74 29 3b 0a 09 09 7d 0a aders_ret);...}.
20ca0 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 .}...mutex_retva
20cb0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 l = cackey_mutex
20cc0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 _unlock(cackey_b
20cd0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 iglock);..if (mu
20ce0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 tex_retval != 0)
20cf0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
20d00 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
20d10 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c Unlocking fail
20d20 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
20d30 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 (CKR_GENERAL_ERR
20d40 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 53 OR);..}...if (pS
20d50 6c 6f 74 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 lotList == NULL)
20d60 20 7b 0a 09 09 2a 70 75 6c 43 6f 75 6e 74 20 3d {...*pulCount =
20d70 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b 0a 0a 09 09 slot_count;....
20d80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
20d90 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 NTF("Returning C
20da0 4b 52 5f 4f 4b 20 28 25 69 29 2e 20 20 46 6f 75 KR_OK (%i). Fou
20db0 6e 64 20 25 6c 75 20 72 65 61 64 65 72 73 2c 20 nd %lu readers,
20dc0 62 75 74 20 6e 6f 74 20 73 74 6f 72 69 6e 67 20 but not storing
20dd0 49 44 73 20 28 70 53 6c 6f 74 4c 69 73 74 20 3d IDs (pSlotList =
20de0 3d 20 4e 55 4c 4c 29 22 2c 20 43 4b 52 5f 4f 4b = NULL)", CKR_OK
20df0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
20e00 29 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a ) slot_count);..
20e10 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 ..return(CKR_OK)
20e20 3b 0a 09 7d 0a 0a 09 63 6f 75 6e 74 20 3d 20 2a ;..}...count = *
20e30 70 75 6c 43 6f 75 6e 74 3b 0a 09 69 66 20 28 63 pulCount;..if (c
20e40 6f 75 6e 74 20 3c 20 73 6c 6f 74 5f 63 6f 75 6e ount < slot_coun
20e50 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 t) {...CACKEY_DE
20e60 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
20e70 72 2e 20 55 73 65 72 20 61 6c 6c 6f 63 61 74 65 r. User allocate
20e80 64 20 25 6c 75 20 65 6e 74 72 69 65 73 2c 20 62 d %lu entries, b
20e90 75 74 20 77 65 20 68 61 76 65 20 25 6c 75 20 65 ut we have %lu e
20ea0 6e 74 72 69 65 73 2e 22 2c 20 63 6f 75 6e 74 2c ntries.", count,
20eb0 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 slot_count);...
20ec0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
20ed0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
20ee0 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 CKR_BUFFER_TOO_S
20ef0 4d 41 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 MALL");....retur
20f00 6e 28 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f n(CKR_BUFFER_TOO
20f10 5f 53 4d 41 4c 4c 29 3b 09 0a 09 7d 0a 0a 09 6d _SMALL);...}...m
20f20 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 utex_retval = ca
20f30 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 ckey_mutex_lock(
20f40 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
20f50 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 ..if (mutex_retv
20f60 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 al != 0) {...CAC
20f70 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
20f80 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e ("Error. Lockin
20f90 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 g failed.");....
20fa0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 return(CKR_GENER
20fb0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 AL_ERROR);..}...
20fc0 73 6c 6f 74 5f 69 64 78 20 3d 20 30 3b 0a 09 66 slot_idx = 0;..f
20fd0 6f 72 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 30 or (currslot = 0
20fe0 3b 20 28 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 ; (currslot < (s
20ff0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f izeof(cackey_slo
21000 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 ts) / sizeof(cac
21010 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 3b key_slots[0])));
21020 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 currslot++) {..
21030 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f .if (!cackey_slo
21040 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 ts[currslot].act
21050 69 76 65 29 20 7b 0a 09 09 09 63 6f 6e 74 69 6e ive) {....contin
21060 75 65 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 ue;...}....if (s
21070 6c 6f 74 5f 69 64 78 20 3e 3d 20 63 6f 75 6e 74 lot_idx >= count
21080 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 ) {....CACKEY_DE
21090 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
210a0 72 2e 20 55 73 65 72 20 61 6c 6c 6f 63 61 74 65 r. User allocate
210b0 64 20 25 6c 75 20 65 6e 74 72 69 65 73 2c 20 62 d %lu entries, b
210c0 75 74 20 77 65 20 6a 75 73 74 20 74 72 69 65 64 ut we just tried
210d0 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 to write to the
210e0 20 25 6c 75 20 69 6e 64 65 78 20 2d 2d 20 69 67 %lu index -- ig
210f0 6e 6f 72 69 6e 67 22 2c 20 63 6f 75 6e 74 2c 20 noring", count,
21100 73 6c 6f 74 5f 69 64 78 29 3b 0a 0a 09 09 09 63 slot_idx);.....c
21110 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 ontinue;...}....
21120 70 53 6c 6f 74 4c 69 73 74 5b 73 6c 6f 74 5f 69 pSlotList[slot_i
21130 64 78 5d 20 3d 20 63 75 72 72 73 6c 6f 74 3b 0a dx] = currslot;.
21140 09 09 73 6c 6f 74 5f 69 64 78 2b 2b 3b 0a 09 7d ..slot_idx++;..}
21150 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 ...mutex_retval
21160 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 = cackey_mutex_u
21170 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 nlock(cackey_big
21180 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 lock);..if (mute
21190 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b x_retval != 0) {
211a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
211b0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
211c0 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 Unlocking failed
211d0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
211e0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 KR_GENERAL_ERROR
211f0 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 43 6f 75 6e );..}...*pulCoun
21200 74 20 3d 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b 0a t = slot_count;.
21210 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
21220 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
21230 20 43 4b 52 5f 4f 4b 20 28 25 69 29 2e 20 20 46 CKR_OK (%i). F
21240 6f 75 6e 64 20 25 6c 75 20 72 65 61 64 65 72 73 ound %lu readers
21250 2e 22 2c 20 43 4b 52 5f 4f 4b 2c 20 28 75 6e 73 .", CKR_OK, (uns
21260 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 6c 6f 74 igned long) slot
21270 5f 63 6f 75 6e 74 29 3b 0a 0a 09 72 65 74 75 72 _count);...retur
21280 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 74 6f 6b n(CKR_OK);...tok
21290 65 6e 50 72 65 73 65 6e 74 20 3d 20 74 6f 6b 65 enPresent = toke
212a0 6e 50 72 65 73 65 6e 74 3b 20 2f 2a 20 53 75 70 nPresent; /* Sup
212b0 72 65 73 73 20 75 6e 75 73 65 64 20 76 61 72 69 ress unused vari
212c0 61 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a able warning */.
212d0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e }..CK_DEFINE_FUN
212e0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 CTION(CK_RV, C_G
212f0 65 74 53 6c 6f 74 49 6e 66 6f 29 28 43 4b 5f 53 etSlotInfo)(CK_S
21300 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 LOT_ID slotID, C
21310 4b 5f 53 4c 4f 54 5f 49 4e 46 4f 5f 50 54 52 20 K_SLOT_INFO_PTR
21320 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74 69 63 pInfo) {..static
21330 20 43 4b 5f 55 54 46 38 43 48 41 52 20 73 6c 6f CK_UTF8CHAR slo
21340 74 44 65 73 63 72 69 70 74 69 6f 6e 5b 5d 20 3d tDescription[] =
21350 20 22 43 41 43 4b 65 79 20 53 6c 6f 74 22 3b 0a "CACKey Slot";.
21360 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 .int mutex_retva
21370 6c 3b 0a 09 69 6e 74 20 62 79 74 65 73 5f 74 6f l;..int bytes_to
21380 5f 63 6f 70 79 3b 0a 0a 09 43 41 43 4b 45 59 5f _copy;...CACKEY_
21390 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
213a0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 lled.");...if (p
213b0 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a Info == NULL) {.
213c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
213d0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49 RINTF("Error. pI
213e0 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a nfo is NULL.");.
213f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 ...return(CKR_AR
21400 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d GUMENTS_BAD);..}
21410 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 ...if (!cackey_i
21420 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 nitialized) {...
21430 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
21440 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 NTF("Error. Not
21450 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b initialized.");
21460 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 ....return(CKR_C
21470 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 RYPTOKI_NOT_INIT
21480 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 IALIZED);..}...i
21490 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c f (slotID < 0 ||
214a0 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 slotID >= (size
214b0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 of(cackey_slots)
214c0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 / sizeof(cackey
214d0 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 _slots[0]))) {..
214e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
214f0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 INTF("Error. Inv
21500 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 alid slot reques
21510 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 ted (%lu), outsi
21520 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 de of valid rang
21530 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 e", slotID);....
21540 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f return(CKR_SLOT_
21550 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a ID_INVALID);..}.
21560 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d ..mutex_retval =
21570 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f cackey_mutex_lo
21580 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
21590 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 k);..if (mutex_r
215a0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 etval != 0) {...
215b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
215c0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 NTF("Error. Loc
215d0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a king failed.");.
215e0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 ...return(CKR_GE
215f0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d NERAL_ERROR);..}
21600 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c ...if (cackey_sl
21610 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 ots[slotID].acti
21620 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 ve == 0) {...CAC
21630 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
21640 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 ("Error. Invalid
21650 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 slot requested
21660 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 (%lu), slot not
21670 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 currently active
21680 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 ", slotID);....c
21690 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f ackey_mutex_unlo
216a0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
216b0 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b k);....return(CK
216c0 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 R_SLOT_ID_INVALI
216d0 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e D);..}...pInfo->
216e0 66 6c 61 67 73 20 3d 20 43 4b 46 5f 48 57 5f 53 flags = CKF_HW_S
216f0 4c 4f 54 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b LOT;...if (!cack
21700 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d ey_slots[slotID]
21710 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 70 .internal) {...p
21720 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 Info->flags |= C
21730 4b 46 5f 52 45 4d 4f 56 41 42 4c 45 5f 44 45 56 KF_REMOVABLE_DEV
21740 49 43 45 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 ICE;..}...if (ca
21750 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 ckey_token_prese
21760 6e 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 nt(&cackey_slots
21770 5b 73 6c 6f 74 49 44 5d 29 20 3d 3d 20 43 41 43 [slotID]) == CAC
21780 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e KEY_PCSC_S_TOKEN
21790 50 52 45 53 45 4e 54 29 20 7b 0a 09 09 70 49 6e PRESENT) {...pIn
217a0 66 6f 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 4b 46 fo->flags |= CKF
217b0 5f 54 4f 4b 45 4e 5f 50 52 45 53 45 4e 54 3b 0a _TOKEN_PRESENT;.
217c0 09 7d 0a 0a 09 62 79 74 65 73 5f 74 6f 5f 63 6f .}...bytes_to_co
217d0 70 79 20 3d 20 73 74 72 6c 65 6e 28 63 61 63 6b py = strlen(cack
217e0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d ey_slots[slotID]
217f0 2e 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 .pcsc_reader);..
21800 69 66 20 28 73 69 7a 65 6f 66 28 70 49 6e 66 6f if (sizeof(pInfo
21810 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 ->manufacturerID
21820 29 20 3c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 ) < bytes_to_cop
21830 79 29 20 7b 0a 09 09 62 79 74 65 73 5f 74 6f 5f y) {...bytes_to_
21840 63 6f 70 79 20 3d 20 73 69 7a 65 6f 66 28 70 49 copy = sizeof(pI
21850 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 nfo->manufacture
21860 72 49 44 29 3b 0a 09 7d 0a 09 6d 65 6d 63 70 79 rID);..}..memcpy
21870 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 (pInfo->manufact
21880 75 72 65 72 49 44 2c 20 63 61 63 6b 65 79 5f 73 urerID, cackey_s
21890 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 70 63 73 lots[slotID].pcs
218a0 63 5f 72 65 61 64 65 72 2c 20 62 79 74 65 73 5f c_reader, bytes_
218b0 74 6f 5f 63 6f 70 79 29 3b 0a 0a 09 6d 75 74 65 to_copy);...mute
218c0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 x_retval = cacke
218d0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
218e0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
218f0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 .if (mutex_retva
21900 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b l != 0) {...CACK
21910 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
21920 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 "Error. Unlocki
21930 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 ng failed.");...
21940 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 .return(CKR_GENE
21950 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a RAL_ERROR);..}..
21960 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 73 .memset(pInfo->s
21970 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 lotDescription,
21980 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 ' ', sizeof(pInf
21990 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70 74 69 o->slotDescripti
219a0 6f 6e 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 on));..memcpy(pI
219b0 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70 nfo->slotDescrip
219c0 74 69 6f 6e 2c 20 73 6c 6f 74 44 65 73 63 72 69 tion, slotDescri
219d0 70 74 69 6f 6e 2c 20 73 69 7a 65 6f 66 28 73 6c ption, sizeof(sl
219e0 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 29 20 2d otDescription) -
219f0 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 1);...memset(pI
21a00 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 nfo->manufacture
21a10 72 49 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 rID, ' ', sizeof
21a20 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 (pInfo->manufact
21a30 75 72 65 72 49 44 29 29 3b 0a 0a 09 70 49 6e 66 urerID));...pInf
21a40 6f 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73 69 o->hardwareVersi
21a50 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b on.major = (cack
21a60 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 ey_getversion()
21a70 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09 >> 16) & 0xff;..
21a80 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 pInfo->hardwareV
21a90 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 ersion.minor = (
21aa0 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f cackey_getversio
21ab0 6e 28 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 n() >> 8) & 0xff
21ac0 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 ;...pInfo->firmw
21ad0 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 areVersion.major
21ae0 20 3d 20 30 78 30 30 3b 0a 09 70 49 6e 66 6f 2d = 0x00;..pInfo-
21af0 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e >firmwareVersion
21b00 2e 6d 69 6e 6f 72 20 3d 20 30 78 30 30 3b 0a 0a .minor = 0x00;..
21b10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
21b20 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
21b30 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b CKR_OK (%i)", CK
21b40 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 R_OK);...return(
21b50 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 CKR_OK);.}..CK_D
21b60 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 EFINE_FUNCTION(C
21b70 4b 5f 52 56 2c 20 43 5f 47 65 74 54 6f 6b 65 6e K_RV, C_GetToken
21b80 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 Info)(CK_SLOT_ID
21b90 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 54 4f 4b 45 slotID, CK_TOKE
21ba0 4e 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f N_INFO_PTR pInfo
21bb0 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 ) {..static CK_U
21bc0 54 46 38 43 48 41 52 20 6d 61 6e 75 66 61 63 74 TF8CHAR manufact
21bd0 75 72 65 72 49 44 5b 5d 20 3d 20 22 55 2e 53 2e urerID[] = "U.S.
21be0 20 47 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 Government";..s
21bf0 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 tatic CK_UTF8CHA
21c00 52 20 64 65 66 61 75 6c 74 4c 61 62 65 6c 5b 5d R defaultLabel[]
21c10 20 3d 20 22 55 6e 6b 6e 6f 77 6e 20 54 6f 6b 65 = "Unknown Toke
21c20 6e 22 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 n";..static CK_U
21c30 54 46 38 43 48 41 52 20 6d 6f 64 65 6c 5b 5d 20 TF8CHAR model[]
21c40 3d 20 22 43 41 43 20 54 6f 6b 65 6e 22 3b 0a 09 = "CAC Token";..
21c50 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 struct cackey_pc
21c60 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73 sc_identity *pcs
21c70 63 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 c_identities;..u
21c80 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d nsigned long num
21c90 5f 63 65 72 74 73 3b 0a 09 73 73 69 7a 65 5f 74 _certs;..ssize_t
21ca0 20 6c 61 62 65 6c 5f 72 65 74 3b 0a 09 69 6e 74 label_ret;..int
21cb0 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 mutex_retval;..
21cc0 69 6e 74 20 75 73 65 5f 64 65 66 61 75 6c 74 5f int use_default_
21cd0 6c 61 62 65 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f label;...CACKEY_
21ce0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
21cf0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 lled.");...if (p
21d00 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a Info == NULL) {.
21d10 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
21d20 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49 RINTF("Error. pI
21d30 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a nfo is NULL.");.
21d40 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 ...return(CKR_AR
21d50 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d GUMENTS_BAD);..}
21d60 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 ...if (!cackey_i
21d70 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 nitialized) {...
21d80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
21d90 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 NTF("Error. Not
21da0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b initialized.");
21db0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 ....return(CKR_C
21dc0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 RYPTOKI_NOT_INIT
21dd0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 IALIZED);..}...i
21de0 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c f (slotID < 0 ||
21df0 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 slotID >= (size
21e00 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 of(cackey_slots)
21e10 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 / sizeof(cackey
21e20 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 _slots[0]))) {..
21e30 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
21e40 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 INTF("Error. Inv
21e50 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 alid slot reques
21e60 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 ted (%lu), outsi
21e70 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 de of valid rang
21e80 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 e", slotID);....
21e90 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f return(CKR_SLOT_
21ea0 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a ID_INVALID);..}.
21eb0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d ..mutex_retval =
21ec0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f cackey_mutex_lo
21ed0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
21ee0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 k);..if (mutex_r
21ef0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 etval != 0) {...
21f00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
21f10 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 NTF("Error. Loc
21f20 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a king failed.");.
21f30 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 ...return(CKR_GE
21f40 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d NERAL_ERROR);..}
21f50 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c ...if (cackey_sl
21f60 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 ots[slotID].acti
21f70 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 ve == 0) {...CAC
21f80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
21f90 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 ("Error. Invalid
21fa0 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 slot requested
21fb0 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 (%lu), slot not
21fc0 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 currently active
21fd0 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 ", slotID);....c
21fe0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f ackey_mutex_unlo
21ff0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
22000 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b k);....return(CK
22010 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 R_SLOT_ID_INVALI
22020 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 D);..}...if (cac
22030 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e key_token_presen
22040 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b t(&cackey_slots[
22050 73 6c 6f 74 49 44 5d 29 20 21 3d 20 43 41 43 4b slotID]) != CACK
22060 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 EY_PCSC_S_TOKENP
22070 52 45 53 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b RESENT) {...CACK
22080 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
22090 22 4e 6f 20 74 6f 6b 65 6e 20 69 73 20 70 72 65 "No token is pre
220a0 73 65 6e 74 20 69 6e 20 73 6c 6f 74 49 44 20 3d sent in slotID =
220b0 20 25 6c 75 22 2c 20 73 6c 6f 74 49 44 29 3b 0a %lu", slotID);.
220c0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f ...cackey_mutex_
220d0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 unlock(cackey_bi
220e0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 glock);....retur
220f0 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 4e 4f 54 5f n(CKR_TOKEN_NOT_
22100 50 52 45 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 6d PRESENT);..}...m
22110 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 utex_retval = ca
22120 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 ckey_mutex_unloc
22130 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
22140 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 );..if (mutex_re
22150 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 tval != 0) {...C
22160 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
22170 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f TF("Error. Unlo
22180 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b cking failed.");
22190 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 ....return(CKR_G
221a0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 ENERAL_ERROR);..
221b0 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 }.../* Determine
221c0 20 74 6f 6b 65 6e 20 6c 61 62 65 6c 20 66 72 6f token label fro
221d0 6d 20 63 65 72 74 69 66 69 63 61 74 65 73 20 2a m certificates *
221e0 2f 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d /..memset(pInfo-
221f0 3e 6c 61 62 65 6c 2c 20 27 20 27 2c 20 73 69 7a >label, ' ', siz
22200 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c eof(pInfo->label
22210 29 29 3b 0a 09 75 73 65 5f 64 65 66 61 75 6c 74 ));..use_default
22220 5f 6c 61 62 65 6c 20 3d 20 31 3b 0a 0a 09 69 66 _label = 1;...if
22230 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 (cackey_slots[s
22240 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 3d 3d 20 lotID].label ==
22250 4e 55 4c 4c 29 20 7b 0a 09 09 70 63 73 63 5f 69 NULL) {...pcsc_i
22260 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b dentities = cack
22270 65 79 5f 72 65 61 64 5f 63 65 72 74 73 28 26 63 ey_read_certs(&c
22280 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 ackey_slots[slot
22290 49 44 5d 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f ID], NULL, &num_
222a0 63 65 72 74 73 29 3b 0a 09 09 69 66 20 28 70 63 certs);...if (pc
222b0 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 21 3d sc_identities !=
222c0 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28 NULL) {....if (
222d0 6e 75 6d 5f 63 65 72 74 73 20 3e 20 30 29 20 7b num_certs > 0) {
222e0 0a 09 09 09 09 6c 61 62 65 6c 5f 72 65 74 20 3d .....label_ret =
222f0 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 cackey_pcsc_ide
22300 6e 74 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28 70 ntity_to_label(p
22310 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 csc_identities,
22320 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 73 69 pInfo->label, si
22330 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 zeof(pInfo->labe
22340 6c 29 29 3b 0a 09 09 09 09 69 66 20 28 6c 61 62 l));.....if (lab
22350 65 6c 5f 72 65 74 20 3e 20 30 29 20 7b 0a 09 09 el_ret > 0) {...
22360 09 09 09 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c ...use_default_l
22370 61 62 65 6c 20 3d 20 30 3b 0a 0a 09 09 09 09 09 abel = 0;.......
22380 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f cackey_slots[slo
22390 74 49 44 5d 2e 6c 61 62 65 6c 20 3d 20 6d 61 6c tID].label = mal
223a0 6c 6f 63 28 73 69 7a 65 6f 66 28 70 49 6e 66 6f loc(sizeof(pInfo
223b0 2d 3e 6c 61 62 65 6c 29 29 3b 0a 0a 09 09 09 09 ->label));......
223c0 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 .memcpy(cackey_s
223d0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 lots[slotID].lab
223e0 65 6c 2c 20 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c el, pInfo->label
223f0 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e , sizeof(pInfo->
22400 6c 61 62 65 6c 29 29 3b 0a 09 09 09 09 7d 0a 09 label));.....}..
22410 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 66 ..}.....cackey_f
22420 72 65 65 5f 63 65 72 74 73 28 70 63 73 63 5f 69 ree_certs(pcsc_i
22430 64 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63 dentities, num_c
22440 65 72 74 73 2c 20 31 29 3b 0a 09 09 7d 0a 09 7d erts, 1);...}..}
22450 20 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 63 70 79 else {...memcpy
22460 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 63 (pInfo->label, c
22470 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 ackey_slots[slot
22480 49 44 5d 2e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f ID].label, sizeo
22490 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 f(pInfo->label))
224a0 3b 0a 0a 09 09 75 73 65 5f 64 65 66 61 75 6c 74 ;....use_default
224b0 5f 6c 61 62 65 6c 20 3d 20 30 3b 0a 09 7d 0a 0a _label = 0;..}..
224c0 09 69 66 20 28 75 73 65 5f 64 65 66 61 75 6c 74 .if (use_default
224d0 5f 6c 61 62 65 6c 29 20 7b 0a 09 09 6d 65 6d 63 _label) {...memc
224e0 70 79 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c py(pInfo->label,
224f0 20 64 65 66 61 75 6c 74 4c 61 62 65 6c 2c 20 73 defaultLabel, s
22500 69 7a 65 6f 66 28 64 65 66 61 75 6c 74 4c 61 62 izeof(defaultLab
22510 65 6c 29 20 2d 20 31 29 3b 0a 09 7d 0a 0a 09 6d el) - 1);..}...m
22520 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e emset(pInfo->man
22530 75 66 61 63 74 75 72 65 72 49 44 2c 20 27 20 27 ufacturerID, ' '
22540 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e , sizeof(pInfo->
22550 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 29 manufacturerID))
22560 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d ;..memcpy(pInfo-
22570 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c >manufacturerID,
22580 20 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c manufacturerID,
22590 20 73 69 7a 65 6f 66 28 6d 61 6e 75 66 61 63 74 sizeof(manufact
225a0 75 72 65 72 49 44 29 20 2d 20 31 29 3b 0a 0a 09 urerID) - 1);...
225b0 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 6f memset(pInfo->mo
225c0 64 65 6c 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 del, ' ', sizeof
225d0 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 29 29 3b (pInfo->model));
225e0 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e ..memcpy(pInfo->
225f0 6d 6f 64 65 6c 2c 20 6d 6f 64 65 6c 2c 20 73 69 model, model, si
22600 7a 65 6f 66 28 6d 6f 64 65 6c 29 20 2d 20 31 29 zeof(model) - 1)
22610 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f ;...memset(pInfo
22620 2d 3e 73 65 72 69 61 6c 4e 75 6d 62 65 72 2c 20 ->serialNumber,
22630 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 ' ', sizeof(pInf
22640 6f 2d 3e 73 65 72 69 61 6c 4e 75 6d 62 65 72 29 o->serialNumber)
22650 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 );...memset(pInf
22660 6f 2d 3e 75 74 63 54 69 6d 65 2c 20 27 20 27 2c o->utcTime, ' ',
22670 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 75 sizeof(pInfo->u
22680 74 63 54 69 6d 65 29 29 3b 0a 0a 09 70 49 6e 66 tcTime));...pInf
22690 6f 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73 69 o->hardwareVersi
226a0 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b on.major = (cack
226b0 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 ey_getversion()
226c0 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09 >> 16) & 0xff;..
226d0 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 pInfo->hardwareV
226e0 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 ersion.minor = (
226f0 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f cackey_getversio
22700 6e 28 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 n() >> 8) & 0xff
22710 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 ;...pInfo->firmw
22720 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 areVersion.major
22730 20 3d 20 30 78 30 30 3b 0a 09 70 49 6e 66 6f 2d = 0x00;..pInfo-
22740 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e >firmwareVersion
22750 2e 6d 69 6e 6f 72 20 3d 20 30 78 30 30 3b 0a 0a .minor = 0x00;..
22760 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 .pInfo->flags =
22770 43 4b 46 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 CKF_WRITE_PROTEC
22780 54 45 44 20 7c 20 43 4b 46 5f 55 53 45 52 5f 50 TED | CKF_USER_P
22790 49 4e 5f 49 4e 49 54 49 41 4c 49 5a 45 44 20 7c IN_INITIALIZED |
227a0 20 43 4b 46 5f 54 4f 4b 45 4e 5f 49 4e 49 54 49 CKF_TOKEN_INITI
227b0 41 4c 49 5a 45 44 20 7c 20 63 61 63 6b 65 79 5f ALIZED | cackey_
227c0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f slots[slotID].to
227d0 6b 65 6e 5f 66 6c 61 67 73 3b 0a 0a 09 69 66 20 ken_flags;...if
227e0 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d (cackey_pin_comm
227f0 61 6e 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 and != NULL) {..
22800 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 7c 3d .pInfo->flags |=
22810 20 43 4b 46 5f 50 52 4f 54 45 43 54 45 44 5f 41 CKF_PROTECTED_A
22820 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 5f 50 41 UTHENTICATION_PA
22830 54 48 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e TH;..}...pInfo->
22840 75 6c 4d 61 78 53 65 73 73 69 6f 6e 43 6f 75 6e ulMaxSessionCoun
22850 74 20 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b t = (sizeof(cack
22860 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 ey_sessions) / s
22870 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 izeof(cackey_ses
22880 73 69 6f 6e 73 5b 30 5d 29 29 20 2d 20 31 3b 0a sions[0])) - 1;.
22890 09 70 49 6e 66 6f 2d 3e 75 6c 53 65 73 73 69 6f .pInfo->ulSessio
228a0 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f 55 4e 41 56 nCount = CK_UNAV
228b0 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 AILABLE_INFORMAT
228c0 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d ION;..pInfo->ulM
228d0 61 78 52 77 53 65 73 73 69 6f 6e 43 6f 75 6e 74 axRwSessionCount
228e0 20 3d 20 30 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c = 0;..pInfo->ul
228f0 52 77 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d RwSessionCount =
22900 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f CK_UNAVAILABLE_
22910 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 INFORMATION;..pI
22920 6e 66 6f 2d 3e 75 6c 4d 61 78 50 69 6e 4c 65 6e nfo->ulMaxPinLen
22930 20 3d 20 31 32 38 3b 0a 09 70 49 6e 66 6f 2d 3e = 128;..pInfo->
22940 75 6c 4d 69 6e 50 69 6e 4c 65 6e 20 3d 20 30 3b ulMinPinLen = 0;
22950 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61 6c ..pInfo->ulTotal
22960 50 75 62 6c 69 63 4d 65 6d 6f 72 79 20 3d 20 43 PublicMemory = C
22970 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e K_UNAVAILABLE_IN
22980 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 FORMATION;..pInf
22990 6f 2d 3e 75 6c 46 72 65 65 50 75 62 6c 69 63 4d o->ulFreePublicM
229a0 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 emory = CK_UNAVA
229b0 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 ILABLE_INFORMATI
229c0 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54 6f ON;..pInfo->ulTo
229d0 74 61 6c 50 72 69 76 61 74 65 4d 65 6d 6f 72 79 talPrivateMemory
229e0 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c = CK_UNAVAILABL
229f0 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 E_INFORMATION;..
22a00 70 49 6e 66 6f 2d 3e 75 6c 46 72 65 65 50 72 69 pInfo->ulFreePri
22a10 76 61 74 65 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f vateMemory = CK_
22a20 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f UNAVAILABLE_INFO
22a30 52 4d 41 54 49 4f 4e 3b 0a 0a 09 43 41 43 4b 45 RMATION;...CACKE
22a40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
22a50 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b Returning CKR_OK
22a60 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b (%i)", CKR_OK);
22a70 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b ...return(CKR_OK
22a80 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f );.}..CK_DEFINE_
22a90 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 FUNCTION(CK_RV,
22aa0 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74 45 76 65 C_WaitForSlotEve
22ab0 6e 74 29 28 43 4b 5f 46 4c 41 47 53 20 66 6c 61 nt)(CK_FLAGS fla
22ac0 67 73 2c 20 43 4b 5f 53 4c 4f 54 5f 49 44 5f 50 gs, CK_SLOT_ID_P
22ad0 54 52 20 70 53 6c 6f 74 49 44 2c 20 43 4b 5f 56 TR pSlotID, CK_V
22ae0 4f 49 44 5f 50 54 52 20 70 52 65 73 65 72 76 65 OID_PTR pReserve
22af0 64 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 d) {..CACKEY_DEB
22b00 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
22b10 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 52 65 73 d.");...if (pRes
22b20 65 72 76 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b erved != NULL) {
22b30 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
22b40 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 PRINTF("Error. p
22b50 52 65 73 65 72 76 65 64 20 69 73 20 6e 6f 74 20 Reserved is not
22b60 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 NULL.");....retu
22b70 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 rn(CKR_ARGUMENTS
22b80 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 _BAD);..}...if (
22b90 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 !cackey_initiali
22ba0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f zed) {...CACKEY_
22bb0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
22bc0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 ror. Not initia
22bd0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 lized.");....ret
22be0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 urn(CKR_CRYPTOKI
22bf0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 _NOT_INITIALIZED
22c00 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 58 58 58 3a 20 );..}.../* XXX:
22c10 54 4f 44 4f 3a 20 49 6d 70 6c 65 6d 65 6e 74 20 TODO: Implement
22c20 74 68 69 73 2e 2e 2e 20 2a 2f 0a 09 43 41 43 4b this... */..CACK
22c30 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
22c40 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 "Returning CKR_F
22c50 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
22c60 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 ORTED (%i)", CKR
22c70 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
22c80 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 PPORTED);...retu
22c90 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f rn(CKR_FUNCTION_
22ca0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
22cb0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e }..CK_DEFINE_FUN
22cc0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 CTION(CK_RV, C_G
22cd0 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 29 etMechanismList)
22ce0 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 (CK_SLOT_ID slot
22cf0 49 44 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d ID, CK_MECHANISM
22d00 5f 54 59 50 45 5f 50 54 52 20 70 4d 65 63 68 61 _TYPE_PTR pMecha
22d10 6e 69 73 6d 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f nismList, CK_ULO
22d20 4e 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 NG_PTR pulCount)
22d30 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {..CACKEY_DEBUG
22d40 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
22d50 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ");...if (!cacke
22d60 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b y_initialized) {
22d70 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
22d80 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
22d90 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e Not initialized.
22da0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
22db0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 R_CRYPTOKI_NOT_I
22dc0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
22dd0 0a 09 69 66 20 28 70 75 6c 43 6f 75 6e 74 20 3d ..if (pulCount =
22de0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b = NULL) {...CACK
22df0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
22e00 22 45 72 72 6f 72 2e 20 20 70 75 6c 43 6f 75 6e "Error. pulCoun
22e10 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 t is NULL.");...
22e20 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 .return(CKR_ARGU
22e30 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a MENTS_BAD);..}..
22e40 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 4c .if (pMechanismL
22e50 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ist == NULL) {..
22e60 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 31 3b 0a .*pulCount = 1;.
22e70 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
22e80 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e PRINTF("Returnin
22e90 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 g CKR_OK (%i)",
22ea0 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 CKR_OK);....retu
22eb0 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a rn(CKR_OK);..}..
22ec0 09 69 66 20 28 2a 70 75 6c 43 6f 75 6e 74 20 3c .if (*pulCount <
22ed0 20 31 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 1) {...CACKEY_D
22ee0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
22ef0 6f 72 2e 20 20 42 75 66 66 65 72 20 74 6f 6f 20 or. Buffer too
22f00 73 6d 61 6c 6c 2e 22 29 3b 0a 0a 09 09 72 65 74 small.");....ret
22f10 75 72 6e 28 43 4b 52 5f 42 55 46 46 45 52 5f 54 urn(CKR_BUFFER_T
22f20 4f 4f 5f 53 4d 41 4c 4c 29 3b 0a 09 7d 0a 0a 09 OO_SMALL);..}...
22f30 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 5b 30 pMechanismList[0
22f40 5d 20 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 ] = CKM_RSA_PKCS
22f50 3b 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 31 ;..*pulCount = 1
22f60 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ;...CACKEY_DEBUG
22f70 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
22f80 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c ng CKR_OK (%i)",
22f90 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 CKR_OK);...retu
22fa0 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 rn(CKR_OK);.}..C
22fb0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f K_DEFINE_FUNCTIO
22fc0 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4d 65 N(CK_RV, C_GetMe
22fd0 63 68 61 6e 69 73 6d 49 6e 66 6f 29 28 43 4b 5f chanismInfo)(CK_
22fe0 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 SLOT_ID slotID,
22ff0 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 CK_MECHANISM_TYP
23000 45 20 74 79 70 65 2c 20 43 4b 5f 4d 45 43 48 41 E type, CK_MECHA
23010 4e 49 53 4d 5f 49 4e 46 4f 5f 50 54 52 20 70 49 NISM_INFO_PTR pI
23020 6e 66 6f 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 nfo) {..int mute
23030 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b x_retval;...CACK
23040 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
23050 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 "Called.");...if
23060 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 (pInfo == NULL)
23070 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
23080 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
23090 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 pInfo is NULL."
230a0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
230b0 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b _ARGUMENTS_BAD);
230c0 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ..}...if (!cacke
230d0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b y_initialized) {
230e0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
230f0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
23100 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e Not initialized.
23110 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
23120 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 R_CRYPTOKI_NOT_I
23130 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
23140 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 ..if (slotID < 0
23150 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 || slotID >= (s
23160 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f izeof(cackey_slo
23170 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 ts) / sizeof(cac
23180 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 key_slots[0])))
23190 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
231a0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
231b0 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 Invalid slot req
231c0 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 uested (%lu), ou
231d0 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 tside of valid r
231e0 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a ange", slotID);.
231f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c ...return(CKR_SL
23200 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a OT_ID_INVALID);.
23210 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 .}...mutex_retva
23220 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 l = cackey_mutex
23230 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 _lock(cackey_big
23240 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 lock);..if (mute
23250 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b x_retval != 0) {
23260 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
23270 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
23280 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 Locking failed."
23290 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
232a0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b _GENERAL_ERROR);
232b0 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 ..}...if (cackey
232c0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 _slots[slotID].a
232d0 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 ctive == 0) {...
232e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
232f0 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 NTF("Error. Inva
23300 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 lid slot request
23310 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e ed (%lu), slot n
23320 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 ot currently act
23330 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a ive", slotID);..
23340 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 ..cackey_mutex_u
23350 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 nlock(cackey_big
23360 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e lock);....return
23370 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 (CKR_SLOT_ID_INV
23380 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 ALID);..}...mute
23390 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 x_retval = cacke
233a0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
233b0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
233c0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 .if (mutex_retva
233d0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b l != 0) {...CACK
233e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
233f0 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 "Error. Unlocki
23400 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 ng failed.");...
23410 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 .return(CKR_GENE
23420 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a RAL_ERROR);..}..
23430 09 73 77 69 74 63 68 20 28 74 79 70 65 29 20 7b .switch (type) {
23440 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f ...case CKM_RSA_
23450 50 4b 43 53 3a 0a 09 09 09 70 49 6e 66 6f 2d 3e PKCS:....pInfo->
23460 75 6c 4d 69 6e 4b 65 79 53 69 7a 65 20 3d 20 35 ulMinKeySize = 5
23470 31 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 12;....pInfo->ul
23480 4d 61 78 4b 65 79 53 69 7a 65 20 3d 20 38 31 39 MaxKeySize = 819
23490 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 2;....pInfo->fla
234a0 67 73 20 3d 20 43 4b 46 5f 48 57 20 7c 20 43 4b gs = CKF_HW | CK
234b0 46 5f 45 4e 43 52 59 50 54 20 7c 20 43 4b 46 5f F_ENCRYPT | CKF_
234c0 44 45 43 52 59 50 54 20 7c 20 43 4b 46 5f 53 49 DECRYPT | CKF_SI
234d0 47 4e 20 7c 20 43 4b 46 5f 56 45 52 49 46 59 3b GN | CKF_VERIFY;
234e0 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 ....break;..}...
234f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
23500 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 NTF("Returning C
23510 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 KR_OK (%i)", CKR
23520 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 _OK);...return(C
23530 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 KR_OK);.}../* We
23540 20 64 6f 6e 27 74 20 73 75 70 70 6f 72 74 20 74 don't support t
23550 68 69 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 his method. */.C
23560 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f K_DEFINE_FUNCTIO
23570 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 54 N(CK_RV, C_InitT
23580 6f 6b 65 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 oken)(CK_SLOT_ID
23590 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 55 54 46 38 slotID, CK_UTF8
235a0 43 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 CHAR_PTR pPin, C
235b0 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e K_ULONG ulPinLen
235c0 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 , CK_UTF8CHAR_PT
235d0 52 20 70 4c 61 62 65 6c 29 20 7b 0a 09 43 41 43 R pLabel) {..CAC
235e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
235f0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 ("Called.");...i
23600 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 f (!cackey_initi
23610 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b alized) {...CACK
23620 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
23630 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 "Error. Not ini
23640 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 tialized.");....
23650 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 return(CKR_CRYPT
23660 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 OKI_NOT_INITIALI
23670 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 ZED);..}...CACKE
23680 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
23690 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 54 4f Returning CKR_TO
236a0 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 KEN_WRITE_PROTEC
236b0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 54 TED (%i)", CKR_T
236c0 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 OKEN_WRITE_PROTE
236d0 43 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 CTED);...return(
236e0 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f CKR_TOKEN_WRITE_
236f0 50 52 4f 54 45 43 54 45 44 29 3b 0a 7d 0a 0a 2f PROTECTED);.}../
23700 2a 20 57 65 20 64 6f 6e 27 74 20 73 75 70 70 6f * We don't suppo
23710 72 74 20 74 68 69 73 20 6d 65 74 68 6f 64 2e 20 rt this method.
23720 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e */.CK_DEFINE_FUN
23730 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 CTION(CK_RV, C_I
23740 6e 69 74 50 49 4e 29 28 43 4b 5f 53 45 53 53 49 nitPIN)(CK_SESSI
23750 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 ON_HANDLE hSessi
23760 6f 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f on, CK_UTF8CHAR_
23770 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f PTR pPin, CK_ULO
23780 4e 47 20 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09 NG ulPinLen) {..
23790 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
237a0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a NTF("Called.");.
237b0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e ..if (!cackey_in
237c0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 itialized) {...C
237d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
237e0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 TF("Error. Not
237f0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a initialized.");.
23800 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 ...return(CKR_CR
23810 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 YPTOKI_NOT_INITI
23820 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 ALIZED);..}...CA
23830 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
23840 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 F("Returning CKR
23850 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f _TOKEN_WRITE_PRO
23860 54 45 43 54 45 44 20 28 25 69 29 22 2c 20 43 4b TECTED (%i)", CK
23870 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 R_TOKEN_WRITE_PR
23880 4f 54 45 43 54 45 44 29 3b 0a 0a 09 72 65 74 75 OTECTED);...retu
23890 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 rn(CKR_TOKEN_WRI
238a0 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 7d TE_PROTECTED);.}
238b0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 ..CK_DEFINE_FUNC
238c0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 TION(CK_RV, C_Se
238d0 74 50 49 4e 29 28 43 4b 5f 53 45 53 53 49 4f 4e tPIN)(CK_SESSION
238e0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e _HANDLE hSession
238f0 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 , CK_UTF8CHAR_PT
23900 52 20 70 4f 6c 64 50 69 6e 2c 20 43 4b 5f 55 4c R pOldPin, CK_UL
23910 4f 4e 47 20 75 6c 4f 6c 64 50 69 6e 4c 65 6e 2c ONG ulOldPinLen,
23920 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 CK_UTF8CHAR_PTR
23930 20 70 4e 65 77 50 69 6e 2c 20 43 4b 5f 55 4c 4f pNewPin, CK_ULO
23940 4e 47 20 75 6c 4e 65 77 50 69 6e 4c 65 6e 29 20 NG ulNewPinLen)
23950 7b 0a 09 63 68 61 72 20 6f 6c 64 70 69 6e 62 75 {..char oldpinbu
23960 66 5b 36 34 5d 2c 20 6e 65 77 70 69 6e 62 75 66 f[64], newpinbuf
23970 5b 36 34 5d 3b 0a 09 63 61 63 6b 65 79 5f 72 65 [64];..cackey_re
23980 74 20 73 65 74 5f 70 69 6e 5f 72 65 74 2c 20 67 t set_pin_ret, g
23990 65 74 5f 70 69 6e 5f 72 65 74 3b 0a 09 43 4b 5f et_pin_ret;..CK_
239a0 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a SLOT_ID slotID;.
239b0 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 .int mutex_retva
239c0 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 l;...CACKEY_DEBU
239d0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 G_PRINTF("Called
239e0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b .");...if (!cack
239f0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 ey_initialized)
23a00 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
23a10 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
23a20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 Not initialized
23a30 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
23a40 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f KR_CRYPTOKI_NOT_
23a50 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d INITIALIZED);..}
23a60 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 ...mutex_retval
23a70 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c = cackey_mutex_l
23a80 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
23a90 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f ck);..if (mutex_
23aa0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 retval != 0) {..
23ab0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
23ac0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f INTF("Error. Lo
23ad0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b cking failed.");
23ae0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 ....return(CKR_G
23af0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 ENERAL_ERROR);..
23b00 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f }...if (!cackey_
23b10 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
23b20 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 n].active) {...c
23b30 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f ackey_mutex_unlo
23b40 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
23b50 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 k);....CACKEY_DE
23b60 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
23b70 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 r. Session not
23b80 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 active.");......
23b90 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 return(CKR_SESSI
23ba0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 ON_HANDLE_INVALI
23bb0 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 D);..}...slotID
23bc0 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e = cackey_session
23bd0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 s[hSession].slot
23be0 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 ID;...if (slotID
23bf0 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e < 0 || slotID >
23c00 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 = (sizeof(cackey
23c10 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 _slots) / sizeof
23c20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d (cackey_slots[0]
23c30 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ))) {...CACKEY_D
23c40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
23c50 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 or. Invalid slot
23c60 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 requested (%lu)
23c70 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c , outside of val
23c80 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 id range", slotI
23c90 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 D);....cackey_mu
23ca0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 tex_unlock(cacke
23cb0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 y_biglock);....r
23cc0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 eturn(CKR_GENERA
23cd0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 L_ERROR);..}...i
23ce0 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b f (cackey_slots[
23cf0 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d slotID].active =
23d00 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f = 0) {...CACKEY_
23d10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
23d20 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f ror. Invalid slo
23d30 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 t requested (%lu
23d40 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 ), slot not curr
23d50 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 ently active", s
23d60 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 lotID);....cacke
23d70 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
23d80 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
23d90 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 ...return(CKR_GE
23da0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d NERAL_ERROR);..}
23db0 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70 69 ...if (cackey_pi
23dc0 6e 5f 63 6f 6d 6d 61 6e 64 20 21 3d 20 4e 55 4c n_command != NUL
23dd0 4c 29 20 7b 0a 09 09 2f 2a 20 47 65 74 20 6f 6c L) {.../* Get ol
23de0 64 20 50 49 4e 20 2a 2f 0a 09 09 67 65 74 5f 70 d PIN */...get_p
23df0 69 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f in_ret = cackey_
23e00 67 65 74 5f 70 69 6e 28 6f 6c 64 70 69 6e 62 75 get_pin(oldpinbu
23e10 66 29 3b 0a 0a 09 09 69 66 20 28 67 65 74 5f 70 f);....if (get_p
23e20 69 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 in_ret != CACKEY
23e30 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 _PCSC_S_OK) {...
23e40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
23e50 49 4e 54 46 28 22 45 72 72 6f 72 20 77 68 69 6c INTF("Error whil
23e60 65 20 67 65 74 74 69 6e 67 20 4f 6c 64 20 50 49 e getting Old PI
23e70 4e 2c 20 72 65 74 75 72 6e 69 6e 67 20 43 4b 52 N, returning CKR
23e80 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 2e 22 _PIN_INCORRECT."
23e90 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 );.....cackey_mu
23ea0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 tex_unlock(cacke
23eb0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 0a y_biglock);.....
23ec0 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 ...return(CKR_PI
23ed0 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a 09 09 N_INCORRECT);...
23ee0 7d 0a 0a 09 09 70 4f 6c 64 50 69 6e 20 3d 20 28 }....pOldPin = (
23ef0 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 29 CK_UTF8CHAR_PTR)
23f00 20 6f 6c 64 70 69 6e 62 75 66 3b 0a 09 09 75 6c oldpinbuf;...ul
23f10 4f 6c 64 50 69 6e 4c 65 6e 20 3d 20 73 74 72 6c OldPinLen = strl
23f20 65 6e 28 6f 6c 64 70 69 6e 62 75 66 29 3b 0a 0a en(oldpinbuf);..
23f30 09 09 2f 2a 20 47 65 74 20 6e 65 77 20 50 49 4e ../* Get new PIN
23f40 20 2a 2f 0a 09 09 67 65 74 5f 70 69 6e 5f 72 65 */...get_pin_re
23f50 74 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 70 t = cackey_get_p
23f60 69 6e 28 6e 65 77 70 69 6e 62 75 66 29 3b 0a 0a in(newpinbuf);..
23f70 09 09 69 66 20 28 67 65 74 5f 70 69 6e 5f 72 65 ..if (get_pin_re
23f80 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 t != CACKEY_PCSC
23f90 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b _S_OK) {....CACK
23fa0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
23fb0 22 45 72 72 6f 72 20 77 68 69 6c 65 20 67 65 74 "Error while get
23fc0 74 69 6e 67 20 4e 65 77 20 50 49 4e 2c 20 72 65 ting New PIN, re
23fd0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 50 49 4e 5f turning CKR_PIN_
23fe0 49 4e 56 41 4c 49 44 2e 22 29 3b 0a 0a 09 09 09 INVALID.");.....
23ff0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c cackey_mutex_unl
24000 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
24010 63 6b 29 3b 0a 09 09 09 0a 09 09 09 72 65 74 75 ck);........retu
24020 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 56 41 4c rn(CKR_PIN_INVAL
24030 49 44 29 3b 0a 09 09 7d 0a 0a 09 09 70 4e 65 77 ID);...}....pNew
24040 50 69 6e 20 3d 20 28 43 4b 5f 55 54 46 38 43 48 Pin = (CK_UTF8CH
24050 41 52 5f 50 54 52 29 20 6e 65 77 70 69 6e 62 75 AR_PTR) newpinbu
24060 66 3b 0a 09 09 75 6c 4e 65 77 50 69 6e 4c 65 6e f;...ulNewPinLen
24070 20 3d 20 73 74 72 6c 65 6e 28 6e 65 77 70 69 6e = strlen(newpin
24080 62 75 66 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 buf);..}...if (p
24090 4f 6c 64 50 69 6e 20 3d 3d 20 4e 55 4c 4c 29 20 OldPin == NULL)
240a0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
240b0 5f 50 52 49 4e 54 46 28 22 4f 6c 64 20 50 49 4e _PRINTF("Old PIN
240c0 20 76 61 6c 75 65 20 69 73 20 77 72 6f 6e 67 20 value is wrong
240d0 28 6e 75 6c 6c 29 2e 22 29 3b 0a 0a 09 09 63 61 (null).");....ca
240e0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 ckey_mutex_unloc
240f0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
24100 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
24110 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b _PIN_INCORRECT);
24120 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 4f 6c 64 50 ..}...if (ulOldP
24130 69 6e 4c 65 6e 20 3d 3d 20 30 20 7c 7c 20 75 6c inLen == 0 || ul
24140 4f 6c 64 50 69 6e 4c 65 6e 20 3e 20 38 29 20 7b OldPinLen > 8) {
24150 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
24160 50 52 49 4e 54 46 28 22 4f 6c 64 20 50 49 4e 20 PRINTF("Old PIN
24170 6c 65 6e 67 74 68 20 69 73 20 77 72 6f 6e 67 3a length is wrong:
24180 20 25 6c 75 2e 22 2c 20 28 75 6e 73 69 67 6e 65 %lu.", (unsigne
24190 64 20 6c 6f 6e 67 29 20 75 6c 4f 6c 64 50 69 6e d long) ulOldPin
241a0 4c 65 6e 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f Len);....cackey_
241b0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 mutex_unlock(cac
241c0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 key_biglock);...
241d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f .return(CKR_PIN_
241e0 49 4e 43 4f 52 52 45 43 54 29 3b 0a 09 7d 0a 0a INCORRECT);..}..
241f0 09 69 66 20 28 70 4e 65 77 50 69 6e 20 3d 3d 20 .if (pNewPin ==
24200 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 NULL) {...CACKEY
24210 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4e _DEBUG_PRINTF("N
24220 65 77 20 50 49 4e 20 76 61 6c 75 65 20 69 73 20 ew PIN value is
24230 77 72 6f 6e 67 20 28 65 69 74 68 65 72 20 4e 55 wrong (either NU
24240 4c 4c 2c 20 6f 72 20 74 6f 6f 20 6c 6f 6e 67 2f LL, or too long/
24250 73 68 6f 72 74 29 2e 22 29 3b 0a 0a 09 09 63 61 short).");....ca
24260 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 ckey_mutex_unloc
24270 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
24280 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
24290 5f 50 49 4e 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 _PIN_INVALID);..
242a0 7d 0a 0a 09 69 66 20 28 75 6c 4e 65 77 50 69 6e }...if (ulNewPin
242b0 4c 65 6e 20 3c 20 35 20 7c 7c 20 75 6c 4e 65 77 Len < 5 || ulNew
242c0 50 69 6e 4c 65 6e 20 3e 20 38 29 20 7b 0a 09 09 PinLen > 8) {...
242d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
242e0 4e 54 46 28 22 4e 65 77 20 50 49 4e 20 6c 65 6e NTF("New PIN len
242f0 67 74 68 20 69 73 20 77 72 6f 6e 67 3a 20 25 6c gth is wrong: %l
24300 75 2c 20 6d 75 73 74 20 62 65 20 61 74 6c 65 61 u, must be atlea
24310 73 74 20 35 20 61 6e 64 20 6e 6f 20 6d 6f 72 65 st 5 and no more
24320 20 74 68 61 6e 20 38 2e 22 2c 20 28 75 6e 73 69 than 8.", (unsi
24330 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 4e 65 77 gned long) ulNew
24340 50 69 6e 4c 65 6e 29 3b 0a 0a 09 09 63 61 63 6b PinLen);....cack
24350 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 ey_mutex_unlock(
24360 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
24370 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 ....return(CKR_P
24380 49 4e 5f 4c 45 4e 5f 52 41 4e 47 45 29 3b 0a 09 IN_LEN_RANGE);..
24390 7d 0a 0a 09 73 65 74 5f 70 69 6e 5f 72 65 74 20 }...set_pin_ret
243a0 3d 20 63 61 63 6b 65 79 5f 73 65 74 5f 70 69 6e = cackey_set_pin
243b0 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 (&cackey_slots[s
243c0 6c 6f 74 49 44 5d 2c 20 70 4f 6c 64 50 69 6e 2c lotID], pOldPin,
243d0 20 75 6c 4f 6c 64 50 69 6e 4c 65 6e 2c 20 70 4e ulOldPinLen, pN
243e0 65 77 50 69 6e 2c 20 75 6c 4e 65 77 50 69 6e 4c ewPin, ulNewPinL
243f0 65 6e 29 3b 0a 0a 09 69 66 20 28 73 65 74 5f 70 en);...if (set_p
24400 69 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 in_ret != CACKEY
24410 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 _PCSC_S_OK) {...
24420 69 66 20 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63 if (cackey_pin_c
24430 6f 6d 6d 61 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20 ommand == NULL)
24440 7b 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 {....cackey_slot
24450 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f s[slotID].token_
24460 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 4c 4f 47 flags |= CKF_LOG
24470 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 09 09 7d IN_REQUIRED;...}
24480 0a 0a 09 09 69 66 20 28 73 65 74 5f 70 69 6e 5f ....if (set_pin_
24490 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 ret == CACKEY_PC
244a0 53 43 5f 45 5f 4c 4f 43 4b 45 44 29 20 7b 0a 09 SC_E_LOCKED) {..
244b0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 ..cackey_slots[s
244c0 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 lotID].token_fla
244d0 67 73 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50 gs |= CKF_USER_P
244e0 49 4e 5f 4c 4f 43 4b 45 44 3b 0a 09 09 7d 0a 09 IN_LOCKED;...}..
244f0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c }...mutex_retval
24500 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f = cackey_mutex_
24510 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 unlock(cackey_bi
24520 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 glock);..if (mut
24530 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 ex_retval != 0)
24540 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
24550 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
24560 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 Unlocking faile
24570 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
24580 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f CKR_GENERAL_ERRO
24590 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 R);..}...switch
245a0 28 73 65 74 5f 70 69 6e 5f 72 65 74 29 20 7b 0a (set_pin_ret) {.
245b0 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 50 43 ..case CACKEY_PC
245c0 53 43 5f 53 5f 4f 4b 3a 0a 09 09 09 43 41 43 4b SC_S_OK:....CACK
245d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
245e0 22 53 75 63 63 65 73 73 66 75 6c 6c 79 20 73 65 "Successfully se
245f0 74 20 50 49 4e 2e 22 29 3b 0a 0a 09 09 09 72 65 t PIN.");.....re
24600 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 09 turn(CKR_OK);...
24610 63 61 73 65 20 43 41 43 4b 45 59 5f 50 43 53 43 case CACKEY_PCSC
24620 5f 45 5f 42 41 44 50 49 4e 3a 0a 09 09 09 43 41 _E_BADPIN:....CA
24630 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
24640 46 28 22 50 49 4e 20 77 61 73 20 69 6e 76 61 6c F("PIN was inval
24650 69 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 id.");.....retur
24660 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 56 41 4c 49 n(CKR_PIN_INVALI
24670 44 29 3b 0a 09 09 63 61 73 65 20 43 41 43 4b 45 D);...case CACKE
24680 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 3a Y_PCSC_E_LOCKED:
24690 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
246a0 5f 50 52 49 4e 54 46 28 22 54 6f 6b 65 6e 20 69 _PRINTF("Token i
246b0 73 20 6c 6f 63 6b 65 64 20 6f 72 20 74 68 69 73 s locked or this
246c0 20 63 68 61 6e 67 65 20 69 73 20 6e 6f 74 20 70 change is not p
246d0 65 72 6d 69 74 74 65 64 2e 22 29 3b 0a 0a 09 09 ermitted.");....
246e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f .return(CKR_PIN_
246f0 4c 4f 43 4b 45 44 29 3b 0a 09 09 64 65 66 61 75 LOCKED);...defau
24700 6c 74 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 lt:....CACKEY_DE
24710 42 55 47 5f 50 52 49 4e 54 46 28 22 53 6f 6d 65 BUG_PRINTF("Some
24720 74 68 69 6e 67 20 65 6c 73 65 20 77 65 6e 74 20 thing else went
24730 77 72 6f 6e 67 20 63 68 61 6e 67 69 6e 67 20 74 wrong changing t
24740 68 65 20 50 49 4e 3a 20 25 69 22 2c 20 73 65 74 he PIN: %i", set
24750 5f 70 69 6e 5f 72 65 74 29 3b 0a 0a 09 09 09 72 _pin_ret);.....r
24760 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 eturn(CKR_GENERA
24770 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 72 L_ERROR);..}...r
24780 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 eturn(CKR_GENERA
24790 4c 5f 45 52 52 4f 52 29 3b 0a 7d 0a 0a 43 4b 5f L_ERROR);.}..CK_
247a0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 DEFINE_FUNCTION(
247b0 43 4b 5f 52 56 2c 20 43 5f 4f 70 65 6e 53 65 73 CK_RV, C_OpenSes
247c0 73 69 6f 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 sion)(CK_SLOT_ID
247d0 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 46 4c 41 47 slotID, CK_FLAG
247e0 53 20 66 6c 61 67 73 2c 20 43 4b 5f 56 4f 49 44 S flags, CK_VOID
247f0 5f 50 54 52 20 70 41 70 70 6c 69 63 61 74 69 6f _PTR pApplicatio
24800 6e 2c 20 43 4b 5f 4e 4f 54 49 46 59 20 6e 6f 74 n, CK_NOTIFY not
24810 69 66 79 2c 20 43 4b 5f 53 45 53 53 49 4f 4e 5f ify, CK_SESSION_
24820 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 53 65 73 HANDLE_PTR phSes
24830 73 69 6f 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65 sion) {..unsigne
24840 64 20 6c 6f 6e 67 20 69 64 78 3b 0a 09 69 6e 74 d long idx;..int
24850 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 mutex_retval;..
24860 69 6e 74 20 66 6f 75 6e 64 5f 73 65 73 73 69 6f int found_sessio
24870 6e 20 3d 20 30 3b 0a 0a 09 43 41 43 4b 45 59 5f n = 0;...CACKEY_
24880 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
24890 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 lled.");...if ((
248a0 66 6c 61 67 73 20 26 20 43 4b 46 5f 53 45 52 49 flags & CKF_SERI
248b0 41 4c 5f 53 45 53 53 49 4f 4e 29 20 21 3d 20 43 AL_SESSION) != C
248c0 4b 46 5f 53 45 52 49 41 4c 5f 53 45 53 53 49 4f KF_SERIAL_SESSIO
248d0 4e 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 4b N) {...return(CK
248e0 52 5f 53 45 53 53 49 4f 4e 5f 50 41 52 41 4c 4c R_SESSION_PARALL
248f0 45 4c 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 EL_NOT_SUPPORTED
24900 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 );..}...if (!cac
24910 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 key_initialized)
24920 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
24930 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
24940 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 Not initialize
24950 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
24960 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 CKR_CRYPTOKI_NOT
24970 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 _INITIALIZED);..
24980 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c }...if (slotID <
24990 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 0 || slotID >=
249a0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 (sizeof(cackey_s
249b0 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 lots) / sizeof(c
249c0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 ackey_slots[0]))
249d0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
249e0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
249f0 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 . Invalid slot r
24a00 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 equested (%lu),
24a10 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 outside of valid
24a20 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 range", slotID)
24a30 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
24a40 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 SLOT_ID_INVALID)
24a50 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 ;..}...mutex_ret
24a60 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 val = cackey_mut
24a70 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 ex_lock(cackey_b
24a80 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 iglock);..if (mu
24a90 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 tex_retval != 0)
24aa0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
24ab0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
24ac0 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 Locking failed
24ad0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
24ae0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 KR_GENERAL_ERROR
24af0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b );..}...if (cack
24b00 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d ey_slots[slotID]
24b10 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a .active == 0) {.
24b20 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
24b30 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e RINTF("Error. In
24b40 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 valid slot reque
24b50 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 sted (%lu), slot
24b60 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 not currently a
24b70 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b ctive", slotID);
24b80 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 ....cackey_mutex
24b90 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 _unlock(cackey_b
24ba0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 iglock);....retu
24bb0 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 rn(CKR_SLOT_ID_I
24bc0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 2f 2a NVALID);..}.../*
24bd0 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 Verify that the
24be0 20 63 61 72 64 20 69 73 20 61 63 74 75 61 6c 6c card is actuall
24bf0 79 20 69 6e 20 74 68 65 20 73 6c 6f 74 2e 20 2a y in the slot. *
24c00 2f 0a 09 2f 2a 20 58 58 58 3a 20 43 68 65 63 6b /../* XXX: Check
24c10 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 to make sure th
24c20 69 73 20 69 73 20 69 6e 20 74 68 65 20 50 4b 43 is is in the PKC
24c30 53 23 31 31 20 73 70 65 63 69 66 69 63 61 74 69 S#11 specificati
24c40 6f 6e 20 2a 2f 0a 09 69 66 20 28 63 61 63 6b 65 on */..if (cacke
24c50 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 y_token_present(
24c60 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c &cackey_slots[sl
24c70 6f 74 49 44 5d 29 20 21 3d 20 43 41 43 4b 45 59 otID]) != CACKEY
24c80 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 _PCSC_S_TOKENPRE
24c90 53 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 SENT) {...CACKEY
24ca0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
24cb0 72 72 6f 72 2e 20 20 43 61 72 64 20 6e 6f 74 20 rror. Card not
24cc0 70 72 65 73 65 6e 74 2e 20 20 52 65 74 75 72 6e present. Return
24cd0 69 6e 67 20 43 4b 52 5f 44 45 56 49 43 45 5f 52 ing CKR_DEVICE_R
24ce0 45 4d 4f 56 45 44 22 29 3b 0a 0a 09 09 63 61 63 EMOVED");....cac
24cf0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b key_mutex_unlock
24d00 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 (cackey_biglock)
24d10 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
24d20 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 29 3b DEVICE_REMOVED);
24d30 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d ..}...for (idx =
24d40 20 31 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 1; idx < (sizeo
24d50 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e f(cackey_session
24d60 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b s) / sizeof(cack
24d70 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 ey_sessions[0]))
24d80 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 ; idx++) {...if
24d90 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e (!cackey_session
24da0 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b s[idx].active) {
24db0 0a 09 09 09 66 6f 75 6e 64 5f 73 65 73 73 69 6f ....found_sessio
24dc0 6e 20 3d 20 31 3b 0a 0a 09 09 09 2a 70 68 53 65 n = 1;.....*phSe
24dd0 73 73 69 6f 6e 20 3d 20 69 64 78 3b 0a 0a 09 09 ssion = idx;....
24de0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 .cackey_sessions
24df0 5b 69 64 78 5d 2e 61 63 74 69 76 65 20 3d 20 31 [idx].active = 1
24e00 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 ;....cackey_sess
24e10 69 6f 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74 49 44 ions[idx].slotID
24e20 20 3d 20 73 6c 6f 74 49 44 3b 0a 09 09 09 63 61 = slotID;....ca
24e30 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 ckey_sessions[id
24e40 78 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 x].state = CKS_R
24e50 4f 5f 50 55 42 4c 49 43 5f 53 45 53 53 49 4f 4e O_PUBLIC_SESSION
24e60 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 ;....cackey_sess
24e70 69 6f 6e 73 5b 69 64 78 5d 2e 66 6c 61 67 73 20 ions[idx].flags
24e80 3d 20 66 6c 61 67 73 3b 0a 09 09 09 63 61 63 6b = flags;....cack
24e90 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d ey_sessions[idx]
24ea0 2e 75 6c 44 65 76 69 63 65 45 72 72 6f 72 20 3d .ulDeviceError =
24eb0 20 30 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 0;....cackey_se
24ec0 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 70 41 70 70 ssions[idx].pApp
24ed0 6c 69 63 61 74 69 6f 6e 20 3d 20 70 41 70 70 6c lication = pAppl
24ee0 69 63 61 74 69 6f 6e 3b 0a 09 09 09 63 61 63 6b ication;....cack
24ef0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d ey_sessions[idx]
24f00 2e 4e 6f 74 69 66 79 20 3d 20 6e 6f 74 69 66 79 .Notify = notify
24f10 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 ;.....cackey_ses
24f20 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 sions[idx].ident
24f30 69 74 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 ities = NULL;...
24f40 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 .cackey_sessions
24f50 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 [idx].identities
24f60 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 09 _count = 0;.....
24f70 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
24f80 69 64 78 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 idx].search_acti
24f90 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b ve = 0;.....cack
24fa0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d ey_sessions[idx]
24fb0 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 30 .sign_active = 0
24fc0 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 ;.....cackey_ses
24fd0 73 69 6f 6e 73 5b 69 64 78 5d 2e 64 65 63 72 79 sions[idx].decry
24fe0 70 74 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a pt_active = 0;..
24ff0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f ...cackey_sessio
25000 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 ns[idx].identiti
25010 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 es = cackey_read
25020 5f 69 64 65 6e 74 69 74 69 65 73 28 26 63 61 63 _identities(&cac
25030 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 key_slots[slotID
25040 5d 2c 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 ], &cackey_sessi
25050 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 ons[idx].identit
25060 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 0a 09 09 ies_count);.....
25070 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a .break;...}..}..
25080 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 .mutex_retval =
25090 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c cackey_mutex_unl
250a0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
250b0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f ck);..if (mutex_
250c0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 retval != 0) {..
250d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
250e0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e INTF("Error. Un
250f0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 locking failed."
25100 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
25110 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b _GENERAL_ERROR);
25120 0a 09 7d 0a 0a 09 69 66 20 28 21 66 6f 75 6e 64 ..}...if (!found
25130 5f 73 65 73 73 69 6f 6e 29 20 7b 0a 09 09 43 41 _session) {...CA
25140 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
25150 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 F("Returning CKR
25160 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 20 28 _SESSION_COUNT (
25170 25 69 29 22 2c 20 43 4b 52 5f 53 45 53 53 49 4f %i)", CKR_SESSIO
25180 4e 5f 43 4f 55 4e 54 29 3b 0a 0a 09 09 72 65 74 N_COUNT);....ret
25190 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f urn(CKR_SESSION_
251a0 43 4f 55 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41 43 COUNT);..}...CAC
251b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
251c0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f ("Returning CKR_
251d0 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b OK (%i)", CKR_OK
251e0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f );...return(CKR_
251f0 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e OK);.}..CK_DEFIN
25200 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 E_FUNCTION(CK_RV
25210 2c 20 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e , C_CloseSession
25220 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e )(CK_SESSION_HAN
25230 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a DLE hSession) {.
25240 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 .int mutex_retva
25250 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 l;...CACKEY_DEBU
25260 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 G_PRINTF("Called
25270 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b .");...if (!cack
25280 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 ey_initialized)
25290 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
252a0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
252b0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 Not initialized
252c0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
252d0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f KR_CRYPTOKI_NOT_
252e0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d INITIALIZED);..}
252f0 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 ...if (hSession
25300 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e == 0 || hSession
25310 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b >= (sizeof(cack
25320 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 ey_sessions) / s
25330 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 izeof(cackey_ses
25340 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 sions[0]))) {...
25350 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
25360 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 NTF("Error. Ses
25370 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 sion out of rang
25380 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 e.");......retur
25390 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 n(CKR_SESSION_HA
253a0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 NDLE_INVALID);..
253b0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c }...mutex_retval
253c0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f = cackey_mutex_
253d0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
253e0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 ock);..if (mutex
253f0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a _retval != 0) {.
25400 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
25410 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c RINTF("Error. L
25420 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 ocking failed.")
25430 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
25440 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a GENERAL_ERROR);.
25450 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 .}...if (!cackey
25460 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
25470 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 on].active) {...
25480 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c cackey_mutex_unl
25490 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
254a0 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 ck);....CACKEY_D
254b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
254c0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 or. Session not
254d0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 active.");.....
254e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 .return(CKR_SESS
254f0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c ION_HANDLE_INVAL
25500 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 ID);..}...cackey
25510 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
25520 6f 6e 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a on].active = 0;.
25530 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 69 64 65 .cackey_free_ide
25540 6e 74 69 74 69 65 73 28 63 61 63 6b 65 79 5f 73 ntities(cackey_s
25550 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
25560 5d 2e 69 64 65 6e 74 69 74 69 65 73 2c 20 63 61 ].identities, ca
25570 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
25580 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 ession].identiti
25590 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 6d 75 74 es_count);...mut
255a0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b ex_retval = cack
255b0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 ey_mutex_unlock(
255c0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
255d0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 ..if (mutex_retv
255e0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 al != 0) {...CAC
255f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
25600 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b ("Error. Unlock
25610 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a ing failed.");..
25620 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e ..return(CKR_GEN
25630 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a ERAL_ERROR);..}.
25640 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
25650 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
25660 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 CKR_OK (%i)", C
25670 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e KR_OK);...return
25680 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f (CKR_OK);.}..CK_
25690 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 DEFINE_FUNCTION(
256a0 43 4b 5f 52 56 2c 20 43 5f 43 6c 6f 73 65 41 6c CK_RV, C_CloseAl
256b0 6c 53 65 73 73 69 6f 6e 73 29 28 43 4b 5f 53 4c lSessions)(CK_SL
256c0 4f 54 5f 49 44 20 73 6c 6f 74 49 44 29 20 7b 0a OT_ID slotID) {.
256d0 09 75 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 09 .uint32_t idx;..
256e0 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c int mutex_retval
256f0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ;...CACKEY_DEBUG
25700 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
25710 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ");...if (!cacke
25720 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b y_initialized) {
25730 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
25740 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
25750 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e Not initialized.
25760 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
25770 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 R_CRYPTOKI_NOT_I
25780 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
25790 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 ..if (slotID < 0
257a0 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 || slotID >= (s
257b0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f izeof(cackey_slo
257c0 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 ts) / sizeof(cac
257d0 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 key_slots[0])))
257e0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
257f0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
25800 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 Invalid slot req
25810 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 uested (%lu), ou
25820 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 tside of valid r
25830 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a ange", slotID);.
25840 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c ...return(CKR_SL
25850 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a OT_ID_INVALID);.
25860 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 .}...mutex_retva
25870 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 l = cackey_mutex
25880 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 _lock(cackey_big
25890 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 lock);..if (mute
258a0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b x_retval != 0) {
258b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
258c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
258d0 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 Locking failed."
258e0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
258f0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b _GENERAL_ERROR);
25900 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 ..}...if (cackey
25910 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 _slots[slotID].a
25920 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 ctive == 0) {...
25930 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
25940 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 NTF("Error. Inva
25950 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 lid slot request
25960 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e ed (%lu), slot n
25970 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 ot currently act
25980 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a ive", slotID);..
25990 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 ..cackey_mutex_u
259a0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 nlock(cackey_big
259b0 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e lock);....return
259c0 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 (CKR_SLOT_ID_INV
259d0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 ALID);..}...for
259e0 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 (idx = 0; idx <
259f0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 (sizeof(cackey_s
25a00 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f essions) / sizeo
25a10 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e f(cackey_session
25a20 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b s[0])); idx++) {
25a30 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 ...if (cackey_se
25a40 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 ssions[idx].acti
25a50 76 65 29 20 7b 0a 09 09 09 69 66 20 28 63 61 63 ve) {....if (cac
25a60 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 key_sessions[idx
25a70 5d 2e 73 6c 6f 74 49 44 20 21 3d 20 73 6c 6f 74 ].slotID != slot
25a80 49 44 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e ID) {.....contin
25a90 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 ue;....}.....cac
25aa0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b key_mutex_unlock
25ab0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 (cackey_biglock)
25ac0 3b 0a 09 09 09 43 5f 43 6c 6f 73 65 53 65 73 73 ;....C_CloseSess
25ad0 69 6f 6e 28 69 64 78 29 3b 0a 09 09 09 63 61 63 ion(idx);....cac
25ae0 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 key_mutex_lock(c
25af0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
25b00 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 ..}..}...mutex_r
25b10 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d etval = cackey_m
25b20 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b utex_unlock(cack
25b30 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 ey_biglock);..if
25b40 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 (mutex_retval !
25b50 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f = 0) {...CACKEY_
25b60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
25b70 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 ror. Unlocking
25b80 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 failed.");....re
25b90 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c turn(CKR_GENERAL
25ba0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 _ERROR);..}...CA
25bb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
25bc0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 F("Returning CKR
25bd0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f _OK (%i)", CKR_O
25be0 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 K);...return(CKR
25bf0 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 _OK);.}..CK_DEFI
25c00 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 NE_FUNCTION(CK_R
25c10 56 2c 20 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 V, C_GetSessionI
25c20 6e 66 6f 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f nfo)(CK_SESSION_
25c30 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c HANDLE hSession,
25c40 20 43 4b 5f 53 45 53 53 49 4f 4e 5f 49 4e 46 4f CK_SESSION_INFO
25c50 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 69 _PTR pInfo) {..i
25c60 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b nt mutex_retval;
25c70 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
25c80 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
25c90 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d );...if (pInfo =
25ca0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b = NULL) {...CACK
25cb0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
25cc0 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 "Error. pInfo is
25cd0 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 NULL.");....ret
25ce0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 urn(CKR_ARGUMENT
25cf0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 S_BAD);..}...if
25d00 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c (!cackey_initial
25d10 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 ized) {...CACKEY
25d20 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
25d30 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 rror. Not initi
25d40 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 alized.");....re
25d50 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b turn(CKR_CRYPTOK
25d60 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 I_NOT_INITIALIZE
25d70 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 D);..}...if (hSe
25d80 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 ssion == 0 || hS
25d90 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f ession >= (sizeo
25da0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e f(cackey_session
25db0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b s) / sizeof(cack
25dc0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 ey_sessions[0]))
25dd0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
25de0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
25df0 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f . Session out o
25e00 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 f range.");.....
25e10 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 .return(CKR_SESS
25e20 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c ION_HANDLE_INVAL
25e30 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f ID);..}...mutex_
25e40 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f retval = cackey_
25e50 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 mutex_lock(cacke
25e60 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 y_biglock);..if
25e70 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d (mutex_retval !=
25e80 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 0) {...CACKEY_D
25e90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
25ea0 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 or. Locking fai
25eb0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 led.");....retur
25ec0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 n(CKR_GENERAL_ER
25ed0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 ROR);..}...if (!
25ee0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
25ef0 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 hSession].active
25f00 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 ) {...cackey_mut
25f10 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 ex_unlock(cackey
25f20 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 _biglock);....CA
25f30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
25f40 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 F("Error. Sessi
25f50 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 on not active.")
25f60 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b ;......return(CK
25f70 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 R_SESSION_HANDLE
25f80 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 _INVALID);..}...
25f90 70 49 6e 66 6f 2d 3e 73 6c 6f 74 49 44 20 3d 20 pInfo->slotID =
25fa0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
25fb0 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 hSession].slotID
25fc0 3b 0a 09 70 49 6e 66 6f 2d 3e 73 74 61 74 65 20 ;..pInfo->state
25fd0 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e = cackey_session
25fe0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74 s[hSession].stat
25ff0 65 3b 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 e;..pInfo->flags
26000 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f = cackey_sessio
26010 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 66 6c 61 ns[hSession].fla
26020 67 73 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 44 65 gs;..pInfo->ulDe
26030 76 69 63 65 45 72 72 6f 72 20 3d 20 63 61 63 6b viceError = cack
26040 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
26050 73 69 6f 6e 5d 2e 75 6c 44 65 76 69 63 65 45 72 sion].ulDeviceEr
26060 72 6f 72 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 ror;...mutex_ret
26070 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 val = cackey_mut
26080 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 ex_unlock(cackey
26090 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 _biglock);..if (
260a0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 mutex_retval !=
260b0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 0) {...CACKEY_DE
260c0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
260d0 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 r. Unlocking fa
260e0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 iled.");....retu
260f0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 rn(CKR_GENERAL_E
26100 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b RROR);..}...CACK
26110 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
26120 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f "Returning CKR_O
26130 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 K (%i)", CKR_OK)
26140 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f ;...return(CKR_O
26150 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 K);.}..CK_DEFINE
26160 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c _FUNCTION(CK_RV,
26170 20 43 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e 53 C_GetOperationS
26180 74 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e tate)(CK_SESSION
26190 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e _HANDLE hSession
261a0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4f , CK_BYTE_PTR pO
261b0 70 65 72 61 74 69 6f 6e 53 74 61 74 65 2c 20 43 perationState, C
261c0 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4f K_ULONG_PTR pulO
261d0 70 65 72 61 74 69 6f 6e 53 74 61 74 65 4c 65 6e perationStateLen
261e0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 ) {..CACKEY_DEBU
261f0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 G_PRINTF("Called
26200 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b .");...if (!cack
26210 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 ey_initialized)
26220 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
26230 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
26240 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 Not initialized
26250 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
26260 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f KR_CRYPTOKI_NOT_
26270 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d INITIALIZED);..}
26280 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
26290 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e PRINTF("Returnin
262a0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e g CKR_FUNCTION_N
262b0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 OT_SUPPORTED (%i
262c0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e )", CKR_FUNCTION
262d0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
262e0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 ...return(CKR_FU
262f0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
26300 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 RTED);.}..CK_DEF
26310 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f INE_FUNCTION(CK_
26320 52 56 2c 20 43 5f 53 65 74 4f 70 65 72 61 74 69 RV, C_SetOperati
26330 6f 6e 53 74 61 74 65 29 28 43 4b 5f 53 45 53 53 onState)(CK_SESS
26340 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 ION_HANDLE hSess
26350 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 ion, CK_BYTE_PTR
26360 20 70 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 pOperationState
26370 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 70 65 , CK_ULONG ulOpe
26380 72 61 74 69 6f 6e 53 74 61 74 65 4c 65 6e 2c 20 rationStateLen,
26390 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 CK_OBJECT_HANDLE
263a0 20 68 45 6e 63 72 79 70 74 69 6f 6e 4b 65 79 2c hEncryptionKey,
263b0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c CK_OBJECT_HANDL
263c0 45 20 68 41 75 74 68 65 6e 74 69 63 61 74 69 6f E hAuthenticatio
263d0 6e 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f nKey) {..CACKEY_
263e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
263f0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 lled.");...if (!
26400 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a cackey_initializ
26410 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...CACKEY_D
26420 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
26430 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c or. Not initial
26440 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 ized.");....retu
26450 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f rn(CKR_CRYPTOKI_
26460 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 NOT_INITIALIZED)
26470 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ;..}...CACKEY_DE
26480 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
26490 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 rning CKR_FUNCTI
264a0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
264b0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 (%i)", CKR_FUNC
264c0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
264d0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b ED);...return(CK
264e0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
264f0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b UPPORTED);.}..CK
26500 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e _DEFINE_FUNCTION
26510 28 43 4b 5f 52 56 2c 20 5f 43 5f 4c 6f 67 69 6e (CK_RV, _C_Login
26520 4d 75 74 65 78 41 72 67 29 28 43 4b 5f 53 45 53 MutexArg)(CK_SES
26530 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 SION_HANDLE hSes
26540 73 69 6f 6e 2c 20 43 4b 5f 55 53 45 52 5f 54 59 sion, CK_USER_TY
26550 50 45 20 75 73 65 72 54 79 70 65 2c 20 43 4b 5f PE userType, CK_
26560 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 50 69 UTF8CHAR_PTR pPi
26570 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 n, CK_ULONG ulPi
26580 6e 4c 65 6e 2c 20 69 6e 74 20 6c 6f 63 6b 5f 6d nLen, int lock_m
26590 75 74 65 78 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 utex) {..CK_SLOT
265a0 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 63 61 63 _ID slotID;..cac
265b0 6b 65 79 5f 72 65 74 20 67 65 74 5f 70 69 6e 5f key_ret get_pin_
265c0 72 65 74 3b 0a 09 63 68 61 72 20 70 69 6e 62 75 ret;..char pinbu
265d0 66 5b 36 34 5d 3b 0a 09 69 6e 74 20 6d 75 74 65 f[64];..int mute
265e0 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 74 x_retval;..int t
265f0 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a ries_remaining;.
26600 09 69 6e 74 20 6c 6f 67 69 6e 5f 72 65 74 3b 0a .int login_ret;.
26610 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
26620 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
26630 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f ;...if (!cackey_
26640 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 initialized) {..
26650 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
26660 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f INTF("Error. No
26670 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 t initialized.")
26680 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
26690 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 CRYPTOKI_NOT_INI
266a0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 TIALIZED);..}...
266b0 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 if (hSession ==
266c0 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 0 || hSession >=
266d0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f (sizeof(cackey_
266e0 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 sessions) / size
266f0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f of(cackey_sessio
26700 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 ns[0]))) {...CAC
26710 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
26720 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f ("Error. Sessio
26730 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 n out of range."
26740 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 );......return(C
26750 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c KR_SESSION_HANDL
26760 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a E_INVALID);..}..
26770 09 69 66 20 28 75 73 65 72 54 79 70 65 20 21 3d .if (userType !=
26780 20 43 4b 55 5f 55 53 45 52 29 20 7b 0a 09 09 43 CKU_USER) {...C
26790 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
267a0 54 46 28 22 45 72 72 6f 72 2e 20 20 57 65 20 6f TF("Error. We o
267b0 6e 6c 79 20 73 75 70 70 6f 72 74 20 55 53 45 52 nly support USER
267c0 20 6d 6f 64 65 2c 20 61 73 6b 65 64 20 66 6f 72 mode, asked for
267d0 20 25 6c 75 20 6d 6f 64 65 2e 22 2c 20 28 75 6e %lu mode.", (un
267e0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 73 65 signed long) use
267f0 72 54 79 70 65 29 0a 0a 09 09 72 65 74 75 72 6e rType)....return
26800 28 43 4b 52 5f 55 53 45 52 5f 54 59 50 45 5f 49 (CKR_USER_TYPE_I
26810 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 NVALID);..}...if
26820 20 28 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a (lock_mutex) {.
26830 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d ..mutex_retval =
26840 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f cackey_mutex_lo
26850 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
26860 6b 29 3b 0a 09 09 69 66 20 28 6d 75 74 65 78 5f k);...if (mutex_
26870 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 retval != 0) {..
26880 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
26890 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c RINTF("Error. L
268a0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 ocking failed.")
268b0 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 ;.....return(CKR
268c0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b _GENERAL_ERROR);
268d0 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 21 63 ...}..}...if (!c
268e0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
268f0 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 Session].active)
26900 20 7b 0a 09 09 69 66 20 28 6c 6f 63 6b 5f 6d 75 {...if (lock_mu
26910 74 65 78 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 tex) {....cackey
26920 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 _mutex_unlock(ca
26930 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 ckey_biglock);..
26940 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 .}....CACKEY_DEB
26950 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
26960 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 . Session not a
26970 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 ctive.");......r
26980 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f eturn(CKR_SESSIO
26990 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 N_HANDLE_INVALID
269a0 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d );..}...slotID =
269b0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 cackey_sessions
269c0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 [hSession].slotI
269d0 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 D;...if (slotID
269e0 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d < 0 || slotID >=
269f0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f (sizeof(cackey_
26a00 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 slots) / sizeof(
26a10 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 cackey_slots[0])
26a20 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 )) {...CACKEY_DE
26a30 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
26a40 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 r. Invalid slot
26a50 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c requested (%lu),
26a60 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 outside of vali
26a70 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 d range", slotID
26a80 29 3b 0a 0a 09 09 69 66 20 28 6c 6f 63 6b 5f 6d );....if (lock_m
26a90 75 74 65 78 29 20 7b 0a 09 09 09 63 61 63 6b 65 utex) {....cacke
26aa0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
26ab0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
26ac0 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ..}....return(CK
26ad0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 R_GENERAL_ERROR)
26ae0 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 ;..}...if (cacke
26af0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e y_slots[slotID].
26b00 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 active == 0) {..
26b10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
26b20 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 INTF("Error. Inv
26b30 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 alid slot reques
26b40 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 ted (%lu), slot
26b50 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 not currently ac
26b60 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a tive", slotID);.
26b70 0a 09 09 69 66 20 28 6c 6f 63 6b 5f 6d 75 74 65 ...if (lock_mute
26b80 78 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 6d x) {....cackey_m
26b90 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b utex_unlock(cack
26ba0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d ey_biglock);...}
26bb0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 ....return(CKR_G
26bc0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 ENERAL_ERROR);..
26bd0 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70 }...if (cackey_p
26be0 69 6e 5f 63 6f 6d 6d 61 6e 64 20 21 3d 20 4e 55 in_command != NU
26bf0 4c 4c 29 20 7b 0a 09 09 69 66 20 28 70 50 69 6e LL) {...if (pPin
26c00 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 43 != NULL) {....C
26c10 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
26c20 54 46 28 22 50 72 6f 74 65 63 74 65 64 20 61 75 TF("Protected au
26c30 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 70 61 74 thentication pat
26c40 68 20 69 6e 20 65 66 66 65 63 74 20 61 6e 64 20 h in effect and
26c50 50 49 4e 20 70 72 6f 76 69 64 65 64 20 21 3f 22 PIN provided !?"
26c60 29 3b 0a 09 09 7d 0a 0a 09 09 67 65 74 5f 70 69 );...}....get_pi
26c70 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 67 n_ret = cackey_g
26c80 65 74 5f 70 69 6e 28 70 69 6e 62 75 66 29 3b 0a et_pin(pinbuf);.
26c90 0a 09 09 69 66 20 28 67 65 74 5f 70 69 6e 5f 72 ...if (get_pin_r
26ca0 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 et != CACKEY_PCS
26cb0 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 C_S_OK) {....CAC
26cc0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
26cd0 28 22 63 61 63 6b 65 79 5f 67 65 74 5f 70 69 6e ("cackey_get_pin
26ce0 28 29 20 72 65 74 75 72 6e 65 64 20 69 6e 20 66 () returned in f
26cf0 61 69 6c 75 72 65 2c 20 61 73 73 75 6d 69 6e 67 ailure, assuming
26d00 20 74 68 65 20 50 49 4e 20 77 61 73 20 69 6e 63 the PIN was inc
26d10 6f 72 72 65 63 74 2e 22 29 3b 0a 0a 09 09 09 69 orrect.");.....i
26d20 66 20 28 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b f (lock_mutex) {
26d30 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 .....cackey_mute
26d40 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
26d50 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 7d 0a 0a biglock);....}..
26d60 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 ...return(CKR_PI
26d70 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a 09 09 N_INCORRECT);...
26d80 7d 0a 0a 09 09 70 50 69 6e 20 3d 20 28 43 4b 5f }....pPin = (CK_
26d90 55 54 46 38 43 48 41 52 5f 50 54 52 29 20 70 69 UTF8CHAR_PTR) pi
26da0 6e 62 75 66 3b 0a 09 09 75 6c 50 69 6e 4c 65 6e nbuf;...ulPinLen
26db0 20 3d 20 73 74 72 6c 65 6e 28 70 69 6e 62 75 66 = strlen(pinbuf
26dc0 29 3b 0a 09 7d 0a 0a 09 6c 6f 67 69 6e 5f 72 65 );..}...login_re
26dd0 74 20 3d 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e t = cackey_login
26de0 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 (&cackey_slots[s
26df0 6c 6f 74 49 44 5d 2c 20 70 50 69 6e 2c 20 75 6c lotID], pPin, ul
26e00 50 69 6e 4c 65 6e 2c 20 26 74 72 69 65 73 5f 72 PinLen, &tries_r
26e10 65 6d 61 69 6e 69 6e 67 2c 20 33 29 3b 0a 09 69 emaining, 3);..i
26e20 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20 21 3d 20 f (login_ret !=
26e30 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b CACKEY_PCSC_S_OK
26e40 29 20 7b 0a 09 09 69 66 20 28 6c 6f 63 6b 5f 6d ) {...if (lock_m
26e50 75 74 65 78 29 20 7b 0a 09 09 09 63 61 63 6b 65 utex) {....cacke
26e60 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
26e70 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
26e80 09 09 7d 0a 0a 09 09 69 66 20 28 6c 6f 67 69 6e ..}....if (login
26e90 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 _ret == CACKEY_P
26ea0 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 29 20 7b 0a CSC_E_LOCKED) {.
26eb0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
26ec0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
26ed0 54 6f 6b 65 6e 20 69 73 20 6c 6f 63 6b 65 64 2e Token is locked.
26ee0 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 ");.....cackey_s
26ef0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b lots[slotID].tok
26f00 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f en_flags |= CKF_
26f10 55 53 45 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 3b USER_PIN_LOCKED;
26f20 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
26f30 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
26f40 69 6e 67 20 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b ing CKR_PIN_LOCK
26f50 45 44 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20 ED (%i)", (int)
26f60 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 29 3b CKR_PIN_LOCKED);
26f70 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f .....return(CKR_
26f80 50 49 4e 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d PIN_LOCKED);...}
26f90 20 65 6c 73 65 20 69 66 20 28 6c 6f 67 69 6e 5f else if (login_
26fa0 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 ret == CACKEY_PC
26fb0 53 43 5f 45 5f 42 41 44 50 49 4e 29 20 7b 0a 09 SC_E_BADPIN) {..
26fc0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
26fd0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 49 RINTF("Error. I
26fe0 6e 76 61 6c 69 64 20 50 49 4e 2e 22 29 3b 0a 0a nvalid PIN.");..
26ff0 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b ...cackey_slots[
27000 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c slotID].token_fl
27010 61 67 73 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f ags |= CKF_USER_
27020 50 49 4e 5f 43 4f 55 4e 54 5f 4c 4f 57 3b 0a 0a PIN_COUNT_LOW;..
27030 09 09 09 69 66 20 28 74 72 69 65 73 5f 72 65 6d ...if (tries_rem
27040 61 69 6e 69 6e 67 20 3d 3d 20 31 29 20 7b 0a 09 aining == 1) {..
27050 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b ...cackey_slots[
27060 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c slotID].token_fl
27070 61 67 73 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f ags |= CKF_USER_
27080 50 49 4e 5f 46 49 4e 41 4c 5f 54 52 59 3b 0a 09 PIN_FINAL_TRY;..
27090 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 ..}.....CACKEY_D
270a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
270b0 75 72 6e 69 6e 67 20 43 4b 52 5f 50 49 4e 5f 49 urning CKR_PIN_I
270c0 4e 43 4f 52 52 45 43 54 20 28 25 69 29 22 2c 20 NCORRECT (%i)",
270d0 28 69 6e 74 29 20 43 4b 52 5f 50 49 4e 5f 49 4e (int) CKR_PIN_IN
270e0 43 4f 52 52 45 43 54 29 3b 0a 0a 09 09 09 72 65 CORRECT);.....re
270f0 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 turn(CKR_PIN_INC
27100 4f 52 52 45 43 54 29 3b 0a 09 09 7d 0a 0a 09 09 ORRECT);...}....
27110 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
27120 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6b NTF("Error. Unk
27130 6e 6f 77 6e 20 65 72 72 6f 72 20 72 65 74 75 72 nown error retur
27140 6e 65 64 20 66 72 6f 6d 20 63 61 63 6b 65 79 5f ned from cackey_
27150 6c 6f 67 69 6e 28 29 20 28 25 69 29 22 2c 20 6c login() (%i)", l
27160 6f 67 69 6e 5f 72 65 74 29 3b 0a 0a 09 09 72 65 ogin_ret);....re
27170 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c turn(CKR_GENERAL
27180 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 63 61 _ERROR);..}...ca
27190 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 ckey_slots[slotI
271a0 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 26 D].token_flags &
271b0 3d 20 7e 28 43 4b 46 5f 55 53 45 52 5f 50 49 4e = ~(CKF_USER_PIN
271c0 5f 4c 4f 43 4b 45 44 20 7c 20 43 4b 46 5f 55 53 _LOCKED | CKF_US
271d0 45 52 5f 50 49 4e 5f 43 4f 55 4e 54 5f 4c 4f 57 ER_PIN_COUNT_LOW
271e0 20 7c 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 | CKF_LOGIN_REQ
271f0 55 49 52 45 44 20 7c 20 43 4b 46 5f 55 53 45 52 UIRED | CKF_USER
27200 5f 50 49 4e 5f 46 49 4e 41 4c 5f 54 52 59 29 3b _PIN_FINAL_TRY);
27210 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f ...cackey_sessio
27220 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61 ns[hSession].sta
27230 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 55 53 45 52 te = CKS_RO_USER
27240 5f 46 55 4e 43 54 49 4f 4e 53 3b 0a 0a 09 69 66 _FUNCTIONS;...if
27250 20 28 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a (lock_mutex) {.
27260 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d ..mutex_retval =
27270 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e cackey_mutex_un
27280 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
27290 6f 63 6b 29 3b 0a 09 09 69 66 20 28 6d 75 74 65 ock);...if (mute
272a0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b x_retval != 0) {
272b0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
272c0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
272d0 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 Unlocking faile
272e0 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e d.");.....return
272f0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 (CKR_GENERAL_ERR
27300 4f 52 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 OR);...}..}...CA
27310 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
27320 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 F("Returning CKR
27330 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f _OK (%i)", CKR_O
27340 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 K);...return(CKR
27350 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 _OK);.}..CK_DEFI
27360 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 NE_FUNCTION(CK_R
27370 56 2c 20 43 5f 4c 6f 67 69 6e 29 28 43 4b 5f 53 V, C_Login)(CK_S
27380 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 ESSION_HANDLE hS
27390 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 53 45 52 5f ession, CK_USER_
273a0 54 59 50 45 20 75 73 65 72 54 79 70 65 2c 20 43 TYPE userType, C
273b0 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 K_UTF8CHAR_PTR p
273c0 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c Pin, CK_ULONG ul
273d0 50 69 6e 4c 65 6e 29 20 7b 0a 09 72 65 74 75 72 PinLen) {..retur
273e0 6e 28 5f 43 5f 4c 6f 67 69 6e 4d 75 74 65 78 41 n(_C_LoginMutexA
273f0 72 67 28 68 53 65 73 73 69 6f 6e 2c 20 75 73 65 rg(hSession, use
27400 72 54 79 70 65 2c 20 70 50 69 6e 2c 20 75 6c 50 rType, pPin, ulP
27410 69 6e 4c 65 6e 2c 20 31 29 29 3b 0a 7d 0a 0a 43 inLen, 1));.}..C
27420 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f K_DEFINE_FUNCTIO
27430 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67 6f 75 N(CK_RV, C_Logou
27440 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 t)(CK_SESSION_HA
27450 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b NDLE hSession) {
27460 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f ..CK_SLOT_ID slo
27470 74 49 44 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f tID;..int mutex_
27480 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 retval;...CACKEY
27490 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 _DEBUG_PRINTF("C
274a0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 alled.");...if (
274b0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 !cackey_initiali
274c0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f zed) {...CACKEY_
274d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
274e0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 ror. Not initia
274f0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 lized.");....ret
27500 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 urn(CKR_CRYPTOKI
27510 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 _NOT_INITIALIZED
27520 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 );..}...if (hSes
27530 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 sion == 0 || hSe
27540 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 ssion >= (sizeof
27550 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 (cackey_sessions
27560 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 ) / sizeof(cacke
27570 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 y_sessions[0])))
27580 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
27590 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
275a0 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 Session out of
275b0 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 range.");......
275c0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 return(CKR_SESSI
275d0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 ON_HANDLE_INVALI
275e0 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 D);..}...mutex_r
275f0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d etval = cackey_m
27600 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 utex_lock(cackey
27610 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 _biglock);..if (
27620 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 mutex_retval !=
27630 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 0) {...CACKEY_DE
27640 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
27650 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c r. Locking fail
27660 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
27670 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 (CKR_GENERAL_ERR
27680 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 OR);..}...if (!c
27690 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
276a0 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 Session].active)
276b0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 {...cackey_mute
276c0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
276d0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 biglock);....CAC
276e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
276f0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f ("Error. Sessio
27700 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b n not active.");
27710 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 ......return(CKR
27720 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f _SESSION_HANDLE_
27730 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 INVALID);..}...s
27740 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 lotID = cackey_s
27750 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
27760 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 ].slotID;...if (
27770 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c slotID < 0 || sl
27780 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 otID >= (sizeof(
27790 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 cackey_slots) /
277a0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c sizeof(cackey_sl
277b0 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 ots[0]))) {...CA
277c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
277d0 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 F("Error. Invali
277e0 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 d slot requested
277f0 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 (%lu), outside
27800 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c of valid range",
27810 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 slotID);....ret
27820 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f urn(CKR_GENERAL_
27830 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 ERROR);..}...if
27840 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c (cackey_slots[sl
27850 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 otID].active ==
27860 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 0) {...CACKEY_DE
27870 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
27880 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 r. Invalid slot
27890 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c requested (%lu),
278a0 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e slot not curren
278b0 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f tly active", slo
278c0 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f tID);....cackey_
278d0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 mutex_unlock(cac
278e0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 key_biglock);...
278f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 .return(CKR_GENE
27900 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a RAL_ERROR);..}..
27910 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 .cackey_sessions
27920 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65 [hSession].state
27930 20 3d 20 43 4b 53 5f 52 4f 5f 50 55 42 4c 49 43 = CKS_RO_PUBLIC
27940 5f 53 45 53 53 49 4f 4e 3b 0a 0a 09 69 66 20 28 _SESSION;...if (
27950 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 cackey_pin_comma
27960 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 nd == NULL) {...
27970 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f cackey_slots[slo
27980 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 tID].token_flags
27990 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 = CKF_LOGIN_REQ
279a0 55 49 52 45 44 3b 0a 09 7d 20 65 6c 73 65 20 7b UIRED;..} else {
279b0 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b ...cackey_slots[
279c0 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c slotID].token_fl
279d0 61 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75 ags = 0;..}...mu
279e0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 tex_retval = cac
279f0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b key_mutex_unlock
27a00 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 (cackey_biglock)
27a10 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 ;..if (mutex_ret
27a20 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 val != 0) {...CA
27a30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
27a40 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 F("Error. Unloc
27a50 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a king failed.");.
27a60 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 ...return(CKR_GE
27a70 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d NERAL_ERROR);..}
27a80 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
27a90 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e PRINTF("Returnin
27aa0 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 g CKR_OK (%i)",
27ab0 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 CKR_OK);...retur
27ac0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b n(CKR_OK);.}..CK
27ad0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e _DEFINE_FUNCTION
27ae0 28 43 4b 5f 52 56 2c 20 43 5f 43 72 65 61 74 65 (CK_RV, C_Create
27af0 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45 53 53 49 Object)(CK_SESSI
27b00 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 ON_HANDLE hSessi
27b10 6f 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 on, CK_ATTRIBUTE
27b20 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 _PTR pTemplate,
27b30 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 CK_ULONG ulCount
27b40 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 , CK_OBJECT_HAND
27b50 4c 45 5f 50 54 52 20 70 68 4f 62 6a 65 63 74 29 LE_PTR phObject)
27b60 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {..CACKEY_DEBUG
27b70 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
27b80 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ");...if (!cacke
27b90 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b y_initialized) {
27ba0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
27bb0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
27bc0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e Not initialized.
27bd0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
27be0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 R_CRYPTOKI_NOT_I
27bf0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
27c00 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
27c10 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
27c20 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f CKR_FUNCTION_NO
27c30 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 T_SUPPORTED (%i)
27c40 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f ", CKR_FUNCTION_
27c50 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
27c60 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e ..return(CKR_FUN
27c70 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
27c80 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 TED);.}..CK_DEFI
27c90 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 NE_FUNCTION(CK_R
27ca0 56 2c 20 43 5f 43 6f 70 79 4f 62 6a 65 63 74 29 V, C_CopyObject)
27cb0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 (CK_SESSION_HAND
27cc0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f LE hSession, CK_
27cd0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f OBJECT_HANDLE hO
27ce0 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 42 bject, CK_ATTRIB
27cf0 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 UTE_PTR pTemplat
27d00 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f e, CK_ULONG ulCo
27d10 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 unt, CK_OBJECT_H
27d20 41 4e 44 4c 45 5f 50 54 52 20 70 68 4e 65 77 4f ANDLE_PTR phNewO
27d30 62 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b 45 59 bject) {..CACKEY
27d40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 _DEBUG_PRINTF("C
27d50 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 alled.");...if (
27d60 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 !cackey_initiali
27d70 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f zed) {...CACKEY_
27d80 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
27d90 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 ror. Not initia
27da0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 lized.");....ret
27db0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 urn(CKR_CRYPTOKI
27dc0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 _NOT_INITIALIZED
27dd0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 );..}...CACKEY_D
27de0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
27df0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 urning CKR_FUNCT
27e00 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
27e10 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e D (%i)", CKR_FUN
27e20 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
27e30 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 TED);...return(C
27e40 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
27e50 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 SUPPORTED);.}..C
27e60 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f K_DEFINE_FUNCTIO
27e70 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 73 74 72 N(CK_RV, C_Destr
27e80 6f 79 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45 53 oyObject)(CK_SES
27e90 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 SION_HANDLE hSes
27ea0 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f sion, CK_OBJECT_
27eb0 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 29 20 HANDLE hObject)
27ec0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f {..CACKEY_DEBUG_
27ed0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
27ee0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 );...if (!cackey
27ef0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
27f00 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
27f10 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e RINTF("Error. N
27f20 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 ot initialized."
27f30 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
27f40 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e _CRYPTOKI_NOT_IN
27f50 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
27f60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
27f70 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
27f80 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
27f90 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 _SUPPORTED (%i)"
27fa0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e , CKR_FUNCTION_N
27fb0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a OT_SUPPORTED);..
27fc0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 .return(CKR_FUNC
27fd0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
27fe0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e ED);.}..CK_DEFIN
27ff0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 E_FUNCTION(CK_RV
28000 2c 20 43 5f 47 65 74 4f 62 6a 65 63 74 53 69 7a , C_GetObjectSiz
28010 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 e)(CK_SESSION_HA
28020 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 NDLE hSession, C
28030 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 K_OBJECT_HANDLE
28040 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 55 4c 4f 4e hObject, CK_ULON
28050 47 5f 50 54 52 20 70 75 6c 53 69 7a 65 29 20 7b G_PTR pulSize) {
28060 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
28070 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
28080 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f ;...if (!cackey_
28090 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 initialized) {..
280a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
280b0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f INTF("Error. No
280c0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 t initialized.")
280d0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
280e0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 CRYPTOKI_NOT_INI
280f0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 TIALIZED);..}...
28100 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
28110 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 NTF("Returning C
28120 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
28130 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c SUPPORTED (%i)",
28140 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f CKR_FUNCTION_NO
28150 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 T_SUPPORTED);...
28160 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 return(CKR_FUNCT
28170 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
28180 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 D);.}..CK_DEFINE
28190 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c _FUNCTION(CK_RV,
281a0 20 43 5f 47 65 74 41 74 74 72 69 62 75 74 65 56 C_GetAttributeV
281b0 61 6c 75 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e alue)(CK_SESSION
281c0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e _HANDLE hSession
281d0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 , CK_OBJECT_HAND
281e0 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 LE hObject, CK_A
281f0 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 TTRIBUTE_PTR pTe
28200 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 mplate, CK_ULONG
28210 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f ulCount) {..CK_
28220 41 54 54 52 49 42 55 54 45 20 2a 63 75 72 72 5f ATTRIBUTE *curr_
28230 61 74 74 72 3b 0a 09 73 74 72 75 63 74 20 63 61 attr;..struct ca
28240 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 ckey_identity *i
28250 64 65 6e 74 69 74 79 3b 0a 09 75 6e 73 69 67 6e dentity;..unsign
28260 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 79 ed long identity
28270 5f 69 64 78 2c 20 61 74 74 72 5f 69 64 78 2c 20 _idx, attr_idx,
28280 73 65 73 73 5f 61 74 74 72 5f 69 64 78 2c 20 6e sess_attr_idx, n
28290 75 6d 5f 69 64 73 3b 0a 09 69 6e 74 20 6d 75 74 um_ids;..int mut
282a0 65 78 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 ex_retval;..CK_R
282b0 56 20 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f V retval = CKR_O
282c0 4b 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 K;..CK_VOID_PTR
282d0 70 56 61 6c 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e pValue;..CK_ULON
282e0 47 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 G ulValueLen;...
282f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
28300 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a NTF("Called.");.
28310 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e ..if (!cackey_in
28320 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 itialized) {...C
28330 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
28340 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 TF("Error. Not
28350 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a initialized.");.
28360 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 ...return(CKR_CR
28370 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 YPTOKI_NOT_INITI
28380 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 ALIZED);..}...if
28390 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 (hSession == 0
283a0 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 || hSession >= (
283b0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 sizeof(cackey_se
283c0 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 ssions) / sizeof
283d0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 (cackey_sessions
283e0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 [0]))) {...CACKE
283f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
28400 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 Error. Session
28410 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b out of range.");
28420 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 ......return(CKR
28430 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f _SESSION_HANDLE_
28440 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 INVALID);..}...i
28450 66 20 28 68 4f 62 6a 65 63 74 20 3d 3d 20 30 29 f (hObject == 0)
28460 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
28470 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
28480 20 20 4f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 Object handle
28490 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b out of range.");
284a0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 ......return(CKR
284b0 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 49 _OBJECT_HANDLE_I
284c0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 NVALID);..}...if
284d0 20 28 75 6c 43 6f 75 6e 74 20 3d 3d 20 30 29 20 (ulCount == 0)
284e0 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 {.../* Short cir
284f0 63 75 69 74 2c 20 69 66 20 7a 65 72 6f 20 6f 62 cuit, if zero ob
28500 6a 65 63 74 73 20 77 65 72 65 20 73 70 65 63 69 jects were speci
28510 66 69 65 64 20 72 65 74 75 72 6e 20 7a 65 72 6f fied return zero
28520 20 69 74 65 6d 73 20 69 6d 6d 65 64 69 61 74 65 items immediate
28530 6c 79 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 ly */...CACKEY_D
28540 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
28550 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 urning CKR_OK (%
28560 69 29 20 28 73 68 6f 72 74 20 63 69 72 63 75 69 i) (short circui
28570 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 t)", CKR_OK);...
28580 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b .return(CKR_OK);
28590 0a 09 7d 0a 0a 09 69 66 20 28 70 54 65 6d 70 6c ..}...if (pTempl
285a0 61 74 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ate == NULL) {..
285b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
285c0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70 54 INTF("Error. pT
285d0 65 6d 70 6c 61 74 65 20 69 73 20 4e 55 4c 4c 2e emplate is NULL.
285e0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
285f0 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 R_ARGUMENTS_BAD)
28600 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74 69 74 79 5f ;..}...identity_
28610 69 64 78 20 3d 20 68 4f 62 6a 65 63 74 20 2d 20 idx = hObject -
28620 31 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 1;...mutex_retva
28630 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 l = cackey_mutex
28640 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 _lock(cackey_big
28650 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 lock);..if (mute
28660 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b x_retval != 0) {
28670 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
28680 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
28690 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 Locking failed."
286a0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
286b0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b _GENERAL_ERROR);
286c0 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ..}...if (!cacke
286d0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
286e0 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 ion].active) {..
286f0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e .cackey_mutex_un
28700 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
28710 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f ock);....CACKEY_
28720 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
28730 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f ror. Session no
28740 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a t active.");....
28750 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 ..return(CKR_SES
28760 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 SION_HANDLE_INVA
28770 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6e 75 6d 5f 69 LID);..}...num_i
28780 64 73 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 ds = cackey_sess
28790 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 ions[hSession].i
287a0 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b dentities_count;
287b0 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79 5f ...if (identity_
287c0 69 64 78 20 3e 3d 20 6e 75 6d 5f 69 64 73 29 20 idx >= num_ids)
287d0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 {...cackey_mutex
287e0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 _unlock(cackey_b
287f0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b iglock);....CACK
28800 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
28810 22 45 72 72 6f 72 2e 20 20 4f 62 6a 65 63 74 20 "Error. Object
28820 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 handle out of ra
28830 6e 67 65 2e 20 20 69 64 65 6e 74 69 74 79 5f 69 nge. identity_i
28840 64 78 20 3d 20 25 6c 75 2c 20 6e 75 6d 5f 69 64 dx = %lu, num_id
28850 73 20 3d 20 25 6c 75 2e 22 2c 20 28 75 6e 73 69 s = %lu.", (unsi
28860 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65 6e 74 gned long) ident
28870 69 74 79 5f 69 64 78 2c 20 28 75 6e 73 69 67 6e ity_idx, (unsign
28880 65 64 20 6c 6f 6e 67 29 20 6e 75 6d 5f 69 64 73 ed long) num_ids
28890 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
288a0 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 49 _OBJECT_HANDLE_I
288b0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 64 NVALID);..}...id
288c0 65 6e 74 69 74 79 20 3d 20 26 63 61 63 6b 65 79 entity = &cackey
288d0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
288e0 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 69 on].identities[i
288f0 64 65 6e 74 69 74 79 5f 69 64 78 5d 3b 0a 0a 09 dentity_idx];...
28900 66 6f 72 20 28 61 74 74 72 5f 69 64 78 20 3d 20 for (attr_idx =
28910 30 3b 20 61 74 74 72 5f 69 64 78 20 3c 20 75 6c 0; attr_idx < ul
28920 43 6f 75 6e 74 3b 20 61 74 74 72 5f 69 64 78 2b Count; attr_idx+
28930 2b 29 20 7b 0a 09 09 63 75 72 72 5f 61 74 74 72 +) {...curr_attr
28940 20 3d 20 26 70 54 65 6d 70 6c 61 74 65 5b 61 74 = &pTemplate[at
28950 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 70 56 61 6c tr_idx];....pVal
28960 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 75 6c 56 ue = NULL;...ulV
28970 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f alueLen = (CK_LO
28980 4e 47 29 20 2d 31 3b 0a 0a 09 09 43 41 43 4b 45 NG) -1;....CACKE
28990 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
289a0 4c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 74 74 72 Looking for attr
289b0 69 62 75 74 65 20 30 78 25 30 38 6c 78 20 28 69 ibute 0x%08lx (i
289c0 64 65 6e 74 69 74 79 3a 25 6c 75 29 20 2e 2e 2e dentity:%lu) ...
289d0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e ", (unsigned lon
289e0 67 29 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 g) curr_attr->ty
289f0 70 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f pe, (unsigned lo
28a00 6e 67 29 20 69 64 65 6e 74 69 74 79 5f 69 64 78 ng) identity_idx
28a10 29 3b 0a 0a 09 09 66 6f 72 20 28 73 65 73 73 5f );....for (sess_
28a20 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 73 65 attr_idx = 0; se
28a30 73 73 5f 61 74 74 72 5f 69 64 78 20 3c 20 69 64 ss_attr_idx < id
28a40 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 entity->attribut
28a50 65 73 5f 63 6f 75 6e 74 3b 20 73 65 73 73 5f 61 es_count; sess_a
28a60 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 ttr_idx++) {....
28a70 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e 61 74 if (identity->at
28a80 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 tributes[sess_at
28a90 74 72 5f 69 64 78 5d 2e 74 79 70 65 20 3d 3d 20 tr_idx].type ==
28aa0 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 29 curr_attr->type)
28ab0 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 {.....CACKEY_DE
28ac0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e BUG_PRINTF(" ...
28ad0 20 66 6f 75 6e 64 20 69 74 2c 20 70 56 61 6c 75 found it, pValu
28ae0 65 20 3d 20 25 70 2c 20 75 6c 56 61 6c 75 65 4c e = %p, ulValueL
28af0 65 6e 20 3d 20 25 6c 75 22 2c 20 69 64 65 6e 74 en = %lu", ident
28b00 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b ity->attributes[
28b10 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 70 sess_attr_idx].p
28b20 56 61 6c 75 65 2c 20 69 64 65 6e 74 69 74 79 2d Value, identity-
28b30 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 >attributes[sess
28b40 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c _attr_idx].ulVal
28b50 75 65 4c 65 6e 29 3b 0a 09 09 09 09 0a 09 09 09 ueLen);.........
28b60 09 70 56 61 6c 75 65 20 3d 20 69 64 65 6e 74 69 .pValue = identi
28b70 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 ty->attributes[s
28b80 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 70 56 ess_attr_idx].pV
28b90 61 6c 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 alue;.....ulValu
28ba0 65 4c 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d eLen = identity-
28bb0 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 >attributes[sess
28bc0 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c _attr_idx].ulVal
28bd0 75 65 4c 65 6e 3b 0a 09 09 09 7d 0a 09 09 7d 0a ueLen;....}...}.
28be0 0a 09 09 69 66 20 28 63 75 72 72 5f 61 74 74 72 ...if (curr_attr
28bf0 2d 3e 70 56 61 6c 75 65 20 26 26 20 70 56 61 6c ->pValue && pVal
28c00 75 65 29 20 7b 0a 09 09 09 69 66 20 28 63 75 72 ue) {....if (cur
28c10 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c r_attr->ulValueL
28c20 65 6e 20 3e 3d 20 75 6c 56 61 6c 75 65 4c 65 6e en >= ulValueLen
28c30 29 20 7b 0a 09 09 09 09 6d 65 6d 63 70 79 28 63 ) {.....memcpy(c
28c40 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 urr_attr->pValue
28c50 2c 20 70 56 61 6c 75 65 2c 20 75 6c 56 61 6c 75 , pValue, ulValu
28c60 65 4c 65 6e 29 3b 0a 09 09 09 7d 20 65 6c 73 65 eLen);....} else
28c70 20 7b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 {.....ulValueLe
28c80 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 n = (CK_LONG) -1
28c90 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 ;......retval =
28ca0 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 CKR_BUFFER_TOO_S
28cb0 4d 41 4c 4c 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a MALL;....}...}..
28cc0 09 09 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56 ..curr_attr->ulV
28cd0 61 6c 75 65 4c 65 6e 20 3d 20 75 6c 56 61 6c 75 alueLen = ulValu
28ce0 65 4c 65 6e 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 eLen;..}...mutex
28cf0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 _retval = cackey
28d00 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 _mutex_unlock(ca
28d10 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 ckey_biglock);..
28d20 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c if (mutex_retval
28d30 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 != 0) {...CACKE
28d40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
28d50 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e Error. Unlockin
28d60 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 g failed.");....
28d70 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 return(CKR_GENER
28d80 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 AL_ERROR);..}...
28d90 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b if (retval == CK
28da0 52 5f 41 54 54 52 49 42 55 54 45 5f 54 59 50 45 R_ATTRIBUTE_TYPE
28db0 5f 49 4e 56 41 4c 49 44 29 20 7b 0a 09 09 43 41 _INVALID) {...CA
28dc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
28dd0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 F("Returning CKR
28de0 5f 41 54 54 52 49 42 55 54 45 5f 54 59 50 45 5f _ATTRIBUTE_TYPE_
28df0 49 4e 56 41 4c 49 44 20 28 25 69 29 22 2c 20 28 INVALID (%i)", (
28e00 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d int) retval);..}
28e10 20 65 6c 73 65 20 69 66 20 28 72 65 74 76 61 6c else if (retval
28e20 20 3d 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 == CKR_BUFFER_T
28e30 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 43 41 OO_SMALL) {...CA
28e40 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
28e50 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 F("Returning CKR
28e60 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c _BUFFER_TOO_SMAL
28e70 4c 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20 72 L (%i)", (int) r
28e80 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 etval);..} else
28e90 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b if (retval == CK
28ea0 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 R_OK) {...CACKEY
28eb0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
28ec0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 eturning CKR_OK
28ed0 28 25 69 29 22 2c 20 28 69 6e 74 29 20 72 65 74 (%i)", (int) ret
28ee0 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a val);..} else {.
28ef0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
28f00 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
28f10 20 25 69 22 2c 20 28 69 6e 74 29 20 72 65 74 76 %i", (int) retv
28f20 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e al);..}...return
28f30 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f (retval);.}..CK_
28f40 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 DEFINE_FUNCTION(
28f50 43 4b 5f 52 56 2c 20 43 5f 53 65 74 41 74 74 72 CK_RV, C_SetAttr
28f60 69 62 75 74 65 56 61 6c 75 65 29 28 43 4b 5f 53 ibuteValue)(CK_S
28f70 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 ESSION_HANDLE hS
28f80 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 ession, CK_OBJEC
28f90 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 T_HANDLE hObject
28fa0 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 , CK_ATTRIBUTE_P
28fb0 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b TR pTemplate, CK
28fc0 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20 _ULONG ulCount)
28fd0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f {..CACKEY_DEBUG_
28fe0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
28ff0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 );...if (!cackey
29000 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
29010 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
29020 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e RINTF("Error. N
29030 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 ot initialized."
29040 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
29050 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e _CRYPTOKI_NOT_IN
29060 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
29070 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
29080 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
29090 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
290a0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 _SUPPORTED (%i)"
290b0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e , CKR_FUNCTION_N
290c0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a OT_SUPPORTED);..
290d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 .return(CKR_FUNC
290e0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
290f0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e ED);.}..CK_DEFIN
29100 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 E_FUNCTION(CK_RV
29110 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 , C_FindObjectsI
29120 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f nit)(CK_SESSION_
29130 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c HANDLE hSession,
29140 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 CK_ATTRIBUTE_PT
29150 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f R pTemplate, CK_
29160 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20 7b ULONG ulCount) {
29170 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f ..CK_SLOT_ID slo
29180 74 49 44 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 69 tID;..CK_ULONG i
29190 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 dx;..int mutex_r
291a0 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f etval;...CACKEY_
291b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
291c0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 lled.");...if (!
291d0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a cackey_initializ
291e0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...CACKEY_D
291f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
29200 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c or. Not initial
29210 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 ized.");....retu
29220 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f rn(CKR_CRYPTOKI_
29230 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 NOT_INITIALIZED)
29240 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 ;..}...if (hSess
29250 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 ion == 0 || hSes
29260 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 sion >= (sizeof(
29270 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 cackey_sessions)
29280 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 / sizeof(cackey
29290 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 _sessions[0])))
292a0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
292b0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
292c0 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 Session out of
292d0 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 range.");......r
292e0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f eturn(CKR_SESSIO
292f0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 N_HANDLE_INVALID
29300 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 );..}...mutex_re
29310 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 tval = cackey_mu
29320 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f tex_lock(cackey_
29330 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d biglock);..if (m
29340 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 utex_retval != 0
29350 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
29360 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
29370 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 . Locking faile
29380 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
29390 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f CKR_GENERAL_ERRO
293a0 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 R);..}...if (!ca
293b0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
293c0 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 ession].active)
293d0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 {...cackey_mutex
293e0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 _unlock(cackey_b
293f0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b iglock);....CACK
29400 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
29410 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e "Error. Session
29420 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a not active.");.
29430 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f .....return(CKR_
29440 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 SESSION_HANDLE_I
29450 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 NVALID);..}...if
29460 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e (cackey_session
29470 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 s[hSession].sear
29480 63 68 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 ch_active) {...c
29490 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f ackey_mutex_unlo
294a0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
294b0 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 k);....CACKEY_DE
294c0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
294d0 72 2e 20 20 53 65 61 72 63 68 20 61 6c 72 65 61 r. Search alrea
294e0 64 79 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 dy active.");...
294f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 ...return(CKR_OP
29500 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 45 29 3b ERATION_ACTIVE);
29510 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 ..}...slotID = c
29520 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
29530 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b Session].slotID;
29540 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 ...if (slotID <
29550 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 0 || slotID >= (
29560 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c sizeof(cackey_sl
29570 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 ots) / sizeof(ca
29580 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 ckey_slots[0])))
29590 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
295a0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
295b0 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 Invalid slot re
295c0 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f quested (%lu), o
295d0 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 utside of valid
295e0 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b range", slotID);
295f0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 ....return(CKR_G
29600 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 ENERAL_ERROR);..
29610 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 }...if (cackey_s
29620 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 lots[slotID].act
29630 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 ive == 0) {...CA
29640 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
29650 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 F("Error. Invali
29660 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 d slot requested
29670 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 (%lu), slot not
29680 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 currently activ
29690 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 e", slotID);....
296a0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c cackey_mutex_unl
296b0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
296c0 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 ck);....return(C
296d0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 KR_GENERAL_ERROR
296e0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b );..}...if (cack
296f0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d ey_slots[slotID]
29700 2e 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09 .slot_reset) {..
29710 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
29720 49 4e 54 46 28 22 54 68 65 20 73 6c 6f 74 20 68 INTF("The slot h
29730 61 73 20 62 65 65 6e 20 72 65 73 65 74 20 73 69 as been reset si
29740 6e 63 65 20 77 65 20 6c 61 73 74 20 6c 6f 6f 6b nce we last look
29750 65 64 20 66 6f 72 20 69 64 65 6e 74 69 74 69 65 ed for identitie
29760 73 20 2d 2d 20 72 65 73 63 61 6e 6e 69 6e 67 22 s -- rescanning"
29770 29 3b 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 );....if (cackey
29780 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
29790 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 21 on].identities !
297a0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 63 61 63 = NULL) {....cac
297b0 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e 74 69 74 key_free_identit
297c0 69 65 73 28 63 61 63 6b 65 79 5f 73 65 73 73 69 ies(cackey_sessi
297d0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 ons[hSession].id
297e0 65 6e 74 69 74 69 65 73 2c 20 63 61 63 6b 65 79 entities, cackey
297f0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
29800 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 on].identities_c
29810 6f 75 6e 74 29 3b 0a 0a 09 09 09 63 61 63 6b 65 ount);.....cacke
29820 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
29830 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 ion].identities
29840 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63 61 63 6b 65 = NULL;....cacke
29850 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
29860 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f ion].identities_
29870 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 7d 0a 0a count = 0;...}..
29880 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f ..if (cackey_slo
29890 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c ts[slotID].label
298a0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 66 != NULL) {....f
298b0 72 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 ree(cackey_slots
298c0 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 29 3b [slotID].label);
298d0 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 ....cackey_slots
298e0 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 3d [slotID].label =
298f0 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09 63 61 NULL;...}....ca
29900 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 ckey_mark_slot_r
29910 65 73 65 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f eset(&cackey_slo
29920 74 73 5b 73 6c 6f 74 49 44 5d 29 3b 0a 09 09 63 ts[slotID]);...c
29930 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 ackey_slots[slot
29940 49 44 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 20 3d ID].slot_reset =
29950 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 0;..}...if (cac
29960 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
29970 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 ssion].identitie
29980 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 s == NULL) {...c
29990 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
299a0 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 Session].identit
299b0 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 ies = cackey_rea
299c0 64 5f 69 64 65 6e 74 69 74 69 65 73 28 26 63 61 d_identities(&ca
299d0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 ckey_slots[slotI
299e0 44 5d 2c 20 26 63 61 63 6b 65 79 5f 73 65 73 73 D], &cackey_sess
299f0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 ions[hSession].i
29a00 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 dentities_count)
29a10 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 54 65 6d 70 ;..}...if (pTemp
29a20 6c 61 74 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a late != NULL) {.
29a30 09 09 69 66 20 28 75 6c 43 6f 75 6e 74 20 21 3d ..if (ulCount !=
29a40 20 30 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 0) {....cackey_
29a50 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
29a60 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f n].search_query_
29a70 63 6f 75 6e 74 20 3d 20 75 6c 43 6f 75 6e 74 3b count = ulCount;
29a80 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 ....cackey_sessi
29a90 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 ons[hSession].se
29aa0 61 72 63 68 5f 71 75 65 72 79 20 3d 20 6d 61 6c arch_query = mal
29ab0 6c 6f 63 28 75 6c 43 6f 75 6e 74 20 2a 20 73 69 loc(ulCount * si
29ac0 7a 65 6f 66 28 2a 70 54 65 6d 70 6c 61 74 65 29 zeof(*pTemplate)
29ad0 29 3b 0a 0a 09 09 09 6d 65 6d 63 70 79 28 63 61 );.....memcpy(ca
29ae0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
29af0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 ession].search_q
29b00 75 65 72 79 2c 20 70 54 65 6d 70 6c 61 74 65 2c uery, pTemplate,
29b10 20 75 6c 43 6f 75 6e 74 20 2a 20 73 69 7a 65 6f ulCount * sizeo
29b20 66 28 2a 70 54 65 6d 70 6c 61 74 65 29 29 3b 0a f(*pTemplate));.
29b30 09 09 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b ...for (idx = 0;
29b40 20 69 64 78 20 3c 20 75 6c 43 6f 75 6e 74 3b 20 idx < ulCount;
29b50 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 69 66 20 idx++) {.....if
29b60 28 70 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e (pTemplate[idx].
29b70 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d 20 30 29 ulValueLen == 0)
29b80 20 7b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 73 {......cackey_s
29b90 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
29ba0 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69 ].search_query[i
29bb0 64 78 5d 2e 70 56 61 6c 75 65 20 3d 20 4e 55 4c dx].pValue = NUL
29bc0 4c 3b 0a 0a 09 09 09 09 09 63 6f 6e 74 69 6e 75 L;.......continu
29bd0 65 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 63 61 e;.....}......ca
29be0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
29bf0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 ession].search_q
29c00 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 uery[idx].pValue
29c10 20 3d 20 6d 61 6c 6c 6f 63 28 70 54 65 6d 70 6c = malloc(pTempl
29c20 61 74 65 5b 69 64 78 5d 2e 75 6c 56 61 6c 75 65 ate[idx].ulValue
29c30 4c 65 6e 29 3b 0a 0a 09 09 09 09 69 66 20 28 63 Len);......if (c
29c40 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
29c50 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f Session].search_
29c60 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 query[idx].pValu
29c70 65 29 20 7b 0a 09 09 09 09 09 6d 65 6d 63 70 79 e) {......memcpy
29c80 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 (cackey_sessions
29c90 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 [hSession].searc
29ca0 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 h_query[idx].pVa
29cb0 6c 75 65 2c 20 70 54 65 6d 70 6c 61 74 65 5b 69 lue, pTemplate[i
29cc0 64 78 5d 2e 70 56 61 6c 75 65 2c 20 70 54 65 6d dx].pValue, pTem
29cd0 70 6c 61 74 65 5b 69 64 78 5d 2e 75 6c 56 61 6c plate[idx].ulVal
29ce0 75 65 4c 65 6e 29 3b 0a 09 09 09 09 7d 0a 09 09 ueLen);.....}...
29cf0 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 .}...} else {...
29d00 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 .cackey_sessions
29d10 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 [hSession].searc
29d20 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20 h_query_count =
29d30 30 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 0;....cackey_ses
29d40 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
29d50 73 65 61 72 63 68 5f 71 75 65 72 79 20 3d 20 4e search_query = N
29d60 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 ULL;...}..} else
29d70 20 7b 0a 09 09 69 66 20 28 75 6c 43 6f 75 6e 74 {...if (ulCount
29d80 20 21 3d 20 30 29 20 7b 0a 09 09 09 63 61 63 6b != 0) {....cack
29d90 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 ey_mutex_unlock(
29da0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
29db0 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
29dc0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
29dd0 20 20 53 65 61 72 63 68 20 71 75 65 72 79 20 73 Search query s
29de0 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c pecified as NULL
29df0 2c 20 62 75 74 20 6e 75 6d 62 65 72 20 6f 66 20 , but number of
29e00 71 75 65 72 79 20 74 65 72 6d 73 20 6e 6f 74 20 query terms not
29e10 73 70 65 63 69 66 69 65 64 20 61 73 20 30 2e 22 specified as 0."
29e20 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b );.....return(CK
29e30 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 R_ARGUMENTS_BAD)
29e40 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f ;...}....cackey_
29e50 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
29e60 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f n].search_query_
29e70 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 63 61 63 count = 0;...cac
29e80 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
29e90 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 ssion].search_qu
29ea0 65 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a ery = NULL;..}..
29eb0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 .cackey_sessions
29ec0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 [hSession].searc
29ed0 68 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 63 h_active = 1;..c
29ee0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
29ef0 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f Session].search_
29f00 63 75 72 72 5f 69 64 20 3d 20 30 3b 0a 0a 09 6d curr_id = 0;...m
29f10 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 utex_retval = ca
29f20 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 ckey_mutex_unloc
29f30 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
29f40 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 );..if (mutex_re
29f50 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 tval != 0) {...C
29f60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
29f70 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f TF("Error. Unlo
29f80 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b cking failed.");
29f90 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 ....return(CKR_G
29fa0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 ENERAL_ERROR);..
29fb0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 }...CACKEY_DEBUG
29fc0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
29fd0 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c ng CKR_OK (%i)",
29fe0 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 CKR_OK);...retu
29ff0 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 73 rn(CKR_OK);.}..s
2a000 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 tatic int cackey
2a010 5f 70 6b 63 73 31 31 5f 63 6f 6d 70 61 72 65 5f _pkcs11_compare_
2a020 61 74 74 72 69 62 75 74 65 73 28 43 4b 5f 41 54 attributes(CK_AT
2a030 54 52 49 42 55 54 45 20 2a 61 2c 20 43 4b 5f 41 TRIBUTE *a, CK_A
2a040 54 54 52 49 42 55 54 45 20 2a 62 29 20 7b 0a 09 TTRIBUTE *b) {..
2a050 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 unsigned char *s
2a060 6d 61 6c 6c 62 75 66 2c 20 2a 6c 61 72 67 65 62 mallbuf, *largeb
2a070 75 66 3b 0a 09 73 69 7a 65 5f 74 20 73 6d 61 6c uf;..size_t smal
2a080 6c 62 75 66 5f 6c 65 6e 2c 20 6c 61 72 67 65 62 lbuf_len, largeb
2a090 75 66 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 61 2d uf_len;...if (a-
2a0a0 3e 74 79 70 65 20 21 3d 20 62 2d 3e 74 79 70 65 >type != b->type
2a0b0 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 30 29 3b ) {...return(0);
2a0c0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 ..}...CACKEY_DEB
2a0d0 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20 20 2e UG_PRINTF(" .
2a0e0 2e 2e 20 66 6f 75 6e 64 20 6d 61 74 63 68 69 6e .. found matchin
2a0f0 67 20 74 79 70 65 20 2e 2e 2e 22 29 3b 0a 0a 09 g type ...");...
2a100 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
2a110 4e 54 42 55 46 28 22 20 20 20 20 2e 2e 2e 20 6f NTBUF(" ... o
2a120 75 72 20 76 61 6c 75 65 3a 22 2c 20 61 2d 3e 70 ur value:", a->p
2a130 56 61 6c 75 65 2c 20 61 2d 3e 75 6c 56 61 6c 75 Value, a->ulValu
2a140 65 4c 65 6e 29 3b 0a 0a 09 69 66 20 28 62 2d 3e eLen);...if (b->
2a150 70 56 61 6c 75 65 20 3d 3d 20 4e 55 4c 4c 29 20 pValue == NULL)
2a160 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
2a170 5f 50 52 49 4e 54 46 28 22 20 20 20 20 20 20 20 _PRINTF("
2a180 2e 2e 2e 20 66 6f 75 6e 64 20 77 69 6c 64 63 61 ... found wildca
2a190 72 64 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09 72 rd match");....r
2a1a0 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 69 eturn(1);..}...i
2a1b0 66 20 28 61 2d 3e 70 56 61 6c 75 65 20 3d 3d 20 f (a->pValue ==
2a1c0 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e NULL) {...return
2a1d0 28 30 29 3b 0a 09 7d 0a 0a 20 09 69 66 20 28 62 (0);..}.. .if (b
2a1e0 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d 20 ->ulValueLen ==
2a1f0 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 26 26 a->ulValueLen &&
2a200 20 6d 65 6d 63 6d 70 28 61 2d 3e 70 56 61 6c 75 memcmp(a->pValu
2a210 65 2c 20 62 2d 3e 70 56 61 6c 75 65 2c 20 62 2d e, b->pValue, b-
2a220 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 20 3d 3d 20 >ulValueLen) ==
2a230 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 0) {...CACKEY_DE
2a240 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20 20 BUG_PRINTF("
2a250 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 65 78 61 ... found exa
2a260 63 74 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09 72 ct match");....r
2a270 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 73 eturn(1);..}...s
2a280 77 69 74 63 68 20 28 61 2d 3e 74 79 70 65 29 20 witch (a->type)
2a290 7b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 {...case CKA_MOD
2a2a0 55 4c 55 53 3a 0a 09 09 09 69 66 20 28 61 2d 3e ULUS:....if (a->
2a2b0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d 20 62 2d ulValueLen == b-
2a2c0 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 >ulValueLen) {..
2a2d0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 0a ...break;....}..
2a2e0 09 09 09 69 66 20 28 61 2d 3e 75 6c 56 61 6c 75 ...if (a->ulValu
2a2f0 65 4c 65 6e 20 3e 20 62 2d 3e 75 6c 56 61 6c 75 eLen > b->ulValu
2a300 65 4c 65 6e 29 20 7b 0a 09 09 09 09 73 6d 61 6c eLen) {.....smal
2a310 6c 62 75 66 20 3d 20 62 2d 3e 70 56 61 6c 75 65 lbuf = b->pValue
2a320 3b 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66 5f 6c ;.....smallbuf_l
2a330 65 6e 20 3d 20 62 2d 3e 75 6c 56 61 6c 75 65 4c en = b->ulValueL
2a340 65 6e 3b 0a 0a 09 09 09 09 6c 61 72 67 65 62 75 en;......largebu
2a350 66 20 3d 20 61 2d 3e 70 56 61 6c 75 65 3b 0a 09 f = a->pValue;..
2a360 09 09 09 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20 ...largebuf_len
2a370 3d 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b = a->ulValueLen;
2a380 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 ....} else {....
2a390 09 73 6d 61 6c 6c 62 75 66 20 3d 20 61 2d 3e 70 .smallbuf = a->p
2a3a0 56 61 6c 75 65 3b 0a 09 09 09 09 73 6d 61 6c 6c Value;.....small
2a3b0 62 75 66 5f 6c 65 6e 20 3d 20 61 2d 3e 75 6c 56 buf_len = a->ulV
2a3c0 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09 09 6c 61 alueLen;......la
2a3d0 72 67 65 62 75 66 20 3d 20 62 2d 3e 70 56 61 6c rgebuf = b->pVal
2a3e0 75 65 3b 0a 09 09 09 09 6c 61 72 67 65 62 75 66 ue;.....largebuf
2a3f0 5f 6c 65 6e 20 3d 20 62 2d 3e 75 6c 56 61 6c 75 _len = b->ulValu
2a400 65 4c 65 6e 3b 0a 09 09 09 7d 0a 0a 09 09 09 66 eLen;....}.....f
2a410 6f 72 20 28 3b 20 6c 61 72 67 65 62 75 66 5f 6c or (; largebuf_l
2a420 65 6e 20 21 3d 20 73 6d 61 6c 6c 62 75 66 5f 6c en != smallbuf_l
2a430 65 6e 3b 20 6c 61 72 67 65 62 75 66 2b 2b 2c 6c en; largebuf++,l
2a440 61 72 67 65 62 75 66 5f 6c 65 6e 2d 2d 29 20 7b argebuf_len--) {
2a450 0a 09 09 09 09 69 66 20 28 6c 61 72 67 65 62 75 .....if (largebu
2a460 66 5b 30 5d 20 21 3d 20 30 29 20 7b 0a 09 09 09 f[0] != 0) {....
2a470 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 09 ..break;.....}..
2a480 09 09 7d 0a 0a 09 09 09 69 66 20 28 6c 61 72 67 ..}.....if (larg
2a490 65 62 75 66 5f 6c 65 6e 20 21 3d 20 73 6d 61 6c ebuf_len != smal
2a4a0 6c 62 75 66 5f 6c 65 6e 29 20 7b 0a 09 09 09 09 lbuf_len) {.....
2a4b0 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09 break;....}.....
2a4c0 69 66 20 28 6d 65 6d 63 6d 70 28 6c 61 72 67 65 if (memcmp(large
2a4d0 62 75 66 2c 20 73 6d 61 6c 6c 62 75 66 2c 20 73 buf, smallbuf, s
2a4e0 6d 61 6c 6c 62 75 66 5f 6c 65 6e 29 20 3d 3d 20 mallbuf_len) ==
2a4f0 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 0) {.....CACKEY_
2a500 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 DEBUG_PRINTF("
2a510 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 61 ... found a
2a520 70 70 72 6f 78 69 6d 61 74 65 20 6d 61 74 63 68 pproximate match
2a530 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 ");......return(
2a540 31 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 1);....}.....bre
2a550 61 6b 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 ak;..}...return(
2a560 30 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 0);.}..CK_DEFINE
2a570 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c _FUNCTION(CK_RV,
2a580 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 29 28 C_FindObjects)(
2a590 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c CK_SESSION_HANDL
2a5a0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f E hSession, CK_O
2a5b0 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 BJECT_HANDLE_PTR
2a5c0 20 70 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 55 4c phObject, CK_UL
2a5d0 4f 4e 47 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43 ONG ulMaxObjectC
2a5e0 6f 75 6e 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 ount, CK_ULONG_P
2a5f0 54 52 20 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e TR pulObjectCoun
2a600 74 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 t) {..struct cac
2a610 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 63 75 key_identity *cu
2a620 72 72 5f 69 64 3b 0a 09 43 4b 5f 41 54 54 52 49 rr_id;..CK_ATTRI
2a630 42 55 54 45 20 2a 63 75 72 72 5f 61 74 74 72 3b BUTE *curr_attr;
2a640 0a 09 43 4b 5f 55 4c 4f 4e 47 20 63 75 72 72 5f ..CK_ULONG curr_
2a650 69 64 5f 69 64 78 2c 20 63 75 72 72 5f 6f 75 74 id_idx, curr_out
2a660 5f 69 64 5f 69 64 78 2c 20 63 75 72 72 5f 61 74 _id_idx, curr_at
2a670 74 72 5f 69 64 78 2c 20 73 65 73 73 5f 61 74 74 tr_idx, sess_att
2a680 72 5f 69 64 78 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 r_idx;..CK_ULONG
2a690 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2c 20 matched_count,
2a6a0 70 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75 prev_matched_cou
2a6b0 6e 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 nt;..int mutex_r
2a6c0 65 74 76 61 6c 3b 0a 23 69 66 64 65 66 20 43 41 etval;.#ifdef CA
2a6d0 43 4b 45 59 5f 44 45 42 55 47 5f 53 45 41 52 43 CKEY_DEBUG_SEARC
2a6e0 48 5f 53 50 45 45 44 54 45 53 54 0a 09 73 74 72 H_SPEEDTEST..str
2a6f0 75 63 74 20 74 69 6d 65 76 61 6c 20 73 74 61 72 uct timeval star
2a700 74 2c 20 65 6e 64 3b 0a 09 75 69 6e 74 36 34 5f t, end;..uint64_
2a710 74 20 73 74 61 72 74 5f 69 6e 74 2c 20 65 6e 64 t start_int, end
2a720 5f 69 6e 74 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 _int;.#endif...C
2a730 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
2a740 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
2a750 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 .if (!cackey_ini
2a760 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 tialized) {...CA
2a770 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
2a780 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 F("Error. Not i
2a790 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a nitialized.");..
2a7a0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 ..return(CKR_CRY
2a7b0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 PTOKI_NOT_INITIA
2a7c0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 LIZED);..}...if
2a7d0 28 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 (pulObjectCount
2a7e0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 == NULL) {...CAC
2a7f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
2a800 28 22 45 72 72 6f 72 2e 20 20 70 75 6c 4f 62 6a ("Error. pulObj
2a810 65 63 74 43 6f 75 6e 74 20 69 73 20 4e 55 4c 4c ectCount is NULL
2a820 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
2a830 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 KR_ARGUMENTS_BAD
2a840 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 68 4f 62 );..}...if (phOb
2a850 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 ject == NULL &&
2a860 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 ulMaxObjectCount
2a870 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 == 0) {.../* Sh
2a880 6f 72 74 20 63 69 72 63 75 69 74 2c 20 69 66 20 ort circuit, if
2a890 7a 65 72 6f 20 6f 62 6a 65 63 74 73 20 77 65 72 zero objects wer
2a8a0 65 20 73 70 65 63 69 66 69 65 64 20 72 65 74 75 e specified retu
2a8b0 72 6e 20 7a 65 72 6f 20 69 74 65 6d 73 20 69 6d rn zero items im
2a8c0 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a 09 09 2a mediately */...*
2a8d0 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d pulObjectCount =
2a8e0 20 30 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 0;....CACKEY_DE
2a8f0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
2a900 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 rning CKR_OK (%i
2a910 29 20 28 73 68 6f 72 74 20 63 69 72 63 75 69 74 ) (short circuit
2a920 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 )", CKR_OK);....
2a930 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a return(CKR_OK);.
2a940 09 7d 0a 0a 09 69 66 20 28 70 68 4f 62 6a 65 63 .}...if (phObjec
2a950 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 t == NULL) {...C
2a960 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
2a970 54 46 28 22 45 72 72 6f 72 2e 20 20 70 68 4f 62 TF("Error. phOb
2a980 6a 65 63 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b ject is NULL.");
2a990 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 ....return(CKR_A
2a9a0 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 RGUMENTS_BAD);..
2a9b0 7d 0a 0a 09 69 66 20 28 75 6c 4d 61 78 4f 62 6a }...if (ulMaxObj
2a9c0 65 63 74 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b ectCount == 0) {
2a9d0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
2a9e0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
2a9f0 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f Maximum number o
2aa00 66 20 6f 62 6a 65 63 74 73 20 73 70 65 63 69 66 f objects specif
2aa10 69 65 64 20 61 73 20 7a 65 72 6f 2e 22 29 3b 0a ied as zero.");.
2aa20 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 ...return(CKR_AR
2aa30 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d GUMENTS_BAD);..}
2aa40 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 ...if (hSession
2aa50 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e == 0 || hSession
2aa60 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b >= (sizeof(cack
2aa70 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 ey_sessions) / s
2aa80 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 izeof(cackey_ses
2aa90 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 sions[0]))) {...
2aaa0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
2aab0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 NTF("Error. Ses
2aac0 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 sion out of rang
2aad0 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 e.");......retur
2aae0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 n(CKR_SESSION_HA
2aaf0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 NDLE_INVALID);..
2ab00 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c }...mutex_retval
2ab10 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f = cackey_mutex_
2ab20 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
2ab30 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 ock);..if (mutex
2ab40 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a _retval != 0) {.
2ab50 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
2ab60 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c RINTF("Error. L
2ab70 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 ocking failed.")
2ab80 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
2ab90 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a GENERAL_ERROR);.
2aba0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 .}...if (!cackey
2abb0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
2abc0 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 on].active) {...
2abd0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c cackey_mutex_unl
2abe0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
2abf0 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 ck);....CACKEY_D
2ac00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
2ac10 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 or. Session not
2ac20 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 active.");.....
2ac30 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 .return(CKR_SESS
2ac40 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c ION_HANDLE_INVAL
2ac50 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 ID);..}...if (!c
2ac60 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
2ac70 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f Session].search_
2ac80 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b active) {...cack
2ac90 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 ey_mutex_unlock(
2aca0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
2acb0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
2acc0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
2acd0 20 53 65 61 72 63 68 20 6e 6f 74 20 61 63 74 69 Search not acti
2ace0 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 ve.");......retu
2acf0 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e rn(CKR_OPERATION
2ad00 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 _NOT_INITIALIZED
2ad10 29 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 );..}..#ifdef CA
2ad20 43 4b 45 59 5f 44 45 42 55 47 5f 53 45 41 52 43 CKEY_DEBUG_SEARC
2ad30 48 5f 53 50 45 45 44 54 45 53 54 0a 09 67 65 74 H_SPEEDTEST..get
2ad40 74 69 6d 65 6f 66 64 61 79 28 26 73 74 61 72 74 timeofday(&start
2ad50 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a , NULL);.#endif.
2ad60 0a 09 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 ..curr_out_id_id
2ad70 78 20 3d 20 30 3b 0a 09 66 6f 72 20 28 63 75 72 x = 0;..for (cur
2ad80 72 5f 69 64 5f 69 64 78 20 3d 20 63 61 63 6b 65 r_id_idx = cacke
2ad90 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
2ada0 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 ion].search_curr
2adb0 5f 69 64 3b 20 63 75 72 72 5f 69 64 5f 69 64 78 _id; curr_id_idx
2adc0 20 3c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f < cackey_sessio
2add0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 ns[hSession].ide
2ade0 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 26 26 ntities_count &&
2adf0 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e ulMaxObjectCoun
2ae00 74 3b 20 63 75 72 72 5f 69 64 5f 69 64 78 2b 2b t; curr_id_idx++
2ae10 29 20 7b 0a 09 09 63 75 72 72 5f 69 64 20 3d 20 ) {...curr_id =
2ae20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 &cackey_sessions
2ae30 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 [hSession].ident
2ae40 69 74 69 65 73 5b 63 75 72 72 5f 69 64 5f 69 64 ities[curr_id_id
2ae50 78 5d 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 x];....CACKEY_DE
2ae60 42 55 47 5f 50 52 49 4e 54 46 28 22 50 72 6f 63 BUG_PRINTF("Proc
2ae70 65 73 73 69 6e 67 20 69 64 65 6e 74 69 74 79 3a essing identity:
2ae80 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 %lu", (unsigned
2ae90 6c 6f 6e 67 29 20 63 75 72 72 5f 69 64 5f 69 64 long) curr_id_id
2aea0 78 29 3b 0a 0a 09 09 6d 61 74 63 68 65 64 5f 63 x);....matched_c
2aeb0 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 66 6f 72 ount = 0;....for
2aec0 20 28 63 75 72 72 5f 61 74 74 72 5f 69 64 78 20 (curr_attr_idx
2aed0 3d 20 30 3b 20 63 75 72 72 5f 61 74 74 72 5f 69 = 0; curr_attr_i
2aee0 64 78 20 3c 20 63 61 63 6b 65 79 5f 73 65 73 73 dx < cackey_sess
2aef0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 ions[hSession].s
2af00 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e earch_query_coun
2af10 74 3b 20 63 75 72 72 5f 61 74 74 72 5f 69 64 78 t; curr_attr_idx
2af20 2b 2b 29 20 7b 0a 09 09 09 70 72 65 76 5f 6d 61 ++) {....prev_ma
2af30 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 20 6d 61 tched_count = ma
2af40 74 63 68 65 64 5f 63 6f 75 6e 74 3b 0a 0a 09 09 tched_count;....
2af50 09 63 75 72 72 5f 61 74 74 72 20 3d 20 26 63 61 .curr_attr = &ca
2af60 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
2af70 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 ession].search_q
2af80 75 65 72 79 5b 63 75 72 72 5f 61 74 74 72 5f 69 uery[curr_attr_i
2af90 64 78 5d 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f dx];.....CACKEY_
2afa0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 DEBUG_PRINTF("
2afb0 43 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 74 74 Checking for att
2afc0 72 69 62 75 74 65 20 25 73 20 28 30 78 25 30 38 ribute %s (0x%08
2afd0 6c 78 29 20 69 6e 20 69 64 65 6e 74 69 74 79 3a lx) in identity:
2afe0 25 69 2e 2e 2e 22 2c 20 43 41 43 4b 45 59 5f 44 %i...", CACKEY_D
2aff0 45 42 55 47 5f 46 55 4e 43 5f 41 54 54 52 49 42 EBUG_FUNC_ATTRIB
2b000 55 54 45 5f 54 4f 5f 53 54 52 28 63 75 72 72 5f UTE_TO_STR(curr_
2b010 61 74 74 72 2d 3e 74 79 70 65 29 2c 20 28 75 6e attr->type), (un
2b020 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 signed long) cur
2b030 72 5f 61 74 74 72 2d 3e 74 79 70 65 2c 20 28 69 r_attr->type, (i
2b040 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29 nt) curr_id_idx)
2b050 3b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 ;....CACKEY_DEBU
2b060 47 5f 50 52 49 4e 54 42 55 46 28 22 20 20 20 20 G_PRINTBUF("
2b070 56 61 6c 75 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f Value looking fo
2b080 72 3a 22 2c 20 63 75 72 72 5f 61 74 74 72 2d 3e r:", curr_attr->
2b090 70 56 61 6c 75 65 2c 20 63 75 72 72 5f 61 74 74 pValue, curr_att
2b0a0 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a r->ulValueLen);.
2b0b0 0a 09 09 09 66 6f 72 20 28 73 65 73 73 5f 61 74 ....for (sess_at
2b0c0 74 72 5f 69 64 78 20 3d 20 30 3b 20 73 65 73 73 tr_idx = 0; sess
2b0d0 5f 61 74 74 72 5f 69 64 78 20 3c 20 63 75 72 72 _attr_idx < curr
2b0e0 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5f _id->attributes_
2b0f0 63 6f 75 6e 74 3b 20 73 65 73 73 5f 61 74 74 72 count; sess_attr
2b100 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 69 66 _idx++) {.....if
2b110 20 28 63 61 63 6b 65 79 5f 70 6b 63 73 31 31 5f (cackey_pkcs11_
2b120 63 6f 6d 70 61 72 65 5f 61 74 74 72 69 62 75 74 compare_attribut
2b130 65 73 28 26 63 75 72 72 5f 69 64 2d 3e 61 74 74 es(&curr_id->att
2b140 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 ributes[sess_att
2b150 72 5f 69 64 78 5d 2c 20 63 75 72 72 5f 61 74 74 r_idx], curr_att
2b160 72 29 29 20 7b 0a 09 09 09 09 09 6d 61 74 63 68 r)) {......match
2b170 65 64 5f 63 6f 75 6e 74 2b 2b 3b 0a 0a 09 09 09 ed_count++;.....
2b180 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 09 ..break;.....}..
2b190 09 09 7d 0a 0a 09 09 09 2f 2a 20 49 66 20 74 68 ..}...../* If th
2b1a0 65 20 61 74 74 72 69 62 75 74 65 20 63 6f 75 6c e attribute coul
2b1b0 64 20 6e 6f 74 20 62 65 20 6d 61 74 63 68 65 64 d not be matched
2b1c0 2c 20 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 , do not try to
2b1d0 6d 61 74 63 68 20 61 64 64 69 74 69 6f 6e 61 6c match additional
2b1e0 20 61 74 74 72 69 62 75 74 65 73 20 2a 2f 0a 09 attributes */..
2b1f0 09 09 69 66 20 28 70 72 65 76 5f 6d 61 74 63 68 ..if (prev_match
2b200 65 64 5f 63 6f 75 6e 74 20 3d 3d 20 6d 61 74 63 ed_count == matc
2b210 68 65 64 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 hed_count) {....
2b220 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d .break;....}...}
2b230 0a 0a 09 09 69 66 20 28 6d 61 74 63 68 65 64 5f ....if (matched_
2b240 63 6f 75 6e 74 20 3d 3d 20 63 61 63 6b 65 79 5f count == cackey_
2b250 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
2b260 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f n].search_query_
2b270 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b count) {....CACK
2b280 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
2b290 22 20 20 2e 2e 2e 20 41 6c 6c 20 25 69 20 61 74 " ... All %i at
2b2a0 74 72 69 62 75 74 65 73 20 63 68 65 63 6b 65 64 tributes checked
2b2b0 20 66 6f 72 20 66 6f 75 6e 64 2c 20 61 64 64 69 for found, addi
2b2c0 6e 67 20 69 64 65 6e 74 69 74 79 3a 25 69 20 74 ng identity:%i t
2b2d0 6f 20 72 65 74 75 72 6e 65 64 20 6c 69 73 74 22 o returned list"
2b2e0 2c 20 28 69 6e 74 29 20 63 61 63 6b 65 79 5f 73 , (int) cackey_s
2b2f0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
2b300 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 ].search_query_c
2b310 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63 75 72 72 ount, (int) curr
2b320 5f 69 64 5f 69 64 78 29 3b 0a 0a 09 09 09 70 68 _id_idx);.....ph
2b330 4f 62 6a 65 63 74 5b 63 75 72 72 5f 6f 75 74 5f Object[curr_out_
2b340 69 64 5f 69 64 78 5d 20 3d 20 63 75 72 72 5f 69 id_idx] = curr_i
2b350 64 5f 69 64 78 20 2b 20 31 3b 0a 0a 09 09 09 75 d_idx + 1;.....u
2b360 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 2d lMaxObjectCount-
2b370 2d 3b 0a 0a 09 09 09 63 75 72 72 5f 6f 75 74 5f -;.....curr_out_
2b380 69 64 5f 69 64 78 2b 2b 3b 0a 09 09 7d 20 65 6c id_idx++;...} el
2b390 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 se {....CACKEY_D
2b3a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e EBUG_PRINTF(" .
2b3b0 2e 2e 20 4e 6f 74 20 61 6c 6c 20 25 69 20 28 6f .. Not all %i (o
2b3c0 6e 6c 79 20 66 6f 75 6e 64 20 25 69 29 20 61 74 nly found %i) at
2b3d0 74 72 69 62 75 74 65 73 20 63 68 65 63 6b 65 64 tributes checked
2b3e0 20 66 6f 72 20 66 6f 75 6e 64 2c 20 6e 6f 74 20 for found, not
2b3f0 61 64 64 69 6e 67 20 69 64 65 6e 74 69 74 79 3a adding identity:
2b400 25 69 22 2c 20 28 69 6e 74 29 20 63 61 63 6b 65 %i", (int) cacke
2b410 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
2b420 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 ion].search_quer
2b430 79 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 6d y_count, (int) m
2b440 61 74 63 68 65 64 5f 63 6f 75 6e 74 2c 20 28 69 atched_count, (i
2b450 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29 nt) curr_id_idx)
2b460 3b 0a 09 09 7d 0a 09 7d 0a 09 63 61 63 6b 65 79 ;...}..}..cackey
2b470 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
2b480 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 5f on].search_curr_
2b490 69 64 20 3d 20 63 75 72 72 5f 69 64 5f 69 64 78 id = curr_id_idx
2b4a0 3b 0a 09 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75 ;..*pulObjectCou
2b4b0 6e 74 20 3d 20 63 75 72 72 5f 6f 75 74 5f 69 64 nt = curr_out_id
2b4c0 5f 69 64 78 3b 0a 0a 23 69 66 64 65 66 20 43 41 _idx;..#ifdef CA
2b4d0 43 4b 45 59 5f 44 45 42 55 47 5f 53 45 41 52 43 CKEY_DEBUG_SEARC
2b4e0 48 5f 53 50 45 45 44 54 45 53 54 0a 09 67 65 74 H_SPEEDTEST..get
2b4f0 74 69 6d 65 6f 66 64 61 79 28 26 65 6e 64 2c 20 timeofday(&end,
2b500 4e 55 4c 4c 29 3b 0a 09 73 74 61 72 74 5f 69 6e NULL);..start_in
2b510 74 20 3d 20 28 73 74 61 72 74 2e 74 76 5f 73 65 t = (start.tv_se
2b520 63 20 2a 20 31 30 30 30 30 30 30 29 20 2b 20 73 c * 1000000) + s
2b530 74 61 72 74 2e 74 76 5f 75 73 65 63 3b 0a 09 65 tart.tv_usec;..e
2b540 6e 64 5f 69 6e 74 20 3d 20 28 65 6e 64 2e 74 76 nd_int = (end.tv
2b550 5f 73 65 63 20 2a 20 31 30 30 30 30 30 30 29 20 _sec * 1000000)
2b560 2b 20 65 6e 64 2e 74 76 5f 75 73 65 63 3b 0a 09 + end.tv_usec;..
2b570 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 fprintf(stderr,
2b580 22 53 65 61 72 63 68 20 74 6f 6f 6b 20 25 6c 75 "Search took %lu
2b590 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 5c 6e 22 microseconds\n"
2b5a0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
2b5b0 29 20 28 65 6e 64 5f 69 6e 74 20 2d 20 73 74 61 ) (end_int - sta
2b5c0 72 74 5f 69 6e 74 29 29 3b 0a 23 65 6e 64 69 66 rt_int));.#endif
2b5d0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 ...mutex_retval
2b5e0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 = cackey_mutex_u
2b5f0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 nlock(cackey_big
2b600 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 lock);..if (mute
2b610 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b x_retval != 0) {
2b620 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
2b630 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
2b640 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 Unlocking failed
2b650 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
2b660 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 KR_GENERAL_ERROR
2b670 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 );..}...CACKEY_D
2b680 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
2b690 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 urning CKR_OK (%
2b6a0 69 29 2c 20 6e 75 6d 20 6f 62 6a 65 63 74 73 20 i), num objects
2b6b0 3d 20 25 6c 75 22 2c 20 43 4b 52 5f 4f 4b 2c 20 = %lu", CKR_OK,
2b6c0 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 29 *pulObjectCount)
2b6d0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f ;...return(CKR_O
2b6e0 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 K);.}..CK_DEFINE
2b6f0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c _FUNCTION(CK_RV,
2b700 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46 69 C_FindObjectsFi
2b710 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f nal)(CK_SESSION_
2b720 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 HANDLE hSession)
2b730 20 7b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 69 64 78 {..CK_ULONG idx
2b740 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 ;..int mutex_ret
2b750 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 val;...CACKEY_DE
2b760 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
2b770 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 ed.");...if (!ca
2b780 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 ckey_initialized
2b790 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
2b7a0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
2b7b0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a . Not initializ
2b7c0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
2b7d0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f (CKR_CRYPTOKI_NO
2b7e0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a T_INITIALIZED);.
2b7f0 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f .}...if (hSessio
2b800 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 n == 0 || hSessi
2b810 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 on >= (sizeof(ca
2b820 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f ckey_sessions) /
2b830 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 sizeof(cackey_s
2b840 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a essions[0]))) {.
2b850 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
2b860 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 RINTF("Error. S
2b870 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 ession out of ra
2b880 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 nge.");......ret
2b890 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f urn(CKR_SESSION_
2b8a0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b HANDLE_INVALID);
2b8b0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 ..}...mutex_retv
2b8c0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 al = cackey_mute
2b8d0 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 x_lock(cackey_bi
2b8e0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 glock);..if (mut
2b8f0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 ex_retval != 0)
2b900 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
2b910 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
2b920 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e Locking failed.
2b930 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
2b940 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 R_GENERAL_ERROR)
2b950 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b ;..}...if (!cack
2b960 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
2b970 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a sion].active) {.
2b980 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 ..cackey_mutex_u
2b990 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 nlock(cackey_big
2b9a0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 lock);....CACKEY
2b9b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
2b9c0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e rror. Session n
2b9d0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 ot active.");...
2b9e0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 ...return(CKR_SE
2b9f0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 SSION_HANDLE_INV
2ba00 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 ALID);..}...if (
2ba10 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 !cackey_sessions
2ba20 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 [hSession].searc
2ba30 68 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 h_active) {...ca
2ba40 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 ckey_mutex_unloc
2ba50 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
2ba60 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 );....CACKEY_DEB
2ba70 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
2ba80 2e 20 20 53 65 61 72 63 68 20 6e 6f 74 20 61 63 . Search not ac
2ba90 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 tive.");......re
2baa0 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 turn(CKR_OPERATI
2bab0 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a ON_NOT_INITIALIZ
2bac0 45 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 ED);..}...cackey
2bad0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
2bae0 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 on].search_activ
2baf0 65 20 3d 20 30 3b 0a 0a 09 66 6f 72 20 28 69 64 e = 0;...for (id
2bb00 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 63 61 63 x = 0; idx < cac
2bb10 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
2bb20 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 ssion].search_qu
2bb30 65 72 79 5f 63 6f 75 6e 74 3b 20 69 64 78 2b 2b ery_count; idx++
2bb40 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 ) {...if (cackey
2bb50 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
2bb60 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 on].search_query
2bb70 5b 69 64 78 5d 2e 70 56 61 6c 75 65 29 20 7b 0a [idx].pValue) {.
2bb80 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 ...free(cackey_s
2bb90 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
2bba0 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69 ].search_query[i
2bbb0 64 78 5d 2e 70 56 61 6c 75 65 29 3b 0a 09 09 7d dx].pValue);...}
2bbc0 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 ..}...if (cackey
2bbd0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
2bbe0 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 on].search_query
2bbf0 29 20 7b 0a 09 09 66 72 65 65 28 63 61 63 6b 65 ) {...free(cacke
2bc00 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
2bc10 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 ion].search_quer
2bc20 79 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 y);..}...mutex_r
2bc30 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d etval = cackey_m
2bc40 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b utex_unlock(cack
2bc50 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 ey_biglock);..if
2bc60 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 (mutex_retval !
2bc70 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f = 0) {...CACKEY_
2bc80 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
2bc90 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 ror. Unlocking
2bca0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 failed.");....re
2bcb0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c turn(CKR_GENERAL
2bcc0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 _ERROR);..}...CA
2bcd0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
2bce0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 F("Returning CKR
2bcf0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f _OK (%i)", CKR_O
2bd00 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 K);...return(CKR
2bd10 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 _OK);.}..CK_DEFI
2bd20 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 NE_FUNCTION(CK_R
2bd30 56 2c 20 43 5f 45 6e 63 72 79 70 74 49 6e 69 74 V, C_EncryptInit
2bd40 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e )(CK_SESSION_HAN
2bd50 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b DLE hSession, CK
2bd60 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 _MECHANISM_PTR p
2bd70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 Mechanism, CK_OB
2bd80 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 JECT_HANDLE hKey
2bd90 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 ) {..CACKEY_DEBU
2bda0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 G_PRINTF("Called
2bdb0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b .");...if (!cack
2bdc0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 ey_initialized)
2bdd0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
2bde0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
2bdf0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 Not initialized
2be00 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
2be10 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f KR_CRYPTOKI_NOT_
2be20 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d INITIALIZED);..}
2be30 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
2be40 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e PRINTF("Returnin
2be50 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e g CKR_FUNCTION_N
2be60 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 OT_SUPPORTED (%i
2be70 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e )", CKR_FUNCTION
2be80 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
2be90 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 ...return(CKR_FU
2bea0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
2beb0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 RTED);.}..CK_DEF
2bec0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f INE_FUNCTION(CK_
2bed0 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 29 28 43 RV, C_Encrypt)(C
2bee0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 K_SESSION_HANDLE
2bef0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 hSession, CK_BY
2bf00 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b TE_PTR pData, CK
2bf10 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e _ULONG ulDataLen
2bf20 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 , CK_BYTE_PTR pE
2bf30 6e 63 72 79 70 74 65 64 44 61 74 61 2c 20 43 4b ncryptedData, CK
2bf40 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e _ULONG_PTR pulEn
2bf50 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e 29 20 cryptedDataLen)
2bf60 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f {..CACKEY_DEBUG_
2bf70 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
2bf80 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 );...if (!cackey
2bf90 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
2bfa0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
2bfb0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e RINTF("Error. N
2bfc0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 ot initialized."
2bfd0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
2bfe0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e _CRYPTOKI_NOT_IN
2bff0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
2c000 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
2c010 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
2c020 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
2c030 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 _SUPPORTED (%i)"
2c040 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e , CKR_FUNCTION_N
2c050 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a OT_SUPPORTED);..
2c060 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 .return(CKR_FUNC
2c070 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
2c080 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e ED);.}..CK_DEFIN
2c090 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 E_FUNCTION(CK_RV
2c0a0 2c 20 43 5f 45 6e 63 72 79 70 74 55 70 64 61 74 , C_EncryptUpdat
2c0b0 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 e)(CK_SESSION_HA
2c0c0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 NDLE hSession, C
2c0d0 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 K_BYTE_PTR pPart
2c0e0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 , CK_ULONG ulPar
2c0f0 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 tLen, CK_BYTE_PT
2c100 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 R pEncryptedPart
2c110 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 , CK_ULONG_PTR p
2c120 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c ulEncryptedPartL
2c130 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 en) {..CACKEY_DE
2c140 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
2c150 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 ed.");...if (!ca
2c160 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 ckey_initialized
2c170 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
2c180 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
2c190 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a . Not initializ
2c1a0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
2c1b0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f (CKR_CRYPTOKI_NO
2c1c0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a T_INITIALIZED);.
2c1d0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 .}...CACKEY_DEBU
2c1e0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
2c1f0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e ing CKR_FUNCTION
2c200 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 _NOT_SUPPORTED (
2c210 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 %i)", CKR_FUNCTI
2c220 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
2c230 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f );...return(CKR_
2c240 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
2c250 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 PORTED);.}..CK_D
2c260 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 EFINE_FUNCTION(C
2c270 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 46 K_RV, C_EncryptF
2c280 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e inal)(CK_SESSION
2c290 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e _HANDLE hSession
2c2a0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4c , CK_BYTE_PTR pL
2c2b0 61 73 74 45 6e 63 72 79 70 74 65 64 50 61 72 74 astEncryptedPart
2c2c0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 , CK_ULONG_PTR p
2c2d0 75 6c 4c 61 73 74 45 6e 63 72 79 70 74 65 64 50 ulLastEncryptedP
2c2e0 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 artLen) {..CACKE
2c2f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
2c300 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 Called.");...if
2c310 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c (!cackey_initial
2c320 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 ized) {...CACKEY
2c330 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
2c340 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 rror. Not initi
2c350 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 alized.");....re
2c360 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b turn(CKR_CRYPTOK
2c370 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 I_NOT_INITIALIZE
2c380 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f D);..}...CACKEY_
2c390 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
2c3a0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 turning CKR_FUNC
2c3b0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
2c3c0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 ED (%i)", CKR_FU
2c3d0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
2c3e0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 RTED);...return(
2c3f0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
2c400 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a _SUPPORTED);.}..
2c410 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 CK_DEFINE_FUNCTI
2c420 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 ON(CK_RV, C_Decr
2c430 79 70 74 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 yptInit)(CK_SESS
2c440 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 ION_HANDLE hSess
2c450 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 ion, CK_MECHANIS
2c460 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d M_PTR pMechanism
2c470 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 , CK_OBJECT_HAND
2c480 4c 45 20 68 4b 65 79 29 20 7b 0a 09 69 6e 74 20 LE hKey) {..int
2c490 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 mutex_retval;...
2c4a0 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43 4b 45 59 hKey--;...CACKEY
2c4b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 _DEBUG_PRINTF("C
2c4c0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 alled.");...if (
2c4d0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 !cackey_initiali
2c4e0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f zed) {...CACKEY_
2c4f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
2c500 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 ror. Not initia
2c510 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 lized.");....ret
2c520 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 urn(CKR_CRYPTOKI
2c530 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 _NOT_INITIALIZED
2c540 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 );..}...if (pMec
2c550 68 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c 4c 29 20 hanism == NULL)
2c560 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
2c570 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
2c580 70 4d 65 63 68 61 6e 69 73 6d 20 69 73 20 4e 55 pMechanism is NU
2c590 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e LL.");....return
2c5a0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 (CKR_ARGUMENTS_B
2c5b0 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d AD);..}...if (pM
2c5c0 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e echanism->mechan
2c5d0 69 73 6d 20 21 3d 20 43 4b 4d 5f 52 53 41 5f 50 ism != CKM_RSA_P
2c5e0 4b 43 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f KCS) {...CACKEY_
2c5f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
2c600 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 2d ror. pMechanism-
2c610 3e 6d 65 63 68 61 6e 69 73 6d 20 6e 6f 74 20 73 >mechanism not s
2c620 70 65 63 69 66 69 65 64 20 61 73 20 43 4b 4d 5f pecified as CKM_
2c630 52 53 41 5f 50 4b 43 53 22 29 3b 0a 0a 09 09 72 RSA_PKCS");....r
2c640 65 74 75 72 6e 28 43 4b 52 5f 4d 45 43 48 41 4e eturn(CKR_MECHAN
2c650 49 53 4d 5f 50 41 52 41 4d 5f 49 4e 56 41 4c 49 ISM_PARAM_INVALI
2c660 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 D);..}...if (hSe
2c670 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 ssion == 0 || hS
2c680 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f ession >= (sizeo
2c690 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e f(cackey_session
2c6a0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b s) / sizeof(cack
2c6b0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 ey_sessions[0]))
2c6c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
2c6d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
2c6e0 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f . Session out o
2c6f0 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 f range.");.....
2c700 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 .return(CKR_SESS
2c710 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c ION_HANDLE_INVAL
2c720 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f ID);..}...mutex_
2c730 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f retval = cackey_
2c740 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 mutex_lock(cacke
2c750 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 y_biglock);..if
2c760 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d (mutex_retval !=
2c770 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 0) {...CACKEY_D
2c780 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
2c790 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 or. Locking fai
2c7a0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 led.");....retur
2c7b0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 n(CKR_GENERAL_ER
2c7c0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 ROR);..}...if (!
2c7d0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
2c7e0 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 hSession].active
2c7f0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 ) {...cackey_mut
2c800 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 ex_unlock(cackey
2c810 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 _biglock);....CA
2c820 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
2c830 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 F("Error. Sessi
2c840 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 on not active.")
2c850 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b ;......return(CK
2c860 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 R_SESSION_HANDLE
2c870 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 _INVALID);..}...
2c880 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 if (cackey_sessi
2c890 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 ons[hSession].de
2c8a0 63 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b 0a crypt_active) {.
2c8b0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 ..cackey_mutex_u
2c8c0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 nlock(cackey_big
2c8d0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 lock);....CACKEY
2c8e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
2c8f0 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 20 61 rror. Decrypt a
2c900 6c 72 65 61 64 79 20 69 6e 20 70 72 6f 67 72 65 lready in progre
2c910 73 73 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 ss.");......retu
2c920 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e rn(CKR_OPERATION
2c930 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 69 _ACTIVE);..}...i
2c940 66 20 28 68 4b 65 79 20 3e 3d 20 63 61 63 6b 65 f (hKey >= cacke
2c950 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
2c960 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f ion].identities_
2c970 63 6f 75 6e 74 29 20 7b 0a 09 09 63 61 63 6b 65 count) {...cacke
2c980 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
2c990 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
2c9a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
2c9b0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
2c9c0 4b 65 79 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f Key handle out o
2c9d0 66 20 72 61 6e 67 65 20 28 72 65 71 75 65 73 74 f range (request
2c9e0 65 64 20 6b 65 79 20 25 6c 75 2c 20 6f 6e 6c 79 ed key %lu, only
2c9f0 20 25 6c 75 20 69 64 65 6e 74 69 74 69 65 73 20 %lu identities
2ca00 61 76 61 69 6c 61 62 6c 65 29 2e 22 2c 20 28 75 available).", (u
2ca10 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b nsigned long) hK
2ca20 65 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f ey, (unsigned lo
2ca30 6e 67 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69 ng) cackey_sessi
2ca40 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 ons[hSession].id
2ca50 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b entities_count);
2ca60 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4b ....return(CKR_K
2ca70 45 59 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 EY_HANDLE_INVALI
2ca80 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f D);..}...cackey_
2ca90 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
2caa0 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 n].decrypt_activ
2cab0 65 20 3d 20 31 3b 0a 0a 09 63 61 63 6b 65 79 5f e = 1;...cackey_
2cac0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
2cad0 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 61 n].decrypt_mecha
2cae0 6e 69 73 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73 nism = pMechanis
2caf0 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b 0a 09 63 m->mechanism;..c
2cb00 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
2cb10 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 Session].decrypt
2cb20 5f 6d 65 63 68 5f 70 61 72 6d 20 3d 20 70 4d 65 _mech_parm = pMe
2cb30 63 68 61 6e 69 73 6d 2d 3e 70 50 61 72 61 6d 65 chanism->pParame
2cb40 74 65 72 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 ter;..cackey_ses
2cb50 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
2cb60 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61 72 decrypt_mech_par
2cb70 6d 6c 65 6e 20 3d 20 70 4d 65 63 68 61 6e 69 73 mlen = pMechanis
2cb80 6d 2d 3e 75 6c 50 61 72 61 6d 65 74 65 72 4c 65 m->ulParameterLe
2cb90 6e 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 n;..cackey_sessi
2cba0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 ons[hSession].de
2cbb0 63 72 79 70 74 5f 69 64 65 6e 74 69 74 79 20 3d crypt_identity =
2cbc0 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e &cackey_session
2cbd0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e s[hSession].iden
2cbe0 74 69 74 69 65 73 5b 68 4b 65 79 5d 3b 0a 0a 09 tities[hKey];...
2cbf0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 mutex_retval = c
2cc00 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f ackey_mutex_unlo
2cc10 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
2cc20 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 k);..if (mutex_r
2cc30 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 etval != 0) {...
2cc40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
2cc50 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c NTF("Error. Unl
2cc60 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 ocking failed.")
2cc70 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
2cc80 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a GENERAL_ERROR);.
2cc90 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 .}...CACKEY_DEBU
2cca0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
2ccb0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 ing CKR_OK (%i)"
2ccc0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 , CKR_OK);...ret
2ccd0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a urn(CKR_OK);.}..
2cce0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 CK_DEFINE_FUNCTI
2ccf0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 ON(CK_RV, C_Decr
2cd00 79 70 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f ypt)(CK_SESSION_
2cd10 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c HANDLE hSession,
2cd20 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e CK_BYTE_PTR pEn
2cd30 63 72 79 70 74 65 64 44 61 74 61 2c 20 43 4b 5f cryptedData, CK_
2cd40 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 ULONG ulEncrypte
2cd50 64 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 dDataLen, CK_BYT
2cd60 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f E_PTR pData, CK_
2cd70 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 61 74 ULONG_PTR pulDat
2cd80 61 4c 65 6e 29 20 7b 0a 09 43 4b 5f 55 4c 4f 4e aLen) {..CK_ULON
2cd90 47 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 G datalen_update
2cda0 2c 20 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 3b , datalen_final;
2cdb0 0a 09 43 4b 5f 52 56 20 64 65 63 72 79 70 74 5f ..CK_RV decrypt_
2cdc0 72 65 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f ret;..int mutex_
2cdd0 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 retval;...CACKEY
2cde0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 _DEBUG_PRINTF("C
2cdf0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 alled.");...if (
2ce00 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 !cackey_initiali
2ce10 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f zed) {...CACKEY_
2ce20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
2ce30 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 ror. Not initia
2ce40 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 lized.");....ret
2ce50 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 urn(CKR_CRYPTOKI
2ce60 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 _NOT_INITIALIZED
2ce70 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 44 );..}...if (pulD
2ce80 61 74 61 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 ataLen == NULL)
2ce90 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
2cea0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
2ceb0 70 75 6c 44 61 74 61 4c 65 6e 20 69 73 20 4e 55 pulDataLen is NU
2cec0 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e LL.");....return
2ced0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 (CKR_ARGUMENTS_B
2cee0 41 44 29 3b 0a 09 7d 0a 0a 09 64 61 74 61 6c 65 AD);..}...datale
2cef0 6e 5f 75 70 64 61 74 65 20 3d 20 2a 70 75 6c 44 n_update = *pulD
2cf00 61 74 61 4c 65 6e 3b 0a 0a 09 64 65 63 72 79 70 ataLen;...decryp
2cf10 74 5f 72 65 74 20 3d 20 43 5f 44 65 63 72 79 70 t_ret = C_Decryp
2cf20 74 55 70 64 61 74 65 28 68 53 65 73 73 69 6f 6e tUpdate(hSession
2cf30 2c 20 70 45 6e 63 72 79 70 74 65 64 44 61 74 61 , pEncryptedData
2cf40 2c 20 75 6c 45 6e 63 72 79 70 74 65 64 44 61 74 , ulEncryptedDat
2cf50 61 4c 65 6e 2c 20 70 44 61 74 61 2c 20 26 64 61 aLen, pData, &da
2cf60 74 61 6c 65 6e 5f 75 70 64 61 74 65 29 3b 0a 09 talen_update);..
2cf70 69 66 20 28 64 65 63 72 79 70 74 5f 72 65 74 20 if (decrypt_ret
2cf80 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 != CKR_OK) {...C
2cf90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
2cfa0 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72 TF("Error. Decr
2cfb0 79 70 74 55 70 64 61 74 65 28 29 20 72 65 74 75 yptUpdate() retu
2cfc0 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72 76 rned failure (rv
2cfd0 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 = %lu).", (unsi
2cfe0 67 6e 65 64 20 6c 6f 6e 67 29 20 64 65 63 72 79 gned long) decry
2cff0 70 74 5f 72 65 74 29 3b 0a 0a 09 09 69 66 20 28 pt_ret);....if (
2d000 64 65 63 72 79 70 74 5f 72 65 74 20 21 3d 20 43 decrypt_ret != C
2d010 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d KR_BUFFER_TOO_SM
2d020 41 4c 4c 29 20 7b 0a 09 09 09 2f 2a 20 54 65 72 ALL) {..../* Ter
2d030 6d 69 6e 61 74 65 20 64 65 63 72 79 70 74 69 6f minate decryptio
2d040 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a n operation */..
2d050 09 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 ...mutex_retval
2d060 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c = cackey_mutex_l
2d070 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
2d080 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75 74 65 ck);....if (mute
2d090 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b x_retval != 0) {
2d0a0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
2d0b0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
2d0c0 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 Locking failed
2d0d0 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e .");......return
2d0e0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 (CKR_GENERAL_ERR
2d0f0 4f 52 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 OR);....}.....if
2d100 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f (!cackey_sessio
2d110 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 ns[hSession].act
2d120 69 76 65 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 ive) {.....cacke
2d130 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
2d140 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
2d150 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
2d160 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
2d170 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 Session not ac
2d180 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09 tive.");........
2d190 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 return(CKR_SESSI
2d1a0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 ON_HANDLE_INVALI
2d1b0 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 D);....}.....if
2d1c0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e (!cackey_session
2d1d0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 s[hSession].decr
2d1e0 79 70 74 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 ypt_active) {...
2d1f0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 ..cackey_mutex_u
2d200 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 nlock(cackey_big
2d210 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b lock);......CACK
2d220 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
2d230 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 "Error. Decrypt
2d240 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a not active.");.
2d250 09 09 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b .......return(CK
2d260 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f R_OPERATION_NOT_
2d270 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 09 INITIALIZED);...
2d280 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 .}.....cackey_se
2d290 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
2d2a0 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 20 .decrypt_active
2d2b0 3d 20 30 3b 0a 0a 09 09 09 6d 75 74 65 78 5f 72 = 0;.....mutex_r
2d2c0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d etval = cackey_m
2d2d0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b utex_unlock(cack
2d2e0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 ey_biglock);....
2d2f0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c if (mutex_retval
2d300 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 43 41 43 != 0) {.....CAC
2d310 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
2d320 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b ("Error. Unlock
2d330 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a ing failed.");..
2d340 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 ....return(CKR_G
2d350 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 ENERAL_ERROR);..
2d360 09 09 7d 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 ..}...}....retur
2d370 6e 28 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a n(decrypt_ret);.
2d380 09 7d 0a 0a 09 69 66 20 28 70 44 61 74 61 29 20 .}...if (pData)
2d390 7b 0a 09 09 70 44 61 74 61 20 2b 3d 20 64 61 74 {...pData += dat
2d3a0 61 6c 65 6e 5f 75 70 64 61 74 65 3b 0a 09 7d 0a alen_update;..}.
2d3b0 09 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 20 3d .datalen_final =
2d3c0 20 2a 70 75 6c 44 61 74 61 4c 65 6e 20 2d 20 64 *pulDataLen - d
2d3d0 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 3b 0a 0a atalen_update;..
2d3e0 09 64 65 63 72 79 70 74 5f 72 65 74 20 3d 20 43 .decrypt_ret = C
2d3f0 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 28 68 53 _DecryptFinal(hS
2d400 65 73 73 69 6f 6e 2c 20 70 44 61 74 61 2c 20 26 ession, pData, &
2d410 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 29 3b 0a datalen_final);.
2d420 09 69 66 20 28 64 65 63 72 79 70 74 5f 72 65 74 .if (decrypt_ret
2d430 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 != CKR_OK) {...
2d440 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
2d450 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 NTF("Error. Dec
2d460 72 79 70 74 46 69 6e 61 6c 28 29 20 72 65 74 75 ryptFinal() retu
2d470 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72 76 rned failure (rv
2d480 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 = %lu).", (unsi
2d490 67 6e 65 64 20 6c 6f 6e 67 29 20 64 65 63 72 79 gned long) decry
2d4a0 70 74 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 pt_ret);....retu
2d4b0 72 6e 28 64 65 63 72 79 70 74 5f 72 65 74 29 3b rn(decrypt_ret);
2d4c0 0a 09 7d 0a 0a 09 2a 70 75 6c 44 61 74 61 4c 65 ..}...*pulDataLe
2d4d0 6e 20 3d 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 n = datalen_upda
2d4e0 74 65 20 2b 20 64 61 74 61 6c 65 6e 5f 66 69 6e te + datalen_fin
2d4f0 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 al;...CACKEY_DEB
2d500 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
2d510 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 ning CKR_OK (%i)
2d520 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 ", CKR_OK);...re
2d530 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a turn(CKR_OK);.}.
2d540 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 .CK_DEFINE_FUNCT
2d550 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 ION(CK_RV, C_Dec
2d560 72 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53 ryptUpdate)(CK_S
2d570 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 ESSION_HANDLE hS
2d580 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f ession, CK_BYTE_
2d590 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 PTR pEncryptedPa
2d5a0 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 rt, CK_ULONG ulE
2d5b0 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c ncryptedPartLen,
2d5c0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 CK_BYTE_PTR pPa
2d5d0 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 rt, CK_ULONG_PTR
2d5e0 20 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 pulPartLen) {..
2d5f0 73 74 61 74 69 63 20 43 4b 5f 42 59 54 45 20 62 static CK_BYTE b
2d600 75 66 5b 31 36 33 38 34 5d 3b 0a 09 73 73 69 7a uf[16384];..ssiz
2d610 65 5f 74 20 62 75 66 6c 65 6e 3b 0a 09 43 4b 5f e_t buflen;..CK_
2d620 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a SLOT_ID slotID;.
2d630 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d 20 .CK_RV retval =
2d640 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f CKR_GENERAL_ERRO
2d650 52 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 R;..int mutex_re
2d660 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 tval;...CACKEY_D
2d670 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
2d680 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 led.");...if (!c
2d690 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 ackey_initialize
2d6a0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 d) {...CACKEY_DE
2d6b0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
2d6c0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 r. Not initiali
2d6d0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 zed.");....retur
2d6e0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e n(CKR_CRYPTOKI_N
2d6f0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b OT_INITIALIZED);
2d700 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 ..}...if (hSessi
2d710 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 on == 0 || hSess
2d720 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 ion >= (sizeof(c
2d730 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 ackey_sessions)
2d740 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f / sizeof(cackey_
2d750 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b sessions[0]))) {
2d760 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
2d770 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
2d780 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 Session out of r
2d790 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 ange.");......re
2d7a0 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e turn(CKR_SESSION
2d7b0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 _HANDLE_INVALID)
2d7c0 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 45 6e 63 72 ;..}...if (pEncr
2d7d0 79 70 74 65 64 50 61 72 74 20 3d 3d 20 4e 55 4c yptedPart == NUL
2d7e0 4c 20 26 26 20 75 6c 45 6e 63 72 79 70 74 65 64 L && ulEncrypted
2d7f0 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a PartLen == 0) {.
2d800 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75 ../* Short circu
2d810 69 74 20 69 66 20 77 65 20 61 72 65 20 61 73 6b it if we are ask
2d820 65 64 20 74 6f 20 64 65 63 72 79 70 74 20 6e 6f ed to decrypt no
2d830 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 43 41 thing... */...CA
2d840 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
2d850 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 F("Returning CKR
2d860 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20 _OK (%i) (short
2d870 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f circuit)", CKR_O
2d880 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b K);....return(CK
2d890 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 R_OK);..}...if (
2d8a0 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 20 3d pEncryptedPart =
2d8b0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b = NULL) {...CACK
2d8c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
2d8d0 22 45 72 72 6f 72 2e 20 70 45 6e 63 72 79 70 74 "Error. pEncrypt
2d8e0 65 64 50 61 72 74 20 69 73 20 4e 55 4c 4c 2c 20 edPart is NULL,
2d8f0 62 75 74 20 75 6c 45 6e 63 72 79 70 74 65 64 50 but ulEncryptedP
2d900 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74 20 30 2e artLen is not 0.
2d910 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
2d920 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 R_ARGUMENTS_BAD)
2d930 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 45 6e 63 ;..}...if (ulEnc
2d940 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20 3d 3d ryptedPartLen ==
2d950 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 0) {...CACKEY_D
2d960 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
2d970 6f 72 2e 20 75 6c 45 6e 63 72 79 70 74 65 64 50 or. ulEncryptedP
2d980 61 72 74 4c 65 6e 20 69 73 20 30 2c 20 62 75 74 artLen is 0, but
2d990 20 70 50 61 72 74 20 69 73 20 6e 6f 74 20 4e 55 pPart is not NU
2d9a0 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e LL.");....return
2d9b0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 (CKR_ARGUMENTS_B
2d9c0 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 AD);..}...if (pu
2d9d0 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 4e 55 4c 4c lPartLen == NULL
2d9e0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
2d9f0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
2da00 2e 20 70 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 . pulPartLen is
2da10 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 NULL.");....retu
2da20 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 rn(CKR_ARGUMENTS
2da30 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 _BAD);..}...mute
2da40 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 x_retval = cacke
2da50 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 y_mutex_lock(cac
2da60 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 key_biglock);..i
2da70 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 f (mutex_retval
2da80 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 != 0) {...CACKEY
2da90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
2daa0 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 rror. Locking f
2dab0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 ailed.");....ret
2dac0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f urn(CKR_GENERAL_
2dad0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 ERROR);..}...if
2dae0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e (!cackey_session
2daf0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 s[hSession].acti
2db00 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d ve) {...cackey_m
2db10 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b utex_unlock(cack
2db20 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 ey_biglock);....
2db30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
2db40 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 NTF("Error. Ses
2db50 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e sion not active.
2db60 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 ");......return(
2db70 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 CKR_SESSION_HAND
2db80 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a LE_INVALID);..}.
2db90 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 ..if (!cackey_se
2dba0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
2dbb0 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 29 .decrypt_active)
2dbc0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 {...cackey_mute
2dbd0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
2dbe0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 biglock);....CAC
2dbf0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
2dc00 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 ("Error. Decryp
2dc10 74 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b t not active.");
2dc20 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 ......return(CKR
2dc30 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 _OPERATION_NOT_I
2dc40 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
2dc50 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 ..slotID = cacke
2dc60 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
2dc70 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 ion].slotID;...i
2dc80 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c f (slotID < 0 ||
2dc90 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 slotID >= (size
2dca0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 of(cackey_slots)
2dcb0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 / sizeof(cackey
2dcc0 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 _slots[0]))) {..
2dcd0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
2dce0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 INTF("Error. Inv
2dcf0 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 alid slot reques
2dd00 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 ted (%lu), outsi
2dd10 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 de of valid rang
2dd20 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 e", slotID);....
2dd30 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 return(CKR_GENER
2dd40 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 AL_ERROR);..}...
2dd50 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 if (cackey_slots
2dd60 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 [slotID].active
2dd70 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 == 0) {...CACKEY
2dd80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
2dd90 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c rror. Invalid sl
2dda0 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c ot requested (%l
2ddb0 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 u), slot not cur
2ddc0 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 rently active",
2ddd0 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b slotID);....cack
2dde0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 ey_mutex_unlock(
2ddf0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
2de00 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 ....return(CKR_G
2de10 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 ENERAL_ERROR);..
2de20 7d 0a 0a 09 73 77 69 74 63 68 20 28 63 61 63 6b }...switch (cack
2de30 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
2de40 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 sion].decrypt_me
2de50 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61 73 chanism) {...cas
2de60 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a e CKM_RSA_PKCS:.
2de70 09 09 09 2f 2a 20 41 73 6b 20 63 61 72 64 20 74 .../* Ask card t
2de80 6f 20 64 65 63 72 79 70 74 20 2a 2f 0a 09 09 09 o decrypt */....
2de90 62 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65 79 5f buflen = cackey_
2dea0 73 69 67 6e 64 65 63 72 79 70 74 28 26 63 61 63 signdecrypt(&cac
2deb0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 key_slots[slotID
2dec0 5d 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f ], cackey_sessio
2ded0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 ns[hSession].dec
2dee0 72 79 70 74 5f 69 64 65 6e 74 69 74 79 2c 20 70 rypt_identity, p
2def0 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 75 EncryptedPart, u
2df00 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 lEncryptedPartLe
2df10 6e 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 n, buf, sizeof(b
2df20 75 66 29 2c 20 30 2c 20 31 29 3b 0a 0a 09 09 09 uf), 0, 1);.....
2df30 69 66 20 28 62 75 66 6c 65 6e 20 3d 3d 20 43 41 if (buflen == CA
2df40 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 CKEY_PCSC_E_NEED
2df50 4c 4f 47 49 4e 20 26 26 20 63 61 63 6b 65 79 5f LOGIN && cackey_
2df60 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 21 3d 20 4e pin_command != N
2df70 55 4c 4c 29 20 7b 0a 09 09 09 09 69 66 20 28 5f ULL) {.....if (_
2df80 43 5f 4c 6f 67 69 6e 4d 75 74 65 78 41 72 67 28 C_LoginMutexArg(
2df90 68 53 65 73 73 69 6f 6e 2c 20 43 4b 55 5f 55 53 hSession, CKU_US
2dfa0 45 52 2c 20 4e 55 4c 4c 2c 20 30 2c 20 30 29 20 ER, NULL, 0, 0)
2dfb0 3d 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 == CKR_OK) {....
2dfc0 09 09 62 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65 ..buflen = cacke
2dfd0 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28 26 63 y_signdecrypt(&c
2dfe0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 ackey_slots[slot
2dff0 49 44 5d 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 ID], cackey_sess
2e000 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 ions[hSession].d
2e010 65 63 72 79 70 74 5f 69 64 65 6e 74 69 74 79 2c ecrypt_identity,
2e020 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c pEncryptedPart,
2e030 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 ulEncryptedPart
2e040 4c 65 6e 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 Len, buf, sizeof
2e050 28 62 75 66 29 2c 20 30 2c 20 31 29 3b 0a 09 09 (buf), 0, 1);...
2e060 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 ..}....}.....if
2e070 28 62 75 66 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 (buflen < 0) {..
2e080 09 09 09 2f 2a 20 44 65 63 72 79 70 74 69 6f 6e .../* Decryption
2e090 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 09 09 09 09 failed. */.....
2e0a0 69 66 20 28 62 75 66 6c 65 6e 20 3d 3d 20 43 41 if (buflen == CA
2e0b0 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 CKEY_PCSC_E_NEED
2e0c0 4c 4f 47 49 4e 29 20 7b 0a 09 09 09 09 09 72 65 LOGIN) {......re
2e0d0 74 76 61 6c 20 3d 20 43 4b 52 5f 55 53 45 52 5f tval = CKR_USER_
2e0e0 4e 4f 54 5f 4c 4f 47 47 45 44 5f 49 4e 3b 0a 09 NOT_LOGGED_IN;..
2e0f0 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28 62 75 ...} else if (bu
2e100 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 flen == CACKEY_P
2e110 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e CSC_E_TOKENABSEN
2e120 54 29 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c T) {......retval
2e130 20 3d 20 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 = CKR_DEVICE_RE
2e140 4d 4f 56 45 44 3b 0a 09 09 09 09 7d 20 65 6c 73 MOVED;.....} els
2e150 65 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f e {......CACKEY_
2e160 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 DEBUG_PRINTF("Fa
2e170 69 6c 65 64 20 74 6f 20 73 65 6e 64 20 41 50 44 iled to send APD
2e180 55 2c 20 65 72 72 6f 72 20 3d 20 25 6c 69 22 2c U, error = %li",
2e190 20 28 6c 6f 6e 67 20 69 6e 74 29 20 62 75 66 6c (long int) bufl
2e1a0 65 6e 29 3b 0a 0a 09 09 09 09 09 72 65 74 76 61 en);.......retva
2e1b0 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f l = CKR_GENERAL_
2e1c0 45 52 52 4f 52 3b 0a 09 09 09 09 7d 0a 09 09 09 ERROR;.....}....
2e1d0 7d 20 65 6c 73 65 20 69 66 20 28 28 28 75 6e 73 } else if (((uns
2e1e0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62 75 66 6c igned long) bufl
2e1f0 65 6e 29 20 3e 20 2a 70 75 6c 50 61 72 74 4c 65 en) > *pulPartLe
2e200 6e 20 26 26 20 70 50 61 72 74 29 20 7b 0a 09 09 n && pPart) {...
2e210 09 09 2f 2a 20 44 65 63 72 79 70 74 65 64 20 64 ../* Decrypted d
2e220 61 74 61 20 74 6f 6f 20 6c 61 72 67 65 20 2a 2f ata too large */
2e230 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b .....retval = CK
2e240 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 R_BUFFER_TOO_SMA
2e250 4c 4c 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a LL;....} else {.
2e260 09 09 09 09 69 66 20 28 70 50 61 72 74 29 20 7b ....if (pPart) {
2e270 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 70 50 61 ......memcpy(pPa
2e280 72 74 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e 29 rt, buf, buflen)
2e290 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2a 70 75 ;.....}......*pu
2e2a0 6c 50 61 72 74 4c 65 6e 20 3d 20 62 75 66 6c 65 lPartLen = bufle
2e2b0 6e 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 3d n;......retval =
2e2c0 20 43 4b 52 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a 09 CKR_OK;....}...
2e2d0 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 6d 75 ..break;..}...mu
2e2e0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 tex_retval = cac
2e2f0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b key_mutex_unlock
2e300 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 (cackey_biglock)
2e310 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 ;..if (mutex_ret
2e320 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 val != 0) {...CA
2e330 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
2e340 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 F("Error. Unloc
2e350 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a king failed.");.
2e360 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 ...return(CKR_GE
2e370 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d NERAL_ERROR);..}
2e380 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
2e390 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e PRINTF("Returnin
2e3a0 67 20 25 69 22 2c 20 28 69 6e 74 29 20 72 65 74 g %i", (int) ret
2e3b0 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 val);...return(r
2e3c0 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 etval);.}..CK_DE
2e3d0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b FINE_FUNCTION(CK
2e3e0 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 46 69 _RV, C_DecryptFi
2e3f0 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f nal)(CK_SESSION_
2e400 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c HANDLE hSession,
2e410 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4c 61 CK_BYTE_PTR pLa
2e420 73 74 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 stPart, CK_ULONG
2e430 5f 50 54 52 20 70 75 6c 4c 61 73 74 50 61 72 74 _PTR pulLastPart
2e440 4c 65 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 Len) {..int mute
2e450 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 74 x_retval;..int t
2e460 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79 70 74 erminate_decrypt
2e470 20 3d 20 31 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 = 1;...CACKEY_D
2e480 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
2e490 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 led.");...if (!c
2e4a0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 ackey_initialize
2e4b0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 d) {...CACKEY_DE
2e4c0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
2e4d0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 r. Not initiali
2e4e0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 zed.");....retur
2e4f0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e n(CKR_CRYPTOKI_N
2e500 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b OT_INITIALIZED);
2e510 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 ..}...if (hSessi
2e520 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 on == 0 || hSess
2e530 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 ion >= (sizeof(c
2e540 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 ackey_sessions)
2e550 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f / sizeof(cackey_
2e560 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b sessions[0]))) {
2e570 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
2e580 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
2e590 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 Session out of r
2e5a0 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 ange.");......re
2e5b0 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e turn(CKR_SESSION
2e5c0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 _HANDLE_INVALID)
2e5d0 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 4c 61 ;..}...if (pulLa
2e5e0 73 74 50 61 72 74 4c 65 6e 20 3d 3d 20 4e 55 4c stPartLen == NUL
2e5f0 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 L) {...CACKEY_DE
2e600 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
2e610 72 2e 20 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 r. pulLastPartLe
2e620 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 n is NULL.");...
2e630 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 .return(CKR_ARGU
2e640 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a MENTS_BAD);..}..
2e650 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 .mutex_retval =
2e660 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 cackey_mutex_loc
2e670 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
2e680 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 );..if (mutex_re
2e690 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 tval != 0) {...C
2e6a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
2e6b0 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b TF("Error. Lock
2e6c0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a ing failed.");..
2e6d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e ..return(CKR_GEN
2e6e0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a ERAL_ERROR);..}.
2e6f0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 ..if (!cackey_se
2e700 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
2e710 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 .active) {...cac
2e720 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b key_mutex_unlock
2e730 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 (cackey_biglock)
2e740 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 ;....CACKEY_DEBU
2e750 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
2e760 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 Session not ac
2e770 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 tive.");......re
2e780 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e turn(CKR_SESSION
2e790 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 _HANDLE_INVALID)
2e7a0 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b ;..}...if (!cack
2e7b0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
2e7c0 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 sion].decrypt_ac
2e7d0 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 tive) {...cackey
2e7e0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 _mutex_unlock(ca
2e7f0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a ckey_biglock);..
2e800 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
2e810 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 RINTF("Error. D
2e820 65 63 72 79 70 74 20 6e 6f 74 20 61 63 74 69 76 ecrypt not activ
2e830 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 e.");......retur
2e840 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f n(CKR_OPERATION_
2e850 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 NOT_INITIALIZED)
2e860 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 4c 61 73 74 50 ;..}...*pulLastP
2e870 61 72 74 4c 65 6e 20 3d 20 30 3b 0a 0a 09 69 66 artLen = 0;...if
2e880 20 28 70 4c 61 73 74 50 61 72 74 20 3d 3d 20 4e (pLastPart == N
2e890 55 4c 4c 29 20 7b 0a 09 09 74 65 72 6d 69 6e 61 ULL) {...termina
2e8a0 74 65 5f 64 65 63 72 79 70 74 20 3d 20 30 3b 0a te_decrypt = 0;.
2e8b0 09 7d 0a 0a 09 69 66 20 28 74 65 72 6d 69 6e 61 .}...if (termina
2e8c0 74 65 5f 64 65 63 72 79 70 74 29 20 7b 0a 09 09 te_decrypt) {...
2e8d0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
2e8e0 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 hSession].decryp
2e8f0 74 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d t_active = 0;..}
2e900 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 ...mutex_retval
2e910 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 = cackey_mutex_u
2e920 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 nlock(cackey_big
2e930 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 lock);..if (mute
2e940 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b x_retval != 0) {
2e950 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
2e960 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
2e970 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 Unlocking failed
2e980 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
2e990 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 KR_GENERAL_ERROR
2e9a0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 );..}...CACKEY_D
2e9b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
2e9c0 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 urning CKR_OK (%
2e9d0 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 i)", CKR_OK);...
2e9e0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a return(CKR_OK);.
2e9f0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e }..CK_DEFINE_FUN
2ea00 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 CTION(CK_RV, C_D
2ea10 69 67 65 73 74 49 6e 69 74 29 28 43 4b 5f 53 45 igestInit)(CK_SE
2ea20 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 SSION_HANDLE hSe
2ea30 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e ssion, CK_MECHAN
2ea40 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 ISM_PTR pMechani
2ea50 73 6d 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 sm) {..CACKEY_DE
2ea60 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
2ea70 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 ed.");...if (!ca
2ea80 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 ckey_initialized
2ea90 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
2eaa0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
2eab0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a . Not initializ
2eac0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
2ead0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f (CKR_CRYPTOKI_NO
2eae0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a T_INITIALIZED);.
2eaf0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 .}...CACKEY_DEBU
2eb00 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
2eb10 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e ing CKR_FUNCTION
2eb20 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 _NOT_SUPPORTED (
2eb30 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 %i)", CKR_FUNCTI
2eb40 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
2eb50 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f );...return(CKR_
2eb60 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
2eb70 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 PORTED);.}..CK_D
2eb80 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 EFINE_FUNCTION(C
2eb90 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 29 28 K_RV, C_Digest)(
2eba0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c CK_SESSION_HANDL
2ebb0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 E hSession, CK_B
2ebc0 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 YTE_PTR pData, C
2ebd0 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 K_ULONG ulDataLe
2ebe0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 n, CK_BYTE_PTR p
2ebf0 44 69 67 65 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 Digest, CK_ULONG
2ec00 5f 50 54 52 20 70 75 6c 44 69 67 65 73 74 4c 65 _PTR pulDigestLe
2ec10 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 n) {..CACKEY_DEB
2ec20 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
2ec30 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 d.");...if (!cac
2ec40 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 key_initialized)
2ec50 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
2ec60 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
2ec70 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 Not initialize
2ec80 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
2ec90 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 CKR_CRYPTOKI_NOT
2eca0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 _INITIALIZED);..
2ecb0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 }...CACKEY_DEBUG
2ecc0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
2ecd0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f ng CKR_FUNCTION_
2ece0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 NOT_SUPPORTED (%
2ecf0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f i)", CKR_FUNCTIO
2ed00 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 N_NOT_SUPPORTED)
2ed10 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 ;...return(CKR_F
2ed20 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
2ed30 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 ORTED);.}..CK_DE
2ed40 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b FINE_FUNCTION(CK
2ed50 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 55 70 64 _RV, C_DigestUpd
2ed60 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f ate)(CK_SESSION_
2ed70 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c HANDLE hSession,
2ed80 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 CK_BYTE_PTR pPa
2ed90 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 rt, CK_ULONG ulP
2eda0 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 artLen) {..CACKE
2edb0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
2edc0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 Called.");...if
2edd0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c (!cackey_initial
2ede0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 ized) {...CACKEY
2edf0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
2ee00 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 rror. Not initi
2ee10 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 alized.");....re
2ee20 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b turn(CKR_CRYPTOK
2ee30 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 I_NOT_INITIALIZE
2ee40 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f D);..}...CACKEY_
2ee50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
2ee60 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 turning CKR_FUNC
2ee70 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
2ee80 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 ED (%i)", CKR_FU
2ee90 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
2eea0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 RTED);...return(
2eeb0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
2eec0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a _SUPPORTED);.}..
2eed0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 CK_DEFINE_FUNCTI
2eee0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 ON(CK_RV, C_Dige
2eef0 73 74 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f stKey)(CK_SESSIO
2ef00 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f N_HANDLE hSessio
2ef10 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e n, CK_OBJECT_HAN
2ef20 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 DLE hKey) {..CAC
2ef30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
2ef40 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 ("Called.");...i
2ef50 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 f (!cackey_initi
2ef60 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b alized) {...CACK
2ef70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
2ef80 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 "Error. Not ini
2ef90 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 tialized.");....
2efa0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 return(CKR_CRYPT
2efb0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 OKI_NOT_INITIALI
2efc0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 ZED);..}...CACKE
2efd0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
2efe0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 Returning CKR_FU
2eff0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
2f000 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f RTED (%i)", CKR_
2f010 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
2f020 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 PORTED);...retur
2f030 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e n(CKR_FUNCTION_N
2f040 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d OT_SUPPORTED);.}
2f050 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 ..CK_DEFINE_FUNC
2f060 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 TION(CK_RV, C_Di
2f070 67 65 73 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45 gestFinal)(CK_SE
2f080 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 SSION_HANDLE hSe
2f090 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 ssion, CK_BYTE_P
2f0a0 54 52 20 70 44 69 67 65 73 74 2c 20 43 4b 5f 55 TR pDigest, CK_U
2f0b0 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 69 67 65 LONG_PTR pulDige
2f0c0 73 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 stLen) {..CACKEY
2f0d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 _DEBUG_PRINTF("C
2f0e0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 alled.");...if (
2f0f0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 !cackey_initiali
2f100 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f zed) {...CACKEY_
2f110 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
2f120 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 ror. Not initia
2f130 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 lized.");....ret
2f140 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 urn(CKR_CRYPTOKI
2f150 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 _NOT_INITIALIZED
2f160 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 );..}...CACKEY_D
2f170 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
2f180 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 urning CKR_FUNCT
2f190 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
2f1a0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e D (%i)", CKR_FUN
2f1b0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
2f1c0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 TED);...return(C
2f1d0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
2f1e0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 SUPPORTED);.}..C
2f1f0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f K_DEFINE_FUNCTIO
2f200 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 49 N(CK_RV, C_SignI
2f210 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f nit)(CK_SESSION_
2f220 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c HANDLE hSession,
2f230 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 CK_MECHANISM_PT
2f240 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b R pMechanism, CK
2f250 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 _OBJECT_HANDLE h
2f260 4b 65 79 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 Key) {..int mute
2f270 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 68 4b 65 79 x_retval;...hKey
2f280 2d 2d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 --;...CACKEY_DEB
2f290 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
2f2a0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 d.");...if (!cac
2f2b0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 key_initialized)
2f2c0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
2f2d0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
2f2e0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 Not initialize
2f2f0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
2f300 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 CKR_CRYPTOKI_NOT
2f310 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 _INITIALIZED);..
2f320 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69 }...if (pMechani
2f330 73 6d 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 sm == NULL) {...
2f340 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
2f350 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 NTF("Error. pMec
2f360 68 61 6e 69 73 6d 20 69 73 20 4e 55 4c 4c 2e 22 hanism is NULL."
2f370 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
2f380 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b _ARGUMENTS_BAD);
2f390 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 ..}...if (pMecha
2f3a0 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 nism->mechanism
2f3b0 21 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 29 != CKM_RSA_PKCS)
2f3c0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
2f3d0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
2f3e0 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 pMechanism->mec
2f3f0 68 61 6e 69 73 6d 20 6e 6f 74 20 73 70 65 63 69 hanism not speci
2f400 66 69 65 64 20 61 73 20 43 4b 4d 5f 52 53 41 5f fied as CKM_RSA_
2f410 50 4b 43 53 22 29 3b 0a 0a 09 09 72 65 74 75 72 PKCS");....retur
2f420 6e 28 43 4b 52 5f 4d 45 43 48 41 4e 49 53 4d 5f n(CKR_MECHANISM_
2f430 50 41 52 41 4d 5f 49 4e 56 41 4c 49 44 29 3b 0a PARAM_INVALID);.
2f440 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f .}...if (hSessio
2f450 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 n == 0 || hSessi
2f460 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 on >= (sizeof(ca
2f470 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f ckey_sessions) /
2f480 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 sizeof(cackey_s
2f490 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a essions[0]))) {.
2f4a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
2f4b0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 RINTF("Error. S
2f4c0 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 ession out of ra
2f4d0 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 nge.");......ret
2f4e0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f urn(CKR_SESSION_
2f4f0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b HANDLE_INVALID);
2f500 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 ..}...mutex_retv
2f510 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 al = cackey_mute
2f520 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 x_lock(cackey_bi
2f530 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 glock);..if (mut
2f540 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 ex_retval != 0)
2f550 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
2f560 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
2f570 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e Locking failed.
2f580 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
2f590 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 R_GENERAL_ERROR)
2f5a0 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b ;..}...if (!cack
2f5b0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
2f5c0 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a sion].active) {.
2f5d0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 ..cackey_mutex_u
2f5e0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 nlock(cackey_big
2f5f0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 lock);....CACKEY
2f600 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
2f610 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e rror. Session n
2f620 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 ot active.");...
2f630 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 ...return(CKR_SE
2f640 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 SSION_HANDLE_INV
2f650 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 ALID);..}...if (
2f660 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
2f670 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 hSession].sign_a
2f680 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 ctive) {...cacke
2f690 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
2f6a0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
2f6b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
2f6c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
2f6d0 53 69 67 6e 20 61 6c 72 65 61 64 79 20 69 6e 20 Sign already in
2f6e0 70 72 6f 67 72 65 73 73 2e 22 29 3b 0a 09 09 0a progress.");....
2f6f0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 ..return(CKR_OPE
2f700 52 41 54 49 4f 4e 5f 41 43 54 49 56 45 29 3b 0a RATION_ACTIVE);.
2f710 09 7d 0a 0a 09 69 66 20 28 68 4b 65 79 20 3e 3d .}...if (hKey >=
2f720 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 cackey_sessions
2f730 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 [hSession].ident
2f740 69 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 ities_count) {..
2f750 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e .cackey_mutex_un
2f760 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
2f770 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f ock);....CACKEY_
2f780 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
2f790 72 6f 72 2e 20 20 4b 65 79 20 68 61 6e 64 6c 65 ror. Key handle
2f7a0 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 28 72 out of range (r
2f7b0 65 71 75 65 73 74 65 64 20 6b 65 79 20 25 6c 75 equested key %lu
2f7c0 2c 20 6f 6e 6c 79 20 25 6c 75 20 69 64 65 6e 74 , only %lu ident
2f7d0 69 74 69 65 73 20 61 76 61 69 6c 61 62 6c 65 29 ities available)
2f7e0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f .", (unsigned lo
2f7f0 6e 67 29 20 68 4b 65 79 2c 20 28 75 6e 73 69 67 ng) hKey, (unsig
2f800 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63 6b 65 79 ned long) cackey
2f810 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
2f820 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 on].identities_c
2f830 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e ount);....return
2f840 28 43 4b 52 5f 4b 45 59 5f 48 41 4e 44 4c 45 5f (CKR_KEY_HANDLE_
2f850 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 INVALID);..}...c
2f860 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
2f870 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 Session].sign_ac
2f880 74 69 76 65 20 3d 20 31 3b 0a 0a 09 63 61 63 6b tive = 1;...cack
2f890 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
2f8a0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 sion].sign_mecha
2f8b0 6e 69 73 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73 nism = pMechanis
2f8c0 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b 0a 0a 09 m->mechanism;...
2f8d0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
2f8e0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 hSession].sign_b
2f8f0 75 66 6c 65 6e 20 3d 20 31 32 38 3b 0a 09 63 61 uflen = 128;..ca
2f900 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
2f910 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 ession].sign_buf
2f920 75 73 65 64 20 3d 20 30 3b 0a 09 63 61 63 6b 65 used = 0;..cacke
2f930 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
2f940 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 3d 20 ion].sign_buf =
2f950 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 malloc(sizeof(*c
2f960 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
2f970 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 Session].sign_bu
2f980 66 29 20 2a 20 63 61 63 6b 65 79 5f 73 65 73 73 f) * cackey_sess
2f990 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 ions[hSession].s
2f9a0 69 67 6e 5f 62 75 66 6c 65 6e 29 3b 0a 0a 09 43 ign_buflen);...C
2f9b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
2f9c0 54 46 28 22 53 65 73 73 69 6f 6e 20 25 6c 75 20 TF("Session %lu
2f9d0 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 20 69 73 sign_identity is
2f9e0 20 25 70 20 28 69 64 65 6e 74 69 74 79 20 23 25 %p (identity #%
2f9f0 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 lu)", (unsigned
2fa00 6c 6f 6e 67 29 20 68 53 65 73 73 69 6f 6e 2c 20 long) hSession,
2fa10 28 76 6f 69 64 20 2a 29 20 26 63 61 63 6b 65 79 (void *) &cackey
2fa20 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
2fa30 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 68 on].identities[h
2fa40 4b 65 79 5d 2c 20 28 75 6e 73 69 67 6e 65 64 20 Key], (unsigned
2fa50 6c 6f 6e 67 29 20 68 4b 65 79 29 3b 0a 09 63 61 long) hKey);..ca
2fa60 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
2fa70 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 ession].sign_ide
2fa80 6e 74 69 74 79 20 3d 20 26 63 61 63 6b 65 79 5f ntity = &cackey_
2fa90 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
2faa0 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 68 4b n].identities[hK
2fab0 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 ey];...mutex_ret
2fac0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 val = cackey_mut
2fad0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 ex_unlock(cackey
2fae0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 _biglock);..if (
2faf0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 mutex_retval !=
2fb00 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 0) {...CACKEY_DE
2fb10 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
2fb20 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 r. Unlocking fa
2fb30 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 iled.");....retu
2fb40 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 rn(CKR_GENERAL_E
2fb50 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b RROR);..}...CACK
2fb60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
2fb70 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f "Returning CKR_O
2fb80 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 K (%i)", CKR_OK)
2fb90 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f ;...return(CKR_O
2fba0 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 K);.}..CK_DEFINE
2fbb0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c _FUNCTION(CK_RV,
2fbc0 20 43 5f 53 69 67 6e 29 28 43 4b 5f 53 45 53 53 C_Sign)(CK_SESS
2fbd0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 ION_HANDLE hSess
2fbe0 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 ion, CK_BYTE_PTR
2fbf0 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 pData, CK_ULONG
2fc00 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 ulDataLen, CK_B
2fc10 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 YTE_PTR pSignatu
2fc20 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 re, CK_ULONG_PTR
2fc30 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e pulSignatureLen
2fc40 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f ) {..unsigned lo
2fc50 6e 67 20 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 ng start_sign_bu
2fc60 66 75 73 65 64 3b 0a 09 43 4b 5f 52 56 20 73 69 fused;..CK_RV si
2fc70 67 6e 5f 72 65 74 3b 0a 09 69 6e 74 20 6d 75 74 gn_ret;..int mut
2fc80 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 ex_retval;...CAC
2fc90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
2fca0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 ("Called.");...i
2fcb0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 f (!cackey_initi
2fcc0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b alized) {...CACK
2fcd0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
2fce0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 "Error. Not ini
2fcf0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 tialized.");....
2fd00 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 return(CKR_CRYPT
2fd10 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 OKI_NOT_INITIALI
2fd20 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 ZED);..}...if (h
2fd30 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 Session == 0 ||
2fd40 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a hSession >= (siz
2fd50 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 eof(cackey_sessi
2fd60 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 ons) / sizeof(ca
2fd70 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d ckey_sessions[0]
2fd80 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ))) {...CACKEY_D
2fd90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
2fda0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 or. Session out
2fdb0 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 of range.");...
2fdc0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 ...return(CKR_SE
2fdd0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 SSION_HANDLE_INV
2fde0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 74 61 72 ALID);..}...star
2fdf0 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d t_sign_bufused =
2fe00 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 cackey_sessions
2fe10 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f [hSession].sign_
2fe20 62 75 66 75 73 65 64 3b 0a 0a 09 73 69 67 6e 5f bufused;...sign_
2fe30 72 65 74 20 3d 20 43 5f 53 69 67 6e 55 70 64 61 ret = C_SignUpda
2fe40 74 65 28 68 53 65 73 73 69 6f 6e 2c 20 70 44 61 te(hSession, pDa
2fe50 74 61 2c 20 75 6c 44 61 74 61 4c 65 6e 29 3b 0a ta, ulDataLen);.
2fe60 09 69 66 20 28 73 69 67 6e 5f 72 65 74 20 21 3d .if (sign_ret !=
2fe70 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 CKR_OK) {...CAC
2fe80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
2fe90 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 55 70 ("Error. SignUp
2fea0 64 61 74 65 28 29 20 72 65 74 75 72 6e 65 64 20 date() returned
2feb0 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c failure (rv = %l
2fec0 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 u).", (unsigned
2fed0 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74 29 3b long) sign_ret);
2fee0 0a 0a 09 09 69 66 20 28 73 69 67 6e 5f 72 65 74 ....if (sign_ret
2fef0 20 21 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 != CKR_BUFFER_T
2ff00 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 09 6d OO_SMALL) {....m
2ff10 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 utex_retval = ca
2ff20 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 ckey_mutex_lock(
2ff30 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
2ff40 0a 09 09 09 69 66 20 28 6d 75 74 65 78 5f 72 65 ....if (mutex_re
2ff50 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 tval != 0) {....
2ff60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
2ff70 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f INTF("Error. Lo
2ff80 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b cking failed.");
2ff90 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 ......return(CKR
2ffa0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b _GENERAL_ERROR);
2ffb0 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 21 63 ....}.....if (!c
2ffc0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
2ffd0 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 Session].active)
2ffe0 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 {.....cackey_mu
2fff0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 tex_unlock(cacke
30000 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 y_biglock);.....
30010 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
30020 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 INTF("Error. Se
30030 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 ssion not active
30040 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72 65 74 75 .");........retu
30050 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 rn(CKR_SESSION_H
30060 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a ANDLE_INVALID);.
30070 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 21 63 61 ...}.....if (!ca
30080 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
30090 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 ession].sign_act
300a0 69 76 65 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 ive) {.....cacke
300b0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
300c0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
300d0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
300e0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
300f0 20 20 53 69 67 6e 20 6e 6f 74 20 61 63 74 69 76 Sign not activ
30100 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72 65 74 e.");........ret
30110 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f urn(CKR_OPERATIO
30120 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 N_NOT_INITIALIZE
30130 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 D);....}.....cac
30140 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
30150 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 ssion].sign_acti
30160 76 65 20 3d 20 30 3b 0a 0a 09 09 09 6d 75 74 65 ve = 0;.....mute
30170 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 x_retval = cacke
30180 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
30190 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
301a0 09 09 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 ...if (mutex_ret
301b0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 val != 0) {.....
301c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
301d0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c NTF("Error. Unl
301e0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 ocking failed.")
301f0 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b ;......return(CK
30200 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 R_GENERAL_ERROR)
30210 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 72 65 ;....}...}....re
30220 74 75 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a turn(sign_ret);.
30230 09 7d 0a 0a 09 73 69 67 6e 5f 72 65 74 20 3d 20 .}...sign_ret =
30240 43 5f 53 69 67 6e 46 69 6e 61 6c 28 68 53 65 73 C_SignFinal(hSes
30250 73 69 6f 6e 2c 20 70 53 69 67 6e 61 74 75 72 65 sion, pSignature
30260 2c 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 , pulSignatureLe
30270 6e 29 3b 0a 09 69 66 20 28 73 69 67 6e 5f 72 65 n);..if (sign_re
30280 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 t != CKR_OK) {..
30290 09 69 66 20 28 73 69 67 6e 5f 72 65 74 20 3d 3d .if (sign_ret ==
302a0 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f CKR_BUFFER_TOO_
302b0 53 4d 41 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b SMALL) {....CACK
302c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
302d0 22 53 69 67 6e 46 69 6e 61 6c 28 29 20 72 65 74 "SignFinal() ret
302e0 75 72 6e 65 64 20 43 4b 52 5f 42 55 46 46 45 52 urned CKR_BUFFER
302f0 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28 72 76 20 3d _TOO_SMALL (rv =
30300 20 25 6c 75 29 2c 20 75 6e 64 6f 69 6e 67 20 43 %lu), undoing C
30310 5f 53 69 67 6e 55 70 64 61 74 65 28 29 22 2c 20 _SignUpdate()",
30320 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
30330 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 09 63 sign_ret);.....c
30340 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
30350 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 Session].sign_bu
30360 66 75 73 65 64 20 3d 20 73 74 61 72 74 5f 73 69 fused = start_si
30370 67 6e 5f 62 75 66 75 73 65 64 3b 0a 0a 09 09 09 gn_bufused;.....
30380 72 65 74 75 72 6e 28 73 69 67 6e 5f 72 65 74 29 return(sign_ret)
30390 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f ;...}....CACKEY_
303a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
303b0 72 6f 72 2e 20 20 53 69 67 6e 46 69 6e 61 6c 28 ror. SignFinal(
303c0 29 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75 ) returned failu
303d0 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c re (rv = %lu).",
303e0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
303f0 20 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 72 sign_ret);....r
30400 65 74 75 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b eturn(sign_ret);
30410 0a 09 7d 0a 0a 09 69 66 20 28 70 53 69 67 6e 61 ..}...if (pSigna
30420 74 75 72 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a ture == NULL) {.
30430 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
30440 52 49 4e 54 46 28 22 70 53 69 67 6e 61 74 75 72 RINTF("pSignatur
30450 65 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e e specified as N
30460 55 4c 4c 2c 20 75 6e 64 6f 69 6e 67 20 43 5f 53 ULL, undoing C_S
30470 69 67 6e 55 70 64 61 74 65 28 29 22 29 3b 0a 0a ignUpdate()");..
30480 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e ..cackey_session
30490 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e s[hSession].sign
304a0 5f 62 75 66 75 73 65 64 20 3d 20 73 74 61 72 74 _bufused = start
304b0 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 0a _sign_bufused;..
304c0 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f 72 65 ..return(sign_re
304d0 74 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f t);..}...CACKEY_
304e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
304f0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 turning CKR_OK (
30500 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a %i)", CKR_OK);..
30510 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b .return(CKR_OK);
30520 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 .}..CK_DEFINE_FU
30530 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f NCTION(CK_RV, C_
30540 53 69 67 6e 55 70 64 61 74 65 29 28 43 4b 5f 53 SignUpdate)(CK_S
30550 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 ESSION_HANDLE hS
30560 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f ession, CK_BYTE_
30570 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c PTR pPart, CK_UL
30580 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29 20 7b ONG ulPartLen) {
30590 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 ..int mutex_retv
305a0 61 6c 3b 0a 09 69 6e 74 20 72 65 73 69 7a 65 52 al;..int resizeR
305b0 65 74 72 79 3b 0a 09 69 6e 74 20 6e 65 65 64 52 etry;..int needR
305c0 65 73 69 7a 65 3b 0a 0a 09 43 41 43 4b 45 59 5f esize;...CACKEY_
305d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
305e0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 lled.");...if (!
305f0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a cackey_initializ
30600 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...CACKEY_D
30610 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
30620 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c or. Not initial
30630 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 ized.");....retu
30640 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f rn(CKR_CRYPTOKI_
30650 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 NOT_INITIALIZED)
30660 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 ;..}...if (hSess
30670 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 ion == 0 || hSes
30680 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 sion >= (sizeof(
30690 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 cackey_sessions)
306a0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 / sizeof(cackey
306b0 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 _sessions[0])))
306c0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
306d0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
306e0 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 Session out of
306f0 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 range.");......r
30700 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f eturn(CKR_SESSIO
30710 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 N_HANDLE_INVALID
30720 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50 61 72 );..}...if (pPar
30730 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 6c 50 t == NULL && ulP
30740 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 artLen == 0) {..
30750 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69 ./* Short circui
30760 74 20 69 66 20 77 65 20 61 72 65 20 61 73 6b 65 t if we are aske
30770 64 20 74 6f 20 73 69 67 6e 20 6e 6f 74 68 69 6e d to sign nothin
30780 67 2e 2e 2e 20 2a 2f 0a 09 09 43 41 43 4b 45 59 g... */...CACKEY
30790 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
307a0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 eturning CKR_OK
307b0 28 25 69 29 20 28 73 68 6f 72 74 20 63 69 72 63 (%i) (short circ
307c0 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a uit)", CKR_OK);.
307d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b ...return(CKR_OK
307e0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50 61 72 );..}...if (pPar
307f0 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 t == NULL) {...C
30800 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
30810 54 46 28 22 45 72 72 6f 72 2e 20 70 50 61 72 74 TF("Error. pPart
30820 20 69 73 20 4e 55 4c 4c 2c 20 62 75 74 20 75 6c is NULL, but ul
30830 50 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74 20 30 PartLen is not 0
30840 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
30850 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 KR_ARGUMENTS_BAD
30860 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 50 61 );..}...if (ulPa
30870 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 rtLen == 0) {...
30880 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
30890 4e 54 46 28 22 45 72 72 6f 72 2e 20 75 6c 50 61 NTF("Error. ulPa
308a0 72 74 4c 65 6e 20 69 73 20 30 2c 20 62 75 74 20 rtLen is 0, but
308b0 70 50 61 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c pPart is not NUL
308c0 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 L.");....return(
308d0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 CKR_ARGUMENTS_BA
308e0 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 D);..}...mutex_r
308f0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d etval = cackey_m
30900 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 utex_lock(cackey
30910 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 _biglock);..if (
30920 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 mutex_retval !=
30930 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 0) {...CACKEY_DE
30940 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
30950 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c r. Locking fail
30960 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
30970 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 (CKR_GENERAL_ERR
30980 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 OR);..}...if (!c
30990 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
309a0 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 Session].active)
309b0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 {...cackey_mute
309c0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
309d0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 biglock);....CAC
309e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
309f0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f ("Error. Sessio
30a00 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b n not active.");
30a10 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 ......return(CKR
30a20 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f _SESSION_HANDLE_
30a30 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 INVALID);..}...i
30a40 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 f (!cackey_sessi
30a50 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 ons[hSession].si
30a60 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 gn_active) {...c
30a70 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f ackey_mutex_unlo
30a80 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
30a90 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 k);....CACKEY_DE
30aa0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
30ab0 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61 63 74 r. Sign not act
30ac0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 ive.");......ret
30ad0 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f urn(CKR_OPERATIO
30ae0 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 N_NOT_INITIALIZE
30af0 44 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 D);..}...switch
30b00 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 (cackey_sessions
30b10 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f [hSession].sign_
30b20 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63 mechanism) {...c
30b30 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 ase CKM_RSA_PKCS
30b40 3a 0a 09 09 09 2f 2a 20 41 63 63 75 6d 75 6c 61 :..../* Accumula
30b50 74 65 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a 09 te directly */..
30b60 09 09 66 6f 72 20 28 72 65 73 69 7a 65 52 65 74 ..for (resizeRet
30b70 72 79 20 3d 20 30 3b 20 72 65 73 69 7a 65 52 65 ry = 0; resizeRe
30b80 74 72 79 20 3c 20 31 31 3b 20 72 65 73 69 7a 65 try < 11; resize
30b90 52 65 74 72 79 2b 2b 29 20 7b 0a 09 09 09 09 6e Retry++) {.....n
30ba0 65 65 64 52 65 73 69 7a 65 20 3d 20 30 3b 0a 09 eedResize = 0;..
30bb0 09 09 09 69 66 20 28 28 63 61 63 6b 65 79 5f 73 ...if ((cackey_s
30bc0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
30bd0 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 2b ].sign_bufused +
30be0 20 75 6c 50 61 72 74 4c 65 6e 29 20 3e 20 63 61 ulPartLen) > ca
30bf0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
30c00 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 ession].sign_buf
30c10 6c 65 6e 29 20 7b 0a 09 09 09 09 09 6e 65 65 64 len) {......need
30c20 52 65 73 69 7a 65 20 3d 20 31 3b 0a 09 09 09 09 Resize = 1;.....
30c30 7d 0a 0a 09 09 09 09 69 66 20 28 21 6e 65 65 64 }......if (!need
30c40 52 65 73 69 7a 65 29 20 7b 0a 09 09 09 09 09 62 Resize) {......b
30c50 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 reak;.....}.....
30c60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
30c70 49 4e 54 46 28 22 52 65 73 69 7a 69 6e 67 20 73 INTF("Resizing s
30c80 69 67 6e 69 6e 67 20 62 75 66 66 65 72 20 28 74 igning buffer (t
30c90 72 79 20 23 25 69 20 6f 66 20 31 30 20 2d 2d 20 ry #%i of 10 --
30ca0 31 31 74 68 20 69 73 20 66 61 74 61 6c 29 22 2c 11th is fatal)",
30cb0 20 72 65 73 69 7a 65 52 65 74 72 79 29 3b 0a 0a resizeRetry);..
30cc0 09 09 09 09 69 66 20 28 72 65 73 69 7a 65 52 65 ....if (resizeRe
30cd0 74 72 79 20 3d 3d 20 31 30 29 20 7b 0a 09 09 09 try == 10) {....
30ce0 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 65 ..free(cackey_se
30cf0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
30d00 2e 73 69 67 6e 5f 62 75 66 29 3b 0a 0a 09 09 09 .sign_buf);.....
30d10 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e ..cackey_session
30d20 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e s[hSession].sign
30d30 5f 62 75 66 6c 65 6e 20 3d 20 30 3b 0a 09 09 09 _buflen = 0;....
30d40 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e ..cackey_session
30d50 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e s[hSession].sign
30d60 5f 62 75 66 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 _buf = NULL;....
30d70 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a ...break;.....}.
30d80 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 .....cackey_sess
30d90 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 ions[hSession].s
30da0 69 67 6e 5f 62 75 66 6c 65 6e 20 2a 3d 20 32 3b ign_buflen *= 2;
30db0 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 65 73 ......cackey_ses
30dc0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
30dd0 73 69 67 6e 5f 62 75 66 20 3d 20 72 65 61 6c 6c sign_buf = reall
30de0 6f 63 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f oc(cackey_sessio
30df0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 ns[hSession].sig
30e00 6e 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28 2a 63 n_buf, sizeof(*c
30e10 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
30e20 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 Session].sign_bu
30e30 66 29 20 2a 20 63 61 63 6b 65 79 5f 73 65 73 73 f) * cackey_sess
30e40 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 ions[hSession].s
30e50 69 67 6e 5f 62 75 66 6c 65 6e 29 3b 0a 09 09 09 ign_buflen);....
30e60 7d 0a 0a 09 09 09 69 66 20 28 63 61 63 6b 65 79 }.....if (cackey
30e70 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
30e80 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 3d 3d 20 on].sign_buf ==
30e90 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 63 61 63 6b NULL) {.....cack
30ea0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 ey_mutex_unlock(
30eb0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
30ec0 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 ......CACKEY_DEB
30ed0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
30ee0 2e 20 20 53 69 67 6e 69 6e 67 20 62 75 66 66 65 . Signing buffe
30ef0 72 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 r is NULL.");...
30f00 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 ...return(CKR_GE
30f10 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 NERAL_ERROR);...
30f20 09 7d 0a 0a 09 09 09 6d 65 6d 63 70 79 28 63 61 .}.....memcpy(ca
30f30 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
30f40 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 ession].sign_buf
30f50 20 2b 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f + cackey_sessio
30f60 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 ns[hSession].sig
30f70 6e 5f 62 75 66 75 73 65 64 2c 20 70 50 61 72 74 n_bufused, pPart
30f80 2c 20 75 6c 50 61 72 74 4c 65 6e 29 3b 0a 0a 09 , ulPartLen);...
30f90 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e ..cackey_session
30fa0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e s[hSession].sign
30fb0 5f 62 75 66 75 73 65 64 20 2b 3d 20 75 6c 50 61 _bufused += ulPa
30fc0 72 74 4c 65 6e 3b 0a 0a 09 09 09 62 72 65 61 6b rtLen;.....break
30fd0 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 ;..}...mutex_ret
30fe0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 val = cackey_mut
30ff0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 ex_unlock(cackey
31000 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 _biglock);..if (
31010 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 mutex_retval !=
31020 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 0) {...CACKEY_DE
31030 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
31040 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 r. Unlocking fa
31050 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 iled.");....retu
31060 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 rn(CKR_GENERAL_E
31070 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b RROR);..}...CACK
31080 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
31090 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f "Returning CKR_O
310a0 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 K (%i)", CKR_OK)
310b0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f ;...return(CKR_O
310c0 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 K);.}..CK_DEFINE
310d0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c _FUNCTION(CK_RV,
310e0 20 43 5f 53 69 67 6e 46 69 6e 61 6c 29 28 43 4b C_SignFinal)(CK
310f0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 _SESSION_HANDLE
31100 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 hSession, CK_BYT
31110 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 E_PTR pSignature
31120 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 , CK_ULONG_PTR p
31130 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 ulSignatureLen)
31140 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 59 54 {..static CK_BYT
31150 45 20 73 69 67 62 75 66 5b 31 30 32 34 5d 3b 0a E sigbuf[1024];.
31160 09 73 73 69 7a 65 5f 74 20 73 69 67 62 75 66 6c .ssize_t sigbufl
31170 65 6e 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 en;..CK_SLOT_ID
31180 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 52 56 20 72 slotID;..CK_RV r
31190 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 etval = CKR_GENE
311a0 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 69 6e 74 20 RAL_ERROR;..int
311b0 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d terminate_sign =
311c0 20 31 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 1;..int mutex_r
311d0 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f etval;...CACKEY_
311e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
311f0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 lled.");...if (!
31200 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a cackey_initializ
31210 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...CACKEY_D
31220 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
31230 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c or. Not initial
31240 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 ized.");....retu
31250 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f rn(CKR_CRYPTOKI_
31260 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 NOT_INITIALIZED)
31270 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 53 69 ;..}...if (pulSi
31280 67 6e 61 74 75 72 65 4c 65 6e 20 3d 3d 20 4e 55 gnatureLen == NU
31290 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 LL) {...CACKEY_D
312a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
312b0 6f 72 2e 20 70 75 6c 53 69 67 6e 61 74 75 72 65 or. pulSignature
312c0 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a Len is NULL.");.
312d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 ...return(CKR_AR
312e0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d GUMENTS_BAD);..}
312f0 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 ...if (hSession
31300 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e == 0 || hSession
31310 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b >= (sizeof(cack
31320 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 ey_sessions) / s
31330 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 izeof(cackey_ses
31340 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 sions[0]))) {...
31350 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
31360 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 NTF("Error. Ses
31370 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 sion out of rang
31380 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 e.");......retur
31390 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 n(CKR_SESSION_HA
313a0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 NDLE_INVALID);..
313b0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c }...mutex_retval
313c0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f = cackey_mutex_
313d0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
313e0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 ock);..if (mutex
313f0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a _retval != 0) {.
31400 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
31410 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c RINTF("Error. L
31420 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 ocking failed.")
31430 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
31440 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a GENERAL_ERROR);.
31450 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 .}...if (!cackey
31460 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
31470 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 on].active) {...
31480 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c cackey_mutex_unl
31490 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
314a0 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 ck);....CACKEY_D
314b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
314c0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 or. Session not
314d0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 active.");.....
314e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 .return(CKR_SESS
314f0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c ION_HANDLE_INVAL
31500 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 ID);..}...if (!c
31510 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
31520 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 Session].sign_ac
31530 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 tive) {...cackey
31540 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 _mutex_unlock(ca
31550 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a ckey_biglock);..
31560 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
31570 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 RINTF("Error. S
31580 69 67 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 ign not active."
31590 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 );......return(C
315a0 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 KR_OPERATION_NOT
315b0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 _INITIALIZED);..
315c0 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 }...slotID = cac
315d0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
315e0 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a ssion].slotID;..
315f0 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 .if (slotID < 0
31600 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 || slotID >= (si
31610 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 zeof(cackey_slot
31620 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b s) / sizeof(cack
31630 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b ey_slots[0]))) {
31640 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
31650 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 PRINTF("Error. I
31660 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 nvalid slot requ
31670 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 ested (%lu), out
31680 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 side of valid ra
31690 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a nge", slotID);..
316a0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e ..return(CKR_GEN
316b0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a ERAL_ERROR);..}.
316c0 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f ..if (cackey_slo
316d0 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 ts[slotID].activ
316e0 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b e == 0) {...CACK
316f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
31700 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 "Error. Invalid
31710 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 slot requested (
31720 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 %lu), slot not c
31730 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 urrently active"
31740 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 , slotID);....ca
31750 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 ckey_mutex_unloc
31760 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
31770 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
31780 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b _GENERAL_ERROR);
31790 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 63 61 ..}...switch (ca
317a0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
317b0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63 ession].sign_mec
317c0 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61 73 65 hanism) {...case
317d0 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 CKM_RSA_PKCS:..
317e0 09 09 2f 2a 20 41 73 6b 20 63 61 72 64 20 74 6f ../* Ask card to
317f0 20 73 69 67 6e 20 2a 2f 0a 09 09 09 43 41 43 4b sign */....CACK
31800 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
31810 22 41 73 6b 69 6e 67 20 74 6f 20 73 69 67 6e 20 "Asking to sign
31820 66 72 6f 6d 20 69 64 65 6e 74 69 74 79 20 25 70 from identity %p
31830 20 69 6e 20 73 65 73 73 69 6f 6e 20 25 6c 75 22 in session %lu"
31840 2c 20 28 76 6f 69 64 20 2a 29 20 63 61 63 6b 65 , (void *) cacke
31850 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
31860 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69 ion].sign_identi
31870 74 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f ty, (unsigned lo
31880 6e 67 29 20 68 53 65 73 73 69 6f 6e 29 3b 0a 09 ng) hSession);..
31890 09 09 73 69 67 62 75 66 6c 65 6e 20 3d 20 63 61 ..sigbuflen = ca
318a0 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 70 74 ckey_signdecrypt
318b0 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 (&cackey_slots[s
318c0 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65 79 5f 73 lotID], cackey_s
318d0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
318e0 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 2c ].sign_identity,
318f0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 cackey_sessions
31900 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f [hSession].sign_
31910 62 75 66 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 buf, cackey_sess
31920 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 ions[hSession].s
31930 69 67 6e 5f 62 75 66 75 73 65 64 2c 20 73 69 67 ign_bufused, sig
31940 62 75 66 2c 20 73 69 7a 65 6f 66 28 73 69 67 62 buf, sizeof(sigb
31950 75 66 29 2c 20 31 2c 20 30 29 3b 0a 0a 09 09 09 uf), 1, 0);.....
31960 69 66 20 28 73 69 67 62 75 66 6c 65 6e 20 3d 3d if (sigbuflen ==
31970 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e CACKEY_PCSC_E_N
31980 45 45 44 4c 4f 47 49 4e 20 26 26 20 63 61 63 6b EEDLOGIN && cack
31990 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 21 ey_pin_command !
319a0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 69 66 = NULL) {.....if
319b0 20 28 5f 43 5f 4c 6f 67 69 6e 4d 75 74 65 78 41 (_C_LoginMutexA
319c0 72 67 28 68 53 65 73 73 69 6f 6e 2c 20 43 4b 55 rg(hSession, CKU
319d0 5f 55 53 45 52 2c 20 4e 55 4c 4c 2c 20 30 2c 20 _USER, NULL, 0,
319e0 30 29 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 0) == CKR_OK) {.
319f0 09 09 09 09 09 73 69 67 62 75 66 6c 65 6e 20 3d .....sigbuflen =
31a00 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 cackey_signdecr
31a10 79 70 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 ypt(&cackey_slot
31a20 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65 s[slotID], cacke
31a30 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
31a40 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69 ion].sign_identi
31a50 74 79 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 ty, cackey_sessi
31a60 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 ons[hSession].si
31a70 67 6e 5f 62 75 66 2c 20 63 61 63 6b 65 79 5f 73 gn_buf, cackey_s
31a80 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
31a90 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 2c 20 ].sign_bufused,
31aa0 73 69 67 62 75 66 2c 20 73 69 7a 65 6f 66 28 73 sigbuf, sizeof(s
31ab0 69 67 62 75 66 29 2c 20 31 2c 20 30 29 3b 0a 09 igbuf), 1, 0);..
31ac0 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 69 66 ...}....}.....if
31ad0 20 28 73 69 67 62 75 66 6c 65 6e 20 3c 20 30 29 (sigbuflen < 0)
31ae0 20 7b 0a 09 09 09 09 2f 2a 20 53 69 67 6e 69 6e {...../* Signin
31af0 67 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 09 09 09 g failed. */....
31b00 09 69 66 20 28 73 69 67 62 75 66 6c 65 6e 20 3d .if (sigbuflen =
31b10 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f = CACKEY_PCSC_E_
31b20 4e 45 45 44 4c 4f 47 49 4e 29 20 7b 0a 09 09 09 NEEDLOGIN) {....
31b30 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 55 ..retval = CKR_U
31b40 53 45 52 5f 4e 4f 54 5f 4c 4f 47 47 45 44 5f 49 SER_NOT_LOGGED_I
31b50 4e 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 69 66 N;.....} else if
31b60 20 28 73 69 67 62 75 66 6c 65 6e 20 3d 3d 20 43 (sigbuflen == C
31b70 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b ACKEY_PCSC_E_TOK
31b80 45 4e 41 42 53 45 4e 54 29 20 7b 0a 09 09 09 09 ENABSENT) {.....
31b90 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 44 45 .retval = CKR_DE
31ba0 56 49 43 45 5f 52 45 4d 4f 56 45 44 3b 0a 09 09 VICE_REMOVED;...
31bb0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 ..} else {......
31bc0 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e retval = CKR_GEN
31bd0 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 09 09 09 ERAL_ERROR;.....
31be0 7d 0a 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28 }....} else if (
31bf0 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 ((unsigned long)
31c00 20 73 69 67 62 75 66 6c 65 6e 29 20 3e 20 2a 70 sigbuflen) > *p
31c10 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 26 ulSignatureLen &
31c20 26 20 70 53 69 67 6e 61 74 75 72 65 29 20 7b 0a & pSignature) {.
31c30 09 09 09 09 2f 2a 20 53 69 67 6e 65 64 20 64 61 ..../* Signed da
31c40 74 61 20 74 6f 6f 20 6c 61 72 67 65 20 2a 2f 0a ta too large */.
31c50 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
31c60 5f 50 52 49 4e 54 46 28 22 72 65 74 76 61 6c 20 _PRINTF("retval
31c70 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f = CKR_BUFFER_TOO
31c80 5f 53 4d 41 4c 4c 3b 20 20 73 69 67 62 75 66 6c _SMALL; sigbufl
31c90 65 6e 20 3d 20 25 6c 75 2c 20 70 75 6c 53 69 67 en = %lu, pulSig
31ca0 6e 61 74 75 72 65 4c 65 6e 20 3d 20 25 6c 75 22 natureLen = %lu"
31cb0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
31cc0 29 20 73 69 67 62 75 66 6c 65 6e 2c 20 28 75 6e ) sigbuflen, (un
31cd0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 70 75 signed long) *pu
31ce0 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 3b 0a lSignatureLen);.
31cf0 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b .....retval = CK
31d00 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 R_BUFFER_TOO_SMA
31d10 4c 4c 3b 0a 0a 09 09 09 09 74 65 72 6d 69 6e 61 LL;......termina
31d20 74 65 5f 73 69 67 6e 20 3d 20 30 3b 0a 09 09 09 te_sign = 0;....
31d30 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 74 65 72 } else {.....ter
31d40 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 30 3b minate_sign = 0;
31d50 0a 0a 09 09 09 09 69 66 20 28 70 53 69 67 6e 61 ......if (pSigna
31d60 74 75 72 65 29 20 7b 0a 09 09 09 09 09 6d 65 6d ture) {......mem
31d70 63 70 79 28 70 53 69 67 6e 61 74 75 72 65 2c 20 cpy(pSignature,
31d80 73 69 67 62 75 66 2c 20 73 69 67 62 75 66 6c 65 sigbuf, sigbufle
31d90 6e 29 3b 0a 0a 09 09 09 09 09 74 65 72 6d 69 6e n);.......termin
31da0 61 74 65 5f 73 69 67 6e 20 3d 20 31 3b 0a 09 09 ate_sign = 1;...
31db0 09 09 7d 0a 0a 09 09 09 09 2a 70 75 6c 53 69 67 ..}......*pulSig
31dc0 6e 61 74 75 72 65 4c 65 6e 20 3d 20 73 69 67 62 natureLen = sigb
31dd0 75 66 6c 65 6e 3b 0a 0a 09 09 09 09 72 65 74 76 uflen;......retv
31de0 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 09 09 al = CKR_OK;....
31df0 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a }.....break;..}.
31e00 0a 09 69 66 20 28 74 65 72 6d 69 6e 61 74 65 5f ..if (terminate_
31e10 73 69 67 6e 29 20 7b 0a 09 09 69 66 20 28 63 61 sign) {...if (ca
31e20 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
31e30 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 ession].sign_buf
31e40 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b ) {....free(cack
31e50 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
31e60 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 3b sion].sign_buf);
31e70 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 ...}....cackey_s
31e80 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
31e90 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 ].sign_active =
31ea0 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 0;..}...mutex_re
31eb0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 tval = cackey_mu
31ec0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 tex_unlock(cacke
31ed0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 y_biglock);..if
31ee0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d (mutex_retval !=
31ef0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 0) {...CACKEY_D
31f00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
31f10 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 or. Unlocking f
31f20 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 ailed.");....ret
31f30 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f urn(CKR_GENERAL_
31f40 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 ERROR);..}...CAC
31f50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
31f60 28 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c ("Returning %i",
31f70 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a (int) retval);.
31f80 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 ..return(retval)
31f90 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 ;.}..CK_DEFINE_F
31fa0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 UNCTION(CK_RV, C
31fb0 5f 53 69 67 6e 52 65 63 6f 76 65 72 49 6e 69 74 _SignRecoverInit
31fc0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e )(CK_SESSION_HAN
31fd0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b DLE hSession, CK
31fe0 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 _MECHANISM_PTR p
31ff0 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 Mechanism, CK_OB
32000 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 JECT_HANDLE hKey
32010 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 ) {..CACKEY_DEBU
32020 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 G_PRINTF("Called
32030 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b .");...if (!cack
32040 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 ey_initialized)
32050 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
32060 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
32070 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 Not initialized
32080 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
32090 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f KR_CRYPTOKI_NOT_
320a0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d INITIALIZED);..}
320b0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
320c0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e PRINTF("Returnin
320d0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e g CKR_FUNCTION_N
320e0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 OT_SUPPORTED (%i
320f0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e )", CKR_FUNCTION
32100 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
32110 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 ...return(CKR_FU
32120 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
32130 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 RTED);.}..CK_DEF
32140 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f INE_FUNCTION(CK_
32150 52 56 2c 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 RV, C_SignRecove
32160 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 r)(CK_SESSION_HA
32170 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 NDLE hSession, C
32180 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 K_BYTE_PTR pData
32190 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 , CK_ULONG ulDat
321a0 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 aLen, CK_BYTE_PT
321b0 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b R pSignature, CK
321c0 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 _ULONG_PTR pulSi
321d0 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43 gnatureLen) {..C
321e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
321f0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
32200 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 .if (!cackey_ini
32210 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 tialized) {...CA
32220 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
32230 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 F("Error. Not i
32240 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a nitialized.");..
32250 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 ..return(CKR_CRY
32260 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 PTOKI_NOT_INITIA
32270 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 LIZED);..}...CAC
32280 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
32290 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f ("Returning CKR_
322a0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
322b0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b PORTED (%i)", CK
322c0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
322d0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 UPPORTED);...ret
322e0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e urn(CKR_FUNCTION
322f0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
32300 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 .}..CK_DEFINE_FU
32310 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f NCTION(CK_RV, C_
32320 56 65 72 69 66 79 49 6e 69 74 29 28 43 4b 5f 53 VerifyInit)(CK_S
32330 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 ESSION_HANDLE hS
32340 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 ession, CK_MECHA
32350 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e NISM_PTR pMechan
32360 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 ism, CK_OBJECT_H
32370 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 ANDLE hKey) {..C
32380 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
32390 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
323a0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 .if (!cackey_ini
323b0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 tialized) {...CA
323c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
323d0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 F("Error. Not i
323e0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a nitialized.");..
323f0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 ..return(CKR_CRY
32400 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 PTOKI_NOT_INITIA
32410 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 LIZED);..}...CAC
32420 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
32430 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f ("Returning CKR_
32440 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
32450 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b PORTED (%i)", CK
32460 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
32470 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 UPPORTED);...ret
32480 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e urn(CKR_FUNCTION
32490 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
324a0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 .}..CK_DEFINE_FU
324b0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f NCTION(CK_RV, C_
324c0 56 65 72 69 66 79 29 28 43 4b 5f 53 45 53 53 49 Verify)(CK_SESSI
324d0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 ON_HANDLE hSessi
324e0 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 on, CK_BYTE_PTR
324f0 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 pData, CK_ULONG
32500 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 ulDataLen, CK_BY
32510 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 TE_PTR pSignatur
32520 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 e, CK_ULONG ulSi
32530 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43 gnatureLen) {..C
32540 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
32550 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
32560 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 .if (!cackey_ini
32570 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 tialized) {...CA
32580 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
32590 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 F("Error. Not i
325a0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a nitialized.");..
325b0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 ..return(CKR_CRY
325c0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 PTOKI_NOT_INITIA
325d0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 LIZED);..}...CAC
325e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
325f0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f ("Returning CKR_
32600 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
32610 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b PORTED (%i)", CK
32620 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
32630 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 UPPORTED);...ret
32640 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e urn(CKR_FUNCTION
32650 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
32660 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 .}..CK_DEFINE_FU
32670 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f NCTION(CK_RV, C_
32680 56 65 72 69 66 79 55 70 64 61 74 65 29 28 43 4b VerifyUpdate)(CK
32690 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 _SESSION_HANDLE
326a0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 hSession, CK_BYT
326b0 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f E_PTR pPart, CK_
326c0 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29 ULONG ulPartLen)
326d0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {..CACKEY_DEBUG
326e0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
326f0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ");...if (!cacke
32700 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b y_initialized) {
32710 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
32720 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
32730 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e Not initialized.
32740 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
32750 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 R_CRYPTOKI_NOT_I
32760 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
32770 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
32780 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
32790 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f CKR_FUNCTION_NO
327a0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 T_SUPPORTED (%i)
327b0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f ", CKR_FUNCTION_
327c0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
327d0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e ..return(CKR_FUN
327e0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
327f0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 TED);.}..CK_DEFI
32800 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 NE_FUNCTION(CK_R
32810 56 2c 20 43 5f 56 65 72 69 66 79 46 69 6e 61 6c V, C_VerifyFinal
32820 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e )(CK_SESSION_HAN
32830 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b DLE hSession, CK
32840 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 _BYTE_PTR pSigna
32850 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 ture, CK_ULONG u
32860 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b lSignatureLen) {
32870 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
32880 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
32890 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f ;...if (!cackey_
328a0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 initialized) {..
328b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
328c0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f INTF("Error. No
328d0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 t initialized.")
328e0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
328f0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 CRYPTOKI_NOT_INI
32900 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 TIALIZED);..}...
32910 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
32920 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 NTF("Returning C
32930 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
32940 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c SUPPORTED (%i)",
32950 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f CKR_FUNCTION_NO
32960 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 T_SUPPORTED);...
32970 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 return(CKR_FUNCT
32980 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
32990 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 D);.}..CK_DEFINE
329a0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c _FUNCTION(CK_RV,
329b0 20 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 C_VerifyRecover
329c0 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e Init)(CK_SESSION
329d0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e _HANDLE hSession
329e0 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 , CK_MECHANISM_P
329f0 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 TR pMechanism, C
32a00 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 K_OBJECT_HANDLE
32a10 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f hKey) {..CACKEY_
32a20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
32a30 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 lled.");...if (!
32a40 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a cackey_initializ
32a50 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...CACKEY_D
32a60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
32a70 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c or. Not initial
32a80 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 ized.");....retu
32a90 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f rn(CKR_CRYPTOKI_
32aa0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 NOT_INITIALIZED)
32ab0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ;..}...CACKEY_DE
32ac0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
32ad0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 rning CKR_FUNCTI
32ae0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
32af0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 (%i)", CKR_FUNC
32b00 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
32b10 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b ED);...return(CK
32b20 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
32b30 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b UPPORTED);.}..CK
32b40 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e _DEFINE_FUNCTION
32b50 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 (CK_RV, C_Verify
32b60 52 65 63 6f 76 65 72 29 28 43 4b 5f 53 45 53 53 Recover)(CK_SESS
32b70 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 ION_HANDLE hSess
32b80 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 ion, CK_BYTE_PTR
32b90 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f pSignature, CK_
32ba0 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72 ULONG ulSignatur
32bb0 65 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 eLen, CK_BYTE_PT
32bc0 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e R pData, CK_ULON
32bd0 47 5f 50 54 52 20 70 75 6c 44 61 74 61 4c 65 6e G_PTR pulDataLen
32be0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 ) {..CACKEY_DEBU
32bf0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 G_PRINTF("Called
32c00 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b .");...if (!cack
32c10 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 ey_initialized)
32c20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
32c30 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
32c40 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 Not initialized
32c50 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
32c60 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f KR_CRYPTOKI_NOT_
32c70 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d INITIALIZED);..}
32c80 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
32c90 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e PRINTF("Returnin
32ca0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e g CKR_FUNCTION_N
32cb0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 OT_SUPPORTED (%i
32cc0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e )", CKR_FUNCTION
32cd0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
32ce0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 ...return(CKR_FU
32cf0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
32d00 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 RTED);.}..CK_DEF
32d10 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f INE_FUNCTION(CK_
32d20 52 56 2c 20 43 5f 44 69 67 65 73 74 45 6e 63 72 RV, C_DigestEncr
32d30 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 yptUpdate)(CK_SE
32d40 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 SSION_HANDLE hSe
32d50 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 ssion, CK_BYTE_P
32d60 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f TR pPart, CK_ULO
32d70 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b NG ulPartLen, CK
32d80 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 _BYTE_PTR pEncry
32d90 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f ptedPart, CK_ULO
32da0 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70 NG_PTR pulEncryp
32db0 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 tedPartLen) {..C
32dc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
32dd0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
32de0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 .if (!cackey_ini
32df0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 tialized) {...CA
32e00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
32e10 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 F("Error. Not i
32e20 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a nitialized.");..
32e30 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 ..return(CKR_CRY
32e40 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 PTOKI_NOT_INITIA
32e50 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 LIZED);..}...CAC
32e60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
32e70 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f ("Returning CKR_
32e80 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
32e90 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b PORTED (%i)", CK
32ea0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
32eb0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 UPPORTED);...ret
32ec0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e urn(CKR_FUNCTION
32ed0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
32ee0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 .}..CK_DEFINE_FU
32ef0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f NCTION(CK_RV, C_
32f00 44 65 63 72 79 70 74 44 69 67 65 73 74 55 70 64 DecryptDigestUpd
32f10 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f ate)(CK_SESSION_
32f20 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c HANDLE hSession,
32f30 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e CK_BYTE_PTR pEn
32f40 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f cryptedPart, CK_
32f50 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 ULONG ulEncrypte
32f60 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 dPartLen, CK_BYT
32f70 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f E_PTR pPart, CK_
32f80 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61 72 ULONG_PTR pulPar
32f90 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f tLen) {..CACKEY_
32fa0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
32fb0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 lled.");...if (!
32fc0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a cackey_initializ
32fd0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...CACKEY_D
32fe0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
32ff0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c or. Not initial
33000 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 ized.");....retu
33010 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f rn(CKR_CRYPTOKI_
33020 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 NOT_INITIALIZED)
33030 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ;..}...CACKEY_DE
33040 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
33050 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 rning CKR_FUNCTI
33060 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
33070 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 (%i)", CKR_FUNC
33080 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
33090 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b ED);...return(CK
330a0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
330b0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b UPPORTED);.}..CK
330c0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e _DEFINE_FUNCTION
330d0 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 45 6e (CK_RV, C_SignEn
330e0 63 72 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f cryptUpdate)(CK_
330f0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 SESSION_HANDLE h
33100 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 Session, CK_BYTE
33110 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 _PTR pPart, CK_U
33120 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 LONG ulPartLen,
33130 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 CK_BYTE_PTR pEnc
33140 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 ryptedPart, CK_U
33150 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 LONG_PTR pulEncr
33160 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a yptedPartLen) {.
33170 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
33180 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
33190 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 ...if (!cackey_i
331a0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 nitialized) {...
331b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
331c0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 NTF("Error. Not
331d0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b initialized.");
331e0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 ....return(CKR_C
331f0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 RYPTOKI_NOT_INIT
33200 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 IALIZED);..}...C
33210 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
33220 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b TF("Returning CK
33230 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
33240 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 UPPORTED (%i)",
33250 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
33260 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 _SUPPORTED);...r
33270 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 eturn(CKR_FUNCTI
33280 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
33290 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f );.}..CK_DEFINE_
332a0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 FUNCTION(CK_RV,
332b0 43 5f 44 65 63 72 79 70 74 56 65 72 69 66 79 55 C_DecryptVerifyU
332c0 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f pdate)(CK_SESSIO
332d0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f N_HANDLE hSessio
332e0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 n, CK_BYTE_PTR p
332f0 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 EncryptedPart, C
33300 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 K_ULONG ulEncryp
33310 74 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 tedPartLen, CK_B
33320 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 YTE_PTR pPart, C
33330 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50 K_ULONG_PTR pulP
33340 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 artLen) {..CACKE
33350 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
33360 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 Called.");...if
33370 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c (!cackey_initial
33380 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 ized) {...CACKEY
33390 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
333a0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 rror. Not initi
333b0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 alized.");....re
333c0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b turn(CKR_CRYPTOK
333d0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 I_NOT_INITIALIZE
333e0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f D);..}...CACKEY_
333f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
33400 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 turning CKR_FUNC
33410 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
33420 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 ED (%i)", CKR_FU
33430 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
33440 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 RTED);...return(
33450 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
33460 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a _SUPPORTED);.}..
33470 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 CK_DEFINE_FUNCTI
33480 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 ON(CK_RV, C_Gene
33490 72 61 74 65 4b 65 79 29 28 43 4b 5f 53 45 53 53 rateKey)(CK_SESS
334a0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 ION_HANDLE hSess
334b0 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 ion, CK_MECHANIS
334c0 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d M_PTR pMechanism
334d0 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 , CK_ATTRIBUTE_P
334e0 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b TR pTemplate, CK
334f0 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 _ULONG ulCount,
33500 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 CK_OBJECT_HANDLE
33510 5f 50 54 52 20 70 68 4b 65 79 29 20 7b 0a 09 43 _PTR phKey) {..C
33520 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
33530 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
33540 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 .if (!cackey_ini
33550 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 tialized) {...CA
33560 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
33570 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 F("Error. Not i
33580 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a nitialized.");..
33590 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 ..return(CKR_CRY
335a0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 PTOKI_NOT_INITIA
335b0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 LIZED);..}...CAC
335c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
335d0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f ("Returning CKR_
335e0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
335f0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b PORTED (%i)", CK
33600 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
33610 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 UPPORTED);...ret
33620 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e urn(CKR_FUNCTION
33630 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
33640 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 .}..CK_DEFINE_FU
33650 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f NCTION(CK_RV, C_
33660 47 65 6e 65 72 61 74 65 4b 65 79 50 61 69 72 29 GenerateKeyPair)
33670 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 (CK_SESSION_HAND
33680 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f LE hSession, CK_
33690 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d MECHANISM_PTR pM
336a0 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 41 54 54 echanism, CK_ATT
336b0 52 49 42 55 54 45 5f 50 54 52 20 70 50 75 62 6c RIBUTE_PTR pPubl
336c0 69 63 4b 65 79 54 65 6d 70 6c 61 74 65 2c 20 43 icKeyTemplate, C
336d0 4b 5f 55 4c 4f 4e 47 20 75 6c 50 75 62 6c 69 63 K_ULONG ulPublic
336e0 4b 65 79 41 74 74 72 69 62 75 74 65 43 6f 75 6e KeyAttributeCoun
336f0 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f t, CK_ATTRIBUTE_
33700 50 54 52 20 70 50 72 69 76 61 74 65 4b 65 79 54 PTR pPrivateKeyT
33710 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e emplate, CK_ULON
33720 47 20 75 6c 50 72 69 76 61 74 65 4b 65 79 41 74 G ulPrivateKeyAt
33730 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b tributeCount, CK
33740 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 _OBJECT_HANDLE_P
33750 54 52 20 70 68 50 75 62 6c 69 63 4b 65 79 2c 20 TR phPublicKey,
33760 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 CK_OBJECT_HANDLE
33770 5f 50 54 52 20 70 68 50 72 69 76 61 74 65 4b 65 _PTR phPrivateKe
33780 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 y) {..CACKEY_DEB
33790 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
337a0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 d.");...if (!cac
337b0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 key_initialized)
337c0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
337d0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
337e0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 Not initialize
337f0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
33800 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 CKR_CRYPTOKI_NOT
33810 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 _INITIALIZED);..
33820 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 }...CACKEY_DEBUG
33830 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
33840 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f ng CKR_FUNCTION_
33850 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 NOT_SUPPORTED (%
33860 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f i)", CKR_FUNCTIO
33870 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 N_NOT_SUPPORTED)
33880 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 ;...return(CKR_F
33890 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
338a0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 ORTED);.}..CK_DE
338b0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b FINE_FUNCTION(CK
338c0 5f 52 56 2c 20 43 5f 57 72 61 70 4b 65 79 29 28 _RV, C_WrapKey)(
338d0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c CK_SESSION_HANDL
338e0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d E hSession, CK_M
338f0 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 ECHANISM_PTR pMe
33900 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 chanism, CK_OBJE
33910 43 54 5f 48 41 4e 44 4c 45 20 68 57 72 61 70 70 CT_HANDLE hWrapp
33920 69 6e 67 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 ingKey, CK_OBJEC
33930 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 2c 20 43 T_HANDLE hKey, C
33940 4b 5f 42 59 54 45 5f 50 54 52 20 70 57 72 61 70 K_BYTE_PTR pWrap
33950 70 65 64 4b 65 79 2c 20 43 4b 5f 55 4c 4f 4e 47 pedKey, CK_ULONG
33960 5f 50 54 52 20 70 75 6c 57 72 61 70 70 65 64 4b _PTR pulWrappedK
33970 65 79 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 eyLen) {..CACKEY
33980 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 _DEBUG_PRINTF("C
33990 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 alled.");...if (
339a0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 !cackey_initiali
339b0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f zed) {...CACKEY_
339c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
339d0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 ror. Not initia
339e0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 lized.");....ret
339f0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 urn(CKR_CRYPTOKI
33a00 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 _NOT_INITIALIZED
33a10 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 );..}...CACKEY_D
33a20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
33a30 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 urning CKR_FUNCT
33a40 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
33a50 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e D (%i)", CKR_FUN
33a60 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
33a70 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 TED);...return(C
33a80 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
33a90 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 SUPPORTED);.}..C
33aa0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f K_DEFINE_FUNCTIO
33ab0 4e 28 43 4b 5f 52 56 2c 20 43 5f 55 6e 77 72 61 N(CK_RV, C_Unwra
33ac0 70 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e pKey)(CK_SESSION
33ad0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e _HANDLE hSession
33ae0 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 , CK_MECHANISM_P
33af0 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 TR pMechanism, C
33b00 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 K_OBJECT_HANDLE
33b10 68 55 6e 77 72 61 70 70 69 6e 67 4b 65 79 2c 20 hUnwrappingKey,
33b20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 57 72 61 CK_BYTE_PTR pWra
33b30 70 70 65 64 4b 65 79 2c 20 43 4b 5f 55 4c 4f 4e ppedKey, CK_ULON
33b40 47 20 75 6c 57 72 61 70 70 65 64 4b 65 79 4c 65 G ulWrappedKeyLe
33b50 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f n, CK_ATTRIBUTE_
33b60 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 PTR pTemplate, C
33b70 4b 5f 55 4c 4f 4e 47 20 75 6c 41 74 74 72 69 62 K_ULONG ulAttrib
33b80 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a uteCount, CK_OBJ
33b90 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 ECT_HANDLE_PTR p
33ba0 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f hKey) {..CACKEY_
33bb0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
33bc0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 lled.");...if (!
33bd0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a cackey_initializ
33be0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...CACKEY_D
33bf0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
33c00 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c or. Not initial
33c10 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 ized.");....retu
33c20 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f rn(CKR_CRYPTOKI_
33c30 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 NOT_INITIALIZED)
33c40 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ;..}...CACKEY_DE
33c50 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
33c60 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 rning CKR_FUNCTI
33c70 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
33c80 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 (%i)", CKR_FUNC
33c90 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
33ca0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b ED);...return(CK
33cb0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
33cc0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b UPPORTED);.}..CK
33cd0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e _DEFINE_FUNCTION
33ce0 28 43 4b 5f 52 56 2c 20 43 5f 44 65 72 69 76 65 (CK_RV, C_Derive
33cf0 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f Key)(CK_SESSION_
33d00 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c HANDLE hSession,
33d10 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 CK_MECHANISM_PT
33d20 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b R pMechanism, CK
33d30 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 _OBJECT_HANDLE h
33d40 42 61 73 65 4b 65 79 2c 20 43 4b 5f 41 54 54 52 BaseKey, CK_ATTR
33d50 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c IBUTE_PTR pTempl
33d60 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c ate, CK_ULONG ul
33d70 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 AttributeCount,
33d80 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 CK_OBJECT_HANDLE
33d90 5f 50 54 52 20 70 68 4b 65 79 29 20 7b 0a 09 43 _PTR phKey) {..C
33da0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
33db0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
33dc0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 .if (!cackey_ini
33dd0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 tialized) {...CA
33de0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
33df0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 F("Error. Not i
33e00 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a nitialized.");..
33e10 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 ..return(CKR_CRY
33e20 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 PTOKI_NOT_INITIA
33e30 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 LIZED);..}...CAC
33e40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
33e50 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f ("Returning CKR_
33e60 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
33e70 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b PORTED (%i)", CK
33e80 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
33e90 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 UPPORTED);...ret
33ea0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e urn(CKR_FUNCTION
33eb0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
33ec0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 .}..CK_DEFINE_FU
33ed0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f NCTION(CK_RV, C_
33ee0 53 65 65 64 52 61 6e 64 6f 6d 29 28 43 4b 5f 53 SeedRandom)(CK_S
33ef0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 ESSION_HANDLE hS
33f00 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f ession, CK_BYTE_
33f10 50 54 52 20 70 53 65 65 64 2c 20 43 4b 5f 55 4c PTR pSeed, CK_UL
33f20 4f 4e 47 20 75 6c 53 65 65 64 4c 65 6e 29 20 7b ONG ulSeedLen) {
33f30 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
33f40 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
33f50 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f ;...if (!cackey_
33f60 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 initialized) {..
33f70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
33f80 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f INTF("Error. No
33f90 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 t initialized.")
33fa0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
33fb0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 CRYPTOKI_NOT_INI
33fc0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 TIALIZED);..}...
33fd0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
33fe0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 NTF("Returning C
33ff0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
34000 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c SUPPORTED (%i)",
34010 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f CKR_FUNCTION_NO
34020 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 T_SUPPORTED);...
34030 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 return(CKR_FUNCT
34040 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
34050 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 D);.}..CK_DEFINE
34060 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c _FUNCTION(CK_RV,
34070 20 43 5f 47 65 6e 65 72 61 74 65 52 61 6e 64 6f C_GenerateRando
34080 6d 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 m)(CK_SESSION_HA
34090 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 NDLE hSession, C
340a0 4b 5f 42 59 54 45 5f 50 54 52 20 70 52 61 6e 64 K_BYTE_PTR pRand
340b0 6f 6d 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 omData, CK_ULONG
340c0 20 75 6c 52 61 6e 64 6f 6d 4c 65 6e 29 20 7b 0a ulRandomLen) {.
340d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
340e0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
340f0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 ...if (!cackey_i
34100 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 nitialized) {...
34110 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
34120 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 NTF("Error. Not
34130 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b initialized.");
34140 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 ....return(CKR_C
34150 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 RYPTOKI_NOT_INIT
34160 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 IALIZED);..}...C
34170 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
34180 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b TF("Returning CK
34190 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
341a0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 UPPORTED (%i)",
341b0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
341c0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 _SUPPORTED);...r
341d0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 eturn(CKR_FUNCTI
341e0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
341f0 29 3b 0a 7d 0a 0a 2f 2a 20 44 65 70 72 65 63 61 );.}../* Depreca
34200 74 65 64 20 46 75 6e 63 74 69 6f 6e 20 2a 2f 0a ted Function */.
34210 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 CK_DEFINE_FUNCTI
34220 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 46 ON(CK_RV, C_GetF
34230 75 6e 63 74 69 6f 6e 53 74 61 74 75 73 29 28 43 unctionStatus)(C
34240 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 K_SESSION_HANDLE
34250 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 41 hSession) {..CA
34260 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
34270 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
34280 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
34290 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 NTF("Returning C
342a0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
342b0 50 41 52 41 4c 4c 45 4c 20 28 25 69 29 22 2c 20 PARALLEL (%i)",
342c0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
342d0 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72 65 _PARALLEL);...re
342e0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f turn(CKR_FUNCTIO
342f0 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b N_NOT_PARALLEL);
34300 0a 0a 09 68 53 65 73 73 69 6f 6e 20 3d 20 68 53 ...hSession = hS
34310 65 73 73 69 6f 6e 3b 20 2f 2a 20 53 75 70 72 65 ession; /* Supre
34320 73 73 20 75 6e 75 73 65 64 20 76 61 72 69 61 62 ss unused variab
34330 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a le warning */.}.
34340 0a 2f 2a 20 44 65 70 72 65 63 61 74 65 64 20 46 ./* Deprecated F
34350 75 6e 63 74 69 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 unction */.CK_DE
34360 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b FINE_FUNCTION(CK
34370 5f 52 56 2c 20 43 5f 43 61 6e 63 65 6c 46 75 6e _RV, C_CancelFun
34380 63 74 69 6f 6e 29 28 43 4b 5f 53 45 53 53 49 4f ction)(CK_SESSIO
34390 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f N_HANDLE hSessio
343a0 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 n) {..CACKEY_DEB
343b0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
343c0 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 d.");...CACKEY_D
343d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
343e0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 urning CKR_FUNCT
343f0 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c ION_NOT_PARALLEL
34400 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 (%i)", CKR_FUNC
34410 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 TION_NOT_PARALLE
34420 4c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 L);...return(CKR
34430 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 _FUNCTION_NOT_PA
34440 52 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65 73 73 RALLEL);...hSess
34450 69 6f 6e 20 3d 20 68 53 65 73 73 69 6f 6e 3b 20 ion = hSession;
34460 2f 2a 20 53 75 70 72 65 73 73 20 75 6e 75 73 65 /* Supress unuse
34470 64 20 76 61 72 69 61 62 6c 65 20 77 61 72 6e 69 d variable warni
34480 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45 46 49 ng */.}..CK_DEFI
34490 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 NE_FUNCTION(CK_R
344a0 56 2c 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e V, C_GetFunction
344b0 4c 69 73 74 29 28 43 4b 5f 46 55 4e 43 54 49 4f List)(CK_FUNCTIO
344c0 4e 5f 4c 49 53 54 5f 50 54 52 5f 50 54 52 20 70 N_LIST_PTR_PTR p
344d0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 20 7b pFunctionList) {
344e0 0a 09 73 74 61 74 69 63 20 43 4b 5f 46 55 4e 43 ..static CK_FUNC
344f0 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 20 73 70 TION_LIST_PTR sp
34500 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 4e FunctionList = N
34510 55 4c 4c 3b 0a 09 43 4b 5f 46 55 4e 43 54 49 4f ULL;..CK_FUNCTIO
34520 4e 5f 4c 49 53 54 5f 50 54 52 20 70 46 75 6e 63 N_LIST_PTR pFunc
34530 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 43 41 43 4b tionList;...CACK
34540 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
34550 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 "Called.");...if
34560 20 28 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 (ppFunctionList
34570 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 == NULL) {...CA
34580 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
34590 46 28 22 45 72 72 6f 72 2e 20 70 70 46 75 6e 63 F("Error. ppFunc
345a0 74 69 6f 6e 4c 69 73 74 20 69 73 20 4e 55 4c 4c tionList is NULL
345b0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
345c0 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 KR_ARGUMENTS_BAD
345d0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 70 46 75 );..}...if (spFu
345e0 6e 63 74 69 6f 6e 4c 69 73 74 20 21 3d 20 4e 55 nctionList != NU
345f0 4c 4c 29 20 7b 0a 09 09 2a 70 70 46 75 6e 63 74 LL) {...*ppFunct
34600 69 6f 6e 4c 69 73 74 20 3d 20 73 70 46 75 6e 63 ionList = spFunc
34610 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 09 43 41 43 tionList;....CAC
34620 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
34630 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f ("Returning CKR_
34640 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b OK (%i)", CKR_OK
34650 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
34660 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 70 46 75 6e 63 _OK);..}...pFunc
34670 74 69 6f 6e 4c 69 73 74 20 3d 20 6d 61 6c 6c 6f tionList = mallo
34680 63 28 73 69 7a 65 6f 66 28 2a 70 46 75 6e 63 74 c(sizeof(*pFunct
34690 69 6f 6e 4c 69 73 74 29 29 3b 0a 0a 09 70 46 75 ionList));...pFu
346a0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72 73 nctionList->vers
346b0 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43 41 ion.major = ((CA
346c0 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 CKEY_CRYPTOKI_VE
346d0 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 31 RSION_CODE) >> 1
346e0 36 29 20 26 20 30 78 66 66 3b 0a 09 70 46 75 6e 6) & 0xff;..pFun
346f0 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72 73 69 ctionList->versi
34700 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41 43 on.minor = ((CAC
34710 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 KEY_CRYPTOKI_VER
34720 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38 29 SION_CODE) >> 8)
34730 20 26 20 30 78 66 66 3b 0a 0a 09 70 46 75 6e 63 & 0xff;...pFunc
34740 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 tionList->C_Init
34750 69 61 6c 69 7a 65 20 3d 20 43 5f 49 6e 69 74 69 ialize = C_Initi
34760 61 6c 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f alize;..pFunctio
34770 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 61 6c 69 7a nList->C_Finaliz
34780 65 20 3d 20 43 5f 46 69 6e 61 6c 69 7a 65 3b 0a e = C_Finalize;.
34790 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e .pFunctionList->
347a0 43 5f 47 65 74 49 6e 66 6f 20 3d 20 43 5f 47 65 C_GetInfo = C_Ge
347b0 74 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f tInfo;..pFunctio
347c0 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f 74 nList->C_GetSlot
347d0 4c 69 73 74 20 3d 20 43 5f 47 65 74 53 6c 6f 74 List = C_GetSlot
347e0 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e List;..pFunction
347f0 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f 74 49 List->C_GetSlotI
34800 6e 66 6f 20 3d 20 43 5f 47 65 74 53 6c 6f 74 49 nfo = C_GetSlotI
34810 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c nfo;..pFunctionL
34820 69 73 74 2d 3e 43 5f 47 65 74 54 6f 6b 65 6e 49 ist->C_GetTokenI
34830 6e 66 6f 20 3d 20 43 5f 47 65 74 54 6f 6b 65 6e nfo = C_GetToken
34840 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e Info;..pFunction
34850 4c 69 73 74 2d 3e 43 5f 57 61 69 74 46 6f 72 53 List->C_WaitForS
34860 6c 6f 74 45 76 65 6e 74 20 3d 20 43 5f 57 61 69 lotEvent = C_Wai
34870 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74 3b 0a 09 tForSlotEvent;..
34880 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 pFunctionList->C
34890 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73 _GetMechanismLis
348a0 74 20 3d 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 t = C_GetMechani
348b0 73 6d 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74 69 smList;..pFuncti
348c0 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4d 65 63 onList->C_GetMec
348d0 68 61 6e 69 73 6d 49 6e 66 6f 20 3d 20 43 5f 47 hanismInfo = C_G
348e0 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f 3b etMechanismInfo;
348f0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d ..pFunctionList-
34900 3e 43 5f 49 6e 69 74 54 6f 6b 65 6e 20 3d 20 43 >C_InitToken = C
34910 5f 49 6e 69 74 54 6f 6b 65 6e 3b 0a 09 70 46 75 _InitToken;..pFu
34920 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e nctionList->C_In
34930 69 74 50 49 4e 20 3d 20 43 5f 49 6e 69 74 50 49 itPIN = C_InitPI
34940 4e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 N;..pFunctionLis
34950 74 2d 3e 43 5f 53 65 74 50 49 4e 20 3d 20 43 5f t->C_SetPIN = C_
34960 53 65 74 50 49 4e 3b 0a 09 70 46 75 6e 63 74 69 SetPIN;..pFuncti
34970 6f 6e 4c 69 73 74 2d 3e 43 5f 4f 70 65 6e 53 65 onList->C_OpenSe
34980 73 73 69 6f 6e 20 3d 20 43 5f 4f 70 65 6e 53 65 ssion = C_OpenSe
34990 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f ssion;..pFunctio
349a0 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 53 65 nList->C_CloseSe
349b0 73 73 69 6f 6e 20 3d 20 43 5f 43 6c 6f 73 65 53 ssion = C_CloseS
349c0 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 ession;..pFuncti
349d0 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 41 onList->C_CloseA
349e0 6c 6c 53 65 73 73 69 6f 6e 73 20 3d 20 43 5f 43 llSessions = C_C
349f0 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73 3b loseAllSessions;
34a00 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d ..pFunctionList-
34a10 3e 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e 66 >C_GetSessionInf
34a20 6f 20 3d 20 43 5f 47 65 74 53 65 73 73 69 6f 6e o = C_GetSession
34a30 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e Info;..pFunction
34a40 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 70 65 72 61 List->C_GetOpera
34a50 74 69 6f 6e 53 74 61 74 65 20 3d 20 43 5f 47 65 tionState = C_Ge
34a60 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 3b tOperationState;
34a70 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d ..pFunctionList-
34a80 3e 43 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e 53 >C_SetOperationS
34a90 74 61 74 65 20 3d 20 43 5f 53 65 74 4f 70 65 72 tate = C_SetOper
34aa0 61 74 69 6f 6e 53 74 61 74 65 3b 0a 09 70 46 75 ationState;..pFu
34ab0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4c 6f nctionList->C_Lo
34ac0 67 69 6e 20 3d 20 43 5f 4c 6f 67 69 6e 3b 0a 09 gin = C_Login;..
34ad0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 pFunctionList->C
34ae0 5f 4c 6f 67 6f 75 74 20 3d 20 43 5f 4c 6f 67 6f _Logout = C_Logo
34af0 75 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 ut;..pFunctionLi
34b00 73 74 2d 3e 43 5f 43 72 65 61 74 65 4f 62 6a 65 st->C_CreateObje
34b10 63 74 20 3d 20 43 5f 43 72 65 61 74 65 4f 62 6a ct = C_CreateObj
34b20 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c ect;..pFunctionL
34b30 69 73 74 2d 3e 43 5f 43 6f 70 79 4f 62 6a 65 63 ist->C_CopyObjec
34b40 74 20 3d 20 43 5f 43 6f 70 79 4f 62 6a 65 63 74 t = C_CopyObject
34b50 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 ;..pFunctionList
34b60 2d 3e 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63 ->C_DestroyObjec
34b70 74 20 3d 20 43 5f 44 65 73 74 72 6f 79 4f 62 6a t = C_DestroyObj
34b80 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c ect;..pFunctionL
34b90 69 73 74 2d 3e 43 5f 47 65 74 4f 62 6a 65 63 74 ist->C_GetObject
34ba0 53 69 7a 65 20 3d 20 43 5f 47 65 74 4f 62 6a 65 Size = C_GetObje
34bb0 63 74 53 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69 ctSize;..pFuncti
34bc0 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 41 74 74 onList->C_GetAtt
34bd0 72 69 62 75 74 65 56 61 6c 75 65 20 3d 20 43 5f ributeValue = C_
34be0 47 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 GetAttributeValu
34bf0 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 e;..pFunctionLis
34c00 74 2d 3e 43 5f 53 65 74 41 74 74 72 69 62 75 74 t->C_SetAttribut
34c10 65 56 61 6c 75 65 20 3d 20 43 5f 53 65 74 41 74 eValue = C_SetAt
34c20 74 72 69 62 75 74 65 56 61 6c 75 65 3b 0a 09 70 tributeValue;..p
34c30 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f FunctionList->C_
34c40 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 20 FindObjectsInit
34c50 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 = C_FindObjectsI
34c60 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c nit;..pFunctionL
34c70 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 ist->C_FindObjec
34c80 74 73 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63 ts = C_FindObjec
34c90 74 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 ts;..pFunctionLi
34ca0 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74 st->C_FindObject
34cb0 73 46 69 6e 61 6c 20 3d 20 43 5f 46 69 6e 64 4f sFinal = C_FindO
34cc0 62 6a 65 63 74 73 46 69 6e 61 6c 3b 0a 09 70 46 bjectsFinal;..pF
34cd0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 unctionList->C_E
34ce0 6e 63 72 79 70 74 49 6e 69 74 20 3d 20 43 5f 45 ncryptInit = C_E
34cf0 6e 63 72 79 70 74 49 6e 69 74 3b 0a 09 70 46 75 ncryptInit;..pFu
34d00 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e nctionList->C_En
34d10 63 72 79 70 74 20 3d 20 43 5f 45 6e 63 72 79 70 crypt = C_Encryp
34d20 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 t;..pFunctionLis
34d30 74 2d 3e 43 5f 45 6e 63 72 79 70 74 55 70 64 61 t->C_EncryptUpda
34d40 74 65 20 3d 20 43 5f 45 6e 63 72 79 70 74 55 70 te = C_EncryptUp
34d50 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e date;..pFunction
34d60 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 46 List->C_EncryptF
34d70 69 6e 61 6c 20 3d 20 43 5f 45 6e 63 72 79 70 74 inal = C_Encrypt
34d80 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f Final;..pFunctio
34d90 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 nList->C_Decrypt
34da0 49 6e 69 74 20 3d 20 43 5f 44 65 63 72 79 70 74 Init = C_Decrypt
34db0 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e Init;..pFunction
34dc0 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 20 List->C_Decrypt
34dd0 3d 20 43 5f 44 65 63 72 79 70 74 3b 0a 09 70 46 = C_Decrypt;..pF
34de0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 unctionList->C_D
34df0 65 63 72 79 70 74 55 70 64 61 74 65 20 3d 20 43 ecryptUpdate = C
34e00 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 3b 0a _DecryptUpdate;.
34e10 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e .pFunctionList->
34e20 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 20 3d C_DecryptFinal =
34e30 20 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 3b C_DecryptFinal;
34e40 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d ..pFunctionList-
34e50 3e 43 5f 44 69 67 65 73 74 49 6e 69 74 20 3d 20 >C_DigestInit =
34e60 43 5f 44 69 67 65 73 74 49 6e 69 74 3b 0a 09 70 C_DigestInit;..p
34e70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f FunctionList->C_
34e80 44 69 67 65 73 74 20 3d 20 43 5f 44 69 67 65 73 Digest = C_Diges
34e90 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 t;..pFunctionLis
34ea0 74 2d 3e 43 5f 44 69 67 65 73 74 55 70 64 61 74 t->C_DigestUpdat
34eb0 65 20 3d 20 43 5f 44 69 67 65 73 74 55 70 64 61 e = C_DigestUpda
34ec0 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 te;..pFunctionLi
34ed0 73 74 2d 3e 43 5f 44 69 67 65 73 74 4b 65 79 20 st->C_DigestKey
34ee0 3d 20 43 5f 44 69 67 65 73 74 4b 65 79 3b 0a 09 = C_DigestKey;..
34ef0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 pFunctionList->C
34f00 5f 44 69 67 65 73 74 46 69 6e 61 6c 20 3d 20 43 _DigestFinal = C
34f10 5f 44 69 67 65 73 74 46 69 6e 61 6c 3b 0a 09 70 _DigestFinal;..p
34f20 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f FunctionList->C_
34f30 53 69 67 6e 49 6e 69 74 20 3d 20 43 5f 53 69 67 SignInit = C_Sig
34f40 6e 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f nInit;..pFunctio
34f50 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 20 3d 20 nList->C_Sign =
34f60 43 5f 53 69 67 6e 3b 0a 09 70 46 75 6e 63 74 69 C_Sign;..pFuncti
34f70 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 55 70 onList->C_SignUp
34f80 64 61 74 65 20 3d 20 43 5f 53 69 67 6e 55 70 64 date = C_SignUpd
34f90 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c ate;..pFunctionL
34fa0 69 73 74 2d 3e 43 5f 53 69 67 6e 46 69 6e 61 6c ist->C_SignFinal
34fb0 20 3d 20 43 5f 53 69 67 6e 46 69 6e 61 6c 3b 0a = C_SignFinal;.
34fc0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e .pFunctionList->
34fd0 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 49 6e 69 C_SignRecoverIni
34fe0 74 20 3d 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 t = C_SignRecove
34ff0 72 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f rInit;..pFunctio
35000 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 52 65 63 nList->C_SignRec
35010 6f 76 65 72 20 3d 20 43 5f 53 69 67 6e 52 65 63 over = C_SignRec
35020 6f 76 65 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e over;..pFunction
35030 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 49 6e List->C_VerifyIn
35040 69 74 20 3d 20 43 5f 56 65 72 69 66 79 49 6e 69 it = C_VerifyIni
35050 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 t;..pFunctionLis
35060 74 2d 3e 43 5f 56 65 72 69 66 79 20 3d 20 43 5f t->C_Verify = C_
35070 56 65 72 69 66 79 3b 0a 09 70 46 75 6e 63 74 69 Verify;..pFuncti
35080 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 onList->C_Verify
35090 55 70 64 61 74 65 20 3d 20 43 5f 56 65 72 69 66 Update = C_Verif
350a0 79 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 yUpdate;..pFunct
350b0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 ionList->C_Verif
350c0 79 46 69 6e 61 6c 20 3d 20 43 5f 56 65 72 69 66 yFinal = C_Verif
350d0 79 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 yFinal;..pFuncti
350e0 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 onList->C_Verify
350f0 52 65 63 6f 76 65 72 49 6e 69 74 20 3d 20 43 5f RecoverInit = C_
35100 56 65 72 69 66 79 52 65 63 6f 76 65 72 49 6e 69 VerifyRecoverIni
35110 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 t;..pFunctionLis
35120 74 2d 3e 43 5f 56 65 72 69 66 79 52 65 63 6f 76 t->C_VerifyRecov
35130 65 72 20 3d 20 43 5f 56 65 72 69 66 79 52 65 63 er = C_VerifyRec
35140 6f 76 65 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e over;..pFunction
35150 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 45 6e List->C_DigestEn
35160 63 72 79 70 74 55 70 64 61 74 65 20 3d 20 43 5f cryptUpdate = C_
35170 44 69 67 65 73 74 45 6e 63 72 79 70 74 55 70 64 DigestEncryptUpd
35180 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c ate;..pFunctionL
35190 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 44 69 ist->C_DecryptDi
351a0 67 65 73 74 55 70 64 61 74 65 20 3d 20 43 5f 44 gestUpdate = C_D
351b0 65 63 72 79 70 74 44 69 67 65 73 74 55 70 64 61 ecryptDigestUpda
351c0 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 te;..pFunctionLi
351d0 73 74 2d 3e 43 5f 53 69 67 6e 45 6e 63 72 79 70 st->C_SignEncryp
351e0 74 55 70 64 61 74 65 20 3d 20 43 5f 53 69 67 6e tUpdate = C_Sign
351f0 45 6e 63 72 79 70 74 55 70 64 61 74 65 3b 0a 09 EncryptUpdate;..
35200 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 pFunctionList->C
35210 5f 44 65 63 72 79 70 74 56 65 72 69 66 79 55 70 _DecryptVerifyUp
35220 64 61 74 65 20 3d 20 43 5f 44 65 63 72 79 70 74 date = C_Decrypt
35230 56 65 72 69 66 79 55 70 64 61 74 65 3b 0a 09 70 VerifyUpdate;..p
35240 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f FunctionList->C_
35250 47 65 6e 65 72 61 74 65 4b 65 79 20 3d 20 43 5f GenerateKey = C_
35260 47 65 6e 65 72 61 74 65 4b 65 79 3b 0a 09 70 46 GenerateKey;..pF
35270 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 unctionList->C_G
35280 65 6e 65 72 61 74 65 4b 65 79 50 61 69 72 20 3d enerateKeyPair =
35290 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 50 61 C_GenerateKeyPa
352a0 69 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 ir;..pFunctionLi
352b0 73 74 2d 3e 43 5f 57 72 61 70 4b 65 79 20 3d 20 st->C_WrapKey =
352c0 43 5f 57 72 61 70 4b 65 79 3b 0a 09 70 46 75 6e C_WrapKey;..pFun
352d0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 55 6e 77 ctionList->C_Unw
352e0 72 61 70 4b 65 79 20 3d 20 43 5f 55 6e 77 72 61 rapKey = C_Unwra
352f0 70 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e pKey;..pFunction
35300 4c 69 73 74 2d 3e 43 5f 44 65 72 69 76 65 4b 65 List->C_DeriveKe
35310 79 20 3d 20 43 5f 44 65 72 69 76 65 4b 65 79 3b y = C_DeriveKey;
35320 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d ..pFunctionList-
35330 3e 43 5f 53 65 65 64 52 61 6e 64 6f 6d 20 3d 20 >C_SeedRandom =
35340 43 5f 53 65 65 64 52 61 6e 64 6f 6d 3b 0a 09 70 C_SeedRandom;..p
35350 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f FunctionList->C_
35360 47 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d 20 3d GenerateRandom =
35370 20 43 5f 47 65 6e 65 72 61 74 65 52 61 6e 64 6f C_GenerateRando
35380 6d 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 m;..pFunctionLis
35390 74 2d 3e 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e t->C_GetFunction
353a0 53 74 61 74 75 73 20 3d 20 43 5f 47 65 74 46 75 Status = C_GetFu
353b0 6e 63 74 69 6f 6e 53 74 61 74 75 73 3b 0a 09 70 nctionStatus;..p
353c0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f FunctionList->C_
353d0 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 20 3d CancelFunction =
353e0 20 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f C_CancelFunctio
353f0 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 n;..pFunctionLis
35400 74 2d 3e 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e t->C_GetFunction
35410 4c 69 73 74 20 3d 20 43 5f 47 65 74 46 75 6e 63 List = C_GetFunc
35420 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 73 70 46 75 tionList;...spFu
35430 6e 63 74 69 6f 6e 4c 69 73 74 20 20 3d 20 70 46 nctionList = pF
35440 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 09 2a 70 unctionList;..*p
35450 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 pFunctionList =
35460 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a pFunctionList;..
35470 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
35480 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
35490 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b CKR_OK (%i)", CK
354a0 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 R_OK);...return(
354b0 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a CKR_OK);.}.