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 47 53 0x00.#define GS
12d0: 43 49 53 5f 41 49 44 5f 49 44 30 20 20 20 20 20 CIS_AID_ID0
12e0: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 41 30 0xA0
12f0: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 , 0x00, 0x00, 0x
1300: 30 30 2c 20 30 78 37 39 2c 20 30 78 30 31 2c 20 00, 0x79, 0x01,
1310: 30 78 30 30 0a 23 64 65 66 69 6e 65 20 4e 49 53 0x00.#define NIS
1320: 54 53 50 38 30 30 5f 37 33 5f 33 5f 50 49 56 5f TSP800_73_3_PIV_
1330: 41 49 44 20 20 20 20 20 20 20 20 30 78 41 30 2c AID 0xA0,
1340: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 0x00, 0x00, 0x0
1350: 33 2c 20 30 78 30 38 2c 20 30 78 30 30 2c 20 30 3, 0x08, 0x00, 0
1360: 78 30 30 2c 20 30 78 31 30 2c 20 30 78 30 30 2c x00, 0x10, 0x00,
1370: 20 30 78 30 31 2c 20 30 78 30 30 0a 0a 2f 2a 20 0x01, 0x00../*
1380: 50 49 56 20 49 44 73 20 2a 2f 0a 2f 2a 2a 20 4b PIV IDs */./** K
1390: 65 79 20 49 64 65 6e 74 69 66 69 65 72 73 20 28 ey Identifiers (
13a0: 4e 49 53 54 20 53 50 20 38 30 30 2d 37 38 2d 33 NIST SP 800-78-3
13b0: 2c 20 54 61 62 6c 65 20 36 2d 31 20 2a 2a 2f 0a , Table 6-1 **/.
13c0: 23 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 #define NISTSP80
13d0: 30 5f 37 38 5f 33 5f 4b 45 59 5f 50 49 56 41 55 0_78_3_KEY_PIVAU
13e0: 54 48 20 20 20 30 78 39 41 0a 23 64 65 66 69 6e TH 0x9A.#defin
13f0: 65 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33 e NISTSP800_78_3
1400: 5f 4b 45 59 5f 53 49 47 4e 41 54 55 52 45 20 30 _KEY_SIGNATURE 0
1410: 78 39 43 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 x9C.#define NIST
1420: 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 4b SP800_78_3_KEY_K
1430: 45 59 4d 47 54 20 20 20 20 30 78 39 44 0a 23 64 EYMGT 0x9D.#d
1440: 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f efine NISTSP800_
1450: 37 38 5f 33 5f 4b 45 59 5f 43 41 52 44 41 55 54 78_3_KEY_CARDAUT
1460: 48 20 20 30 78 39 45 0a 0a 2f 2a 2a 20 41 6c 67 H 0x9E../** Alg
1470: 6f 72 69 74 68 6d 20 49 64 65 6e 74 69 66 69 65 orithm Identifie
1480: 72 73 20 28 4e 49 53 54 20 53 50 20 38 30 30 2d rs (NIST SP 800-
1490: 37 38 2d 33 2c 20 54 61 62 6c 65 20 36 2d 32 20 78-3, Table 6-2
14a0: 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 **/.#define NIST
14b0: 53 50 38 30 30 5f 37 38 5f 33 5f 41 4c 47 4f 5f SP800_78_3_ALGO_
14c0: 52 53 41 31 30 32 34 20 20 30 78 30 36 0a 23 64 RSA1024 0x06.#d
14d0: 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f efine NISTSP800_
14e0: 37 38 5f 33 5f 41 4c 47 4f 5f 52 53 41 32 30 34 78_3_ALGO_RSA204
14f0: 38 20 20 30 78 30 37 0a 0a 2f 2a 2a 20 4f 62 6a 8 0x07../** Obj
1500: 65 63 74 20 49 64 65 6e 74 69 66 69 65 72 73 20 ect Identifiers
1510: 28 4e 49 53 54 20 53 50 20 38 30 30 2d 37 33 2d (NIST SP 800-73-
1520: 33 20 50 61 72 74 20 31 2c 20 54 61 62 6c 65 20 3 Part 1, Table
1530: 32 29 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 2) **/.#define N
1540: 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f 49 ISTSP800_73_3_OI
1550: 44 5f 50 49 56 41 55 54 48 20 20 20 30 78 35 46 D_PIVAUTH 0x5F
1560: 2c 20 30 78 43 31 2c 20 30 78 30 35 0a 23 64 65 , 0xC1, 0x05.#de
1570: 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f 37 fine NISTSP800_7
1580: 33 5f 33 5f 4f 49 44 5f 53 49 47 4e 41 54 55 52 3_3_OID_SIGNATUR
1590: 45 20 30 78 35 46 2c 20 30 78 43 31 2c 20 30 78 E 0x5F, 0xC1, 0x
15a0: 30 41 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53 0A.#define NISTS
15b0: 50 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 4b 45 P800_73_3_OID_KE
15c0: 59 4d 47 54 20 20 20 20 30 78 35 46 2c 20 30 78 YMGT 0x5F, 0x
15d0: 43 31 2c 20 30 78 30 42 0a 23 64 65 66 69 6e 65 C1, 0x0B.#define
15e0: 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f NISTSP800_73_3_
15f0: 4f 49 44 5f 43 41 52 44 41 55 54 48 20 20 30 78 OID_CARDAUTH 0x
1600: 35 46 2c 20 30 78 43 31 2c 20 30 78 30 31 0a 0a 5F, 0xC1, 0x01..
1610: 2f 2a 20 4d 61 78 69 6d 75 6d 20 73 69 7a 65 20 /* Maximum size
1620: 6f 66 20 64 61 74 61 20 70 6f 72 74 69 6f 6e 20 of data portion
1630: 6f 66 20 41 50 44 55 73 20 2a 2f 0a 2f 2a 2a 20 of APDUs */./**
1640: 44 6f 20 6e 6f 74 20 73 65 74 20 74 68 69 73 20 Do not set this
1650: 61 62 6f 76 65 20 32 35 30 20 2a 2a 2f 0a 23 64 above 250 **/.#d
1660: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 41 50 44 efine CACKEY_APD
1670: 55 5f 4d 54 55 20 20 20 20 20 20 20 20 20 20 20 U_MTU
1680: 20 20 20 20 32 35 30 0a 0a 2f 2a 20 41 54 52 20 250../* ATR
1690: 49 66 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 If not available
16a0: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4d 41 58 5f */.#ifndef MAX_
16b0: 41 54 52 5f 53 49 5a 45 0a 23 64 65 66 69 6e 65 ATR_SIZE.#define
16c0: 20 4d 41 58 5f 41 54 52 5f 53 49 5a 45 20 31 30 MAX_ATR_SIZE 10
16d0: 32 34 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 24.#endif..#ifde
16e0: 66 20 43 41 43 4b 45 59 5f 44 45 42 55 47 0a 23 f CACKEY_DEBUG.#
16f0: 20 20 69 66 64 65 66 20 48 41 56 45 5f 54 49 4d ifdef HAVE_TIM
1700: 45 5f 48 0a 23 20 20 20 20 69 6e 63 6c 75 64 65 E_H.# include
1710: 20 3c 74 69 6d 65 2e 68 3e 0a 73 74 61 74 69 63 <time.h>.static
1720: 20 74 69 6d 65 5f 74 20 63 61 63 6b 65 79 5f 64 time_t cackey_d
1730: 65 62 75 67 5f 73 74 61 72 74 5f 74 69 6d 65 20 ebug_start_time
1740: 3d 20 30 3b 0a 73 74 61 74 69 63 20 75 6e 73 69 = 0;.static unsi
1750: 67 6e 65 64 20 6c 6f 6e 67 20 43 41 43 4b 45 59 gned long CACKEY
1760: 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45 28 76 _DEBUG_GETTIME(v
1770: 6f 69 64 29 20 7b 0a 09 69 66 20 28 63 61 63 6b oid) {..if (cack
1780: 65 79 5f 64 65 62 75 67 5f 73 74 61 72 74 5f 74 ey_debug_start_t
1790: 69 6d 65 20 3d 3d 20 30 29 20 7b 0a 09 09 63 61 ime == 0) {...ca
17a0: 63 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72 74 ckey_debug_start
17b0: 5f 74 69 6d 65 20 3d 20 74 69 6d 65 28 4e 55 4c _time = time(NUL
17c0: 4c 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 L);..}...return(
17d0: 74 69 6d 65 28 4e 55 4c 4c 29 20 2d 20 63 61 63 time(NULL) - cac
17e0: 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72 74 5f key_debug_start_
17f0: 74 69 6d 65 29 3b 0a 7d 0a 23 20 20 65 6c 73 65 time);.}.# else
1800: 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 .static unsigned
1810: 20 6c 6f 6e 67 20 43 41 43 4b 45 59 5f 44 45 42 long CACKEY_DEB
1820: 55 47 5f 47 45 54 54 49 4d 45 28 76 6f 69 64 29 UG_GETTIME(void)
1830: 20 7b 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d {..return(0);.}
1840: 0a 23 20 20 65 6e 64 69 66 0a 0a 23 20 20 64 65 .# endif..# de
1850: 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 fine CACKEY_DEBU
1860: 47 5f 50 52 49 4e 54 46 28 78 2e 2e 2e 29 20 7b G_PRINTF(x...) {
1870: 20 5c 0a 09 73 74 61 74 69 63 20 63 68 61 72 20 \..static char
1880: 62 75 66 5f 75 73 65 72 5b 34 30 39 36 5d 20 3d buf_user[4096] =
1890: 20 7b 30 7d 3b 20 5c 0a 09 73 6e 70 72 69 6e 74 {0}; \..snprint
18a0: 66 28 62 75 66 5f 75 73 65 72 2c 20 73 69 7a 65 f(buf_user, size
18b0: 6f 66 28 62 75 66 5f 75 73 65 72 29 2c 20 78 29 of(buf_user), x)
18c0: 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72 5b 73 69 ; \..buf_user[si
18d0: 7a 65 6f 66 28 62 75 66 5f 75 73 65 72 29 20 2d zeof(buf_user) -
18e0: 20 31 5d 20 3d 20 27 5c 30 27 3b 20 5c 0a 09 66 1] = '\0'; \..f
18f0: 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 printf(cackey_de
1900: 62 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d bug_fd(), "[%lu]
1910: 3a 20 25 73 28 29 3a 25 69 3a 20 25 73 5c 6e 22 : %s():%i: %s\n"
1920: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 47 , CACKEY_DEBUG_G
1930: 45 54 54 49 4d 45 28 29 2c 20 5f 5f 66 75 6e 63 ETTIME(), __func
1940: 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 2c 20 62 75 __, __LINE__, bu
1950: 66 5f 75 73 65 72 29 3b 20 5c 0a 09 66 66 6c 75 f_user); \..fflu
1960: 73 68 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f sh(cackey_debug_
1970: 66 64 28 29 29 3b 20 5c 0a 7d 0a 23 20 20 64 65 fd()); \.}.# de
1980: 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 fine CACKEY_DEBU
1990: 47 5f 50 52 49 4e 54 42 55 46 28 66 2c 20 78 2c G_PRINTBUF(f, x,
19a0: 20 79 29 20 7b 20 5c 0a 09 73 74 61 74 69 63 20 y) { \..static
19b0: 63 68 61 72 20 62 75 66 5f 75 73 65 72 5b 38 31 char buf_user[81
19c0: 39 32 5d 20 3d 20 7b 30 7d 2c 20 2a 62 75 66 5f 92] = {0}, *buf_
19d0: 75 73 65 72 5f 70 2c 20 2a 62 75 66 5f 75 73 65 user_p, *buf_use
19e0: 72 5f 70 72 69 6e 74 3b 20 5c 0a 09 75 6e 73 69 r_print; \..unsi
19f0: 67 6e 65 64 20 6c 6f 6e 67 20 62 75 66 5f 75 73 gned long buf_us
1a00: 65 72 5f 73 69 7a 65 3b 20 5c 0a 09 75 6e 73 69 er_size; \..unsi
1a10: 67 6e 65 64 20 63 68 61 72 20 2a 54 4d 50 42 55 gned char *TMPBU
1a20: 46 3b 20 5c 0a 09 75 6e 73 69 67 6e 65 64 20 6c F; \..unsigned l
1a30: 6f 6e 67 20 69 64 78 3b 20 5c 0a 09 69 6e 74 20 ong idx; \..int
1a40: 73 6e 70 72 69 6e 74 66 5f 72 65 74 3b 20 5c 0a snprintf_ret; \.
1a50: 09 54 4d 50 42 55 46 20 3d 20 28 75 6e 73 69 67 .TMPBUF = (unsig
1a60: 6e 65 64 20 63 68 61 72 20 2a 29 20 28 78 29 3b ned char *) (x);
1a70: 20 5c 0a 09 62 75 66 5f 75 73 65 72 5b 30 5d 20 \..buf_user[0]
1a80: 3d 20 30 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72 = 0; \..buf_user
1a90: 5b 32 5d 20 3d 20 30 3b 20 5c 0a 09 62 75 66 5f [2] = 0; \..buf_
1aa0: 75 73 65 72 5f 70 20 3d 20 62 75 66 5f 75 73 65 user_p = buf_use
1ab0: 72 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72 5f 73 r; \..buf_user_s
1ac0: 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 62 75 66 ize = sizeof(buf
1ad0: 5f 75 73 65 72 29 3b 20 5c 0a 09 66 6f 72 20 28 _user); \..for (
1ae0: 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 idx = 0; idx < (
1af0: 79 29 3b 20 69 64 78 2b 2b 29 20 7b 20 5c 0a 09 y); idx++) { \..
1b00: 09 69 66 20 28 62 75 66 5f 75 73 65 72 5f 73 69 .if (buf_user_si
1b10: 7a 65 20 3c 3d 20 30 29 20 7b 20 5c 0a 09 09 09 ze <= 0) { \....
1b20: 62 72 65 61 6b 3b 20 5c 0a 09 09 7d 3b 20 5c 0a break; \...}; \.
1b30: 09 09 73 6e 70 72 69 6e 74 66 5f 72 65 74 20 3d ..snprintf_ret =
1b40: 20 73 6e 70 72 69 6e 74 66 28 62 75 66 5f 75 73 snprintf(buf_us
1b50: 65 72 5f 70 2c 20 62 75 66 5f 75 73 65 72 5f 73 er_p, buf_user_s
1b60: 69 7a 65 2c 20 22 2c 20 25 30 32 78 22 2c 20 54 ize, ", %02x", T
1b70: 4d 50 42 55 46 5b 69 64 78 5d 29 3b 20 5c 0a 09 MPBUF[idx]); \..
1b80: 09 69 66 20 28 73 6e 70 72 69 6e 74 66 5f 72 65 .if (snprintf_re
1b90: 74 20 3c 3d 20 30 29 20 7b 20 5c 0a 09 09 09 62 t <= 0) { \....b
1ba0: 72 65 61 6b 3b 20 5c 0a 09 09 7d 3b 20 5c 0a 09 reak; \...}; \..
1bb0: 09 62 75 66 5f 75 73 65 72 5f 70 20 2b 3d 20 73 .buf_user_p += s
1bc0: 6e 70 72 69 6e 74 66 5f 72 65 74 3b 20 5c 0a 09 nprintf_ret; \..
1bd0: 09 62 75 66 5f 75 73 65 72 5f 73 69 7a 65 20 2d .buf_user_size -
1be0: 3d 20 73 6e 70 72 69 6e 74 66 5f 72 65 74 3b 20 = snprintf_ret;
1bf0: 5c 0a 09 7d 3b 20 5c 0a 09 62 75 66 5f 75 73 65 \..}; \..buf_use
1c00: 72 5b 73 69 7a 65 6f 66 28 62 75 66 5f 75 73 65 r[sizeof(buf_use
1c10: 72 29 20 2d 20 31 5d 20 3d 20 27 5c 30 27 3b 20 r) - 1] = '\0';
1c20: 5c 0a 09 62 75 66 5f 75 73 65 72 5f 70 72 69 6e \..buf_user_prin
1c30: 74 20 3d 20 62 75 66 5f 75 73 65 72 20 2b 20 32 t = buf_user + 2
1c40: 3b 20 5c 0a 09 66 70 72 69 6e 74 66 28 63 61 63 ; \..fprintf(cac
1c50: 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c 20 key_debug_fd(),
1c60: 22 5b 25 6c 75 5d 3a 20 25 73 28 29 3a 25 69 3a "[%lu]: %s():%i:
1c70: 20 25 73 20 20 28 25 73 2f 25 6c 75 20 3d 20 7b %s (%s/%lu = {
1c80: 25 73 7d 29 5c 6e 22 2c 20 43 41 43 4b 45 59 5f %s})\n", CACKEY_
1c90: 44 45 42 55 47 5f 47 45 54 54 49 4d 45 28 29 2c DEBUG_GETTIME(),
1ca0: 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e __func__, __LIN
1cb0: 45 5f 5f 2c 20 66 2c 20 23 78 2c 20 28 75 6e 73 E__, f, #x, (uns
1cc0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 79 29 2c igned long) (y),
1cd0: 20 62 75 66 5f 75 73 65 72 5f 70 72 69 6e 74 29 buf_user_print)
1ce0: 3b 20 5c 0a 09 66 66 6c 75 73 68 28 63 61 63 6b ; \..fflush(cack
1cf0: 65 79 5f 64 65 62 75 67 5f 66 64 28 29 29 3b 20 ey_debug_fd());
1d00: 5c 0a 7d 0a 23 20 20 64 65 66 69 6e 65 20 66 72 \.}.# define fr
1d10: 65 65 28 78 29 20 7b 20 43 41 43 4b 45 59 5f 44 ee(x) { CACKEY_D
1d20: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 52 45 EBUG_PRINTF("FRE
1d30: 45 28 25 70 29 20 28 25 73 29 22 2c 20 28 76 6f E(%p) (%s)", (vo
1d40: 69 64 20 2a 29 20 78 2c 20 23 78 29 3b 20 66 72 id *) x, #x); fr
1d50: 65 65 28 78 29 3b 20 7d 0a 0a 73 74 61 74 69 63 ee(x); }..static
1d60: 20 46 49 4c 45 20 2a 63 61 63 6b 65 79 5f 64 65 FILE *cackey_de
1d70: 62 75 67 5f 66 64 28 76 6f 69 64 29 20 7b 0a 09 bug_fd(void) {..
1d80: 73 74 61 74 69 63 20 46 49 4c 45 20 2a 66 64 20 static FILE *fd
1d90: 3d 20 4e 55 4c 4c 3b 0a 09 63 68 61 72 20 2a 6c = NULL;..char *l
1da0: 6f 67 66 69 6c 65 3b 0a 0a 09 69 66 20 28 66 64 ogfile;...if (fd
1db0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 != NULL) {...re
1dc0: 74 75 72 6e 28 66 64 29 3b 0a 09 7d 0a 0a 09 2f turn(fd);..}.../
1dd0: 2a 0a 09 20 2a 20 4c 6f 67 20 74 6f 20 73 74 64 *.. * Log to std
1de0: 65 72 72 20 69 6e 69 74 69 61 6c 6c 79 20 73 6f err initially so
1df0: 20 77 65 20 63 61 6e 20 75 73 65 20 64 65 62 75 we can use debu
1e00: 67 67 69 6e 67 20 77 69 74 68 69 6e 0a 09 20 2a gging within.. *
1e10: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 this function w
1e20: 69 74 68 6f 75 74 20 67 65 74 74 69 6e 67 20 69 ithout getting i
1e30: 6e 74 6f 20 61 6e 20 69 6e 66 69 6e 69 74 65 20 nto an infinite
1e40: 6c 6f 6f 70 0a 09 20 2a 2f 0a 09 66 64 20 3d 20 loop.. */..fd =
1e50: 73 74 64 65 72 72 3b 0a 0a 09 6c 6f 67 66 69 6c stderr;...logfil
1e60: 65 20 3d 20 67 65 74 65 6e 76 28 22 43 41 43 4b e = getenv("CACK
1e70: 45 59 5f 44 45 42 55 47 5f 4c 4f 47 46 49 4c 45 EY_DEBUG_LOGFILE
1e80: 22 29 3b 0a 09 69 66 20 28 6c 6f 67 66 69 6c 65 ");..if (logfile
1e90: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 != NULL) {...CA
1ea0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
1eb0: 46 28 22 46 6f 75 6e 64 20 65 6e 76 69 72 6f 6e F("Found environ
1ec0: 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 3a 20 25 ment variable: %
1ed0: 73 22 2c 20 6c 6f 67 66 69 6c 65 29 3b 0a 0a 09 s", logfile);...
1ee0: 09 6c 6f 67 66 69 6c 65 20 3d 20 73 74 72 63 68 .logfile = strch
1ef0: 72 28 6c 6f 67 66 69 6c 65 2c 20 27 3d 27 29 3b r(logfile, '=');
1f00: 0a 09 09 69 66 20 28 6c 6f 67 66 69 6c 65 20 3d ...if (logfile =
1f10: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 6c 6f 67 = NULL) {....log
1f20: 66 69 6c 65 20 3d 20 67 65 74 65 6e 76 28 22 43 file = getenv("C
1f30: 41 43 4b 45 59 5f 44 45 42 55 47 5f 4c 4f 47 46 ACKEY_DEBUG_LOGF
1f40: 49 4c 45 22 29 3b 0a 09 09 7d 20 65 6c 73 65 20 ILE");...} else
1f50: 7b 0a 09 09 09 6c 6f 67 66 69 6c 65 2b 2b 3b 0a {....logfile++;.
1f60: 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 ..}..}..#ifdef C
1f70: 41 43 4b 45 59 5f 44 45 42 55 47 5f 4c 4f 47 46 ACKEY_DEBUG_LOGF
1f80: 49 4c 45 0a 09 69 66 20 28 6c 6f 67 66 69 6c 65 ILE..if (logfile
1f90: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6c 6f == NULL) {...lo
1fa0: 67 66 69 6c 65 20 3d 20 43 41 43 4b 45 59 5f 44 gfile = CACKEY_D
1fb0: 45 42 55 47 5f 4c 4f 47 46 49 4c 45 3b 0a 09 7d EBUG_LOGFILE;..}
1fc0: 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28 6c 6f .#endif...if (lo
1fd0: 67 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b gfile != NULL) {
1fe0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1ff0: 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 6c 6f PRINTF("Found lo
2000: 67 20 66 69 6c 65 3a 20 25 73 22 2c 20 6c 6f 67 g file: %s", log
2010: 66 69 6c 65 29 3b 0a 0a 09 09 66 64 20 3d 20 66 file);....fd = f
2020: 6f 70 65 6e 28 6c 6f 67 66 69 6c 65 2c 20 22 61 open(logfile, "a
2030: 22 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 66 64 20 ");..}...if (fd
2040: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 64 20 == NULL) {...fd
2050: 3d 20 73 74 64 65 72 72 3b 0a 09 7d 0a 0a 09 69 = stderr;..}...i
2060: 66 20 28 66 64 20 3d 3d 20 73 74 64 65 72 72 29 f (fd == stderr)
2070: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
2080: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
2090: 69 6e 67 20 73 74 64 65 72 72 22 29 3b 0a 09 7d ing stderr");..}
20a0: 20 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b 45 59 else {...CACKEY
20b0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
20c0: 65 74 75 72 6e 69 6e 67 20 25 70 22 2c 20 28 76 eturning %p", (v
20d0: 6f 69 64 20 2a 29 20 66 64 29 3b 0a 09 7d 0a 0a oid *) fd);..}..
20e0: 09 72 65 74 75 72 6e 28 66 64 29 3b 0a 7d 0a 0a .return(fd);.}..
20f0: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 43 41 43 static void *CAC
2100: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4d KEY_DEBUG_FUNC_M
2110: 41 4c 4c 4f 43 28 73 69 7a 65 5f 74 20 73 69 7a ALLOC(size_t siz
2120: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 e, const char *f
2130: 75 6e 63 2c 20 69 6e 74 20 6c 69 6e 65 29 20 7b unc, int line) {
2140: 0a 09 76 6f 69 64 20 2a 72 65 74 76 61 6c 3b 0a ..void *retval;.
2150: 0a 09 72 65 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f ..retval = mallo
2160: 63 28 73 69 7a 65 29 3b 0a 0a 09 66 70 72 69 6e c(size);...fprin
2170: 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f tf(cackey_debug_
2180: 66 64 28 29 2c 20 22 5b 25 6c 75 5d 3a 20 25 73 fd(), "[%lu]: %s
2190: 28 29 3a 25 69 3a 20 4d 41 4c 4c 4f 43 28 29 20 ():%i: MALLOC()
21a0: 3d 20 25 70 5c 6e 22 2c 20 43 41 43 4b 45 59 5f = %p\n", CACKEY_
21b0: 44 45 42 55 47 5f 47 45 54 54 49 4d 45 28 29 2c DEBUG_GETTIME(),
21c0: 20 66 75 6e 63 2c 20 6c 69 6e 65 2c 20 72 65 74 func, line, ret
21d0: 76 61 6c 29 3b 0a 09 66 66 6c 75 73 68 28 63 61 val);..fflush(ca
21e0: 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 29 ckey_debug_fd())
21f0: 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 ;...return(retva
2200: 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f l);.}..static vo
2210: 69 64 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 id *CACKEY_DEBUG
2220: 5f 46 55 4e 43 5f 52 45 41 4c 4c 4f 43 28 76 6f _FUNC_REALLOC(vo
2230: 69 64 20 2a 70 74 72 2c 20 73 69 7a 65 5f 74 20 id *ptr, size_t
2240: 73 69 7a 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 size, const char
2250: 20 2a 66 75 6e 63 2c 20 69 6e 74 20 6c 69 6e 65 *func, int line
2260: 29 20 7b 0a 09 76 6f 69 64 20 2a 72 65 74 76 61 ) {..void *retva
2270: 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20 72 65 l;...retval = re
2280: 61 6c 6c 6f 63 28 70 74 72 2c 20 73 69 7a 65 29 alloc(ptr, size)
2290: 3b 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20 21 ;...if (retval !
22a0: 3d 20 70 74 72 29 20 7b 0a 09 09 66 70 72 69 6e = ptr) {...fprin
22b0: 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f tf(cackey_debug_
22c0: 66 64 28 29 2c 20 22 5b 25 6c 75 5d 3a 20 25 73 fd(), "[%lu]: %s
22d0: 28 29 3a 25 69 3a 20 52 45 41 4c 4c 4f 43 28 25 ():%i: REALLOC(%
22e0: 70 29 20 3d 20 25 70 5c 6e 22 2c 20 43 41 43 4b p) = %p\n", CACK
22f0: 45 59 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45 EY_DEBUG_GETTIME
2300: 28 29 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 2c 20 (), func, line,
2310: 70 74 72 2c 20 72 65 74 76 61 6c 29 3b 0a 09 09 ptr, retval);...
2320: 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f 64 65 fflush(cackey_de
2330: 62 75 67 5f 66 64 28 29 29 3b 0a 09 7d 0a 0a 09 bug_fd());..}...
2340: 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 4e 55 if (retval == NU
2350: 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 LL) {...CACKEY_D
2360: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2a 2a EBUG_PRINTF(" **
2370: 2a 20 45 52 52 4f 52 20 2a 2a 2a 20 72 65 61 6c * ERROR *** real
2380: 6c 6f 63 20 72 65 74 75 72 6e 65 64 20 4e 55 4c loc returned NUL
2390: 4c 20 28 73 69 7a 65 20 3d 20 25 6c 75 29 22 2c L (size = %lu)",
23a0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
23b0: 20 73 69 7a 65 29 3b 0a 09 7d 0a 0a 09 72 65 74 size);..}...ret
23c0: 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a urn(retval);.}..
23d0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 43 41 43 static char *CAC
23e0: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 KEY_DEBUG_FUNC_S
23f0: 54 52 44 55 50 28 63 6f 6e 73 74 20 63 68 61 72 TRDUP(const char
2400: 20 2a 70 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 *ptr, const cha
2410: 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20 6c 69 6e r *func, int lin
2420: 65 29 20 7b 0a 09 63 68 61 72 20 2a 72 65 74 76 e) {..char *retv
2430: 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20 73 al;...retval = s
2440: 74 72 64 75 70 28 70 74 72 29 3b 0a 0a 09 66 70 trdup(ptr);...fp
2450: 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 rintf(cackey_deb
2460: 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d 3a ug_fd(), "[%lu]:
2470: 20 25 73 28 29 3a 25 69 3a 20 53 54 52 44 55 50 %s():%i: STRDUP
2480: 5f 4d 41 4c 4c 4f 43 28 29 20 3d 20 25 70 5c 6e _MALLOC() = %p\n
2490: 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ", CACKEY_DEBUG_
24a0: 47 45 54 54 49 4d 45 28 29 2c 20 66 75 6e 63 2c GETTIME(), func,
24b0: 20 6c 69 6e 65 2c 20 72 65 74 76 61 6c 29 3b 0a line, retval);.
24c0: 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f 64 .fflush(cackey_d
24d0: 65 62 75 67 5f 66 64 28 29 29 3b 0a 0a 09 72 65 ebug_fd());...re
24e0: 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a turn(retval);.}.
24f0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 .static const ch
2500: 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 ar *CACKEY_DEBUG
2510: 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 _FUNC_TAG_TO_STR
2520: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 (unsigned char t
2530: 61 67 29 20 7b 0a 09 73 77 69 74 63 68 20 28 74 ag) {..switch (t
2540: 61 67 29 20 7b 0a 09 09 63 61 73 65 20 47 53 43 ag) {...case GSC
2550: 49 53 5f 54 41 47 5f 43 41 52 44 49 44 3a 0a 09 IS_TAG_CARDID:..
2560: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f ..return("GSCIS_
2570: 54 41 47 5f 43 41 52 44 49 44 22 29 3b 0a 09 09 TAG_CARDID");...
2580: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 case GSCIS_TAG_C
2590: 43 43 5f 56 45 52 3a 0a 09 09 09 72 65 74 75 72 CC_VER:....retur
25a0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 43 43 n("GSCIS_TAG_CCC
25b0: 5f 56 45 52 22 29 3b 0a 09 09 63 61 73 65 20 47 _VER");...case G
25c0: 53 43 49 53 5f 54 41 47 5f 43 43 47 5f 56 45 52 SCIS_TAG_CCG_VER
25d0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 :....return("GSC
25e0: 49 53 5f 54 41 47 5f 43 43 47 5f 56 45 52 22 29 IS_TAG_CCG_VER")
25f0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 ;...case GSCIS_T
2600: 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09 72 AG_CARDURL:....r
2610: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 eturn("GSCIS_TAG
2620: 5f 43 41 52 44 55 52 4c 22 29 3b 0a 09 09 63 61 _CARDURL");...ca
2630: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 se GSCIS_TAG_PKC
2640: 53 31 35 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 S15:....return("
2650: 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 53 31 35 GSCIS_TAG_PKCS15
2660: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 ");...case GSCIS
2670: 5f 54 41 47 5f 52 45 47 5f 44 41 54 41 5f 4d 4f _TAG_REG_DATA_MO
2680: 44 45 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 DEL:....return("
2690: 47 53 43 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 GSCIS_TAG_REG_DA
26a0: 54 41 5f 4d 4f 44 45 4c 22 29 3b 0a 09 09 63 61 TA_MODEL");...ca
26b0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43 52 se GSCIS_TAG_ACR
26c0: 5f 54 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 _TABLE:....retur
26d0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 41 43 52 n("GSCIS_TAG_ACR
26e0: 5f 54 41 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 _TABLE");...case
26f0: 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 5f GSCIS_TAG_CARD_
2700: 41 50 44 55 3a 0a 09 09 09 72 65 74 75 72 6e 28 APDU:....return(
2710: 22 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 5f "GSCIS_TAG_CARD_
2720: 41 50 44 55 22 29 3b 0a 09 09 63 61 73 65 20 47 APDU");...case G
2730: 53 43 49 53 5f 54 41 47 5f 52 45 44 49 52 45 43 SCIS_TAG_REDIREC
2740: 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 TION:....return(
2750: 22 47 53 43 49 53 5f 54 41 47 5f 52 45 44 49 52 "GSCIS_TAG_REDIR
2760: 45 43 54 49 4f 4e 22 29 3b 0a 09 09 63 61 73 65 ECTION");...case
2770: 20 47 53 43 49 53 5f 54 41 47 5f 43 54 3a 0a 09 GSCIS_TAG_CT:..
2780: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f ..return("GSCIS_
2790: 54 41 47 5f 43 54 22 29 3b 0a 09 09 63 61 73 65 TAG_CT");...case
27a0: 20 47 53 43 49 53 5f 54 41 47 5f 53 54 3a 0a 09 GSCIS_TAG_ST:..
27b0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f ..return("GSCIS_
27c0: 54 41 47 5f 53 54 22 29 3b 0a 09 09 63 61 73 65 TAG_ST");...case
27d0: 20 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54 43 GSCIS_TAG_NEXTC
27e0: 43 43 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 CC:....return("G
27f0: 53 43 49 53 5f 54 41 47 5f 4e 45 58 54 43 43 43 SCIS_TAG_NEXTCCC
2800: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 ");...case GSCIS
2810: 5f 54 41 47 5f 46 4e 41 4d 45 3a 0a 09 09 09 72 _TAG_FNAME:....r
2820: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 eturn("GSCIS_TAG
2830: 5f 46 4e 41 4d 45 22 29 3b 0a 09 09 63 61 73 65 _FNAME");...case
2840: 20 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41 4d 45 GSCIS_TAG_MNAME
2850: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 :....return("GSC
2860: 49 53 5f 54 41 47 5f 4d 4e 41 4d 45 22 29 3b 0a IS_TAG_MNAME");.
2870: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 ..case GSCIS_TAG
2880: 5f 4c 4e 41 4d 45 3a 0a 09 09 09 72 65 74 75 72 _LNAME:....retur
2890: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4c 4e 41 n("GSCIS_TAG_LNA
28a0: 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 ME");...case GSC
28b0: 49 53 5f 54 41 47 5f 53 55 46 46 49 58 3a 0a 09 IS_TAG_SUFFIX:..
28c0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f ..return("GSCIS_
28d0: 54 41 47 5f 53 55 46 46 49 58 22 29 3b 0a 09 09 TAG_SUFFIX");...
28e0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 47 case GSCIS_TAG_G
28f0: 4f 56 54 5f 41 47 45 4e 43 59 3a 0a 09 09 09 72 OVT_AGENCY:....r
2900: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 eturn("GSCIS_TAG
2910: 5f 47 4f 56 54 5f 41 47 45 4e 43 59 22 29 3b 0a _GOVT_AGENCY");.
2920: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 ..case GSCIS_TAG
2930: 5f 42 55 52 45 41 55 3a 0a 09 09 09 72 65 74 75 _BUREAU:....retu
2940: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 42 55 rn("GSCIS_TAG_BU
2950: 52 45 41 55 22 29 3b 0a 09 09 63 61 73 65 20 47 REAU");...case G
2960: 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 5f SCIS_TAG_BUREAU_
2970: 43 4f 44 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 CODE:....return(
2980: 22 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41 "GSCIS_TAG_BUREA
2990: 55 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61 73 65 U_CODE");...case
29a0: 20 47 53 43 49 53 5f 54 41 47 5f 44 45 50 54 5f GSCIS_TAG_DEPT_
29b0: 43 4f 44 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 CODE:....return(
29c0: 22 47 53 43 49 53 5f 54 41 47 5f 44 45 50 54 5f "GSCIS_TAG_DEPT_
29d0: 43 4f 44 45 22 29 3b 0a 09 09 63 61 73 65 20 47 CODE");...case G
29e0: 53 43 49 53 5f 54 41 47 5f 54 49 54 4c 45 3a 0a SCIS_TAG_TITLE:.
29f0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 ...return("GSCIS
2a00: 5f 54 41 47 5f 54 49 54 4c 45 22 29 3b 0a 09 09 _TAG_TITLE");...
2a10: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 42 case GSCIS_TAG_B
2a20: 55 49 4c 44 49 4e 47 3a 0a 09 09 09 72 65 74 75 UILDING:....retu
2a30: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 42 55 rn("GSCIS_TAG_BU
2a40: 49 4c 44 49 4e 47 22 29 3b 0a 09 09 63 61 73 65 ILDING");...case
2a50: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 GSCIS_TAG_OFFIC
2a60: 45 5f 41 44 44 52 31 3a 0a 09 09 09 72 65 74 75 E_ADDR1:....retu
2a70: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 rn("GSCIS_TAG_OF
2a80: 46 49 43 45 5f 41 44 44 52 31 22 29 3b 0a 09 09 FICE_ADDR1");...
2a90: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f case GSCIS_TAG_O
2aa0: 46 46 49 43 45 5f 41 44 44 52 32 3a 0a 09 09 09 FFICE_ADDR2:....
2ab0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 return("GSCIS_TA
2ac0: 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 32 22 29 G_OFFICE_ADDR2")
2ad0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 ;...case GSCIS_T
2ae0: 41 47 5f 4f 46 46 49 43 45 5f 43 49 54 59 3a 0a AG_OFFICE_CITY:.
2af0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 ...return("GSCIS
2b00: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54 59 _TAG_OFFICE_CITY
2b10: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 ");...case GSCIS
2b20: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53 54 41 54 _TAG_OFFICE_STAT
2b30: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 E:....return("GS
2b40: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53 CIS_TAG_OFFICE_S
2b50: 54 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47 TATE");...case G
2b60: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f SCIS_TAG_OFFICE_
2b70: 5a 49 50 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 ZIP:....return("
2b80: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 GSCIS_TAG_OFFICE
2b90: 5f 5a 49 50 22 29 3b 0a 09 09 63 61 73 65 20 47 _ZIP");...case G
2ba0: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f SCIS_TAG_OFFICE_
2bb0: 43 4f 55 4e 54 52 59 3a 0a 09 09 09 72 65 74 75 COUNTRY:....retu
2bc0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 rn("GSCIS_TAG_OF
2bd0: 46 49 43 45 5f 43 4f 55 4e 54 52 59 22 29 3b 0a FICE_COUNTRY");.
2be0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 ..case GSCIS_TAG
2bf0: 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 3a 0a 09 _OFFICE_PHONE:..
2c00: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f ..return("GSCIS_
2c10: 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 TAG_OFFICE_PHONE
2c20: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 ");...case GSCIS
2c30: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e _TAG_OFFICE_PHON
2c40: 45 5f 45 58 54 3a 0a 09 09 09 72 65 74 75 72 6e E_EXT:....return
2c50: 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 ("GSCIS_TAG_OFFI
2c60: 43 45 5f 50 48 4f 4e 45 5f 45 58 54 22 29 3b 0a CE_PHONE_EXT");.
2c70: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 ..case GSCIS_TAG
2c80: 5f 4f 46 46 49 43 45 5f 46 41 58 3a 0a 09 09 09 _OFFICE_FAX:....
2c90: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 return("GSCIS_TA
2ca0: 47 5f 4f 46 46 49 43 45 5f 46 41 58 22 29 3b 0a G_OFFICE_FAX");.
2cb0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 ..case GSCIS_TAG
2cc0: 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c 3a 0a 09 _OFFICE_EMAIL:..
2cd0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f ..return("GSCIS_
2ce0: 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c TAG_OFFICE_EMAIL
2cf0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 ");...case GSCIS
2d00: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52 4f 4f 4d _TAG_OFFICE_ROOM
2d10: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 :....return("GSC
2d20: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52 4f IS_TAG_OFFICE_RO
2d30: 4f 4d 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 OM");...case GSC
2d40: 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f 41 47 IS_TAG_NONGOV_AG
2d50: 45 4e 43 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 ENCY:....return(
2d60: 22 47 53 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f "GSCIS_TAG_NONGO
2d70: 56 5f 41 47 45 4e 43 59 22 29 3b 0a 09 09 63 61 V_AGENCY");...ca
2d80: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53 53 4e se GSCIS_TAG_SSN
2d90: 5f 44 45 53 49 47 4e 41 54 4f 52 3a 0a 09 09 09 _DESIGNATOR:....
2da0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 return("GSCIS_TA
2db0: 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41 54 4f 52 G_SSN_DESIGNATOR
2dc0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 ");...case GSCIS
2dd0: 5f 54 41 47 5f 53 53 4e 3a 0a 09 09 09 72 65 74 _TAG_SSN:....ret
2de0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53 urn("GSCIS_TAG_S
2df0: 53 4e 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 SN");...case GSC
2e00: 49 53 5f 54 41 47 5f 44 4f 42 3a 0a 09 09 09 72 IS_TAG_DOB:....r
2e10: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 eturn("GSCIS_TAG
2e20: 5f 44 4f 42 22 29 3b 0a 09 09 63 61 73 65 20 47 _DOB");...case G
2e30: 53 43 49 53 5f 54 41 47 5f 47 45 4e 44 45 52 3a SCIS_TAG_GENDER:
2e40: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 ....return("GSCI
2e50: 53 5f 54 41 47 5f 47 45 4e 44 45 52 22 29 3b 0a S_TAG_GENDER");.
2e60: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 ..case GSCIS_TAG
2e70: 5f 55 53 45 52 49 44 3a 0a 09 09 09 72 65 74 75 _USERID:....retu
2e80: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 55 53 rn("GSCIS_TAG_US
2e90: 45 52 49 44 22 29 3b 0a 09 09 63 61 73 65 20 47 ERID");...case G
2ea0: 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49 4e 3a SCIS_TAG_DOMAIN:
2eb0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 ....return("GSCI
2ec0: 53 5f 54 41 47 5f 44 4f 4d 41 49 4e 22 29 3b 0a S_TAG_DOMAIN");.
2ed0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 ..case GSCIS_TAG
2ee0: 5f 50 41 53 53 57 4f 52 44 3a 0a 09 09 09 72 65 _PASSWORD:....re
2ef0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f turn("GSCIS_TAG_
2f00: 50 41 53 53 57 4f 52 44 22 29 3b 0a 09 09 63 61 PASSWORD");...ca
2f10: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53 se GSCIS_TAG_ISS
2f20: 55 45 52 49 44 3a 0a 09 09 09 72 65 74 75 72 6e UERID:....return
2f30: 28 22 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55 ("GSCIS_TAG_ISSU
2f40: 45 52 49 44 22 29 3b 0a 09 09 63 61 73 65 20 47 ERID");...case G
2f50: 53 43 49 53 5f 54 41 47 5f 53 45 52 4e 4f 3a 0a SCIS_TAG_SERNO:.
2f60: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 ...return("GSCIS
2f70: 5f 54 41 47 5f 53 45 52 4e 4f 22 29 3b 0a 09 09 _TAG_SERNO");...
2f80: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 49 case GSCIS_TAG_I
2f90: 53 53 55 45 5f 44 41 54 45 3a 0a 09 09 09 72 65 SSUE_DATE:....re
2fa0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f turn("GSCIS_TAG_
2fb0: 49 53 53 55 45 5f 44 41 54 45 22 29 3b 0a 09 09 ISSUE_DATE");...
2fc0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 45 case GSCIS_TAG_E
2fd0: 58 50 49 52 45 5f 44 41 54 45 3a 0a 09 09 09 72 XPIRE_DATE:....r
2fe0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 eturn("GSCIS_TAG
2ff0: 5f 45 58 50 49 52 45 5f 44 41 54 45 22 29 3b 0a _EXPIRE_DATE");.
3000: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 ..case GSCIS_TAG
3010: 5f 43 41 52 44 5f 54 59 50 45 3a 0a 09 09 09 72 _CARD_TYPE:....r
3020: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 eturn("GSCIS_TAG
3030: 5f 43 41 52 44 5f 54 59 50 45 22 29 3b 0a 09 09 _CARD_TYPE");...
3040: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53 case GSCIS_TAG_S
3050: 45 43 55 52 49 54 59 5f 43 4f 44 45 3a 0a 09 09 ECURITY_CODE:...
3060: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 .return("GSCIS_T
3070: 41 47 5f 53 45 43 55 52 49 54 59 5f 43 4f 44 45 AG_SECURITY_CODE
3080: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 ");...case GSCIS
3090: 5f 54 41 47 5f 43 41 52 44 49 44 5f 41 49 44 3a _TAG_CARDID_AID:
30a0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 ....return("GSCI
30b0: 53 5f 54 41 47 5f 43 41 52 44 49 44 5f 41 49 44 S_TAG_CARDID_AID
30c0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 ");...case GSCIS
30d0: 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 _TAG_CERTIFICATE
30e0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 :....return("GSC
30f0: 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41 IS_TAG_CERTIFICA
3100: 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 TE");...case GSC
3110: 49 53 5f 54 41 47 5f 43 45 52 54 5f 49 53 53 55 IS_TAG_CERT_ISSU
3120: 45 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 E_DATE:....retur
3130: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 45 52 n("GSCIS_TAG_CER
3140: 54 5f 49 53 53 55 45 5f 44 41 54 45 22 29 3b 0a T_ISSUE_DATE");.
3150: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 ..case GSCIS_TAG
3160: 5f 43 45 52 54 5f 45 58 50 49 52 45 5f 44 41 54 _CERT_EXPIRE_DAT
3170: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 E:....return("GS
3180: 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 45 58 50 CIS_TAG_CERT_EXP
3190: 49 52 45 5f 44 41 54 45 22 29 3b 0a 09 7d 0a 0a IRE_DATE");..}..
31a0: 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e .return("UNKNOWN
31b0: 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f ");.}..static co
31c0: 6e 73 74 20 63 68 61 72 20 2a 43 41 43 4b 45 59 nst char *CACKEY
31d0: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 _DEBUG_FUNC_SCAR
31e0: 44 45 52 52 5f 54 4f 5f 53 54 52 28 4c 4f 4e 47 DERR_TO_STR(LONG
31f0: 20 72 65 74 63 6f 64 65 29 20 7b 0a 09 73 77 69 retcode) {..swi
3200: 74 63 68 20 28 72 65 74 63 6f 64 65 29 20 7b 0a tch (retcode) {.
3210: 09 09 63 61 73 65 20 53 43 41 52 44 5f 53 5f 53 ..case SCARD_S_S
3220: 55 43 43 45 53 53 3a 0a 09 09 09 72 65 74 75 72 UCCESS:....retur
3230: 6e 28 22 53 43 41 52 44 5f 53 5f 53 55 43 43 45 n("SCARD_S_SUCCE
3240: 53 53 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 SS");...case SCA
3250: 52 44 5f 45 5f 43 41 4e 43 45 4c 4c 45 44 3a 0a RD_E_CANCELLED:.
3260: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 ...return("SCARD
3270: 5f 45 5f 43 41 4e 43 45 4c 4c 45 44 22 29 3b 0a _E_CANCELLED");.
3280: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 43 ..case SCARD_E_C
3290: 41 4e 54 5f 44 49 53 50 4f 53 45 3a 0a 09 09 09 ANT_DISPOSE:....
32a0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f return("SCARD_E_
32b0: 43 41 4e 54 5f 44 49 53 50 4f 53 45 22 29 3b 0a CANT_DISPOSE");.
32c0: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 ..case SCARD_E_I
32d0: 4e 53 55 46 46 49 43 49 45 4e 54 5f 42 55 46 46 NSUFFICIENT_BUFF
32e0: 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 ER:....return("S
32f0: 43 41 52 44 5f 45 5f 49 4e 53 55 46 46 49 43 49 CARD_E_INSUFFICI
3300: 45 4e 54 5f 42 55 46 46 45 52 22 29 3b 0a 09 09 ENT_BUFFER");...
3310: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 case SCARD_E_INV
3320: 41 4c 49 44 5f 41 54 52 3a 0a 09 09 09 72 65 74 ALID_ATR:....ret
3330: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 urn("SCARD_E_INV
3340: 41 4c 49 44 5f 41 54 52 22 29 3b 0a 09 09 63 61 ALID_ATR");...ca
3350: 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c se SCARD_E_INVAL
3360: 49 44 5f 48 41 4e 44 4c 45 3a 0a 09 09 09 72 65 ID_HANDLE:....re
3370: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e turn("SCARD_E_IN
3380: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 22 29 3b 0a VALID_HANDLE");.
3390: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 ..case SCARD_E_I
33a0: 4e 56 41 4c 49 44 5f 50 41 52 41 4d 45 54 45 52 NVALID_PARAMETER
33b0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 :....return("SCA
33c0: 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 50 41 52 RD_E_INVALID_PAR
33d0: 41 4d 45 54 45 52 22 29 3b 0a 09 09 63 61 73 65 AMETER");...case
33e0: 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 SCARD_E_INVALID
33f0: 5f 54 41 52 47 45 54 3a 0a 09 09 09 72 65 74 75 _TARGET:....retu
3400: 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 rn("SCARD_E_INVA
3410: 4c 49 44 5f 54 41 52 47 45 54 22 29 3b 0a 09 09 LID_TARGET");...
3420: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 case SCARD_E_INV
3430: 41 4c 49 44 5f 56 41 4c 55 45 3a 0a 09 09 09 72 ALID_VALUE:....r
3440: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 eturn("SCARD_E_I
3450: 4e 56 41 4c 49 44 5f 56 41 4c 55 45 22 29 3b 0a NVALID_VALUE");.
3460: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e ..case SCARD_E_N
3470: 4f 5f 4d 45 4d 4f 52 59 3a 0a 09 09 09 72 65 74 O_MEMORY:....ret
3480: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f urn("SCARD_E_NO_
3490: 4d 45 4d 4f 52 59 22 29 3b 0a 09 09 63 61 73 65 MEMORY");...case
34a0: 20 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e SCARD_E_UNKNOWN
34b0: 5f 52 45 41 44 45 52 3a 0a 09 09 09 72 65 74 75 _READER:....retu
34c0: 72 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e 4b 4e rn("SCARD_E_UNKN
34d0: 4f 57 4e 5f 52 45 41 44 45 52 22 29 3b 0a 09 09 OWN_READER");...
34e0: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 54 49 4d case SCARD_E_TIM
34f0: 45 4f 55 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 EOUT:....return(
3500: 22 53 43 41 52 44 5f 45 5f 54 49 4d 45 4f 55 54 "SCARD_E_TIMEOUT
3510: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 ");...case SCARD
3520: 5f 45 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41 _E_SHARING_VIOLA
3530: 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 TION:....return(
3540: 22 53 43 41 52 44 5f 45 5f 53 48 41 52 49 4e 47 "SCARD_E_SHARING
3550: 5f 56 49 4f 4c 41 54 49 4f 4e 22 29 3b 0a 09 09 _VIOLATION");...
3560: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f case SCARD_E_NO_
3570: 53 4d 41 52 54 43 41 52 44 3a 0a 09 09 09 72 65 SMARTCARD:....re
3580: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f turn("SCARD_E_NO
3590: 5f 53 4d 41 52 54 43 41 52 44 22 29 3b 0a 09 09 _SMARTCARD");...
35a0: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 55 4e 4b case SCARD_E_UNK
35b0: 4e 4f 57 4e 5f 43 41 52 44 3a 0a 09 09 09 72 65 NOWN_CARD:....re
35c0: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e turn("SCARD_E_UN
35d0: 4b 4e 4f 57 4e 5f 43 41 52 44 22 29 3b 0a 09 09 KNOWN_CARD");...
35e0: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 50 52 4f case SCARD_E_PRO
35f0: 54 4f 5f 4d 49 53 4d 41 54 43 48 3a 0a 09 09 09 TO_MISMATCH:....
3600: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f return("SCARD_E_
3610: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 22 29 PROTO_MISMATCH")
3620: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 ;...case SCARD_E
3630: 5f 4e 4f 54 5f 52 45 41 44 59 3a 0a 09 09 09 72 _NOT_READY:....r
3640: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e eturn("SCARD_E_N
3650: 4f 54 5f 52 45 41 44 59 22 29 3b 0a 09 09 63 61 OT_READY");...ca
3660: 73 65 20 53 43 41 52 44 5f 45 5f 53 59 53 54 45 se SCARD_E_SYSTE
3670: 4d 5f 43 41 4e 43 45 4c 4c 45 44 3a 0a 09 09 09 M_CANCELLED:....
3680: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f return("SCARD_E_
3690: 53 59 53 54 45 4d 5f 43 41 4e 43 45 4c 4c 45 44 SYSTEM_CANCELLED
36a0: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 ");...case SCARD
36b0: 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41 43 54 45 _E_NOT_TRANSACTE
36c0: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 D:....return("SC
36d0: 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41 ARD_E_NOT_TRANSA
36e0: 43 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 CTED");...case S
36f0: 43 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e CARD_E_READER_UN
3700: 41 56 41 49 4c 41 42 4c 45 3a 0a 09 09 09 72 65 AVAILABLE:....re
3710: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 52 45 turn("SCARD_E_RE
3720: 41 44 45 52 5f 55 4e 41 56 41 49 4c 41 42 4c 45 ADER_UNAVAILABLE
3730: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 ");...case SCARD
3740: 5f 57 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f 43 _W_UNSUPPORTED_C
3750: 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 ARD:....return("
3760: 53 43 41 52 44 5f 57 5f 55 4e 53 55 50 50 4f 52 SCARD_W_UNSUPPOR
3770: 54 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 TED_CARD");...ca
3780: 73 65 20 53 43 41 52 44 5f 57 5f 55 4e 52 45 53 se SCARD_W_UNRES
3790: 50 4f 4e 53 49 56 45 5f 43 41 52 44 3a 0a 09 09 PONSIVE_CARD:...
37a0: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57 .return("SCARD_W
37b0: 5f 55 4e 52 45 53 50 4f 4e 53 49 56 45 5f 43 41 _UNRESPONSIVE_CA
37c0: 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 RD");...case SCA
37d0: 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43 RD_W_UNPOWERED_C
37e0: 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 ARD:....return("
37f0: 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 SCARD_W_UNPOWERE
3800: 44 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 D_CARD");...case
3810: 20 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f 43 SCARD_W_RESET_C
3820: 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 ARD:....return("
3830: 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 SCARD_W_RESET_CA
3840: 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 RD");...case SCA
3850: 52 44 5f 57 5f 52 45 4d 4f 56 45 44 5f 43 41 52 RD_W_REMOVED_CAR
3860: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 D:....return("SC
3870: 41 52 44 5f 57 5f 52 45 4d 4f 56 45 44 5f 43 41 ARD_W_REMOVED_CA
3880: 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 RD");...case SCA
3890: 52 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f 53 4d 41 RD_E_PCI_TOO_SMA
38a0: 4c 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 LL:....return("S
38b0: 43 41 52 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f 53 CARD_E_PCI_TOO_S
38c0: 4d 41 4c 4c 22 29 3b 0a 09 09 63 61 73 65 20 53 MALL");...case S
38d0: 43 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e CARD_E_READER_UN
38e0: 53 55 50 50 4f 52 54 45 44 3a 0a 09 09 09 72 65 SUPPORTED:....re
38f0: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 52 45 turn("SCARD_E_RE
3900: 41 44 45 52 5f 55 4e 53 55 50 50 4f 52 54 45 44 ADER_UNSUPPORTED
3910: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 ");...case SCARD
3920: 5f 45 5f 44 55 50 4c 49 43 41 54 45 5f 52 45 41 _E_DUPLICATE_REA
3930: 44 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 DER:....return("
3940: 53 43 41 52 44 5f 45 5f 44 55 50 4c 49 43 41 54 SCARD_E_DUPLICAT
3950: 45 5f 52 45 41 44 45 52 22 29 3b 0a 09 09 63 61 E_READER");...ca
3960: 73 65 20 53 43 41 52 44 5f 45 5f 43 41 52 44 5f se SCARD_E_CARD_
3970: 55 4e 53 55 50 50 4f 52 54 45 44 3a 0a 09 09 09 UNSUPPORTED:....
3980: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f return("SCARD_E_
3990: 43 41 52 44 5f 55 4e 53 55 50 50 4f 52 54 45 44 CARD_UNSUPPORTED
39a0: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 ");...case SCARD
39b0: 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45 3a 0a 09 _E_NO_SERVICE:..
39c0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f ..return("SCARD_
39d0: 45 5f 4e 4f 5f 53 45 52 56 49 43 45 22 29 3b 0a E_NO_SERVICE");.
39e0: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 53 ..case SCARD_E_S
39f0: 45 52 56 49 43 45 5f 53 54 4f 50 50 45 44 3a 0a ERVICE_STOPPED:.
3a00: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 ...return("SCARD
3a10: 5f 45 5f 53 45 52 56 49 43 45 5f 53 54 4f 50 50 _E_SERVICE_STOPP
3a20: 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 ED");...case SCA
3a30: 52 44 5f 45 5f 55 4e 53 55 50 50 4f 52 54 45 44 RD_E_UNSUPPORTED
3a40: 5f 46 45 41 54 55 52 45 3a 0a 09 09 09 72 65 74 _FEATURE:....ret
3a50: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e 53 urn("SCARD_E_UNS
3a60: 55 50 50 4f 52 54 45 44 5f 46 45 41 54 55 52 45 UPPORTED_FEATURE
3a70: 22 29 3b 0a 23 69 66 64 65 66 20 53 43 41 52 44 ");.#ifdef SCARD
3a80: 5f 57 5f 49 4e 53 45 52 54 45 44 5f 43 41 52 44 _W_INSERTED_CARD
3a90: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f ...case SCARD_W_
3aa0: 49 4e 53 45 52 54 45 44 5f 43 41 52 44 3a 0a 09 INSERTED_CARD:..
3ab0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f ..return("SCARD_
3ac0: 57 5f 49 4e 53 45 52 54 45 44 5f 43 41 52 44 22 W_INSERTED_CARD"
3ad0: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 );.#endif.#ifdef
3ae0: 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 52 45 41 44 SCARD_E_NO_READ
3af0: 45 52 53 5f 41 56 41 49 4c 41 42 4c 45 0a 09 09 ERS_AVAILABLE...
3b00: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f case SCARD_E_NO_
3b10: 52 45 41 44 45 52 53 5f 41 56 41 49 4c 41 42 4c READERS_AVAILABL
3b20: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 E:....return("SC
3b30: 41 52 44 5f 45 5f 4e 4f 5f 52 45 41 44 45 52 53 ARD_E_NO_READERS
3b40: 5f 41 56 41 49 4c 41 42 4c 45 22 29 3b 0a 23 65 _AVAILABLE");.#e
3b50: 6e 64 69 66 0a 09 7d 0a 0a 09 72 65 74 75 72 6e ndif..}...return
3b60: 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a ("UNKNOWN");.}..
3b70: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 static const cha
3b80: 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f r *CACKEY_DEBUG_
3b90: 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 FUNC_OBJID_TO_ST
3ba0: 52 28 75 69 6e 74 31 36 5f 74 20 6f 62 6a 69 64 R(uint16_t objid
3bb0: 29 20 7b 0a 09 73 77 69 74 63 68 20 28 6f 62 6a ) {..switch (obj
3bc0: 69 64 29 20 7b 0a 09 09 63 61 73 65 20 30 78 32 id) {...case 0x2
3bd0: 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 000:....return("
3be0: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 CACKEY_TLV_OBJID
3bf0: 5f 47 45 4e 45 52 41 4c 49 4e 46 4f 22 29 3b 0a _GENERALINFO");.
3c00: 09 09 63 61 73 65 20 30 78 32 31 30 30 3a 0a 09 ..case 0x2100:..
3c10: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 ..return("CACKEY
3c20: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 50 52 4f 50 45 _TLV_OBJID_PROPE
3c30: 52 53 4f 4e 41 4c 49 4e 46 4f 22 29 3b 0a 09 09 RSONALINFO");...
3c40: 63 61 73 65 20 30 78 33 30 30 30 3a 0a 09 09 09 case 0x3000:....
3c50: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 return("CACKEY_T
3c60: 4c 56 5f 4f 42 4a 49 44 5f 41 43 43 45 53 53 43 LV_OBJID_ACCESSC
3c70: 4f 4e 54 52 4f 4c 22 29 3b 0a 09 09 63 61 73 65 ONTROL");...case
3c80: 20 30 78 34 30 30 30 3a 0a 09 09 09 72 65 74 75 0x4000:....retu
3c90: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f rn("CACKEY_TLV_O
3ca0: 42 4a 49 44 5f 4c 4f 47 49 4e 22 29 3b 0a 09 09 BJID_LOGIN");...
3cb0: 63 61 73 65 20 30 78 35 30 30 30 3a 0a 09 09 09 case 0x5000:....
3cc0: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 return("CACKEY_T
3cd0: 4c 56 5f 4f 42 4a 49 44 5f 43 41 52 44 49 4e 46 LV_OBJID_CARDINF
3ce0: 4f 22 29 3b 0a 09 09 63 61 73 65 20 30 78 36 30 O");...case 0x60
3cf0: 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 00:....return("C
3d00: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f ACKEY_TLV_OBJID_
3d10: 42 49 4f 4d 45 54 52 49 43 53 22 29 3b 0a 09 09 BIOMETRICS");...
3d20: 63 61 73 65 20 30 78 37 30 30 30 3a 0a 09 09 09 case 0x7000:....
3d30: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 return("CACKEY_T
3d40: 4c 56 5f 4f 42 4a 49 44 5f 44 49 47 49 54 41 4c LV_OBJID_DIGITAL
3d50: 53 49 47 43 45 52 54 22 29 3b 0a 09 09 63 61 73 SIGCERT");...cas
3d60: 65 20 30 78 30 32 30 30 3a 0a 09 09 09 72 65 74 e 0x0200:....ret
3d70: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f urn("CACKEY_TLV_
3d80: 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e OBJID_CAC_PERSON
3d90: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32 30 ");...case 0x020
3da0: 32 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 2:....return("CA
3db0: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 CKEY_TLV_OBJID_C
3dc0: 41 43 5f 42 45 4e 45 46 49 54 53 22 29 3b 0a 09 AC_BENEFITS");..
3dd0: 09 63 61 73 65 20 30 78 30 32 30 33 3a 0a 09 09 .case 0x0203:...
3de0: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f .return("CACKEY_
3df0: 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f 54 TLV_OBJID_CAC_OT
3e00: 48 45 52 42 45 4e 45 46 49 54 53 22 29 3b 0a 09 HERBENEFITS");..
3e10: 09 63 61 73 65 20 30 78 30 32 30 31 3a 0a 09 09 .case 0x0201:...
3e20: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f .return("CACKEY_
3e30: 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 TLV_OBJID_CAC_PE
3e40: 52 53 4f 4e 4e 45 4c 22 29 3b 0a 09 09 63 61 73 RSONNEL");...cas
3e50: 65 20 30 78 30 32 46 45 3a 0a 09 09 09 72 65 74 e 0x02FE:....ret
3e60: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f urn("CACKEY_TLV_
3e70: 4f 42 4a 49 44 5f 43 41 43 5f 50 4b 49 43 45 52 OBJID_CAC_PKICER
3e80: 54 22 29 3b 0a 09 7d 0a 09 0a 09 72 65 74 75 72 T");..}....retur
3e90: 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a n("UNKNOWN");.}.
3ea0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 .static const ch
3eb0: 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 ar *CACKEY_DEBUG
3ec0: 5f 46 55 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f _FUNC_APPTYPE_TO
3ed0: 5f 53 54 52 28 75 69 6e 74 38 5f 74 20 61 70 70 _STR(uint8_t app
3ee0: 74 79 70 65 29 20 7b 0a 09 73 77 69 74 63 68 20 type) {..switch
3ef0: 28 61 70 70 74 79 70 65 29 20 7b 0a 09 09 63 61 (apptype) {...ca
3f00: 73 65 20 30 78 30 30 3a 0a 09 09 09 72 65 74 75 se 0x00:....retu
3f10: 72 6e 28 22 4e 4f 4e 45 22 29 3b 0a 09 09 63 61 rn("NONE");...ca
3f20: 73 65 20 30 78 30 31 3a 0a 09 09 09 72 65 74 75 se 0x01:....retu
3f30: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 rn("CACKEY_TLV_A
3f40: 50 50 5f 47 45 4e 45 52 49 43 22 29 3b 0a 09 09 PP_GENERIC");...
3f50: 63 61 73 65 20 30 78 30 32 3a 0a 09 09 09 72 65 case 0x02:....re
3f60: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 turn("CACKEY_TLV
3f70: 5f 41 50 50 5f 53 4b 49 22 29 3b 0a 09 09 63 61 _APP_SKI");...ca
3f80: 73 65 20 30 78 30 33 3a 0a 09 09 09 72 65 74 75 se 0x03:....retu
3f90: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 rn("CACKEY_TLV_A
3fa0: 50 50 5f 47 45 4e 45 52 49 43 20 7c 20 43 41 43 PP_GENERIC | CAC
3fb0: 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 22 KEY_TLV_APP_SKI"
3fc0: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 34 3a 0a );...case 0x04:.
3fd0: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 ...return("CACKE
3fe0: 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b Y_TLV_APP_PKI");
3ff0: 0a 09 09 63 61 73 65 20 30 78 30 35 3a 0a 09 09 ...case 0x05:...
4000: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f .return("CACKEY_
4010: 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 TLV_APP_GENERIC
4020: 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 | CACKEY_TLV_APP
4030: 5f 50 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 30 _PKI");...case 0
4040: 78 30 36 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 x06:....return("
4050: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 CACKEY_TLV_APP_S
4060: 4b 49 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f KI | CACKEY_TLV_
4070: 41 50 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61 73 APP_PKI");...cas
4080: 65 20 30 78 30 37 3a 0a 09 09 09 72 65 74 75 72 e 0x07:....retur
4090: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 n("CACKEY_TLV_AP
40a0: 50 5f 47 45 4e 45 52 49 43 20 7c 20 43 41 43 4b P_GENERIC | CACK
40b0: 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 20 7c EY_TLV_APP_SKI |
40c0: 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f CACKEY_TLV_APP_
40d0: 50 4b 49 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 PKI");..}...retu
40e0: 72 6e 28 22 49 4e 56 41 4c 49 44 22 29 3b 0a 7d rn("INVALID");.}
40f0: 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 ..static const c
4100: 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 har *CACKEY_DEBU
4110: 47 5f 46 55 4e 43 5f 41 54 54 52 49 42 55 54 45 G_FUNC_ATTRIBUTE
4120: 5f 54 4f 5f 53 54 52 28 43 4b 5f 41 54 54 52 49 _TO_STR(CK_ATTRI
4130: 42 55 54 45 5f 54 59 50 45 20 61 74 74 72 29 20 BUTE_TYPE attr)
4140: 7b 0a 09 73 77 69 74 63 68 20 28 61 74 74 72 29 {..switch (attr)
4150: 20 7b 0a 09 09 63 61 73 65 20 43 4b 41 5f 43 4c {...case CKA_CL
4160: 41 53 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 ASS:....return("
4170: 43 4b 41 5f 43 4c 41 53 53 22 29 3b 0a 09 09 63 CKA_CLASS");...c
4180: 61 73 65 20 43 4b 41 5f 54 4f 4b 45 4e 3a 0a 09 ase CKA_TOKEN:..
4190: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 54 4f ..return("CKA_TO
41a0: 4b 45 4e 22 29 3b 0a 09 09 63 61 73 65 20 43 4b KEN");...case CK
41b0: 41 5f 50 52 49 56 41 54 45 3a 0a 09 09 09 72 65 A_PRIVATE:....re
41c0: 74 75 72 6e 28 22 43 4b 41 5f 50 52 49 56 41 54 turn("CKA_PRIVAT
41d0: 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f E");...case CKA_
41e0: 4c 41 42 45 4c 3a 0a 09 09 09 72 65 74 75 72 6e LABEL:....return
41f0: 28 22 43 4b 41 5f 4c 41 42 45 4c 22 29 3b 0a 09 ("CKA_LABEL");..
4200: 09 63 61 73 65 20 43 4b 41 5f 41 50 50 4c 49 43 .case CKA_APPLIC
4210: 41 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72 6e ATION:....return
4220: 28 22 43 4b 41 5f 41 50 50 4c 49 43 41 54 49 4f ("CKA_APPLICATIO
4230: 4e 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f N");...case CKA_
4240: 56 41 4c 55 45 3a 0a 09 09 09 72 65 74 75 72 6e VALUE:....return
4250: 28 22 43 4b 41 5f 56 41 4c 55 45 22 29 3b 0a 09 ("CKA_VALUE");..
4260: 09 63 61 73 65 20 43 4b 41 5f 4f 42 4a 45 43 54 .case CKA_OBJECT
4270: 5f 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 _ID:....return("
4280: 43 4b 41 5f 4f 42 4a 45 43 54 5f 49 44 22 29 3b CKA_OBJECT_ID");
4290: 0a 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52 54 ...case CKA_CERT
42a0: 49 46 49 43 41 54 45 5f 54 59 50 45 3a 0a 09 09 IFICATE_TYPE:...
42b0: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 43 45 52 .return("CKA_CER
42c0: 54 49 46 49 43 41 54 45 5f 54 59 50 45 22 29 3b TIFICATE_TYPE");
42d0: 0a 09 09 63 61 73 65 20 43 4b 41 5f 49 53 53 55 ...case CKA_ISSU
42e0: 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 ER:....return("C
42f0: 4b 41 5f 49 53 53 55 45 52 22 29 3b 0a 09 09 63 KA_ISSUER");...c
4300: 61 73 65 20 43 4b 41 5f 53 45 52 49 41 4c 5f 4e ase CKA_SERIAL_N
4310: 55 4d 42 45 52 3a 0a 09 09 09 72 65 74 75 72 6e UMBER:....return
4320: 28 22 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d ("CKA_SERIAL_NUM
4330: 42 45 52 22 29 3b 0a 09 09 63 61 73 65 20 43 4b BER");...case CK
4340: 41 5f 41 43 5f 49 53 53 55 45 52 3a 0a 09 09 09 A_AC_ISSUER:....
4350: 72 65 74 75 72 6e 28 22 43 4b 41 5f 41 43 5f 49 return("CKA_AC_I
4360: 53 53 55 45 52 22 29 3b 0a 09 09 63 61 73 65 20 SSUER");...case
4370: 43 4b 41 5f 4f 57 4e 45 52 3a 0a 09 09 09 72 65 CKA_OWNER:....re
4380: 74 75 72 6e 28 22 43 4b 41 5f 4f 57 4e 45 52 22 turn("CKA_OWNER"
4390: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 41 54 );...case CKA_AT
43a0: 54 52 5f 54 59 50 45 53 3a 0a 09 09 09 72 65 74 TR_TYPES:....ret
43b0: 75 72 6e 28 22 43 4b 41 5f 41 54 54 52 5f 54 59 urn("CKA_ATTR_TY
43c0: 50 45 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b PES");...case CK
43d0: 41 5f 54 52 55 53 54 45 44 3a 0a 09 09 09 72 65 A_TRUSTED:....re
43e0: 74 75 72 6e 28 22 43 4b 41 5f 54 52 55 53 54 45 turn("CKA_TRUSTE
43f0: 44 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f D");...case CKA_
4400: 4b 45 59 5f 54 59 50 45 3a 0a 09 09 09 72 65 74 KEY_TYPE:....ret
4410: 75 72 6e 28 22 43 4b 41 5f 4b 45 59 5f 54 59 50 urn("CKA_KEY_TYP
4420: 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f E");...case CKA_
4430: 53 55 42 4a 45 43 54 3a 0a 09 09 09 72 65 74 75 SUBJECT:....retu
4440: 72 6e 28 22 43 4b 41 5f 53 55 42 4a 45 43 54 22 rn("CKA_SUBJECT"
4450: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 49 44 );...case CKA_ID
4460: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 :....return("CKA
4470: 5f 49 44 22 29 3b 0a 09 09 63 61 73 65 20 43 4b _ID");...case CK
4480: 41 5f 53 45 4e 53 49 54 49 56 45 3a 0a 09 09 09 A_SENSITIVE:....
4490: 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 45 4e 53 return("CKA_SENS
44a0: 49 54 49 56 45 22 29 3b 0a 09 09 63 61 73 65 20 ITIVE");...case
44b0: 43 4b 41 5f 45 4e 43 52 59 50 54 3a 0a 09 09 09 CKA_ENCRYPT:....
44c0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 4e 43 52 return("CKA_ENCR
44d0: 59 50 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b YPT");...case CK
44e0: 41 5f 44 45 43 52 59 50 54 3a 0a 09 09 09 72 65 A_DECRYPT:....re
44f0: 74 75 72 6e 28 22 43 4b 41 5f 44 45 43 52 59 50 turn("CKA_DECRYP
4500: 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f T");...case CKA_
4510: 57 52 41 50 3a 0a 09 09 09 72 65 74 75 72 6e 28 WRAP:....return(
4520: 22 43 4b 41 5f 57 52 41 50 22 29 3b 0a 09 09 63 "CKA_WRAP");...c
4530: 61 73 65 20 43 4b 41 5f 55 4e 57 52 41 50 3a 0a ase CKA_UNWRAP:.
4540: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 55 ...return("CKA_U
4550: 4e 57 52 41 50 22 29 3b 0a 09 09 63 61 73 65 20 NWRAP");...case
4560: 43 4b 41 5f 53 49 47 4e 3a 0a 09 09 09 72 65 74 CKA_SIGN:....ret
4570: 75 72 6e 28 22 43 4b 41 5f 53 49 47 4e 22 29 3b urn("CKA_SIGN");
4580: 0a 09 09 63 61 73 65 20 43 4b 41 5f 53 49 47 4e ...case CKA_SIGN
4590: 5f 52 45 43 4f 56 45 52 3a 0a 09 09 09 72 65 74 _RECOVER:....ret
45a0: 75 72 6e 28 22 43 4b 41 5f 53 49 47 4e 5f 52 45 urn("CKA_SIGN_RE
45b0: 43 4f 56 45 52 22 29 3b 0a 09 09 63 61 73 65 20 COVER");...case
45c0: 43 4b 41 5f 56 45 52 49 46 59 3a 0a 09 09 09 72 CKA_VERIFY:....r
45d0: 65 74 75 72 6e 28 22 43 4b 41 5f 56 45 52 49 46 eturn("CKA_VERIF
45e0: 59 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f Y");...case CKA_
45f0: 56 45 52 49 46 59 5f 52 45 43 4f 56 45 52 3a 0a VERIFY_RECOVER:.
4600: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 56 ...return("CKA_V
4610: 45 52 49 46 59 5f 52 45 43 4f 56 45 52 22 29 3b ERIFY_RECOVER");
4620: 0a 09 09 63 61 73 65 20 43 4b 41 5f 44 45 52 49 ...case CKA_DERI
4630: 56 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 VE:....return("C
4640: 4b 41 5f 44 45 52 49 56 45 22 29 3b 0a 09 09 63 KA_DERIVE");...c
4650: 61 73 65 20 43 4b 41 5f 53 54 41 52 54 5f 44 41 ase CKA_START_DA
4660: 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 TE:....return("C
4670: 4b 41 5f 53 54 41 52 54 5f 44 41 54 45 22 29 3b KA_START_DATE");
4680: 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 4e 44 5f ...case CKA_END_
4690: 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 DATE:....return(
46a0: 22 43 4b 41 5f 45 4e 44 5f 44 41 54 45 22 29 3b "CKA_END_DATE");
46b0: 0a 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55 ...case CKA_MODU
46c0: 4c 55 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 LUS:....return("
46d0: 43 4b 41 5f 4d 4f 44 55 4c 55 53 22 29 3b 0a 09 CKA_MODULUS");..
46e0: 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 .case CKA_MODULU
46f0: 53 5f 42 49 54 53 3a 0a 09 09 09 72 65 74 75 72 S_BITS:....retur
4700: 6e 28 22 43 4b 41 5f 4d 4f 44 55 4c 55 53 5f 42 n("CKA_MODULUS_B
4710: 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b ITS");...case CK
4720: 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45 4e A_PUBLIC_EXPONEN
4730: 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b T:....return("CK
4740: 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45 4e A_PUBLIC_EXPONEN
4750: 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f T");...case CKA_
4760: 50 52 49 56 41 54 45 5f 45 58 50 4f 4e 45 4e 54 PRIVATE_EXPONENT
4770: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 :....return("CKA
4780: 5f 50 52 49 56 41 54 45 5f 45 58 50 4f 4e 45 4e _PRIVATE_EXPONEN
4790: 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f T");...case CKA_
47a0: 50 52 49 4d 45 5f 31 3a 0a 09 09 09 72 65 74 75 PRIME_1:....retu
47b0: 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f 31 22 rn("CKA_PRIME_1"
47c0: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 52 );...case CKA_PR
47d0: 49 4d 45 5f 32 3a 0a 09 09 09 72 65 74 75 72 6e IME_2:....return
47e0: 28 22 43 4b 41 5f 50 52 49 4d 45 5f 32 22 29 3b ("CKA_PRIME_2");
47f0: 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 58 50 4f ...case CKA_EXPO
4800: 4e 45 4e 54 5f 31 3a 0a 09 09 09 72 65 74 75 72 NENT_1:....retur
4810: 6e 28 22 43 4b 41 5f 45 58 50 4f 4e 45 4e 54 5f n("CKA_EXPONENT_
4820: 31 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 1");...case CKA_
4830: 45 58 50 4f 4e 45 4e 54 5f 32 3a 0a 09 09 09 72 EXPONENT_2:....r
4840: 65 74 75 72 6e 28 22 43 4b 41 5f 45 58 50 4f 4e eturn("CKA_EXPON
4850: 45 4e 54 5f 32 22 29 3b 0a 09 09 63 61 73 65 20 ENT_2");...case
4860: 43 4b 41 5f 43 4f 45 46 46 49 43 49 45 4e 54 3a CKA_COEFFICIENT:
4870: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f ....return("CKA_
4880: 43 4f 45 46 46 49 43 49 45 4e 54 22 29 3b 0a 09 COEFFICIENT");..
4890: 09 63 61 73 65 20 43 4b 41 5f 50 52 49 4d 45 3a .case CKA_PRIME:
48a0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f ....return("CKA_
48b0: 50 52 49 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 PRIME");...case
48c0: 43 4b 41 5f 53 55 42 50 52 49 4d 45 3a 0a 09 09 CKA_SUBPRIME:...
48d0: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 55 42 .return("CKA_SUB
48e0: 50 52 49 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 PRIME");...case
48f0: 43 4b 41 5f 42 41 53 45 3a 0a 09 09 09 72 65 74 CKA_BASE:....ret
4900: 75 72 6e 28 22 43 4b 41 5f 42 41 53 45 22 29 3b urn("CKA_BASE");
4910: 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49 4d ...case CKA_PRIM
4920: 45 5f 42 49 54 53 3a 0a 09 09 09 72 65 74 75 72 E_BITS:....retur
4930: 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f 42 49 54 n("CKA_PRIME_BIT
4940: 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f S");...case CKA_
4950: 53 55 42 5f 50 52 49 4d 45 5f 42 49 54 53 3a 0a SUB_PRIME_BITS:.
4960: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 ...return("CKA_S
4970: 55 42 5f 50 52 49 4d 45 5f 42 49 54 53 22 29 3b UB_PRIME_BITS");
4980: 0a 09 09 63 61 73 65 20 43 4b 41 5f 56 41 4c 55 ...case CKA_VALU
4990: 45 5f 42 49 54 53 3a 0a 09 09 09 72 65 74 75 72 E_BITS:....retur
49a0: 6e 28 22 43 4b 41 5f 56 41 4c 55 45 5f 42 49 54 n("CKA_VALUE_BIT
49b0: 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f S");...case CKA_
49c0: 56 41 4c 55 45 5f 4c 45 4e 3a 0a 09 09 09 72 65 VALUE_LEN:....re
49d0: 74 75 72 6e 28 22 43 4b 41 5f 56 41 4c 55 45 5f turn("CKA_VALUE_
49e0: 4c 45 4e 22 29 3b 0a 09 09 63 61 73 65 20 43 4b LEN");...case CK
49f0: 41 5f 45 58 54 52 41 43 54 41 42 4c 45 3a 0a 09 A_EXTRACTABLE:..
4a00: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 58 ..return("CKA_EX
4a10: 54 52 41 43 54 41 42 4c 45 22 29 3b 0a 09 09 63 TRACTABLE");...c
4a20: 61 73 65 20 43 4b 41 5f 4c 4f 43 41 4c 3a 0a 09 ase CKA_LOCAL:..
4a30: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4c 4f ..return("CKA_LO
4a40: 43 41 4c 22 29 3b 0a 09 09 63 61 73 65 20 43 4b CAL");...case CK
4a50: 41 5f 4e 45 56 45 52 5f 45 58 54 52 41 43 54 41 A_NEVER_EXTRACTA
4a60: 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 BLE:....return("
4a70: 43 4b 41 5f 4e 45 56 45 52 5f 45 58 54 52 41 43 CKA_NEVER_EXTRAC
4a80: 54 41 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 TABLE");...case
4a90: 43 4b 41 5f 41 4c 57 41 59 53 5f 53 45 4e 53 49 CKA_ALWAYS_SENSI
4aa0: 54 49 56 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 TIVE:....return(
4ab0: 22 43 4b 41 5f 41 4c 57 41 59 53 5f 53 45 4e 53 "CKA_ALWAYS_SENS
4ac0: 49 54 49 56 45 22 29 3b 0a 09 09 63 61 73 65 20 ITIVE");...case
4ad0: 43 4b 41 5f 4b 45 59 5f 47 45 4e 5f 4d 45 43 48 CKA_KEY_GEN_MECH
4ae0: 41 4e 49 53 4d 3a 0a 09 09 09 72 65 74 75 72 6e ANISM:....return
4af0: 28 22 43 4b 41 5f 4b 45 59 5f 47 45 4e 5f 4d 45 ("CKA_KEY_GEN_ME
4b00: 43 48 41 4e 49 53 4d 22 29 3b 0a 09 09 63 61 73 CHANISM");...cas
4b10: 65 20 43 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45 e CKA_MODIFIABLE
4b20: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 :....return("CKA
4b30: 5f 4d 4f 44 49 46 49 41 42 4c 45 22 29 3b 0a 09 _MODIFIABLE");..
4b40: 09 63 61 73 65 20 43 4b 41 5f 45 43 44 53 41 5f .case CKA_ECDSA_
4b50: 50 41 52 41 4d 53 3a 0a 09 09 09 72 65 74 75 72 PARAMS:....retur
4b60: 6e 28 22 43 4b 41 5f 45 43 44 53 41 5f 50 41 52 n("CKA_ECDSA_PAR
4b70: 41 4d 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b AMS");...case CK
4b80: 41 5f 45 43 5f 50 4f 49 4e 54 3a 0a 09 09 09 72 A_EC_POINT:....r
4b90: 65 74 75 72 6e 28 22 43 4b 41 5f 45 43 5f 50 4f eturn("CKA_EC_PO
4ba0: 49 4e 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b INT");...case CK
4bb0: 41 5f 53 45 43 4f 4e 44 41 52 59 5f 41 55 54 48 A_SECONDARY_AUTH
4bc0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 :....return("CKA
4bd0: 5f 53 45 43 4f 4e 44 41 52 59 5f 41 55 54 48 22 _SECONDARY_AUTH"
4be0: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 41 55 );...case CKA_AU
4bf0: 54 48 5f 50 49 4e 5f 46 4c 41 47 53 3a 0a 09 09 TH_PIN_FLAGS:...
4c00: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 41 55 54 .return("CKA_AUT
4c10: 48 5f 50 49 4e 5f 46 4c 41 47 53 22 29 3b 0a 09 H_PIN_FLAGS");..
4c20: 09 63 61 73 65 20 43 4b 41 5f 48 57 5f 46 45 41 .case CKA_HW_FEA
4c30: 54 55 52 45 5f 54 59 50 45 3a 0a 09 09 09 72 65 TURE_TYPE:....re
4c40: 74 75 72 6e 28 22 43 4b 41 5f 48 57 5f 46 45 41 turn("CKA_HW_FEA
4c50: 54 55 52 45 5f 54 59 50 45 22 29 3b 0a 09 09 63 TURE_TYPE");...c
4c60: 61 73 65 20 43 4b 41 5f 52 45 53 45 54 5f 4f 4e ase CKA_RESET_ON
4c70: 5f 49 4e 49 54 3a 0a 09 09 09 72 65 74 75 72 6e _INIT:....return
4c80: 28 22 43 4b 41 5f 52 45 53 45 54 5f 4f 4e 5f 49 ("CKA_RESET_ON_I
4c90: 4e 49 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b NIT");...case CK
4ca0: 41 5f 48 41 53 5f 52 45 53 45 54 3a 0a 09 09 09 A_HAS_RESET:....
4cb0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 48 41 53 5f return("CKA_HAS_
4cc0: 52 45 53 45 54 22 29 3b 0a 09 09 63 61 73 65 20 RESET");...case
4cd0: 43 4b 41 5f 56 45 4e 44 4f 52 5f 44 45 46 49 4e CKA_VENDOR_DEFIN
4ce0: 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 ED:....return("C
4cf0: 4b 41 5f 56 45 4e 44 4f 52 5f 44 45 46 49 4e 45 KA_VENDOR_DEFINE
4d00: 44 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e D");..}...return
4d10: 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a ("UNKNOWN");.}..
4d20: 23 20 20 64 65 66 69 6e 65 20 6d 61 6c 6c 6f 63 # define malloc
4d30: 28 78 29 20 43 41 43 4b 45 59 5f 44 45 42 55 47 (x) CACKEY_DEBUG
4d40: 5f 46 55 4e 43 5f 4d 41 4c 4c 4f 43 28 78 2c 20 _FUNC_MALLOC(x,
4d50: 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 __func__, __LINE
4d60: 5f 5f 29 0a 23 20 20 64 65 66 69 6e 65 20 72 65 __).# define re
4d70: 61 6c 6c 6f 63 28 78 2c 20 79 29 20 43 41 43 4b alloc(x, y) CACK
4d80: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 52 45 EY_DEBUG_FUNC_RE
4d90: 41 4c 4c 4f 43 28 78 2c 20 79 2c 20 5f 5f 66 75 ALLOC(x, y, __fu
4da0: 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a nc__, __LINE__).
4db0: 23 20 20 69 66 64 65 66 20 73 74 72 64 75 70 0a # ifdef strdup.
4dc0: 23 20 20 20 20 75 6e 64 65 66 20 73 74 72 64 75 # undef strdu
4dd0: 70 0a 23 20 20 65 6e 64 69 66 0a 23 20 20 64 65 p.# endif.# de
4de0: 66 69 6e 65 20 73 74 72 64 75 70 28 78 29 20 43 fine strdup(x) C
4df0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 ACKEY_DEBUG_FUNC
4e00: 5f 53 54 52 44 55 50 28 78 2c 20 5f 5f 66 75 6e _STRDUP(x, __fun
4e10: 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 c__, __LINE__).#
4e20: 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 43 else.# define C
4e30: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
4e40: 54 46 28 78 2e 2e 2e 29 20 2f 2a 2a 2f 0a 23 20 TF(x...) /**/.#
4e50: 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 define CACKEY_D
4e60: 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 66 2c EBUG_PRINTBUF(f,
4e70: 20 78 2c 20 79 29 20 2f 2a 2a 2f 0a 23 20 20 64 x, y) /**/.# d
4e80: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 efine CACKEY_DEB
4e90: 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 UG_FUNC_TAG_TO_S
4ea0: 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53 TR(x) "DEBUG_DIS
4eb0: 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65 ABLED".# define
4ec0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 CACKEY_DEBUG_FU
4ed0: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 NC_SCARDERR_TO_S
4ee0: 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53 TR(x) "DEBUG_DIS
4ef0: 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65 ABLED".# define
4f00: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 CACKEY_DEBUG_FU
4f10: 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28 NC_OBJID_TO_STR(
4f20: 78 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c x) "DEBUG_DISABL
4f30: 45 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43 41 ED".# define CA
4f40: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f CKEY_DEBUG_FUNC_
4f50: 41 50 50 54 59 50 45 5f 54 4f 5f 53 54 52 28 78 APPTYPE_TO_STR(x
4f60: 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c 45 ) "DEBUG_DISABLE
4f70: 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 D".# define CAC
4f80: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 KEY_DEBUG_FUNC_A
4f90: 54 54 52 49 42 55 54 45 5f 54 4f 5f 53 54 52 28 TTRIBUTE_TO_STR(
4fa0: 78 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c x) "DEBUG_DISABL
4fb0: 45 44 22 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 ED".#endif../*.
4fc0: 2a 20 49 6e 63 6c 75 64 65 20 74 68 65 73 65 20 * Include these
4fd0: 73 6f 75 72 63 65 20 66 69 6c 65 73 20 69 6e 20 source files in
4fe0: 74 68 69 73 20 74 72 61 6e 73 6c 61 74 69 6f 6e this translation
4ff0: 20 75 6e 69 74 20 73 6f 20 74 68 61 74 20 77 65 unit so that we
5000: 20 63 61 6e 20 62 69 6e 64 20 74 6f 0a 20 2a 20 can bind to. *
5010: 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f functions and no
5020: 74 20 69 6e 63 6c 75 64 65 20 61 6e 79 20 73 79 t include any sy
5030: 6d 62 6f 6c 73 20 69 6e 20 74 68 65 20 6f 75 74 mbols in the out
5040: 70 75 74 20 73 68 61 72 65 64 20 6f 62 6a 65 63 put shared objec
5050: 74 2e 0a 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 t.. */.#include
5060: 22 61 73 6e 31 2d 78 35 30 39 2e 63 22 0a 23 69 "asn1-x509.c".#i
5070: 6e 63 6c 75 64 65 20 22 73 68 61 31 2e 63 22 0a nclude "sha1.c".
5080: 23 69 6e 63 6c 75 64 65 20 22 6d 64 35 2e 63 22 #include "md5.c"
5090: 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20 7b ..typedef enum {
50a0: 0a 09 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 ..CACKEY_ID_TYPE
50b0: 5f 45 52 52 4f 52 2c 0a 09 43 41 43 4b 45 59 5f _ERROR,..CACKEY_
50c0: 49 44 5f 54 59 50 45 5f 55 4e 4b 4e 4f 57 4e 2c ID_TYPE_UNKNOWN,
50d0: 0a 09 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 ..CACKEY_ID_TYPE
50e0: 5f 43 41 43 2c 0a 09 43 41 43 4b 45 59 5f 49 44 _CAC,..CACKEY_ID
50f0: 5f 54 59 50 45 5f 50 49 56 2c 0a 09 43 41 43 4b _TYPE_PIV,..CACK
5100: 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f EY_ID_TYPE_CERT_
5110: 4f 4e 4c 59 0a 7d 20 63 61 63 6b 65 79 5f 70 63 ONLY.} cackey_pc
5120: 73 63 5f 69 64 5f 74 79 70 65 3b 0a 0a 73 74 72 sc_id_type;..str
5130: 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f uct cackey_pcsc_
5140: 69 64 65 6e 74 69 74 79 20 7b 0a 09 63 61 63 6b identity {..cack
5150: 65 79 5f 70 63 73 63 5f 69 64 5f 74 79 70 65 20 ey_pcsc_id_type
5160: 69 64 5f 74 79 70 65 3b 0a 0a 09 73 69 7a 65 5f id_type;...size_
5170: 74 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 t certificate_le
5180: 6e 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 n;..unsigned cha
5190: 72 20 2a 63 65 72 74 69 66 69 63 61 74 65 3b 0a r *certificate;.
51a0: 0a 09 73 73 69 7a 65 5f 74 20 6b 65 79 73 69 7a ..ssize_t keysiz
51b0: 65 3b 0a 0a 09 75 6e 69 6f 6e 20 7b 0a 09 09 73 e;...union {...s
51c0: 74 72 75 63 74 20 7b 0a 09 09 09 75 6e 73 69 67 truct {....unsig
51d0: 6e 65 64 20 63 68 61 72 20 61 70 70 6c 65 74 5b ned char applet[
51e0: 37 5d 3b 0a 09 09 09 75 69 6e 74 31 36 5f 74 20 7];....uint16_t
51f0: 66 69 6c 65 3b 0a 09 09 7d 20 63 61 63 3b 0a 0a file;...} cac;..
5200: 09 09 73 74 72 75 63 74 20 7b 0a 09 09 09 75 6e ..struct {....un
5210: 73 69 67 6e 65 64 20 63 68 61 72 20 6b 65 79 5f signed char key_
5220: 69 64 3b 0a 09 09 09 63 68 61 72 20 6c 61 62 65 id;....char labe
5230: 6c 5b 33 32 5d 3b 0a 09 09 7d 20 70 69 76 3b 0a l[32];...} piv;.
5240: 09 7d 20 63 61 72 64 3b 0a 7d 3b 0a 0a 73 74 72 .} card;.};..str
5250: 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 uct cackey_ident
5260: 69 74 79 20 7b 0a 09 73 74 72 75 63 74 20 63 61 ity {..struct ca
5270: 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 ckey_pcsc_identi
5280: 74 79 20 2a 70 63 73 63 5f 69 64 65 6e 74 69 74 ty *pcsc_identit
5290: 79 3b 0a 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 y;...CK_ATTRIBUT
52a0: 45 20 2a 61 74 74 72 69 62 75 74 65 73 3b 0a 09 E *attributes;..
52b0: 43 4b 5f 55 4c 4f 4e 47 20 61 74 74 72 69 62 75 CK_ULONG attribu
52c0: 74 65 73 5f 63 6f 75 6e 74 3b 0a 7d 3b 0a 0a 73 tes_count;.};..s
52d0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 65 73 truct cackey_ses
52e0: 73 69 6f 6e 20 7b 0a 09 69 6e 74 20 61 63 74 69 sion {..int acti
52f0: 76 65 3b 0a 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 ve;...CK_SLOT_ID
5300: 20 73 6c 6f 74 49 44 3b 0a 0a 09 43 4b 5f 53 54 slotID;...CK_ST
5310: 41 54 45 20 73 74 61 74 65 3b 0a 09 43 4b 5f 46 ATE state;..CK_F
5320: 4c 41 47 53 20 66 6c 61 67 73 3b 0a 09 43 4b 5f LAGS flags;..CK_
5330: 55 4c 4f 4e 47 20 75 6c 44 65 76 69 63 65 45 72 ULONG ulDeviceEr
5340: 72 6f 72 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 ror;..CK_VOID_PT
5350: 52 20 70 41 70 70 6c 69 63 61 74 69 6f 6e 3b 0a R pApplication;.
5360: 09 43 4b 5f 4e 4f 54 49 46 59 20 4e 6f 74 69 66 .CK_NOTIFY Notif
5370: 79 3b 0a 0a 09 73 74 72 75 63 74 20 63 61 63 6b y;...struct cack
5380: 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 ey_identity *ide
5390: 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e ntities;..unsign
53a0: 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 69 ed long identiti
53b0: 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69 6e 74 20 es_count;...int
53c0: 73 65 61 72 63 68 5f 61 63 74 69 76 65 3b 0a 09 search_active;..
53d0: 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 CK_ATTRIBUTE_PTR
53e0: 20 73 65 61 72 63 68 5f 71 75 65 72 79 3b 0a 09 search_query;..
53f0: 43 4b 5f 55 4c 4f 4e 47 20 73 65 61 72 63 68 5f CK_ULONG search_
5400: 71 75 65 72 79 5f 63 6f 75 6e 74 3b 0a 09 75 6e query_count;..un
5410: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 65 61 72 signed long sear
5420: 63 68 5f 63 75 72 72 5f 69 64 3b 0a 0a 09 69 6e ch_curr_id;...in
5430: 74 20 73 69 67 6e 5f 61 63 74 69 76 65 3b 0a 09 t sign_active;..
5440: 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 CK_MECHANISM_TYP
5450: 45 20 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d E sign_mechanism
5460: 3b 0a 09 43 4b 5f 42 59 54 45 5f 50 54 52 20 73 ;..CK_BYTE_PTR s
5470: 69 67 6e 5f 62 75 66 3b 0a 09 75 6e 73 69 67 6e ign_buf;..unsign
5480: 65 64 20 6c 6f 6e 67 20 73 69 67 6e 5f 62 75 66 ed long sign_buf
5490: 6c 65 6e 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c len;..unsigned l
54a0: 6f 6e 67 20 73 69 67 6e 5f 62 75 66 75 73 65 64 ong sign_bufused
54b0: 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 ;..struct cackey
54c0: 5f 69 64 65 6e 74 69 74 79 20 2a 73 69 67 6e 5f _identity *sign_
54d0: 69 64 65 6e 74 69 74 79 3b 0a 0a 09 69 6e 74 20 identity;...int
54e0: 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 3b 0a decrypt_active;.
54f0: 09 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59 .CK_MECHANISM_TY
5500: 50 45 20 64 65 63 72 79 70 74 5f 6d 65 63 68 61 PE decrypt_mecha
5510: 6e 69 73 6d 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 nism;..CK_VOID_P
5520: 54 52 20 64 65 63 72 79 70 74 5f 6d 65 63 68 5f TR decrypt_mech_
5530: 70 61 72 6d 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 parm;..CK_ULONG
5540: 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61 72 decrypt_mech_par
5550: 6d 6c 65 6e 3b 0a 09 73 74 72 75 63 74 20 63 61 mlen;..struct ca
5560: 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 64 ckey_identity *d
5570: 65 63 72 79 70 74 5f 69 64 65 6e 74 69 74 79 3b ecrypt_identity;
5580: 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b .};..struct cack
5590: 65 79 5f 73 6c 6f 74 20 7b 0a 09 69 6e 74 20 61 ey_slot {..int a
55a0: 63 74 69 76 65 3b 0a 09 69 6e 74 20 69 6e 74 65 ctive;..int inte
55b0: 72 6e 61 6c 3b 0a 0a 09 63 68 61 72 20 2a 70 63 rnal;...char *pc
55c0: 73 63 5f 72 65 61 64 65 72 3b 0a 0a 09 69 6e 74 sc_reader;...int
55d0: 20 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 pcsc_card_conne
55e0: 63 74 65 64 3b 0a 09 53 43 41 52 44 48 41 4e 44 cted;..SCARDHAND
55f0: 4c 45 20 70 63 73 63 5f 63 61 72 64 3b 0a 0a 09 LE pcsc_card;...
5600: 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 5f int transaction_
5610: 64 65 70 74 68 3b 0a 09 69 6e 74 20 74 72 61 6e depth;..int tran
5620: 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f saction_need_hw_
5630: 6c 6f 63 6b 3b 0a 0a 09 69 6e 74 20 73 6c 6f 74 lock;...int slot
5640: 5f 72 65 73 65 74 3b 0a 0a 09 43 4b 5f 46 4c 41 _reset;...CK_FLA
5650: 47 53 20 74 6f 6b 65 6e 5f 66 6c 61 67 73 3b 0a GS token_flags;.
5660: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 ..unsigned char
5670: 2a 6c 61 62 65 6c 3b 0a 0a 09 44 57 4f 52 44 20 *label;...DWORD
5680: 70 72 6f 74 6f 63 6f 6c 3b 0a 0a 09 75 6e 73 69 protocol;...unsi
5690: 67 6e 65 64 20 69 6e 74 20 63 61 63 68 65 64 5f gned int cached_
56a0: 63 65 72 74 73 5f 63 6f 75 6e 74 3b 0a 09 73 74 certs_count;..st
56b0: 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 ruct cackey_pcsc
56c0: 5f 69 64 65 6e 74 69 74 79 20 2a 63 61 63 68 65 _identity *cache
56d0: 64 5f 63 65 72 74 73 3b 0a 0a 09 63 61 63 6b 65 d_certs;...cacke
56e0: 79 5f 70 63 73 63 5f 69 64 5f 74 79 70 65 20 69 y_pcsc_id_type i
56f0: 64 5f 74 79 70 65 5f 68 69 6e 74 3b 0a 7d 3b 0a d_type_hint;.};.
5700: 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a .typedef enum {.
5710: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f .CACKEY_TLV_APP_
5720: 47 45 4e 45 52 49 43 20 3d 20 30 78 30 31 2c 0a GENERIC = 0x01,.
5730: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f .CACKEY_TLV_APP_
5740: 53 4b 49 20 20 20 20 20 3d 20 30 78 30 32 2c 0a SKI = 0x02,.
5750: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f .CACKEY_TLV_APP_
5760: 50 4b 49 20 20 20 20 20 3d 20 30 78 30 34 0a 7d PKI = 0x04.}
5770: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 61 70 70 74 cackey_tlv_appt
5780: 79 70 65 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e ype;..typedef en
5790: 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 54 4c 56 um {..CACKEY_TLV
57a0: 5f 4f 42 4a 49 44 5f 47 45 4e 45 52 41 4c 49 4e _OBJID_GENERALIN
57b0: 46 4f 20 20 20 20 20 20 20 3d 20 30 78 32 30 30 FO = 0x200
57c0: 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 0,..CACKEY_TLV_O
57d0: 42 4a 49 44 5f 50 52 4f 50 45 52 53 4f 4e 41 4c BJID_PROPERSONAL
57e0: 49 4e 46 4f 20 20 20 3d 20 30 78 32 31 30 30 2c INFO = 0x2100,
57f0: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a ..CACKEY_TLV_OBJ
5800: 49 44 5f 41 43 43 45 53 53 43 4f 4e 54 52 4f 4c ID_ACCESSCONTROL
5810: 20 20 20 20 20 3d 20 30 78 33 30 30 30 2c 0a 09 = 0x3000,..
5820: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 CACKEY_TLV_OBJID
5830: 5f 4c 4f 47 49 4e 20 20 20 20 20 20 20 20 20 20 _LOGIN
5840: 20 20 20 3d 20 30 78 34 30 30 30 2c 0a 09 43 41 = 0x4000,..CA
5850: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 CKEY_TLV_OBJID_C
5860: 41 52 44 49 4e 46 4f 20 20 20 20 20 20 20 20 20 ARDINFO
5870: 20 3d 20 30 78 35 30 30 30 2c 0a 09 43 41 43 4b = 0x5000,..CACK
5880: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 42 49 4f EY_TLV_OBJID_BIO
5890: 4d 45 54 52 49 43 53 20 20 20 20 20 20 20 20 3d METRICS =
58a0: 20 30 78 36 30 30 30 2c 0a 09 43 41 43 4b 45 59 0x6000,..CACKEY
58b0: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 44 49 47 49 54 _TLV_OBJID_DIGIT
58c0: 41 4c 53 49 47 43 45 52 54 20 20 20 20 3d 20 30 ALSIGCERT = 0
58d0: 78 37 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 x7000,..CACKEY_T
58e0: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 LV_OBJID_CAC_PER
58f0: 53 4f 4e 20 20 20 20 20 20 20 20 3d 20 30 78 30 SON = 0x0
5900: 32 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 200,..CACKEY_TLV
5910: 5f 4f 42 4a 49 44 5f 43 41 43 5f 42 45 4e 45 46 _OBJID_CAC_BENEF
5920: 49 54 53 20 20 20 20 20 20 3d 20 30 78 30 32 30 ITS = 0x020
5930: 32 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 2,..CACKEY_TLV_O
5940: 42 4a 49 44 5f 43 41 43 5f 4f 54 48 45 52 42 45 BJID_CAC_OTHERBE
5950: 4e 45 46 49 54 53 20 3d 20 30 78 30 32 30 33 2c NEFITS = 0x0203,
5960: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a ..CACKEY_TLV_OBJ
5970: 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e 4e 45 4c ID_CAC_PERSONNEL
5980: 20 20 20 20 20 3d 20 30 78 30 32 30 31 2c 0a 09 = 0x0201,..
5990: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 CACKEY_TLV_OBJID
59a0: 5f 43 41 43 5f 50 4b 49 43 45 52 54 20 20 20 20 _CAC_PKICERT
59b0: 20 20 20 3d 20 30 78 30 32 46 45 0a 7d 20 63 61 = 0x02FE.} ca
59c0: 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74 69 ckey_tlv_objecti
59d0: 64 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d d;..typedef enum
59e0: 20 7b 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f {..CACKEY_PCSC_
59f0: 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 20 20 S_TOKENPRESENT
5a00: 20 20 3d 20 31 2c 0a 09 43 41 43 4b 45 59 5f 50 = 1,..CACKEY_P
5a10: 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 CSC_S_OK
5a20: 20 20 20 20 20 20 3d 20 30 2c 0a 09 43 41 43 4b = 0,..CACK
5a30: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 EY_PCSC_E_GENERI
5a40: 43 20 20 20 20 20 20 20 20 20 3d 20 2d 31 2c 0a C = -1,.
5a50: 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 .CACKEY_PCSC_E_B
5a60: 41 44 50 49 4e 20 20 20 20 20 20 20 20 20 20 3d ADPIN =
5a70: 20 2d 32 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 -2,..CACKEY_PCS
5a80: 43 5f 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20 C_E_LOCKED
5a90: 20 20 20 20 3d 20 2d 33 2c 0a 09 43 41 43 4b 45 = -3,..CACKE
5aa0: 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 Y_PCSC_E_NEEDLOG
5ab0: 49 4e 20 20 20 20 20 20 20 3d 20 2d 34 2c 0a 09 IN = -4,..
5ac0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f CACKEY_PCSC_E_TO
5ad0: 4b 45 4e 41 42 53 45 4e 54 20 20 20 20 20 3d 20 KENABSENT =
5ae0: 2d 36 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 -6,..CACKEY_PCSC
5af0: 5f 45 5f 52 45 54 52 59 20 20 20 20 20 20 20 20 _E_RETRY
5b00: 20 20 20 3d 20 2d 37 2c 0a 09 43 41 43 4b 45 59 = -7,..CACKEY
5b10: 5f 50 43 53 43 5f 45 5f 4e 4f 44 41 54 41 20 20 _PCSC_E_NODATA
5b20: 20 20 20 20 20 20 20 20 3d 20 2d 38 0a 7d 20 63 = -8.} c
5b30: 61 63 6b 65 79 5f 72 65 74 3b 0a 0a 73 74 72 75 ackey_ret;..stru
5b40: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 63 61 ct cackey_tlv_ca
5b50: 72 64 75 72 6c 20 7b 0a 09 75 6e 73 69 67 6e 65 rdurl {..unsigne
5b60: 64 20 63 68 61 72 20 20 20 20 20 20 20 20 72 69 d char ri
5b70: 64 5b 35 5d 3b 0a 09 63 61 63 6b 65 79 5f 74 6c d[5];..cackey_tl
5b80: 76 5f 61 70 70 74 79 70 65 20 20 20 61 70 70 74 v_apptype appt
5b90: 79 70 65 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76 ype;..cackey_tlv
5ba0: 5f 6f 62 6a 65 63 74 69 64 20 20 6f 62 6a 65 63 _objectid objec
5bb0: 74 69 64 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76 tid;..cackey_tlv
5bc0: 5f 6f 62 6a 65 63 74 69 64 20 20 61 70 70 69 64 _objectid appid
5bd0: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 ;..unsigned char
5be0: 20 20 20 20 20 20 20 20 70 69 6e 69 64 3b 0a 7d pinid;.}
5bf0: 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 ;..struct cackey
5c00: 5f 74 6c 76 5f 65 6e 74 69 74 79 3b 0a 73 74 72 _tlv_entity;.str
5c10: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 uct cackey_tlv_e
5c20: 6e 74 69 74 79 20 7b 0a 09 75 69 6e 74 38 5f 74 ntity {..uint8_t
5c30: 20 74 61 67 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 tag;..size_t le
5c40: 6e 67 74 68 3b 0a 0a 09 75 6e 69 6f 6e 20 7b 0a ngth;...union {.
5c50: 09 09 76 6f 69 64 20 2a 76 61 6c 75 65 3b 0a 09 ..void *value;..
5c60: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 .struct cackey_t
5c70: 6c 76 5f 63 61 72 64 75 72 6c 20 2a 76 61 6c 75 lv_cardurl *valu
5c80: 65 5f 63 61 72 64 75 72 6c 3b 0a 09 09 75 69 6e e_cardurl;...uin
5c90: 74 38 5f 74 20 76 61 6c 75 65 5f 62 79 74 65 3b t8_t value_byte;
5ca0: 0a 09 7d 3b 0a 0a 09 73 74 72 75 63 74 20 63 61 ..};...struct ca
5cb0: 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 ckey_tlv_entity
5cc0: 2a 5f 6e 65 78 74 3b 0a 7d 3b 0a 0a 2f 2a 20 43 *_next;.};../* C
5cd0: 41 43 4b 45 59 20 47 6c 6f 62 61 6c 20 48 61 6e ACKEY Global Han
5ce0: 64 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 dles */.static v
5cf0: 6f 69 64 20 2a 63 61 63 6b 65 79 5f 62 69 67 6c oid *cackey_bigl
5d00: 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74 ock = NULL;.stat
5d10: 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 ic struct cackey
5d20: 5f 73 65 73 73 69 6f 6e 20 63 61 63 6b 65 79 5f _session cackey_
5d30: 73 65 73 73 69 6f 6e 73 5b 31 32 38 5d 3b 0a 73 sessions[128];.s
5d40: 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63 tatic struct cac
5d50: 6b 65 79 5f 73 6c 6f 74 20 63 61 63 6b 65 79 5f key_slot cackey_
5d60: 73 6c 6f 74 73 5b 31 32 38 5d 3b 0a 73 74 61 74 slots[128];.stat
5d70: 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 69 6e ic int cackey_in
5d80: 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 73 itialized = 0;.s
5d90: 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 tatic int cackey
5da0: 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d 20 _biglock_init =
5db0: 30 3b 0a 43 4b 5f 43 5f 49 4e 49 54 49 41 4c 49 0;.CK_C_INITIALI
5dc0: 5a 45 5f 41 52 47 53 20 63 61 63 6b 65 79 5f 61 ZE_ARGS cackey_a
5dd0: 72 67 73 3b 0a 0a 2f 2a 2a 20 45 78 74 72 61 20 rgs;../** Extra
5de0: 63 65 72 74 69 66 69 63 61 74 65 73 20 74 6f 20 certificates to
5df0: 69 6e 63 6c 75 64 65 20 69 6e 20 74 6f 6b 65 6e include in token
5e00: 20 2a 2a 2f 0a 73 74 72 75 63 74 20 63 61 63 6b **/.struct cack
5e10: 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 ey_pcsc_identity
5e20: 20 65 78 74 72 61 5f 63 65 72 74 73 5b 5d 20 3d extra_certs[] =
5e30: 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 63 61 63 {.#include "cac
5e40: 6b 65 79 5f 62 75 69 6c 74 69 6e 5f 63 65 72 74 key_builtin_cert
5e50: 73 2e 68 22 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 s.h".};..#define
5e60: 20 43 41 43 4b 45 59 5f 4d 41 43 52 4f 5f 44 45 CACKEY_MACRO_DE
5e70: 46 41 55 4c 54 5f 58 53 54 52 28 73 74 72 29 20 FAULT_XSTR(str)
5e80: 43 41 43 4b 45 59 5f 4d 41 43 52 4f 5f 44 45 46 CACKEY_MACRO_DEF
5e90: 41 55 4c 54 5f 53 54 52 28 73 74 72 29 0a 23 64 AULT_STR(str).#d
5ea0: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 4d 41 43 efine CACKEY_MAC
5eb0: 52 4f 5f 44 45 46 41 55 4c 54 5f 53 54 52 28 73 RO_DEFAULT_STR(s
5ec0: 74 72 29 20 23 73 74 72 0a 0a 2f 2a 20 50 72 6f tr) #str../* Pro
5ed0: 74 65 63 74 65 64 20 41 75 74 68 65 6e 74 69 63 tected Authentic
5ee0: 61 74 69 6f 6e 20 50 61 74 68 20 63 6f 6d 6d 61 ation Path comma
5ef0: 6e 64 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 nd */.static cha
5f00: 72 20 2a 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f r *cackey_pin_co
5f10: 6d 6d 61 6e 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 2f mmand = NULL;../
5f20: 2a 20 52 65 61 64 65 72 20 45 78 63 6c 75 73 69 * Reader Exclusi
5f30: 6f 6e 20 6f 72 20 49 6e 63 6c 75 64 65 2d 6f 6e on or Include-on
5f40: 6c 79 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 ly */.static cha
5f50: 72 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 65 72 r *cackey_reader
5f60: 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79 20 3d s_include_only =
5f70: 20 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20 63 68 NULL;.static ch
5f80: 61 72 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 65 ar *cackey_reade
5f90: 72 73 5f 65 78 63 6c 75 64 65 20 3d 20 4e 55 4c rs_exclude = NUL
5fa0: 4c 3b 0a 0a 2f 2a 20 50 43 53 43 20 47 6c 6f 62 L;../* PCSC Glob
5fb0: 61 6c 20 48 61 6e 64 6c 65 73 20 2a 2f 0a 73 74 al Handles */.st
5fc0: 61 74 69 63 20 4c 50 53 43 41 52 44 43 4f 4e 54 atic LPSCARDCONT
5fd0: 45 58 54 20 63 61 63 6b 65 79 5f 70 63 73 63 5f EXT cackey_pcsc_
5fe0: 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a handle = NULL;..
5ff0: 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 static unsigned
6000: 6c 6f 6e 67 20 63 61 63 6b 65 79 5f 67 65 74 76 long cackey_getv
6010: 65 72 73 69 6f 6e 28 76 6f 69 64 29 20 7b 0a 09 ersion(void) {..
6020: 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 static unsigned
6030: 6c 6f 6e 67 20 72 65 74 76 61 6c 20 3d 20 32 35 long retval = 25
6040: 35 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 5;..unsigned lon
6050: 67 20 6d 61 6a 6f 72 20 3d 20 30 3b 0a 09 75 6e g major = 0;..un
6060: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6d 69 6e 6f signed long mino
6070: 72 20 3d 20 30 3b 0a 09 63 68 61 72 20 2a 6d 61 r = 0;..char *ma
6080: 6a 6f 72 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b 0a jor_str = NULL;.
6090: 09 63 68 61 72 20 2a 6d 69 6e 6f 72 5f 73 74 72 .char *minor_str
60a0: 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 43 41 43 4b 45 = NULL;...CACKE
60b0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
60c0: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 Called.");...if
60d0: 28 72 65 74 76 61 6c 20 21 3d 20 32 35 35 29 20 (retval != 255)
60e0: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
60f0: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
6100: 6e 67 20 30 78 25 6c 78 20 28 63 61 63 68 65 64 ng 0x%lx (cached
6110: 29 2e 22 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 ).", retval);...
6120: 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b .return(retval);
6130: 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20 30 ..}...retval = 0
6140: 3b 0a 0a 23 69 66 64 65 66 20 50 41 43 4b 41 47 ;..#ifdef PACKAG
6150: 45 5f 56 45 52 53 49 4f 4e 0a 20 20 20 20 20 20 E_VERSION.
6160: 20 20 6d 61 6a 6f 72 5f 73 74 72 20 3d 20 50 41 major_str = PA
6170: 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 3b 0a 09 CKAGE_VERSION;..
6180: 69 66 20 28 6d 61 6a 6f 72 5f 73 74 72 29 20 7b if (major_str) {
6190: 0a 09 20 20 20 20 20 20 20 20 6d 61 6a 6f 72 20 .. major
61a0: 3d 20 73 74 72 74 6f 75 6c 28 6d 61 6a 6f 72 5f = strtoul(major_
61b0: 73 74 72 2c 20 26 6d 69 6e 6f 72 5f 73 74 72 2c str, &minor_str,
61c0: 20 31 30 29 3b 0a 0a 09 09 69 66 20 28 6d 69 6e 10);....if (min
61d0: 6f 72 5f 73 74 72 29 20 7b 0a 09 09 09 6d 69 6e or_str) {....min
61e0: 6f 72 20 3d 20 73 74 72 74 6f 75 6c 28 6d 69 6e or = strtoul(min
61f0: 6f 72 5f 73 74 72 20 2b 20 31 2c 20 4e 55 4c 4c or_str + 1, NULL
6200: 2c 20 31 30 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 , 10);...}..}...
6210: 72 65 74 76 61 6c 20 3d 20 28 6d 61 6a 6f 72 20 retval = (major
6220: 3c 3c 20 31 36 29 20 7c 20 28 6d 69 6e 6f 72 20 << 16) | (minor
6230: 3c 3c 20 38 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 << 8);.#endif...
6240: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
6250: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 NTF("Returning 0
6260: 78 25 6c 78 22 2c 20 72 65 74 76 61 6c 29 3b 0a x%lx", retval);.
6270: 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 ..return(retval)
6280: 3b 0a 7d 0a 0a 2f 2a 20 50 43 2f 53 43 20 52 65 ;.}../* PC/SC Re
6290: 6c 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 73 20 lated Functions
62a0: 2a 2f 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 */./*. * SYNPOSI
62b0: 53 0a 20 2a 20 20 20 20 20 76 6f 69 64 20 63 61 S. * void ca
62c0: 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f ckey_slots_disco
62d0: 6e 6e 65 63 74 5f 61 6c 6c 28 69 6e 74 20 75 6e nnect_all(int un
62e0: 69 74 69 61 6c 69 7a 65 5f 61 6c 6c 5f 72 65 61 itialize_all_rea
62f0: 64 65 72 73 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 ders);. *. * ARG
6300: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 69 6e UMENTS. * in
6310: 74 20 75 6e 69 74 69 61 6c 69 7a 65 5f 61 6c 6c t unitialize_all
6320: 5f 72 65 61 64 65 72 73 20 20 20 20 20 20 46 72 _readers Fr
6330: 65 65 20 74 68 65 20 22 70 63 73 63 5f 72 65 61 ee the "pcsc_rea
6340: 64 65 72 22 20 6f 62 6a 65 63 74 20 61 73 73 6f der" object asso
6350: 63 69 61 74 65 64 20 77 69 74 68 0a 20 2a 20 20 ciated with. *
6360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6370: 20 20 20 20 20 20 20 20 20 65 61 63 68 20 73 6c each sl
6380: 6f 74 20 28 62 6f 6f 6c 65 61 6e 29 0a 20 2a 0a ot (boolean). *.
6390: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a * RETURN VALUE.
63a0: 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 * None. *.
63b0: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 * NOTES. * T
63c0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 69 73 his function dis
63d0: 63 6f 6e 6e 65 63 74 73 20 66 72 6f 6d 20 61 6c connects from al
63e0: 6c 20 63 61 72 64 73 2e 0a 20 2a 0a 20 2a 2f 0a l cards.. *. */.
63f0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b static void cack
6400: 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e ey_slots_disconn
6410: 65 63 74 5f 61 6c 6c 28 69 6e 74 20 75 6e 69 74 ect_all(int unit
6420: 69 61 6c 69 7a 65 5f 61 6c 6c 5f 72 65 61 64 65 ialize_all_reade
6430: 72 73 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20 rs) {..uint32_t
6440: 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 idx;...CACKEY_DE
6450: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
6460: 65 64 2e 22 29 3b 0a 0a 09 66 6f 72 20 28 69 64 ed.");...for (id
6470: 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 x = 0; idx < (si
6480: 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 zeof(cackey_slot
6490: 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b s) / sizeof(cack
64a0: 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69 ey_slots[0])); i
64b0: 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 dx++) {...if (ca
64c0: 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e ckey_slots[idx].
64d0: 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 09 2f internal) {..../
64e0: 2a 20 53 6b 69 70 20 69 6e 74 65 72 6e 61 6c 20 * Skip internal
64f0: 73 6c 6f 74 73 20 2a 2f 0a 09 09 09 63 6f 6e 74 slots */....cont
6500: 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 inue;...}....if
6510: 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 (cackey_slots[id
6520: 78 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e x].pcsc_card_con
6530: 6e 65 63 74 65 64 29 20 7b 0a 09 09 09 43 41 43 nected) {....CAC
6540: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
6550: 28 22 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 ("SCardDisconnec
6560: 74 28 25 6c 75 29 20 63 61 6c 6c 65 64 22 2c 20 t(%lu) called",
6570: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
6580: 69 64 78 29 3b 0a 0a 09 09 09 53 43 61 72 64 44 idx);.....SCardD
6590: 69 73 63 6f 6e 6e 65 63 74 28 63 61 63 6b 65 79 isconnect(cackey
65a0: 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 _slots[idx].pcsc
65b0: 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 _card, SCARD_LEA
65c0: 56 45 5f 43 41 52 44 29 3b 0a 09 09 7d 0a 0a 09 VE_CARD);...}...
65d0: 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 .if (cackey_slot
65e0: 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 29 20 7b 0a s[idx].label) {.
65f0: 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 ...free(cackey_s
6600: 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 29 lots[idx].label)
6610: 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f ;.....cackey_slo
6620: 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 20 3d 20 ts[idx].label =
6630: 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 NULL;...}....if
6640: 28 75 6e 69 74 69 61 6c 69 7a 65 5f 61 6c 6c 5f (unitialize_all_
6650: 72 65 61 64 65 72 73 20 7c 7c 20 21 63 61 63 6b readers || !cack
6660: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 61 63 ey_slots[idx].ac
6670: 74 69 76 65 29 20 7b 0a 09 09 09 69 66 20 28 63 tive) {....if (c
6680: 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d ackey_slots[idx]
6690: 2e 70 63 73 63 5f 72 65 61 64 65 72 29 20 7b 0a .pcsc_reader) {.
66a0: 09 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f ....free(cackey_
66b0: 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f slots[idx].pcsc_
66c0: 72 65 61 64 65 72 29 3b 0a 0a 09 09 09 09 63 61 reader);......ca
66d0: 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e ckey_slots[idx].
66e0: 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20 4e 55 pcsc_reader = NU
66f0: 4c 4c 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 LL;....}.....cac
6700: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 key_slots[idx].t
6710: 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f ransaction_need_
6720: 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09 09 hw_lock = 0;....
6730: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 cackey_slots[idx
6740: 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 ].transaction_de
6750: 70 74 68 20 3d 20 30 3b 0a 09 09 09 63 61 63 6b pth = 0;....cack
6760: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 69 64 ey_slots[idx].id
6770: 5f 74 79 70 65 5f 68 69 6e 74 20 3d 20 43 41 43 _type_hint = CAC
6780: 4b 45 59 5f 49 44 5f 54 59 50 45 5f 55 4e 4b 4e KEY_ID_TYPE_UNKN
6790: 4f 57 4e 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a OWN;...} else {.
67a0: 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c ...if (cackey_sl
67b0: 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63 ots[idx].transac
67c0: 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29 20 tion_depth > 0)
67d0: 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f {.....cackey_slo
67e0: 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63 74 ts[idx].transact
67f0: 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b ion_need_hw_lock
6800: 20 3d 20 31 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a = 1;....}...}..
6810: 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 ..cackey_slots[i
6820: 64 78 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f dx].pcsc_card_co
6830: 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 nnected = 0;....
6840: 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 if (cackey_slots
6850: 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a [idx].active) {.
6860: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
6870: 50 52 49 4e 54 46 28 22 4d 61 72 6b 69 6e 67 20 PRINTF("Marking
6880: 61 63 74 69 76 65 20 73 6c 6f 74 20 25 6c 75 20 active slot %lu
6890: 61 73 20 62 65 69 6e 67 20 72 65 73 65 74 22 2c as being reset",
68a0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
68b0: 20 69 64 78 29 3b 0a 0a 09 09 09 63 61 63 6b 65 idx);.....cacke
68c0: 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 73 6c 6f y_slots[idx].slo
68d0: 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 09 7d t_reset = 1;...}
68e0: 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 ..}...CACKEY_DEB
68f0: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
6900: 6e 69 6e 67 22 29 3b 0a 0a 09 72 65 74 75 72 6e ning");...return
6910: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f ;.}../*. * SYNPO
6920: 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 SIS. * cacke
6930: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 70 63 73 y_ret cackey_pcs
6940: 63 5f 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 3b c_connect(void);
6950: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 . *. * ARGUMENTS
6960: 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a . * None. *.
6970: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a * RETURN VALUE.
6980: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 * CACKEY_PC
6990: 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 SC_S_OK
69a0: 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 On success. *
69b0: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f CACKEY_PCSC_E_
69c0: 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 GENERIC On er
69d0: 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a ror. *. * NOTES.
69e0: 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 * This func
69f0: 74 69 6f 6e 20 63 6f 6e 6e 65 63 74 73 20 74 6f tion connects to
6a00: 20 74 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e 65 the PC/SC Conne
6a10: 63 74 69 6f 6e 20 4d 61 6e 61 67 65 72 20 61 6e ction Manager an
6a20: 64 20 75 70 64 61 74 65 73 20 74 68 65 0a 20 2a d updates the. *
6a30: 20 20 20 20 20 67 6c 6f 62 61 6c 20 68 61 6e 64 global hand
6a40: 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 le.. *. */.stati
6a50: 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 c cackey_ret cac
6a60: 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 key_pcsc_connect
6a70: 28 76 6f 69 64 29 20 7b 0a 09 4c 4f 4e 47 20 73 (void) {..LONG s
6a80: 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 card_est_context
6a90: 5f 72 65 74 3b 0a 23 69 66 64 65 66 20 48 41 56 _ret;.#ifdef HAV
6aa0: 45 5f 53 43 41 52 44 49 53 56 41 4c 49 44 43 4f E_SCARDISVALIDCO
6ab0: 4e 54 45 58 54 0a 09 4c 4f 4e 47 20 73 63 61 72 NTEXT..LONG scar
6ac0: 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 3b 0a 23 d_isvalid_ret;.#
6ad0: 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 endif...CACKEY_D
6ae0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
6af0: 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61 led.");...if (ca
6b00: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 ckey_pcsc_handle
6b10: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 == NULL) {...ca
6b20: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 ckey_pcsc_handle
6b30: 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 = malloc(sizeof
6b40: 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 (*cackey_pcsc_ha
6b50: 6e 64 6c 65 29 29 3b 0a 09 09 69 66 20 28 63 61 ndle));...if (ca
6b60: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 ckey_pcsc_handle
6b70: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 43 == NULL) {....C
6b80: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
6b90: 54 46 28 22 43 61 6c 6c 20 74 6f 20 6d 61 6c 6c TF("Call to mall
6ba0: 6f 63 28 29 20 66 61 69 6c 65 64 2c 20 72 65 74 oc() failed, ret
6bb0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 urning in failur
6bc0: 65 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f e");.....cackey_
6bd0: 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 slots_disconnect
6be0: 5f 61 6c 6c 28 30 29 3b 0a 0a 09 09 09 72 65 74 _all(0);.....ret
6bf0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f urn(CACKEY_PCSC_
6c00: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a E_GENERIC);...}.
6c10: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
6c20: 50 52 49 4e 54 46 28 22 53 43 61 72 64 45 73 74 PRINTF("SCardEst
6c30: 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 29 20 ablishContext()
6c40: 63 61 6c 6c 65 64 22 29 3b 0a 09 09 73 63 61 72 called");...scar
6c50: 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 d_est_context_re
6c60: 74 20 3d 20 53 43 61 72 64 45 73 74 61 62 6c 69 t = SCardEstabli
6c70: 73 68 43 6f 6e 74 65 78 74 28 53 43 41 52 44 5f shContext(SCARD_
6c80: 53 43 4f 50 45 5f 53 59 53 54 45 4d 2c 20 4e 55 SCOPE_SYSTEM, NU
6c90: 4c 4c 2c 20 4e 55 4c 4c 2c 20 63 61 63 6b 65 79 LL, NULL, cackey
6ca0: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 _pcsc_handle);..
6cb0: 09 69 66 20 28 73 63 61 72 64 5f 65 73 74 5f 63 .if (scard_est_c
6cc0: 6f 6e 74 65 78 74 5f 72 65 74 20 21 3d 20 53 43 ontext_ret != SC
6cd0: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b ARD_S_SUCCESS) {
6ce0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
6cf0: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 20 74 6f _PRINTF("Call to
6d00: 20 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 SCardEstablishC
6d10: 6f 6e 74 65 78 74 20 66 61 69 6c 65 64 20 28 72 ontext failed (r
6d20: 65 74 75 72 6e 65 64 20 25 73 2f 25 6c 69 29 2c eturned %s/%li),
6d30: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 returning in fa
6d40: 69 6c 75 72 65 22 2c 20 43 41 43 4b 45 59 5f 44 ilure", CACKEY_D
6d50: 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 EBUG_FUNC_SCARDE
6d60: 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f RR_TO_STR(scard_
6d70: 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 est_context_ret)
6d80: 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 65 , (long) scard_e
6d90: 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 3b st_context_ret);
6da0: 0a 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 .....free(cackey
6db0: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 _pcsc_handle);..
6dc0: 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 ..cackey_pcsc_ha
6dd0: 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 ndle = NULL;....
6de0: 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 .cackey_slots_di
6df0: 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 30 29 3b sconnect_all(0);
6e00: 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b .....return(CACK
6e10: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 EY_PCSC_E_GENERI
6e20: 43 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 C);...}..}..#ifd
6e30: 65 66 20 48 41 56 45 5f 53 43 41 52 44 49 53 56 ef HAVE_SCARDISV
6e40: 41 4c 49 44 43 4f 4e 54 45 58 54 0a 09 43 41 43 ALIDCONTEXT..CAC
6e50: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
6e60: 28 22 53 43 61 72 64 49 73 56 61 6c 69 64 43 6f ("SCardIsValidCo
6e70: 6e 74 65 78 74 28 29 20 63 61 6c 6c 65 64 22 29 ntext() called")
6e80: 3b 0a 09 73 63 61 72 64 5f 69 73 76 61 6c 69 64 ;..scard_isvalid
6e90: 5f 72 65 74 20 3d 20 53 43 61 72 64 49 73 56 61 _ret = SCardIsVa
6ea0: 6c 69 64 43 6f 6e 74 65 78 74 28 2a 63 61 63 6b lidContext(*cack
6eb0: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b ey_pcsc_handle);
6ec0: 0a 09 69 66 20 28 73 63 61 72 64 5f 69 73 76 61 ..if (scard_isva
6ed0: 6c 69 64 5f 72 65 74 20 21 3d 20 53 43 41 52 44 lid_ret != SCARD
6ee0: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 _S_SUCCESS) {...
6ef0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
6f00: 4e 54 46 28 22 48 61 6e 64 6c 65 20 68 61 73 20 NTF("Handle has
6f10: 62 65 63 6f 6d 65 20 69 6e 76 61 6c 69 64 20 28 become invalid (
6f20: 53 43 61 72 64 49 73 56 61 6c 69 64 43 6f 6e 74 SCardIsValidCont
6f30: 65 78 74 20 3d 20 25 73 2f 25 6c 69 29 2c 20 74 ext = %s/%li), t
6f40: 72 79 69 6e 67 20 74 6f 20 72 65 2d 65 73 74 61 rying to re-esta
6f50: 62 6c 69 73 68 2e 2e 2e 22 2c 20 43 41 43 4b 45 blish...", CACKE
6f60: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 Y_DEBUG_FUNC_SCA
6f70: 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 RDERR_TO_STR(sca
6f80: 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 29 2c rd_isvalid_ret),
6f90: 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 69 73 (long) scard_is
6fa0: 76 61 6c 69 64 5f 72 65 74 29 3b 0a 0a 09 09 43 valid_ret);....C
6fb0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
6fc0: 54 46 28 22 53 43 61 72 64 45 73 74 61 62 6c 69 TF("SCardEstabli
6fd0: 73 68 43 6f 6e 74 65 78 74 28 29 20 63 61 6c 6c shContext() call
6fe0: 65 64 22 29 3b 0a 09 09 73 63 61 72 64 5f 65 73 ed");...scard_es
6ff0: 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 3d 20 t_context_ret =
7000: 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f SCardEstablishCo
7010: 6e 74 65 78 74 28 53 43 41 52 44 5f 53 43 4f 50 ntext(SCARD_SCOP
7020: 45 5f 53 59 53 54 45 4d 2c 20 4e 55 4c 4c 2c 20 E_SYSTEM, NULL,
7030: 4e 55 4c 4c 2c 20 63 61 63 6b 65 79 5f 70 63 73 NULL, cackey_pcs
7040: 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 69 66 20 c_handle);...if
7050: 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 (scard_est_conte
7060: 78 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f xt_ret != SCARD_
7070: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 S_SUCCESS) {....
7080: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
7090: 4e 54 46 28 22 43 61 6c 6c 20 74 6f 20 53 43 61 NTF("Call to SCa
70a0: 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 rdEstablishConte
70b0: 78 74 20 66 61 69 6c 65 64 20 28 72 65 74 75 72 xt failed (retur
70c0: 6e 65 64 20 25 73 2f 25 6c 69 29 2c 20 72 65 74 ned %s/%li), ret
70d0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 urning in failur
70e0: 65 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 e", CACKEY_DEBUG
70f0: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 _FUNC_SCARDERR_T
7100: 4f 5f 53 54 52 28 73 63 61 72 64 5f 65 73 74 5f O_STR(scard_est_
7110: 63 6f 6e 74 65 78 74 5f 72 65 74 29 2c 20 28 6c context_ret), (l
7120: 6f 6e 67 29 20 73 63 61 72 64 5f 65 73 74 5f 63 ong) scard_est_c
7130: 6f 6e 74 65 78 74 5f 72 65 74 29 3b 0a 0a 09 09 ontext_ret);....
7140: 09 66 72 65 65 28 63 61 63 6b 65 79 5f 70 63 73 .free(cackey_pcs
7150: 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 09 63 61 c_handle);....ca
7160: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 ckey_pcsc_handle
7170: 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 63 61 63 = NULL;.....cac
7180: 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e key_slots_discon
7190: 6e 65 63 74 5f 61 6c 6c 28 30 29 3b 0a 0a 09 09 nect_all(0);....
71a0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 .return(CACKEY_P
71b0: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a CSC_E_GENERIC);.
71c0: 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 ..}....CACKEY_DE
71d0: 42 55 47 5f 50 52 49 4e 54 46 28 22 48 61 6e 64 BUG_PRINTF("Hand
71e0: 6c 65 20 68 61 73 20 62 65 65 6e 20 72 65 2d 65 le has been re-e
71f0: 73 74 61 62 6c 69 73 68 65 64 22 29 3b 0a 09 7d stablished");..}
7200: 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 .#endif...CACKEY
7210: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 _DEBUG_PRINTF("S
7220: 75 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e 6e 65 ucessfully conne
7230: 63 74 65 64 20 74 6f 20 50 43 2f 53 43 2c 20 72 cted to PC/SC, r
7240: 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 eturning in succ
7250: 65 73 73 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 ess");...return(
7260: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b CACKEY_PCSC_S_OK
7270: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 );.}../*. * SYNP
7280: 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b OSIS. * cack
7290: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 70 63 ey_ret cackey_pc
72a0: 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 76 6f sc_disconnect(vo
72b0: 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d id);. *. * ARGUM
72c0: 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 ENTS. * None
72d0: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 . *. * RETURN VA
72e0: 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 LUE. * CACKE
72f0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 Y_PCSC_S_OK
7300: 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 On success.
7310: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 * CACKEY_PCS
7320: 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f C_E_GENERIC O
7330: 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f n error. *. * NO
7340: 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 TES. * This
7350: 66 75 6e 63 74 69 6f 6e 20 64 69 73 63 6f 6e 6e function disconn
7360: 65 63 74 73 20 66 72 6f 6d 20 74 68 65 20 50 43 ects from the PC
7370: 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 6d /SC Connection m
7380: 61 6e 61 67 65 72 20 61 6e 64 20 75 70 64 61 74 anager and updat
7390: 65 73 0a 20 2a 20 20 20 20 20 74 68 65 20 67 6c es. * the gl
73a0: 6f 62 61 6c 20 68 61 6e 64 6c 65 2e 0a 20 2a 0a obal handle.. *.
73b0: 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 */.static cacke
73c0: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 70 63 73 y_ret cackey_pcs
73d0: 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 76 6f 69 c_disconnect(voi
73e0: 64 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 d) {..LONG scard
73f0: 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72 65 74 _rel_context_ret
7400: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ;...CACKEY_DEBUG
7410: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
7420: 22 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 ");...if (cackey
7430: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 3d 20 _pcsc_handle ==
7440: 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e NULL) {...return
7450: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f (CACKEY_PCSC_S_O
7460: 4b 29 3b 0a 09 7d 0a 0a 09 73 63 61 72 64 5f 72 K);..}...scard_r
7470: 65 6c 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 3d el_context_ret =
7480: 20 53 43 61 72 64 52 65 6c 65 61 73 65 43 6f 6e SCardReleaseCon
7490: 74 65 78 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 text(*cackey_pcs
74a0: 63 5f 68 61 6e 64 6c 65 29 3b 0a 0a 09 69 66 20 c_handle);...if
74b0: 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e (cackey_pcsc_han
74c0: 64 6c 65 29 20 7b 0a 09 09 66 72 65 65 28 63 61 dle) {...free(ca
74d0: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 ckey_pcsc_handle
74e0: 29 3b 0a 09 0a 09 09 63 61 63 6b 65 79 5f 70 63 );.....cackey_pc
74f0: 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c sc_handle = NULL
7500: 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 63 61 72 64 ;..}...if (scard
7510: 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72 65 74 _rel_context_ret
7520: 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 != SCARD_S_SUCC
7530: 45 53 53 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 ESS) {...return(
7540: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 CACKEY_PCSC_E_GE
7550: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 63 61 63 NERIC);..}...cac
7560: 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e key_slots_discon
7570: 6e 65 63 74 5f 61 6c 6c 28 30 29 3b 0a 0a 09 72 nect_all(0);...r
7580: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 eturn(CACKEY_PCS
7590: 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 C_S_OK);.}../*.
75a0: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 * SYNPOSIS. *
75b0: 20 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 6d 61 void cackey_ma
75c0: 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 74 rk_slot_reset(st
75d0: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 ruct cackey_slot
75e0: 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 *slot);. *. * A
75f0: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 RGUMENTS. *
7600: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 None. *. * RETUR
7610: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e N VALUE. * N
7620: 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a one. *. * NOTES.
7630: 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 * This func
7640: 74 69 6f 6e 20 6d 61 72 6b 73 20 61 20 73 6c 6f tion marks a slo
7650: 74 20 68 61 73 20 68 61 76 69 6e 67 20 62 65 65 t has having bee
7660: 6e 20 72 65 73 65 74 2c 20 74 6f 20 6c 61 74 65 n reset, to late
7670: 72 20 62 65 20 63 6c 65 61 6e 65 64 20 75 70 2e r be cleaned up.
7680: 0a 20 2a 20 20 20 20 20 43 6c 65 61 6e 75 70 20 . * Cleanup
7690: 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65 only happens whe
76a0: 6e 20 61 20 50 4b 43 53 23 31 31 20 63 6c 69 65 n a PKCS#11 clie
76b0: 6e 74 20 63 61 6c 6c 73 20 43 5f 46 69 6e 64 4f nt calls C_FindO
76c0: 62 6a 65 63 74 73 49 6e 69 74 2e 0a 20 2a 0a 20 bjectsInit.. *.
76d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 */.static void c
76e0: 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f ackey_mark_slot_
76f0: 72 65 73 65 74 28 73 74 72 75 63 74 20 63 61 63 reset(struct cac
7700: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 key_slot *slot)
7710: 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 {..struct cackey
7720: 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a _pcsc_identity *
7730: 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 3b pcsc_identities;
7740: 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 ..unsigned long
7750: 6e 75 6d 5f 63 65 72 74 73 3b 0a 0a 09 69 66 20 num_certs;...if
7760: 28 73 6c 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b (slot == NULL) {
7770: 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 ...return;..}...
7780: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
7790: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a NTF("Called.");.
77a0: 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 70 63 73 63 ..if (slot->pcsc
77b0: 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 _card_connected)
77c0: 20 7b 0a 09 09 53 43 61 72 64 44 69 73 63 6f 6e {...SCardDiscon
77d0: 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f nect(slot->pcsc_
77e0: 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 card, SCARD_LEAV
77f0: 45 5f 43 41 52 44 29 3b 0a 09 7d 0a 0a 09 73 6c E_CARD);..}...sl
7800: 6f 74 2d 3e 73 6c 6f 74 5f 72 65 73 65 74 20 3d ot->slot_reset =
7810: 20 31 3b 0a 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 1;..slot->pcsc_
7820: 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d card_connected =
7830: 20 30 3b 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 0;..if (cackey_
7840: 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 3d 20 4e pin_command == N
7850: 55 4c 4c 29 20 7b 0a 09 09 73 6c 6f 74 2d 3e 74 ULL) {...slot->t
7860: 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 oken_flags = CKF
7870: 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b _LOGIN_REQUIRED;
7880: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 73 6c 6f ..} else {...slo
7890: 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d t->token_flags =
78a0: 20 30 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 3b 0;..}...return;
78b0: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 .}../*. * SYNPOS
78c0: 49 53 0a 20 2a 20 20 20 20 20 4c 4f 4e 47 20 63 IS. * LONG c
78d0: 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f ackey_reconnect_
78e0: 63 61 72 64 28 73 74 72 75 63 74 20 63 61 63 6b card(struct cack
78f0: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 44 ey_slot *slot, D
7900: 57 4f 52 44 20 64 65 66 61 75 6c 74 5f 70 72 6f WORD default_pro
7910: 74 6f 63 6f 6c 29 3b 0a 20 2a 0a 20 2a 20 41 52 tocol);. *. * AR
7920: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63 GUMENTS. * c
7930: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 ackey_slot *slot
7940: 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 . * Slot
7950: 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 to send command
7960: 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 44 s to. *. * D
7970: 57 4f 52 44 20 64 65 66 61 75 6c 74 5f 70 72 6f WORD default_pro
7980: 74 6f 63 6f 6c 0a 20 2a 20 20 20 20 20 20 20 20 tocol. *
7990: 20 50 72 6f 74 6f 63 6f 6c 20 74 6f 20 61 74 74 Protocol to att
79a0: 65 6d 70 74 20 66 69 72 73 74 0a 20 2a 0a 20 2a empt first. *. *
79b0: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a RETURN VALUE. *
79c0: 20 20 20 20 20 54 68 65 20 72 65 74 75 72 6e 20 The return
79d0: 76 61 6c 75 65 20 66 72 6f 6d 20 53 43 61 72 64 value from SCard
79e0: 52 65 63 6f 6e 6e 65 63 74 28 29 0a 20 2a 0a 20 Reconnect(). *.
79f0: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 * NOTES. * T
7a00: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 his function is
7a10: 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 a wrapper around
7a20: 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 SCardReconnect(
7a30: 29 0a 20 2a 0a 20 2a 20 20 20 20 20 54 68 65 20 ). *. * The
7a40: 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 SCardReconnect()
7a50: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 function call w
7a60: 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 66 69 ill be called fi
7a70: 72 73 74 20 77 69 74 68 20 74 68 65 0a 20 2a 20 rst with the. *
7a80: 20 20 20 20 64 77 50 72 65 66 65 72 72 65 64 50 dwPreferredP
7a90: 72 6f 74 6f 63 6f 6c 73 20 6f 66 20 22 64 65 66 rotocols of "def
7aa0: 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 22 2e 20 ault_protocol".
7ab0: 20 49 66 20 74 68 61 74 20 63 61 6c 6c 20 72 65 If that call re
7ac0: 74 75 72 6e 73 0a 20 2a 20 20 20 20 20 53 43 41 turns. * SCA
7ad0: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 RD_E_PROTO_MISMA
7ae0: 54 43 48 20 74 72 79 20 61 67 61 69 6e 20 77 69 TCH try again wi
7af0: 74 68 20 61 20 70 72 6f 74 6f 63 6f 6c 20 6f 66 th a protocol of
7b00: 20 54 3d 30 2c 20 61 6e 64 20 66 61 69 6c 69 6e T=0, and failin
7b10: 67 0a 20 2a 20 20 20 20 20 74 68 61 74 20 54 3d g. * that T=
7b20: 31 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 1.. *. */.static
7b30: 20 4c 4f 4e 47 20 63 61 63 6b 65 79 5f 72 65 63 LONG cackey_rec
7b40: 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 74 72 75 onnect_card(stru
7b50: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a ct cackey_slot *
7b60: 73 6c 6f 74 2c 20 44 57 4f 52 44 20 64 65 66 61 slot, DWORD defa
7b70: 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 29 20 7b 0a ult_protocol) {.
7b80: 09 44 57 4f 52 44 20 73 65 6c 65 63 74 65 64 5f .DWORD selected_
7b90: 70 72 6f 74 6f 63 6f 6c 3b 0a 09 4c 4f 4e 47 20 protocol;..LONG
7ba0: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 3b 0a scard_conn_ret;.
7bb0: 0a 09 73 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f ..selected_proto
7bc0: 63 6f 6c 20 3d 20 30 3b 0a 0a 09 73 63 61 72 64 col = 0;...scard
7bd0: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 _conn_ret = SCar
7be0: 64 52 65 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d dReconnect(slot-
7bf0: 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 >pcsc_card, SCAR
7c00: 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20 D_SHARE_SHARED,
7c10: 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c default_protocol
7c20: 2c 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41 , SCARD_RESET_CA
7c30: 52 44 2c 20 26 73 65 6c 65 63 74 65 64 5f 70 72 RD, &selected_pr
7c40: 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 69 66 20 28 73 otocol);...if (s
7c50: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d card_conn_ret ==
7c60: 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d SCARD_E_PROTO_M
7c70: 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 43 41 43 ISMATCH) {...CAC
7c80: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
7c90: 28 22 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 ("SCardReconnect
7ca0: 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 () returned SCAR
7cb0: 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 D_E_PROTO_MISMAT
7cc0: 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20 CH, trying with
7cd0: 6a 75 73 74 20 54 3d 30 22 29 0a 09 09 73 63 61 just T=0")...sca
7ce0: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 rd_conn_ret = SC
7cf0: 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 73 6c 6f ardReconnect(slo
7d00: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 t->pcsc_card, SC
7d10: 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 ARD_SHARE_SHARED
7d20: 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c , SCARD_PROTOCOL
7d30: 5f 54 30 2c 20 53 43 41 52 44 5f 52 45 53 45 54 _T0, SCARD_RESET
7d40: 5f 43 41 52 44 2c 20 26 73 65 6c 65 63 74 65 64 _CARD, &selected
7d50: 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 69 _protocol);....i
7d60: 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 f (scard_conn_re
7d70: 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f t == SCARD_E_PRO
7d80: 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 TO_MISMATCH) {..
7d90: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
7da0: 52 49 4e 54 46 28 22 53 43 61 72 64 52 65 63 6f RINTF("SCardReco
7db0: 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 nnect() returned
7dc0: 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d SCARD_E_PROTO_M
7dd0: 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20 ISMATCH, trying
7de0: 77 69 74 68 20 6a 75 73 74 20 54 3d 31 22 29 0a with just T=1").
7df0: 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 ...scard_conn_re
7e00: 74 20 3d 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 t = SCardReconne
7e10: 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 ct(slot->pcsc_ca
7e20: 72 64 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f rd, SCARD_SHARE_
7e30: 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52 SHARED, SCARD_PR
7e40: 4f 54 4f 43 4f 4c 5f 54 31 2c 20 53 43 41 52 44 OTOCOL_T1, SCARD
7e50: 5f 52 45 53 45 54 5f 43 41 52 44 2c 20 26 73 65 _RESET_CARD, &se
7e60: 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 29 lected_protocol)
7e70: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 73 ;...}..}...if (s
7e80: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d card_conn_ret ==
7e90: 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 SCARD_S_SUCCESS
7ea0: 29 20 7b 0a 09 09 73 6c 6f 74 2d 3e 70 72 6f 74 ) {...slot->prot
7eb0: 6f 63 6f 6c 20 3d 20 73 65 6c 65 63 74 65 64 5f ocol = selected_
7ec0: 70 72 6f 74 6f 63 6f 6c 3b 0a 09 7d 0a 0a 09 72 protocol;..}...r
7ed0: 65 74 75 72 6e 28 73 63 61 72 64 5f 63 6f 6e 6e eturn(scard_conn
7ee0: 5f 72 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 _ret);.}../*. *
7ef0: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 SYNPOSIS. *
7f00: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 cackey_ret cacke
7f10: 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 y_connect_card(s
7f20: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f truct cackey_slo
7f30: 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20 t *slot);. *. *
7f40: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 ARGUMENTS. *
7f50: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c cackey_slot *sl
7f60: 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c ot. * Sl
7f70: 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 ot to send comma
7f80: 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45 54 nds to. *. * RET
7f90: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 URN VALUE. *
7fa0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f CACKEY_PCSC_S_O
7fb0: 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 K On suc
7fc0: 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b cess. * CACK
7fd0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 EY_PCSC_E_GENERI
7fe0: 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a C On error. *
7ff0: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 . * NOTES. *
8000: 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 None. *. */.sta
8010: 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 tic cackey_ret c
8020: 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 ackey_connect_ca
8030: 72 64 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 rd(struct cackey
8040: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 _slot *slot) {..
8050: 63 61 63 6b 65 79 5f 72 65 74 20 70 63 73 63 5f cackey_ret pcsc_
8060: 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 44 57 connect_ret;..DW
8070: 4f 52 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 4c ORD protocol;..L
8080: 4f 4e 47 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 ONG scard_conn_r
8090: 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 et;...CACKEY_DEB
80a0: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
80b0: 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c 6f d.");...if (!slo
80c0: 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 t) {...CACKEY_DE
80d0: 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 BUG_PRINTF("Inva
80e0: 6c 69 64 20 73 6c 6f 74 20 73 70 65 63 69 66 69 lid slot specifi
80f0: 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e ed, returning in
8100: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 failure");....r
8110: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 eturn(CACKEY_PCS
8120: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d C_E_GENERIC);..}
8130: 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f ...pcsc_connect_
8140: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70 63 73 ret = cackey_pcs
8150: 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 69 66 c_connect();..if
8160: 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 (pcsc_connect_r
8170: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 et != CACKEY_PCS
8180: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b C_S_OK) {...CACK
8190: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
81a0: 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 50 "Connection to P
81b0: 43 2f 53 43 20 66 61 69 6c 65 64 2c 20 72 65 74 C/SC failed, ret
81c0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 urning in failur
81d0: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 e");....return(C
81e0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e ACKEY_PCSC_E_GEN
81f0: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 ERIC);..}.../* C
8200: 6f 6e 6e 65 63 74 20 74 6f 20 72 65 61 64 65 72 onnect to reader
8210: 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 09 , if needed */..
8220: 69 66 20 28 21 73 6c 6f 74 2d 3e 70 63 73 63 5f if (!slot->pcsc_
8230: 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 card_connected)
8240: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
8250: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f _PRINTF("SCardCo
8260: 6e 6e 65 63 74 28 25 73 29 20 63 61 6c 6c 65 64 nnect(%s) called
8270: 20 66 6f 72 20 73 6c 6f 74 20 25 70 22 2c 20 73 for slot %p", s
8280: 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 lot->pcsc_reader
8290: 2c 20 73 6c 6f 74 29 3b 0a 09 09 73 63 61 72 64 , slot);...scard
82a0: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 _conn_ret = SCar
82b0: 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 dConnect(*cackey
82c0: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c _pcsc_handle, sl
82d0: 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c ot->pcsc_reader,
82e0: 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 SCARD_SHARE_SHA
82f0: 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f RED, SCARD_PROTO
8300: 43 4f 4c 5f 54 30 20 7c 20 53 43 41 52 44 5f 50 COL_T0 | SCARD_P
8310: 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f ROTOCOL_T1, &slo
8320: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70 t->pcsc_card, &p
8330: 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 69 66 20 rotocol);....if
8340: 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 (scard_conn_ret
8350: 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f == SCARD_E_PROTO
8360: 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 09 _MISMATCH) {....
8370: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
8380: 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 NTF("SCardConnec
8390: 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 t() returned SCA
83a0: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 RD_E_PROTO_MISMA
83b0: 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68 TCH, trying with
83c0: 20 6a 75 73 74 20 54 3d 30 22 29 0a 09 09 09 73 just T=0")....s
83d0: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 card_conn_ret =
83e0: 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 SCardConnect(*ca
83f0: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 ckey_pcsc_handle
8400: 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 , slot->pcsc_rea
8410: 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45 der, SCARD_SHARE
8420: 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 _SHARED, SCARD_P
8430: 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20 26 73 6c 6f ROTOCOL_T0, &slo
8440: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70 t->pcsc_card, &p
8450: 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 09 69 66 rotocol);.....if
8460: 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 (scard_conn_ret
8470: 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 == SCARD_E_PROT
8480: 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 O_MISMATCH) {...
8490: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
84a0: 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e RINTF("SCardConn
84b0: 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 ect() returned S
84c0: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 CARD_E_PROTO_MIS
84d0: 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69 MATCH, trying wi
84e0: 74 68 20 6a 75 73 74 20 54 3d 31 22 29 0a 09 09 th just T=1")...
84f0: 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 ..scard_conn_ret
8500: 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 = SCardConnect(
8510: 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e *cackey_pcsc_han
8520: 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f dle, slot->pcsc_
8530: 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48 reader, SCARD_SH
8540: 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52 ARE_SHARED, SCAR
8550: 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 D_PROTOCOL_T1, &
8560: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c slot->pcsc_card,
8570: 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09 &protocol);....
8580: 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 63 61 }...}....if (sca
8590: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 rd_conn_ret == S
85a0: 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44 CARD_W_UNPOWERED
85b0: 5f 43 41 52 44 29 20 7b 0a 09 09 09 43 41 43 4b _CARD) {....CACK
85c0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
85d0: 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 "SCardConnect()
85e0: 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 57 returned SCARD_W
85f0: 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41 52 44 2c _UNPOWERED_CARD,
8600: 20 74 72 79 69 6e 67 20 74 6f 20 72 65 2d 63 6f trying to re-co
8610: 6e 6e 65 63 74 2e 2e 2e 22 29 3b 0a 0a 09 09 09 nnect...");.....
8620: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d scard_conn_ret =
8630: 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 SCardConnect(*c
8640: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c ackey_pcsc_handl
8650: 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 e, slot->pcsc_re
8660: 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 ader, SCARD_SHAR
8670: 45 5f 44 49 52 45 43 54 2c 20 53 43 41 52 44 5f E_DIRECT, SCARD_
8680: 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 PROTOCOL_T0 | SC
8690: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c ARD_PROTOCOL_T1,
86a0: 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 &slot->pcsc_car
86b0: 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a d, &protocol);..
86c0: 09 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e ...if (scard_con
86d0: 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 n_ret == SCARD_E
86e0: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 _PROTO_MISMATCH)
86f0: 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 {.....CACKEY_DE
8700: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 BUG_PRINTF("SCar
8710: 64 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72 dConnect() retur
8720: 6e 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 ned SCARD_E_PROT
8730: 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69 O_MISMATCH, tryi
8740: 6e 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d 30 ng with just T=0
8750: 22 29 0a 09 09 09 09 73 63 61 72 64 5f 63 6f 6e ").....scard_con
8760: 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e n_ret = SCardCon
8770: 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 nect(*cackey_pcs
8780: 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e c_handle, slot->
8790: 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41 pcsc_reader, SCA
87a0: 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c RD_SHARE_SHARED,
87b0: 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f SCARD_PROTOCOL_
87c0: 54 30 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f T0, &slot->pcsc_
87d0: 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 card, &protocol)
87e0: 3b 0a 0a 09 09 09 09 69 66 20 28 73 63 61 72 64 ;......if (scard
87f0: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 _conn_ret == SCA
8800: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 RD_E_PROTO_MISMA
8810: 54 43 48 29 20 7b 0a 09 09 09 09 09 43 41 43 4b TCH) {......CACK
8820: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
8830: 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 "SCardConnect()
8840: 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45 returned SCARD_E
8850: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c _PROTO_MISMATCH,
8860: 20 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73 trying with jus
8870: 74 20 54 3d 31 22 29 0a 09 09 09 09 09 73 63 61 t T=1")......sca
8880: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 rd_conn_ret = SC
8890: 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b ardConnect(*cack
88a0: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 ey_pcsc_handle,
88b0: 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 slot->pcsc_reade
88c0: 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 r, SCARD_SHARE_S
88d0: 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f HARED, SCARD_PRO
88e0: 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74 2d TOCOL_T1, &slot-
88f0: 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f >pcsc_card, &pro
8900: 74 6f 63 6f 6c 29 3b 0a 09 09 09 09 7d 0a 09 09 tocol);.....}...
8910: 09 7d 0a 0a 09 09 09 73 63 61 72 64 5f 63 6f 6e .}.....scard_con
8920: 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 n_ret = cackey_r
8930: 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c econnect_card(sl
8940: 6f 74 2c 20 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 ot, protocol);..
8950: 09 7d 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f .}....if (scard_
8960: 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 conn_ret == SCAR
8970: 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45 29 20 D_E_NO_SERVICE)
8980: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {....CACKEY_DEBU
8990: 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 43 G_PRINTF("SCardC
89a0: 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 onnect() returne
89b0: 64 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 45 52 d SCARD_E_NO_SER
89c0: 56 49 43 45 20 2d 2d 20 77 68 69 63 68 20 63 6f VICE -- which co
89d0: 75 6c 64 20 6d 65 61 6e 20 6f 75 72 20 68 61 6e uld mean our han
89e0: 64 6c 65 20 69 73 20 69 6e 76 61 6c 69 64 2c 20 dle is invalid,
89f0: 77 69 6c 6c 20 74 72 79 20 74 6f 20 72 65 63 6f will try to reco
8a00: 6e 6e 65 63 74 20 74 6f 20 50 43 2f 53 43 20 73 nnect to PC/SC s
8a10: 65 72 76 69 63 65 22 29 3b 0a 0a 09 09 09 63 61 ervice");.....ca
8a20: 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e ckey_pcsc_discon
8a30: 6e 65 63 74 28 29 3b 0a 0a 09 09 09 63 61 63 6b nect();.....cack
8a40: 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 ey_pcsc_connect(
8a50: 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 6d 61 );.....cackey_ma
8a60: 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c rk_slot_reset(sl
8a70: 6f 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 ot);.....return(
8a80: 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 cackey_connect_c
8a90: 61 72 64 28 73 6c 6f 74 29 29 3b 0a 09 09 7d 0a ard(slot));...}.
8aa0: 0a 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e ...if (scard_con
8ab0: 6e 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 n_ret != SCARD_S
8ac0: 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 43 _SUCCESS) {....C
8ad0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
8ae0: 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 TF("Connection t
8af0: 6f 20 63 61 72 64 20 66 61 69 6c 65 64 2c 20 72 o card failed, r
8b00: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c eturning in fail
8b10: 75 72 65 20 28 53 43 61 72 64 43 6f 6e 6e 65 63 ure (SCardConnec
8b20: 74 28 29 20 3d 20 25 73 2f 25 6c 69 29 22 2c 20 t() = %s/%li)",
8b30: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e CACKEY_DEBUG_FUN
8b40: 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 C_SCARDERR_TO_ST
8b50: 52 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 R(scard_conn_ret
8b60: 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f ), (long) scard_
8b70: 63 6f 6e 6e 5f 72 65 74 29 3b 0a 0a 09 09 09 72 conn_ret);.....r
8b80: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 eturn(CACKEY_PCS
8b90: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 C_E_GENERIC);...
8ba0: 7d 0a 0a 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f }....slot->pcsc_
8bb0: 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d card_connected =
8bc0: 20 31 3b 0a 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 1;...slot->tran
8bd0: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 saction_depth =
8be0: 30 3b 0a 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 0;...slot->trans
8bf0: 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c action_need_hw_l
8c00: 6f 63 6b 20 3d 20 30 3b 0a 09 09 73 6c 6f 74 2d ock = 0;...slot-
8c10: 3e 70 72 6f 74 6f 63 6f 6c 20 3d 20 70 72 6f 74 >protocol = prot
8c20: 6f 63 6f 6c 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 ocol;..}...CACKE
8c30: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
8c40: 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 Returning in suc
8c50: 63 65 73 73 22 29 3b 0a 0a 09 72 65 74 75 72 6e cess");...return
8c60: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f (CACKEY_PCSC_S_O
8c70: 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e K);.}../*. * SYN
8c80: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 POSIS. * cac
8c90: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 62 key_ret cackey_b
8ca0: 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e egin_transaction
8cb0: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 (struct cackey_s
8cc0: 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 lot *slot);. *.
8cd0: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 * ARGUMENTS. *
8ce0: 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a cackey_slot *
8cf0: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 slot. *
8d00: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d Slot to send com
8d10: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 mands to. *. * R
8d20: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 ETURN VALUE. *
8d30: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 CACKEY_PCSC_S
8d40: 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 _OK On s
8d50: 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 uccess. * CA
8d60: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 CKEY_PCSC_E_GENE
8d70: 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a RIC On error.
8d80: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 *. * NOTES. *
8d90: 20 20 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 The transacti
8da0: 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 74 65 72 on should be ter
8db0: 6d 69 6e 61 74 65 64 20 75 73 69 6e 67 20 22 63 minated using "c
8dc0: 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 ackey_end_transa
8dd0: 63 74 69 6f 6e 22 0a 20 2a 0a 20 2a 2f 0a 73 74 ction". *. */.st
8de0: 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 atic cackey_ret
8df0: 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 cackey_begin_tra
8e00: 6e 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20 nsaction(struct
8e10: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f cackey_slot *slo
8e20: 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f 72 65 74 t) {..cackey_ret
8e30: 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74 cackey_conn_ret
8e40: 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 74 72 ;..LONG scard_tr
8e50: 61 6e 73 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 ans_ret;...CACKE
8e60: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
8e70: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 63 61 63 Called.");...cac
8e80: 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 key_conn_ret = c
8e90: 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 ackey_connect_ca
8ea0: 72 64 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28 63 rd(slot);..if (c
8eb0: 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74 20 21 ackey_conn_ret !
8ec0: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f = CACKEY_PCSC_S_
8ed0: 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 OK) {...CACKEY_D
8ee0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 EBUG_PRINTF("Una
8ef0: 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74 ble to connect t
8f00: 6f 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e o card, returnin
8f10: 67 20 69 6e 20 65 72 72 6f 72 22 29 3b 0a 0a 09 g in error");...
8f20: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 .return(CACKEY_P
8f30: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a CSC_E_GENERIC);.
8f40: 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 .}...slot->trans
8f50: 61 63 74 69 6f 6e 5f 64 65 70 74 68 2b 2b 3b 0a action_depth++;.
8f60: 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e ..if (slot->tran
8f70: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 saction_depth >
8f80: 31 20 26 26 20 21 73 6c 6f 74 2d 3e 74 72 61 6e 1 && !slot->tran
8f90: 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f saction_need_hw_
8fa0: 6c 6f 63 6b 29 20 7b 0a 09 09 43 41 43 4b 45 59 lock) {...CACKEY
8fb0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 _DEBUG_PRINTF("A
8fc0: 6c 72 65 61 64 79 20 69 6e 20 61 20 74 72 61 6e lready in a tran
8fd0: 73 61 63 74 69 6f 6e 2c 20 70 65 72 66 6f 72 6d saction, perform
8fe0: 69 6e 67 20 6e 6f 20 61 63 74 69 6f 6e 20 28 6e ing no action (n
8ff0: 65 77 20 64 65 70 74 68 20 3d 20 25 69 29 22 2c ew depth = %i)",
9000: 20 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 slot->transacti
9010: 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a 09 09 72 65 on_depth);....re
9020: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 turn(CACKEY_PCSC
9030: 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 6c 6f _S_OK);..}...slo
9040: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e t->transaction_n
9050: 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b eed_hw_lock = 0;
9060: 0a 0a 09 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 ...scard_trans_r
9070: 65 74 20 3d 20 53 43 61 72 64 42 65 67 69 6e 54 et = SCardBeginT
9080: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 2d ransaction(slot-
9090: 3e 70 63 73 63 5f 63 61 72 64 29 3b 0a 09 69 66 >pcsc_card);..if
90a0: 20 28 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 (scard_trans_re
90b0: 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 t != SCARD_S_SUC
90c0: 43 45 53 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 CESS) {...CACKEY
90d0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 _DEBUG_PRINTF("U
90e0: 6e 61 62 6c 65 20 74 6f 20 62 65 67 69 6e 20 74 nable to begin t
90f0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 75 ransaction, retu
9100: 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29 rning in error")
9110: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b ;....return(CACK
9120: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 EY_PCSC_E_GENERI
9130: 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f C);..}...CACKEY_
9140: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75 DEBUG_PRINTF("Su
9150: 63 65 73 73 66 75 6c 6c 79 20 62 65 67 61 6e 20 cessfully began
9160: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 73 transaction on s
9170: 6c 6f 74 20 28 25 73 29 22 2c 20 73 6c 6f 74 2d lot (%s)", slot-
9180: 3e 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 0a >pcsc_reader);..
9190: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 .return(CACKEY_P
91a0: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a CSC_S_OK);.}../*
91b0: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 . * SYNPOSIS. *
91c0: 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 cackey_ret c
91d0: 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 ackey_end_transa
91e0: 63 74 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63 ction(struct cac
91f0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b key_slot *slot);
9200: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 . *. * ARGUMENTS
9210: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 . * cackey_s
9220: 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 lot *slot. *
9230: 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e Slot to sen
9240: 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a d commands to. *
9250: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 . * RETURN VALUE
9260: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 . * CACKEY_P
9270: 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 CSC_S_OK
9280: 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 On success. *
9290: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 CACKEY_PCSC_E
92a0: 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 _GENERIC On e
92b0: 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 rror. *. * NOTES
92c0: 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e . * This fun
92d0: 63 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 22 ction requires "
92e0: 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 cackey_begin_tra
92f0: 6e 73 61 63 74 69 6f 6e 22 20 74 6f 20 62 65 20 nsaction" to be
9300: 63 61 6c 6c 65 64 20 66 69 72 73 74 0a 20 2a 0a called first. *.
9310: 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 */.static cacke
9320: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 65 6e 64 y_ret cackey_end
9330: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 _transaction(str
9340: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 uct cackey_slot
9350: 2a 73 6c 6f 74 29 20 7b 0a 09 4c 4f 4e 47 20 73 *slot) {..LONG s
9360: 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 3b 0a card_trans_ret;.
9370: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
9380: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
9390: 3b 0a 0a 09 69 66 20 28 21 73 6c 6f 74 2d 3e 70 ;...if (!slot->p
93a0: 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 csc_card_connect
93b0: 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...CACKEY_D
93c0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 72 EBUG_PRINTF("Car
93d0: 64 20 69 73 20 6e 6f 74 20 63 6f 6e 6e 65 63 74 d is not connect
93e0: 65 64 2c 20 75 6e 61 62 6c 65 20 74 6f 20 65 6e ed, unable to en
93f0: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e d transaction on
9400: 20 63 61 72 64 22 29 3b 0a 0a 09 09 69 66 20 28 card");....if (
9410: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f slot->transactio
9420: 6e 5f 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 n_depth > 0) {..
9430: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
9440: 52 49 4e 54 46 28 22 44 65 63 72 65 61 73 69 6e RINTF("Decreasin
9450: 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 65 g transaction de
9460: 70 74 68 20 61 6e 64 20 61 73 6b 69 6e 67 20 66 pth and asking f
9470: 6f 72 20 61 20 68 61 72 64 77 61 72 65 20 6c 6f or a hardware lo
9480: 63 6b 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 62 ck on the next b
9490: 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e egin transaction
94a0: 20 28 63 75 72 72 65 6e 74 20 64 65 70 74 68 20 (current depth
94b0: 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72 = %i)", slot->tr
94c0: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 29 ansaction_depth)
94d0: 3b 0a 0a 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e ;.....slot->tran
94e0: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b saction_depth--;
94f0: 0a 0a 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74 .....if (slot->t
9500: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 ransaction_depth
9510: 20 3e 20 30 29 20 7b 0a 09 09 09 09 73 6c 6f 74 > 0) {.....slot
9520: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 ->transaction_ne
9530: 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 31 3b 0a ed_hw_lock = 1;.
9540: 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 72 65 74 75 ...}...}....retu
9550: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 rn(CACKEY_PCSC_E
9560: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 _GENERIC);..}...
9570: 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 if (slot->transa
9580: 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 3d 20 30 ction_depth == 0
9590: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
95a0: 55 47 5f 50 52 49 4e 54 46 28 22 54 65 72 6d 69 UG_PRINTF("Termi
95b0: 6e 61 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 nating a transac
95c0: 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 6e 6f tion that has no
95d0: 74 20 62 65 67 75 6e 21 22 29 3b 0a 0a 09 09 72 t begun!");....r
95e0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 eturn(CACKEY_PCS
95f0: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d C_E_GENERIC);..}
9600: 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 ...slot->transac
9610: 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 0a 09 tion_depth--;...
9620: 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 if (slot->transa
9630: 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29 ction_depth > 0)
9640: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
9650: 47 5f 50 52 49 4e 54 46 28 22 54 72 61 6e 73 61 G_PRINTF("Transa
9660: 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 69 6e 20 ctions still in
9670: 70 72 6f 67 72 65 73 73 2c 20 6e 6f 74 20 74 65 progress, not te
9680: 72 6d 69 6e 61 74 69 6e 67 20 6f 6e 2d 63 61 72 rminating on-car
9690: 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 28 63 d Transaction (c
96a0: 75 72 72 65 6e 74 20 64 65 70 74 68 20 3d 20 25 urrent depth = %
96b0: 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e 73 i)", slot->trans
96c0: 61 63 74 69 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a action_depth);..
96d0: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f ..return(CACKEY_
96e0: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a PCSC_S_OK);..}..
96f0: 09 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 .scard_trans_ret
9700: 20 3d 20 53 43 61 72 64 45 6e 64 54 72 61 6e 73 = SCardEndTrans
9710: 61 63 74 69 6f 6e 28 73 6c 6f 74 2d 3e 70 63 73 action(slot->pcs
9720: 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 c_card, SCARD_LE
9730: 41 56 45 5f 43 41 52 44 29 3b 0a 09 69 66 20 28 AVE_CARD);..if (
9740: 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 20 scard_trans_ret
9750: 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 != SCARD_S_SUCCE
9760: 53 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 SS) {...CACKEY_D
9770: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 EBUG_PRINTF("Una
9780: 62 6c 65 20 74 6f 20 65 6e 64 20 74 72 61 6e 73 ble to end trans
9790: 61 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e 69 6e action, returnin
97a0: 67 20 69 6e 20 65 72 72 6f 72 22 29 3b 0a 0a 09 g in error");...
97b0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 .return(CACKEY_P
97c0: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a CSC_E_GENERIC);.
97d0: 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 .}...CACKEY_DEBU
97e0: 47 5f 50 52 49 4e 54 46 28 22 53 75 63 65 73 73 G_PRINTF("Sucess
97f0: 66 75 6c 6c 79 20 74 65 72 6d 69 6e 61 74 65 64 fully terminated
9800: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 transaction on
9810: 73 6c 6f 74 20 28 25 73 29 22 2c 20 73 6c 6f 74 slot (%s)", slot
9820: 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a ->pcsc_reader);.
9830: 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f ..return(CACKEY_
9840: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f PCSC_S_OK);.}../
9850: 2a 20 41 50 44 55 20 52 65 6c 61 74 65 64 20 46 * APDU Related F
9860: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20 unctions */./*.
9870: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 * SYNPOSIS. *
9880: 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 cackey_ret cac
9890: 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 74 key_send_apdu(st
98a0: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 ruct cackey_slot
98b0: 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 *slot, unsigned
98c0: 20 63 68 61 72 20 63 6c 61 73 73 2c 20 75 6e 73 char class, uns
98d0: 69 67 6e 65 64 20 63 68 61 72 20 69 6e 73 74 72 igned char instr
98e0: 75 63 74 69 6f 6e 2c 20 75 6e 73 69 67 6e 65 64 uction, unsigned
98f0: 20 63 68 61 72 20 70 31 2c 20 75 6e 73 69 67 6e char p1, unsign
9900: 65 64 20 63 68 61 72 20 70 32 2c 20 75 6e 73 69 ed char p2, unsi
9910: 67 6e 65 64 20 63 68 61 72 20 6c 63 2c 20 75 6e gned char lc, un
9920: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 signed char *dat
9930: 61 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 a, unsigned char
9940: 20 6c 65 2c 20 75 69 6e 74 31 36 5f 74 20 2a 72 le, uint16_t *r
9950: 65 73 70 63 6f 64 65 2c 20 75 6e 73 69 67 6e 65 espcode, unsigne
9960: 64 20 63 68 61 72 20 2a 72 65 73 70 64 61 74 61 d char *respdata
9970: 2c 20 73 69 7a 65 5f 74 20 2a 72 65 73 70 64 61 , size_t *respda
9980: 74 61 5f 6c 65 6e 29 3b 0a 20 2a 0a 20 2a 20 41 ta_len);. *. * A
9990: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 RGUMENTS. *
99a0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f cackey_slot *slo
99b0: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f t. * Slo
99c0: 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e t to send comman
99d0: 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 ds to. *. *
99e0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6c unsigned char cl
99f0: 61 73 73 0a 20 2a 20 20 20 20 20 20 20 20 20 41 ass. * A
9a00: 50 44 55 20 43 6c 61 73 73 20 28 47 53 43 49 53 PDU Class (GSCIS
9a10: 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 20 6f _CLASS_ISO7816 o
9a20: 72 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c r GSCIS_CLASS_GL
9a30: 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 0a 20 2a OBAL_PLATFORM. *
9a40: 20 20 20 20 20 20 20 20 20 75 73 75 61 6c 6c 79 usually
9a50: 29 2c 20 28 43 4c 41 29 0a 20 2a 0a 20 2a 20 20 ), (CLA). *. *
9a60: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 unsigned char
9a70: 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 2a 20 instruction. *
9a80: 20 20 20 20 20 20 20 20 41 50 44 55 20 49 6e 73 APDU Ins
9a90: 74 72 75 63 74 69 6f 6e 20 28 49 4e 53 29 0a 20 truction (INS).
9aa0: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 *. * unsigne
9ab0: 64 20 63 68 61 72 20 70 31 0a 20 2a 20 20 20 20 d char p1. *
9ac0: 20 20 20 20 20 41 50 44 55 20 50 61 72 61 6d 65 APDU Parame
9ad0: 74 65 72 20 31 20 28 50 31 29 0a 20 2a 0a 20 2a ter 1 (P1). *. *
9ae0: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 unsigned ch
9af0: 61 72 20 70 32 0a 20 2a 20 20 20 20 20 20 20 20 ar p2. *
9b00: 20 41 50 44 55 20 50 61 72 61 6d 65 74 65 72 20 APDU Parameter
9b10: 32 20 28 50 32 29 0a 20 2a 0a 20 2a 20 20 20 20 2 (P2). *. *
9b20: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c unsigned char l
9b30: 63 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 c. * APD
9b40: 55 20 4c 65 6e 67 74 68 20 6f 66 20 43 6f 6e 74 U Length of Cont
9b50: 65 6e 74 20 28 4c 63 29 20 2d 2d 20 74 68 69 73 ent (Lc) -- this
9b60: 20 69 73 20 74 68 65 20 6c 65 6e 67 74 68 20 6f is the length o
9b70: 66 20 22 64 61 74 61 22 0a 20 2a 20 20 20 20 20 f "data". *
9b80: 20 20 20 20 70 61 72 61 6d 65 74 65 72 2e 20 20 parameter.
9b90: 49 66 20 22 64 61 74 61 22 20 69 73 20 73 70 65 If "data" is spe
9ba0: 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 cified as NULL,
9bb0: 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 77 this parameter w
9bc0: 69 6c 6c 0a 20 2a 20 20 20 20 20 20 20 20 20 62 ill. * b
9bd0: 65 20 69 67 6e 6f 72 65 64 2e 0a 20 2a 0a 20 2a e ignored.. *. *
9be0: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 unsigned ch
9bf0: 61 72 20 2a 64 61 74 61 0a 20 2a 20 20 20 20 20 ar *data. *
9c00: 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 Pointer to b
9c10: 75 66 66 65 72 20 74 6f 20 73 65 6e 64 2e 20 20 uffer to send.
9c20: 49 74 20 73 68 6f 75 6c 64 20 62 65 20 22 4c 63 It should be "Lc
9c30: 22 20 62 79 74 65 73 20 6c 6f 6e 67 2e 20 20 49 " bytes long. I
9c40: 66 0a 20 2a 20 20 20 20 20 20 20 20 20 73 70 65 f. * spe
9c50: 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 cified as NULL,
9c60: 22 4c 63 22 20 77 69 6c 6c 20 6e 6f 74 20 62 65 "Lc" will not be
9c70: 20 73 65 6e 74 2c 20 61 6e 64 20 74 68 69 73 20 sent, and this
9c80: 62 75 66 66 65 72 20 77 69 6c 6c 20 62 65 0a 20 buffer will be.
9c90: 2a 20 20 20 20 20 20 20 20 20 69 67 6e 6f 72 65 * ignore
9ca0: 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 d.. *. * uns
9cb0: 69 67 6e 65 64 20 63 68 61 72 20 6c 65 0a 20 2a igned char le. *
9cc0: 20 20 20 20 20 20 20 20 20 41 50 44 55 20 4c 65 APDU Le
9cd0: 6e 67 74 68 20 6f 66 20 45 78 70 65 63 74 61 74 ngth of Expectat
9ce0: 69 6f 6e 20 28 4c 65 29 20 2d 2d 20 74 68 69 73 ion (Le) -- this
9cf0: 20 69 73 20 74 68 65 20 6c 65 6e 67 74 68 20 6f is the length o
9d00: 66 20 74 68 65 0a 20 2a 20 20 20 20 20 20 20 20 f the. *
9d10: 20 65 78 70 65 63 74 65 64 20 72 65 70 6c 79 2e expected reply.
9d20: 20 20 49 66 20 74 68 69 73 20 69 73 20 73 70 65 If this is spe
9d30: 63 69 66 69 65 64 20 61 73 20 30 20 74 68 65 6e cified as 0 then
9d40: 20 69 74 20 77 69 6c 6c 20 6e 6f 74 0a 20 2a 20 it will not. *
9d50: 20 20 20 20 20 20 20 20 62 65 20 73 65 6e 74 2e be sent.
9d60: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 69 6e 74 31 . *. * uint1
9d70: 36 5f 74 20 2a 72 65 73 70 63 6f 64 65 0a 20 2a 6_t *respcode. *
9d80: 20 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 50 [OUT] P
9d90: 6f 69 6e 74 65 72 20 74 6f 20 73 74 6f 72 61 67 ointer to storag
9da0: 65 20 6f 66 20 41 50 44 55 20 72 65 73 70 6f 6e e of APDU respon
9db0: 73 65 20 63 6f 64 65 2e 20 20 49 66 20 74 68 69 se code. If thi
9dc0: 73 20 69 73 0a 20 2a 20 20 20 20 20 20 20 20 20 s is. *
9dd0: 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c specified as NUL
9de0: 4c 2c 20 74 68 65 20 72 65 73 70 6f 6e 73 65 20 L, the response
9df0: 63 6f 64 65 20 77 69 6c 6c 20 62 65 20 64 69 73 code will be dis
9e00: 63 61 72 64 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 carded.. *. *
9e10: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 unsigned char
9e20: 2a 72 65 73 70 64 61 74 61 0a 20 2a 20 20 20 20 *respdata. *
9e30: 20 20 20 20 20 5b 4f 55 54 5d 20 50 6f 69 6e 74 [OUT] Point
9e40: 65 72 20 74 6f 20 73 74 6f 72 61 67 65 20 6f 66 er to storage of
9e50: 20 41 50 44 55 20 72 65 73 70 6f 6e 73 65 20 64 APDU response d
9e60: 61 74 61 2e 20 20 49 66 20 74 68 69 73 20 69 73 ata. If this is
9e70: 0a 20 2a 20 20 20 20 20 20 20 20 20 73 70 65 63 . * spec
9e80: 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74 ified as NULL, t
9e90: 68 65 20 72 65 73 70 6f 6e 73 65 20 64 61 74 61 he response data
9ea0: 20 77 69 6c 6c 20 62 65 20 64 69 73 63 61 72 64 will be discard
9eb0: 65 64 2e 20 20 49 66 0a 20 2a 20 20 20 20 20 20 ed. If. *
9ec0: 20 20 20 74 68 65 20 22 72 65 73 70 64 61 74 61 the "respdata
9ed0: 5f 6c 65 6e 22 20 70 61 72 61 6d 65 74 65 72 20 _len" parameter
9ee0: 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20 is specified as
9ef0: 4e 55 4c 4c 2c 20 74 68 69 73 20 62 75 66 66 65 NULL, this buffe
9f00: 72 0a 20 2a 20 20 20 20 20 20 20 20 20 77 69 6c r. * wil
9f10: 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74 65 64 l not be updated
9f20: 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 .. *. * size
9f30: 5f 74 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e _t *respdata_len
9f40: 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 49 4e 2c . * [IN,
9f50: 20 4f 55 54 5d 20 50 6f 69 6e 74 65 72 20 69 6e OUT] Pointer in
9f60: 69 74 69 61 6c 69 6e 67 20 63 6f 6e 74 61 69 6e itialing contain
9f70: 69 6e 67 20 74 68 65 20 73 69 7a 65 20 6f 66 20 ing the size of
9f80: 74 68 65 20 22 72 65 73 70 64 61 74 61 22 0a 20 the "respdata".
9f90: 2a 20 20 20 20 20 20 20 20 20 62 75 66 66 65 72 * buffer
9fa0: 2e 20 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e . Before return
9fb0: 69 6e 67 2c 20 74 68 65 20 70 6f 69 6e 74 65 64 ing, the pointed
9fc0: 20 74 6f 20 76 61 6c 75 65 20 69 73 20 75 70 64 to value is upd
9fd0: 61 74 65 64 20 74 6f 20 74 68 65 0a 20 2a 20 20 ated to the. *
9fe0: 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 number of
9ff0: 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 20 74 bytes written t
a000: 6f 20 74 68 65 20 62 75 66 66 65 72 2e 20 20 49 o the buffer. I
a010: 66 20 74 68 69 73 20 69 73 20 73 70 65 63 69 66 f this is specif
a020: 69 65 64 20 61 73 0a 20 2a 20 20 20 20 20 20 20 ied as. *
a030: 20 20 4e 55 4c 4c 2c 20 69 74 20 77 69 6c 6c 20 NULL, it will
a040: 6e 6f 74 20 62 65 20 75 70 64 61 74 65 64 2c 20 not be updated,
a050: 61 6e 64 20 22 72 65 73 70 64 61 74 61 22 20 77 and "respdata" w
a060: 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 20 63 ill be ignored c
a070: 61 75 73 69 6e 67 0a 20 2a 20 20 20 20 20 20 20 ausing. *
a080: 20 20 74 68 65 20 72 65 73 70 6f 6e 73 65 20 64 the response d
a090: 61 74 61 20 74 6f 20 62 65 20 64 69 73 63 61 72 ata to be discar
a0a0: 64 65 64 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 ded.. *. * RETUR
a0b0: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 N VALUE. * C
a0c0: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 ACKEY_PCSC_S_OK
a0d0: 20 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 On suc
a0e0: 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b cess. * CACK
a0f0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 EY_PCSC_E_GENERI
a100: 43 20 20 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a C On error.
a110: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 * CACKEY_PC
a120: 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 SC_E_TOKENABSENT
a130: 20 20 49 66 20 74 68 65 20 73 65 6e 64 69 6e 67 If the sending
a140: 20 66 61 69 6c 65 64 20 62 65 63 61 75 73 65 20 failed because
a150: 74 68 65 20 74 6f 6b 65 6e 20 69 73 0a 20 2a 20 the token is. *
a160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
a170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 a
a180: 62 73 65 6e 74 0a 20 2a 20 20 20 20 20 43 41 43 bsent. * CAC
a190: 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 KEY_PCSC_E_RETRY
a1a0: 20 20 20 20 20 20 20 20 49 66 20 73 6f 6d 65 74 If somet
a1b0: 68 69 6e 67 20 74 68 61 74 20 6c 6f 6f 6b 73 20 hing that looks
a1c0: 72 65 74 72 79 27 61 62 6c 65 20 77 65 6e 74 0a retry'able went.
a1d0: 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 *
a1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
a1f0: 20 20 77 72 6f 6e 67 20 2d 2d 20 74 72 79 20 74 wrong -- try t
a200: 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 he whole transac
a210: 74 69 6f 6e 20 6f 76 65 72 0a 20 2a 20 20 20 20 tion over. *
a220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
a230: 20 20 20 20 20 20 20 20 20 20 20 20 61 67 61 69 agai
a240: 6e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a n. *. * NOTES. *
a250: 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 This functi
a260: 6f 6e 20 77 69 6c 6c 20 63 6f 6e 6e 65 63 74 20 on will connect
a270: 74 6f 20 74 68 65 20 50 43 2f 53 43 20 43 6f 6e to the PC/SC Con
a280: 6e 65 63 74 69 6f 6e 20 4d 61 6e 61 67 65 72 20 nection Manager
a290: 76 69 61 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 via. * cacke
a2a0: 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 y_pcsc_connect()
a2b0: 20 69 66 20 6e 65 65 64 65 64 2e 0a 20 2a 0a 20 if needed.. *.
a2c0: 2a 20 20 20 20 20 49 74 20 77 69 6c 6c 20 63 6f * It will co
a2d0: 6e 6e 65 63 74 20 74 6f 20 74 68 65 20 63 61 72 nnect to the car
a2e0: 64 20 69 6e 20 74 68 65 20 72 65 61 64 65 72 20 d in the reader
a2f0: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 attached to the
a300: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 73 70 65 63 slot. * spec
a310: 69 66 69 65 64 2e 20 20 49 74 20 77 69 6c 6c 20 ified. It will
a320: 72 65 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 reconnect to the
a330: 20 63 61 72 64 20 69 66 20 74 68 65 20 63 6f 6e card if the con
a340: 6e 65 63 74 69 6f 6e 0a 20 2a 20 20 20 20 20 67 nection. * g
a350: 6f 65 73 20 61 77 61 79 2e 0a 20 2a 0a 20 2a 2f oes away.. *. */
a360: 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 .static cackey_r
a370: 65 74 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 et cackey_send_a
a380: 70 64 75 28 73 74 72 75 63 74 20 63 61 63 6b 65 pdu(struct cacke
a390: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e y_slot *slot, un
a3a0: 73 69 67 6e 65 64 20 63 68 61 72 20 63 6c 61 73 signed char clas
a3b0: 73 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 s, unsigned char
a3c0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 75 6e instruction, un
a3d0: 73 69 67 6e 65 64 20 63 68 61 72 20 70 31 2c 20 signed char p1,
a3e0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 32 unsigned char p2
a3f0: 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c , unsigned int l
a400: 63 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 c, unsigned char
a410: 20 2a 64 61 74 61 2c 20 75 6e 73 69 67 6e 65 64 *data, unsigned
a420: 20 69 6e 74 20 6c 65 2c 20 75 69 6e 74 31 36 5f int le, uint16_
a430: 74 20 2a 72 65 73 70 63 6f 64 65 2c 20 75 6e 73 t *respcode, uns
a440: 69 67 6e 65 64 20 63 68 61 72 20 2a 72 65 73 70 igned char *resp
a450: 64 61 74 61 2c 20 73 69 7a 65 5f 74 20 2a 72 65 data, size_t *re
a460: 73 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 75 spdata_len) {..u
a470: 69 6e 74 38 5f 74 20 6d 61 6a 6f 72 5f 72 63 2c int8_t major_rc,
a480: 20 6d 69 6e 6f 72 5f 72 63 3b 0a 09 73 69 7a 65 minor_rc;..size
a490: 5f 74 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 _t bytes_to_copy
a4a0: 2c 20 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c , tmp_respdata_l
a4b0: 65 6e 3b 0a 09 4c 50 43 53 43 41 52 44 5f 49 4f en;..LPCSCARD_IO
a4c0: 5f 52 45 51 55 45 53 54 20 70 69 6f 53 65 6e 64 _REQUEST pioSend
a4d0: 50 63 69 3b 0a 09 53 43 41 52 44 5f 49 4f 5f 52 Pci;..SCARD_IO_R
a4e0: 45 51 55 45 53 54 20 70 69 6f 52 65 63 76 50 63 EQUEST pioRecvPc
a4f0: 69 3b 0a 09 44 57 4f 52 44 20 78 6d 69 74 5f 6c i;..DWORD xmit_l
a500: 65 6e 2c 20 72 65 63 76 5f 6c 65 6e 3b 0a 09 4c en, recv_len;..L
a510: 4f 4e 47 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 ONG scard_xmit_r
a520: 65 74 2c 20 73 63 61 72 64 5f 72 65 63 6f 6e 6e et, scard_reconn
a530: 5f 72 65 74 3b 0a 09 42 59 54 45 20 78 6d 69 74 _ret;..BYTE xmit
a540: 5f 62 75 66 5b 31 30 32 34 5d 2c 20 72 65 63 76 _buf[1024], recv
a550: 5f 62 75 66 5b 31 30 32 34 5d 3b 0a 09 69 6e 74 _buf[1024];..int
a560: 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 pcsc_connect_re
a570: 74 2c 20 70 63 73 63 5f 67 65 74 72 65 73 70 5f t, pcsc_getresp_
a580: 72 65 74 3b 0a 09 69 6e 74 20 69 64 78 3b 0a 0a ret;..int idx;..
a590: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
a5a0: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
a5b0: 0a 0a 09 69 66 20 28 21 73 6c 6f 74 29 20 7b 0a ...if (!slot) {.
a5c0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
a5d0: 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 73 RINTF("Invalid s
a5e0: 6c 6f 74 20 73 70 65 63 69 66 69 65 64 2e 22 29 lot specified.")
a5f0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b ;....return(CACK
a600: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 EY_PCSC_E_GENERI
a610: 43 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65 73 C);..}...if (res
a620: 70 63 6f 64 65 29 20 7b 0a 09 09 2a 72 65 73 70 pcode) {...*resp
a630: 63 6f 64 65 20 3d 20 30 78 66 66 66 66 3b 0a 09 code = 0xffff;..
a640: 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 }...pcsc_connect
a650: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f _ret = cackey_co
a660: 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 nnect_card(slot)
a670: 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e ;..if (pcsc_conn
a680: 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 ect_ret != CACKE
a690: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 Y_PCSC_S_OK) {..
a6a0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
a6b0: 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 INTF("Unable to
a6c0: 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c connect to card,
a6d0: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 returning in fa
a6e0: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 ilure");....retu
a6f0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 rn(CACKEY_PCSC_E
a700: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 _GENERIC);..}...
a710: 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 69 /* Determine whi
a720: 63 68 20 70 72 6f 74 6f 63 6f 6c 20 74 6f 20 73 ch protocol to s
a730: 65 6e 64 20 75 73 69 6e 67 20 2a 2f 0a 09 73 77 end using */..sw
a740: 69 74 63 68 20 28 73 6c 6f 74 2d 3e 70 72 6f 74 itch (slot->prot
a750: 6f 63 6f 6c 29 20 7b 0a 09 09 63 61 73 65 20 53 ocol) {...case S
a760: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 CARD_PROTOCOL_T0
a770: 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 :....CACKEY_DEBU
a780: 47 5f 50 52 49 4e 54 46 28 22 50 72 6f 74 6f 63 G_PRINTF("Protoc
a790: 6f 6c 20 74 6f 20 73 65 6e 64 20 64 61 74 61 67 ol to send datag
a7a0: 72 61 6d 20 69 73 20 54 3d 30 22 29 3b 0a 0a 09 ram is T=0");...
a7b0: 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53 ..pioSendPci = S
a7c0: 43 41 52 44 5f 50 43 49 5f 54 30 3b 0a 0a 09 09 CARD_PCI_T0;....
a7d0: 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 53 .break;...case S
a7e0: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 CARD_PROTOCOL_T1
a7f0: 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 :....CACKEY_DEBU
a800: 47 5f 50 52 49 4e 54 46 28 22 50 72 6f 74 6f 63 G_PRINTF("Protoc
a810: 6f 6c 20 74 6f 20 73 65 6e 64 20 64 61 74 61 67 ol to send datag
a820: 72 61 6d 20 69 73 20 54 3d 31 22 29 3b 0a 0a 09 ram is T=1");...
a830: 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53 ..pioSendPci = S
a840: 43 41 52 44 5f 50 43 49 5f 54 31 3b 0a 0a 09 09 CARD_PCI_T1;....
a850: 09 62 72 65 61 6b 3b 0a 09 09 64 65 66 61 75 6c .break;...defaul
a860: 74 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 t:....CACKEY_DEB
a870: 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c UG_PRINTF("Inval
a880: 69 64 20 70 72 6f 74 6f 63 6f 6c 20 66 6f 75 6e id protocol foun
a890: 64 2c 20 61 62 6f 72 74 69 6e 67 2e 22 29 3b 0a d, aborting.");.
a8a0: 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 ....return(CACKE
a8b0: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 Y_PCSC_E_GENERIC
a8c0: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 72 61 6e 73 );..}.../* Trans
a8d0: 6d 69 74 20 2a 2f 0a 09 78 6d 69 74 5f 6c 65 6e mit */..xmit_len
a8e0: 20 3d 20 30 3b 0a 09 78 6d 69 74 5f 62 75 66 5b = 0;..xmit_buf[
a8f0: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 63 6c xmit_len++] = cl
a900: 61 73 73 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78 ass;..xmit_buf[x
a910: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 69 6e 73 mit_len++] = ins
a920: 74 72 75 63 74 69 6f 6e 3b 0a 09 78 6d 69 74 5f truction;..xmit_
a930: 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 buf[xmit_len++]
a940: 3d 20 70 31 3b 0a 09 78 6d 69 74 5f 62 75 66 5b = p1;..xmit_buf[
a950: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 70 32 xmit_len++] = p2
a960: 3b 0a 09 69 66 20 28 64 61 74 61 29 20 7b 0a 09 ;..if (data) {..
a970: 09 69 66 20 28 6c 63 20 3e 20 32 35 35 29 20 7b .if (lc > 255) {
a980: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
a990: 5f 50 52 49 4e 54 46 28 22 43 41 55 54 49 4f 4e _PRINTF("CAUTION
a9a0: 21 20 20 55 73 69 6e 67 20 61 6e 20 4c 63 20 67 ! Using an Lc g
a9b0: 72 65 61 74 65 72 20 74 68 61 6e 20 32 35 35 20 reater than 255
a9c0: 69 73 20 75 6e 74 65 73 74 65 64 2e 20 20 4c 63 is untested. Lc
a9d0: 20 3d 20 25 75 22 2c 20 6c 63 29 3b 0a 0a 09 09 = %u", lc);....
a9e0: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c .xmit_buf[xmit_l
a9f0: 65 6e 2b 2b 5d 20 3d 20 30 78 38 32 3b 20 2f 2a en++] = 0x82; /*
aa00: 20 58 58 58 20 55 4e 54 45 53 54 45 44 20 2a 2f XXX UNTESTED */
aa10: 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 ....xmit_buf[xmi
aa20: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 28 6c 63 20 26 t_len++] = (lc &
aa30: 20 30 78 66 66 30 30 29 20 3e 3e 20 38 3b 0a 09 0xff00) >> 8;..
aa40: 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f ..xmit_buf[xmit_
aa50: 6c 65 6e 2b 2b 5d 20 3d 20 6c 63 20 26 20 30 78 len++] = lc & 0x
aa60: 66 66 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 ff;...} else {..
aa70: 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f ..xmit_buf[xmit_
aa80: 6c 65 6e 2b 2b 5d 20 3d 20 6c 63 3b 0a 09 09 7d len++] = lc;...}
aa90: 0a 09 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b ...for (idx = 0;
aaa0: 20 69 64 78 20 3c 20 6c 63 3b 20 69 64 78 2b 2b idx < lc; idx++
aab0: 29 20 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b ) {....xmit_buf[
aac0: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 64 61 xmit_len++] = da
aad0: 74 61 5b 69 64 78 5d 3b 0a 09 09 7d 0a 09 7d 0a ta[idx];...}..}.
aae0: 0a 09 69 66 20 28 6c 65 20 21 3d 20 30 78 30 30 ..if (le != 0x00
aaf0: 29 20 7b 0a 09 09 69 66 20 28 6c 65 20 3e 20 32 ) {...if (le > 2
ab00: 35 36 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 56) {....CACKEY_
ab10: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 41 DEBUG_PRINTF("CA
ab20: 55 54 49 4f 4e 21 20 20 55 73 69 6e 67 20 61 6e UTION! Using an
ab30: 20 4c 65 20 67 72 65 61 74 65 72 20 74 68 61 6e Le greater than
ab40: 20 32 35 36 20 69 73 20 75 6e 74 65 73 74 65 64 256 is untested
ab50: 2e 20 20 4c 65 20 3d 20 25 75 22 2c 20 6c 65 29 . Le = %u", le)
ab60: 3b 0a 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 ;.....xmit_buf[x
ab70: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 30 78 38 mit_len++] = 0x8
ab80: 32 3b 20 2f 2a 20 58 58 58 20 55 4e 54 45 53 54 2; /* XXX UNTEST
ab90: 45 44 20 2a 2f 0a 09 09 09 78 6d 69 74 5f 62 75 ED */....xmit_bu
aba0: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 f[xmit_len++] =
abb0: 28 6c 65 20 26 20 30 78 66 66 30 30 29 20 3e 3e (le & 0xff00) >>
abc0: 20 38 3b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 8;....xmit_buf[
abd0: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 65 xmit_len++] = le
abe0: 20 26 20 30 78 66 66 3b 0a 09 09 7d 20 65 6c 73 & 0xff;...} els
abf0: 65 20 69 66 20 28 6c 65 20 3d 3d 20 32 35 36 29 e if (le == 256)
ac00: 20 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 {....xmit_buf[x
ac10: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 30 78 30 mit_len++] = 0x0
ac20: 30 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 0;...} else {...
ac30: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c .xmit_buf[xmit_l
ac40: 65 6e 2b 2b 5d 20 3d 20 6c 65 3b 0a 09 09 7d 0a en++] = le;...}.
ac50: 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 53 6d .}.../* Begin Sm
ac60: 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 artcard Transact
ac70: 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 62 ion */..cackey_b
ac80: 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e egin_transaction
ac90: 28 73 6c 6f 74 29 3b 0a 0a 09 69 66 20 28 63 6c (slot);...if (cl
aca0: 61 73 73 20 3d 3d 20 47 53 43 49 53 5f 43 4c 41 ass == GSCIS_CLA
acb0: 53 53 5f 49 53 4f 37 38 31 36 20 26 26 20 28 69 SS_ISO7816 && (i
acc0: 6e 73 74 72 75 63 74 69 6f 6e 20 3d 3d 20 47 53 nstruction == GS
acd0: 43 49 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 CIS_INSTR_VERIFY
ace0: 20 7c 7c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 || instruction
acf0: 3d 3d 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 43 == GSCIS_INSTR_C
ad00: 48 41 4e 47 45 5f 52 45 46 45 52 45 4e 43 45 29 HANGE_REFERENCE)
ad10: 20 26 26 20 70 31 20 3d 3d 20 30 78 30 30 29 20 && p1 == 0x00)
ad20: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
ad30: 5f 50 52 49 4e 54 46 28 22 53 65 6e 64 69 6e 67 _PRINTF("Sending
ad40: 20 41 50 44 55 3a 20 3c 3c 63 65 6e 73 6f 72 65 APDU: <<censore
ad50: 64 3e 3e 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b d>>");..} else {
ad60: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
ad70: 50 52 49 4e 54 42 55 46 28 22 53 65 6e 64 69 6e PRINTBUF("Sendin
ad80: 67 20 41 50 44 55 3a 22 2c 20 78 6d 69 74 5f 62 g APDU:", xmit_b
ad90: 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 29 3b 0a 09 uf, xmit_len);..
ada0: 7d 0a 0a 09 72 65 63 76 5f 6c 65 6e 20 3d 20 73 }...recv_len = s
adb0: 69 7a 65 6f 66 28 72 65 63 76 5f 62 75 66 29 3b izeof(recv_buf);
adc0: 0a 09 6d 65 6d 63 70 79 28 26 70 69 6f 52 65 63 ..memcpy(&pioRec
add0: 76 50 63 69 2c 20 70 69 6f 53 65 6e 64 50 63 69 vPci, pioSendPci
ade0: 2c 20 73 69 7a 65 6f 66 28 70 69 6f 52 65 63 76 , sizeof(pioRecv
adf0: 50 63 69 29 29 3b 0a 09 73 63 61 72 64 5f 78 6d Pci));..scard_xm
ae00: 69 74 5f 72 65 74 20 3d 20 53 43 61 72 64 54 72 it_ret = SCardTr
ae10: 61 6e 73 6d 69 74 28 73 6c 6f 74 2d 3e 70 63 73 ansmit(slot->pcs
ae20: 63 5f 63 61 72 64 2c 20 70 69 6f 53 65 6e 64 50 c_card, pioSendP
ae30: 63 69 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d ci, xmit_buf, xm
ae40: 69 74 5f 6c 65 6e 2c 20 26 70 69 6f 52 65 63 76 it_len, &pioRecv
ae50: 50 63 69 2c 20 72 65 63 76 5f 62 75 66 2c 20 26 Pci, recv_buf, &
ae60: 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 43 41 43 recv_len);...CAC
ae70: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
ae80: 28 22 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28 ("SCardTransmit(
ae90: 29 20 63 6f 6d 70 6c 65 74 65 64 20 77 69 74 68 ) completed with
aea0: 20 76 61 6c 75 65 3a 20 25 73 2f 25 6c 78 22 2c value: %s/%lx",
aeb0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 CACKEY_DEBUG_FU
aec0: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 NC_SCARDERR_TO_S
aed0: 54 52 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 TR(scard_xmit_re
aee0: 74 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f t), (unsigned lo
aef0: 6e 67 29 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 ng) scard_xmit_r
af00: 65 74 29 3b 0a 0a 09 69 66 20 28 73 63 61 72 64 et);...if (scard
af10: 5f 78 6d 69 74 5f 72 65 74 20 3d 3d 20 53 43 41 _xmit_ret == SCA
af20: 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41 43 RD_E_NOT_TRANSAC
af30: 54 45 44 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f TED) {...CACKEY_
af40: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 DEBUG_PRINTF("Fa
af50: 69 6c 65 64 20 74 6f 20 73 65 6e 64 20 41 50 44 iled to send APD
af60: 55 20 74 6f 20 63 61 72 64 20 28 53 43 61 72 64 U to card (SCard
af70: 54 72 61 6e 73 6d 69 74 28 29 20 3d 20 25 73 2f Transmit() = %s/
af80: 25 6c 78 29 2c 20 77 69 6c 6c 20 61 73 6b 20 63 %lx), will ask c
af90: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 alling function
afa0: 74 6f 20 72 65 74 72 79 20 28 6e 6f 74 20 72 65 to retry (not re
afb0: 73 65 74 74 69 6e 67 20 63 61 72 64 29 2e 2e 2e setting card)...
afc0: 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ", CACKEY_DEBUG_
afd0: 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f FUNC_SCARDERR_TO
afe0: 5f 53 54 52 28 73 63 61 72 64 5f 78 6d 69 74 5f _STR(scard_xmit_
aff0: 72 65 74 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 ret), (unsigned
b000: 6c 6f 6e 67 29 20 73 63 61 72 64 5f 78 6d 69 74 long) scard_xmit
b010: 5f 72 65 74 29 3b 0a 0a 09 09 2f 2a 20 45 6e 64 _ret);..../* End
b020: 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 Smartcard Trans
b030: 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b action */...cack
b040: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 ey_end_transacti
b050: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 63 61 63 on(slot);....cac
b060: 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61 key_reconnect_ca
b070: 72 64 28 73 6c 6f 74 2c 20 73 6c 6f 74 2d 3e 70 rd(slot, slot->p
b080: 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 72 65 74 rotocol);....ret
b090: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f urn(CACKEY_PCSC_
b0a0: 45 5f 52 45 54 52 59 29 3b 0a 09 7d 0a 0a 09 69 E_RETRY);..}...i
b0b0: 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 f (scard_xmit_re
b0c0: 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 4e 4f 5f t == SCARD_E_NO_
b0d0: 53 45 52 56 49 43 45 29 20 7b 0a 09 09 43 41 43 SERVICE) {...CAC
b0e0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
b0f0: 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6e 64 ("Failed to send
b100: 20 41 50 44 55 20 74 6f 20 63 61 72 64 2c 20 70 APDU to card, p
b110: 6f 73 73 69 62 6c 79 20 64 75 65 20 74 6f 20 50 ossibly due to P
b120: 43 2f 53 43 20 68 61 6e 64 6c 65 20 62 65 69 6e C/SC handle bein
b130: 67 20 69 6e 76 61 6c 69 64 20 28 53 43 61 72 64 g invalid (SCard
b140: 54 72 61 6e 73 6d 69 74 28 29 20 3d 20 25 73 2f Transmit() = %s/
b150: 25 6c 78 29 2c 20 77 69 6c 6c 20 61 73 6b 20 63 %lx), will ask c
b160: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 alling function
b170: 74 6f 20 72 65 74 72 79 2e 2e 2e 22 2c 20 43 41 to retry...", CA
b180: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f CKEY_DEBUG_FUNC_
b190: 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 SCARDERR_TO_STR(
b1a0: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c scard_xmit_ret),
b1b0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
b1c0: 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 scard_xmit_ret)
b1d0: 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b ;....cackey_mark
b1e0: 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 _slot_reset(slot
b1f0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 );....return(CAC
b200: 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 KEY_PCSC_E_RETRY
b210: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 63 61 72 );..}...if (scar
b220: 64 5f 78 6d 69 74 5f 72 65 74 20 21 3d 20 53 43 d_xmit_ret != SC
b230: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b ARD_S_SUCCESS) {
b240: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
b250: 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 PRINTF("Failed t
b260: 6f 20 73 65 6e 64 20 41 50 44 55 20 74 6f 20 63 o send APDU to c
b270: 61 72 64 20 28 53 43 61 72 64 54 72 61 6e 73 6d ard (SCardTransm
b280: 69 74 28 29 20 3d 20 25 73 2f 25 6c 78 29 22 2c it() = %s/%lx)",
b290: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 CACKEY_DEBUG_FU
b2a0: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 NC_SCARDERR_TO_S
b2b0: 54 52 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 TR(scard_xmit_re
b2c0: 74 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f t), (unsigned lo
b2d0: 6e 67 29 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 ng) scard_xmit_r
b2e0: 65 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 et);....CACKEY_D
b2f0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 61 72 EBUG_PRINTF("Mar
b300: 6b 69 6e 67 20 73 6c 6f 74 20 61 73 20 68 61 76 king slot as hav
b310: 69 6e 67 20 62 65 65 6e 20 72 65 73 65 74 22 29 ing been reset")
b320: 3b 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f ;...cackey_mark_
b330: 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 slot_reset(slot)
b340: 3b 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 78 ;....if (scard_x
b350: 6d 69 74 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 mit_ret == SCARD
b360: 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 29 20 7b _W_RESET_CARD) {
b370: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
b380: 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 72 _PRINTF("Reset r
b390: 65 71 75 69 72 65 64 2c 20 70 6c 65 61 73 65 20 equired, please
b3a0: 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73 hold...");.....s
b3b0: 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 card_reconn_ret
b3c0: 3d 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 = cackey_reconne
b3d0: 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20 53 43 ct_card(slot, SC
b3e0: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 ARD_PROTOCOL_T0
b3f0: 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c | SCARD_PROTOCOL
b400: 5f 54 31 29 3b 0a 0a 09 09 09 69 66 20 28 73 63 _T1);.....if (sc
b410: 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d ard_reconn_ret =
b420: 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 = SCARD_S_SUCCES
b430: 53 29 20 7b 0a 09 09 09 09 73 77 69 74 63 68 20 S) {.....switch
b440: 28 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 29 (slot->protocol)
b450: 20 7b 0a 09 09 09 09 09 63 61 73 65 20 53 43 41 {......case SCA
b460: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 3a 0a RD_PROTOCOL_T0:.
b470: 09 09 09 09 09 09 70 69 6f 53 65 6e 64 50 63 69 ......pioSendPci
b480: 20 3d 20 53 43 41 52 44 5f 50 43 49 5f 54 30 3b = SCARD_PCI_T0;
b490: 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 ........break;..
b4a0: 09 09 09 09 63 61 73 65 20 53 43 41 52 44 5f 50 ....case SCARD_P
b4b0: 52 4f 54 4f 43 4f 4c 5f 54 31 3a 0a 09 09 09 09 ROTOCOL_T1:.....
b4c0: 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53 ..pioSendPci = S
b4d0: 43 41 52 44 5f 50 43 49 5f 54 31 3b 0a 0a 09 09 CARD_PCI_T1;....
b4e0: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 ....break;......
b4f0: 64 65 66 61 75 6c 74 3a 0a 09 09 09 09 09 09 43 default:.......C
b500: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
b510: 54 46 28 22 49 6e 76 61 6c 69 64 20 70 72 6f 74 TF("Invalid prot
b520: 6f 63 6f 6c 20 66 6f 75 6e 64 2c 20 62 75 74 20 ocol found, but
b530: 74 6f 6f 20 6c 61 74 65 20 74 6f 20 64 6f 20 61 too late to do a
b540: 6e 79 74 68 69 6e 67 20 61 62 6f 75 74 20 69 74 nything about it
b550: 20 6e 6f 77 20 2d 2d 20 74 72 79 69 6e 67 20 61 now -- trying a
b560: 6e 79 77 61 79 2e 22 29 3b 0a 0a 09 09 09 09 09 nyway.");.......
b570: 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 .break;.....}...
b580: 09 09 09 2f 2a 20 52 65 2d 65 73 74 61 62 6c 69 .../* Re-establi
b590: 73 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 sh transaction,
b5a0: 69 66 20 69 74 20 77 61 73 20 70 72 65 73 65 6e if it was presen
b5b0: 74 20 2a 2f 0a 09 09 09 09 69 66 20 28 73 6c 6f t */.....if (slo
b5c0: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 t->transaction_d
b5d0: 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09 09 epth > 0) {.....
b5e0: 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 .slot->transacti
b5f0: 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 09 09 09 09 on_depth--;.....
b600: 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 .slot->transacti
b610: 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 on_need_hw_lock
b620: 3d 20 31 3b 0a 09 09 09 09 09 63 61 63 6b 65 79 = 1;......cackey
b630: 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 _begin_transacti
b640: 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09 09 09 7d 0a on(slot);.....}.
b650: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
b660: 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 G_PRINTF("Reset
b670: 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 72 successful, retr
b680: 61 6e 73 6d 69 74 74 69 6e 67 22 29 3b 0a 0a 09 ansmitting");...
b690: 09 09 09 72 65 63 76 5f 6c 65 6e 20 3d 20 73 69 ...recv_len = si
b6a0: 7a 65 6f 66 28 72 65 63 76 5f 62 75 66 29 3b 0a zeof(recv_buf);.
b6b0: 09 09 09 09 6d 65 6d 63 70 79 28 26 70 69 6f 52 ....memcpy(&pioR
b6c0: 65 63 76 50 63 69 2c 20 70 69 6f 53 65 6e 64 50 ecvPci, pioSendP
b6d0: 63 69 2c 20 73 69 7a 65 6f 66 28 70 69 6f 52 65 ci, sizeof(pioRe
b6e0: 63 76 50 63 69 29 29 3b 0a 09 09 09 09 73 63 61 cvPci));.....sca
b6f0: 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 20 53 43 rd_xmit_ret = SC
b700: 61 72 64 54 72 61 6e 73 6d 69 74 28 73 6c 6f 74 ardTransmit(slot
b710: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 70 69 6f ->pcsc_card, pio
b720: 53 65 6e 64 50 63 69 2c 20 78 6d 69 74 5f 62 75 SendPci, xmit_bu
b730: 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20 26 70 69 f, xmit_len, &pi
b740: 6f 52 65 63 76 50 63 69 2c 20 72 65 63 76 5f 62 oRecvPci, recv_b
b750: 75 66 2c 20 26 72 65 63 76 5f 6c 65 6e 29 3b 0a uf, &recv_len);.
b760: 0a 09 09 09 09 69 66 20 28 73 63 61 72 64 5f 78 .....if (scard_x
b770: 6d 69 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44 mit_ret != SCARD
b780: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 _S_SUCCESS) {...
b790: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
b7a0: 50 52 49 4e 54 46 28 22 52 65 74 72 61 6e 73 6d PRINTF("Retransm
b7b0: 69 74 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 it failed, retur
b7c0: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20 ning in failure
b7d0: 61 66 74 65 72 20 64 69 73 63 6f 6e 6e 65 63 74 after disconnect
b7e0: 69 6e 67 20 74 68 65 20 63 61 72 64 20 28 53 43 ing the card (SC
b7f0: 61 72 64 54 72 61 6e 73 6d 69 74 20 3d 20 25 73 ardTransmit = %s
b800: 2f 25 6c 69 29 22 2c 20 43 41 43 4b 45 59 5f 44 /%li)", CACKEY_D
b810: 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 EBUG_FUNC_SCARDE
b820: 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f RR_TO_STR(scard_
b830: 78 6d 69 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 xmit_ret), (long
b840: 29 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 ) scard_xmit_ret
b850: 29 3b 0a 0a 09 09 09 09 09 53 43 61 72 64 44 69 );.......SCardDi
b860: 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 sconnect(slot->p
b870: 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f csc_card, SCARD_
b880: 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 09 09 LEAVE_CARD);....
b890: 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 ..slot->pcsc_car
b8a0: 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b d_connected = 0;
b8b0: 0a 0a 09 09 09 09 09 2f 2a 20 45 6e 64 20 53 6d ......./* End Sm
b8c0: 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 artcard Transact
b8d0: 69 6f 6e 20 2a 2f 0a 09 09 09 09 09 73 6c 6f 74 ion */......slot
b8e0: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 ->transaction_de
b8f0: 70 74 68 20 3d 20 31 3b 0a 09 09 09 09 09 63 61 pth = 1;......ca
b900: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 ckey_end_transac
b910: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 tion(slot);.....
b920: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f ..return(CACKEY_
b930: 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 PCSC_E_TOKENABSE
b940: 4e 54 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 NT);.....}....}
b950: 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45 else {.....CACKE
b960: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
b970: 44 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20 63 61 Disconnecting ca
b980: 72 64 22 29 3b 0a 0a 09 09 09 09 53 43 61 72 64 rd");......SCard
b990: 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d Disconnect(slot-
b9a0: 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 >pcsc_card, SCAR
b9b0: 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 D_LEAVE_CARD);..
b9c0: 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 ...slot->pcsc_ca
b9d0: 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 rd_connected = 0
b9e0: 3b 0a 0a 09 09 09 09 2f 2a 20 45 6e 64 20 53 6d ;....../* End Sm
b9f0: 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 artcard Transact
ba00: 69 6f 6e 20 2a 2f 0a 09 09 09 09 73 6c 6f 74 2d ion */.....slot-
ba10: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 >transaction_dep
ba20: 74 68 20 3d 20 31 3b 0a 09 09 09 09 63 61 63 6b th = 1;.....cack
ba30: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 ey_end_transacti
ba40: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 43 on(slot);......C
ba50: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
ba60: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e TF("Returning in
ba70: 20 66 61 69 6c 75 72 65 22 29 3b 0a 09 09 09 09 failure");.....
ba80: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 return(CACKEY_PC
ba90: 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 SC_E_TOKENABSENT
baa0: 29 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 );....}...} else
bab0: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 {....CACKEY_DEB
bac0: 55 47 5f 50 52 49 4e 54 46 28 22 44 69 73 63 6f UG_PRINTF("Disco
bad0: 6e 6e 65 63 74 69 6e 67 20 63 61 72 64 22 29 3b nnecting card");
bae0: 0a 0a 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e .....SCardDiscon
baf0: 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f nect(slot->pcsc_
bb00: 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 card, SCARD_LEAV
bb10: 45 5f 43 41 52 44 29 3b 0a 09 09 09 73 6c 6f 74 E_CARD);....slot
bb20: 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e ->pcsc_card_conn
bb30: 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09 2f ected = 0;...../
bb40: 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 * End Smartcard
bb50: 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 Transaction */..
bb60: 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 ..slot->transact
bb70: 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a 09 ion_depth = 1;..
bb80: 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 ..cackey_end_tra
bb90: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a nsaction(slot);.
bba0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
bbb0: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
bbc0: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b ng in failure");
bbd0: 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 ....return(CACKE
bbe0: 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 Y_PCSC_E_TOKENAB
bbf0: 53 45 4e 54 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 SENT);...}..}...
bc00: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
bc10: 4e 54 42 55 46 28 22 52 65 74 75 72 6e 65 64 20 NTBUF("Returned
bc20: 56 61 6c 75 65 3a 22 2c 20 72 65 63 76 5f 62 75 Value:", recv_bu
bc30: 66 2c 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 f, recv_len);...
bc40: 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20 32 if (recv_len < 2
bc50: 29 20 7b 0a 09 09 2f 2a 20 4d 69 6e 69 6d 61 6c ) {.../* Minimal
bc60: 20 72 65 73 70 6f 6e 73 65 20 6c 65 6e 67 74 68 response length
bc70: 20 69 73 20 32 20 62 79 74 65 73 2c 20 72 65 74 is 2 bytes, ret
bc80: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 urning in failur
bc90: 65 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 e */...CACKEY_DE
bca0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 70 BUG_PRINTF("Resp
bcb0: 6f 6e 73 65 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 onse too small,
bcc0: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 returning in fai
bcd0: 6c 75 72 65 20 28 72 65 63 76 5f 6c 65 6e 20 3d lure (recv_len =
bce0: 20 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 %lu)", (unsigne
bcf0: 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e d long) recv_len
bd00: 29 3b 0a 0a 09 09 2f 2a 20 45 6e 64 20 53 6d 61 );..../* End Sma
bd10: 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 rtcard Transacti
bd20: 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 on */...cackey_e
bd30: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 nd_transaction(s
bd40: 6c 6f 74 29 3b 0a 0a 09 09 2f 2a 20 53 75 70 70 lot);..../* Supp
bd50: 6c 79 20 61 6e 20 69 6e 76 61 6c 69 64 20 72 65 ly an invalid re
bd60: 73 70 6f 6e 73 65 20 63 6f 64 65 20 2a 2f 0a 09 sponse code */..
bd70: 09 69 66 20 28 72 65 73 70 63 6f 64 65 29 20 7b .if (respcode) {
bd80: 0a 09 09 09 2a 72 65 73 70 63 6f 64 65 20 3d 20 ....*respcode =
bd90: 30 3b 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 0;...}....return
bda0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e (CACKEY_PCSC_E_N
bdb0: 4f 44 41 54 41 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 ODATA);..}.../*
bdc0: 44 65 74 65 72 6d 69 6e 65 20 72 65 73 75 6c 74 Determine result
bdd0: 20 63 6f 64 65 20 2a 2f 0a 09 6d 61 6a 6f 72 5f code */..major_
bde0: 72 63 20 3d 20 72 65 63 76 5f 62 75 66 5b 72 65 rc = recv_buf[re
bdf0: 63 76 5f 6c 65 6e 20 2d 20 32 5d 3b 0a 09 6d 69 cv_len - 2];..mi
be00: 6e 6f 72 5f 72 63 20 3d 20 72 65 63 76 5f 62 75 nor_rc = recv_bu
be10: 66 5b 72 65 63 76 5f 6c 65 6e 20 2d 20 31 5d 3b f[recv_len - 1];
be20: 0a 09 69 66 20 28 72 65 73 70 63 6f 64 65 29 20 ..if (respcode)
be30: 7b 0a 09 09 2a 72 65 73 70 63 6f 64 65 20 3d 20 {...*respcode =
be40: 28 6d 61 6a 6f 72 5f 72 63 20 3c 3c 20 38 29 20 (major_rc << 8)
be50: 7c 20 6d 69 6e 6f 72 5f 72 63 3b 0a 09 7d 0a 0a | minor_rc;..}..
be60: 09 2f 2a 20 41 64 6a 75 73 74 20 6d 65 73 73 61 ./* Adjust messa
be70: 67 65 20 62 75 66 66 65 72 20 2a 2f 0a 09 72 65 ge buffer */..re
be80: 63 76 5f 6c 65 6e 20 2d 3d 20 32 3b 0a 0a 09 2f cv_len -= 2;.../
be90: 2a 20 41 64 64 20 62 79 74 65 73 20 74 6f 20 72 * Add bytes to r
bea0: 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 09 eturn value */..
beb0: 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e tmp_respdata_len
bec0: 20 3d 20 30 3b 0a 09 69 66 20 28 72 65 73 70 64 = 0;..if (respd
bed0: 61 74 61 20 26 26 20 72 65 73 70 64 61 74 61 5f ata && respdata_
bee0: 6c 65 6e 29 20 7b 0a 09 09 74 6d 70 5f 72 65 73 len) {...tmp_res
bef0: 70 64 61 74 61 5f 6c 65 6e 20 3d 20 2a 72 65 73 pdata_len = *res
bf00: 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 62 79 pdata_len;....by
bf10: 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 2a 72 tes_to_copy = *r
bf20: 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 espdata_len;....
bf30: 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20 62 if (recv_len < b
bf40: 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a ytes_to_copy) {.
bf50: 09 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 ...bytes_to_copy
bf60: 20 3d 20 72 65 63 76 5f 6c 65 6e 3b 0a 09 09 7d = recv_len;...}
bf70: 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
bf80: 5f 50 52 49 4e 54 46 28 22 43 6f 70 79 69 6e 67 _PRINTF("Copying
bf90: 20 25 6c 75 20 62 79 74 65 73 20 74 6f 20 74 68 %lu bytes to th
bfa0: 65 20 62 75 66 66 65 72 20 28 72 65 63 76 27 64 e buffer (recv'd
bfb0: 20 25 6c 75 20 62 79 74 65 73 2c 20 62 75 74 20 %lu bytes, but
bfc0: 6f 6e 6c 79 20 25 6c 75 20 62 79 74 65 73 20 6c only %lu bytes l
bfd0: 65 66 74 20 69 6e 20 6f 75 72 20 62 75 66 66 65 eft in our buffe
bfe0: 72 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c r)", (unsigned l
bff0: 6f 6e 67 29 20 62 79 74 65 73 5f 74 6f 5f 63 6f ong) bytes_to_co
c000: 70 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f py, (unsigned lo
c010: 6e 67 29 20 72 65 63 76 5f 6c 65 6e 2c 20 28 75 ng) recv_len, (u
c020: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 72 nsigned long) *r
c030: 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 0a 09 espdata_len);...
c040: 09 6d 65 6d 63 70 79 28 72 65 73 70 64 61 74 61 .memcpy(respdata
c050: 2c 20 72 65 63 76 5f 62 75 66 2c 20 62 79 74 65 , recv_buf, byte
c060: 73 5f 74 6f 5f 63 6f 70 79 29 3b 0a 09 09 72 65 s_to_copy);...re
c070: 73 70 64 61 74 61 20 2b 3d 20 62 79 74 65 73 5f spdata += bytes_
c080: 74 6f 5f 63 6f 70 79 3b 0a 0a 09 09 2a 72 65 73 to_copy;....*res
c090: 70 64 61 74 61 5f 6c 65 6e 20 3d 20 62 79 74 65 pdata_len = byte
c0a0: 73 5f 74 6f 5f 63 6f 70 79 3b 0a 09 09 74 6d 70 s_to_copy;...tmp
c0b0: 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 2d 3d _respdata_len -=
c0c0: 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a bytes_to_copy;.
c0d0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 .} else {...if (
c0e0: 72 65 63 76 5f 6c 65 6e 20 21 3d 20 30 29 20 7b recv_len != 0) {
c0f0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
c100: 5f 50 52 49 4e 54 46 28 22 54 68 72 6f 77 69 6e _PRINTF("Throwin
c110: 67 20 61 77 61 79 20 25 6c 75 20 62 79 74 65 73 g away %lu bytes
c120: 2c 20 6e 6f 77 68 65 72 65 20 74 6f 20 70 75 74 , nowhere to put
c130: 20 74 68 65 6d 21 22 2c 20 28 75 6e 73 69 67 6e them!", (unsign
c140: 65 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65 ed long) recv_le
c150: 6e 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 n);...}..}...if
c160: 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d 20 30 78 36 (major_rc == 0x6
c170: 31 29 20 7b 0a 09 09 2f 2a 20 57 65 20 6e 65 65 1) {.../* We nee
c180: 64 20 74 6f 20 52 45 41 44 20 2a 2f 0a 09 09 43 d to READ */...C
c190: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
c1a0: 54 46 28 22 42 75 66 66 65 72 20 72 65 61 64 20 TF("Buffer read
c1b0: 72 65 71 75 69 72 65 64 22 29 3b 0a 0a 09 09 69 required");....i
c1c0: 66 20 28 6d 69 6e 6f 72 5f 72 63 20 3d 3d 20 30 f (minor_rc == 0
c1d0: 78 30 30 29 20 7b 0a 09 09 09 6d 69 6e 6f 72 5f x00) {....minor_
c1e0: 72 63 20 3d 20 43 41 43 4b 45 59 5f 41 50 44 55 rc = CACKEY_APDU
c1f0: 5f 4d 54 55 3b 0a 09 09 7d 0a 0a 09 09 70 63 73 _MTU;...}....pcs
c200: 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20 3d 20 c_getresp_ret =
c210: 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 cackey_send_apdu
c220: 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 (slot, GSCIS_CLA
c230: 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49 SS_ISO7816, GSCI
c240: 53 5f 49 4e 53 54 52 5f 47 45 54 5f 52 45 53 50 S_INSTR_GET_RESP
c250: 4f 4e 53 45 2c 20 30 78 30 30 2c 20 30 78 30 30 ONSE, 0x00, 0x00
c260: 2c 20 30 2c 20 4e 55 4c 4c 2c 20 6d 69 6e 6f 72 , 0, NULL, minor
c270: 5f 72 63 2c 20 72 65 73 70 63 6f 64 65 2c 20 72 _rc, respcode, r
c280: 65 73 70 64 61 74 61 2c 20 26 74 6d 70 5f 72 65 espdata, &tmp_re
c290: 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 0a 09 09 spdata_len);....
c2a0: 69 66 20 28 70 63 73 63 5f 67 65 74 72 65 73 70 if (pcsc_getresp
c2b0: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 _ret != CACKEY_P
c2c0: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 CSC_S_OK) {....C
c2d0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
c2e0: 54 46 28 22 42 75 66 66 65 72 20 72 65 61 64 20 TF("Buffer read
c2f0: 66 61 69 6c 65 64 21 20 20 52 65 74 75 72 6e 69 failed! Returni
c300: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b ng in failure");
c310: 0a 0a 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 ...../* End Smar
c320: 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f tcard Transactio
c330: 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 65 n */....cackey_e
c340: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 nd_transaction(s
c350: 6c 6f 74 29 3b 0a 0a 09 09 09 69 66 20 28 70 63 lot);.....if (pc
c360: 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20 3d sc_getresp_ret =
c370: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f = CACKEY_PCSC_E_
c380: 52 45 54 52 59 29 20 7b 0a 09 09 09 09 72 65 74 RETRY) {.....ret
c390: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f urn(CACKEY_PCSC_
c3a0: 45 5f 52 45 54 52 59 29 3b 0a 09 09 09 7d 0a 0a E_RETRY);....}..
c3b0: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 ...return(CACKEY
c3c0: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 _PCSC_E_GENERIC)
c3d0: 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72 65 73 ;...}....if (res
c3e0: 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 09 09 pdata_len) {....
c3f0: 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 2b 3d *respdata_len +=
c400: 20 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 tmp_respdata_le
c410: 6e 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 45 6e 64 n;...}..../* End
c420: 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 Smartcard Trans
c430: 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b action */...cack
c440: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 ey_end_transacti
c450: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 43 41 43 on(slot);....CAC
c460: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
c470: 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 ("Returning in s
c480: 75 63 63 65 73 73 20 28 62 75 66 66 65 72 20 72 uccess (buffer r
c490: 65 61 64 20 63 6f 6d 70 6c 65 74 65 29 22 29 3b ead complete)");
c4a0: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 ...return(CACKEY
c4b0: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a _PCSC_S_OK);..}.
c4c0: 0a 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 ../* End Smartca
c4d0: 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a rd Transaction *
c4e0: 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 /..cackey_end_tr
c4f0: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b ansaction(slot);
c500: 0a 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 72 63 20 ...if (major_rc
c510: 3d 3d 20 30 78 39 30 29 20 7b 0a 09 09 2f 2a 20 == 0x90) {.../*
c520: 53 75 63 63 65 73 73 20 2a 2f 0a 09 09 43 41 43 Success */...CAC
c530: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
c540: 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 ("Returning in s
c550: 75 63 63 65 73 73 20 28 6d 61 6a 6f 72 5f 72 63 uccess (major_rc
c560: 20 3d 20 30 78 39 30 29 22 29 3b 0a 0a 09 09 72 = 0x90)");....r
c570: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 eturn(CACKEY_PCS
c580: 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 0a 09 43 C_S_OK);..}....C
c590: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
c5a0: 54 46 28 22 41 50 44 55 20 52 65 74 75 72 6e 65 TF("APDU Returne
c5b0: 64 20 61 6e 20 65 72 72 6f 72 2c 20 72 65 74 75 d an error, retu
c5c0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 rning in failure
c5d0: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 ");...return(CAC
c5e0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 KEY_PCSC_E_GENER
c5f0: 49 43 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75 IC);.}..static u
c600: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 61 nsigned char *ca
c610: 63 6b 65 79 5f 72 65 61 64 5f 62 65 72 74 6c 76 ckey_read_bertlv
c620: 5f 74 61 67 28 75 6e 73 69 67 6e 65 64 20 63 68 _tag(unsigned ch
c630: 61 72 20 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 ar *buffer, size
c640: 5f 74 20 2a 62 75 66 66 65 72 5f 6c 65 6e 5f 70 _t *buffer_len_p
c650: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 , unsigned char
c660: 74 61 67 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 tag, unsigned ch
c670: 61 72 20 2a 6f 75 74 62 75 66 66 65 72 2c 20 73 ar *outbuffer, s
c680: 69 7a 65 5f 74 20 2a 6f 75 74 62 75 66 66 65 72 ize_t *outbuffer
c690: 5f 6c 65 6e 5f 70 29 20 7b 0a 09 75 6e 73 69 67 _len_p) {..unsig
c6a0: 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 ned char *buffer
c6b0: 5f 70 3b 0a 09 73 69 7a 65 5f 74 20 6f 75 74 62 _p;..size_t outb
c6c0: 75 66 66 65 72 5f 6c 65 6e 2c 20 62 75 66 66 65 uffer_len, buffe
c6d0: 72 5f 6c 65 6e 3b 0a 09 73 69 7a 65 5f 74 20 73 r_len;..size_t s
c6e0: 69 7a 65 3b 0a 09 69 6e 74 20 69 64 78 3b 0a 0a ize;..int idx;..
c6f0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
c700: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
c710: 0a 0a 09 69 66 20 28 62 75 66 66 65 72 5f 6c 65 ...if (buffer_le
c720: 6e 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 n_p == NULL) {..
c730: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
c740: 49 4e 54 46 28 22 62 75 66 66 65 72 5f 6c 65 6e INTF("buffer_len
c750: 5f 70 20 69 73 20 4e 55 4c 4c 2e 20 20 52 65 74 _p is NULL. Ret
c760: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 urning in failur
c770: 65 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 e.");....return(
c780: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 NULL);..}...if (
c790: 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20 outbuffer_len_p
c7a0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 == NULL) {...CAC
c7b0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
c7c0: 28 22 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 5f ("outbuffer_len_
c7d0: 70 20 69 73 20 4e 55 4c 4c 2e 20 20 52 65 74 75 p is NULL. Retu
c7e0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 rning in failure
c7f0: 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e .");....return(N
c800: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 62 75 66 66 65 ULL);..}...buffe
c810: 72 5f 6c 65 6e 20 3d 20 2a 6f 75 74 62 75 66 66 r_len = *outbuff
c820: 65 72 5f 6c 65 6e 5f 70 3b 0a 09 6f 75 74 62 75 er_len_p;..outbu
c830: 66 66 65 72 5f 6c 65 6e 20 3d 20 2a 6f 75 74 62 ffer_len = *outb
c840: 75 66 66 65 72 5f 6c 65 6e 5f 70 3b 0a 0a 09 69 uffer_len_p;...i
c850: 66 20 28 62 75 66 66 65 72 5f 6c 65 6e 20 3c 20 f (buffer_len <
c860: 32 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 2) {...CACKEY_DE
c870: 42 55 47 5f 50 52 49 4e 54 46 28 22 62 75 66 66 BUG_PRINTF("buff
c880: 65 72 5f 6c 65 6e 20 69 73 20 6c 65 73 73 20 74 er_len is less t
c890: 68 61 6e 20 32 2c 20 73 6f 20 77 65 20 63 61 6e han 2, so we can
c8a0: 27 74 20 72 65 61 64 20 61 6e 79 20 74 61 67 2e 't read any tag.
c8b0: 20 20 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 Returning in f
c8c0: 61 69 6c 75 72 65 2e 22 29 3b 0a 0a 09 09 72 65 ailure.");....re
c8d0: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a turn(NULL);..}..
c8e0: 09 62 75 66 66 65 72 5f 70 20 3d 20 62 75 66 66 .buffer_p = buff
c8f0: 65 72 3b 0a 09 69 66 20 28 62 75 66 66 65 72 5f er;..if (buffer_
c900: 70 5b 30 5d 20 21 3d 20 74 61 67 29 20 7b 0a 09 p[0] != tag) {..
c910: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
c920: 49 4e 54 46 28 22 54 61 67 20 66 6f 75 6e 64 20 INTF("Tag found
c930: 77 61 73 20 6e 6f 74 20 74 61 67 20 65 78 70 65 was not tag expe
c940: 63 74 65 64 2e 20 20 54 61 67 20 3d 20 25 30 32 cted. Tag = %02
c950: 78 2c 20 45 78 70 65 63 74 65 64 20 3d 20 25 30 x, Expected = %0
c960: 32 78 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 69 2x. Returning i
c970: 6e 20 66 61 69 6c 75 72 65 2e 22 2c 20 28 75 6e n failure.", (un
c980: 73 69 67 6e 65 64 20 69 6e 74 29 20 62 75 66 66 signed int) buff
c990: 65 72 5f 70 5b 30 5d 2c 20 74 61 67 29 3b 0a 0a er_p[0], tag);..
c9a0: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a ..return(NULL);.
c9b0: 09 7d 0a 0a 09 62 75 66 66 65 72 5f 70 2b 2b 3b .}...buffer_p++;
c9c0: 0a 09 62 75 66 66 65 72 5f 6c 65 6e 2d 2d 3b 0a ..buffer_len--;.
c9d0: 0a 09 69 66 20 28 28 62 75 66 66 65 72 5f 70 5b ..if ((buffer_p[
c9e0: 30 5d 20 26 20 30 78 38 30 29 20 3d 3d 20 30 78 0] & 0x80) == 0x
c9f0: 38 30 29 20 7b 0a 09 09 73 69 7a 65 20 3d 20 30 80) {...size = 0
ca00: 3b 0a 09 09 69 64 78 20 3d 20 28 62 75 66 66 65 ;...idx = (buffe
ca10: 72 5f 70 5b 30 5d 20 26 20 30 78 37 66 29 3b 0a r_p[0] & 0x7f);.
ca20: 0a 09 09 69 66 20 28 69 64 78 20 3e 20 62 75 66 ...if (idx > buf
ca30: 66 65 72 5f 6c 65 6e 29 20 7b 0a 09 09 09 43 41 fer_len) {....CA
ca40: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
ca50: 46 28 22 4d 61 6c 66 6f 72 6d 65 64 20 42 45 52 F("Malformed BER
ca60: 20 76 61 6c 75 65 20 2d 2d 20 6e 6f 74 20 65 6e value -- not en
ca70: 6f 75 67 68 20 62 79 74 65 73 20 61 76 61 69 6c ough bytes avail
ca80: 61 62 6c 65 20 74 6f 20 72 65 61 64 20 6c 65 6e able to read len
ca90: 67 74 68 20 28 69 64 78 20 3d 20 25 69 2c 20 62 gth (idx = %i, b
caa0: 75 66 66 65 72 5f 6c 65 6e 20 3d 20 25 6c 75 29 uffer_len = %lu)
cab0: 22 2c 20 69 64 78 2c 20 28 75 6e 73 69 67 6e 65 ", idx, (unsigne
cac0: 64 20 6c 6f 6e 67 29 20 62 75 66 66 65 72 5f 6c d long) buffer_l
cad0: 65 6e 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 en);.....return(
cae0: 4e 55 4c 4c 29 3b 0a 09 09 7d 0a 0a 09 09 66 6f NULL);...}....fo
caf0: 72 20 28 3b 20 69 64 78 20 3e 20 30 3b 20 69 64 r (; idx > 0; id
cb00: 78 2d 2d 29 20 7b 0a 09 09 09 62 75 66 66 65 72 x--) {....buffer
cb10: 5f 70 2b 2b 3b 0a 09 09 09 62 75 66 66 65 72 5f _p++;....buffer_
cb20: 6c 65 6e 2d 2d 3b 0a 0a 09 09 09 73 69 7a 65 20 len--;.....size
cb30: 3c 3c 3d 20 38 3b 0a 09 09 09 73 69 7a 65 20 7c <<= 8;....size |
cb40: 3d 20 62 75 66 66 65 72 5f 70 5b 30 5d 3b 0a 09 = buffer_p[0];..
cb50: 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 73 .}..} else {...s
cb60: 69 7a 65 20 3d 20 62 75 66 66 65 72 5f 70 5b 30 ize = buffer_p[0
cb70: 5d 3b 0a 09 7d 0a 0a 09 62 75 66 66 65 72 5f 70 ];..}...buffer_p
cb80: 2b 2b 3b 0a 09 62 75 66 66 65 72 5f 6c 65 6e 2d ++;..buffer_len-
cb90: 2d 3b 0a 0a 09 69 66 20 28 73 69 7a 65 20 3e 20 -;...if (size >
cba0: 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 29 20 7b outbuffer_len) {
cbb0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
cbc0: 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 PRINTF("Unable t
cbd0: 6f 20 63 6f 70 79 20 76 61 6c 75 65 20 62 75 66 o copy value buf
cbe0: 66 65 72 20 74 6f 20 6f 75 74 62 75 66 66 65 72 fer to outbuffer
cbf0: 2c 20 6e 6f 74 20 65 6e 6f 75 67 68 20 72 6f 6f , not enough roo
cc00: 6d 2e 20 20 56 61 6c 75 65 20 62 75 66 66 65 72 m. Value buffer
cc10: 20 6c 65 6e 67 74 68 20 3d 20 25 6c 75 2c 20 6f length = %lu, o
cc20: 75 74 20 62 75 66 66 65 72 20 6c 65 6e 67 74 68 ut buffer length
cc30: 20 3d 20 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e = %lu", (unsign
cc40: 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65 2c 20 28 ed long) size, (
cc50: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f unsigned long) o
cc60: 75 74 62 75 66 66 65 72 5f 6c 65 6e 29 3b 0a 0a utbuffer_len);..
cc70: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a ..return(NULL);.
cc80: 09 7d 0a 0a 09 2a 6f 75 74 62 75 66 66 65 72 5f .}...*outbuffer_
cc90: 6c 65 6e 5f 70 20 3d 20 73 69 7a 65 3b 0a 09 69 len_p = size;..i
cca0: 66 20 28 6f 75 74 62 75 66 66 65 72 29 20 7b 0a f (outbuffer) {.
ccb0: 09 09 6d 65 6d 63 70 79 28 6f 75 74 62 75 66 66 ..memcpy(outbuff
ccc0: 65 72 2c 20 62 75 66 66 65 72 5f 70 2c 20 73 69 er, buffer_p, si
ccd0: 7a 65 29 3b 0a 09 09 62 75 66 66 65 72 5f 70 20 ze);...buffer_p
cce0: 2b 3d 20 73 69 7a 65 3b 0a 09 09 62 75 66 66 65 += size;...buffe
ccf0: 72 5f 6c 65 6e 20 2d 3d 20 73 69 7a 65 3b 0a 0a r_len -= size;..
cd00: 09 09 2a 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20 ..*buffer_len_p
cd10: 3d 20 62 75 66 66 65 72 5f 6c 65 6e 3b 0a 0a 09 = buffer_len;...
cd20: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
cd30: 49 4e 54 42 55 46 28 22 42 45 52 2d 54 4c 56 20 INTBUF("BER-TLV
cd40: 72 65 73 75 6c 74 73 3a 22 2c 20 6f 75 74 62 75 results:", outbu
cd50: 66 66 65 72 2c 20 73 69 7a 65 29 3b 0a 09 7d 20 ffer, size);..}
cd60: 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 6d 6f 76 65 else {...memmove
cd70: 28 62 75 66 66 65 72 2c 20 62 75 66 66 65 72 5f (buffer, buffer_
cd80: 70 2c 20 73 69 7a 65 29 3b 0a 09 09 62 75 66 66 p, size);...buff
cd90: 65 72 5f 70 20 3d 20 62 75 66 66 65 72 3b 0a 0a er_p = buffer;..
cda0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
cdb0: 52 49 4e 54 42 55 46 28 22 42 45 52 2d 54 4c 56 RINTBUF("BER-TLV
cdc0: 20 72 65 73 75 6c 74 73 3a 22 2c 20 62 75 66 66 results:", buff
cdd0: 65 72 2c 20 73 69 7a 65 29 3b 0a 09 7d 0a 0a 09 er, size);..}...
cde0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
cdf0: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 NTF("Returning i
ce00: 6e 20 73 75 63 63 65 73 73 2e 20 20 53 69 7a 65 n success. Size
ce10: 20 6f 66 20 63 6f 6e 74 65 6e 74 73 20 66 6f 72 of contents for
ce20: 20 74 61 67 20 25 30 32 78 20 69 73 20 25 6c 75 tag %02x is %lu
ce30: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 ", (unsigned int
ce40: 29 20 74 61 67 2c 20 28 75 6e 73 69 67 6e 65 64 ) tag, (unsigned
ce50: 20 6c 6f 6e 67 29 20 73 69 7a 65 29 3b 0a 0a 09 long) size);...
ce60: 72 65 74 75 72 6e 28 62 75 66 66 65 72 5f 70 29 return(buffer_p)
ce70: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f ;.}../*. * SYNPO
ce80: 53 49 53 0a 20 2a 20 20 20 20 20 73 73 69 7a 65 SIS. * ssize
ce90: 5f 74 20 63 61 63 6b 65 79 5f 67 65 74 5f 64 61 _t cackey_get_da
cea0: 74 61 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 ta(struct cackey
ceb0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 _slot *slot, uns
cec0: 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 igned char *buff
ced0: 65 72 2c 20 73 69 7a 65 5f 74 20 62 75 66 66 65 er, size_t buffe
cee0: 72 5f 6c 65 6e 2c 20 75 6e 73 69 67 6e 65 64 20 r_len, unsigned
cef0: 63 68 61 72 20 6f 69 64 5b 33 5d 29 3b 0a 20 2a char oid[3]);. *
cf00: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a . * ARGUMENTS. *
cf10: 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63 6b struct cack
cf20: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a ey_slot *slot. *
cf30: 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f Slot to
cf40: 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 send commands t
cf50: 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 o. *. * unsi
cf60: 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 gned char *buffe
cf70: 72 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 r. * [OU
cf80: 54 5d 20 42 75 66 66 65 72 0a 20 2a 0a 20 2a 20 T] Buffer. *. *
cf90: 20 20 20 20 73 69 7a 65 5f 74 20 62 75 66 66 65 size_t buffe
cfa0: 72 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20 20 r_len. *
cfb0: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 Number of bytes
cfc0: 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 72 to attempt to r
cfd0: 65 61 64 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e ead. *. * un
cfe0: 73 69 67 6e 65 64 20 63 68 61 72 20 6f 69 64 5b signed char oid[
cff0: 33 5d 0a 20 2a 20 20 20 20 20 20 20 20 20 33 2d 3]. * 3-
d000: 62 79 74 65 20 4f 49 44 20 74 6f 20 72 65 61 64 byte OID to read
d010: 0a 20 2a 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e . *. *. * RETURN
d020: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 54 68 VALUE. * Th
d030: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 is function retu
d040: 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f rns the number o
d050: 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 f bytes actually
d060: 20 72 65 61 64 2c 20 6f 72 20 2d 31 20 6f 6e 20 read, or -1 on
d070: 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 error.. *. * NOT
d080: 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 ES. * None.
d090: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 *. */.static ssi
d0a0: 7a 65 5f 74 20 63 61 63 6b 65 79 5f 67 65 74 5f ze_t cackey_get_
d0b0: 64 61 74 61 28 73 74 72 75 63 74 20 63 61 63 6b data(struct cack
d0c0: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 ey_slot *slot, u
d0d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 nsigned char *bu
d0e0: 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 62 75 66 ffer, size_t buf
d0f0: 66 65 72 5f 6c 65 6e 2c 20 75 6e 73 69 67 6e 65 fer_len, unsigne
d100: 64 20 63 68 61 72 20 6f 69 64 5b 33 5d 29 20 7b d char oid[3]) {
d110: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 ..unsigned char
d120: 63 6d 64 5b 5d 20 3d 20 7b 30 78 35 43 2c 20 30 cmd[] = {0x5C, 0
d130: 78 30 33 2c 20 30 78 30 30 2c 20 30 78 30 30 2c x03, 0x00, 0x00,
d140: 20 30 78 30 30 7d 3b 0a 09 75 6e 73 69 67 6e 65 0x00};..unsigne
d150: 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 5f 70 d char *buffer_p
d160: 3b 0a 09 73 69 7a 65 5f 74 20 69 6e 69 74 5f 62 ;..size_t init_b
d170: 75 66 66 65 72 5f 6c 65 6e 2c 20 73 69 7a 65 3b uffer_len, size;
d180: 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70 63 ..uint16_t respc
d190: 6f 64 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 ode;..int send_r
d1a0: 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 et;...CACKEY_DEB
d1b0: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
d1c0: 64 2e 22 29 3b 0a 0a 09 69 6e 69 74 5f 62 75 66 d.");...init_buf
d1d0: 66 65 72 5f 6c 65 6e 20 3d 20 62 75 66 66 65 72 fer_len = buffer
d1e0: 5f 6c 65 6e 3b 0a 0a 09 63 6d 64 5b 32 5d 20 3d _len;...cmd[2] =
d1f0: 20 6f 69 64 5b 30 5d 3b 0a 09 63 6d 64 5b 33 5d oid[0];..cmd[3]
d200: 20 3d 20 6f 69 64 5b 31 5d 3b 0a 09 63 6d 64 5b = oid[1];..cmd[
d210: 34 5d 20 3d 20 6f 69 64 5b 32 5d 3b 0a 0a 09 2f 4] = oid[2];.../
d220: 2a 20 32 35 36 20 74 6f 20 69 6e 64 69 63 61 74 * 256 to indicat
d230: 65 20 74 68 65 20 6c 61 72 67 65 73 74 20 6d 65 e the largest me
d240: 73 73 61 67 65 20 73 69 7a 65 20 2d 2d 20 6e 6f ssage size -- no
d250: 74 20 63 6c 65 61 72 20 69 66 20 74 68 69 73 20 t clear if this
d260: 77 69 6c 6c 20 77 6f 72 6b 20 77 69 74 68 20 61 will work with a
d270: 6c 6c 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 09 ll messages */..
d280: 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 send_ret = cacke
d290: 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 y_send_apdu(slot
d2a0: 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 , GSCIS_CLASS_IS
d2b0: 4f 37 38 31 36 2c 20 4e 49 53 54 53 50 38 30 30 O7816, NISTSP800
d2c0: 5f 37 33 5f 33 5f 49 4e 53 54 52 5f 47 45 54 5f _73_3_INSTR_GET_
d2d0: 44 41 54 41 2c 20 30 78 33 46 2c 20 30 78 46 46 DATA, 0x3F, 0xFF
d2e0: 2c 20 73 69 7a 65 6f 66 28 63 6d 64 29 2c 20 63 , sizeof(cmd), c
d2f0: 6d 64 2c 20 32 35 36 2c 20 26 72 65 73 70 63 6f md, 256, &respco
d300: 64 65 2c 20 62 75 66 66 65 72 2c 20 26 62 75 66 de, buffer, &buf
d310: 66 65 72 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 fer_len);...if (
d320: 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b send_ret == CACK
d330: 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29 EY_PCSC_E_RETRY)
d340: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
d350: 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20 53 G_PRINTF("ADPU S
d360: 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 2c 20 72 ending failed, r
d370: 65 74 72 79 69 6e 67 20 72 65 61 64 20 62 75 66 etrying read buf
d380: 66 65 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e fer");....return
d390: 28 63 61 63 6b 65 79 5f 67 65 74 5f 64 61 74 61 (cackey_get_data
d3a0: 28 73 6c 6f 74 2c 20 62 75 66 66 65 72 2c 20 69 (slot, buffer, i
d3b0: 6e 69 74 5f 62 75 66 66 65 72 5f 6c 65 6e 2c 20 nit_buffer_len,
d3c0: 6f 69 64 29 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 oid));..}...if (
d3d0: 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b send_ret != CACK
d3e0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a EY_PCSC_S_OK) {.
d3f0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
d400: 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 73 65 RINTF("cackey_se
d410: 6e 64 5f 61 70 64 75 28 29 20 66 61 69 6c 65 64 nd_apdu() failed
d420: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 , returning in f
d430: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 ailure");....ret
d440: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 23 69 66 urn(-1);..}..#if
d450: 64 65 66 20 43 41 43 4b 45 59 5f 50 41 52 41 4e def CACKEY_PARAN
d460: 4f 49 44 0a 23 20 20 69 66 64 65 66 20 5f 50 4f OID.# ifdef _PO
d470: 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69 SIX_SSIZE_MAX..i
d480: 66 20 28 62 75 66 66 65 72 5f 6c 65 6e 20 3e 20 f (buffer_len >
d490: 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 _POSIX_SSIZE_MAX
d4a0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
d4b0: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 61 64 20 UG_PRINTF("Read
d4c0: 62 79 74 65 73 20 28 62 75 66 66 65 72 5f 6c 65 bytes (buffer_le
d4d0: 6e 29 20 65 78 63 65 65 64 73 20 6d 61 78 69 6d n) exceeds maxim
d4e0: 75 6d 20 76 61 6c 75 65 2c 20 72 65 74 75 72 6e um value, return
d4f0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 ing in failure.
d500: 28 6d 61 78 20 3d 20 25 6c 69 2c 20 62 75 66 66 (max = %li, buff
d510: 65 72 5f 6c 65 6e 20 3d 20 25 6c 75 29 22 2c 20 er_len = %lu)",
d520: 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53 (long) _POSIX_SS
d530: 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e IZE_MAX, (unsign
d540: 65 64 20 6c 6f 6e 67 29 20 62 75 66 66 65 72 5f ed long) buffer_
d550: 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 len);....return(
d560: 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69 66 -1);..}.# endif
d570: 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28 62 75 .#endif...if (bu
d580: 66 66 65 72 5f 6c 65 6e 20 3c 20 32 29 20 7b 0a ffer_len < 2) {.
d590: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
d5a0: 52 49 4e 54 46 28 22 41 50 44 55 20 47 45 54 20 RINTF("APDU GET
d5b0: 44 41 54 41 20 72 65 74 75 72 6e 65 64 20 25 6c DATA returned %l
d5c0: 75 20 62 79 74 65 73 2c 20 77 68 69 63 68 20 69 u bytes, which i
d5d0: 73 20 74 6f 6f 20 73 68 6f 72 74 20 66 6f 72 20 s too short for
d5e0: 61 20 42 45 52 2d 54 4c 56 20 72 65 73 70 6f 6e a BER-TLV respon
d5f0: 73 65 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c se", (unsigned l
d600: 6f 6e 67 29 20 62 75 66 66 65 72 5f 6c 65 6e 29 ong) buffer_len)
d610: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b ;....return(-1);
d620: 0a 09 7d 0a 0a 09 73 69 7a 65 20 3d 20 62 75 66 ..}...size = buf
d630: 66 65 72 5f 6c 65 6e 3b 0a 09 62 75 66 66 65 72 fer_len;..buffer
d640: 5f 70 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 _p = cackey_read
d650: 5f 62 65 72 74 6c 76 5f 74 61 67 28 62 75 66 66 _bertlv_tag(buff
d660: 65 72 2c 20 26 62 75 66 66 65 72 5f 6c 65 6e 2c er, &buffer_len,
d670: 20 30 78 35 33 2c 20 4e 55 4c 4c 2c 20 26 73 69 0x53, NULL, &si
d680: 7a 65 29 3b 0a 0a 09 69 66 20 28 62 75 66 66 65 ze);...if (buffe
d690: 72 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 r_p == NULL) {..
d6a0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
d6b0: 49 4e 54 46 28 22 54 61 67 20 64 65 63 6f 64 69 INTF("Tag decodi
d6c0: 6e 67 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 ng failed, retur
d6d0: 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 2e 22 29 ning in error.")
d6e0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b ;....return(-1);
d6f0: 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 ..}...CACKEY_DEB
d700: 55 47 5f 50 52 49 4e 54 42 55 46 28 22 47 45 54 UG_PRINTBUF("GET
d710: 20 44 41 54 41 20 72 65 73 75 6c 74 22 2c 20 62 DATA result", b
d720: 75 66 66 65 72 2c 20 73 69 7a 65 29 3b 0a 0a 09 uffer, size);...
d730: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
d740: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 NTF("Returning i
d750: 6e 20 73 75 63 63 65 73 73 2c 20 72 65 61 64 20 n success, read
d760: 25 6c 75 20 62 79 74 65 73 22 2c 20 28 75 6e 73 %lu bytes", (uns
d770: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65 igned long) size
d780: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 73 69 7a 65 );...return(size
d790: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 );.}../*. * SYNP
d7a0: 4f 53 49 53 0a 20 2a 20 20 20 20 20 73 73 69 7a OSIS. * ssiz
d7b0: 65 5f 74 20 63 61 63 6b 65 79 5f 72 65 61 64 5f e_t cackey_read_
d7c0: 62 75 66 66 65 72 28 73 74 72 75 63 74 20 63 61 buffer(struct ca
d7d0: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c ckey_slot *slot,
d7e0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
d7f0: 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 63 buffer, size_t c
d800: 6f 75 6e 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 ount, unsigned c
d810: 68 61 72 20 74 5f 6f 72 5f 76 2c 20 73 69 7a 65 har t_or_v, size
d820: 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 _t initial_offse
d830: 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 t);. *. * ARGUME
d840: 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63 NTS. * struc
d850: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 t cackey_slot *s
d860: 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 lot. * S
d870: 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d lot to send comm
d880: 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 ands to. *. *
d890: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 unsigned char
d8a0: 2a 62 75 66 66 65 72 0a 20 2a 20 20 20 20 20 20 *buffer. *
d8b0: 20 20 20 5b 4f 55 54 5d 20 42 75 66 66 65 72 0a [OUT] Buffer.
d8c0: 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 *. * size_t
d8d0: 20 63 6f 75 6e 74 0a 20 2a 20 20 20 20 20 20 20 count. *
d8e0: 20 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 Number of byte
d8f0: 73 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 s to attempt to
d900: 72 65 61 64 0a 20 2a 0a 20 2a 20 20 20 20 20 75 read. *. * u
d910: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 5f 6f nsigned char t_o
d920: 72 5f 76 0a 20 2a 20 20 20 20 20 20 20 20 20 53 r_v. * S
d930: 65 6c 65 63 74 20 74 68 65 20 54 2d 62 75 66 66 elect the T-buff
d940: 65 72 20 28 30 31 29 20 6f 72 20 56 2d 62 75 66 er (01) or V-buf
d950: 66 65 72 20 28 30 32 29 20 74 6f 20 72 65 61 64 fer (02) to read
d960: 20 66 72 6f 6d 2e 20 20 0a 20 2a 0a 20 2a 20 20 from. . *. *
d970: 20 20 20 73 69 7a 65 5f 74 20 69 6e 69 74 69 61 size_t initia
d980: 6c 5f 6f 66 66 73 65 74 0a 20 2a 20 20 20 20 20 l_offset. *
d990: 20 20 20 20 53 70 65 63 69 66 79 20 74 68 65 20 Specify the
d9a0: 6f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e 20 offset to begin
d9b0: 74 68 65 20 72 65 61 64 20 66 72 6f 6d 0a 20 2a the read from. *
d9c0: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 . *. * RETURN VA
d9d0: 4c 55 45 0a 20 2a 20 20 20 20 20 54 68 69 73 20 LUE. * This
d9e0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 function returns
d9f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 the number of b
da00: 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 ytes actually re
da10: 61 64 2c 20 6f 72 20 2d 31 20 6f 6e 20 65 72 72 ad, or -1 on err
da20: 6f 72 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a or.. *. * NOTES.
da30: 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 * None. *.
da40: 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f */.static ssize_
da50: 74 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 t cackey_read_bu
da60: 66 66 65 72 28 73 74 72 75 63 74 20 63 61 63 6b ffer(struct cack
da70: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 ey_slot *slot, u
da80: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 nsigned char *bu
da90: 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 63 6f 75 ffer, size_t cou
daa0: 6e 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nt, unsigned cha
dab0: 72 20 74 5f 6f 72 5f 76 2c 20 73 69 7a 65 5f 74 r t_or_v, size_t
dac0: 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 29 initial_offset)
dad0: 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 {..unsigned cha
dae0: 72 20 2a 69 6e 69 74 5f 62 75 66 66 65 72 3b 0a r *init_buffer;.
daf0: 09 73 69 7a 65 5f 74 20 69 6e 69 74 5f 63 6f 75 .size_t init_cou
db00: 6e 74 3b 0a 09 73 69 7a 65 5f 74 20 69 6e 69 74 nt;..size_t init
db10: 5f 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 3b _initial_offset;
db20: 0a 0a 09 73 69 7a 65 5f 74 20 6f 66 66 73 65 74 ...size_t offset
db30: 20 3d 20 30 2c 20 6d 61 78 5f 6f 66 66 73 65 74 = 0, max_offset
db40: 2c 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09 75 6e , max_count;..un
db50: 73 69 67 6e 65 64 20 63 68 61 72 20 63 6d 64 5b signed char cmd[
db60: 32 5d 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 2];..uint16_t re
db70: 73 70 63 6f 64 65 3b 0a 09 69 6e 74 20 73 65 6e spcode;..int sen
db80: 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f d_ret;...CACKEY_
db90: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
dba0: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 6e 69 74 5f lled.");...init_
dbb0: 62 75 66 66 65 72 20 3d 20 62 75 66 66 65 72 3b buffer = buffer;
dbc0: 0a 09 69 6e 69 74 5f 63 6f 75 6e 74 20 3d 20 63 ..init_count = c
dbd0: 6f 75 6e 74 3b 0a 09 69 6e 69 74 5f 69 6e 69 74 ount;..init_init
dbe0: 69 61 6c 5f 6f 66 66 73 65 74 20 3d 20 69 6e 69 ial_offset = ini
dbf0: 74 69 61 6c 5f 6f 66 66 73 65 74 3b 0a 0a 09 6d tial_offset;...m
dc00: 61 78 5f 6f 66 66 73 65 74 20 3d 20 63 6f 75 6e ax_offset = coun
dc10: 74 3b 0a 09 6d 61 78 5f 63 6f 75 6e 74 20 3d 20 t;..max_count =
dc20: 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 3b CACKEY_APDU_MTU;
dc30: 0a 0a 09 69 66 20 28 74 5f 6f 72 5f 76 20 21 3d ...if (t_or_v !=
dc40: 20 31 20 26 26 20 74 5f 6f 72 5f 76 20 21 3d 20 1 && t_or_v !=
dc50: 32 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 2) {...CACKEY_DE
dc60: 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 BUG_PRINTF("Inva
dc70: 6c 69 64 20 54 20 6f 72 20 56 20 70 61 72 61 6d lid T or V param
dc80: 65 74 65 72 20 73 70 65 63 69 66 69 65 64 2c 20 eter specified,
dc90: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 returning in fai
dca0: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 lure");....retur
dcb0: 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 63 6d 64 5b n(-1);..}...cmd[
dcc0: 30 5d 20 3d 20 74 5f 6f 72 5f 76 3b 0a 0a 09 77 0] = t_or_v;...w
dcd0: 68 69 6c 65 20 28 31 29 20 7b 0a 09 09 69 66 20 hile (1) {...if
dce0: 28 6f 66 66 73 65 74 20 3e 3d 20 6d 61 78 5f 6f (offset >= max_o
dcf0: 66 66 73 65 74 29 20 7b 0a 09 09 09 43 41 43 4b ffset) {....CACK
dd00: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
dd10: 22 42 75 66 66 65 72 20 74 6f 6f 20 73 6d 61 6c "Buffer too smal
dd20: 6c 2c 20 72 65 74 75 72 6e 69 6e 67 20 77 68 61 l, returning wha
dd30: 74 20 77 65 20 67 6f 74 2e 2e 2e 22 29 3b 0a 0a t we got...");..
dd40: 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 ...break;...}...
dd50: 09 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 6f 66 66 .count = max_off
dd60: 73 65 74 20 2d 20 6f 66 66 73 65 74 3b 0a 09 09 set - offset;...
dd70: 69 66 20 28 63 6f 75 6e 74 20 3e 20 6d 61 78 5f if (count > max_
dd80: 63 6f 75 6e 74 29 20 7b 0a 09 09 09 63 6f 75 6e count) {....coun
dd90: 74 20 3d 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09 t = max_count;..
dda0: 09 7d 0a 0a 09 09 63 6d 64 5b 31 5d 20 3d 20 63 .}....cmd[1] = c
ddb0: 6f 75 6e 74 3b 0a 0a 09 09 73 65 6e 64 5f 72 65 ount;....send_re
ddc0: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f t = cackey_send_
ddd0: 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 apdu(slot, GSCIS
dde0: 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c _CLASS_GLOBAL_PL
ddf0: 41 54 46 4f 52 4d 2c 20 47 53 43 49 53 5f 49 4e ATFORM, GSCIS_IN
de00: 53 54 52 5f 52 45 41 44 5f 42 55 46 46 45 52 2c STR_READ_BUFFER,
de10: 20 28 28 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 ((initial_offse
de20: 74 20 2b 20 6f 66 66 73 65 74 29 20 3e 3e 20 38 t + offset) >> 8
de30: 29 20 26 20 30 78 66 66 2c 20 28 69 6e 69 74 69 ) & 0xff, (initi
de40: 61 6c 5f 6f 66 66 73 65 74 20 2b 20 6f 66 66 73 al_offset + offs
de50: 65 74 29 20 26 20 30 78 66 66 2c 20 73 69 7a 65 et) & 0xff, size
de60: 6f 66 28 63 6d 64 29 2c 20 63 6d 64 2c 20 30 78 of(cmd), cmd, 0x
de70: 30 30 2c 20 26 72 65 73 70 63 6f 64 65 2c 20 62 00, &respcode, b
de80: 75 66 66 65 72 20 2b 20 6f 66 66 73 65 74 2c 20 uffer + offset,
de90: 26 63 6f 75 6e 74 29 3b 0a 0a 09 09 69 66 20 28 &count);....if (
dea0: 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b send_ret == CACK
deb0: 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29 EY_PCSC_E_RETRY)
dec0: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 {....CACKEY_DEB
ded0: 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20 UG_PRINTF("ADPU
dee0: 53 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 2c 20 Sending failed,
def0: 72 65 74 72 79 69 6e 67 20 72 65 61 64 20 62 75 retrying read bu
df00: 66 66 65 72 22 29 3b 0a 0a 09 09 09 72 65 74 75 ffer");.....retu
df10: 72 6e 28 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 rn(cackey_read_b
df20: 75 66 66 65 72 28 73 6c 6f 74 2c 20 69 6e 69 74 uffer(slot, init
df30: 5f 62 75 66 66 65 72 2c 20 69 6e 69 74 5f 63 6f _buffer, init_co
df40: 75 6e 74 2c 20 74 5f 6f 72 5f 76 2c 20 69 6e 69 unt, t_or_v, ini
df50: 74 5f 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 t_initial_offset
df60: 29 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 ));...}....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 09 69 66 20 28 72 65 73 70 63 6f 64 65 20 3d ..if (respcode =
dfa0: 3d 20 30 78 36 41 38 36 29 20 7b 0a 09 09 09 09 = 0x6A86) {.....
dfb0: 69 66 20 28 6d 61 78 5f 63 6f 75 6e 74 20 3d 3d if (max_count ==
dfc0: 20 31 29 20 7b 0a 09 09 09 09 09 62 72 65 61 6b 1) {......break
dfd0: 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 6d 61 78 ;.....}......max
dfe0: 5f 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 63 6f 75 _count = max_cou
dff0: 6e 74 20 2f 20 32 3b 0a 0a 09 09 09 09 63 6f 6e nt / 2;......con
e000: 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 tinue;....}.....
e010: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
e020: 4e 54 46 28 22 63 61 63 6b 65 79 5f 73 65 6e 64 NTF("cackey_send
e030: 5f 61 70 64 75 28 29 20 66 61 69 6c 65 64 2c 20 _apdu() failed,
e040: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 returning in fai
e050: 6c 75 72 65 22 29 3b 0a 0a 09 09 09 72 65 74 75 lure");.....retu
e060: 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 6f rn(-1);...}....o
e070: 66 66 73 65 74 20 2b 3d 20 63 6f 75 6e 74 3b 0a ffset += count;.
e080: 0a 09 09 69 66 20 28 63 6f 75 6e 74 20 3c 20 6d ...if (count < m
e090: 61 78 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43 ax_count) {....C
e0a0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
e0b0: 54 46 28 22 53 68 6f 72 74 20 72 65 61 64 20 2d TF("Short read -
e0c0: 2d 20 63 6f 75 6e 74 20 3d 20 25 69 2c 20 63 6d - count = %i, cm
e0d0: 64 5b 31 5d 20 3d 20 25 69 22 2c 20 28 69 6e 74 d[1] = %i", (int
e0e0: 29 20 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63 ) count, (int) c
e0f0: 6d 64 5b 31 5d 29 3b 0a 0a 09 09 09 62 72 65 61 md[1]);.....brea
e100: 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 k;...}..}..#ifde
e110: 66 20 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49 f CACKEY_PARANOI
e120: 44 0a 23 20 20 69 66 64 65 66 20 5f 50 4f 53 49 D.# ifdef _POSI
e130: 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20 X_SSIZE_MAX..if
e140: 28 6f 66 66 73 65 74 20 3e 20 5f 50 4f 53 49 58 (offset > _POSIX
e150: 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 _SSIZE_MAX) {...
e160: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
e170: 4e 54 46 28 22 4f 66 66 73 65 74 20 65 78 63 65 NTF("Offset exce
e180: 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 eds maximum valu
e190: 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 e, returning in
e1a0: 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20 failure. (max =
e1b0: 25 6c 69 2c 20 6f 66 66 73 65 74 20 3d 20 25 6c %li, offset = %l
e1c0: 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 u)", (long) _POS
e1d0: 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75 IX_SSIZE_MAX, (u
e1e0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 66 nsigned long) of
e1f0: 66 73 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e fset);....return
e200: 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69 (-1);..}.# endi
e210: 66 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 f.#endif...CACKE
e220: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
e230: 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 Returning in suc
e240: 63 65 73 73 2c 20 72 65 61 64 20 25 6c 75 20 62 cess, read %lu b
e250: 79 74 65 73 22 2c 20 28 75 6e 73 69 67 6e 65 64 ytes", (unsigned
e260: 20 6c 6f 6e 67 29 20 6f 66 66 73 65 74 29 3b 0a long) offset);.
e270: 0a 09 72 65 74 75 72 6e 28 6f 66 66 73 65 74 29 ..return(offset)
e280: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f ;.}../*. * SYNPO
e290: 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 SIS. * cacke
e2a0: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6c y_ret cackey_sel
e2b0: 65 63 74 5f 61 70 70 6c 65 74 28 73 74 72 75 63 ect_applet(struc
e2c0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 t cackey_slot *s
e2d0: 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 lot, unsigned ch
e2e0: 61 72 20 2a 61 69 64 2c 20 73 69 7a 65 5f 74 20 ar *aid, size_t
e2f0: 61 69 64 5f 6c 65 6e 29 3b 0a 20 2a 0a 20 2a 20 aid_len);. *. *
e300: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 ARGUMENTS. *
e310: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 struct cackey_s
e320: 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 lot *slot. *
e330: 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e Slot to sen
e340: 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a d commands to. *
e350: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 . * unsigned
e360: 20 63 68 61 72 20 2a 61 69 64 0a 20 2a 20 20 20 char *aid. *
e370: 20 20 20 20 20 20 42 75 66 66 65 72 20 63 6f 6e Buffer con
e380: 74 61 69 6e 69 6e 67 20 41 70 70 6c 65 74 20 49 taining Applet I
e390: 44 20 74 6f 20 73 65 6c 65 63 74 0a 20 2a 0a 20 D to select. *.
e3a0: 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 61 69 64 * size_t aid
e3b0: 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 _len. *
e3c0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 Number of bytes
e3d0: 69 6e 20 74 68 65 20 22 61 69 64 22 20 28 41 70 in the "aid" (Ap
e3e0: 70 6c 65 74 20 49 44 29 20 70 61 72 61 6d 65 74 plet ID) paramet
e3f0: 65 72 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 er. *. * RETURN
e400: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 VALUE. * CAC
e410: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 KEY_PCSC_S_OK
e420: 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 On success
e430: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 . * CACKEY_P
e440: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 CSC_E_GENERIC
e450: 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 On error. *. *
e460: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e NOTES. * Non
e470: 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 e. *. */.static
e480: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 cackey_ret cacke
e490: 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 y_select_applet(
e4a0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c struct cackey_sl
e4b0: 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e ot *slot, unsign
e4c0: 65 64 20 63 68 61 72 20 2a 61 69 64 2c 20 73 69 ed char *aid, si
e4d0: 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 29 20 7b 0a ze_t aid_len) {.
e4e0: 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a .int send_ret;..
e4f0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
e500: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
e510: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
e520: 50 52 49 4e 54 42 55 46 28 22 53 65 6c 65 63 74 PRINTBUF("Select
e530: 69 6e 67 20 61 70 70 6c 65 74 3a 22 2c 20 61 69 ing applet:", ai
e540: 64 2c 20 61 69 64 5f 6c 65 6e 29 3b 0a 0a 09 73 d, aid_len);...s
e550: 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 end_ret = cackey
e560: 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c _send_apdu(slot,
e570: 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f GSCIS_CLASS_ISO
e580: 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 54 7816, GSCIS_INST
e590: 52 5f 53 45 4c 45 43 54 2c 20 47 53 43 49 53 5f R_SELECT, GSCIS_
e5a0: 50 41 52 41 4d 5f 53 45 4c 45 43 54 5f 41 50 50 PARAM_SELECT_APP
e5b0: 4c 45 54 2c 20 30 78 30 30 2c 20 61 69 64 5f 6c LET, 0x00, aid_l
e5c0: 65 6e 2c 20 61 69 64 2c 20 30 78 30 30 2c 20 4e en, aid, 0x00, N
e5d0: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 ULL, NULL, NULL)
e5e0: 3b 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 ;...if (send_ret
e5f0: 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f == CACKEY_PCSC_
e600: 45 5f 52 45 54 52 59 29 20 7b 0a 09 09 43 41 43 E_RETRY) {...CAC
e610: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
e620: 28 22 41 44 50 55 20 53 65 6e 64 69 6e 67 20 66 ("ADPU Sending f
e630: 61 69 6c 65 64 2c 20 72 65 74 72 79 69 6e 67 20 ailed, retrying
e640: 73 65 6c 65 63 74 20 61 70 70 6c 65 74 22 29 3b select applet");
e650: 0a 0a 09 09 72 65 74 75 72 6e 28 63 61 63 6b 65 ....return(cacke
e660: 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 y_select_applet(
e670: 73 6c 6f 74 2c 20 61 69 64 2c 20 61 69 64 5f 6c slot, aid, aid_l
e680: 65 6e 29 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 en));..}...if (s
e690: 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 end_ret != CACKE
e6a0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 Y_PCSC_S_OK) {..
e6b0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
e6c0: 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 INTF("Failed to
e6d0: 6f 70 65 6e 20 61 70 70 6c 65 74 2c 20 72 65 74 open applet, ret
e6e0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 urning in failur
e6f0: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 e");....return(C
e700: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e ACKEY_PCSC_E_GEN
e710: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b ERIC);..}...CACK
e720: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
e730: 22 53 75 63 63 65 73 73 66 75 6c 6c 79 20 73 65 "Successfully se
e740: 6c 65 63 74 65 64 20 66 69 6c 65 22 29 3b 0a 0a lected file");..
e750: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 .return(CACKEY_P
e760: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a CSC_S_OK);.}../*
e770: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 . * SYNPOSIS. *
e780: 20 20 20 20 63 61 63 6b 65 79 5f 70 63 73 63 5f cackey_pcsc_
e790: 69 64 5f 74 79 70 65 20 63 61 63 6b 65 79 5f 64 id_type cackey_d
e7a0: 65 74 65 63 74 5f 61 6e 64 5f 73 65 6c 65 63 74 etect_and_select
e7b0: 5f 72 6f 6f 74 5f 61 70 70 6c 65 74 28 73 74 72 _root_applet(str
e7c0: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 uct cackey_slot
e7d0: 2a 73 6c 6f 74 2c 20 63 61 63 6b 65 79 5f 70 63 *slot, cackey_pc
e7e0: 73 63 5f 69 64 5f 74 79 70 65 20 74 79 70 65 5f sc_id_type type_
e7f0: 68 69 6e 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 hint);. *. * ARG
e800: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 UMENTS. * st
e810: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 ruct cackey_slot
e820: 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 *slot. *
e830: 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 Slot to send c
e840: 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a ommands to. *. *
e850: 20 20 20 20 20 63 61 63 6b 65 79 5f 70 63 73 63 cackey_pcsc
e860: 5f 69 64 5f 74 79 70 65 20 74 79 70 65 5f 68 69 _id_type type_hi
e870: 6e 74 0a 20 2a 20 20 20 20 20 20 20 20 20 41 20 nt. * A
e880: 68 69 6e 74 20 61 73 20 74 6f 20 77 68 69 63 68 hint as to which
e890: 20 74 79 70 65 20 6f 66 20 63 61 72 64 20 6d 69 type of card mi
e8a0: 67 68 74 20 62 65 20 69 6e 20 74 68 69 73 20 73 ght be in this s
e8b0: 6c 6f 74 20 28 43 41 43 20 6f 72 20 50 49 56 29 lot (CAC or PIV)
e8c0: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 . *. * RETURN VA
e8d0: 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 LUE. * CACKE
e8e0: 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 20 20 20 Y_ID_TYPE_PIV
e8f0: 20 20 20 20 49 66 20 74 68 65 20 63 61 72 64 20 If the card
e900: 63 6f 6e 6e 65 63 74 65 64 20 69 73 20 61 20 50 connected is a P
e910: 49 56 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 IV. * CACKEY
e920: 5f 49 44 5f 54 59 50 45 5f 43 41 43 20 20 20 20 _ID_TYPE_CAC
e930: 20 20 20 49 66 20 74 68 65 20 63 61 72 64 20 63 If the card c
e940: 6f 6e 6e 65 63 74 65 64 20 69 73 20 61 20 43 41 onnected is a CA
e950: 43 20 77 69 74 68 20 74 68 65 20 43 43 43 0a 20 C with the CCC.
e960: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 *
e970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 a
e980: 70 70 6c 65 74 0a 20 2a 20 20 20 20 20 43 41 43 pplet. * CAC
e990: 4b 45 59 5f 49 44 5f 54 59 50 45 5f 45 52 52 4f KEY_ID_TYPE_ERRO
e9a0: 52 20 20 20 20 20 49 66 20 77 65 20 61 72 65 20 R If we are
e9b0: 75 6e 61 62 6c 65 20 74 6f 20 64 65 74 65 72 6d unable to determ
e9c0: 69 6e 65 20 77 68 61 74 20 74 79 70 65 20 6f 66 ine what type of
e9d0: 20 63 61 72 64 0a 20 2a 20 20 20 20 20 20 20 20 card. *
e9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
e9f0: 20 20 20 20 20 20 69 73 20 63 6f 6e 6e 65 63 74 is connect
ea00: 65 64 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 ed. *. * NOTES.
ea10: 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 * This funct
ea20: 69 6f 6e 20 72 65 73 65 6c 65 63 74 73 20 74 68 ion reselects th
ea30: 65 20 22 72 6f 6f 74 22 20 61 70 70 6c 65 74 2c e "root" applet,
ea40: 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 after this func
ea50: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 0a 20 tion is called.
ea60: 2a 20 20 20 20 20 74 68 65 20 75 73 65 72 20 6d * the user m
ea70: 61 79 20 62 65 20 72 65 71 75 69 72 65 64 20 74 ay be required t
ea80: 6f 20 6c 6f 67 69 6e 20 61 67 61 69 6e 0a 20 2a o login again. *
ea90: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b . */.static cack
eaa0: 65 79 5f 70 63 73 63 5f 69 64 5f 74 79 70 65 20 ey_pcsc_id_type
eab0: 63 61 63 6b 65 79 5f 64 65 74 65 63 74 5f 61 6e cackey_detect_an
eac0: 64 5f 73 65 6c 65 63 74 5f 72 6f 6f 74 5f 61 70 d_select_root_ap
ead0: 70 6c 65 74 28 73 74 72 75 63 74 20 63 61 63 6b plet(struct cack
eae0: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 63 ey_slot *slot, c
eaf0: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 5f 74 79 ackey_pcsc_id_ty
eb00: 70 65 20 74 79 70 65 5f 68 69 6e 74 29 20 7b 0a pe type_hint) {.
eb10: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 .unsigned char c
eb20: 61 63 5f 63 63 63 5f 61 69 64 5b 5d 20 3d 20 7b ac_ccc_aid[] = {
eb30: 47 53 43 49 53 5f 41 49 44 5f 43 43 43 7d 3b 0a GSCIS_AID_CCC};.
eb40: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 .unsigned char c
eb50: 61 63 5f 69 64 30 5f 61 69 64 5b 5d 20 3d 20 7b ac_id0_aid[] = {
eb60: 47 53 43 49 53 5f 41 49 44 5f 49 44 30 7d 3b 0a GSCIS_AID_ID0};.
eb70: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 .unsigned char p
eb80: 69 76 5f 61 69 64 5b 5d 20 3d 20 7b 4e 49 53 54 iv_aid[] = {NIST
eb90: 53 50 38 30 30 5f 37 33 5f 33 5f 50 49 56 5f 41 SP800_73_3_PIV_A
eba0: 49 44 7d 3b 0a 09 63 61 63 6b 65 79 5f 70 63 73 ID};..cackey_pcs
ebb0: 63 5f 69 64 5f 74 79 70 65 20 74 72 79 5f 74 79 c_id_type try_ty
ebc0: 70 65 73 5b 32 5d 2c 20 74 72 79 5f 74 79 70 65 pes[2], try_type
ebd0: 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b ;..int send_ret;
ebe0: 0a 09 69 6e 74 20 69 64 78 3b 0a 0a 09 43 41 43 ..int idx;...CAC
ebf0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
ec00: 28 22 52 65 73 65 6c 65 63 74 69 6e 67 20 74 68 ("Reselecting th
ec10: 65 20 72 6f 6f 74 20 61 70 70 6c 65 74 22 29 3b e root applet");
ec20: 0a 0a 09 69 66 20 28 74 79 70 65 5f 68 69 6e 74 ...if (type_hint
ec30: 20 3d 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 == CACKEY_ID_TY
ec40: 50 45 5f 55 4e 4b 4e 4f 57 4e 29 20 7b 0a 09 09 PE_UNKNOWN) {...
ec50: 74 79 70 65 5f 68 69 6e 74 20 3d 20 73 6c 6f 74 type_hint = slot
ec60: 2d 3e 69 64 5f 74 79 70 65 5f 68 69 6e 74 3b 0a ->id_type_hint;.
ec70: 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 69 64 5f 74 79 .}...slot->id_ty
ec80: 70 65 5f 68 69 6e 74 20 3d 20 43 41 43 4b 45 59 pe_hint = CACKEY
ec90: 5f 49 44 5f 54 59 50 45 5f 55 4e 4b 4e 4f 57 4e _ID_TYPE_UNKNOWN
eca0: 3b 0a 0a 09 73 77 69 74 63 68 20 28 74 79 70 65 ;...switch (type
ecb0: 5f 68 69 6e 74 29 20 7b 0a 09 09 63 61 73 65 20 _hint) {...case
ecc0: 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 CACKEY_ID_TYPE_P
ecd0: 49 56 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 IV:....CACKEY_DE
ece0: 42 55 47 5f 50 52 49 4e 54 46 28 22 54 72 79 69 BUG_PRINTF("Tryi
ecf0: 6e 67 20 74 6f 20 72 65 73 65 6c 65 63 74 20 74 ng to reselect t
ed00: 68 65 20 50 49 56 20 72 6f 6f 74 20 61 70 70 6c he PIV root appl
ed10: 65 74 20 66 69 72 73 74 22 29 3b 0a 0a 09 09 09 et first");.....
ed20: 74 72 79 5f 74 79 70 65 73 5b 30 5d 20 3d 20 43 try_types[0] = C
ed30: 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 ACKEY_ID_TYPE_PI
ed40: 56 3b 0a 09 09 09 74 72 79 5f 74 79 70 65 73 5b V;....try_types[
ed50: 31 5d 20 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54 1] = CACKEY_ID_T
ed60: 59 50 45 5f 43 41 43 3b 0a 0a 09 09 09 62 72 65 YPE_CAC;.....bre
ed70: 61 6b 3b 0a 09 09 64 65 66 61 75 6c 74 3a 0a 09 ak;...default:..
ed80: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
ed90: 52 49 4e 54 46 28 22 54 72 79 69 6e 67 20 74 6f RINTF("Trying to
eda0: 20 72 65 73 65 6c 65 63 74 20 74 68 65 20 43 41 reselect the CA
edb0: 43 20 43 43 43 20 61 70 70 6c 65 74 20 66 69 72 C CCC applet fir
edc0: 73 74 22 29 3b 0a 0a 09 09 09 74 72 79 5f 74 79 st");.....try_ty
edd0: 70 65 73 5b 30 5d 20 3d 20 43 41 43 4b 45 59 5f pes[0] = CACKEY_
ede0: 49 44 5f 54 59 50 45 5f 43 41 43 3b 0a 09 09 09 ID_TYPE_CAC;....
edf0: 74 72 79 5f 74 79 70 65 73 5b 31 5d 20 3d 20 43 try_types[1] = C
ee00: 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 ACKEY_ID_TYPE_PI
ee10: 56 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d V;.....break;..}
ee20: 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b ...for (idx = 0;
ee30: 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 74 idx < (sizeof(t
ee40: 72 79 5f 74 79 70 65 73 29 20 2f 20 73 69 7a 65 ry_types) / size
ee50: 6f 66 28 74 72 79 5f 74 79 70 65 73 5b 30 5d 29 of(try_types[0])
ee60: 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 74 72 ); idx++) {...tr
ee70: 79 5f 74 79 70 65 20 3d 20 74 72 79 5f 74 79 70 y_type = try_typ
ee80: 65 73 5b 69 64 78 5d 3b 0a 0a 09 09 73 77 69 74 es[idx];....swit
ee90: 63 68 20 28 74 72 79 5f 74 79 70 65 29 20 7b 0a ch (try_type) {.
eea0: 09 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 ...case CACKEY_I
eeb0: 44 5f 54 59 50 45 5f 43 41 43 3a 0a 09 09 09 09 D_TYPE_CAC:.....
eec0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
eed0: 4e 54 46 28 22 54 72 79 69 6e 67 20 74 6f 20 73 NTF("Trying to s
eee0: 65 6c 65 63 74 20 74 68 65 20 43 41 43 20 43 43 elect the CAC CC
eef0: 43 20 61 70 70 6c 65 74 22 29 3b 0a 0a 09 09 09 C applet");.....
ef00: 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b .send_ret = cack
ef10: 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 ey_select_applet
ef20: 28 73 6c 6f 74 2c 20 63 61 63 5f 63 63 63 5f 61 (slot, cac_ccc_a
ef30: 69 64 2c 20 73 69 7a 65 6f 66 28 63 61 63 5f 63 id, sizeof(cac_c
ef40: 63 63 5f 61 69 64 29 29 3b 0a 09 09 09 09 69 66 cc_aid));.....if
ef50: 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 (send_ret != CA
ef60: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 CKEY_PCSC_S_OK)
ef70: 7b 0a 09 09 09 09 09 73 65 6e 64 5f 72 65 74 20 {......send_ret
ef80: 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f = cackey_select_
ef90: 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63 61 63 applet(slot, cac
efa0: 5f 69 64 30 5f 61 69 64 2c 20 73 69 7a 65 6f 66 _id0_aid, sizeof
efb0: 28 63 61 63 5f 69 64 30 5f 61 69 64 29 29 3b 0a (cac_id0_aid));.
efc0: 09 09 09 09 7d 0a 0a 09 09 09 09 62 72 65 61 6b ....}......break
efd0: 3b 0a 09 09 09 63 61 73 65 20 43 41 43 4b 45 59 ;....case CACKEY
efe0: 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09 _ID_TYPE_PIV:...
eff0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
f000: 52 49 4e 54 46 28 22 54 72 79 69 6e 67 20 74 6f RINTF("Trying to
f010: 20 73 65 6c 65 63 74 20 74 68 65 20 50 49 56 20 select the PIV
f020: 72 6f 6f 74 20 61 70 70 6c 65 74 22 29 3b 0a 0a root applet");..
f030: 09 09 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 ....send_ret = c
f040: 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 ackey_select_app
f050: 6c 65 74 28 73 6c 6f 74 2c 20 70 69 76 5f 61 69 let(slot, piv_ai
f060: 64 2c 20 73 69 7a 65 6f 66 28 70 69 76 5f 61 69 d, sizeof(piv_ai
f070: 64 29 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b d));......break;
f080: 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 65 6e 64 ...}....if (send
f090: 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 _ret == CACKEY_P
f0a0: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 CSC_S_OK) {....C
f0b0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
f0c0: 54 46 28 22 53 75 63 63 65 73 73 66 75 6c 6c 79 TF("Successfully
f0d0: 20 73 65 6c 65 63 74 65 64 20 74 68 65 20 25 73 selected the %s
f0e0: 20 61 70 70 6c 65 74 20 2d 2d 20 73 65 74 74 69 applet -- setti
f0f0: 6e 67 20 74 68 65 20 5c 22 4c 4f 47 49 4e 20 52 ng the \"LOGIN R
f100: 45 51 55 49 52 45 44 5c 22 20 66 6c 61 67 20 6f EQUIRED\" flag o
f110: 6e 20 74 68 65 20 74 6f 6b 65 6e 22 2c 0a 09 09 n the token",...
f120: 09 09 74 72 79 5f 74 79 70 65 20 3d 3d 20 43 41 ..try_type == CA
f130: 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 CKEY_ID_TYPE_CAC
f140: 20 3f 20 22 43 41 43 22 20 3a 20 22 50 49 56 22 ? "CAC" : "PIV"
f150: 0a 09 09 09 29 3b 0a 0a 09 09 09 73 6c 6f 74 2d ....);.....slot-
f160: 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 >token_flags = C
f170: 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 KF_LOGIN_REQUIRE
f180: 44 3b 0a 0a 09 09 09 73 6c 6f 74 2d 3e 69 64 5f D;.....slot->id_
f190: 74 79 70 65 5f 68 69 6e 74 20 3d 20 74 72 79 5f type_hint = try_
f1a0: 74 79 70 65 3b 0a 0a 09 09 09 72 65 74 75 72 6e type;.....return
f1b0: 28 74 72 79 5f 74 79 70 65 29 3b 0a 09 09 7d 0a (try_type);...}.
f1c0: 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 .}...CACKEY_DEBU
f1d0: 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 G_PRINTF("Unable
f1e0: 20 74 6f 20 73 65 6c 65 63 74 20 61 6e 79 20 61 to select any a
f1f0: 70 70 6c 65 74 2c 20 72 65 74 75 72 6e 69 6e 67 pplet, returning
f200: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a in failure");..
f210: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 49 .return(CACKEY_I
f220: 44 5f 54 59 50 45 5f 45 52 52 4f 52 29 3b 0a 7d D_TYPE_ERROR);.}
f230: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 ../*. * SYNPOSIS
f240: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 . * cackey_r
f250: 65 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 et cackey_select
f260: 5f 66 69 6c 65 28 73 74 72 75 63 74 20 63 61 63 _file(struct cac
f270: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 key_slot *slot,
f280: 75 69 6e 74 31 36 5f 74 20 65 66 29 3b 0a 20 2a uint16_t ef);. *
f290: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a . * ARGUMENTS. *
f2a0: 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63 6b struct cack
f2b0: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a ey_slot *slot. *
f2c0: 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f Slot to
f2d0: 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 send commands t
f2e0: 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 69 6e 74 o. *. * uint
f2f0: 31 36 5f 74 20 65 66 0a 20 2a 20 20 20 20 20 20 16_t ef. *
f300: 20 20 20 45 6c 65 6d 65 6e 74 61 6c 20 46 69 6c Elemental Fil
f310: 65 20 74 6f 20 73 65 6c 65 63 74 0a 20 2a 0a 20 e to select. *.
f320: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 * RETURN VALUE.
f330: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 * CACKEY_PCS
f340: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f C_S_OK O
f350: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 n success. *
f360: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 CACKEY_PCSC_E_G
f370: 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 ENERIC On err
f380: 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 or. *. * NOTES.
f390: 2a 20 20 20 20 20 54 68 69 73 20 73 65 6c 65 63 * This selec
f3a0: 74 73 20 61 6e 20 45 6c 65 6d 65 6e 74 61 72 79 ts an Elementary
f3b0: 20 46 69 6c 65 20 28 45 46 29 20 75 6e 64 65 72 File (EF) under
f3c0: 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 73 the currently s
f3d0: 65 6c 65 63 74 65 64 0a 20 2a 20 20 20 20 20 44 elected. * D
f3e0: 65 64 69 63 61 74 65 64 20 46 69 6c 65 20 28 44 edicated File (D
f3f0: 46 29 0a 20 2a 0a 20 2a 20 20 20 20 20 54 79 70 F). *. * Typ
f400: 69 63 61 6c 6c 79 20 74 68 69 73 20 69 73 20 63 ically this is c
f410: 61 6c 6c 65 64 20 61 66 74 65 72 20 73 65 6c 65 alled after sele
f420: 63 74 69 6e 67 20 74 68 65 20 63 6f 72 72 65 63 cting the correc
f430: 74 20 41 70 70 6c 65 74 20 28 75 73 69 6e 67 0a t Applet (using.
f440: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 65 * cackey_se
f450: 6c 65 63 74 5f 61 70 70 6c 65 74 29 20 66 6f 72 lect_applet) for
f460: 20 56 4d 20 63 61 72 64 73 0a 20 2a 0a 20 2a 2f VM cards. *. */
f470: 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 .static cackey_r
f480: 65 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 et cackey_select
f490: 5f 66 69 6c 65 28 73 74 72 75 63 74 20 63 61 63 _file(struct cac
f4a0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 key_slot *slot,
f4b0: 75 69 6e 74 31 36 5f 74 20 65 66 29 20 7b 0a 09 uint16_t ef) {..
f4c0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 66 69 unsigned char fi
f4d0: 64 5f 62 75 66 5b 32 5d 3b 0a 09 69 6e 74 20 73 d_buf[2];..int s
f4e0: 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 end_ret;...CACKE
f4f0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
f500: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 2f 2a 20 Called.");.../*
f510: 4f 70 65 6e 20 74 68 65 20 65 6c 65 6d 65 6e 74 Open the element
f520: 61 72 79 20 66 69 6c 65 20 2a 2f 0a 09 66 69 64 ary file */..fid
f530: 5f 62 75 66 5b 30 5d 20 3d 20 28 65 66 20 3e 3e _buf[0] = (ef >>
f540: 20 38 29 20 26 20 30 78 66 66 3b 0a 09 66 69 64 8) & 0xff;..fid
f550: 5f 62 75 66 5b 31 5d 20 3d 20 65 66 20 26 20 30 _buf[1] = ef & 0
f560: 78 66 66 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 xff;...CACKEY_DE
f570: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 6c 65 BUG_PRINTF("Sele
f580: 63 74 69 6e 67 20 66 69 6c 65 3a 20 25 30 34 6c cting file: %04l
f590: 78 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f x", (unsigned lo
f5a0: 6e 67 29 20 65 66 29 3b 0a 0a 09 73 65 6e 64 5f ng) ef);...send_
f5b0: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e ret = cackey_sen
f5c0: 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 d_apdu(slot, GSC
f5d0: 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 IS_CLASS_ISO7816
f5e0: 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 , GSCIS_INSTR_SE
f5f0: 4c 45 43 54 2c 20 30 78 30 32 2c 20 30 78 30 43 LECT, 0x02, 0x0C
f600: 2c 20 73 69 7a 65 6f 66 28 66 69 64 5f 62 75 66 , sizeof(fid_buf
f610: 29 2c 20 66 69 64 5f 62 75 66 2c 20 30 78 30 30 ), fid_buf, 0x00
f620: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 , NULL, NULL, NU
f630: 4c 4c 29 3b 0a 09 69 66 20 28 73 65 6e 64 5f 72 LL);..if (send_r
f640: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 et != CACKEY_PCS
f650: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b C_S_OK) {...CACK
f660: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
f670: 22 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 "Failed to open
f680: 66 69 6c 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 file, returning
f690: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 in failure");...
f6a0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 .return(CACKEY_P
f6b0: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a CSC_E_GENERIC);.
f6c0: 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 .}...CACKEY_DEBU
f6d0: 47 5f 50 52 49 4e 54 46 28 22 53 75 63 63 65 73 G_PRINTF("Succes
f6e0: 73 66 75 6c 6c 79 20 73 65 6c 65 63 74 65 64 20 sfully selected
f6f0: 66 69 6c 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e file");...return
f700: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f (CACKEY_PCSC_S_O
f710: 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e K);.}../*. * SYN
f720: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 76 6f 69 POSIS. * voi
f730: 64 20 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c d cackey_free_tl
f740: 76 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f v(struct cackey_
f750: 74 6c 76 5f 65 6e 74 69 74 79 20 2a 72 6f 6f 74 tlv_entity *root
f760: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e );. *. * ARGUMEN
f770: 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74 TS. * struct
f780: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 cackey_tlv_enti
f790: 74 79 20 2a 72 6f 6f 74 0a 20 2a 20 20 20 20 20 ty *root. *
f7a0: 20 20 20 20 52 6f 6f 74 20 6f 66 20 74 68 65 20 Root of the
f7b0: 54 4c 56 20 6c 69 73 74 20 74 6f 20 73 74 61 72 TLV list to star
f7c0: 74 20 66 72 65 65 69 6e 67 0a 20 2a 0a 20 2a 20 t freeing. *. *
f7d0: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 RETURN VALUE. *
f7e0: 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e None. *. * N
f7f0: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 OTES. * This
f800: 20 66 75 6e 63 74 69 6f 6e 20 66 72 65 65 73 20 function frees
f810: 74 68 65 20 54 4c 56 20 6c 69 6e 6b 65 64 20 6c the TLV linked l
f820: 69 73 74 65 64 20 72 65 74 75 72 6e 65 64 20 66 isted returned f
f830: 72 6f 6d 0a 20 2a 20 20 20 20 20 22 63 61 63 6b rom. * "cack
f840: 65 79 5f 72 65 61 64 5f 74 6c 76 22 0a 20 2a 0a ey_read_tlv". *.
f850: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 */.static void
f860: 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 cackey_free_tlv(
f870: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c struct cackey_tl
f880: 76 5f 65 6e 74 69 74 79 20 2a 72 6f 6f 74 29 20 v_entity *root)
f890: 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 {..struct cackey
f8a0: 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 75 72 _tlv_entity *cur
f8b0: 72 2c 20 2a 6e 65 78 74 3b 0a 0a 09 69 66 20 28 r, *next;...if (
f8c0: 72 6f 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a root == NULL) {.
f8d0: 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 ..return;..}...f
f8e0: 6f 72 20 28 63 75 72 72 20 3d 20 72 6f 6f 74 3b or (curr = root;
f8f0: 20 63 75 72 72 3b 20 63 75 72 72 20 3d 20 6e 65 curr; curr = ne
f900: 78 74 29 20 7b 0a 09 09 6e 65 78 74 20 3d 20 63 xt) {...next = c
f910: 75 72 72 2d 3e 5f 6e 65 78 74 3b 0a 0a 09 09 73 urr->_next;....s
f920: 77 69 74 63 68 20 28 63 75 72 72 2d 3e 74 61 67 witch (curr->tag
f930: 29 20 7b 0a 09 09 09 63 61 73 65 20 47 53 43 49 ) {....case GSCI
f940: 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a S_TAG_ACR_TABLE:
f950: 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 ....case GSCIS_T
f960: 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 3a 0a AG_CERTIFICATE:.
f970: 09 09 09 09 69 66 20 28 63 75 72 72 2d 3e 76 61 ....if (curr->va
f980: 6c 75 65 29 20 7b 0a 09 09 09 09 09 66 72 65 65 lue) {......free
f990: 28 63 75 72 72 2d 3e 76 61 6c 75 65 29 3b 0a 09 (curr->value);..
f9a0: 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a ...}.....break;.
f9b0: 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 ...case GSCIS_TA
f9c0: 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09 09 69 G_CARDURL:.....i
f9d0: 66 20 28 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 f (curr->value_c
f9e0: 61 72 64 75 72 6c 29 20 7b 0a 09 09 09 09 09 66 ardurl) {......f
f9f0: 72 65 65 28 63 75 72 72 2d 3e 76 61 6c 75 65 5f ree(curr->value_
fa00: 63 61 72 64 75 72 6c 29 3b 0a 09 09 09 09 7d 0a cardurl);.....}.
fa10: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a ....break;...}..
fa20: 09 09 66 72 65 65 28 63 75 72 72 29 3b 0a 09 7d ..free(curr);..}
fa30: 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a ...return;.}../*
fa40: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 . * SYNPOSIS. *
fa50: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 .... *. * AR
fa60: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e GUMENTS. * .
fa70: 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 ... *. * RETURN
fa80: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e VALUE. * ...
fa90: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 . *. * NOTES. *
faa0: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 .... *. */.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 74 6c 76 5f 65 6e 74 69 74 79 20 2a key_tlv_entity *
fad0: 63 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28 cackey_read_tlv(
fae0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c struct cackey_sl
faf0: 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 73 74 72 ot *slot) {..str
fb00: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 uct cackey_tlv_e
fb10: 6e 74 69 74 79 20 2a 63 75 72 72 5f 65 6e 74 69 ntity *curr_enti
fb20: 74 79 2c 20 2a 72 6f 6f 74 20 3d 20 4e 55 4c 4c ty, *root = NULL
fb30: 2c 20 2a 6c 61 73 74 20 3d 20 4e 55 4c 4c 3b 0a , *last = NULL;.
fb40: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 .unsigned char t
fb50: 6c 65 6e 5f 62 75 66 5b 32 5d 2c 20 74 76 61 6c len_buf[2], tval
fb60: 5f 62 75 66 5b 31 30 32 34 5d 2c 20 2a 74 76 61 _buf[1024], *tva
fb70: 6c 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 l;..unsigned cha
fb80: 72 20 76 6c 65 6e 5f 62 75 66 5b 32 5d 2c 20 76 r vlen_buf[2], v
fb90: 76 61 6c 5f 62 75 66 5b 38 31 39 32 5d 2c 20 2a val_buf[8192], *
fba0: 76 76 61 6c 3b 0a 09 75 6e 73 69 67 6e 65 64 20 vval;..unsigned
fbb0: 63 68 61 72 20 2a 74 6d 70 62 75 66 3b 0a 09 75 char *tmpbuf;..u
fbc0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 74 6d 70 nsigned long tmp
fbd0: 62 75 66 6c 65 6e 3b 0a 09 73 73 69 7a 65 5f 74 buflen;..ssize_t
fbe0: 20 74 6c 65 6e 2c 20 76 6c 65 6e 3b 0a 09 73 73 tlen, vlen;..ss
fbf0: 69 7a 65 5f 74 20 72 65 61 64 5f 72 65 74 3b 0a ize_t read_ret;.
fc00: 09 73 69 7a 65 5f 74 20 6f 66 66 73 65 74 5f 74 .size_t offset_t
fc10: 20 3d 20 30 2c 20 6f 66 66 73 65 74 5f 76 20 3d = 0, offset_v =
fc20: 20 30 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 0;..unsigned ch
fc30: 61 72 20 74 61 67 3b 0a 09 73 69 7a 65 5f 74 20 ar tag;..size_t
fc40: 6c 65 6e 67 74 68 3b 0a 23 69 66 64 65 66 20 48 length;.#ifdef H
fc50: 41 56 45 5f 4c 49 42 5a 0a 09 69 6e 74 20 75 6e AVE_LIBZ..int un
fc60: 63 6f 6d 70 72 65 73 73 5f 72 65 74 3b 0a 23 65 compress_ret;.#e
fc70: 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ndif...CACKEY_DE
fc80: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
fc90: 65 64 2e 22 29 3b 0a 0a 09 72 65 61 64 5f 72 65 ed.");...read_re
fca0: 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f t = cackey_read_
fcb0: 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 74 6c 65 buffer(slot, tle
fcc0: 6e 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28 74 6c n_buf, sizeof(tl
fcd0: 65 6e 5f 62 75 66 29 2c 20 31 2c 20 6f 66 66 73 en_buf), 1, offs
fce0: 65 74 5f 74 29 3b 0a 09 69 66 20 28 72 65 61 64 et_t);..if (read
fcf0: 5f 72 65 74 20 21 3d 20 73 69 7a 65 6f 66 28 74 _ret != sizeof(t
fd00: 6c 65 6e 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 len_buf)) {...CA
fd10: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
fd20: 46 28 22 52 65 61 64 20 66 61 69 6c 65 64 2c 20 F("Read failed,
fd30: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 returning in fai
fd40: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 lure");....retur
fd50: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 6c n(NULL);..}...tl
fd60: 65 6e 20 3d 20 28 74 6c 65 6e 5f 62 75 66 5b 31 en = (tlen_buf[1
fd70: 5d 20 3c 3c 20 38 29 20 7c 20 74 6c 65 6e 5f 62 ] << 8) | tlen_b
fd80: 75 66 5b 30 5d 3b 0a 0a 09 72 65 61 64 5f 72 65 uf[0];...read_re
fd90: 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f t = cackey_read_
fda0: 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 76 6c 65 buffer(slot, vle
fdb0: 6e 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28 76 6c n_buf, sizeof(vl
fdc0: 65 6e 5f 62 75 66 29 2c 20 32 2c 20 6f 66 66 73 en_buf), 2, offs
fdd0: 65 74 5f 76 29 3b 0a 09 69 66 20 28 72 65 61 64 et_v);..if (read
fde0: 5f 72 65 74 20 21 3d 20 73 69 7a 65 6f 66 28 76 _ret != sizeof(v
fdf0: 6c 65 6e 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 len_buf)) {...CA
fe00: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
fe10: 46 28 22 52 65 61 64 20 66 61 69 6c 65 64 2c 20 F("Read failed,
fe20: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 returning in fai
fe30: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 lure");....retur
fe40: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 76 6c n(NULL);..}...vl
fe50: 65 6e 20 3d 20 28 76 6c 65 6e 5f 62 75 66 5b 31 en = (vlen_buf[1
fe60: 5d 20 3c 3c 20 38 29 20 7c 20 76 6c 65 6e 5f 62 ] << 8) | vlen_b
fe70: 75 66 5b 30 5d 3b 0a 0a 09 43 41 43 4b 45 59 5f uf[0];...CACKEY_
fe80: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 61 DEBUG_PRINTF("Ta
fe90: 67 20 4c 65 6e 67 74 68 20 3d 20 25 6c 75 2c 20 g Length = %lu,
fea0: 56 61 6c 75 65 20 4c 65 6e 67 74 68 20 3d 20 25 Value Length = %
feb0: 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c lu", (unsigned l
fec0: 6f 6e 67 29 20 74 6c 65 6e 2c 20 28 75 6e 73 69 ong) tlen, (unsi
fed0: 67 6e 65 64 20 6c 6f 6e 67 29 20 76 6c 65 6e 29 gned long) vlen)
fee0: 3b 0a 0a 09 6f 66 66 73 65 74 5f 74 20 2b 3d 20 ;...offset_t +=
fef0: 32 3b 0a 09 6f 66 66 73 65 74 5f 76 20 2b 3d 20 2;..offset_v +=
ff00: 32 3b 0a 0a 09 69 66 20 28 74 6c 65 6e 20 3e 20 2;...if (tlen >
ff10: 73 69 7a 65 6f 66 28 74 76 61 6c 5f 62 75 66 29 sizeof(tval_buf)
ff20: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
ff30: 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67 20 6c UG_PRINTF("Tag l
ff40: 65 6e 67 74 68 20 69 73 20 74 6f 6f 20 6c 61 72 ength is too lar
ff50: 67 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e ge, returning in
ff60: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 failure");....r
ff70: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a eturn(NULL);..}.
ff80: 0a 09 69 66 20 28 76 6c 65 6e 20 3e 20 73 69 7a ..if (vlen > siz
ff90: 65 6f 66 28 76 76 61 6c 5f 62 75 66 29 29 20 7b eof(vval_buf)) {
ffa0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
ffb0: 50 52 49 4e 54 46 28 22 56 61 6c 75 65 20 6c 65 PRINTF("Value le
ffc0: 6e 67 74 68 20 69 73 20 74 6f 6f 20 6c 61 72 67 ngth is too larg
ffd0: 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 e, returning in
ffe0: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 failure");....re
fff0: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a turn(NULL);..}..
10000 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b .read_ret = cack
10010 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 ey_read_buffer(s
10020 6c 6f 74 2c 20 74 76 61 6c 5f 62 75 66 2c 20 74 lot, tval_buf, t
10030 6c 65 6e 2c 20 31 2c 20 6f 66 66 73 65 74 5f 74 len, 1, offset_t
10040 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74 );..if (read_ret
10050 20 21 3d 20 74 6c 65 6e 29 20 7b 0a 09 09 43 41 != tlen) {...CA
10060 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
10070 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 72 65 61 F("Unable to rea
10080 64 20 65 6e 74 69 72 65 20 54 2d 62 75 66 66 65 d entire T-buffe
10090 72 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 r, returning in
100a0 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 failure");....re
100b0 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a turn(NULL);..}..
100c0 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b .read_ret = cack
100d0 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 ey_read_buffer(s
100e0 6c 6f 74 2c 20 76 76 61 6c 5f 62 75 66 2c 20 76 lot, vval_buf, v
100f0 6c 65 6e 2c 20 32 2c 20 6f 66 66 73 65 74 5f 76 len, 2, offset_v
10100 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74 );..if (read_ret
10110 20 21 3d 20 76 6c 65 6e 29 20 7b 0a 09 09 43 41 != vlen) {...CA
10120 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
10130 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 72 65 61 F("Unable to rea
10140 64 20 65 6e 74 69 72 65 20 56 2d 62 75 66 66 65 d entire V-buffe
10150 72 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 r, returning in
10160 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 failure");....re
10170 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a turn(NULL);..}..
10180 09 74 76 61 6c 20 3d 20 74 76 61 6c 5f 62 75 66 .tval = tval_buf
10190 3b 0a 09 76 76 61 6c 20 3d 20 76 76 61 6c 5f 62 ;..vval = vval_b
101a0 75 66 3b 0a 09 77 68 69 6c 65 20 28 74 6c 65 6e uf;..while (tlen
101b0 20 3e 20 30 20 26 26 20 76 6c 65 6e 20 3e 20 30 > 0 && vlen > 0
101c0 29 20 7b 0a 09 09 74 61 67 20 3d 20 2a 74 76 61 ) {...tag = *tva
101d0 6c 3b 0a 09 09 74 76 61 6c 2b 2b 3b 0a 09 09 74 l;...tval++;...t
101e0 6c 65 6e 2d 2d 3b 0a 0a 09 09 69 66 20 28 2a 74 len--;....if (*t
101f0 76 61 6c 20 3d 3d 20 30 78 66 66 29 20 7b 0a 09 val == 0xff) {..
10200 09 09 6c 65 6e 67 74 68 20 3d 20 28 74 76 61 6c ..length = (tval
10210 5b 32 5d 20 3c 3c 20 38 29 20 7c 20 74 76 61 6c [2] << 8) | tval
10220 5b 31 5d 3b 0a 09 09 09 74 76 61 6c 20 2b 3d 20 [1];....tval +=
10230 33 3b 0a 09 09 09 74 6c 65 6e 20 2d 3d 20 33 3b 3;....tlen -= 3;
10240 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 6c ...} else {....l
10250 65 6e 67 74 68 20 3d 20 2a 74 76 61 6c 3b 0a 09 ength = *tval;..
10260 09 09 74 76 61 6c 2b 2b 3b 0a 09 09 09 74 6c 65 ..tval++;....tle
10270 6e 2d 2d 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b n--;...}....CACK
10280 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
10290 22 54 61 67 3a 20 25 73 20 28 25 30 32 78 29 22 "Tag: %s (%02x)"
102a0 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 , CACKEY_DEBUG_F
102b0 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 74 UNC_TAG_TO_STR(t
102c0 61 67 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 ag), (unsigned i
102d0 6e 74 29 20 74 61 67 29 3b 0a 09 09 43 41 43 4b nt) tag);...CACK
102e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 EY_DEBUG_PRINTBU
102f0 46 28 22 56 61 6c 75 65 3a 22 2c 20 76 76 61 6c F("Value:", vval
10300 2c 20 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 63 75 , length);....cu
10310 72 72 5f 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c rr_entity = NULL
10320 3b 0a 09 09 73 77 69 74 63 68 20 28 74 61 67 29 ;...switch (tag)
10330 20 7b 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 {....case GSCIS
10340 5f 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09 _TAG_CARDURL:...
10350 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 ..curr_entity =
10360 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 malloc(sizeof(*c
10370 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 09 09 urr_entity));...
10380 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 ..curr_entity->v
10390 61 6c 75 65 5f 63 61 72 64 75 72 6c 20 3d 20 6d alue_cardurl = m
103a0 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 alloc(sizeof(*cu
103b0 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 rr_entity->value
103c0 5f 63 61 72 64 75 72 6c 29 29 3b 0a 0a 09 09 09 _cardurl));.....
103d0 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 65 6e 74 .memcpy(curr_ent
103e0 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 ity->value_cardu
103f0 72 6c 2d 3e 72 69 64 2c 20 76 76 61 6c 2c 20 35 rl->rid, vval, 5
10400 29 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 );.....curr_enti
10410 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 ty->value_cardur
10420 6c 2d 3e 61 70 70 74 79 70 65 20 3d 20 76 76 61 l->apptype = vva
10430 6c 5b 35 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65 l[5];.....curr_e
10440 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 ntity->value_car
10450 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 20 3d durl->objectid =
10460 20 28 76 76 61 6c 5b 36 5d 20 3c 3c 20 38 29 20 (vval[6] << 8)
10470 7c 20 76 76 61 6c 5b 37 5d 3b 0a 09 09 09 09 63 | vval[7];.....c
10480 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 urr_entity->valu
10490 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 e_cardurl->appid
104a0 20 3d 20 28 76 76 61 6c 5b 38 5d 20 3c 3c 20 38 = (vval[8] << 8
104b0 29 20 7c 20 76 76 61 6c 5b 39 5d 3b 0a 0a 09 09 ) | vval[9];....
104c0 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 ..curr_entity->t
104d0 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 ag = tag;.....cu
104e0 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 rr_entity->_next
104f0 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 = NULL;......br
10500 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43 eak;....case GSC
10510 49 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45 IS_TAG_ACR_TABLE
10520 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 :.....curr_entit
10530 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f y = malloc(sizeo
10540 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29 f(*curr_entity))
10550 3b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20 6d ;.....tmpbuf = m
10560 61 6c 6c 6f 63 28 6c 65 6e 67 74 68 29 3b 0a 0a alloc(length);..
10570 09 09 09 09 6d 65 6d 63 70 79 28 74 6d 70 62 75 ....memcpy(tmpbu
10580 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 f, vval, length)
10590 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 ;......curr_enti
105a0 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09 ty->tag = tag;..
105b0 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e ...curr_entity->
105c0 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b length = length;
105d0 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 .....curr_entity
105e0 2d 3e 76 61 6c 75 65 20 3d 20 74 6d 70 62 75 66 ->value = tmpbuf
105f0 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 ;.....curr_entit
10600 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b y->_next = NULL;
10610 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 ......break;....
10620 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 case GSCIS_TAG_C
10630 45 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09 09 ERTIFICATE:.....
10640 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 curr_entity = ma
10650 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 lloc(sizeof(*cur
10660 72 5f 65 6e 74 69 74 79 29 29 3b 0a 0a 23 69 66 r_entity));..#if
10670 64 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 09 09 def HAVE_LIBZ...
10680 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 6c 65 ..tmpbuflen = le
10690 6e 67 74 68 20 2a 20 32 3b 0a 09 09 09 09 74 6d ngth * 2;.....tm
106a0 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d pbuf = malloc(tm
106b0 70 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 75 pbuflen);......u
106c0 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 20 ncompress_ret =
106d0 75 6e 63 6f 6d 70 72 65 73 73 28 74 6d 70 62 75 uncompress(tmpbu
106e0 66 2c 20 26 74 6d 70 62 75 66 6c 65 6e 2c 20 76 f, &tmpbuflen, v
106f0 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 09 09 val, length);...
10700 09 09 69 66 20 28 75 6e 63 6f 6d 70 72 65 73 73 ..if (uncompress
10710 5f 72 65 74 20 21 3d 20 5a 5f 4f 4b 29 20 7b 0a _ret != Z_OK) {.
10720 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
10730 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 G_PRINTF("Failed
10740 20 74 6f 20 64 65 63 6f 6d 70 72 65 73 73 2c 20 to decompress,
10750 75 6e 63 6f 6d 70 72 65 73 73 28 29 20 72 65 74 uncompress() ret
10760 75 72 6e 65 64 20 25 69 20 2d 2d 20 72 65 73 6f urned %i -- reso
10770 72 74 69 6e 67 20 74 6f 20 64 69 72 65 63 74 20 rting to direct
10780 63 6f 70 79 22 2c 20 75 6e 63 6f 6d 70 72 65 73 copy", uncompres
10790 73 5f 72 65 74 29 3b 0a 0a 09 09 09 09 09 74 6d s_ret);.......tm
107a0 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 pbuflen = length
107b0 3b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 74 6d ;......memcpy(tm
107c0 70 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 pbuf, vval, leng
107d0 74 68 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 th);.....}......
107e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
107f0 4e 54 42 55 46 28 22 44 65 63 6f 6d 70 72 65 73 NTBUF("Decompres
10800 73 65 64 20 74 6f 3a 22 2c 20 74 6d 70 62 75 66 sed to:", tmpbuf
10810 2c 20 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 23 65 , tmpbuflen);.#e
10820 6c 73 65 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 lse.....CACKEY_D
10830 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 69 73 EBUG_PRINTF("Mis
10840 73 69 6e 67 20 5a 4c 49 42 20 53 75 70 70 6f 72 sing ZLIB Suppor
10850 74 2c 20 74 68 69 73 20 63 65 72 74 69 66 69 63 t, this certific
10860 61 74 65 20 69 73 20 6c 69 6b 65 6c 79 20 75 73 ate is likely us
10870 65 6c 65 73 73 2e 2e 2e 22 29 3b 0a 0a 09 09 09 eless...");.....
10880 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e .tmpbuflen = len
10890 67 74 68 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 gth;.....memcpy(
108a0 74 6d 70 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65 tmpbuf, vval, le
108b0 6e 67 74 68 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 ngth);.#endif...
108c0 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e ...curr_entity->
108d0 74 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 tag = tag;.....c
108e0 75 72 72 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e 67 urr_entity->leng
108f0 74 68 20 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a th = tmpbuflen;.
10900 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d ....curr_entity-
10910 3e 76 61 6c 75 65 20 3d 20 74 6d 70 62 75 66 3b >value = tmpbuf;
10920 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 .....curr_entity
10930 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a ->_next = NULL;.
10940 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 .....break;....c
10950 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b ase GSCIS_TAG_PK
10960 43 53 31 35 3a 0a 09 09 09 09 63 75 72 72 5f 65 CS15:.....curr_e
10970 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 ntity = malloc(s
10980 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 izeof(*curr_enti
10990 74 79 29 29 3b 0a 0a 09 09 09 09 63 75 72 72 5f ty));......curr_
109a0 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61 entity->tag = ta
109b0 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 g;.....curr_enti
109c0 74 79 2d 3e 76 61 6c 75 65 5f 62 79 74 65 20 3d ty->value_byte =
109d0 20 76 76 61 6c 5b 30 5d 3b 0a 09 09 09 09 63 75 vval[0];.....cu
109e0 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 rr_entity->_next
109f0 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 = NULL;......br
10a00 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 76 76 61 6c eak;...}....vval
10a10 20 2b 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 76 6c += length;...vl
10a20 65 6e 20 2d 3d 20 6c 65 6e 67 74 68 3b 0a 0a 09 en -= length;...
10a30 09 69 66 20 28 63 75 72 72 5f 65 6e 74 69 74 79 .if (curr_entity
10a40 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 != NULL) {....i
10a50 66 20 28 72 6f 6f 74 20 3d 3d 20 4e 55 4c 4c 29 f (root == NULL)
10a60 20 7b 0a 09 09 09 09 72 6f 6f 74 20 3d 20 63 75 {.....root = cu
10a70 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09 09 7d 0a rr_entity;....}.
10a80 0a 09 09 09 69 66 20 28 6c 61 73 74 20 21 3d 20 ....if (last !=
10a90 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 6c 61 73 74 NULL) {.....last
10aa0 2d 3e 5f 6e 65 78 74 20 3d 20 63 75 72 72 5f 65 ->_next = curr_e
10ab0 6e 74 69 74 79 3b 0a 09 09 09 7d 0a 0a 09 09 09 ntity;....}.....
10ac0 6c 61 73 74 20 3d 20 63 75 72 72 5f 65 6e 74 69 last = curr_enti
10ad0 74 79 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 ty;...}..}...ret
10ae0 75 72 6e 28 72 6f 6f 74 29 3b 0a 7d 0a 0a 2f 2a urn(root);.}../*
10af0 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 . * SYNPOSIS. *
10b00 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 .... *. * AR
10b10 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e GUMENTS. * .
10b20 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 ... *. * RETURN
10b30 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e VALUE. * ...
10b40 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 . *. * NOTES. *
10b50 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 .... *. */.s
10b60 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 tatic void cacke
10b70 79 5f 66 72 65 65 5f 63 65 72 74 73 28 73 74 72 y_free_certs(str
10b80 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f uct cackey_pcsc_
10b90 69 64 65 6e 74 69 74 79 20 2a 73 74 61 72 74 2c identity *start,
10ba0 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 69 size_t count, i
10bb0 6e 74 20 66 72 65 65 5f 73 74 61 72 74 29 20 7b nt free_start) {
10bc0 0a 09 73 69 7a 65 5f 74 20 69 64 78 3b 0a 0a 09 ..size_t idx;...
10bd0 69 66 20 28 73 74 61 72 74 20 3d 3d 20 4e 55 4c if (start == NUL
10be0 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 L) {...return;..
10bf0 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 }...for (idx = 0
10c00 3b 20 69 64 78 20 3c 20 63 6f 75 6e 74 3b 20 69 ; idx < count; i
10c10 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 73 74 dx++) {...if (st
10c20 61 72 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 art[idx].certifi
10c30 63 61 74 65 29 20 7b 0a 09 09 09 66 72 65 65 28 cate) {....free(
10c40 73 74 61 72 74 5b 69 64 78 5d 2e 63 65 72 74 69 start[idx].certi
10c50 66 69 63 61 74 65 29 3b 0a 09 09 7d 0a 09 7d 0a ficate);...}..}.
10c60 0a 09 69 66 20 28 66 72 65 65 5f 73 74 61 72 74 ..if (free_start
10c70 29 20 7b 0a 09 09 66 72 65 65 28 73 74 61 72 74 ) {...free(start
10c80 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a );..}...return;.
10c90 7d 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 }..static struct
10ca0 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 cackey_pcsc_ide
10cb0 6e 74 69 74 79 20 2a 63 61 63 6b 65 79 5f 63 6f ntity *cackey_co
10cc0 70 79 5f 63 65 72 74 73 28 73 74 72 75 63 74 20 py_certs(struct
10cd0 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e cackey_pcsc_iden
10ce0 74 69 74 79 20 2a 64 65 73 74 2c 20 73 74 72 75 tity *dest, stru
10cf0 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 ct cackey_pcsc_i
10d00 64 65 6e 74 69 74 79 20 2a 73 74 61 72 74 2c 20 dentity *start,
10d10 73 69 7a 65 5f 74 20 63 6f 75 6e 74 29 20 7b 0a size_t count) {.
10d20 09 73 69 7a 65 5f 74 20 69 64 78 3b 0a 0a 09 69 .size_t idx;...i
10d30 66 20 28 73 74 61 72 74 20 3d 3d 20 4e 55 4c 4c f (start == NULL
10d40 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c ) {...return(NUL
10d50 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 64 65 73 L);..}...if (des
10d60 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 64 t == NULL) {...d
10d70 65 73 74 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a est = malloc(siz
10d80 65 6f 66 28 2a 64 65 73 74 29 20 2a 20 63 6f 75 eof(*dest) * cou
10d90 6e 74 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 nt);..}...for (i
10da0 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 63 6f dx = 0; idx < co
10db0 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 unt; idx++) {...
10dc0 64 65 73 74 5b 69 64 78 5d 2e 69 64 5f 74 79 70 dest[idx].id_typ
10dd0 65 20 3d 20 73 74 61 72 74 5b 69 64 78 5d 2e 69 e = start[idx].i
10de0 64 5f 74 79 70 65 3b 0a 0a 09 09 73 77 69 74 63 d_type;....switc
10df0 68 20 28 64 65 73 74 5b 69 64 78 5d 2e 69 64 5f h (dest[idx].id_
10e00 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20 type) {....case
10e10 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 CACKEY_ID_TYPE_C
10e20 41 43 3a 0a 09 09 09 09 6d 65 6d 63 70 79 28 64 AC:.....memcpy(d
10e30 65 73 74 5b 69 64 78 5d 2e 63 61 72 64 2e 63 61 est[idx].card.ca
10e40 63 2e 61 70 70 6c 65 74 2c 20 73 74 61 72 74 5b c.applet, start[
10e50 69 64 78 5d 2e 63 61 72 64 2e 63 61 63 2e 61 70 idx].card.cac.ap
10e60 70 6c 65 74 2c 20 73 69 7a 65 6f 66 28 64 65 73 plet, sizeof(des
10e70 74 5b 69 64 78 5d 2e 63 61 72 64 2e 63 61 63 2e t[idx].card.cac.
10e80 61 70 70 6c 65 74 29 29 3b 0a 09 09 09 09 64 65 applet));.....de
10e90 73 74 5b 69 64 78 5d 2e 63 61 72 64 2e 63 61 63 st[idx].card.cac
10ea0 2e 66 69 6c 65 20 3d 20 73 74 61 72 74 5b 69 64 .file = start[id
10eb0 78 5d 2e 63 61 72 64 2e 63 61 63 2e 66 69 6c 65 x].card.cac.file
10ec0 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 ;.....break;....
10ed0 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 case CACKEY_ID_T
10ee0 59 50 45 5f 50 49 56 3a 0a 09 09 09 09 64 65 73 YPE_PIV:.....des
10ef0 74 5b 69 64 78 5d 2e 63 61 72 64 2e 70 69 76 2e t[idx].card.piv.
10f00 6b 65 79 5f 69 64 20 3d 20 73 74 61 72 74 5b 69 key_id = start[i
10f10 64 78 5d 2e 63 61 72 64 2e 70 69 76 2e 6b 65 79 dx].card.piv.key
10f20 5f 69 64 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 _id;.....memcpy(
10f30 64 65 73 74 5b 69 64 78 5d 2e 63 61 72 64 2e 70 dest[idx].card.p
10f40 69 76 2e 6c 61 62 65 6c 2c 20 73 74 61 72 74 5b iv.label, start[
10f50 69 64 78 5d 2e 63 61 72 64 2e 70 69 76 2e 6c 61 idx].card.piv.la
10f60 62 65 6c 2c 20 73 69 7a 65 6f 66 28 64 65 73 74 bel, sizeof(dest
10f70 5b 69 64 78 5d 2e 63 61 72 64 2e 70 69 76 2e 6c [idx].card.piv.l
10f80 61 62 65 6c 29 29 3b 0a 09 09 09 09 62 72 65 61 abel));.....brea
10f90 6b 3b 0a 09 09 09 63 61 73 65 20 43 41 43 4b 45 k;....case CACKE
10fa0 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f Y_ID_TYPE_CERT_O
10fb0 4e 4c 59 3a 0a 09 09 09 09 62 72 65 61 6b 3b 0a NLY:.....break;.
10fc0 09 09 7d 0a 09 09 64 65 73 74 5b 69 64 78 5d 2e ..}...dest[idx].
10fd0 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 certificate_len
10fe0 3d 20 73 74 61 72 74 5b 69 64 78 5d 2e 63 65 72 = start[idx].cer
10ff0 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 09 tificate_len;...
11000 64 65 73 74 5b 69 64 78 5d 2e 6b 65 79 73 69 7a dest[idx].keysiz
11010 65 20 3d 20 73 74 61 72 74 5b 69 64 78 5d 2e 6b e = start[idx].k
11020 65 79 73 69 7a 65 3b 0a 0a 09 09 64 65 73 74 5b eysize;....dest[
11030 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 idx].certificate
11040 20 3d 20 6d 61 6c 6c 6f 63 28 64 65 73 74 5b 69 = malloc(dest[i
11050 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f dx].certificate_
11060 6c 65 6e 29 3b 0a 09 09 6d 65 6d 63 70 79 28 64 len);...memcpy(d
11070 65 73 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 est[idx].certifi
11080 63 61 74 65 2c 20 73 74 61 72 74 5b 69 64 78 5d cate, start[idx]
11090 2e 63 65 72 74 69 66 69 63 61 74 65 2c 20 64 65 .certificate, de
110a0 73 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 st[idx].certific
110b0 61 74 65 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 72 ate_len);..}...r
110c0 65 74 75 72 6e 28 64 65 73 74 29 3b 0a 7d 0a 0a eturn(dest);.}..
110d0 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 /*. * SYNPOSIS.
110e0 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 * .... *. *
110f0 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 ARGUMENTS. *
11100 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 .... *. * RETUR
11110 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e N VALUE. * .
11120 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 ... *. * NOTES.
11130 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f * .... *. */
11140 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 .static struct c
11150 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 ackey_pcsc_ident
11160 69 74 79 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 ity *cackey_read
11170 5f 63 65 72 74 73 28 73 74 72 75 63 74 20 63 61 _certs(struct ca
11180 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c ckey_slot *slot,
11190 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 struct cackey_p
111a0 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 65 csc_identity *ce
111b0 72 74 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f rts, unsigned lo
111c0 6e 67 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 63 61 ng *count) {..ca
111d0 63 6b 65 79 5f 70 63 73 63 5f 69 64 5f 74 79 70 ckey_pcsc_id_typ
111e0 65 20 63 68 65 63 6b 5f 69 64 5f 74 79 70 65 3b e check_id_type;
111f0 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f ..struct cackey_
11200 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 pcsc_identity *c
11210 75 72 72 5f 69 64 3b 0a 09 73 74 72 75 63 74 20 urr_id;..struct
11220 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 cackey_tlv_entit
11230 79 20 2a 63 63 63 5f 74 6c 76 2c 20 2a 63 63 63 y *ccc_tlv, *ccc
11240 5f 63 75 72 72 2c 20 2a 61 70 70 5f 74 6c 76 2c _curr, *app_tlv,
11250 20 2a 61 70 70 5f 63 75 72 72 3b 0a 09 75 6e 73 *app_curr;..uns
11260 69 67 6e 65 64 20 63 68 61 72 20 2a 70 69 76 5f igned char *piv_
11270 6f 69 64 2c 20 70 69 76 5f 6f 69 64 5f 70 69 76 oid, piv_oid_piv
11280 61 75 74 68 5b 5d 20 3d 20 7b 4e 49 53 54 53 50 auth[] = {NISTSP
11290 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 50 49 56 800_73_3_OID_PIV
112a0 41 55 54 48 7d 2c 20 70 69 76 5f 6f 69 64 5f 73 AUTH}, piv_oid_s
112b0 69 67 6e 61 74 75 72 65 5b 5d 20 3d 20 7b 4e 49 ignature[] = {NI
112c0 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f 49 44 STSP800_73_3_OID
112d0 5f 53 49 47 4e 41 54 55 52 45 7d 2c 20 70 69 76 _SIGNATURE}, piv
112e0 5f 6f 69 64 5f 6b 65 79 6d 67 74 5b 5d 20 3d 20 _oid_keymgt[] =
112f0 7b 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f {NISTSP800_73_3_
11300 4f 49 44 5f 4b 45 59 4d 47 54 7d 3b 0a 09 75 6e OID_KEYMGT};..un
11310 73 69 67 6e 65 64 20 63 68 61 72 20 63 75 72 72 signed char curr
11320 5f 61 69 64 5b 37 5d 3b 0a 09 75 6e 73 69 67 6e _aid[7];..unsign
11330 65 64 20 63 68 61 72 20 62 75 66 66 65 72 5b 38 ed char buffer[8
11340 31 39 32 5d 2c 20 2a 62 75 66 66 65 72 5f 70 2c 192], *buffer_p,
11350 20 2a 74 6d 70 62 75 66 3b 0a 09 75 6e 73 69 67 *tmpbuf;..unsig
11360 6e 65 64 20 6c 6f 6e 67 20 6f 75 74 69 64 78 20 ned long outidx
11370 3d 20 30 3b 0a 09 63 68 61 72 20 2a 70 69 76 5f = 0;..char *piv_
11380 6c 61 62 65 6c 3b 0a 09 63 61 63 6b 65 79 5f 72 label;..cackey_r
11390 65 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 5f 72 et transaction_r
113a0 65 74 3b 0a 09 73 73 69 7a 65 5f 74 20 72 65 61 et;..ssize_t rea
113b0 64 5f 72 65 74 3b 0a 09 73 69 7a 65 5f 74 20 62 d_ret;..size_t b
113c0 75 66 66 65 72 5f 6c 65 6e 2c 20 74 6d 70 62 75 uffer_len, tmpbu
113d0 66 6c 65 6e 3b 0a 09 69 6e 74 20 63 65 72 74 73 flen;..int certs
113e0 5f 72 65 73 69 7a 61 62 6c 65 3b 0a 09 69 6e 74 _resizable;..int
113f0 20 73 65 6e 64 5f 72 65 74 2c 20 73 65 6c 65 63 send_ret, selec
11400 74 5f 72 65 74 3b 0a 09 69 6e 74 20 70 69 76 5f t_ret;..int piv_
11410 6b 65 79 2c 20 70 69 76 20 3d 20 30 3b 0a 09 69 key, piv = 0;..i
11420 6e 74 20 63 61 63 68 65 64 5f 63 65 72 74 73 5f nt cached_certs_
11430 76 61 6c 69 64 3b 0a 09 69 6e 74 20 69 64 78 3b valid;..int idx;
11440 0a 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 ..cackey_pcsc_id
11450 5f 74 79 70 65 20 69 64 5f 74 79 70 65 3b 0a 23 _type id_type;.#
11460 69 66 64 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a ifdef HAVE_LIBZ.
11470 09 69 6e 74 20 75 6e 63 6f 6d 70 72 65 73 73 5f .int uncompress_
11480 72 65 74 3b 0a 09 7a 5f 73 74 72 65 61 6d 20 67 ret;..z_stream g
11490 7a 69 70 5f 73 74 72 65 61 6d 3b 0a 23 65 6e 64 zip_stream;.#end
114a0 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 if...CACKEY_DEBU
114b0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 G_PRINTF("Called
114c0 2e 22 29 3b 0a 0a 09 69 66 20 28 63 6f 75 6e 74 .");...if (count
114d0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 == NULL) {...CA
114e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
114f0 46 28 22 63 6f 75 6e 74 20 69 73 20 4e 55 4c 4c F("count is NULL
11500 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 , returning in f
11510 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 ailure");....ret
11520 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 urn(NULL);..}...
11530 69 66 20 28 63 65 72 74 73 20 21 3d 20 4e 55 4c if (certs != NUL
11540 4c 29 20 7b 0a 09 09 69 66 20 28 2a 63 6f 75 6e L) {...if (*coun
11550 74 20 3d 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 t == 0) {....CAC
11560 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
11570 28 22 52 65 71 75 65 73 74 65 64 20 77 65 20 72 ("Requested we r
11580 65 74 75 72 6e 20 30 20 6f 62 6a 65 63 74 73 2c eturn 0 objects,
11590 20 73 68 6f 72 74 2d 63 69 72 63 75 69 74 22 29 short-circuit")
115a0 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 63 65 72 ;.....return(cer
115b0 74 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 ts);...}..}...ca
115c0 63 68 65 64 5f 63 65 72 74 73 5f 76 61 6c 69 64 ched_certs_valid
115d0 20 3d 20 30 3b 0a 09 69 66 20 28 21 73 6c 6f 74 = 0;..if (!slot
115e0 2d 3e 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a ->slot_reset) {.
115f0 09 09 69 66 20 28 73 6c 6f 74 2d 3e 63 61 63 68 ..if (slot->cach
11600 65 64 5f 63 65 72 74 73 29 20 7b 0a 09 09 09 63 ed_certs) {....c
11610 61 63 68 65 64 5f 63 65 72 74 73 5f 76 61 6c 69 ached_certs_vali
11620 64 20 3d 20 31 3b 0a 0a 09 09 09 69 66 20 28 73 d = 1;.....if (s
11630 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 lot->cached_cert
11640 73 5f 63 6f 75 6e 74 20 3e 20 30 29 20 7b 0a 09 s_count > 0) {..
11650 09 09 09 63 61 63 68 65 64 5f 63 65 72 74 73 5f ...cached_certs_
11660 76 61 6c 69 64 20 3d 20 31 3b 0a 09 09 09 7d 0a valid = 1;....}.
11670 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 ..}..}...if (cac
11680 68 65 64 5f 63 65 72 74 73 5f 76 61 6c 69 64 29 hed_certs_valid)
11690 20 7b 0a 09 09 69 66 20 28 63 65 72 74 73 20 3d {...if (certs =
116a0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 63 65 72 = NULL) {....cer
116b0 74 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 ts = malloc(size
116c0 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 73 6c 6f of(*certs) * slo
116d0 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f t->cached_certs_
116e0 63 6f 75 6e 74 29 3b 0a 09 09 09 2a 63 6f 75 6e count);....*coun
116f0 74 20 3d 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 t = slot->cached
11700 5f 63 65 72 74 73 5f 63 6f 75 6e 74 3b 0a 09 09 _certs_count;...
11710 7d 20 65 6c 73 65 20 7b 0a 09 09 09 69 66 20 28 } else {....if (
11720 2a 63 6f 75 6e 74 20 3e 20 73 6c 6f 74 2d 3e 63 *count > slot->c
11730 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e ached_certs_coun
11740 74 29 20 7b 0a 09 09 09 09 2a 63 6f 75 6e 74 20 t) {.....*count
11750 3d 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 = slot->cached_c
11760 65 72 74 73 5f 63 6f 75 6e 74 3b 0a 09 09 09 7d erts_count;....}
11770 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 63 ...}....cackey_c
11780 6f 70 79 5f 63 65 72 74 73 28 63 65 72 74 73 2c opy_certs(certs,
11790 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 slot->cached_ce
117a0 72 74 73 2c 20 2a 63 6f 75 6e 74 29 3b 0a 0a 09 rts, *count);...
117b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
117c0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
117d0 63 61 63 68 65 64 20 63 65 72 74 69 66 69 63 61 cached certifica
117e0 74 65 73 20 66 6f 72 20 74 68 69 73 20 73 6c 6f tes for this slo
117f0 74 20 28 63 61 72 64 20 68 61 73 20 6e 6f 74 20 t (card has not
11800 62 65 65 6e 20 72 65 73 65 74 20 61 6e 64 20 74 been reset and t
11810 68 65 72 65 20 61 72 65 20 63 61 63 68 65 64 20 here are cached
11820 63 65 72 74 73 20 61 76 61 69 6c 61 62 6c 65 29 certs available)
11830 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 63 65 ");....return(ce
11840 72 74 73 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 rts);..}...if (s
11850 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 lot->cached_cert
11860 73 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 66 72 s) {...cackey_fr
11870 65 65 5f 63 65 72 74 73 28 73 6c 6f 74 2d 3e 63 ee_certs(slot->c
11880 61 63 68 65 64 5f 63 65 72 74 73 2c 20 73 6c 6f ached_certs, slo
11890 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f t->cached_certs_
118a0 63 6f 75 6e 74 2c 20 31 29 3b 0a 0a 09 09 73 6c count, 1);....sl
118b0 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 ot->cached_certs
118c0 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 2f 2a = NULL;..}.../*
118d0 20 42 65 67 69 6e 20 61 20 53 6d 61 72 74 43 61 Begin a SmartCa
118e0 72 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a rd transaction *
118f0 2f 0a 09 74 72 61 6e 73 61 63 74 69 6f 6e 5f 72 /..transaction_r
11900 65 74 20 3d 20 63 61 63 6b 65 79 5f 62 65 67 69 et = cackey_begi
11910 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c n_transaction(sl
11920 6f 74 29 3b 0a 09 69 66 20 28 74 72 61 6e 73 61 ot);..if (transa
11930 63 74 69 6f 6e 5f 72 65 74 20 21 3d 20 43 41 43 ction_ret != CAC
11940 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b KEY_PCSC_S_OK) {
11950 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
11960 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 62 PRINTF("Unable b
11970 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e egin transaction
11980 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 , returning in f
11990 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 ailure");....ret
119a0 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 urn(NULL);..}...
119b0 69 64 5f 74 79 70 65 20 3d 20 63 61 63 6b 65 79 id_type = cackey
119c0 5f 64 65 74 65 63 74 5f 61 6e 64 5f 73 65 6c 65 _detect_and_sele
119d0 63 74 5f 72 6f 6f 74 5f 61 70 70 6c 65 74 28 73 ct_root_applet(s
119e0 6c 6f 74 2c 20 43 41 43 4b 45 59 5f 49 44 5f 54 lot, CACKEY_ID_T
119f0 59 50 45 5f 55 4e 4b 4e 4f 57 4e 29 3b 0a 0a 09 YPE_UNKNOWN);...
11a00 73 77 69 74 63 68 20 28 69 64 5f 74 79 70 65 29 switch (id_type)
11a10 20 7b 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 {...case CACKEY
11a20 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a 0a 09 09 _ID_TYPE_CAC:...
11a30 09 70 69 76 20 3d 20 30 3b 0a 0a 09 09 09 62 72 .piv = 0;.....br
11a40 65 61 6b 3b 0a 09 09 63 61 73 65 20 43 41 43 4b eak;...case CACK
11a50 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a EY_ID_TYPE_PIV:.
11a60 09 09 09 70 69 76 20 3d 20 31 3b 0a 0a 09 09 09 ...piv = 1;.....
11a70 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 43 41 break;...case CA
11a80 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 45 52 52 CKEY_ID_TYPE_ERR
11a90 4f 52 3a 0a 09 09 09 2f 2a 20 54 65 72 6d 69 6e OR:..../* Termin
11aa0 61 74 65 20 53 6d 61 72 74 43 61 72 64 20 54 72 ate SmartCard Tr
11ab0 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 ansaction */....
11ac0 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 cackey_end_trans
11ad0 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 action(slot);...
11ae0 09 09 69 66 20 28 63 65 72 74 73 20 3d 3d 20 4e ..if (certs == N
11af0 55 4c 4c 29 20 7b 0a 09 09 09 09 2a 63 6f 75 6e ULL) {.....*coun
11b00 74 20 3d 20 30 3b 0a 09 09 09 7d 0a 0a 09 09 09 t = 0;....}.....
11b10 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 0a 09 return(NULL);...
11b20 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 ..break;...case
11b30 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 CACKEY_ID_TYPE_C
11b40 45 52 54 5f 4f 4e 4c 59 3a 0a 09 09 09 43 41 43 ERT_ONLY:....CAC
11b50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
11b60 28 22 45 72 72 6f 72 2e 20 20 49 6d 70 6f 73 73 ("Error. Imposs
11b70 69 62 6c 65 20 63 6f 6e 64 69 74 69 6f 6e 20 72 ible condition r
11b80 65 61 63 68 65 64 2e 22 29 3b 0a 0a 09 09 09 62 eached.");.....b
11b90 72 65 61 6b 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 reak;..}...if (c
11ba0 65 72 74 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a erts == NULL) {.
11bb0 09 09 63 65 72 74 73 20 3d 20 6d 61 6c 6c 6f 63 ..certs = malloc
11bc0 28 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 (sizeof(*certs)
11bd0 2a 20 35 29 3b 0a 09 09 2a 63 6f 75 6e 74 20 3d * 5);...*count =
11be0 20 35 3b 0a 09 09 63 65 72 74 73 5f 72 65 73 69 5;...certs_resi
11bf0 7a 61 62 6c 65 20 3d 20 31 3b 0a 09 7d 20 65 6c zable = 1;..} el
11c00 73 65 20 7b 0a 09 09 63 65 72 74 73 5f 72 65 73 se {...certs_res
11c10 69 7a 61 62 6c 65 20 3d 20 30 3b 0a 09 7d 0a 0a izable = 0;..}..
11c20 09 69 66 20 28 70 69 76 29 20 7b 0a 09 09 66 6f .if (piv) {...fo
11c30 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 r (idx = 0; idx
11c40 3c 20 33 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 < 3; idx++) {...
11c50 09 73 77 69 74 63 68 20 28 69 64 78 29 20 7b 0a .switch (idx) {.
11c60 09 09 09 09 63 61 73 65 20 30 3a 0a 09 09 09 09 ....case 0:.....
11c70 09 70 69 76 5f 6f 69 64 20 3d 20 70 69 76 5f 6f .piv_oid = piv_o
11c80 69 64 5f 70 69 76 61 75 74 68 3b 0a 09 09 09 09 id_pivauth;.....
11c90 09 70 69 76 5f 6b 65 79 20 3d 20 4e 49 53 54 53 .piv_key = NISTS
11ca0 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 50 49 P800_78_3_KEY_PI
11cb0 56 41 55 54 48 3b 0a 09 09 09 09 09 70 69 76 5f VAUTH;......piv_
11cc0 6c 61 62 65 6c 20 3d 20 22 41 75 74 68 65 6e 74 label = "Authent
11cd0 69 63 61 74 69 6f 6e 22 3b 0a 09 09 09 09 09 62 ication";......b
11ce0 72 65 61 6b 3b 0a 09 09 09 09 63 61 73 65 20 31 reak;.....case 1
11cf0 3a 0a 09 09 09 09 09 70 69 76 5f 6f 69 64 20 3d :......piv_oid =
11d00 20 70 69 76 5f 6f 69 64 5f 73 69 67 6e 61 74 75 piv_oid_signatu
11d10 72 65 3b 0a 09 09 09 09 09 70 69 76 5f 6b 65 79 re;......piv_key
11d20 20 3d 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f = NISTSP800_78_
11d30 33 5f 4b 45 59 5f 53 49 47 4e 41 54 55 52 45 3b 3_KEY_SIGNATURE;
11d40 0a 09 09 09 09 09 70 69 76 5f 6c 61 62 65 6c 20 ......piv_label
11d50 3d 20 22 53 69 67 6e 61 74 75 72 65 22 3b 0a 09 = "Signature";..
11d60 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 63 ....break;.....c
11d70 61 73 65 20 32 3a 0a 09 09 09 09 09 70 69 76 5f ase 2:......piv_
11d80 6f 69 64 20 3d 20 70 69 76 5f 6f 69 64 5f 6b 65 oid = piv_oid_ke
11d90 79 6d 67 74 3b 0a 09 09 09 09 09 70 69 76 5f 6b ymgt;......piv_k
11da0 65 79 20 3d 20 4e 49 53 54 53 50 38 30 30 5f 37 ey = NISTSP800_7
11db0 38 5f 33 5f 4b 45 59 5f 4b 45 59 4d 47 54 3b 0a 8_3_KEY_KEYMGT;.
11dc0 09 09 09 09 09 70 69 76 5f 6c 61 62 65 6c 20 3d .....piv_label =
11dd0 20 22 4b 65 79 20 4d 61 6e 61 67 65 6d 65 6e 74 "Key Management
11de0 22 3b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 ";......break;..
11df0 09 09 7d 0a 0a 09 09 09 72 65 61 64 5f 72 65 74 ..}.....read_ret
11e00 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 64 61 = cackey_get_da
11e10 74 61 28 73 6c 6f 74 2c 20 62 75 66 66 65 72 2c ta(slot, buffer,
11e20 20 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2c sizeof(buffer),
11e30 20 70 69 76 5f 6f 69 64 29 3b 0a 0a 09 09 09 69 piv_oid);.....i
11e40 66 20 28 72 65 61 64 5f 72 65 74 20 3c 3d 20 30 f (read_ret <= 0
11e50 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 ) {.....continue
11e60 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 75 72 72 5f ;....}.....curr_
11e70 69 64 20 3d 20 26 63 65 72 74 73 5b 6f 75 74 69 id = &certs[outi
11e80 64 78 5d 3b 0a 09 09 09 6f 75 74 69 64 78 2b 2b dx];....outidx++
11e90 3b 0a 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 6b ;.....curr_id->k
11ea0 65 79 73 69 7a 65 20 3d 20 2d 31 3b 0a 09 09 09 eysize = -1;....
11eb0 63 75 72 72 5f 69 64 2d 3e 69 64 5f 74 79 70 65 curr_id->id_type
11ec0 20 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 = CACKEY_ID_TYP
11ed0 45 5f 50 49 56 3b 0a 09 09 09 63 75 72 72 5f 69 E_PIV;....curr_i
11ee0 64 2d 3e 63 61 72 64 2e 70 69 76 2e 6b 65 79 5f d->card.piv.key_
11ef0 69 64 20 3d 20 70 69 76 5f 6b 65 79 3b 0a 09 09 id = piv_key;...
11f00 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 69 64 2d .memcpy(curr_id-
11f10 3e 63 61 72 64 2e 70 69 76 2e 6c 61 62 65 6c 2c >card.piv.label,
11f20 20 70 69 76 5f 6c 61 62 65 6c 2c 20 73 74 72 6c piv_label, strl
11f30 65 6e 28 70 69 76 5f 6c 61 62 65 6c 29 20 2b 20 en(piv_label) +
11f40 31 29 3b 0a 0a 09 09 09 63 75 72 72 5f 69 64 2d 1);.....curr_id-
11f50 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e >certificate_len
11f60 20 3d 20 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 = read_ret;....
11f70 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 curr_id->certifi
11f80 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75 cate = malloc(cu
11f90 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 rr_id->certifica
11fa0 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 62 75 66 te_len);.....buf
11fb0 66 65 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 fer_len = sizeof
11fc0 28 62 75 66 66 65 72 29 3b 0a 09 09 09 62 75 66 (buffer);....buf
11fd0 66 65 72 5f 70 20 3d 20 63 61 63 6b 65 79 5f 72 fer_p = cackey_r
11fe0 65 61 64 5f 62 65 72 74 6c 76 5f 74 61 67 28 62 ead_bertlv_tag(b
11ff0 75 66 66 65 72 2c 20 26 62 75 66 66 65 72 5f 6c uffer, &buffer_l
12000 65 6e 2c 20 30 78 37 30 2c 20 63 75 72 72 5f 69 en, 0x70, curr_i
12010 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20 d->certificate,
12020 26 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 &curr_id->certif
12030 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 icate_len);.....
12040 69 66 20 28 62 75 66 66 65 72 5f 70 20 3d 3d 20 if (buffer_p ==
12050 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b NULL) {.....CACK
12060 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
12070 22 52 65 61 64 69 6e 67 20 63 65 72 74 69 66 69 "Reading certifi
12080 63 61 74 65 20 66 72 6f 6d 20 42 45 52 2d 54 4c cate from BER-TL
12090 56 20 72 65 73 70 6f 6e 73 65 20 66 61 69 6c 65 V response faile
120a0 64 2c 20 73 6b 69 70 70 69 6e 67 20 6b 65 79 20 d, skipping key
120b0 25 69 22 2c 20 69 64 78 29 3b 0a 0a 09 09 09 09 %i", idx);......
120c0 66 72 65 65 28 63 75 72 72 5f 69 64 2d 3e 63 65 free(curr_id->ce
120d0 72 74 69 66 69 63 61 74 65 29 3b 0a 0a 09 09 09 rtificate);.....
120e0 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 .curr_id->certif
120f0 69 63 61 74 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 icate = NULL;...
12100 09 09 09 6f 75 74 69 64 78 2d 2d 3b 0a 0a 09 09 ...outidx--;....
12110 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d ..continue;....}
12120 0a 0a 09 09 09 69 66 20 28 63 75 72 72 5f 69 64 .....if (curr_id
12130 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 ->certificate_le
12140 6e 20 3e 20 34 29 20 7b 0a 09 09 09 09 69 66 20 n > 4) {.....if
12150 28 6d 65 6d 63 6d 70 28 63 75 72 72 5f 69 64 2d (memcmp(curr_id-
12160 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20 22 5c >certificate, "\
12170 78 31 66 5c 78 38 62 5c 78 30 38 5c 78 30 30 22 x1f\x8b\x08\x00"
12180 2c 20 34 29 20 3d 3d 20 30 29 20 7b 0a 23 69 66 , 4) == 0) {.#if
12190 64 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 09 09 def HAVE_LIBZ...
121a0 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 63 ...tmpbuflen = c
121b0 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 urr_id->certific
121c0 61 74 65 5f 6c 65 6e 20 2a 20 32 3b 0a 09 09 09 ate_len * 2;....
121d0 09 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f ..tmpbuf = mallo
121e0 63 28 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 0a 09 c(tmpbuflen);...
121f0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
12200 5f 50 52 49 4e 54 42 55 46 28 22 41 74 74 65 6d _PRINTBUF("Attem
12210 70 74 69 6e 67 20 74 6f 20 64 65 63 6f 6d 70 72 pting to decompr
12220 65 73 73 3a 22 2c 20 63 75 72 72 5f 69 64 2d 3e ess:", curr_id->
12230 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 75 72 certificate, cur
12240 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 r_id->certificat
12250 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 09 67 7a e_len);.......gz
12260 69 70 5f 73 74 72 65 61 6d 2e 7a 61 6c 6c 6f 63 ip_stream.zalloc
12270 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 67 7a = NULL;......gz
12280 69 70 5f 73 74 72 65 61 6d 2e 7a 66 72 65 65 20 ip_stream.zfree
12290 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 67 7a 69 = NULL;......gzi
122a0 70 5f 73 74 72 65 61 6d 2e 6f 70 61 71 75 65 20 p_stream.opaque
122b0 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09 67 7a = NULL;.......gz
122c0 69 70 5f 73 74 72 65 61 6d 2e 6e 65 78 74 5f 69 ip_stream.next_i
122d0 6e 20 20 3d 20 63 75 72 72 5f 69 64 2d 3e 63 65 n = curr_id->ce
122e0 72 74 69 66 69 63 61 74 65 3b 0a 09 09 09 09 09 rtificate;......
122f0 67 7a 69 70 5f 73 74 72 65 61 6d 2e 61 76 61 69 gzip_stream.avai
12300 6c 5f 69 6e 20 3d 20 63 75 72 72 5f 69 64 2d 3e l_in = curr_id->
12310 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b certificate_len;
12320 0a 09 09 09 09 09 67 7a 69 70 5f 73 74 72 65 61 ......gzip_strea
12330 6d 2e 6e 65 78 74 5f 6f 75 74 20 3d 20 74 6d 70 m.next_out = tmp
12340 62 75 66 3b 0a 09 09 09 09 09 67 7a 69 70 5f 73 buf;......gzip_s
12350 74 72 65 61 6d 2e 61 76 61 69 6c 5f 6f 75 74 20 tream.avail_out
12360 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 0a 09 09 = tmpbuflen;....
12370 09 09 09 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 ...uncompress_re
12380 74 20 3d 20 69 6e 66 6c 61 74 65 49 6e 69 74 28 t = inflateInit(
12390 26 67 7a 69 70 5f 73 74 72 65 61 6d 29 3b 0a 09 &gzip_stream);..
123a0 09 09 09 09 69 66 20 28 75 6e 63 6f 6d 70 72 65 ....if (uncompre
123b0 73 73 5f 72 65 74 20 3d 3d 20 5a 5f 4f 4b 29 20 ss_ret == Z_OK)
123c0 7b 0a 09 09 09 09 09 09 2f 2a 20 54 72 79 20 61 {......./* Try a
123d0 67 61 69 6e 20 61 73 20 61 20 67 7a 69 70 20 62 gain as a gzip b
123e0 75 66 66 65 72 20 2a 2f 0a 09 09 09 09 09 09 75 uffer */.......u
123f0 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 20 ncompress_ret =
12400 69 6e 66 6c 61 74 65 45 6e 64 28 26 67 7a 69 70 inflateEnd(&gzip
12410 5f 73 74 72 65 61 6d 29 3b 0a 09 09 09 09 09 09 _stream);.......
12420 69 66 20 28 75 6e 63 6f 6d 70 72 65 73 73 5f 72 if (uncompress_r
12430 65 74 20 3d 3d 20 5a 5f 4f 4b 29 20 7b 0a 09 09 et == Z_OK) {...
12440 09 09 09 09 09 67 7a 69 70 5f 73 74 72 65 61 6d .....gzip_stream
12450 2e 7a 61 6c 6c 6f 63 20 3d 20 4e 55 4c 4c 3b 0a .zalloc = NULL;.
12460 09 09 09 09 09 09 09 67 7a 69 70 5f 73 74 72 65 .......gzip_stre
12470 61 6d 2e 7a 66 72 65 65 20 3d 20 4e 55 4c 4c 3b am.zfree = NULL;
12480 0a 09 09 09 09 09 09 09 67 7a 69 70 5f 73 74 72 ........gzip_str
12490 65 61 6d 2e 6f 70 61 71 75 65 20 3d 20 4e 55 4c eam.opaque = NUL
124a0 4c 3b 0a 0a 09 09 09 09 09 09 09 67 7a 69 70 5f L;.........gzip_
124b0 73 74 72 65 61 6d 2e 6e 65 78 74 5f 69 6e 20 20 stream.next_in
124c0 3d 20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 = curr_id->certi
124d0 66 69 63 61 74 65 3b 0a 09 09 09 09 09 09 09 67 ficate;........g
124e0 7a 69 70 5f 73 74 72 65 61 6d 2e 61 76 61 69 6c zip_stream.avail
124f0 5f 69 6e 20 3d 20 63 75 72 72 5f 69 64 2d 3e 63 _in = curr_id->c
12500 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a ertificate_len;.
12510 09 09 09 09 09 09 09 67 7a 69 70 5f 73 74 72 65 .......gzip_stre
12520 61 6d 2e 6e 65 78 74 5f 6f 75 74 20 3d 20 74 6d am.next_out = tm
12530 70 62 75 66 3b 0a 09 09 09 09 09 09 09 67 7a 69 pbuf;........gzi
12540 70 5f 73 74 72 65 61 6d 2e 61 76 61 69 6c 5f 6f p_stream.avail_o
12550 75 74 20 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a ut = tmpbuflen;.
12560 09 09 09 09 09 09 09 75 6e 63 6f 6d 70 72 65 73 .......uncompres
12570 73 5f 72 65 74 20 3d 20 69 6e 66 6c 61 74 65 49 s_ret = inflateI
12580 6e 69 74 32 28 26 67 7a 69 70 5f 73 74 72 65 61 nit2(&gzip_strea
12590 6d 2c 20 33 31 29 3b 0a 09 09 09 09 09 09 7d 0a m, 31);.......}.
125a0 09 09 09 09 09 7d 0a 09 09 09 09 09 69 66 20 28 .....}......if (
125b0 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d uncompress_ret =
125c0 3d 20 5a 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 09 = Z_OK) {.......
125d0 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d uncompress_ret =
125e0 20 69 6e 66 6c 61 74 65 28 26 67 7a 69 70 5f 73 inflate(&gzip_s
125f0 74 72 65 61 6d 2c 20 30 29 3b 0a 09 09 09 09 09 tream, 0);......
12600 7d 0a 09 09 09 09 09 69 66 20 28 75 6e 63 6f 6d }......if (uncom
12610 70 72 65 73 73 5f 72 65 74 20 3d 3d 20 5a 5f 53 press_ret == Z_S
12620 54 52 45 41 4d 5f 45 4e 44 29 20 7b 0a 09 09 09 TREAM_END) {....
12630 09 09 09 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 ...uncompress_re
12640 74 20 3d 20 69 6e 66 6c 61 74 65 45 6e 64 28 26 t = inflateEnd(&
12650 67 7a 69 70 5f 73 74 72 65 61 6d 29 3b 0a 09 09 gzip_stream);...
12660 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 ...} else {.....
12670 09 09 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 ..uncompress_ret
12680 20 3d 20 5a 5f 44 41 54 41 5f 45 52 52 4f 52 3b = Z_DATA_ERROR;
12690 0a 09 09 09 09 09 7d 0a 09 09 09 09 09 69 66 20 ......}......if
126a0 28 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 (uncompress_ret
126b0 3d 3d 20 5a 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 == Z_OK) {......
126c0 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 67 7a 69 .tmpbuflen = gzi
126d0 70 5f 73 74 72 65 61 6d 2e 74 6f 74 61 6c 5f 6f p_stream.total_o
126e0 75 74 3b 0a 0a 09 09 09 09 09 09 43 41 43 4b 45 ut;........CACKE
126f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 Y_DEBUG_PRINTBUF
12700 28 22 44 65 63 6f 6d 70 72 65 73 73 65 64 20 74 ("Decompressed t
12710 6f 3a 22 2c 20 74 6d 70 62 75 66 2c 20 74 6d 70 o:", tmpbuf, tmp
12720 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 09 09 buflen);........
12730 66 72 65 65 28 63 75 72 72 5f 69 64 2d 3e 63 65 free(curr_id->ce
12740 72 74 69 66 69 63 61 74 65 29 3b 0a 0a 09 09 09 rtificate);.....
12750 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 ...curr_id->cert
12760 69 66 69 63 61 74 65 20 3d 20 74 6d 70 62 75 66 ificate = tmpbuf
12770 3b 0a 09 09 09 09 09 09 63 75 72 72 5f 69 64 2d ;.......curr_id-
12780 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e >certificate_len
12790 20 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 09 = tmpbuflen;...
127a0 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 ...} else {.....
127b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
127c0 52 49 4e 54 46 28 22 44 65 63 6f 6d 70 72 65 73 RINTF("Decompres
127d0 73 69 6e 67 20 66 61 69 6c 65 64 21 20 75 6e 63 sing failed! unc
127e0 6f 6d 70 72 65 73 73 28 29 20 72 65 74 75 72 6e ompress() return
127f0 65 64 20 25 69 22 2c 20 75 6e 63 6f 6d 70 72 65 ed %i", uncompre
12800 73 73 5f 72 65 74 29 3b 0a 0a 09 09 09 09 09 09 ss_ret);........
12810 66 72 65 65 28 74 6d 70 62 75 66 29 3b 0a 09 09 free(tmpbuf);...
12820 09 09 09 7d 0a 23 65 6c 73 65 0a 09 09 09 09 09 ...}.#else......
12830 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
12840 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 57 65 20 NTF("Error. We
12850 67 6f 74 20 61 20 63 6f 6d 70 72 65 73 73 65 64 got a compressed
12860 20 63 65 72 74 69 66 69 63 61 74 65 20 62 75 74 certificate but
12870 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 we do not have
12880 7a 6c 69 62 2e 20 20 48 6f 70 69 6e 67 20 66 6f zlib. Hoping fo
12890 72 20 74 68 65 20 62 65 73 74 2e 22 29 3b 0a 23 r the best.");.#
128a0 65 6e 64 69 66 0a 09 09 09 09 7d 0a 09 09 09 7d endif.....}....}
128b0 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 ...}..} else {..
128c0 09 2f 2a 20 52 65 61 64 20 61 6c 6c 20 74 68 65 ./* Read all the
128d0 20 61 70 70 6c 65 74 73 20 66 72 6f 6d 20 74 68 applets from th
128e0 65 20 43 43 43 27 73 20 54 4c 56 20 2a 2f 0a 09 e CCC's TLV */..
128f0 09 63 63 63 5f 74 6c 76 20 3d 20 63 61 63 6b 65 .ccc_tlv = cacke
12900 79 5f 72 65 61 64 5f 74 6c 76 28 73 6c 6f 74 29 y_read_tlv(slot)
12910 3b 0a 0a 09 09 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 ;..../* Look for
12920 20 43 41 52 44 55 52 4c 73 20 74 68 61 74 20 63 CARDURLs that c
12930 6f 6f 72 65 73 70 6f 6e 64 20 74 6f 20 50 4b 49 oorespond to PKI
12940 20 61 70 70 6c 65 74 73 20 2a 2f 0a 09 09 66 6f applets */...fo
12950 72 20 28 63 63 63 5f 63 75 72 72 20 3d 20 63 63 r (ccc_curr = cc
12960 63 5f 74 6c 76 3b 20 63 63 63 5f 63 75 72 72 3b c_tlv; ccc_curr;
12970 20 63 63 63 5f 63 75 72 72 20 3d 20 63 63 63 5f ccc_curr = ccc_
12980 63 75 72 72 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 curr->_next) {..
12990 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
129a0 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 74 61 67 RINTF("Found tag
129b0 3a 20 25 73 20 2e 2e 2e 20 22 2c 20 43 41 43 4b : %s ... ", CACK
129c0 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 EY_DEBUG_FUNC_TA
129d0 47 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 G_TO_STR(ccc_cur
129e0 72 2d 3e 74 61 67 29 29 3b 0a 0a 09 09 09 69 66 r->tag));.....if
129f0 20 28 63 63 63 5f 63 75 72 72 2d 3e 74 61 67 20 (ccc_curr->tag
12a00 21 3d 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 != GSCIS_TAG_CAR
12a10 44 55 52 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b DURL) {.....CACK
12a20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
12a30 22 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20 " ... skipping
12a40 69 74 20 28 77 65 20 6f 6e 6c 79 20 63 61 72 65 it (we only care
12a50 20 61 62 6f 75 74 20 43 41 52 44 55 52 4c 73 29 about CARDURLs)
12a60 22 29 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 ");......continu
12a70 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 e;....}.....if (
12a80 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 (ccc_curr->value
12a90 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 _cardurl->apptyp
12aa0 65 20 26 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 e & CACKEY_TLV_A
12ab0 50 50 5f 50 4b 49 29 20 21 3d 20 43 41 43 4b 45 PP_PKI) != CACKE
12ac0 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 29 20 7b Y_TLV_APP_PKI) {
12ad0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
12ae0 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 G_PRINTF(" ...
12af0 73 6b 69 70 70 69 6e 67 20 69 74 20 28 77 65 20 skipping it (we
12b00 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 only care about
12b10 50 4b 49 20 61 70 70 6c 65 74 73 2c 20 74 68 69 PKI applets, thi
12b20 73 20 61 70 70 6c 65 74 20 73 75 70 70 6f 72 74 s applet support
12b30 73 3a 20 25 73 2f 25 30 32 78 29 22 2c 20 43 41 s: %s/%02x)", CA
12b40 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f CKEY_DEBUG_FUNC_
12b50 41 50 50 54 59 50 45 5f 54 4f 5f 53 54 52 28 63 APPTYPE_TO_STR(c
12b60 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 cc_curr->value_c
12b70 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 29 ardurl->apptype)
12b80 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 , (unsigned int)
12b90 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 ccc_curr->value
12ba0 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 _cardurl->apptyp
12bb0 65 29 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 e);......continu
12bc0 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b e;....}.....CACK
12bd0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 EY_DEBUG_PRINTBU
12be0 46 28 22 52 49 44 3a 22 2c 20 63 63 63 5f 63 75 F("RID:", ccc_cu
12bf0 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 rr->value_cardur
12c00 6c 2d 3e 72 69 64 2c 20 73 69 7a 65 6f 66 28 63 l->rid, sizeof(c
12c10 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 cc_curr->value_c
12c20 61 72 64 75 72 6c 2d 3e 72 69 64 29 29 3b 0a 09 ardurl->rid));..
12c30 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
12c40 52 49 4e 54 46 28 22 41 70 70 49 44 20 3d 20 25 RINTF("AppID = %
12c50 73 2f 25 30 34 6c 78 22 2c 20 43 41 43 4b 45 59 s/%04lx", CACKEY
12c60 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 _DEBUG_FUNC_OBJI
12c70 44 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 D_TO_STR(ccc_cur
12c80 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c r->value_cardurl
12c90 2d 3e 61 70 70 69 64 29 2c 20 28 75 6e 73 69 67 ->appid), (unsig
12ca0 6e 65 64 20 6c 6f 6e 67 29 20 63 63 63 5f 63 75 ned long) ccc_cu
12cb0 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 rr->value_cardur
12cc0 6c 2d 3e 61 70 70 69 64 29 3b 0a 09 09 09 43 41 l->appid);....CA
12cd0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
12ce0 46 28 22 4f 62 6a 65 63 74 49 44 20 3d 20 25 73 F("ObjectID = %s
12cf0 2f 25 30 34 6c 78 22 2c 20 43 41 43 4b 45 59 5f /%04lx", CACKEY_
12d00 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 DEBUG_FUNC_OBJID
12d10 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72 _TO_STR(ccc_curr
12d20 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d ->value_cardurl-
12d30 3e 6f 62 6a 65 63 74 69 64 29 2c 20 28 75 6e 73 >objectid), (uns
12d40 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 63 63 5f igned long) ccc_
12d50 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 curr->value_card
12d60 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 3b 0a url->objectid);.
12d70 0a 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f ....memcpy(curr_
12d80 61 69 64 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76 aid, ccc_curr->v
12d90 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 alue_cardurl->ri
12da0 64 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 63 75 d, sizeof(ccc_cu
12db0 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 rr->value_cardur
12dc0 6c 2d 3e 72 69 64 29 29 3b 0a 09 09 09 63 75 72 l->rid));....cur
12dd0 72 5f 61 69 64 5b 73 69 7a 65 6f 66 28 63 75 72 r_aid[sizeof(cur
12de0 72 5f 61 69 64 29 20 2d 20 32 5d 20 3d 20 28 63 r_aid) - 2] = (c
12df0 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 cc_curr->value_c
12e00 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 3e 3e ardurl->appid >>
12e10 20 38 29 20 26 20 30 78 66 66 3b 0a 09 09 09 63 8) & 0xff;....c
12e20 75 72 72 5f 61 69 64 5b 73 69 7a 65 6f 66 28 63 urr_aid[sizeof(c
12e30 75 72 72 5f 61 69 64 29 20 2d 20 31 5d 20 3d 20 urr_aid) - 1] =
12e40 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f ccc_curr->value_
12e50 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 26 cardurl->appid &
12e60 20 30 78 66 66 3b 0a 0a 09 09 09 2f 2a 20 53 65 0xff;...../* Se
12e70 6c 65 63 74 20 66 6f 75 6e 64 20 61 70 70 6c 65 lect found apple
12e80 74 20 2e 2e 2e 20 2a 2f 0a 09 09 09 73 65 6c 65 t ... */....sele
12e90 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f ct_ret = cackey_
12ea0 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c select_applet(sl
12eb0 6f 74 2c 20 63 75 72 72 5f 61 69 64 2c 20 73 69 ot, curr_aid, si
12ec0 7a 65 6f 66 28 63 75 72 72 5f 61 69 64 29 29 3b zeof(curr_aid));
12ed0 0a 09 09 09 69 66 20 28 73 65 6c 65 63 74 5f 72 ....if (select_r
12ee0 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 et != CACKEY_PCS
12ef0 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 C_S_OK) {.....CA
12f00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
12f10 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6c F("Failed to sel
12f20 65 63 74 20 61 70 70 6c 65 74 2c 20 73 6b 69 70 ect applet, skip
12f30 70 69 6e 67 20 70 72 6f 63 65 73 73 69 6e 67 20 ping processing
12f40 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 22 29 of this object")
12f50 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b ;......continue;
12f60 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 2e 2e 2e ....}...../* ...
12f70 20 61 6e 64 20 6f 62 6a 65 63 74 20 28 66 69 6c and object (fil
12f80 65 29 20 2a 2f 0a 09 09 09 73 65 6c 65 63 74 5f e) */....select_
12f90 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c ret = cackey_sel
12fa0 65 63 74 5f 66 69 6c 65 28 73 6c 6f 74 2c 20 63 ect_file(slot, c
12fb0 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 cc_curr->value_c
12fc0 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 ardurl->objectid
12fd0 29 3b 0a 09 09 09 69 66 20 28 73 65 6c 65 63 74 );....if (select
12fe0 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 _ret != CACKEY_P
12ff0 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 09 CSC_S_OK) {.....
13000 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
13010 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73 NTF("Failed to s
13020 65 6c 65 63 74 20 66 69 6c 65 2c 20 73 6b 69 70 elect file, skip
13030 70 69 6e 67 20 70 72 6f 63 65 73 73 69 6e 67 20 ping processing
13040 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 22 29 of this object")
13050 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b ;......continue;
13060 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 50 72 6f ....}...../* Pro
13070 63 65 73 73 20 74 68 69 73 20 66 69 6c 65 27 73 cess this file's
13080 20 54 4c 56 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 TLV looking for
13090 20 63 65 72 74 69 66 69 63 61 74 65 73 20 2a 2f certificates */
130a0 0a 09 09 09 61 70 70 5f 74 6c 76 20 3d 20 63 61 ....app_tlv = ca
130b0 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28 73 6c ckey_read_tlv(sl
130c0 6f 74 29 3b 0a 09 0a 09 09 09 66 6f 72 20 28 61 ot);......for (a
130d0 70 70 5f 63 75 72 72 20 3d 20 61 70 70 5f 74 6c pp_curr = app_tl
130e0 76 3b 20 61 70 70 5f 63 75 72 72 3b 20 61 70 70 v; app_curr; app
130f0 5f 63 75 72 72 20 3d 20 61 70 70 5f 63 75 72 72 _curr = app_curr
13100 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 09 09 43 ->_next) {.....C
13110 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
13120 54 46 28 22 46 6f 75 6e 64 20 74 61 67 3a 20 25 TF("Found tag: %
13130 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 s", CACKEY_DEBUG
13140 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 _FUNC_TAG_TO_STR
13150 28 61 70 70 5f 63 75 72 72 2d 3e 74 61 67 29 29 (app_curr->tag))
13160 3b 0a 09 09 09 09 69 66 20 28 61 70 70 5f 63 75 ;.....if (app_cu
13170 72 72 2d 3e 74 61 67 20 21 3d 20 47 53 43 49 53 rr->tag != GSCIS
13180 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 _TAG_CERTIFICATE
13190 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f ) {......CACKEY_
131a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 DEBUG_PRINTF("
131b0 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69 74 20 ... skipping it
131c0 28 77 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 (we only care ab
131d0 6f 75 74 20 43 45 52 54 49 46 49 43 41 54 45 73 out CERTIFICATEs
131e0 29 22 29 3b 0a 0a 09 09 09 09 09 63 6f 6e 74 69 )");.......conti
131f0 6e 75 65 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 nue;.....}......
13200 63 75 72 72 5f 69 64 20 3d 20 26 63 65 72 74 73 curr_id = &certs
13210 5b 6f 75 74 69 64 78 5d 3b 0a 09 09 09 09 6f 75 [outidx];.....ou
13220 74 69 64 78 2b 2b 3b 0a 0a 09 09 09 09 63 75 72 tidx++;......cur
13230 72 5f 69 64 2d 3e 69 64 5f 74 79 70 65 20 3d 20 r_id->id_type =
13240 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 CACKEY_ID_TYPE_C
13250 41 43 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 63 AC;.....memcpy(c
13260 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 urr_id->card.cac
13270 2e 61 70 70 6c 65 74 2c 20 63 75 72 72 5f 61 69 .applet, curr_ai
13280 64 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 69 d, sizeof(curr_i
13290 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c d->card.cac.appl
132a0 65 74 29 29 3b 0a 09 09 09 09 63 75 72 72 5f 69 et));.....curr_i
132b0 64 2d 3e 63 61 72 64 2e 63 61 63 2e 66 69 6c 65 d->card.cac.file
132c0 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c = ccc_curr->val
132d0 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 ue_cardurl->obje
132e0 63 74 69 64 3b 0a 09 09 09 09 63 75 72 72 5f 69 ctid;.....curr_i
132f0 64 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 2d 31 3b d->keysize = -1;
13300 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 ......CACKEY_DEB
13310 55 47 5f 50 52 49 4e 54 46 28 22 46 69 6c 6c 69 UG_PRINTF("Filli
13320 6e 67 20 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 ng curr_id->card
13330 2e 63 61 63 2e 61 70 70 6c 65 74 20 28 25 70 29 .cac.applet (%p)
13340 20 77 69 74 68 20 25 6c 75 20 62 79 74 65 73 3a with %lu bytes:
13350 22 2c 20 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 ", curr_id->card
13360 2e 63 61 63 2e 61 70 70 6c 65 74 2c 20 28 75 6e .cac.applet, (un
13370 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a signed long) siz
13380 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e 63 61 72 eof(curr_id->car
13390 64 2e 63 61 63 2e 61 70 70 6c 65 74 29 29 3b 0a d.cac.applet));.
133a0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
133b0 5f 50 52 49 4e 54 42 55 46 28 22 56 41 4c 3a 22 _PRINTBUF("VAL:"
133c0 2c 20 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e , curr_id->card.
133d0 63 61 63 2e 61 70 70 6c 65 74 2c 20 73 69 7a 65 cac.applet, size
133e0 6f 66 28 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 of(curr_id->card
133f0 2e 63 61 63 2e 61 70 70 6c 65 74 29 29 3b 0a 0a .cac.applet));..
13400 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 ....curr_id->cer
13410 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 61 tificate_len = a
13420 70 70 5f 63 75 72 72 2d 3e 6c 65 6e 67 74 68 3b pp_curr->length;
13430 0a 0a 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 ......curr_id->c
13440 65 72 74 69 66 69 63 61 74 65 20 3d 20 6d 61 6c ertificate = mal
13450 6c 6f 63 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 loc(curr_id->cer
13460 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 tificate_len);..
13470 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 69 ...memcpy(curr_i
13480 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20 d->certificate,
13490 61 70 70 5f 63 75 72 72 2d 3e 76 61 6c 75 65 2c app_curr->value,
134a0 20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 curr_id->certif
134b0 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 icate_len);.....
134c0 09 69 66 20 28 6f 75 74 69 64 78 20 3e 3d 20 2a .if (outidx >= *
134d0 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 09 69 66 count) {......if
134e0 20 28 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c (certs_resizabl
134f0 65 29 20 7b 0a 09 09 09 09 09 09 2a 63 6f 75 6e e) {.......*coun
13500 74 20 2a 3d 20 32 3b 0a 09 09 09 09 09 09 69 66 t *= 2;.......if
13510 20 28 2a 63 6f 75 6e 74 20 21 3d 20 30 29 20 7b (*count != 0) {
13520 0a 09 09 09 09 09 09 09 63 65 72 74 73 20 3d 20 ........certs =
13530 72 65 61 6c 6c 6f 63 28 63 65 72 74 73 2c 20 73 realloc(certs, s
13540 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 izeof(*certs) *
13550 28 2a 63 6f 75 6e 74 29 29 3b 0a 09 09 09 09 09 (*count));......
13560 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 .} else {.......
13570 09 63 65 72 74 73 20 3d 20 4e 55 4c 4c 3b 0a 09 .certs = NULL;..
13580 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 20 65 6c .....}......} el
13590 73 65 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b se {.......break
135a0 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 ;......}.....}..
135b0 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 66 ..}.....cackey_f
135c0 72 65 65 5f 74 6c 76 28 61 70 70 5f 74 6c 76 29 ree_tlv(app_tlv)
135d0 3b 0a 0a 09 09 09 69 66 20 28 6f 75 74 69 64 78 ;.....if (outidx
135e0 20 3e 3d 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 09 >= *count) {...
135f0 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 ..break;....}...
13600 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65 }....cackey_free
13610 5f 74 6c 76 28 63 63 63 5f 74 6c 76 29 3b 0a 09 _tlv(ccc_tlv);..
13620 7d 0a 0a 09 2a 63 6f 75 6e 74 20 3d 20 6f 75 74 }...*count = out
13630 69 64 78 3b 0a 0a 09 69 66 20 28 63 65 72 74 73 idx;...if (certs
13640 5f 72 65 73 69 7a 61 62 6c 65 29 20 7b 0a 09 09 _resizable) {...
13650 69 66 20 28 2a 63 6f 75 6e 74 20 21 3d 20 30 29 if (*count != 0)
13660 20 7b 0a 09 09 09 63 65 72 74 73 20 3d 20 72 65 {....certs = re
13670 61 6c 6c 6f 63 28 63 65 72 74 73 2c 20 73 69 7a alloc(certs, siz
13680 65 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 28 2a eof(*certs) * (*
13690 63 6f 75 6e 74 29 29 3b 0a 09 09 7d 20 65 6c 73 count));...} els
136a0 65 20 7b 0a 09 09 09 66 72 65 65 28 63 65 72 74 e {....free(cert
136b0 73 29 3b 0a 0a 09 09 09 63 65 72 74 73 20 3d 20 s);.....certs =
136c0 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 73 NULL;...}..}...s
136d0 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 lot->cached_cert
136e0 73 20 3d 20 63 61 63 6b 65 79 5f 63 6f 70 79 5f s = cackey_copy_
136f0 63 65 72 74 73 28 4e 55 4c 4c 2c 20 63 65 72 74 certs(NULL, cert
13700 73 2c 20 2a 63 6f 75 6e 74 29 3b 0a 09 73 6c 6f s, *count);..slo
13710 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f t->cached_certs_
13720 63 6f 75 6e 74 20 3d 20 2a 63 6f 75 6e 74 3b 0a count = *count;.
13730 0a 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20 53 ../* Terminate S
13740 6d 61 72 74 43 61 72 64 20 54 72 61 6e 73 61 63 martCard Transac
13750 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f tion */..cackey_
13760 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 end_transaction(
13770 73 6c 6f 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 slot);...return(
13780 63 65 72 74 73 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a certs);.}../*. *
13790 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 SYNPOSIS. *
137a0 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d .... *. * ARGUM
137b0 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a ENTS. * ....
137c0 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c *. * RETURN VAL
137d0 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a UE. * .... *
137e0 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 . * NOTES. *
137f0 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 .... *. */.stat
13800 69 63 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 ic ssize_t cacke
13810 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28 73 74 y_signdecrypt(st
13820 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 ruct cackey_slot
13830 20 2a 73 6c 6f 74 2c 20 73 74 72 75 63 74 20 63 *slot, struct c
13840 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a ackey_identity *
13850 69 64 65 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e identity, unsign
13860 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 73 69 ed char *buf, si
13870 7a 65 5f 74 20 62 75 66 6c 65 6e 2c 20 75 6e 73 ze_t buflen, uns
13880 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 62 igned char *outb
13890 75 66 2c 20 73 69 7a 65 5f 74 20 6f 75 74 62 75 uf, size_t outbu
138a0 66 6c 65 6e 2c 20 69 6e 74 20 70 61 64 49 6e 70 flen, int padInp
138b0 75 74 2c 20 69 6e 74 20 75 6e 70 61 64 4f 75 74 ut, int unpadOut
138c0 70 75 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f 70 put) {..cackey_p
138d0 63 73 63 5f 69 64 5f 74 79 70 65 20 69 64 5f 74 csc_id_type id_t
138e0 79 70 65 2c 20 63 68 65 63 6b 5f 69 64 5f 74 79 ype, check_id_ty
138f0 70 65 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 pe;..unsigned ch
13900 61 72 20 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 ar dyn_auth_temp
13910 6c 61 74 65 5b 31 30 5d 2c 20 2a 64 79 6e 5f 61 late[10], *dyn_a
13920 75 74 68 5f 74 6d 70 62 75 66 3b 0a 09 75 6e 73 uth_tmpbuf;..uns
13930 69 67 6e 65 64 20 63 68 61 72 20 2a 74 6d 70 62 igned char *tmpb
13940 75 66 2c 20 2a 74 6d 70 62 75 66 5f 73 2c 20 2a uf, *tmpbuf_s, *
13950 6f 75 74 62 75 66 5f 73 2c 20 2a 6f 75 74 62 75 outbuf_s, *outbu
13960 66 5f 70 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 f_p;..unsigned c
13970 68 61 72 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e har bytes_to_sen
13980 64 2c 20 70 31 2c 20 63 6c 61 73 73 3b 0a 09 75 d, p1, class;..u
13990 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62 6c 6f nsigned char blo
139a0 63 6b 74 79 70 65 3b 0a 09 63 61 63 6b 65 79 5f cktype;..cackey_
139b0 72 65 74 20 73 65 6e 64 5f 72 65 74 3b 0a 09 75 ret send_ret;..u
139c0 69 6e 74 31 36 5f 74 20 72 65 73 70 63 6f 64 65 int16_t respcode
139d0 3b 0a 09 73 73 69 7a 65 5f 74 20 72 65 74 76 61 ;..ssize_t retva
139e0 6c 20 3d 20 30 2c 20 75 6e 70 61 64 6f 66 66 73 l = 0, unpadoffs
139f0 65 74 3b 0a 09 73 69 7a 65 5f 74 20 74 6d 70 62 et;..size_t tmpb
13a00 75 66 6c 65 6e 2c 20 70 61 64 6c 65 6e 2c 20 74 uflen, padlen, t
13a10 6d 70 6f 75 74 62 75 66 6c 65 6e 2c 20 6f 75 74 mpoutbuflen, out
13a20 62 75 66 5f 6c 65 6e 3b 0a 09 69 6e 74 20 66 72 buf_len;..int fr
13a30 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09 ee_tmpbuf = 0;..
13a40 69 6e 74 20 6c 65 3b 0a 0a 09 43 41 43 4b 45 59 int le;...CACKEY
13a50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 _DEBUG_PRINTF("C
13a60 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 alled.");...if (
13a70 73 6c 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a slot == NULL) {.
13a80 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
13a90 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 73 RINTF("Error. s
13aa0 6c 6f 74 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a lot is NULL");..
13ab0 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d ..return(-1);..}
13ac0 0a 0a 09 69 66 20 28 62 75 66 20 3d 3d 20 4e 55 ...if (buf == NU
13ad0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 LL) {...CACKEY_D
13ae0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
13af0 6f 72 2e 20 20 62 75 66 20 69 73 20 4e 55 4c 4c or. buf is NULL
13b00 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 ");....return(-1
13b10 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 75 74 62 );..}...if (outb
13b20 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 uf == NULL) {...
13b30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
13b40 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 6f 75 74 NTF("Error. out
13b50 62 75 66 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a buf is NULL");..
13b60 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d ..return(-1);..}
13b70 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79 20 ...if (identity
13b80 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 == NULL) {...CAC
13b90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
13ba0 28 22 45 72 72 6f 72 2e 20 20 69 64 65 6e 74 69 ("Error. identi
13bb0 74 79 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 ty is NULL");...
13bc0 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a .return(-1);..}.
13bd0 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e ..if (identity->
13be0 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 3d pcsc_identity ==
13bf0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 NULL) {...CACKE
13c00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
13c10 45 72 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79 Error. identity
13c20 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 ->pcsc_identity
13c30 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 is NULL");....re
13c40 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 turn(-1);..}...i
13c50 64 5f 74 79 70 65 20 3d 20 69 64 65 6e 74 69 74 d_type = identit
13c60 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 y->pcsc_identity
13c70 2d 3e 69 64 5f 74 79 70 65 3b 0a 09 69 66 20 28 ->id_type;..if (
13c80 69 64 5f 74 79 70 65 20 3d 3d 20 43 41 43 4b 45 id_type == CACKE
13c90 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f Y_ID_TYPE_CERT_O
13ca0 4e 4c 59 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f NLY) {...CACKEY_
13cb0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
13cc0 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79 2d 3e ror. identity->
13cd0 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 69 73 pcsc_identity is
13ce0 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f CACKEY_ID_TYPE_
13cf0 43 45 52 54 5f 4f 4e 4c 59 2c 20 77 68 69 63 68 CERT_ONLY, which
13d00 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 cannot be used
13d10 66 6f 72 20 73 69 67 6e 2f 64 65 63 72 79 70 74 for sign/decrypt
13d20 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 ");....return(-1
13d30 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 );..}...switch (
13d40 69 64 5f 74 79 70 65 29 20 7b 0a 09 09 63 61 73 id_type) {...cas
13d50 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 e CACKEY_ID_TYPE
13d60 5f 50 49 56 3a 0a 09 09 63 61 73 65 20 43 41 43 _PIV:...case CAC
13d70 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a KEY_ID_TYPE_CAC:
13d80 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 64 65 66 ....break;...def
13d90 61 75 6c 74 3a 0a 09 09 09 43 41 43 4b 45 59 5f ault:....CACKEY_
13da0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
13db0 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79 2d 3e ror. identity->
13dc0 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 69 73 pcsc_identity is
13dd0 20 6e 6f 74 20 61 20 73 75 70 70 6f 72 74 65 64 not a supported
13de0 20 76 61 6c 75 65 2e 20 54 79 70 65 20 69 73 3a value. Type is:
13df0 20 30 78 25 6c 78 20 28 50 49 56 20 3d 20 30 78 0x%lx (PIV = 0x
13e00 25 6c 78 2c 20 43 41 43 20 3d 20 30 78 25 6c 78 %lx, CAC = 0x%lx
13e10 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f )", (unsigned lo
13e20 6e 67 29 20 69 64 5f 74 79 70 65 2c 20 28 75 6e ng) id_type, (un
13e30 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 43 41 43 signed long) CAC
13e40 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 2c KEY_ID_TYPE_PIV,
13e50 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
13e60 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f CACKEY_ID_TYPE_
13e70 43 41 43 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e CAC);.....return
13e80 28 2d 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 (-1);..}.../* De
13e90 74 65 72 6d 69 6e 65 20 69 64 65 6e 74 69 74 79 termine identity
13ea0 20 4b 65 79 20 73 69 7a 65 20 2a 2f 0a 09 69 66 Key size */..if
13eb0 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 (identity->pcsc
13ec0 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 _identity->keysi
13ed0 7a 65 20 3c 20 30 29 20 7b 0a 09 09 69 64 65 6e ze < 0) {...iden
13ee0 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 tity->pcsc_ident
13ef0 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 78 ity->keysize = x
13f00 35 30 39 5f 74 6f 5f 6b 65 79 73 69 7a 65 28 69 509_to_keysize(i
13f10 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 dentity->pcsc_id
13f20 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 entity->certific
13f30 61 74 65 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 ate, identity->p
13f40 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 csc_identity->ce
13f50 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a rtificate_len);.
13f60 09 7d 0a 0a 09 2f 2a 20 50 61 64 20 6d 65 73 73 .}.../* Pad mess
13f70 61 67 65 20 74 6f 20 6b 65 79 20 73 69 7a 65 20 age to key size
13f80 2a 2f 0a 09 69 66 20 28 70 61 64 49 6e 70 75 74 */..if (padInput
13f90 29 20 7b 0a 09 09 69 66 20 28 69 64 65 6e 74 69 ) {...if (identi
13fa0 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 ty->pcsc_identit
13fb0 79 2d 3e 6b 65 79 73 69 7a 65 20 3e 20 30 29 20 y->keysize > 0)
13fc0 7b 0a 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20 {....if (buflen
13fd0 21 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 != identity->pcs
13fe0 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 c_identity->keys
13ff0 69 7a 65 29 20 7b 0a 09 09 09 09 69 66 20 28 62 ize) {.....if (b
14000 75 66 6c 65 6e 20 3e 20 28 69 64 65 6e 74 69 74 uflen > (identit
14010 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 y->pcsc_identity
14020 2d 3e 6b 65 79 73 69 7a 65 20 2d 20 33 29 29 20 ->keysize - 3))
14030 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 {......CACKEY_DE
14040 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
14050 72 2e 20 20 4d 65 73 73 61 67 65 20 69 73 20 74 r. Message is t
14060 6f 6f 20 6c 61 72 67 65 20 74 6f 20 73 69 67 6e oo large to sign
14070 2f 64 65 63 72 79 70 74 22 29 3b 0a 0a 09 09 09 /decrypt");.....
14080 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 ..return(-1);...
14090 09 09 7d 0a 0a 09 09 09 09 74 6d 70 62 75 66 6c ..}......tmpbufl
140a0 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70 en = identity->p
140b0 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 csc_identity->ke
140c0 79 73 69 7a 65 3b 0a 09 09 09 09 74 6d 70 62 75 ysize;.....tmpbu
140d0 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 f = malloc(tmpbu
140e0 66 6c 65 6e 29 3b 0a 09 09 09 09 66 72 65 65 5f flen);.....free_
140f0 74 6d 70 62 75 66 20 3d 20 31 3b 0a 0a 09 09 09 tmpbuf = 1;.....
14100 09 70 61 64 6c 65 6e 20 3d 20 74 6d 70 62 75 66 .padlen = tmpbuf
14110 6c 65 6e 20 2d 20 62 75 66 6c 65 6e 20 2d 20 33 len - buflen - 3
14120 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 ;......CACKEY_DE
14130 42 55 47 5f 50 52 49 4e 54 46 28 22 4e 65 65 64 BUG_PRINTF("Need
14140 20 74 6f 20 70 61 64 20 74 68 65 20 62 75 66 66 to pad the buff
14150 65 72 20 77 69 74 68 20 25 6c 6c 75 20 62 79 74 er with %llu byt
14160 65 73 20 28 74 6d 70 62 75 66 6c 65 6e 20 3d 20 es (tmpbuflen =
14170 25 6c 6c 75 2c 20 62 75 66 6c 65 6e 20 3d 20 25 %llu, buflen = %
14180 6c 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 llu)", (unsigned
14190 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 70 61 64 6c long long) padl
141a0 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f en, (unsigned lo
141b0 6e 67 20 6c 6f 6e 67 29 20 74 6d 70 62 75 66 6c ng long) tmpbufl
141c0 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f en, (unsigned lo
141d0 6e 67 20 6c 6f 6e 67 29 20 62 75 66 6c 65 6e 29 ng long) buflen)
141e0 3b 0a 0a 09 09 09 09 2f 2a 20 52 53 41 20 50 4b ;....../* RSA PK
141f0 43 53 23 31 20 45 4d 53 41 2d 50 4b 43 53 31 2d CS#1 EMSA-PKCS1-
14200 76 31 5f 35 20 50 61 64 64 69 6e 67 20 2a 2f 0a v1_5 Padding */.
14210 09 09 09 09 74 6d 70 62 75 66 5b 30 5d 20 3d 20 ....tmpbuf[0] =
14220 30 78 30 30 3b 0a 09 09 09 09 74 6d 70 62 75 66 0x00;.....tmpbuf
14230 5b 31 5d 20 3d 20 30 78 30 31 3b 0a 09 09 09 09 [1] = 0x01;.....
14240 6d 65 6d 73 65 74 28 26 74 6d 70 62 75 66 5b 32 memset(&tmpbuf[2
14250 5d 2c 20 30 78 46 46 2c 20 70 61 64 6c 65 6e 29 ], 0xFF, padlen)
14260 3b 0a 09 09 09 09 74 6d 70 62 75 66 5b 70 61 64 ;.....tmpbuf[pad
14270 6c 65 6e 20 2b 20 32 5d 3d 20 30 78 30 30 3b 0a len + 2]= 0x00;.
14280 09 09 09 09 6d 65 6d 63 70 79 28 26 74 6d 70 62 ....memcpy(&tmpb
14290 75 66 5b 70 61 64 6c 65 6e 20 2b 20 33 5d 2c 20 uf[padlen + 3],
142a0 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b 0a 0a 09 buf, buflen);...
142b0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
142c0 50 52 49 4e 54 42 55 46 28 22 55 6e 70 61 64 64 PRINTBUF("Unpadd
142d0 65 64 3a 22 2c 20 62 75 66 2c 20 62 75 66 6c 65 ed:", buf, bufle
142e0 6e 29 3b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 n);.....CACKEY_D
142f0 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 50 EBUG_PRINTBUF("P
14300 61 64 64 65 64 3a 22 2c 20 74 6d 70 62 75 66 2c added:", tmpbuf,
14310 20 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 09 09 09 tmpbuflen);....
14320 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 74 6d 70 } else {.....tmp
14330 62 75 66 20 3d 20 62 75 66 3b 0a 09 09 09 09 74 buf = buf;.....t
14340 6d 70 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65 mpbuflen = bufle
14350 6e 3b 0a 09 09 09 09 66 72 65 65 5f 74 6d 70 62 n;.....free_tmpb
14360 75 66 20 3d 20 30 3b 0a 09 09 09 09 70 61 64 6c uf = 0;.....padl
14370 65 6e 20 3d 20 30 3b 0a 09 09 09 7d 0a 09 09 7d en = 0;....}...}
14380 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 else {....CACKE
14390 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
143a0 55 6e 61 62 6c 65 20 74 6f 20 64 65 74 65 72 6d Unable to determ
143b0 69 6e 65 20 6b 65 79 20 73 69 7a 65 2c 20 68 6f ine key size, ho
143c0 70 69 6e 67 20 74 68 65 20 6d 65 73 73 61 67 65 ping the message
143d0 20 69 73 20 70 72 6f 70 65 72 6c 79 20 70 61 64 is properly pad
143e0 64 65 64 21 22 29 3b 0a 0a 09 09 09 74 6d 70 62 ded!");.....tmpb
143f0 75 66 20 3d 20 62 75 66 3b 0a 09 09 09 74 6d 70 uf = buf;....tmp
14400 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b buflen = buflen;
14410 0a 09 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20 ....free_tmpbuf
14420 3d 20 30 3b 0a 09 09 09 70 61 64 6c 65 6e 20 3d = 0;....padlen =
14430 20 30 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 0;...}..} else
14440 7b 0a 09 09 74 6d 70 62 75 66 20 3d 20 62 75 66 {...tmpbuf = buf
14450 3b 0a 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 ;...tmpbuflen =
14460 62 75 66 6c 65 6e 3b 0a 09 09 66 72 65 65 5f 74 buflen;...free_t
14470 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09 70 61 64 mpbuf = 0;...pad
14480 6c 65 6e 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a len = 0;..}.../*
14490 20 42 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69 Begin transacti
144a0 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 62 65 on */..cackey_be
144b0 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 gin_transaction(
144c0 73 6c 6f 74 29 3b 0a 0a 09 2f 2a 20 53 65 6c 65 slot);.../* Sele
144d0 63 74 20 63 6f 72 72 65 63 74 20 61 70 70 6c 65 ct correct apple
144e0 74 20 2a 2f 0a 09 73 77 69 74 63 68 20 28 69 64 t */..switch (id
144f0 5f 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20 _type) {...case
14500 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 CACKEY_ID_TYPE_C
14510 41 43 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 AC:....CACKEY_DE
14520 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 6c 65 BUG_PRINTF("Sele
14530 63 74 69 6e 67 20 61 70 70 6c 65 74 20 66 6f 75 cting applet fou
14540 6e 64 20 61 74 20 25 70 20 2e 2e 2e 22 2c 20 69 nd at %p ...", i
14550 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 dentity->pcsc_id
14560 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 63 61 63 entity->card.cac
14570 2e 61 70 70 6c 65 74 29 3b 0a 09 09 09 63 61 63 .applet);....cac
14580 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 key_select_apple
14590 74 28 73 6c 6f 74 2c 20 69 64 65 6e 74 69 74 79 t(slot, identity
145a0 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d ->pcsc_identity-
145b0 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 >card.cac.applet
145c0 2c 20 73 69 7a 65 6f 66 28 69 64 65 6e 74 69 74 , sizeof(identit
145d0 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 y->pcsc_identity
145e0 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 ->card.cac.apple
145f0 74 29 29 3b 0a 0a 09 09 09 2f 2a 20 53 65 6c 65 t));...../* Sele
14600 63 74 20 63 6f 72 72 65 63 74 20 66 69 6c 65 20 ct correct file
14610 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 6c */....cackey_sel
14620 65 63 74 5f 66 69 6c 65 28 73 6c 6f 74 2c 20 69 ect_file(slot, i
14630 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 dentity->pcsc_id
14640 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 63 61 63 entity->card.cac
14650 2e 66 69 6c 65 29 3b 0a 09 09 09 62 72 65 61 6b .file);....break
14660 3b 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f ;...case CACKEY_
14670 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09 09 ID_TYPE_PIV:....
14680 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 dyn_auth_templat
14690 65 5b 30 5d 20 3d 20 30 78 37 43 3b 0a 09 09 09 e[0] = 0x7C;....
146a0 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 dyn_auth_templat
146b0 65 5b 31 5d 20 3d 20 30 78 38 32 3b 0a 09 09 09 e[1] = 0x82;....
146c0 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 dyn_auth_templat
146d0 65 5b 32 5d 20 3d 20 28 28 74 6d 70 62 75 66 6c e[2] = ((tmpbufl
146e0 65 6e 20 2b 20 36 29 20 26 20 30 78 66 66 30 30 en + 6) & 0xff00
146f0 29 20 3e 3e 20 38 3b 0a 09 09 09 64 79 6e 5f 61 ) >> 8;....dyn_a
14700 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 33 5d 20 uth_template[3]
14710 3d 20 28 74 6d 70 62 75 66 6c 65 6e 20 2b 20 36 = (tmpbuflen + 6
14720 29 20 26 20 30 78 30 30 66 66 3b 0a 09 09 09 64 ) & 0x00ff;....d
14730 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 yn_auth_template
14740 5b 34 5d 20 3d 20 30 78 38 32 3b 0a 09 09 09 64 [4] = 0x82;....d
14750 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 yn_auth_template
14760 5b 35 5d 20 3d 20 30 78 30 30 3b 0a 09 09 09 64 [5] = 0x00;....d
14770 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 yn_auth_template
14780 5b 36 5d 20 3d 20 30 78 38 31 3b 0a 09 09 09 64 [6] = 0x81;....d
14790 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 yn_auth_template
147a0 5b 37 5d 20 3d 20 30 78 38 32 3b 0a 09 09 09 64 [7] = 0x82;....d
147b0 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 yn_auth_template
147c0 5b 38 5d 20 3d 20 28 74 6d 70 62 75 66 6c 65 6e [8] = (tmpbuflen
147d0 20 26 20 30 78 66 66 30 30 29 20 3e 3e 20 38 3b & 0xff00) >> 8;
147e0 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d ....dyn_auth_tem
147f0 70 6c 61 74 65 5b 39 5d 20 3d 20 74 6d 70 62 75 plate[9] = tmpbu
14800 66 6c 65 6e 20 26 20 30 78 30 30 66 66 3b 0a 0a flen & 0x00ff;..
14810 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 6d 70 62 ...dyn_auth_tmpb
14820 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 uf = malloc(tmpb
14830 75 66 6c 65 6e 20 2b 20 73 69 7a 65 6f 66 28 64 uflen + sizeof(d
14840 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 yn_auth_template
14850 29 29 3b 0a 09 09 09 6d 65 6d 63 70 79 28 64 79 ));....memcpy(dy
14860 6e 5f 61 75 74 68 5f 74 6d 70 62 75 66 2c 20 64 n_auth_tmpbuf, d
14870 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 yn_auth_template
14880 2c 20 73 69 7a 65 6f 66 28 64 79 6e 5f 61 75 74 , sizeof(dyn_aut
14890 68 5f 74 65 6d 70 6c 61 74 65 29 29 3b 0a 09 09 h_template));...
148a0 09 6d 65 6d 63 70 79 28 64 79 6e 5f 61 75 74 68 .memcpy(dyn_auth
148b0 5f 74 6d 70 62 75 66 20 2b 20 73 69 7a 65 6f 66 _tmpbuf + sizeof
148c0 28 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 (dyn_auth_templa
148d0 74 65 29 2c 20 74 6d 70 62 75 66 2c 20 74 6d 70 te), tmpbuf, tmp
148e0 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 69 66 20 buflen);.....if
148f0 28 66 72 65 65 5f 74 6d 70 62 75 66 29 20 7b 0a (free_tmpbuf) {.
14900 09 09 09 09 66 72 65 65 28 74 6d 70 62 75 66 29 ....free(tmpbuf)
14910 3b 0a 09 09 09 7d 0a 0a 09 09 09 74 6d 70 62 75 ;....}.....tmpbu
14920 66 6c 65 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 64 flen += sizeof(d
14930 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 yn_auth_template
14940 29 3b 0a 09 09 09 74 6d 70 62 75 66 20 3d 20 64 );....tmpbuf = d
14950 79 6e 5f 61 75 74 68 5f 74 6d 70 62 75 66 3b 0a yn_auth_tmpbuf;.
14960 09 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d ...free_tmpbuf =
14970 20 31 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 1;.....break;..
14980 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f .case CACKEY_ID_
14990 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 3a 0a TYPE_CERT_ONLY:.
149a0 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 74 ...break;..}...t
149b0 6d 70 62 75 66 5f 73 20 3d 20 74 6d 70 62 75 66 mpbuf_s = tmpbuf
149c0 3b 0a 09 6f 75 74 62 75 66 5f 73 20 3d 20 6f 75 ;..outbuf_s = ou
149d0 74 62 75 66 3b 0a 09 77 68 69 6c 65 20 28 74 6d tbuf;..while (tm
149e0 70 62 75 66 6c 65 6e 29 20 7b 0a 09 09 74 6d 70 pbuflen) {...tmp
149f0 6f 75 74 62 75 66 6c 65 6e 20 3d 20 6f 75 74 62 outbuflen = outb
14a00 75 66 6c 65 6e 3b 0a 0a 09 09 69 66 20 28 74 6d uflen;....if (tm
14a10 70 62 75 66 6c 65 6e 20 3e 20 43 41 43 4b 45 59 pbuflen > CACKEY
14a20 5f 41 50 44 55 5f 4d 54 55 29 20 7b 0a 09 09 09 _APDU_MTU) {....
14a30 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 20 3d 20 bytes_to_send =
14a40 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 3b CACKEY_APDU_MTU;
14a50 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 62 ...} else {....b
14a60 79 74 65 73 5f 74 6f 5f 73 65 6e 64 20 3d 20 74 ytes_to_send = t
14a70 6d 70 62 75 66 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 mpbuflen;...}...
14a80 09 73 65 6e 64 5f 72 65 74 20 3d 20 43 41 43 4b .send_ret = CACK
14a90 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 EY_PCSC_E_GENERI
14aa0 43 3b 0a 09 09 73 77 69 74 63 68 20 28 69 64 5f C;...switch (id_
14ab0 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20 type) {....case
14ac0 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 CACKEY_ID_TYPE_C
14ad0 41 43 3a 0a 09 09 09 09 69 66 20 28 74 6d 70 62 AC:.....if (tmpb
14ae0 75 66 6c 65 6e 20 3e 20 43 41 43 4b 45 59 5f 41 uflen > CACKEY_A
14af0 50 44 55 5f 4d 54 55 29 20 7b 0a 09 09 09 09 09 PDU_MTU) {......
14b00 70 31 20 3d 20 30 78 38 30 3b 0a 09 09 09 09 09 p1 = 0x80;......
14b10 6c 65 20 3d 20 30 78 30 30 3b 0a 09 09 09 09 7d le = 0x00;.....}
14b20 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 31 20 else {......p1
14b30 3d 20 30 78 30 30 3b 0a 09 09 09 09 09 6c 65 20 = 0x00;......le
14b40 3d 20 30 78 30 30 3b 0a 09 09 09 09 7d 0a 0a 09 = 0x00;.....}...
14b50 09 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 ...send_ret = ca
14b60 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 ckey_send_apdu(s
14b70 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 lot, GSCIS_CLASS
14b80 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d _GLOBAL_PLATFORM
14b90 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 49 , GSCIS_INSTR_SI
14ba0 47 4e 44 45 43 52 59 50 54 2c 20 70 31 2c 20 30 GNDECRYPT, p1, 0
14bb0 78 30 30 2c 20 62 79 74 65 73 5f 74 6f 5f 73 65 x00, bytes_to_se
14bc0 6e 64 2c 20 74 6d 70 62 75 66 2c 20 6c 65 2c 20 nd, tmpbuf, le,
14bd0 26 72 65 73 70 63 6f 64 65 2c 20 6f 75 74 62 75 &respcode, outbu
14be0 66 2c 20 26 74 6d 70 6f 75 74 62 75 66 6c 65 6e f, &tmpoutbuflen
14bf0 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 );.....break;...
14c00 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f .case CACKEY_ID_
14c10 54 59 50 45 5f 50 49 56 3a 0a 09 09 09 09 69 66 TYPE_PIV:.....if
14c20 20 28 74 6d 70 62 75 66 6c 65 6e 20 3e 20 43 41 (tmpbuflen > CA
14c30 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 29 20 7b CKEY_APDU_MTU) {
14c40 0a 09 09 09 09 09 63 6c 61 73 73 20 3d 20 30 78 ......class = 0x
14c50 31 30 3b 0a 09 09 09 09 09 6c 65 20 3d 20 30 78 10;......le = 0x
14c60 30 30 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 00;.....} else {
14c70 0a 09 09 09 09 09 63 6c 61 73 73 20 3d 20 47 53 ......class = GS
14c80 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 CIS_CLASS_ISO781
14c90 36 3b 0a 09 09 09 09 09 6c 65 20 3d 20 32 35 36 6;......le = 256
14ca0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 73 65 6e ;.....}......sen
14cb0 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 d_ret = cackey_s
14cc0 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 63 end_apdu(slot, c
14cd0 6c 61 73 73 2c 20 4e 49 53 54 53 50 38 30 30 5f lass, NISTSP800_
14ce0 37 33 5f 33 5f 49 4e 53 54 52 5f 47 45 4e 41 55 73_3_INSTR_GENAU
14cf0 54 48 2c 20 4e 49 53 54 53 50 38 30 30 5f 37 38 TH, NISTSP800_78
14d00 5f 33 5f 41 4c 47 4f 5f 52 53 41 32 30 34 38 2c _3_ALGO_RSA2048,
14d10 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f identity->pcsc_
14d20 69 64 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 70 identity->card.p
14d30 69 76 2e 6b 65 79 5f 69 64 2c 20 62 79 74 65 73 iv.key_id, bytes
14d40 5f 74 6f 5f 73 65 6e 64 2c 20 74 6d 70 62 75 66 _to_send, tmpbuf
14d50 2c 20 6c 65 2c 20 26 72 65 73 70 63 6f 64 65 2c , le, &respcode,
14d60 20 6f 75 74 62 75 66 2c 20 26 74 6d 70 6f 75 74 outbuf, &tmpout
14d70 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 62 72 65 buflen);.....bre
14d80 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 41 43 4b ak;....case CACK
14d90 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f EY_ID_TYPE_CERT_
14da0 4f 4e 4c 59 3a 0a 09 09 09 09 62 72 65 61 6b 3b ONLY:.....break;
14db0 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 65 6e 64 ...}....if (send
14dc0 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 _ret != CACKEY_P
14dd0 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 69 CSC_S_OK) {....i
14de0 66 20 28 66 72 65 65 5f 74 6d 70 62 75 66 29 20 f (free_tmpbuf)
14df0 7b 0a 09 09 09 09 69 66 20 28 74 6d 70 62 75 66 {.....if (tmpbuf
14e00 5f 73 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28 _s) {......free(
14e10 74 6d 70 62 75 66 5f 73 29 3b 0a 09 09 09 09 7d tmpbuf_s);.....}
14e20 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 45 6e 64 ....}...../* End
14e30 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a transaction */.
14e40 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 ...cackey_end_tr
14e50 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b ansaction(slot);
14e60 0a 0a 09 09 09 69 66 20 28 73 65 6e 64 5f 72 65 .....if (send_re
14e70 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 t == CACKEY_PCSC
14e80 5f 45 5f 52 45 54 52 59 29 20 7b 0a 09 09 09 09 _E_RETRY) {.....
14e90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
14ea0 4e 54 46 28 22 41 44 50 55 20 53 65 6e 64 69 6e NTF("ADPU Sendin
14eb0 67 20 46 61 69 6c 65 64 20 2d 2d 20 72 65 74 72 g Failed -- retr
14ec0 79 69 6e 67 2e 22 29 3b 0a 0a 09 09 09 09 72 65 ying.");......re
14ed0 74 75 72 6e 28 63 61 63 6b 65 79 5f 73 69 67 6e turn(cackey_sign
14ee0 64 65 63 72 79 70 74 28 73 6c 6f 74 2c 20 69 64 decrypt(slot, id
14ef0 65 6e 74 69 74 79 2c 20 62 75 66 2c 20 62 75 66 entity, buf, buf
14f00 6c 65 6e 2c 20 6f 75 74 62 75 66 2c 20 6f 75 74 len, outbuf, out
14f10 62 75 66 6c 65 6e 2c 20 70 61 64 49 6e 70 75 74 buflen, padInput
14f20 2c 20 75 6e 70 61 64 4f 75 74 70 75 74 29 29 3b , unpadOutput));
14f30 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59 ....}.....CACKEY
14f40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 _DEBUG_PRINTF("A
14f50 44 50 55 20 53 65 6e 64 69 6e 67 20 46 61 69 6c DPU Sending Fail
14f60 65 64 20 2d 2d 20 72 65 74 75 72 6e 69 6e 67 20 ed -- returning
14f70 69 6e 20 65 72 72 6f 72 2e 22 29 3b 0a 0a 09 09 in error.");....
14f80 09 69 66 20 28 72 65 73 70 63 6f 64 65 20 3d 3d .if (respcode ==
14f90 20 30 78 36 39 38 32 20 7c 7c 20 72 65 73 70 63 0x6982 || respc
14fa0 6f 64 65 20 3d 3d 20 30 78 36 65 30 30 20 7c 7c ode == 0x6e00 ||
14fb0 20 72 65 73 70 63 6f 64 65 20 3d 3d 20 30 78 36 respcode == 0x6
14fc0 64 30 30 29 20 7b 0a 09 09 09 09 69 66 20 28 72 d00) {.....if (r
14fd0 65 73 70 63 6f 64 65 20 3d 3d 20 30 78 36 65 30 espcode == 0x6e0
14fe0 30 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 0) {......CACKEY
14ff0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 47 _DEBUG_PRINTF("G
15000 6f 74 20 5c 22 57 52 4f 4e 47 20 43 4c 41 53 53 ot \"WRONG CLASS
15010 5c 22 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 77 \", this means w
15020 65 20 61 72 65 20 74 61 6c 6b 69 6e 67 20 74 6f e are talking to
15030 20 74 68 65 20 77 72 6f 6e 67 20 6f 62 6a 65 63 the wrong objec
15040 74 20 28 6c 69 6b 65 6c 79 20 62 65 63 61 75 73 t (likely becaus
15050 65 20 74 68 65 20 63 61 72 64 20 77 65 6e 74 20 e the card went
15060 61 77 61 79 29 20 2d 2d 20 72 65 73 65 74 74 69 away) -- resetti
15070 6e 67 22 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 ng");.....} else
15080 20 69 66 20 28 72 65 73 70 63 6f 64 65 20 3d 3d if (respcode ==
15090 20 30 78 36 64 30 30 29 20 7b 0a 09 09 09 09 09 0x6d00) {......
150a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
150b0 4e 54 46 28 22 47 6f 74 20 5c 22 49 4e 56 41 4c NTF("Got \"INVAL
150c0 49 44 20 49 4e 53 54 52 55 43 54 49 4f 4e 5c 22 ID INSTRUCTION\"
150d0 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 77 65 20 , this means we
150e0 61 72 65 20 74 61 6c 6b 69 6e 67 20 74 6f 20 74 are talking to t
150f0 68 65 20 77 72 6f 6e 67 20 6f 62 6a 65 63 74 20 he wrong object
15100 28 6c 69 6b 65 6c 79 20 62 65 63 61 75 73 65 20 (likely because
15110 74 68 65 20 63 61 72 64 20 77 65 6e 74 20 61 77 the card went aw
15120 61 79 29 20 2d 2d 20 72 65 73 65 74 74 69 6e 67 ay) -- resetting
15130 22 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b ");.....} else {
15140 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 ......CACKEY_DEB
15150 55 47 5f 50 52 49 4e 54 46 28 22 53 65 63 75 72 UG_PRINTF("Secur
15160 69 74 79 20 73 74 61 74 75 73 20 6e 6f 74 20 73 ity status not s
15170 61 74 69 73 69 66 69 65 64 20 28 72 65 73 70 63 atisified (respc
15180 6f 64 65 20 3d 20 30 78 25 30 34 78 29 2e 20 20 ode = 0x%04x).
15190 52 65 74 75 72 6e 69 6e 67 20 4e 45 45 44 4c 4f Returning NEEDLO
151a0 47 49 4e 22 2c 20 28 69 6e 74 29 20 72 65 73 70 GIN", (int) resp
151b0 63 6f 64 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 code);.....}....
151c0 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c ..cackey_mark_sl
151d0 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a ot_reset(slot);.
151e0 0a 09 09 09 09 63 61 63 6b 65 79 5f 64 65 74 65 .....cackey_dete
151f0 63 74 5f 61 6e 64 5f 73 65 6c 65 63 74 5f 72 6f ct_and_select_ro
15200 6f 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 ot_applet(slot,
15210 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 55 CACKEY_ID_TYPE_U
15220 4e 4b 4e 4f 57 4e 29 3b 0a 0a 09 09 09 09 73 6c NKNOWN);......sl
15230 6f 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 ot->token_flags
15240 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 = CKF_LOGIN_REQU
15250 49 52 45 44 3b 0a 0a 09 09 09 09 72 65 74 75 72 IRED;......retur
15260 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f n(CACKEY_PCSC_E_
15270 4e 45 45 44 4c 4f 47 49 4e 29 3b 0a 09 09 09 7d NEEDLOGIN);....}
15280 0a 0a 09 09 09 69 66 20 28 73 65 6e 64 5f 72 65 .....if (send_re
15290 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 t == CACKEY_PCSC
152a0 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20 _E_TOKENABSENT)
152b0 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 {.....CACKEY_DEB
152c0 55 47 5f 50 52 49 4e 54 46 28 22 54 6f 6b 65 6e UG_PRINTF("Token
152d0 20 61 62 73 65 6e 74 2e 20 20 52 65 74 75 72 6e absent. Return
152e0 69 6e 67 20 54 4f 4b 45 4e 41 42 53 45 4e 54 22 ing TOKENABSENT"
152f0 29 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d );......cackey_m
15300 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 ark_slot_reset(s
15310 6c 6f 74 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 lot);......retur
15320 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f n(CACKEY_PCSC_E_
15330 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 TOKENABSENT);...
15340 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 .}.....CACKEY_DE
15350 42 55 47 5f 50 52 49 4e 54 46 28 22 53 6f 6d 65 BUG_PRINTF("Some
15360 74 68 69 6e 67 20 77 65 6e 74 20 77 72 6f 6e 67 thing went wrong
15370 20 64 75 72 69 6e 67 20 73 69 67 6e 69 6e 67 2c during signing,
15380 20 72 65 73 65 74 74 69 6e 67 20 74 68 65 20 73 resetting the s
15390 6c 6f 74 20 61 6e 64 20 68 6f 70 69 6e 67 20 66 lot and hoping f
153a0 6f 72 20 74 68 65 20 62 65 73 74 2e 22 29 3b 0a or the best.");.
153b0 0a 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f ....cackey_pcsc_
153c0 64 69 73 63 6f 6e 6e 65 63 74 28 29 3b 0a 0a 09 disconnect();...
153d0 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f ..cackey_pcsc_co
153e0 6e 6e 65 63 74 28 29 3b 0a 0a 09 09 09 63 61 63 nnect();.....cac
153f0 6b 65 79 5f 64 65 74 65 63 74 5f 61 6e 64 5f 73 key_detect_and_s
15400 65 6c 65 63 74 5f 72 6f 6f 74 5f 61 70 70 6c 65 elect_root_apple
15410 74 28 73 6c 6f 74 2c 20 43 41 43 4b 45 59 5f 49 t(slot, CACKEY_I
15420 44 5f 54 59 50 45 5f 55 4e 4b 4e 4f 57 4e 29 3b D_TYPE_UNKNOWN);
15430 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b .....return(CACK
15440 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 EY_PCSC_E_GENERI
15450 43 29 3b 0a 09 09 7d 0a 0a 09 09 74 6d 70 62 75 C);...}....tmpbu
15460 66 20 2b 3d 20 62 79 74 65 73 5f 74 6f 5f 73 65 f += bytes_to_se
15470 6e 64 3b 0a 09 09 74 6d 70 62 75 66 6c 65 6e 20 nd;...tmpbuflen
15480 2d 3d 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 -= bytes_to_send
15490 3b 0a 0a 09 09 6f 75 74 62 75 66 20 2b 3d 20 74 ;....outbuf += t
154a0 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 09 6f mpoutbuflen;...o
154b0 75 74 62 75 66 6c 65 6e 20 2d 3d 20 74 6d 70 6f utbuflen -= tmpo
154c0 75 74 62 75 66 6c 65 6e 3b 0a 09 09 72 65 74 76 utbuflen;...retv
154d0 61 6c 20 2b 3d 20 74 6d 70 6f 75 74 62 75 66 6c al += tmpoutbufl
154e0 65 6e 3b 0a 09 7d 0a 0a 09 69 66 20 28 66 72 65 en;..}...if (fre
154f0 65 5f 74 6d 70 62 75 66 29 20 7b 0a 09 09 69 66 e_tmpbuf) {...if
15500 20 28 74 6d 70 62 75 66 5f 73 29 20 7b 0a 09 09 (tmpbuf_s) {...
15510 09 66 72 65 65 28 74 6d 70 62 75 66 5f 73 29 3b .free(tmpbuf_s);
15520 0a 09 09 7d 0a 09 7d 0a 0a 09 6f 75 74 62 75 66 ...}..}...outbuf
15530 20 3d 20 6f 75 74 62 75 66 5f 73 3b 0a 0a 09 2f = outbuf_s;.../
15540 2a 20 45 6e 64 20 74 72 61 6e 73 61 63 74 69 6f * End transactio
15550 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 n */..cackey_end
15560 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f _transaction(slo
15570 74 29 3b 0a 0a 23 69 66 64 65 66 20 43 41 43 4b t);..#ifdef CACK
15580 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 EY_PARANOID.# i
15590 66 64 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a fdef _POSIX_SSIZ
155a0 45 5f 4d 41 58 0a 09 69 66 20 28 6f 75 74 62 75 E_MAX..if (outbu
155b0 66 6c 65 6e 20 3e 20 5f 50 4f 53 49 58 5f 53 53 flen > _POSIX_SS
155c0 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43 IZE_MAX) {...CAC
155d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
155e0 28 22 4f 75 74 62 75 66 6c 65 6e 20 65 78 63 65 ("Outbuflen exce
155f0 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 eds maximum valu
15600 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 e, returning in
15610 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20 failure. (max =
15620 25 6c 69 2c 20 6f 75 74 62 75 66 6c 65 6e 20 3d %li, outbuflen =
15630 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f %lu)", (long) _
15640 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c POSIX_SSIZE_MAX,
15650 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
15660 20 6f 75 74 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 outbuflen);....
15670 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 return(-1);..}.#
15680 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a endif.#endif..
15690 09 2f 2a 20 57 65 20 6d 75 73 74 20 72 65 6d 6f ./* We must remo
156a0 76 65 20 74 68 65 20 22 37 43 22 20 74 61 67 20 ve the "7C" tag
156b0 74 6f 20 67 65 74 20 74 6f 20 74 68 65 20 73 69 to get to the si
156c0 67 6e 61 74 75 72 65 20 2a 2f 0a 09 73 77 69 74 gnature */..swit
156d0 63 68 20 28 69 64 5f 74 79 70 65 29 20 7b 0a 09 ch (id_type) {..
156e0 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f .case CACKEY_ID_
156f0 54 59 50 45 5f 50 49 56 3a 0a 09 09 09 6f 75 74 TYPE_PIV:....out
15700 62 75 66 5f 6c 65 6e 20 3d 20 72 65 74 76 61 6c buf_len = retval
15710 3b 0a 09 09 09 6f 75 74 62 75 66 5f 70 20 3d 20 ;....outbuf_p =
15720 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 65 72 74 cackey_read_bert
15730 6c 76 5f 74 61 67 28 6f 75 74 62 75 66 2c 20 26 lv_tag(outbuf, &
15740 6f 75 74 62 75 66 5f 6c 65 6e 2c 20 30 78 37 43 outbuf_len, 0x7C
15750 2c 20 4e 55 4c 4c 2c 20 20 26 6f 75 74 62 75 66 , NULL, &outbuf
15760 5f 6c 65 6e 29 3b 0a 09 09 09 69 66 20 28 6f 75 _len);....if (ou
15770 74 62 75 66 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 tbuf_p == NULL)
15780 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 {.....CACKEY_DEB
15790 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 70 6f UG_PRINTF("Respo
157a0 6e 73 65 20 66 72 6f 6d 20 50 49 56 20 66 6f 72 nse from PIV for
157b0 20 47 45 4e 45 52 41 54 45 20 41 55 54 48 45 4e GENERATE AUTHEN
157c0 54 49 43 41 54 49 4f 4e 20 77 61 73 20 6e 6f 74 TICATION was not
157d0 20 61 20 30 78 37 43 20 74 61 67 2c 20 72 65 74 a 0x7C tag, ret
157e0 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 urning in failur
157f0 65 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e e");......return
15800 28 2d 31 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 (-1);....}.....r
15810 65 74 76 61 6c 20 3d 20 6f 75 74 62 75 66 5f 6c etval = outbuf_l
15820 65 6e 3b 0a 0a 09 09 09 6f 75 74 62 75 66 5f 6c en;.....outbuf_l
15830 65 6e 20 3d 20 72 65 74 76 61 6c 3b 0a 09 09 09 en = retval;....
15840 6f 75 74 62 75 66 5f 70 20 3d 20 63 61 63 6b 65 outbuf_p = cacke
15850 79 5f 72 65 61 64 5f 62 65 72 74 6c 76 5f 74 61 y_read_bertlv_ta
15860 67 28 6f 75 74 62 75 66 2c 20 26 6f 75 74 62 75 g(outbuf, &outbu
15870 66 5f 6c 65 6e 2c 20 30 78 38 32 2c 20 4e 55 4c f_len, 0x82, NUL
15880 4c 2c 20 20 26 6f 75 74 62 75 66 5f 6c 65 6e 29 L, &outbuf_len)
15890 3b 0a 09 09 09 69 66 20 28 6f 75 74 62 75 66 5f ;....if (outbuf_
158a0 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 p == NULL) {....
158b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
158c0 49 4e 54 46 28 22 52 65 73 70 6f 6e 73 65 20 66 INTF("Response f
158d0 72 6f 6d 20 50 49 56 20 66 6f 72 20 47 45 4e 45 rom PIV for GENE
158e0 52 41 54 45 20 41 55 54 48 45 4e 54 49 43 41 54 RATE AUTHENTICAT
158f0 49 4f 4e 20 77 61 73 20 6e 6f 74 20 61 20 30 78 ION was not a 0x
15900 38 32 20 77 69 74 68 69 6e 20 61 20 30 78 37 43 82 within a 0x7C
15910 20 74 61 67 2c 20 72 65 74 75 72 6e 69 6e 67 20 tag, returning
15920 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 in failure");...
15930 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 ...return(-1);..
15940 09 09 7d 0a 0a 09 09 09 72 65 74 76 61 6c 20 3d ..}.....retval =
15950 20 6f 75 74 62 75 66 5f 6c 65 6e 3b 0a 0a 09 09 outbuf_len;....
15960 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 43 .break;...case C
15970 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 ACKEY_ID_TYPE_CA
15980 43 3a 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 C:...case CACKEY
15990 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e _ID_TYPE_CERT_ON
159a0 4c 59 3a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d LY:....break;..}
159b0 0a 0a 09 2f 2a 20 55 6e 70 61 64 20 72 65 70 6c .../* Unpad repl
159c0 79 20 2a 2f 0a 09 69 66 20 28 75 6e 70 61 64 4f y */..if (unpadO
159d0 75 74 70 75 74 29 20 7b 0a 09 09 69 66 20 28 72 utput) {...if (r
159e0 65 74 76 61 6c 20 3c 20 33 29 20 7b 0a 09 09 09 etval < 3) {....
159f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
15a00 4e 54 46 28 22 52 65 70 6c 79 20 69 73 20 74 6f NTF("Reply is to
15a10 6f 20 73 6d 61 6c 6c 2c 20 77 65 20 61 72 65 20 o small, we are
15a20 6e 6f 74 20 61 62 6c 65 20 74 6f 20 75 6e 70 61 not able to unpa
15a30 64 20 2d 2d 20 70 61 73 73 69 6e 67 20 62 61 63 d -- passing bac
15a40 6b 20 61 6e 64 20 68 6f 70 69 6e 67 20 66 6f 72 k and hoping for
15a50 20 74 68 65 20 62 65 73 74 21 22 29 3b 0a 0a 09 the best!");...
15a60 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
15a70 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
15a80 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74 in success, ret
15a90 76 61 6c 20 3d 20 25 6c 69 20 28 62 79 74 65 73 val = %li (bytes
15aa0 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65 74 76 61 )", (long) retva
15ab0 6c 29 3b 0a 09 09 09 72 65 74 75 72 6e 28 72 65 l);....return(re
15ac0 74 76 61 6c 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 tval);...}....if
15ad0 20 28 6f 75 74 62 75 66 5b 30 5d 20 21 3d 20 30 (outbuf[0] != 0
15ae0 78 30 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 x00) {....CACKEY
15af0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 _DEBUG_PRINTF("U
15b00 6e 72 65 63 6f 67 6e 69 7a 65 64 20 70 61 64 64 nrecognized padd
15b10 69 6e 67 20 73 63 68 65 6d 65 20 2d 2d 20 70 61 ing scheme -- pa
15b20 73 73 69 6e 67 20 62 61 63 6b 20 61 6e 64 20 68 ssing back and h
15b30 6f 70 69 6e 67 20 66 6f 72 20 74 68 65 20 62 65 oping for the be
15b40 73 74 21 22 29 3b 0a 0a 09 09 09 43 41 43 4b 45 st!");.....CACKE
15b50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
15b60 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 Returning in suc
15b70 63 65 73 73 2c 20 72 65 74 76 61 6c 20 3d 20 25 cess, retval = %
15b80 6c 69 20 28 62 79 74 65 73 29 22 2c 20 28 6c 6f li (bytes)", (lo
15b90 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a 09 09 09 ng) retval);....
15ba0 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a return(retval);.
15bb0 09 09 7d 0a 0a 09 09 62 6c 6f 63 6b 74 79 70 65 ..}....blocktype
15bc0 20 3d 20 6f 75 74 62 75 66 5b 31 5d 3b 0a 09 09 = outbuf[1];...
15bd0 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 30 3b unpadoffset = 0;
15be0 0a 0a 09 09 73 77 69 74 63 68 20 28 62 6c 6f 63 ....switch (bloc
15bf0 6b 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65 ktype) {....case
15c00 20 30 78 30 30 3a 0a 09 09 09 09 2f 2a 20 50 61 0x00:...../* Pa
15c10 64 64 69 6e 67 20 53 63 68 65 6d 65 20 31 2c 20 dding Scheme 1,
15c20 74 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d 7a 65 the first non-ze
15c30 72 6f 20 62 79 74 65 20 69 73 20 74 68 65 20 73 ro byte is the s
15c40 74 61 72 74 20 6f 66 20 64 61 74 61 20 2a 2f 0a tart of data */.
15c50 09 09 09 09 66 6f 72 20 28 75 6e 70 61 64 6f 66 ....for (unpadof
15c60 66 73 65 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f fset = 2; unpado
15c70 66 66 73 65 74 20 3c 20 72 65 74 76 61 6c 3b 20 ffset < retval;
15c80 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b unpadoffset++) {
15c90 0a 09 09 09 09 09 69 66 20 28 6f 75 74 62 75 66 ......if (outbuf
15ca0 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 21 3d [unpadoffset] !=
15cb0 20 30 78 30 30 29 20 7b 0a 09 09 09 09 09 09 62 0x00) {.......b
15cc0 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 09 reak;......}....
15cd0 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 .}.....break;...
15ce0 09 63 61 73 65 20 30 78 30 31 3a 0a 09 09 09 09 .case 0x01:.....
15cf0 2f 2a 20 50 61 64 64 69 6e 67 20 53 63 68 65 6d /* Padding Schem
15d00 65 20 32 2c 20 70 61 64 20 62 79 74 65 73 20 61 e 2, pad bytes a
15d10 72 65 20 30 78 46 46 20 66 6f 6c 6c 6f 77 65 64 re 0xFF followed
15d20 20 62 79 20 30 78 30 30 20 2a 2f 0a 09 09 09 09 by 0x00 */.....
15d30 66 6f 72 20 28 75 6e 70 61 64 6f 66 66 73 65 74 for (unpadoffset
15d40 20 3d 20 32 3b 20 75 6e 70 61 64 6f 66 66 73 65 = 2; unpadoffse
15d50 74 20 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70 61 t < retval; unpa
15d60 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09 09 doffset++) {....
15d70 09 09 69 66 20 28 6f 75 74 62 75 66 5b 75 6e 70 ..if (outbuf[unp
15d80 61 64 6f 66 66 73 65 74 5d 20 21 3d 20 30 78 46 adoffset] != 0xF
15d90 46 29 20 7b 0a 09 09 09 09 09 09 69 66 20 28 6f F) {.......if (o
15da0 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 utbuf[unpadoffse
15db0 74 5d 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 t] == 0x00) {...
15dc0 09 09 09 09 09 75 6e 70 61 64 6f 66 66 73 65 74 .....unpadoffset
15dd0 2b 2b 3b 0a 0a 09 09 09 09 09 09 09 62 72 65 61 ++;.........brea
15de0 6b 3b 0a 09 09 09 09 09 09 7d 20 65 6c 73 65 20 k;.......} else
15df0 7b 0a 09 09 09 09 09 09 09 43 41 43 4b 45 59 5f {........CACKEY_
15e00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e DEBUG_PRINTF("In
15e10 76 61 6c 69 64 20 70 61 64 64 69 6e 67 20 64 61 valid padding da
15e20 74 61 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e ta found, return
15e30 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2c 20 ing in failure,
15e40 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e should have been
15e50 20 30 78 30 30 20 66 6f 75 6e 64 20 30 78 25 30 0x00 found 0x%0
15e60 32 78 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 2x", (unsigned i
15e70 6e 74 29 20 6f 75 74 62 75 66 5b 75 6e 70 61 64 nt) outbuf[unpad
15e80 6f 66 66 73 65 74 5d 29 3b 0a 0a 09 09 09 09 09 offset]);.......
15e90 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 ..return(-1);...
15ea0 09 09 09 09 7d 0a 09 09 09 09 09 7d 20 65 6c 73 ....}......} els
15eb0 65 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59 e {.......CACKEY
15ec0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 _DEBUG_PRINTF("I
15ed0 6e 76 61 6c 69 64 20 70 61 64 64 69 6e 67 20 64 nvalid padding d
15ee0 61 74 61 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 ata found, retur
15ef0 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2c ning in failure,
15f00 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 should have bee
15f10 6e 20 30 78 46 46 20 66 6f 75 6e 64 20 30 78 25 n 0xFF found 0x%
15f20 30 32 78 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 02x", (unsigned
15f30 69 6e 74 29 20 6f 75 74 62 75 66 5b 75 6e 70 61 int) outbuf[unpa
15f40 64 6f 66 66 73 65 74 5d 29 3b 0a 0a 09 09 09 09 doffset]);......
15f50 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 ..return(-1);...
15f60 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 09 62 ...}.....}.....b
15f70 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 reak;....case 0x
15f80 30 32 3a 0a 09 09 09 09 2f 2a 20 50 61 64 64 69 02:...../* Paddi
15f90 6e 67 20 53 63 68 65 6d 65 20 33 2c 20 70 61 64 ng Scheme 3, pad
15fa0 20 62 79 74 65 73 20 61 72 65 20 6e 6f 6e 2d 7a bytes are non-z
15fb0 65 72 6f 20 66 69 72 73 74 20 7a 65 72 6f 20 62 ero first zero b
15fc0 79 74 65 20 66 6f 75 6e 64 20 69 73 20 74 68 65 yte found is the
15fd0 20 73 65 70 65 72 61 74 6f 72 20 62 79 74 65 20 seperator byte
15fe0 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75 6e 70 61 */.....for (unpa
15ff0 64 6f 66 66 73 65 74 20 3d 20 32 3b 20 75 6e 70 doffset = 2; unp
16000 61 64 6f 66 66 73 65 74 20 3c 20 72 65 74 76 61 adoffset < retva
16010 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b l; unpadoffset++
16020 29 20 7b 0a 09 09 09 09 09 69 66 20 28 6f 75 74 ) {......if (out
16030 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d buf[unpadoffset]
16040 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 09 == 0x00) {.....
16050 09 09 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 3b ..unpadoffset++;
16060 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 ........break;..
16070 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 09 ....}.....}.....
16080 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66 break;...}....if
16090 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3e 20 (unpadoffset >
160a0 72 65 74 76 61 6c 29 20 7b 0a 09 09 09 43 41 43 retval) {....CAC
160b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
160c0 28 22 4f 66 66 73 65 74 20 67 72 65 61 74 65 72 ("Offset greater
160d0 20 74 68 61 6e 20 72 65 70 6c 79 20 73 69 7a 65 than reply size
160e0 2c 20 61 62 6f 72 74 69 6e 67 2e 20 20 28 75 6e , aborting. (un
160f0 70 61 64 6f 66 66 73 65 74 20 3d 20 25 6c 75 2c padoffset = %lu,
16100 20 72 65 74 76 61 6c 20 3d 20 25 6c 75 29 22 2c retval = %lu)",
16110 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
16120 20 75 6e 70 61 64 6f 66 66 73 65 74 2c 20 28 75 unpadoffset, (u
16130 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65 nsigned long) re
16140 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72 tval);.....retur
16150 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 n(-1);...}....CA
16160 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
16170 42 55 46 28 22 50 61 64 64 65 64 3a 22 2c 20 6f BUF("Padded:", o
16180 75 74 62 75 66 2c 20 72 65 74 76 61 6c 29 3b 0a utbuf, retval);.
16190 0a 09 09 72 65 74 76 61 6c 20 2d 3d 20 75 6e 70 ...retval -= unp
161a0 61 64 6f 66 66 73 65 74 3b 0a 09 09 6d 65 6d 6d adoffset;...memm
161b0 6f 76 65 28 6f 75 74 62 75 66 2c 20 6f 75 74 62 ove(outbuf, outb
161c0 75 66 20 2b 20 75 6e 70 61 64 6f 66 66 73 65 74 uf + unpadoffset
161d0 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 43 41 , retval);....CA
161e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
161f0 42 55 46 28 22 55 6e 70 61 64 64 65 64 3a 22 2c BUF("Unpadded:",
16200 20 6f 75 74 62 75 66 2c 20 72 65 74 76 61 6c 29 outbuf, retval)
16210 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b 45 59 5f 44 ;..}....CACKEY_D
16220 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
16230 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 urning in succes
16240 73 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c 69 20 s, retval = %li
16250 28 62 79 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29 (bytes)", (long)
16260 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 retval);...retu
16270 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f rn(retval);.}../
16280 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a *. * SYNPOSIS. *
16290 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 .... *. * A
162a0 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 RGUMENTS. *
162b0 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e .... *. * RETURN
162c0 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e VALUE. * ..
162d0 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a .. *. * NOTES. *
162e0 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a .... *. */.
162f0 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 static cackey_re
16300 74 20 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 t cackey_token_p
16310 72 65 73 65 6e 74 28 73 74 72 75 63 74 20 63 61 resent(struct ca
16320 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 ckey_slot *slot)
16330 20 7b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 70 {..cackey_ret p
16340 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b csc_connect_ret;
16350 0a 09 44 57 4f 52 44 20 72 65 61 64 65 72 5f 6c ..DWORD reader_l
16360 65 6e 20 3d 20 30 2c 20 73 74 61 74 65 20 3d 20 en = 0, state =
16370 30 2c 20 70 72 6f 74 6f 63 6f 6c 20 3d 20 30 2c 0, protocol = 0,
16380 20 61 74 72 5f 6c 65 6e 3b 0a 09 42 59 54 45 20 atr_len;..BYTE
16390 61 74 72 5b 4d 41 58 5f 41 54 52 5f 53 49 5a 45 atr[MAX_ATR_SIZE
163a0 5d 3b 0a 09 4c 4f 4e 47 20 73 74 61 74 75 73 5f ];..LONG status_
163b0 72 65 74 2c 20 73 63 61 72 64 5f 72 65 63 6f 6e ret, scard_recon
163c0 6e 5f 72 65 74 3b 0a 09 4c 50 53 54 52 20 2a 72 n_ret;..LPSTR *r
163d0 65 61 64 65 72 5f 6e 61 6d 65 3b 0a 0a 09 43 41 eader_name;...CA
163e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
163f0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
16400 69 66 20 28 73 6c 6f 74 2d 3e 69 6e 74 65 72 6e if (slot->intern
16410 61 6c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 al) {...CACKEY_D
16420 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
16430 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 70 72 65 urning token pre
16440 73 65 6e 74 20 28 69 6e 74 65 72 6e 61 6c 20 74 sent (internal t
16450 6f 6b 65 6e 29 22 29 3b 0a 0a 09 09 72 65 74 75 oken)");....retu
16460 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 rn(CACKEY_PCSC_S
16470 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 3b 0a _TOKENPRESENT);.
16480 09 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 .}...pcsc_connec
16490 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 t_ret = cackey_c
164a0 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 onnect_card(slot
164b0 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e );..if (pcsc_con
164c0 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b nect_ret != CACK
164d0 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a EY_PCSC_S_OK) {.
164e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
164f0 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f RINTF("Unable to
16500 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 connect to card
16510 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 , returning toke
16520 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09 72 n absent");....r
16530 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 eturn(CACKEY_PCS
16540 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 C_E_TOKENABSENT)
16550 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ;..}...CACKEY_DE
16560 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
16570 69 6e 67 20 53 43 61 72 64 53 74 61 74 75 73 28 ing SCardStatus(
16580 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 63 ) to determine c
16590 61 72 64 20 73 74 61 74 75 73 22 29 3b 0a 0a 09 ard status");...
165a0 61 74 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 atr_len = sizeof
165b0 28 61 74 72 29 3b 0a 09 73 74 61 74 75 73 5f 72 (atr);..status_r
165c0 65 74 20 3d 20 53 43 61 72 64 53 74 61 74 75 73 et = SCardStatus
165d0 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 (slot->pcsc_card
165e0 2c 20 4e 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f , NULL, &reader_
165f0 6c 65 6e 2c 20 26 73 74 61 74 65 2c 20 26 70 72 len, &state, &pr
16600 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74 otocol, atr, &at
16610 72 5f 6c 65 6e 29 3b 0a 20 0a 09 69 66 20 28 73 r_len);. ..if (s
16620 74 61 74 75 73 5f 72 65 74 20 3d 3d 20 53 43 41 tatus_ret == SCA
16630 52 44 5f 45 5f 49 4e 53 55 46 46 49 43 49 45 4e RD_E_INSUFFICIEN
16640 54 5f 42 55 46 46 45 52 29 20 7b 0a 09 09 43 41 T_BUFFER) {...CA
16650 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
16660 46 28 22 53 63 61 72 64 53 74 61 74 75 73 28 29 F("ScardStatus()
16670 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f returned SCARD_
16680 45 5f 49 4e 53 55 46 46 49 43 49 45 4e 54 5f 42 E_INSUFFICIENT_B
16690 55 46 46 45 52 2c 20 61 73 73 75 6d 69 6e 67 20 UFFER, assuming
166a0 74 68 69 73 20 69 73 20 61 20 62 75 67 20 28 65 this is a bug (e
166b0 2e 67 2e 2c 20 47 6f 6f 67 6c 65 20 50 43 53 43 .g., Google PCSC
166c0 29 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e ) implementation
166d0 20 61 6e 64 20 72 65 74 72 79 69 6e 67 22 29 3b and retrying");
166e0 0a 0a 09 09 61 74 72 5f 6c 65 6e 20 3d 20 73 69 ....atr_len = si
166f0 7a 65 6f 66 28 61 74 72 29 3b 0a 0a 09 09 72 65 zeof(atr);....re
16700 61 64 65 72 5f 6c 65 6e 20 3d 20 33 32 37 36 38 ader_len = 32768
16710 3b 0a 09 09 72 65 61 64 65 72 5f 6e 61 6d 65 20 ;...reader_name
16720 3d 20 6d 61 6c 6c 6f 63 28 72 65 61 64 65 72 5f = malloc(reader_
16730 6c 65 6e 29 3b 0a 0a 09 09 73 74 61 74 75 73 5f len);....status_
16740 72 65 74 20 3d 20 53 43 61 72 64 53 74 61 74 75 ret = SCardStatu
16750 73 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 s(slot->pcsc_car
16760 64 2c 20 72 65 61 64 65 72 5f 6e 61 6d 65 2c 20 d, reader_name,
16770 26 72 65 61 64 65 72 5f 6c 65 6e 2c 20 26 73 74 &reader_len, &st
16780 61 74 65 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 ate, &protocol,
16790 61 74 72 2c 20 26 61 74 72 5f 6c 65 6e 29 3b 0a atr, &atr_len);.
167a0 0a 09 09 66 72 65 65 28 72 65 61 64 65 72 5f 6e ...free(reader_n
167b0 61 6d 65 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 ame);..}...if (s
167c0 74 61 74 75 73 5f 72 65 74 20 3d 3d 20 53 43 41 tatus_ret == SCA
167d0 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e RD_E_INVALID_HAN
167e0 44 4c 45 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f DLE) {...CACKEY_
167f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 DEBUG_PRINTF("SC
16800 61 72 64 53 74 61 74 75 73 28 29 20 72 65 74 75 ardStatus() retu
16810 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 49 4e 56 rned SCARD_E_INV
16820 41 4c 49 44 5f 48 41 4e 44 4c 45 2c 20 6d 61 72 ALID_HANDLE, mar
16830 6b 69 6e 67 20 61 73 20 6e 6f 74 20 61 6c 72 65 king as not alre
16840 61 64 79 20 63 6f 6e 6e 65 63 74 65 64 20 61 6e ady connected an
16850 64 20 74 72 79 69 6e 67 20 61 67 61 69 6e 22 29 d trying again")
16860 3b 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f ;...cackey_mark_
16870 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 slot_reset(slot)
16880 3b 0a 0a 09 09 70 63 73 63 5f 63 6f 6e 6e 65 63 ;....pcsc_connec
16890 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 t_ret = cackey_c
168a0 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 onnect_card(slot
168b0 29 3b 0a 09 09 69 66 20 28 70 63 73 63 5f 63 6f );...if (pcsc_co
168c0 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 nnect_ret != CAC
168d0 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b KEY_PCSC_S_OK) {
168e0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
168f0 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 _PRINTF("Unable
16900 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 to connect to ca
16910 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f rd, returning to
16920 6b 65 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09 ken absent");...
16930 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f ..return(CACKEY_
16940 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 PCSC_E_TOKENABSE
16950 4e 54 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b NT);...}....CACK
16960 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
16970 22 43 61 6c 6c 69 6e 67 20 53 43 61 72 64 53 74 "Calling SCardSt
16980 61 74 75 73 28 29 20 61 67 61 69 6e 22 29 3b 0a atus() again");.
16990 0a 09 09 61 74 72 5f 6c 65 6e 20 3d 20 73 69 7a ...atr_len = siz
169a0 65 6f 66 28 61 74 72 29 3b 0a 09 09 73 74 61 74 eof(atr);...stat
169b0 75 73 5f 72 65 74 20 3d 20 53 43 61 72 64 53 74 us_ret = SCardSt
169c0 61 74 75 73 28 73 6c 6f 74 2d 3e 70 63 73 63 5f atus(slot->pcsc_
169d0 63 61 72 64 2c 20 4e 55 4c 4c 2c 20 26 72 65 61 card, NULL, &rea
169e0 64 65 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65 2c der_len, &state,
169f0 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c &protocol, atr,
16a00 20 26 61 74 72 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a &atr_len);..}..
16a10 09 69 66 20 28 73 74 61 74 75 73 5f 72 65 74 20 .if (status_ret
16a20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 != SCARD_S_SUCCE
16a30 53 53 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d SS) {...cackey_m
16a40 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 ark_slot_reset(s
16a50 6c 6f 74 29 3b 0a 0a 09 09 69 66 20 28 73 74 61 lot);....if (sta
16a60 74 75 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 tus_ret == SCARD
16a70 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 29 20 7b _W_RESET_CARD) {
16a80 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
16a90 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 72 _PRINTF("Reset r
16aa0 65 71 75 69 72 65 64 2c 20 70 6c 65 61 73 65 20 equired, please
16ab0 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73 hold...");.....s
16ac0 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 card_reconn_ret
16ad0 3d 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 = cackey_reconne
16ae0 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20 53 43 ct_card(slot, SC
16af0 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 ARD_PROTOCOL_T0
16b00 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c | SCARD_PROTOCOL
16b10 5f 54 31 29 3b 0a 09 09 09 69 66 20 28 73 63 61 _T1);....if (sca
16b20 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 3d rd_reconn_ret ==
16b30 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 SCARD_S_SUCCESS
16b40 29 20 7b 0a 09 09 09 09 2f 2a 20 52 65 2d 65 73 ) {...../* Re-es
16b50 74 61 62 6c 69 73 68 20 74 72 61 6e 73 61 63 74 tablish transact
16b60 69 6f 6e 2c 20 69 66 20 69 74 20 77 61 73 20 70 ion, if it was p
16b70 72 65 73 65 6e 74 20 2a 2f 0a 09 09 09 09 69 66 resent */.....if
16b80 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 (slot->transact
16b90 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29 20 7b ion_depth > 0) {
16ba0 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e ......slot->tran
16bb0 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b saction_depth--;
16bc0 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e ......slot->tran
16bd0 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f saction_need_hw_
16be0 6c 6f 63 6b 20 3d 20 31 3b 0a 09 09 09 09 09 63 lock = 1;......c
16bf0 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e ackey_begin_tran
16c00 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 saction(slot);..
16c10 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 ...}......CACKEY
16c20 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
16c30 65 73 65 74 20 73 75 63 63 65 73 73 66 75 6c 2c eset successful,
16c40 20 72 65 71 75 65 72 79 69 6e 67 22 29 3b 0a 09 requerying");..
16c50 09 09 09 73 74 61 74 75 73 5f 72 65 74 20 3d 20 ...status_ret =
16c60 53 43 61 72 64 53 74 61 74 75 73 28 73 6c 6f 74 SCardStatus(slot
16c70 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 4e 55 4c ->pcsc_card, NUL
16c80 4c 2c 20 26 72 65 61 64 65 72 5f 6c 65 6e 2c 20 L, &reader_len,
16c90 26 73 74 61 74 65 2c 20 26 70 72 6f 74 6f 63 6f &state, &protoco
16ca0 6c 2c 20 61 74 72 2c 20 26 61 74 72 5f 6c 65 6e l, atr, &atr_len
16cb0 29 3b 0a 09 09 09 09 69 66 20 28 73 74 61 74 75 );.....if (statu
16cc0 73 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 s_ret != SCARD_S
16cd0 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09 _SUCCESS) {.....
16ce0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
16cf0 49 4e 54 46 28 22 53 74 69 6c 6c 20 75 6e 61 62 INTF("Still unab
16d00 6c 65 20 74 6f 20 71 75 65 72 79 20 63 61 72 64 le to query card
16d10 20 73 74 61 74 75 73 2c 20 72 65 74 75 72 6e 69 status, returni
16d20 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 2e ng token absent.
16d30 20 20 53 43 61 72 64 53 74 61 74 75 73 28 29 20 SCardStatus()
16d40 3d 20 25 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 = %s", CACKEY_DE
16d50 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 BUG_FUNC_SCARDER
16d60 52 5f 54 4f 5f 53 54 52 28 73 74 61 74 75 73 5f R_TO_STR(status_
16d70 72 65 74 29 29 3b 0a 0a 09 09 09 09 09 72 65 74 ret));.......ret
16d80 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f urn(CACKEY_PCSC_
16d90 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a E_TOKENABSENT);.
16da0 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 ....}....} else
16db0 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 {.....CACKEY_DEB
16dc0 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c UG_PRINTF("Unabl
16dd0 65 20 74 6f 20 72 65 63 6f 6e 6e 65 63 74 20 74 e to reconnect t
16de0 6f 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e o card, returnin
16df0 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20 g token absent.
16e00 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 SCardReconnect(
16e10 29 20 3d 20 25 73 22 2c 20 43 41 43 4b 45 59 5f ) = %s", CACKEY_
16e20 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 DEBUG_FUNC_SCARD
16e30 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 ERR_TO_STR(scard
16e40 5f 72 65 63 6f 6e 6e 5f 72 65 74 29 29 3b 0a 0a _reconn_ret));..
16e50 09 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 ....return(CACKE
16e60 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 Y_PCSC_E_TOKENAB
16e70 53 45 4e 54 29 3b 0a 09 09 09 7d 0a 09 09 7d 20 SENT);....}...}
16e80 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 else {....CACKEY
16e90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 _DEBUG_PRINTF("U
16ea0 6e 61 62 6c 65 20 74 6f 20 71 75 65 72 79 20 63 nable to query c
16eb0 61 72 64 20 73 74 61 74 75 73 2c 20 72 65 74 75 ard status, retu
16ec0 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 rning token abse
16ed0 6e 74 2e 20 20 53 43 61 72 64 53 74 61 74 75 73 nt. SCardStatus
16ee0 28 29 20 3d 20 25 73 22 2c 20 43 41 43 4b 45 59 () = %s", CACKEY
16ef0 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 _DEBUG_FUNC_SCAR
16f00 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 74 61 74 DERR_TO_STR(stat
16f10 75 73 5f 72 65 74 29 29 3b 0a 0a 09 09 09 72 65 us_ret));.....re
16f20 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 turn(CACKEY_PCSC
16f30 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b _E_TOKENABSENT);
16f40 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 28 73 ...}..}...if ((s
16f50 74 61 74 65 20 26 20 53 43 41 52 44 5f 41 42 53 tate & SCARD_ABS
16f60 45 4e 54 29 20 3d 3d 20 53 43 41 52 44 5f 41 42 ENT) == SCARD_AB
16f70 53 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 SENT) {...CACKEY
16f80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 _DEBUG_PRINTF("C
16f90 61 72 64 20 69 73 20 61 62 73 65 6e 74 2c 20 72 ard is absent, r
16fa0 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 eturning token a
16fb0 62 73 65 6e 74 22 29 3b 0a 0a 09 09 72 65 74 75 bsent");....retu
16fc0 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 rn(CACKEY_PCSC_E
16fd0 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 _TOKENABSENT);..
16fe0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 }...CACKEY_DEBUG
16ff0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
17000 6e 67 20 74 6f 6b 65 6e 20 70 72 65 73 65 6e 74 ng token present
17010 2e 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 .");...return(CA
17020 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 CKEY_PCSC_S_TOKE
17030 4e 50 52 45 53 45 4e 54 29 3b 0a 7d 0a 0a 2f 2a NPRESENT);.}../*
17040 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 . * SYNPOSIS. *
17050 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 .... *. * AR
17060 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e GUMENTS. * .
17070 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 ... *. * RETURN
17080 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e VALUE. * ...
17090 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 . *. * NOTES. *
170a0 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 .... *. */.s
170b0 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 tatic cackey_ret
170c0 20 63 61 63 6b 65 79 5f 73 65 74 5f 70 69 6e 28 cackey_set_pin(
170d0 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c struct cackey_sl
170e0 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e ot *slot, unsign
170f0 65 64 20 63 68 61 72 20 2a 6f 6c 64 5f 70 69 6e ed char *old_pin
17100 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 , unsigned long
17110 6f 6c 64 5f 70 69 6e 5f 6c 65 6e 2c 20 75 6e 73 old_pin_len, uns
17120 69 67 6e 65 64 20 63 68 61 72 20 2a 70 69 6e 2c igned char *pin,
17130 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 70 unsigned long p
17140 69 6e 5f 6c 65 6e 29 20 7b 0a 09 73 74 72 75 63 in_len) {..struc
17150 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 t cackey_pcsc_id
17160 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65 entity *pcsc_ide
17170 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e ntities;..unsign
17180 65 64 20 63 68 61 72 20 63 61 63 5f 70 69 6e 5b ed char cac_pin[
17190 38 5d 20 3d 20 7b 30 78 46 46 2c 20 30 78 46 46 8] = {0xFF, 0xFF
171a0 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 , 0xFF, 0xFF, 0x
171b0 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 FF, 0xFF, 0xFF,
171c0 30 78 46 46 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 0xFF};..unsigned
171d0 20 63 68 61 72 20 6f 6c 64 5f 63 61 63 5f 70 69 char old_cac_pi
171e0 6e 5b 38 5d 20 3d 20 7b 30 78 46 46 2c 20 30 78 n[8] = {0xFF, 0x
171f0 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 FF, 0xFF, 0xFF,
17200 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 0xFF, 0xFF, 0xFF
17210 2c 20 30 78 46 46 7d 3b 0a 09 75 6e 73 69 67 6e , 0xFF};..unsign
17220 65 64 20 63 68 61 72 20 70 69 6e 5f 75 70 64 61 ed char pin_upda
17230 74 65 5b 73 69 7a 65 6f 66 28 63 61 63 5f 70 69 te[sizeof(cac_pi
17240 6e 29 20 2b 20 73 69 7a 65 6f 66 28 6f 6c 64 5f n) + sizeof(old_
17250 63 61 63 5f 70 69 6e 29 5d 3b 0a 09 75 6e 73 69 cac_pin)];..unsi
17260 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65 gned long num_ce
17270 72 74 73 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 rts;..uint16_t r
17280 65 73 70 6f 6e 73 65 5f 63 6f 64 65 3b 0a 09 69 esponse_code;..i
17290 6e 74 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 nt tries_remaini
172a0 6e 67 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 ng;..int send_re
172b0 74 3b 0a 09 69 6e 74 20 6b 65 79 5f 72 65 66 65 t;..int key_refe
172c0 72 65 6e 63 65 20 3d 20 30 78 30 30 3b 0a 0a 09 rence = 0x00;...
172d0 2f 2a 20 41 70 70 61 72 65 6e 74 6c 79 2c 20 43 /* Apparently, C
172e0 41 43 20 50 49 4e 73 20 61 72 65 20 2a 45 58 41 AC PINs are *EXA
172f0 43 54 4c 59 2a 20 38 20 62 79 74 65 73 20 6c 6f CTLY* 8 bytes lo
17300 6e 67 20 2d 2d 20 70 61 64 20 77 69 74 68 20 30 ng -- pad with 0
17310 78 46 46 20 69 66 20 74 6f 6f 20 73 68 6f 72 74 xFF if too short
17320 20 2a 2f 0a 09 69 66 20 28 70 69 6e 5f 6c 65 6e */..if (pin_len
17330 20 3e 3d 20 38 29 20 7b 0a 09 09 6d 65 6d 63 70 >= 8) {...memcp
17340 79 28 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 y(cac_pin, pin,
17350 38 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 8);..} else {...
17360 6d 65 6d 63 70 79 28 63 61 63 5f 70 69 6e 2c 20 memcpy(cac_pin,
17370 70 69 6e 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a 09 pin, pin_len);..
17380 7d 0a 0a 09 69 66 20 28 6f 6c 64 5f 70 69 6e 5f }...if (old_pin_
17390 6c 65 6e 20 3e 3d 20 38 29 20 7b 0a 09 09 6d 65 len >= 8) {...me
173a0 6d 63 70 79 28 6f 6c 64 5f 63 61 63 5f 70 69 6e mcpy(old_cac_pin
173b0 2c 20 6f 6c 64 5f 70 69 6e 2c 20 38 29 3b 0a 09 , old_pin, 8);..
173c0 7d 20 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 63 70 } else {...memcp
173d0 79 28 6f 6c 64 5f 63 61 63 5f 70 69 6e 2c 20 6f y(old_cac_pin, o
173e0 6c 64 5f 70 69 6e 2c 20 6f 6c 64 5f 70 69 6e 5f ld_pin, old_pin_
173f0 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6f len);..}.../* Co
17400 6e 63 61 74 65 6e 61 74 65 20 62 6f 74 68 20 50 ncatenate both P
17410 49 4e 73 20 74 6f 67 65 74 68 65 72 20 74 6f 20 INs together to
17420 73 65 6e 64 20 61 73 20 61 20 73 69 6e 67 6c 65 send as a single
17430 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a instruction */.
17440 09 6d 65 6d 63 70 79 28 70 69 6e 5f 75 70 64 61 .memcpy(pin_upda
17450 74 65 2c 20 6f 6c 64 5f 63 61 63 5f 70 69 6e 2c te, old_cac_pin,
17460 20 73 69 7a 65 6f 66 28 6f 6c 64 5f 63 61 63 5f sizeof(old_cac_
17470 70 69 6e 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 pin));..memcpy(p
17480 69 6e 5f 75 70 64 61 74 65 20 2b 20 73 69 7a 65 in_update + size
17490 6f 66 28 6f 6c 64 5f 63 61 63 5f 70 69 6e 29 2c of(old_cac_pin),
174a0 20 63 61 63 5f 70 69 6e 2c 20 73 69 7a 65 6f 66 cac_pin, sizeof
174b0 28 63 61 63 5f 70 69 6e 29 29 3b 0a 0a 09 2f 2a (cac_pin));.../*
174c0 20 52 65 6a 65 63 74 20 50 49 4e 73 20 77 68 69 Reject PINs whi
174d0 63 68 20 61 72 65 20 74 6f 6f 20 73 68 6f 72 74 ch are too short
174e0 20 2a 2f 0a 09 69 66 20 28 70 69 6e 5f 6c 65 6e */..if (pin_len
174f0 20 3c 20 35 29 20 7b 0a 09 09 43 41 43 4b 45 59 < 5) {...CACKEY
17500 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
17510 65 6a 65 63 74 69 6e 67 20 4e 65 77 20 50 49 4e ejecting New PIN
17520 20 77 68 69 63 68 20 69 73 20 74 6f 6f 20 73 68 which is too sh
17530 6f 72 74 20 28 6c 65 6e 67 74 68 20 3d 20 25 6c ort (length = %l
17540 75 2c 20 6d 75 73 74 20 62 65 20 61 74 6c 65 61 u, must be atlea
17550 73 74 20 35 29 22 2c 20 70 69 6e 5f 6c 65 6e 29 st 5)", pin_len)
17560 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b ;....return(CACK
17570 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e EY_PCSC_E_BADPIN
17580 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 6c 64 5f );..}...if (old_
17590 70 69 6e 5f 6c 65 6e 20 3c 20 35 29 20 7b 0a 09 pin_len < 5) {..
175a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
175b0 49 4e 54 46 28 22 52 65 6a 65 63 74 69 6e 67 20 INTF("Rejecting
175c0 4f 6c 64 20 50 49 4e 20 77 68 69 63 68 20 69 73 Old PIN which is
175d0 20 74 6f 6f 20 73 68 6f 72 74 20 28 6c 65 6e 67 too short (leng
175e0 74 68 20 3d 20 25 6c 75 2c 20 6d 75 73 74 20 62 th = %lu, must b
175f0 65 20 61 74 6c 65 61 73 74 20 35 29 22 2c 20 6f e atleast 5)", o
17600 6c 64 5f 70 69 6e 5f 6c 65 6e 29 3b 0a 0a 09 09 ld_pin_len);....
17610 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 return(CACKEY_PC
17620 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09 7d SC_E_BADPIN);..}
17630 0a 0a 09 2f 2a 20 50 49 56 20 61 75 74 68 65 6e .../* PIV authen
17640 74 69 63 61 74 69 6f 6e 20 75 73 65 73 20 61 20 tication uses a
17650 22 6b 65 79 5f 72 65 66 65 72 65 6e 63 65 22 20 "key_reference"
17660 6f 66 20 30 78 38 30 20 2a 2f 0a 09 70 63 73 63 of 0x80 */..pcsc
17670 5f 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61 _identities = ca
17680 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 73 28 ckey_read_certs(
17690 73 6c 6f 74 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d slot, NULL, &num
176a0 5f 63 65 72 74 73 29 3b 0a 09 69 66 20 28 6e 75 _certs);..if (nu
176b0 6d 5f 63 65 72 74 73 20 3e 20 30 20 26 26 20 70 m_certs > 0 && p
176c0 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 21 csc_identities !
176d0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 73 77 69 74 = NULL) {...swit
176e0 63 68 20 28 70 63 73 63 5f 69 64 65 6e 74 69 74 ch (pcsc_identit
176f0 69 65 73 5b 30 5d 2e 69 64 5f 74 79 70 65 29 20 ies[0].id_type)
17700 7b 0a 09 09 09 63 61 73 65 20 43 41 43 4b 45 59 {....case CACKEY
17710 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09 _ID_TYPE_PIV:...
17720 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
17730 52 49 4e 54 46 28 22 57 65 20 68 61 76 65 20 50 RINTF("We have P
17740 49 56 20 63 61 72 64 2c 20 73 6f 20 77 65 20 77 IV card, so we w
17750 69 6c 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 ill attempt to a
17760 75 74 68 65 6e 74 69 63 61 74 65 20 75 73 69 6e uthenticate usin
17770 67 20 74 68 65 20 50 49 56 20 41 70 70 6c 69 63 g the PIV Applic
17780 61 74 69 6f 6e 20 6b 65 79 20 72 65 66 65 72 65 ation key refere
17790 6e 63 65 22 29 3b 0a 0a 09 09 09 09 6b 65 79 5f nce");......key_
177a0 72 65 66 65 72 65 6e 63 65 20 3d 20 30 78 38 30 reference = 0x80
177b0 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 ;.....break;....
177c0 64 65 66 61 75 6c 74 3a 0a 09 09 09 09 62 72 65 default:.....bre
177d0 61 6b 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 ak;...}....cacke
177e0 79 5f 66 72 65 65 5f 63 65 72 74 73 28 70 63 73 y_free_certs(pcs
177f0 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 6e 75 c_identities, nu
17800 6d 5f 63 65 72 74 73 2c 20 31 29 3b 0a 09 7d 0a m_certs, 1);..}.
17810 0a 09 2f 2a 20 49 73 73 75 65 20 61 20 53 65 74 ../* Issue a Set
17820 20 50 49 4e 20 28 43 48 41 4e 47 45 20 52 45 46 PIN (CHANGE REF
17830 45 52 45 4e 43 45 29 20 2a 2f 0a 09 73 65 6e 64 ERENCE) */..send
17840 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 _ret = cackey_se
17850 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 nd_apdu(slot, GS
17860 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 CIS_CLASS_ISO781
17870 36 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 43 6, GSCIS_INSTR_C
17880 48 41 4e 47 45 5f 52 45 46 45 52 45 4e 43 45 2c HANGE_REFERENCE,
17890 20 30 78 30 30 2c 20 6b 65 79 5f 72 65 66 65 72 0x00, key_refer
178a0 65 6e 63 65 2c 20 73 69 7a 65 6f 66 28 70 69 6e ence, sizeof(pin
178b0 5f 75 70 64 61 74 65 29 2c 20 70 69 6e 5f 75 70 _update), pin_up
178c0 64 61 74 65 2c 20 30 78 30 30 2c 20 26 72 65 73 date, 0x00, &res
178d0 70 6f 6e 73 65 5f 63 6f 64 65 2c 20 4e 55 4c 4c ponse_code, NULL
178e0 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 73 , NULL);...if (s
178f0 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 end_ret != CACKE
17900 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 Y_PCSC_S_OK) {..
17910 09 69 66 20 28 28 72 65 73 70 6f 6e 73 65 5f 63 .if ((response_c
17920 6f 64 65 20 26 20 30 78 36 33 43 30 29 20 3d 3d ode & 0x63C0) ==
17930 20 30 78 36 33 43 30 29 20 7b 0a 09 09 09 74 72 0x63C0) {....tr
17940 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 20 ies_remaining =
17950 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 26 (response_code &
17960 20 30 78 46 29 3b 0a 0a 09 09 09 43 41 43 4b 45 0xF);.....CACKE
17970 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
17980 50 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e PIN Verification
17990 20 66 61 69 6c 65 64 2c 20 25 69 20 74 72 69 65 failed, %i trie
179a0 73 20 72 65 6d 61 69 6e 69 6e 67 22 2c 20 74 72 s remaining", tr
179b0 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 29 3b 0a ies_remaining);.
179c0 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 ....return(CACKE
179d0 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 Y_PCSC_E_BADPIN)
179e0 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72 65 73 ;...}....if (res
179f0 70 6f 6e 73 65 5f 63 6f 64 65 20 3d 3d 20 30 78 ponse_code == 0x
17a00 36 39 38 33 29 20 7b 0a 09 09 09 43 41 43 4b 45 6983) {....CACKE
17a10 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
17a20 55 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 50 49 Unable to set PI
17a30 4e 2c 20 64 65 76 69 63 65 20 69 73 20 6c 6f 63 N, device is loc
17a40 6b 65 64 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 ked or changing
17a50 74 68 65 20 50 49 4e 20 69 73 20 64 69 73 61 62 the PIN is disab
17a60 6c 65 64 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 led");.....retur
17a70 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f n(CACKEY_PCSC_E_
17a80 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d 0a 0a 09 09 LOCKED);...}....
17a90 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 return(CACKEY_PC
17aa0 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 SC_E_GENERIC);..
17ab0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 }...CACKEY_DEBUG
17ac0 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 43 68 61 _PRINTF("PIN Cha
17ad0 6e 67 65 20 73 75 63 63 65 65 64 65 64 22 29 3b nge succeeded");
17ae0 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 ...return(CACKEY
17af0 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 0a 09 2f _PCSC_S_OK);.../
17b00 2a 20 44 69 73 61 62 6c 65 20 61 20 77 61 72 6e * Disable a warn
17b10 69 6e 67 2c 20 73 69 6e 63 65 20 74 68 69 73 20 ing, since this
17b20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 69 6e 20 is only used in
17b30 64 65 62 75 67 20 6d 6f 64 65 20 2a 2f 0a 09 74 debug mode */..t
17b40 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d ries_remaining =
17b50 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 tries_remaining
17b60 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f ;.}../*. * SYNPO
17b70 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 SIS. * ....
17b80 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 *. * ARGUMENTS.
17b90 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 * .... *. *
17ba0 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 RETURN VALUE. *
17bb0 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f .... *. * NO
17bc0 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 TES. * ....
17bd0 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 *. */.static cac
17be0 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 6c key_ret cackey_l
17bf0 6f 67 69 6e 28 73 74 72 75 63 74 20 63 61 63 6b ogin(struct cack
17c00 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 ey_slot *slot, u
17c10 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 69 nsigned char *pi
17c20 6e 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 n, unsigned long
17c30 20 70 69 6e 5f 6c 65 6e 2c 20 69 6e 74 20 2a 74 pin_len, int *t
17c40 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 ries_remaining_p
17c50 2c 20 69 6e 74 20 72 65 74 72 69 65 73 29 20 7b , int retries) {
17c60 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f ..struct cackey_
17c70 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 pcsc_identity *p
17c80 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a csc_identities;.
17c90 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 .unsigned char c
17ca0 61 63 5f 70 69 6e 5b 38 5d 20 3d 20 7b 30 78 46 ac_pin[8] = {0xF
17cb0 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 F, 0xFF, 0xFF, 0
17cc0 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c xFF, 0xFF, 0xFF,
17cd0 20 30 78 46 46 2c 20 30 78 46 46 7d 3b 0a 09 75 0xFF, 0xFF};..u
17ce0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d nsigned long num
17cf0 5f 63 65 72 74 73 3b 0a 09 75 69 6e 74 31 36 5f _certs;..uint16_
17d00 74 20 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 3b t response_code;
17d10 0a 09 69 6e 74 20 74 72 69 65 73 5f 72 65 6d 61 ..int tries_rema
17d20 69 6e 69 6e 67 3b 0a 09 69 6e 74 20 73 65 6e 64 ining;..int send
17d30 5f 72 65 74 3b 0a 09 69 6e 74 20 6b 65 79 5f 72 _ret;..int key_r
17d40 65 66 65 72 65 6e 63 65 20 3d 20 30 78 30 30 2c eference = 0x00,
17d50 20 68 61 76 65 5f 70 69 76 20 3d 20 30 3b 0a 09 have_piv = 0;..
17d60 63 61 63 6b 65 79 5f 72 65 74 20 63 6f 6e 6e 65 cackey_ret conne
17d70 63 74 5f 72 65 74 2c 20 74 6f 6b 65 6e 5f 72 65 ct_ret, token_re
17d80 74 3b 0a 0a 09 2f 2a 20 49 6e 64 69 63 61 74 65 t;.../* Indicate
17d90 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 that we do not
17da0 6b 6e 6f 77 20 61 62 6f 75 74 20 68 6f 77 20 6d know about how m
17db0 61 6e 79 20 74 72 69 65 73 20 61 72 65 20 72 65 any tries are re
17dc0 6d 61 69 6e 69 6e 67 20 2a 2f 0a 09 69 66 20 28 maining */..if (
17dd0 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f tries_remaining_
17de0 70 29 20 7b 0a 09 09 2a 74 72 69 65 73 5f 72 65 p) {...*tries_re
17df0 6d 61 69 6e 69 6e 67 5f 70 20 3d 20 2d 31 3b 0a maining_p = -1;.
17e00 09 7d 0a 0a 09 2f 2a 20 41 70 70 61 72 65 6e 74 .}.../* Apparent
17e10 6c 79 2c 20 43 41 43 20 50 49 4e 73 20 61 72 65 ly, CAC PINs are
17e20 20 2a 45 58 41 43 54 4c 59 2a 20 38 20 62 79 74 *EXACTLY* 8 byt
17e30 65 73 20 6c 6f 6e 67 20 2d 2d 20 70 61 64 20 77 es long -- pad w
17e40 69 74 68 20 30 78 46 46 20 69 66 20 74 6f 6f 20 ith 0xFF if too
17e50 73 68 6f 72 74 20 2a 2f 0a 09 69 66 20 28 70 69 short */..if (pi
17e60 6e 5f 6c 65 6e 20 3e 3d 20 38 29 20 7b 0a 09 09 n_len >= 8) {...
17e70 6d 65 6d 63 70 79 28 63 61 63 5f 70 69 6e 2c 20 memcpy(cac_pin,
17e80 70 69 6e 2c 20 38 29 3b 0a 09 7d 20 65 6c 73 65 pin, 8);..} else
17e90 20 7b 0a 09 09 6d 65 6d 63 70 79 28 63 61 63 5f {...memcpy(cac_
17ea0 70 69 6e 2c 20 70 69 6e 2c 20 70 69 6e 5f 6c 65 pin, pin, pin_le
17eb0 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 52 65 6a 65 n);..}.../* Reje
17ec0 63 74 20 50 49 4e 73 20 77 68 69 63 68 20 61 72 ct PINs which ar
17ed0 65 20 74 6f 6f 20 73 68 6f 72 74 20 2a 2f 0a 09 e too short */..
17ee0 69 66 20 28 70 69 6e 5f 6c 65 6e 20 3c 20 35 29 if (pin_len < 5)
17ef0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
17f00 47 5f 50 52 49 4e 54 46 28 22 52 65 6a 65 63 74 G_PRINTF("Reject
17f10 69 6e 67 20 50 49 4e 20 77 68 69 63 68 20 69 73 ing PIN which is
17f20 20 74 6f 6f 20 73 68 6f 72 74 20 28 6c 65 6e 67 too short (leng
17f30 74 68 20 3d 20 25 6c 75 2c 20 6d 75 73 74 20 62 th = %lu, must b
17f40 65 20 61 74 6c 65 61 73 74 20 35 29 22 2c 20 70 e atleast 5)", p
17f50 69 6e 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 in_len);....retu
17f60 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 rn(CACKEY_PCSC_E
17f70 5f 42 41 44 50 49 4e 29 3b 0a 09 7d 0a 0a 09 2f _BADPIN);..}.../
17f80 2a 20 50 49 56 20 61 75 74 68 65 6e 74 69 63 61 * PIV authentica
17f90 74 69 6f 6e 20 75 73 65 73 20 61 20 22 6b 65 79 tion uses a "key
17fa0 5f 72 65 66 65 72 65 6e 63 65 22 20 6f 66 20 30 _reference" of 0
17fb0 78 38 30 20 2a 2f 0a 09 70 63 73 63 5f 69 64 65 x80 */..pcsc_ide
17fc0 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 ntities = cackey
17fd0 5f 72 65 61 64 5f 63 65 72 74 73 28 73 6c 6f 74 _read_certs(slot
17fe0 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 , NULL, &num_cer
17ff0 74 73 29 3b 0a 09 69 66 20 28 6e 75 6d 5f 63 65 ts);..if (num_ce
18000 72 74 73 20 3e 20 30 20 26 26 20 70 63 73 63 5f rts > 0 && pcsc_
18010 69 64 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 identities != NU
18020 4c 4c 29 20 7b 0a 09 09 73 77 69 74 63 68 20 28 LL) {...switch (
18030 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b pcsc_identities[
18040 30 5d 2e 69 64 5f 74 79 70 65 29 20 7b 0a 09 09 0].id_type) {...
18050 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f .case CACKEY_ID_
18060 54 59 50 45 5f 50 49 56 3a 0a 09 09 09 09 43 41 TYPE_PIV:.....CA
18070 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
18080 46 28 22 57 65 20 68 61 76 65 20 50 49 56 20 63 F("We have PIV c
18090 61 72 64 2c 20 73 6f 20 77 65 20 77 69 6c 6c 20 ard, so we will
180a0 61 74 74 65 6d 70 74 20 74 6f 20 61 75 74 68 65 attempt to authe
180b0 6e 74 69 63 61 74 65 20 75 73 69 6e 67 20 74 68 nticate using th
180c0 65 20 50 49 56 20 41 70 70 6c 69 63 61 74 69 6f e PIV Applicatio
180d0 6e 20 6b 65 79 20 72 65 66 65 72 65 6e 63 65 22 n key reference"
180e0 29 3b 0a 0a 09 09 09 09 68 61 76 65 5f 70 69 76 );......have_piv
180f0 20 3d 20 31 3b 0a 09 09 09 09 62 72 65 61 6b 3b = 1;.....break;
18100 0a 09 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 ....default:....
18110 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 63 .break;...}....c
18120 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73 ackey_free_certs
18130 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 (pcsc_identities
18140 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b , num_certs, 1);
18150 0a 09 7d 0a 0a 09 69 66 20 28 68 61 76 65 5f 70 ..}...if (have_p
18160 69 76 20 3d 3d 20 31 29 20 7b 0a 09 09 6b 65 79 iv == 1) {...key
18170 5f 72 65 66 65 72 65 6e 63 65 20 3d 20 30 78 38 _reference = 0x8
18180 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 49 73 73 75 65 0;..}.../* Issue
18190 20 50 49 4e 20 56 65 72 69 66 79 20 2a 2f 0a 09 PIN Verify */..
181a0 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 send_ret = cacke
181b0 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 y_send_apdu(slot
181c0 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 , GSCIS_CLASS_IS
181d0 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 O7816, GSCIS_INS
181e0 54 52 5f 56 45 52 49 46 59 2c 20 30 78 30 30 2c TR_VERIFY, 0x00,
181f0 20 6b 65 79 5f 72 65 66 65 72 65 6e 63 65 2c 20 key_reference,
18200 73 69 7a 65 6f 66 28 63 61 63 5f 70 69 6e 29 2c sizeof(cac_pin),
18210 20 63 61 63 5f 70 69 6e 2c 20 30 78 30 30 2c 20 cac_pin, 0x00,
18220 26 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 2c 20 &response_code,
18230 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 NULL, NULL);...i
18240 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 f (send_ret != C
18250 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 ACKEY_PCSC_S_OK)
18260 20 7b 0a 09 09 69 66 20 28 28 72 65 73 70 6f 6e {...if ((respon
18270 73 65 5f 63 6f 64 65 20 26 20 30 78 36 33 43 30 se_code & 0x63C0
18280 29 20 3d 3d 20 30 78 36 33 43 30 29 20 7b 0a 09 ) == 0x63C0) {..
18290 09 09 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e ..tries_remainin
182a0 67 20 3d 20 28 72 65 73 70 6f 6e 73 65 5f 63 6f g = (response_co
182b0 64 65 20 26 20 30 78 46 29 3b 0a 0a 09 09 09 43 de & 0xF);.....C
182c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
182d0 54 46 28 22 50 49 4e 20 56 65 72 69 66 69 63 61 TF("PIN Verifica
182e0 74 69 6f 6e 20 66 61 69 6c 65 64 2c 20 25 69 20 tion failed, %i
182f0 74 72 69 65 73 20 72 65 6d 61 69 6e 69 6e 67 22 tries remaining"
18300 2c 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e , tries_remainin
18310 67 29 3b 0a 0a 09 09 09 69 66 20 28 74 72 69 65 g);.....if (trie
18320 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b s_remaining_p) {
18330 0a 09 09 09 09 2a 74 72 69 65 73 5f 72 65 6d 61 .....*tries_rema
18340 69 6e 69 6e 67 5f 70 20 3d 20 74 72 69 65 73 5f ining_p = tries_
18350 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 09 09 7d 0a remaining;....}.
18360 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 ....return(CACKE
18370 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 Y_PCSC_E_BADPIN)
18380 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72 65 73 ;...}....if (res
18390 70 6f 6e 73 65 5f 63 6f 64 65 20 3d 3d 20 30 78 ponse_code == 0x
183a0 36 39 38 33 29 20 7b 0a 09 09 09 43 41 43 4b 45 6983) {....CACKE
183b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
183c0 50 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e PIN Verification
183d0 20 66 61 69 6c 65 64 2c 20 64 65 76 69 63 65 20 failed, device
183e0 69 73 20 6c 6f 63 6b 65 64 22 29 3b 0a 0a 09 09 is locked");....
183f0 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 .return(CACKEY_P
18400 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 29 3b 0a 09 CSC_E_LOCKED);..
18410 09 7d 0a 0a 09 09 69 66 20 28 72 65 73 70 6f 6e .}....if (respon
18420 73 65 5f 63 6f 64 65 20 3d 3d 20 30 78 36 64 30 se_code == 0x6d0
18430 30 29 20 7b 0a 09 09 09 69 66 20 28 72 65 74 72 0) {....if (retr
18440 69 65 73 20 3e 20 30 29 20 7b 0a 09 09 09 09 43 ies > 0) {.....C
18450 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
18460 54 46 28 22 47 6f 74 20 49 53 4f 20 37 38 31 36 TF("Got ISO 7816
18470 20 52 65 73 70 6f 6e 73 65 20 5c 22 36 44 20 30 Response \"6D 0
18480 30 5c 22 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 0\" in response
18490 74 6f 20 61 20 56 45 52 49 46 59 20 72 65 71 75 to a VERIFY requ
184a0 65 73 74 2e 22 29 3b 0a 09 09 09 09 43 41 43 4b est.");.....CACK
184b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
184c0 22 57 65 20 64 69 64 20 6e 6f 74 20 65 78 70 65 "We did not expe
184d0 63 74 20 74 68 69 73 20 62 65 63 61 75 73 65 20 ct this because
184e0 69 74 20 69 73 20 6e 6f 74 20 6d 65 6e 74 69 6f it is not mentio
184f0 6e 65 64 20 69 6e 20 4e 49 53 54 20 53 50 20 38 ned in NIST SP 8
18500 30 30 2d 37 33 2d 33 20 50 61 72 74 20 32 20 53 00-73-3 Part 2 S
18510 65 63 74 69 6f 6e 20 33 2e 32 2e 31 20 6f 72 20 ection 3.2.1 or
18520 47 53 43 2d 49 53 20 76 32 2e 31 22 29 3b 0a 09 GSC-IS v2.1");..
18530 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
18540 50 52 49 4e 54 46 28 22 57 65 20 61 72 65 20 67 PRINTF("We are g
18550 6f 69 6e 67 20 74 6f 20 74 72 79 20 74 6f 20 72 oing to try to r
18560 65 73 65 74 20 74 68 65 20 63 61 72 64 20 61 6e eset the card an
18570 64 20 73 65 6c 65 63 74 20 74 68 65 20 61 70 70 d select the app
18580 6c 65 74 20 61 67 61 69 6e 2e 22 29 3b 0a 0a 09 let again.");...
18590 09 09 09 69 66 20 28 6e 75 6d 5f 63 65 72 74 73 ...if (num_certs
185a0 20 3e 20 30 20 26 26 20 70 63 73 63 5f 69 64 65 > 0 && pcsc_ide
185b0 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 ntities != NULL)
185c0 20 7b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 64 {......cackey_d
185d0 65 74 65 63 74 5f 61 6e 64 5f 73 65 6c 65 63 74 etect_and_select
185e0 5f 72 6f 6f 74 5f 61 70 70 6c 65 74 28 73 6c 6f _root_applet(slo
185f0 74 2c 20 70 63 73 63 5f 69 64 65 6e 74 69 74 69 t, pcsc_identiti
18600 65 73 5b 30 5d 2e 69 64 5f 74 79 70 65 29 3b 0a es[0].id_type);.
18610 09 09 09 09 7d 0a 0a 09 09 09 09 63 61 63 6b 65 ....}......cacke
18620 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 y_mark_slot_rese
18630 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 63 6f t(slot);......co
18640 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b nnect_ret = cack
18650 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 ey_connect_card(
18660 73 6c 6f 74 29 3b 0a 09 09 09 09 69 66 20 28 63 slot);.....if (c
18670 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 onnect_ret != CA
18680 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 CKEY_PCSC_S_OK)
18690 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 {......CACKEY_DE
186a0 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 BUG_PRINTF("Unab
186b0 6c 65 20 74 6f 20 72 65 63 6f 6e 6e 65 63 74 20 le to reconnect
186c0 61 66 74 65 72 20 72 65 73 65 74 74 69 6e 67 20 after resetting
186d0 74 68 65 20 63 61 72 64 2c 20 72 65 74 75 72 6e the card, return
186e0 69 6e 67 20 69 6e 20 65 72 72 6f 72 2e 22 29 3b ing in error.");
186f0 0a 0a 09 09 09 09 09 72 65 74 75 72 6e 28 63 6f .......return(co
18700 6e 6e 65 63 74 5f 72 65 74 29 3b 0a 09 09 09 09 nnect_ret);.....
18710 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 }......CACKEY_DE
18720 42 55 47 5f 50 52 49 4e 54 46 28 22 56 65 72 69 BUG_PRINTF("Veri
18730 66 79 69 6e 67 20 77 65 20 73 74 69 6c 6c 20 68 fying we still h
18740 61 76 65 20 61 20 74 6f 6b 65 6e 2e 22 29 3b 0a ave a token.");.
18750 09 09 09 09 74 6f 6b 65 6e 5f 72 65 74 20 3d 20 ....token_ret =
18760 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 cackey_token_pre
18770 73 65 6e 74 28 73 6c 6f 74 29 3b 0a 09 09 09 09 sent(slot);.....
18780 69 66 20 28 74 6f 6b 65 6e 5f 72 65 74 20 21 3d if (token_ret !=
18790 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 CACKEY_PCSC_S_T
187a0 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09 OKENPRESENT) {..
187b0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
187c0 5f 50 52 49 4e 54 46 28 22 54 6f 6b 65 6e 20 6e _PRINTF("Token n
187d0 6f 74 20 70 72 65 73 65 6e 74 2c 20 72 65 74 75 ot present, retu
187e0 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 2e 22 rning in error."
187f0 29 3b 0a 0a 09 09 09 09 09 72 65 74 75 72 6e 28 );.......return(
18800 74 6f 6b 65 6e 5f 72 65 74 29 3b 0a 09 09 09 09 token_ret);.....
18810 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 }......CACKEY_DE
18820 42 55 47 5f 50 52 49 4e 54 46 28 22 54 72 79 69 BUG_PRINTF("Tryi
18830 6e 67 20 74 6f 20 6c 6f 67 69 6e 20 61 67 61 69 ng to login agai
18840 6e 22 29 3b 0a 09 09 09 09 72 65 74 75 72 6e 28 n");.....return(
18850 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 73 6c 6f cackey_login(slo
18860 74 2c 20 70 69 6e 2c 20 70 69 6e 5f 6c 65 6e 2c t, pin, pin_len,
18870 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 tries_remaining
18880 5f 70 2c 20 72 65 74 72 69 65 73 20 2d 20 31 29 _p, retries - 1)
18890 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 72 );....}...}....r
188a0 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 eturn(CACKEY_PCS
188b0 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d C_E_GENERIC);..}
188c0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
188d0 50 52 49 4e 54 46 28 22 50 49 4e 20 56 65 72 69 PRINTF("PIN Veri
188e0 66 69 63 61 74 69 6f 6e 20 73 75 63 63 65 65 64 fication succeed
188f0 65 64 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 ed");...return(C
18900 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 ACKEY_PCSC_S_OK)
18910 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f ;.}../*. * SYNPO
18920 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 SIS. * ....
18930 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 *. * ARGUMENTS.
18940 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 * .... *. *
18950 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 RETURN VALUE. *
18960 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f .... *. * NO
18970 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 TES. * ....
18980 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 *. */.static ssi
18990 7a 65 5f 74 20 63 61 63 6b 65 79 5f 70 63 73 63 ze_t cackey_pcsc
189a0 5f 69 64 65 6e 74 69 74 79 5f 74 6f 5f 6c 61 62 _identity_to_lab
189b0 65 6c 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 el(struct cackey
189c0 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a _pcsc_identity *
189d0 69 64 65 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e identity, unsign
189e0 65 64 20 63 68 61 72 20 2a 6c 61 62 65 6c 5f 62 ed char *label_b
189f0 75 66 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e uf, unsigned lon
18a00 67 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 29 g label_buf_len)
18a10 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e {..unsigned lon
18a20 67 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 g certificate_le
18a30 6e 3b 0a 09 76 6f 69 64 20 2a 6c 61 62 65 6c 5f n;..void *label_
18a40 61 73 6e 31 3b 0a 09 76 6f 69 64 20 2a 63 65 72 asn1;..void *cer
18a50 74 69 66 69 63 61 74 65 3b 0a 09 69 6e 74 20 78 tificate;..int x
18a60 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 0a 09 509_read_ret;...
18a70 63 65 72 74 69 66 69 63 61 74 65 20 3d 20 69 64 certificate = id
18a80 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 entity->certific
18a90 61 74 65 3b 0a 09 63 65 72 74 69 66 69 63 61 74 ate;..certificat
18aa0 65 5f 6c 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 e_len = identity
18ab0 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 ->certificate_le
18ac0 6e 3b 0a 0a 09 69 66 20 28 63 65 72 74 69 66 69 n;...if (certifi
18ad0 63 61 74 65 5f 6c 65 6e 20 3c 20 30 29 20 7b 0a cate_len < 0) {.
18ae0 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d ..return(-1);..}
18af0 0a 0a 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 ...x509_read_ret
18b00 20 3d 20 78 35 30 39 5f 74 6f 5f 73 75 62 6a 65 = x509_to_subje
18b10 63 74 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 ct(certificate,
18b20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c certificate_len,
18b30 20 28 76 6f 69 64 20 2a 2a 29 20 26 6c 61 62 65 (void **) &labe
18b40 6c 5f 61 73 6e 31 29 3b 0a 09 69 66 20 28 78 35 l_asn1);..if (x5
18b50 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 09_read_ret < 0)
18b60 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b {...return(-1);
18b70 0a 09 7d 0a 0a 09 78 35 30 39 5f 72 65 61 64 5f ..}...x509_read_
18b80 72 65 74 20 3d 20 78 35 30 39 5f 64 6e 5f 74 6f ret = x509_dn_to
18b90 5f 73 74 72 69 6e 67 28 6c 61 62 65 6c 5f 61 73 _string(label_as
18ba0 6e 31 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65 n1, x509_read_re
18bb0 74 2c 20 28 63 68 61 72 20 2a 29 20 6c 61 62 65 t, (char *) labe
18bc0 6c 5f 62 75 66 2c 20 6c 61 62 65 6c 5f 62 75 66 l_buf, label_buf
18bd0 5f 6c 65 6e 2c 20 22 43 4e 22 29 3b 0a 09 69 66 _len, "CN");..if
18be0 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 (x509_read_ret
18bf0 3c 3d 20 30 29 20 7b 0a 09 09 78 35 30 39 5f 72 <= 0) {...x509_r
18c00 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 64 ead_ret = x509_d
18c10 6e 5f 74 6f 5f 73 74 72 69 6e 67 28 6c 61 62 65 n_to_string(labe
18c20 6c 5f 61 73 6e 31 2c 20 78 35 30 39 5f 72 65 61 l_asn1, x509_rea
18c30 64 5f 72 65 74 2c 20 28 63 68 61 72 20 2a 29 20 d_ret, (char *)
18c40 6c 61 62 65 6c 5f 62 75 66 2c 20 6c 61 62 65 6c label_buf, label
18c50 5f 62 75 66 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 3b _buf_len, NULL);
18c60 0a 0a 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 ....if (x509_rea
18c70 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09 d_ret <= 0) {...
18c80 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d .return(-1);...}
18c90 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b ..}..#ifdef CACK
18ca0 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 EY_PARANOID.# i
18cb0 66 64 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a fdef _POSIX_SSIZ
18cc0 45 5f 4d 41 58 0a 09 69 66 20 28 78 35 30 39 5f E_MAX..if (x509_
18cd0 72 65 61 64 5f 72 65 74 20 3e 20 5f 50 4f 53 49 read_ret > _POSI
18ce0 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 X_SSIZE_MAX) {..
18cf0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
18d00 49 4e 54 46 28 22 78 35 30 39 5f 72 65 61 64 5f INTF("x509_read_
18d10 72 65 74 20 65 78 63 65 65 64 73 20 6d 61 78 69 ret exceeds maxi
18d20 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74 75 72 mum value, retur
18d30 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e ning in failure.
18d40 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 78 35 30 (max = %li, x50
18d50 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 25 6c 75 9_read_ret = %lu
18d60 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 )", (long) _POSI
18d70 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e X_SSIZE_MAX, (un
18d80 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 78 35 30 signed long) x50
18d90 39 5f 72 65 61 64 5f 72 65 74 29 3b 0a 0a 09 09 9_read_ret);....
18da0 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 return(-1);..}.#
18db0 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a endif.#endif..
18dc0 09 72 65 74 75 72 6e 28 78 35 30 39 5f 72 65 61 .return(x509_rea
18dd0 64 5f 72 65 74 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 d_ret);.}../* Re
18de0 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 turns 0 on succe
18df0 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 ss */.static int
18e00 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 63 72 cackey_mutex_cr
18e10 65 61 74 65 28 76 6f 69 64 20 2a 2a 6d 75 74 65 eate(void **mute
18e20 78 29 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 x) {..pthread_mu
18e30 74 65 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d tex_t *pthread_m
18e40 75 74 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 utex;..int pthre
18e50 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 ad_retval;..CK_R
18e60 56 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b V custom_retval;
18e70 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
18e80 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
18e90 29 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79 );...if ((cackey
18ea0 5f 61 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b _args.flags & CK
18eb0 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 F_OS_LOCKING_OK)
18ec0 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 == CKF_OS_LOCKI
18ed0 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 NG_OK) {...pthre
18ee0 61 64 5f 6d 75 74 65 78 20 3d 20 6d 61 6c 6c 6f ad_mutex = mallo
18ef0 63 28 73 69 7a 65 6f 66 28 2a 70 74 68 72 65 61 c(sizeof(*pthrea
18f00 64 5f 6d 75 74 65 78 29 29 3b 0a 09 09 69 66 20 d_mutex));...if
18f10 28 21 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29 (!pthread_mutex)
18f20 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 {....CACKEY_DEB
18f30 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 UG_PRINTF("Faile
18f40 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 d to allocate me
18f50 6d 6f 72 79 2e 22 29 3b 0a 0a 09 09 09 72 65 74 mory.");.....ret
18f60 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 urn(-1);...}....
18f70 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 3d pthread_retval =
18f80 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 pthread_mutex_i
18f90 6e 69 74 28 70 74 68 72 65 61 64 5f 6d 75 74 65 nit(pthread_mute
18fa0 78 2c 20 4e 55 4c 4c 29 3b 0a 09 09 69 66 20 28 x, NULL);...if (
18fb0 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 21 pthread_retval !
18fc0 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 = 0) {....CACKEY
18fd0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70 _DEBUG_PRINTF("p
18fe0 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 thread_mutex_ini
18ff0 74 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 t() returned err
19000 6f 72 20 28 25 69 29 2e 22 2c 20 70 74 68 72 65 or (%i).", pthre
19010 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 ad_retval);.....
19020 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a return(-1);...}.
19030 0a 09 09 2a 6d 75 74 65 78 20 3d 20 70 74 68 72 ...*mutex = pthr
19040 65 61 64 5f 6d 75 74 65 78 3b 0a 09 7d 20 65 6c ead_mutex;..} el
19050 73 65 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 se {...if (cacke
19060 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74 y_args.CreateMut
19070 65 78 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f ex) {....custom_
19080 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f retval = cackey_
19090 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78 args.CreateMutex
190a0 28 6d 75 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 (mutex);.....if
190b0 28 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 (custom_retval !
190c0 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 = CKR_OK) {.....
190d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
190e0 4e 54 46 28 22 63 61 63 6b 65 79 5f 61 72 67 73 NTF("cackey_args
190f0 2e 43 72 65 61 74 65 4d 75 74 65 78 28 29 20 72 .CreateMutex() r
19100 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 eturned error (%
19110 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75 li).", (long) cu
19120 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 stom_retval);...
19130 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 ...return(-1);..
19140 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 ..}...}..}...CAC
19150 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
19160 28 22 52 65 74 75 72 6e 69 6e 67 20 73 75 63 65 ("Returning suce
19170 73 73 66 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a ssfully (0)");..
19180 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f .return(0);.}../
19190 2a 20 52 65 74 75 72 6e 73 20 30 20 6f 6e 20 73 * Returns 0 on s
191a0 75 63 63 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 uccess */.static
191b0 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d 75 74 65 int cackey_mute
191c0 78 5f 6c 6f 63 6b 28 76 6f 69 64 20 2a 6d 75 74 x_lock(void *mut
191d0 65 78 29 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d ex) {..pthread_m
191e0 75 74 65 78 5f 74 20 2a 70 74 68 72 65 61 64 5f utex_t *pthread_
191f0 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 mutex;..int pthr
19200 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f ead_retval;..CK_
19210 52 56 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c RV custom_retval
19220 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ;...CACKEY_DEBUG
19230 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
19240 22 29 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 ");...if ((cacke
19250 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 26 20 43 y_args.flags & C
19260 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b KF_OS_LOCKING_OK
19270 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b ) == CKF_OS_LOCK
19280 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 ING_OK) {...pthr
19290 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d 75 74 65 ead_mutex = mute
192a0 78 3b 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 65 x;....pthread_re
192b0 74 76 61 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d tval = pthread_m
192c0 75 74 65 78 5f 6c 6f 63 6b 28 70 74 68 72 65 61 utex_lock(pthrea
192d0 64 5f 6d 75 74 65 78 29 3b 0a 09 09 69 66 20 28 d_mutex);...if (
192e0 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 21 pthread_retval !
192f0 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 = 0) {....CACKEY
19300 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70 _DEBUG_PRINTF("p
19310 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 thread_mutex_loc
19320 6b 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 k() returned err
19330 6f 72 20 28 25 69 29 2e 22 2c 20 70 74 68 72 65 or (%i).", pthre
19340 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 ad_retval);.....
19350 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a return(-1);...}.
19360 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 .} else {...if (
19370 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b cackey_args.Lock
19380 4d 75 74 65 78 29 20 7b 0a 09 09 09 63 75 73 74 Mutex) {....cust
19390 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b om_retval = cack
193a0 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 ey_args.LockMute
193b0 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09 09 69 66 x(mutex);.....if
193c0 20 28 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 (custom_retval
193d0 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 != CKR_OK) {....
193e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
193f0 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 61 72 67 INTF("cackey_arg
19400 73 2e 4c 6f 63 6b 4d 75 74 65 78 28 29 20 72 65 s.LockMutex() re
19410 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 6c turned error (%l
19420 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 i).", (long) cus
19430 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 tom_retval);....
19440 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 ..return(-1);...
19450 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b .}...}..}...CACK
19460 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
19470 22 52 65 74 75 72 6e 69 6e 67 20 73 75 63 65 73 "Returning suces
19480 73 66 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 sfully (0)");...
19490 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a return(0);.}../*
194a0 20 52 65 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 Returns 0 on su
194b0 63 63 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 ccess */.static
194c0 69 6e 74 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 int cackey_mutex
194d0 5f 75 6e 6c 6f 63 6b 28 76 6f 69 64 20 2a 6d 75 _unlock(void *mu
194e0 74 65 78 29 20 7b 0a 09 70 74 68 72 65 61 64 5f tex) {..pthread_
194f0 6d 75 74 65 78 5f 74 20 2a 70 74 68 72 65 61 64 mutex_t *pthread
19500 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70 74 68 _mutex;..int pth
19510 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b read_retval;..CK
19520 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 _RV custom_retva
19530 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 l;...CACKEY_DEBU
19540 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 G_PRINTF("Called
19550 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b .");...if ((cack
19560 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 26 20 ey_args.flags &
19570 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f CKF_OS_LOCKING_O
19580 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 K) == CKF_OS_LOC
19590 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 KING_OK) {...pth
195a0 72 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d 75 74 read_mutex = mut
195b0 65 78 3b 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 ex;....pthread_r
195c0 65 74 76 61 6c 20 3d 20 70 74 68 72 65 61 64 5f etval = pthread_
195d0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 70 74 68 mutex_unlock(pth
195e0 72 65 61 64 5f 6d 75 74 65 78 29 3b 0a 09 09 69 read_mutex);...i
195f0 66 20 28 70 74 68 72 65 61 64 5f 72 65 74 76 61 f (pthread_retva
19600 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 l != 0) {....CAC
19610 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
19620 28 22 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f ("pthread_mutex_
19630 75 6e 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e 65 unlock() returne
19640 64 20 65 72 72 6f 72 20 28 25 69 29 2e 22 2c 20 d error (%i).",
19650 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 29 3b pthread_retval);
19660 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b .....return(-1);
19670 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 ...}..} else {..
19680 09 69 66 20 28 63 61 63 6b 65 79 5f 61 72 67 73 .if (cackey_args
19690 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 29 20 7b 0a .UnlockMutex) {.
196a0 09 09 09 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c ...custom_retval
196b0 20 3d 20 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 = cackey_args.U
196c0 6e 6c 6f 63 6b 4d 75 74 65 78 28 6d 75 74 65 78 nlockMutex(mutex
196d0 29 3b 0a 0a 09 09 09 69 66 20 28 63 75 73 74 6f );.....if (custo
196e0 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f m_retval != CKR_
196f0 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 OK) {.....CACKEY
19700 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 _DEBUG_PRINTF("c
19710 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 ackey_args.Unloc
19720 6b 4d 75 74 65 78 28 29 20 72 65 74 75 72 6e 65 kMutex() returne
19730 64 20 65 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c d error (%li).",
19740 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72 (long) custom_r
19750 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74 etval);......ret
19760 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 urn(-1);....}...
19770 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 }..}...CACKEY_DE
19780 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
19790 72 6e 69 6e 67 20 73 75 63 65 73 73 66 75 6c 6c rning sucessfull
197a0 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 74 75 72 y (0)");...retur
197b0 6e 28 30 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 n(0);.}..static
197c0 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 CK_ATTRIBUTE_PTR
197d0 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 cackey_get_attr
197e0 69 62 75 74 65 73 28 43 4b 5f 4f 42 4a 45 43 54 ibutes(CK_OBJECT
197f0 5f 43 4c 41 53 53 20 6f 62 6a 65 63 74 63 6c 61 _CLASS objectcla
19800 73 73 2c 20 73 74 72 75 63 74 20 63 61 63 6b 65 ss, struct cacke
19810 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 y_pcsc_identity
19820 2a 69 64 65 6e 74 69 74 79 2c 20 75 6e 73 69 67 *identity, unsig
19830 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 ned long identit
19840 79 5f 6e 75 6d 2c 20 43 4b 5f 55 4c 4f 4e 47 5f y_num, CK_ULONG_
19850 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a PTR pulCount) {.
19860 09 73 74 61 74 69 63 20 43 4b 5f 42 42 4f 4f 4c .static CK_BBOOL
19870 20 63 6b 5f 74 72 75 65 20 3d 20 31 3b 0a 09 73 ck_true = 1;..s
19880 74 61 74 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 63 tatic CK_BBOOL c
19890 6b 5f 66 61 6c 73 65 20 3d 20 30 3b 0a 09 73 74 k_false = 0;..st
198a0 61 74 69 63 20 43 4b 5f 54 52 55 53 54 20 63 6b atic CK_TRUST ck
198b0 5f 74 72 75 73 74 65 64 20 3d 20 43 4b 5f 54 52 _trusted = CK_TR
198c0 55 53 54 45 44 5f 44 45 4c 45 47 41 54 4f 52 3b USTED_DELEGATOR;
198d0 0a 09 43 4b 5f 55 4c 4f 4e 47 20 6e 75 6d 61 74 ..CK_ULONG numat
198e0 74 72 73 20 3d 20 30 2c 20 72 65 74 76 61 6c 5f trs = 0, retval_
198f0 63 6f 75 6e 74 3b 0a 09 43 4b 5f 41 54 54 52 49 count;..CK_ATTRI
19900 42 55 54 45 5f 54 59 50 45 20 63 75 72 72 5f 61 BUTE_TYPE curr_a
19910 74 74 72 5f 74 79 70 65 3b 0a 09 43 4b 5f 41 54 ttr_type;..CK_AT
19920 54 52 49 42 55 54 45 20 63 75 72 72 5f 61 74 74 TRIBUTE curr_att
19930 72 2c 20 2a 72 65 74 76 61 6c 3b 0a 09 43 4b 5f r, *retval;..CK_
19940 56 4f 49 44 5f 50 54 52 20 70 56 61 6c 75 65 3b VOID_PTR pValue;
19950 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c ..CK_ULONG ulVal
19960 75 65 4c 65 6e 3b 0a 09 43 4b 5f 4f 42 4a 45 43 ueLen;..CK_OBJEC
19970 54 5f 43 4c 41 53 53 20 63 6b 5f 6f 62 6a 65 63 T_CLASS ck_objec
19980 74 5f 63 6c 61 73 73 3b 0a 09 43 4b 5f 43 45 52 t_class;..CK_CER
19990 54 49 46 49 43 41 54 45 5f 54 59 50 45 20 63 6b TIFICATE_TYPE ck
199a0 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74 79 70 _certificate_typ
199b0 65 3b 0a 09 43 4b 5f 4b 45 59 5f 54 59 50 45 20 e;..CK_KEY_TYPE
199c0 63 6b 5f 6b 65 79 5f 74 79 70 65 3b 0a 09 43 4b ck_key_type;..CK
199d0 5f 55 54 46 38 43 48 41 52 20 75 63 54 6d 70 42 _UTF8CHAR ucTmpB
199e0 75 66 5b 31 30 32 34 5d 3b 0a 09 53 48 41 31 43 uf[1024];..SHA1C
199f0 6f 6e 74 65 78 74 20 73 68 61 31 5f 63 74 78 3b ontext sha1_ctx;
19a00 0a 09 4d 44 35 5f 43 54 58 20 6d 64 35 5f 63 74 ..MD5_CTX md5_ct
19a10 78 3b 0a 09 75 69 6e 74 38 5f 74 20 73 68 61 31 x;..uint8_t sha1
19a20 5f 68 61 73 68 5b 53 48 41 31 48 61 73 68 53 69 _hash[SHA1HashSi
19a30 7a 65 5d 3b 0a 09 75 69 6e 74 38 5f 74 20 6d 64 ze];..uint8_t md
19a40 35 5f 68 61 73 68 5b 4d 44 35 48 61 73 68 53 69 5_hash[MD5HashSi
19a50 7a 65 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 ze];..unsigned c
19a60 68 61 72 20 2a 63 65 72 74 69 66 69 63 61 74 65 har *certificate
19a70 3b 0a 09 73 73 69 7a 65 5f 74 20 63 65 72 74 69 ;..ssize_t certi
19a80 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 2d 31 2c ficate_len = -1,
19a90 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a x509_read_ret;.
19aa0 09 69 6e 74 20 70 56 61 6c 75 65 5f 66 72 65 65 .int pValue_free
19ab0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ;...CACKEY_DEBUG
19ac0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 20 _PRINTF("Called
19ad0 28 6f 62 6a 65 63 74 43 6c 61 73 73 20 3d 20 25 (objectClass = %
19ae0 6c 75 2c 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d lu, identity_num
19af0 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 = %lu).", (unsi
19b00 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 62 6a 65 63 gned long) objec
19b10 74 63 6c 61 73 73 2c 20 69 64 65 6e 74 69 74 79 tclass, identity
19b20 5f 6e 75 6d 29 3b 0a 0a 09 2a 70 75 6c 43 6f 75 _num);...*pulCou
19b30 6e 74 20 3d 20 30 3b 0a 0a 09 69 66 20 28 6f 62 nt = 0;...if (ob
19b40 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f jectclass != CKO
19b50 5f 43 45 52 54 49 46 49 43 41 54 45 20 26 26 20 _CERTIFICATE &&
19b60 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 objectclass != C
19b70 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 20 26 26 KO_PUBLIC_KEY &&
19b80 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 objectclass !=
19b90 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 CKO_PRIVATE_KEY
19ba0 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 && objectclass !
19bb0 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 = CKO_NETSCAPE_T
19bc0 52 55 53 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 RUST) {...CACKEY
19bd0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
19be0 65 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 eturning 0 objec
19bf0 74 73 20 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c ts (NULL), inval
19c00 69 64 20 6f 62 6a 65 63 74 20 63 6c 61 73 73 22 id object class"
19c10 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c );....return(NUL
19c20 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 47 65 74 20 L);..}.../* Get
19c30 43 65 72 74 20 2a 2f 0a 09 69 66 20 28 69 64 65 Cert */..if (ide
19c40 6e 74 69 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b ntity == NULL) {
19c50 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
19c60 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e PRINTF("Returnin
19c70 67 20 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c g 0 objects (NUL
19c80 4c 29 2c 20 69 6e 76 61 6c 69 64 20 69 64 65 6e L), invalid iden
19c90 74 69 79 20 70 72 6f 76 69 64 65 64 22 29 3b 0a tiy provided");.
19ca0 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b ...return(NULL);
19cb0 0a 09 7d 0a 0a 09 63 65 72 74 69 66 69 63 61 74 ..}...certificat
19cc0 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 e = identity->ce
19cd0 72 74 69 66 69 63 61 74 65 3b 0a 09 63 65 72 74 rtificate;..cert
19ce0 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 69 64 ificate_len = id
19cf0 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 entity->certific
19d00 61 74 65 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 63 ate_len;...if (c
19d10 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d ertificate_len =
19d20 3d 20 2d 31 20 7c 7c 20 63 65 72 74 69 66 69 63 = -1 || certific
19d30 61 74 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ate == NULL) {..
19d40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
19d50 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
19d60 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 0 objects (NULL)
19d70 2c 20 74 68 69 73 20 69 64 65 6e 74 69 74 79 20 , this identity
19d80 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 6e does not have an
19d90 20 58 2e 35 30 39 20 63 65 72 74 69 66 69 63 61 X.509 certifica
19da0 74 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 te associated wi
19db0 74 68 20 69 74 20 61 6e 64 20 77 69 6c 6c 20 6e th it and will n
19dc0 6f 74 20 77 6f 72 6b 22 29 3b 0a 0a 09 09 72 65 ot work");....re
19dd0 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a turn(NULL);..}..
19de0 09 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 ./* Verify that
19df0 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 41 certificate is A
19e00 53 4e 2e 31 20 65 6e 63 6f 64 65 64 20 58 2e 35 SN.1 encoded X.5
19e10 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 09 certificate *
19e20 2f 0a 09 69 66 20 28 78 35 30 39 5f 74 6f 5f 73 /..if (x509_to_s
19e30 65 72 69 61 6c 28 63 65 72 74 69 66 69 63 61 74 erial(certificat
19e40 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c e, certificate_l
19e50 65 6e 2c 20 4e 55 4c 4c 29 20 3c 20 30 29 20 7b en, NULL) < 0) {
19e60 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
19e70 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e PRINTF("Returnin
19e80 67 20 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c g 0 objects (NUL
19e90 4c 29 2c 20 74 68 65 20 58 2e 35 30 39 20 63 65 L), the X.509 ce
19ea0 72 74 69 66 69 63 61 74 65 20 61 73 73 6f 63 69 rtificate associ
19eb0 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 69 ated with this i
19ec0 64 65 6e 74 69 74 79 20 69 73 20 6e 6f 74 20 76 dentity is not v
19ed0 61 6c 69 64 22 29 3b 0a 0a 09 09 72 65 74 75 72 alid");....retur
19ee0 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 n(NULL);..}...re
19ef0 74 76 61 6c 5f 63 6f 75 6e 74 20 3d 20 36 34 3b tval_count = 64;
19f00 0a 09 72 65 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f ..retval = mallo
19f10 63 28 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a c(retval_count *
19f20 20 73 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29 sizeof(*retval)
19f30 29 3b 0a 0a 09 66 6f 72 20 28 63 75 72 72 5f 61 );...for (curr_a
19f40 74 74 72 5f 74 79 70 65 20 3d 20 30 3b 20 63 75 ttr_type = 0; cu
19f50 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3c 20 30 rr_attr_type < 0
19f60 78 63 65 35 33 36 33 62 66 3b 20 63 75 72 72 5f xce5363bf; curr_
19f70 61 74 74 72 5f 74 79 70 65 2b 2b 29 20 7b 0a 09 attr_type++) {..
19f80 09 69 66 20 28 63 75 72 72 5f 61 74 74 72 5f 74 .if (curr_attr_t
19f90 79 70 65 20 3d 3d 20 30 78 38 30 30 29 20 7b 0a ype == 0x800) {.
19fa0 09 09 09 63 75 72 72 5f 61 74 74 72 5f 74 79 70 ...curr_attr_typ
19fb0 65 20 3d 20 30 78 63 65 35 33 36 33 30 30 3b 0a e = 0xce536300;.
19fc0 09 09 7d 0a 0a 09 09 70 56 61 6c 75 65 5f 66 72 ..}....pValue_fr
19fd0 65 65 20 3d 20 30 3b 0a 09 09 70 56 61 6c 75 65 ee = 0;...pValue
19fe0 20 3d 20 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c = NULL;...ulVal
19ff0 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 ueLen = (CK_LONG
1a000 29 20 2d 31 3b 0a 0a 09 09 73 77 69 74 63 68 20 ) -1;....switch
1a010 28 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 (curr_attr_type)
1a020 20 7b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43 {....case CKA_C
1a030 4c 41 53 53 3a 0a 09 09 09 09 43 41 43 4b 45 59 LASS:.....CACKEY
1a040 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
1a050 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 equesting attrib
1a060 75 74 65 20 43 4b 41 5f 43 4c 41 53 53 20 28 30 ute CKA_CLASS (0
1a070 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 x%08lx) ...", (u
1a080 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 nsigned long) cu
1a090 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a rr_attr_type);..
1a0a0 09 09 09 09 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c ....ck_object_cl
1a0b0 61 73 73 20 3d 20 6f 62 6a 65 63 74 63 6c 61 73 ass = objectclas
1a0c0 73 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d s;......pValue =
1a0d0 20 26 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 &ck_object_clas
1a0e0 73 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 s;.....ulValueLe
1a0f0 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 6f 62 n = sizeof(ck_ob
1a100 6a 65 63 74 5f 63 6c 61 73 73 29 3b 0a 0a 09 09 ject_class);....
1a110 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1a120 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 RINTF(" ... retu
1a130 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c rning %lu (%p/%l
1a140 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c u)", (unsigned l
1a150 6f 6e 67 29 20 2a 28 28 43 4b 5f 4f 42 4a 45 43 ong) *((CK_OBJEC
1a160 54 5f 43 4c 41 53 53 20 2a 29 20 70 56 61 6c 75 T_CLASS *) pValu
1a170 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 e), pValue, (uns
1a180 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 igned long) ulVa
1a190 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 lueLen);......br
1a1a0 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 eak;....case CKA
1a1b0 5f 54 4f 4b 45 4e 3a 0a 09 09 09 09 43 41 43 4b _TOKEN:.....CACK
1a1c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1a1d0 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 "Requesting attr
1a1e0 69 62 75 74 65 20 43 4b 41 5f 54 4f 4b 45 4e 20 ibute CKA_TOKEN
1a1f0 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 (0x%08lx) ...",
1a200 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
1a210 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b curr_attr_type);
1a220 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 ......pValue = &
1a230 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 ck_true;.....ulV
1a240 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 alueLen = sizeof
1a250 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 (ck_true);......
1a260 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1a270 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e NTF(" ... return
1a280 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 ing %lu (%p/%lu)
1a290 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e ", (unsigned lon
1a2a0 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a g) *((CK_BBOOL *
1a2b0 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 ) pValue), pValu
1a2c0 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e e, (unsigned lon
1a2d0 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a g) ulValueLen);.
1a2e0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 .....break;....c
1a2f0 61 73 65 20 43 4b 41 5f 50 52 49 56 41 54 45 3a ase CKA_PRIVATE:
1a300 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
1a310 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 G_PRINTF("Reques
1a320 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 ting attribute C
1a330 4b 41 5f 50 52 49 56 41 54 45 20 28 30 78 25 30 KA_PRIVATE (0x%0
1a340 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 8lx) ...", (unsi
1a350 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f gned long) curr_
1a360 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 attr_type);.....
1a370 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 .if (objectclass
1a380 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 != CKO_NETSCAPE
1a390 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 _TRUST) {......C
1a3a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1a3b0 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 TF(" ... but not
1a3c0 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 getting it beca
1a3d0 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 use we are not a
1a3e0 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 Netscape trust
1a3f0 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 object");.......
1a400 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 break;.....}....
1a410 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 ..pValue = &ck_f
1a420 61 6c 73 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 alse;.....ulValu
1a430 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b eLen = sizeof(ck
1a440 5f 66 61 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41 _false);......CA
1a450 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
1a460 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e F(" ... returnin
1a470 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c g %lu (%p/%lu)",
1a480 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
1a490 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 *((CK_BBOOL *)
1a4a0 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c pValue), pValue,
1a4b0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
1a4c0 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 ulValueLen);...
1a4d0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 ...break;....cas
1a4e0 65 20 43 4b 41 5f 54 52 55 53 54 45 44 3a 0a 09 e CKA_TRUSTED:..
1a4f0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1a500 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 PRINTF("Requesti
1a510 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 ng attribute CKA
1a520 5f 54 52 55 53 54 45 44 20 28 30 78 25 30 38 6c _TRUSTED (0x%08l
1a530 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e x) ...", (unsign
1a540 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 ed long) curr_at
1a550 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 tr_type);......i
1a560 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d f (objectclass =
1a570 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 = CKO_NETSCAPE_T
1a580 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 RUST) {......CAC
1a590 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1a5a0 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 (" ... but not g
1a5b0 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 etting it becaus
1a5c0 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 e we are a Netsc
1a5d0 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 ape trust object
1a5e0 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b ");.......break;
1a5f0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 70 56 61 6c .....}......pVal
1a600 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 ue = &ck_true;..
1a610 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 ...ulValueLen =
1a620 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b sizeof(ck_true);
1a630 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 ......CACKEY_DEB
1a640 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 UG_PRINTF(" ...
1a650 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 returning %lu (%
1a660 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e p/%lu)", (unsign
1a670 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 ed long) *((CK_B
1a680 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c BOOL *) pValue),
1a690 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e pValue, (unsign
1a6a0 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 ed long) ulValue
1a6b0 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b Len);......break
1a6c0 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f ;....case CKA_MO
1a6d0 44 49 46 49 41 42 4c 45 3a 0a 09 09 09 09 43 41 DIFIABLE:.....CA
1a6e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
1a6f0 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 F("Requesting at
1a700 74 72 69 62 75 74 65 20 43 4b 41 5f 4d 4f 44 49 tribute CKA_MODI
1a710 46 49 41 42 4c 45 20 28 30 78 25 30 38 6c 78 29 FIABLE (0x%08lx)
1a720 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 ...", (unsigned
1a730 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 long) curr_attr
1a740 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 _type);......pVa
1a750 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b lue = &ck_false;
1a760 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 .....ulValueLen
1a770 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 = sizeof(ck_fals
1a780 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f e);......CACKEY_
1a790 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e DEBUG_PRINTF(" .
1a7a0 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 .. returning %lu
1a7b0 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 (%p/%lu)", (uns
1a7c0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 igned long) *((C
1a7d0 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 K_BBOOL *) pValu
1a7e0 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 e), pValue, (uns
1a7f0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 igned long) ulVa
1a800 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 lueLen);......br
1a810 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 eak;....case CKA
1a820 5f 4c 41 42 45 4c 3a 0a 09 09 09 09 43 41 43 4b _LABEL:.....CACK
1a830 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1a840 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 "Requesting attr
1a850 69 62 75 74 65 20 43 4b 41 5f 4c 41 42 45 4c 20 ibute CKA_LABEL
1a860 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 (0x%08lx) ...",
1a870 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
1a880 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b curr_attr_type);
1a890 0a 0a 09 09 09 09 69 66 20 28 69 64 65 6e 74 69 ......if (identi
1a8a0 74 79 2d 3e 69 64 5f 74 79 70 65 20 3d 3d 20 43 ty->id_type == C
1a8b0 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 ACKEY_ID_TYPE_PI
1a8c0 56 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 V) {......pValue
1a8d0 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 61 72 = identity->car
1a8e0 64 2e 70 69 76 2e 6c 61 62 65 6c 3b 0a 09 09 09 d.piv.label;....
1a8f0 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 ..ulValueLen = s
1a900 74 72 6c 65 6e 28 70 56 61 6c 75 65 29 3b 0a 09 trlen(pValue);..
1a910 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 ...} else {.....
1a920 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 6e .ulValueLen = sn
1a930 70 72 69 6e 74 66 28 28 63 68 61 72 20 2a 29 20 printf((char *)
1a940 75 63 54 6d 70 42 75 66 2c 20 73 69 7a 65 6f 66 ucTmpBuf, sizeof
1a950 28 75 63 54 6d 70 42 75 66 29 2c 20 22 49 64 65 (ucTmpBuf), "Ide
1a960 6e 74 69 74 79 20 23 25 6c 75 22 2c 20 28 75 6e ntity #%lu", (un
1a970 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65 signed long) ide
1a980 6e 74 69 74 79 5f 6e 75 6d 29 3b 0a 09 09 09 09 ntity_num);.....
1a990 09 70 56 61 6c 75 65 20 3d 20 75 63 54 6d 70 42 .pValue = ucTmpB
1a9a0 75 66 3b 0a 0a 09 09 09 09 09 69 66 20 28 75 6c uf;.......if (ul
1a9b0 56 61 6c 75 65 4c 65 6e 20 3e 3d 20 73 69 7a 65 ValueLen >= size
1a9c0 6f 66 28 75 63 54 6d 70 42 75 66 29 29 20 7b 0a of(ucTmpBuf)) {.
1a9d0 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e ......ulValueLen
1a9e0 20 3d 20 30 3b 0a 09 09 09 09 09 09 70 56 61 6c = 0;.......pVal
1a9f0 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 ue = NULL;......
1aa00 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 }.....}......CAC
1aa10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1aa20 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 (" ... returning
1aa30 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c (%p/%lu)", pVal
1aa40 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f ue, (unsigned lo
1aa50 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b ng) ulValueLen);
1aa60 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 ......break;....
1aa70 63 61 73 65 20 43 4b 41 5f 56 41 4c 55 45 3a 0a case CKA_VALUE:.
1aa80 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
1aa90 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 _PRINTF("Request
1aaa0 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b ing attribute CK
1aab0 41 5f 56 41 4c 55 45 20 28 30 78 25 30 38 6c 78 A_VALUE (0x%08lx
1aac0 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 ) ...", (unsigne
1aad0 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 d long) curr_att
1aae0 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 73 77 r_type);......sw
1aaf0 69 74 63 68 20 28 6f 62 6a 65 63 74 63 6c 61 73 itch (objectclas
1ab00 73 29 20 7b 0a 09 09 09 09 09 63 61 73 65 20 43 s) {......case C
1ab10 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 3a 0a KO_PRIVATE_KEY:.
1ab20 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 ......CACKEY_DEB
1ab30 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 UG_PRINTF(" ...
1ab40 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 but not getting
1ab50 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 it because we ar
1ab60 65 20 61 20 70 72 69 76 61 74 65 20 6b 65 79 2e e a private key.
1ab70 22 29 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b ");........break
1ab80 3b 0a 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f ;......case CKO_
1ab90 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 3a 0a NETSCAPE_TRUST:.
1aba0 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 ......CACKEY_DEB
1abb0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 UG_PRINTF(" ...
1abc0 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 but not getting
1abd0 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 it because we ar
1abe0 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 e a Netscape tru
1abf0 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 st object");....
1ac00 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 ....break;......
1ac10 63 61 73 65 20 43 4b 4f 5f 50 55 42 4c 49 43 5f case CKO_PUBLIC_
1ac20 4b 45 59 3a 0a 09 09 09 09 09 09 69 66 20 28 63 KEY:.......if (c
1ac30 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e ertificate_len >
1ac40 3d 20 30 29 20 7b 0a 09 09 09 09 09 09 09 78 35 = 0) {........x5
1ac50 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 09_read_ret = x5
1ac60 30 39 5f 74 6f 5f 70 75 62 6b 65 79 28 63 65 72 09_to_pubkey(cer
1ac70 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 tificate, certif
1ac80 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c icate_len, &pVal
1ac90 75 65 29 3b 0a 09 09 09 09 09 09 09 69 66 20 28 ue);........if (
1aca0 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 x509_read_ret <
1acb0 30 29 20 7b 20 0a 09 09 09 09 09 09 09 09 70 56 0) { .........pV
1acc0 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 alue = NULL;....
1acd0 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 ....} else {....
1ace0 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 .....ulValueLen
1acf0 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b = x509_read_ret;
1ad00 0a 09 09 09 09 09 09 09 7d 0a 09 09 09 09 09 09 ........}.......
1ad10 7d 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a }........break;.
1ad20 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 43 45 .....case CKO_CE
1ad30 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09 09 09 RTIFICATE:......
1ad40 09 70 56 61 6c 75 65 20 3d 20 63 65 72 74 69 66 .pValue = certif
1ad50 69 63 61 74 65 3b 0a 09 09 09 09 09 09 75 6c 56 icate;.......ulV
1ad60 61 6c 75 65 4c 65 6e 20 3d 20 63 65 72 74 69 66 alueLen = certif
1ad70 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09 09 09 09 icate_len;......
1ad80 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a ..break;.....}..
1ad90 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
1ada0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 _PRINTF(" ... re
1adb0 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c turning %p/%lu",
1adc0 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e pValue, (unsign
1add0 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 ed long) ulValue
1ade0 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b Len);......break
1adf0 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 49 53 ;....case CKA_IS
1ae00 53 55 45 52 3a 0a 09 09 09 09 43 41 43 4b 45 59 SUER:.....CACKEY
1ae10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
1ae20 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 equesting attrib
1ae30 75 74 65 20 43 4b 41 5f 49 53 53 55 45 52 20 28 ute CKA_ISSUER (
1ae40 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 0x%08lx) ...", (
1ae50 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 unsigned long) c
1ae60 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a urr_attr_type);.
1ae70 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 .....if (objectc
1ae80 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 lass != CKO_CERT
1ae90 49 46 49 43 41 54 45 20 26 26 20 6f 62 6a 65 63 IFICATE && objec
1aea0 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 tclass != CKO_NE
1aeb0 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a TSCAPE_TRUST) {.
1aec0 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
1aed0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 G_PRINTF(" ... b
1aee0 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 ut not getting i
1aef0 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 t because we are
1af00 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63 61 not a certifica
1af10 74 65 20 6f 72 20 4e 65 74 73 63 61 70 65 20 74 te or Netscape t
1af20 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a rust object");..
1af30 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 .....break;.....
1af40 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74 69 }......if (certi
1af50 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 ficate_len >= 0)
1af60 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65 61 {......x509_rea
1af70 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f d_ret = x509_to_
1af80 69 73 73 75 65 72 28 63 65 72 74 69 66 69 63 61 issuer(certifica
1af90 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f te, certificate_
1afa0 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 len, &pValue);..
1afb0 09 09 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 ....if (x509_rea
1afc0 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 d_ret < 0) {....
1afd0 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c ...pValue = NULL
1afe0 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a ;......} else {.
1aff0 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e ......ulValueLen
1b000 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 = x509_read_ret
1b010 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a ;......}.....}..
1b020 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
1b030 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 _PRINTF(" ... re
1b040 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c turning %p/%lu",
1b050 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e pValue, (unsign
1b060 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 ed long) ulValue
1b070 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b Len);......break
1b080 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53 45 ;....case CKA_SE
1b090 52 49 41 4c 5f 4e 55 4d 42 45 52 3a 0a 09 09 09 RIAL_NUMBER:....
1b0a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1b0b0 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 INTF("Requesting
1b0c0 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 attribute CKA_S
1b0d0 45 52 49 41 4c 5f 4e 55 4d 42 45 52 20 28 30 78 ERIAL_NUMBER (0x
1b0e0 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e %08lx) ...", (un
1b0f0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 signed long) cur
1b100 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 r_attr_type);...
1b110 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 ...if (objectcla
1b120 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 ss != CKO_CERTIF
1b130 49 43 41 54 45 20 26 26 20 6f 62 6a 65 63 74 63 ICATE && objectc
1b140 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 lass != CKO_NETS
1b150 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 CAPE_TRUST) {...
1b160 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1b170 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 PRINTF(" ... but
1b180 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 not getting it
1b190 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e because we are n
1b1a0 6f 74 20 61 20 63 65 72 74 69 66 69 63 61 74 65 ot a certificate
1b1b0 20 6f 72 20 4e 65 74 73 63 61 70 65 20 74 72 75 or Netscape tru
1b1c0 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 st object");....
1b1d0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a ...break;.....}.
1b1e0 0a 09 09 09 09 69 66 20 28 63 65 72 74 69 66 69 .....if (certifi
1b1f0 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b cate_len >= 0) {
1b200 0a 09 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f ......x509_read_
1b210 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 73 65 ret = x509_to_se
1b220 72 69 61 6c 28 63 65 72 74 69 66 69 63 61 74 65 rial(certificate
1b230 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 , certificate_le
1b240 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 n, &pValue);....
1b250 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f ..if (x509_read_
1b260 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 ret < 0) {......
1b270 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a .pValue = NULL;.
1b280 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 .....} else {...
1b290 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d ....ulValueLen =
1b2a0 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a x509_read_ret;.
1b2b0 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 .....}.....}....
1b2c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1b2d0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 RINTF(" ... retu
1b2e0 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c rning (%p/%lu)",
1b2f0 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e pValue, (unsign
1b300 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 ed long) ulValue
1b310 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b Len);......break
1b320 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53 55 ;....case CKA_SU
1b330 42 4a 45 43 54 3a 0a 09 09 09 09 43 41 43 4b 45 BJECT:.....CACKE
1b340 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1b350 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 Requesting attri
1b360 62 75 74 65 20 43 4b 41 5f 53 55 42 4a 45 43 54 bute CKA_SUBJECT
1b370 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c (0x%08lx) ...",
1b380 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
1b390 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 curr_attr_type)
1b3a0 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 ;......if (objec
1b3b0 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 tclass != CKO_CE
1b3c0 52 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09 RTIFICATE) {....
1b3d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1b3e0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 RINTF(" ... but
1b3f0 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 not getting it b
1b400 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f ecause we are no
1b410 74 20 61 20 63 65 72 74 69 66 69 63 61 74 65 22 t a certificate"
1b420 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a );.......break;.
1b430 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 ....}......if (c
1b440 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e ertificate_len >
1b450 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 = 0) {......x509
1b460 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 _read_ret = x509
1b470 5f 74 6f 5f 73 75 62 6a 65 63 74 28 63 65 72 74 _to_subject(cert
1b480 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 ificate, certifi
1b490 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 cate_len, &pValu
1b4a0 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 e);......if (x50
1b4b0 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 9_read_ret < 0)
1b4c0 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d {.......pValue =
1b4d0 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c NULL;......} el
1b4e0 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c se {.......ulVal
1b4f0 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 ueLen = x509_rea
1b500 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 d_ret;......}...
1b510 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f ..}......CACKEY_
1b520 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e DEBUG_PRINTF(" .
1b530 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f .. returning %p/
1b540 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 %lu", pValue, (u
1b550 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c nsigned long) ul
1b560 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 ValueLen);......
1b570 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 break;....case C
1b580 4b 41 5f 49 44 3a 0a 09 09 09 09 43 41 43 4b 45 KA_ID:.....CACKE
1b590 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1b5a0 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 Requesting attri
1b5b0 62 75 74 65 20 43 4b 41 5f 49 44 20 28 30 78 25 bute CKA_ID (0x%
1b5c0 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 08lx) ...", (uns
1b5d0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 igned long) curr
1b5e0 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 _attr_type);....
1b5f0 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 ..if (objectclas
1b600 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 s == CKO_NETSCAP
1b610 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 E_TRUST) {......
1b620 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1b630 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f NTF(" ... but no
1b640 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 t getting it bec
1b650 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 ause we are a Ne
1b660 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a tscape trust obj
1b670 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 ect");.......bre
1b680 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 75 ak;.....}......u
1b690 63 54 6d 70 42 75 66 5b 30 5d 20 3d 20 28 28 69 cTmpBuf[0] = ((i
1b6a0 64 65 6e 74 69 74 79 5f 6e 75 6d 20 2b 20 31 29 dentity_num + 1)
1b6b0 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 09 >> 8) & 0xff;..
1b6c0 09 09 09 75 63 54 6d 70 42 75 66 5b 31 5d 20 3d ...ucTmpBuf[1] =
1b6d0 20 20 28 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 (identity_num
1b6e0 2b 20 31 29 20 26 20 30 78 66 66 3b 0a 0a 09 09 + 1) & 0xff;....
1b6f0 09 09 70 56 61 6c 75 65 20 3d 20 26 75 63 54 6d ..pValue = &ucTm
1b700 70 42 75 66 3b 0a 09 09 09 09 75 6c 56 61 6c 75 pBuf;.....ulValu
1b710 65 4c 65 6e 20 3d 20 32 3b 0a 0a 09 09 09 09 43 eLen = 2;......C
1b720 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1b730 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 TF(" ... returni
1b740 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c ng %p/%lu", pVal
1b750 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f ue, (unsigned lo
1b760 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b ng) ulValueLen);
1b770 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 ......break;....
1b780 63 61 73 65 20 43 4b 41 5f 43 45 52 54 49 46 49 case CKA_CERTIFI
1b790 43 41 54 45 5f 54 59 50 45 3a 0a 09 09 09 09 43 CATE_TYPE:.....C
1b7a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1b7b0 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 TF("Requesting a
1b7c0 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43 45 52 ttribute CKA_CER
1b7d0 54 49 46 49 43 41 54 45 5f 54 59 50 45 20 28 30 TIFICATE_TYPE (0
1b7e0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 x%08lx) ...", (u
1b7f0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 nsigned long) cu
1b800 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a rr_attr_type);..
1b810 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c ....if (objectcl
1b820 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 ass != CKO_CERTI
1b830 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09 09 43 FICATE) {......C
1b840 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1b850 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 TF(" ... but not
1b860 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 getting it beca
1b870 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 use we are not a
1b880 20 63 65 72 74 69 66 69 63 61 74 65 2e 22 29 3b certificate.");
1b890 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 .......break;...
1b8a0 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 57 65 20 6f ..}....../* We o
1b8b0 6e 6c 79 20 73 75 70 70 6f 72 74 20 6f 6e 65 20 nly support one
1b8c0 63 65 72 74 69 66 69 63 61 74 65 20 74 79 70 65 certificate type
1b8d0 20 2a 2f 0a 09 09 09 09 63 6b 5f 63 65 72 74 69 */.....ck_certi
1b8e0 66 69 63 61 74 65 5f 74 79 70 65 20 3d 20 43 4b ficate_type = CK
1b8f0 43 5f 58 5f 35 30 39 3b 0a 0a 09 09 09 09 70 56 C_X_509;......pV
1b900 61 6c 75 65 20 3d 20 26 63 6b 5f 63 65 72 74 69 alue = &ck_certi
1b910 66 69 63 61 74 65 5f 74 79 70 65 3b 0a 09 09 09 ficate_type;....
1b920 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 .ulValueLen = si
1b930 7a 65 6f 66 28 63 6b 5f 63 65 72 74 69 66 69 63 zeof(ck_certific
1b940 61 74 65 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 ate_type);......
1b950 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1b960 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e NTF(" ... return
1b970 69 6e 67 20 43 4b 43 5f 58 5f 35 30 39 20 28 25 ing CKC_X_509 (%
1b980 6c 75 29 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 lu) (%p/%lu)", (
1b990 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a unsigned long) *
1b9a0 28 28 43 4b 5f 43 45 52 54 49 46 49 43 41 54 45 ((CK_CERTIFICATE
1b9b0 5f 54 59 50 45 20 2a 29 20 70 56 61 6c 75 65 29 _TYPE *) pValue)
1b9c0 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 , pValue, (unsig
1b9d0 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 ned long) ulValu
1b9e0 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 eLen);......brea
1b9f0 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4b k;....case CKA_K
1ba00 45 59 5f 54 59 50 45 3a 0a 09 09 09 09 43 41 43 EY_TYPE:.....CAC
1ba10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1ba20 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 ("Requesting att
1ba30 72 69 62 75 74 65 20 43 4b 41 5f 4b 45 59 5f 54 ribute CKA_KEY_T
1ba40 59 50 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e YPE (0x%08lx) ..
1ba50 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f .", (unsigned lo
1ba60 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 ng) curr_attr_ty
1ba70 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 pe);......if (ob
1ba80 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f jectclass != CKO
1ba90 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 26 26 20 _PRIVATE_KEY &&
1baa0 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 objectclass != C
1bab0 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 29 20 7b KO_PUBLIC_KEY) {
1bac0 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 ......CACKEY_DEB
1bad0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 UG_PRINTF(" ...
1bae0 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 but not getting
1baf0 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 it because we ar
1bb00 65 20 6e 6f 74 20 61 20 6b 65 79 2e 22 29 3b 0a e not a key.");.
1bb10 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 ......break;....
1bb20 09 7d 0a 0a 09 09 09 09 2f 2a 20 57 65 20 6f 6e .}....../* We on
1bb30 6c 79 20 73 75 70 70 6f 72 74 20 6f 6e 65 20 6b ly support one k
1bb40 65 79 20 74 79 70 65 20 2a 2f 0a 09 09 09 09 63 ey type */.....c
1bb50 6b 5f 6b 65 79 5f 74 79 70 65 20 3d 20 43 4b 4b k_key_type = CKK
1bb60 5f 52 53 41 3b 0a 0a 09 09 09 09 70 56 61 6c 75 _RSA;......pValu
1bb70 65 20 3d 20 26 63 6b 5f 6b 65 79 5f 74 79 70 65 e = &ck_key_type
1bb80 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e ;.....ulValueLen
1bb90 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 6b 65 79 = sizeof(ck_key
1bba0 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 43 41 43 _type);......CAC
1bbb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1bbc0 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 (" ... returning
1bbd0 20 43 4b 4b 5f 52 53 41 20 28 25 6c 75 29 20 28 CKK_RSA (%lu) (
1bbe0 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 %p/%lu)", (unsig
1bbf0 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f ned long) *((CK_
1bc00 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 CERTIFICATE_TYPE
1bc10 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 *) pValue), pVa
1bc20 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c lue, (unsigned l
1bc30 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 ong) ulValueLen)
1bc40 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 ;......break;...
1bc50 09 63 61 73 65 20 43 4b 41 5f 53 49 47 4e 3a 0a .case CKA_SIGN:.
1bc60 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
1bc70 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 _PRINTF("Request
1bc80 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b ing attribute CK
1bc90 41 5f 53 49 47 4e 20 28 30 78 25 30 38 6c 78 29 A_SIGN (0x%08lx)
1bca0 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 ...", (unsigned
1bcb0 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 long) curr_attr
1bcc0 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 _type);......if
1bcd0 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 (objectclass ==
1bce0 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 CKO_NETSCAPE_TRU
1bcf0 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 ST) {......CACKE
1bd00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1bd10 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 ... but not get
1bd20 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 ting it because
1bd30 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 we are a Netscap
1bd40 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 e trust object")
1bd50 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 ;.......break;..
1bd60 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62 ...}......if (ob
1bd70 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f jectclass == CKO
1bd80 5f 50 52 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a _PRIVATE_KEY) {.
1bd90 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 .....pValue = &c
1bda0 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 k_true;......ulV
1bdb0 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 alueLen = sizeof
1bdc0 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d (ck_true);.....}
1bdd0 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61 else {......pVa
1bde0 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b lue = &ck_false;
1bdf0 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e ......ulValueLen
1be00 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c = sizeof(ck_fal
1be10 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 se);.....}......
1be20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1be30 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e NTF(" ... return
1be40 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 ing %lu (%p/%lu)
1be50 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e ", (unsigned lon
1be60 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a g) *((CK_BBOOL *
1be70 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 ) pValue), pValu
1be80 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e e, (unsigned lon
1be90 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a g) ulValueLen);.
1bea0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 .....break;....c
1beb0 61 73 65 20 43 4b 41 5f 53 49 47 4e 5f 52 45 43 ase CKA_SIGN_REC
1bec0 4f 56 45 52 3a 0a 09 09 09 09 43 41 43 4b 45 59 OVER:.....CACKEY
1bed0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
1bee0 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 equesting attrib
1bef0 75 74 65 20 43 4b 41 5f 53 49 47 4e 5f 52 45 43 ute CKA_SIGN_REC
1bf00 4f 56 45 52 20 28 30 78 25 30 38 6c 78 29 20 2e OVER (0x%08lx) .
1bf10 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c ..", (unsigned l
1bf20 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 ong) curr_attr_t
1bf30 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f ype);......if (o
1bf40 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b bjectclass == CK
1bf50 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 O_NETSCAPE_TRUST
1bf60 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f ) {......CACKEY_
1bf70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e DEBUG_PRINTF(" .
1bf80 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 .. but not getti
1bf90 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 ng it because we
1bfa0 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 are a Netscape
1bfb0 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a trust object");.
1bfc0 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 ......break;....
1bfd0 09 7d 0a 0a 09 09 09 09 2f 2a 20 57 65 20 63 75 .}....../* We cu
1bfe0 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 73 75 70 rrently only sup
1bff0 70 6f 72 74 20 22 53 69 67 6e 20 77 69 74 68 20 port "Sign with
1c000 41 70 70 65 6e 64 69 78 22 20 2a 2f 0a 09 09 09 Appendix" */....
1c010 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 .pValue = &ck_fa
1c020 6c 73 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 lse;.....ulValue
1c030 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f Len = sizeof(ck_
1c040 66 61 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41 43 false);......CAC
1c050 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1c060 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 (" ... returning
1c070 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 %lu (%p/%lu)",
1c080 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
1c090 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 *((CK_BBOOL *) p
1c0a0 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 Value), pValue,
1c0b0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
1c0c0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 ulValueLen);....
1c0d0 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 ..break;....case
1c0e0 20 43 4b 41 5f 44 45 43 52 59 50 54 3a 0a 09 09 CKA_DECRYPT:...
1c0f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1c100 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e RINTF("Requestin
1c110 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f g attribute CKA_
1c120 44 45 43 52 59 50 54 20 28 30 78 25 30 38 6c 78 DECRYPT (0x%08lx
1c130 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 ) ...", (unsigne
1c140 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 d long) curr_att
1c150 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 r_type);......if
1c160 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d (objectclass ==
1c170 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 CKO_NETSCAPE_TR
1c180 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b UST) {......CACK
1c190 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1c1a0 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 " ... but not ge
1c1b0 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 tting it because
1c1c0 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 we are a Netsca
1c1d0 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 pe trust object"
1c1e0 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a );.......break;.
1c1f0 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f ....}......if (o
1c200 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b bjectclass == CK
1c210 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 7c 7c O_PRIVATE_KEY ||
1c220 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 objectclass ==
1c230 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 29 20 CKO_PUBLIC_KEY)
1c240 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 {......pValue =
1c250 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 &ck_true;......u
1c260 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 lValueLen = size
1c270 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 of(ck_true);....
1c280 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 .} else {......p
1c290 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 Value = &ck_fals
1c2a0 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c e;......ulValueL
1c2b0 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 en = sizeof(ck_f
1c2c0 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 alse);.....}....
1c2d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1c2e0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 RINTF(" ... retu
1c2f0 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c rning %lu (%p/%l
1c300 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c u)", (unsigned l
1c310 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c ong) *((CK_BBOOL
1c320 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 *) pValue), pVa
1c330 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c lue, (unsigned l
1c340 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 ong) ulValueLen)
1c350 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 ;......break;...
1c360 09 63 61 73 65 20 43 4b 41 5f 53 45 4e 53 49 54 .case CKA_SENSIT
1c370 49 56 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f IVE:.....CACKEY_
1c380 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
1c390 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 questing attribu
1c3a0 74 65 20 43 4b 41 5f 53 45 4e 53 49 54 49 56 45 te CKA_SENSITIVE
1c3b0 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c (0x%08lx) ...",
1c3c0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
1c3d0 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 curr_attr_type)
1c3e0 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 ;......if (objec
1c3f0 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 tclass == CKO_NE
1c400 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a TSCAPE_TRUST) {.
1c410 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
1c420 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 G_PRINTF(" ... b
1c430 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 ut not getting i
1c440 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 t because we are
1c450 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 a Netscape trus
1c460 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 t object");.....
1c470 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a ..break;.....}..
1c480 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c ....if (objectcl
1c490 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 ass == CKO_PRIVA
1c4a0 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 TE_KEY) {......p
1c4b0 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 Value = &ck_true
1c4c0 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 ;......ulValueLe
1c4d0 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 n = sizeof(ck_tr
1c4e0 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 ue);.....} else
1c4f0 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 {......pValue =
1c500 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 &ck_false;......
1c510 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a ulValueLen = siz
1c520 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 eof(ck_false);..
1c530 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 ...}......CACKEY
1c540 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 _DEBUG_PRINTF("
1c550 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c ... returning %l
1c560 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e u (%p/%lu)", (un
1c570 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 signed long) *((
1c580 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c CK_BBOOL *) pVal
1c590 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e ue), pValue, (un
1c5a0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 signed long) ulV
1c5b0 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 alueLen);......b
1c5c0 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b reak;....case CK
1c5d0 41 5f 45 58 54 52 41 43 54 41 42 4c 45 3a 0a 09 A_EXTRACTABLE:..
1c5e0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1c5f0 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 PRINTF("Requesti
1c600 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 ng attribute CKA
1c610 5f 45 58 54 52 41 43 54 41 42 4c 45 20 28 30 78 _EXTRACTABLE (0x
1c620 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e %08lx) ...", (un
1c630 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 signed long) cur
1c640 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 r_attr_type);...
1c650 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 ...if (objectcla
1c660 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 ss == CKO_NETSCA
1c670 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 PE_TRUST) {.....
1c680 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1c690 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e INTF(" ... but n
1c6a0 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 ot getting it be
1c6b0 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e cause we are a N
1c6c0 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 etscape trust ob
1c6d0 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 ject");.......br
1c6e0 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 eak;.....}......
1c6f0 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 if (objectclass
1c700 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b == CKO_PRIVATE_K
1c710 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 EY) {......pValu
1c720 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 e = &ck_false;..
1c730 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d ....ulValueLen =
1c740 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 sizeof(ck_true)
1c750 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 ;.....} else {..
1c760 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b ....pValue = &ck
1c770 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 _true;......ulVa
1c780 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 lueLen = sizeof(
1c790 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d ck_false);.....}
1c7a0 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 ......CACKEY_DEB
1c7b0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 UG_PRINTF(" ...
1c7c0 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 returning %lu (%
1c7d0 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e p/%lu)", (unsign
1c7e0 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 ed long) *((CK_B
1c7f0 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c BOOL *) pValue),
1c800 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e pValue, (unsign
1c810 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 ed long) ulValue
1c820 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b Len);......break
1c830 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f ;....case CKA_MO
1c840 44 55 4c 55 53 3a 0a 09 09 09 09 43 41 43 4b 45 DULUS:.....CACKE
1c850 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1c860 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 Requesting attri
1c870 62 75 74 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 bute CKA_MODULUS
1c880 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c (0x%08lx) ...",
1c890 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
1c8a0 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 curr_attr_type)
1c8b0 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 ;......if (objec
1c8c0 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 tclass == CKO_NE
1c8d0 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a TSCAPE_TRUST) {.
1c8e0 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
1c8f0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 G_PRINTF(" ... b
1c900 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 ut not getting i
1c910 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 t because we are
1c920 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 a Netscape trus
1c930 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 t object");.....
1c940 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a ..break;.....}..
1c950 09 09 09 09 69 66 20 28 63 65 72 74 69 66 69 63 ....if (certific
1c960 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a ate_len >= 0) {.
1c970 09 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 .....x509_read_r
1c980 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 6d 6f 64 et = x509_to_mod
1c990 75 6c 75 73 28 63 65 72 74 69 66 69 63 61 74 65 ulus(certificate
1c9a0 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 , certificate_le
1c9b0 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 n, &pValue);....
1c9c0 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f ..if (x509_read_
1c9d0 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 ret < 0) {......
1c9e0 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a .pValue = NULL;.
1c9f0 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 .....} else {...
1ca00 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d ....ulValueLen =
1ca10 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a x509_read_ret;.
1ca20 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 .....}.....}....
1ca30 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1ca40 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 RINTF(" ... retu
1ca50 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c rning (%p/%lu)",
1ca60 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e pValue, (unsign
1ca70 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 ed long) ulValue
1ca80 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b Len);......break
1ca90 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 50 55 ;....case CKA_PU
1caa0 42 4c 49 43 5f 45 58 50 4f 4e 45 4e 54 3a 0a 09 BLIC_EXPONENT:..
1cab0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1cac0 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 PRINTF("Requesti
1cad0 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 ng attribute CKA
1cae0 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45 4e 54 _PUBLIC_EXPONENT
1caf0 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c (0x%08lx) ...",
1cb00 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
1cb10 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 curr_attr_type)
1cb20 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 ;......if (objec
1cb30 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 tclass == CKO_NE
1cb40 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a TSCAPE_TRUST) {.
1cb50 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
1cb60 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 G_PRINTF(" ... b
1cb70 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 ut not getting i
1cb80 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 t because we are
1cb90 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 a Netscape trus
1cba0 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 t object");.....
1cbb0 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a ..break;.....}..
1cbc0 09 09 09 09 69 66 20 28 63 65 72 74 69 66 69 63 ....if (certific
1cbd0 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a ate_len >= 0) {.
1cbe0 09 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 .....x509_read_r
1cbf0 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 65 78 70 et = x509_to_exp
1cc00 6f 6e 65 6e 74 28 63 65 72 74 69 66 69 63 61 74 onent(certificat
1cc10 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c e, certificate_l
1cc20 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 en, &pValue);...
1cc30 09 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 ...if (x509_read
1cc40 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 _ret < 0) {.....
1cc50 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b ..pValue = NULL;
1cc60 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 ......} else {..
1cc70 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 .....ulValueLen
1cc80 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b = x509_read_ret;
1cc90 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 ......}.....}...
1cca0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1ccb0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 PRINTF(" ... ret
1ccc0 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 urning (%p/%lu)"
1ccd0 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 , pValue, (unsig
1cce0 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 ned long) ulValu
1ccf0 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 eLen);......brea
1cd00 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 k;....case CKA_T
1cd10 52 55 53 54 5f 44 49 47 49 54 41 4c 5f 53 49 47 RUST_DIGITAL_SIG
1cd20 4e 41 54 55 52 45 3a 0a 09 09 09 63 61 73 65 20 NATURE:....case
1cd30 43 4b 41 5f 54 52 55 53 54 5f 4e 4f 4e 5f 52 45 CKA_TRUST_NON_RE
1cd40 50 55 44 49 41 54 49 4f 4e 3a 0a 09 09 09 63 61 PUDIATION:....ca
1cd50 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59 se CKA_TRUST_KEY
1cd60 5f 45 4e 43 49 50 48 45 52 4d 45 4e 54 3a 0a 09 _ENCIPHERMENT:..
1cd70 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 ..case CKA_TRUST
1cd80 5f 44 41 54 41 5f 45 4e 43 49 50 48 45 52 4d 45 _DATA_ENCIPHERME
1cd90 4e 54 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f NT:....case CKA_
1cda0 54 52 55 53 54 5f 4b 45 59 5f 41 47 52 45 45 4d TRUST_KEY_AGREEM
1cdb0 45 4e 54 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 ENT:....case CKA
1cdc0 5f 54 52 55 53 54 5f 4b 45 59 5f 43 45 52 54 5f _TRUST_KEY_CERT_
1cdd0 53 49 47 4e 3a 0a 09 09 09 63 61 73 65 20 43 4b SIGN:....case CK
1cde0 41 5f 54 52 55 53 54 5f 43 52 4c 5f 53 49 47 4e A_TRUST_CRL_SIGN
1cdf0 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 :....case CKA_TR
1ce00 55 53 54 5f 53 45 52 56 45 52 5f 41 55 54 48 3a UST_SERVER_AUTH:
1ce10 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 ....case CKA_TRU
1ce20 53 54 5f 43 4c 49 45 4e 54 5f 41 55 54 48 3a 0a ST_CLIENT_AUTH:.
1ce30 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 ...case CKA_TRUS
1ce40 54 5f 43 4f 44 45 5f 53 49 47 4e 49 4e 47 3a 0a T_CODE_SIGNING:.
1ce50 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 ...case CKA_TRUS
1ce60 54 5f 45 4d 41 49 4c 5f 50 52 4f 54 45 43 54 49 T_EMAIL_PROTECTI
1ce70 4f 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 ON:.....CACKEY_D
1ce80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 EBUG_PRINTF("Req
1ce90 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 uesting attribut
1cea0 65 20 43 4b 41 5f 54 52 55 53 54 5f 2e 2e 2e 20 e CKA_TRUST_...
1ceb0 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 (0x%08lx) ...",
1cec0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
1ced0 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b curr_attr_type);
1cee0 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 ......pValue = &
1cef0 63 6b 5f 74 72 75 73 74 65 64 3b 0a 09 09 09 09 ck_trusted;.....
1cf00 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a ulValueLen = siz
1cf10 65 6f 66 28 63 6b 5f 74 72 75 73 74 65 64 29 3b eof(ck_trusted);
1cf20 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 ......CACKEY_DEB
1cf30 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 UG_PRINTF(" ...
1cf40 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 returning %lu (%
1cf50 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e p/%lu)", (unsign
1cf60 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 54 ed long) *((CK_T
1cf70 52 55 53 54 20 2a 29 20 70 56 61 6c 75 65 29 2c RUST *) pValue),
1cf80 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e pValue, (unsign
1cf90 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 ed long) ulValue
1cfa0 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b Len);......break
1cfb0 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43 45 ;....case CKA_CE
1cfc0 52 54 5f 53 48 41 31 5f 48 41 53 48 3a 0a 09 09 RT_SHA1_HASH:...
1cfd0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1cfe0 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e RINTF("Requestin
1cff0 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f g attribute CKA_
1d000 43 45 52 54 5f 53 48 41 31 5f 48 41 53 48 20 28 CERT_SHA1_HASH (
1d010 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 0x%08lx) ...", (
1d020 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 unsigned long) c
1d030 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a urr_attr_type);.
1d040 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 .....if (objectc
1d050 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 lass != CKO_NETS
1d060 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 CAPE_TRUST) {...
1d070 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1d080 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 PRINTF(" ... but
1d090 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 not getting it
1d0a0 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e because we are n
1d0b0 6f 74 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 ot a Netscape tr
1d0c0 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 ust object");...
1d0d0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d ....break;.....}
1d0e0 0a 0a 09 09 09 09 53 48 41 31 52 65 73 65 74 28 ......SHA1Reset(
1d0f0 26 73 68 61 31 5f 63 74 78 29 3b 0a 09 09 09 09 &sha1_ctx);.....
1d100 53 48 41 31 49 6e 70 75 74 28 26 73 68 61 31 5f SHA1Input(&sha1_
1d110 63 74 78 2c 20 63 65 72 74 69 66 69 63 61 74 65 ctx, certificate
1d120 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 , certificate_le
1d130 6e 29 3b 0a 09 09 09 09 53 48 41 31 52 65 73 75 n);.....SHA1Resu
1d140 6c 74 28 26 73 68 61 31 5f 63 74 78 2c 20 73 68 lt(&sha1_ctx, sh
1d150 61 31 5f 68 61 73 68 29 3b 0a 0a 09 09 09 09 70 a1_hash);......p
1d160 56 61 6c 75 65 20 3d 20 73 68 61 31 5f 68 61 73 Value = sha1_has
1d170 68 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 h;.....ulValueLe
1d180 6e 20 3d 20 73 69 7a 65 6f 66 28 73 68 61 31 5f n = sizeof(sha1_
1d190 68 61 73 68 29 3b 0a 0a 09 09 09 09 43 41 43 4b hash);......CACK
1d1a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1d1b0 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 " ... returning
1d1c0 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c %p/%lu", pValue,
1d1d0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
1d1e0 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 ulValueLen);...
1d1f0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 ...break;....cas
1d200 65 20 43 4b 41 5f 43 45 52 54 5f 4d 44 35 5f 48 e CKA_CERT_MD5_H
1d210 41 53 48 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f ASH:.....CACKEY_
1d220 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
1d230 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 questing attribu
1d240 74 65 20 43 4b 41 5f 43 45 52 54 5f 4d 44 35 5f te CKA_CERT_MD5_
1d250 48 41 53 48 20 28 30 78 25 30 38 6c 78 29 20 2e HASH (0x%08lx) .
1d260 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c ..", (unsigned l
1d270 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 ong) curr_attr_t
1d280 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f ype);......if (o
1d290 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b bjectclass != CK
1d2a0 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 O_NETSCAPE_TRUST
1d2b0 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f ) {......CACKEY_
1d2c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e DEBUG_PRINTF(" .
1d2d0 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 .. but not getti
1d2e0 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 ng it because we
1d2f0 20 61 72 65 20 6e 6f 74 20 61 20 4e 65 74 73 63 are not a Netsc
1d300 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 ape trust object
1d310 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b ");.......break;
1d320 0a 09 09 09 09 7d 0a 0a 09 09 09 09 4d 44 35 49 .....}......MD5I
1d330 6e 69 74 28 26 6d 64 35 5f 63 74 78 29 3b 0a 09 nit(&md5_ctx);..
1d340 09 09 09 4d 44 35 55 70 64 61 74 65 28 26 6d 64 ...MD5Update(&md
1d350 35 5f 63 74 78 2c 20 63 65 72 74 69 66 69 63 61 5_ctx, certifica
1d360 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f te, certificate_
1d370 6c 65 6e 29 3b 0a 09 09 09 09 4d 44 35 46 69 6e len);.....MD5Fin
1d380 61 6c 28 6d 64 35 5f 68 61 73 68 2c 20 26 6d 64 al(md5_hash, &md
1d390 35 5f 63 74 78 29 3b 0a 0a 09 09 09 09 70 56 61 5_ctx);......pVa
1d3a0 6c 75 65 20 3d 20 6d 64 35 5f 68 61 73 68 3b 0a lue = md5_hash;.
1d3b0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d ....ulValueLen =
1d3c0 20 73 69 7a 65 6f 66 28 6d 64 35 5f 68 61 73 68 sizeof(md5_hash
1d3d0 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 );......CACKEY_D
1d3e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e EBUG_PRINTF(" ..
1d3f0 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 . returning %p/%
1d400 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e lu", pValue, (un
1d410 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 signed long) ulV
1d420 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 alueLen);......b
1d430 72 65 61 6b 3b 0a 09 09 09 64 65 66 61 75 6c 74 reak;....default
1d440 3a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e :.....pValue = N
1d450 55 4c 4c 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 ULL;.....ulValue
1d460 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 Len = (CK_LONG)
1d470 2d 31 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 -1;.....break;..
1d480 09 7d 0a 0a 09 09 69 66 20 28 28 28 43 4b 5f 4c .}....if (((CK_L
1d490 4f 4e 47 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 ONG) ulValueLen)
1d4a0 20 21 3d 20 28 28 43 4b 5f 4c 4f 4e 47 29 20 2d != ((CK_LONG) -
1d4b0 31 29 29 20 7b 0a 09 09 09 2f 2a 20 50 75 73 68 1)) {..../* Push
1d4c0 20 63 75 72 72 5f 61 74 74 72 20 6f 6e 74 6f 20 curr_attr onto
1d4d0 74 68 65 20 73 74 61 63 6b 20 2a 2f 0a 09 09 09 the stack */....
1d4e0 63 75 72 72 5f 61 74 74 72 2e 74 79 70 65 20 3d curr_attr.type =
1d4f0 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 3b curr_attr_type;
1d500 0a 09 09 09 63 75 72 72 5f 61 74 74 72 2e 75 6c ....curr_attr.ul
1d510 56 61 6c 75 65 4c 65 6e 20 3d 20 75 6c 56 61 6c ValueLen = ulVal
1d520 75 65 4c 65 6e 3b 0a 0a 09 09 09 63 75 72 72 5f ueLen;.....curr_
1d530 61 74 74 72 2e 70 56 61 6c 75 65 20 3d 20 6d 61 attr.pValue = ma
1d540 6c 6c 6f 63 28 63 75 72 72 5f 61 74 74 72 2e 75 lloc(curr_attr.u
1d550 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 6d lValueLen);....m
1d560 65 6d 63 70 79 28 63 75 72 72 5f 61 74 74 72 2e emcpy(curr_attr.
1d570 70 56 61 6c 75 65 2c 20 70 56 61 6c 75 65 2c 20 pValue, pValue,
1d580 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75 curr_attr.ulValu
1d590 65 4c 65 6e 29 3b 0a 0a 09 09 09 69 66 20 28 70 eLen);.....if (p
1d5a0 56 61 6c 75 65 5f 66 72 65 65 20 26 26 20 70 56 Value_free && pV
1d5b0 61 6c 75 65 29 20 7b 0a 09 09 09 09 66 72 65 65 alue) {.....free
1d5c0 28 70 56 61 6c 75 65 29 3b 0a 09 09 09 7d 0a 0a (pValue);....}..
1d5d0 09 09 09 69 66 20 28 6e 75 6d 61 74 74 72 73 20 ...if (numattrs
1d5e0 3e 3d 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74 29 >= retval_count)
1d5f0 20 7b 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 {.....retval =
1d600 72 65 61 6c 6c 6f 63 28 72 65 74 76 61 6c 2c 20 realloc(retval,
1d610 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 retval_count * s
1d620 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b izeof(*retval));
1d630 0a 09 09 09 7d 0a 0a 09 09 09 6d 65 6d 63 70 79 ....}.....memcpy
1d640 28 26 72 65 74 76 61 6c 5b 6e 75 6d 61 74 74 72 (&retval[numattr
1d650 73 5d 2c 20 26 63 75 72 72 5f 61 74 74 72 2c 20 s], &curr_attr,
1d660 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 74 74 72 sizeof(curr_attr
1d670 29 29 3b 0a 09 09 09 6e 75 6d 61 74 74 72 73 2b ));....numattrs+
1d680 2b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 +;...}..}...if (
1d690 6e 75 6d 61 74 74 72 73 20 21 3d 20 30 29 20 7b numattrs != 0) {
1d6a0 0a 09 09 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 ...retval_count
1d6b0 3d 20 6e 75 6d 61 74 74 72 73 3b 0a 09 09 72 65 = numattrs;...re
1d6c0 74 76 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 72 tval = realloc(r
1d6d0 65 74 76 61 6c 2c 20 72 65 74 76 61 6c 5f 63 6f etval, retval_co
1d6e0 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 unt * sizeof(*re
1d6f0 74 76 61 6c 29 29 3b 0a 09 7d 20 65 6c 73 65 20 tval));..} else
1d700 7b 0a 09 09 66 72 65 65 28 72 65 74 76 61 6c 29 {...free(retval)
1d710 3b 0a 0a 09 09 72 65 74 76 61 6c 20 3d 20 4e 55 ;....retval = NU
1d720 4c 4c 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 43 6f 75 LL;..}...*pulCou
1d730 6e 74 20 3d 20 6e 75 6d 61 74 74 72 73 3b 0a 0a nt = numattrs;..
1d740 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1d750 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
1d760 25 6c 75 20 6f 62 6a 65 63 74 73 20 28 25 70 29 %lu objects (%p)
1d770 2e 22 2c 20 6e 75 6d 61 74 74 72 73 2c 20 28 76 .", numattrs, (v
1d780 6f 69 64 20 2a 29 20 72 65 74 76 61 6c 29 3b 0a oid *) retval);.
1d790 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 ..return(retval)
1d7a0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 ;.}..static void
1d7b0 20 63 61 63 6b 65 79 5f 66 72 65 65 5f 69 64 65 cackey_free_ide
1d7c0 6e 74 69 74 69 65 73 28 73 74 72 75 63 74 20 63 ntities(struct c
1d7d0 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a ackey_identity *
1d7e0 69 64 65 6e 74 69 74 69 65 73 2c 20 75 6e 73 69 identities, unsi
1d7f0 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 gned long identi
1d800 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 43 ties_count) {..C
1d810 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 63 75 72 K_ATTRIBUTE *cur
1d820 72 5f 61 74 74 72 3b 0a 09 75 6e 73 69 67 6e 65 r_attr;..unsigne
1d830 64 20 6c 6f 6e 67 20 69 64 5f 69 64 78 2c 20 61 d long id_idx, a
1d840 74 74 72 5f 69 64 78 3b 0a 0a 09 69 66 20 28 69 ttr_idx;...if (i
1d850 64 65 6e 74 69 74 69 65 73 20 3d 3d 20 4e 55 4c dentities == NUL
1d860 4c 20 7c 7c 20 69 64 65 6e 74 69 74 69 65 73 5f L || identities_
1d870 63 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 count == 0) {...
1d880 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 return;..}...for
1d890 20 28 69 64 5f 69 64 78 20 3d 20 30 3b 20 69 64 (id_idx = 0; id
1d8a0 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74 69 65 _idx < identitie
1d8b0 73 5f 63 6f 75 6e 74 3b 20 69 64 5f 69 64 78 2b s_count; id_idx+
1d8c0 2b 29 20 7b 0a 09 09 69 66 20 28 69 64 65 6e 74 +) {...if (ident
1d8d0 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 ities[id_idx].at
1d8e0 74 72 69 62 75 74 65 73 29 20 7b 0a 09 09 09 66 tributes) {....f
1d8f0 6f 72 20 28 61 74 74 72 5f 69 64 78 20 3d 20 30 or (attr_idx = 0
1d900 3b 20 61 74 74 72 5f 69 64 78 20 3c 20 69 64 65 ; attr_idx < ide
1d910 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e ntities[id_idx].
1d920 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 attributes_count
1d930 3b 20 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a ; attr_idx++) {.
1d940 09 09 09 09 63 75 72 72 5f 61 74 74 72 20 3d 20 ....curr_attr =
1d950 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 &identities[id_i
1d960 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5b 61 dx].attributes[a
1d970 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 09 09 69 ttr_idx];......i
1d980 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 f (curr_attr->pV
1d990 61 6c 75 65 29 20 7b 0a 09 09 09 09 09 66 72 65 alue) {......fre
1d9a0 65 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 e(curr_attr->pVa
1d9b0 6c 75 65 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d lue);.....}....}
1d9c0 0a 0a 09 09 09 69 66 20 28 69 64 65 6e 74 69 74 .....if (identit
1d9d0 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 ies[id_idx].attr
1d9e0 69 62 75 74 65 73 29 20 7b 0a 09 09 09 09 66 72 ibutes) {.....fr
1d9f0 65 65 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 ee(identities[id
1da00 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 _idx].attributes
1da10 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b );....}.....cack
1da20 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 69 64 ey_free_certs(id
1da30 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d entities[id_idx]
1da40 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2c 20 .pcsc_identity,
1da50 31 2c 20 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 1, 1);...}..}...
1da60 66 72 65 65 28 69 64 65 6e 74 69 74 69 65 73 29 free(identities)
1da70 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75 6e 73 69 ;.}..static unsi
1da80 67 6e 65 64 20 6c 6f 6e 67 20 63 61 63 6b 65 79 gned long cackey
1da90 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69 _read_dod_identi
1daa0 74 69 65 73 28 73 74 72 75 63 74 20 63 61 63 6b ties(struct cack
1dab0 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 ey_identity *ide
1dac0 6e 74 69 74 69 65 73 2c 20 75 6e 73 69 67 6e 65 ntities, unsigne
1dad0 64 20 6c 6f 6e 67 20 6e 75 6d 5f 64 6f 64 5f 63 d long num_dod_c
1dae0 65 72 74 73 29 20 7b 0a 09 75 6e 73 69 67 6e 65 erts) {..unsigne
1daf0 64 20 6c 6f 6e 67 20 63 65 72 74 5f 69 64 78 2c d long cert_idx,
1db00 20 69 64 5f 69 64 78 20 3d 20 30 3b 0a 0a 09 69 id_idx = 0;...i
1db10 66 20 28 69 64 65 6e 74 69 74 69 65 73 20 3d 3d f (identities ==
1db20 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 NULL) {...retur
1db30 6e 28 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 20 n(num_dod_certs
1db40 2a 20 33 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 * 3);..}...for (
1db50 63 65 72 74 5f 69 64 78 20 3d 20 30 3b 20 63 65 cert_idx = 0; ce
1db60 72 74 5f 69 64 78 20 3c 20 6e 75 6d 5f 64 6f 64 rt_idx < num_dod
1db70 5f 63 65 72 74 73 3b 20 63 65 72 74 5f 69 64 78 _certs; cert_idx
1db80 2b 2b 29 20 7b 0a 09 09 69 64 65 6e 74 69 74 69 ++) {...identiti
1db90 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f es[id_idx].pcsc_
1dba0 69 64 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b identity = NULL;
1dbb0 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 ...identities[id
1dbc0 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 _idx].attributes
1dbd0 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 = cackey_get_at
1dbe0 74 72 69 62 75 74 65 73 28 43 4b 4f 5f 43 45 52 tributes(CKO_CER
1dbf0 54 49 46 49 43 41 54 45 2c 20 26 65 78 74 72 61 TIFICATE, &extra
1dc00 5f 63 65 72 74 73 5b 63 65 72 74 5f 69 64 78 5d _certs[cert_idx]
1dc10 2c 20 30 78 66 30 30 30 20 7c 20 63 65 72 74 5f , 0xf000 | cert_
1dc20 69 64 78 2c 20 26 69 64 65 6e 74 69 74 69 65 73 idx, &identities
1dc30 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 [id_idx].attribu
1dc40 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 09 69 64 tes_count);...id
1dc50 5f 69 64 78 2b 2b 3b 0a 0a 09 09 69 64 65 6e 74 _idx++;....ident
1dc60 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 ities[id_idx].pc
1dc70 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 20 4e 55 sc_identity = NU
1dc80 4c 4c 3b 0a 09 09 69 64 65 6e 74 69 74 69 65 73 LL;...identities
1dc90 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 [id_idx].attribu
1dca0 74 65 73 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 tes = cackey_get
1dcb0 5f 61 74 74 72 69 62 75 74 65 73 28 43 4b 4f 5f _attributes(CKO_
1dcc0 50 55 42 4c 49 43 5f 4b 45 59 2c 20 26 65 78 74 PUBLIC_KEY, &ext
1dcd0 72 61 5f 63 65 72 74 73 5b 63 65 72 74 5f 69 64 ra_certs[cert_id
1dce0 78 5d 2c 20 30 78 66 30 30 30 20 7c 20 63 65 72 x], 0xf000 | cer
1dcf0 74 5f 69 64 78 2c 20 26 69 64 65 6e 74 69 74 69 t_idx, &identiti
1dd00 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 es[id_idx].attri
1dd10 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 09 butes_count);...
1dd20 69 64 5f 69 64 78 2b 2b 3b 0a 0a 09 09 69 64 65 id_idx++;....ide
1dd30 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e ntities[id_idx].
1dd40 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 20 pcsc_identity =
1dd50 4e 55 4c 4c 3b 0a 09 09 69 64 65 6e 74 69 74 69 NULL;...identiti
1dd60 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 es[id_idx].attri
1dd70 62 75 74 65 73 20 3d 20 63 61 63 6b 65 79 5f 67 butes = cackey_g
1dd80 65 74 5f 61 74 74 72 69 62 75 74 65 73 28 43 4b et_attributes(CK
1dd90 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 O_NETSCAPE_TRUST
1dda0 2c 20 26 65 78 74 72 61 5f 63 65 72 74 73 5b 63 , &extra_certs[c
1ddb0 65 72 74 5f 69 64 78 5d 2c 20 30 78 66 30 30 30 ert_idx], 0xf000
1ddc0 20 7c 20 63 65 72 74 5f 69 64 78 2c 20 26 69 64 | cert_idx, &id
1ddd0 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d entities[id_idx]
1dde0 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e .attributes_coun
1ddf0 74 29 3b 0a 09 09 69 64 5f 69 64 78 2b 2b 3b 0a t);...id_idx++;.
1de00 09 7d 0a 0a 09 72 65 74 75 72 6e 28 69 64 5f 69 .}...return(id_i
1de10 64 78 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73 dx);.}..static s
1de20 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 truct cackey_ide
1de30 6e 74 69 74 79 20 2a 63 61 63 6b 65 79 5f 72 65 ntity *cackey_re
1de40 61 64 5f 69 64 65 6e 74 69 74 69 65 73 28 73 74 ad_identities(st
1de50 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 ruct cackey_slot
1de60 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 *slot, unsigned
1de70 20 6c 6f 6e 67 20 2a 69 64 73 5f 66 6f 75 6e 64 long *ids_found
1de80 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b ) {..struct cack
1de90 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 ey_pcsc_identity
1dea0 20 2a 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 *pcsc_identitie
1deb0 73 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 s;..struct cacke
1dec0 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e y_identity *iden
1ded0 74 69 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 tities;..unsigne
1dee0 64 20 6c 6f 6e 67 20 6e 75 6d 5f 69 64 73 2c 20 d long num_ids,
1def0 69 64 5f 69 64 78 2c 20 63 75 72 72 5f 69 64 5f id_idx, curr_id_
1df00 74 79 70 65 3b 0a 09 75 6e 73 69 67 6e 65 64 20 type;..unsigned
1df10 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73 2c 20 long num_certs,
1df20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 2c 20 63 num_dod_certs, c
1df30 65 72 74 5f 69 64 78 3b 0a 09 69 6e 74 20 69 6e ert_idx;..int in
1df40 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74 clude_extra_cert
1df50 73 20 3d 20 30 2c 20 69 6e 63 6c 75 64 65 5f 64 s = 0, include_d
1df60 6f 64 5f 63 65 72 74 73 3b 0a 0a 09 43 41 43 4b od_certs;...CACK
1df70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1df80 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 "Called.");...if
1df90 20 28 69 64 73 5f 66 6f 75 6e 64 20 3d 3d 20 4e (ids_found == N
1dfa0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f ULL) {...CACKEY_
1dfb0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
1dfc0 72 6f 72 2e 20 20 69 64 73 5f 66 6f 75 6e 64 20 ror. ids_found
1dfd0 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 is NULL");....re
1dfe0 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a turn(NULL);..}..
1dff0 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 43 41 #ifdef CACKEY_CA
1e000 52 44 5f 53 4c 4f 54 5f 49 4e 43 4c 55 44 45 5f RD_SLOT_INCLUDE_
1e010 45 58 54 52 41 5f 43 45 52 54 53 0a 09 69 6e 63 EXTRA_CERTS..inc
1e020 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73 lude_extra_certs
1e030 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 09 69 = 1;.#endif...i
1e040 66 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45 f (getenv("CACKE
1e050 59 5f 44 4f 44 5f 43 45 52 54 53 5f 4f 4e 5f 48 Y_DOD_CERTS_ON_H
1e060 57 5f 53 4c 4f 54 53 22 29 20 21 3d 20 4e 55 4c W_SLOTS") != NUL
1e070 4c 29 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 65 L) {...include_e
1e080 78 74 72 61 5f 63 65 72 74 73 20 3d 20 31 3b 0a xtra_certs = 1;.
1e090 09 7d 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 28 .}...if (getenv(
1e0a0 22 43 41 43 4b 45 59 5f 4e 4f 5f 44 4f 44 5f 43 "CACKEY_NO_DOD_C
1e0b0 45 52 54 53 5f 4f 4e 5f 48 57 5f 53 4c 4f 54 53 ERTS_ON_HW_SLOTS
1e0c0 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 ") != NULL) {...
1e0d0 69 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 include_extra_ce
1e0e0 72 74 73 20 3d 20 30 3b 0a 09 7d 0a 0a 23 69 66 rts = 0;..}..#if
1e0f0 64 65 66 20 43 41 43 4b 45 59 5f 4e 4f 5f 45 58 def CACKEY_NO_EX
1e100 54 52 41 5f 43 45 52 54 53 0a 09 69 66 20 28 67 TRA_CERTS..if (g
1e110 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 45 58 etenv("CACKEY_EX
1e120 54 52 41 5f 43 45 52 54 53 22 29 20 21 3d 20 4e TRA_CERTS") != N
1e130 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c 75 64 65 ULL) {...include
1e140 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 31 3b 0a _dod_certs = 1;.
1e150 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 6e 63 6c .} else {...incl
1e160 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 ude_dod_certs =
1e170 30 3b 0a 09 7d 0a 23 65 6c 73 65 0a 09 69 66 20 0;..}.#else..if
1e180 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f (getenv("CACKEY_
1e190 4e 4f 5f 45 58 54 52 41 5f 43 45 52 54 53 22 29 NO_EXTRA_CERTS")
1e1a0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e != NULL) {...in
1e1b0 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 20 clude_dod_certs
1e1c0 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 = 0;..} else {..
1e1d0 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 .include_dod_cer
1e1e0 74 73 20 3d 20 31 3b 0a 09 7d 0a 23 65 6e 64 69 ts = 1;..}.#endi
1e1f0 66 0a 0a 09 69 66 20 28 69 6e 63 6c 75 64 65 5f f...if (include_
1e200 64 6f 64 5f 63 65 72 74 73 29 20 7b 0a 09 09 6e dod_certs) {...n
1e210 75 6d 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 73 um_dod_certs = s
1e220 69 7a 65 6f 66 28 65 78 74 72 61 5f 63 65 72 74 izeof(extra_cert
1e230 73 29 20 2f 20 73 69 7a 65 6f 66 28 65 78 74 72 s) / sizeof(extr
1e240 61 5f 63 65 72 74 73 5b 30 5d 29 3b 0a 09 7d 20 a_certs[0]);..}
1e250 65 6c 73 65 20 7b 0a 09 09 6e 75 6d 5f 64 6f 64 else {...num_dod
1e260 5f 63 65 72 74 73 20 3d 20 30 3b 0a 09 7d 0a 0a _certs = 0;..}..
1e270 09 69 66 20 28 73 6c 6f 74 2d 3e 69 6e 74 65 72 .if (slot->inter
1e280 6e 61 6c 29 20 7b 0a 09 09 6e 75 6d 5f 69 64 73 nal) {...num_ids
1e290 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 = cackey_read_d
1e2a0 6f 64 5f 69 64 65 6e 74 69 74 69 65 73 28 4e 55 od_identities(NU
1e2b0 4c 4c 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 LL, num_dod_cert
1e2c0 73 29 3b 0a 0a 09 09 69 66 20 28 6e 75 6d 5f 69 s);....if (num_i
1e2d0 64 73 20 21 3d 20 30 29 20 7b 0a 09 09 09 69 64 ds != 0) {....id
1e2e0 65 6e 74 69 74 69 65 73 20 3d 20 6d 61 6c 6c 6f entities = mallo
1e2f0 63 28 6e 75 6d 5f 69 64 73 20 2a 20 73 69 7a 65 c(num_ids * size
1e300 6f 66 28 2a 69 64 65 6e 74 69 74 69 65 73 29 29 of(*identities))
1e310 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 72 65 61 ;.....cackey_rea
1e320 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69 65 73 d_dod_identities
1e330 28 69 64 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d (identities, num
1e340 5f 64 6f 64 5f 63 65 72 74 73 29 3b 0a 09 09 7d _dod_certs);...}
1e350 20 65 6c 73 65 20 7b 0a 09 09 09 69 64 65 6e 74 else {....ident
1e360 69 74 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 ities = NULL;...
1e370 7d 0a 0a 09 09 2a 69 64 73 5f 66 6f 75 6e 64 20 }....*ids_found
1e380 3d 20 6e 75 6d 5f 69 64 73 3b 0a 0a 09 09 72 65 = num_ids;....re
1e390 74 75 72 6e 28 69 64 65 6e 74 69 74 69 65 73 29 turn(identities)
1e3a0 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 69 64 65 6e ;..}...pcsc_iden
1e3b0 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f tities = cackey_
1e3c0 72 65 61 64 5f 63 65 72 74 73 28 73 6c 6f 74 2c read_certs(slot,
1e3d0 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 NULL, &num_cert
1e3e0 73 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 69 64 s);..if (pcsc_id
1e3f0 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c entities != NULL
1e400 29 20 7b 0a 09 09 2f 2a 20 43 6f 6e 76 65 72 74 ) {.../* Convert
1e410 20 6e 75 6d 62 65 72 20 6f 66 20 43 65 72 74 73 number of Certs
1e420 20 74 6f 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62 to number of ob
1e430 6a 65 63 74 73 20 2a 2f 0a 09 09 6e 75 6d 5f 69 jects */...num_i
1e440 64 73 20 3d 20 28 43 4b 4f 5f 50 52 49 56 41 54 ds = (CKO_PRIVAT
1e450 45 5f 4b 45 59 20 2d 20 43 4b 4f 5f 43 45 52 54 E_KEY - CKO_CERT
1e460 49 46 49 43 41 54 45 20 2b 20 31 29 20 2a 20 6e IFICATE + 1) * n
1e470 75 6d 5f 63 65 72 74 73 3b 0a 0a 09 09 69 66 20 um_certs;....if
1e480 28 69 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 (include_extra_c
1e490 65 72 74 73 29 20 7b 0a 09 09 09 6e 75 6d 5f 69 erts) {....num_i
1e4a0 64 73 20 2b 3d 20 63 61 63 6b 65 79 5f 72 65 61 ds += cackey_rea
1e4b0 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69 65 73 d_dod_identities
1e4c0 28 4e 55 4c 4c 2c 20 6e 75 6d 5f 64 6f 64 5f 63 (NULL, num_dod_c
1e4d0 65 72 74 73 29 3b 0a 09 09 7d 0a 0a 09 09 69 64 erts);...}....id
1e4e0 65 6e 74 69 74 69 65 73 20 3d 20 6d 61 6c 6c 6f entities = mallo
1e4f0 63 28 6e 75 6d 5f 69 64 73 20 2a 20 73 69 7a 65 c(num_ids * size
1e500 6f 66 28 2a 69 64 65 6e 74 69 74 69 65 73 29 29 of(*identities))
1e510 3b 0a 0a 09 09 2f 2a 20 41 64 64 20 63 65 72 74 ;..../* Add cert
1e520 69 66 69 63 61 74 65 73 2c 20 70 75 62 6c 69 63 ificates, public
1e530 20 6b 65 79 73 2c 20 61 6e 64 20 70 72 69 76 61 keys, and priva
1e540 74 65 20 6b 65 79 73 20 66 72 6f 6d 20 74 68 65 te keys from the
1e550 20 73 6d 61 72 74 63 61 72 64 20 2a 2f 0a 09 09 smartcard */...
1e560 69 64 5f 69 64 78 20 3d 20 30 3b 0a 09 09 66 6f id_idx = 0;...fo
1e570 72 20 28 63 65 72 74 5f 69 64 78 20 3d 20 30 3b r (cert_idx = 0;
1e580 20 63 65 72 74 5f 69 64 78 20 3c 20 6e 75 6d 5f cert_idx < num_
1e590 63 65 72 74 73 3b 20 63 65 72 74 5f 69 64 78 2b certs; cert_idx+
1e5a0 2b 29 20 7b 0a 09 09 09 66 6f 72 20 28 63 75 72 +) {....for (cur
1e5b0 72 5f 69 64 5f 74 79 70 65 20 3d 20 43 4b 4f 5f r_id_type = CKO_
1e5c0 43 45 52 54 49 46 49 43 41 54 45 3b 20 63 75 72 CERTIFICATE; cur
1e5d0 72 5f 69 64 5f 74 79 70 65 20 3c 3d 20 43 4b 4f r_id_type <= CKO
1e5e0 5f 50 52 49 56 41 54 45 5f 4b 45 59 3b 20 63 75 _PRIVATE_KEY; cu
1e5f0 72 72 5f 69 64 5f 74 79 70 65 2b 2b 29 20 7b 0a rr_id_type++) {.
1e600 09 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 ....identities[i
1e610 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 d_idx].attribute
1e620 73 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 s = cackey_get_a
1e630 74 74 72 69 62 75 74 65 73 28 63 75 72 72 5f 69 ttributes(curr_i
1e640 64 5f 74 79 70 65 2c 20 26 70 63 73 63 5f 69 64 d_type, &pcsc_id
1e650 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64 entities[cert_id
1e660 78 5d 2c 20 63 65 72 74 5f 69 64 78 2c 20 26 69 x], cert_idx, &i
1e670 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 dentities[id_idx
1e680 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 ].attributes_cou
1e690 6e 74 29 3b 0a 0a 09 09 09 09 69 64 65 6e 74 69 nt);......identi
1e6a0 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 ties[id_idx].pcs
1e6b0 63 5f 69 64 65 6e 74 69 74 79 20 3d 20 6d 61 6c c_identity = mal
1e6c0 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 69 64 65 6e loc(sizeof(*iden
1e6d0 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 tities[id_idx].p
1e6e0 63 73 63 5f 69 64 65 6e 74 69 74 79 29 29 3b 0a csc_identity));.
1e6f0 09 09 09 09 6d 65 6d 63 70 79 28 69 64 65 6e 74 ....memcpy(ident
1e700 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 ities[id_idx].pc
1e710 73 63 5f 69 64 65 6e 74 69 74 79 2c 20 26 70 63 sc_identity, &pc
1e720 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 sc_identities[ce
1e730 72 74 5f 69 64 78 5d 2c 20 73 69 7a 65 6f 66 28 rt_idx], sizeof(
1e740 2a 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 *identities[id_i
1e750 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 dx].pcsc_identit
1e760 79 29 29 3b 0a 0a 09 09 09 09 69 64 65 6e 74 69 y));......identi
1e770 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 ties[id_idx].pcs
1e780 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 c_identity->cert
1e790 69 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 ificate = malloc
1e7a0 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 (pcsc_identities
1e7b0 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65 72 74 69 [cert_idx].certi
1e7c0 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 ficate_len);....
1e7d0 09 6d 65 6d 63 70 79 28 69 64 65 6e 74 69 74 69 .memcpy(identiti
1e7e0 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f es[id_idx].pcsc_
1e7f0 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 identity->certif
1e800 69 63 61 74 65 2c 20 70 63 73 63 5f 69 64 65 6e icate, pcsc_iden
1e810 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d tities[cert_idx]
1e820 2e 63 65 72 74 69 66 69 63 61 74 65 2c 20 70 63 .certificate, pc
1e830 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 sc_identities[ce
1e840 72 74 5f 69 64 78 5d 2e 63 65 72 74 69 66 69 63 rt_idx].certific
1e850 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 69 ate_len);......i
1e860 64 5f 69 64 78 2b 2b 3b 0a 09 09 09 7d 0a 09 09 d_idx++;....}...
1e870 7d 0a 0a 09 09 69 66 20 28 69 6e 63 6c 75 64 65 }....if (include
1e880 5f 65 78 74 72 61 5f 63 65 72 74 73 29 20 7b 0a _extra_certs) {.
1e890 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1e8a0 50 52 49 4e 54 46 28 22 49 6e 63 6c 75 64 69 6e PRINTF("Includin
1e8b0 67 20 55 53 20 47 6f 76 65 72 6e 6d 65 6e 74 20 g US Government
1e8c0 43 65 72 74 69 66 69 63 61 74 65 73 20 6f 6e 20 Certificates on
1e8d0 68 61 72 64 77 61 72 65 20 73 6c 6f 74 22 29 3b hardware slot");
1e8e0 0a 0a 09 09 09 63 61 63 6b 65 79 5f 72 65 61 64 .....cackey_read
1e8f0 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69 65 73 28 _dod_identities(
1e900 69 64 65 6e 74 69 74 69 65 73 20 2b 20 69 64 5f identities + id_
1e910 69 64 78 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 idx, num_dod_cer
1e920 74 73 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b ts);...}....cack
1e930 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 70 63 ey_free_certs(pc
1e940 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 6e sc_identities, n
1e950 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b 0a 0a 09 um_certs, 1);...
1e960 09 2a 69 64 73 5f 66 6f 75 6e 64 20 3d 20 6e 75 .*ids_found = nu
1e970 6d 5f 69 64 73 3b 0a 0a 09 09 72 65 74 75 72 6e m_ids;....return
1e980 28 69 64 65 6e 74 69 74 69 65 73 29 3b 0a 09 7d (identities);..}
1e990 0a 0a 09 2a 69 64 73 5f 66 6f 75 6e 64 20 3d 20 ...*ids_found =
1e9a0 30 3b 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 0;..return(NULL)
1e9b0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 61 63 6b ;.}..static cack
1e9c0 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 67 65 ey_ret cackey_ge
1e9d0 74 5f 70 69 6e 28 63 68 61 72 20 2a 70 69 6e 62 t_pin(char *pinb
1e9e0 75 66 29 20 7b 0a 09 46 49 4c 45 20 2a 70 69 6e uf) {..FILE *pin
1e9f0 66 64 3b 0a 09 63 68 61 72 20 2a 66 67 65 74 73 fd;..char *fgets
1ea00 5f 72 65 74 3b 0a 09 69 6e 74 20 70 63 6c 6f 73 _ret;..int pclos
1ea10 65 5f 72 65 74 3b 0a 0a 09 69 66 20 28 63 61 63 e_ret;...if (cac
1ea20 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 key_pin_command
1ea30 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 == NULL) {...ret
1ea40 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f urn(CACKEY_PCSC_
1ea50 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a E_GENERIC);..}..
1ea60 09 69 66 20 28 70 69 6e 62 75 66 20 3d 3d 20 4e .if (pinbuf == N
1ea70 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 ULL) {...return(
1ea80 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 CACKEY_PCSC_E_GE
1ea90 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 NERIC);..}...CAC
1eaa0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1eab0 28 22 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d ("CACKEY_PIN_COM
1eac0 4d 41 4e 44 20 3d 20 25 73 22 2c 20 63 61 63 6b MAND = %s", cack
1ead0 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 29 3b ey_pin_command);
1eae0 0a 0a 09 70 69 6e 66 64 20 3d 20 70 6f 70 65 6e ...pinfd = popen
1eaf0 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d (cackey_pin_comm
1eb00 61 6e 64 2c 20 22 72 22 29 3b 0a 09 69 66 20 28 and, "r");..if (
1eb10 70 69 6e 66 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b pinfd == NULL) {
1eb20 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1eb30 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
1eb40 25 73 3a 20 55 6e 61 62 6c 65 20 74 6f 20 72 75 %s: Unable to ru
1eb50 6e 22 2c 20 63 61 63 6b 65 79 5f 70 69 6e 5f 63 n", cackey_pin_c
1eb60 6f 6d 6d 61 6e 64 29 3b 0a 0a 09 09 72 65 74 75 ommand);....retu
1eb70 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 rn(CACKEY_PCSC_E
1eb80 5f 42 41 44 50 49 4e 29 3b 0a 09 7d 0a 0a 09 66 _BADPIN);..}...f
1eb90 67 65 74 73 5f 72 65 74 20 3d 20 66 67 65 74 73 gets_ret = fgets
1eba0 28 70 69 6e 62 75 66 2c 20 33 32 2c 20 70 69 6e (pinbuf, 32, pin
1ebb0 66 64 29 3b 0a 09 69 66 20 28 66 67 65 74 73 5f fd);..if (fgets_
1ebc0 72 65 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ret == NULL) {..
1ebd0 09 70 69 6e 62 75 66 5b 30 5d 20 3d 20 27 5c 30 .pinbuf[0] = '\0
1ebe0 27 3b 0a 09 7d 0a 0a 09 70 63 6c 6f 73 65 5f 72 ';..}...pclose_r
1ebf0 65 74 20 3d 20 70 63 6c 6f 73 65 28 70 69 6e 66 et = pclose(pinf
1ec00 64 29 3b 0a 09 69 66 20 28 70 63 6c 6f 73 65 5f d);..if (pclose_
1ec10 72 65 74 20 3d 3d 20 2d 31 20 26 26 20 65 72 72 ret == -1 && err
1ec20 6e 6f 20 3d 3d 20 45 43 48 49 4c 44 29 20 7b 0a no == ECHILD) {.
1ec30 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1ec40 52 49 4e 54 46 28 22 4e 6f 74 69 63 65 2e 20 20 RINTF("Notice.
1ec50 70 63 6c 6f 73 65 28 29 20 69 6e 64 69 63 61 74 pclose() indicat
1ec60 65 64 20 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 ed it could not
1ec70 67 65 74 20 74 68 65 20 73 74 61 74 75 73 20 6f get the status o
1ec80 66 20 74 68 65 20 63 68 69 6c 64 2c 20 61 73 73 f the child, ass
1ec90 75 6d 69 6e 67 20 69 74 20 73 75 63 63 65 65 65 uming it succeee
1eca0 64 65 64 20 21 22 29 3b 0a 0a 09 09 70 63 6c 6f ded !");....pclo
1ecb0 73 65 5f 72 65 74 20 3d 20 30 3b 0a 09 7d 0a 0a se_ret = 0;..}..
1ecc0 09 69 66 20 28 70 63 6c 6f 73 65 5f 72 65 74 20 .if (pclose_ret
1ecd0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 != 0) {...CACKEY
1ece0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
1ecf0 72 72 6f 72 2e 20 20 25 73 3a 20 65 78 69 74 65 rror. %s: exite
1ed00 64 20 77 69 74 68 20 6e 6f 6e 2d 7a 65 72 6f 20 d with non-zero
1ed10 73 74 61 74 75 73 20 6f 66 20 25 69 22 2c 20 63 status of %i", c
1ed20 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e ackey_pin_comman
1ed30 64 2c 20 70 63 6c 6f 73 65 5f 72 65 74 29 3b 0a d, pclose_ret);.
1ed40 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 ...return(CACKEY
1ed50 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b _PCSC_E_BADPIN);
1ed60 0a 09 7d 0a 0a 09 69 66 20 28 73 74 72 6c 65 6e ..}...if (strlen
1ed70 28 70 69 6e 62 75 66 29 20 3c 20 31 29 20 7b 0a (pinbuf) < 1) {.
1ed80 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1ed90 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 25 RINTF("Error. %
1eda0 73 3a 20 72 65 74 75 72 6e 65 64 20 6e 6f 20 64 s: returned no d
1edb0 61 74 61 22 2c 20 63 61 63 6b 65 79 5f 70 69 6e ata", cackey_pin
1edc0 5f 63 6f 6d 6d 61 6e 64 29 3b 0a 0a 09 09 72 65 _command);....re
1edd0 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 turn(CACKEY_PCSC
1ede0 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09 7d 0a 0a _E_BADPIN);..}..
1edf0 09 69 66 20 28 70 69 6e 62 75 66 5b 73 74 72 6c .if (pinbuf[strl
1ee00 65 6e 28 70 69 6e 62 75 66 29 20 2d 20 31 5d 20 en(pinbuf) - 1]
1ee10 3d 3d 20 27 5c 6e 27 29 20 7b 0a 09 09 70 69 6e == '\n') {...pin
1ee20 62 75 66 5b 73 74 72 6c 65 6e 28 70 69 6e 62 75 buf[strlen(pinbu
1ee30 66 29 20 2d 20 31 5d 20 3d 20 27 5c 30 27 3b 0a f) - 1] = '\0';.
1ee40 09 7d 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b .}...return(CACK
1ee50 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d EY_PCSC_S_OK);.}
1ee60 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 ..CK_DEFINE_FUNC
1ee70 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e TION(CK_RV, C_In
1ee80 69 74 69 61 6c 69 7a 65 29 28 43 4b 5f 56 4f 49 itialize)(CK_VOI
1ee90 44 5f 50 54 52 20 70 49 6e 69 74 41 72 67 73 29 D_PTR pInitArgs)
1eea0 20 7b 0a 09 43 4b 5f 43 5f 49 4e 49 54 49 41 4c {..CK_C_INITIAL
1eeb0 49 5a 45 5f 41 52 47 53 20 43 4b 5f 50 54 52 20 IZE_ARGS CK_PTR
1eec0 61 72 67 73 3b 0a 09 75 69 6e 74 33 32 5f 74 20 args;..uint32_t
1eed0 69 64 78 2c 20 68 69 67 68 65 73 74 5f 73 6c 6f idx, highest_slo
1eee0 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 69 6e t;..int mutex_in
1eef0 69 74 5f 72 65 74 3b 0a 09 69 6e 74 20 69 6e 63 it_ret;..int inc
1ef00 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 3b 0a lude_dod_certs;.
1ef10 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1ef20 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
1ef30 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 69 ;...if (cackey_i
1ef40 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 nitialized) {...
1ef50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1ef60 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 41 6c 72 NTF("Error. Alr
1ef70 65 61 64 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 eady initialized
1ef80 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
1ef90 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 41 4c 52 45 KR_CRYPTOKI_ALRE
1efa0 41 44 59 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 ADY_INITIALIZED)
1efb0 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 49 6e 69 74 ;..}...if (pInit
1efc0 41 72 67 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a Args != NULL) {.
1efd0 09 09 61 72 67 73 20 3d 20 70 49 6e 69 74 41 72 ..args = pInitAr
1efe0 67 73 3b 0a 09 09 6d 65 6d 63 70 79 28 26 63 61 gs;...memcpy(&ca
1eff0 63 6b 65 79 5f 61 72 67 73 2c 20 61 72 67 73 2c ckey_args, args,
1f000 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 61 sizeof(cackey_a
1f010 72 67 73 29 29 3b 0a 0a 09 09 69 66 20 28 61 72 rgs));....if (ar
1f020 67 73 2d 3e 43 72 65 61 74 65 4d 75 74 65 78 20 gs->CreateMutex
1f030 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d == NULL || args-
1f040 3e 44 65 73 74 72 6f 79 4d 75 74 65 78 20 3d 3d >DestroyMutex ==
1f050 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 4c NULL || args->L
1f060 6f 63 6b 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c ockMutex == NULL
1f070 20 7c 7c 20 61 72 67 73 2d 3e 55 6e 6c 6f 63 6b || args->Unlock
1f080 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b Mutex == NULL) {
1f090 0a 09 09 09 69 66 20 28 61 72 67 73 2d 3e 43 72 ....if (args->Cr
1f0a0 65 61 74 65 4d 75 74 65 78 20 21 3d 20 4e 55 4c eateMutex != NUL
1f0b0 4c 20 7c 7c 20 61 72 67 73 2d 3e 44 65 73 74 72 L || args->Destr
1f0c0 6f 79 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20 oyMutex != NULL
1f0d0 7c 7c 20 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74 || args->LockMut
1f0e0 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 ex != NULL || ar
1f0f0 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 gs->UnlockMutex
1f100 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 43 != NULL) {.....C
1f110 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1f120 54 46 28 22 45 72 72 6f 72 2e 20 53 6f 6d 65 2c TF("Error. Some,
1f130 20 62 75 74 20 6e 6f 74 20 41 6c 6c 20 74 68 72 but not All thr
1f140 65 61 64 69 6e 67 20 70 72 69 6d 69 74 69 76 65 eading primitive
1f150 73 20 70 72 6f 76 69 64 65 64 2e 22 29 3b 0a 0a s provided.");..
1f160 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 ....return(CKR_A
1f170 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 RGUMENTS_BAD);..
1f180 09 09 7d 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 ..}...}..} else
1f190 7b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e {...cackey_args.
1f1a0 43 72 65 61 74 65 4d 75 74 65 78 20 3d 20 4e 55 CreateMutex = NU
1f1b0 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 LL;...cackey_arg
1f1c0 73 2e 44 65 73 74 72 6f 79 4d 75 74 65 78 20 3d s.DestroyMutex =
1f1d0 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f NULL;...cackey_
1f1e0 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 20 3d args.LockMutex =
1f1f0 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f NULL;...cackey_
1f200 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 args.UnlockMutex
1f210 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 = NULL;...cacke
1f220 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 3d 20 30 y_args.flags = 0
1f230 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 ;..}...for (idx
1f240 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 = 0; idx < (size
1f250 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f of(cackey_sessio
1f260 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 ns) / sizeof(cac
1f270 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 key_sessions[0])
1f280 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 63 61 ); idx++) {...ca
1f290 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 ckey_sessions[id
1f2a0 78 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 x].active = 0;..
1f2b0 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 }...for (idx = 0
1f2c0 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 ; idx < (sizeof(
1f2d0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 cackey_slots) /
1f2e0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c sizeof(cackey_sl
1f2f0 6f 74 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 ots[0])); idx++)
1f300 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 {...cackey_slot
1f310 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 20 3d 20 s[idx].active =
1f320 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 0;...cackey_slot
1f330 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 61 64 s[idx].pcsc_read
1f340 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 er = NULL;...cac
1f350 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 key_slots[idx].t
1f360 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 ransaction_depth
1f370 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 = 0;...cackey_s
1f380 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61 lots[idx].transa
1f390 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f ction_need_hw_lo
1f3a0 63 6b 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 ck = 0;...cackey
1f3b0 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 73 6c 6f 74 _slots[idx].slot
1f3c0 5f 72 65 73 65 74 20 3d 20 30 3b 0a 09 09 63 61 _reset = 0;...ca
1f3d0 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e ckey_slots[idx].
1f3e0 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b token_flags = 0;
1f3f0 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b ...cackey_slots[
1f400 69 64 78 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c idx].label = NUL
1f410 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 L;...cackey_slot
1f420 73 5b 69 64 78 5d 2e 69 6e 74 65 72 6e 61 6c 20 s[idx].internal
1f430 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c = 0;...cackey_sl
1f440 6f 74 73 5b 69 64 78 5d 2e 69 64 5f 74 79 70 65 ots[idx].id_type
1f450 5f 68 69 6e 74 20 3d 20 43 41 43 4b 45 59 5f 49 _hint = CACKEY_I
1f460 44 5f 54 59 50 45 5f 55 4e 4b 4e 4f 57 4e 3b 0a D_TYPE_UNKNOWN;.
1f470 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 .}..#ifdef CACKE
1f480 59 5f 4e 4f 5f 45 58 54 52 41 5f 43 45 52 54 53 Y_NO_EXTRA_CERTS
1f490 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 43 41 ..if (getenv("CA
1f4a0 43 4b 45 59 5f 45 58 54 52 41 5f 43 45 52 54 53 CKEY_EXTRA_CERTS
1f4b0 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 ") != NULL) {...
1f4c0 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 include_dod_cert
1f4d0 73 20 3d 20 31 3b 0a 09 7d 20 65 6c 73 65 20 7b s = 1;..} else {
1f4e0 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 ...include_dod_c
1f4f0 65 72 74 73 20 3d 20 30 3b 0a 09 7d 0a 23 65 6c erts = 0;..}.#el
1f500 73 65 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 se..if (getenv("
1f510 43 41 43 4b 45 59 5f 4e 4f 5f 45 58 54 52 41 5f CACKEY_NO_EXTRA_
1f520 43 45 52 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 CERTS") != NULL)
1f530 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64 {...include_dod
1f540 5f 63 65 72 74 73 20 3d 20 30 3b 0a 09 7d 20 65 _certs = 0;..} e
1f550 6c 73 65 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f lse {...include_
1f560 64 6f 64 5f 63 65 72 74 73 20 3d 20 31 3b 0a 09 dod_certs = 1;..
1f570 7d 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28 69 }.#endif...if (i
1f580 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 nclude_dod_certs
1f590 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 == 0) {...CACKE
1f5a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1f5b0 41 73 6b 65 64 20 6e 6f 74 20 74 6f 20 69 6e 63 Asked not to inc
1f5c0 6c 75 64 65 20 44 6f 44 20 63 65 72 74 69 66 69 lude DoD certifi
1f5d0 63 61 74 65 73 22 29 3b 0a 09 7d 20 65 6c 73 65 cates");..} else
1f5e0 20 7b 0a 09 09 68 69 67 68 65 73 74 5f 73 6c 6f {...highest_slo
1f5f0 74 20 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b t = (sizeof(cack
1f600 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 ey_slots) / size
1f610 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b of(cackey_slots[
1f620 30 5d 29 29 20 2d 20 31 3b 0a 0a 09 09 43 41 43 0])) - 1;....CAC
1f630 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1f640 28 22 49 6e 63 6c 75 64 69 6e 67 20 44 6f 44 20 ("Including DoD
1f650 63 65 72 74 73 20 69 6e 20 73 6c 6f 74 20 25 6c certs in slot %l
1f660 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f u", (unsigned lo
1f670 6e 67 29 20 68 69 67 68 65 73 74 5f 73 6c 6f 74 ng) highest_slot
1f680 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f );....cackey_slo
1f690 74 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d ts[highest_slot]
1f6a0 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 09 63 .active = 1;...c
1f6b0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68 ackey_slots[high
1f6c0 65 73 74 5f 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e est_slot].intern
1f6d0 61 6c 20 3d 20 31 3b 0a 09 09 63 61 63 6b 65 79 al = 1;...cackey
1f6e0 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f 73 _slots[highest_s
1f6f0 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20 28 75 6e lot].label = (un
1f700 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 22 signed char *) "
1f710 55 53 20 47 6f 76 65 72 6e 6d 65 6e 74 20 43 65 US Government Ce
1f720 72 74 69 66 69 63 61 74 65 73 22 3b 0a 09 09 63 rtificates";...c
1f730 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68 ackey_slots[high
1f740 65 73 74 5f 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 est_slot].pcsc_r
1f750 65 61 64 65 72 20 3d 20 22 43 41 43 4b 65 79 22 eader = "CACKey"
1f760 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 ;...cackey_slots
1f770 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 74 [highest_slot].t
1f780 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a oken_flags = 0;.
1f790 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 69 6e 69 74 .}...cackey_init
1f7a0 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a 09 69 ialized = 1;...i
1f7b0 66 20 28 21 63 61 63 6b 65 79 5f 62 69 67 6c 6f f (!cackey_biglo
1f7c0 63 6b 5f 69 6e 69 74 29 20 7b 0a 09 09 6d 75 74 ck_init) {...mut
1f7d0 65 78 5f 69 6e 69 74 5f 72 65 74 20 3d 20 63 61 ex_init_ret = ca
1f7e0 63 6b 65 79 5f 6d 75 74 65 78 5f 63 72 65 61 74 ckey_mutex_creat
1f7f0 65 28 26 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 e(&cackey_bigloc
1f800 6b 29 3b 0a 0a 09 09 69 66 20 28 6d 75 74 65 78 k);....if (mutex
1f810 5f 69 6e 69 74 5f 72 65 74 20 21 3d 20 30 29 20 _init_ret != 0)
1f820 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {....CACKEY_DEBU
1f830 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
1f840 20 20 4d 75 74 65 78 20 69 6e 69 74 69 61 6c 69 Mutex initiali
1f850 7a 61 74 69 6f 6e 20 66 61 69 6c 65 64 2e 22 29 zation failed.")
1f860 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 ;.....return(CKR
1f870 5f 43 41 4e 54 5f 4c 4f 43 4b 29 3b 0a 09 09 7d _CANT_LOCK);...}
1f880 0a 0a 09 09 63 61 63 6b 65 79 5f 62 69 67 6c 6f ....cackey_biglo
1f890 63 6b 5f 69 6e 69 74 20 3d 20 31 3b 0a 09 7d 0a ck_init = 1;..}.
1f8a0 0a 09 2f 2a 20 44 65 66 69 6e 65 20 61 20 63 6f ../* Define a co
1f8b0 6d 6d 61 6e 64 20 74 6f 20 70 72 6f 6d 70 74 20 mmand to prompt
1f8c0 75 73 65 72 20 66 6f 72 20 61 20 50 49 4e 20 2a user for a PIN *
1f8d0 2f 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f /.#ifdef CACKEY_
1f8e0 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 44 45 46 41 PIN_COMMAND_DEFA
1f8f0 55 4c 54 0a 09 63 61 63 6b 65 79 5f 70 69 6e 5f ULT..cackey_pin_
1f900 63 6f 6d 6d 61 6e 64 20 3d 20 73 74 72 64 75 70 command = strdup
1f910 28 43 41 43 4b 45 59 5f 4d 41 43 52 4f 5f 44 45 (CACKEY_MACRO_DE
1f920 46 41 55 4c 54 5f 58 53 54 52 28 43 41 43 4b 45 FAULT_XSTR(CACKE
1f930 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 44 45 Y_PIN_COMMAND_DE
1f940 46 41 55 4c 54 29 29 3b 0a 23 65 6e 64 69 66 0a FAULT));.#endif.
1f950 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50 .#ifdef CACKEY_P
1f960 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 58 4f 4e 4c 59 IN_COMMAND_XONLY
1f970 5f 44 45 46 41 55 4c 54 0a 09 69 66 20 28 67 65 _DEFAULT..if (ge
1f980 74 65 6e 76 28 22 44 49 53 50 4c 41 59 22 29 20 tenv("DISPLAY")
1f990 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 != NULL) {...cac
1f9a0 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 key_pin_command
1f9b0 3d 20 73 74 72 64 75 70 28 43 41 43 4b 45 59 5f = strdup(CACKEY_
1f9c0 4d 41 43 52 4f 5f 44 45 46 41 55 4c 54 5f 58 53 MACRO_DEFAULT_XS
1f9d0 54 52 28 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f TR(CACKEY_PIN_CO
1f9e0 4d 4d 41 4e 44 5f 58 4f 4e 4c 59 5f 44 45 46 41 MMAND_XONLY_DEFA
1f9f0 55 4c 54 29 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 ULT));..}.#endif
1fa00 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 43 ...if (getenv("C
1fa10 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e ACKEY_PIN_COMMAN
1fa20 44 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 D") != NULL) {..
1fa30 09 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d .cackey_pin_comm
1fa40 61 6e 64 20 3d 20 73 74 72 64 75 70 28 67 65 74 and = strdup(get
1fa50 65 6e 76 28 22 43 41 43 4b 45 59 5f 50 49 4e 5f env("CACKEY_PIN_
1fa60 43 4f 4d 4d 41 4e 44 22 29 29 3b 0a 09 7d 0a 0a COMMAND"));..}..
1fa70 09 69 66 20 28 67 65 74 65 6e 76 28 22 43 41 43 .if (getenv("CAC
1fa80 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f KEY_PIN_COMMAND_
1fa90 58 4f 4e 4c 59 22 29 20 21 3d 20 4e 55 4c 4c 20 XONLY") != NULL
1faa0 26 26 20 67 65 74 65 6e 76 28 22 44 49 53 50 4c && getenv("DISPL
1fab0 41 59 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a AY") != NULL) {.
1fac0 09 09 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d ..cackey_pin_com
1fad0 6d 61 6e 64 20 3d 20 73 74 72 64 75 70 28 67 65 mand = strdup(ge
1fae0 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 50 49 4e tenv("CACKEY_PIN
1faf0 5f 43 4f 4d 4d 41 4e 44 5f 58 4f 4e 4c 59 22 29 _COMMAND_XONLY")
1fb00 29 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 );..}..#ifdef CA
1fb10 43 4b 45 59 5f 52 45 41 44 45 52 53 5f 49 4e 43 CKEY_READERS_INC
1fb20 4c 55 44 45 5f 4f 4e 4c 59 5f 44 45 46 41 55 4c LUDE_ONLY_DEFAUL
1fb30 54 0a 09 63 61 63 6b 65 79 5f 72 65 61 64 65 72 T..cackey_reader
1fb40 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79 20 3d s_include_only =
1fb50 20 73 74 72 64 75 70 28 43 41 43 4b 45 59 5f 4d strdup(CACKEY_M
1fb60 41 43 52 4f 5f 44 45 46 41 55 4c 54 5f 58 53 54 ACRO_DEFAULT_XST
1fb70 52 28 43 41 43 4b 45 59 5f 52 45 41 44 45 52 53 R(CACKEY_READERS
1fb80 5f 49 4e 43 4c 55 44 45 5f 4f 4e 4c 59 5f 44 45 _INCLUDE_ONLY_DE
1fb90 46 41 55 4c 54 29 29 3b 0a 23 65 6e 64 69 66 0a FAULT));.#endif.
1fba0 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 52 .#ifdef CACKEY_R
1fbb0 45 41 44 45 52 53 5f 45 58 43 4c 55 44 45 5f 44 EADERS_EXCLUDE_D
1fbc0 45 46 41 55 4c 54 0a 09 63 61 63 6b 65 79 5f 72 EFAULT..cackey_r
1fbd0 65 61 64 65 72 73 5f 65 78 63 6c 75 64 65 20 3d eaders_exclude =
1fbe0 20 73 74 72 64 75 70 28 43 41 43 4b 45 59 5f 4d strdup(CACKEY_M
1fbf0 41 43 52 4f 5f 44 45 46 41 55 4c 54 5f 58 53 54 ACRO_DEFAULT_XST
1fc00 52 28 43 41 43 4b 45 59 5f 52 45 41 44 45 52 53 R(CACKEY_READERS
1fc10 5f 45 58 43 4c 55 44 45 5f 44 45 46 41 55 4c 54 _EXCLUDE_DEFAULT
1fc20 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 ));.#endif...if
1fc30 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f (getenv("CACKEY_
1fc40 52 45 41 44 45 52 53 5f 49 4e 43 4c 55 44 45 5f READERS_INCLUDE_
1fc50 4f 4e 4c 59 22 29 20 21 3d 20 4e 55 4c 4c 29 20 ONLY") != NULL)
1fc60 7b 0a 09 09 63 61 63 6b 65 79 5f 72 65 61 64 65 {...cackey_reade
1fc70 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79 20 rs_include_only
1fc80 3d 20 73 74 72 64 75 70 28 67 65 74 65 6e 76 28 = strdup(getenv(
1fc90 22 43 41 43 4b 45 59 5f 52 45 41 44 45 52 53 5f "CACKEY_READERS_
1fca0 49 4e 43 4c 55 44 45 5f 4f 4e 4c 59 22 29 29 3b INCLUDE_ONLY"));
1fcb0 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 72 ....if (cackey_r
1fcc0 65 61 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f eaders_include_o
1fcd0 6e 6c 79 5b 30 5d 20 3d 3d 20 27 5c 30 27 29 20 nly[0] == '\0')
1fce0 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 {....free(cackey
1fcf0 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c 75 64 65 _readers_include
1fd00 5f 6f 6e 6c 79 29 3b 0a 0a 09 09 09 63 61 63 6b _only);.....cack
1fd10 65 79 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c 75 ey_readers_inclu
1fd20 64 65 5f 6f 6e 6c 79 20 3d 20 4e 55 4c 4c 3b 0a de_only = NULL;.
1fd30 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 67 65 74 ..}..}...if (get
1fd40 65 6e 76 28 22 43 41 43 4b 45 59 5f 52 45 41 44 env("CACKEY_READ
1fd50 45 52 53 5f 45 58 43 4c 55 44 45 22 29 20 21 3d ERS_EXCLUDE") !=
1fd60 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 NULL) {...cacke
1fd70 79 5f 72 65 61 64 65 72 73 5f 65 78 63 6c 75 64 y_readers_exclud
1fd80 65 20 3d 20 73 74 72 64 75 70 28 67 65 74 65 6e e = strdup(geten
1fd90 76 28 22 43 41 43 4b 45 59 5f 52 45 41 44 45 52 v("CACKEY_READER
1fda0 53 5f 45 58 43 4c 55 44 45 22 29 29 3b 0a 0a 09 S_EXCLUDE"));...
1fdb0 09 69 66 20 28 63 61 63 6b 65 79 5f 72 65 61 64 .if (cackey_read
1fdc0 65 72 73 5f 65 78 63 6c 75 64 65 5b 30 5d 20 3d ers_exclude[0] =
1fdd0 3d 20 27 5c 30 27 29 20 7b 0a 09 09 09 66 72 65 = '\0') {....fre
1fde0 65 28 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 e(cackey_readers
1fdf0 5f 65 78 63 6c 75 64 65 29 3b 0a 0a 09 09 09 63 _exclude);.....c
1fe00 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78 ackey_readers_ex
1fe10 63 6c 75 64 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 clude = NULL;...
1fe20 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 }..}...CACKEY_DE
1fe30 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
1fe40 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 rning CKR_OK (%i
1fe50 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 )", CKR_OK);...r
1fe60 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d eturn(CKR_OK);.}
1fe70 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 ..CK_DEFINE_FUNC
1fe80 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 TION(CK_RV, C_Fi
1fe90 6e 61 6c 69 7a 65 29 28 43 4b 5f 56 4f 49 44 5f nalize)(CK_VOID_
1fea0 50 54 52 20 70 52 65 73 65 72 76 65 64 29 20 7b PTR pReserved) {
1feb0 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a ..uint32_t idx;.
1fec0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1fed0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
1fee0 3b 0a 0a 09 69 66 20 28 70 52 65 73 65 72 76 65 ;...if (pReserve
1fef0 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 d != NULL) {...C
1ff00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1ff10 54 46 28 22 45 72 72 6f 72 2e 20 70 52 65 73 65 TF("Error. pRese
1ff20 72 76 65 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c rved is not NULL
1ff30 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
1ff40 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 KR_ARGUMENTS_BAD
1ff50 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 );..}...if (!cac
1ff60 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 key_initialized)
1ff70 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
1ff80 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
1ff90 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 Not initialize
1ffa0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
1ffb0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 CKR_CRYPTOKI_NOT
1ffc0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 _INITIALIZED);..
1ffd0 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 }...for (idx = 0
1ffe0 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 ; idx < (sizeof(
1fff0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 cackey_sessions)
20000 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 / sizeof(cackey
20010 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 _sessions[0]));
20020 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 idx++) {...if (c
20030 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 ackey_sessions[i
20040 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 dx].active) {...
20050 09 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 28 .C_CloseSession(
20060 69 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 idx);...}..}...c
20070 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 ackey_slots_disc
20080 6f 6e 6e 65 63 74 5f 61 6c 6c 28 31 29 3b 0a 0a onnect_all(1);..
20090 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 .for (idx = 0; i
200a0 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 dx < (sizeof(cac
200b0 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a key_slots) / siz
200c0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 eof(cackey_slots
200d0 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a [0])); idx++) {.
200e0 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f ..if (cackey_slo
200f0 74 73 5b 69 64 78 5d 2e 69 6e 74 65 72 6e 61 6c ts[idx].internal
20100 29 20 7b 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b ) {....continue;
20110 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b ...}....if (cack
20120 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 63 61 ey_slots[idx].ca
20130 63 68 65 64 5f 63 65 72 74 73 29 20 7b 0a 09 09 ched_certs) {...
20140 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 .cackey_free_cer
20150 74 73 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b ts(cackey_slots[
20160 69 64 78 5d 2e 63 61 63 68 65 64 5f 63 65 72 74 idx].cached_cert
20170 73 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b s, cackey_slots[
20180 69 64 78 5d 2e 63 61 63 68 65 64 5f 63 65 72 74 idx].cached_cert
20190 73 5f 63 6f 75 6e 74 2c 20 31 29 3b 0a 0a 09 09 s_count, 1);....
201a0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 .cackey_slots[id
201b0 78 5d 2e 63 61 63 68 65 64 5f 63 65 72 74 73 20 x].cached_certs
201c0 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 0a 0a = NULL;...}..}..
201d0 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 .cackey_pcsc_dis
201e0 63 6f 6e 6e 65 63 74 28 29 3b 0a 0a 09 69 66 20 connect();...if
201f0 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d (cackey_pin_comm
20200 61 6e 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 and != NULL) {..
20210 09 66 72 65 65 28 63 61 63 6b 65 79 5f 70 69 6e .free(cackey_pin
20220 5f 63 6f 6d 6d 61 6e 64 29 3b 0a 0a 09 09 63 61 _command);....ca
20230 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 ckey_pin_command
20240 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 69 66 = NULL;..}...if
20250 20 28 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 (cackey_readers
20260 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79 20 21 3d _include_only !=
20270 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 72 65 65 28 NULL) {...free(
20280 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69 cackey_readers_i
20290 6e 63 6c 75 64 65 5f 6f 6e 6c 79 29 3b 0a 0a 09 nclude_only);...
202a0 09 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f .cackey_readers_
202b0 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79 20 3d 20 4e include_only = N
202c0 55 4c 4c 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 ULL;..}...if (ca
202d0 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63 ckey_readers_exc
202e0 6c 75 64 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a lude != NULL) {.
202f0 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 72 65 ..free(cackey_re
20300 61 64 65 72 73 5f 65 78 63 6c 75 64 65 29 3b 0a aders_exclude);.
20310 0a 09 09 63 61 63 6b 65 79 5f 72 65 61 64 65 72 ...cackey_reader
20320 73 5f 65 78 63 6c 75 64 65 20 3d 20 4e 55 4c 4c s_exclude = NULL
20330 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 69 6e ;..}...cackey_in
20340 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a itialized = 0;..
20350 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
20360 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
20370 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b CKR_OK (%i)", CK
20380 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 R_OK);...return(
20390 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 CKR_OK);.}..CK_D
203a0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 EFINE_FUNCTION(C
203b0 4b 5f 52 56 2c 20 43 5f 47 65 74 49 6e 66 6f 29 K_RV, C_GetInfo)
203c0 28 43 4b 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e (CK_INFO_PTR pIn
203d0 66 6f 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b fo) {..static CK
203e0 5f 55 54 46 38 43 48 41 52 20 6d 61 6e 75 66 61 _UTF8CHAR manufa
203f0 63 74 75 72 65 72 49 44 5b 5d 20 3d 20 22 55 2e cturerID[] = "U.
20400 53 2e 20 47 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a S. Government";.
20410 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 .static CK_UTF8C
20420 48 41 52 20 6c 69 62 72 61 72 79 44 65 73 63 72 HAR libraryDescr
20430 69 70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b iption[] = "CACK
20440 65 79 22 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ey";...CACKEY_DE
20450 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
20460 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e ed.");...if (pIn
20470 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 fo == NULL) {...
20480 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
20490 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 NTF("Error. pInf
204a0 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 o is NULL.");...
204b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 .return(CKR_ARGU
204c0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a MENTS_BAD);..}..
204d0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 .if (!cackey_ini
204e0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 tialized) {...CA
204f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
20500 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 F("Error. Not i
20510 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a nitialized.");..
20520 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 ..return(CKR_CRY
20530 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 PTOKI_NOT_INITIA
20540 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e LIZED);..}...pIn
20550 66 6f 2d 3e 63 72 79 70 74 6f 6b 69 56 65 72 73 fo->cryptokiVers
20560 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43 41 ion.major = ((CA
20570 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 CKEY_CRYPTOKI_VE
20580 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 31 RSION_CODE) >> 1
20590 36 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6) & 0xff;..pInf
205a0 6f 2d 3e 63 72 79 70 74 6f 6b 69 56 65 72 73 69 o->cryptokiVersi
205b0 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41 43 on.minor = ((CAC
205c0 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 KEY_CRYPTOKI_VER
205d0 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38 29 SION_CODE) >> 8)
205e0 20 26 20 30 78 66 66 3b 0a 0a 09 6d 65 6d 73 65 & 0xff;...memse
205f0 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 t(pInfo->manufac
20600 74 75 72 65 72 49 44 2c 20 27 20 27 2c 20 73 69 turerID, ' ', si
20610 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 zeof(pInfo->manu
20620 66 61 63 74 75 72 65 72 49 44 29 29 3b 0a 09 6d facturerID));..m
20630 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e emcpy(pInfo->man
20640 75 66 61 63 74 75 72 65 72 49 44 2c 20 6d 61 6e ufacturerID, man
20650 75 66 61 63 74 75 72 65 72 49 44 2c 20 73 69 7a ufacturerID, siz
20660 65 6f 66 28 6d 61 6e 75 66 61 63 74 75 72 65 72 eof(manufacturer
20670 49 44 29 20 2d 20 31 29 3b 0a 0a 09 70 49 6e 66 ID) - 1);...pInf
20680 6f 2d 3e 66 6c 61 67 73 20 3d 20 30 78 30 30 3b o->flags = 0x00;
20690 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d ...memset(pInfo-
206a0 3e 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74 >libraryDescript
206b0 69 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 ion, ' ', sizeof
206c0 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 (pInfo->libraryD
206d0 65 73 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d escription));..m
206e0 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 69 62 emcpy(pInfo->lib
206f0 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c raryDescription,
20700 20 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74 libraryDescript
20710 69 6f 6e 2c 20 73 69 7a 65 6f 66 28 6c 69 62 72 ion, sizeof(libr
20720 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 29 20 aryDescription)
20730 2d 20 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 6c - 1);...pInfo->l
20740 69 62 72 61 72 79 56 65 72 73 69 6f 6e 2e 6d 61 ibraryVersion.ma
20750 6a 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 jor = (cackey_ge
20760 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 tversion() >> 16
20770 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f ) & 0xff;..pInfo
20780 2d 3e 6c 69 62 72 61 72 79 56 65 72 73 69 6f 6e ->libraryVersion
20790 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 .minor = (cackey
207a0 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e _getversion() >>
207b0 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 43 41 8) & 0xff;...CA
207c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
207d0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 F("Returning CKR
207e0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f _OK (%i)", CKR_O
207f0 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 K);...return(CKR
20800 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 50 _OK);.}../*. * P
20810 72 6f 63 65 73 73 20 6c 69 73 74 20 6f 66 20 72 rocess list of r
20820 65 61 64 65 72 73 2c 20 61 6e 64 20 63 72 65 61 eaders, and crea
20830 74 65 20 6d 61 70 70 69 6e 67 20 62 65 74 77 65 te mapping betwe
20840 65 6e 20 72 65 61 64 65 72 20 6e 61 6d 65 20 61 en reader name a
20850 6e 64 20 73 6c 6f 74 20 49 44 0a 20 2a 2f 0a 43 nd slot ID. */.C
20860 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f K_DEFINE_FUNCTIO
20870 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c N(CK_RV, C_GetSl
20880 6f 74 4c 69 73 74 29 28 43 4b 5f 42 42 4f 4f 4c otList)(CK_BBOOL
20890 20 74 6f 6b 65 6e 50 72 65 73 65 6e 74 2c 20 43 tokenPresent, C
208a0 4b 5f 53 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53 K_SLOT_ID_PTR pS
208b0 6c 6f 74 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e lotList, CK_ULON
208c0 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20 G_PTR pulCount)
208d0 7b 0a 09 73 74 61 74 69 63 20 69 6e 74 20 66 69 {..static int fi
208e0 72 73 74 5f 63 61 6c 6c 20 3d 20 31 3b 0a 09 69 rst_call = 1;..i
208f0 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b nt mutex_retval;
20900 0a 09 69 6e 74 20 70 63 73 63 5f 63 6f 6e 6e 65 ..int pcsc_conne
20910 63 74 5f 72 65 74 3b 0a 09 43 4b 5f 55 4c 4f 4e ct_ret;..CK_ULON
20920 47 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63 6f G count, slot_co
20930 75 6e 74 20 3d 20 30 2c 20 63 75 72 72 73 6c 6f unt = 0, currslo
20940 74 2c 20 73 6c 6f 74 5f 69 64 78 3b 0a 09 63 68 t, slot_idx;..ch
20950 61 72 20 2a 70 63 73 63 5f 72 65 61 64 65 72 73 ar *pcsc_readers
20960 2c 20 2a 70 63 73 63 5f 72 65 61 64 65 72 73 5f , *pcsc_readers_
20970 73 2c 20 2a 70 63 73 63 5f 72 65 61 64 65 72 73 s, *pcsc_readers
20980 5f 65 3b 0a 09 63 68 61 72 20 2a 72 65 61 64 65 _e;..char *reade
20990 72 5f 63 68 65 63 6b 5f 70 61 74 74 65 72 6e 3b r_check_pattern;
209a0 0a 09 44 57 4f 52 44 20 70 63 73 63 5f 72 65 61 ..DWORD pcsc_rea
209b0 64 65 72 73 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 ders_len;..LONG
209c0 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 scard_listreader
209d0 73 5f 72 65 74 3b 0a 09 73 69 7a 65 5f 74 20 63 s_ret;..size_t c
209e0 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 3b 0a urr_reader_len;.
209f0 09 69 6e 74 20 73 6c 6f 74 5f 72 65 73 65 74 3b .int slot_reset;
20a00 0a 09 69 6e 74 20 69 6e 63 6c 75 64 65 5f 72 65 ..int include_re
20a10 61 64 65 72 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 ader;...CACKEY_D
20a20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
20a30 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 75 led.");...if (pu
20a40 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 lCount == NULL)
20a50 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
20a60 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
20a70 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e 55 4c 4c pulCount is NULL
20a80 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
20a90 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 KR_ARGUMENTS_BAD
20aa0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 );..}...if (!cac
20ab0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 key_initialized)
20ac0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
20ad0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
20ae0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 Not initialize
20af0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
20b00 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 CKR_CRYPTOKI_NOT
20b10 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 _INITIALIZED);..
20b20 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c }...mutex_retval
20b30 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f = cackey_mutex_
20b40 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
20b50 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 ock);..if (mutex
20b60 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a _retval != 0) {.
20b70 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
20b80 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c RINTF("Error. L
20b90 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 ocking failed.")
20ba0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
20bb0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a GENERAL_ERROR);.
20bc0 09 7d 0a 0a 09 2f 2a 20 43 6c 65 61 72 20 6c 69 .}.../* Clear li
20bd0 73 74 20 6f 66 20 73 6c 6f 74 73 20 2a 2f 0a 09 st of slots */..
20be0 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 30 3b 0a slot_reset = 0;.
20bf0 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 29 20 .if (pSlotList)
20c00 7b 0a 09 09 69 66 20 28 66 69 72 73 74 5f 63 61 {...if (first_ca
20c10 6c 6c 29 20 7b 0a 09 09 09 66 69 72 73 74 5f 63 ll) {....first_c
20c20 61 6c 6c 20 3d 20 30 3b 0a 0a 09 09 09 73 6c 6f all = 0;.....slo
20c30 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 09 7d t_reset = 1;...}
20c40 0a 0a 09 09 2f 2a 20 49 66 20 61 6e 79 20 6f 66 ..../* If any of
20c50 20 74 68 65 20 73 6c 6f 74 73 20 68 61 76 65 20 the slots have
20c60 62 65 65 6e 20 72 65 73 65 74 20 74 68 65 6e 20 been reset then
20c70 70 75 72 67 65 20 61 6c 6c 20 69 6e 66 6f 72 6d purge all inform
20c80 61 74 69 6f 6e 20 61 6e 64 20 63 68 65 63 6b 20 ation and check
20c90 61 67 61 69 6e 20 2a 2f 0a 09 09 66 6f 72 20 28 again */...for (
20ca0 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75 currslot = 0; cu
20cb0 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 rrslot < (sizeof
20cc0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f (cackey_slots) /
20cd0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 sizeof(cackey_s
20ce0 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73 lots[0])); currs
20cf0 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28 lot++) {....if (
20d00 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 cackey_slots[cur
20d10 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 29 rslot].internal)
20d20 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b {.....continue;
20d30 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 21 63 ....}.....if (!c
20d40 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 ackey_slots[curr
20d50 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a slot].active) {.
20d60 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 ....continue;...
20d70 09 7d 0a 0a 09 09 09 69 66 20 28 63 61 63 6b 65 .}.....if (cacke
20d80 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 y_slots[currslot
20d90 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a ].slot_reset) {.
20da0 09 09 09 09 73 6c 6f 74 5f 72 65 73 65 74 20 3d ....slot_reset =
20db0 20 31 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 1;......break;.
20dc0 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 ...}...}....if (
20dd0 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09 09 slot_reset) {...
20de0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
20df0 49 4e 54 46 28 22 50 75 72 67 69 6e 67 20 61 6c INTF("Purging al
20e00 6c 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69 l slot informati
20e10 6f 6e 2e 22 29 3b 0a 0a 09 09 09 2f 2a 20 4f 6e on.");...../* On
20e20 6c 79 20 75 70 64 61 74 65 20 74 68 65 20 6c 69 ly update the li
20e30 73 74 20 6f 66 20 73 6c 6f 74 73 20 69 66 20 77 st of slots if w
20e40 65 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 62 e are actually b
20e50 65 69 6e 67 20 73 75 70 70 6c 79 20 74 68 65 20 eing supply the
20e60 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e slot information
20e70 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c */....cackey_sl
20e80 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 ots_disconnect_a
20e90 6c 6c 28 31 29 3b 0a 0a 09 09 09 66 6f 72 20 28 ll(1);.....for (
20ea0 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75 currslot = 0; cu
20eb0 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 rrslot < (sizeof
20ec0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f (cackey_slots) /
20ed0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 sizeof(cackey_s
20ee0 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73 lots[0])); currs
20ef0 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 09 69 66 20 lot++) {.....if
20f00 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 (cackey_slots[cu
20f10 72 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c rrslot].internal
20f20 29 20 7b 0a 09 09 09 09 09 63 6f 6e 74 69 6e 75 ) {......continu
20f30 65 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 63 61 e;.....}......ca
20f40 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 ckey_slots[currs
20f50 6c 6f 74 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b lot].active = 0;
20f60 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 2f ....}...}..}.../
20f70 2a 20 44 65 74 65 72 6d 69 6e 65 20 6c 69 73 74 * Determine list
20f80 20 6f 66 20 72 65 61 64 65 72 73 20 2a 2f 0a 09 of readers */..
20f90 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 pcsc_connect_ret
20fa0 20 3d 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 = cackey_pcsc_c
20fb0 6f 6e 6e 65 63 74 28 29 3b 0a 09 69 66 20 28 70 onnect();..if (p
20fc0 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 csc_connect_ret
20fd0 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 != CACKEY_PCSC_S
20fe0 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f _OK) {...CACKEY_
20ff0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 6f DEBUG_PRINTF("Co
21000 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 50 43 2f 53 nnection to PC/S
21010 43 20 66 61 69 6c 65 64 2c 20 61 73 73 75 6d 69 C failed, assumi
21020 6e 67 20 6e 6f 20 68 61 72 64 77 61 72 65 20 73 ng no hardware s
21030 6c 6f 74 73 22 29 3b 0a 09 7d 20 65 6c 73 65 20 lots");..} else
21040 7b 0a 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 {...pcsc_readers
21050 5f 6c 65 6e 20 3d 20 30 3b 0a 0a 09 09 73 63 61 _len = 0;....sca
21060 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 rd_listreaders_r
21070 65 74 20 3d 20 53 43 61 72 64 4c 69 73 74 52 65 et = SCardListRe
21080 61 64 65 72 73 28 2a 63 61 63 6b 65 79 5f 70 63 aders(*cackey_pc
21090 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c sc_handle, NULL,
210a0 20 4e 55 4c 4c 2c 20 26 70 63 73 63 5f 72 65 61 NULL, &pcsc_rea
210b0 64 65 72 73 5f 6c 65 6e 29 3b 0a 0a 09 09 69 66 ders_len);....if
210c0 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 (scard_listread
210d0 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 ers_ret == SCARD
210e0 5f 46 5f 43 4f 4d 4d 5f 45 52 52 4f 52 29 20 7b _F_COMM_ERROR) {
210f0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
21100 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
21110 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 SCardListReaders
21120 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 () returned SCAR
21130 44 5f 46 5f 43 4f 4d 4d 5f 45 52 52 4f 52 2c 20 D_F_COMM_ERROR,
21140 61 73 73 75 6d 69 6e 67 20 43 6f 6e 6e 65 63 74 assuming Connect
21150 69 6f 6e 20 74 6f 20 50 43 2f 53 43 20 77 65 6e ion to PC/SC wen
21160 74 20 61 77 61 79 2e 20 52 65 63 6f 6e 6e 65 63 t away. Reconnec
21170 74 69 6e 67 2e 22 29 3b 0a 0a 09 09 09 63 61 63 ting.");.....cac
21180 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e key_pcsc_disconn
21190 65 63 74 28 29 3b 0a 09 09 09 63 61 63 6b 65 79 ect();....cackey
211a0 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b _pcsc_connect();
211b0 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
211c0 47 5f 50 52 49 4e 54 46 28 22 54 72 79 69 6e 67 G_PRINTF("Trying
211d0 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 SCardListReader
211e0 73 28 29 20 61 67 61 69 6e 22 29 3b 0a 09 09 09 s() again");....
211f0 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 scard_listreader
21200 73 5f 72 65 74 20 3d 20 53 43 61 72 64 4c 69 73 s_ret = SCardLis
21210 74 52 65 61 64 65 72 73 28 2a 63 61 63 6b 65 79 tReaders(*cackey
21220 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55 _pcsc_handle, NU
21230 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63 73 63 5f LL, NULL, &pcsc_
21240 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 readers_len);...
21250 7d 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 6c }....if (scard_l
21260 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d istreaders_ret =
21270 3d 20 53 43 41 52 44 5f 45 5f 49 4e 53 55 46 46 = SCARD_E_INSUFF
21280 49 43 49 45 4e 54 5f 42 55 46 46 45 52 29 20 7b ICIENT_BUFFER) {
21290 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
212a0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
212b0 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 SCardListReaders
212c0 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 () returned SCAR
212d0 44 5f 45 5f 49 4e 53 55 46 46 49 43 49 45 4e 54 D_E_INSUFFICIENT
212e0 5f 42 55 46 46 45 52 2c 20 61 73 73 75 6d 69 6e _BUFFER, assumin
212f0 67 20 74 68 69 73 20 69 73 20 61 20 62 75 67 20 g this is a bug
21300 28 65 2e 67 2e 2c 20 47 6f 6f 67 6c 65 20 50 43 (e.g., Google PC
21310 53 43 29 20 61 6e 64 20 61 6c 6c 6f 63 61 74 69 SC) and allocati
21320 6e 67 20 61 20 6d 61 73 73 69 76 65 20 61 6d 6f ng a massive amo
21330 75 6e 74 20 6f 66 20 73 70 61 63 65 20 74 6f 20 unt of space to
21340 68 6f 6c 64 20 74 68 65 20 72 65 61 64 65 72 20 hold the reader
21350 6c 69 73 74 2e 22 29 3b 0a 0a 09 09 09 70 63 73 list.");.....pcs
21360 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 20 3d 20 c_readers_len =
21370 33 32 37 36 38 3b 0a 09 09 09 73 63 61 72 64 5f 32768;....scard_
21380 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 listreaders_ret
21390 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 = SCARD_S_SUCCES
213a0 53 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 63 S;...}....if (sc
213b0 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f ard_listreaders_
213c0 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 ret == SCARD_S_S
213d0 55 43 43 45 53 53 20 26 26 20 70 63 73 63 5f 72 UCCESS && pcsc_r
213e0 65 61 64 65 72 73 5f 6c 65 6e 20 21 3d 20 30 29 eaders_len != 0)
213f0 20 7b 0a 09 09 09 70 63 73 63 5f 72 65 61 64 65 {....pcsc_reade
21400 72 73 20 3d 20 6d 61 6c 6c 6f 63 28 70 63 73 63 rs = malloc(pcsc
21410 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 _readers_len);..
21420 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f 73 ..pcsc_readers_s
21430 20 3d 20 70 63 73 63 5f 72 65 61 64 65 72 73 3b = pcsc_readers;
21440 0a 0a 09 09 09 73 63 61 72 64 5f 6c 69 73 74 72 .....scard_listr
21450 65 61 64 65 72 73 5f 72 65 74 20 3d 20 53 43 61 eaders_ret = SCa
21460 72 64 4c 69 73 74 52 65 61 64 65 72 73 28 2a 63 rdListReaders(*c
21470 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c ackey_pcsc_handl
21480 65 2c 20 4e 55 4c 4c 2c 20 70 63 73 63 5f 72 65 e, NULL, pcsc_re
21490 61 64 65 72 73 2c 20 26 70 63 73 63 5f 72 65 61 aders, &pcsc_rea
214a0 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 09 69 66 ders_len);....if
214b0 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 (scard_listread
214c0 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 ers_ret == SCARD
214d0 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 _S_SUCCESS) {...
214e0 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65 ..pcsc_readers_e
214f0 20 3d 20 70 63 73 63 5f 72 65 61 64 65 72 73 20 = pcsc_readers
21500 2b 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c + pcsc_readers_l
21510 65 6e 3b 0a 0a 09 09 09 09 2f 2a 20 53 74 61 72 en;....../* Star
21520 74 20 77 69 74 68 20 53 6c 6f 74 20 49 44 20 31 t with Slot ID 1
21530 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 62 75 67 , to avoid a bug
21540 20 69 6e 20 47 44 4d 20 6f 6e 20 52 48 45 4c 20 in GDM on RHEL
21550 2a 2f 0a 09 09 09 09 2f 2a 20 42 75 67 20 35 39 */...../* Bug 59
21560 34 39 31 31 3a 20 68 74 74 70 73 3a 2f 2f 62 75 4911: https://bu
21570 67 7a 69 6c 6c 61 2e 72 65 64 68 61 74 2e 63 6f gzilla.redhat.co
21580 6d 2f 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f 69 m/show_bug.cgi?i
21590 64 3d 35 39 34 39 31 31 20 2a 2f 0a 09 09 09 09 d=594911 */.....
215a0 63 75 72 72 73 6c 6f 74 20 3d 20 31 3b 0a 09 09 currslot = 1;...
215b0 09 09 77 68 69 6c 65 20 28 70 63 73 63 5f 72 65 ..while (pcsc_re
215c0 61 64 65 72 73 20 3c 20 70 63 73 63 5f 72 65 61 aders < pcsc_rea
215d0 64 65 72 73 5f 65 29 20 7b 0a 09 09 09 09 09 2f ders_e) {....../
215e0 2a 20 46 69 6e 64 20 6e 65 78 74 20 61 76 61 69 * Find next avai
215f0 6c 61 62 6c 65 20 73 6c 6f 74 20 2a 2f 0a 09 09 lable slot */...
21600 09 09 09 66 6f 72 20 28 3b 20 63 75 72 72 73 6c ...for (; currsl
21610 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 ot < (sizeof(cac
21620 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a key_slots) / siz
21630 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 eof(cackey_slots
21640 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b [0])); currslot+
21650 2b 29 20 7b 0a 09 09 09 09 09 09 69 66 20 28 21 +) {.......if (!
21660 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 cackey_slots[cur
21670 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b rslot].active) {
21680 0a 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 ........break;..
21690 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 0a 0a 09 .....}......}...
216a0 09 09 09 09 63 75 72 72 5f 72 65 61 64 65 72 5f ....curr_reader_
216b0 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 70 63 73 len = strlen(pcs
216c0 63 5f 72 65 61 64 65 72 73 29 3b 0a 0a 09 09 09 c_readers);.....
216d0 09 09 69 66 20 28 28 70 63 73 63 5f 72 65 61 64 ..if ((pcsc_read
216e0 65 72 73 20 2b 20 63 75 72 72 5f 72 65 61 64 65 ers + curr_reade
216f0 72 5f 6c 65 6e 29 20 3e 20 70 63 73 63 5f 72 65 r_len) > pcsc_re
21700 61 64 65 72 73 5f 65 29 20 7b 0a 09 09 09 09 09 aders_e) {......
21710 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a .break;......}..
21720 09 09 09 09 09 69 66 20 28 63 75 72 72 5f 72 65 .....if (curr_re
21730 61 64 65 72 5f 6c 65 6e 20 3d 3d 20 30 29 20 7b ader_len == 0) {
21740 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 .......break;...
21750 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 63 ...}.......if (c
21760 75 72 72 73 6c 6f 74 20 3e 3d 20 28 73 69 7a 65 urrslot >= (size
21770 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 of(cackey_slots)
21780 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 / sizeof(cackey
21790 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 _slots[0]))) {..
217a0 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
217b0 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 G_PRINTF("Found
217c0 6d 6f 72 65 20 72 65 61 64 65 72 73 20 74 68 61 more readers tha
217d0 6e 20 73 6c 6f 74 73 20 61 72 65 20 61 76 61 69 n slots are avai
217e0 6c 61 62 6c 65 21 22 29 3b 0a 0a 09 09 09 09 09 lable!");.......
217f0 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a .break;......}..
21800 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
21810 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 G_PRINTF("Found
21820 72 65 61 64 65 72 3a 20 25 73 20 28 63 75 72 72 reader: %s (curr
21830 73 6c 6f 74 20 3d 20 25 6c 75 29 22 2c 20 70 63 slot = %lu)", pc
21840 73 63 5f 72 65 61 64 65 72 73 2c 20 28 75 6e 73 sc_readers, (uns
21850 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 igned long) curr
21860 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 09 69 66 20 slot);.......if
21870 28 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f (cackey_readers_
21880 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79 20 21 3d 20 include_only !=
21890 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 09 09 43 41 NULL) {.......CA
218a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
218b0 46 28 22 41 73 6b 65 64 20 74 6f 20 69 6e 63 6c F("Asked to incl
218c0 75 64 65 20 6f 6e 6c 79 20 72 65 61 64 65 72 73 ude only readers
218d0 20 6d 61 74 63 68 69 6e 67 3a 20 25 73 22 2c 20 matching: %s",
218e0 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69 cackey_readers_i
218f0 6e 63 6c 75 64 65 5f 6f 6e 6c 79 29 3b 0a 0a 09 nclude_only);...
21900 09 09 09 09 09 69 6e 63 6c 75 64 65 5f 72 65 61 .....include_rea
21910 64 65 72 20 3d 20 30 3b 0a 09 09 09 09 09 09 72 der = 0;.......r
21920 65 61 64 65 72 5f 63 68 65 63 6b 5f 70 61 74 74 eader_check_patt
21930 65 72 6e 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 ern = cackey_rea
21940 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c ders_include_onl
21950 79 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 69 y;......} else i
21960 66 20 28 63 61 63 6b 65 79 5f 72 65 61 64 65 72 f (cackey_reader
21970 73 5f 65 78 63 6c 75 64 65 20 21 3d 20 4e 55 4c s_exclude != NUL
21980 4c 29 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 L) {.......CACKE
21990 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
219a0 41 73 6b 65 64 20 74 6f 20 65 78 63 6c 75 64 65 Asked to exclude
219b0 20 72 65 61 64 65 72 73 20 6d 61 74 63 68 69 6e readers matchin
219c0 67 3a 20 25 73 22 2c 20 63 61 63 6b 65 79 5f 72 g: %s", cackey_r
219d0 65 61 64 65 72 73 5f 65 78 63 6c 75 64 65 29 3b eaders_exclude);
219e0 0a 0a 09 09 09 09 09 09 69 6e 63 6c 75 64 65 5f ........include_
219f0 72 65 61 64 65 72 20 3d 20 31 3b 0a 09 09 09 09 reader = 1;.....
21a00 09 09 72 65 61 64 65 72 5f 63 68 65 63 6b 5f 70 ..reader_check_p
21a10 61 74 74 65 72 6e 20 3d 20 63 61 63 6b 65 79 5f attern = cackey_
21a20 72 65 61 64 65 72 73 5f 65 78 63 6c 75 64 65 3b readers_exclude;
21a30 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 ......} else {..
21a40 09 09 09 09 09 69 6e 63 6c 75 64 65 5f 72 65 61 .....include_rea
21a50 64 65 72 20 3d 20 31 3b 0a 09 09 09 09 09 09 72 der = 1;.......r
21a60 65 61 64 65 72 5f 63 68 65 63 6b 5f 70 61 74 74 eader_check_patt
21a70 65 72 6e 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 ern = NULL;.....
21a80 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 72 65 61 .}.......if (rea
21a90 64 65 72 5f 63 68 65 63 6b 5f 70 61 74 74 65 72 der_check_patter
21aa0 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 n != NULL) {....
21ab0 09 09 09 69 66 20 28 73 74 72 73 74 72 28 70 63 ...if (strstr(pc
21ac0 73 63 5f 72 65 61 64 65 72 73 2c 20 72 65 61 64 sc_readers, read
21ad0 65 72 5f 63 68 65 63 6b 5f 70 61 74 74 65 72 6e er_check_pattern
21ae0 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 ) != NULL) {....
21af0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
21b00 5f 50 52 49 4e 54 46 28 22 54 68 69 73 20 72 65 _PRINTF("This re
21b10 61 64 65 72 20 6d 61 74 63 68 65 64 20 74 68 65 ader matched the
21b20 20 70 61 74 74 65 72 6e 2e 22 29 3b 0a 09 09 09 pattern.");....
21b30 09 09 09 0a 09 09 09 09 09 09 09 69 6e 63 6c 75 ...........inclu
21b40 64 65 5f 72 65 61 64 65 72 20 3d 20 21 69 6e 63 de_reader = !inc
21b50 6c 75 64 65 5f 72 65 61 64 65 72 3b 0a 09 09 09 lude_reader;....
21b60 09 09 09 7d 0a 09 09 09 09 09 7d 0a 0a 09 09 09 ...}......}.....
21b70 09 09 69 66 20 28 69 6e 63 6c 75 64 65 5f 72 65 ..if (include_re
21b80 61 64 65 72 20 21 3d 20 31 29 20 7b 0a 09 09 09 ader != 1) {....
21b90 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
21ba0 50 52 49 4e 54 46 28 22 53 6b 69 70 70 69 6e 67 PRINTF("Skipping
21bb0 20 74 68 69 73 20 72 65 61 64 65 72 2e 22 29 3b this reader.");
21bc0 0a 0a 09 09 09 09 09 09 70 63 73 63 5f 72 65 61 ........pcsc_rea
21bd0 64 65 72 73 20 2b 3d 20 63 75 72 72 5f 72 65 61 ders += curr_rea
21be0 64 65 72 5f 6c 65 6e 20 2b 20 31 3b 0a 0a 09 09 der_len + 1;....
21bf0 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 ....continue;...
21c00 09 09 09 7d 0a 0a 09 09 09 09 09 2f 2a 20 4f 6e ...}......./* On
21c10 6c 79 20 75 70 64 61 74 65 20 74 68 65 20 6c 69 ly update the li
21c20 73 74 20 6f 66 20 73 6c 6f 74 73 20 69 66 20 77 st of slots if w
21c30 65 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 62 e are actually b
21c40 65 69 6e 67 20 61 73 6b 65 64 20 73 75 70 70 6c eing asked suppl
21c50 79 20 74 68 65 20 73 6c 6f 74 20 69 6e 66 6f 72 y the slot infor
21c60 6d 61 74 69 6f 6e 20 2a 2f 0a 09 09 09 09 09 69 mation */......i
21c70 66 20 28 70 53 6c 6f 74 4c 69 73 74 29 20 7b 0a f (pSlotList) {.
21c80 09 09 09 09 09 09 69 66 20 28 73 6c 6f 74 5f 72 ......if (slot_r
21c90 65 73 65 74 29 20 7b 0a 09 09 09 09 09 09 09 63 eset) {........c
21ca0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 ackey_slots[curr
21cb0 73 6c 6f 74 5d 2e 61 63 74 69 76 65 20 3d 20 31 slot].active = 1
21cc0 3b 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f ;........cackey_
21cd0 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e slots[currslot].
21ce0 69 6e 74 65 72 6e 61 6c 20 3d 20 30 3b 0a 09 09 internal = 0;...
21cf0 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 .....cackey_slot
21d00 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 s[currslot].pcsc
21d10 5f 72 65 61 64 65 72 20 3d 20 73 74 72 64 75 70 _reader = strdup
21d20 28 70 63 73 63 5f 72 65 61 64 65 72 73 29 3b 0a (pcsc_readers);.
21d30 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c .......cackey_sl
21d40 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 ots[currslot].pc
21d50 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 sc_card_connecte
21d60 64 20 3d 20 30 3b 0a 09 09 09 09 09 09 09 63 61 d = 0;........ca
21d70 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 ckey_slots[currs
21d80 6c 6f 74 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e lot].transaction
21d90 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 09 09 09 _depth = 0;.....
21da0 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b ...cackey_slots[
21db0 63 75 72 72 73 6c 6f 74 5d 2e 74 72 61 6e 73 61 currslot].transa
21dc0 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f ction_need_hw_lo
21dd0 63 6b 20 3d 20 30 3b 0a 09 09 09 09 09 09 09 69 ck = 0;........i
21de0 66 20 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f f (cackey_pin_co
21df0 6d 6d 61 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b mmand == NULL) {
21e00 0a 09 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f .........cackey_
21e10 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e slots[currslot].
21e20 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b token_flags = CK
21e30 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 F_LOGIN_REQUIRED
21e40 3b 0a 09 09 09 09 09 09 09 7d 20 65 6c 73 65 20 ;........} else
21e50 7b 0a 09 09 09 09 09 09 09 09 63 61 63 6b 65 79 {.........cackey
21e60 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d _slots[currslot]
21e70 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30 .token_flags = 0
21e80 3b 0a 09 09 09 09 09 09 09 7d 0a 09 09 09 09 09 ;........}......
21e90 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 ..cackey_slots[c
21ea0 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d urrslot].label =
21eb0 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09 09 09 63 NULL;.........c
21ec0 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f ackey_mark_slot_
21ed0 72 65 73 65 74 28 26 63 61 63 6b 65 79 5f 73 6c reset(&cackey_sl
21ee0 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 29 3b 0a ots[currslot]);.
21ef0 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 20 65 ......}......} e
21f00 6c 73 65 20 7b 0a 09 09 09 09 09 09 69 66 20 28 lse {.......if (
21f10 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 !cackey_slots[cu
21f20 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20 rrslot].active)
21f30 7b 0a 09 09 09 09 09 09 09 2f 2a 20 41 72 74 69 {......../* Arti
21f40 66 69 63 69 61 6c 6c 79 20 69 6e 63 72 65 61 73 ficially increas
21f50 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 e the number of
21f60 61 63 74 69 76 65 20 73 6c 6f 74 73 20 62 79 20 active slots by
21f70 77 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 what will become
21f80 20 61 63 74 69 76 65 20 2a 2f 0a 09 09 09 09 09 active */......
21f90 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
21fa0 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 69 6e 2d RINTF("Found in-
21fb0 61 63 74 69 76 65 20 73 6c 6f 74 20 25 6c 75 2c active slot %lu,
21fc0 20 62 75 74 20 69 74 20 77 69 6c 6c 20 62 65 20 but it will be
21fd0 61 63 74 69 76 65 20 61 66 74 65 72 20 61 20 72 active after a r
21fe0 65 73 65 74 20 2d 2d 20 6d 61 72 6b 69 6e 67 20 eset -- marking
21ff0 61 73 20 61 63 74 69 76 65 20 66 6f 72 20 61 63 as active for ac
22000 63 6f 75 6e 74 69 6e 67 20 70 75 72 70 6f 73 65 counting purpose
22010 73 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f s", (unsigned lo
22020 6e 67 29 20 63 75 72 72 73 6c 6f 74 29 3b 0a 0a ng) currslot);..
22030 09 09 09 09 09 09 09 73 6c 6f 74 5f 63 6f 75 6e .......slot_coun
22040 74 2b 2b 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 t++;.......}....
22050 09 09 7d 0a 09 09 09 09 09 63 75 72 72 73 6c 6f ..}......currslo
22060 74 2b 2b 3b 0a 0a 09 09 09 09 09 70 63 73 63 5f t++;.......pcsc_
22070 72 65 61 64 65 72 73 20 2b 3d 20 63 75 72 72 5f readers += curr_
22080 72 65 61 64 65 72 5f 6c 65 6e 20 2b 20 31 3b 0a reader_len + 1;.
22090 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 ....}....} else
220a0 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 {.....CACKEY_DEB
220b0 55 47 5f 50 52 49 4e 54 46 28 22 53 65 63 6f 6e UG_PRINTF("Secon
220c0 64 20 63 61 6c 6c 20 74 6f 20 53 43 61 72 64 4c d call to SCardL
220d0 69 73 74 52 65 61 64 65 72 73 20 66 61 69 6c 65 istReaders faile
220e0 64 2c 20 72 65 74 75 72 6e 20 25 73 2f 25 6c 69 d, return %s/%li
220f0 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ", CACKEY_DEBUG_
22100 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f FUNC_SCARDERR_TO
22110 5f 53 54 52 28 73 63 61 72 64 5f 6c 69 73 74 72 _STR(scard_listr
22120 65 61 64 65 72 73 5f 72 65 74 29 2c 20 28 6c 6f eaders_ret), (lo
22130 6e 67 29 20 73 63 61 72 64 5f 6c 69 73 74 72 65 ng) scard_listre
22140 61 64 65 72 73 5f 72 65 74 29 3b 0a 09 09 09 7d aders_ret);....}
22150 0a 0a 09 09 09 66 72 65 65 28 70 63 73 63 5f 72 .....free(pcsc_r
22160 65 61 64 65 72 73 5f 73 29 3b 0a 09 09 7d 20 65 eaders_s);...} e
22170 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f lse {....CACKEY_
22180 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 69 DEBUG_PRINTF("Fi
22190 72 73 74 20 63 61 6c 6c 20 74 6f 20 53 43 61 72 rst call to SCar
221a0 64 4c 69 73 74 52 65 61 64 65 72 73 20 66 61 69 dListReaders fai
221b0 6c 65 64 2c 20 72 65 74 75 72 6e 20 25 73 2f 25 led, return %s/%
221c0 6c 69 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 li", CACKEY_DEBU
221d0 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f G_FUNC_SCARDERR_
221e0 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 6c 69 73 TO_STR(scard_lis
221f0 74 72 65 61 64 65 72 73 5f 72 65 74 29 2c 20 28 treaders_ret), (
22200 6c 6f 6e 67 29 20 73 63 61 72 64 5f 6c 69 73 74 long) scard_list
22210 72 65 61 64 65 72 73 5f 72 65 74 29 3b 0a 09 09 readers_ret);...
22220 7d 0a 09 7d 0a 0a 09 66 6f 72 20 28 63 75 72 72 }..}...for (curr
22230 73 6c 6f 74 20 3d 20 30 3b 20 63 75 72 72 73 6c slot = 0; currsl
22240 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 ot < (sizeof(cac
22250 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a key_slots) / siz
22260 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 eof(cackey_slots
22270 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b [0])); currslot+
22280 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 +) {...if (cacke
22290 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 y_slots[currslot
222a0 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 43 ].active) {....C
222b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
222c0 54 46 28 22 46 6f 75 6e 64 20 61 63 74 69 76 65 TF("Found active
222d0 20 73 6c 6f 74 20 25 6c 75 2c 20 72 65 61 64 65 slot %lu, reade
222e0 72 20 3d 20 25 73 22 2c 20 28 75 6e 73 69 67 6e r = %s", (unsign
222f0 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 73 6c 6f ed long) currslo
22300 74 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b t, cackey_slots[
22310 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 currslot].pcsc_r
22320 65 61 64 65 72 29 3b 0a 0a 09 09 09 73 6c 6f 74 eader);.....slot
22330 5f 63 6f 75 6e 74 2b 2b 3b 0a 09 09 7d 0a 09 7d _count++;...}..}
22340 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 ...mutex_retval
22350 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 = cackey_mutex_u
22360 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 nlock(cackey_big
22370 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 lock);..if (mute
22380 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b x_retval != 0) {
22390 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
223a0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
223b0 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 Unlocking failed
223c0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
223d0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 KR_GENERAL_ERROR
223e0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 53 6c 6f );..}...if (pSlo
223f0 74 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b tList == NULL) {
22400 0a 09 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 73 ...*pulCount = s
22410 6c 6f 74 5f 63 6f 75 6e 74 3b 0a 0a 09 09 43 41 lot_count;....CA
22420 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
22430 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 F("Returning CKR
22440 5f 4f 4b 20 28 25 69 29 2e 20 20 46 6f 75 6e 64 _OK (%i). Found
22450 20 25 6c 75 20 72 65 61 64 65 72 73 2c 20 62 75 %lu readers, bu
22460 74 20 6e 6f 74 20 73 74 6f 72 69 6e 67 20 49 44 t not storing ID
22470 73 20 28 70 53 6c 6f 74 4c 69 73 74 20 3d 3d 20 s (pSlotList ==
22480 4e 55 4c 4c 29 22 2c 20 43 4b 52 5f 4f 4b 2c 20 NULL)", CKR_OK,
22490 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
224a0 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 slot_count);....
224b0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a return(CKR_OK);.
224c0 09 7d 0a 0a 09 63 6f 75 6e 74 20 3d 20 2a 70 75 .}...count = *pu
224d0 6c 43 6f 75 6e 74 3b 0a 09 69 66 20 28 63 6f 75 lCount;..if (cou
224e0 6e 74 20 3c 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 nt < slot_count)
224f0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
22500 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
22510 20 55 73 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 User allocated
22520 25 6c 75 20 65 6e 74 72 69 65 73 2c 20 62 75 74 %lu entries, but
22530 20 77 65 20 68 61 76 65 20 25 6c 75 20 65 6e 74 we have %lu ent
22540 72 69 65 73 2e 22 2c 20 63 6f 75 6e 74 2c 20 73 ries.", count, s
22550 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 43 lot_count);....C
22560 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
22570 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b TF("Returning CK
22580 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 R_BUFFER_TOO_SMA
22590 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 LL");....return(
225a0 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 CKR_BUFFER_TOO_S
225b0 4d 41 4c 4c 29 3b 09 0a 09 7d 0a 0a 09 6d 75 74 MALL);...}...mut
225c0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b ex_retval = cack
225d0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 ey_mutex_lock(ca
225e0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 ckey_biglock);..
225f0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c if (mutex_retval
22600 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 != 0) {...CACKE
22610 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
22620 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 Error. Locking
22630 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 failed.");....re
22640 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c turn(CKR_GENERAL
22650 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 6c _ERROR);..}...sl
22660 6f 74 5f 69 64 78 20 3d 20 30 3b 0a 09 66 6f 72 ot_idx = 0;..for
22670 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 (currslot = 0;
22680 28 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a (currslot < (siz
22690 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 eof(cackey_slots
226a0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 ) / sizeof(cacke
226b0 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 3b 20 63 y_slots[0]))); c
226c0 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 69 urrslot++) {...i
226d0 66 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73 f (!cackey_slots
226e0 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 [currslot].activ
226f0 65 29 20 7b 0a 09 09 09 63 6f 6e 74 69 6e 75 65 e) {....continue
22700 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 6c 6f ;...}....if (slo
22710 74 5f 69 64 78 20 3e 3d 20 63 6f 75 6e 74 29 20 t_idx >= count)
22720 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {....CACKEY_DEBU
22730 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
22740 20 55 73 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 User allocated
22750 25 6c 75 20 65 6e 74 72 69 65 73 2c 20 62 75 74 %lu entries, but
22760 20 77 65 20 6a 75 73 74 20 74 72 69 65 64 20 74 we just tried t
22770 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 25 o write to the %
22780 6c 75 20 69 6e 64 65 78 20 2d 2d 20 69 67 6e 6f lu index -- igno
22790 72 69 6e 67 22 2c 20 63 6f 75 6e 74 2c 20 73 6c ring", count, sl
227a0 6f 74 5f 69 64 78 29 3b 0a 0a 09 09 09 63 6f 6e ot_idx);.....con
227b0 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 70 53 tinue;...}....pS
227c0 6c 6f 74 4c 69 73 74 5b 73 6c 6f 74 5f 69 64 78 lotList[slot_idx
227d0 5d 20 3d 20 63 75 72 72 73 6c 6f 74 3b 0a 09 09 ] = currslot;...
227e0 73 6c 6f 74 5f 69 64 78 2b 2b 3b 0a 09 7d 0a 0a slot_idx++;..}..
227f0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 .mutex_retval =
22800 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c cackey_mutex_unl
22810 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
22820 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f ck);..if (mutex_
22830 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 retval != 0) {..
22840 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
22850 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e INTF("Error. Un
22860 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 locking failed."
22870 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
22880 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b _GENERAL_ERROR);
22890 0a 09 7d 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 ..}...*pulCount
228a0 3d 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b 0a 0a 09 = slot_count;...
228b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
228c0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 NTF("Returning C
228d0 4b 52 5f 4f 4b 20 28 25 69 29 2e 20 20 46 6f 75 KR_OK (%i). Fou
228e0 6e 64 20 25 6c 75 20 72 65 61 64 65 72 73 2e 22 nd %lu readers."
228f0 2c 20 43 4b 52 5f 4f 4b 2c 20 28 75 6e 73 69 67 , CKR_OK, (unsig
22900 6e 65 64 20 6c 6f 6e 67 29 20 73 6c 6f 74 5f 63 ned long) slot_c
22910 6f 75 6e 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 ount);...return(
22920 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 74 6f 6b 65 6e CKR_OK);...token
22930 50 72 65 73 65 6e 74 20 3d 20 74 6f 6b 65 6e 50 Present = tokenP
22940 72 65 73 65 6e 74 3b 20 2f 2a 20 53 75 70 72 65 resent; /* Supre
22950 73 73 20 75 6e 75 73 65 64 20 76 61 72 69 61 62 ss unused variab
22960 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a le warning */.}.
22970 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 .CK_DEFINE_FUNCT
22980 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 ION(CK_RV, C_Get
22990 53 6c 6f 74 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f SlotInfo)(CK_SLO
229a0 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f T_ID slotID, CK_
229b0 53 4c 4f 54 5f 49 4e 46 4f 5f 50 54 52 20 70 49 SLOT_INFO_PTR pI
229c0 6e 66 6f 29 20 7b 0a 09 73 74 61 74 69 63 20 43 nfo) {..static C
229d0 4b 5f 55 54 46 38 43 48 41 52 20 73 6c 6f 74 44 K_UTF8CHAR slotD
229e0 65 73 63 72 69 70 74 69 6f 6e 5b 5d 20 3d 20 22 escription[] = "
229f0 43 41 43 4b 65 79 20 53 6c 6f 74 22 3b 0a 09 69 CACKey Slot";..i
22a00 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b nt mutex_retval;
22a10 0a 09 69 6e 74 20 62 79 74 65 73 5f 74 6f 5f 63 ..int bytes_to_c
22a20 6f 70 79 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 opy;...CACKEY_DE
22a30 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
22a40 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e ed.");...if (pIn
22a50 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 fo == NULL) {...
22a60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
22a70 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 NTF("Error. pInf
22a80 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 o is NULL.");...
22a90 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 .return(CKR_ARGU
22aa0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a MENTS_BAD);..}..
22ab0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 .if (!cackey_ini
22ac0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 tialized) {...CA
22ad0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
22ae0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 F("Error. Not i
22af0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a nitialized.");..
22b00 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 ..return(CKR_CRY
22b10 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 PTOKI_NOT_INITIA
22b20 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 LIZED);..}...if
22b30 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 (slotID < 0 || s
22b40 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 lotID >= (sizeof
22b50 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f (cackey_slots) /
22b60 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 sizeof(cackey_s
22b70 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 lots[0]))) {...C
22b80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
22b90 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c TF("Error. Inval
22ba0 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 id slot requeste
22bb0 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 d (%lu), outside
22bc0 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 of valid range"
22bd0 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 , slotID);....re
22be0 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 turn(CKR_SLOT_ID
22bf0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 _INVALID);..}...
22c00 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 mutex_retval = c
22c10 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b ackey_mutex_lock
22c20 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 (cackey_biglock)
22c30 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 ;..if (mutex_ret
22c40 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 val != 0) {...CA
22c50 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
22c60 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 F("Error. Locki
22c70 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 ng failed.");...
22c80 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 .return(CKR_GENE
22c90 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a RAL_ERROR);..}..
22ca0 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 .if (cackey_slot
22cb0 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 s[slotID].active
22cc0 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 == 0) {...CACKE
22cd0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
22ce0 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 Error. Invalid s
22cf0 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 lot requested (%
22d00 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 lu), slot not cu
22d10 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c rrently active",
22d20 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 slotID);....cac
22d30 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b key_mutex_unlock
22d40 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 (cackey_biglock)
22d50 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
22d60 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 SLOT_ID_INVALID)
22d70 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c ;..}...pInfo->fl
22d80 61 67 73 20 3d 20 43 4b 46 5f 48 57 5f 53 4c 4f ags = CKF_HW_SLO
22d90 54 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 T;...if (!cackey
22da0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 69 _slots[slotID].i
22db0 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 70 49 6e nternal) {...pIn
22dc0 66 6f 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 4b 46 fo->flags |= CKF
22dd0 5f 52 45 4d 4f 56 41 42 4c 45 5f 44 45 56 49 43 _REMOVABLE_DEVIC
22de0 45 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b E;..}...if (cack
22df0 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 ey_token_present
22e00 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 (&cackey_slots[s
22e10 6c 6f 74 49 44 5d 29 20 3d 3d 20 43 41 43 4b 45 lotID]) == CACKE
22e20 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 Y_PCSC_S_TOKENPR
22e30 45 53 45 4e 54 29 20 7b 0a 09 09 70 49 6e 66 6f ESENT) {...pInfo
22e40 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 54 ->flags |= CKF_T
22e50 4f 4b 45 4e 5f 50 52 45 53 45 4e 54 3b 0a 09 7d OKEN_PRESENT;..}
22e60 0a 0a 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 ...bytes_to_copy
22e70 20 3d 20 73 74 72 6c 65 6e 28 63 61 63 6b 65 79 = strlen(cackey
22e80 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 70 _slots[slotID].p
22e90 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 69 66 csc_reader);..if
22ea0 20 28 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e (sizeof(pInfo->
22eb0 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 20 manufacturerID)
22ec0 3c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 < bytes_to_copy)
22ed0 20 7b 0a 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f {...bytes_to_co
22ee0 70 79 20 3d 20 73 69 7a 65 6f 66 28 70 49 6e 66 py = sizeof(pInf
22ef0 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 o->manufacturerI
22f00 44 29 3b 0a 09 7d 0a 09 6d 65 6d 63 70 79 28 70 D);..}..memcpy(p
22f10 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 Info->manufactur
22f20 65 72 49 44 2c 20 63 61 63 6b 65 79 5f 73 6c 6f erID, cackey_slo
22f30 74 73 5b 73 6c 6f 74 49 44 5d 2e 70 63 73 63 5f ts[slotID].pcsc_
22f40 72 65 61 64 65 72 2c 20 62 79 74 65 73 5f 74 6f reader, bytes_to
22f50 5f 63 6f 70 79 29 3b 0a 0a 09 6d 75 74 65 78 5f _copy);...mutex_
22f60 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f retval = cackey_
22f70 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 mutex_unlock(cac
22f80 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 key_biglock);..i
22f90 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 f (mutex_retval
22fa0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 != 0) {...CACKEY
22fb0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
22fc0 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 rror. Unlocking
22fd0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 failed.");....r
22fe0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 eturn(CKR_GENERA
22ff0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 6d L_ERROR);..}...m
23000 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 73 6c 6f emset(pInfo->slo
23010 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 27 20 tDescription, '
23020 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d ', sizeof(pInfo-
23030 3e 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e >slotDescription
23040 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 ));..memcpy(pInf
23050 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70 74 69 o->slotDescripti
23060 6f 6e 2c 20 73 6c 6f 74 44 65 73 63 72 69 70 74 on, slotDescript
23070 69 6f 6e 2c 20 73 69 7a 65 6f 66 28 73 6c 6f 74 ion, sizeof(slot
23080 44 65 73 63 72 69 70 74 69 6f 6e 29 20 2d 20 31 Description) - 1
23090 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 );...memset(pInf
230a0 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 o->manufacturerI
230b0 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 D, ' ', sizeof(p
230c0 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 Info->manufactur
230d0 65 72 49 44 29 29 3b 0a 0a 09 70 49 6e 66 6f 2d erID));...pInfo-
230e0 3e 68 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e >hardwareVersion
230f0 2e 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65 79 .major = (cackey
23100 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e _getversion() >>
23110 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70 49 16) & 0xff;..pI
23120 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 65 72 nfo->hardwareVer
23130 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 sion.minor = (ca
23140 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 ckey_getversion(
23150 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a ) >> 8) & 0xff;.
23160 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 ..pInfo->firmwar
23170 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d eVersion.major =
23180 20 30 78 30 30 3b 0a 09 70 49 6e 66 6f 2d 3e 66 0x00;..pInfo->f
23190 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d irmwareVersion.m
231a0 69 6e 6f 72 20 3d 20 30 78 30 30 3b 0a 0a 09 43 inor = 0x00;...C
231b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
231c0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b TF("Returning CK
231d0 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f R_OK (%i)", CKR_
231e0 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b OK);...return(CK
231f0 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 R_OK);.}..CK_DEF
23200 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f INE_FUNCTION(CK_
23210 52 56 2c 20 43 5f 47 65 74 54 6f 6b 65 6e 49 6e RV, C_GetTokenIn
23220 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 fo)(CK_SLOT_ID s
23230 6c 6f 74 49 44 2c 20 43 4b 5f 54 4f 4b 45 4e 5f lotID, CK_TOKEN_
23240 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 INFO_PTR pInfo)
23250 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 {..static CK_UTF
23260 38 43 48 41 52 20 6d 61 6e 75 66 61 63 74 75 72 8CHAR manufactur
23270 65 72 49 44 5b 5d 20 3d 20 22 55 2e 53 2e 20 47 erID[] = "U.S. G
23280 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 74 61 overnment";..sta
23290 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 tic CK_UTF8CHAR
232a0 64 65 66 61 75 6c 74 4c 61 62 65 6c 5b 5d 20 3d defaultLabel[] =
232b0 20 22 55 6e 6b 6e 6f 77 6e 20 54 6f 6b 65 6e 22 "Unknown Token"
232c0 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 ;..static CK_UTF
232d0 38 43 48 41 52 20 6d 6f 64 65 6c 5b 5d 20 3d 20 8CHAR model[] =
232e0 22 43 41 43 20 54 6f 6b 65 6e 22 3b 0a 09 73 74 "CAC Token";..st
232f0 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 ruct cackey_pcsc
23300 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63 5f _identity *pcsc_
23310 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73 identities;..uns
23320 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 igned long num_c
23330 65 72 74 73 3b 0a 09 73 73 69 7a 65 5f 74 20 6c erts;..ssize_t l
23340 61 62 65 6c 5f 72 65 74 3b 0a 09 69 6e 74 20 6d abel_ret;..int m
23350 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e utex_retval;..in
23360 74 20 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 t use_default_la
23370 62 65 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 bel;...CACKEY_DE
23380 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
23390 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e ed.");...if (pIn
233a0 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 fo == NULL) {...
233b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
233c0 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 NTF("Error. pInf
233d0 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 o is NULL.");...
233e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 .return(CKR_ARGU
233f0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a MENTS_BAD);..}..
23400 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 .if (!cackey_ini
23410 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 tialized) {...CA
23420 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
23430 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 F("Error. Not i
23440 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a nitialized.");..
23450 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 ..return(CKR_CRY
23460 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 PTOKI_NOT_INITIA
23470 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 LIZED);..}...if
23480 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 (slotID < 0 || s
23490 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 lotID >= (sizeof
234a0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f (cackey_slots) /
234b0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 sizeof(cackey_s
234c0 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 lots[0]))) {...C
234d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
234e0 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c TF("Error. Inval
234f0 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 id slot requeste
23500 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 d (%lu), outside
23510 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 of valid range"
23520 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 , slotID);....re
23530 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 turn(CKR_SLOT_ID
23540 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 _INVALID);..}...
23550 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 mutex_retval = c
23560 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b ackey_mutex_lock
23570 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 (cackey_biglock)
23580 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 ;..if (mutex_ret
23590 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 val != 0) {...CA
235a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
235b0 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 F("Error. Locki
235c0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 ng failed.");...
235d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 .return(CKR_GENE
235e0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a RAL_ERROR);..}..
235f0 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 .if (cackey_slot
23600 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 s[slotID].active
23610 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 == 0) {...CACKE
23620 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
23630 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 Error. Invalid s
23640 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 lot requested (%
23650 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 lu), slot not cu
23660 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c rrently active",
23670 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 slotID);....cac
23680 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b key_mutex_unlock
23690 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 (cackey_biglock)
236a0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
236b0 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 SLOT_ID_INVALID)
236c0 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 ;..}...if (cacke
236d0 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 y_token_present(
236e0 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c &cackey_slots[sl
236f0 6f 74 49 44 5d 29 20 21 3d 20 43 41 43 4b 45 59 otID]) != CACKEY
23700 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 _PCSC_S_TOKENPRE
23710 53 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 SENT) {...CACKEY
23720 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4e _DEBUG_PRINTF("N
23730 6f 20 74 6f 6b 65 6e 20 69 73 20 70 72 65 73 65 o token is prese
23740 6e 74 20 69 6e 20 73 6c 6f 74 49 44 20 3d 20 25 nt in slotID = %
23750 6c 75 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 lu", slotID);...
23760 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e .cackey_mutex_un
23770 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
23780 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 ock);....return(
23790 43 4b 52 5f 54 4f 4b 45 4e 5f 4e 4f 54 5f 50 52 CKR_TOKEN_NOT_PR
237a0 45 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 ESENT);..}.../*
237b0 44 65 74 65 72 6d 69 6e 65 20 74 6f 6b 65 6e 20 Determine token
237c0 6c 61 62 65 6c 20 66 72 6f 6d 20 63 65 72 74 69 label from certi
237d0 66 69 63 61 74 65 73 20 2a 2f 0a 09 6d 65 6d 73 ficates */..mems
237e0 65 74 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c et(pInfo->label,
237f0 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e ' ', sizeof(pIn
23800 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 75 73 fo->label));..us
23810 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20 e_default_label
23820 3d 20 31 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 = 1;...if (cacke
23830 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e y_slots[slotID].
23840 6c 61 62 65 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b label == NULL) {
23850 0a 09 09 70 63 73 63 5f 69 64 65 6e 74 69 74 69 ...pcsc_identiti
23860 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 es = cackey_read
23870 5f 63 65 72 74 73 28 26 63 61 63 6b 65 79 5f 73 _certs(&cackey_s
23880 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 4e 55 lots[slotID], NU
23890 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73 29 3b LL, &num_certs);
238a0 0a 09 09 69 66 20 28 70 63 73 63 5f 69 64 65 6e ...if (pcsc_iden
238b0 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 tities != NULL)
238c0 7b 0a 09 09 09 69 66 20 28 6e 75 6d 5f 63 65 72 {....if (num_cer
238d0 74 73 20 3e 20 30 29 20 7b 0a 09 09 09 09 6c 61 ts > 0) {.....la
238e0 62 65 6c 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 bel_ret = cackey
238f0 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 5f 74 _pcsc_identity_t
23900 6f 5f 6c 61 62 65 6c 28 70 63 73 63 5f 69 64 65 o_label(pcsc_ide
23910 6e 74 69 74 69 65 73 2c 20 70 49 6e 66 6f 2d 3e ntities, pInfo->
23920 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49 label, sizeof(pI
23930 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 09 nfo->label));...
23940 09 09 69 66 20 28 6c 61 62 65 6c 5f 72 65 74 20 ..if (label_ret
23950 3e 20 30 29 20 7b 0a 09 09 09 09 09 75 73 65 5f > 0) {......use_
23960 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 default_label =
23970 30 3b 0a 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 0;.......cackey_
23980 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 slots[slotID].la
23990 62 65 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a bel = malloc(siz
239a0 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c eof(pInfo->label
239b0 29 29 3b 0a 0a 09 09 09 09 09 6d 65 6d 63 70 79 ));.......memcpy
239c0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c (cackey_slots[sl
239d0 6f 74 49 44 5d 2e 6c 61 62 65 6c 2c 20 70 49 6e otID].label, pIn
239e0 66 6f 2d 3e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f fo->label, sizeo
239f0 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 f(pInfo->label))
23a00 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 ;.....}....}....
23a10 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 .cackey_free_cer
23a20 74 73 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 ts(pcsc_identiti
23a30 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20 31 es, num_certs, 1
23a40 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b );...}..} else {
23a50 0a 09 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d ...memcpy(pInfo-
23a60 3e 6c 61 62 65 6c 2c 20 63 61 63 6b 65 79 5f 73 >label, cackey_s
23a70 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 lots[slotID].lab
23a80 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f el, sizeof(pInfo
23a90 2d 3e 6c 61 62 65 6c 29 29 3b 0a 0a 09 09 75 73 ->label));....us
23aa0 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20 e_default_label
23ab0 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f = 0;..}...mutex_
23ac0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f retval = cackey_
23ad0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 mutex_unlock(cac
23ae0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 key_biglock);..i
23af0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 f (mutex_retval
23b00 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 != 0) {...CACKEY
23b10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
23b20 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 rror. Unlocking
23b30 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 failed.");....r
23b40 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 eturn(CKR_GENERA
23b50 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 L_ERROR);..}...i
23b60 66 20 28 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c f (use_default_l
23b70 61 62 65 6c 29 20 7b 0a 09 09 6d 65 6d 63 70 79 abel) {...memcpy
23b80 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 64 (pInfo->label, d
23b90 65 66 61 75 6c 74 4c 61 62 65 6c 2c 20 73 69 7a efaultLabel, siz
23ba0 65 6f 66 28 64 65 66 61 75 6c 74 4c 61 62 65 6c eof(defaultLabel
23bb0 29 20 2d 20 31 29 3b 0a 09 7d 0a 0a 09 6d 65 6d ) - 1);..}...mem
23bc0 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 set(pInfo->manuf
23bd0 61 63 74 75 72 65 72 49 44 2c 20 27 20 27 2c 20 acturerID, ' ',
23be0 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 sizeof(pInfo->ma
23bf0 6e 75 66 61 63 74 75 72 65 72 49 44 29 29 3b 0a nufacturerID));.
23c00 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d .memcpy(pInfo->m
23c10 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 6d anufacturerID, m
23c20 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 73 anufacturerID, s
23c30 69 7a 65 6f 66 28 6d 61 6e 75 66 61 63 74 75 72 izeof(manufactur
23c40 65 72 49 44 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 erID) - 1);...me
23c50 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 mset(pInfo->mode
23c60 6c 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 l, ' ', sizeof(p
23c70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 29 29 3b 0a 09 Info->model));..
23c80 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 6f memcpy(pInfo->mo
23c90 64 65 6c 2c 20 6d 6f 64 65 6c 2c 20 73 69 7a 65 del, model, size
23ca0 6f 66 28 6d 6f 64 65 6c 29 20 2d 20 31 29 3b 0a of(model) - 1);.
23cb0 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e ..memset(pInfo->
23cc0 73 65 72 69 61 6c 4e 75 6d 62 65 72 2c 20 27 20 serialNumber, '
23cd0 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d ', sizeof(pInfo-
23ce0 3e 73 65 72 69 61 6c 4e 75 6d 62 65 72 29 29 3b >serialNumber));
23cf0 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d ...memset(pInfo-
23d00 3e 75 74 63 54 69 6d 65 2c 20 27 20 27 2c 20 73 >utcTime, ' ', s
23d10 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 75 74 63 izeof(pInfo->utc
23d20 54 69 6d 65 29 29 3b 0a 0a 09 70 49 6e 66 6f 2d Time));...pInfo-
23d30 3e 68 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e >hardwareVersion
23d40 2e 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65 79 .major = (cackey
23d50 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e _getversion() >>
23d60 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70 49 16) & 0xff;..pI
23d70 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 65 72 nfo->hardwareVer
23d80 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 sion.minor = (ca
23d90 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 ckey_getversion(
23da0 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a ) >> 8) & 0xff;.
23db0 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 ..pInfo->firmwar
23dc0 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d eVersion.major =
23dd0 20 30 78 30 30 3b 0a 09 70 49 6e 66 6f 2d 3e 66 0x00;..pInfo->f
23de0 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d irmwareVersion.m
23df0 69 6e 6f 72 20 3d 20 30 78 30 30 3b 0a 0a 09 70 inor = 0x00;...p
23e00 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b Info->flags = CK
23e10 46 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 F_WRITE_PROTECTE
23e20 44 20 7c 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e D | CKF_USER_PIN
23e30 5f 49 4e 49 54 49 41 4c 49 5a 45 44 20 7c 20 43 _INITIALIZED | C
23e40 4b 46 5f 54 4f 4b 45 4e 5f 49 4e 49 54 49 41 4c KF_TOKEN_INITIAL
23e50 49 5a 45 44 20 7c 20 63 61 63 6b 65 79 5f 73 6c IZED | cackey_sl
23e60 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 ots[slotID].toke
23e70 6e 5f 66 6c 61 67 73 3b 0a 0a 09 69 66 20 28 63 n_flags;...if (c
23e80 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e ackey_pin_comman
23e90 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 70 d != NULL) {...p
23ea0 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 Info->flags |= C
23eb0 4b 46 5f 50 52 4f 54 45 43 54 45 44 5f 41 55 54 KF_PROTECTED_AUT
23ec0 48 45 4e 54 49 43 41 54 49 4f 4e 5f 50 41 54 48 HENTICATION_PATH
23ed0 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 75 6c ;..}...pInfo->ul
23ee0 4d 61 78 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 MaxSessionCount
23ef0 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 = (sizeof(cackey
23f00 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a _sessions) / siz
23f10 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 eof(cackey_sessi
23f20 6f 6e 73 5b 30 5d 29 29 20 2d 20 31 3b 0a 09 70 ons[0])) - 1;..p
23f30 49 6e 66 6f 2d 3e 75 6c 53 65 73 73 69 6f 6e 43 Info->ulSessionC
23f40 6f 75 6e 74 20 3d 20 43 4b 5f 55 4e 41 56 41 49 ount = CK_UNAVAI
23f50 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f LABLE_INFORMATIO
23f60 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 N;..pInfo->ulMax
23f70 52 77 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d RwSessionCount =
23f80 20 30 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 52 77 0;..pInfo->ulRw
23f90 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 43 SessionCount = C
23fa0 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e K_UNAVAILABLE_IN
23fb0 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 FORMATION;..pInf
23fc0 6f 2d 3e 75 6c 4d 61 78 50 69 6e 4c 65 6e 20 3d o->ulMaxPinLen =
23fd0 20 31 32 38 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 128;..pInfo->ul
23fe0 4d 69 6e 50 69 6e 4c 65 6e 20 3d 20 30 3b 0a 09 MinPinLen = 0;..
23ff0 70 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61 6c 50 75 pInfo->ulTotalPu
24000 62 6c 69 63 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f blicMemory = CK_
24010 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f UNAVAILABLE_INFO
24020 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d RMATION;..pInfo-
24030 3e 75 6c 46 72 65 65 50 75 62 6c 69 63 4d 65 6d >ulFreePublicMem
24040 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c ory = CK_UNAVAIL
24050 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e ABLE_INFORMATION
24060 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61 ;..pInfo->ulTota
24070 6c 50 72 69 76 61 74 65 4d 65 6d 6f 72 79 20 3d lPrivateMemory =
24080 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f CK_UNAVAILABLE_
24090 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 INFORMATION;..pI
240a0 6e 66 6f 2d 3e 75 6c 46 72 65 65 50 72 69 76 61 nfo->ulFreePriva
240b0 74 65 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e teMemory = CK_UN
240c0 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d AVAILABLE_INFORM
240d0 41 54 49 4f 4e 3b 0a 0a 09 43 41 43 4b 45 59 5f ATION;...CACKEY_
240e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
240f0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 turning CKR_OK (
24100 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a %i)", CKR_OK);..
24110 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b .return(CKR_OK);
24120 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 .}..CK_DEFINE_FU
24130 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f NCTION(CK_RV, C_
24140 57 61 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74 WaitForSlotEvent
24150 29 28 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73 )(CK_FLAGS flags
24160 2c 20 43 4b 5f 53 4c 4f 54 5f 49 44 5f 50 54 52 , CK_SLOT_ID_PTR
24170 20 70 53 6c 6f 74 49 44 2c 20 43 4b 5f 56 4f 49 pSlotID, CK_VOI
24180 44 5f 50 54 52 20 70 52 65 73 65 72 76 65 64 29 D_PTR pReserved)
24190 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {..CACKEY_DEBUG
241a0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
241b0 22 29 3b 0a 0a 09 69 66 20 28 70 52 65 73 65 72 ");...if (pReser
241c0 76 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ved != NULL) {..
241d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
241e0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 52 65 INTF("Error. pRe
241f0 73 65 72 76 65 64 20 69 73 20 6e 6f 74 20 4e 55 served is not NU
24200 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e LL.");....return
24210 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 (CKR_ARGUMENTS_B
24220 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 AD);..}...if (!c
24230 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 ackey_initialize
24240 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 d) {...CACKEY_DE
24250 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
24260 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 r. Not initiali
24270 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 zed.");....retur
24280 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e n(CKR_CRYPTOKI_N
24290 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b OT_INITIALIZED);
242a0 0a 09 7d 0a 0a 09 2f 2a 20 58 58 58 3a 20 54 4f ..}.../* XXX: TO
242b0 44 4f 3a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 DO: Implement th
242c0 69 73 2e 2e 2e 20 2a 2f 0a 09 43 41 43 4b 45 59 is... */..CACKEY
242d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
242e0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e eturning CKR_FUN
242f0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
24300 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 TED (%i)", CKR_F
24310 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
24320 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e ORTED);...return
24330 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f (CKR_FUNCTION_NO
24340 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a T_SUPPORTED);.}.
24350 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 .CK_DEFINE_FUNCT
24360 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 ION(CK_RV, C_Get
24370 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 29 28 43 MechanismList)(C
24380 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 K_SLOT_ID slotID
24390 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 , CK_MECHANISM_T
243a0 59 50 45 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 YPE_PTR pMechani
243b0 73 6d 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 smList, CK_ULONG
243c0 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b _PTR pulCount) {
243d0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
243e0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
243f0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f ;...if (!cackey_
24400 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 initialized) {..
24410 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
24420 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f INTF("Error. No
24430 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 t initialized.")
24440 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
24450 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 CRYPTOKI_NOT_INI
24460 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 TIALIZED);..}...
24470 69 66 20 28 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 if (pulCount ==
24480 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 NULL) {...CACKEY
24490 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
244a0 72 72 6f 72 2e 20 20 70 75 6c 43 6f 75 6e 74 20 rror. pulCount
244b0 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 is NULL.");....r
244c0 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 eturn(CKR_ARGUME
244d0 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 NTS_BAD);..}...i
244e0 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73 f (pMechanismLis
244f0 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a t == NULL) {...*
24500 70 75 6c 43 6f 75 6e 74 20 3d 20 31 3b 0a 0a 09 pulCount = 1;...
24510 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
24520 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
24530 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b CKR_OK (%i)", CK
24540 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e R_OK);....return
24550 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 (CKR_OK);..}...i
24560 66 20 28 2a 70 75 6c 43 6f 75 6e 74 20 3c 20 31 f (*pulCount < 1
24570 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
24580 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
24590 2e 20 20 42 75 66 66 65 72 20 74 6f 6f 20 73 6d . Buffer too sm
245a0 61 6c 6c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 all.");....retur
245b0 6e 28 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f n(CKR_BUFFER_TOO
245c0 5f 53 4d 41 4c 4c 29 3b 0a 09 7d 0a 0a 09 70 4d _SMALL);..}...pM
245d0 65 63 68 61 6e 69 73 6d 4c 69 73 74 5b 30 5d 20 echanismList[0]
245e0 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3b 0a = CKM_RSA_PKCS;.
245f0 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 31 3b 0a .*pulCount = 1;.
24600 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
24610 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
24620 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 CKR_OK (%i)", C
24630 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e KR_OK);...return
24640 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f (CKR_OK);.}..CK_
24650 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 DEFINE_FUNCTION(
24660 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4d 65 63 68 CK_RV, C_GetMech
24670 61 6e 69 73 6d 49 6e 66 6f 29 28 43 4b 5f 53 4c anismInfo)(CK_SL
24680 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b OT_ID slotID, CK
24690 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 20 _MECHANISM_TYPE
246a0 74 79 70 65 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 type, CK_MECHANI
246b0 53 4d 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 SM_INFO_PTR pInf
246c0 6f 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f o) {..int mutex_
246d0 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 retval;...CACKEY
246e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 _DEBUG_PRINTF("C
246f0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 alled.");...if (
24700 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b pInfo == NULL) {
24710 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
24720 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 PRINTF("Error. p
24730 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b Info is NULL.");
24740 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 ....return(CKR_A
24750 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 RGUMENTS_BAD);..
24760 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f }...if (!cackey_
24770 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 initialized) {..
24780 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
24790 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f INTF("Error. No
247a0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 t initialized.")
247b0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
247c0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 CRYPTOKI_NOT_INI
247d0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 TIALIZED);..}...
247e0 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c if (slotID < 0 |
247f0 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a | slotID >= (siz
24800 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 eof(cackey_slots
24810 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 ) / sizeof(cacke
24820 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a y_slots[0]))) {.
24830 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
24840 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e RINTF("Error. In
24850 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 valid slot reque
24860 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 sted (%lu), outs
24870 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e ide of valid ran
24880 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 ge", slotID);...
24890 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 .return(CKR_SLOT
248a0 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d _ID_INVALID);..}
248b0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 ...mutex_retval
248c0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c = cackey_mutex_l
248d0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
248e0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f ck);..if (mutex_
248f0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 retval != 0) {..
24900 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
24910 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f INTF("Error. Lo
24920 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b cking failed.");
24930 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 ....return(CKR_G
24940 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 ENERAL_ERROR);..
24950 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 }...if (cackey_s
24960 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 lots[slotID].act
24970 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 ive == 0) {...CA
24980 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
24990 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 F("Error. Invali
249a0 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 d slot requested
249b0 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 (%lu), slot not
249c0 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 currently activ
249d0 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 e", slotID);....
249e0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c cackey_mutex_unl
249f0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
24a00 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 ck);....return(C
24a10 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c KR_SLOT_ID_INVAL
24a20 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f ID);..}...mutex_
24a30 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f retval = cackey_
24a40 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 mutex_unlock(cac
24a50 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 key_biglock);..i
24a60 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 f (mutex_retval
24a70 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 != 0) {...CACKEY
24a80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
24a90 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 rror. Unlocking
24aa0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 failed.");....r
24ab0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 eturn(CKR_GENERA
24ac0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 L_ERROR);..}...s
24ad0 77 69 74 63 68 20 28 74 79 70 65 29 20 7b 0a 09 witch (type) {..
24ae0 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b .case CKM_RSA_PK
24af0 43 53 3a 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c CS:....pInfo->ul
24b00 4d 69 6e 4b 65 79 53 69 7a 65 20 3d 20 35 31 32 MinKeySize = 512
24b10 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 ;....pInfo->ulMa
24b20 78 4b 65 79 53 69 7a 65 20 3d 20 38 31 39 32 3b xKeySize = 8192;
24b30 0a 09 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 ....pInfo->flags
24b40 20 3d 20 43 4b 46 5f 48 57 20 7c 20 43 4b 46 5f = CKF_HW | CKF_
24b50 45 4e 43 52 59 50 54 20 7c 20 43 4b 46 5f 44 45 ENCRYPT | CKF_DE
24b60 43 52 59 50 54 20 7c 20 43 4b 46 5f 53 49 47 4e CRYPT | CKF_SIGN
24b70 20 7c 20 43 4b 46 5f 56 45 52 49 46 59 3b 0a 09 | CKF_VERIFY;..
24b80 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 43 41 ..break;..}...CA
24b90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
24ba0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 F("Returning CKR
24bb0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f _OK (%i)", CKR_O
24bc0 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 K);...return(CKR
24bd0 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 _OK);.}../* We d
24be0 6f 6e 27 74 20 73 75 70 70 6f 72 74 20 74 68 69 on't support thi
24bf0 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f s method. */.CK_
24c00 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 DEFINE_FUNCTION(
24c10 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 54 6f 6b CK_RV, C_InitTok
24c20 65 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 en)(CK_SLOT_ID s
24c30 6c 6f 74 49 44 2c 20 43 4b 5f 55 54 46 38 43 48 lotID, CK_UTF8CH
24c40 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f AR_PTR pPin, CK_
24c50 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 2c 20 ULONG ulPinLen,
24c60 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 CK_UTF8CHAR_PTR
24c70 70 4c 61 62 65 6c 29 20 7b 0a 09 43 41 43 4b 45 pLabel) {..CACKE
24c80 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
24c90 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 Called.");...if
24ca0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c (!cackey_initial
24cb0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 ized) {...CACKEY
24cc0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
24cd0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 rror. Not initi
24ce0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 alized.");....re
24cf0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b turn(CKR_CRYPTOK
24d00 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 I_NOT_INITIALIZE
24d10 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f D);..}...CACKEY_
24d20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
24d30 74 75 72 6e 69 6e 67 20 43 4b 52 5f 54 4f 4b 45 turning CKR_TOKE
24d40 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 N_WRITE_PROTECTE
24d50 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 54 4f 4b D (%i)", CKR_TOK
24d60 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 EN_WRITE_PROTECT
24d70 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b ED);...return(CK
24d80 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 R_TOKEN_WRITE_PR
24d90 4f 54 45 43 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 OTECTED);.}../*
24da0 57 65 20 64 6f 6e 27 74 20 73 75 70 70 6f 72 74 We don't support
24db0 20 74 68 69 73 20 6d 65 74 68 6f 64 2e 20 2a 2f this method. */
24dc0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 .CK_DEFINE_FUNCT
24dd0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 ION(CK_RV, C_Ini
24de0 74 50 49 4e 29 28 43 4b 5f 53 45 53 53 49 4f 4e tPIN)(CK_SESSION
24df0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e _HANDLE hSession
24e00 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 , CK_UTF8CHAR_PT
24e10 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 R pPin, CK_ULONG
24e20 20 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09 43 41 ulPinLen) {..CA
24e30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
24e40 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
24e50 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 if (!cackey_init
24e60 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 ialized) {...CAC
24e70 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
24e80 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e ("Error. Not in
24e90 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 itialized.");...
24ea0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 .return(CKR_CRYP
24eb0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c TOKI_NOT_INITIAL
24ec0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b IZED);..}...CACK
24ed0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
24ee0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 54 "Returning CKR_T
24ef0 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 OKEN_WRITE_PROTE
24f00 43 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f CTED (%i)", CKR_
24f10 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 TOKEN_WRITE_PROT
24f20 45 43 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e ECTED);...return
24f30 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 (CKR_TOKEN_WRITE
24f40 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 7d 0a 0a _PROTECTED);.}..
24f50 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 CK_DEFINE_FUNCTI
24f60 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74 50 ON(CK_RV, C_SetP
24f70 49 4e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 IN)(CK_SESSION_H
24f80 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 ANDLE hSession,
24f90 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 CK_UTF8CHAR_PTR
24fa0 70 4f 6c 64 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e pOldPin, CK_ULON
24fb0 47 20 75 6c 4f 6c 64 50 69 6e 4c 65 6e 2c 20 43 G ulOldPinLen, C
24fc0 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 K_UTF8CHAR_PTR p
24fd0 4e 65 77 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 NewPin, CK_ULONG
24fe0 20 75 6c 4e 65 77 50 69 6e 4c 65 6e 29 20 7b 0a ulNewPinLen) {.
24ff0 09 63 68 61 72 20 6f 6c 64 70 69 6e 62 75 66 5b .char oldpinbuf[
25000 36 34 5d 2c 20 6e 65 77 70 69 6e 62 75 66 5b 36 64], newpinbuf[6
25010 34 5d 3b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 4];..cackey_ret
25020 73 65 74 5f 70 69 6e 5f 72 65 74 2c 20 67 65 74 set_pin_ret, get
25030 5f 70 69 6e 5f 72 65 74 3b 0a 09 43 4b 5f 53 4c _pin_ret;..CK_SL
25040 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 69 OT_ID slotID;..i
25050 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b nt mutex_retval;
25060 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
25070 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
25080 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 );...if (!cackey
25090 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
250a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
250b0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e RINTF("Error. N
250c0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 ot initialized."
250d0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
250e0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e _CRYPTOKI_NOT_IN
250f0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
25100 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 .mutex_retval =
25110 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 cackey_mutex_loc
25120 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
25130 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 );..if (mutex_re
25140 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 tval != 0) {...C
25150 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
25160 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b TF("Error. Lock
25170 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a ing failed.");..
25180 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e ..return(CKR_GEN
25190 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a ERAL_ERROR);..}.
251a0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 ..if (!cackey_se
251b0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
251c0 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 .active) {...cac
251d0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b key_mutex_unlock
251e0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 (cackey_biglock)
251f0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 ;....CACKEY_DEBU
25200 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
25210 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 Session not ac
25220 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 tive.");......re
25230 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e turn(CKR_SESSION
25240 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 _HANDLE_INVALID)
25250 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 ;..}...slotID =
25260 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
25270 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 hSession].slotID
25280 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c ;...if (slotID <
25290 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 0 || slotID >=
252a0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 (sizeof(cackey_s
252b0 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 lots) / sizeof(c
252c0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 ackey_slots[0]))
252d0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
252e0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
252f0 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 . Invalid slot r
25300 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 equested (%lu),
25310 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 outside of valid
25320 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 range", slotID)
25330 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 ;....cackey_mute
25340 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
25350 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 biglock);....ret
25360 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f urn(CKR_GENERAL_
25370 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 ERROR);..}...if
25380 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c (cackey_slots[sl
25390 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 otID].active ==
253a0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 0) {...CACKEY_DE
253b0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
253c0 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 r. Invalid slot
253d0 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c requested (%lu),
253e0 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e slot not curren
253f0 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f tly active", slo
25400 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f tID);....cackey_
25410 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 mutex_unlock(cac
25420 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 key_biglock);...
25430 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 .return(CKR_GENE
25440 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a RAL_ERROR);..}..
25450 09 69 66 20 28 63 61 63 6b 65 79 5f 70 69 6e 5f .if (cackey_pin_
25460 63 6f 6d 6d 61 6e 64 20 21 3d 20 4e 55 4c 4c 29 command != NULL)
25470 20 7b 0a 09 09 2f 2a 20 47 65 74 20 6f 6c 64 20 {.../* Get old
25480 50 49 4e 20 2a 2f 0a 09 09 67 65 74 5f 70 69 6e PIN */...get_pin
25490 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 67 65 _ret = cackey_ge
254a0 74 5f 70 69 6e 28 6f 6c 64 70 69 6e 62 75 66 29 t_pin(oldpinbuf)
254b0 3b 0a 0a 09 09 69 66 20 28 67 65 74 5f 70 69 6e ;....if (get_pin
254c0 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 _ret != CACKEY_P
254d0 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 CSC_S_OK) {....C
254e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
254f0 54 46 28 22 45 72 72 6f 72 20 77 68 69 6c 65 20 TF("Error while
25500 67 65 74 74 69 6e 67 20 4f 6c 64 20 50 49 4e 2c getting Old PIN,
25510 20 72 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 50 returning CKR_P
25520 49 4e 5f 49 4e 43 4f 52 52 45 43 54 2e 22 29 3b IN_INCORRECT.");
25530 0a 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 .....cackey_mute
25540 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
25550 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 0a 09 09 biglock);.......
25560 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f .return(CKR_PIN_
25570 49 4e 43 4f 52 52 45 43 54 29 3b 0a 09 09 7d 0a INCORRECT);...}.
25580 0a 09 09 70 4f 6c 64 50 69 6e 20 3d 20 28 43 4b ...pOldPin = (CK
25590 5f 55 54 46 38 43 48 41 52 5f 50 54 52 29 20 6f _UTF8CHAR_PTR) o
255a0 6c 64 70 69 6e 62 75 66 3b 0a 09 09 75 6c 4f 6c ldpinbuf;...ulOl
255b0 64 50 69 6e 4c 65 6e 20 3d 20 73 74 72 6c 65 6e dPinLen = strlen
255c0 28 6f 6c 64 70 69 6e 62 75 66 29 3b 0a 0a 09 09 (oldpinbuf);....
255d0 2f 2a 20 47 65 74 20 6e 65 77 20 50 49 4e 20 2a /* Get new PIN *
255e0 2f 0a 09 09 67 65 74 5f 70 69 6e 5f 72 65 74 20 /...get_pin_ret
255f0 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 70 69 6e = cackey_get_pin
25600 28 6e 65 77 70 69 6e 62 75 66 29 3b 0a 0a 09 09 (newpinbuf);....
25610 69 66 20 28 67 65 74 5f 70 69 6e 5f 72 65 74 20 if (get_pin_ret
25620 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 != CACKEY_PCSC_S
25630 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 _OK) {....CACKEY
25640 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
25650 72 72 6f 72 20 77 68 69 6c 65 20 67 65 74 74 69 rror while getti
25660 6e 67 20 4e 65 77 20 50 49 4e 2c 20 72 65 74 75 ng New PIN, retu
25670 72 6e 69 6e 67 20 43 4b 52 5f 50 49 4e 5f 49 4e rning CKR_PIN_IN
25680 56 41 4c 49 44 2e 22 29 3b 0a 0a 09 09 09 63 61 VALID.");.....ca
25690 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 ckey_mutex_unloc
256a0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
256b0 29 3b 0a 09 09 09 0a 09 09 09 72 65 74 75 72 6e );........return
256c0 28 43 4b 52 5f 50 49 4e 5f 49 4e 56 41 4c 49 44 (CKR_PIN_INVALID
256d0 29 3b 0a 09 09 7d 0a 0a 09 09 70 4e 65 77 50 69 );...}....pNewPi
256e0 6e 20 3d 20 28 43 4b 5f 55 54 46 38 43 48 41 52 n = (CK_UTF8CHAR
256f0 5f 50 54 52 29 20 6e 65 77 70 69 6e 62 75 66 3b _PTR) newpinbuf;
25700 0a 09 09 75 6c 4e 65 77 50 69 6e 4c 65 6e 20 3d ...ulNewPinLen =
25710 20 73 74 72 6c 65 6e 28 6e 65 77 70 69 6e 62 75 strlen(newpinbu
25720 66 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4f 6c f);..}...if (pOl
25730 64 50 69 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a dPin == NULL) {.
25740 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
25750 52 49 4e 54 46 28 22 4f 6c 64 20 50 49 4e 20 76 RINTF("Old PIN v
25760 61 6c 75 65 20 69 73 20 77 72 6f 6e 67 20 28 6e alue is wrong (n
25770 75 6c 6c 29 2e 22 29 3b 0a 0a 09 09 63 61 63 6b ull).");....cack
25780 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 ey_mutex_unlock(
25790 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
257a0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 ....return(CKR_P
257b0 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a 09 IN_INCORRECT);..
257c0 7d 0a 0a 09 69 66 20 28 75 6c 4f 6c 64 50 69 6e }...if (ulOldPin
257d0 4c 65 6e 20 3d 3d 20 30 20 7c 7c 20 75 6c 4f 6c Len == 0 || ulOl
257e0 64 50 69 6e 4c 65 6e 20 3e 20 38 29 20 7b 0a 09 dPinLen > 8) {..
257f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
25800 49 4e 54 46 28 22 4f 6c 64 20 50 49 4e 20 6c 65 INTF("Old PIN le
25810 6e 67 74 68 20 69 73 20 77 72 6f 6e 67 3a 20 25 ngth is wrong: %
25820 6c 75 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 lu.", (unsigned
25830 6c 6f 6e 67 29 20 75 6c 4f 6c 64 50 69 6e 4c 65 long) ulOldPinLe
25840 6e 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 n);....cackey_mu
25850 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 tex_unlock(cacke
25860 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 y_biglock);....r
25870 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e eturn(CKR_PIN_IN
25880 43 4f 52 52 45 43 54 29 3b 0a 09 7d 0a 0a 09 69 CORRECT);..}...i
25890 66 20 28 70 4e 65 77 50 69 6e 20 3d 3d 20 4e 55 f (pNewPin == NU
258a0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 LL) {...CACKEY_D
258b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4e 65 77 EBUG_PRINTF("New
258c0 20 50 49 4e 20 76 61 6c 75 65 20 69 73 20 77 72 PIN value is wr
258d0 6f 6e 67 20 28 65 69 74 68 65 72 20 4e 55 4c 4c ong (either NULL
258e0 2c 20 6f 72 20 74 6f 6f 20 6c 6f 6e 67 2f 73 68 , or too long/sh
258f0 6f 72 74 29 2e 22 29 3b 0a 0a 09 09 63 61 63 6b ort).");....cack
25900 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 ey_mutex_unlock(
25910 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
25920 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 ....return(CKR_P
25930 49 4e 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a IN_INVALID);..}.
25940 0a 09 69 66 20 28 75 6c 4e 65 77 50 69 6e 4c 65 ..if (ulNewPinLe
25950 6e 20 3c 20 35 20 7c 7c 20 75 6c 4e 65 77 50 69 n < 5 || ulNewPi
25960 6e 4c 65 6e 20 3e 20 38 29 20 7b 0a 09 09 43 41 nLen > 8) {...CA
25970 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
25980 46 28 22 4e 65 77 20 50 49 4e 20 6c 65 6e 67 74 F("New PIN lengt
25990 68 20 69 73 20 77 72 6f 6e 67 3a 20 25 6c 75 2c h is wrong: %lu,
259a0 20 6d 75 73 74 20 62 65 20 61 74 6c 65 61 73 74 must be atleast
259b0 20 35 20 61 6e 64 20 6e 6f 20 6d 6f 72 65 20 74 5 and no more t
259c0 68 61 6e 20 38 2e 22 2c 20 28 75 6e 73 69 67 6e han 8.", (unsign
259d0 65 64 20 6c 6f 6e 67 29 20 75 6c 4e 65 77 50 69 ed long) ulNewPi
259e0 6e 4c 65 6e 29 3b 0a 0a 09 09 63 61 63 6b 65 79 nLen);....cackey
259f0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 _mutex_unlock(ca
25a00 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a ckey_biglock);..
25a10 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e ..return(CKR_PIN
25a20 5f 4c 45 4e 5f 52 41 4e 47 45 29 3b 0a 09 7d 0a _LEN_RANGE);..}.
25a30 0a 09 73 65 74 5f 70 69 6e 5f 72 65 74 20 3d 20 ..set_pin_ret =
25a40 63 61 63 6b 65 79 5f 73 65 74 5f 70 69 6e 28 26 cackey_set_pin(&
25a50 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f cackey_slots[slo
25a60 74 49 44 5d 2c 20 70 4f 6c 64 50 69 6e 2c 20 75 tID], pOldPin, u
25a70 6c 4f 6c 64 50 69 6e 4c 65 6e 2c 20 70 4e 65 77 lOldPinLen, pNew
25a80 50 69 6e 2c 20 75 6c 4e 65 77 50 69 6e 4c 65 6e Pin, ulNewPinLen
25a90 29 3b 0a 0a 09 69 66 20 28 73 65 74 5f 70 69 6e );...if (set_pin
25aa0 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 _ret != CACKEY_P
25ab0 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 69 66 CSC_S_OK) {...if
25ac0 20 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d (cackey_pin_com
25ad0 6d 61 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a mand == NULL) {.
25ae0 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b ...cackey_slots[
25af0 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c slotID].token_fl
25b00 61 67 73 20 7c 3d 20 43 4b 46 5f 4c 4f 47 49 4e ags |= CKF_LOGIN
25b10 5f 52 45 51 55 49 52 45 44 3b 0a 09 09 7d 0a 0a _REQUIRED;...}..
25b20 09 09 69 66 20 28 73 65 74 5f 70 69 6e 5f 72 65 ..if (set_pin_re
25b30 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 t == CACKEY_PCSC
25b40 5f 45 5f 4c 4f 43 4b 45 44 29 20 7b 0a 09 09 09 _E_LOCKED) {....
25b50 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f cackey_slots[slo
25b60 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 tID].token_flags
25b70 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e |= CKF_USER_PIN
25b80 5f 4c 4f 43 4b 45 44 3b 0a 09 09 7d 0a 09 7d 0a _LOCKED;...}..}.
25b90 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d ..mutex_retval =
25ba0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e cackey_mutex_un
25bb0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
25bc0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 ock);..if (mutex
25bd0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a _retval != 0) {.
25be0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
25bf0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 RINTF("Error. U
25c00 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e nlocking failed.
25c10 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
25c20 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 R_GENERAL_ERROR)
25c30 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 73 ;..}...switch (s
25c40 65 74 5f 70 69 6e 5f 72 65 74 29 20 7b 0a 09 09 et_pin_ret) {...
25c50 63 61 73 65 20 43 41 43 4b 45 59 5f 50 43 53 43 case CACKEY_PCSC
25c60 5f 53 5f 4f 4b 3a 0a 09 09 09 43 41 43 4b 45 59 _S_OK:....CACKEY
25c70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 _DEBUG_PRINTF("S
25c80 75 63 63 65 73 73 66 75 6c 6c 79 20 73 65 74 20 uccessfully set
25c90 50 49 4e 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 PIN.");.....retu
25ca0 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 09 63 61 rn(CKR_OK);...ca
25cb0 73 65 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 se CACKEY_PCSC_E
25cc0 5f 42 41 44 50 49 4e 3a 0a 09 09 09 43 41 43 4b _BADPIN:....CACK
25cd0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
25ce0 22 50 49 4e 20 77 61 73 20 69 6e 76 61 6c 69 64 "PIN was invalid
25cf0 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 .");.....return(
25d00 43 4b 52 5f 50 49 4e 5f 49 4e 56 41 4c 49 44 29 CKR_PIN_INVALID)
25d10 3b 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f ;...case CACKEY_
25d20 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 3a 0a 09 PCSC_E_LOCKED:..
25d30 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
25d40 52 49 4e 54 46 28 22 54 6f 6b 65 6e 20 69 73 20 RINTF("Token is
25d50 6c 6f 63 6b 65 64 20 6f 72 20 74 68 69 73 20 63 locked or this c
25d60 68 61 6e 67 65 20 69 73 20 6e 6f 74 20 70 65 72 hange is not per
25d70 6d 69 74 74 65 64 2e 22 29 3b 0a 0a 09 09 09 72 mitted.");.....r
25d80 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 4c 4f eturn(CKR_PIN_LO
25d90 43 4b 45 44 29 3b 0a 09 09 64 65 66 61 75 6c 74 CKED);...default
25da0 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 :....CACKEY_DEBU
25db0 47 5f 50 52 49 4e 54 46 28 22 53 6f 6d 65 74 68 G_PRINTF("Someth
25dc0 69 6e 67 20 65 6c 73 65 20 77 65 6e 74 20 77 72 ing else went wr
25dd0 6f 6e 67 20 63 68 61 6e 67 69 6e 67 20 74 68 65 ong changing the
25de0 20 50 49 4e 3a 20 25 69 22 2c 20 73 65 74 5f 70 PIN: %i", set_p
25df0 69 6e 5f 72 65 74 29 3b 0a 0a 09 09 09 72 65 74 in_ret);.....ret
25e00 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f urn(CKR_GENERAL_
25e10 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 72 65 74 ERROR);..}...ret
25e20 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f urn(CKR_GENERAL_
25e30 45 52 52 4f 52 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 ERROR);.}..CK_DE
25e40 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b FINE_FUNCTION(CK
25e50 5f 52 56 2c 20 43 5f 4f 70 65 6e 53 65 73 73 69 _RV, C_OpenSessi
25e60 6f 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 on)(CK_SLOT_ID s
25e70 6c 6f 74 49 44 2c 20 43 4b 5f 46 4c 41 47 53 20 lotID, CK_FLAGS
25e80 66 6c 61 67 73 2c 20 43 4b 5f 56 4f 49 44 5f 50 flags, CK_VOID_P
25e90 54 52 20 70 41 70 70 6c 69 63 61 74 69 6f 6e 2c TR pApplication,
25ea0 20 43 4b 5f 4e 4f 54 49 46 59 20 6e 6f 74 69 66 CK_NOTIFY notif
25eb0 79 2c 20 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 y, CK_SESSION_HA
25ec0 4e 44 4c 45 5f 50 54 52 20 70 68 53 65 73 73 69 NDLE_PTR phSessi
25ed0 6f 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 on) {..unsigned
25ee0 6c 6f 6e 67 20 69 64 78 3b 0a 09 69 6e 74 20 6d long idx;..int m
25ef0 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e utex_retval;..in
25f00 74 20 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 20 t found_session
25f10 3d 20 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 = 0;...CACKEY_DE
25f20 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
25f30 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 66 6c ed.");...if ((fl
25f40 61 67 73 20 26 20 43 4b 46 5f 53 45 52 49 41 4c ags & CKF_SERIAL
25f50 5f 53 45 53 53 49 4f 4e 29 20 21 3d 20 43 4b 46 _SESSION) != CKF
25f60 5f 53 45 52 49 41 4c 5f 53 45 53 53 49 4f 4e 29 _SERIAL_SESSION)
25f70 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f {...return(CKR_
25f80 53 45 53 53 49 4f 4e 5f 50 41 52 41 4c 4c 45 4c SESSION_PARALLEL
25f90 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
25fa0 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ..}...if (!cacke
25fb0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b y_initialized) {
25fc0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
25fd0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
25fe0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e Not initialized.
25ff0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
26000 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 R_CRYPTOKI_NOT_I
26010 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
26020 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 ..if (slotID < 0
26030 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 || slotID >= (s
26040 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f izeof(cackey_slo
26050 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 ts) / sizeof(cac
26060 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 key_slots[0])))
26070 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
26080 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
26090 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 Invalid slot req
260a0 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 uested (%lu), ou
260b0 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 tside of valid r
260c0 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a ange", slotID);.
260d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c ...return(CKR_SL
260e0 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a OT_ID_INVALID);.
260f0 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 .}...mutex_retva
26100 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 l = cackey_mutex
26110 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 _lock(cackey_big
26120 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 lock);..if (mute
26130 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b x_retval != 0) {
26140 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
26150 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
26160 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 Locking failed."
26170 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
26180 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b _GENERAL_ERROR);
26190 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 ..}...if (cackey
261a0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 _slots[slotID].a
261b0 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 ctive == 0) {...
261c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
261d0 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 NTF("Error. Inva
261e0 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 lid slot request
261f0 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e ed (%lu), slot n
26200 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 ot currently act
26210 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a ive", slotID);..
26220 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 ..cackey_mutex_u
26230 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 nlock(cackey_big
26240 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e lock);....return
26250 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 (CKR_SLOT_ID_INV
26260 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 ALID);..}.../* V
26270 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63 erify that the c
26280 61 72 64 20 69 73 20 61 63 74 75 61 6c 6c 79 20 ard is actually
26290 69 6e 20 74 68 65 20 73 6c 6f 74 2e 20 2a 2f 0a in the slot. */.
262a0 09 2f 2a 20 58 58 58 3a 20 43 68 65 63 6b 20 74 ./* XXX: Check t
262b0 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 69 73 o make sure this
262c0 20 69 73 20 69 6e 20 74 68 65 20 50 4b 43 53 23 is in the PKCS#
262d0 31 31 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 11 specification
262e0 20 2a 2f 0a 09 69 66 20 28 63 61 63 6b 65 79 5f */..if (cackey_
262f0 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26 63 token_present(&c
26300 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 ackey_slots[slot
26310 49 44 5d 29 20 21 3d 20 43 41 43 4b 45 59 5f 50 ID]) != CACKEY_P
26320 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 CSC_S_TOKENPRESE
26330 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 NT) {...CACKEY_D
26340 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
26350 6f 72 2e 20 20 43 61 72 64 20 6e 6f 74 20 70 72 or. Card not pr
26360 65 73 65 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e esent. Returnin
26370 67 20 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d g CKR_DEVICE_REM
26380 4f 56 45 44 22 29 3b 0a 0a 09 09 63 61 63 6b 65 OVED");....cacke
26390 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
263a0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
263b0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 44 45 ...return(CKR_DE
263c0 56 49 43 45 5f 52 45 4d 4f 56 45 44 29 3b 0a 09 VICE_REMOVED);..
263d0 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 31 }...for (idx = 1
263e0 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 ; idx < (sizeof(
263f0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 cackey_sessions)
26400 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 / sizeof(cackey
26410 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 _sessions[0]));
26420 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 21 idx++) {...if (!
26430 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
26440 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 idx].active) {..
26450 09 09 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 20 ..found_session
26460 3d 20 31 3b 0a 0a 09 09 09 2a 70 68 53 65 73 73 = 1;.....*phSess
26470 69 6f 6e 20 3d 20 69 64 78 3b 0a 0a 09 09 09 63 ion = idx;.....c
26480 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 ackey_sessions[i
26490 64 78 5d 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a dx].active = 1;.
264a0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f ...cackey_sessio
264b0 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74 49 44 20 3d ns[idx].slotID =
264c0 20 73 6c 6f 74 49 44 3b 0a 09 09 09 63 61 63 6b slotID;....cack
264d0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d ey_sessions[idx]
264e0 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f .state = CKS_RO_
264f0 50 55 42 4c 49 43 5f 53 45 53 53 49 4f 4e 3b 0a PUBLIC_SESSION;.
26500 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f ...cackey_sessio
26510 6e 73 5b 69 64 78 5d 2e 66 6c 61 67 73 20 3d 20 ns[idx].flags =
26520 66 6c 61 67 73 3b 0a 09 09 09 63 61 63 6b 65 79 flags;....cackey
26530 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 75 _sessions[idx].u
26540 6c 44 65 76 69 63 65 45 72 72 6f 72 20 3d 20 30 lDeviceError = 0
26550 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 ;....cackey_sess
26560 69 6f 6e 73 5b 69 64 78 5d 2e 70 41 70 70 6c 69 ions[idx].pAppli
26570 63 61 74 69 6f 6e 20 3d 20 70 41 70 70 6c 69 63 cation = pApplic
26580 61 74 69 6f 6e 3b 0a 09 09 09 63 61 63 6b 65 79 ation;....cackey
26590 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 4e _sessions[idx].N
265a0 6f 74 69 66 79 20 3d 20 6e 6f 74 69 66 79 3b 0a otify = notify;.
265b0 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 ....cackey_sessi
265c0 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 ons[idx].identit
265d0 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63 ies = NULL;....c
265e0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 ackey_sessions[i
265f0 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 dx].identities_c
26600 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 09 63 61 ount = 0;.....ca
26610 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 ckey_sessions[id
26620 78 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 x].search_active
26630 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 = 0;.....cackey
26640 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 _sessions[idx].s
26650 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a ign_active = 0;.
26660 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 ....cackey_sessi
26670 6f 6e 73 5b 69 64 78 5d 2e 64 65 63 72 79 70 74 ons[idx].decrypt
26680 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 _active = 0;....
26690 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 .cackey_sessions
266a0 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 [idx].identities
266b0 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 69 = cackey_read_i
266c0 64 65 6e 74 69 74 69 65 73 28 26 63 61 63 6b 65 dentities(&cacke
266d0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c y_slots[slotID],
266e0 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e &cackey_session
266f0 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 s[idx].identitie
26700 73 5f 63 6f 75 6e 74 29 3b 0a 0a 0a 09 09 09 62 s_count);......b
26710 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d reak;...}..}...m
26720 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 utex_retval = ca
26730 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 ckey_mutex_unloc
26740 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
26750 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 );..if (mutex_re
26760 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 tval != 0) {...C
26770 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
26780 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f TF("Error. Unlo
26790 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b cking failed.");
267a0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 ....return(CKR_G
267b0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 ENERAL_ERROR);..
267c0 7d 0a 0a 09 69 66 20 28 21 66 6f 75 6e 64 5f 73 }...if (!found_s
267d0 65 73 73 69 6f 6e 29 20 7b 0a 09 09 43 41 43 4b ession) {...CACK
267e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
267f0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 53 "Returning CKR_S
26800 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 20 28 25 69 ESSION_COUNT (%i
26810 29 22 2c 20 43 4b 52 5f 53 45 53 53 49 4f 4e 5f )", CKR_SESSION_
26820 43 4f 55 4e 54 29 3b 0a 0a 09 09 72 65 74 75 72 COUNT);....retur
26830 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f n(CKR_SESSION_CO
26840 55 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 UNT);..}...CACKE
26850 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
26860 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b Returning CKR_OK
26870 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b (%i)", CKR_OK);
26880 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b ...return(CKR_OK
26890 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f );.}..CK_DEFINE_
268a0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 FUNCTION(CK_RV,
268b0 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 29 28 C_CloseSession)(
268c0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c CK_SESSION_HANDL
268d0 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 69 E hSession) {..i
268e0 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b nt mutex_retval;
268f0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
26900 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
26910 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 );...if (!cackey
26920 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
26930 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
26940 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e RINTF("Error. N
26950 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 ot initialized."
26960 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
26970 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e _CRYPTOKI_NOT_IN
26980 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
26990 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d .if (hSession ==
269a0 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 0 || hSession >
269b0 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 = (sizeof(cackey
269c0 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a _sessions) / siz
269d0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 eof(cackey_sessi
269e0 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 ons[0]))) {...CA
269f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
26a00 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 F("Error. Sessi
26a10 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e on out of range.
26a20 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 ");......return(
26a30 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 CKR_SESSION_HAND
26a40 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a LE_INVALID);..}.
26a50 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d ..mutex_retval =
26a60 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f cackey_mutex_lo
26a70 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
26a80 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 k);..if (mutex_r
26a90 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 etval != 0) {...
26aa0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
26ab0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 NTF("Error. Loc
26ac0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a king failed.");.
26ad0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 ...return(CKR_GE
26ae0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d NERAL_ERROR);..}
26af0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 ...if (!cackey_s
26b00 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
26b10 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 ].active) {...ca
26b20 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 ckey_mutex_unloc
26b30 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
26b40 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 );....CACKEY_DEB
26b50 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
26b60 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 . Session not a
26b70 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 ctive.");......r
26b80 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f eturn(CKR_SESSIO
26b90 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 N_HANDLE_INVALID
26ba0 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 );..}...cackey_s
26bb0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
26bc0 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 63 ].active = 0;..c
26bd0 61 63 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e 74 ackey_free_ident
26be0 69 74 69 65 73 28 63 61 63 6b 65 79 5f 73 65 73 ities(cackey_ses
26bf0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
26c00 69 64 65 6e 74 69 74 69 65 73 2c 20 63 61 63 6b identities, cack
26c10 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
26c20 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 sion].identities
26c30 5f 63 6f 75 6e 74 29 3b 0a 0a 09 6d 75 74 65 78 _count);...mutex
26c40 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 _retval = cackey
26c50 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 _mutex_unlock(ca
26c60 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 ckey_biglock);..
26c70 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c if (mutex_retval
26c80 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 != 0) {...CACKE
26c90 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
26ca0 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e Error. Unlockin
26cb0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 g failed.");....
26cc0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 return(CKR_GENER
26cd0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 AL_ERROR);..}...
26ce0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
26cf0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 NTF("Returning C
26d00 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 KR_OK (%i)", CKR
26d10 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 _OK);...return(C
26d20 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 KR_OK);.}..CK_DE
26d30 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b FINE_FUNCTION(CK
26d40 5f 52 56 2c 20 43 5f 43 6c 6f 73 65 41 6c 6c 53 _RV, C_CloseAllS
26d50 65 73 73 69 6f 6e 73 29 28 43 4b 5f 53 4c 4f 54 essions)(CK_SLOT
26d60 5f 49 44 20 73 6c 6f 74 49 44 29 20 7b 0a 09 75 _ID slotID) {..u
26d70 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 09 69 6e int32_t idx;..in
26d80 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a t mutex_retval;.
26d90 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
26da0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
26db0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f ;...if (!cackey_
26dc0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 initialized) {..
26dd0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
26de0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f INTF("Error. No
26df0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 t initialized.")
26e00 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
26e10 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 CRYPTOKI_NOT_INI
26e20 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 TIALIZED);..}...
26e30 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c if (slotID < 0 |
26e40 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a | slotID >= (siz
26e50 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 eof(cackey_slots
26e60 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 ) / sizeof(cacke
26e70 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a y_slots[0]))) {.
26e80 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
26e90 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e RINTF("Error. In
26ea0 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 valid slot reque
26eb0 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 sted (%lu), outs
26ec0 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e ide of valid ran
26ed0 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 ge", slotID);...
26ee0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 .return(CKR_SLOT
26ef0 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d _ID_INVALID);..}
26f00 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 ...mutex_retval
26f10 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c = cackey_mutex_l
26f20 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
26f30 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f ck);..if (mutex_
26f40 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 retval != 0) {..
26f50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
26f60 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f INTF("Error. Lo
26f70 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b cking failed.");
26f80 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 ....return(CKR_G
26f90 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 ENERAL_ERROR);..
26fa0 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 }...if (cackey_s
26fb0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 lots[slotID].act
26fc0 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 ive == 0) {...CA
26fd0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
26fe0 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 F("Error. Invali
26ff0 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 d slot requested
27000 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 (%lu), slot not
27010 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 currently activ
27020 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 e", slotID);....
27030 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c cackey_mutex_unl
27040 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
27050 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 ck);....return(C
27060 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c KR_SLOT_ID_INVAL
27070 49 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 ID);..}...for (i
27080 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 dx = 0; idx < (s
27090 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 izeof(cackey_ses
270a0 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 sions) / sizeof(
270b0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
270c0 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 0])); idx++) {..
270d0 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 .if (cackey_sess
270e0 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 ions[idx].active
270f0 29 20 7b 0a 09 09 09 69 66 20 28 63 61 63 6b 65 ) {....if (cacke
27100 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e y_sessions[idx].
27110 73 6c 6f 74 49 44 20 21 3d 20 73 6c 6f 74 49 44 slotID != slotID
27120 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 ) {.....continue
27130 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 ;....}.....cacke
27140 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
27150 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
27160 09 09 09 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f ...C_CloseSessio
27170 6e 28 69 64 78 29 3b 0a 09 09 09 63 61 63 6b 65 n(idx);....cacke
27180 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 y_mutex_lock(cac
27190 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 key_biglock);...
271a0 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 }..}...mutex_ret
271b0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 val = cackey_mut
271c0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 ex_unlock(cackey
271d0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 _biglock);..if (
271e0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 mutex_retval !=
271f0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 0) {...CACKEY_DE
27200 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
27210 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 r. Unlocking fa
27220 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 iled.");....retu
27230 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 rn(CKR_GENERAL_E
27240 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b RROR);..}...CACK
27250 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
27260 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f "Returning CKR_O
27270 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 K (%i)", CKR_OK)
27280 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f ;...return(CKR_O
27290 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 K);.}..CK_DEFINE
272a0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c _FUNCTION(CK_RV,
272b0 20 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e 66 C_GetSessionInf
272c0 6f 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 o)(CK_SESSION_HA
272d0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 NDLE hSession, C
272e0 4b 5f 53 45 53 53 49 4f 4e 5f 49 4e 46 4f 5f 50 K_SESSION_INFO_P
272f0 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 69 6e 74 TR pInfo) {..int
27300 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a mutex_retval;..
27310 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
27320 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
27330 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 ...if (pInfo ==
27340 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 NULL) {...CACKEY
27350 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
27360 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e rror. pInfo is N
27370 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 ULL.");....retur
27380 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f n(CKR_ARGUMENTS_
27390 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 BAD);..}...if (!
273a0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a cackey_initializ
273b0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...CACKEY_D
273c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
273d0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c or. Not initial
273e0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 ized.");....retu
273f0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f rn(CKR_CRYPTOKI_
27400 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 NOT_INITIALIZED)
27410 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 ;..}...if (hSess
27420 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 ion == 0 || hSes
27430 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 sion >= (sizeof(
27440 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 cackey_sessions)
27450 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 / sizeof(cackey
27460 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 _sessions[0])))
27470 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
27480 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
27490 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 Session out of
274a0 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 range.");......r
274b0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f eturn(CKR_SESSIO
274c0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 N_HANDLE_INVALID
274d0 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 );..}...mutex_re
274e0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 tval = cackey_mu
274f0 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f tex_lock(cackey_
27500 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d biglock);..if (m
27510 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 utex_retval != 0
27520 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
27530 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
27540 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 . Locking faile
27550 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
27560 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f CKR_GENERAL_ERRO
27570 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 R);..}...if (!ca
27580 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
27590 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 ession].active)
275a0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 {...cackey_mutex
275b0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 _unlock(cackey_b
275c0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b iglock);....CACK
275d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
275e0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e "Error. Session
275f0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a not active.");.
27600 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f .....return(CKR_
27610 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 SESSION_HANDLE_I
27620 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 70 49 NVALID);..}...pI
27630 6e 66 6f 2d 3e 73 6c 6f 74 49 44 20 3d 20 63 61 nfo->slotID = ca
27640 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
27650 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a ession].slotID;.
27660 09 70 49 6e 66 6f 2d 3e 73 74 61 74 65 20 3d 20 .pInfo->state =
27670 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
27680 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65 3b hSession].state;
27690 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d ..pInfo->flags =
276a0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 cackey_sessions
276b0 5b 68 53 65 73 73 69 6f 6e 5d 2e 66 6c 61 67 73 [hSession].flags
276c0 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 44 65 76 69 ;..pInfo->ulDevi
276d0 63 65 45 72 72 6f 72 20 3d 20 63 61 63 6b 65 79 ceError = cackey
276e0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
276f0 6f 6e 5d 2e 75 6c 44 65 76 69 63 65 45 72 72 6f on].ulDeviceErro
27700 72 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 r;...mutex_retva
27710 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 l = cackey_mutex
27720 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 _unlock(cackey_b
27730 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 iglock);..if (mu
27740 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 tex_retval != 0)
27750 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
27760 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
27770 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c Unlocking fail
27780 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
27790 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 (CKR_GENERAL_ERR
277a0 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 OR);..}...CACKEY
277b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
277c0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 eturning CKR_OK
277d0 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a (%i)", CKR_OK);.
277e0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 ..return(CKR_OK)
277f0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 ;.}..CK_DEFINE_F
27800 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 UNCTION(CK_RV, C
27810 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 _GetOperationSta
27820 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 te)(CK_SESSION_H
27830 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 ANDLE hSession,
27840 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4f 70 65 CK_BYTE_PTR pOpe
27850 72 61 74 69 6f 6e 53 74 61 74 65 2c 20 43 4b 5f rationState, CK_
27860 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4f 70 65 ULONG_PTR pulOpe
27870 72 61 74 69 6f 6e 53 74 61 74 65 4c 65 6e 29 20 rationStateLen)
27880 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f {..CACKEY_DEBUG_
27890 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
278a0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 );...if (!cackey
278b0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
278c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
278d0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e RINTF("Error. N
278e0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 ot initialized."
278f0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
27900 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e _CRYPTOKI_NOT_IN
27910 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
27920 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
27930 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
27940 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
27950 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 _SUPPORTED (%i)"
27960 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e , CKR_FUNCTION_N
27970 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a OT_SUPPORTED);..
27980 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 .return(CKR_FUNC
27990 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
279a0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e ED);.}..CK_DEFIN
279b0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 E_FUNCTION(CK_RV
279c0 2c 20 43 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e , C_SetOperation
279d0 53 74 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f State)(CK_SESSIO
279e0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f N_HANDLE hSessio
279f0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 n, CK_BYTE_PTR p
27a00 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 2c 20 OperationState,
27a10 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 70 65 72 61 CK_ULONG ulOpera
27a20 74 69 6f 6e 53 74 61 74 65 4c 65 6e 2c 20 43 4b tionStateLen, CK
27a30 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 _OBJECT_HANDLE h
27a40 45 6e 63 72 79 70 74 69 6f 6e 4b 65 79 2c 20 43 EncryptionKey, C
27a50 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 K_OBJECT_HANDLE
27a60 68 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 4b hAuthenticationK
27a70 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 ey) {..CACKEY_DE
27a80 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
27a90 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 ed.");...if (!ca
27aa0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 ckey_initialized
27ab0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
27ac0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
27ad0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a . Not initializ
27ae0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
27af0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f (CKR_CRYPTOKI_NO
27b00 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a T_INITIALIZED);.
27b10 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 .}...CACKEY_DEBU
27b20 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
27b30 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e ing CKR_FUNCTION
27b40 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 _NOT_SUPPORTED (
27b50 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 %i)", CKR_FUNCTI
27b60 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
27b70 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f );...return(CKR_
27b80 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
27b90 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 PORTED);.}..CK_D
27ba0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 EFINE_FUNCTION(C
27bb0 4b 5f 52 56 2c 20 43 5f 4c 6f 67 69 6e 4d 75 74 K_RV, C_LoginMut
27bc0 65 78 41 72 67 29 28 43 4b 5f 53 45 53 53 49 4f exArg)(CK_SESSIO
27bd0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f N_HANDLE hSessio
27be0 6e 2c 20 43 4b 5f 55 53 45 52 5f 54 59 50 45 20 n, CK_USER_TYPE
27bf0 75 73 65 72 54 79 70 65 2c 20 43 4b 5f 55 54 46 userType, CK_UTF
27c00 38 43 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 8CHAR_PTR pPin,
27c10 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 CK_ULONG ulPinLe
27c20 6e 2c 20 69 6e 74 20 6c 6f 63 6b 5f 6d 75 74 65 n, int lock_mute
27c30 78 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 x) {..CK_SLOT_ID
27c40 20 73 6c 6f 74 49 44 3b 0a 09 63 61 63 6b 65 79 slotID;..cackey
27c50 5f 72 65 74 20 67 65 74 5f 70 69 6e 5f 72 65 74 _ret get_pin_ret
27c60 3b 0a 09 63 68 61 72 20 70 69 6e 62 75 66 5b 36 ;..char pinbuf[6
27c70 34 5d 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 4];..int mutex_r
27c80 65 74 76 61 6c 3b 0a 09 69 6e 74 20 74 72 69 65 etval;..int trie
27c90 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 69 6e s_remaining;..in
27ca0 74 20 6c 6f 67 69 6e 5f 72 65 74 3b 0a 0a 09 43 t login_ret;...C
27cb0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
27cc0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
27cd0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 .if (!cackey_ini
27ce0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 tialized) {...CA
27cf0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
27d00 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 F("Error. Not i
27d10 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a nitialized.");..
27d20 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 ..return(CKR_CRY
27d30 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 PTOKI_NOT_INITIA
27d40 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 LIZED);..}...if
27d50 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c (hSession == 0 |
27d60 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 | hSession >= (s
27d70 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 izeof(cackey_ses
27d80 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 sions) / sizeof(
27d90 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
27da0 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 0]))) {...CACKEY
27db0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
27dc0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f rror. Session o
27dd0 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a ut of range.");.
27de0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f .....return(CKR_
27df0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 SESSION_HANDLE_I
27e00 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 NVALID);..}...if
27e10 20 28 75 73 65 72 54 79 70 65 20 21 3d 20 43 4b (userType != CK
27e20 55 5f 55 53 45 52 29 20 7b 0a 09 09 43 41 43 4b U_USER) {...CACK
27e30 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
27e40 22 45 72 72 6f 72 2e 20 20 57 65 20 6f 6e 6c 79 "Error. We only
27e50 20 73 75 70 70 6f 72 74 20 55 53 45 52 20 6d 6f support USER mo
27e60 64 65 2c 20 61 73 6b 65 64 20 66 6f 72 20 25 6c de, asked for %l
27e70 75 20 6d 6f 64 65 2e 22 2c 20 28 75 6e 73 69 67 u mode.", (unsig
27e80 6e 65 64 20 6c 6f 6e 67 29 20 75 73 65 72 54 79 ned long) userTy
27e90 70 65 29 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b pe)....return(CK
27ea0 52 5f 55 53 45 52 5f 54 59 50 45 5f 49 4e 56 41 R_USER_TYPE_INVA
27eb0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6c LID);..}...if (l
27ec0 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09 6d ock_mutex) {...m
27ed0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 utex_retval = ca
27ee0 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 ckey_mutex_lock(
27ef0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
27f00 0a 09 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 ...if (mutex_ret
27f10 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 val != 0) {....C
27f20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
27f30 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b TF("Error. Lock
27f40 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a ing failed.");..
27f50 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 ...return(CKR_GE
27f60 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 NERAL_ERROR);...
27f70 7d 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b }..}...if (!cack
27f80 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
27f90 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a sion].active) {.
27fa0 09 09 69 66 20 28 6c 6f 63 6b 5f 6d 75 74 65 78 ..if (lock_mutex
27fb0 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 ) {....cackey_mu
27fc0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 tex_unlock(cacke
27fd0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a y_biglock);...}.
27fe0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
27ff0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
28000 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 Session not acti
28010 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 ve.");......retu
28020 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 rn(CKR_SESSION_H
28030 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a ANDLE_INVALID);.
28040 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 .}...slotID = ca
28050 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
28060 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a ession].slotID;.
28070 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 ..if (slotID < 0
28080 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 || slotID >= (s
28090 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f izeof(cackey_slo
280a0 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 ts) / sizeof(cac
280b0 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 key_slots[0])))
280c0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
280d0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
280e0 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 Invalid slot req
280f0 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 uested (%lu), ou
28100 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 tside of valid r
28110 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a ange", slotID);.
28120 0a 09 09 69 66 20 28 6c 6f 63 6b 5f 6d 75 74 65 ...if (lock_mute
28130 78 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 6d x) {....cackey_m
28140 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b utex_unlock(cack
28150 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d ey_biglock);...}
28160 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 ....return(CKR_G
28170 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 ENERAL_ERROR);..
28180 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 }...if (cackey_s
28190 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 lots[slotID].act
281a0 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 ive == 0) {...CA
281b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
281c0 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 F("Error. Invali
281d0 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 d slot requested
281e0 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 (%lu), slot not
281f0 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 currently activ
28200 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 e", slotID);....
28210 69 66 20 28 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 if (lock_mutex)
28220 7b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 {....cackey_mute
28230 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
28240 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 0a 09 biglock);...}...
28250 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 .return(CKR_GENE
28260 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a RAL_ERROR);..}..
28270 09 69 66 20 28 63 61 63 6b 65 79 5f 70 69 6e 5f .if (cackey_pin_
28280 63 6f 6d 6d 61 6e 64 20 21 3d 20 4e 55 4c 4c 29 command != NULL)
28290 20 7b 0a 09 09 69 66 20 28 70 50 69 6e 20 21 3d {...if (pPin !=
282a0 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b NULL) {....CACK
282b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
282c0 22 50 72 6f 74 65 63 74 65 64 20 61 75 74 68 65 "Protected authe
282d0 6e 74 69 63 61 74 69 6f 6e 20 70 61 74 68 20 69 ntication path i
282e0 6e 20 65 66 66 65 63 74 20 61 6e 64 20 50 49 4e n effect and PIN
282f0 20 70 72 6f 76 69 64 65 64 20 21 3f 22 29 3b 0a provided !?");.
28300 09 09 7d 0a 0a 09 09 67 65 74 5f 70 69 6e 5f 72 ..}....get_pin_r
28310 65 74 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f et = cackey_get_
28320 70 69 6e 28 70 69 6e 62 75 66 29 3b 0a 0a 09 09 pin(pinbuf);....
28330 69 66 20 28 67 65 74 5f 70 69 6e 5f 72 65 74 20 if (get_pin_ret
28340 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 != CACKEY_PCSC_S
28350 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 _OK) {....CACKEY
28360 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 _DEBUG_PRINTF("c
28370 61 63 6b 65 79 5f 67 65 74 5f 70 69 6e 28 29 20 ackey_get_pin()
28380 72 65 74 75 72 6e 65 64 20 69 6e 20 66 61 69 6c returned in fail
28390 75 72 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 ure, assuming th
283a0 65 20 50 49 4e 20 77 61 73 20 69 6e 63 6f 72 72 e PIN was incorr
283b0 65 63 74 2e 22 29 3b 0a 0a 09 09 09 69 66 20 28 ect.");.....if (
283c0 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09 lock_mutex) {...
283d0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 ..cackey_mutex_u
283e0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 nlock(cackey_big
283f0 6c 6f 63 6b 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 lock);....}.....
28400 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 return(CKR_PIN_I
28410 4e 43 4f 52 52 45 43 54 29 3b 0a 09 09 7d 0a 0a NCORRECT);...}..
28420 09 09 70 50 69 6e 20 3d 20 28 43 4b 5f 55 54 46 ..pPin = (CK_UTF
28430 38 43 48 41 52 5f 50 54 52 29 20 70 69 6e 62 75 8CHAR_PTR) pinbu
28440 66 3b 0a 09 09 75 6c 50 69 6e 4c 65 6e 20 3d 20 f;...ulPinLen =
28450 73 74 72 6c 65 6e 28 70 69 6e 62 75 66 29 3b 0a strlen(pinbuf);.
28460 09 7d 0a 0a 09 6c 6f 67 69 6e 5f 72 65 74 20 3d .}...login_ret =
28470 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 26 63 cackey_login(&c
28480 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 ackey_slots[slot
28490 49 44 5d 2c 20 70 50 69 6e 2c 20 75 6c 50 69 6e ID], pPin, ulPin
284a0 4c 65 6e 2c 20 26 74 72 69 65 73 5f 72 65 6d 61 Len, &tries_rema
284b0 69 6e 69 6e 67 2c 20 33 29 3b 0a 09 69 66 20 28 ining, 3);..if (
284c0 6c 6f 67 69 6e 5f 72 65 74 20 21 3d 20 43 41 43 login_ret != CAC
284d0 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b KEY_PCSC_S_OK) {
284e0 0a 09 09 69 66 20 28 6c 6f 63 6b 5f 6d 75 74 65 ...if (lock_mute
284f0 78 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 6d x) {....cackey_m
28500 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b utex_unlock(cack
28510 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d ey_biglock);...}
28520 0a 0a 09 09 69 66 20 28 6c 6f 67 69 6e 5f 72 65 ....if (login_re
28530 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 t == CACKEY_PCSC
28540 5f 45 5f 4c 4f 43 4b 45 44 29 20 7b 0a 09 09 09 _E_LOCKED) {....
28550 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
28560 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 54 6f 6b NTF("Error. Tok
28570 65 6e 20 69 73 20 6c 6f 63 6b 65 64 2e 22 29 3b en is locked.");
28580 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 .....cackey_slot
28590 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f s[slotID].token_
285a0 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 55 53 45 flags |= CKF_USE
285b0 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 3b 0a 0a 09 R_PIN_LOCKED;...
285c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
285d0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
285e0 20 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 20 CKR_PIN_LOCKED
285f0 28 25 69 29 22 2c 20 28 69 6e 74 29 20 43 4b 52 (%i)", (int) CKR
28600 5f 50 49 4e 5f 4c 4f 43 4b 45 44 29 3b 0a 0a 09 _PIN_LOCKED);...
28610 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e ..return(CKR_PIN
28620 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d 20 65 6c _LOCKED);...} el
28630 73 65 20 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74 se if (login_ret
28640 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f == CACKEY_PCSC_
28650 45 5f 42 41 44 50 49 4e 29 20 7b 0a 09 09 09 43 E_BADPIN) {....C
28660 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
28670 54 46 28 22 45 72 72 6f 72 2e 20 20 49 6e 76 61 TF("Error. Inva
28680 6c 69 64 20 50 49 4e 2e 22 29 3b 0a 0a 09 09 09 lid PIN.");.....
28690 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f cackey_slots[slo
286a0 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 tID].token_flags
286b0 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e |= CKF_USER_PIN
286c0 5f 43 4f 55 4e 54 5f 4c 4f 57 3b 0a 0a 09 09 09 _COUNT_LOW;.....
286d0 69 66 20 28 74 72 69 65 73 5f 72 65 6d 61 69 6e if (tries_remain
286e0 69 6e 67 20 3d 3d 20 31 29 20 7b 0a 09 09 09 09 ing == 1) {.....
286f0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f cackey_slots[slo
28700 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 tID].token_flags
28710 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e |= CKF_USER_PIN
28720 5f 46 49 4e 41 4c 5f 54 52 59 3b 0a 09 09 09 7d _FINAL_TRY;....}
28730 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
28740 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
28750 69 6e 67 20 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f ing CKR_PIN_INCO
28760 52 52 45 43 54 20 28 25 69 29 22 2c 20 28 69 6e RRECT (%i)", (in
28770 74 29 20 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 t) CKR_PIN_INCOR
28780 52 45 43 54 29 3b 0a 0a 09 09 09 72 65 74 75 72 RECT);.....retur
28790 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 n(CKR_PIN_INCORR
287a0 45 43 54 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 ECT);...}....CAC
287b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
287c0 28 22 45 72 72 6f 72 2e 20 20 55 6e 6b 6e 6f 77 ("Error. Unknow
287d0 6e 20 65 72 72 6f 72 20 72 65 74 75 72 6e 65 64 n error returned
287e0 20 66 72 6f 6d 20 63 61 63 6b 65 79 5f 6c 6f 67 from cackey_log
287f0 69 6e 28 29 20 28 25 69 29 22 2c 20 6c 6f 67 69 in() (%i)", logi
28800 6e 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 n_ret);....retur
28810 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 n(CKR_GENERAL_ER
28820 52 4f 52 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 ROR);..}...cacke
28830 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e y_slots[slotID].
28840 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 26 3d 20 7e token_flags &= ~
28850 28 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 4c 4f (CKF_USER_PIN_LO
28860 43 4b 45 44 20 7c 20 43 4b 46 5f 55 53 45 52 5f CKED | CKF_USER_
28870 50 49 4e 5f 43 4f 55 4e 54 5f 4c 4f 57 20 7c 20 PIN_COUNT_LOW |
28880 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 CKF_LOGIN_REQUIR
28890 45 44 20 7c 20 43 4b 46 5f 55 53 45 52 5f 50 49 ED | CKF_USER_PI
288a0 4e 5f 46 49 4e 41 4c 5f 54 52 59 29 3b 0a 0a 09 N_FINAL_TRY);...
288b0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
288c0 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65 20 hSession].state
288d0 3d 20 43 4b 53 5f 52 4f 5f 55 53 45 52 5f 46 55 = CKS_RO_USER_FU
288e0 4e 43 54 49 4f 4e 53 3b 0a 0a 09 69 66 20 28 6c NCTIONS;...if (l
288f0 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09 6d ock_mutex) {...m
28900 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 utex_retval = ca
28910 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 ckey_mutex_unloc
28920 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
28930 29 3b 0a 09 09 69 66 20 28 6d 75 74 65 78 5f 72 );...if (mutex_r
28940 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 etval != 0) {...
28950 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
28960 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e INTF("Error. Un
28970 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 locking failed."
28980 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b );.....return(CK
28990 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 R_GENERAL_ERROR)
289a0 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 ;...}..}...CACKE
289b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
289c0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b Returning CKR_OK
289d0 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b (%i)", CKR_OK);
289e0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b ...return(CKR_OK
289f0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f );.}..CK_DEFINE_
28a00 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 FUNCTION(CK_RV,
28a10 43 5f 4c 6f 67 69 6e 29 28 43 4b 5f 53 45 53 53 C_Login)(CK_SESS
28a20 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 ION_HANDLE hSess
28a30 69 6f 6e 2c 20 43 4b 5f 55 53 45 52 5f 54 59 50 ion, CK_USER_TYP
28a40 45 20 75 73 65 72 54 79 70 65 2c 20 43 4b 5f 55 E userType, CK_U
28a50 54 46 38 43 48 41 52 5f 50 54 52 20 70 50 69 6e TF8CHAR_PTR pPin
28a60 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e , CK_ULONG ulPin
28a70 4c 65 6e 29 20 7b 0a 09 72 65 74 75 72 6e 28 43 Len) {..return(C
28a80 5f 4c 6f 67 69 6e 4d 75 74 65 78 41 72 67 28 68 _LoginMutexArg(h
28a90 53 65 73 73 69 6f 6e 2c 20 75 73 65 72 54 79 70 Session, userTyp
28aa0 65 2c 20 70 50 69 6e 2c 20 75 6c 50 69 6e 4c 65 e, pPin, ulPinLe
28ab0 6e 2c 20 31 29 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 n, 1));.}..CK_DE
28ac0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b FINE_FUNCTION(CK
28ad0 5f 52 56 2c 20 43 5f 4c 6f 67 6f 75 74 29 28 43 _RV, C_Logout)(C
28ae0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 K_SESSION_HANDLE
28af0 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 4b hSession) {..CK
28b00 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b _SLOT_ID slotID;
28b10 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 ..int mutex_retv
28b20 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 al;...CACKEY_DEB
28b30 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
28b40 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 d.");...if (!cac
28b50 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 key_initialized)
28b60 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
28b70 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
28b80 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 Not initialize
28b90 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
28ba0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 CKR_CRYPTOKI_NOT
28bb0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 _INITIALIZED);..
28bc0 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e }...if (hSession
28bd0 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f == 0 || hSessio
28be0 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 n >= (sizeof(cac
28bf0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 key_sessions) /
28c00 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 sizeof(cackey_se
28c10 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 ssions[0]))) {..
28c20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
28c30 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 INTF("Error. Se
28c40 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e ssion out of ran
28c50 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 ge.");......retu
28c60 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 rn(CKR_SESSION_H
28c70 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a ANDLE_INVALID);.
28c80 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 .}...mutex_retva
28c90 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 l = cackey_mutex
28ca0 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 _lock(cackey_big
28cb0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 lock);..if (mute
28cc0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b x_retval != 0) {
28cd0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
28ce0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
28cf0 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 Locking failed."
28d00 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
28d10 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b _GENERAL_ERROR);
28d20 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ..}...if (!cacke
28d30 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
28d40 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 ion].active) {..
28d50 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e .cackey_mutex_un
28d60 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
28d70 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f ock);....CACKEY_
28d80 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
28d90 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f ror. Session no
28da0 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a t active.");....
28db0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 ..return(CKR_SES
28dc0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 SION_HANDLE_INVA
28dd0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 LID);..}...slotI
28de0 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 D = cackey_sessi
28df0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c ons[hSession].sl
28e00 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 otID;...if (slot
28e10 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 ID < 0 || slotID
28e20 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b >= (sizeof(cack
28e30 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 ey_slots) / size
28e40 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b of(cackey_slots[
28e50 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 0]))) {...CACKEY
28e60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
28e70 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c rror. Invalid sl
28e80 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c ot requested (%l
28e90 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 u), outside of v
28ea0 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f alid range", slo
28eb0 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 tID);....return(
28ec0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f CKR_GENERAL_ERRO
28ed0 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 R);..}...if (cac
28ee0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 key_slots[slotID
28ef0 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b ].active == 0) {
28f00 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
28f10 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 PRINTF("Error. I
28f20 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 nvalid slot requ
28f30 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f ested (%lu), slo
28f40 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 t not currently
28f50 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 active", slotID)
28f60 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 ;....cackey_mute
28f70 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
28f80 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 biglock);....ret
28f90 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f urn(CKR_GENERAL_
28fa0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 63 61 63 ERROR);..}...cac
28fb0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
28fc0 73 73 69 6f 6e 5d 2e 73 74 61 74 65 20 3d 20 43 ssion].state = C
28fd0 4b 53 5f 52 4f 5f 50 55 42 4c 49 43 5f 53 45 53 KS_RO_PUBLIC_SES
28fe0 53 49 4f 4e 3b 0a 0a 09 69 66 20 28 63 61 63 6b SION;...if (cack
28ff0 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d ey_pin_command =
29000 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b = NULL) {...cack
29010 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d ey_slots[slotID]
29020 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 .token_flags = C
29030 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 KF_LOGIN_REQUIRE
29040 44 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 63 D;..} else {...c
29050 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 ackey_slots[slot
29060 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 ID].token_flags
29070 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f = 0;..}...mutex_
29080 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f retval = cackey_
29090 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 mutex_unlock(cac
290a0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 key_biglock);..i
290b0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 f (mutex_retval
290c0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 != 0) {...CACKEY
290d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
290e0 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 rror. Unlocking
290f0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 failed.");....r
29100 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 eturn(CKR_GENERA
29110 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 L_ERROR);..}...C
29120 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
29130 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b TF("Returning CK
29140 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f R_OK (%i)", CKR_
29150 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b OK);...return(CK
29160 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 R_OK);.}..CK_DEF
29170 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f INE_FUNCTION(CK_
29180 52 56 2c 20 43 5f 43 72 65 61 74 65 4f 62 6a 65 RV, C_CreateObje
29190 63 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 ct)(CK_SESSION_H
291a0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 ANDLE hSession,
291b0 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 CK_ATTRIBUTE_PTR
291c0 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 pTemplate, CK_U
291d0 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b LONG ulCount, CK
291e0 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 _OBJECT_HANDLE_P
291f0 54 52 20 70 68 4f 62 6a 65 63 74 29 20 7b 0a 09 TR phObject) {..
29200 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
29210 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a NTF("Called.");.
29220 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e ..if (!cackey_in
29230 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 itialized) {...C
29240 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
29250 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 TF("Error. Not
29260 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a initialized.");.
29270 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 ...return(CKR_CR
29280 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 YPTOKI_NOT_INITI
29290 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 ALIZED);..}...CA
292a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
292b0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 F("Returning CKR
292c0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
292d0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 PPORTED (%i)", C
292e0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
292f0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 SUPPORTED);...re
29300 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f turn(CKR_FUNCTIO
29310 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 N_NOT_SUPPORTED)
29320 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 ;.}..CK_DEFINE_F
29330 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 UNCTION(CK_RV, C
29340 5f 43 6f 70 79 4f 62 6a 65 63 74 29 28 43 4b 5f _CopyObject)(CK_
29350 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 SESSION_HANDLE h
29360 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 Session, CK_OBJE
29370 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 CT_HANDLE hObjec
29380 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f t, CK_ATTRIBUTE_
29390 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 PTR pTemplate, C
293a0 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c K_ULONG ulCount,
293b0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c CK_OBJECT_HANDL
293c0 45 5f 50 54 52 20 70 68 4e 65 77 4f 62 6a 65 63 E_PTR phNewObjec
293d0 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 t) {..CACKEY_DEB
293e0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
293f0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 d.");...if (!cac
29400 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 key_initialized)
29410 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
29420 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
29430 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 Not initialize
29440 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
29450 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 CKR_CRYPTOKI_NOT
29460 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 _INITIALIZED);..
29470 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 }...CACKEY_DEBUG
29480 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
29490 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f ng CKR_FUNCTION_
294a0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 NOT_SUPPORTED (%
294b0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f i)", CKR_FUNCTIO
294c0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 N_NOT_SUPPORTED)
294d0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 ;...return(CKR_F
294e0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
294f0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 ORTED);.}..CK_DE
29500 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b FINE_FUNCTION(CK
29510 5f 52 56 2c 20 43 5f 44 65 73 74 72 6f 79 4f 62 _RV, C_DestroyOb
29520 6a 65 63 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e ject)(CK_SESSION
29530 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e _HANDLE hSession
29540 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 , CK_OBJECT_HAND
29550 4c 45 20 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43 LE hObject) {..C
29560 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
29570 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
29580 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 .if (!cackey_ini
29590 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 tialized) {...CA
295a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
295b0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 F("Error. Not i
295c0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a nitialized.");..
295d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 ..return(CKR_CRY
295e0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 PTOKI_NOT_INITIA
295f0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 LIZED);..}...CAC
29600 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
29610 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f ("Returning CKR_
29620 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
29630 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b PORTED (%i)", CK
29640 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
29650 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 UPPORTED);...ret
29660 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e urn(CKR_FUNCTION
29670 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
29680 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 .}..CK_DEFINE_FU
29690 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f NCTION(CK_RV, C_
296a0 47 65 74 4f 62 6a 65 63 74 53 69 7a 65 29 28 43 GetObjectSize)(C
296b0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 K_SESSION_HANDLE
296c0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 hSession, CK_OB
296d0 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a JECT_HANDLE hObj
296e0 65 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 ect, CK_ULONG_PT
296f0 52 20 70 75 6c 53 69 7a 65 29 20 7b 0a 09 43 41 R pulSize) {..CA
29700 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
29710 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
29720 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 if (!cackey_init
29730 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 ialized) {...CAC
29740 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
29750 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e ("Error. Not in
29760 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 itialized.");...
29770 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 .return(CKR_CRYP
29780 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c TOKI_NOT_INITIAL
29790 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b IZED);..}...CACK
297a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
297b0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 "Returning CKR_F
297c0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
297d0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 ORTED (%i)", CKR
297e0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
297f0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 PPORTED);...retu
29800 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f rn(CKR_FUNCTION_
29810 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
29820 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e }..CK_DEFINE_FUN
29830 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 CTION(CK_RV, C_G
29840 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 etAttributeValue
29850 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e )(CK_SESSION_HAN
29860 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b DLE hSession, CK
29870 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 _OBJECT_HANDLE h
29880 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 Object, CK_ATTRI
29890 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 BUTE_PTR pTempla
298a0 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 te, CK_ULONG ulC
298b0 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 41 54 54 52 ount) {..CK_ATTR
298c0 49 42 55 54 45 20 2a 63 75 72 72 5f 61 74 74 72 IBUTE *curr_attr
298d0 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 ;..struct cackey
298e0 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 _identity *ident
298f0 69 74 79 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c ity;..unsigned l
29900 6f 6e 67 20 69 64 65 6e 74 69 74 79 5f 69 64 78 ong identity_idx
29910 2c 20 61 74 74 72 5f 69 64 78 2c 20 73 65 73 73 , attr_idx, sess
29920 5f 61 74 74 72 5f 69 64 78 2c 20 6e 75 6d 5f 69 _attr_idx, num_i
29930 64 73 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 ds;..int mutex_r
29940 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 72 65 etval;..CK_RV re
29950 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 tval = CKR_OK;..
29960 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 56 61 6c CK_VOID_PTR pVal
29970 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c ue;..CK_ULONG ul
29980 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 43 41 43 4b ValueLen;...CACK
29990 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
299a0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 "Called.");...if
299b0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 (!cackey_initia
299c0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 lized) {...CACKE
299d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
299e0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 Error. Not init
299f0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 ialized.");....r
29a00 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f eturn(CKR_CRYPTO
29a10 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a KI_NOT_INITIALIZ
29a20 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 ED);..}...if (hS
29a30 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 ession == 0 || h
29a40 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 Session >= (size
29a50 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f of(cackey_sessio
29a60 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 ns) / sizeof(cac
29a70 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 key_sessions[0])
29a80 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 )) {...CACKEY_DE
29a90 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
29aa0 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 r. Session out
29ab0 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a of range.");....
29ac0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 ..return(CKR_SES
29ad0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 SION_HANDLE_INVA
29ae0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 LID);..}...if (h
29af0 4f 62 6a 65 63 74 20 3d 3d 20 30 29 20 7b 0a 09 Object == 0) {..
29b00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
29b10 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4f 62 INTF("Error. Ob
29b20 6a 65 63 74 20 68 61 6e 64 6c 65 20 6f 75 74 20 ject handle out
29b30 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a of range.");....
29b40 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a ..return(CKR_OBJ
29b50 45 43 54 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c ECT_HANDLE_INVAL
29b60 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c ID);..}...if (ul
29b70 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 Count == 0) {...
29b80 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69 74 /* Short circuit
29b90 2c 20 69 66 20 7a 65 72 6f 20 6f 62 6a 65 63 74 , if zero object
29ba0 73 20 77 65 72 65 20 73 70 65 63 69 66 69 65 64 s were specified
29bb0 20 72 65 74 75 72 6e 20 7a 65 72 6f 20 69 74 65 return zero ite
29bc0 6d 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a ms immediately *
29bd0 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 /...CACKEY_DEBUG
29be0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
29bf0 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 ng CKR_OK (%i) (
29c00 73 68 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c short circuit)",
29c10 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 CKR_OK);....ret
29c20 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a urn(CKR_OK);..}.
29c30 0a 09 69 66 20 28 70 54 65 6d 70 6c 61 74 65 20 ..if (pTemplate
29c40 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 == NULL) {...CAC
29c50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
29c60 28 22 45 72 72 6f 72 2e 20 20 70 54 65 6d 70 6c ("Error. pTempl
29c70 61 74 65 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a ate is NULL.");.
29c80 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 ...return(CKR_AR
29c90 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d GUMENTS_BAD);..}
29ca0 0a 0a 09 69 64 65 6e 74 69 74 79 5f 69 64 78 20 ...identity_idx
29cb0 3d 20 68 4f 62 6a 65 63 74 20 2d 20 31 3b 0a 0a = hObject - 1;..
29cc0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 .mutex_retval =
29cd0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 cackey_mutex_loc
29ce0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
29cf0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 );..if (mutex_re
29d00 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 tval != 0) {...C
29d10 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
29d20 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b TF("Error. Lock
29d30 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a ing failed.");..
29d40 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e ..return(CKR_GEN
29d50 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a ERAL_ERROR);..}.
29d60 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 ..if (!cackey_se
29d70 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
29d80 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 .active) {...cac
29d90 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b key_mutex_unlock
29da0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 (cackey_biglock)
29db0 3b 0a 0a 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 73 73 69 6f 6e 20 6e 6f 74 20 61 63 Session not ac
29de0 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 tive.");......re
29df0 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e turn(CKR_SESSION
29e00 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 _HANDLE_INVALID)
29e10 3b 0a 09 7d 0a 0a 09 6e 75 6d 5f 69 64 73 20 3d ;..}...num_ids =
29e20 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 cackey_sessions
29e30 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 [hSession].ident
29e40 69 74 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69 ities_count;...i
29e50 66 20 28 69 64 65 6e 74 69 74 79 5f 69 64 78 20 f (identity_idx
29e60 3e 3d 20 6e 75 6d 5f 69 64 73 29 20 7b 0a 09 09 >= num_ids) {...
29e70 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c cackey_mutex_unl
29e80 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
29e90 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 ck);....CACKEY_D
29ea0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
29eb0 6f 72 2e 20 20 4f 62 6a 65 63 74 20 68 61 6e 64 or. Object hand
29ec0 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e le out of range.
29ed0 20 20 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3d identity_idx =
29ee0 20 25 6c 75 2c 20 6e 75 6d 5f 69 64 73 20 3d 20 %lu, num_ids =
29ef0 25 6c 75 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 %lu.", (unsigned
29f00 20 6c 6f 6e 67 29 20 69 64 65 6e 74 69 74 79 5f long) identity_
29f10 69 64 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c idx, (unsigned l
29f20 6f 6e 67 29 20 6e 75 6d 5f 69 64 73 29 3b 0a 0a ong) num_ids);..
29f30 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a ..return(CKR_OBJ
29f40 45 43 54 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c ECT_HANDLE_INVAL
29f50 49 44 29 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74 69 ID);..}...identi
29f60 74 79 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 ty = &cackey_ses
29f70 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
29f80 69 64 65 6e 74 69 74 69 65 73 5b 69 64 65 6e 74 identities[ident
29f90 69 74 79 5f 69 64 78 5d 3b 0a 0a 09 66 6f 72 20 ity_idx];...for
29fa0 28 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 61 (attr_idx = 0; a
29fb0 74 74 72 5f 69 64 78 20 3c 20 75 6c 43 6f 75 6e ttr_idx < ulCoun
29fc0 74 3b 20 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b t; attr_idx++) {
29fd0 0a 09 09 63 75 72 72 5f 61 74 74 72 20 3d 20 26 ...curr_attr = &
29fe0 70 54 65 6d 70 6c 61 74 65 5b 61 74 74 72 5f 69 pTemplate[attr_i
29ff0 64 78 5d 3b 0a 0a 09 09 70 56 61 6c 75 65 20 3d dx];....pValue =
2a000 20 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65 NULL;...ulValue
2a010 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 Len = (CK_LONG)
2a020 2d 31 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 -1;....CACKEY_DE
2a030 42 55 47 5f 50 52 49 4e 54 46 28 22 4c 6f 6f 6b BUG_PRINTF("Look
2a040 69 6e 67 20 66 6f 72 20 61 74 74 72 69 62 75 74 ing for attribut
2a050 65 20 30 78 25 30 38 6c 78 20 28 69 64 65 6e 74 e 0x%08lx (ident
2a060 69 74 79 3a 25 6c 75 29 20 2e 2e 2e 22 2c 20 28 ity:%lu) ...", (
2a070 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 unsigned long) c
2a080 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 2c 20 urr_attr->type,
2a090 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
2a0a0 69 64 65 6e 74 69 74 79 5f 69 64 78 29 3b 0a 0a identity_idx);..
2a0b0 09 09 66 6f 72 20 28 73 65 73 73 5f 61 74 74 72 ..for (sess_attr
2a0c0 5f 69 64 78 20 3d 20 30 3b 20 73 65 73 73 5f 61 _idx = 0; sess_a
2a0d0 74 74 72 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 ttr_idx < identi
2a0e0 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5f 63 ty->attributes_c
2a0f0 6f 75 6e 74 3b 20 73 65 73 73 5f 61 74 74 72 5f ount; sess_attr_
2a100 69 64 78 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28 idx++) {....if (
2a110 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 identity->attrib
2a120 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 utes[sess_attr_i
2a130 64 78 5d 2e 74 79 70 65 20 3d 3d 20 63 75 72 72 dx].type == curr
2a140 5f 61 74 74 72 2d 3e 74 79 70 65 29 20 7b 0a 09 _attr->type) {..
2a150 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
2a160 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 66 6f 75 PRINTF(" ... fou
2a170 6e 64 20 69 74 2c 20 70 56 61 6c 75 65 20 3d 20 nd it, pValue =
2a180 25 70 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 20 3d %p, ulValueLen =
2a190 20 25 6c 75 22 2c 20 69 64 65 6e 74 69 74 79 2d %lu", identity-
2a1a0 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 >attributes[sess
2a1b0 5f 61 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 _attr_idx].pValu
2a1c0 65 2c 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 e, identity->att
2a1d0 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 ributes[sess_att
2a1e0 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 r_idx].ulValueLe
2a1f0 6e 29 3b 0a 09 09 09 09 0a 09 09 09 09 70 56 61 n);..........pVa
2a200 6c 75 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e lue = identity->
2a210 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f attributes[sess_
2a220 61 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 attr_idx].pValue
2a230 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e ;.....ulValueLen
2a240 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 = identity->att
2a250 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 ributes[sess_att
2a260 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 r_idx].ulValueLe
2a270 6e 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 n;....}...}....i
2a280 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 f (curr_attr->pV
2a290 61 6c 75 65 20 26 26 20 70 56 61 6c 75 65 29 20 alue && pValue)
2a2a0 7b 0a 09 09 09 69 66 20 28 63 75 72 72 5f 61 74 {....if (curr_at
2a2b0 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3e tr->ulValueLen >
2a2c0 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a = ulValueLen) {.
2a2d0 09 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f ....memcpy(curr_
2a2e0 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20 70 56 attr->pValue, pV
2a2f0 61 6c 75 65 2c 20 75 6c 56 61 6c 75 65 4c 65 6e alue, ulValueLen
2a300 29 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 );....} else {..
2a310 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 ...ulValueLen =
2a320 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 (CK_LONG) -1;...
2a330 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f ...retval = CKR_
2a340 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c BUFFER_TOO_SMALL
2a350 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 75 ;....}...}....cu
2a360 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 rr_attr->ulValue
2a370 4c 65 6e 20 3d 20 75 6c 56 61 6c 75 65 4c 65 6e Len = ulValueLen
2a380 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 ;..}...mutex_ret
2a390 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 val = cackey_mut
2a3a0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 ex_unlock(cackey
2a3b0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 _biglock);..if (
2a3c0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 mutex_retval !=
2a3d0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 0) {...CACKEY_DE
2a3e0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
2a3f0 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 r. Unlocking fa
2a400 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 iled.");....retu
2a410 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 rn(CKR_GENERAL_E
2a420 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 RROR);..}...if (
2a430 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 41 54 retval == CKR_AT
2a440 54 52 49 42 55 54 45 5f 54 59 50 45 5f 49 4e 56 TRIBUTE_TYPE_INV
2a450 41 4c 49 44 29 20 7b 0a 09 09 43 41 43 4b 45 59 ALID) {...CACKEY
2a460 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
2a470 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 41 54 54 eturning CKR_ATT
2a480 52 49 42 55 54 45 5f 54 59 50 45 5f 49 4e 56 41 RIBUTE_TYPE_INVA
2a490 4c 49 44 20 28 25 69 29 22 2c 20 28 69 6e 74 29 LID (%i)", (int)
2a4a0 20 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 retval);..} els
2a4b0 65 20 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 e if (retval ==
2a4c0 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 CKR_BUFFER_TOO_S
2a4d0 4d 41 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 MALL) {...CACKEY
2a4e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
2a4f0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 42 55 46 eturning CKR_BUF
2a500 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28 25 FER_TOO_SMALL (%
2a510 69 29 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 i)", (int) retva
2a520 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 l);..} else if (
2a530 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 4f 4b retval == CKR_OK
2a540 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
2a550 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
2a560 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 ning CKR_OK (%i)
2a570 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 ", (int) retval)
2a580 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 ;..} else {...CA
2a590 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
2a5a0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22 F("Returning %i"
2a5b0 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b , (int) retval);
2a5c0 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 ..}...return(ret
2a5d0 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 val);.}..CK_DEFI
2a5e0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 NE_FUNCTION(CK_R
2a5f0 56 2c 20 43 5f 53 65 74 41 74 74 72 69 62 75 74 V, C_SetAttribut
2a600 65 56 61 6c 75 65 29 28 43 4b 5f 53 45 53 53 49 eValue)(CK_SESSI
2a610 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 ON_HANDLE hSessi
2a620 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 on, CK_OBJECT_HA
2a630 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b NDLE hObject, CK
2a640 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 _ATTRIBUTE_PTR p
2a650 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f Template, CK_ULO
2a660 4e 47 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 NG ulCount) {..C
2a670 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
2a680 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
2a690 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 .if (!cackey_ini
2a6a0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 tialized) {...CA
2a6b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
2a6c0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 F("Error. Not i
2a6d0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a nitialized.");..
2a6e0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 ..return(CKR_CRY
2a6f0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 PTOKI_NOT_INITIA
2a700 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 LIZED);..}...CAC
2a710 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
2a720 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f ("Returning CKR_
2a730 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
2a740 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b PORTED (%i)", CK
2a750 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
2a760 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 UPPORTED);...ret
2a770 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e urn(CKR_FUNCTION
2a780 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
2a790 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 .}..CK_DEFINE_FU
2a7a0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f NCTION(CK_RV, C_
2a7b0 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 29 FindObjectsInit)
2a7c0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 (CK_SESSION_HAND
2a7d0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f LE hSession, CK_
2a7e0 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 ATTRIBUTE_PTR pT
2a7f0 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e emplate, CK_ULON
2a800 47 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 4b G ulCount) {..CK
2a810 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b _SLOT_ID slotID;
2a820 0a 09 43 4b 5f 55 4c 4f 4e 47 20 69 64 78 3b 0a ..CK_ULONG idx;.
2a830 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 .int mutex_retva
2a840 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 l;...CACKEY_DEBU
2a850 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 G_PRINTF("Called
2a860 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b .");...if (!cack
2a870 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 ey_initialized)
2a880 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
2a890 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
2a8a0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 Not initialized
2a8b0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
2a8c0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f KR_CRYPTOKI_NOT_
2a8d0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d INITIALIZED);..}
2a8e0 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 ...if (hSession
2a8f0 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e == 0 || hSession
2a900 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b >= (sizeof(cack
2a910 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 ey_sessions) / s
2a920 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 izeof(cackey_ses
2a930 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 sions[0]))) {...
2a940 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
2a950 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 NTF("Error. Ses
2a960 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 sion out of rang
2a970 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 e.");......retur
2a980 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 n(CKR_SESSION_HA
2a990 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 NDLE_INVALID);..
2a9a0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c }...mutex_retval
2a9b0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f = cackey_mutex_
2a9c0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
2a9d0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 ock);..if (mutex
2a9e0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a _retval != 0) {.
2a9f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
2aa00 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c RINTF("Error. L
2aa10 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 ocking failed.")
2aa20 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
2aa30 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a GENERAL_ERROR);.
2aa40 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 .}...if (!cackey
2aa50 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
2aa60 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 on].active) {...
2aa70 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c cackey_mutex_unl
2aa80 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
2aa90 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 ck);....CACKEY_D
2aaa0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
2aab0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 or. Session not
2aac0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 active.");.....
2aad0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 .return(CKR_SESS
2aae0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c ION_HANDLE_INVAL
2aaf0 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 ID);..}...if (ca
2ab00 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
2ab10 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 ession].search_a
2ab20 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 ctive) {...cacke
2ab30 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
2ab40 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
2ab50 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
2ab60 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
2ab70 53 65 61 72 63 68 20 61 6c 72 65 61 64 79 20 61 Search already a
2ab80 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 ctive.");......r
2ab90 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 eturn(CKR_OPERAT
2aba0 49 4f 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a ION_ACTIVE);..}.
2abb0 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 ..slotID = cacke
2abc0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
2abd0 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 ion].slotID;...i
2abe0 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c f (slotID < 0 ||
2abf0 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 slotID >= (size
2ac00 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 of(cackey_slots)
2ac10 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 / sizeof(cackey
2ac20 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 _slots[0]))) {..
2ac30 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
2ac40 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 INTF("Error. Inv
2ac50 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 alid slot reques
2ac60 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 ted (%lu), outsi
2ac70 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 de of valid rang
2ac80 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 e", slotID);....
2ac90 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 return(CKR_GENER
2aca0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 AL_ERROR);..}...
2acb0 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 if (cackey_slots
2acc0 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 [slotID].active
2acd0 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 == 0) {...CACKEY
2ace0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
2acf0 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c rror. Invalid sl
2ad00 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c ot requested (%l
2ad10 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 u), slot not cur
2ad20 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 rently active",
2ad30 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b slotID);....cack
2ad40 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 ey_mutex_unlock(
2ad50 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
2ad60 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 ....return(CKR_G
2ad70 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 ENERAL_ERROR);..
2ad80 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 }...if (cackey_s
2ad90 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c 6f lots[slotID].slo
2ada0 74 5f 72 65 73 65 74 29 20 7b 0a 09 09 43 41 43 t_reset) {...CAC
2adb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
2adc0 28 22 54 68 65 20 73 6c 6f 74 20 68 61 73 20 62 ("The slot has b
2add0 65 65 6e 20 72 65 73 65 74 20 73 69 6e 63 65 20 een reset since
2ade0 77 65 20 6c 61 73 74 20 6c 6f 6f 6b 65 64 20 66 we last looked f
2adf0 6f 72 20 69 64 65 6e 74 69 74 69 65 73 20 2d 2d or identities --
2ae00 20 72 65 73 63 61 6e 6e 69 6e 67 22 29 3b 0a 0a rescanning");..
2ae10 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 ..if (cackey_ses
2ae20 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
2ae30 69 64 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 identities != NU
2ae40 4c 4c 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f LL) {....cackey_
2ae50 66 72 65 65 5f 69 64 65 6e 74 69 74 69 65 73 28 free_identities(
2ae60 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
2ae70 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 hSession].identi
2ae80 74 69 65 73 2c 20 63 61 63 6b 65 79 5f 73 65 73 ties, cackey_ses
2ae90 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
2aea0 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 identities_count
2aeb0 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 );.....cackey_se
2aec0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
2aed0 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20 4e 55 .identities = NU
2aee0 4c 4c 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 LL;....cackey_se
2aef0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
2af00 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e .identities_coun
2af10 74 20 3d 20 30 3b 0a 09 09 7d 0a 0a 09 09 69 66 t = 0;...}....if
2af20 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 (cackey_slots[s
2af30 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 21 3d 20 lotID].label !=
2af40 4e 55 4c 4c 29 20 7b 0a 09 09 09 66 72 65 65 28 NULL) {....free(
2af50 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f cackey_slots[slo
2af60 74 49 44 5d 2e 6c 61 62 65 6c 29 3b 0a 09 09 09 tID].label);....
2af70 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f cackey_slots[slo
2af80 74 49 44 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c tID].label = NUL
2af90 4c 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 L;...}....cackey
2afa0 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 _mark_slot_reset
2afb0 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 (&cackey_slots[s
2afc0 6c 6f 74 49 44 5d 29 3b 0a 09 09 63 61 63 6b 65 lotID]);...cacke
2afd0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e y_slots[slotID].
2afe0 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 30 3b 0a slot_reset = 0;.
2aff0 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f .}...if (cackey_
2b000 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
2b010 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 3d n].identities ==
2b020 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 NULL) {...cacke
2b030 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
2b040 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 ion].identities
2b050 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 69 64 = cackey_read_id
2b060 65 6e 74 69 74 69 65 73 28 26 63 61 63 6b 65 79 entities(&cackey
2b070 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 _slots[slotID],
2b080 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 &cackey_sessions
2b090 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 [hSession].ident
2b0a0 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 7d ities_count);..}
2b0b0 0a 0a 09 69 66 20 28 70 54 65 6d 70 6c 61 74 65 ...if (pTemplate
2b0c0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 != NULL) {...if
2b0d0 20 28 75 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20 (ulCount != 0)
2b0e0 7b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 {....cackey_sess
2b0f0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 ions[hSession].s
2b100 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e earch_query_coun
2b110 74 20 3d 20 75 6c 43 6f 75 6e 74 3b 0a 09 09 09 t = ulCount;....
2b120 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
2b130 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 hSession].search
2b140 5f 71 75 65 72 79 20 3d 20 6d 61 6c 6c 6f 63 28 _query = malloc(
2b150 75 6c 43 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 ulCount * sizeof
2b160 28 2a 70 54 65 6d 70 6c 61 74 65 29 29 3b 0a 0a (*pTemplate));..
2b170 09 09 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 ...memcpy(cackey
2b180 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
2b190 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 on].search_query
2b1a0 2c 20 70 54 65 6d 70 6c 61 74 65 2c 20 75 6c 43 , pTemplate, ulC
2b1b0 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70 ount * sizeof(*p
2b1c0 54 65 6d 70 6c 61 74 65 29 29 3b 0a 09 09 09 66 Template));....f
2b1d0 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 or (idx = 0; idx
2b1e0 20 3c 20 75 6c 43 6f 75 6e 74 3b 20 69 64 78 2b < ulCount; idx+
2b1f0 2b 29 20 7b 0a 09 09 09 09 69 66 20 28 70 54 65 +) {.....if (pTe
2b200 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 75 6c 56 61 mplate[idx].ulVa
2b210 6c 75 65 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 lueLen == 0) {..
2b220 09 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 ....cackey_sessi
2b230 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 ons[hSession].se
2b240 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e arch_query[idx].
2b250 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 0a pValue = NULL;..
2b260 09 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 .....continue;..
2b270 09 09 09 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79 ...}......cackey
2b280 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
2b290 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 on].search_query
2b2a0 5b 69 64 78 5d 2e 70 56 61 6c 75 65 20 3d 20 6d [idx].pValue = m
2b2b0 61 6c 6c 6f 63 28 70 54 65 6d 70 6c 61 74 65 5b alloc(pTemplate[
2b2c0 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 idx].ulValueLen)
2b2d0 3b 0a 0a 09 09 09 09 69 66 20 28 63 61 63 6b 65 ;......if (cacke
2b2e0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
2b2f0 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 ion].search_quer
2b300 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 29 20 7b y[idx].pValue) {
2b310 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 63 61 63 ......memcpy(cac
2b320 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
2b330 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 ssion].search_qu
2b340 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 2c ery[idx].pValue,
2b350 20 70 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e pTemplate[idx].
2b360 70 56 61 6c 75 65 2c 20 70 54 65 6d 70 6c 61 74 pValue, pTemplat
2b370 65 5b 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 e[idx].ulValueLe
2b380 6e 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 09 n);.....}....}..
2b390 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 63 61 63 .} else {....cac
2b3a0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
2b3b0 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 ssion].search_qu
2b3c0 65 72 79 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 ery_count = 0;..
2b3d0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e ..cackey_session
2b3e0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 s[hSession].sear
2b3f0 63 68 5f 71 75 65 72 79 20 3d 20 4e 55 4c 4c 3b ch_query = NULL;
2b400 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 ...}..} else {..
2b410 09 69 66 20 28 75 6c 43 6f 75 6e 74 20 21 3d 20 .if (ulCount !=
2b420 30 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 0) {....cackey_m
2b430 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b utex_unlock(cack
2b440 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 ey_biglock);....
2b450 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
2b460 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 INTF("Error. Se
2b470 61 72 63 68 20 71 75 65 72 79 20 73 70 65 63 69 arch query speci
2b480 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 62 75 fied as NULL, bu
2b490 74 20 6e 75 6d 62 65 72 20 6f 66 20 71 75 65 72 t number of quer
2b4a0 79 20 74 65 72 6d 73 20 6e 6f 74 20 73 70 65 63 y terms not spec
2b4b0 69 66 69 65 64 20 61 73 20 30 2e 22 29 3b 0a 0a ified as 0.");..
2b4c0 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 ...return(CKR_AR
2b4d0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09 GUMENTS_BAD);...
2b4e0 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 }....cackey_sess
2b4f0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 ions[hSession].s
2b500 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e earch_query_coun
2b510 74 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f t = 0;...cackey_
2b520 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
2b530 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 20 n].search_query
2b540 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 63 61 63 = NULL;..}...cac
2b550 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
2b560 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 ssion].search_ac
2b570 74 69 76 65 20 3d 20 31 3b 0a 09 63 61 63 6b 65 tive = 1;..cacke
2b580 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
2b590 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 ion].search_curr
2b5a0 5f 69 64 20 3d 20 30 3b 0a 0a 09 6d 75 74 65 78 _id = 0;...mutex
2b5b0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 _retval = cackey
2b5c0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 _mutex_unlock(ca
2b5d0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 ckey_biglock);..
2b5e0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c if (mutex_retval
2b5f0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 != 0) {...CACKE
2b600 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
2b610 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e Error. Unlockin
2b620 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 g failed.");....
2b630 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 return(CKR_GENER
2b640 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 AL_ERROR);..}...
2b650 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
2b660 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 NTF("Returning C
2b670 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 KR_OK (%i)", CKR
2b680 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 _OK);...return(C
2b690 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 73 74 61 74 69 KR_OK);.}..stati
2b6a0 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 70 6b 63 c int cackey_pkc
2b6b0 73 31 31 5f 63 6f 6d 70 61 72 65 5f 61 74 74 72 s11_compare_attr
2b6c0 69 62 75 74 65 73 28 43 4b 5f 41 54 54 52 49 42 ibutes(CK_ATTRIB
2b6d0 55 54 45 20 2a 61 2c 20 43 4b 5f 41 54 54 52 49 UTE *a, CK_ATTRI
2b6e0 42 55 54 45 20 2a 62 29 20 7b 0a 09 75 6e 73 69 BUTE *b) {..unsi
2b6f0 67 6e 65 64 20 63 68 61 72 20 2a 73 6d 61 6c 6c gned char *small
2b700 62 75 66 2c 20 2a 6c 61 72 67 65 62 75 66 3b 0a buf, *largebuf;.
2b710 09 73 69 7a 65 5f 74 20 73 6d 61 6c 6c 62 75 66 .size_t smallbuf
2b720 5f 6c 65 6e 2c 20 6c 61 72 67 65 62 75 66 5f 6c _len, largebuf_l
2b730 65 6e 3b 0a 0a 09 69 66 20 28 61 2d 3e 74 79 70 en;...if (a->typ
2b740 65 20 21 3d 20 62 2d 3e 74 79 70 65 29 20 7b 0a e != b->type) {.
2b750 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a ..return(0);..}.
2b760 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
2b770 52 49 4e 54 46 28 22 20 20 20 20 2e 2e 2e 20 66 RINTF(" ... f
2b780 6f 75 6e 64 20 6d 61 74 63 68 69 6e 67 20 74 79 ound matching ty
2b790 70 65 20 2e 2e 2e 22 29 3b 0a 0a 09 43 41 43 4b pe ...");...CACK
2b7a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 EY_DEBUG_PRINTBU
2b7b0 46 28 22 20 20 20 20 2e 2e 2e 20 6f 75 72 20 76 F(" ... our v
2b7c0 61 6c 75 65 3a 22 2c 20 61 2d 3e 70 56 61 6c 75 alue:", a->pValu
2b7d0 65 2c 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e e, a->ulValueLen
2b7e0 29 3b 0a 0a 09 69 66 20 28 62 2d 3e 70 56 61 6c );...if (b->pVal
2b7f0 75 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 ue == NULL) {...
2b800 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
2b810 4e 54 46 28 22 20 20 20 20 20 20 20 2e 2e 2e 20 NTF(" ...
2b820 66 6f 75 6e 64 20 77 69 6c 64 63 61 72 64 20 6d found wildcard m
2b830 61 74 63 68 22 29 3b 0a 0a 09 09 72 65 74 75 72 atch");....retur
2b840 6e 28 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 61 n(1);..}...if (a
2b850 2d 3e 70 56 61 6c 75 65 20 3d 3d 20 4e 55 4c 4c ->pValue == NULL
2b860 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 30 29 3b ) {...return(0);
2b870 0a 09 7d 0a 0a 20 09 69 66 20 28 62 2d 3e 75 6c ..}.. .if (b->ul
2b880 56 61 6c 75 65 4c 65 6e 20 3d 3d 20 61 2d 3e 75 ValueLen == a->u
2b890 6c 56 61 6c 75 65 4c 65 6e 20 26 26 20 6d 65 6d lValueLen && mem
2b8a0 63 6d 70 28 61 2d 3e 70 56 61 6c 75 65 2c 20 62 cmp(a->pValue, b
2b8b0 2d 3e 70 56 61 6c 75 65 2c 20 62 2d 3e 75 6c 56 ->pValue, b->ulV
2b8c0 61 6c 75 65 4c 65 6e 29 20 3d 3d 20 30 29 20 7b alueLen) == 0) {
2b8d0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
2b8e0 50 52 49 4e 54 46 28 22 20 20 20 20 20 20 20 2e PRINTF(" .
2b8f0 2e 2e 20 66 6f 75 6e 64 20 65 78 61 63 74 20 6d .. found exact m
2b900 61 74 63 68 22 29 3b 0a 0a 09 09 72 65 74 75 72 atch");....retur
2b910 6e 28 31 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 n(1);..}...switc
2b920 68 20 28 61 2d 3e 74 79 70 65 29 20 7b 0a 09 09 h (a->type) {...
2b930 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 case CKA_MODULUS
2b940 3a 0a 09 09 09 69 66 20 28 61 2d 3e 75 6c 56 61 :....if (a->ulVa
2b950 6c 75 65 4c 65 6e 20 3d 3d 20 62 2d 3e 75 6c 56 lueLen == b->ulV
2b960 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09 09 09 62 alueLen) {.....b
2b970 72 65 61 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 reak;....}.....i
2b980 66 20 28 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e f (a->ulValueLen
2b990 20 3e 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e > b->ulValueLen
2b9a0 29 20 7b 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66 ) {.....smallbuf
2b9b0 20 3d 20 62 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 = b->pValue;...
2b9c0 09 09 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 20 3d ..smallbuf_len =
2b9d0 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a b->ulValueLen;.
2b9e0 0a 09 09 09 09 6c 61 72 67 65 62 75 66 20 3d 20 .....largebuf =
2b9f0 61 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09 6c a->pValue;.....l
2ba00 61 72 67 65 62 75 66 5f 6c 65 6e 20 3d 20 61 2d argebuf_len = a-
2ba10 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09 >ulValueLen;....
2ba20 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 73 6d 61 } else {.....sma
2ba30 6c 6c 62 75 66 20 3d 20 61 2d 3e 70 56 61 6c 75 llbuf = a->pValu
2ba40 65 3b 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66 5f e;.....smallbuf_
2ba50 6c 65 6e 20 3d 20 61 2d 3e 75 6c 56 61 6c 75 65 len = a->ulValue
2ba60 4c 65 6e 3b 0a 0a 09 09 09 09 6c 61 72 67 65 62 Len;......largeb
2ba70 75 66 20 3d 20 62 2d 3e 70 56 61 6c 75 65 3b 0a uf = b->pValue;.
2ba80 09 09 09 09 6c 61 72 67 65 62 75 66 5f 6c 65 6e ....largebuf_len
2ba90 20 3d 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e = b->ulValueLen
2baa0 3b 0a 09 09 09 7d 0a 0a 09 09 09 66 6f 72 20 28 ;....}.....for (
2bab0 3b 20 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20 21 ; largebuf_len !
2bac0 3d 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 3b 20 = smallbuf_len;
2bad0 6c 61 72 67 65 62 75 66 2b 2b 2c 6c 61 72 67 65 largebuf++,large
2bae0 62 75 66 5f 6c 65 6e 2d 2d 29 20 7b 0a 09 09 09 buf_len--) {....
2baf0 09 69 66 20 28 6c 61 72 67 65 62 75 66 5b 30 5d .if (largebuf[0]
2bb00 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 09 62 72 != 0) {......br
2bb10 65 61 6b 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a eak;.....}....}.
2bb20 0a 09 09 09 69 66 20 28 6c 61 72 67 65 62 75 66 ....if (largebuf
2bb30 5f 6c 65 6e 20 21 3d 20 73 6d 61 6c 6c 62 75 66 _len != smallbuf
2bb40 5f 6c 65 6e 29 20 7b 0a 09 09 09 09 62 72 65 61 _len) {.....brea
2bb50 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 k;....}.....if (
2bb60 6d 65 6d 63 6d 70 28 6c 61 72 67 65 62 75 66 2c memcmp(largebuf,
2bb70 20 73 6d 61 6c 6c 62 75 66 2c 20 73 6d 61 6c 6c smallbuf, small
2bb80 62 75 66 5f 6c 65 6e 29 20 3d 3d 20 30 29 20 7b buf_len) == 0) {
2bb90 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
2bba0 47 5f 50 52 49 4e 54 46 28 22 20 20 20 20 20 20 G_PRINTF("
2bbb0 20 2e 2e 2e 20 66 6f 75 6e 64 20 61 70 70 72 6f ... found appro
2bbc0 78 69 6d 61 74 65 20 6d 61 74 63 68 22 29 3b 0a ximate match");.
2bbd0 0a 09 09 09 09 72 65 74 75 72 6e 28 31 29 3b 0a .....return(1);.
2bbe0 09 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a ...}.....break;.
2bbf0 09 7d 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a .}...return(0);.
2bc00 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e }..CK_DEFINE_FUN
2bc10 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 CTION(CK_RV, C_F
2bc20 69 6e 64 4f 62 6a 65 63 74 73 29 28 43 4b 5f 53 indObjects)(CK_S
2bc30 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 ESSION_HANDLE hS
2bc40 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 ession, CK_OBJEC
2bc50 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4f T_HANDLE_PTR phO
2bc60 62 6a 65 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 bject, CK_ULONG
2bc70 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 ulMaxObjectCount
2bc80 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 , CK_ULONG_PTR p
2bc90 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 29 20 7b ulObjectCount) {
2bca0 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f ..struct cackey_
2bcb0 69 64 65 6e 74 69 74 79 20 2a 63 75 72 72 5f 69 identity *curr_i
2bcc0 64 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 d;..CK_ATTRIBUTE
2bcd0 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09 43 4b *curr_attr;..CK
2bce0 5f 55 4c 4f 4e 47 20 63 75 72 72 5f 69 64 5f 69 _ULONG curr_id_i
2bcf0 64 78 2c 20 63 75 72 72 5f 6f 75 74 5f 69 64 5f dx, curr_out_id_
2bd00 69 64 78 2c 20 63 75 72 72 5f 61 74 74 72 5f 69 idx, curr_attr_i
2bd10 64 78 2c 20 73 65 73 73 5f 61 74 74 72 5f 69 64 dx, sess_attr_id
2bd20 78 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 6d 61 74 x;..CK_ULONG mat
2bd30 63 68 65 64 5f 63 6f 75 6e 74 2c 20 70 72 65 76 ched_count, prev
2bd40 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 3b 0a _matched_count;.
2bd50 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 .int mutex_retva
2bd60 6c 3b 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 l;.#ifdef CACKEY
2bd70 5f 44 45 42 55 47 5f 53 45 41 52 43 48 5f 53 50 _DEBUG_SEARCH_SP
2bd80 45 45 44 54 45 53 54 0a 09 73 74 72 75 63 74 20 EEDTEST..struct
2bd90 74 69 6d 65 76 61 6c 20 73 74 61 72 74 2c 20 65 timeval start, e
2bda0 6e 64 3b 0a 09 75 69 6e 74 36 34 5f 74 20 73 74 nd;..uint64_t st
2bdb0 61 72 74 5f 69 6e 74 2c 20 65 6e 64 5f 69 6e 74 art_int, end_int
2bdc0 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 ;.#endif...CACKE
2bdd0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
2bde0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 Called.");...if
2bdf0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c (!cackey_initial
2be00 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 ized) {...CACKEY
2be10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
2be20 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 rror. Not initi
2be30 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 alized.");....re
2be40 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b turn(CKR_CRYPTOK
2be50 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 I_NOT_INITIALIZE
2be60 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c D);..}...if (pul
2be70 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20 4e ObjectCount == N
2be80 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f ULL) {...CACKEY_
2be90 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
2bea0 72 6f 72 2e 20 20 70 75 6c 4f 62 6a 65 63 74 43 ror. pulObjectC
2beb0 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b ount is NULL.");
2bec0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 ....return(CKR_A
2bed0 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 RGUMENTS_BAD);..
2bee0 7d 0a 0a 09 69 66 20 28 70 68 4f 62 6a 65 63 74 }...if (phObject
2bef0 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 6c 4d 61 == NULL && ulMa
2bf00 78 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20 xObjectCount ==
2bf10 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 0) {.../* Short
2bf20 63 69 72 63 75 69 74 2c 20 69 66 20 7a 65 72 6f circuit, if zero
2bf30 20 6f 62 6a 65 63 74 73 20 77 65 72 65 20 73 70 objects were sp
2bf40 65 63 69 66 69 65 64 20 72 65 74 75 72 6e 20 7a ecified return z
2bf50 65 72 6f 20 69 74 65 6d 73 20 69 6d 6d 65 64 69 ero items immedi
2bf60 61 74 65 6c 79 20 2a 2f 0a 09 09 2a 70 75 6c 4f ately */...*pulO
2bf70 62 6a 65 63 74 43 6f 75 6e 74 20 3d 20 30 3b 0a bjectCount = 0;.
2bf80 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
2bf90 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e PRINTF("Returnin
2bfa0 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 g CKR_OK (%i) (s
2bfb0 68 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c 20 hort circuit)",
2bfc0 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 CKR_OK);....retu
2bfd0 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a rn(CKR_OK);..}..
2bfe0 09 69 66 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d .if (phObject ==
2bff0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 NULL) {...CACKE
2c000 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
2c010 45 72 72 6f 72 2e 20 20 70 68 4f 62 6a 65 63 74 Error. phObject
2c020 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 is NULL.");....
2c030 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d return(CKR_ARGUM
2c040 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 ENTS_BAD);..}...
2c050 69 66 20 28 75 6c 4d 61 78 4f 62 6a 65 63 74 43 if (ulMaxObjectC
2c060 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 43 ount == 0) {...C
2c070 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
2c080 54 46 28 22 45 72 72 6f 72 2e 20 20 4d 61 78 69 TF("Error. Maxi
2c090 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62 mum number of ob
2c0a0 6a 65 63 74 73 20 73 70 65 63 69 66 69 65 64 20 jects specified
2c0b0 61 73 20 7a 65 72 6f 2e 22 29 3b 0a 0a 09 09 72 as zero.");....r
2c0c0 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 eturn(CKR_ARGUME
2c0d0 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 NTS_BAD);..}...i
2c0e0 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 f (hSession == 0
2c0f0 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 || hSession >=
2c100 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 (sizeof(cackey_s
2c110 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f essions) / sizeo
2c120 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e f(cackey_session
2c130 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b s[0]))) {...CACK
2c140 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
2c150 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e "Error. Session
2c160 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 out of range.")
2c170 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b ;......return(CK
2c180 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 R_SESSION_HANDLE
2c190 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 _INVALID);..}...
2c1a0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 mutex_retval = c
2c1b0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b ackey_mutex_lock
2c1c0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 (cackey_biglock)
2c1d0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 ;..if (mutex_ret
2c1e0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 val != 0) {...CA
2c1f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
2c200 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 F("Error. Locki
2c210 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 ng failed.");...
2c220 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 .return(CKR_GENE
2c230 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a RAL_ERROR);..}..
2c240 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 .if (!cackey_ses
2c250 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
2c260 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b active) {...cack
2c270 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 ey_mutex_unlock(
2c280 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
2c290 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
2c2a0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
2c2b0 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 Session not act
2c2c0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 ive.");......ret
2c2d0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f urn(CKR_SESSION_
2c2e0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b HANDLE_INVALID);
2c2f0 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ..}...if (!cacke
2c300 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
2c310 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 ion].search_acti
2c320 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d ve) {...cackey_m
2c330 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b utex_unlock(cack
2c340 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 ey_biglock);....
2c350 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
2c360 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 NTF("Error. Sea
2c370 72 63 68 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 rch not active."
2c380 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 );......return(C
2c390 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 KR_OPERATION_NOT
2c3a0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 _INITIALIZED);..
2c3b0 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 }..#ifdef CACKEY
2c3c0 5f 44 45 42 55 47 5f 53 45 41 52 43 48 5f 53 50 _DEBUG_SEARCH_SP
2c3d0 45 45 44 54 45 53 54 0a 09 67 65 74 74 69 6d 65 EEDTEST..gettime
2c3e0 6f 66 64 61 79 28 26 73 74 61 72 74 2c 20 4e 55 ofday(&start, NU
2c3f0 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 63 75 LL);.#endif...cu
2c400 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 20 3d 20 rr_out_id_idx =
2c410 30 3b 0a 09 66 6f 72 20 28 63 75 72 72 5f 69 64 0;..for (curr_id
2c420 5f 69 64 78 20 3d 20 63 61 63 6b 65 79 5f 73 65 _idx = cackey_se
2c430 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
2c440 2e 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64 3b .search_curr_id;
2c450 20 63 75 72 72 5f 69 64 5f 69 64 78 20 3c 20 63 curr_id_idx < c
2c460 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
2c470 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 Session].identit
2c480 69 65 73 5f 63 6f 75 6e 74 20 26 26 20 75 6c 4d ies_count && ulM
2c490 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 3b 20 63 axObjectCount; c
2c4a0 75 72 72 5f 69 64 5f 69 64 78 2b 2b 29 20 7b 0a urr_id_idx++) {.
2c4b0 09 09 63 75 72 72 5f 69 64 20 3d 20 26 63 61 63 ..curr_id = &cac
2c4c0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
2c4d0 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 ssion].identitie
2c4e0 73 5b 63 75 72 72 5f 69 64 5f 69 64 78 5d 3b 0a s[curr_id_idx];.
2c4f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
2c500 50 52 49 4e 54 46 28 22 50 72 6f 63 65 73 73 69 PRINTF("Processi
2c510 6e 67 20 69 64 65 6e 74 69 74 79 3a 25 6c 75 22 ng identity:%lu"
2c520 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
2c530 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a ) curr_id_idx);.
2c540 0a 09 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 ...matched_count
2c550 20 3d 20 30 3b 0a 0a 09 09 66 6f 72 20 28 63 75 = 0;....for (cu
2c560 72 72 5f 61 74 74 72 5f 69 64 78 20 3d 20 30 3b rr_attr_idx = 0;
2c570 20 63 75 72 72 5f 61 74 74 72 5f 69 64 78 20 3c curr_attr_idx <
2c580 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 cackey_sessions
2c590 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 [hSession].searc
2c5a0 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b 20 63 h_query_count; c
2c5b0 75 72 72 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 urr_attr_idx++)
2c5c0 7b 0a 09 09 09 70 72 65 76 5f 6d 61 74 63 68 65 {....prev_matche
2c5d0 64 5f 63 6f 75 6e 74 20 3d 20 6d 61 74 63 68 65 d_count = matche
2c5e0 64 5f 63 6f 75 6e 74 3b 0a 0a 09 09 09 63 75 72 d_count;.....cur
2c5f0 72 5f 61 74 74 72 20 3d 20 26 63 61 63 6b 65 79 r_attr = &cackey
2c600 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
2c610 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 on].search_query
2c620 5b 63 75 72 72 5f 61 74 74 72 5f 69 64 78 5d 3b [curr_attr_idx];
2c630 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
2c640 47 5f 50 52 49 4e 54 46 28 22 20 20 43 68 65 63 G_PRINTF(" Chec
2c650 6b 69 6e 67 20 66 6f 72 20 61 74 74 72 69 62 75 king for attribu
2c660 74 65 20 25 73 20 28 30 78 25 30 38 6c 78 29 20 te %s (0x%08lx)
2c670 69 6e 20 69 64 65 6e 74 69 74 79 3a 25 69 2e 2e in identity:%i..
2c680 2e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 .", CACKEY_DEBUG
2c690 5f 46 55 4e 43 5f 41 54 54 52 49 42 55 54 45 5f _FUNC_ATTRIBUTE_
2c6a0 54 4f 5f 53 54 52 28 63 75 72 72 5f 61 74 74 72 TO_STR(curr_attr
2c6b0 2d 3e 74 79 70 65 29 2c 20 28 75 6e 73 69 67 6e ->type), (unsign
2c6c0 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 ed long) curr_at
2c6d0 74 72 2d 3e 74 79 70 65 2c 20 28 69 6e 74 29 20 tr->type, (int)
2c6e0 63 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a 09 09 curr_id_idx);...
2c6f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
2c700 49 4e 54 42 55 46 28 22 20 20 20 20 56 61 6c 75 INTBUF(" Valu
2c710 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 3a 22 2c e looking for:",
2c720 20 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c curr_attr->pVal
2c730 75 65 2c 20 63 75 72 72 5f 61 74 74 72 2d 3e 75 ue, curr_attr->u
2c740 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 lValueLen);.....
2c750 66 6f 72 20 28 73 65 73 73 5f 61 74 74 72 5f 69 for (sess_attr_i
2c760 64 78 20 3d 20 30 3b 20 73 65 73 73 5f 61 74 74 dx = 0; sess_att
2c770 72 5f 69 64 78 20 3c 20 63 75 72 72 5f 69 64 2d r_idx < curr_id-
2c780 3e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e >attributes_coun
2c790 74 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 t; sess_attr_idx
2c7a0 2b 2b 29 20 7b 0a 09 09 09 09 69 66 20 28 63 61 ++) {.....if (ca
2c7b0 63 6b 65 79 5f 70 6b 63 73 31 31 5f 63 6f 6d 70 ckey_pkcs11_comp
2c7c0 61 72 65 5f 61 74 74 72 69 62 75 74 65 73 28 26 are_attributes(&
2c7d0 63 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 curr_id->attribu
2c7e0 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 tes[sess_attr_id
2c7f0 78 5d 2c 20 63 75 72 72 5f 61 74 74 72 29 29 20 x], curr_attr))
2c800 7b 0a 09 09 09 09 09 6d 61 74 63 68 65 64 5f 63 {......matched_c
2c810 6f 75 6e 74 2b 2b 3b 0a 0a 09 09 09 09 09 62 72 ount++;.......br
2c820 65 61 6b 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a eak;.....}....}.
2c830 0a 09 09 09 2f 2a 20 49 66 20 74 68 65 20 61 74 ..../* If the at
2c840 74 72 69 62 75 74 65 20 63 6f 75 6c 64 20 6e 6f tribute could no
2c850 74 20 62 65 20 6d 61 74 63 68 65 64 2c 20 64 6f t be matched, do
2c860 20 6e 6f 74 20 74 72 79 20 74 6f 20 6d 61 74 63 not try to matc
2c870 68 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 74 74 h additional att
2c880 72 69 62 75 74 65 73 20 2a 2f 0a 09 09 09 69 66 ributes */....if
2c890 20 28 70 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 (prev_matched_c
2c8a0 6f 75 6e 74 20 3d 3d 20 6d 61 74 63 68 65 64 5f ount == matched_
2c8b0 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 62 72 65 count) {.....bre
2c8c0 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 ak;....}...}....
2c8d0 69 66 20 28 6d 61 74 63 68 65 64 5f 63 6f 75 6e if (matched_coun
2c8e0 74 20 3d 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 t == cackey_sess
2c8f0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 ions[hSession].s
2c900 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e earch_query_coun
2c910 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 t) {....CACKEY_D
2c920 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e EBUG_PRINTF(" .
2c930 2e 2e 20 41 6c 6c 20 25 69 20 61 74 74 72 69 62 .. All %i attrib
2c940 75 74 65 73 20 63 68 65 63 6b 65 64 20 66 6f 72 utes checked for
2c950 20 66 6f 75 6e 64 2c 20 61 64 64 69 6e 67 20 69 found, adding i
2c960 64 65 6e 74 69 74 79 3a 25 69 20 74 6f 20 72 65 dentity:%i to re
2c970 74 75 72 6e 65 64 20 6c 69 73 74 22 2c 20 28 69 turned list", (i
2c980 6e 74 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69 nt) cackey_sessi
2c990 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 ons[hSession].se
2c9a0 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 arch_query_count
2c9b0 2c 20 28 69 6e 74 29 20 63 75 72 72 5f 69 64 5f , (int) curr_id_
2c9c0 69 64 78 29 3b 0a 0a 09 09 09 70 68 4f 62 6a 65 idx);.....phObje
2c9d0 63 74 5b 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 ct[curr_out_id_i
2c9e0 64 78 5d 20 3d 20 63 75 72 72 5f 69 64 5f 69 64 dx] = curr_id_id
2c9f0 78 20 2b 20 31 3b 0a 0a 09 09 09 75 6c 4d 61 78 x + 1;.....ulMax
2ca00 4f 62 6a 65 63 74 43 6f 75 6e 74 2d 2d 3b 0a 0a ObjectCount--;..
2ca10 09 09 09 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 ...curr_out_id_i
2ca20 64 78 2b 2b 3b 0a 09 09 7d 20 65 6c 73 65 20 7b dx++;...} else {
2ca30 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
2ca40 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 4e _PRINTF(" ... N
2ca50 6f 74 20 61 6c 6c 20 25 69 20 28 6f 6e 6c 79 20 ot all %i (only
2ca60 66 6f 75 6e 64 20 25 69 29 20 61 74 74 72 69 62 found %i) attrib
2ca70 75 74 65 73 20 63 68 65 63 6b 65 64 20 66 6f 72 utes checked for
2ca80 20 66 6f 75 6e 64 2c 20 6e 6f 74 20 61 64 64 69 found, not addi
2ca90 6e 67 20 69 64 65 6e 74 69 74 79 3a 25 69 22 2c ng identity:%i",
2caa0 20 28 69 6e 74 29 20 63 61 63 6b 65 79 5f 73 65 (int) cackey_se
2cab0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
2cac0 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f .search_query_co
2cad0 75 6e 74 2c 20 28 69 6e 74 29 20 6d 61 74 63 68 unt, (int) match
2cae0 65 64 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 ed_count, (int)
2caf0 63 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a 09 09 curr_id_idx);...
2cb00 7d 0a 09 7d 0a 09 63 61 63 6b 65 79 5f 73 65 73 }..}..cackey_ses
2cb10 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
2cb20 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64 20 3d search_curr_id =
2cb30 20 63 75 72 72 5f 69 64 5f 69 64 78 3b 0a 09 2a curr_id_idx;..*
2cb40 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d pulObjectCount =
2cb50 20 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 curr_out_id_idx
2cb60 3b 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 ;..#ifdef CACKEY
2cb70 5f 44 45 42 55 47 5f 53 45 41 52 43 48 5f 53 50 _DEBUG_SEARCH_SP
2cb80 45 45 44 54 45 53 54 0a 09 67 65 74 74 69 6d 65 EEDTEST..gettime
2cb90 6f 66 64 61 79 28 26 65 6e 64 2c 20 4e 55 4c 4c ofday(&end, NULL
2cba0 29 3b 0a 09 73 74 61 72 74 5f 69 6e 74 20 3d 20 );..start_int =
2cbb0 28 73 74 61 72 74 2e 74 76 5f 73 65 63 20 2a 20 (start.tv_sec *
2cbc0 31 30 30 30 30 30 30 29 20 2b 20 73 74 61 72 74 1000000) + start
2cbd0 2e 74 76 5f 75 73 65 63 3b 0a 09 65 6e 64 5f 69 .tv_usec;..end_i
2cbe0 6e 74 20 3d 20 28 65 6e 64 2e 74 76 5f 73 65 63 nt = (end.tv_sec
2cbf0 20 2a 20 31 30 30 30 30 30 30 29 20 2b 20 65 6e * 1000000) + en
2cc00 64 2e 74 76 5f 75 73 65 63 3b 0a 09 66 70 72 69 d.tv_usec;..fpri
2cc10 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 65 61 ntf(stderr, "Sea
2cc20 72 63 68 20 74 6f 6f 6b 20 25 6c 75 20 6d 69 63 rch took %lu mic
2cc30 72 6f 73 65 63 6f 6e 64 73 5c 6e 22 2c 20 28 75 roseconds\n", (u
2cc40 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 65 nsigned long) (e
2cc50 6e 64 5f 69 6e 74 20 2d 20 73 74 61 72 74 5f 69 nd_int - start_i
2cc60 6e 74 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 6d nt));.#endif...m
2cc70 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 utex_retval = ca
2cc80 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 ckey_mutex_unloc
2cc90 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
2cca0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 );..if (mutex_re
2ccb0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 tval != 0) {...C
2ccc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
2ccd0 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f TF("Error. Unlo
2cce0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b cking failed.");
2ccf0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 ....return(CKR_G
2cd00 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 ENERAL_ERROR);..
2cd10 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 }...CACKEY_DEBUG
2cd20 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
2cd30 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 2c 20 ng CKR_OK (%i),
2cd40 6e 75 6d 20 6f 62 6a 65 63 74 73 20 3d 20 25 6c num objects = %l
2cd50 75 22 2c 20 43 4b 52 5f 4f 4b 2c 20 2a 70 75 6c u", CKR_OK, *pul
2cd60 4f 62 6a 65 63 74 43 6f 75 6e 74 29 3b 0a 0a 09 ObjectCount);...
2cd70 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a return(CKR_OK);.
2cd80 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e }..CK_DEFINE_FUN
2cd90 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 CTION(CK_RV, C_F
2cda0 69 6e 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c 29 indObjectsFinal)
2cdb0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 (CK_SESSION_HAND
2cdc0 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 LE hSession) {..
2cdd0 43 4b 5f 55 4c 4f 4e 47 20 69 64 78 3b 0a 09 69 CK_ULONG idx;..i
2cde0 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b nt mutex_retval;
2cdf0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
2ce00 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
2ce10 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 );...if (!cackey
2ce20 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
2ce30 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
2ce40 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e RINTF("Error. N
2ce50 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 ot initialized."
2ce60 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
2ce70 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e _CRYPTOKI_NOT_IN
2ce80 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
2ce90 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d .if (hSession ==
2cea0 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 0 || hSession >
2ceb0 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 = (sizeof(cackey
2cec0 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a _sessions) / siz
2ced0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 eof(cackey_sessi
2cee0 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 ons[0]))) {...CA
2cef0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
2cf00 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 F("Error. Sessi
2cf10 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e on out of range.
2cf20 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 ");......return(
2cf30 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 CKR_SESSION_HAND
2cf40 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a LE_INVALID);..}.
2cf50 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d ..mutex_retval =
2cf60 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f cackey_mutex_lo
2cf70 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
2cf80 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 k);..if (mutex_r
2cf90 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 etval != 0) {...
2cfa0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
2cfb0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 NTF("Error. Loc
2cfc0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a king failed.");.
2cfd0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 ...return(CKR_GE
2cfe0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d NERAL_ERROR);..}
2cff0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 ...if (!cackey_s
2d000 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
2d010 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 ].active) {...ca
2d020 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 ckey_mutex_unloc
2d030 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
2d040 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 );....CACKEY_DEB
2d050 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
2d060 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 . Session not a
2d070 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 ctive.");......r
2d080 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f eturn(CKR_SESSIO
2d090 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 N_HANDLE_INVALID
2d0a0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 );..}...if (!cac
2d0b0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
2d0c0 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 ssion].search_ac
2d0d0 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 tive) {...cackey
2d0e0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 _mutex_unlock(ca
2d0f0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a ckey_biglock);..
2d100 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
2d110 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 RINTF("Error. S
2d120 65 61 72 63 68 20 6e 6f 74 20 61 63 74 69 76 65 earch not active
2d130 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e .");......return
2d140 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e (CKR_OPERATION_N
2d150 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b OT_INITIALIZED);
2d160 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 ..}...cackey_ses
2d170 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
2d180 73 65 61 72 63 68 5f 61 63 74 69 76 65 20 3d 20 search_active =
2d190 30 3b 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 0;...for (idx =
2d1a0 30 3b 20 69 64 78 20 3c 20 63 61 63 6b 65 79 5f 0; idx < cackey_
2d1b0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
2d1c0 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f n].search_query_
2d1d0 63 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a count; idx++) {.
2d1e0 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 ..if (cackey_ses
2d1f0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
2d200 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78 search_query[idx
2d210 5d 2e 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 66 ].pValue) {....f
2d220 72 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69 ree(cackey_sessi
2d230 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 ons[hSession].se
2d240 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e arch_query[idx].
2d250 70 56 61 6c 75 65 29 3b 0a 09 09 7d 0a 09 7d 0a pValue);...}..}.
2d260 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 ..if (cackey_ses
2d270 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
2d280 73 65 61 72 63 68 5f 71 75 65 72 79 29 20 7b 0a search_query) {.
2d290 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 65 ..free(cackey_se
2d2a0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
2d2b0 2e 73 65 61 72 63 68 5f 71 75 65 72 79 29 3b 0a .search_query);.
2d2c0 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 .}...mutex_retva
2d2d0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 l = cackey_mutex
2d2e0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 _unlock(cackey_b
2d2f0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 iglock);..if (mu
2d300 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 tex_retval != 0)
2d310 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
2d320 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
2d330 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c Unlocking fail
2d340 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
2d350 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 (CKR_GENERAL_ERR
2d360 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 OR);..}...CACKEY
2d370 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
2d380 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 eturning CKR_OK
2d390 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a (%i)", CKR_OK);.
2d3a0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 ..return(CKR_OK)
2d3b0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 ;.}..CK_DEFINE_F
2d3c0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 UNCTION(CK_RV, C
2d3d0 5f 45 6e 63 72 79 70 74 49 6e 69 74 29 28 43 4b _EncryptInit)(CK
2d3e0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 _SESSION_HANDLE
2d3f0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 hSession, CK_MEC
2d400 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 HANISM_PTR pMech
2d410 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 anism, CK_OBJECT
2d420 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a _HANDLE hKey) {.
2d430 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
2d440 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
2d450 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 ...if (!cackey_i
2d460 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 nitialized) {...
2d470 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
2d480 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 NTF("Error. Not
2d490 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b initialized.");
2d4a0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 ....return(CKR_C
2d4b0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 RYPTOKI_NOT_INIT
2d4c0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 IALIZED);..}...C
2d4d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
2d4e0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b TF("Returning CK
2d4f0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
2d500 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 UPPORTED (%i)",
2d510 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
2d520 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 _SUPPORTED);...r
2d530 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 eturn(CKR_FUNCTI
2d540 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
2d550 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f );.}..CK_DEFINE_
2d560 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 FUNCTION(CK_RV,
2d570 43 5f 45 6e 63 72 79 70 74 29 28 43 4b 5f 53 45 C_Encrypt)(CK_SE
2d580 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 SSION_HANDLE hSe
2d590 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 ssion, CK_BYTE_P
2d5a0 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f TR pData, CK_ULO
2d5b0 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b NG ulDataLen, CK
2d5c0 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 _BYTE_PTR pEncry
2d5d0 70 74 65 64 44 61 74 61 2c 20 43 4b 5f 55 4c 4f ptedData, CK_ULO
2d5e0 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70 NG_PTR pulEncryp
2d5f0 74 65 64 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 tedDataLen) {..C
2d600 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
2d610 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
2d620 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 .if (!cackey_ini
2d630 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 tialized) {...CA
2d640 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
2d650 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 F("Error. Not i
2d660 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a nitialized.");..
2d670 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 ..return(CKR_CRY
2d680 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 PTOKI_NOT_INITIA
2d690 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 LIZED);..}...CAC
2d6a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
2d6b0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f ("Returning CKR_
2d6c0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
2d6d0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b PORTED (%i)", CK
2d6e0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
2d6f0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 UPPORTED);...ret
2d700 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e urn(CKR_FUNCTION
2d710 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
2d720 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 .}..CK_DEFINE_FU
2d730 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f NCTION(CK_RV, C_
2d740 45 6e 63 72 79 70 74 55 70 64 61 74 65 29 28 43 EncryptUpdate)(C
2d750 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 K_SESSION_HANDLE
2d760 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 hSession, CK_BY
2d770 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b TE_PTR pPart, CK
2d780 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e _ULONG ulPartLen
2d790 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 , CK_BYTE_PTR pE
2d7a0 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b ncryptedPart, CK
2d7b0 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e _ULONG_PTR pulEn
2d7c0 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20 cryptedPartLen)
2d7d0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f {..CACKEY_DEBUG_
2d7e0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
2d7f0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 );...if (!cackey
2d800 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
2d810 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
2d820 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e RINTF("Error. N
2d830 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 ot initialized."
2d840 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
2d850 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e _CRYPTOKI_NOT_IN
2d860 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
2d870 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
2d880 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
2d890 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
2d8a0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 _SUPPORTED (%i)"
2d8b0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e , CKR_FUNCTION_N
2d8c0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a OT_SUPPORTED);..
2d8d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 .return(CKR_FUNC
2d8e0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
2d8f0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e ED);.}..CK_DEFIN
2d900 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 E_FUNCTION(CK_RV
2d910 2c 20 43 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c , C_EncryptFinal
2d920 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e )(CK_SESSION_HAN
2d930 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b DLE hSession, CK
2d940 5f 42 59 54 45 5f 50 54 52 20 70 4c 61 73 74 45 _BYTE_PTR pLastE
2d950 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b ncryptedPart, CK
2d960 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4c 61 _ULONG_PTR pulLa
2d970 73 74 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c stEncryptedPartL
2d980 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 en) {..CACKEY_DE
2d990 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
2d9a0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 ed.");...if (!ca
2d9b0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 ckey_initialized
2d9c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
2d9d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
2d9e0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a . Not initializ
2d9f0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
2da00 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f (CKR_CRYPTOKI_NO
2da10 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a T_INITIALIZED);.
2da20 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 .}...CACKEY_DEBU
2da30 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
2da40 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e ing CKR_FUNCTION
2da50 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 _NOT_SUPPORTED (
2da60 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 %i)", CKR_FUNCTI
2da70 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
2da80 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f );...return(CKR_
2da90 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
2daa0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 PORTED);.}..CK_D
2dab0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 EFINE_FUNCTION(C
2dac0 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 49 K_RV, C_DecryptI
2dad0 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f nit)(CK_SESSION_
2dae0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c HANDLE hSession,
2daf0 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 CK_MECHANISM_PT
2db00 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b R pMechanism, CK
2db10 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 _OBJECT_HANDLE h
2db20 4b 65 79 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 Key) {..int mute
2db30 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 68 4b 65 79 x_retval;...hKey
2db40 2d 2d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 --;...CACKEY_DEB
2db50 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
2db60 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 d.");...if (!cac
2db70 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 key_initialized)
2db80 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
2db90 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
2dba0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 Not initialize
2dbb0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
2dbc0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 CKR_CRYPTOKI_NOT
2dbd0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 _INITIALIZED);..
2dbe0 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69 }...if (pMechani
2dbf0 73 6d 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 sm == NULL) {...
2dc00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
2dc10 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 NTF("Error. pMec
2dc20 68 61 6e 69 73 6d 20 69 73 20 4e 55 4c 4c 2e 22 hanism is NULL."
2dc30 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
2dc40 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b _ARGUMENTS_BAD);
2dc50 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 ..}...if (pMecha
2dc60 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 nism->mechanism
2dc70 21 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 29 != CKM_RSA_PKCS)
2dc80 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
2dc90 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
2dca0 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 pMechanism->mec
2dcb0 68 61 6e 69 73 6d 20 6e 6f 74 20 73 70 65 63 69 hanism not speci
2dcc0 66 69 65 64 20 61 73 20 43 4b 4d 5f 52 53 41 5f fied as CKM_RSA_
2dcd0 50 4b 43 53 22 29 3b 0a 0a 09 09 72 65 74 75 72 PKCS");....retur
2dce0 6e 28 43 4b 52 5f 4d 45 43 48 41 4e 49 53 4d 5f n(CKR_MECHANISM_
2dcf0 50 41 52 41 4d 5f 49 4e 56 41 4c 49 44 29 3b 0a PARAM_INVALID);.
2dd00 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f .}...if (hSessio
2dd10 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 n == 0 || hSessi
2dd20 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 on >= (sizeof(ca
2dd30 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f ckey_sessions) /
2dd40 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 sizeof(cackey_s
2dd50 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a essions[0]))) {.
2dd60 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
2dd70 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 RINTF("Error. S
2dd80 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 ession out of ra
2dd90 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 nge.");......ret
2dda0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f urn(CKR_SESSION_
2ddb0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b HANDLE_INVALID);
2ddc0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 ..}...mutex_retv
2ddd0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 al = cackey_mute
2dde0 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 x_lock(cackey_bi
2ddf0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 glock);..if (mut
2de00 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 ex_retval != 0)
2de10 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
2de20 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
2de30 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e Locking failed.
2de40 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
2de50 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 R_GENERAL_ERROR)
2de60 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b ;..}...if (!cack
2de70 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
2de80 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a sion].active) {.
2de90 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 ..cackey_mutex_u
2dea0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 nlock(cackey_big
2deb0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 lock);....CACKEY
2dec0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
2ded0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e rror. Session n
2dee0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 ot active.");...
2def0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 ...return(CKR_SE
2df00 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 SSION_HANDLE_INV
2df10 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 ALID);..}...if (
2df20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
2df30 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 hSession].decryp
2df40 74 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 t_active) {...ca
2df50 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 ckey_mutex_unloc
2df60 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
2df70 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 );....CACKEY_DEB
2df80 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
2df90 2e 20 20 44 65 63 72 79 70 74 20 61 6c 72 65 61 . Decrypt alrea
2dfa0 64 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 22 dy in progress."
2dfb0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 );......return(C
2dfc0 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 KR_OPERATION_ACT
2dfd0 49 56 45 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 IVE);..}...if (h
2dfe0 4b 65 79 20 3e 3d 20 63 61 63 6b 65 79 5f 73 65 Key >= cackey_se
2dff0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
2e000 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e .identities_coun
2e010 74 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 t) {...cackey_mu
2e020 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 tex_unlock(cacke
2e030 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 y_biglock);....C
2e040 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
2e050 54 46 28 22 45 72 72 6f 72 2e 20 20 4b 65 79 20 TF("Error. Key
2e060 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 handle out of ra
2e070 6e 67 65 20 28 72 65 71 75 65 73 74 65 64 20 6b nge (requested k
2e080 65 79 20 25 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75 ey %lu, only %lu
2e090 20 69 64 65 6e 74 69 74 69 65 73 20 61 76 61 69 identities avai
2e0a0 6c 61 62 6c 65 29 2e 22 2c 20 28 75 6e 73 69 67 lable).", (unsig
2e0b0 6e 65 64 20 6c 6f 6e 67 29 20 68 4b 65 79 2c 20 ned long) hKey,
2e0c0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
2e0d0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
2e0e0 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 hSession].identi
2e0f0 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 ties_count);....
2e100 72 65 74 75 72 6e 28 43 4b 52 5f 4b 45 59 5f 48 return(CKR_KEY_H
2e110 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a ANDLE_INVALID);.
2e120 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 .}...cackey_sess
2e130 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 ions[hSession].d
2e140 65 63 72 79 70 74 5f 61 63 74 69 76 65 20 3d 20 ecrypt_active =
2e150 31 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 1;...cackey_sess
2e160 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 ions[hSession].d
2e170 65 63 72 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d ecrypt_mechanism
2e180 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d = pMechanism->m
2e190 65 63 68 61 6e 69 73 6d 3b 0a 09 63 61 63 6b 65 echanism;..cacke
2e1a0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
2e1b0 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 ion].decrypt_mec
2e1c0 68 5f 70 61 72 6d 20 3d 20 70 4d 65 63 68 61 6e h_parm = pMechan
2e1d0 69 73 6d 2d 3e 70 50 61 72 61 6d 65 74 65 72 3b ism->pParameter;
2e1e0 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e ..cackey_session
2e1f0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 s[hSession].decr
2e200 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d 6c 65 6e ypt_mech_parmlen
2e210 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 75 = pMechanism->u
2e220 6c 50 61 72 61 6d 65 74 65 72 4c 65 6e 3b 0a 09 lParameterLen;..
2e230 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
2e240 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 hSession].decryp
2e250 74 5f 69 64 65 6e 74 69 74 79 20 3d 20 26 63 61 t_identity = &ca
2e260 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
2e270 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 ession].identiti
2e280 65 73 5b 68 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65 es[hKey];...mute
2e290 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 x_retval = cacke
2e2a0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
2e2b0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
2e2c0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 .if (mutex_retva
2e2d0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b l != 0) {...CACK
2e2e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
2e2f0 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 "Error. Unlocki
2e300 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 ng failed.");...
2e310 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 .return(CKR_GENE
2e320 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a RAL_ERROR);..}..
2e330 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
2e340 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
2e350 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b CKR_OK (%i)", CK
2e360 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 R_OK);...return(
2e370 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 CKR_OK);.}..CK_D
2e380 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 EFINE_FUNCTION(C
2e390 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 29 K_RV, C_Decrypt)
2e3a0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 (CK_SESSION_HAND
2e3b0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f LE hSession, CK_
2e3c0 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 BYTE_PTR pEncryp
2e3d0 74 65 64 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e tedData, CK_ULON
2e3e0 47 20 75 6c 45 6e 63 72 79 70 74 65 64 44 61 74 G ulEncryptedDat
2e3f0 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 aLen, CK_BYTE_PT
2e400 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e R pData, CK_ULON
2e410 47 5f 50 54 52 20 70 75 6c 44 61 74 61 4c 65 6e G_PTR pulDataLen
2e420 29 20 7b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 64 61 ) {..CK_ULONG da
2e430 74 61 6c 65 6e 5f 75 70 64 61 74 65 2c 20 64 61 talen_update, da
2e440 74 61 6c 65 6e 5f 66 69 6e 61 6c 3b 0a 09 43 4b talen_final;..CK
2e450 5f 52 56 20 64 65 63 72 79 70 74 5f 72 65 74 3b _RV decrypt_ret;
2e460 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 ..int mutex_retv
2e470 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 al;...CACKEY_DEB
2e480 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
2e490 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 d.");...if (!cac
2e4a0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 key_initialized)
2e4b0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
2e4c0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
2e4d0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 Not initialize
2e4e0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
2e4f0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 CKR_CRYPTOKI_NOT
2e500 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 _INITIALIZED);..
2e510 7d 0a 0a 09 69 66 20 28 70 75 6c 44 61 74 61 4c }...if (pulDataL
2e520 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 en == NULL) {...
2e530 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
2e540 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 44 NTF("Error. pulD
2e550 61 74 61 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 ataLen is NULL."
2e560 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
2e570 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b _ARGUMENTS_BAD);
2e580 0a 09 7d 0a 0a 09 64 61 74 61 6c 65 6e 5f 75 70 ..}...datalen_up
2e590 64 61 74 65 20 3d 20 2a 70 75 6c 44 61 74 61 4c date = *pulDataL
2e5a0 65 6e 3b 0a 0a 09 64 65 63 72 79 70 74 5f 72 65 en;...decrypt_re
2e5b0 74 20 3d 20 43 5f 44 65 63 72 79 70 74 55 70 64 t = C_DecryptUpd
2e5c0 61 74 65 28 68 53 65 73 73 69 6f 6e 2c 20 70 45 ate(hSession, pE
2e5d0 6e 63 72 79 70 74 65 64 44 61 74 61 2c 20 75 6c ncryptedData, ul
2e5e0 45 6e 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e EncryptedDataLen
2e5f0 2c 20 70 44 61 74 61 2c 20 26 64 61 74 61 6c 65 , pData, &datale
2e600 6e 5f 75 70 64 61 74 65 29 3b 0a 09 69 66 20 28 n_update);..if (
2e610 64 65 63 72 79 70 74 5f 72 65 74 20 21 3d 20 43 decrypt_ret != C
2e620 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 KR_OK) {...CACKE
2e630 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
2e640 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 55 Error. DecryptU
2e650 70 64 61 74 65 28 29 20 72 65 74 75 72 6e 65 64 pdate() returned
2e660 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25 failure (rv = %
2e670 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 lu).", (unsigned
2e680 20 6c 6f 6e 67 29 20 64 65 63 72 79 70 74 5f 72 long) decrypt_r
2e690 65 74 29 3b 0a 0a 09 09 69 66 20 28 64 65 63 72 et);....if (decr
2e6a0 79 70 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f 42 ypt_ret != CKR_B
2e6b0 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 UFFER_TOO_SMALL)
2e6c0 20 7b 0a 09 09 09 2f 2a 20 54 65 72 6d 69 6e 61 {..../* Termina
2e6d0 74 65 20 64 65 63 72 79 70 74 69 6f 6e 20 6f 70 te decryption op
2e6e0 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 09 09 09 6d eration */.....m
2e6f0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 utex_retval = ca
2e700 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 ckey_mutex_lock(
2e710 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
2e720 0a 09 09 09 69 66 20 28 6d 75 74 65 78 5f 72 65 ....if (mutex_re
2e730 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 tval != 0) {....
2e740 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
2e750 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f INTF("Error. Lo
2e760 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b cking failed.");
2e770 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 ......return(CKR
2e780 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b _GENERAL_ERROR);
2e790 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 21 63 ....}.....if (!c
2e7a0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
2e7b0 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 Session].active)
2e7c0 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 {.....cackey_mu
2e7d0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 tex_unlock(cacke
2e7e0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 y_biglock);.....
2e7f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
2e800 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 INTF("Error. Se
2e810 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 ssion not active
2e820 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72 65 74 75 .");........retu
2e830 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 rn(CKR_SESSION_H
2e840 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a ANDLE_INVALID);.
2e850 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 21 63 61 ...}.....if (!ca
2e860 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
2e870 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f ession].decrypt_
2e880 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09 63 61 active) {.....ca
2e890 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 ckey_mutex_unloc
2e8a0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
2e8b0 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 );......CACKEY_D
2e8c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
2e8d0 6f 72 2e 20 20 44 65 63 72 79 70 74 20 6e 6f 74 or. Decrypt not
2e8e0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 active.");.....
2e8f0 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 ...return(CKR_OP
2e900 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 ERATION_NOT_INIT
2e910 49 41 4c 49 5a 45 44 29 3b 0a 09 09 09 7d 0a 0a IALIZED);....}..
2e920 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f ...cackey_sessio
2e930 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 ns[hSession].dec
2e940 72 79 70 74 5f 61 63 74 69 76 65 20 3d 20 30 3b rypt_active = 0;
2e950 0a 0a 09 09 09 6d 75 74 65 78 5f 72 65 74 76 61 .....mutex_retva
2e960 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 l = cackey_mutex
2e970 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 _unlock(cackey_b
2e980 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28 iglock);....if (
2e990 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 mutex_retval !=
2e9a0 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 0) {.....CACKEY_
2e9b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
2e9c0 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 ror. Unlocking
2e9d0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09 failed.");......
2e9e0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 return(CKR_GENER
2e9f0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a AL_ERROR);....}.
2ea00 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 64 65 ..}....return(de
2ea10 63 72 79 70 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a crypt_ret);..}..
2ea20 09 69 66 20 28 70 44 61 74 61 29 20 7b 0a 09 09 .if (pData) {...
2ea30 70 44 61 74 61 20 2b 3d 20 64 61 74 61 6c 65 6e pData += datalen
2ea40 5f 75 70 64 61 74 65 3b 0a 09 7d 0a 09 64 61 74 _update;..}..dat
2ea50 61 6c 65 6e 5f 66 69 6e 61 6c 20 3d 20 2a 70 75 alen_final = *pu
2ea60 6c 44 61 74 61 4c 65 6e 20 2d 20 64 61 74 61 6c lDataLen - datal
2ea70 65 6e 5f 75 70 64 61 74 65 3b 0a 0a 09 64 65 63 en_update;...dec
2ea80 72 79 70 74 5f 72 65 74 20 3d 20 43 5f 44 65 63 rypt_ret = C_Dec
2ea90 72 79 70 74 46 69 6e 61 6c 28 68 53 65 73 73 69 ryptFinal(hSessi
2eaa0 6f 6e 2c 20 70 44 61 74 61 2c 20 26 64 61 74 61 on, pData, &data
2eab0 6c 65 6e 5f 66 69 6e 61 6c 29 3b 0a 09 69 66 20 len_final);..if
2eac0 28 64 65 63 72 79 70 74 5f 72 65 74 20 21 3d 20 (decrypt_ret !=
2ead0 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b CKR_OK) {...CACK
2eae0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
2eaf0 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 "Error. Decrypt
2eb00 46 69 6e 61 6c 28 29 20 72 65 74 75 72 6e 65 64 Final() returned
2eb10 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25 failure (rv = %
2eb20 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 lu).", (unsigned
2eb30 20 6c 6f 6e 67 29 20 64 65 63 72 79 70 74 5f 72 long) decrypt_r
2eb40 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 64 et);....return(d
2eb50 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 09 7d 0a ecrypt_ret);..}.
2eb60 0a 09 2a 70 75 6c 44 61 74 61 4c 65 6e 20 3d 20 ..*pulDataLen =
2eb70 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 20 2b datalen_update +
2eb80 20 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 3b 0a datalen_final;.
2eb90 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
2eba0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
2ebb0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 CKR_OK (%i)", C
2ebc0 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e KR_OK);...return
2ebd0 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f (CKR_OK);.}..CK_
2ebe0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 DEFINE_FUNCTION(
2ebf0 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 CK_RV, C_Decrypt
2ec00 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 Update)(CK_SESSI
2ec10 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 ON_HANDLE hSessi
2ec20 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 on, CK_BYTE_PTR
2ec30 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 pEncryptedPart,
2ec40 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 CK_ULONG ulEncry
2ec50 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f ptedPartLen, CK_
2ec60 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 BYTE_PTR pPart,
2ec70 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c CK_ULONG_PTR pul
2ec80 50 61 72 74 4c 65 6e 29 20 7b 0a 09 73 74 61 74 PartLen) {..stat
2ec90 69 63 20 43 4b 5f 42 59 54 45 20 62 75 66 5b 31 ic CK_BYTE buf[1
2eca0 36 33 38 34 5d 3b 0a 09 73 73 69 7a 65 5f 74 20 6384];..ssize_t
2ecb0 62 75 66 6c 65 6e 3b 0a 09 43 4b 5f 53 4c 4f 54 buflen;..CK_SLOT
2ecc0 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f _ID slotID;..CK_
2ecd0 52 56 20 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f RV retval = CKR_
2ece0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 GENERAL_ERROR;..
2ecf0 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c int mutex_retval
2ed00 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ;...CACKEY_DEBUG
2ed10 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
2ed20 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ");...if (!cacke
2ed30 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b y_initialized) {
2ed40 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
2ed50 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
2ed60 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e Not initialized.
2ed70 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
2ed80 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 R_CRYPTOKI_NOT_I
2ed90 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
2eda0 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d ..if (hSession =
2edb0 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 = 0 || hSession
2edc0 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 >= (sizeof(cacke
2edd0 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 y_sessions) / si
2ede0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 zeof(cackey_sess
2edf0 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 ions[0]))) {...C
2ee00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
2ee10 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 TF("Error. Sess
2ee20 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 ion out of range
2ee30 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e .");......return
2ee40 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e (CKR_SESSION_HAN
2ee50 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d DLE_INVALID);..}
2ee60 0a 0a 09 69 66 20 28 70 45 6e 63 72 79 70 74 65 ...if (pEncrypte
2ee70 64 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 dPart == NULL &&
2ee80 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 ulEncryptedPart
2ee90 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a Len == 0) {.../*
2eea0 20 53 68 6f 72 74 20 63 69 72 63 75 69 74 20 69 Short circuit i
2eeb0 66 20 77 65 20 61 72 65 20 61 73 6b 65 64 20 74 f we are asked t
2eec0 6f 20 64 65 63 72 79 70 74 20 6e 6f 74 68 69 6e o decrypt nothin
2eed0 67 2e 2e 2e 20 2a 2f 0a 09 09 43 41 43 4b 45 59 g... */...CACKEY
2eee0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
2eef0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 eturning CKR_OK
2ef00 28 25 69 29 20 28 73 68 6f 72 74 20 63 69 72 63 (%i) (short circ
2ef10 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a uit)", CKR_OK);.
2ef20 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b ...return(CKR_OK
2ef30 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 45 6e 63 );..}...if (pEnc
2ef40 72 79 70 74 65 64 50 61 72 74 20 3d 3d 20 4e 55 ryptedPart == NU
2ef50 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 LL) {...CACKEY_D
2ef60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
2ef70 6f 72 2e 20 70 45 6e 63 72 79 70 74 65 64 50 61 or. pEncryptedPa
2ef80 72 74 20 69 73 20 4e 55 4c 4c 2c 20 62 75 74 20 rt is NULL, but
2ef90 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c ulEncryptedPartL
2efa0 65 6e 20 69 73 20 6e 6f 74 20 30 2e 22 29 3b 0a en is not 0.");.
2efb0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 ...return(CKR_AR
2efc0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d GUMENTS_BAD);..}
2efd0 0a 0a 09 69 66 20 28 75 6c 45 6e 63 72 79 70 74 ...if (ulEncrypt
2efe0 65 64 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 edPartLen == 0)
2eff0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
2f000 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
2f010 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c ulEncryptedPartL
2f020 65 6e 20 69 73 20 30 2c 20 62 75 74 20 70 50 61 en is 0, but pPa
2f030 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 rt is not NULL."
2f040 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
2f050 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b _ARGUMENTS_BAD);
2f060 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 50 61 72 ..}...if (pulPar
2f070 74 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a tLen == NULL) {.
2f080 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
2f090 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 RINTF("Error. pu
2f0a0 6c 50 61 72 74 4c 65 6e 20 69 73 20 4e 55 4c 4c lPartLen is NULL
2f0b0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
2f0c0 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 KR_ARGUMENTS_BAD
2f0d0 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 );..}...mutex_re
2f0e0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 tval = cackey_mu
2f0f0 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f tex_lock(cackey_
2f100 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d biglock);..if (m
2f110 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 utex_retval != 0
2f120 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
2f130 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
2f140 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 . Locking faile
2f150 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
2f160 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f CKR_GENERAL_ERRO
2f170 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 R);..}...if (!ca
2f180 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
2f190 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 ession].active)
2f1a0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 {...cackey_mutex
2f1b0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 _unlock(cackey_b
2f1c0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b iglock);....CACK
2f1d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
2f1e0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e "Error. Session
2f1f0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a not active.");.
2f200 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f .....return(CKR_
2f210 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 SESSION_HANDLE_I
2f220 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 NVALID);..}...if
2f230 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f (!cackey_sessio
2f240 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 ns[hSession].dec
2f250 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b 0a 09 rypt_active) {..
2f260 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e .cackey_mutex_un
2f270 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
2f280 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f ock);....CACKEY_
2f290 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
2f2a0 72 6f 72 2e 20 20 44 65 63 72 79 70 74 20 6e 6f ror. Decrypt no
2f2b0 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a t active.");....
2f2c0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 ..return(CKR_OPE
2f2d0 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 RATION_NOT_INITI
2f2e0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 6c ALIZED);..}...sl
2f2f0 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 otID = cackey_se
2f300 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
2f310 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 .slotID;...if (s
2f320 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f lotID < 0 || slo
2f330 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 tID >= (sizeof(c
2f340 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 ackey_slots) / s
2f350 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f izeof(cackey_slo
2f360 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 ts[0]))) {...CAC
2f370 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
2f380 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 ("Error. Invalid
2f390 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 slot requested
2f3a0 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f (%lu), outside o
2f3b0 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 f valid range",
2f3c0 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 slotID);....retu
2f3d0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 rn(CKR_GENERAL_E
2f3e0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 RROR);..}...if (
2f3f0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f cackey_slots[slo
2f400 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 tID].active == 0
2f410 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
2f420 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
2f430 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 . Invalid slot r
2f440 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 equested (%lu),
2f450 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 slot not current
2f460 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 ly active", slot
2f470 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d ID);....cackey_m
2f480 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b utex_unlock(cack
2f490 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 ey_biglock);....
2f4a0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 return(CKR_GENER
2f4b0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 AL_ERROR);..}...
2f4c0 73 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73 switch (cackey_s
2f4d0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
2f4e0 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 61 6e ].decrypt_mechan
2f4f0 69 73 6d 29 20 7b 0a 09 09 63 61 73 65 20 43 4b ism) {...case CK
2f500 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f M_RSA_PKCS:..../
2f510 2a 20 41 73 6b 20 63 61 72 64 20 74 6f 20 64 65 * Ask card to de
2f520 63 72 79 70 74 20 2a 2f 0a 09 09 09 62 75 66 6c crypt */....bufl
2f530 65 6e 20 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e en = cackey_sign
2f540 64 65 63 72 79 70 74 28 26 63 61 63 6b 65 79 5f decrypt(&cackey_
2f550 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 slots[slotID], c
2f560 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
2f570 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 Session].decrypt
2f580 5f 69 64 65 6e 74 69 74 79 2c 20 70 45 6e 63 72 _identity, pEncr
2f590 79 70 74 65 64 50 61 72 74 2c 20 75 6c 45 6e 63 yptedPart, ulEnc
2f5a0 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 62 ryptedPartLen, b
2f5b0 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 2c uf, sizeof(buf),
2f5c0 20 30 2c 20 31 29 3b 0a 0a 09 09 09 69 66 20 28 0, 1);.....if (
2f5d0 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 buflen == CACKEY
2f5e0 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 _PCSC_E_NEEDLOGI
2f5f0 4e 20 26 26 20 63 61 63 6b 65 79 5f 70 69 6e 5f N && cackey_pin_
2f600 63 6f 6d 6d 61 6e 64 20 21 3d 20 4e 55 4c 4c 29 command != NULL)
2f610 20 7b 0a 09 09 09 09 69 66 20 28 43 5f 4c 6f 67 {.....if (C_Log
2f620 69 6e 4d 75 74 65 78 41 72 67 28 68 53 65 73 73 inMutexArg(hSess
2f630 69 6f 6e 2c 20 43 4b 55 5f 55 53 45 52 2c 20 4e ion, CKU_USER, N
2f640 55 4c 4c 2c 20 30 2c 20 30 29 20 3d 3d 20 43 4b ULL, 0, 0) == CK
2f650 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 62 75 66 R_OK) {......buf
2f660 6c 65 6e 20 3d 20 63 61 63 6b 65 79 5f 73 69 67 len = cackey_sig
2f670 6e 64 65 63 72 79 70 74 28 26 63 61 63 6b 65 79 ndecrypt(&cackey
2f680 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 _slots[slotID],
2f690 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
2f6a0 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 hSession].decryp
2f6b0 74 5f 69 64 65 6e 74 69 74 79 2c 20 70 45 6e 63 t_identity, pEnc
2f6c0 72 79 70 74 65 64 50 61 72 74 2c 20 75 6c 45 6e ryptedPart, ulEn
2f6d0 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 cryptedPartLen,
2f6e0 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 buf, sizeof(buf)
2f6f0 2c 20 30 2c 20 31 29 3b 0a 09 09 09 09 7d 0a 09 , 0, 1);.....}..
2f700 09 09 7d 0a 0a 09 09 09 69 66 20 28 62 75 66 6c ..}.....if (bufl
2f710 65 6e 20 3c 20 30 29 20 7b 0a 09 09 09 09 2f 2a en < 0) {...../*
2f720 20 44 65 63 72 79 70 74 69 6f 6e 20 66 61 69 6c Decryption fail
2f730 65 64 2e 20 2a 2f 0a 09 09 09 09 69 66 20 28 62 ed. */.....if (b
2f740 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f uflen == CACKEY_
2f750 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e PCSC_E_NEEDLOGIN
2f760 29 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 ) {......retval
2f770 3d 20 43 4b 52 5f 55 53 45 52 5f 4e 4f 54 5f 4c = CKR_USER_NOT_L
2f780 4f 47 47 45 44 5f 49 4e 3b 0a 09 09 09 09 7d 20 OGGED_IN;.....}
2f790 65 6c 73 65 20 69 66 20 28 62 75 66 6c 65 6e 20 else if (buflen
2f7a0 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 == CACKEY_PCSC_E
2f7b0 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b 0a _TOKENABSENT) {.
2f7c0 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b .....retval = CK
2f7d0 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 R_DEVICE_REMOVED
2f7e0 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 ;.....} else {..
2f7f0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
2f800 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 _PRINTF("Failed
2f810 74 6f 20 73 65 6e 64 20 41 50 44 55 2c 20 65 72 to send APDU, er
2f820 72 6f 72 20 3d 20 25 6c 69 22 2c 20 28 6c 6f 6e ror = %li", (lon
2f830 67 20 69 6e 74 29 20 62 75 66 6c 65 6e 29 3b 0a g int) buflen);.
2f840 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 ......retval = C
2f850 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 KR_GENERAL_ERROR
2f860 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 ;.....}....} els
2f870 65 20 69 66 20 28 28 28 75 6e 73 69 67 6e 65 64 e if (((unsigned
2f880 20 6c 6f 6e 67 29 20 62 75 66 6c 65 6e 29 20 3e long) buflen) >
2f890 20 2a 70 75 6c 50 61 72 74 4c 65 6e 20 26 26 20 *pulPartLen &&
2f8a0 70 50 61 72 74 29 20 7b 0a 09 09 09 09 2f 2a 20 pPart) {...../*
2f8b0 44 65 63 72 79 70 74 65 64 20 64 61 74 61 20 74 Decrypted data t
2f8c0 6f 6f 20 6c 61 72 67 65 20 2a 2f 0a 09 09 09 09 oo large */.....
2f8d0 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 retval = CKR_BUF
2f8e0 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 FER_TOO_SMALL;..
2f8f0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 69 ..} else {.....i
2f900 66 20 28 70 50 61 72 74 29 20 7b 0a 09 09 09 09 f (pPart) {.....
2f910 09 6d 65 6d 63 70 79 28 70 50 61 72 74 2c 20 62 .memcpy(pPart, b
2f920 75 66 2c 20 62 75 66 6c 65 6e 29 3b 0a 09 09 09 uf, buflen);....
2f930 09 7d 0a 0a 09 09 09 09 2a 70 75 6c 50 61 72 74 .}......*pulPart
2f940 4c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 0a 09 Len = buflen;...
2f950 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f ...retval = CKR_
2f960 4f 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 OK;....}.....bre
2f970 61 6b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 ak;..}...mutex_r
2f980 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d etval = cackey_m
2f990 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b utex_unlock(cack
2f9a0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 ey_biglock);..if
2f9b0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 (mutex_retval !
2f9c0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f = 0) {...CACKEY_
2f9d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
2f9e0 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 ror. Unlocking
2f9f0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 failed.");....re
2fa00 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c turn(CKR_GENERAL
2fa10 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 _ERROR);..}...CA
2fa20 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
2fa30 46 28 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22 F("Returning %i"
2fa40 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b , (int) retval);
2fa50 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c ...return(retval
2fa60 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f );.}..CK_DEFINE_
2fa70 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 FUNCTION(CK_RV,
2fa80 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 29 28 C_DecryptFinal)(
2fa90 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c CK_SESSION_HANDL
2faa0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 E hSession, CK_B
2fab0 59 54 45 5f 50 54 52 20 70 4c 61 73 74 50 61 72 YTE_PTR pLastPar
2fac0 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 t, CK_ULONG_PTR
2fad0 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 29 20 pulLastPartLen)
2fae0 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 {..int mutex_ret
2faf0 76 61 6c 3b 0a 09 69 6e 74 20 74 65 72 6d 69 6e val;..int termin
2fb00 61 74 65 5f 64 65 63 72 79 70 74 20 3d 20 31 3b ate_decrypt = 1;
2fb10 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
2fb20 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
2fb30 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 );...if (!cackey
2fb40 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
2fb50 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
2fb60 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e RINTF("Error. N
2fb70 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 ot initialized."
2fb80 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
2fb90 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e _CRYPTOKI_NOT_IN
2fba0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
2fbb0 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d .if (hSession ==
2fbc0 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 0 || hSession >
2fbd0 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 = (sizeof(cackey
2fbe0 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a _sessions) / siz
2fbf0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 eof(cackey_sessi
2fc00 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 ons[0]))) {...CA
2fc10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
2fc20 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 F("Error. Sessi
2fc30 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e on out of range.
2fc40 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 ");......return(
2fc50 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 CKR_SESSION_HAND
2fc60 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a LE_INVALID);..}.
2fc70 0a 09 69 66 20 28 70 75 6c 4c 61 73 74 50 61 72 ..if (pulLastPar
2fc80 74 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a tLen == NULL) {.
2fc90 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
2fca0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 RINTF("Error. pu
2fcb0 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20 69 73 20 lLastPartLen is
2fcc0 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 NULL.");....retu
2fcd0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 rn(CKR_ARGUMENTS
2fce0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 _BAD);..}...mute
2fcf0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 x_retval = cacke
2fd00 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 y_mutex_lock(cac
2fd10 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 key_biglock);..i
2fd20 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 f (mutex_retval
2fd30 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 != 0) {...CACKEY
2fd40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
2fd50 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 rror. Locking f
2fd60 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 ailed.");....ret
2fd70 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f urn(CKR_GENERAL_
2fd80 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 ERROR);..}...if
2fd90 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e (!cackey_session
2fda0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 s[hSession].acti
2fdb0 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d ve) {...cackey_m
2fdc0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b utex_unlock(cack
2fdd0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 ey_biglock);....
2fde0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
2fdf0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 NTF("Error. Ses
2fe00 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e sion not active.
2fe10 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 ");......return(
2fe20 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 CKR_SESSION_HAND
2fe30 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a LE_INVALID);..}.
2fe40 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 ..if (!cackey_se
2fe50 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
2fe60 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 29 .decrypt_active)
2fe70 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 {...cackey_mute
2fe80 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
2fe90 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 biglock);....CAC
2fea0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
2feb0 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 ("Error. Decryp
2fec0 74 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b t not active.");
2fed0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 ......return(CKR
2fee0 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 _OPERATION_NOT_I
2fef0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
2ff00 0a 09 2a 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 ..*pulLastPartLe
2ff10 6e 20 3d 20 30 3b 0a 0a 09 69 66 20 28 70 4c 61 n = 0;...if (pLa
2ff20 73 74 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 stPart == NULL)
2ff30 7b 0a 09 09 74 65 72 6d 69 6e 61 74 65 5f 64 65 {...terminate_de
2ff40 63 72 79 70 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 crypt = 0;..}...
2ff50 69 66 20 28 74 65 72 6d 69 6e 61 74 65 5f 64 65 if (terminate_de
2ff60 63 72 79 70 74 29 20 7b 0a 09 09 63 61 63 6b 65 crypt) {...cacke
2ff70 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
2ff80 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 ion].decrypt_act
2ff90 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75 ive = 0;..}...mu
2ffa0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 tex_retval = cac
2ffb0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b key_mutex_unlock
2ffc0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 (cackey_biglock)
2ffd0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 ;..if (mutex_ret
2ffe0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 val != 0) {...CA
2fff0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
30000 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 F("Error. Unloc
30010 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a king failed.");.
30020 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 ...return(CKR_GE
30030 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d NERAL_ERROR);..}
30040 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
30050 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e PRINTF("Returnin
30060 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 g CKR_OK (%i)",
30070 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 CKR_OK);...retur
30080 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b n(CKR_OK);.}..CK
30090 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e _DEFINE_FUNCTION
300a0 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 (CK_RV, C_Digest
300b0 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e Init)(CK_SESSION
300c0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e _HANDLE hSession
300d0 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 , CK_MECHANISM_P
300e0 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 29 20 7b TR pMechanism) {
300f0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
30100 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
30110 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f ;...if (!cackey_
30120 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 initialized) {..
30130 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
30140 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f INTF("Error. No
30150 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 t initialized.")
30160 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
30170 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 CRYPTOKI_NOT_INI
30180 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 TIALIZED);..}...
30190 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
301a0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 NTF("Returning C
301b0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
301c0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c SUPPORTED (%i)",
301d0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f CKR_FUNCTION_NO
301e0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 T_SUPPORTED);...
301f0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 return(CKR_FUNCT
30200 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
30210 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 D);.}..CK_DEFINE
30220 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c _FUNCTION(CK_RV,
30230 20 43 5f 44 69 67 65 73 74 29 28 43 4b 5f 53 45 C_Digest)(CK_SE
30240 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 SSION_HANDLE hSe
30250 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 ssion, CK_BYTE_P
30260 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f TR pData, CK_ULO
30270 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b NG ulDataLen, CK
30280 5f 42 59 54 45 5f 50 54 52 20 70 44 69 67 65 73 _BYTE_PTR pDiges
30290 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 t, CK_ULONG_PTR
302a0 70 75 6c 44 69 67 65 73 74 4c 65 6e 29 20 7b 0a pulDigestLen) {.
302b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
302c0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
302d0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 ...if (!cackey_i
302e0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 nitialized) {...
302f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
30300 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 NTF("Error. Not
30310 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b initialized.");
30320 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 ....return(CKR_C
30330 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 RYPTOKI_NOT_INIT
30340 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 IALIZED);..}...C
30350 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
30360 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b TF("Returning CK
30370 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
30380 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 UPPORTED (%i)",
30390 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
303a0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 _SUPPORTED);...r
303b0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 eturn(CKR_FUNCTI
303c0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
303d0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f );.}..CK_DEFINE_
303e0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 FUNCTION(CK_RV,
303f0 43 5f 44 69 67 65 73 74 55 70 64 61 74 65 29 28 C_DigestUpdate)(
30400 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c CK_SESSION_HANDL
30410 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 E hSession, CK_B
30420 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 YTE_PTR pPart, C
30430 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 K_ULONG ulPartLe
30440 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 n) {..CACKEY_DEB
30450 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
30460 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 d.");...if (!cac
30470 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 key_initialized)
30480 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
30490 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
304a0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 Not initialize
304b0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
304c0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 CKR_CRYPTOKI_NOT
304d0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 _INITIALIZED);..
304e0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 }...CACKEY_DEBUG
304f0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
30500 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f ng CKR_FUNCTION_
30510 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 NOT_SUPPORTED (%
30520 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f i)", CKR_FUNCTIO
30530 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 N_NOT_SUPPORTED)
30540 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 ;...return(CKR_F
30550 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
30560 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 ORTED);.}..CK_DE
30570 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b FINE_FUNCTION(CK
30580 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 4b 65 79 _RV, C_DigestKey
30590 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e )(CK_SESSION_HAN
305a0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b DLE hSession, CK
305b0 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 _OBJECT_HANDLE h
305c0 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 Key) {..CACKEY_D
305d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
305e0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 led.");...if (!c
305f0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 ackey_initialize
30600 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 d) {...CACKEY_DE
30610 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
30620 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 r. Not initiali
30630 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 zed.");....retur
30640 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e n(CKR_CRYPTOKI_N
30650 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b OT_INITIALIZED);
30660 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 ..}...CACKEY_DEB
30670 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
30680 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f ning CKR_FUNCTIO
30690 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 N_NOT_SUPPORTED
306a0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 (%i)", CKR_FUNCT
306b0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
306c0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 D);...return(CKR
306d0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
306e0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f PPORTED);.}..CK_
306f0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 DEFINE_FUNCTION(
30700 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 46 CK_RV, C_DigestF
30710 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e inal)(CK_SESSION
30720 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e _HANDLE hSession
30730 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 , CK_BYTE_PTR pD
30740 69 67 65 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f igest, CK_ULONG_
30750 50 54 52 20 70 75 6c 44 69 67 65 73 74 4c 65 6e PTR pulDigestLen
30760 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 ) {..CACKEY_DEBU
30770 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 G_PRINTF("Called
30780 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b .");...if (!cack
30790 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 ey_initialized)
307a0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
307b0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
307c0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 Not initialized
307d0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
307e0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f KR_CRYPTOKI_NOT_
307f0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d INITIALIZED);..}
30800 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
30810 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e PRINTF("Returnin
30820 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e g CKR_FUNCTION_N
30830 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 OT_SUPPORTED (%i
30840 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e )", CKR_FUNCTION
30850 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
30860 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 ...return(CKR_FU
30870 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
30880 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 RTED);.}..CK_DEF
30890 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f INE_FUNCTION(CK_
308a0 52 56 2c 20 43 5f 53 69 67 6e 49 6e 69 74 29 28 RV, C_SignInit)(
308b0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c CK_SESSION_HANDL
308c0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d E hSession, CK_M
308d0 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 ECHANISM_PTR pMe
308e0 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 chanism, CK_OBJE
308f0 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 CT_HANDLE hKey)
30900 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 {..int mutex_ret
30910 76 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a val;...hKey--;..
30920 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
30930 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
30940 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 ...if (!cackey_i
30950 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 nitialized) {...
30960 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
30970 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 NTF("Error. Not
30980 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b initialized.");
30990 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 ....return(CKR_C
309a0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 RYPTOKI_NOT_INIT
309b0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 IALIZED);..}...i
309c0 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 20 3d 3d f (pMechanism ==
309d0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 NULL) {...CACKE
309e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
309f0 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 Error. pMechanis
30a00 6d 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 m is NULL.");...
30a10 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 .return(CKR_ARGU
30a20 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a MENTS_BAD);..}..
30a30 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 2d .if (pMechanism-
30a40 3e 6d 65 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b >mechanism != CK
30a50 4d 5f 52 53 41 5f 50 4b 43 53 29 20 7b 0a 09 09 M_RSA_PKCS) {...
30a60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
30a70 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 NTF("Error. pMec
30a80 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 hanism->mechanis
30a90 6d 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20 m not specified
30aa0 61 73 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 22 as CKM_RSA_PKCS"
30ab0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
30ac0 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 41 52 41 4d _MECHANISM_PARAM
30ad0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 _INVALID);..}...
30ae0 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 if (hSession ==
30af0 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 0 || hSession >=
30b00 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f (sizeof(cackey_
30b10 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 sessions) / size
30b20 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f of(cackey_sessio
30b30 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 ns[0]))) {...CAC
30b40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
30b50 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f ("Error. Sessio
30b60 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 n out of range."
30b70 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 );......return(C
30b80 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c KR_SESSION_HANDL
30b90 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a E_INVALID);..}..
30ba0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 .mutex_retval =
30bb0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 cackey_mutex_loc
30bc0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
30bd0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 );..if (mutex_re
30be0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 tval != 0) {...C
30bf0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
30c00 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b TF("Error. Lock
30c10 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a ing failed.");..
30c20 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e ..return(CKR_GEN
30c30 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a ERAL_ERROR);..}.
30c40 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 ..if (!cackey_se
30c50 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
30c60 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 .active) {...cac
30c70 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b key_mutex_unlock
30c80 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 (cackey_biglock)
30c90 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 ;....CACKEY_DEBU
30ca0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
30cb0 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 Session not ac
30cc0 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 tive.");......re
30cd0 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e turn(CKR_SESSION
30ce0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 _HANDLE_INVALID)
30cf0 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 ;..}...if (cacke
30d00 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
30d10 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 ion].sign_active
30d20 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 ) {...cackey_mut
30d30 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 ex_unlock(cackey
30d40 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 _biglock);....CA
30d50 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
30d60 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 F("Error. Sign
30d70 61 6c 72 65 61 64 79 20 69 6e 20 70 72 6f 67 72 already in progr
30d80 65 73 73 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 ess.");......ret
30d90 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f urn(CKR_OPERATIO
30da0 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 N_ACTIVE);..}...
30db0 69 66 20 28 68 4b 65 79 20 3e 3d 20 63 61 63 6b if (hKey >= cack
30dc0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
30dd0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 sion].identities
30de0 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 63 61 63 6b _count) {...cack
30df0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 ey_mutex_unlock(
30e00 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
30e10 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
30e20 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
30e30 20 4b 65 79 20 68 61 6e 64 6c 65 20 6f 75 74 20 Key handle out
30e40 6f 66 20 72 61 6e 67 65 20 28 72 65 71 75 65 73 of range (reques
30e50 74 65 64 20 6b 65 79 20 25 6c 75 2c 20 6f 6e 6c ted key %lu, onl
30e60 79 20 25 6c 75 20 69 64 65 6e 74 69 74 69 65 73 y %lu identities
30e70 20 61 76 61 69 6c 61 62 6c 65 29 2e 22 2c 20 28 available).", (
30e80 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 unsigned long) h
30e90 4b 65 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c Key, (unsigned l
30ea0 6f 6e 67 29 20 63 61 63 6b 65 79 5f 73 65 73 73 ong) cackey_sess
30eb0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 ions[hSession].i
30ec0 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 dentities_count)
30ed0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
30ee0 4b 45 59 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c KEY_HANDLE_INVAL
30ef0 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 ID);..}...cackey
30f00 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
30f10 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 on].sign_active
30f20 3d 20 31 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 = 1;...cackey_se
30f30 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
30f40 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 20 .sign_mechanism
30f50 3d 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 = pMechanism->me
30f60 63 68 61 6e 69 73 6d 3b 0a 0a 09 63 61 63 6b 65 chanism;...cacke
30f70 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
30f80 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e ion].sign_buflen
30f90 20 3d 20 31 32 38 3b 0a 09 63 61 63 6b 65 79 5f = 128;..cackey_
30fa0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
30fb0 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 n].sign_bufused
30fc0 3d 20 30 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 = 0;..cackey_ses
30fd0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
30fe0 73 69 67 6e 5f 62 75 66 20 3d 20 6d 61 6c 6c 6f sign_buf = mallo
30ff0 63 28 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 c(sizeof(*cackey
31000 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
31010 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20 2a 20 on].sign_buf) *
31020 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
31030 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 hSession].sign_b
31040 75 66 6c 65 6e 29 3b 0a 0a 09 43 41 43 4b 45 59 uflen);...CACKEY
31050 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 _DEBUG_PRINTF("S
31060 65 73 73 69 6f 6e 20 25 6c 75 20 73 69 67 6e 5f ession %lu sign_
31070 69 64 65 6e 74 69 74 79 20 69 73 20 25 70 20 28 identity is %p (
31080 69 64 65 6e 74 69 74 79 20 23 25 6c 75 29 22 2c identity #%lu)",
31090 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
310a0 20 68 53 65 73 73 69 6f 6e 2c 20 28 76 6f 69 64 hSession, (void
310b0 20 2a 29 20 26 63 61 63 6b 65 79 5f 73 65 73 73 *) &cackey_sess
310c0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 ions[hSession].i
310d0 64 65 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d 2c dentities[hKey],
310e0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
310f0 20 68 4b 65 79 29 3b 0a 09 63 61 63 6b 65 79 5f hKey);..cackey_
31100 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
31110 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 n].sign_identity
31120 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 = &cackey_sessi
31130 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 ons[hSession].id
31140 65 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d 3b 0a entities[hKey];.
31150 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d ..mutex_retval =
31160 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e cackey_mutex_un
31170 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
31180 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 ock);..if (mutex
31190 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a _retval != 0) {.
311a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
311b0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 RINTF("Error. U
311c0 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e nlocking failed.
311d0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
311e0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 R_GENERAL_ERROR)
311f0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ;..}...CACKEY_DE
31200 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
31210 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 rning CKR_OK (%i
31220 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 )", CKR_OK);...r
31230 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d eturn(CKR_OK);.}
31240 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 ..CK_DEFINE_FUNC
31250 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 TION(CK_RV, C_Si
31260 67 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 gn)(CK_SESSION_H
31270 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 ANDLE hSession,
31280 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 CK_BYTE_PTR pDat
31290 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 a, CK_ULONG ulDa
312a0 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 taLen, CK_BYTE_P
312b0 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 TR pSignature, C
312c0 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 K_ULONG_PTR pulS
312d0 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 ignatureLen) {..
312e0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 74 unsigned long st
312f0 61 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 art_sign_bufused
31300 3b 0a 09 43 4b 5f 52 56 20 73 69 67 6e 5f 72 65 ;..CK_RV sign_re
31310 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 t;..int mutex_re
31320 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 tval;...CACKEY_D
31330 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
31340 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 led.");...if (!c
31350 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 ackey_initialize
31360 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 d) {...CACKEY_DE
31370 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
31380 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 r. Not initiali
31390 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 zed.");....retur
313a0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e n(CKR_CRYPTOKI_N
313b0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b OT_INITIALIZED);
313c0 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 ..}...if (hSessi
313d0 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 on == 0 || hSess
313e0 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 ion >= (sizeof(c
313f0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 ackey_sessions)
31400 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f / sizeof(cackey_
31410 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b sessions[0]))) {
31420 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
31430 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
31440 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 Session out of r
31450 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 ange.");......re
31460 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e turn(CKR_SESSION
31470 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 _HANDLE_INVALID)
31480 3b 0a 09 7d 0a 0a 09 73 74 61 72 74 5f 73 69 67 ;..}...start_sig
31490 6e 5f 62 75 66 75 73 65 64 20 3d 20 63 61 63 6b n_bufused = cack
314a0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
314b0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 sion].sign_bufus
314c0 65 64 3b 0a 0a 09 73 69 67 6e 5f 72 65 74 20 3d ed;...sign_ret =
314d0 20 43 5f 53 69 67 6e 55 70 64 61 74 65 28 68 53 C_SignUpdate(hS
314e0 65 73 73 69 6f 6e 2c 20 70 44 61 74 61 2c 20 75 ession, pData, u
314f0 6c 44 61 74 61 4c 65 6e 29 3b 0a 09 69 66 20 28 lDataLen);..if (
31500 73 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f sign_ret != CKR_
31510 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 OK) {...CACKEY_D
31520 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
31530 6f 72 2e 20 20 53 69 67 6e 55 70 64 61 74 65 28 or. SignUpdate(
31540 29 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75 ) returned failu
31550 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c re (rv = %lu).",
31560 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
31570 20 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 69 sign_ret);....i
31580 66 20 28 73 69 67 6e 5f 72 65 74 20 21 3d 20 43 f (sign_ret != C
31590 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d KR_BUFFER_TOO_SM
315a0 41 4c 4c 29 20 7b 0a 09 09 09 6d 75 74 65 78 5f ALL) {....mutex_
315b0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f retval = cackey_
315c0 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 mutex_lock(cacke
315d0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 y_biglock);....i
315e0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 f (mutex_retval
315f0 21 3d 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b != 0) {.....CACK
31600 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
31610 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 "Error. Locking
31620 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 failed.");.....
31630 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 .return(CKR_GENE
31640 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d RAL_ERROR);....}
31650 0a 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 .....if (!cackey
31660 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
31670 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 on].active) {...
31680 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 ..cackey_mutex_u
31690 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 nlock(cackey_big
316a0 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b lock);......CACK
316b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
316c0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e "Error. Session
316d0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a not active.");.
316e0 09 09 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b .......return(CK
316f0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 R_SESSION_HANDLE
31700 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 09 09 7d 0a _INVALID);....}.
31710 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f ....if (!cackey_
31720 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
31730 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20 n].sign_active)
31740 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 {.....cackey_mut
31750 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 ex_unlock(cackey
31760 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 _biglock);......
31770 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
31780 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 NTF("Error. Sig
31790 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b n not active.");
317a0 0a 09 09 0a 09 09 09 09 72 65 74 75 72 6e 28 43 ........return(C
317b0 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 KR_OPERATION_NOT
317c0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 _INITIALIZED);..
317d0 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 ..}.....cackey_s
317e0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
317f0 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 ].sign_active =
31800 30 3b 0a 0a 09 09 09 6d 75 74 65 78 5f 72 65 74 0;.....mutex_ret
31810 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 val = cackey_mut
31820 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 ex_unlock(cackey
31830 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 _biglock);....if
31840 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 (mutex_retval !
31850 3d 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 = 0) {.....CACKE
31860 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
31870 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e Error. Unlockin
31880 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 g failed.");....
31890 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e ..return(CKR_GEN
318a0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 ERAL_ERROR);....
318b0 7d 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 }...}....return(
318c0 73 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 sign_ret);..}...
318d0 73 69 67 6e 5f 72 65 74 20 3d 20 43 5f 53 69 67 sign_ret = C_Sig
318e0 6e 46 69 6e 61 6c 28 68 53 65 73 73 69 6f 6e 2c nFinal(hSession,
318f0 20 70 53 69 67 6e 61 74 75 72 65 2c 20 70 75 6c pSignature, pul
31900 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 3b 0a 09 SignatureLen);..
31910 69 66 20 28 73 69 67 6e 5f 72 65 74 20 21 3d 20 if (sign_ret !=
31920 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28 CKR_OK) {...if (
31930 73 69 67 6e 5f 72 65 74 20 3d 3d 20 43 4b 52 5f sign_ret == CKR_
31940 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c BUFFER_TOO_SMALL
31950 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 ) {....CACKEY_DE
31960 42 55 47 5f 50 52 49 4e 54 46 28 22 53 69 67 6e BUG_PRINTF("Sign
31970 46 69 6e 61 6c 28 29 20 72 65 74 75 72 6e 65 64 Final() returned
31980 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f CKR_BUFFER_TOO_
31990 53 4d 41 4c 4c 20 28 72 76 20 3d 20 25 6c 75 29 SMALL (rv = %lu)
319a0 2c 20 75 6e 64 6f 69 6e 67 20 43 5f 53 69 67 6e , undoing C_Sign
319b0 55 70 64 61 74 65 28 29 22 2c 20 28 75 6e 73 69 Update()", (unsi
319c0 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f gned long) sign_
319d0 72 65 74 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 ret);.....cackey
319e0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
319f0 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 on].sign_bufused
31a00 20 3d 20 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 = start_sign_bu
31a10 66 75 73 65 64 3b 0a 0a 09 09 09 72 65 74 75 72 fused;.....retur
31a20 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 09 7d n(sign_ret);...}
31a30 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
31a40 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
31a50 20 53 69 67 6e 46 69 6e 61 6c 28 29 20 72 65 74 SignFinal() ret
31a60 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72 urned failure (r
31a70 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 v = %lu).", (uns
31a80 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e igned long) sign
31a90 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e _ret);....return
31aa0 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a (sign_ret);..}..
31ab0 09 69 66 20 28 70 53 69 67 6e 61 74 75 72 65 20 .if (pSignature
31ac0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 == NULL) {...CAC
31ad0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
31ae0 28 22 70 53 69 67 6e 61 74 75 72 65 20 73 70 65 ("pSignature spe
31af0 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 cified as NULL,
31b00 75 6e 64 6f 69 6e 67 20 43 5f 53 69 67 6e 55 70 undoing C_SignUp
31b10 64 61 74 65 28 29 22 29 3b 0a 0a 09 09 63 61 63 date()");....cac
31b20 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
31b30 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 ssion].sign_bufu
31b40 73 65 64 20 3d 20 73 74 61 72 74 5f 73 69 67 6e sed = start_sign
31b50 5f 62 75 66 75 73 65 64 3b 0a 0a 09 09 72 65 74 _bufused;....ret
31b60 75 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 urn(sign_ret);..
31b70 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 }...CACKEY_DEBUG
31b80 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
31b90 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c ng CKR_OK (%i)",
31ba0 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 CKR_OK);...retu
31bb0 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 rn(CKR_OK);.}..C
31bc0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f K_DEFINE_FUNCTIO
31bd0 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 55 N(CK_RV, C_SignU
31be0 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f pdate)(CK_SESSIO
31bf0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f N_HANDLE hSessio
31c00 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 n, CK_BYTE_PTR p
31c10 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 Part, CK_ULONG u
31c20 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 69 6e 74 lPartLen) {..int
31c30 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 mutex_retval;..
31c40 69 6e 74 20 72 65 73 69 7a 65 52 65 74 72 79 3b int resizeRetry;
31c50 0a 09 69 6e 74 20 6e 65 65 64 52 65 73 69 7a 65 ..int needResize
31c60 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ;...CACKEY_DEBUG
31c70 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
31c80 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ");...if (!cacke
31c90 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b y_initialized) {
31ca0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
31cb0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
31cc0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e Not initialized.
31cd0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
31ce0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 R_CRYPTOKI_NOT_I
31cf0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
31d00 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d ..if (hSession =
31d10 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 = 0 || hSession
31d20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 >= (sizeof(cacke
31d30 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 y_sessions) / si
31d40 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 zeof(cackey_sess
31d50 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 ions[0]))) {...C
31d60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
31d70 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 TF("Error. Sess
31d80 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 ion out of range
31d90 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e .");......return
31da0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e (CKR_SESSION_HAN
31db0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d DLE_INVALID);..}
31dc0 0a 0a 09 69 66 20 28 70 50 61 72 74 20 3d 3d 20 ...if (pPart ==
31dd0 4e 55 4c 4c 20 26 26 20 75 6c 50 61 72 74 4c 65 NULL && ulPartLe
31de0 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 n == 0) {.../* S
31df0 68 6f 72 74 20 63 69 72 63 75 69 74 20 69 66 20 hort circuit if
31e00 77 65 20 61 72 65 20 61 73 6b 65 64 20 74 6f 20 we are asked to
31e10 73 69 67 6e 20 6e 6f 74 68 69 6e 67 2e 2e 2e 20 sign nothing...
31e20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 */...CACKEY_DEBU
31e30 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
31e40 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 ing CKR_OK (%i)
31e50 28 73 68 6f 72 74 20 63 69 72 63 75 69 74 29 22 (short circuit)"
31e60 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 , CKR_OK);....re
31e70 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d turn(CKR_OK);..}
31e80 0a 0a 09 69 66 20 28 70 50 61 72 74 20 3d 3d 20 ...if (pPart ==
31e90 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 NULL) {...CACKEY
31ea0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
31eb0 72 72 6f 72 2e 20 70 50 61 72 74 20 69 73 20 4e rror. pPart is N
31ec0 55 4c 4c 2c 20 62 75 74 20 75 6c 50 61 72 74 4c ULL, but ulPartL
31ed0 65 6e 20 69 73 20 6e 6f 74 20 30 2e 22 29 3b 0a en is not 0.");.
31ee0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 ...return(CKR_AR
31ef0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d GUMENTS_BAD);..}
31f00 0a 0a 09 69 66 20 28 75 6c 50 61 72 74 4c 65 6e ...if (ulPartLen
31f10 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 == 0) {...CACKE
31f20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
31f30 45 72 72 6f 72 2e 20 75 6c 50 61 72 74 4c 65 6e Error. ulPartLen
31f40 20 69 73 20 30 2c 20 62 75 74 20 70 50 61 72 74 is 0, but pPart
31f50 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b is not NULL.");
31f60 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 ....return(CKR_A
31f70 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 RGUMENTS_BAD);..
31f80 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c }...mutex_retval
31f90 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f = cackey_mutex_
31fa0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
31fb0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 ock);..if (mutex
31fc0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a _retval != 0) {.
31fd0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
31fe0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c RINTF("Error. L
31ff0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 ocking failed.")
32000 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
32010 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a GENERAL_ERROR);.
32020 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 .}...if (!cackey
32030 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
32040 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 on].active) {...
32050 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c cackey_mutex_unl
32060 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
32070 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 ck);....CACKEY_D
32080 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
32090 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 or. Session not
320a0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 active.");.....
320b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 .return(CKR_SESS
320c0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c ION_HANDLE_INVAL
320d0 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 ID);..}...if (!c
320e0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
320f0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 Session].sign_ac
32100 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 tive) {...cackey
32110 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 _mutex_unlock(ca
32120 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a ckey_biglock);..
32130 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
32140 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 RINTF("Error. S
32150 69 67 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 ign not active."
32160 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 );......return(C
32170 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 KR_OPERATION_NOT
32180 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 _INITIALIZED);..
32190 7d 0a 0a 09 73 77 69 74 63 68 20 28 63 61 63 6b }...switch (cack
321a0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
321b0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 sion].sign_mecha
321c0 6e 69 73 6d 29 20 7b 0a 09 09 63 61 73 65 20 43 nism) {...case C
321d0 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 KM_RSA_PKCS:....
321e0 2f 2a 20 41 63 63 75 6d 75 6c 61 74 65 20 64 69 /* Accumulate di
321f0 72 65 63 74 6c 79 20 2a 2f 0a 09 09 09 66 6f 72 rectly */....for
32200 20 28 72 65 73 69 7a 65 52 65 74 72 79 20 3d 20 (resizeRetry =
32210 30 3b 20 72 65 73 69 7a 65 52 65 74 72 79 20 3c 0; resizeRetry <
32220 20 31 31 3b 20 72 65 73 69 7a 65 52 65 74 72 79 11; resizeRetry
32230 2b 2b 29 20 7b 0a 09 09 09 09 6e 65 65 64 52 65 ++) {.....needRe
32240 73 69 7a 65 20 3d 20 30 3b 0a 09 09 09 09 69 66 size = 0;.....if
32250 20 28 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f ((cackey_sessio
32260 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 ns[hSession].sig
32270 6e 5f 62 75 66 75 73 65 64 20 2b 20 75 6c 50 61 n_bufused + ulPa
32280 72 74 4c 65 6e 29 20 3e 20 63 61 63 6b 65 79 5f rtLen) > cackey_
32290 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
322a0 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29 20 n].sign_buflen)
322b0 7b 0a 09 09 09 09 09 6e 65 65 64 52 65 73 69 7a {......needResiz
322c0 65 20 3d 20 31 3b 0a 09 09 09 09 7d 0a 0a 09 09 e = 1;.....}....
322d0 09 09 69 66 20 28 21 6e 65 65 64 52 65 73 69 7a ..if (!needResiz
322e0 65 29 20 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b e) {......break;
322f0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b .....}......CACK
32300 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
32310 22 52 65 73 69 7a 69 6e 67 20 73 69 67 6e 69 6e "Resizing signin
32320 67 20 62 75 66 66 65 72 20 28 74 72 79 20 23 25 g buffer (try #%
32330 69 20 6f 66 20 31 30 20 2d 2d 20 31 31 74 68 20 i of 10 -- 11th
32340 69 73 20 66 61 74 61 6c 29 22 2c 20 72 65 73 69 is fatal)", resi
32350 7a 65 52 65 74 72 79 29 3b 0a 0a 09 09 09 09 69 zeRetry);......i
32360 66 20 28 72 65 73 69 7a 65 52 65 74 72 79 20 3d f (resizeRetry =
32370 3d 20 31 30 29 20 7b 0a 09 09 09 09 09 66 72 65 = 10) {......fre
32380 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e e(cackey_session
32390 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e s[hSession].sign
323a0 5f 62 75 66 29 3b 0a 0a 09 09 09 09 09 63 61 63 _buf);.......cac
323b0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
323c0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c ssion].sign_bufl
323d0 65 6e 20 3d 20 30 3b 0a 09 09 09 09 09 63 61 63 en = 0;......cac
323e0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
323f0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 ssion].sign_buf
32400 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09 62 72 = NULL;.......br
32410 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 eak;.....}......
32420 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
32430 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 hSession].sign_b
32440 75 66 6c 65 6e 20 2a 3d 20 32 3b 0a 0a 09 09 09 uflen *= 2;.....
32450 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 .cackey_sessions
32460 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f [hSession].sign_
32470 62 75 66 20 3d 20 72 65 61 6c 6c 6f 63 28 63 61 buf = realloc(ca
32480 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
32490 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 ession].sign_buf
324a0 2c 20 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 , sizeof(*cackey
324b0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
324c0 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20 2a 20 on].sign_buf) *
324d0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
324e0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 hSession].sign_b
324f0 75 66 6c 65 6e 29 3b 0a 09 09 09 7d 0a 0a 09 09 uflen);....}....
32500 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 .if (cackey_sess
32510 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 ions[hSession].s
32520 69 67 6e 5f 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 ign_buf == NULL)
32530 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 {.....cackey_mu
32540 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 tex_unlock(cacke
32550 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 y_biglock);.....
32560 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
32570 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 INTF("Error. Si
32580 67 6e 69 6e 67 20 62 75 66 66 65 72 20 69 73 20 gning buffer is
32590 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 09 09 72 65 NULL.");......re
325a0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c turn(CKR_GENERAL
325b0 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 0a 09 _ERROR);....}...
325c0 09 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f ..memcpy(cackey_
325d0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
325e0 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 2b 20 63 61 n].sign_buf + ca
325f0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
32600 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 ession].sign_buf
32610 75 73 65 64 2c 20 70 50 61 72 74 2c 20 75 6c 50 used, pPart, ulP
32620 61 72 74 4c 65 6e 29 3b 0a 0a 09 09 09 63 61 63 artLen);.....cac
32630 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
32640 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 ssion].sign_bufu
32650 73 65 64 20 2b 3d 20 75 6c 50 61 72 74 4c 65 6e sed += ulPartLen
32660 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a ;.....break;..}.
32670 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d ..mutex_retval =
32680 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e cackey_mutex_un
32690 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
326a0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 ock);..if (mutex
326b0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a _retval != 0) {.
326c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
326d0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 RINTF("Error. U
326e0 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e nlocking failed.
326f0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
32700 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 R_GENERAL_ERROR)
32710 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ;..}...CACKEY_DE
32720 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
32730 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 rning CKR_OK (%i
32740 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 )", CKR_OK);...r
32750 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d eturn(CKR_OK);.}
32760 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 ..CK_DEFINE_FUNC
32770 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 TION(CK_RV, C_Si
32780 67 6e 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 gnFinal)(CK_SESS
32790 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 ION_HANDLE hSess
327a0 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 ion, CK_BYTE_PTR
327b0 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f pSignature, CK_
327c0 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 67 ULONG_PTR pulSig
327d0 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 73 74 natureLen) {..st
327e0 61 74 69 63 20 43 4b 5f 42 59 54 45 20 73 69 67 atic CK_BYTE sig
327f0 62 75 66 5b 31 30 32 34 5d 3b 0a 09 73 73 69 7a buf[1024];..ssiz
32800 65 5f 74 20 73 69 67 62 75 66 6c 65 6e 3b 0a 09 e_t sigbuflen;..
32810 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 CK_SLOT_ID slotI
32820 44 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c D;..CK_RV retval
32830 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 = CKR_GENERAL_E
32840 52 52 4f 52 3b 0a 09 69 6e 74 20 74 65 72 6d 69 RROR;..int termi
32850 6e 61 74 65 5f 73 69 67 6e 20 3d 20 31 3b 0a 09 nate_sign = 1;..
32860 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c int mutex_retval
32870 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ;...CACKEY_DEBUG
32880 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
32890 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ");...if (!cacke
328a0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b y_initialized) {
328b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
328c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
328d0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e Not initialized.
328e0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
328f0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 R_CRYPTOKI_NOT_I
32900 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
32910 0a 09 69 66 20 28 70 75 6c 53 69 67 6e 61 74 75 ..if (pulSignatu
32920 72 65 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b reLen == NULL) {
32930 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
32940 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 PRINTF("Error. p
32950 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 69 ulSignatureLen i
32960 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 s NULL.");....re
32970 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e turn(CKR_ARGUMEN
32980 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 TS_BAD);..}...if
32990 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 (hSession == 0
329a0 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 || hSession >= (
329b0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 sizeof(cackey_se
329c0 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 ssions) / sizeof
329d0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 (cackey_sessions
329e0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 [0]))) {...CACKE
329f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
32a00 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 Error. Session
32a10 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b out of range.");
32a20 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 ......return(CKR
32a30 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f _SESSION_HANDLE_
32a40 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d INVALID);..}...m
32a50 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 utex_retval = ca
32a60 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 ckey_mutex_lock(
32a70 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
32a80 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 ..if (mutex_retv
32a90 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 al != 0) {...CAC
32aa0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
32ab0 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e ("Error. Lockin
32ac0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 g failed.");....
32ad0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 return(CKR_GENER
32ae0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 AL_ERROR);..}...
32af0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 if (!cackey_sess
32b00 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 ions[hSession].a
32b10 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 ctive) {...cacke
32b20 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
32b30 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
32b40 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
32b50 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
32b60 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 Session not acti
32b70 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 ve.");......retu
32b80 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 rn(CKR_SESSION_H
32b90 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a ANDLE_INVALID);.
32ba0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 .}...if (!cackey
32bb0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
32bc0 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 on].sign_active)
32bd0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 {...cackey_mute
32be0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
32bf0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 biglock);....CAC
32c00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
32c10 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e ("Error. Sign n
32c20 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 ot active.");...
32c30 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 ...return(CKR_OP
32c40 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 ERATION_NOT_INIT
32c50 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 IALIZED);..}...s
32c60 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 lotID = cackey_s
32c70 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
32c80 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 ].slotID;...if (
32c90 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c slotID < 0 || sl
32ca0 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 otID >= (sizeof(
32cb0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 cackey_slots) /
32cc0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c sizeof(cackey_sl
32cd0 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 ots[0]))) {...CA
32ce0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
32cf0 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 F("Error. Invali
32d00 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 d slot requested
32d10 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 (%lu), outside
32d20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c of valid range",
32d30 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 slotID);....ret
32d40 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f urn(CKR_GENERAL_
32d50 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 ERROR);..}...if
32d60 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c (cackey_slots[sl
32d70 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 otID].active ==
32d80 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 0) {...CACKEY_DE
32d90 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
32da0 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 r. Invalid slot
32db0 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c requested (%lu),
32dc0 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e slot not curren
32dd0 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f tly active", slo
32de0 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f tID);....cackey_
32df0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 mutex_unlock(cac
32e00 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 key_biglock);...
32e10 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 .return(CKR_GENE
32e20 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a RAL_ERROR);..}..
32e30 09 73 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f .switch (cackey_
32e40 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
32e50 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 n].sign_mechanis
32e60 6d 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f m) {...case CKM_
32e70 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 RSA_PKCS:..../*
32e80 41 73 6b 20 63 61 72 64 20 74 6f 20 73 69 67 6e Ask card to sign
32e90 20 2a 2f 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 */....CACKEY_DE
32ea0 42 55 47 5f 50 52 49 4e 54 46 28 22 41 73 6b 69 BUG_PRINTF("Aski
32eb0 6e 67 20 74 6f 20 73 69 67 6e 20 66 72 6f 6d 20 ng to sign from
32ec0 69 64 65 6e 74 69 74 79 20 25 70 20 69 6e 20 73 identity %p in s
32ed0 65 73 73 69 6f 6e 20 25 6c 75 22 2c 20 28 76 6f ession %lu", (vo
32ee0 69 64 20 2a 29 20 63 61 63 6b 65 79 5f 73 65 73 id *) cackey_ses
32ef0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
32f00 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 2c 20 28 sign_identity, (
32f10 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 unsigned long) h
32f20 53 65 73 73 69 6f 6e 29 3b 0a 09 09 09 73 69 67 Session);....sig
32f30 62 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65 79 5f buflen = cackey_
32f40 73 69 67 6e 64 65 63 72 79 70 74 28 26 63 61 63 signdecrypt(&cac
32f50 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 key_slots[slotID
32f60 5d 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f ], cackey_sessio
32f70 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 ns[hSession].sig
32f80 6e 5f 69 64 65 6e 74 69 74 79 2c 20 63 61 63 6b n_identity, cack
32f90 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
32fa0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 sion].sign_buf,
32fb0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
32fc0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 hSession].sign_b
32fd0 75 66 75 73 65 64 2c 20 73 69 67 62 75 66 2c 20 ufused, sigbuf,
32fe0 73 69 7a 65 6f 66 28 73 69 67 62 75 66 29 2c 20 sizeof(sigbuf),
32ff0 31 2c 20 30 29 3b 0a 0a 09 09 09 69 66 20 28 73 1, 0);.....if (s
33000 69 67 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b igbuflen == CACK
33010 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f EY_PCSC_E_NEEDLO
33020 47 49 4e 20 26 26 20 63 61 63 6b 65 79 5f 70 69 GIN && cackey_pi
33030 6e 5f 63 6f 6d 6d 61 6e 64 20 21 3d 20 4e 55 4c n_command != NUL
33040 4c 29 20 7b 0a 09 09 09 09 69 66 20 28 43 5f 4c L) {.....if (C_L
33050 6f 67 69 6e 4d 75 74 65 78 41 72 67 28 68 53 65 oginMutexArg(hSe
33060 73 73 69 6f 6e 2c 20 43 4b 55 5f 55 53 45 52 2c ssion, CKU_USER,
33070 20 4e 55 4c 4c 2c 20 30 2c 20 30 29 20 3d 3d 20 NULL, 0, 0) ==
33080 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 73 CKR_OK) {......s
33090 69 67 62 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65 igbuflen = cacke
330a0 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28 26 63 y_signdecrypt(&c
330b0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 ackey_slots[slot
330c0 49 44 5d 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 ID], cackey_sess
330d0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 ions[hSession].s
330e0 69 67 6e 5f 69 64 65 6e 74 69 74 79 2c 20 63 61 ign_identity, ca
330f0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
33100 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 ession].sign_buf
33110 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e , cackey_session
33120 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e s[hSession].sign
33130 5f 62 75 66 75 73 65 64 2c 20 73 69 67 62 75 66 _bufused, sigbuf
33140 2c 20 73 69 7a 65 6f 66 28 73 69 67 62 75 66 29 , sizeof(sigbuf)
33150 2c 20 31 2c 20 30 29 3b 0a 09 09 09 09 7d 0a 09 , 1, 0);.....}..
33160 09 09 7d 0a 0a 09 09 09 69 66 20 28 73 69 67 62 ..}.....if (sigb
33170 75 66 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 09 uflen < 0) {....
33180 09 2f 2a 20 53 69 67 6e 69 6e 67 20 66 61 69 6c ./* Signing fail
33190 65 64 2e 20 2a 2f 0a 09 09 09 09 69 66 20 28 73 ed. */.....if (s
331a0 69 67 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b igbuflen == CACK
331b0 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f EY_PCSC_E_NEEDLO
331c0 47 49 4e 29 20 7b 0a 09 09 09 09 09 72 65 74 76 GIN) {......retv
331d0 61 6c 20 3d 20 43 4b 52 5f 55 53 45 52 5f 4e 4f al = CKR_USER_NO
331e0 54 5f 4c 4f 47 47 45 44 5f 49 4e 3b 0a 09 09 09 T_LOGGED_IN;....
331f0 09 7d 20 65 6c 73 65 20 69 66 20 28 73 69 67 62 .} else if (sigb
33200 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f uflen == CACKEY_
33210 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 PCSC_E_TOKENABSE
33220 4e 54 29 20 7b 0a 09 09 09 09 09 72 65 74 76 61 NT) {......retva
33230 6c 20 3d 20 43 4b 52 5f 44 45 56 49 43 45 5f 52 l = CKR_DEVICE_R
33240 45 4d 4f 56 45 44 3b 0a 09 09 09 09 7d 20 65 6c EMOVED;.....} el
33250 73 65 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c se {......retval
33260 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 = CKR_GENERAL_E
33270 52 52 4f 52 3b 0a 09 09 09 09 7d 0a 09 09 09 7d RROR;.....}....}
33280 20 65 6c 73 65 20 69 66 20 28 28 28 75 6e 73 69 else if (((unsi
33290 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 62 75 gned long) sigbu
332a0 66 6c 65 6e 29 20 3e 20 2a 70 75 6c 53 69 67 6e flen) > *pulSign
332b0 61 74 75 72 65 4c 65 6e 20 26 26 20 70 53 69 67 atureLen && pSig
332c0 6e 61 74 75 72 65 29 20 7b 0a 09 09 09 09 2f 2a nature) {...../*
332d0 20 53 69 67 6e 65 64 20 64 61 74 61 20 74 6f 6f Signed data too
332e0 20 6c 61 72 67 65 20 2a 2f 0a 09 09 09 09 43 41 large */.....CA
332f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
33300 46 28 22 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f F("retval = CKR_
33310 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c BUFFER_TOO_SMALL
33320 3b 20 20 73 69 67 62 75 66 6c 65 6e 20 3d 20 25 ; sigbuflen = %
33330 6c 75 2c 20 70 75 6c 53 69 67 6e 61 74 75 72 65 lu, pulSignature
33340 4c 65 6e 20 3d 20 25 6c 75 22 2c 20 28 75 6e 73 Len = %lu", (uns
33350 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 62 igned long) sigb
33360 75 66 6c 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64 uflen, (unsigned
33370 20 6c 6f 6e 67 29 20 2a 70 75 6c 53 69 67 6e 61 long) *pulSigna
33380 74 75 72 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 72 tureLen);......r
33390 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 etval = CKR_BUFF
333a0 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 0a 09 ER_TOO_SMALL;...
333b0 09 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 ...terminate_sig
333c0 6e 20 3d 20 30 3b 0a 09 09 09 7d 20 65 6c 73 65 n = 0;....} else
333d0 20 7b 0a 09 09 09 09 74 65 72 6d 69 6e 61 74 65 {.....terminate
333e0 5f 73 69 67 6e 20 3d 20 30 3b 0a 0a 09 09 09 09 _sign = 0;......
333f0 69 66 20 28 70 53 69 67 6e 61 74 75 72 65 29 20 if (pSignature)
33400 7b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 70 53 {......memcpy(pS
33410 69 67 6e 61 74 75 72 65 2c 20 73 69 67 62 75 66 ignature, sigbuf
33420 2c 20 73 69 67 62 75 66 6c 65 6e 29 3b 0a 0a 09 , sigbuflen);...
33430 09 09 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 ....terminate_si
33440 67 6e 20 3d 20 31 3b 0a 09 09 09 09 7d 0a 0a 09 gn = 1;.....}...
33450 09 09 09 2a 70 75 6c 53 69 67 6e 61 74 75 72 65 ...*pulSignature
33460 4c 65 6e 20 3d 20 73 69 67 62 75 66 6c 65 6e 3b Len = sigbuflen;
33470 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 ......retval = C
33480 4b 52 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09 KR_OK;....}.....
33490 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 69 66 20 28 break;..}...if (
334a0 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 29 20 terminate_sign)
334b0 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 {...if (cackey_s
334c0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
334d0 5d 2e 73 69 67 6e 5f 62 75 66 29 20 7b 0a 09 09 ].sign_buf) {...
334e0 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 65 73 .free(cackey_ses
334f0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
33500 73 69 67 6e 5f 62 75 66 29 3b 0a 09 09 7d 0a 0a sign_buf);...}..
33510 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e ..cackey_session
33520 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e s[hSession].sign
33530 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a _active = 0;..}.
33540 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d ..mutex_retval =
33550 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e cackey_mutex_un
33560 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
33570 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 ock);..if (mutex
33580 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a _retval != 0) {.
33590 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
335a0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 RINTF("Error. U
335b0 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e nlocking failed.
335c0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
335d0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 R_GENERAL_ERROR)
335e0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ;..}...CACKEY_DE
335f0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
33600 72 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e 74 29 rning %i", (int)
33610 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 retval);...retu
33620 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 rn(retval);.}..C
33630 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f K_DEFINE_FUNCTIO
33640 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 52 N(CK_RV, C_SignR
33650 65 63 6f 76 65 72 49 6e 69 74 29 28 43 4b 5f 53 ecoverInit)(CK_S
33660 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 ESSION_HANDLE hS
33670 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 ession, CK_MECHA
33680 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e NISM_PTR pMechan
33690 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 ism, CK_OBJECT_H
336a0 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 ANDLE hKey) {..C
336b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
336c0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
336d0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 .if (!cackey_ini
336e0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 tialized) {...CA
336f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
33700 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 F("Error. Not i
33710 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a nitialized.");..
33720 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 ..return(CKR_CRY
33730 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 PTOKI_NOT_INITIA
33740 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 LIZED);..}...CAC
33750 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
33760 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f ("Returning CKR_
33770 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
33780 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b PORTED (%i)", CK
33790 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
337a0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 UPPORTED);...ret
337b0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e urn(CKR_FUNCTION
337c0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
337d0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 .}..CK_DEFINE_FU
337e0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f NCTION(CK_RV, C_
337f0 53 69 67 6e 52 65 63 6f 76 65 72 29 28 43 4b 5f SignRecover)(CK_
33800 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 SESSION_HANDLE h
33810 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 Session, CK_BYTE
33820 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 _PTR pData, CK_U
33830 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 LONG ulDataLen,
33840 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 CK_BYTE_PTR pSig
33850 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 nature, CK_ULONG
33860 5f 50 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72 _PTR pulSignatur
33870 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f eLen) {..CACKEY_
33880 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
33890 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 lled.");...if (!
338a0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a cackey_initializ
338b0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...CACKEY_D
338c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
338d0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c or. Not initial
338e0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 ized.");....retu
338f0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f rn(CKR_CRYPTOKI_
33900 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 NOT_INITIALIZED)
33910 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ;..}...CACKEY_DE
33920 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
33930 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 rning CKR_FUNCTI
33940 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
33950 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 (%i)", CKR_FUNC
33960 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
33970 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b ED);...return(CK
33980 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
33990 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b UPPORTED);.}..CK
339a0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e _DEFINE_FUNCTION
339b0 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 (CK_RV, C_Verify
339c0 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e Init)(CK_SESSION
339d0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e _HANDLE hSession
339e0 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 , CK_MECHANISM_P
339f0 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 TR pMechanism, C
33a00 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 K_OBJECT_HANDLE
33a10 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f hKey) {..CACKEY_
33a20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
33a30 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 lled.");...if (!
33a40 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a cackey_initializ
33a50 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...CACKEY_D
33a60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
33a70 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c or. Not initial
33a80 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 ized.");....retu
33a90 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f rn(CKR_CRYPTOKI_
33aa0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 NOT_INITIALIZED)
33ab0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ;..}...CACKEY_DE
33ac0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
33ad0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 rning CKR_FUNCTI
33ae0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
33af0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 (%i)", CKR_FUNC
33b00 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
33b10 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b ED);...return(CK
33b20 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
33b30 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b UPPORTED);.}..CK
33b40 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e _DEFINE_FUNCTION
33b50 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 (CK_RV, C_Verify
33b60 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e )(CK_SESSION_HAN
33b70 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b DLE hSession, CK
33b80 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c _BYTE_PTR pData,
33b90 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 CK_ULONG ulData
33ba0 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 Len, CK_BYTE_PTR
33bb0 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f pSignature, CK_
33bc0 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72 ULONG ulSignatur
33bd0 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f eLen) {..CACKEY_
33be0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
33bf0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 lled.");...if (!
33c00 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a cackey_initializ
33c10 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...CACKEY_D
33c20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
33c30 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c or. Not initial
33c40 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 ized.");....retu
33c50 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f rn(CKR_CRYPTOKI_
33c60 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 NOT_INITIALIZED)
33c70 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ;..}...CACKEY_DE
33c80 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
33c90 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 rning CKR_FUNCTI
33ca0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
33cb0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 (%i)", CKR_FUNC
33cc0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
33cd0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b ED);...return(CK
33ce0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
33cf0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b UPPORTED);.}..CK
33d00 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e _DEFINE_FUNCTION
33d10 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 (CK_RV, C_Verify
33d20 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 Update)(CK_SESSI
33d30 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 ON_HANDLE hSessi
33d40 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 on, CK_BYTE_PTR
33d50 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 pPart, CK_ULONG
33d60 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 ulPartLen) {..CA
33d70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
33d80 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
33d90 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 if (!cackey_init
33da0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 ialized) {...CAC
33db0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
33dc0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e ("Error. Not in
33dd0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 itialized.");...
33de0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 .return(CKR_CRYP
33df0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c TOKI_NOT_INITIAL
33e00 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b IZED);..}...CACK
33e10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
33e20 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 "Returning CKR_F
33e30 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
33e40 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 ORTED (%i)", CKR
33e50 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
33e60 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 PPORTED);...retu
33e70 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f rn(CKR_FUNCTION_
33e80 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
33e90 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e }..CK_DEFINE_FUN
33ea0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 CTION(CK_RV, C_V
33eb0 65 72 69 66 79 46 69 6e 61 6c 29 28 43 4b 5f 53 erifyFinal)(CK_S
33ec0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 ESSION_HANDLE hS
33ed0 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f ession, CK_BYTE_
33ee0 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 PTR pSignature,
33ef0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 CK_ULONG ulSigna
33f00 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b tureLen) {..CACK
33f10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
33f20 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 "Called.");...if
33f30 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 (!cackey_initia
33f40 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 lized) {...CACKE
33f50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
33f60 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 Error. Not init
33f70 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 ialized.");....r
33f80 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f eturn(CKR_CRYPTO
33f90 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a KI_NOT_INITIALIZ
33fa0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 ED);..}...CACKEY
33fb0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
33fc0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e eturning CKR_FUN
33fd0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
33fe0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 TED (%i)", CKR_F
33ff0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
34000 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e ORTED);...return
34010 28 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 7d 0a T_SUPPORTED);.}.
34030 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 .CK_DEFINE_FUNCT
34040 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 ION(CK_RV, C_Ver
34050 69 66 79 52 65 63 6f 76 65 72 49 6e 69 74 29 28 ifyRecoverInit)(
34060 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c CK_SESSION_HANDL
34070 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d E hSession, CK_M
34080 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 ECHANISM_PTR pMe
34090 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 chanism, CK_OBJE
340a0 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 CT_HANDLE hKey)
340b0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f {..CACKEY_DEBUG_
340c0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
340d0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 );...if (!cackey
340e0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
340f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
34100 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e RINTF("Error. N
34110 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 ot initialized."
34120 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
34130 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e _CRYPTOKI_NOT_IN
34140 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
34150 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
34160 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
34170 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
34180 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 _SUPPORTED (%i)"
34190 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e , CKR_FUNCTION_N
341a0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a OT_SUPPORTED);..
341b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 .return(CKR_FUNC
341c0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
341d0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e ED);.}..CK_DEFIN
341e0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 E_FUNCTION(CK_RV
341f0 2c 20 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 , C_VerifyRecove
34200 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 r)(CK_SESSION_HA
34210 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 NDLE hSession, C
34220 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e K_BYTE_PTR pSign
34230 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 ature, CK_ULONG
34240 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 2c 20 ulSignatureLen,
34250 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 CK_BYTE_PTR pDat
34260 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 a, CK_ULONG_PTR
34270 70 75 6c 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 pulDataLen) {..C
34280 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
34290 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
342a0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 .if (!cackey_ini
342b0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 tialized) {...CA
342c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
342d0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 F("Error. Not i
342e0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a nitialized.");..
342f0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 ..return(CKR_CRY
34300 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 PTOKI_NOT_INITIA
34310 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 LIZED);..}...CAC
34320 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
34330 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f ("Returning CKR_
34340 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
34350 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b PORTED (%i)", CK
34360 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
34370 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 UPPORTED);...ret
34380 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e urn(CKR_FUNCTION
34390 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
343a0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 .}..CK_DEFINE_FU
343b0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f NCTION(CK_RV, C_
343c0 44 69 67 65 73 74 45 6e 63 72 79 70 74 55 70 64 DigestEncryptUpd
343d0 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f ate)(CK_SESSION_
343e0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c HANDLE hSession,
343f0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 CK_BYTE_PTR pPa
34400 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 rt, CK_ULONG ulP
34410 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f artLen, CK_BYTE_
34420 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 PTR pEncryptedPa
34430 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 rt, CK_ULONG_PTR
34440 20 70 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 pulEncryptedPar
34450 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f tLen) {..CACKEY_
34460 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
34470 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 lled.");...if (!
34480 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a cackey_initializ
34490 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...CACKEY_D
344a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
344b0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c or. Not initial
344c0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 ized.");....retu
344d0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f rn(CKR_CRYPTOKI_
344e0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 NOT_INITIALIZED)
344f0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ;..}...CACKEY_DE
34500 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
34510 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 rning CKR_FUNCTI
34520 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
34530 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 (%i)", CKR_FUNC
34540 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
34550 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b ED);...return(CK
34560 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
34570 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b UPPORTED);.}..CK
34580 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e _DEFINE_FUNCTION
34590 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 (CK_RV, C_Decryp
345a0 74 44 69 67 65 73 74 55 70 64 61 74 65 29 28 43 tDigestUpdate)(C
345b0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 K_SESSION_HANDLE
345c0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 hSession, CK_BY
345d0 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 TE_PTR pEncrypte
345e0 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 dPart, CK_ULONG
345f0 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c ulEncryptedPartL
34600 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 en, CK_BYTE_PTR
34610 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f pPart, CK_ULONG_
34620 50 54 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20 PTR pulPartLen)
34630 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f {..CACKEY_DEBUG_
34640 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
34650 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 );...if (!cackey
34660 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
34670 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
34680 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e RINTF("Error. N
34690 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 ot initialized."
346a0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
346b0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e _CRYPTOKI_NOT_IN
346c0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
346d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
346e0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
346f0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
34700 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 _SUPPORTED (%i)"
34710 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e , CKR_FUNCTION_N
34720 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a OT_SUPPORTED);..
34730 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 .return(CKR_FUNC
34740 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
34750 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e ED);.}..CK_DEFIN
34760 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 E_FUNCTION(CK_RV
34770 2c 20 43 5f 53 69 67 6e 45 6e 63 72 79 70 74 55 , C_SignEncryptU
34780 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f pdate)(CK_SESSIO
34790 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f N_HANDLE hSessio
347a0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 n, CK_BYTE_PTR p
347b0 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 Part, CK_ULONG u
347c0 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 lPartLen, CK_BYT
347d0 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 E_PTR pEncrypted
347e0 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 Part, CK_ULONG_P
347f0 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64 50 TR pulEncryptedP
34800 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 artLen) {..CACKE
34810 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
34820 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 Called.");...if
34830 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c (!cackey_initial
34840 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 ized) {...CACKEY
34850 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
34860 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 rror. Not initi
34870 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 alized.");....re
34880 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b turn(CKR_CRYPTOK
34890 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 I_NOT_INITIALIZE
348a0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f D);..}...CACKEY_
348b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
348c0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 turning CKR_FUNC
348d0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
348e0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 ED (%i)", CKR_FU
348f0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
34900 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 RTED);...return(
34910 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
34920 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a _SUPPORTED);.}..
34930 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 CK_DEFINE_FUNCTI
34940 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 ON(CK_RV, C_Decr
34950 79 70 74 56 65 72 69 66 79 55 70 64 61 74 65 29 yptVerifyUpdate)
34960 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 (CK_SESSION_HAND
34970 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f LE hSession, CK_
34980 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 BYTE_PTR pEncryp
34990 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e tedPart, CK_ULON
349a0 47 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 G ulEncryptedPar
349b0 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 tLen, CK_BYTE_PT
349c0 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e R pPart, CK_ULON
349d0 47 5f 50 54 52 20 70 75 6c 50 61 72 74 4c 65 6e G_PTR pulPartLen
349e0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 ) {..CACKEY_DEBU
349f0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 G_PRINTF("Called
34a00 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b .");...if (!cack
34a10 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 ey_initialized)
34a20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
34a30 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
34a40 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 Not initialized
34a50 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
34a60 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f KR_CRYPTOKI_NOT_
34a70 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d INITIALIZED);..}
34a80 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
34a90 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e PRINTF("Returnin
34aa0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e g CKR_FUNCTION_N
34ab0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 OT_SUPPORTED (%i
34ac0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e )", CKR_FUNCTION
34ad0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
34ae0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 ...return(CKR_FU
34af0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
34b00 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 RTED);.}..CK_DEF
34b10 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f INE_FUNCTION(CK_
34b20 52 56 2c 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 RV, C_GenerateKe
34b30 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 y)(CK_SESSION_HA
34b40 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 NDLE hSession, C
34b50 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 K_MECHANISM_PTR
34b60 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 41 pMechanism, CK_A
34b70 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 TTRIBUTE_PTR pTe
34b80 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 mplate, CK_ULONG
34b90 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a ulCount, CK_OBJ
34ba0 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 ECT_HANDLE_PTR p
34bb0 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f hKey) {..CACKEY_
34bc0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
34bd0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 lled.");...if (!
34be0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a cackey_initializ
34bf0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...CACKEY_D
34c00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
34c10 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c or. Not initial
34c20 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 ized.");....retu
34c30 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f rn(CKR_CRYPTOKI_
34c40 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 NOT_INITIALIZED)
34c50 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ;..}...CACKEY_DE
34c60 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
34c70 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 rning CKR_FUNCTI
34c80 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
34c90 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 (%i)", CKR_FUNC
34ca0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
34cb0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b ED);...return(CK
34cc0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
34cd0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b UPPORTED);.}..CK
34ce0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e _DEFINE_FUNCTION
34cf0 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61 (CK_RV, C_Genera
34d00 74 65 4b 65 79 50 61 69 72 29 28 43 4b 5f 53 45 teKeyPair)(CK_SE
34d10 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 SSION_HANDLE hSe
34d20 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e ssion, CK_MECHAN
34d30 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 ISM_PTR pMechani
34d40 73 6d 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 sm, CK_ATTRIBUTE
34d50 5f 50 54 52 20 70 50 75 62 6c 69 63 4b 65 79 54 _PTR pPublicKeyT
34d60 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e emplate, CK_ULON
34d70 47 20 75 6c 50 75 62 6c 69 63 4b 65 79 41 74 74 G ulPublicKeyAtt
34d80 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f ributeCount, CK_
34d90 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 50 ATTRIBUTE_PTR pP
34da0 72 69 76 61 74 65 4b 65 79 54 65 6d 70 6c 61 74 rivateKeyTemplat
34db0 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 72 e, CK_ULONG ulPr
34dc0 69 76 61 74 65 4b 65 79 41 74 74 72 69 62 75 74 ivateKeyAttribut
34dd0 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 eCount, CK_OBJEC
34de0 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 50 T_HANDLE_PTR phP
34df0 75 62 6c 69 63 4b 65 79 2c 20 43 4b 5f 4f 42 4a ublicKey, CK_OBJ
34e00 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 ECT_HANDLE_PTR p
34e10 68 50 72 69 76 61 74 65 4b 65 79 29 20 7b 0a 09 hPrivateKey) {..
34e20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
34e30 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a NTF("Called.");.
34e40 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e ..if (!cackey_in
34e50 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 itialized) {...C
34e60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
34e70 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 TF("Error. Not
34e80 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a initialized.");.
34e90 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 ...return(CKR_CR
34ea0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 YPTOKI_NOT_INITI
34eb0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 ALIZED);..}...CA
34ec0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
34ed0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 F("Returning CKR
34ee0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
34ef0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 PPORTED (%i)", C
34f00 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
34f10 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 SUPPORTED);...re
34f20 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f turn(CKR_FUNCTIO
34f30 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 N_NOT_SUPPORTED)
34f40 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 ;.}..CK_DEFINE_F
34f50 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 UNCTION(CK_RV, C
34f60 5f 57 72 61 70 4b 65 79 29 28 43 4b 5f 53 45 53 _WrapKey)(CK_SES
34f70 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 SION_HANDLE hSes
34f80 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 sion, CK_MECHANI
34f90 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 SM_PTR pMechanis
34fa0 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e m, CK_OBJECT_HAN
34fb0 44 4c 45 20 68 57 72 61 70 70 69 6e 67 4b 65 79 DLE hWrappingKey
34fc0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 , CK_OBJECT_HAND
34fd0 4c 45 20 68 4b 65 79 2c 20 43 4b 5f 42 59 54 45 LE hKey, CK_BYTE
34fe0 5f 50 54 52 20 70 57 72 61 70 70 65 64 4b 65 79 _PTR pWrappedKey
34ff0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 , CK_ULONG_PTR p
35000 75 6c 57 72 61 70 70 65 64 4b 65 79 4c 65 6e 29 ulWrappedKeyLen)
35010 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {..CACKEY_DEBUG
35020 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
35030 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ");...if (!cacke
35040 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b y_initialized) {
35050 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
35060 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
35070 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e Not initialized.
35080 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
35090 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 R_CRYPTOKI_NOT_I
350a0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
350b0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
350c0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
350d0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f CKR_FUNCTION_NO
350e0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 T_SUPPORTED (%i)
350f0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f ", CKR_FUNCTION_
35100 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
35110 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e ..return(CKR_FUN
35120 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
35130 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 TED);.}..CK_DEFI
35140 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 NE_FUNCTION(CK_R
35150 56 2c 20 43 5f 55 6e 77 72 61 70 4b 65 79 29 28 V, C_UnwrapKey)(
35160 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c CK_SESSION_HANDL
35170 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d E hSession, CK_M
35180 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 ECHANISM_PTR pMe
35190 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 chanism, CK_OBJE
351a0 43 54 5f 48 41 4e 44 4c 45 20 68 55 6e 77 72 61 CT_HANDLE hUnwra
351b0 70 70 69 6e 67 4b 65 79 2c 20 43 4b 5f 42 59 54 ppingKey, CK_BYT
351c0 45 5f 50 54 52 20 70 57 72 61 70 70 65 64 4b 65 E_PTR pWrappedKe
351d0 79 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 57 72 y, CK_ULONG ulWr
351e0 61 70 70 65 64 4b 65 79 4c 65 6e 2c 20 43 4b 5f appedKeyLen, CK_
351f0 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 ATTRIBUTE_PTR pT
35200 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e emplate, CK_ULON
35210 47 20 75 6c 41 74 74 72 69 62 75 74 65 43 6f 75 G ulAttributeCou
35220 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 nt, CK_OBJECT_HA
35230 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65 79 29 20 NDLE_PTR phKey)
35240 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f {..CACKEY_DEBUG_
35250 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
35260 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 );...if (!cackey
35270 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
35280 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
35290 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e RINTF("Error. N
352a0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 ot initialized."
352b0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
352c0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e _CRYPTOKI_NOT_IN
352d0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
352e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
352f0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
35300 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
35310 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 _SUPPORTED (%i)"
35320 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e , CKR_FUNCTION_N
35330 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a OT_SUPPORTED);..
35340 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 .return(CKR_FUNC
35350 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
35360 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e ED);.}..CK_DEFIN
35370 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 E_FUNCTION(CK_RV
35380 2c 20 43 5f 44 65 72 69 76 65 4b 65 79 29 28 43 , C_DeriveKey)(C
35390 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 K_SESSION_HANDLE
353a0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 hSession, CK_ME
353b0 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 CHANISM_PTR pMec
353c0 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 hanism, CK_OBJEC
353d0 54 5f 48 41 4e 44 4c 45 20 68 42 61 73 65 4b 65 T_HANDLE hBaseKe
353e0 79 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f y, CK_ATTRIBUTE_
353f0 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 PTR pTemplate, C
35400 4b 5f 55 4c 4f 4e 47 20 75 6c 41 74 74 72 69 62 K_ULONG ulAttrib
35410 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a uteCount, CK_OBJ
35420 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 ECT_HANDLE_PTR p
35430 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f hKey) {..CACKEY_
35440 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
35450 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 lled.");...if (!
35460 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a cackey_initializ
35470 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...CACKEY_D
35480 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
35490 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c or. Not initial
354a0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 ized.");....retu
354b0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f rn(CKR_CRYPTOKI_
354c0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 NOT_INITIALIZED)
354d0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ;..}...CACKEY_DE
354e0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
354f0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 rning CKR_FUNCTI
35500 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
35510 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 (%i)", CKR_FUNC
35520 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
35530 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b ED);...return(CK
35540 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
35550 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b UPPORTED);.}..CK
35560 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e _DEFINE_FUNCTION
35570 28 43 4b 5f 52 56 2c 20 43 5f 53 65 65 64 52 61 (CK_RV, C_SeedRa
35580 6e 64 6f 6d 29 28 43 4b 5f 53 45 53 53 49 4f 4e ndom)(CK_SESSION
35590 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e _HANDLE hSession
355a0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 , CK_BYTE_PTR pS
355b0 65 65 64 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c eed, CK_ULONG ul
355c0 53 65 65 64 4c 65 6e 29 20 7b 0a 09 43 41 43 4b SeedLen) {..CACK
355d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
355e0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 "Called.");...if
355f0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 (!cackey_initia
35600 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 lized) {...CACKE
35610 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
35620 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 Error. Not init
35630 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 ialized.");....r
35640 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f eturn(CKR_CRYPTO
35650 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a KI_NOT_INITIALIZ
35660 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 ED);..}...CACKEY
35670 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
35680 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e eturning CKR_FUN
35690 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
356a0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 TED (%i)", CKR_F
356b0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
356c0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e ORTED);...return
356d0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f (CKR_FUNCTION_NO
356e0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a T_SUPPORTED);.}.
356f0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 .CK_DEFINE_FUNCT
35700 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e ION(CK_RV, C_Gen
35710 65 72 61 74 65 52 61 6e 64 6f 6d 29 28 43 4b 5f erateRandom)(CK_
35720 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 SESSION_HANDLE h
35730 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 Session, CK_BYTE
35740 5f 50 54 52 20 70 52 61 6e 64 6f 6d 44 61 74 61 _PTR pRandomData
35750 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 52 61 6e , CK_ULONG ulRan
35760 64 6f 6d 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 domLen) {..CACKE
35770 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
35780 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 Called.");...if
35790 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c (!cackey_initial
357a0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 ized) {...CACKEY
357b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
357c0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 rror. Not initi
357d0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 alized.");....re
357e0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b turn(CKR_CRYPTOK
357f0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 I_NOT_INITIALIZE
35800 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f D);..}...CACKEY_
35810 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
35820 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 turning CKR_FUNC
35830 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
35840 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 ED (%i)", CKR_FU
35850 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
35860 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 RTED);...return(
35870 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
35880 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a _SUPPORTED);.}..
35890 2f 2a 20 44 65 70 72 65 63 61 74 65 64 20 46 75 /* Deprecated Fu
358a0 6e 63 74 69 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 46 nction */.CK_DEF
358b0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f INE_FUNCTION(CK_
358c0 52 56 2c 20 43 5f 47 65 74 46 75 6e 63 74 69 6f RV, C_GetFunctio
358d0 6e 53 74 61 74 75 73 29 28 43 4b 5f 53 45 53 53 nStatus)(CK_SESS
358e0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 ION_HANDLE hSess
358f0 69 6f 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 ion) {..CACKEY_D
35900 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
35910 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 led.");...CACKEY
35920 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
35930 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e eturning CKR_FUN
35940 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c CTION_NOT_PARALL
35950 45 4c 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 EL (%i)", CKR_FU
35960 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c NCTION_NOT_PARAL
35970 4c 45 4c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 LEL);...return(C
35980 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
35990 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65 PARALLEL);...hSe
359a0 73 73 69 6f 6e 20 3d 20 68 53 65 73 73 69 6f 6e ssion = hSession
359b0 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75 6e 75 ; /* Supress unu
359c0 73 65 64 20 76 61 72 69 61 62 6c 65 20 77 61 72 sed variable war
359d0 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 20 44 65 ning */.}../* De
359e0 70 72 65 63 61 74 65 64 20 46 75 6e 63 74 69 6f precated Functio
359f0 6e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 n */.CK_DEFINE_F
35a00 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 UNCTION(CK_RV, C
35a10 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 29 _CancelFunction)
35a20 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 (CK_SESSION_HAND
35a30 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 LE hSession) {..
35a40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
35a50 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a NTF("Called.");.
35a60 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
35a70 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
35a80 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f CKR_FUNCTION_NO
35a90 54 5f 50 41 52 41 4c 4c 45 4c 20 28 25 69 29 22 T_PARALLEL (%i)"
35aa0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e , CKR_FUNCTION_N
35ab0 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 OT_PARALLEL);...
35ac0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 return(CKR_FUNCT
35ad0 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c ION_NOT_PARALLEL
35ae0 29 3b 0a 0a 09 68 53 65 73 73 69 6f 6e 20 3d 20 );...hSession =
35af0 68 53 65 73 73 69 6f 6e 3b 20 2f 2a 20 53 75 70 hSession; /* Sup
35b00 72 65 73 73 20 75 6e 75 73 65 64 20 76 61 72 69 ress unused vari
35b10 61 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a able warning */.
35b20 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e }..CK_DEFINE_FUN
35b30 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 CTION(CK_RV, C_G
35b40 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 28 etFunctionList)(
35b50 43 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 CK_FUNCTION_LIST
35b60 5f 50 54 52 5f 50 54 52 20 70 70 46 75 6e 63 74 _PTR_PTR ppFunct
35b70 69 6f 6e 4c 69 73 74 29 20 7b 0a 09 73 74 61 74 ionList) {..stat
35b80 69 63 20 43 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c ic CK_FUNCTION_L
35b90 49 53 54 5f 50 54 52 20 73 70 46 75 6e 63 74 69 IST_PTR spFuncti
35ba0 6f 6e 4c 69 73 74 20 3d 20 4e 55 4c 4c 3b 0a 09 onList = NULL;..
35bb0 43 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 CK_FUNCTION_LIST
35bc0 5f 50 54 52 20 70 46 75 6e 63 74 69 6f 6e 4c 69 _PTR pFunctionLi
35bd0 73 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 st;...CACKEY_DEB
35be0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
35bf0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 70 46 75 d.");...if (ppFu
35c00 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 3d 20 4e 55 nctionList == NU
35c10 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 LL) {...CACKEY_D
35c20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
35c30 6f 72 2e 20 70 70 46 75 6e 63 74 69 6f 6e 4c 69 or. ppFunctionLi
35c40 73 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a st is NULL.");..
35c50 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 ..return(CKR_ARG
35c60 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a UMENTS_BAD);..}.
35c70 0a 09 69 66 20 28 73 70 46 75 6e 63 74 69 6f 6e ..if (spFunction
35c80 4c 69 73 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a List != NULL) {.
35c90 09 09 2a 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 ..*ppFunctionLis
35ca0 74 20 3d 20 73 70 46 75 6e 63 74 69 6f 6e 4c 69 t = spFunctionLi
35cb0 73 74 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 st;....CACKEY_DE
35cc0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
35cd0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 rning CKR_OK (%i
35ce0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 )", CKR_OK);....
35cf0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a return(CKR_OK);.
35d00 09 7d 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 .}...pFunctionLi
35d10 73 74 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 st = malloc(size
35d20 6f 66 28 2a 70 46 75 6e 63 74 69 6f 6e 4c 69 73 of(*pFunctionLis
35d30 74 29 29 3b 0a 0a 09 70 46 75 6e 63 74 69 6f 6e t));...pFunction
35d40 4c 69 73 74 2d 3e 76 65 72 73 69 6f 6e 2e 6d 61 List->version.ma
35d50 6a 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 jor = ((CACKEY_C
35d60 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f RYPTOKI_VERSION_
35d70 43 4f 44 45 29 20 3e 3e 20 31 36 29 20 26 20 30 CODE) >> 16) & 0
35d80 78 66 66 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c xff;..pFunctionL
35d90 69 73 74 2d 3e 76 65 72 73 69 6f 6e 2e 6d 69 6e ist->version.min
35da0 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 52 or = ((CACKEY_CR
35db0 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 YPTOKI_VERSION_C
35dc0 4f 44 45 29 20 3e 3e 20 38 29 20 26 20 30 78 66 ODE) >> 8) & 0xf
35dd0 66 3b 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 f;...pFunctionLi
35de0 73 74 2d 3e 43 5f 49 6e 69 74 69 61 6c 69 7a 65 st->C_Initialize
35df0 20 3d 20 43 5f 49 6e 69 74 69 61 6c 69 7a 65 3b = C_Initialize;
35e00 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d ..pFunctionList-
35e10 3e 43 5f 46 69 6e 61 6c 69 7a 65 20 3d 20 43 5f >C_Finalize = C_
35e20 46 69 6e 61 6c 69 7a 65 3b 0a 09 70 46 75 6e 63 Finalize;..pFunc
35e30 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 49 tionList->C_GetI
35e40 6e 66 6f 20 3d 20 43 5f 47 65 74 49 6e 66 6f 3b nfo = C_GetInfo;
35e50 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d ..pFunctionList-
35e60 3e 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74 20 3d >C_GetSlotList =
35e70 20 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74 3b 0a C_GetSlotList;.
35e80 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e .pFunctionList->
35e90 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 20 3d 20 C_GetSlotInfo =
35ea0 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 3b 0a 09 C_GetSlotInfo;..
35eb0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 pFunctionList->C
35ec0 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 20 3d 20 _GetTokenInfo =
35ed0 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 3b 0a C_GetTokenInfo;.
35ee0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e .pFunctionList->
35ef0 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74 45 76 65 C_WaitForSlotEve
35f00 6e 74 20 3d 20 43 5f 57 61 69 74 46 6f 72 53 6c nt = C_WaitForSl
35f10 6f 74 45 76 65 6e 74 3b 0a 09 70 46 75 6e 63 74 otEvent;..pFunct
35f20 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4d 65 ionList->C_GetMe
35f30 63 68 61 6e 69 73 6d 4c 69 73 74 20 3d 20 43 5f chanismList = C_
35f40 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 GetMechanismList
35f50 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 ;..pFunctionList
35f60 2d 3e 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d ->C_GetMechanism
35f70 49 6e 66 6f 20 3d 20 43 5f 47 65 74 4d 65 63 68 Info = C_GetMech
35f80 61 6e 69 73 6d 49 6e 66 6f 3b 0a 09 70 46 75 6e anismInfo;..pFun
35f90 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 ctionList->C_Ini
35fa0 74 54 6f 6b 65 6e 20 3d 20 43 5f 49 6e 69 74 54 tToken = C_InitT
35fb0 6f 6b 65 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e oken;..pFunction
35fc0 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 50 49 4e 20 List->C_InitPIN
35fd0 3d 20 43 5f 49 6e 69 74 50 49 4e 3b 0a 09 70 46 = C_InitPIN;..pF
35fe0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 unctionList->C_S
35ff0 65 74 50 49 4e 20 3d 20 43 5f 53 65 74 50 49 4e etPIN = C_SetPIN
36000 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 ;..pFunctionList
36010 2d 3e 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 20 ->C_OpenSession
36020 3d 20 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 3b = C_OpenSession;
36030 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d ..pFunctionList-
36040 3e 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 20 >C_CloseSession
36050 3d 20 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e = C_CloseSession
36060 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 ;..pFunctionList
36070 2d 3e 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73 ->C_CloseAllSess
36080 69 6f 6e 73 20 3d 20 43 5f 43 6c 6f 73 65 41 6c ions = C_CloseAl
36090 6c 53 65 73 73 69 6f 6e 73 3b 0a 09 70 46 75 6e lSessions;..pFun
360a0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 ctionList->C_Get
360b0 53 65 73 73 69 6f 6e 49 6e 66 6f 20 3d 20 43 5f SessionInfo = C_
360c0 47 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f 3b 0a GetSessionInfo;.
360d0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e .pFunctionList->
360e0 43 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 C_GetOperationSt
360f0 61 74 65 20 3d 20 43 5f 47 65 74 4f 70 65 72 61 ate = C_GetOpera
36100 74 69 6f 6e 53 74 61 74 65 3b 0a 09 70 46 75 6e tionState;..pFun
36110 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 ctionList->C_Set
36120 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 20 3d OperationState =
36130 20 43 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e 53 C_SetOperationS
36140 74 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e tate;..pFunction
36150 4c 69 73 74 2d 3e 43 5f 4c 6f 67 69 6e 20 3d 20 List->C