0000: 23 69 66 64 65 66 20 48 41 56 45 5f 43 4f 4e 46 #ifdef HAVE_CONF
0010: 49 47 5f 48 0a 23 69 6e 63 6c 75 64 65 20 22 63 IG_H.#include "c
0020: 6f 6e 66 69 67 2e 68 22 0a 23 65 6e 64 69 66 0a onfig.h".#endif.
0030: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 57 49 4e .#ifdef HAVE_WIN
0040: 54 59 50 45 53 5f 48 0a 23 20 20 69 6e 63 6c 75 TYPES_H.# inclu
0050: 64 65 20 3c 77 69 6e 74 79 70 65 73 2e 68 3e 0a de <wintypes.h>.
0060: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 #endif.#ifdef HA
0070: 56 45 5f 50 43 53 43 4c 49 54 45 5f 48 0a 23 20 VE_PCSCLITE_H.#
0080: 20 69 6e 63 6c 75 64 65 20 3c 70 63 73 63 6c 69 include <pcscli
0090: 74 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 te.h>.#endif.#if
00a0: 64 65 66 20 48 41 56 45 5f 57 49 4e 53 43 41 52 def HAVE_WINSCAR
00b0: 44 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c D_H.# include <
00c0: 77 69 6e 73 63 61 72 64 2e 68 3e 0a 23 65 6e 64 winscard.h>.#end
00d0: 69 66 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 if.#ifdef HAVE_S
00e0: 54 44 49 4e 54 5f 48 0a 23 20 20 69 6e 63 6c 75 TDINT_H.# inclu
00f0: 64 65 20 3c 73 74 64 69 6e 74 2e 68 3e 0a 23 65 de <stdint.h>.#e
0100: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45 ndif.#ifdef HAVE
0110: 5f 49 4e 54 54 59 50 45 53 5f 48 0a 23 20 20 69 _INTTYPES_H.# i
0120: 6e 63 6c 75 64 65 20 3c 69 6e 74 74 79 70 65 73 nclude <inttypes
0130: 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 .h>.#endif.#ifde
0140: 66 20 48 41 56 45 5f 53 54 44 4c 49 42 5f 48 0a f HAVE_STDLIB_H.
0150: 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c # include <stdl
0160: 69 62 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 ib.h>.#endif.#if
0170: 64 65 66 20 48 41 56 45 5f 55 4e 49 53 54 44 5f def HAVE_UNISTD_
0180: 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 75 6e H.# include <un
0190: 69 73 74 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 istd.h>.#endif.#
01a0: 69 66 64 65 66 20 48 41 56 45 5f 53 54 52 49 4e ifdef HAVE_STRIN
01b0: 47 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c G_H.# include <
01c0: 73 74 72 69 6e 67 2e 68 3e 0a 23 65 6e 64 69 66 string.h>.#endif
01d0: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 50 54 48 .#ifdef HAVE_PTH
01e0: 52 45 41 44 5f 48 0a 23 20 20 69 6e 63 6c 75 64 READ_H.# includ
01f0: 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 65 e <pthread.h>.#e
0200: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45 ndif.#ifdef HAVE
0210: 5f 4c 49 4d 49 54 53 5f 48 0a 23 20 20 69 6e 63 _LIMITS_H.# inc
0220: 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a lude <limits.h>.
0230: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 #endif.#ifdef HA
0240: 56 45 5f 53 54 44 49 4f 5f 48 0a 23 20 20 69 6e VE_STDIO_H.# in
0250: 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a clude <stdio.h>.
0260: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 48 #endif.#define H
0270: 41 56 45 5f 45 52 52 4e 4f 5f 48 20 31 0a 23 69 AVE_ERRNO_H 1.#i
0280: 66 64 65 66 20 48 41 56 45 5f 45 52 52 4e 4f 5f fdef HAVE_ERRNO_
0290: 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 65 72 H.# include <er
02a0: 72 6e 6f 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 rno.h>.#endif.#i
02b0: 66 64 65 66 20 48 41 56 45 5f 5a 4c 49 42 5f 48 fdef HAVE_ZLIB_H
02c0: 0a 23 20 20 69 66 64 65 66 20 48 41 56 45 5f 4c .# ifdef HAVE_L
02d0: 49 42 5a 0a 23 20 20 20 20 69 6e 63 6c 75 64 65 IBZ.# include
02e0: 20 3c 7a 6c 69 62 2e 68 3e 0a 23 20 20 65 6e 64 <zlib.h>.# end
02f0: 69 66 0a 23 65 6c 73 65 0a 23 20 20 69 66 64 65 if.#else.# ifde
0300: 66 20 48 41 56 45 5f 4c 49 42 5a 0a 23 20 20 20 f HAVE_LIBZ.#
0310: 20 75 6e 64 65 66 20 48 41 56 45 5f 4c 49 42 5a undef HAVE_LIBZ
0320: 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 .# endif.#endif
0330: 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44 .#ifdef CACKEY_D
0340: 45 42 55 47 5f 53 45 41 52 43 48 5f 53 50 45 45 EBUG_SEARCH_SPEE
0350: 44 54 45 53 54 0a 23 20 20 69 6e 63 6c 75 64 65 DTEST.# include
0360: 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a 23 65 <sys/time.h>.#e
0370: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 43 4b ndif..#define CK
0380: 5f 50 54 52 20 2a 0a 23 64 65 66 69 6e 65 20 43 _PTR *.#define C
0390: 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f K_DEFINE_FUNCTIO
03a0: 4e 28 72 65 74 75 72 6e 54 79 70 65 2c 20 6e 61 N(returnType, na
03b0: 6d 65 29 20 72 65 74 75 72 6e 54 79 70 65 20 6e me) returnType n
03c0: 61 6d 65 0a 23 64 65 66 69 6e 65 20 43 4b 5f 44 ame.#define CK_D
03d0: 45 43 4c 41 52 45 5f 46 55 4e 43 54 49 4f 4e 28 ECLARE_FUNCTION(
03e0: 72 65 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d 65 returnType, name
03f0: 29 20 72 65 74 75 72 6e 54 79 70 65 20 6e 61 6d ) returnType nam
0400: 65 0a 23 64 65 66 69 6e 65 20 43 4b 5f 44 45 43 e.#define CK_DEC
0410: 4c 41 52 45 5f 46 55 4e 43 54 49 4f 4e 5f 50 4f LARE_FUNCTION_PO
0420: 49 4e 54 45 52 28 72 65 74 75 72 6e 54 79 70 65 INTER(returnType
0430: 2c 20 6e 61 6d 65 29 20 72 65 74 75 72 6e 54 79 , name) returnTy
0440: 70 65 20 28 2a 20 6e 61 6d 65 29 0a 23 64 65 66 pe (* name).#def
0450: 69 6e 65 20 43 4b 5f 43 41 4c 4c 42 41 43 4b 5f ine CK_CALLBACK_
0460: 46 55 4e 43 54 49 4f 4e 28 72 65 74 75 72 6e 54 FUNCTION(returnT
0470: 79 70 65 2c 20 6e 61 6d 65 29 20 72 65 74 75 72 ype, name) retur
0480: 6e 54 79 70 65 20 28 2a 20 6e 61 6d 65 29 0a 23 nType (* name).#
0490: 69 66 6e 64 65 66 20 4e 55 4c 4c 5f 50 54 52 0a ifndef NULL_PTR.
04a0: 23 20 20 64 65 66 69 6e 65 20 4e 55 4c 4c 5f 50 # define NULL_P
04b0: 54 52 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69 6e TR 0.#endif..#in
04c0: 63 6c 75 64 65 20 22 70 6b 63 73 31 31 2e 68 22 clude "pkcs11.h"
04d0: 0a 23 69 6e 63 6c 75 64 65 20 22 70 6b 63 73 31 .#include "pkcs1
04e0: 31 6e 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 1n.h".#include "
04f0: 61 73 6e 31 2d 78 35 30 39 2e 68 22 0a 23 69 6e asn1-x509.h".#in
0500: 63 6c 75 64 65 20 22 73 68 61 31 2e 68 22 0a 23 clude "sha1.h".#
0510: 69 6e 63 6c 75 64 65 20 22 6d 64 35 2e 68 22 0a include "md5.h".
0520: 0a 23 69 66 6e 64 65 66 20 43 41 43 4b 45 59 5f .#ifndef CACKEY_
0530: 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e CRYPTOKI_VERSION
0540: 5f 43 4f 44 45 0a 23 20 20 64 65 66 69 6e 65 20 _CODE.# define
0550: 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f CACKEY_CRYPTOKI_
0560: 56 45 52 53 49 4f 4e 5f 43 4f 44 45 20 30 78 30 VERSION_CODE 0x0
0570: 32 31 65 30 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 21e00.#endif../*
0580: 20 47 53 43 2d 49 53 20 76 32 2e 31 20 44 65 66 GSC-IS v2.1 Def
0590: 69 6e 69 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 2a 20 initions */./**
05a0: 43 6c 61 73 73 65 73 20 2a 2a 2f 0a 23 64 65 66 Classes **/.#def
05b0: 69 6e 65 20 47 53 43 49 53 5f 43 4c 41 53 53 5f ine GSCIS_CLASS_
05c0: 49 53 4f 37 38 31 36 20 20 20 20 20 20 20 20 20 ISO7816
05d0: 20 20 30 78 30 30 0a 23 64 65 66 69 6e 65 20 47 0x00.#define G
05e0: 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 SCIS_CLASS_GLOBA
05f0: 4c 5f 50 4c 41 54 46 4f 52 4d 20 20 20 30 78 38 L_PLATFORM 0x8
0600: 30 0a 0a 2f 2a 2a 20 49 6e 73 74 72 75 63 74 69 0../** Instructi
0610: 6f 6e 73 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 ons **/.#define
0620: 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f GSCIS_INSTR_GET_
0630: 52 45 53 50 4f 4e 53 45 20 20 20 20 20 20 30 78 RESPONSE 0x
0640: 43 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 C0.#define GSCIS
0650: 5f 49 4e 53 54 52 5f 52 45 41 44 5f 42 49 4e 41 _INSTR_READ_BINA
0660: 52 59 20 20 20 20 20 20 20 30 78 42 30 0a 23 64 RY 0xB0.#d
0670: 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 efine GSCIS_INST
0680: 52 5f 55 50 44 41 54 45 5f 42 49 4e 41 52 59 20 R_UPDATE_BINARY
0690: 20 20 20 20 30 78 44 36 0a 23 64 65 66 69 6e 65 0xD6.#define
06a0: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c GSCIS_INSTR_SEL
06b0: 45 43 54 20 20 20 20 20 20 20 20 20 20 20 20 30 ECT 0
06c0: 78 41 34 0a 23 64 65 66 69 6e 65 20 47 53 43 49 xA4.#define GSCI
06d0: 53 5f 49 4e 53 54 52 5f 45 58 54 45 52 4e 41 4c S_INSTR_EXTERNAL
06e0: 5f 41 55 54 48 20 20 20 20 20 30 78 38 32 0a 23 _AUTH 0x82.#
06f0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 define GSCIS_INS
0700: 54 52 5f 47 45 54 5f 43 48 41 4c 4c 45 4e 47 45 TR_GET_CHALLENGE
0710: 20 20 20 20 20 30 78 38 34 0a 23 64 65 66 69 6e 0x84.#defin
0720: 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 49 4e e GSCIS_INSTR_IN
0730: 54 45 52 4e 41 4c 5f 41 55 54 48 20 20 20 20 20 TERNAL_AUTH
0740: 30 78 38 38 0a 23 64 65 66 69 6e 65 20 47 53 43 0x88.#define GSC
0750: 49 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 20 IS_INSTR_VERIFY
0760: 20 20 20 20 20 20 20 20 20 20 20 30 78 32 30 0a 0x20.
0770: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e #define GSCIS_IN
0780: 53 54 52 5f 43 48 41 4e 47 45 5f 52 45 46 45 52 STR_CHANGE_REFER
0790: 45 4e 43 45 20 20 30 78 32 34 0a 23 64 65 66 69 ENCE 0x24.#defi
07a0: 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 ne GSCIS_INSTR_S
07b0: 49 47 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 IGN
07c0: 20 30 78 32 41 0a 23 64 65 66 69 6e 65 20 47 53 0x2A.#define GS
07d0: 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 50 52 CIS_INSTR_GET_PR
07e0: 4f 50 20 20 20 20 20 20 20 20 20 20 30 78 35 36 OP 0x56
07f0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 .#define GSCIS_I
0800: 4e 53 54 52 5f 47 45 54 5f 41 43 52 20 20 20 20 NSTR_GET_ACR
0810: 20 20 20 20 20 20 20 30 78 34 43 0a 23 64 65 66 0x4C.#def
0820: 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f ine GSCIS_INSTR_
0830: 52 45 41 44 5f 42 55 46 46 45 52 20 20 20 20 20 READ_BUFFER
0840: 20 20 30 78 35 32 0a 23 64 65 66 69 6e 65 20 47 0x52.#define G
0850: 53 43 49 53 5f 49 4e 53 54 52 5f 53 49 47 4e 44 SCIS_INSTR_SIGND
0860: 45 43 52 59 50 54 20 20 20 20 20 20 20 30 78 34 ECRYPT 0x4
0870: 32 0a 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 2..#define GSCIS
0880: 5f 50 41 52 41 4d 5f 53 45 4c 45 43 54 5f 41 50 _PARAM_SELECT_AP
0890: 50 4c 45 54 20 20 20 20 20 30 78 30 34 0a 0a 2f PLET 0x04../
08a0: 2a 2a 20 54 61 67 73 20 2a 2a 2f 0a 2f 2a 2a 2a ** Tags **/./***
08b0: 20 43 43 43 20 54 61 67 73 20 2a 2a 2a 2f 0a 23 CCC Tags ***/.#
08c0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 define GSCIS_TAG
08d0: 5f 43 41 52 44 49 44 20 20 20 20 20 20 20 20 20 _CARDID
08e0: 20 20 20 20 20 30 78 46 30 0a 23 64 65 66 69 6e 0xF0.#defin
08f0: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 43 43 5f e GSCIS_TAG_CCC_
0900: 56 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 VER
0910: 30 78 46 31 0a 23 64 65 66 69 6e 65 20 47 53 43 0xF1.#define GSC
0920: 49 53 5f 54 41 47 5f 43 43 47 5f 56 45 52 20 20 IS_TAG_CCG_VER
0930: 20 20 20 20 20 20 20 20 20 20 20 30 78 46 32 0a 0xF2.
0940: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 #define GSCIS_TA
0950: 47 5f 43 41 52 44 55 52 4c 20 20 20 20 20 20 20 G_CARDURL
0960: 20 20 20 20 20 20 30 78 46 33 0a 23 64 65 66 69 0xF3.#defi
0970: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 ne GSCIS_TAG_PKC
0980: 53 31 35 20 20 20 20 20 20 20 20 20 20 20 20 20 S15
0990: 20 30 78 46 34 0a 23 64 65 66 69 6e 65 20 47 53 0xF4.#define GS
09a0: 43 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 41 CIS_TAG_REG_DATA
09b0: 5f 4d 4f 44 45 4c 20 20 20 20 20 20 30 78 46 35 _MODEL 0xF5
09c0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 .#define GSCIS_T
09d0: 41 47 5f 41 43 52 5f 54 41 42 4c 45 20 20 20 20 AG_ACR_TABLE
09e0: 20 20 20 20 20 20 20 30 78 46 36 0a 23 64 65 66 0xF6.#def
09f0: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 ine GSCIS_TAG_CA
0a00: 52 44 5f 41 50 44 55 20 20 20 20 20 20 20 20 20 RD_APDU
0a10: 20 20 30 78 46 37 0a 23 64 65 66 69 6e 65 20 47 0xF7.#define G
0a20: 53 43 49 53 5f 54 41 47 5f 52 45 44 49 52 45 43 SCIS_TAG_REDIREC
0a30: 54 49 4f 4e 20 20 20 20 20 20 20 20 20 30 78 46 TION 0xF
0a40: 41 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f A.#define GSCIS_
0a50: 54 41 47 5f 43 54 20 20 20 20 20 20 20 20 20 20 TAG_CT
0a60: 20 20 20 20 20 20 20 20 30 78 46 42 0a 23 64 65 0xFB.#de
0a70: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53 fine GSCIS_TAG_S
0a80: 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 T
0a90: 20 20 20 30 78 46 43 0a 23 64 65 66 69 6e 65 20 0xFC.#define
0aa0: 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54 43 43 GSCIS_TAG_NEXTCC
0ab0: 43 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 C 0x
0ac0: 46 44 0a 0a 2f 2a 2a 2a 20 47 65 6e 65 72 61 6c FD../*** General
0ad0: 20 2d 20 45 46 20 32 32 30 30 20 2a 2a 2a 2f 0a - EF 2200 ***/.
0ae0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 #define GSCIS_TA
0af0: 47 5f 46 4e 41 4d 45 20 20 20 20 20 20 20 20 20 G_FNAME
0b00: 20 20 20 20 20 20 30 78 30 31 0a 23 64 65 66 69 0x01.#defi
0b10: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41 ne GSCIS_TAG_MNA
0b20: 4d 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ME
0b30: 20 30 78 30 32 0a 23 64 65 66 69 6e 65 20 47 53 0x02.#define GS
0b40: 43 49 53 5f 54 41 47 5f 4c 4e 41 4d 45 20 20 20 CIS_TAG_LNAME
0b50: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30 33 0x03
0b60: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 .#define GSCIS_T
0b70: 41 47 5f 53 55 46 46 49 58 20 20 20 20 20 20 20 AG_SUFFIX
0b80: 20 20 20 20 20 20 20 30 78 30 34 0a 23 64 65 66 0x04.#def
0b90: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 47 4f ine GSCIS_TAG_GO
0ba0: 56 54 5f 41 47 45 4e 43 59 20 20 20 20 20 20 20 VT_AGENCY
0bb0: 20 20 30 78 30 35 0a 23 64 65 66 69 6e 65 20 47 0x05.#define G
0bc0: 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 20 SCIS_TAG_BUREAU
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30 0x0
0be0: 36 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 6.#define GSCIS_
0bf0: 54 41 47 5f 42 55 52 45 41 55 5f 43 4f 44 45 20 TAG_BUREAU_CODE
0c00: 20 20 20 20 20 20 20 20 30 78 30 37 0a 23 64 65 0x07.#de
0c10: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 44 fine GSCIS_TAG_D
0c20: 45 50 54 5f 43 4f 44 45 20 20 20 20 20 20 20 20 EPT_CODE
0c30: 20 20 20 30 78 30 38 0a 23 64 65 66 69 6e 65 20 0x08.#define
0c40: 47 53 43 49 53 5f 54 41 47 5f 54 49 54 4c 45 20 GSCIS_TAG_TITLE
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 0x
0c60: 30 39 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 09.#define GSCIS
0c70: 5f 54 41 47 5f 42 55 49 4c 44 49 4e 47 20 20 20 _TAG_BUILDING
0c80: 20 20 20 20 20 20 20 20 20 30 78 31 30 0a 23 64 0x10.#d
0c90: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f efine GSCIS_TAG_
0ca0: 4f 46 46 49 43 45 5f 41 44 44 52 31 20 20 20 20 OFFICE_ADDR1
0cb0: 20 20 20 20 30 78 31 31 0a 23 64 65 66 69 6e 65 0x11.#define
0cc0: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 GSCIS_TAG_OFFIC
0cd0: 45 5f 41 44 44 52 32 20 20 20 20 20 20 20 20 30 E_ADDR2 0
0ce0: 78 31 32 0a 23 64 65 66 69 6e 65 20 47 53 43 49 x12.#define GSCI
0cf0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54 S_TAG_OFFICE_CIT
0d00: 59 20 20 20 20 20 20 20 20 20 30 78 31 33 0a 23 Y 0x13.#
0d10: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 define GSCIS_TAG
0d20: 5f 4f 46 46 49 43 45 5f 53 54 41 54 45 20 20 20 _OFFICE_STATE
0d30: 20 20 20 20 20 30 78 31 34 0a 23 64 65 66 69 6e 0x14.#defin
0d40: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 e GSCIS_TAG_OFFI
0d50: 43 45 5f 5a 49 50 20 20 20 20 20 20 20 20 20 20 CE_ZIP
0d60: 30 78 31 35 0a 23 64 65 66 69 6e 65 20 47 53 43 0x15.#define GSC
0d70: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 4f IS_TAG_OFFICE_CO
0d80: 55 4e 54 52 59 20 20 20 20 20 20 30 78 31 36 0a UNTRY 0x16.
0d90: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 #define GSCIS_TA
0da0: 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 20 20 G_OFFICE_PHONE
0db0: 20 20 20 20 20 20 30 78 31 37 0a 23 64 65 66 69 0x17.#defi
0dc0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 ne GSCIS_TAG_OFF
0dd0: 49 43 45 5f 50 48 4f 4e 45 5f 45 58 54 20 20 20 ICE_PHONE_EXT
0de0: 20 30 78 31 38 0a 23 64 65 66 69 6e 65 20 47 53 0x18.#define GS
0df0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 46 CIS_TAG_OFFICE_F
0e00: 41 58 20 20 20 20 20 20 20 20 20 20 30 78 31 39 AX 0x19
0e10: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 .#define GSCIS_T
0e20: 41 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c 20 AG_OFFICE_EMAIL
0e30: 20 20 20 20 20 20 20 30 78 31 41 0a 23 64 65 66 0x1A.#def
0e40: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 ine GSCIS_TAG_OF
0e50: 46 49 43 45 5f 52 4f 4f 4d 20 20 20 20 20 20 20 FICE_ROOM
0e60: 20 20 30 78 31 42 0a 23 64 65 66 69 6e 65 20 47 0x1B.#define G
0e70: 53 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f SCIS_TAG_NONGOV_
0e80: 41 47 45 4e 43 59 20 20 20 20 20 20 20 30 78 31 AGENCY 0x1
0e90: 43 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f C.#define GSCIS_
0ea0: 54 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41 54 TAG_SSN_DESIGNAT
0eb0: 4f 52 20 20 20 20 20 20 30 78 31 44 0a 0a 2f 2a OR 0x1D../*
0ec0: 2a 2a 20 50 49 49 20 2d 20 45 46 20 32 31 30 30 ** PII - EF 2100
0ed0: 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 ***/.#define GS
0ee0: 43 49 53 5f 54 41 47 5f 53 53 4e 20 20 20 20 20 CIS_TAG_SSN
0ef0: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 32 30 0x20
0f00: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 .#define GSCIS_T
0f10: 41 47 5f 44 4f 42 20 20 20 20 20 20 20 20 20 20 AG_DOB
0f20: 20 20 20 20 20 20 20 30 78 32 31 0a 23 64 65 66 0x21.#def
0f30: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 47 45 ine GSCIS_TAG_GE
0f40: 4e 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 NDER
0f50: 20 20 30 78 32 32 0a 0a 2f 2a 2a 2a 20 4c 6f 67 0x22../*** Log
0f60: 69 6e 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d in Information -
0f70: 20 45 46 20 34 30 30 30 20 2a 2a 2a 2f 0a 23 64 EF 4000 ***/.#d
0f80: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f efine GSCIS_TAG_
0f90: 55 53 45 52 49 44 20 20 20 20 20 20 20 20 20 20 USERID
0fa0: 20 20 20 20 30 78 34 30 0a 23 64 65 66 69 6e 65 0x40.#define
0fb0: 20 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49 GSCIS_TAG_DOMAI
0fc0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 N 0
0fd0: 78 34 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49 x41.#define GSCI
0fe0: 53 5f 54 41 47 5f 50 41 53 53 57 4f 52 44 20 20 S_TAG_PASSWORD
0ff0: 20 20 20 20 20 20 20 20 20 20 30 78 34 32 0a 0a 0x42..
1000: 2f 2a 2a 2a 20 43 61 72 64 20 49 6e 66 6f 72 6d /*** Card Inform
1010: 61 74 69 6f 6e 20 2d 20 45 46 20 35 30 30 30 20 ation - EF 5000
1020: 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 ***/.#define GSC
1030: 49 53 5f 54 41 47 5f 49 53 53 55 45 52 49 44 20 IS_TAG_ISSUERID
1040: 20 20 20 20 20 20 20 20 20 20 20 30 78 35 30 0a 0x50.
1050: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 #define GSCIS_TA
1060: 47 5f 53 45 52 4e 4f 20 20 20 20 20 20 20 20 20 G_SERNO
1070: 20 20 20 20 20 20 30 78 35 31 0a 23 64 65 66 69 0x51.#defi
1080: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53 ne GSCIS_TAG_ISS
1090: 55 45 5f 44 41 54 45 20 20 20 20 20 20 20 20 20 UE_DATE
10a0: 20 30 78 35 32 0a 23 64 65 66 69 6e 65 20 47 53 0x52.#define GS
10b0: 43 49 53 5f 54 41 47 5f 45 58 50 49 52 45 5f 44 CIS_TAG_EXPIRE_D
10c0: 41 54 45 20 20 20 20 20 20 20 20 20 30 78 35 33 ATE 0x53
10d0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 .#define GSCIS_T
10e0: 41 47 5f 43 41 52 44 5f 54 59 50 45 20 20 20 20 AG_CARD_TYPE
10f0: 20 20 20 20 20 20 20 30 78 35 34 0a 23 64 65 66 0x54.#def
1100: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53 45 ine GSCIS_TAG_SE
1110: 43 55 52 49 54 59 5f 43 4f 44 45 20 20 20 20 20 CURITY_CODE
1120: 20 20 30 78 35 37 0a 23 64 65 66 69 6e 65 20 47 0x57.#define G
1130: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f SCIS_TAG_CARDID_
1140: 41 49 44 20 20 20 20 20 20 20 20 20 20 30 78 35 AID 0x5
1150: 38 0a 0a 2f 2a 2a 2a 20 50 49 56 20 43 6f 64 65 8../*** PIV Code
1160: 73 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e s ***/.#define N
1170: 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 49 4e ISTSP800_73_3_IN
1180: 53 54 52 5f 47 45 54 5f 44 41 54 41 20 30 78 43 STR_GET_DATA 0xC
1190: 42 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53 50 B.#define NISTSP
11a0: 38 30 30 5f 37 33 5f 33 5f 49 4e 53 54 52 5f 47 800_73_3_INSTR_G
11b0: 45 4e 41 55 54 48 20 20 30 78 38 37 0a 0a 2f 2a ENAUTH 0x87../*
11c0: 2a 2a 20 50 4b 49 20 49 6e 66 6f 72 6d 61 74 69 ** PKI Informati
11d0: 6f 6e 20 2d 20 45 46 20 37 30 30 30 20 2a 2a 2a on - EF 7000 ***
11e0: 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f /.#define GSCIS_
11f0: 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 20 TAG_CERTIFICATE
1200: 20 20 20 20 20 20 20 20 30 78 37 30 0a 23 64 65 0x70.#de
1210: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 fine GSCIS_TAG_C
1220: 45 52 54 5f 49 53 53 55 45 5f 44 41 54 45 20 20 ERT_ISSUE_DATE
1230: 20 20 20 30 78 37 31 0a 23 64 65 66 69 6e 65 20 0x71.#define
1240: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 45 GSCIS_TAG_CERT_E
1250: 58 50 49 52 45 5f 44 41 54 45 20 20 20 20 30 78 XPIRE_DATE 0x
1260: 37 32 0a 0a 2f 2a 2a 20 41 70 70 6c 65 74 20 49 72../** Applet I
1270: 44 73 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 Ds **/.#define G
1280: 53 43 49 53 5f 41 49 44 5f 43 43 43 20 20 20 20 SCIS_AID_CCC
1290: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 41 0xA
12a0: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 0, 0x00, 0x00, 0
12b0: 78 30 31 2c 20 30 78 31 36 2c 20 30 78 44 42 2c x01, 0x16, 0xDB,
12c0: 20 30 78 30 30 0a 23 64 65 66 69 6e 65 20 4e 49 0x00.#define NI
12d0: 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 50 49 56 STSP800_73_3_PIV
12e0: 5f 41 49 44 20 20 20 20 20 20 20 20 30 78 41 30 _AID 0xA0
12f0: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 , 0x00, 0x00, 0x
1300: 30 33 2c 20 30 78 30 38 2c 20 30 78 30 30 2c 20 03, 0x08, 0x00,
1310: 30 78 30 30 2c 20 30 78 31 30 2c 20 30 78 30 30 0x00, 0x10, 0x00
1320: 2c 20 30 78 30 31 2c 20 30 78 30 30 0a 0a 2f 2a , 0x01, 0x00../*
1330: 20 50 49 56 20 49 44 73 20 2a 2f 0a 2f 2a 2a 20 PIV IDs */./**
1340: 4b 65 79 20 49 64 65 6e 74 69 66 69 65 72 73 20 Key Identifiers
1350: 28 4e 49 53 54 20 53 50 20 38 30 30 2d 37 38 2d (NIST SP 800-78-
1360: 33 2c 20 54 61 62 6c 65 20 36 2d 31 20 2a 2a 2f 3, Table 6-1 **/
1370: 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38 .#define NISTSP8
1380: 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 50 49 56 41 00_78_3_KEY_PIVA
1390: 55 54 48 20 20 20 30 78 39 41 0a 23 64 65 66 69 UTH 0x9A.#defi
13a0: 6e 65 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f ne NISTSP800_78_
13b0: 33 5f 4b 45 59 5f 53 49 47 4e 41 54 55 52 45 20 3_KEY_SIGNATURE
13c0: 30 78 39 43 0a 23 64 65 66 69 6e 65 20 4e 49 53 0x9C.#define NIS
13d0: 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f TSP800_78_3_KEY_
13e0: 4b 45 59 4d 47 54 20 20 20 20 30 78 39 44 0a 23 KEYMGT 0x9D.#
13f0: 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30 define NISTSP800
1400: 5f 37 38 5f 33 5f 4b 45 59 5f 43 41 52 44 41 55 _78_3_KEY_CARDAU
1410: 54 48 20 20 30 78 39 45 0a 0a 2f 2a 2a 20 41 6c TH 0x9E../** Al
1420: 67 6f 72 69 74 68 6d 20 49 64 65 6e 74 69 66 69 gorithm Identifi
1430: 65 72 73 20 28 4e 49 53 54 20 53 50 20 38 30 30 ers (NIST SP 800
1440: 2d 37 38 2d 33 2c 20 54 61 62 6c 65 20 36 2d 32 -78-3, Table 6-2
1450: 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 49 53 **/.#define NIS
1460: 54 53 50 38 30 30 5f 37 38 5f 33 5f 41 4c 47 4f TSP800_78_3_ALGO
1470: 5f 52 53 41 31 30 32 34 20 20 30 78 30 36 0a 23 _RSA1024 0x06.#
1480: 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30 define NISTSP800
1490: 5f 37 38 5f 33 5f 41 4c 47 4f 5f 52 53 41 32 30 _78_3_ALGO_RSA20
14a0: 34 38 20 20 30 78 30 37 0a 0a 2f 2a 2a 20 4f 62 48 0x07../** Ob
14b0: 6a 65 63 74 20 49 64 65 6e 74 69 66 69 65 72 73 ject Identifiers
14c0: 20 28 4e 49 53 54 20 53 50 20 38 30 30 2d 37 33 (NIST SP 800-73
14d0: 2d 33 20 50 61 72 74 20 31 2c 20 54 61 62 6c 65 -3 Part 1, Table
14e0: 20 32 29 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 2) **/.#define
14f0: 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f NISTSP800_73_3_O
1500: 49 44 5f 50 49 56 41 55 54 48 20 20 20 30 78 35 ID_PIVAUTH 0x5
1510: 46 2c 20 30 78 43 31 2c 20 30 78 30 35 0a 23 64 F, 0xC1, 0x05.#d
1520: 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f efine NISTSP800_
1530: 37 33 5f 33 5f 4f 49 44 5f 53 49 47 4e 41 54 55 73_3_OID_SIGNATU
1540: 52 45 20 30 78 35 46 2c 20 30 78 43 31 2c 20 30 RE 0x5F, 0xC1, 0
1550: 78 30 41 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 x0A.#define NIST
1560: 53 50 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 4b SP800_73_3_OID_K
1570: 45 59 4d 47 54 20 20 20 20 30 78 35 46 2c 20 30 EYMGT 0x5F, 0
1580: 78 43 31 2c 20 30 78 30 42 0a 23 64 65 66 69 6e xC1, 0x0B.#defin
1590: 65 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 e NISTSP800_73_3
15a0: 5f 4f 49 44 5f 43 41 52 44 41 55 54 48 20 20 30 _OID_CARDAUTH 0
15b0: 78 35 46 2c 20 30 78 43 31 2c 20 30 78 30 31 0a x5F, 0xC1, 0x01.
15c0: 0a 2f 2a 20 4d 61 78 69 6d 75 6d 20 73 69 7a 65 ./* Maximum size
15d0: 20 6f 66 20 64 61 74 61 20 70 6f 72 74 69 6f 6e of data portion
15e0: 20 6f 66 20 41 50 44 55 73 20 2a 2f 0a 2f 2a 2a of APDUs */./**
15f0: 20 44 6f 20 6e 6f 74 20 73 65 74 20 74 68 69 73 Do not set this
1600: 20 61 62 6f 76 65 20 32 35 30 20 2a 2a 2f 0a 23 above 250 **/.#
1610: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 41 50 define CACKEY_AP
1620: 44 55 5f 4d 54 55 20 20 20 20 20 20 20 20 20 20 DU_MTU
1630: 20 20 20 20 20 32 35 30 0a 0a 2f 2a 20 41 54 52 250../* ATR
1640: 20 49 66 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c If not availabl
1650: 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4d 41 58 e */.#ifndef MAX
1660: 5f 41 54 52 5f 53 49 5a 45 0a 23 64 65 66 69 6e _ATR_SIZE.#defin
1670: 65 20 4d 41 58 5f 41 54 52 5f 53 49 5a 45 20 31 e MAX_ATR_SIZE 1
1680: 30 32 34 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 024.#endif..#ifd
1690: 65 66 20 43 41 43 4b 45 59 5f 44 45 42 55 47 0a ef CACKEY_DEBUG.
16a0: 23 20 20 69 66 64 65 66 20 48 41 56 45 5f 54 49 # ifdef HAVE_TI
16b0: 4d 45 5f 48 0a 23 20 20 20 20 69 6e 63 6c 75 64 ME_H.# includ
16c0: 65 20 3c 74 69 6d 65 2e 68 3e 0a 73 74 61 74 69 e <time.h>.stati
16d0: 63 20 74 69 6d 65 5f 74 20 63 61 63 6b 65 79 5f c time_t cackey_
16e0: 64 65 62 75 67 5f 73 74 61 72 74 5f 74 69 6d 65 debug_start_time
16f0: 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 75 6e 73 = 0;.static uns
1700: 69 67 6e 65 64 20 6c 6f 6e 67 20 43 41 43 4b 45 igned long CACKE
1710: 59 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45 28 Y_DEBUG_GETTIME(
1720: 76 6f 69 64 29 20 7b 0a 09 69 66 20 28 63 61 63 void) {..if (cac
1730: 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72 74 5f key_debug_start_
1740: 74 69 6d 65 20 3d 3d 20 30 29 20 7b 0a 09 09 63 time == 0) {...c
1750: 61 63 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72 ackey_debug_star
1760: 74 5f 74 69 6d 65 20 3d 20 74 69 6d 65 28 4e 55 t_time = time(NU
1770: 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e LL);..}...return
1780: 28 74 69 6d 65 28 4e 55 4c 4c 29 20 2d 20 63 61 (time(NULL) - ca
1790: 63 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72 74 ckey_debug_start
17a0: 5f 74 69 6d 65 29 3b 0a 7d 0a 23 20 20 65 6c 73 _time);.}.# els
17b0: 65 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 e.static unsigne
17c0: 64 20 6c 6f 6e 67 20 43 41 43 4b 45 59 5f 44 45 d long CACKEY_DE
17d0: 42 55 47 5f 47 45 54 54 49 4d 45 28 76 6f 69 64 BUG_GETTIME(void
17e0: 29 20 7b 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a ) {..return(0);.
17f0: 7d 0a 23 20 20 65 6e 64 69 66 0a 0a 23 20 20 64 }.# endif..# d
1800: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 efine CACKEY_DEB
1810: 55 47 5f 50 52 49 4e 54 46 28 78 2e 2e 2e 29 20 UG_PRINTF(x...)
1820: 7b 20 5c 0a 09 73 74 61 74 69 63 20 63 68 61 72 { \..static char
1830: 20 62 75 66 5f 75 73 65 72 5b 34 30 39 36 5d 20 buf_user[4096]
1840: 3d 20 7b 30 7d 3b 20 5c 0a 09 73 6e 70 72 69 6e = {0}; \..snprin
1850: 74 66 28 62 75 66 5f 75 73 65 72 2c 20 73 69 7a tf(buf_user, siz
1860: 65 6f 66 28 62 75 66 5f 75 73 65 72 29 2c 20 78 eof(buf_user), x
1870: 29 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72 5b 73 ); \..buf_user[s
1880: 69 7a 65 6f 66 28 62 75 66 5f 75 73 65 72 29 20 izeof(buf_user)
1890: 2d 20 31 5d 20 3d 20 27 5c 30 27 3b 20 5c 0a 09 - 1] = '\0'; \..
18a0: 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 fprintf(cackey_d
18b0: 65 62 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75 ebug_fd(), "[%lu
18c0: 5d 3a 20 25 73 28 29 3a 25 69 3a 20 25 73 5c 6e ]: %s():%i: %s\n
18d0: 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ", CACKEY_DEBUG_
18e0: 47 45 54 54 49 4d 45 28 29 2c 20 5f 5f 66 75 6e GETTIME(), __fun
18f0: 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 2c 20 62 c__, __LINE__, b
1900: 75 66 5f 75 73 65 72 29 3b 20 5c 0a 09 66 66 6c uf_user); \..ffl
1910: 75 73 68 28 63 61 63 6b 65 79 5f 64 65 62 75 67 ush(cackey_debug
1920: 5f 66 64 28 29 29 3b 20 5c 0a 7d 0a 23 20 20 64 _fd()); \.}.# d
1930: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 efine CACKEY_DEB
1940: 55 47 5f 50 52 49 4e 54 42 55 46 28 66 2c 20 78 UG_PRINTBUF(f, x
1950: 2c 20 79 29 20 7b 20 5c 0a 09 73 74 61 74 69 63 , y) { \..static
1960: 20 63 68 61 72 20 62 75 66 5f 75 73 65 72 5b 34 char buf_user[4
1970: 30 39 36 5d 20 3d 20 7b 30 7d 2c 20 2a 62 75 66 096] = {0}, *buf
1980: 5f 75 73 65 72 5f 70 2c 20 2a 62 75 66 5f 75 73 _user_p, *buf_us
1990: 65 72 5f 70 72 69 6e 74 3b 20 5c 0a 09 75 6e 73 er_print; \..uns
19a0: 69 67 6e 65 64 20 6c 6f 6e 67 20 62 75 66 5f 75 igned long buf_u
19b0: 73 65 72 5f 73 69 7a 65 3b 20 5c 0a 09 75 6e 73 ser_size; \..uns
19c0: 69 67 6e 65 64 20 63 68 61 72 20 2a 54 4d 50 42 igned char *TMPB
19d0: 55 46 3b 20 5c 0a 09 75 6e 73 69 67 6e 65 64 20 UF; \..unsigned
19e0: 6c 6f 6e 67 20 69 64 78 3b 20 5c 0a 09 69 6e 74 long idx; \..int
19f0: 20 73 6e 70 72 69 6e 74 66 5f 72 65 74 3b 20 5c snprintf_ret; \
1a00: 0a 09 54 4d 50 42 55 46 20 3d 20 28 75 6e 73 69 ..TMPBUF = (unsi
1a10: 67 6e 65 64 20 63 68 61 72 20 2a 29 20 28 78 29 gned char *) (x)
1a20: 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72 5b 30 5d ; \..buf_user[0]
1a30: 20 3d 20 30 3b 20 5c 0a 09 62 75 66 5f 75 73 65 = 0; \..buf_use
1a40: 72 5b 32 5d 20 3d 20 30 3b 20 5c 0a 09 62 75 66 r[2] = 0; \..buf
1a50: 5f 75 73 65 72 5f 70 20 3d 20 62 75 66 5f 75 73 _user_p = buf_us
1a60: 65 72 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72 5f er; \..buf_user_
1a70: 73 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 62 75 size = sizeof(bu
1a80: 66 5f 75 73 65 72 29 3b 20 5c 0a 09 66 6f 72 20 f_user); \..for
1a90: 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 (idx = 0; idx <
1aa0: 28 79 29 3b 20 69 64 78 2b 2b 29 20 7b 20 5c 0a (y); idx++) { \.
1ab0: 09 09 69 66 20 28 62 75 66 5f 75 73 65 72 5f 73 ..if (buf_user_s
1ac0: 69 7a 65 20 3c 3d 20 30 29 20 7b 20 5c 0a 09 09 ize <= 0) { \...
1ad0: 09 62 72 65 61 6b 3b 20 5c 0a 09 09 7d 3b 20 5c .break; \...}; \
1ae0: 0a 09 09 73 6e 70 72 69 6e 74 66 5f 72 65 74 20 ...snprintf_ret
1af0: 3d 20 73 6e 70 72 69 6e 74 66 28 62 75 66 5f 75 = snprintf(buf_u
1b00: 73 65 72 5f 70 2c 20 62 75 66 5f 75 73 65 72 5f ser_p, buf_user_
1b10: 73 69 7a 65 2c 20 22 2c 20 25 30 32 78 22 2c 20 size, ", %02x",
1b20: 54 4d 50 42 55 46 5b 69 64 78 5d 29 3b 20 5c 0a TMPBUF[idx]); \.
1b30: 09 09 69 66 20 28 73 6e 70 72 69 6e 74 66 5f 72 ..if (snprintf_r
1b40: 65 74 20 3c 3d 20 30 29 20 7b 20 5c 0a 09 09 09 et <= 0) { \....
1b50: 62 72 65 61 6b 3b 20 5c 0a 09 09 7d 3b 20 5c 0a break; \...}; \.
1b60: 09 09 62 75 66 5f 75 73 65 72 5f 70 20 2b 3d 20 ..buf_user_p +=
1b70: 73 6e 70 72 69 6e 74 66 5f 72 65 74 3b 20 5c 0a snprintf_ret; \.
1b80: 09 09 62 75 66 5f 75 73 65 72 5f 73 69 7a 65 20 ..buf_user_size
1b90: 2d 3d 20 73 6e 70 72 69 6e 74 66 5f 72 65 74 3b -= snprintf_ret;
1ba0: 20 5c 0a 09 7d 3b 20 5c 0a 09 62 75 66 5f 75 73 \..}; \..buf_us
1bb0: 65 72 5b 73 69 7a 65 6f 66 28 62 75 66 5f 75 73 er[sizeof(buf_us
1bc0: 65 72 29 20 2d 20 31 5d 20 3d 20 27 5c 30 27 3b er) - 1] = '\0';
1bd0: 20 5c 0a 09 62 75 66 5f 75 73 65 72 5f 70 72 69 \..buf_user_pri
1be0: 6e 74 20 3d 20 62 75 66 5f 75 73 65 72 20 2b 20 nt = buf_user +
1bf0: 32 3b 20 5c 0a 09 66 70 72 69 6e 74 66 28 63 61 2; \..fprintf(ca
1c00: 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c ckey_debug_fd(),
1c10: 20 22 5b 25 6c 75 5d 3a 20 25 73 28 29 3a 25 69 "[%lu]: %s():%i
1c20: 3a 20 25 73 20 20 28 25 73 2f 25 6c 75 20 3d 20 : %s (%s/%lu =
1c30: 7b 25 73 7d 29 5c 6e 22 2c 20 43 41 43 4b 45 59 {%s})\n", CACKEY
1c40: 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45 28 29 _DEBUG_GETTIME()
1c50: 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 , __func__, __LI
1c60: 4e 45 5f 5f 2c 20 66 2c 20 23 78 2c 20 28 75 6e NE__, f, #x, (un
1c70: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 79 29 signed long) (y)
1c80: 2c 20 62 75 66 5f 75 73 65 72 5f 70 72 69 6e 74 , buf_user_print
1c90: 29 3b 20 5c 0a 09 66 66 6c 75 73 68 28 63 61 63 ); \..fflush(cac
1ca0: 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 29 3b key_debug_fd());
1cb0: 20 5c 0a 7d 0a 23 20 20 64 65 66 69 6e 65 20 66 \.}.# define f
1cc0: 72 65 65 28 78 29 20 7b 20 43 41 43 4b 45 59 5f ree(x) { CACKEY_
1cd0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 52 DEBUG_PRINTF("FR
1ce0: 45 45 28 25 70 29 20 28 25 73 29 22 2c 20 28 76 EE(%p) (%s)", (v
1cf0: 6f 69 64 20 2a 29 20 78 2c 20 23 78 29 3b 20 66 oid *) x, #x); f
1d00: 72 65 65 28 78 29 3b 20 7d 0a 0a 73 74 61 74 69 ree(x); }..stati
1d10: 63 20 46 49 4c 45 20 2a 63 61 63 6b 65 79 5f 64 c FILE *cackey_d
1d20: 65 62 75 67 5f 66 64 28 76 6f 69 64 29 20 7b 0a ebug_fd(void) {.
1d30: 09 73 74 61 74 69 63 20 46 49 4c 45 20 2a 66 64 .static FILE *fd
1d40: 20 3d 20 4e 55 4c 4c 3b 0a 09 63 68 61 72 20 2a = NULL;..char *
1d50: 6c 6f 67 66 69 6c 65 3b 0a 0a 09 69 66 20 28 66 logfile;...if (f
1d60: 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 d != NULL) {...r
1d70: 65 74 75 72 6e 28 66 64 29 3b 0a 09 7d 0a 0a 09 eturn(fd);..}...
1d80: 2f 2a 0a 09 20 2a 20 4c 6f 67 20 74 6f 20 73 74 /*.. * Log to st
1d90: 64 65 72 72 20 69 6e 69 74 69 61 6c 6c 79 20 73 derr initially s
1da0: 6f 20 77 65 20 63 61 6e 20 75 73 65 20 64 65 62 o we can use deb
1db0: 75 67 67 69 6e 67 20 77 69 74 68 69 6e 0a 09 20 ugging within..
1dc0: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 * this function
1dd0: 77 69 74 68 6f 75 74 20 67 65 74 74 69 6e 67 20 without getting
1de0: 69 6e 74 6f 20 61 6e 20 69 6e 66 69 6e 69 74 65 into an infinite
1df0: 20 6c 6f 6f 70 0a 09 20 2a 2f 0a 09 66 64 20 3d loop.. */..fd =
1e00: 20 73 74 64 65 72 72 3b 0a 0a 09 6c 6f 67 66 69 stderr;...logfi
1e10: 6c 65 20 3d 20 67 65 74 65 6e 76 28 22 43 41 43 le = getenv("CAC
1e20: 4b 45 59 5f 44 45 42 55 47 5f 4c 4f 47 46 49 4c KEY_DEBUG_LOGFIL
1e30: 45 22 29 3b 0a 09 69 66 20 28 6c 6f 67 66 69 6c E");..if (logfil
1e40: 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 e != NULL) {...C
1e50: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1e60: 54 46 28 22 46 6f 75 6e 64 20 65 6e 76 69 72 6f TF("Found enviro
1e70: 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 3a 20 nment variable:
1e80: 25 73 22 2c 20 6c 6f 67 66 69 6c 65 29 3b 0a 0a %s", logfile);..
1e90: 09 09 6c 6f 67 66 69 6c 65 20 3d 20 73 74 72 63 ..logfile = strc
1ea0: 68 72 28 6c 6f 67 66 69 6c 65 2c 20 27 3d 27 29 hr(logfile, '=')
1eb0: 3b 0a 09 09 69 66 20 28 6c 6f 67 66 69 6c 65 20 ;...if (logfile
1ec0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 6c 6f == NULL) {....lo
1ed0: 67 66 69 6c 65 20 3d 20 67 65 74 65 6e 76 28 22 gfile = getenv("
1ee0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 4c 4f 47 CACKEY_DEBUG_LOG
1ef0: 46 49 4c 45 22 29 3b 0a 09 09 7d 20 65 6c 73 65 FILE");...} else
1f00: 20 7b 0a 09 09 09 6c 6f 67 66 69 6c 65 2b 2b 3b {....logfile++;
1f10: 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20 ...}..}..#ifdef
1f20: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 4c 4f 47 CACKEY_DEBUG_LOG
1f30: 46 49 4c 45 0a 09 69 66 20 28 6c 6f 67 66 69 6c FILE..if (logfil
1f40: 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6c e == NULL) {...l
1f50: 6f 67 66 69 6c 65 20 3d 20 43 41 43 4b 45 59 5f ogfile = CACKEY_
1f60: 44 45 42 55 47 5f 4c 4f 47 46 49 4c 45 3b 0a 09 DEBUG_LOGFILE;..
1f70: 7d 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28 6c }.#endif...if (l
1f80: 6f 67 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 ogfile != NULL)
1f90: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
1fa0: 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 6c _PRINTF("Found l
1fb0: 6f 67 20 66 69 6c 65 3a 20 25 73 22 2c 20 6c 6f og file: %s", lo
1fc0: 67 66 69 6c 65 29 3b 0a 0a 09 09 66 64 20 3d 20 gfile);....fd =
1fd0: 66 6f 70 65 6e 28 6c 6f 67 66 69 6c 65 2c 20 22 fopen(logfile, "
1fe0: 61 22 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 66 64 a");..}...if (fd
1ff0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 64 == NULL) {...fd
2000: 20 3d 20 73 74 64 65 72 72 3b 0a 09 7d 0a 0a 09 = stderr;..}...
2010: 69 66 20 28 66 64 20 3d 3d 20 73 74 64 65 72 72 if (fd == stderr
2020: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
2030: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
2040: 6e 69 6e 67 20 73 74 64 65 72 72 22 29 3b 0a 09 ning stderr");..
2050: 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b 45 } else {...CACKE
2060: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
2070: 52 65 74 75 72 6e 69 6e 67 20 25 70 22 2c 20 28 Returning %p", (
2080: 76 6f 69 64 20 2a 29 20 66 64 29 3b 0a 09 7d 0a void *) fd);..}.
2090: 0a 09 72 65 74 75 72 6e 28 66 64 29 3b 0a 7d 0a ..return(fd);.}.
20a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 43 41 .static void *CA
20b0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f CKEY_DEBUG_FUNC_
20c0: 4d 41 4c 4c 4f 43 28 73 69 7a 65 5f 74 20 73 69 MALLOC(size_t si
20d0: 7a 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a ze, const char *
20e0: 66 75 6e 63 2c 20 69 6e 74 20 6c 69 6e 65 29 20 func, int line)
20f0: 7b 0a 09 76 6f 69 64 20 2a 72 65 74 76 61 6c 3b {..void *retval;
2100: 0a 0a 09 72 65 74 76 61 6c 20 3d 20 6d 61 6c 6c ...retval = mall
2110: 6f 63 28 73 69 7a 65 29 3b 0a 0a 09 66 70 72 69 oc(size);...fpri
2120: 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67 ntf(cackey_debug
2130: 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d 3a 20 25 _fd(), "[%lu]: %
2140: 73 28 29 3a 25 69 3a 20 4d 41 4c 4c 4f 43 28 29 s():%i: MALLOC()
2150: 20 3d 20 25 70 5c 6e 22 2c 20 43 41 43 4b 45 59 = %p\n", CACKEY
2160: 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45 28 29 _DEBUG_GETTIME()
2170: 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 2c 20 72 65 , func, line, re
2180: 74 76 61 6c 29 3b 0a 09 66 66 6c 75 73 68 28 63 tval);..fflush(c
2190: 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 ackey_debug_fd()
21a0: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 );...return(retv
21b0: 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 al);.}..static v
21c0: 6f 69 64 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 oid *CACKEY_DEBU
21d0: 47 5f 46 55 4e 43 5f 52 45 41 4c 4c 4f 43 28 76 G_FUNC_REALLOC(v
21e0: 6f 69 64 20 2a 70 74 72 2c 20 73 69 7a 65 5f 74 oid *ptr, size_t
21f0: 20 73 69 7a 65 2c 20 63 6f 6e 73 74 20 63 68 61 size, const cha
2200: 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20 6c 69 6e r *func, int lin
2210: 65 29 20 7b 0a 09 76 6f 69 64 20 2a 72 65 74 76 e) {..void *retv
2220: 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20 72 al;...retval = r
2230: 65 61 6c 6c 6f 63 28 70 74 72 2c 20 73 69 7a 65 ealloc(ptr, size
2240: 29 3b 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20 );...if (retval
2250: 21 3d 20 70 74 72 29 20 7b 0a 09 09 66 70 72 69 != ptr) {...fpri
2260: 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67 ntf(cackey_debug
2270: 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d 3a 20 25 _fd(), "[%lu]: %
2280: 73 28 29 3a 25 69 3a 20 52 45 41 4c 4c 4f 43 28 s():%i: REALLOC(
2290: 25 70 29 20 3d 20 25 70 5c 6e 22 2c 20 43 41 43 %p) = %p\n", CAC
22a0: 4b 45 59 5f 44 45 42 55 47 5f 47 45 54 54 49 4d KEY_DEBUG_GETTIM
22b0: 45 28 29 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 2c E(), func, line,
22c0: 20 70 74 72 2c 20 72 65 74 76 61 6c 29 3b 0a 09 ptr, retval);..
22d0: 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f 64 .fflush(cackey_d
22e0: 65 62 75 67 5f 66 64 28 29 29 3b 0a 09 7d 0a 0a ebug_fd());..}..
22f0: 09 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 4e .if (retval == N
2300: 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f ULL) {...CACKEY_
2310: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2a DEBUG_PRINTF(" *
2320: 2a 2a 20 45 52 52 4f 52 20 2a 2a 2a 20 72 65 61 ** ERROR *** rea
2330: 6c 6c 6f 63 20 72 65 74 75 72 6e 65 64 20 4e 55 lloc returned NU
2340: 4c 4c 20 28 73 69 7a 65 20 3d 20 25 6c 75 29 22 LL (size = %lu)"
2350: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
2360: 29 20 73 69 7a 65 29 3b 0a 09 7d 0a 0a 09 72 65 ) size);..}...re
2370: 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a turn(retval);.}.
2380: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 43 41 .static char *CA
2390: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f CKEY_DEBUG_FUNC_
23a0: 53 54 52 44 55 50 28 63 6f 6e 73 74 20 63 68 61 STRDUP(const cha
23b0: 72 20 2a 70 74 72 2c 20 63 6f 6e 73 74 20 63 68 r *ptr, const ch
23c0: 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20 6c 69 ar *func, int li
23d0: 6e 65 29 20 7b 0a 09 63 68 61 72 20 2a 72 65 74 ne) {..char *ret
23e0: 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20 val;...retval =
23f0: 73 74 72 64 75 70 28 70 74 72 29 3b 0a 0a 09 66 strdup(ptr);...f
2400: 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 printf(cackey_de
2410: 62 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d bug_fd(), "[%lu]
2420: 3a 20 25 73 28 29 3a 25 69 3a 20 53 54 52 44 55 : %s():%i: STRDU
2430: 50 5f 4d 41 4c 4c 4f 43 28 29 20 3d 20 25 70 5c P_MALLOC() = %p\
2440: 6e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 n", CACKEY_DEBUG
2450: 5f 47 45 54 54 49 4d 45 28 29 2c 20 66 75 6e 63 _GETTIME(), func
2460: 2c 20 6c 69 6e 65 2c 20 72 65 74 76 61 6c 29 3b , line, retval);
2470: 0a 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f ..fflush(cackey_
2480: 64 65 62 75 67 5f 66 64 28 29 29 3b 0a 0a 09 72 debug_fd());...r
2490: 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d eturn(retval);.}
24a0: 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 ..static const c
24b0: 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 har *CACKEY_DEBU
24c0: 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 G_FUNC_TAG_TO_ST
24d0: 52 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 R(unsigned char
24e0: 74 61 67 29 20 7b 0a 09 73 77 69 74 63 68 20 28 tag) {..switch (
24f0: 74 61 67 29 20 7b 0a 09 09 63 61 73 65 20 47 53 tag) {...case GS
2500: 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 3a 0a CIS_TAG_CARDID:.
2510: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 ...return("GSCIS
2520: 5f 54 41 47 5f 43 41 52 44 49 44 22 29 3b 0a 09 _TAG_CARDID");..
2530: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f .case GSCIS_TAG_
2540: 43 43 43 5f 56 45 52 3a 0a 09 09 09 72 65 74 75 CCC_VER:....retu
2550: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 43 rn("GSCIS_TAG_CC
2560: 43 5f 56 45 52 22 29 3b 0a 09 09 63 61 73 65 20 C_VER");...case
2570: 47 53 43 49 53 5f 54 41 47 5f 43 43 47 5f 56 45 GSCIS_TAG_CCG_VE
2580: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 R:....return("GS
2590: 43 49 53 5f 54 41 47 5f 43 43 47 5f 56 45 52 22 CIS_TAG_CCG_VER"
25a0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f );...case GSCIS_
25b0: 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09 TAG_CARDURL:....
25c0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 return("GSCIS_TA
25d0: 47 5f 43 41 52 44 55 52 4c 22 29 3b 0a 09 09 63 G_CARDURL");...c
25e0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b ase GSCIS_TAG_PK
25f0: 43 53 31 35 3a 0a 09 09 09 72 65 74 75 72 6e 28 CS15:....return(
2600: 22 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 53 31 "GSCIS_TAG_PKCS1
2610: 35 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 5");...case GSCI
2620: 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 41 5f 4d S_TAG_REG_DATA_M
2630: 4f 44 45 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 ODEL:....return(
2640: 22 47 53 43 49 53 5f 54 41 47 5f 52 45 47 5f 44 "GSCIS_TAG_REG_D
2650: 41 54 41 5f 4d 4f 44 45 4c 22 29 3b 0a 09 09 63 ATA_MODEL");...c
2660: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43 ase GSCIS_TAG_AC
2670: 52 5f 54 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 R_TABLE:....retu
2680: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 41 43 rn("GSCIS_TAG_AC
2690: 52 5f 54 41 42 4c 45 22 29 3b 0a 09 09 63 61 73 R_TABLE");...cas
26a0: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 e GSCIS_TAG_CARD
26b0: 5f 41 50 44 55 3a 0a 09 09 09 72 65 74 75 72 6e _APDU:....return
26c0: 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 ("GSCIS_TAG_CARD
26d0: 5f 41 50 44 55 22 29 3b 0a 09 09 63 61 73 65 20 _APDU");...case
26e0: 47 53 43 49 53 5f 54 41 47 5f 52 45 44 49 52 45 GSCIS_TAG_REDIRE
26f0: 43 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72 6e CTION:....return
2700: 28 22 47 53 43 49 53 5f 54 41 47 5f 52 45 44 49 ("GSCIS_TAG_REDI
2710: 52 45 43 54 49 4f 4e 22 29 3b 0a 09 09 63 61 73 RECTION");...cas
2720: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 54 3a 0a e GSCIS_TAG_CT:.
2730: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 ...return("GSCIS
2740: 5f 54 41 47 5f 43 54 22 29 3b 0a 09 09 63 61 73 _TAG_CT");...cas
2750: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 54 3a 0a e GSCIS_TAG_ST:.
2760: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 ...return("GSCIS
2770: 5f 54 41 47 5f 53 54 22 29 3b 0a 09 09 63 61 73 _TAG_ST");...cas
2780: 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54 e GSCIS_TAG_NEXT
2790: 43 43 43 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 CCC:....return("
27a0: 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54 43 43 GSCIS_TAG_NEXTCC
27b0: 43 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 C");...case GSCI
27c0: 53 5f 54 41 47 5f 46 4e 41 4d 45 3a 0a 09 09 09 S_TAG_FNAME:....
27d0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 return("GSCIS_TA
27e0: 47 5f 46 4e 41 4d 45 22 29 3b 0a 09 09 63 61 73 G_FNAME");...cas
27f0: 65 20 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41 4d e GSCIS_TAG_MNAM
2800: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 E:....return("GS
2810: 43 49 53 5f 54 41 47 5f 4d 4e 41 4d 45 22 29 3b CIS_TAG_MNAME");
2820: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 ...case GSCIS_TA
2830: 47 5f 4c 4e 41 4d 45 3a 0a 09 09 09 72 65 74 75 G_LNAME:....retu
2840: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4c 4e rn("GSCIS_TAG_LN
2850: 41 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 AME");...case GS
2860: 43 49 53 5f 54 41 47 5f 53 55 46 46 49 58 3a 0a CIS_TAG_SUFFIX:.
2870: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 ...return("GSCIS
2880: 5f 54 41 47 5f 53 55 46 46 49 58 22 29 3b 0a 09 _TAG_SUFFIX");..
2890: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f .case GSCIS_TAG_
28a0: 47 4f 56 54 5f 41 47 45 4e 43 59 3a 0a 09 09 09 GOVT_AGENCY:....
28b0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 return("GSCIS_TA
28c0: 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59 22 29 3b G_GOVT_AGENCY");
28d0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 ...case GSCIS_TA
28e0: 47 5f 42 55 52 45 41 55 3a 0a 09 09 09 72 65 74 G_BUREAU:....ret
28f0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 42 urn("GSCIS_TAG_B
2900: 55 52 45 41 55 22 29 3b 0a 09 09 63 61 73 65 20 UREAU");...case
2910: 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 GSCIS_TAG_BUREAU
2920: 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75 72 6e _CODE:....return
2930: 28 22 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45 ("GSCIS_TAG_BURE
2940: 41 55 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61 73 AU_CODE");...cas
2950: 65 20 47 53 43 49 53 5f 54 41 47 5f 44 45 50 54 e GSCIS_TAG_DEPT
2960: 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75 72 6e _CODE:....return
2970: 28 22 47 53 43 49 53 5f 54 41 47 5f 44 45 50 54 ("GSCIS_TAG_DEPT
2980: 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61 73 65 20 _CODE");...case
2990: 47 53 43 49 53 5f 54 41 47 5f 54 49 54 4c 45 3a GSCIS_TAG_TITLE:
29a0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 ....return("GSCI
29b0: 53 5f 54 41 47 5f 54 49 54 4c 45 22 29 3b 0a 09 S_TAG_TITLE");..
29c0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f .case GSCIS_TAG_
29d0: 42 55 49 4c 44 49 4e 47 3a 0a 09 09 09 72 65 74 BUILDING:....ret
29e0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 42 urn("GSCIS_TAG_B
29f0: 55 49 4c 44 49 4e 47 22 29 3b 0a 09 09 63 61 73 UILDING");...cas
2a00: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 e GSCIS_TAG_OFFI
2a10: 43 45 5f 41 44 44 52 31 3a 0a 09 09 09 72 65 74 CE_ADDR1:....ret
2a20: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f urn("GSCIS_TAG_O
2a30: 46 46 49 43 45 5f 41 44 44 52 31 22 29 3b 0a 09 FFICE_ADDR1");..
2a40: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f .case GSCIS_TAG_
2a50: 4f 46 46 49 43 45 5f 41 44 44 52 32 3a 0a 09 09 OFFICE_ADDR2:...
2a60: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 .return("GSCIS_T
2a70: 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 32 22 AG_OFFICE_ADDR2"
2a80: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f );...case GSCIS_
2a90: 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54 59 3a TAG_OFFICE_CITY:
2aa0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 ....return("GSCI
2ab0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54 S_TAG_OFFICE_CIT
2ac0: 59 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 Y");...case GSCI
2ad0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53 54 41 S_TAG_OFFICE_STA
2ae0: 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 TE:....return("G
2af0: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f SCIS_TAG_OFFICE_
2b00: 53 54 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 STATE");...case
2b10: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 GSCIS_TAG_OFFICE
2b20: 5f 5a 49 50 3a 0a 09 09 09 72 65 74 75 72 6e 28 _ZIP:....return(
2b30: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 "GSCIS_TAG_OFFIC
2b40: 45 5f 5a 49 50 22 29 3b 0a 09 09 63 61 73 65 20 E_ZIP");...case
2b50: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 GSCIS_TAG_OFFICE
2b60: 5f 43 4f 55 4e 54 52 59 3a 0a 09 09 09 72 65 74 _COUNTRY:....ret
2b70: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f urn("GSCIS_TAG_O
2b80: 46 46 49 43 45 5f 43 4f 55 4e 54 52 59 22 29 3b FFICE_COUNTRY");
2b90: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 ...case GSCIS_TA
2ba0: 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 3a 0a G_OFFICE_PHONE:.
2bb0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 ...return("GSCIS
2bc0: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e _TAG_OFFICE_PHON
2bd0: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 E");...case GSCI
2be0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f S_TAG_OFFICE_PHO
2bf0: 4e 45 5f 45 58 54 3a 0a 09 09 09 72 65 74 75 72 NE_EXT:....retur
2c00: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 n("GSCIS_TAG_OFF
2c10: 49 43 45 5f 50 48 4f 4e 45 5f 45 58 54 22 29 3b ICE_PHONE_EXT");
2c20: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 ...case GSCIS_TA
2c30: 47 5f 4f 46 46 49 43 45 5f 46 41 58 3a 0a 09 09 G_OFFICE_FAX:...
2c40: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 .return("GSCIS_T
2c50: 41 47 5f 4f 46 46 49 43 45 5f 46 41 58 22 29 3b AG_OFFICE_FAX");
2c60: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 ...case GSCIS_TA
2c70: 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c 3a 0a G_OFFICE_EMAIL:.
2c80: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 ...return("GSCIS
2c90: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 _TAG_OFFICE_EMAI
2ca0: 4c 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 L");...case GSCI
2cb0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52 4f 4f S_TAG_OFFICE_ROO
2cc0: 4d 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 M:....return("GS
2cd0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52 CIS_TAG_OFFICE_R
2ce0: 4f 4f 4d 22 29 3b 0a 09 09 63 61 73 65 20 47 53 OOM");...case GS
2cf0: 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f 41 CIS_TAG_NONGOV_A
2d00: 47 45 4e 43 59 3a 0a 09 09 09 72 65 74 75 72 6e GENCY:....return
2d10: 28 22 47 53 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 ("GSCIS_TAG_NONG
2d20: 4f 56 5f 41 47 45 4e 43 59 22 29 3b 0a 09 09 63 OV_AGENCY");...c
2d30: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53 53 ase GSCIS_TAG_SS
2d40: 4e 5f 44 45 53 49 47 4e 41 54 4f 52 3a 0a 09 09 N_DESIGNATOR:...
2d50: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 .return("GSCIS_T
2d60: 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41 54 4f AG_SSN_DESIGNATO
2d70: 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 R");...case GSCI
2d80: 53 5f 54 41 47 5f 53 53 4e 3a 0a 09 09 09 72 65 S_TAG_SSN:....re
2d90: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f turn("GSCIS_TAG_
2da0: 53 53 4e 22 29 3b 0a 09 09 63 61 73 65 20 47 53 SSN");...case GS
2db0: 43 49 53 5f 54 41 47 5f 44 4f 42 3a 0a 09 09 09 CIS_TAG_DOB:....
2dc0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 return("GSCIS_TA
2dd0: 47 5f 44 4f 42 22 29 3b 0a 09 09 63 61 73 65 20 G_DOB");...case
2de0: 47 53 43 49 53 5f 54 41 47 5f 47 45 4e 44 45 52 GSCIS_TAG_GENDER
2df0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 :....return("GSC
2e00: 49 53 5f 54 41 47 5f 47 45 4e 44 45 52 22 29 3b IS_TAG_GENDER");
2e10: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 ...case GSCIS_TA
2e20: 47 5f 55 53 45 52 49 44 3a 0a 09 09 09 72 65 74 G_USERID:....ret
2e30: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 55 urn("GSCIS_TAG_U
2e40: 53 45 52 49 44 22 29 3b 0a 09 09 63 61 73 65 20 SERID");...case
2e50: 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49 4e GSCIS_TAG_DOMAIN
2e60: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 :....return("GSC
2e70: 49 53 5f 54 41 47 5f 44 4f 4d 41 49 4e 22 29 3b IS_TAG_DOMAIN");
2e80: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 ...case GSCIS_TA
2e90: 47 5f 50 41 53 53 57 4f 52 44 3a 0a 09 09 09 72 G_PASSWORD:....r
2ea0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 eturn("GSCIS_TAG
2eb0: 5f 50 41 53 53 57 4f 52 44 22 29 3b 0a 09 09 63 _PASSWORD");...c
2ec0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53 ase GSCIS_TAG_IS
2ed0: 53 55 45 52 49 44 3a 0a 09 09 09 72 65 74 75 72 SUERID:....retur
2ee0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 49 53 53 n("GSCIS_TAG_ISS
2ef0: 55 45 52 49 44 22 29 3b 0a 09 09 63 61 73 65 20 UERID");...case
2f00: 47 53 43 49 53 5f 54 41 47 5f 53 45 52 4e 4f 3a GSCIS_TAG_SERNO:
2f10: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 ....return("GSCI
2f20: 53 5f 54 41 47 5f 53 45 52 4e 4f 22 29 3b 0a 09 S_TAG_SERNO");..
2f30: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f .case GSCIS_TAG_
2f40: 49 53 53 55 45 5f 44 41 54 45 3a 0a 09 09 09 72 ISSUE_DATE:....r
2f50: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 eturn("GSCIS_TAG
2f60: 5f 49 53 53 55 45 5f 44 41 54 45 22 29 3b 0a 09 _ISSUE_DATE");..
2f70: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f .case GSCIS_TAG_
2f80: 45 58 50 49 52 45 5f 44 41 54 45 3a 0a 09 09 09 EXPIRE_DATE:....
2f90: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 return("GSCIS_TA
2fa0: 47 5f 45 58 50 49 52 45 5f 44 41 54 45 22 29 3b G_EXPIRE_DATE");
2fb0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 ...case GSCIS_TA
2fc0: 47 5f 43 41 52 44 5f 54 59 50 45 3a 0a 09 09 09 G_CARD_TYPE:....
2fd0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 return("GSCIS_TA
2fe0: 47 5f 43 41 52 44 5f 54 59 50 45 22 29 3b 0a 09 G_CARD_TYPE");..
2ff0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f .case GSCIS_TAG_
3000: 53 45 43 55 52 49 54 59 5f 43 4f 44 45 3a 0a 09 SECURITY_CODE:..
3010: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f ..return("GSCIS_
3020: 54 41 47 5f 53 45 43 55 52 49 54 59 5f 43 4f 44 TAG_SECURITY_COD
3030: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 E");...case GSCI
3040: 53 5f 54 41 47 5f 43 41 52 44 49 44 5f 41 49 44 S_TAG_CARDID_AID
3050: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 :....return("GSC
3060: 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f 41 49 IS_TAG_CARDID_AI
3070: 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 D");...case GSCI
3080: 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 S_TAG_CERTIFICAT
3090: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 E:....return("GS
30a0: 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 CIS_TAG_CERTIFIC
30b0: 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 ATE");...case GS
30c0: 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 49 53 53 CIS_TAG_CERT_ISS
30d0: 55 45 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75 UE_DATE:....retu
30e0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 45 rn("GSCIS_TAG_CE
30f0: 52 54 5f 49 53 53 55 45 5f 44 41 54 45 22 29 3b RT_ISSUE_DATE");
3100: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 ...case GSCIS_TA
3110: 47 5f 43 45 52 54 5f 45 58 50 49 52 45 5f 44 41 G_CERT_EXPIRE_DA
3120: 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 TE:....return("G
3130: 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 45 58 SCIS_TAG_CERT_EX
3140: 50 49 52 45 5f 44 41 54 45 22 29 3b 0a 09 7d 0a PIRE_DATE");..}.
3150: 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 ..return("UNKNOW
3160: 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 N");.}..static c
3170: 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43 4b 45 onst char *CACKE
3180: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 Y_DEBUG_FUNC_SCA
3190: 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 4c 4f 4e RDERR_TO_STR(LON
31a0: 47 20 72 65 74 63 6f 64 65 29 20 7b 0a 09 73 77 G retcode) {..sw
31b0: 69 74 63 68 20 28 72 65 74 63 6f 64 65 29 20 7b itch (retcode) {
31c0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 53 5f ...case SCARD_S_
31d0: 53 55 43 43 45 53 53 3a 0a 09 09 09 72 65 74 75 SUCCESS:....retu
31e0: 72 6e 28 22 53 43 41 52 44 5f 53 5f 53 55 43 43 rn("SCARD_S_SUCC
31f0: 45 53 53 22 29 3b 0a 09 09 63 61 73 65 20 53 43 ESS");...case SC
3200: 41 52 44 5f 45 5f 43 41 4e 43 45 4c 4c 45 44 3a ARD_E_CANCELLED:
3210: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 ....return("SCAR
3220: 44 5f 45 5f 43 41 4e 43 45 4c 4c 45 44 22 29 3b D_E_CANCELLED");
3230: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f ...case SCARD_E_
3240: 43 41 4e 54 5f 44 49 53 50 4f 53 45 3a 0a 09 09 CANT_DISPOSE:...
3250: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 .return("SCARD_E
3260: 5f 43 41 4e 54 5f 44 49 53 50 4f 53 45 22 29 3b _CANT_DISPOSE");
3270: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f ...case SCARD_E_
3280: 49 4e 53 55 46 46 49 43 49 45 4e 54 5f 42 55 46 INSUFFICIENT_BUF
3290: 46 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 FER:....return("
32a0: 53 43 41 52 44 5f 45 5f 49 4e 53 55 46 46 49 43 SCARD_E_INSUFFIC
32b0: 49 45 4e 54 5f 42 55 46 46 45 52 22 29 3b 0a 09 IENT_BUFFER");..
32c0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e .case SCARD_E_IN
32d0: 56 41 4c 49 44 5f 41 54 52 3a 0a 09 09 09 72 65 VALID_ATR:....re
32e0: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e turn("SCARD_E_IN
32f0: 56 41 4c 49 44 5f 41 54 52 22 29 3b 0a 09 09 63 VALID_ATR");...c
3300: 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 ase SCARD_E_INVA
3310: 4c 49 44 5f 48 41 4e 44 4c 45 3a 0a 09 09 09 72 LID_HANDLE:....r
3320: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 eturn("SCARD_E_I
3330: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 22 29 3b NVALID_HANDLE");
3340: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f ...case SCARD_E_
3350: 49 4e 56 41 4c 49 44 5f 50 41 52 41 4d 45 54 45 INVALID_PARAMETE
3360: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 R:....return("SC
3370: 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 50 41 ARD_E_INVALID_PA
3380: 52 41 4d 45 54 45 52 22 29 3b 0a 09 09 63 61 73 RAMETER");...cas
3390: 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 e SCARD_E_INVALI
33a0: 44 5f 54 41 52 47 45 54 3a 0a 09 09 09 72 65 74 D_TARGET:....ret
33b0: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 urn("SCARD_E_INV
33c0: 41 4c 49 44 5f 54 41 52 47 45 54 22 29 3b 0a 09 ALID_TARGET");..
33d0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e .case SCARD_E_IN
33e0: 56 41 4c 49 44 5f 56 41 4c 55 45 3a 0a 09 09 09 VALID_VALUE:....
33f0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f return("SCARD_E_
3400: 49 4e 56 41 4c 49 44 5f 56 41 4c 55 45 22 29 3b INVALID_VALUE");
3410: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f ...case SCARD_E_
3420: 4e 4f 5f 4d 45 4d 4f 52 59 3a 0a 09 09 09 72 65 NO_MEMORY:....re
3430: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f turn("SCARD_E_NO
3440: 5f 4d 45 4d 4f 52 59 22 29 3b 0a 09 09 63 61 73 _MEMORY");...cas
3450: 65 20 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 e SCARD_E_UNKNOW
3460: 4e 5f 52 45 41 44 45 52 3a 0a 09 09 09 72 65 74 N_READER:....ret
3470: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e 4b urn("SCARD_E_UNK
3480: 4e 4f 57 4e 5f 52 45 41 44 45 52 22 29 3b 0a 09 NOWN_READER");..
3490: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 54 49 .case SCARD_E_TI
34a0: 4d 45 4f 55 54 3a 0a 09 09 09 72 65 74 75 72 6e MEOUT:....return
34b0: 28 22 53 43 41 52 44 5f 45 5f 54 49 4d 45 4f 55 ("SCARD_E_TIMEOU
34c0: 54 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 T");...case SCAR
34d0: 44 5f 45 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c D_E_SHARING_VIOL
34e0: 41 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72 6e ATION:....return
34f0: 28 22 53 43 41 52 44 5f 45 5f 53 48 41 52 49 4e ("SCARD_E_SHARIN
3500: 47 5f 56 49 4f 4c 41 54 49 4f 4e 22 29 3b 0a 09 G_VIOLATION");..
3510: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f .case SCARD_E_NO
3520: 5f 53 4d 41 52 54 43 41 52 44 3a 0a 09 09 09 72 _SMARTCARD:....r
3530: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e eturn("SCARD_E_N
3540: 4f 5f 53 4d 41 52 54 43 41 52 44 22 29 3b 0a 09 O_SMARTCARD");..
3550: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 55 4e .case SCARD_E_UN
3560: 4b 4e 4f 57 4e 5f 43 41 52 44 3a 0a 09 09 09 72 KNOWN_CARD:....r
3570: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55 eturn("SCARD_E_U
3580: 4e 4b 4e 4f 57 4e 5f 43 41 52 44 22 29 3b 0a 09 NKNOWN_CARD");..
3590: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 50 52 .case SCARD_E_PR
35a0: 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 3a 0a 09 09 OTO_MISMATCH:...
35b0: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 .return("SCARD_E
35c0: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 22 _PROTO_MISMATCH"
35d0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f );...case SCARD_
35e0: 45 5f 4e 4f 54 5f 52 45 41 44 59 3a 0a 09 09 09 E_NOT_READY:....
35f0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f return("SCARD_E_
3600: 4e 4f 54 5f 52 45 41 44 59 22 29 3b 0a 09 09 63 NOT_READY");...c
3610: 61 73 65 20 53 43 41 52 44 5f 45 5f 53 59 53 54 ase SCARD_E_SYST
3620: 45 4d 5f 43 41 4e 43 45 4c 4c 45 44 3a 0a 09 09 EM_CANCELLED:...
3630: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 .return("SCARD_E
3640: 5f 53 59 53 54 45 4d 5f 43 41 4e 43 45 4c 4c 45 _SYSTEM_CANCELLE
3650: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 D");...case SCAR
3660: 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41 43 54 D_E_NOT_TRANSACT
3670: 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 ED:....return("S
3680: 43 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 CARD_E_NOT_TRANS
3690: 41 43 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20 ACTED");...case
36a0: 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55 SCARD_E_READER_U
36b0: 4e 41 56 41 49 4c 41 42 4c 45 3a 0a 09 09 09 72 NAVAILABLE:....r
36c0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 52 eturn("SCARD_E_R
36d0: 45 41 44 45 52 5f 55 4e 41 56 41 49 4c 41 42 4c EADER_UNAVAILABL
36e0: 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 E");...case SCAR
36f0: 44 5f 57 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f D_W_UNSUPPORTED_
3700: 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 CARD:....return(
3710: 22 53 43 41 52 44 5f 57 5f 55 4e 53 55 50 50 4f "SCARD_W_UNSUPPO
3720: 52 54 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63 RTED_CARD");...c
3730: 61 73 65 20 53 43 41 52 44 5f 57 5f 55 4e 52 45 ase SCARD_W_UNRE
3740: 53 50 4f 4e 53 49 56 45 5f 43 41 52 44 3a 0a 09 SPONSIVE_CARD:..
3750: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f ..return("SCARD_
3760: 57 5f 55 4e 52 45 53 50 4f 4e 53 49 56 45 5f 43 W_UNRESPONSIVE_C
3770: 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 ARD");...case SC
3780: 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f ARD_W_UNPOWERED_
3790: 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 CARD:....return(
37a0: 22 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 "SCARD_W_UNPOWER
37b0: 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 ED_CARD");...cas
37c0: 65 20 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f e SCARD_W_RESET_
37d0: 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 CARD:....return(
37e0: 22 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f 43 "SCARD_W_RESET_C
37f0: 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 ARD");...case SC
3800: 41 52 44 5f 57 5f 52 45 4d 4f 56 45 44 5f 43 41 ARD_W_REMOVED_CA
3810: 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 RD:....return("S
3820: 43 41 52 44 5f 57 5f 52 45 4d 4f 56 45 44 5f 43 CARD_W_REMOVED_C
3830: 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 ARD");...case SC
3840: 41 52 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f 53 4d ARD_E_PCI_TOO_SM
3850: 41 4c 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 ALL:....return("
3860: 53 43 41 52 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f SCARD_E_PCI_TOO_
3870: 53 4d 41 4c 4c 22 29 3b 0a 09 09 63 61 73 65 20 SMALL");...case
3880: 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55 SCARD_E_READER_U
3890: 4e 53 55 50 50 4f 52 54 45 44 3a 0a 09 09 09 72 NSUPPORTED:....r
38a0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 52 eturn("SCARD_E_R
38b0: 45 41 44 45 52 5f 55 4e 53 55 50 50 4f 52 54 45 EADER_UNSUPPORTE
38c0: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 D");...case SCAR
38d0: 44 5f 45 5f 44 55 50 4c 49 43 41 54 45 5f 52 45 D_E_DUPLICATE_RE
38e0: 41 44 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 ADER:....return(
38f0: 22 53 43 41 52 44 5f 45 5f 44 55 50 4c 49 43 41 "SCARD_E_DUPLICA
3900: 54 45 5f 52 45 41 44 45 52 22 29 3b 0a 09 09 63 TE_READER");...c
3910: 61 73 65 20 53 43 41 52 44 5f 45 5f 43 41 52 44 ase SCARD_E_CARD
3920: 5f 55 4e 53 55 50 50 4f 52 54 45 44 3a 0a 09 09 _UNSUPPORTED:...
3930: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 .return("SCARD_E
3940: 5f 43 41 52 44 5f 55 4e 53 55 50 50 4f 52 54 45 _CARD_UNSUPPORTE
3950: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 D");...case SCAR
3960: 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45 3a 0a D_E_NO_SERVICE:.
3970: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 ...return("SCARD
3980: 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45 22 29 3b _E_NO_SERVICE");
3990: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f ...case SCARD_E_
39a0: 53 45 52 56 49 43 45 5f 53 54 4f 50 50 45 44 3a SERVICE_STOPPED:
39b0: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 ....return("SCAR
39c0: 44 5f 45 5f 53 45 52 56 49 43 45 5f 53 54 4f 50 D_E_SERVICE_STOP
39d0: 50 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 PED");...case SC
39e0: 41 52 44 5f 45 5f 55 4e 53 55 50 50 4f 52 54 45 ARD_E_UNSUPPORTE
39f0: 44 5f 46 45 41 54 55 52 45 3a 0a 09 09 09 72 65 D_FEATURE:....re
3a00: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e turn("SCARD_E_UN
3a10: 53 55 50 50 4f 52 54 45 44 5f 46 45 41 54 55 52 SUPPORTED_FEATUR
3a20: 45 22 29 3b 0a 23 69 66 64 65 66 20 53 43 41 52 E");.#ifdef SCAR
3a30: 44 5f 57 5f 49 4e 53 45 52 54 45 44 5f 43 41 52 D_W_INSERTED_CAR
3a40: 44 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 57 D...case SCARD_W
3a50: 5f 49 4e 53 45 52 54 45 44 5f 43 41 52 44 3a 0a _INSERTED_CARD:.
3a60: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 ...return("SCARD
3a70: 5f 57 5f 49 4e 53 45 52 54 45 44 5f 43 41 52 44 _W_INSERTED_CARD
3a80: 22 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 ");.#endif.#ifde
3a90: 66 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 52 45 41 f SCARD_E_NO_REA
3aa0: 44 45 52 53 5f 41 56 41 49 4c 41 42 4c 45 0a 09 DERS_AVAILABLE..
3ab0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f .case SCARD_E_NO
3ac0: 5f 52 45 41 44 45 52 53 5f 41 56 41 49 4c 41 42 _READERS_AVAILAB
3ad0: 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 LE:....return("S
3ae0: 43 41 52 44 5f 45 5f 4e 4f 5f 52 45 41 44 45 52 CARD_E_NO_READER
3af0: 53 5f 41 56 41 49 4c 41 42 4c 45 22 29 3b 0a 23 S_AVAILABLE");.#
3b00: 65 6e 64 69 66 0a 09 7d 0a 0a 09 72 65 74 75 72 endif..}...retur
3b10: 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a n("UNKNOWN");.}.
3b20: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 .static const ch
3b30: 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 ar *CACKEY_DEBUG
3b40: 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 _FUNC_OBJID_TO_S
3b50: 54 52 28 75 69 6e 74 31 36 5f 74 20 6f 62 6a 69 TR(uint16_t obji
3b60: 64 29 20 7b 0a 09 73 77 69 74 63 68 20 28 6f 62 d) {..switch (ob
3b70: 6a 69 64 29 20 7b 0a 09 09 63 61 73 65 20 30 78 jid) {...case 0x
3b80: 32 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 2000:....return(
3b90: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 "CACKEY_TLV_OBJI
3ba0: 44 5f 47 45 4e 45 52 41 4c 49 4e 46 4f 22 29 3b D_GENERALINFO");
3bb0: 0a 09 09 63 61 73 65 20 30 78 32 31 30 30 3a 0a ...case 0x2100:.
3bc0: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 ...return("CACKE
3bd0: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 50 52 4f 50 Y_TLV_OBJID_PROP
3be0: 45 52 53 4f 4e 41 4c 49 4e 46 4f 22 29 3b 0a 09 ERSONALINFO");..
3bf0: 09 63 61 73 65 20 30 78 33 30 30 30 3a 0a 09 09 .case 0x3000:...
3c00: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f .return("CACKEY_
3c10: 54 4c 56 5f 4f 42 4a 49 44 5f 41 43 43 45 53 53 TLV_OBJID_ACCESS
3c20: 43 4f 4e 54 52 4f 4c 22 29 3b 0a 09 09 63 61 73 CONTROL");...cas
3c30: 65 20 30 78 34 30 30 30 3a 0a 09 09 09 72 65 74 e 0x4000:....ret
3c40: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f urn("CACKEY_TLV_
3c50: 4f 42 4a 49 44 5f 4c 4f 47 49 4e 22 29 3b 0a 09 OBJID_LOGIN");..
3c60: 09 63 61 73 65 20 30 78 35 30 30 30 3a 0a 09 09 .case 0x5000:...
3c70: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f .return("CACKEY_
3c80: 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 52 44 49 4e TLV_OBJID_CARDIN
3c90: 46 4f 22 29 3b 0a 09 09 63 61 73 65 20 30 78 36 FO");...case 0x6
3ca0: 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 000:....return("
3cb0: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 CACKEY_TLV_OBJID
3cc0: 5f 42 49 4f 4d 45 54 52 49 43 53 22 29 3b 0a 09 _BIOMETRICS");..
3cd0: 09 63 61 73 65 20 30 78 37 30 30 30 3a 0a 09 09 .case 0x7000:...
3ce0: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f .return("CACKEY_
3cf0: 54 4c 56 5f 4f 42 4a 49 44 5f 44 49 47 49 54 41 TLV_OBJID_DIGITA
3d00: 4c 53 49 47 43 45 52 54 22 29 3b 0a 09 09 63 61 LSIGCERT");...ca
3d10: 73 65 20 30 78 30 32 30 30 3a 0a 09 09 09 72 65 se 0x0200:....re
3d20: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 turn("CACKEY_TLV
3d30: 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f _OBJID_CAC_PERSO
3d40: 4e 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32 N");...case 0x02
3d50: 30 32 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 02:....return("C
3d60: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f ACKEY_TLV_OBJID_
3d70: 43 41 43 5f 42 45 4e 45 46 49 54 53 22 29 3b 0a CAC_BENEFITS");.
3d80: 09 09 63 61 73 65 20 30 78 30 32 30 33 3a 0a 09 ..case 0x0203:..
3d90: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 ..return("CACKEY
3da0: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f _TLV_OBJID_CAC_O
3db0: 54 48 45 52 42 45 4e 45 46 49 54 53 22 29 3b 0a THERBENEFITS");.
3dc0: 09 09 63 61 73 65 20 30 78 30 32 30 31 3a 0a 09 ..case 0x0201:..
3dd0: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 ..return("CACKEY
3de0: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 _TLV_OBJID_CAC_P
3df0: 45 52 53 4f 4e 4e 45 4c 22 29 3b 0a 09 09 63 61 ERSONNEL");...ca
3e00: 73 65 20 30 78 30 32 46 45 3a 0a 09 09 09 72 65 se 0x02FE:....re
3e10: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 turn("CACKEY_TLV
3e20: 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 4b 49 43 45 _OBJID_CAC_PKICE
3e30: 52 54 22 29 3b 0a 09 7d 0a 09 0a 09 72 65 74 75 RT");..}....retu
3e40: 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d rn("UNKNOWN");.}
3e50: 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 ..static const c
3e60: 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 har *CACKEY_DEBU
3e70: 47 5f 46 55 4e 43 5f 41 50 50 54 59 50 45 5f 54 G_FUNC_APPTYPE_T
3e80: 4f 5f 53 54 52 28 75 69 6e 74 38 5f 74 20 61 70 O_STR(uint8_t ap
3e90: 70 74 79 70 65 29 20 7b 0a 09 73 77 69 74 63 68 ptype) {..switch
3ea0: 20 28 61 70 70 74 79 70 65 29 20 7b 0a 09 09 63 (apptype) {...c
3eb0: 61 73 65 20 30 78 30 30 3a 0a 09 09 09 72 65 74 ase 0x00:....ret
3ec0: 75 72 6e 28 22 4e 4f 4e 45 22 29 3b 0a 09 09 63 urn("NONE");...c
3ed0: 61 73 65 20 30 78 30 31 3a 0a 09 09 09 72 65 74 ase 0x01:....ret
3ee0: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f urn("CACKEY_TLV_
3ef0: 41 50 50 5f 47 45 4e 45 52 49 43 22 29 3b 0a 09 APP_GENERIC");..
3f00: 09 63 61 73 65 20 30 78 30 32 3a 0a 09 09 09 72 .case 0x02:....r
3f10: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c eturn("CACKEY_TL
3f20: 56 5f 41 50 50 5f 53 4b 49 22 29 3b 0a 09 09 63 V_APP_SKI");...c
3f30: 61 73 65 20 30 78 30 33 3a 0a 09 09 09 72 65 74 ase 0x03:....ret
3f40: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f urn("CACKEY_TLV_
3f50: 41 50 50 5f 47 45 4e 45 52 49 43 20 7c 20 43 41 APP_GENERIC | CA
3f60: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 CKEY_TLV_APP_SKI
3f70: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 34 3a ");...case 0x04:
3f80: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b ....return("CACK
3f90: 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29 EY_TLV_APP_PKI")
3fa0: 3b 0a 09 09 63 61 73 65 20 30 78 30 35 3a 0a 09 ;...case 0x05:..
3fb0: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 ..return("CACKEY
3fc0: 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 _TLV_APP_GENERIC
3fd0: 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 | CACKEY_TLV_AP
3fe0: 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 P_PKI");...case
3ff0: 30 78 30 36 3a 0a 09 09 09 72 65 74 75 72 6e 28 0x06:....return(
4000: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f "CACKEY_TLV_APP_
4010: 53 4b 49 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 SKI | CACKEY_TLV
4020: 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61 _APP_PKI");...ca
4030: 73 65 20 30 78 30 37 3a 0a 09 09 09 72 65 74 75 se 0x07:....retu
4040: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 rn("CACKEY_TLV_A
4050: 50 50 5f 47 45 4e 45 52 49 43 20 7c 20 43 41 43 PP_GENERIC | CAC
4060: 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 20 KEY_TLV_APP_SKI
4070: 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 | CACKEY_TLV_APP
4080: 5f 50 4b 49 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 _PKI");..}...ret
4090: 75 72 6e 28 22 49 4e 56 41 4c 49 44 22 29 3b 0a urn("INVALID");.
40a0: 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 }..static const
40b0: 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 char *CACKEY_DEB
40c0: 55 47 5f 46 55 4e 43 5f 41 54 54 52 49 42 55 54 UG_FUNC_ATTRIBUT
40d0: 45 5f 54 4f 5f 53 54 52 28 43 4b 5f 41 54 54 52 E_TO_STR(CK_ATTR
40e0: 49 42 55 54 45 5f 54 59 50 45 20 61 74 74 72 29 IBUTE_TYPE attr)
40f0: 20 7b 0a 09 73 77 69 74 63 68 20 28 61 74 74 72 {..switch (attr
4100: 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 41 5f 43 ) {...case CKA_C
4110: 4c 41 53 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 LASS:....return(
4120: 22 43 4b 41 5f 43 4c 41 53 53 22 29 3b 0a 09 09 "CKA_CLASS");...
4130: 63 61 73 65 20 43 4b 41 5f 54 4f 4b 45 4e 3a 0a case CKA_TOKEN:.
4140: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 54 ...return("CKA_T
4150: 4f 4b 45 4e 22 29 3b 0a 09 09 63 61 73 65 20 43 OKEN");...case C
4160: 4b 41 5f 50 52 49 56 41 54 45 3a 0a 09 09 09 72 KA_PRIVATE:....r
4170: 65 74 75 72 6e 28 22 43 4b 41 5f 50 52 49 56 41 eturn("CKA_PRIVA
4180: 54 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 TE");...case CKA
4190: 5f 4c 41 42 45 4c 3a 0a 09 09 09 72 65 74 75 72 _LABEL:....retur
41a0: 6e 28 22 43 4b 41 5f 4c 41 42 45 4c 22 29 3b 0a n("CKA_LABEL");.
41b0: 09 09 63 61 73 65 20 43 4b 41 5f 41 50 50 4c 49 ..case CKA_APPLI
41c0: 43 41 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72 CATION:....retur
41d0: 6e 28 22 43 4b 41 5f 41 50 50 4c 49 43 41 54 49 n("CKA_APPLICATI
41e0: 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 ON");...case CKA
41f0: 5f 56 41 4c 55 45 3a 0a 09 09 09 72 65 74 75 72 _VALUE:....retur
4200: 6e 28 22 43 4b 41 5f 56 41 4c 55 45 22 29 3b 0a n("CKA_VALUE");.
4210: 09 09 63 61 73 65 20 43 4b 41 5f 4f 42 4a 45 43 ..case CKA_OBJEC
4220: 54 5f 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 T_ID:....return(
4230: 22 43 4b 41 5f 4f 42 4a 45 43 54 5f 49 44 22 29 "CKA_OBJECT_ID")
4240: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52 ;...case CKA_CER
4250: 54 49 46 49 43 41 54 45 5f 54 59 50 45 3a 0a 09 TIFICATE_TYPE:..
4260: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 43 45 ..return("CKA_CE
4270: 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 22 29 RTIFICATE_TYPE")
4280: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 49 53 53 ;...case CKA_ISS
4290: 55 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 UER:....return("
42a0: 43 4b 41 5f 49 53 53 55 45 52 22 29 3b 0a 09 09 CKA_ISSUER");...
42b0: 63 61 73 65 20 43 4b 41 5f 53 45 52 49 41 4c 5f case CKA_SERIAL_
42c0: 4e 55 4d 42 45 52 3a 0a 09 09 09 72 65 74 75 72 NUMBER:....retur
42d0: 6e 28 22 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 n("CKA_SERIAL_NU
42e0: 4d 42 45 52 22 29 3b 0a 09 09 63 61 73 65 20 43 MBER");...case C
42f0: 4b 41 5f 41 43 5f 49 53 53 55 45 52 3a 0a 09 09 KA_AC_ISSUER:...
4300: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 41 43 5f .return("CKA_AC_
4310: 49 53 53 55 45 52 22 29 3b 0a 09 09 63 61 73 65 ISSUER");...case
4320: 20 43 4b 41 5f 4f 57 4e 45 52 3a 0a 09 09 09 72 CKA_OWNER:....r
4330: 65 74 75 72 6e 28 22 43 4b 41 5f 4f 57 4e 45 52 eturn("CKA_OWNER
4340: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 41 ");...case CKA_A
4350: 54 54 52 5f 54 59 50 45 53 3a 0a 09 09 09 72 65 TTR_TYPES:....re
4360: 74 75 72 6e 28 22 43 4b 41 5f 41 54 54 52 5f 54 turn("CKA_ATTR_T
4370: 59 50 45 53 22 29 3b 0a 09 09 63 61 73 65 20 43 YPES");...case C
4380: 4b 41 5f 54 52 55 53 54 45 44 3a 0a 09 09 09 72 KA_TRUSTED:....r
4390: 65 74 75 72 6e 28 22 43 4b 41 5f 54 52 55 53 54 eturn("CKA_TRUST
43a0: 45 44 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 ED");...case CKA
43b0: 5f 4b 45 59 5f 54 59 50 45 3a 0a 09 09 09 72 65 _KEY_TYPE:....re
43c0: 74 75 72 6e 28 22 43 4b 41 5f 4b 45 59 5f 54 59 turn("CKA_KEY_TY
43d0: 50 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 PE");...case CKA
43e0: 5f 53 55 42 4a 45 43 54 3a 0a 09 09 09 72 65 74 _SUBJECT:....ret
43f0: 75 72 6e 28 22 43 4b 41 5f 53 55 42 4a 45 43 54 urn("CKA_SUBJECT
4400: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 49 ");...case CKA_I
4410: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b D:....return("CK
4420: 41 5f 49 44 22 29 3b 0a 09 09 63 61 73 65 20 43 A_ID");...case C
4430: 4b 41 5f 53 45 4e 53 49 54 49 56 45 3a 0a 09 09 KA_SENSITIVE:...
4440: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 45 4e .return("CKA_SEN
4450: 53 49 54 49 56 45 22 29 3b 0a 09 09 63 61 73 65 SITIVE");...case
4460: 20 43 4b 41 5f 45 4e 43 52 59 50 54 3a 0a 09 09 CKA_ENCRYPT:...
4470: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 4e 43 .return("CKA_ENC
4480: 52 59 50 54 22 29 3b 0a 09 09 63 61 73 65 20 43 RYPT");...case C
4490: 4b 41 5f 44 45 43 52 59 50 54 3a 0a 09 09 09 72 KA_DECRYPT:....r
44a0: 65 74 75 72 6e 28 22 43 4b 41 5f 44 45 43 52 59 eturn("CKA_DECRY
44b0: 50 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 PT");...case CKA
44c0: 5f 57 52 41 50 3a 0a 09 09 09 72 65 74 75 72 6e _WRAP:....return
44d0: 28 22 43 4b 41 5f 57 52 41 50 22 29 3b 0a 09 09 ("CKA_WRAP");...
44e0: 63 61 73 65 20 43 4b 41 5f 55 4e 57 52 41 50 3a case CKA_UNWRAP:
44f0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f ....return("CKA_
4500: 55 4e 57 52 41 50 22 29 3b 0a 09 09 63 61 73 65 UNWRAP");...case
4510: 20 43 4b 41 5f 53 49 47 4e 3a 0a 09 09 09 72 65 CKA_SIGN:....re
4520: 74 75 72 6e 28 22 43 4b 41 5f 53 49 47 4e 22 29 turn("CKA_SIGN")
4530: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53 49 47 ;...case CKA_SIG
4540: 4e 5f 52 45 43 4f 56 45 52 3a 0a 09 09 09 72 65 N_RECOVER:....re
4550: 74 75 72 6e 28 22 43 4b 41 5f 53 49 47 4e 5f 52 turn("CKA_SIGN_R
4560: 45 43 4f 56 45 52 22 29 3b 0a 09 09 63 61 73 65 ECOVER");...case
4570: 20 43 4b 41 5f 56 45 52 49 46 59 3a 0a 09 09 09 CKA_VERIFY:....
4580: 72 65 74 75 72 6e 28 22 43 4b 41 5f 56 45 52 49 return("CKA_VERI
4590: 46 59 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 FY");...case CKA
45a0: 5f 56 45 52 49 46 59 5f 52 45 43 4f 56 45 52 3a _VERIFY_RECOVER:
45b0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f ....return("CKA_
45c0: 56 45 52 49 46 59 5f 52 45 43 4f 56 45 52 22 29 VERIFY_RECOVER")
45d0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 44 45 52 ;...case CKA_DER
45e0: 49 56 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 IVE:....return("
45f0: 43 4b 41 5f 44 45 52 49 56 45 22 29 3b 0a 09 09 CKA_DERIVE");...
4600: 63 61 73 65 20 43 4b 41 5f 53 54 41 52 54 5f 44 case CKA_START_D
4610: 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 ATE:....return("
4620: 43 4b 41 5f 53 54 41 52 54 5f 44 41 54 45 22 29 CKA_START_DATE")
4630: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 4e 44 ;...case CKA_END
4640: 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e _DATE:....return
4650: 28 22 43 4b 41 5f 45 4e 44 5f 44 41 54 45 22 29 ("CKA_END_DATE")
4660: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 ;...case CKA_MOD
4670: 55 4c 55 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 ULUS:....return(
4680: 22 43 4b 41 5f 4d 4f 44 55 4c 55 53 22 29 3b 0a "CKA_MODULUS");.
4690: 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55 4c ..case CKA_MODUL
46a0: 55 53 5f 42 49 54 53 3a 0a 09 09 09 72 65 74 75 US_BITS:....retu
46b0: 72 6e 28 22 43 4b 41 5f 4d 4f 44 55 4c 55 53 5f rn("CKA_MODULUS_
46c0: 42 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20 43 BITS");...case C
46d0: 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45 KA_PUBLIC_EXPONE
46e0: 4e 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 NT:....return("C
46f0: 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45 KA_PUBLIC_EXPONE
4700: 4e 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 NT");...case CKA
4710: 5f 50 52 49 56 41 54 45 5f 45 58 50 4f 4e 45 4e _PRIVATE_EXPONEN
4720: 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b T:....return("CK
4730: 41 5f 50 52 49 56 41 54 45 5f 45 58 50 4f 4e 45 A_PRIVATE_EXPONE
4740: 4e 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 NT");...case CKA
4750: 5f 50 52 49 4d 45 5f 31 3a 0a 09 09 09 72 65 74 _PRIME_1:....ret
4760: 75 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f 31 urn("CKA_PRIME_1
4770: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 ");...case CKA_P
4780: 52 49 4d 45 5f 32 3a 0a 09 09 09 72 65 74 75 72 RIME_2:....retur
4790: 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f 32 22 29 n("CKA_PRIME_2")
47a0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 58 50 ;...case CKA_EXP
47b0: 4f 4e 45 4e 54 5f 31 3a 0a 09 09 09 72 65 74 75 ONENT_1:....retu
47c0: 72 6e 28 22 43 4b 41 5f 45 58 50 4f 4e 45 4e 54 rn("CKA_EXPONENT
47d0: 5f 31 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 _1");...case CKA
47e0: 5f 45 58 50 4f 4e 45 4e 54 5f 32 3a 0a 09 09 09 _EXPONENT_2:....
47f0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 58 50 4f return("CKA_EXPO
4800: 4e 45 4e 54 5f 32 22 29 3b 0a 09 09 63 61 73 65 NENT_2");...case
4810: 20 43 4b 41 5f 43 4f 45 46 46 49 43 49 45 4e 54 CKA_COEFFICIENT
4820: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 :....return("CKA
4830: 5f 43 4f 45 46 46 49 43 49 45 4e 54 22 29 3b 0a _COEFFICIENT");.
4840: 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49 4d 45 ..case CKA_PRIME
4850: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 :....return("CKA
4860: 5f 50 52 49 4d 45 22 29 3b 0a 09 09 63 61 73 65 _PRIME");...case
4870: 20 43 4b 41 5f 53 55 42 50 52 49 4d 45 3a 0a 09 CKA_SUBPRIME:..
4880: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 55 ..return("CKA_SU
4890: 42 50 52 49 4d 45 22 29 3b 0a 09 09 63 61 73 65 BPRIME");...case
48a0: 20 43 4b 41 5f 42 41 53 45 3a 0a 09 09 09 72 65 CKA_BASE:....re
48b0: 74 75 72 6e 28 22 43 4b 41 5f 42 41 53 45 22 29 turn("CKA_BASE")
48c0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49 ;...case CKA_PRI
48d0: 4d 45 5f 42 49 54 53 3a 0a 09 09 09 72 65 74 75 ME_BITS:....retu
48e0: 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f 42 49 rn("CKA_PRIME_BI
48f0: 54 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 TS");...case CKA
4900: 5f 53 55 42 5f 50 52 49 4d 45 5f 42 49 54 53 3a _SUB_PRIME_BITS:
4910: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f ....return("CKA_
4920: 53 55 42 5f 50 52 49 4d 45 5f 42 49 54 53 22 29 SUB_PRIME_BITS")
4930: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56 41 4c ;...case CKA_VAL
4940: 55 45 5f 42 49 54 53 3a 0a 09 09 09 72 65 74 75 UE_BITS:....retu
4950: 72 6e 28 22 43 4b 41 5f 56 41 4c 55 45 5f 42 49 rn("CKA_VALUE_BI
4960: 54 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 TS");...case CKA
4970: 5f 56 41 4c 55 45 5f 4c 45 4e 3a 0a 09 09 09 72 _VALUE_LEN:....r
4980: 65 74 75 72 6e 28 22 43 4b 41 5f 56 41 4c 55 45 eturn("CKA_VALUE
4990: 5f 4c 45 4e 22 29 3b 0a 09 09 63 61 73 65 20 43 _LEN");...case C
49a0: 4b 41 5f 45 58 54 52 41 43 54 41 42 4c 45 3a 0a KA_EXTRACTABLE:.
49b0: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 ...return("CKA_E
49c0: 58 54 52 41 43 54 41 42 4c 45 22 29 3b 0a 09 09 XTRACTABLE");...
49d0: 63 61 73 65 20 43 4b 41 5f 4c 4f 43 41 4c 3a 0a case CKA_LOCAL:.
49e0: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4c ...return("CKA_L
49f0: 4f 43 41 4c 22 29 3b 0a 09 09 63 61 73 65 20 43 OCAL");...case C
4a00: 4b 41 5f 4e 45 56 45 52 5f 45 58 54 52 41 43 54 KA_NEVER_EXTRACT
4a10: 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 ABLE:....return(
4a20: 22 43 4b 41 5f 4e 45 56 45 52 5f 45 58 54 52 41 "CKA_NEVER_EXTRA
4a30: 43 54 41 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 CTABLE");...case
4a40: 20 43 4b 41 5f 41 4c 57 41 59 53 5f 53 45 4e 53 CKA_ALWAYS_SENS
4a50: 49 54 49 56 45 3a 0a 09 09 09 72 65 74 75 72 6e ITIVE:....return
4a60: 28 22 43 4b 41 5f 41 4c 57 41 59 53 5f 53 45 4e ("CKA_ALWAYS_SEN
4a70: 53 49 54 49 56 45 22 29 3b 0a 09 09 63 61 73 65 SITIVE");...case
4a80: 20 43 4b 41 5f 4b 45 59 5f 47 45 4e 5f 4d 45 43 CKA_KEY_GEN_MEC
4a90: 48 41 4e 49 53 4d 3a 0a 09 09 09 72 65 74 75 72 HANISM:....retur
4aa0: 6e 28 22 43 4b 41 5f 4b 45 59 5f 47 45 4e 5f 4d n("CKA_KEY_GEN_M
4ab0: 45 43 48 41 4e 49 53 4d 22 29 3b 0a 09 09 63 61 ECHANISM");...ca
4ac0: 73 65 20 43 4b 41 5f 4d 4f 44 49 46 49 41 42 4c se CKA_MODIFIABL
4ad0: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b E:....return("CK
4ae0: 41 5f 4d 4f 44 49 46 49 41 42 4c 45 22 29 3b 0a A_MODIFIABLE");.
4af0: 09 09 63 61 73 65 20 43 4b 41 5f 45 43 44 53 41 ..case CKA_ECDSA
4b00: 5f 50 41 52 41 4d 53 3a 0a 09 09 09 72 65 74 75 _PARAMS:....retu
4b10: 72 6e 28 22 43 4b 41 5f 45 43 44 53 41 5f 50 41 rn("CKA_ECDSA_PA
4b20: 52 41 4d 53 22 29 3b 0a 09 09 63 61 73 65 20 43 RAMS");...case C
4b30: 4b 41 5f 45 43 5f 50 4f 49 4e 54 3a 0a 09 09 09 KA_EC_POINT:....
4b40: 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 43 5f 50 return("CKA_EC_P
4b50: 4f 49 4e 54 22 29 3b 0a 09 09 63 61 73 65 20 43 OINT");...case C
4b60: 4b 41 5f 53 45 43 4f 4e 44 41 52 59 5f 41 55 54 KA_SECONDARY_AUT
4b70: 48 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b H:....return("CK
4b80: 41 5f 53 45 43 4f 4e 44 41 52 59 5f 41 55 54 48 A_SECONDARY_AUTH
4b90: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 41 ");...case CKA_A
4ba0: 55 54 48 5f 50 49 4e 5f 46 4c 41 47 53 3a 0a 09 UTH_PIN_FLAGS:..
4bb0: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 41 55 ..return("CKA_AU
4bc0: 54 48 5f 50 49 4e 5f 46 4c 41 47 53 22 29 3b 0a TH_PIN_FLAGS");.
4bd0: 09 09 63 61 73 65 20 43 4b 41 5f 48 57 5f 46 45 ..case CKA_HW_FE
4be0: 41 54 55 52 45 5f 54 59 50 45 3a 0a 09 09 09 72 ATURE_TYPE:....r
4bf0: 65 74 75 72 6e 28 22 43 4b 41 5f 48 57 5f 46 45 eturn("CKA_HW_FE
4c00: 41 54 55 52 45 5f 54 59 50 45 22 29 3b 0a 09 09 ATURE_TYPE");...
4c10: 63 61 73 65 20 43 4b 41 5f 52 45 53 45 54 5f 4f case CKA_RESET_O
4c20: 4e 5f 49 4e 49 54 3a 0a 09 09 09 72 65 74 75 72 N_INIT:....retur
4c30: 6e 28 22 43 4b 41 5f 52 45 53 45 54 5f 4f 4e 5f n("CKA_RESET_ON_
4c40: 49 4e 49 54 22 29 3b 0a 09 09 63 61 73 65 20 43 INIT");...case C
4c50: 4b 41 5f 48 41 53 5f 52 45 53 45 54 3a 0a 09 09 KA_HAS_RESET:...
4c60: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 48 41 53 .return("CKA_HAS
4c70: 5f 52 45 53 45 54 22 29 3b 0a 09 09 63 61 73 65 _RESET");...case
4c80: 20 43 4b 41 5f 56 45 4e 44 4f 52 5f 44 45 46 49 CKA_VENDOR_DEFI
4c90: 4e 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 NED:....return("
4ca0: 43 4b 41 5f 56 45 4e 44 4f 52 5f 44 45 46 49 4e CKA_VENDOR_DEFIN
4cb0: 45 44 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 ED");..}...retur
4cc0: 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a n("UNKNOWN");.}.
4cd0: 0a 23 20 20 64 65 66 69 6e 65 20 6d 61 6c 6c 6f .# define mallo
4ce0: 63 28 78 29 20 43 41 43 4b 45 59 5f 44 45 42 55 c(x) CACKEY_DEBU
4cf0: 47 5f 46 55 4e 43 5f 4d 41 4c 4c 4f 43 28 78 2c G_FUNC_MALLOC(x,
4d00: 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e __func__, __LIN
4d10: 45 5f 5f 29 0a 23 20 20 64 65 66 69 6e 65 20 72 E__).# define r
4d20: 65 61 6c 6c 6f 63 28 78 2c 20 79 29 20 43 41 43 ealloc(x, y) CAC
4d30: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 52 KEY_DEBUG_FUNC_R
4d40: 45 41 4c 4c 4f 43 28 78 2c 20 79 2c 20 5f 5f 66 EALLOC(x, y, __f
4d50: 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 unc__, __LINE__)
4d60: 0a 23 20 20 69 66 64 65 66 20 73 74 72 64 75 70 .# ifdef strdup
4d70: 0a 23 20 20 20 20 75 6e 64 65 66 20 73 74 72 64 .# undef strd
4d80: 75 70 0a 23 20 20 65 6e 64 69 66 0a 23 20 20 64 up.# endif.# d
4d90: 65 66 69 6e 65 20 73 74 72 64 75 70 28 78 29 20 efine strdup(x)
4da0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e CACKEY_DEBUG_FUN
4db0: 43 5f 53 54 52 44 55 50 28 78 2c 20 5f 5f 66 75 C_STRDUP(x, __fu
4dc0: 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a nc__, __LINE__).
4dd0: 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 #else.# define
4de0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
4df0: 4e 54 46 28 78 2e 2e 2e 29 20 2f 2a 2a 2f 0a 23 NTF(x...) /**/.#
4e00: 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f define CACKEY_
4e10: 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 66 DEBUG_PRINTBUF(f
4e20: 2c 20 78 2c 20 79 29 20 2f 2a 2a 2f 0a 23 20 20 , x, y) /**/.#
4e30: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 define CACKEY_DE
4e40: 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f BUG_FUNC_TAG_TO_
4e50: 53 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 STR(x) "DEBUG_DI
4e60: 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e SABLED".# defin
4e70: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 e CACKEY_DEBUG_F
4e80: 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f UNC_SCARDERR_TO_
4e90: 53 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 STR(x) "DEBUG_DI
4ea0: 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e SABLED".# defin
4eb0: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 e CACKEY_DEBUG_F
4ec0: 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 UNC_OBJID_TO_STR
4ed0: 28 78 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 (x) "DEBUG_DISAB
4ee0: 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43 LED".# define C
4ef0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 ACKEY_DEBUG_FUNC
4f00: 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53 54 52 28 _APPTYPE_TO_STR(
4f10: 78 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c x) "DEBUG_DISABL
4f20: 45 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43 41 ED".# define CA
4f30: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f CKEY_DEBUG_FUNC_
4f40: 41 54 54 52 49 42 55 54 45 5f 54 4f 5f 53 54 52 ATTRIBUTE_TO_STR
4f50: 28 78 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 (x) "DEBUG_DISAB
4f60: 4c 45 44 22 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a LED".#endif../*.
4f70: 20 2a 20 49 6e 63 6c 75 64 65 20 74 68 65 73 65 * Include these
4f80: 20 73 6f 75 72 63 65 20 66 69 6c 65 73 20 69 6e source files in
4f90: 20 74 68 69 73 20 74 72 61 6e 73 6c 61 74 69 6f this translatio
4fa0: 6e 20 75 6e 69 74 20 73 6f 20 74 68 61 74 20 77 n unit so that w
4fb0: 65 20 63 61 6e 20 62 69 6e 64 20 74 6f 0a 20 2a e can bind to. *
4fc0: 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e functions and n
4fd0: 6f 74 20 69 6e 63 6c 75 64 65 20 61 6e 79 20 73 ot include any s
4fe0: 79 6d 62 6f 6c 73 20 69 6e 20 74 68 65 20 6f 75 ymbols in the ou
4ff0: 74 70 75 74 20 73 68 61 72 65 64 20 6f 62 6a 65 tput shared obje
5000: 63 74 2e 0a 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 ct.. */.#include
5010: 20 22 61 73 6e 31 2d 78 35 30 39 2e 63 22 0a 23 "asn1-x509.c".#
5020: 69 6e 63 6c 75 64 65 20 22 73 68 61 31 2e 63 22 include "sha1.c"
5030: 0a 23 69 6e 63 6c 75 64 65 20 22 6d 64 35 2e 63 .#include "md5.c
5040: 22 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20 "..typedef enum
5050: 7b 0a 09 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 {..CACKEY_ID_TYP
5060: 45 5f 43 41 43 2c 0a 09 43 41 43 4b 45 59 5f 49 E_CAC,..CACKEY_I
5070: 44 5f 54 59 50 45 5f 50 49 56 2c 0a 09 43 41 43 D_TYPE_PIV,..CAC
5080: 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 KEY_ID_TYPE_CERT
5090: 5f 4f 4e 4c 59 0a 7d 20 63 61 63 6b 65 79 5f 70 _ONLY.} cackey_p
50a0: 63 73 63 5f 69 64 5f 74 79 70 65 3b 0a 0a 73 74 csc_id_type;..st
50b0: 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 ruct cackey_pcsc
50c0: 5f 69 64 65 6e 74 69 74 79 20 7b 0a 09 63 61 63 _identity {..cac
50d0: 6b 65 79 5f 70 63 73 63 5f 69 64 5f 74 79 70 65 key_pcsc_id_type
50e0: 20 69 64 5f 74 79 70 65 3b 0a 0a 09 73 69 7a 65 id_type;...size
50f0: 5f 74 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c _t certificate_l
5100: 65 6e 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 en;..unsigned ch
5110: 61 72 20 2a 63 65 72 74 69 66 69 63 61 74 65 3b ar *certificate;
5120: 0a 0a 09 73 73 69 7a 65 5f 74 20 6b 65 79 73 69 ...ssize_t keysi
5130: 7a 65 3b 0a 0a 09 75 6e 69 6f 6e 20 7b 0a 09 09 ze;...union {...
5140: 73 74 72 75 63 74 20 7b 0a 09 09 09 75 6e 73 69 struct {....unsi
5150: 67 6e 65 64 20 63 68 61 72 20 61 70 70 6c 65 74 gned char applet
5160: 5b 37 5d 3b 0a 09 09 09 75 69 6e 74 31 36 5f 74 [7];....uint16_t
5170: 20 66 69 6c 65 3b 0a 09 09 7d 20 63 61 63 3b 0a file;...} cac;.
5180: 0a 09 09 73 74 72 75 63 74 20 7b 0a 09 09 09 75 ...struct {....u
5190: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6b 65 79 nsigned char key
51a0: 5f 69 64 3b 0a 09 09 09 63 68 61 72 20 6c 61 62 _id;....char lab
51b0: 65 6c 5b 33 32 5d 3b 0a 09 09 7d 20 70 69 76 3b el[32];...} piv;
51c0: 0a 09 7d 20 63 61 72 64 3b 0a 7d 3b 0a 0a 73 74 ..} card;.};..st
51d0: 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e ruct cackey_iden
51e0: 74 69 74 79 20 7b 0a 09 73 74 72 75 63 74 20 63 tity {..struct c
51f0: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 ackey_pcsc_ident
5200: 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e 74 69 ity *pcsc_identi
5210: 74 79 3b 0a 0a 09 43 4b 5f 41 54 54 52 49 42 55 ty;...CK_ATTRIBU
5220: 54 45 20 2a 61 74 74 72 69 62 75 74 65 73 3b 0a TE *attributes;.
5230: 09 43 4b 5f 55 4c 4f 4e 47 20 61 74 74 72 69 62 .CK_ULONG attrib
5240: 75 74 65 73 5f 63 6f 75 6e 74 3b 0a 7d 3b 0a 0a utes_count;.};..
5250: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 65 struct cackey_se
5260: 73 73 69 6f 6e 20 7b 0a 09 69 6e 74 20 61 63 74 ssion {..int act
5270: 69 76 65 3b 0a 0a 09 43 4b 5f 53 4c 4f 54 5f 49 ive;...CK_SLOT_I
5280: 44 20 73 6c 6f 74 49 44 3b 0a 0a 09 43 4b 5f 53 D slotID;...CK_S
5290: 54 41 54 45 20 73 74 61 74 65 3b 0a 09 43 4b 5f TATE state;..CK_
52a0: 46 4c 41 47 53 20 66 6c 61 67 73 3b 0a 09 43 4b FLAGS flags;..CK
52b0: 5f 55 4c 4f 4e 47 20 75 6c 44 65 76 69 63 65 45 _ULONG ulDeviceE
52c0: 72 72 6f 72 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 rror;..CK_VOID_P
52d0: 54 52 20 70 41 70 70 6c 69 63 61 74 69 6f 6e 3b TR pApplication;
52e0: 0a 09 43 4b 5f 4e 4f 54 49 46 59 20 4e 6f 74 69 ..CK_NOTIFY Noti
52f0: 66 79 3b 0a 0a 09 73 74 72 75 63 74 20 63 61 63 fy;...struct cac
5300: 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 key_identity *id
5310: 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73 69 67 entities;..unsig
5320: 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 ned long identit
5330: 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69 6e 74 ies_count;...int
5340: 20 73 65 61 72 63 68 5f 61 63 74 69 76 65 3b 0a search_active;.
5350: 09 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 .CK_ATTRIBUTE_PT
5360: 52 20 73 65 61 72 63 68 5f 71 75 65 72 79 3b 0a R search_query;.
5370: 09 43 4b 5f 55 4c 4f 4e 47 20 73 65 61 72 63 68 .CK_ULONG search
5380: 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b 0a 09 75 _query_count;..u
5390: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 65 61 nsigned long sea
53a0: 72 63 68 5f 63 75 72 72 5f 69 64 3b 0a 0a 09 69 rch_curr_id;...i
53b0: 6e 74 20 73 69 67 6e 5f 61 63 74 69 76 65 3b 0a nt sign_active;.
53c0: 09 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59 .CK_MECHANISM_TY
53d0: 50 45 20 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 PE sign_mechanis
53e0: 6d 3b 0a 09 43 4b 5f 42 59 54 45 5f 50 54 52 20 m;..CK_BYTE_PTR
53f0: 73 69 67 6e 5f 62 75 66 3b 0a 09 75 6e 73 69 67 sign_buf;..unsig
5400: 6e 65 64 20 6c 6f 6e 67 20 73 69 67 6e 5f 62 75 ned long sign_bu
5410: 66 6c 65 6e 3b 0a 09 75 6e 73 69 67 6e 65 64 20 flen;..unsigned
5420: 6c 6f 6e 67 20 73 69 67 6e 5f 62 75 66 75 73 65 long sign_bufuse
5430: 64 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 d;..struct cacke
5440: 79 5f 69 64 65 6e 74 69 74 79 20 2a 73 69 67 6e y_identity *sign
5450: 5f 69 64 65 6e 74 69 74 79 3b 0a 0a 09 69 6e 74 _identity;...int
5460: 20 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 3b decrypt_active;
5470: 0a 09 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 ..CK_MECHANISM_T
5480: 59 50 45 20 64 65 63 72 79 70 74 5f 6d 65 63 68 YPE decrypt_mech
5490: 61 6e 69 73 6d 3b 0a 09 43 4b 5f 56 4f 49 44 5f anism;..CK_VOID_
54a0: 50 54 52 20 64 65 63 72 79 70 74 5f 6d 65 63 68 PTR decrypt_mech
54b0: 5f 70 61 72 6d 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 _parm;..CK_ULONG
54c0: 20 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61 decrypt_mech_pa
54d0: 72 6d 6c 65 6e 3b 0a 09 73 74 72 75 63 74 20 63 rmlen;..struct c
54e0: 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a ackey_identity *
54f0: 64 65 63 72 79 70 74 5f 69 64 65 6e 74 69 74 79 decrypt_identity
5500: 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 ;.};..struct cac
5510: 6b 65 79 5f 73 6c 6f 74 20 7b 0a 09 69 6e 74 20 key_slot {..int
5520: 61 63 74 69 76 65 3b 0a 09 69 6e 74 20 69 6e 74 active;..int int
5530: 65 72 6e 61 6c 3b 0a 0a 09 63 68 61 72 20 2a 70 ernal;...char *p
5540: 63 73 63 5f 72 65 61 64 65 72 3b 0a 0a 09 69 6e csc_reader;...in
5550: 74 20 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e t pcsc_card_conn
5560: 65 63 74 65 64 3b 0a 09 53 43 41 52 44 48 41 4e ected;..SCARDHAN
5570: 44 4c 45 20 70 63 73 63 5f 63 61 72 64 3b 0a 0a DLE pcsc_card;..
5580: 09 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e .int transaction
5590: 5f 64 65 70 74 68 3b 0a 09 69 6e 74 20 74 72 61 _depth;..int tra
55a0: 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 nsaction_need_hw
55b0: 5f 6c 6f 63 6b 3b 0a 0a 09 69 6e 74 20 73 6c 6f _lock;...int slo
55c0: 74 5f 72 65 73 65 74 3b 0a 0a 09 43 4b 5f 46 4c t_reset;...CK_FL
55d0: 41 47 53 20 74 6f 6b 65 6e 5f 66 6c 61 67 73 3b AGS token_flags;
55e0: 0a 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 ...unsigned char
55f0: 20 2a 6c 61 62 65 6c 3b 0a 0a 09 44 57 4f 52 44 *label;...DWORD
5600: 20 70 72 6f 74 6f 63 6f 6c 3b 0a 0a 09 75 6e 73 protocol;...uns
5610: 69 67 6e 65 64 20 69 6e 74 20 63 61 63 68 65 64 igned int cached
5620: 5f 63 65 72 74 73 5f 63 6f 75 6e 74 3b 0a 09 73 _certs_count;..s
5630: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 truct cackey_pcs
5640: 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 61 63 68 c_identity *cach
5650: 65 64 5f 63 65 72 74 73 3b 0a 7d 3b 0a 0a 74 79 ed_certs;.};..ty
5660: 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43 41 pedef enum {..CA
5670: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e CKEY_TLV_APP_GEN
5680: 45 52 49 43 20 3d 20 30 78 30 31 2c 0a 09 43 41 ERIC = 0x01,..CA
5690: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 CKEY_TLV_APP_SKI
56a0: 20 20 20 20 20 3d 20 30 78 30 32 2c 0a 09 43 41 = 0x02,..CA
56b0: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 CKEY_TLV_APP_PKI
56c0: 20 20 20 20 20 3d 20 30 78 30 34 0a 7d 20 63 61 = 0x04.} ca
56d0: 63 6b 65 79 5f 74 6c 76 5f 61 70 70 74 79 70 65 ckey_tlv_apptype
56e0: 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20 ;..typedef enum
56f0: 7b 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 {..CACKEY_TLV_OB
5700: 4a 49 44 5f 47 45 4e 45 52 41 4c 49 4e 46 4f 20 JID_GENERALINFO
5710: 20 20 20 20 20 20 3d 20 30 78 32 30 30 30 2c 0a = 0x2000,.
5720: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 .CACKEY_TLV_OBJI
5730: 44 5f 50 52 4f 50 45 52 53 4f 4e 41 4c 49 4e 46 D_PROPERSONALINF
5740: 4f 20 20 20 3d 20 30 78 32 31 30 30 2c 0a 09 43 O = 0x2100,..C
5750: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f ACKEY_TLV_OBJID_
5760: 41 43 43 45 53 53 43 4f 4e 54 52 4f 4c 20 20 20 ACCESSCONTROL
5770: 20 20 3d 20 30 78 33 30 30 30 2c 0a 09 43 41 43 = 0x3000,..CAC
5780: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 4c 4f KEY_TLV_OBJID_LO
5790: 47 49 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 GIN
57a0: 3d 20 30 78 34 30 30 30 2c 0a 09 43 41 43 4b 45 = 0x4000,..CACKE
57b0: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 52 44 Y_TLV_OBJID_CARD
57c0: 49 4e 46 4f 20 20 20 20 20 20 20 20 20 20 3d 20 INFO =
57d0: 30 78 35 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 0x5000,..CACKEY_
57e0: 54 4c 56 5f 4f 42 4a 49 44 5f 42 49 4f 4d 45 54 TLV_OBJID_BIOMET
57f0: 52 49 43 53 20 20 20 20 20 20 20 20 3d 20 30 78 RICS = 0x
5800: 36 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 6000,..CACKEY_TL
5810: 56 5f 4f 42 4a 49 44 5f 44 49 47 49 54 41 4c 53 V_OBJID_DIGITALS
5820: 49 47 43 45 52 54 20 20 20 20 3d 20 30 78 37 30 IGCERT = 0x70
5830: 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 00,..CACKEY_TLV_
5840: 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e OBJID_CAC_PERSON
5850: 20 20 20 20 20 20 20 20 3d 20 30 78 30 32 30 30 = 0x0200
5860: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 ,..CACKEY_TLV_OB
5870: 4a 49 44 5f 43 41 43 5f 42 45 4e 45 46 49 54 53 JID_CAC_BENEFITS
5880: 20 20 20 20 20 20 3d 20 30 78 30 32 30 32 2c 0a = 0x0202,.
5890: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 .CACKEY_TLV_OBJI
58a0: 44 5f 43 41 43 5f 4f 54 48 45 52 42 45 4e 45 46 D_CAC_OTHERBENEF
58b0: 49 54 53 20 3d 20 30 78 30 32 30 33 2c 0a 09 43 ITS = 0x0203,..C
58c0: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f ACKEY_TLV_OBJID_
58d0: 43 41 43 5f 50 45 52 53 4f 4e 4e 45 4c 20 20 20 CAC_PERSONNEL
58e0: 20 20 3d 20 30 78 30 32 30 31 2c 0a 09 43 41 43 = 0x0201,..CAC
58f0: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 KEY_TLV_OBJID_CA
5900: 43 5f 50 4b 49 43 45 52 54 20 20 20 20 20 20 20 C_PKICERT
5910: 3d 20 30 78 30 32 46 45 0a 7d 20 63 61 63 6b 65 = 0x02FE.} cacke
5920: 79 5f 74 6c 76 5f 6f 62 6a 65 63 74 69 64 3b 0a y_tlv_objectid;.
5930: 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a .typedef enum {.
5940: 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 .CACKEY_PCSC_S_T
5950: 4f 4b 45 4e 50 52 45 53 45 4e 54 20 20 20 20 3d OKENPRESENT =
5960: 20 31 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 1,..CACKEY_PCSC
5970: 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 20 _S_OK
5980: 20 20 20 3d 20 30 2c 0a 09 43 41 43 4b 45 59 5f = 0,..CACKEY_
5990: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 PCSC_E_GENERIC
59a0: 20 20 20 20 20 20 20 3d 20 2d 31 2c 0a 09 43 41 = -1,..CA
59b0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 CKEY_PCSC_E_BADP
59c0: 49 4e 20 20 20 20 20 20 20 20 20 20 3d 20 2d 32 IN = -2
59d0: 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 ,..CACKEY_PCSC_E
59e0: 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 _LOCKED
59f0: 20 3d 20 2d 33 2c 0a 09 43 41 43 4b 45 59 5f 50 = -3,..CACKEY_P
5a00: 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 20 CSC_E_NEEDLOGIN
5a10: 20 20 20 20 20 20 3d 20 2d 34 2c 0a 09 43 41 43 = -4,..CAC
5a20: 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e KEY_PCSC_E_TOKEN
5a30: 41 42 53 45 4e 54 20 20 20 20 20 3d 20 2d 36 2c ABSENT = -6,
5a40: 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f ..CACKEY_PCSC_E_
5a50: 52 45 54 52 59 20 20 20 20 20 20 20 20 20 20 20 RETRY
5a60: 3d 20 2d 37 2c 0a 09 43 41 43 4b 45 59 5f 50 43 = -7,..CACKEY_PC
5a70: 53 43 5f 45 5f 4e 4f 44 41 54 41 20 20 20 20 20 SC_E_NODATA
5a80: 20 20 20 20 20 3d 20 2d 38 0a 7d 20 63 61 63 6b = -8.} cack
5a90: 65 79 5f 72 65 74 3b 0a 0a 73 74 72 75 63 74 20 ey_ret;..struct
5aa0: 63 61 63 6b 65 79 5f 74 6c 76 5f 63 61 72 64 75 cackey_tlv_cardu
5ab0: 72 6c 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 rl {..unsigned c
5ac0: 68 61 72 20 20 20 20 20 20 20 20 72 69 64 5b 35 har rid[5
5ad0: 5d 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76 5f 61 ];..cackey_tlv_a
5ae0: 70 70 74 79 70 65 20 20 20 61 70 70 74 79 70 65 pptype apptype
5af0: 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 ;..cackey_tlv_ob
5b00: 6a 65 63 74 69 64 20 20 6f 62 6a 65 63 74 69 64 jectid objectid
5b10: 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 ;..cackey_tlv_ob
5b20: 6a 65 63 74 69 64 20 20 61 70 70 69 64 3b 0a 09 jectid appid;..
5b30: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 20 20 unsigned char
5b40: 20 20 20 20 20 70 69 6e 69 64 3b 0a 7d 3b 0a 0a pinid;.};..
5b50: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c struct cackey_tl
5b60: 76 5f 65 6e 74 69 74 79 3b 0a 73 74 72 75 63 74 v_entity;.struct
5b70: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 cackey_tlv_enti
5b80: 74 79 20 7b 0a 09 75 69 6e 74 38 5f 74 20 74 61 ty {..uint8_t ta
5b90: 67 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 67 74 g;..size_t lengt
5ba0: 68 3b 0a 0a 09 75 6e 69 6f 6e 20 7b 0a 09 09 76 h;...union {...v
5bb0: 6f 69 64 20 2a 76 61 6c 75 65 3b 0a 09 09 73 74 oid *value;...st
5bc0: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f ruct cackey_tlv_
5bd0: 63 61 72 64 75 72 6c 20 2a 76 61 6c 75 65 5f 63 cardurl *value_c
5be0: 61 72 64 75 72 6c 3b 0a 09 09 75 69 6e 74 38 5f ardurl;...uint8_
5bf0: 74 20 76 61 6c 75 65 5f 62 79 74 65 3b 0a 09 7d t value_byte;..}
5c00: 3b 0a 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 ;...struct cacke
5c10: 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 5f 6e y_tlv_entity *_n
5c20: 65 78 74 3b 0a 7d 3b 0a 0a 2f 2a 20 43 41 43 4b ext;.};../* CACK
5c30: 45 59 20 47 6c 6f 62 61 6c 20 48 61 6e 64 6c 65 EY Global Handle
5c40: 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 s */.static void
5c50: 20 2a 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b *cackey_biglock
5c60: 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20 = NULL;.static
5c70: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 65 struct cackey_se
5c80: 73 73 69 6f 6e 20 63 61 63 6b 65 79 5f 73 65 73 ssion cackey_ses
5c90: 73 69 6f 6e 73 5b 31 32 38 5d 3b 0a 73 74 61 74 sions[128];.stat
5ca0: 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 ic struct cackey
5cb0: 5f 73 6c 6f 74 20 63 61 63 6b 65 79 5f 73 6c 6f _slot cackey_slo
5cc0: 74 73 5b 31 32 38 5d 3b 0a 73 74 61 74 69 63 20 ts[128];.static
5cd0: 69 6e 74 20 63 61 63 6b 65 79 5f 69 6e 69 74 69 int cackey_initi
5ce0: 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 73 74 61 74 alized = 0;.stat
5cf0: 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 62 69 ic int cackey_bi
5d00: 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d 20 30 3b 0a glock_init = 0;.
5d10: 43 4b 5f 43 5f 49 4e 49 54 49 41 4c 49 5a 45 5f CK_C_INITIALIZE_
5d20: 41 52 47 53 20 63 61 63 6b 65 79 5f 61 72 67 73 ARGS cackey_args
5d30: 3b 0a 0a 2f 2a 2a 20 45 78 74 72 61 20 63 65 72 ;../** Extra cer
5d40: 74 69 66 69 63 61 74 65 73 20 74 6f 20 69 6e 63 tificates to inc
5d50: 6c 75 64 65 20 69 6e 20 74 6f 6b 65 6e 20 2a 2a lude in token **
5d60: 2f 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f /.struct cackey_
5d70: 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 65 78 pcsc_identity ex
5d80: 74 72 61 5f 63 65 72 74 73 5b 5d 20 3d 20 7b 0a tra_certs[] = {.
5d90: 23 69 6e 63 6c 75 64 65 20 22 63 61 63 6b 65 79 #include "cackey
5da0: 5f 62 75 69 6c 74 69 6e 5f 63 65 72 74 73 2e 68 _builtin_certs.h
5db0: 22 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 43 41 ".};..#define CA
5dc0: 43 4b 45 59 5f 4d 41 43 52 4f 5f 44 45 46 41 55 CKEY_MACRO_DEFAU
5dd0: 4c 54 5f 58 53 54 52 28 73 74 72 29 20 43 41 43 LT_XSTR(str) CAC
5de0: 4b 45 59 5f 4d 41 43 52 4f 5f 44 45 46 41 55 4c KEY_MACRO_DEFAUL
5df0: 54 5f 53 54 52 28 73 74 72 29 0a 23 64 65 66 69 T_STR(str).#defi
5e00: 6e 65 20 43 41 43 4b 45 59 5f 4d 41 43 52 4f 5f ne CACKEY_MACRO_
5e10: 44 45 46 41 55 4c 54 5f 53 54 52 28 73 74 72 29 DEFAULT_STR(str)
5e20: 20 23 73 74 72 0a 0a 2f 2a 20 50 72 6f 74 65 63 #str../* Protec
5e30: 74 65 64 20 41 75 74 68 65 6e 74 69 63 61 74 69 ted Authenticati
5e40: 6f 6e 20 50 61 74 68 20 63 6f 6d 6d 61 6e 64 20 on Path command
5e50: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a */.static char *
5e60: 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 cackey_pin_comma
5e70: 6e 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 2f 2a 20 52 nd = NULL;../* R
5e80: 65 61 64 65 72 20 45 78 63 6c 75 73 69 6f 6e 20 eader Exclusion
5e90: 6f 72 20 49 6e 63 6c 75 64 65 2d 6f 6e 6c 79 20 or Include-only
5ea0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a */.static char *
5eb0: 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69 cackey_readers_i
5ec0: 6e 63 6c 75 64 65 5f 6f 6e 6c 79 20 3d 20 4e 55 nclude_only = NU
5ed0: 4c 4c 3b 0a 73 74 61 74 69 63 20 63 68 61 72 20 LL;.static char
5ee0: 2a 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f *cackey_readers_
5ef0: 65 78 63 6c 75 64 65 20 3d 20 4e 55 4c 4c 3b 0a exclude = NULL;.
5f00: 0a 2f 2a 20 50 43 53 43 20 47 6c 6f 62 61 6c 20 ./* PCSC Global
5f10: 48 61 6e 64 6c 65 73 20 2a 2f 0a 73 74 61 74 69 Handles */.stati
5f20: 63 20 4c 50 53 43 41 52 44 43 4f 4e 54 45 58 54 c LPSCARDCONTEXT
5f30: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e cackey_pcsc_han
5f40: 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 73 74 61 dle = NULL;..sta
5f50: 74 69 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e tic unsigned lon
5f60: 67 20 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 g cackey_getvers
5f70: 69 6f 6e 28 76 6f 69 64 29 20 7b 0a 09 73 74 61 ion(void) {..sta
5f80: 74 69 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e tic unsigned lon
5f90: 67 20 72 65 74 76 61 6c 20 3d 20 32 35 35 3b 0a g retval = 255;.
5fa0: 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6d .unsigned long m
5fb0: 61 6a 6f 72 20 3d 20 30 3b 0a 09 75 6e 73 69 67 ajor = 0;..unsig
5fc0: 6e 65 64 20 6c 6f 6e 67 20 6d 69 6e 6f 72 20 3d ned long minor =
5fd0: 20 30 3b 0a 09 63 68 61 72 20 2a 6d 61 6a 6f 72 0;..char *major
5fe0: 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b 0a 09 63 68 _str = NULL;..ch
5ff0: 61 72 20 2a 6d 69 6e 6f 72 5f 73 74 72 20 3d 20 ar *minor_str =
6000: 4e 55 4c 4c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 NULL;...CACKEY_D
6010: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
6020: 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 72 65 led.");...if (re
6030: 74 76 61 6c 20 21 3d 20 32 35 35 29 20 7b 0a 09 tval != 255) {..
6040: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
6050: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
6060: 30 78 25 6c 78 20 28 63 61 63 68 65 64 29 2e 22 0x%lx (cached)."
6070: 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 72 65 , retval);....re
6080: 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 09 7d turn(retval);..}
6090: 0a 0a 09 72 65 74 76 61 6c 20 3d 20 30 3b 0a 0a ...retval = 0;..
60a0: 23 69 66 64 65 66 20 50 41 43 4b 41 47 45 5f 56 #ifdef PACKAGE_V
60b0: 45 52 53 49 4f 4e 0a 20 20 20 20 20 20 20 20 6d ERSION. m
60c0: 61 6a 6f 72 5f 73 74 72 20 3d 20 50 41 43 4b 41 ajor_str = PACKA
60d0: 47 45 5f 56 45 52 53 49 4f 4e 3b 0a 09 69 66 20 GE_VERSION;..if
60e0: 28 6d 61 6a 6f 72 5f 73 74 72 29 20 7b 0a 09 20 (major_str) {..
60f0: 20 20 20 20 20 20 20 6d 61 6a 6f 72 20 3d 20 73 major = s
6100: 74 72 74 6f 75 6c 28 6d 61 6a 6f 72 5f 73 74 72 trtoul(major_str
6110: 2c 20 26 6d 69 6e 6f 72 5f 73 74 72 2c 20 31 30 , &minor_str, 10
6120: 29 3b 0a 0a 09 09 69 66 20 28 6d 69 6e 6f 72 5f );....if (minor_
6130: 73 74 72 29 20 7b 0a 09 09 09 6d 69 6e 6f 72 20 str) {....minor
6140: 3d 20 73 74 72 74 6f 75 6c 28 6d 69 6e 6f 72 5f = strtoul(minor_
6150: 73 74 72 20 2b 20 31 2c 20 4e 55 4c 4c 2c 20 31 str + 1, NULL, 1
6160: 30 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 0);...}..}...ret
6170: 76 61 6c 20 3d 20 28 6d 61 6a 6f 72 20 3c 3c 20 val = (major <<
6180: 31 36 29 20 7c 20 28 6d 69 6e 6f 72 20 3c 3c 20 16) | (minor <<
6190: 38 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 8);.#endif...CAC
61a0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
61b0: 28 22 52 65 74 75 72 6e 69 6e 67 20 30 78 25 6c ("Returning 0x%l
61c0: 78 22 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 x", retval);...r
61d0: 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d eturn(retval);.}
61e0: 0a 0a 2f 2a 20 50 43 2f 53 43 20 52 65 6c 61 74 ../* PC/SC Relat
61f0: 65 64 20 46 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a ed Functions */.
6200: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 /*. * SYNPOSIS.
6210: 2a 20 20 20 20 20 76 6f 69 64 20 63 61 63 6b 65 * void cacke
6220: 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 y_slots_disconne
6230: 63 74 5f 61 6c 6c 28 76 6f 69 64 29 3b 0a 20 2a ct_all(void);. *
6240: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a . * ARGUMENTS. *
6250: 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 None. *. *
6260: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 RETURN VALUE. *
6270: 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e None. *. * N
6280: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 OTES. * This
6290: 20 66 75 6e 63 74 69 6f 6e 20 64 69 73 63 6f 6e function discon
62a0: 6e 65 63 74 73 20 66 72 6f 6d 20 61 6c 6c 20 63 nects from all c
62b0: 61 72 64 73 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 ards.. *. */.sta
62c0: 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f tic void cackey_
62d0: 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 slots_disconnect
62e0: 5f 61 6c 6c 28 76 6f 69 64 29 20 7b 0a 09 75 69 _all(void) {..ui
62f0: 6e 74 33 32 5f 74 20 69 64 78 3b 0a 0a 09 43 41 nt32_t idx;...CA
6300: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
6310: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
6320: 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 for (idx = 0; id
6330: 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b x < (sizeof(cack
6340: 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 ey_slots) / size
6350: 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b of(cackey_slots[
6360: 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 0])); idx++) {..
6370: 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 .if (cackey_slot
6380: 73 5b 69 64 78 5d 2e 69 6e 74 65 72 6e 61 6c 29 s[idx].internal)
6390: 20 7b 0a 09 09 09 2f 2a 20 53 6b 69 70 20 69 6e {..../* Skip in
63a0: 74 65 72 6e 61 6c 20 73 6c 6f 74 73 20 2a 2f 0a ternal slots */.
63b0: 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d ...continue;...}
63c0: 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 ....if (cackey_s
63d0: 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 63 lots[idx].pcsc_c
63e0: 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b ard_connected) {
63f0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
6400: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 44 69 _PRINTF("SCardDi
6410: 73 63 6f 6e 6e 65 63 74 28 25 6c 75 29 20 63 61 sconnect(%lu) ca
6420: 6c 6c 65 64 22 2c 20 28 75 6e 73 69 67 6e 65 64 lled", (unsigned
6430: 20 6c 6f 6e 67 29 20 69 64 78 29 3b 0a 0a 09 09 long) idx);....
6440: 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 .SCardDisconnect
6450: 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 (cackey_slots[id
6460: 78 5d 2e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 x].pcsc_card, SC
6470: 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b ARD_LEAVE_CARD);
6480: 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b ...}....if (cack
6490: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 ey_slots[idx].la
64a0: 62 65 6c 29 20 7b 0a 09 09 09 66 72 65 65 28 63 bel) {....free(c
64b0: 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d ackey_slots[idx]
64c0: 2e 6c 61 62 65 6c 29 3b 0a 0a 09 09 09 63 61 63 .label);.....cac
64d0: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c key_slots[idx].l
64e0: 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d abel = NULL;...}
64f0: 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 ....cackey_slots
6500: 5b 69 64 78 5d 2e 70 63 73 63 5f 63 61 72 64 5f [idx].pcsc_card_
6510: 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09 connected = 0;..
6520: 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 .cackey_slots[id
6530: 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 x].transaction_d
6540: 65 70 74 68 20 3d 20 30 3b 0a 09 09 63 61 63 6b epth = 0;...cack
6550: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 ey_slots[idx].tr
6560: 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 ansaction_need_h
6570: 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 0a 09 09 69 w_lock = 0;....i
6580: 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b f (cackey_slots[
6590: 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 idx].active) {..
65a0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
65b0: 52 49 4e 54 46 28 22 4d 61 72 6b 69 6e 67 20 61 RINTF("Marking a
65c0: 63 74 69 76 65 20 73 6c 6f 74 20 25 6c 75 20 61 ctive slot %lu a
65d0: 73 20 62 65 69 6e 67 20 72 65 73 65 74 22 2c 20 s being reset",
65e0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
65f0: 69 64 78 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 idx);...}....cac
6600: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 73 key_slots[idx].s
6610: 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 lot_reset = 1;..
6620: 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 }...CACKEY_DEBUG
6630: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
6640: 6e 67 22 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a ng");...return;.
6650: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 }../*. * SYNPOSI
6660: 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f S. * cackey_
6670: 72 65 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f ret cackey_pcsc_
6680: 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 3b 0a 20 connect(void);.
6690: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 *. * ARGUMENTS.
66a0: 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a * None. *. *
66b0: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a RETURN VALUE. *
66c0: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 CACKEY_PCSC
66d0: 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e _S_OK On
66e0: 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 success. *
66f0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 CACKEY_PCSC_E_GE
6700: 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f NERIC On erro
6710: 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a r. *. * NOTES. *
6720: 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 This functi
6730: 6f 6e 20 63 6f 6e 6e 65 63 74 73 20 74 6f 20 74 on connects to t
6740: 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e 65 63 74 he PC/SC Connect
6750: 69 6f 6e 20 4d 61 6e 61 67 65 72 20 61 6e 64 20 ion Manager and
6760: 75 70 64 61 74 65 73 20 74 68 65 0a 20 2a 20 20 updates the. *
6770: 20 20 20 67 6c 6f 62 61 6c 20 68 61 6e 64 6c 65 global handle
6780: 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 .. *. */.static
6790: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 cackey_ret cacke
67a0: 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 76 y_pcsc_connect(v
67b0: 6f 69 64 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 oid) {..LONG sca
67c0: 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 rd_est_context_r
67d0: 65 74 3b 0a 23 69 66 64 65 66 20 48 41 56 45 5f et;.#ifdef HAVE_
67e0: 53 43 41 52 44 49 53 56 41 4c 49 44 43 4f 4e 54 SCARDISVALIDCONT
67f0: 45 58 54 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f EXT..LONG scard_
6800: 69 73 76 61 6c 69 64 5f 72 65 74 3b 0a 23 65 6e isvalid_ret;.#en
6810: 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 dif...CACKEY_DEB
6820: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
6830: 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b d.");...if (cack
6840: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d ey_pcsc_handle =
6850: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b = NULL) {...cack
6860: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d ey_pcsc_handle =
6870: 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a malloc(sizeof(*
6880: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 cackey_pcsc_hand
6890: 6c 65 29 29 3b 0a 09 09 69 66 20 28 63 61 63 6b le));...if (cack
68a0: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d ey_pcsc_handle =
68b0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 43 41 43 = NULL) {....CAC
68c0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
68d0: 28 22 43 61 6c 6c 20 74 6f 20 6d 61 6c 6c 6f 63 ("Call to malloc
68e0: 28 29 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 () failed, retur
68f0: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 ning in failure"
6900: 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c );.....cackey_sl
6910: 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 ots_disconnect_a
6920: 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e ll();.....return
6930: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 (CACKEY_PCSC_E_G
6940: 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 ENERIC);...}....
6950: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
6960: 4e 54 46 28 22 53 43 61 72 64 45 73 74 61 62 6c NTF("SCardEstabl
6970: 69 73 68 43 6f 6e 74 65 78 74 28 29 20 63 61 6c ishContext() cal
6980: 6c 65 64 22 29 3b 0a 09 09 73 63 61 72 64 5f 65 led");...scard_e
6990: 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 3d st_context_ret =
69a0: 20 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 SCardEstablishC
69b0: 6f 6e 74 65 78 74 28 53 43 41 52 44 5f 53 43 4f ontext(SCARD_SCO
69c0: 50 45 5f 53 59 53 54 45 4d 2c 20 4e 55 4c 4c 2c PE_SYSTEM, NULL,
69d0: 20 4e 55 4c 4c 2c 20 63 61 63 6b 65 79 5f 70 63 NULL, cackey_pc
69e0: 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 69 66 sc_handle);...if
69f0: 20 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 (scard_est_cont
6a00: 65 78 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44 ext_ret != SCARD
6a10: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 _S_SUCCESS) {...
6a20: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
6a30: 49 4e 54 46 28 22 43 61 6c 6c 20 74 6f 20 53 43 INTF("Call to SC
6a40: 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 ardEstablishCont
6a50: 65 78 74 20 66 61 69 6c 65 64 20 28 72 65 74 75 ext failed (retu
6a60: 72 6e 65 64 20 25 73 2f 25 6c 69 29 2c 20 72 65 rned %s/%li), re
6a70: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 turning in failu
6a80: 72 65 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 re", CACKEY_DEBU
6a90: 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f G_FUNC_SCARDERR_
6aa0: 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 65 73 74 TO_STR(scard_est
6ab0: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 2c 20 28 _context_ret), (
6ac0: 6c 6f 6e 67 29 20 73 63 61 72 64 5f 65 73 74 5f long) scard_est_
6ad0: 63 6f 6e 74 65 78 74 5f 72 65 74 29 3b 0a 0a 09 context_ret);...
6ae0: 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 70 63 ..free(cackey_pc
6af0: 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 09 63 sc_handle);....c
6b00: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c ackey_pcsc_handl
6b10: 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 63 61 e = NULL;.....ca
6b20: 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f ckey_slots_disco
6b30: 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 nnect_all();....
6b40: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 .return(CACKEY_P
6b50: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a CSC_E_GENERIC);.
6b60: 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20 48 ..}..}..#ifdef H
6b70: 41 56 45 5f 53 43 41 52 44 49 53 56 41 4c 49 44 AVE_SCARDISVALID
6b80: 43 4f 4e 54 45 58 54 0a 09 43 41 43 4b 45 59 5f CONTEXT..CACKEY_
6b90: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 DEBUG_PRINTF("SC
6ba0: 61 72 64 49 73 56 61 6c 69 64 43 6f 6e 74 65 78 ardIsValidContex
6bb0: 74 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09 73 t() called");..s
6bc0: 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 card_isvalid_ret
6bd0: 20 3d 20 53 43 61 72 64 49 73 56 61 6c 69 64 43 = SCardIsValidC
6be0: 6f 6e 74 65 78 74 28 2a 63 61 63 6b 65 79 5f 70 ontext(*cackey_p
6bf0: 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 69 66 csc_handle);..if
6c00: 20 28 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f (scard_isvalid_
6c10: 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 ret != SCARD_S_S
6c20: 55 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43 4b UCCESS) {...CACK
6c30: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
6c40: 22 48 61 6e 64 6c 65 20 68 61 73 20 62 65 63 6f "Handle has beco
6c50: 6d 65 20 69 6e 76 61 6c 69 64 20 28 53 43 61 72 me invalid (SCar
6c60: 64 49 73 56 61 6c 69 64 43 6f 6e 74 65 78 74 20 dIsValidContext
6c70: 3d 20 25 73 2f 25 6c 69 29 2c 20 74 72 79 69 6e = %s/%li), tryin
6c80: 67 20 74 6f 20 72 65 2d 65 73 74 61 62 6c 69 73 g to re-establis
6c90: 68 2e 2e 2e 22 2c 20 43 41 43 4b 45 59 5f 44 45 h...", CACKEY_DE
6ca0: 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 BUG_FUNC_SCARDER
6cb0: 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 69 R_TO_STR(scard_i
6cc0: 73 76 61 6c 69 64 5f 72 65 74 29 2c 20 28 6c 6f svalid_ret), (lo
6cd0: 6e 67 29 20 73 63 61 72 64 5f 69 73 76 61 6c 69 ng) scard_isvali
6ce0: 64 5f 72 65 74 29 3b 0a 0a 09 09 43 41 43 4b 45 d_ret);....CACKE
6cf0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
6d00: 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f SCardEstablishCo
6d10: 6e 74 65 78 74 28 29 20 63 61 6c 6c 65 64 22 29 ntext() called")
6d20: 3b 0a 09 09 73 63 61 72 64 5f 65 73 74 5f 63 6f ;...scard_est_co
6d30: 6e 74 65 78 74 5f 72 65 74 20 3d 20 53 43 61 72 ntext_ret = SCar
6d40: 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 dEstablishContex
6d50: 74 28 53 43 41 52 44 5f 53 43 4f 50 45 5f 53 59 t(SCARD_SCOPE_SY
6d60: 53 54 45 4d 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c STEM, NULL, NULL
6d70: 2c 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 , cackey_pcsc_ha
6d80: 6e 64 6c 65 29 3b 0a 09 09 69 66 20 28 73 63 61 ndle);...if (sca
6d90: 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 rd_est_context_r
6da0: 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 et != SCARD_S_SU
6db0: 43 43 45 53 53 29 20 7b 0a 09 09 09 43 41 43 4b CCESS) {....CACK
6dc0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
6dd0: 22 43 61 6c 6c 20 74 6f 20 53 43 61 72 64 45 73 "Call to SCardEs
6de0: 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 20 66 tablishContext f
6df0: 61 69 6c 65 64 20 28 72 65 74 75 72 6e 65 64 20 ailed (returned
6e00: 25 73 2f 25 6c 69 29 2c 20 72 65 74 75 72 6e 69 %s/%li), returni
6e10: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 2c 20 ng in failure",
6e20: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e CACKEY_DEBUG_FUN
6e30: 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 C_SCARDERR_TO_ST
6e40: 52 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 R(scard_est_cont
6e50: 65 78 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 ext_ret), (long)
6e60: 20 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 scard_est_conte
6e70: 78 74 5f 72 65 74 29 3b 0a 0a 09 09 09 66 72 65 xt_ret);.....fre
6e80: 65 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 e(cackey_pcsc_ha
6e90: 6e 64 6c 65 29 3b 0a 09 09 09 63 61 63 6b 65 79 ndle);....cackey
6ea0: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e _pcsc_handle = N
6eb0: 55 4c 4c 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f ULL;.....cackey_
6ec0: 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 slots_disconnect
6ed0: 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75 _all();.....retu
6ee0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 rn(CACKEY_PCSC_E
6ef0: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a _GENERIC);...}..
6f00: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
6f10: 52 49 4e 54 46 28 22 48 61 6e 64 6c 65 20 68 61 RINTF("Handle ha
6f20: 73 20 62 65 65 6e 20 72 65 2d 65 73 74 61 62 6c s been re-establ
6f30: 69 73 68 65 64 22 29 3b 0a 09 7d 0a 23 65 6e 64 ished");..}.#end
6f40: 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 if...CACKEY_DEBU
6f50: 47 5f 50 52 49 4e 54 46 28 22 53 75 63 65 73 73 G_PRINTF("Sucess
6f60: 66 75 6c 6c 79 20 63 6f 6e 6e 65 63 74 65 64 20 fully connected
6f70: 74 6f 20 50 43 2f 53 43 2c 20 72 65 74 75 72 6e to PC/SC, return
6f80: 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 22 29 ing in success")
6f90: 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 ;...return(CACKE
6fa0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a Y_PCSC_S_OK);.}.
6fb0: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a ./*. * SYNPOSIS.
6fc0: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 * cackey_re
6fd0: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 t cackey_pcsc_di
6fe0: 73 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 3b 0a sconnect(void);.
6ff0: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a *. * ARGUMENTS.
7000: 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 * None. *.
7010: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 * RETURN VALUE.
7020: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 * CACKEY_PCS
7030: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f C_S_OK O
7040: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 n success. *
7050: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 CACKEY_PCSC_E_G
7060: 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 ENERIC On err
7070: 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 or. *. * NOTES.
7080: 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 * This funct
7090: 69 6f 6e 20 64 69 73 63 6f 6e 6e 65 63 74 73 20 ion disconnects
70a0: 66 72 6f 6d 20 74 68 65 20 50 43 2f 53 43 20 43 from the PC/SC C
70b0: 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65 onnection manage
70c0: 72 20 61 6e 64 20 75 70 64 61 74 65 73 0a 20 2a r and updates. *
70d0: 20 20 20 20 20 74 68 65 20 67 6c 6f 62 61 6c 20 the global
70e0: 68 61 6e 64 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a 73 handle.. *. */.s
70f0: 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 tatic cackey_ret
7100: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 cackey_pcsc_dis
7110: 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 20 7b 0a connect(void) {.
7120: 09 4c 4f 4e 47 20 73 63 61 72 64 5f 72 65 6c 5f .LONG scard_rel_
7130: 63 6f 6e 74 65 78 74 5f 72 65 74 3b 0a 0a 09 43 context_ret;...C
7140: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
7150: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
7160: 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63 .if (cackey_pcsc
7170: 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 _handle == NULL)
7180: 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b {...return(CACK
7190: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 EY_PCSC_S_OK);..
71a0: 7d 0a 0a 09 73 63 61 72 64 5f 72 65 6c 5f 63 6f }...scard_rel_co
71b0: 6e 74 65 78 74 5f 72 65 74 20 3d 20 53 43 61 72 ntext_ret = SCar
71c0: 64 52 65 6c 65 61 73 65 43 6f 6e 74 65 78 74 28 dReleaseContext(
71d0: 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e *cackey_pcsc_han
71e0: 64 6c 65 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b dle);...if (cack
71f0: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 20 ey_pcsc_handle)
7200: 7b 0a 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f {...free(cackey_
7210: 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 0a pcsc_handle);...
7220: 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 ..cackey_pcsc_ha
7230: 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a ndle = NULL;..}.
7240: 0a 09 69 66 20 28 73 63 61 72 64 5f 72 65 6c 5f ..if (scard_rel_
7250: 63 6f 6e 74 65 78 74 5f 72 65 74 20 21 3d 20 53 context_ret != S
7260: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 CARD_S_SUCCESS)
7270: 7b 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 {...return(CACKE
7280: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 Y_PCSC_E_GENERIC
7290: 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 43 );..}...return(C
72a0: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 ACKEY_PCSC_S_OK)
72b0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f ;.}../*. * SYNPO
72c0: 53 49 53 0a 20 2a 20 20 20 20 20 76 6f 69 64 20 SIS. * void
72d0: 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 cackey_mark_slot
72e0: 5f 72 65 73 65 74 28 73 74 72 75 63 74 20 63 61 _reset(struct ca
72f0: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 ckey_slot *slot)
7300: 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 ;. *. * ARGUMENT
7310: 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a S. * None. *
7320: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 . * RETURN VALUE
7330: 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a . * None. *.
7340: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 * NOTES. *
7350: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 This function ma
7360: 72 6b 73 20 61 20 73 6c 6f 74 20 68 61 73 20 68 rks a slot has h
7370: 61 76 69 6e 67 20 62 65 65 6e 20 72 65 73 65 74 aving been reset
7380: 2c 20 74 6f 20 6c 61 74 65 72 20 62 65 20 63 6c , to later be cl
7390: 65 61 6e 65 64 20 75 70 2e 0a 20 2a 20 20 20 20 eaned up.. *
73a0: 20 43 6c 65 61 6e 75 70 20 6f 6e 6c 79 20 68 61 Cleanup only ha
73b0: 70 70 65 6e 73 20 77 68 65 6e 20 61 20 50 4b 43 ppens when a PKC
73c0: 53 23 31 31 20 63 6c 69 65 6e 74 20 63 61 6c 6c S#11 client call
73d0: 73 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 s C_FindObjectsI
73e0: 6e 69 74 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 nit.. *. */.stat
73f0: 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 6d ic void cackey_m
7400: 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 ark_slot_reset(s
7410: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f truct cackey_slo
7420: 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 69 66 20 28 t *slot) {..if (
7430: 73 6c 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a slot == NULL) {.
7440: 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 43 ..return;..}...C
7450: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
7460: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
7470: 09 69 66 20 28 73 6c 6f 74 2d 3e 70 63 73 63 5f .if (slot->pcsc_
7480: 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 card_connected)
7490: 7b 0a 09 09 53 43 61 72 64 44 69 73 63 6f 6e 6e {...SCardDisconn
74a0: 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 ect(slot->pcsc_c
74b0: 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 ard, SCARD_LEAVE
74c0: 5f 43 41 52 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f _CARD);..}...slo
74d0: 74 2d 3e 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 t->slot_reset =
74e0: 31 3b 0a 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 1;..slot->pcsc_c
74f0: 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 ard_connected =
7500: 30 3b 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70 0;..if (cackey_p
7510: 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 3d 20 4e 55 in_command == NU
7520: 4c 4c 29 20 7b 0a 09 09 73 6c 6f 74 2d 3e 74 6f LL) {...slot->to
7530: 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f ken_flags = CKF_
7540: 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a LOGIN_REQUIRED;.
7550: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 73 6c 6f 74 .} else {...slot
7560: 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 ->token_flags =
7570: 30 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 0;..}...CACKEY_D
7580: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
7590: 75 72 6e 69 6e 67 2e 22 29 3b 0a 0a 09 72 65 74 urning.");...ret
75a0: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 urn;.}../*. * SY
75b0: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 4c 4f NPOSIS. * LO
75c0: 4e 47 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e NG cackey_reconn
75d0: 65 63 74 5f 63 61 72 64 28 73 74 72 75 63 74 20 ect_card(struct
75e0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f cackey_slot *slo
75f0: 74 2c 20 44 57 4f 52 44 20 64 65 66 61 75 6c 74 t, DWORD default
7600: 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 20 2a 0a 20 _protocol);. *.
7610: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 * ARGUMENTS. *
7620: 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a cackey_slot *
7630: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 slot. *
7640: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d Slot to send com
7650: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 mands to. *. *
7660: 20 20 20 44 57 4f 52 44 20 64 65 66 61 75 6c 74 DWORD default
7670: 5f 70 72 6f 74 6f 63 6f 6c 0a 20 2a 20 20 20 20 _protocol. *
7680: 20 20 20 20 20 50 72 6f 74 6f 63 6f 6c 20 74 6f Protocol to
7690: 20 61 74 74 65 6d 70 74 20 66 69 72 73 74 0a 20 attempt first.
76a0: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 *. * RETURN VALU
76b0: 45 0a 20 2a 20 20 20 20 20 54 68 65 20 72 65 74 E. * The ret
76c0: 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 53 urn value from S
76d0: 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 0a CardReconnect().
76e0: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 *. * NOTES. *
76f0: 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e This function
7700: 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72 is a wrapper ar
7710: 6f 75 6e 64 20 53 43 61 72 64 52 65 63 6f 6e 6e ound SCardReconn
7720: 65 63 74 28 29 0a 20 2a 0a 20 2a 20 20 20 20 20 ect(). *. *
7730: 54 68 65 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 The SCardReconne
7740: 63 74 28 29 20 66 75 6e 63 74 69 6f 6e 20 63 61 ct() function ca
7750: 6c 6c 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 ll will be calle
7760: 64 20 66 69 72 73 74 20 77 69 74 68 20 74 68 65 d first with the
7770: 0a 20 2a 20 20 20 20 20 64 77 50 72 65 66 65 72 . * dwPrefer
7780: 72 65 64 50 72 6f 74 6f 63 6f 6c 73 20 6f 66 20 redProtocols of
7790: 22 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f "default_protoco
77a0: 6c 22 2e 20 20 49 66 20 74 68 61 74 20 63 61 6c l". If that cal
77b0: 6c 20 72 65 74 75 72 6e 73 0a 20 2a 20 20 20 20 l returns. *
77c0: 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d SCARD_E_PROTO_M
77d0: 49 53 4d 41 54 43 48 20 74 72 79 20 61 67 61 69 ISMATCH try agai
77e0: 6e 20 77 69 74 68 20 61 20 70 72 6f 74 6f 63 6f n with a protoco
77f0: 6c 20 6f 66 20 54 3d 30 2c 20 61 6e 64 20 66 61 l of T=0, and fa
7800: 69 6c 69 6e 67 0a 20 2a 20 20 20 20 20 74 68 61 iling. * tha
7810: 74 20 54 3d 31 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 t T=1.. *. */.st
7820: 61 74 69 63 20 4c 4f 4e 47 20 63 61 63 6b 65 79 atic LONG cackey
7830: 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 _reconnect_card(
7840: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c struct cackey_sl
7850: 6f 74 20 2a 73 6c 6f 74 2c 20 44 57 4f 52 44 20 ot *slot, DWORD
7860: 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c default_protocol
7870: 29 20 7b 0a 09 44 57 4f 52 44 20 73 65 6c 65 63 ) {..DWORD selec
7880: 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 3b 0a 09 4c ted_protocol;..L
7890: 4f 4e 47 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 ONG scard_conn_r
78a0: 65 74 3b 0a 0a 09 73 65 6c 65 63 74 65 64 5f 70 et;...selected_p
78b0: 72 6f 74 6f 63 6f 6c 20 3d 20 30 3b 0a 0a 09 73 rotocol = 0;...s
78c0: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 card_conn_ret =
78d0: 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 73 SCardReconnect(s
78e0: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 lot->pcsc_card,
78f0: 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 SCARD_SHARE_SHAR
7900: 45 44 2c 20 64 65 66 61 75 6c 74 5f 70 72 6f 74 ED, default_prot
7910: 6f 63 6f 6c 2c 20 53 43 41 52 44 5f 52 45 53 45 ocol, SCARD_RESE
7920: 54 5f 43 41 52 44 2c 20 26 73 65 6c 65 63 74 65 T_CARD, &selecte
7930: 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 69 d_protocol);...i
7940: 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 f (scard_conn_re
7950: 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f t == SCARD_E_PRO
7960: 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 TO_MISMATCH) {..
7970: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
7980: 49 4e 54 46 28 22 53 43 61 72 64 52 65 63 6f 6e INTF("SCardRecon
7990: 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 20 nect() returned
79a0: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 SCARD_E_PROTO_MI
79b0: 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77 SMATCH, trying w
79c0: 69 74 68 20 6a 75 73 74 20 54 3d 30 22 29 0a 09 ith just T=0")..
79d0: 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 .scard_conn_ret
79e0: 3d 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 = SCardReconnect
79f0: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 (slot->pcsc_card
7a00: 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 , SCARD_SHARE_SH
7a10: 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 ARED, SCARD_PROT
7a20: 4f 43 4f 4c 5f 54 30 2c 20 53 43 41 52 44 5f 52 OCOL_T0, SCARD_R
7a30: 45 53 45 54 5f 43 41 52 44 2c 20 26 73 65 6c 65 ESET_CARD, &sele
7a40: 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a cted_protocol);.
7a50: 0a 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e ...if (scard_con
7a60: 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 n_ret == SCARD_E
7a70: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 _PROTO_MISMATCH)
7a80: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 {....CACKEY_DEB
7a90: 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 UG_PRINTF("SCard
7aa0: 52 65 63 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 Reconnect() retu
7ab0: 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f rned SCARD_E_PRO
7ac0: 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 TO_MISMATCH, try
7ad0: 69 6e 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d ing with just T=
7ae0: 31 22 29 0a 09 09 09 73 63 61 72 64 5f 63 6f 6e 1")....scard_con
7af0: 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 52 65 63 n_ret = SCardRec
7b00: 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 onnect(slot->pcs
7b10: 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 53 48 c_card, SCARD_SH
7b20: 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52 ARE_SHARED, SCAR
7b30: 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 53 D_PROTOCOL_T1, S
7b40: 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52 44 2c CARD_RESET_CARD,
7b50: 20 26 73 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f &selected_proto
7b60: 63 6f 6c 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 col);...}..}...i
7b70: 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 f (scard_conn_re
7b80: 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 t == SCARD_S_SUC
7b90: 43 45 53 53 29 20 7b 0a 09 09 73 6c 6f 74 2d 3e CESS) {...slot->
7ba0: 70 72 6f 74 6f 63 6f 6c 20 3d 20 73 65 6c 65 63 protocol = selec
7bb0: 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 3b 0a 09 7d ted_protocol;..}
7bc0: 0a 0a 09 72 65 74 75 72 6e 28 73 63 61 72 64 5f ...return(scard_
7bd0: 63 6f 6e 6e 5f 72 65 74 29 3b 0a 7d 0a 0a 2f 2a conn_ret);.}../*
7be0: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 . * SYNPOSIS. *
7bf0: 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 cackey_ret c
7c00: 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 ackey_connect_ca
7c10: 72 64 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 rd(struct cackey
7c20: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a _slot *slot);. *
7c30: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a . * ARGUMENTS. *
7c40: 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 cackey_slot
7c50: 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 *slot. *
7c60: 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 Slot to send c
7c70: 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a ommands to. *. *
7c80: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a RETURN VALUE. *
7c90: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 CACKEY_PCSC
7ca0: 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e _S_OK On
7cb0: 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 success. *
7cc0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 CACKEY_PCSC_E_GE
7cd0: 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f NERIC On erro
7ce0: 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a r. *. * NOTES. *
7cf0: 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f None. *. */
7d00: 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 .static cackey_r
7d10: 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 et cackey_connec
7d20: 74 5f 63 61 72 64 28 73 74 72 75 63 74 20 63 61 t_card(struct ca
7d30: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 ckey_slot *slot)
7d40: 20 7b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 70 {..cackey_ret p
7d50: 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b csc_connect_ret;
7d60: 0a 09 44 57 4f 52 44 20 70 72 6f 74 6f 63 6f 6c ..DWORD protocol
7d70: 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 63 6f ;..LONG scard_co
7d80: 6e 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 nn_ret;...CACKEY
7d90: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 _DEBUG_PRINTF("C
7da0: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 alled.");...if (
7db0: 21 73 6c 6f 74 29 20 7b 0a 09 09 43 41 43 4b 45 !slot) {...CACKE
7dc0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
7dd0: 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 73 70 65 Invalid slot spe
7de0: 63 69 66 69 65 64 2c 20 72 65 74 75 72 6e 69 6e cified, returnin
7df0: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a g in failure");.
7e00: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 ...return(CACKEY
7e10: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 _PCSC_E_GENERIC)
7e20: 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e ;..}...pcsc_conn
7e30: 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 ect_ret = cackey
7e40: 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b _pcsc_connect();
7e50: 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 ..if (pcsc_conne
7e60: 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 ct_ret != CACKEY
7e70: 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 _PCSC_S_OK) {...
7e80: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
7e90: 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 NTF("Connection
7ea0: 74 6f 20 50 43 2f 53 43 20 66 61 69 6c 65 64 2c to PC/SC failed,
7eb0: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 returning in fa
7ec0: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 ilure");....retu
7ed0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 rn(CACKEY_PCSC_E
7ee0: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 _GENERIC);..}...
7ef0: 2f 2a 20 43 6f 6e 6e 65 63 74 20 74 6f 20 72 65 /* Connect to re
7f00: 61 64 65 72 2c 20 69 66 20 6e 65 65 64 65 64 20 ader, if needed
7f10: 2a 2f 0a 09 69 66 20 28 21 73 6c 6f 74 2d 3e 70 */..if (!slot->p
7f20: 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 csc_card_connect
7f30: 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...CACKEY_D
7f40: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 EBUG_PRINTF("SCa
7f50: 72 64 43 6f 6e 6e 65 63 74 28 25 73 29 20 63 61 rdConnect(%s) ca
7f60: 6c 6c 65 64 20 66 6f 72 20 73 6c 6f 74 20 25 70 lled for slot %p
7f70: 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 ", slot->pcsc_re
7f80: 61 64 65 72 2c 20 73 6c 6f 74 29 3b 0a 09 09 73 ader, slot);...s
7f90: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 card_conn_ret =
7fa0: 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 SCardConnect(*ca
7fb0: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 ckey_pcsc_handle
7fc0: 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 , slot->pcsc_rea
7fd0: 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45 der, SCARD_SHARE
7fe0: 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 _SHARED, SCARD_P
7ff0: 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 41 ROTOCOL_T0 | SCA
8000: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 RD_PROTOCOL_T1,
8010: 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 &slot->pcsc_card
8020: 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 , &protocol);...
8030: 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f .if (scard_conn_
8040: 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 ret == SCARD_E_P
8050: 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b ROTO_MISMATCH) {
8060: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
8070: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f _PRINTF("SCardCo
8080: 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 nnect() returned
8090: 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d SCARD_E_PROTO_M
80a0: 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20 ISMATCH, trying
80b0: 77 69 74 68 20 6a 75 73 74 20 54 3d 30 22 29 0a with just T=0").
80c0: 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 ...scard_conn_re
80d0: 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 t = SCardConnect
80e0: 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 (*cackey_pcsc_ha
80f0: 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 ndle, slot->pcsc
8100: 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53 _reader, SCARD_S
8110: 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41 HARE_SHARED, SCA
8120: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20 RD_PROTOCOL_T0,
8130: 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 &slot->pcsc_card
8140: 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 , &protocol);...
8150: 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e ..if (scard_conn
8160: 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f _ret == SCARD_E_
8170: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 PROTO_MISMATCH)
8180: 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 {.....CACKEY_DEB
8190: 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 UG_PRINTF("SCard
81a0: 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e Connect() return
81b0: 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f ed SCARD_E_PROTO
81c0: 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e _MISMATCH, tryin
81d0: 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d 31 22 g with just T=1"
81e0: 29 0a 09 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e ).....scard_conn
81f0: 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e _ret = SCardConn
8200: 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 ect(*cackey_pcsc
8210: 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 _handle, slot->p
8220: 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41 52 csc_reader, SCAR
8230: 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20 D_SHARE_SHARED,
8240: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 SCARD_PROTOCOL_T
8250: 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 1, &slot->pcsc_c
8260: 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b ard, &protocol);
8270: 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 ....}...}....if
8280: 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 (scard_conn_ret
8290: 3d 3d 20 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57 == SCARD_W_UNPOW
82a0: 45 52 45 44 5f 43 41 52 44 29 20 7b 0a 09 09 09 ERED_CARD) {....
82b0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
82c0: 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 NTF("SCardConnec
82d0: 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 t() returned SCA
82e0: 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43 RD_W_UNPOWERED_C
82f0: 41 52 44 2c 20 74 72 79 69 6e 67 20 74 6f 20 72 ARD, trying to r
8300: 65 2d 63 6f 6e 6e 65 63 74 2e 2e 2e 22 29 3b 0a e-connect...");.
8310: 0a 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 ....scard_conn_r
8320: 65 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 et = SCardConnec
8330: 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 t(*cackey_pcsc_h
8340: 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 andle, slot->pcs
8350: 63 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f c_reader, SCARD_
8360: 53 48 41 52 45 5f 44 49 52 45 43 54 2c 20 53 43 SHARE_DIRECT, SC
8370: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 ARD_PROTOCOL_T0
8380: 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c | SCARD_PROTOCOL
8390: 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 _T1, &slot->pcsc
83a0: 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c _card, &protocol
83b0: 29 3b 0a 0a 09 09 09 69 66 20 28 73 63 61 72 64 );.....if (scard
83c0: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 _conn_ret == SCA
83d0: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 RD_E_PROTO_MISMA
83e0: 54 43 48 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 TCH) {.....CACKE
83f0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
8400: 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 72 SCardConnect() r
8410: 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f eturned SCARD_E_
8420: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 PROTO_MISMATCH,
8430: 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73 74 trying with just
8440: 20 54 3d 30 22 29 0a 09 09 09 09 73 63 61 72 64 T=0").....scard
8450: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 _conn_ret = SCar
8460: 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 dConnect(*cackey
8470: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c _pcsc_handle, sl
8480: 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c ot->pcsc_reader,
8490: 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 SCARD_SHARE_SHA
84a0: 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f RED, SCARD_PROTO
84b0: 43 4f 4c 5f 54 30 2c 20 26 73 6c 6f 74 2d 3e 70 COL_T0, &slot->p
84c0: 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f csc_card, &proto
84d0: 63 6f 6c 29 3b 0a 0a 09 09 09 09 69 66 20 28 73 col);......if (s
84e0: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d card_conn_ret ==
84f0: 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d SCARD_E_PROTO_M
8500: 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 09 09 09 ISMATCH) {......
8510: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
8520: 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 NTF("SCardConnec
8530: 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 t() returned SCA
8540: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 RD_E_PROTO_MISMA
8550: 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68 TCH, trying with
8560: 20 6a 75 73 74 20 54 3d 31 22 29 0a 09 09 09 09 just T=1").....
8570: 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 .scard_conn_ret
8580: 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a = SCardConnect(*
8590: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 cackey_pcsc_hand
85a0: 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 le, slot->pcsc_r
85b0: 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41 eader, SCARD_SHA
85c0: 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 RE_SHARED, SCARD
85d0: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 _PROTOCOL_T1, &s
85e0: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 lot->pcsc_card,
85f0: 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09 09 &protocol);.....
8600: 7d 0a 09 09 09 7d 0a 0a 09 09 09 73 63 61 72 64 }....}.....scard
8610: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 61 63 6b _conn_ret = cack
8620: 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72 ey_reconnect_car
8630: 64 28 73 6c 6f 74 2c 20 70 72 6f 74 6f 63 6f 6c d(slot, protocol
8640: 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 63 );...}....if (sc
8650: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 21 3d 20 ard_conn_ret !=
8660: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 SCARD_S_SUCCESS)
8670: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 {....CACKEY_DEB
8680: 55 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65 UG_PRINTF("Conne
8690: 63 74 69 6f 6e 20 74 6f 20 63 61 72 64 20 66 61 ction to card fa
86a0: 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 iled, returning
86b0: 69 6e 20 66 61 69 6c 75 72 65 20 28 53 43 61 72 in failure (SCar
86c0: 64 43 6f 6e 6e 65 63 74 28 29 20 3d 20 25 73 2f dConnect() = %s/
86d0: 25 6c 69 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 %li)", CACKEY_DE
86e0: 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 BUG_FUNC_SCARDER
86f0: 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 63 R_TO_STR(scard_c
8700: 6f 6e 6e 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 onn_ret), (long)
8710: 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 29 scard_conn_ret)
8720: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 ;.....return(CAC
8730: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 KEY_PCSC_E_GENER
8740: 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 73 6c 6f 74 IC);...}....slot
8750: 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e ->pcsc_card_conn
8760: 65 63 74 65 64 20 3d 20 31 3b 0a 09 09 73 6c 6f ected = 1;...slo
8770: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 t->transaction_d
8780: 65 70 74 68 20 3d 20 30 3b 0a 09 09 73 6c 6f 74 epth = 0;...slot
8790: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 ->transaction_ne
87a0: 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a ed_hw_lock = 0;.
87b0: 09 09 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c ..slot->protocol
87c0: 20 3d 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 7d 0a = protocol;..}.
87d0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
87e0: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
87f0: 20 69 6e 20 73 75 63 63 65 73 73 22 29 3b 0a 0a in success");..
8800: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 .return(CACKEY_P
8810: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a CSC_S_OK);.}../*
8820: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 . * SYNPOSIS. *
8830: 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 cackey_ret c
8840: 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e ackey_begin_tran
8850: 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20 63 saction(struct c
8860: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 ackey_slot *slot
8870: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e );. *. * ARGUMEN
8880: 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 TS. * cackey
8890: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 _slot *slot. *
88a0: 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 Slot to s
88b0: 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a end commands to.
88c0: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c *. * RETURN VAL
88d0: 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 UE. * CACKEY
88e0: 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 _PCSC_S_OK
88f0: 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a On success. *
8900: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 CACKEY_PCSC
8910: 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e _E_GENERIC On
8920: 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 error. *. * NOT
8930: 45 53 0a 20 2a 20 20 20 20 20 54 68 65 20 74 72 ES. * The tr
8940: 61 6e 73 61 63 74 69 6f 6e 20 73 68 6f 75 6c 64 ansaction should
8950: 20 62 65 20 74 65 72 6d 69 6e 61 74 65 64 20 75 be terminated u
8960: 73 69 6e 67 20 22 63 61 63 6b 65 79 5f 65 6e 64 sing "cackey_end
8970: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 0a 20 2a _transaction". *
8980: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b . */.static cack
8990: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 62 65 ey_ret cackey_be
89a0: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 gin_transaction(
89b0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c struct cackey_sl
89c0: 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63 ot *slot) {..cac
89d0: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 63 key_ret cackey_c
89e0: 6f 6e 6e 5f 72 65 74 3b 0a 09 4c 4f 4e 47 20 73 onn_ret;..LONG s
89f0: 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 3b 0a card_trans_ret;.
8a00: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
8a10: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
8a20: 3b 0a 0a 09 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f ;...cackey_conn_
8a30: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e ret = cackey_con
8a40: 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b nect_card(slot);
8a50: 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 63 6f 6e ..if (cackey_con
8a60: 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f n_ret != CACKEY_
8a70: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 PCSC_S_OK) {...C
8a80: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
8a90: 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f TF("Unable to co
8aa0: 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72 nnect to card, r
8ab0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f eturning in erro
8ac0: 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 r");....return(C
8ad0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e ACKEY_PCSC_E_GEN
8ae0: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 ERIC);..}...slot
8af0: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 ->transaction_de
8b00: 70 74 68 2b 2b 3b 0a 0a 09 69 66 20 28 73 6c 6f pth++;...if (slo
8b10: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 t->transaction_d
8b20: 65 70 74 68 20 3e 20 31 20 26 26 20 21 73 6c 6f epth > 1 && !slo
8b30: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e t->transaction_n
8b40: 65 65 64 5f 68 77 5f 6c 6f 63 6b 29 20 7b 0a 09 eed_hw_lock) {..
8b50: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
8b60: 49 4e 54 46 28 22 41 6c 72 65 61 64 79 20 69 6e INTF("Already in
8b70: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 a transaction,
8b80: 70 65 72 66 6f 72 6d 69 6e 67 20 6e 6f 20 61 63 performing no ac
8b90: 74 69 6f 6e 20 28 6e 65 77 20 64 65 70 74 68 20 tion (new depth
8ba0: 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72 = %i)", slot->tr
8bb0: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 29 ansaction_depth)
8bc0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b ;....return(CACK
8bd0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 EY_PCSC_S_OK);..
8be0: 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 }...slot->transa
8bf0: 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f ction_need_hw_lo
8c00: 63 6b 20 3d 20 30 3b 0a 0a 09 73 63 61 72 64 5f ck = 0;...scard_
8c10: 74 72 61 6e 73 5f 72 65 74 20 3d 20 53 43 61 72 trans_ret = SCar
8c20: 64 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f dBeginTransactio
8c30: 6e 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 n(slot->pcsc_car
8c40: 64 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 74 d);..if (scard_t
8c50: 72 61 6e 73 5f 72 65 74 20 21 3d 20 53 43 41 52 rans_ret != SCAR
8c60: 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 D_S_SUCCESS) {..
8c70: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
8c80: 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 INTF("Unable to
8c90: 62 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f begin transactio
8ca0: 6e 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 n, returning in
8cb0: 65 72 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75 error");....retu
8cc0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 rn(CACKEY_PCSC_E
8cd0: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 _GENERIC);..}...
8ce0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
8cf0: 4e 54 46 28 22 53 75 63 65 73 73 66 75 6c 6c 79 NTF("Sucessfully
8d00: 20 62 65 67 61 6e 20 74 72 61 6e 73 61 63 74 69 began transacti
8d10: 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28 25 73 29 22 on on slot (%s)"
8d20: 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 , slot->pcsc_rea
8d30: 64 65 72 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 der);...return(C
8d40: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 ACKEY_PCSC_S_OK)
8d50: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f ;.}../*. * SYNPO
8d60: 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 SIS. * cacke
8d70: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 65 6e 64 y_ret cackey_end
8d80: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 _transaction(str
8d90: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 uct cackey_slot
8da0: 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 *slot);. *. * AR
8db0: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63 GUMENTS. * c
8dc0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 ackey_slot *slot
8dd0: 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 . * Slot
8de0: 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 to send command
8df0: 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45 54 55 52 s to. *. * RETUR
8e00: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 N VALUE. * C
8e10: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 ACKEY_PCSC_S_OK
8e20: 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 On succe
8e30: 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 ss. * CACKEY
8e40: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 _PCSC_E_GENERIC
8e50: 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 On error. *.
8e60: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 * NOTES. * T
8e70: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 71 his function req
8e80: 75 69 72 65 73 20 22 63 61 63 6b 65 79 5f 62 65 uires "cackey_be
8e90: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 gin_transaction"
8ea0: 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 66 69 to be called fi
8eb0: 72 73 74 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 rst. *. */.stati
8ec0: 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 c cackey_ret cac
8ed0: 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 key_end_transact
8ee0: 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65 ion(struct cacke
8ef0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a y_slot *slot) {.
8f00: 09 4c 4f 4e 47 20 73 63 61 72 64 5f 74 72 61 6e .LONG scard_tran
8f10: 73 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f s_ret;...CACKEY_
8f20: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
8f30: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 lled.");...if (!
8f40: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f slot->pcsc_card_
8f50: 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09 43 connected) {...C
8f60: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
8f70: 54 46 28 22 43 61 72 64 20 69 73 20 6e 6f 74 20 TF("Card is not
8f80: 63 6f 6e 6e 65 63 74 65 64 2c 20 75 6e 61 62 6c connected, unabl
8f90: 65 20 74 6f 20 65 6e 64 20 74 72 61 6e 73 61 63 e to end transac
8fa0: 74 69 6f 6e 20 6f 6e 20 63 61 72 64 22 29 3b 0a tion on card");.
8fb0: 0a 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 ...if (slot->tra
8fc0: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e nsaction_depth >
8fd0: 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 0) {....CACKEY_
8fe0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 44 65 DEBUG_PRINTF("De
8ff0: 63 72 65 61 73 69 6e 67 20 74 72 61 6e 73 61 63 creasing transac
9000: 74 69 6f 6e 20 64 65 70 74 68 20 61 6e 64 20 61 tion depth and a
9010: 73 6b 69 6e 67 20 66 6f 72 20 61 20 68 61 72 64 sking for a hard
9020: 77 61 72 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 ware lock on the
9030: 20 6e 65 78 74 20 62 65 67 69 6e 20 74 72 61 6e next begin tran
9040: 73 61 63 74 69 6f 6e 20 28 63 75 72 72 65 6e 74 saction (current
9050: 20 64 65 70 74 68 20 3d 20 25 69 29 22 2c 20 73 depth = %i)", s
9060: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e lot->transaction
9070: 5f 64 65 70 74 68 29 3b 0a 0a 09 09 09 73 6c 6f _depth);.....slo
9080: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 t->transaction_d
9090: 65 70 74 68 2d 2d 3b 0a 0a 09 09 09 69 66 20 28 epth--;.....if (
90a0: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f slot->transactio
90b0: 6e 5f 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 n_depth > 0) {..
90c0: 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 ...slot->transac
90d0: 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 tion_need_hw_loc
90e0: 6b 20 3d 20 31 3b 0a 09 09 09 7d 0a 09 09 7d 0a k = 1;....}...}.
90f0: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 ...return(CACKEY
9100: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 _PCSC_E_GENERIC)
9110: 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 2d ;..}...if (slot-
9120: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 >transaction_dep
9130: 74 68 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 th == 0) {...CAC
9140: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
9150: 28 22 54 65 72 6d 69 6e 61 74 69 6e 67 20 61 20 ("Terminating a
9160: 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 transaction that
9170: 20 68 61 73 20 6e 6f 74 20 62 65 67 75 6e 21 22 has not begun!"
9180: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 );....return(CAC
9190: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 KEY_PCSC_E_GENER
91a0: 49 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e IC);..}...slot->
91b0: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 transaction_dept
91c0: 68 2d 2d 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d h--;...if (slot-
91d0: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 >transaction_dep
91e0: 74 68 20 3e 20 30 29 20 7b 0a 09 09 43 41 43 4b th > 0) {...CACK
91f0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
9200: 22 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 "Transactions st
9210: 69 6c 6c 20 69 6e 20 70 72 6f 67 72 65 73 73 2c ill in progress,
9220: 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 69 6e 67 not terminating
9230: 20 6f 6e 2d 63 61 72 64 20 54 72 61 6e 73 61 63 on-card Transac
9240: 74 69 6f 6e 20 28 63 75 72 72 65 6e 74 20 64 65 tion (current de
9250: 70 74 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74 pth = %i)", slot
9260: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 ->transaction_de
9270: 70 74 68 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 pth);....return(
9280: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b CACKEY_PCSC_S_OK
9290: 29 3b 0a 09 7d 0a 0a 09 73 63 61 72 64 5f 74 72 );..}...scard_tr
92a0: 61 6e 73 5f 72 65 74 20 3d 20 53 43 61 72 64 45 ans_ret = SCardE
92b0: 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c ndTransaction(sl
92c0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 ot->pcsc_card, S
92d0: 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 CARD_LEAVE_CARD)
92e0: 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 74 72 61 ;..if (scard_tra
92f0: 6e 73 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f ns_ret != SCARD_
9300: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43 S_SUCCESS) {...C
9310: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
9320: 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 65 6e TF("Unable to en
9330: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72 d transaction, r
9340: 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f eturning in erro
9350: 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 r");....return(C
9360: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e ACKEY_PCSC_E_GEN
9370: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b ERIC);..}...CACK
9380: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
9390: 22 53 75 63 65 73 73 66 75 6c 6c 79 20 74 65 72 "Sucessfully ter
93a0: 6d 69 6e 61 74 65 64 20 74 72 61 6e 73 61 63 74 minated transact
93b0: 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28 25 73 29 ion on slot (%s)
93c0: 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 ", slot->pcsc_re
93d0: 61 64 65 72 29 3b 0a 0a 09 72 65 74 75 72 6e 28 ader);...return(
93e0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b CACKEY_PCSC_S_OK
93f0: 29 3b 0a 7d 0a 0a 2f 2a 20 41 50 44 55 20 52 65 );.}../* APDU Re
9400: 6c 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 73 20 lated Functions
9410: 2a 2f 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 */./*. * SYNPOSI
9420: 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f S. * cackey_
9430: 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f ret cackey_send_
9440: 61 70 64 75 28 73 74 72 75 63 74 20 63 61 63 6b apdu(struct cack
9450: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 ey_slot *slot, u
9460: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6c 61 nsigned char cla
9470: 73 73 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 ss, unsigned cha
9480: 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 75 r instruction, u
9490: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 31 2c nsigned char p1,
94a0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 unsigned char p
94b0: 32 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2, unsigned char
94c0: 20 6c 63 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 lc, unsigned ch
94d0: 61 72 20 2a 64 61 74 61 2c 20 75 6e 73 69 67 6e ar *data, unsign
94e0: 65 64 20 63 68 61 72 20 6c 65 2c 20 75 69 6e 74 ed char le, uint
94f0: 31 36 5f 74 20 2a 72 65 73 70 63 6f 64 65 2c 20 16_t *respcode,
9500: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 72 unsigned char *r
9510: 65 73 70 64 61 74 61 2c 20 73 69 7a 65 5f 74 20 espdata, size_t
9520: 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a *respdata_len);.
9530: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a *. * ARGUMENTS.
9540: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c * cackey_sl
9550: 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 ot *slot. *
9560: 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 Slot to send
9570: 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a commands to. *.
9580: 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 * unsigned
9590: 63 68 61 72 20 63 6c 61 73 73 0a 20 2a 20 20 20 char class. *
95a0: 20 20 20 20 20 20 41 50 44 55 20 43 6c 61 73 73 APDU Class
95b0: 20 28 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 (GSCIS_CLASS_IS
95c0: 4f 37 38 31 36 20 6f 72 20 47 53 43 49 53 5f 43 O7816 or GSCIS_C
95d0: 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 LASS_GLOBAL_PLAT
95e0: 46 4f 52 4d 0a 20 2a 20 20 20 20 20 20 20 20 20 FORM. *
95f0: 75 73 75 61 6c 6c 79 29 2c 20 28 43 4c 41 29 0a usually), (CLA).
9600: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e *. * unsign
9610: 65 64 20 63 68 61 72 20 69 6e 73 74 72 75 63 74 ed char instruct
9620: 69 6f 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 41 ion. * A
9630: 50 44 55 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 PDU Instruction
9640: 28 49 4e 53 29 0a 20 2a 0a 20 2a 20 20 20 20 20 (INS). *. *
9650: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 31 unsigned char p1
9660: 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 . * APDU
9670: 20 50 61 72 61 6d 65 74 65 72 20 31 20 28 50 31 Parameter 1 (P1
9680: 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 ). *. * unsi
9690: 67 6e 65 64 20 63 68 61 72 20 70 32 0a 20 2a 20 gned char p2. *
96a0: 20 20 20 20 20 20 20 20 41 50 44 55 20 50 61 72 APDU Par
96b0: 61 6d 65 74 65 72 20 32 20 28 50 32 29 0a 20 2a ameter 2 (P2). *
96c0: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 . * unsigned
96d0: 20 63 68 61 72 20 6c 63 0a 20 2a 20 20 20 20 20 char lc. *
96e0: 20 20 20 20 41 50 44 55 20 4c 65 6e 67 74 68 20 APDU Length
96f0: 6f 66 20 43 6f 6e 74 65 6e 74 20 28 4c 63 29 20 of Content (Lc)
9700: 2d 2d 20 74 68 69 73 20 69 73 20 74 68 65 20 6c -- this is the l
9710: 65 6e 67 74 68 20 6f 66 20 22 64 61 74 61 22 0a ength of "data".
9720: 20 2a 20 20 20 20 20 20 20 20 20 70 61 72 61 6d * param
9730: 65 74 65 72 2e 20 20 49 66 20 22 64 61 74 61 22 eter. If "data"
9740: 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73 is specified as
9750: 20 4e 55 4c 4c 2c 20 74 68 69 73 20 70 61 72 61 NULL, this para
9760: 6d 65 74 65 72 20 77 69 6c 6c 0a 20 2a 20 20 20 meter will. *
9770: 20 20 20 20 20 20 62 65 20 69 67 6e 6f 72 65 64 be ignored
9780: 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 .. *. * unsi
9790: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 0a gned char *data.
97a0: 20 2a 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74 * Point
97b0: 65 72 20 74 6f 20 62 75 66 66 65 72 20 74 6f 20 er to buffer to
97c0: 73 65 6e 64 2e 20 20 49 74 20 73 68 6f 75 6c 64 send. It should
97d0: 20 62 65 20 22 4c 63 22 20 62 79 74 65 73 20 6c be "Lc" bytes l
97e0: 6f 6e 67 2e 20 20 49 66 0a 20 2a 20 20 20 20 20 ong. If. *
97f0: 20 20 20 20 73 70 65 63 69 66 69 65 64 20 61 73 specified as
9800: 20 4e 55 4c 4c 2c 20 22 4c 63 22 20 77 69 6c 6c NULL, "Lc" will
9810: 20 6e 6f 74 20 62 65 20 73 65 6e 74 2c 20 61 6e not be sent, an
9820: 64 20 74 68 69 73 20 62 75 66 66 65 72 20 77 69 d this buffer wi
9830: 6c 6c 20 62 65 0a 20 2a 20 20 20 20 20 20 20 20 ll be. *
9840: 20 69 67 6e 6f 72 65 64 2e 0a 20 2a 0a 20 2a 20 ignored.. *. *
9850: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 unsigned cha
9860: 72 20 6c 65 0a 20 2a 20 20 20 20 20 20 20 20 20 r le. *
9870: 41 50 44 55 20 4c 65 6e 67 74 68 20 6f 66 20 45 APDU Length of E
9880: 78 70 65 63 74 61 74 69 6f 6e 20 28 4c 65 29 20 xpectation (Le)
9890: 2d 2d 20 74 68 69 73 20 69 73 20 74 68 65 20 6c -- this is the l
98a0: 65 6e 67 74 68 20 6f 66 20 74 68 65 0a 20 2a 20 ength of the. *
98b0: 20 20 20 20 20 20 20 20 65 78 70 65 63 74 65 64 expected
98c0: 20 72 65 70 6c 79 2e 20 20 49 66 20 74 68 69 73 reply. If this
98d0: 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73 is specified as
98e0: 20 30 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 0 then it will
98f0: 6e 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 62 not. * b
9900: 65 20 73 65 6e 74 2e 0a 20 2a 0a 20 2a 20 20 20 e sent.. *. *
9910: 20 20 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 70 uint16_t *resp
9920: 63 6f 64 65 0a 20 2a 20 20 20 20 20 20 20 20 20 code. *
9930: 5b 4f 55 54 5d 20 50 6f 69 6e 74 65 72 20 74 6f [OUT] Pointer to
9940: 20 73 74 6f 72 61 67 65 20 6f 66 20 41 50 44 55 storage of APDU
9950: 20 72 65 73 70 6f 6e 73 65 20 63 6f 64 65 2e 20 response code.
9960: 20 49 66 20 74 68 69 73 20 69 73 0a 20 2a 20 20 If this is. *
9970: 20 20 20 20 20 20 20 73 70 65 63 69 66 69 65 64 specified
9980: 20 61 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 as NULL, the re
9990: 73 70 6f 6e 73 65 20 63 6f 64 65 20 77 69 6c 6c sponse code will
99a0: 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20 be discarded..
99b0: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 *. * unsigne
99c0: 64 20 63 68 61 72 20 2a 72 65 73 70 64 61 74 61 d char *respdata
99d0: 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54 . * [OUT
99e0: 5d 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74 6f ] Pointer to sto
99f0: 72 61 67 65 20 6f 66 20 41 50 44 55 20 72 65 73 rage of APDU res
9a00: 70 6f 6e 73 65 20 64 61 74 61 2e 20 20 49 66 20 ponse data. If
9a10: 74 68 69 73 20 69 73 0a 20 2a 20 20 20 20 20 20 this is. *
9a20: 20 20 20 73 70 65 63 69 66 69 65 64 20 61 73 20 specified as
9a30: 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 70 6f 6e NULL, the respon
9a40: 73 65 20 64 61 74 61 20 77 69 6c 6c 20 62 65 20 se data will be
9a50: 64 69 73 63 61 72 64 65 64 2e 20 20 49 66 0a 20 discarded. If.
9a60: 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 22 72 * the "r
9a70: 65 73 70 64 61 74 61 5f 6c 65 6e 22 20 70 61 72 espdata_len" par
9a80: 61 6d 65 74 65 72 20 69 73 20 73 70 65 63 69 66 ameter is specif
9a90: 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68 69 ied as NULL, thi
9aa0: 73 20 62 75 66 66 65 72 0a 20 2a 20 20 20 20 20 s buffer. *
9ab0: 20 20 20 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 will not be
9ac0: 75 70 64 61 74 65 64 2e 0a 20 2a 0a 20 2a 20 20 updated.. *. *
9ad0: 20 20 20 73 69 7a 65 5f 74 20 2a 72 65 73 70 64 size_t *respd
9ae0: 61 74 61 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20 ata_len. *
9af0: 20 20 20 5b 49 4e 2c 20 4f 55 54 5d 20 50 6f 69 [IN, OUT] Poi
9b00: 6e 74 65 72 20 69 6e 69 74 69 61 6c 69 6e 67 20 nter initialing
9b10: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 containing the s
9b20: 69 7a 65 20 6f 66 20 74 68 65 20 22 72 65 73 70 ize of the "resp
9b30: 64 61 74 61 22 0a 20 2a 20 20 20 20 20 20 20 20 data". *
9b40: 20 62 75 66 66 65 72 2e 20 20 42 65 66 6f 72 65 buffer. Before
9b50: 20 72 65 74 75 72 6e 69 6e 67 2c 20 74 68 65 20 returning, the
9b60: 70 6f 69 6e 74 65 64 20 74 6f 20 76 61 6c 75 65 pointed to value
9b70: 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 74 is updated to t
9b80: 68 65 0a 20 2a 20 20 20 20 20 20 20 20 20 6e 75 he. * nu
9b90: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 mber of bytes wr
9ba0: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 62 75 66 itten to the buf
9bb0: 66 65 72 2e 20 20 49 66 20 74 68 69 73 20 69 73 fer. If this is
9bc0: 20 73 70 65 63 69 66 69 65 64 20 61 73 0a 20 2a specified as. *
9bd0: 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 69 NULL, i
9be0: 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 t will not be up
9bf0: 64 61 74 65 64 2c 20 61 6e 64 20 22 72 65 73 70 dated, and "resp
9c00: 64 61 74 61 22 20 77 69 6c 6c 20 62 65 20 69 67 data" will be ig
9c10: 6e 6f 72 65 64 20 63 61 75 73 69 6e 67 0a 20 2a nored causing. *
9c20: 20 20 20 20 20 20 20 20 20 74 68 65 20 72 65 73 the res
9c30: 70 6f 6e 73 65 20 64 61 74 61 20 74 6f 20 62 65 ponse data to be
9c40: 20 64 69 73 63 61 72 64 65 64 2e 0a 20 2a 0a 20 discarded.. *.
9c50: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 * RETURN VALUE.
9c60: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 * CACKEY_PCS
9c70: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 C_S_OK
9c80: 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 On success. *
9c90: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 CACKEY_PCSC_E
9ca0: 5f 47 45 4e 45 52 49 43 20 20 20 20 20 20 4f 6e _GENERIC On
9cb0: 20 65 72 72 6f 72 0a 20 2a 20 20 20 20 20 43 41 error. * CA
9cc0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 CKEY_PCSC_E_TOKE
9cd0: 4e 41 42 53 45 4e 54 20 20 49 66 20 74 68 65 20 NABSENT If the
9ce0: 73 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 20 62 sending failed b
9cf0: 65 63 61 75 73 65 20 74 68 65 20 74 6f 6b 65 6e ecause the token
9d00: 20 69 73 0a 20 2a 20 20 20 20 20 20 20 20 20 20 is. *
9d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9d20: 20 20 20 20 20 20 61 62 73 65 6e 74 0a 20 2a 20 absent. *
9d30: 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f CACKEY_PCSC_
9d40: 45 5f 52 45 54 52 59 20 20 20 20 20 20 20 20 49 E_RETRY I
9d50: 66 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 f something that
9d60: 20 6c 6f 6f 6b 73 20 72 65 74 72 79 27 61 62 6c looks retry'abl
9d70: 65 20 77 65 6e 74 0a 20 2a 20 20 20 20 20 20 20 e went. *
9d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9d90: 20 20 20 20 20 20 20 20 20 77 72 6f 6e 67 20 2d wrong -
9da0: 2d 20 74 72 79 20 74 68 65 20 77 68 6f 6c 65 20 - try the whole
9db0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 76 65 72 transaction over
9dc0: 0a 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 . *
9dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9de0: 20 20 20 61 67 61 69 6e 0a 20 2a 0a 20 2a 20 4e again. *. * N
9df0: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 OTES. * This
9e00: 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 63 function will c
9e10: 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20 50 43 onnect to the PC
9e20: 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 4d /SC Connection M
9e30: 61 6e 61 67 65 72 20 76 69 61 0a 20 2a 20 20 20 anager via. *
9e40: 20 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f cackey_pcsc_co
9e50: 6e 6e 65 63 74 28 29 20 69 66 20 6e 65 65 64 65 nnect() if neede
9e60: 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 49 74 20 d.. *. * It
9e70: 77 69 6c 6c 20 63 6f 6e 6e 65 63 74 20 74 6f 20 will connect to
9e80: 74 68 65 20 63 61 72 64 20 69 6e 20 74 68 65 20 the card in the
9e90: 72 65 61 64 65 72 20 61 74 74 61 63 68 65 64 20 reader attached
9ea0: 74 6f 20 74 68 65 20 73 6c 6f 74 0a 20 2a 20 20 to the slot. *
9eb0: 20 20 20 73 70 65 63 69 66 69 65 64 2e 20 20 49 specified. I
9ec0: 74 20 77 69 6c 6c 20 72 65 63 6f 6e 6e 65 63 74 t will reconnect
9ed0: 20 74 6f 20 74 68 65 20 63 61 72 64 20 69 66 20 to the card if
9ee0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 the connection.
9ef0: 2a 20 20 20 20 20 67 6f 65 73 20 61 77 61 79 2e * goes away.
9f00: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 . *. */.static c
9f10: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 ackey_ret cackey
9f20: 5f 73 65 6e 64 5f 61 70 64 75 28 73 74 72 75 63 _send_apdu(struc
9f30: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 t cackey_slot *s
9f40: 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 lot, unsigned ch
9f50: 61 72 20 63 6c 61 73 73 2c 20 75 6e 73 69 67 6e ar class, unsign
9f60: 65 64 20 63 68 61 72 20 69 6e 73 74 72 75 63 74 ed char instruct
9f70: 69 6f 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 ion, unsigned ch
9f80: 61 72 20 70 31 2c 20 75 6e 73 69 67 6e 65 64 20 ar p1, unsigned
9f90: 63 68 61 72 20 70 32 2c 20 75 6e 73 69 67 6e 65 char p2, unsigne
9fa0: 64 20 69 6e 74 20 6c 63 2c 20 75 6e 73 69 67 6e d int lc, unsign
9fb0: 65 64 20 63 68 61 72 20 2a 64 61 74 61 2c 20 75 ed char *data, u
9fc0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 2c 20 nsigned int le,
9fd0: 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f uint16_t *respco
9fe0: 64 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 de, unsigned cha
9ff0: 72 20 2a 72 65 73 70 64 61 74 61 2c 20 73 69 7a r *respdata, siz
a000: 65 5f 74 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 e_t *respdata_le
a010: 6e 29 20 7b 0a 09 75 69 6e 74 38 5f 74 20 6d 61 n) {..uint8_t ma
a020: 6a 6f 72 5f 72 63 2c 20 6d 69 6e 6f 72 5f 72 63 jor_rc, minor_rc
a030: 3b 0a 09 73 69 7a 65 5f 74 20 62 79 74 65 73 5f ;..size_t bytes_
a040: 74 6f 5f 63 6f 70 79 2c 20 74 6d 70 5f 72 65 73 to_copy, tmp_res
a050: 70 64 61 74 61 5f 6c 65 6e 3b 0a 09 4c 50 43 53 pdata_len;..LPCS
a060: 43 41 52 44 5f 49 4f 5f 52 45 51 55 45 53 54 20 CARD_IO_REQUEST
a070: 70 69 6f 53 65 6e 64 50 63 69 3b 0a 09 44 57 4f pioSendPci;..DWO
a080: 52 44 20 78 6d 69 74 5f 6c 65 6e 2c 20 72 65 63 RD xmit_len, rec
a090: 76 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61 v_len;..LONG sca
a0a0: 72 64 5f 78 6d 69 74 5f 72 65 74 2c 20 73 63 61 rd_xmit_ret, sca
a0b0: 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b 0a 09 rd_reconn_ret;..
a0c0: 42 59 54 45 20 78 6d 69 74 5f 62 75 66 5b 31 30 BYTE xmit_buf[10
a0d0: 32 34 5d 2c 20 72 65 63 76 5f 62 75 66 5b 31 30 24], recv_buf[10
a0e0: 32 34 5d 3b 0a 09 69 6e 74 20 70 63 73 63 5f 63 24];..int pcsc_c
a0f0: 6f 6e 6e 65 63 74 5f 72 65 74 2c 20 70 63 73 63 onnect_ret, pcsc
a100: 5f 67 65 74 72 65 73 70 5f 72 65 74 3b 0a 09 69 _getresp_ret;..i
a110: 6e 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 nt idx;...CACKEY
a120: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 _DEBUG_PRINTF("C
a130: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 alled.");...if (
a140: 21 73 6c 6f 74 29 20 7b 0a 09 09 43 41 43 4b 45 !slot) {...CACKE
a150: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
a160: 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 73 70 65 Invalid slot spe
a170: 63 69 66 69 65 64 2e 22 29 3b 0a 0a 09 09 72 65 cified.");....re
a180: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 turn(CACKEY_PCSC
a190: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a _E_GENERIC);..}.
a1a0: 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 ..pcsc_connect_r
a1b0: 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e et = cackey_conn
a1c0: 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a ect_card(slot);.
a1d0: 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 .if (pcsc_connec
a1e0: 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f t_ret != CACKEY_
a1f0: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 PCSC_S_OK) {...C
a200: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
a210: 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f TF("Unable to co
a220: 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72 nnect to card, r
a230: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c eturning in fail
a240: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ure");....return
a250: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 (CACKEY_PCSC_E_G
a260: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a ENERIC);..}.../*
a270: 20 44 65 74 65 72 6d 69 6e 65 20 77 68 69 63 68 Determine which
a280: 20 70 72 6f 74 6f 63 6f 6c 20 74 6f 20 73 65 6e protocol to sen
a290: 64 20 75 73 69 6e 67 20 2a 2f 0a 09 73 77 69 74 d using */..swit
a2a0: 63 68 20 28 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 ch (slot->protoc
a2b0: 6f 6c 29 20 7b 0a 09 09 63 61 73 65 20 53 43 41 ol) {...case SCA
a2c0: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 3a 0a RD_PROTOCOL_T0:.
a2d0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
a2e0: 50 52 49 4e 54 46 28 22 50 72 6f 74 6f 63 6f 6c PRINTF("Protocol
a2f0: 20 74 6f 20 73 65 6e 64 20 64 61 74 61 67 72 61 to send datagra
a300: 6d 20 69 73 20 54 3d 30 22 29 3b 0a 0a 09 09 09 m is T=0");.....
a310: 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53 43 41 pioSendPci = SCA
a320: 52 44 5f 50 43 49 5f 54 30 3b 0a 0a 09 09 09 62 RD_PCI_T0;.....b
a330: 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 53 43 41 reak;...case SCA
a340: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 3a 0a RD_PROTOCOL_T1:.
a350: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
a360: 50 52 49 4e 54 46 28 22 50 72 6f 74 6f 63 6f 6c PRINTF("Protocol
a370: 20 74 6f 20 73 65 6e 64 20 64 61 74 61 67 72 61 to send datagra
a380: 6d 20 69 73 20 54 3d 31 22 29 3b 0a 0a 09 09 09 m is T=1");.....
a390: 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53 43 41 pioSendPci = SCA
a3a0: 52 44 5f 50 43 49 5f 54 31 3b 0a 0a 09 09 09 62 RD_PCI_T1;.....b
a3b0: 72 65 61 6b 3b 0a 09 09 64 65 66 61 75 6c 74 3a reak;...default:
a3c0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
a3d0: 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 _PRINTF("Invalid
a3e0: 20 70 72 6f 74 6f 63 6f 6c 20 66 6f 75 6e 64 2c protocol found,
a3f0: 20 61 62 6f 72 74 69 6e 67 2e 22 29 3b 0a 0a 09 aborting.");...
a400: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f ..return(CACKEY_
a410: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b PCSC_E_GENERIC);
a420: 0a 09 7d 0a 0a 09 2f 2a 20 54 72 61 6e 73 6d 69 ..}.../* Transmi
a430: 74 20 2a 2f 0a 09 78 6d 69 74 5f 6c 65 6e 20 3d t */..xmit_len =
a440: 20 30 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d 0;..xmit_buf[xm
a450: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 63 6c 61 73 it_len++] = clas
a460: 73 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 s;..xmit_buf[xmi
a470: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 69 6e 73 74 72 t_len++] = instr
a480: 75 63 74 69 6f 6e 3b 0a 09 78 6d 69 74 5f 62 75 uction;..xmit_bu
a490: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 f[xmit_len++] =
a4a0: 70 31 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d p1;..xmit_buf[xm
a4b0: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 70 32 3b 0a it_len++] = p2;.
a4c0: 09 69 66 20 28 64 61 74 61 29 20 7b 0a 09 09 69 .if (data) {...i
a4d0: 66 20 28 6c 63 20 3e 20 32 35 35 29 20 7b 0a 09 f (lc > 255) {..
a4e0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
a4f0: 52 49 4e 54 46 28 22 43 41 55 54 49 4f 4e 21 20 RINTF("CAUTION!
a500: 20 55 73 69 6e 67 20 61 6e 20 4c 63 20 67 72 65 Using an Lc gre
a510: 61 74 65 72 20 74 68 61 6e 20 32 35 35 20 69 73 ater than 255 is
a520: 20 75 6e 74 65 73 74 65 64 2e 20 20 4c 63 20 3d untested. Lc =
a530: 20 25 75 22 2c 20 6c 63 29 3b 0a 0a 09 09 09 78 %u", lc);.....x
a540: 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e mit_buf[xmit_len
a550: 2b 2b 5d 20 3d 20 30 78 38 32 3b 20 2f 2a 20 58 ++] = 0x82; /* X
a560: 58 58 20 55 4e 54 45 53 54 45 44 20 2a 2f 0a 09 XX UNTESTED */..
a570: 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f ..xmit_buf[xmit_
a580: 6c 65 6e 2b 2b 5d 20 3d 20 28 6c 63 20 26 20 30 len++] = (lc & 0
a590: 78 66 66 30 30 29 20 3e 3e 20 38 3b 0a 09 09 09 xff00) >> 8;....
a5a0: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 xmit_buf[xmit_le
a5b0: 6e 2b 2b 5d 20 3d 20 6c 63 20 26 20 30 78 66 66 n++] = lc & 0xff
a5c0: 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 ;...} else {....
a5d0: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 xmit_buf[xmit_le
a5e0: 6e 2b 2b 5d 20 3d 20 6c 63 3b 0a 09 09 7d 0a 09 n++] = lc;...}..
a5f0: 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 .for (idx = 0; i
a600: 64 78 20 3c 20 6c 63 3b 20 69 64 78 2b 2b 29 20 dx < lc; idx++)
a610: 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d {....xmit_buf[xm
a620: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 64 61 74 61 it_len++] = data
a630: 5b 69 64 78 5d 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 [idx];...}..}...
a640: 69 66 20 28 6c 65 20 21 3d 20 30 78 30 30 29 20 if (le != 0x00)
a650: 7b 0a 09 09 69 66 20 28 6c 65 20 3e 20 32 35 36 {...if (le > 256
a660: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 ) {....CACKEY_DE
a670: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 41 55 54 BUG_PRINTF("CAUT
a680: 49 4f 4e 21 20 20 55 73 69 6e 67 20 61 6e 20 4c ION! Using an L
a690: 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 32 e greater than 2
a6a0: 35 36 20 69 73 20 75 6e 74 65 73 74 65 64 2e 20 56 is untested.
a6b0: 20 4c 65 20 3d 20 25 75 22 2c 20 6c 65 29 3b 0a Le = %u", le);.
a6c0: 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 ....xmit_buf[xmi
a6d0: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 30 78 38 32 3b t_len++] = 0x82;
a6e0: 20 2f 2a 20 58 58 58 20 55 4e 54 45 53 54 45 44 /* XXX UNTESTED
a6f0: 20 2a 2f 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b */....xmit_buf[
a700: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 28 6c xmit_len++] = (l
a710: 65 20 26 20 30 78 66 66 30 30 29 20 3e 3e 20 38 e & 0xff00) >> 8
a720: 3b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d ;....xmit_buf[xm
a730: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 65 20 26 it_len++] = le &
a740: 20 30 78 66 66 3b 0a 09 09 7d 20 65 6c 73 65 20 0xff;...} else
a750: 69 66 20 28 6c 65 20 3d 3d 20 32 35 36 29 20 7b if (le == 256) {
a760: 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 ....xmit_buf[xmi
a770: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 30 78 30 30 3b t_len++] = 0x00;
a780: 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 78 ...} else {....x
a790: 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e mit_buf[xmit_len
a7a0: 2b 2b 5d 20 3d 20 6c 65 3b 0a 09 09 7d 0a 09 7d ++] = le;...}..}
a7b0: 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 53 6d 61 72 .../* Begin Smar
a7c0: 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f tcard Transactio
a7d0: 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 62 65 67 n */..cackey_beg
a7e0: 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 in_transaction(s
a7f0: 6c 6f 74 29 3b 0a 0a 09 69 66 20 28 63 6c 61 73 lot);...if (clas
a800: 73 20 3d 3d 20 47 53 43 49 53 5f 43 4c 41 53 53 s == GSCIS_CLASS
a810: 5f 49 53 4f 37 38 31 36 20 26 26 20 28 69 6e 73 _ISO7816 && (ins
a820: 74 72 75 63 74 69 6f 6e 20 3d 3d 20 47 53 43 49 truction == GSCI
a830: 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 20 7c S_INSTR_VERIFY |
a840: 7c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 3d 3d | instruction ==
a850: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 43 48 41 GSCIS_INSTR_CHA
a860: 4e 47 45 5f 52 45 46 45 52 45 4e 43 45 29 20 26 NGE_REFERENCE) &
a870: 26 20 70 31 20 3d 3d 20 30 78 30 30 29 20 7b 0a & p1 == 0x00) {.
a880: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
a890: 52 49 4e 54 46 28 22 53 65 6e 64 69 6e 67 20 41 RINTF("Sending A
a8a0: 50 44 55 3a 20 3c 3c 63 65 6e 73 6f 72 65 64 3e PDU: <<censored>
a8b0: 3e 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 >");..} else {..
a8c0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
a8d0: 49 4e 54 42 55 46 28 22 53 65 6e 64 69 6e 67 20 INTBUF("Sending
a8e0: 41 50 44 55 3a 22 2c 20 78 6d 69 74 5f 62 75 66 APDU:", xmit_buf
a8f0: 2c 20 78 6d 69 74 5f 6c 65 6e 29 3b 0a 09 7d 0a , xmit_len);..}.
a900: 0a 09 72 65 63 76 5f 6c 65 6e 20 3d 20 73 69 7a ..recv_len = siz
a910: 65 6f 66 28 72 65 63 76 5f 62 75 66 29 3b 0a 09 eof(recv_buf);..
a920: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d scard_xmit_ret =
a930: 20 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28 73 SCardTransmit(s
a940: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 lot->pcsc_card,
a950: 70 69 6f 53 65 6e 64 50 63 69 2c 20 78 6d 69 74 pioSendPci, xmit
a960: 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20 _buf, xmit_len,
a970: 4e 55 4c 4c 2c 20 72 65 63 76 5f 62 75 66 2c 20 NULL, recv_buf,
a980: 26 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 69 66 &recv_len);...if
a990: 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 (scard_xmit_ret
a9a0: 20 3d 3d 20 53 43 41 52 44 5f 45 5f 4e 4f 54 5f == SCARD_E_NOT_
a9b0: 54 52 41 4e 53 41 43 54 45 44 29 20 7b 0a 09 09 TRANSACTED) {...
a9c0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
a9d0: 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73 NTF("Failed to s
a9e0: 65 6e 64 20 41 50 44 55 20 74 6f 20 63 61 72 64 end APDU to card
a9f0: 20 28 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28 (SCardTransmit(
aa00: 29 20 3d 20 25 73 2f 25 6c 78 29 2c 20 77 69 6c ) = %s/%lx), wil
aa10: 6c 20 61 73 6b 20 63 61 6c 6c 69 6e 67 20 66 75 l ask calling fu
aa20: 6e 63 74 69 6f 6e 20 74 6f 20 72 65 74 72 79 20 nction to retry
aa30: 28 6e 6f 74 20 72 65 73 65 74 74 69 6e 67 20 63 (not resetting c
aa40: 61 72 64 29 2e 2e 2e 22 2c 20 43 41 43 4b 45 59 ard)...", CACKEY
aa50: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 _DEBUG_FUNC_SCAR
aa60: 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 DERR_TO_STR(scar
aa70: 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28 75 6e d_xmit_ret), (un
aa80: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 63 61 signed long) sca
aa90: 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a 09 rd_xmit_ret);...
aaa0: 09 2f 2a 20 42 65 67 69 6e 20 53 6d 61 72 74 63 ./* Begin Smartc
aab0: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 ard Transaction
aac0: 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f */...cackey_end_
aad0: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 transaction(slot
aae0: 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 72 65 63 );....cackey_rec
aaf0: 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 onnect_card(slot
ab00: 2c 20 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c , slot->protocol
ab10: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 );....return(CAC
ab20: 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 KEY_PCSC_E_RETRY
ab30: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 63 61 72 );..}...if (scar
ab40: 64 5f 78 6d 69 74 5f 72 65 74 20 21 3d 20 53 43 d_xmit_ret != SC
ab50: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b ARD_S_SUCCESS) {
ab60: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
ab70: 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 PRINTF("Failed t
ab80: 6f 20 73 65 6e 64 20 41 50 44 55 20 74 6f 20 63 o send APDU to c
ab90: 61 72 64 20 28 53 43 61 72 64 54 72 61 6e 73 6d ard (SCardTransm
aba0: 69 74 28 29 20 3d 20 25 73 2f 25 6c 78 29 22 2c it() = %s/%lx)",
abb0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 CACKEY_DEBUG_FU
abc0: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 NC_SCARDERR_TO_S
abd0: 54 52 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 TR(scard_xmit_re
abe0: 74 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f t), (unsigned lo
abf0: 6e 67 29 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 ng) scard_xmit_r
ac00: 65 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 et);....CACKEY_D
ac10: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 61 72 EBUG_PRINTF("Mar
ac20: 6b 69 6e 67 20 73 6c 6f 74 20 61 73 20 68 61 76 king slot as hav
ac30: 69 6e 67 20 62 65 65 6e 20 72 65 73 65 74 22 29 ing been reset")
ac40: 3b 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f ;...cackey_mark_
ac50: 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 slot_reset(slot)
ac60: 3b 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 78 ;....if (scard_x
ac70: 6d 69 74 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 mit_ret == SCARD
ac80: 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 29 20 7b _W_RESET_CARD) {
ac90: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
aca0: 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 72 _PRINTF("Reset r
acb0: 65 71 75 69 72 65 64 2c 20 70 6c 65 61 73 65 20 equired, please
acc0: 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73 hold...");.....s
acd0: 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 card_reconn_ret
ace0: 3d 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 = cackey_reconne
acf0: 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20 53 43 ct_card(slot, SC
ad00: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 ARD_PROTOCOL_T0
ad10: 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c | SCARD_PROTOCOL
ad20: 5f 54 31 29 3b 0a 0a 09 09 09 69 66 20 28 73 63 _T1);.....if (sc
ad30: 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d ard_reconn_ret =
ad40: 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 = SCARD_S_SUCCES
ad50: 53 29 20 7b 0a 09 09 09 09 73 77 69 74 63 68 20 S) {.....switch
ad60: 28 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 29 (slot->protocol)
ad70: 20 7b 0a 09 09 09 09 09 63 61 73 65 20 53 43 41 {......case SCA
ad80: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 3a 0a RD_PROTOCOL_T0:.
ad90: 09 09 09 09 09 09 70 69 6f 53 65 6e 64 50 63 69 ......pioSendPci
ada0: 20 3d 20 53 43 41 52 44 5f 50 43 49 5f 54 30 3b = SCARD_PCI_T0;
adb0: 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 ........break;..
adc0: 09 09 09 09 63 61 73 65 20 53 43 41 52 44 5f 50 ....case SCARD_P
add0: 52 4f 54 4f 43 4f 4c 5f 54 31 3a 0a 09 09 09 09 ROTOCOL_T1:.....
ade0: 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53 ..pioSendPci = S
adf0: 43 41 52 44 5f 50 43 49 5f 54 31 3b 0a 0a 09 09 CARD_PCI_T1;....
ae00: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 ....break;......
ae10: 64 65 66 61 75 6c 74 3a 0a 09 09 09 09 09 09 43 default:.......C
ae20: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
ae30: 54 46 28 22 49 6e 76 61 6c 69 64 20 70 72 6f 74 TF("Invalid prot
ae40: 6f 63 6f 6c 20 66 6f 75 6e 64 2c 20 62 75 74 20 ocol found, but
ae50: 74 6f 6f 20 6c 61 74 65 20 74 6f 20 64 6f 20 61 too late to do a
ae60: 6e 79 74 68 69 6e 67 20 61 62 6f 75 74 20 69 74 nything about it
ae70: 20 6e 6f 77 20 2d 2d 20 74 72 79 69 6e 67 20 61 now -- trying a
ae80: 6e 79 77 61 79 2e 22 29 3b 0a 0a 09 09 09 09 09 nyway.");.......
ae90: 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 .break;.....}...
aea0: 09 09 09 2f 2a 20 52 65 2d 65 73 74 61 62 6c 69 .../* Re-establi
aeb0: 73 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 sh transaction,
aec0: 69 66 20 69 74 20 77 61 73 20 70 72 65 73 65 6e if it was presen
aed0: 74 20 2a 2f 0a 09 09 09 09 69 66 20 28 73 6c 6f t */.....if (slo
aee0: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 t->transaction_d
aef0: 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09 09 epth > 0) {.....
af00: 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 .slot->transacti
af10: 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 09 09 09 09 on_depth--;.....
af20: 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 .slot->transacti
af30: 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 on_need_hw_lock
af40: 3d 20 31 3b 0a 09 09 09 09 09 63 61 63 6b 65 79 = 1;......cackey
af50: 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 _begin_transacti
af60: 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09 09 09 7d 0a on(slot);.....}.
af70: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
af80: 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 G_PRINTF("Reset
af90: 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 72 successful, retr
afa0: 61 6e 73 6d 69 74 74 69 6e 67 22 29 3b 0a 0a 09 ansmitting");...
afb0: 09 09 09 72 65 63 76 5f 6c 65 6e 20 3d 20 73 69 ...recv_len = si
afc0: 7a 65 6f 66 28 72 65 63 76 5f 62 75 66 29 3b 0a zeof(recv_buf);.
afd0: 09 09 09 09 73 63 61 72 64 5f 78 6d 69 74 5f 72 ....scard_xmit_r
afe0: 65 74 20 3d 20 53 43 61 72 64 54 72 61 6e 73 6d et = SCardTransm
aff0: 69 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 it(slot->pcsc_ca
b000: 72 64 2c 20 70 69 6f 53 65 6e 64 50 63 69 2c 20 rd, pioSendPci,
b010: 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69 74 5f 6c xmit_buf, xmit_l
b020: 65 6e 2c 20 4e 55 4c 4c 2c 20 72 65 63 76 5f 62 en, NULL, recv_b
b030: 75 66 2c 20 26 72 65 63 76 5f 6c 65 6e 29 3b 0a uf, &recv_len);.
b040: 0a 09 09 09 09 69 66 20 28 73 63 61 72 64 5f 78 .....if (scard_x
b050: 6d 69 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44 mit_ret != SCARD
b060: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 _S_SUCCESS) {...
b070: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
b080: 50 52 49 4e 54 46 28 22 52 65 74 72 61 6e 73 6d PRINTF("Retransm
b090: 69 74 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 it failed, retur
b0a0: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20 ning in failure
b0b0: 61 66 74 65 72 20 64 69 73 63 6f 6e 6e 65 63 74 after disconnect
b0c0: 69 6e 67 20 74 68 65 20 63 61 72 64 20 28 53 43 ing the card (SC
b0d0: 61 72 64 54 72 61 6e 73 6d 69 74 20 3d 20 25 73 ardTransmit = %s
b0e0: 2f 25 6c 69 29 22 2c 20 43 41 43 4b 45 59 5f 44 /%li)", CACKEY_D
b0f0: 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 EBUG_FUNC_SCARDE
b100: 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f RR_TO_STR(scard_
b110: 78 6d 69 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 xmit_ret), (long
b120: 29 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 ) scard_xmit_ret
b130: 29 3b 0a 0a 09 09 09 09 09 53 43 61 72 64 44 69 );.......SCardDi
b140: 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 sconnect(slot->p
b150: 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f csc_card, SCARD_
b160: 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 09 09 LEAVE_CARD);....
b170: 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 ..slot->pcsc_car
b180: 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b d_connected = 0;
b190: 0a 0a 09 09 09 09 09 2f 2a 20 45 6e 64 20 53 6d ......./* End Sm
b1a0: 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 artcard Transact
b1b0: 69 6f 6e 20 2a 2f 0a 09 09 09 09 09 73 6c 6f 74 ion */......slot
b1c0: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 ->transaction_de
b1d0: 70 74 68 20 3d 20 31 3b 0a 09 09 09 09 09 63 61 pth = 1;......ca
b1e0: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 ckey_end_transac
b1f0: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 tion(slot);.....
b200: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f ..return(CACKEY_
b210: 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 PCSC_E_TOKENABSE
b220: 4e 54 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 NT);.....}....}
b230: 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45 else {.....CACKE
b240: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
b250: 44 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20 63 61 Disconnecting ca
b260: 72 64 22 29 3b 0a 0a 09 09 09 09 53 43 61 72 64 rd");......SCard
b270: 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d Disconnect(slot-
b280: 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 >pcsc_card, SCAR
b290: 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 D_LEAVE_CARD);..
b2a0: 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 ...slot->pcsc_ca
b2b0: 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 rd_connected = 0
b2c0: 3b 0a 0a 09 09 09 09 2f 2a 20 45 6e 64 20 53 6d ;....../* End Sm
b2d0: 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 artcard Transact
b2e0: 69 6f 6e 20 2a 2f 0a 09 09 09 09 73 6c 6f 74 2d ion */.....slot-
b2f0: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 >transaction_dep
b300: 74 68 20 3d 20 31 3b 0a 09 09 09 09 63 61 63 6b th = 1;.....cack
b310: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 ey_end_transacti
b320: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 43 on(slot);......C
b330: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
b340: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e TF("Returning in
b350: 20 66 61 69 6c 75 72 65 22 29 3b 0a 09 09 09 09 failure");.....
b360: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 return(CACKEY_PC
b370: 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 SC_E_TOKENABSENT
b380: 29 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 );....}...} else
b390: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 {....CACKEY_DEB
b3a0: 55 47 5f 50 52 49 4e 54 46 28 22 44 69 73 63 6f UG_PRINTF("Disco
b3b0: 6e 6e 65 63 74 69 6e 67 20 63 61 72 64 22 29 3b nnecting card");
b3c0: 0a 0a 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e .....SCardDiscon
b3d0: 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f nect(slot->pcsc_
b3e0: 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 card, SCARD_LEAV
b3f0: 45 5f 43 41 52 44 29 3b 0a 09 09 09 73 6c 6f 74 E_CARD);....slot
b400: 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e ->pcsc_card_conn
b410: 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09 2f ected = 0;...../
b420: 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 * End Smartcard
b430: 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 Transaction */..
b440: 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 ..slot->transact
b450: 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a 09 ion_depth = 1;..
b460: 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 ..cackey_end_tra
b470: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a nsaction(slot);.
b480: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
b490: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
b4a0: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b ng in failure");
b4b0: 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 ....return(CACKE
b4c0: 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 Y_PCSC_E_TOKENAB
b4d0: 53 45 4e 54 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 SENT);...}..}...
b4e0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
b4f0: 4e 54 42 55 46 28 22 52 65 74 75 72 6e 65 64 20 NTBUF("Returned
b500: 56 61 6c 75 65 3a 22 2c 20 72 65 63 76 5f 62 75 Value:", recv_bu
b510: 66 2c 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 f, recv_len);...
b520: 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20 32 if (recv_len < 2
b530: 29 20 7b 0a 09 09 2f 2a 20 4d 69 6e 69 6d 61 6c ) {.../* Minimal
b540: 20 72 65 73 70 6f 6e 73 65 20 6c 65 6e 67 74 68 response length
b550: 20 69 73 20 32 20 62 79 74 65 73 2c 20 72 65 74 is 2 bytes, ret
b560: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 urning in failur
b570: 65 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 e */...CACKEY_DE
b580: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 70 BUG_PRINTF("Resp
b590: 6f 6e 73 65 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 onse too small,
b5a0: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 returning in fai
b5b0: 6c 75 72 65 20 28 72 65 63 76 5f 6c 65 6e 20 3d lure (recv_len =
b5c0: 20 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 %lu)", (unsigne
b5d0: 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e d long) recv_len
b5e0: 29 3b 0a 0a 09 09 2f 2a 20 45 6e 64 20 53 6d 61 );..../* End Sma
b5f0: 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 rtcard Transacti
b600: 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 on */...cackey_e
b610: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 nd_transaction(s
b620: 6c 6f 74 29 3b 0a 0a 09 09 2f 2a 20 53 75 70 70 lot);..../* Supp
b630: 6c 79 20 61 6e 20 69 6e 76 61 6c 69 64 20 72 65 ly an invalid re
b640: 73 70 6f 6e 73 65 20 63 6f 64 65 20 2a 2f 0a 09 sponse code */..
b650: 09 69 66 20 28 72 65 73 70 63 6f 64 65 29 20 7b .if (respcode) {
b660: 0a 09 09 09 2a 72 65 73 70 63 6f 64 65 20 3d 20 ....*respcode =
b670: 30 3b 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 0;...}....return
b680: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e (CACKEY_PCSC_E_N
b690: 4f 44 41 54 41 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 ODATA);..}.../*
b6a0: 44 65 74 65 72 6d 69 6e 65 20 72 65 73 75 6c 74 Determine result
b6b0: 20 63 6f 64 65 20 2a 2f 0a 09 6d 61 6a 6f 72 5f code */..major_
b6c0: 72 63 20 3d 20 72 65 63 76 5f 62 75 66 5b 72 65 rc = recv_buf[re
b6d0: 63 76 5f 6c 65 6e 20 2d 20 32 5d 3b 0a 09 6d 69 cv_len - 2];..mi
b6e0: 6e 6f 72 5f 72 63 20 3d 20 72 65 63 76 5f 62 75 nor_rc = recv_bu
b6f0: 66 5b 72 65 63 76 5f 6c 65 6e 20 2d 20 31 5d 3b f[recv_len - 1];
b700: 0a 09 69 66 20 28 72 65 73 70 63 6f 64 65 29 20 ..if (respcode)
b710: 7b 0a 09 09 2a 72 65 73 70 63 6f 64 65 20 3d 20 {...*respcode =
b720: 28 6d 61 6a 6f 72 5f 72 63 20 3c 3c 20 38 29 20 (major_rc << 8)
b730: 7c 20 6d 69 6e 6f 72 5f 72 63 3b 0a 09 7d 0a 0a | minor_rc;..}..
b740: 09 2f 2a 20 41 64 6a 75 73 74 20 6d 65 73 73 61 ./* Adjust messa
b750: 67 65 20 62 75 66 66 65 72 20 2a 2f 0a 09 72 65 ge buffer */..re
b760: 63 76 5f 6c 65 6e 20 2d 3d 20 32 3b 0a 0a 09 2f cv_len -= 2;.../
b770: 2a 20 41 64 64 20 62 79 74 65 73 20 74 6f 20 72 * Add bytes to r
b780: 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 09 eturn value */..
b790: 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e tmp_respdata_len
b7a0: 20 3d 20 30 3b 0a 09 69 66 20 28 72 65 73 70 64 = 0;..if (respd
b7b0: 61 74 61 20 26 26 20 72 65 73 70 64 61 74 61 5f ata && respdata_
b7c0: 6c 65 6e 29 20 7b 0a 09 09 74 6d 70 5f 72 65 73 len) {...tmp_res
b7d0: 70 64 61 74 61 5f 6c 65 6e 20 3d 20 2a 72 65 73 pdata_len = *res
b7e0: 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 62 79 pdata_len;....by
b7f0: 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 2a 72 tes_to_copy = *r
b800: 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 espdata_len;....
b810: 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20 62 if (recv_len < b
b820: 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a ytes_to_copy) {.
b830: 09 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 ...bytes_to_copy
b840: 20 3d 20 72 65 63 76 5f 6c 65 6e 3b 0a 09 09 7d = recv_len;...}
b850: 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
b860: 5f 50 52 49 4e 54 46 28 22 43 6f 70 79 69 6e 67 _PRINTF("Copying
b870: 20 25 6c 75 20 62 79 74 65 73 20 74 6f 20 74 68 %lu bytes to th
b880: 65 20 62 75 66 66 65 72 20 28 72 65 63 76 27 64 e buffer (recv'd
b890: 20 25 6c 75 20 62 79 74 65 73 2c 20 62 75 74 20 %lu bytes, but
b8a0: 6f 6e 6c 79 20 25 6c 75 20 62 79 74 65 73 20 6c only %lu bytes l
b8b0: 65 66 74 20 69 6e 20 6f 75 72 20 62 75 66 66 65 eft in our buffe
b8c0: 72 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c r)", (unsigned l
b8d0: 6f 6e 67 29 20 62 79 74 65 73 5f 74 6f 5f 63 6f ong) bytes_to_co
b8e0: 70 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f py, (unsigned lo
b8f0: 6e 67 29 20 72 65 63 76 5f 6c 65 6e 2c 20 28 75 ng) recv_len, (u
b900: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 72 nsigned long) *r
b910: 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 0a 09 espdata_len);...
b920: 09 6d 65 6d 63 70 79 28 72 65 73 70 64 61 74 61 .memcpy(respdata
b930: 2c 20 72 65 63 76 5f 62 75 66 2c 20 62 79 74 65 , recv_buf, byte
b940: 73 5f 74 6f 5f 63 6f 70 79 29 3b 0a 09 09 72 65 s_to_copy);...re
b950: 73 70 64 61 74 61 20 2b 3d 20 62 79 74 65 73 5f spdata += bytes_
b960: 74 6f 5f 63 6f 70 79 3b 0a 0a 09 09 2a 72 65 73 to_copy;....*res
b970: 70 64 61 74 61 5f 6c 65 6e 20 3d 20 62 79 74 65 pdata_len = byte
b980: 73 5f 74 6f 5f 63 6f 70 79 3b 0a 09 09 74 6d 70 s_to_copy;...tmp
b990: 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 2d 3d _respdata_len -=
b9a0: 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a bytes_to_copy;.
b9b0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 .} else {...if (
b9c0: 72 65 63 76 5f 6c 65 6e 20 21 3d 20 30 29 20 7b recv_len != 0) {
b9d0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
b9e0: 5f 50 52 49 4e 54 46 28 22 54 68 72 6f 77 69 6e _PRINTF("Throwin
b9f0: 67 20 61 77 61 79 20 25 6c 75 20 62 79 74 65 73 g away %lu bytes
ba00: 2c 20 6e 6f 77 68 65 72 65 20 74 6f 20 70 75 74 , nowhere to put
ba10: 20 74 68 65 6d 21 22 2c 20 28 75 6e 73 69 67 6e them!", (unsign
ba20: 65 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65 ed long) recv_le
ba30: 6e 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 n);...}..}...if
ba40: 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d 20 30 78 36 (major_rc == 0x6
ba50: 31 29 20 7b 0a 09 09 2f 2a 20 57 65 20 6e 65 65 1) {.../* We nee
ba60: 64 20 74 6f 20 52 45 41 44 20 2a 2f 0a 09 09 43 d to READ */...C
ba70: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
ba80: 54 46 28 22 42 75 66 66 65 72 20 72 65 61 64 20 TF("Buffer read
ba90: 72 65 71 75 69 72 65 64 22 29 3b 0a 0a 09 09 69 required");....i
baa0: 66 20 28 6d 69 6e 6f 72 5f 72 63 20 3d 3d 20 30 f (minor_rc == 0
bab0: 78 30 30 29 20 7b 0a 09 09 09 6d 69 6e 6f 72 5f x00) {....minor_
bac0: 72 63 20 3d 20 43 41 43 4b 45 59 5f 41 50 44 55 rc = CACKEY_APDU
bad0: 5f 4d 54 55 3b 0a 09 09 7d 0a 0a 09 09 70 63 73 _MTU;...}....pcs
bae0: 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20 3d 20 c_getresp_ret =
baf0: 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 cackey_send_apdu
bb00: 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 (slot, GSCIS_CLA
bb10: 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49 SS_ISO7816, GSCI
bb20: 53 5f 49 4e 53 54 52 5f 47 45 54 5f 52 45 53 50 S_INSTR_GET_RESP
bb30: 4f 4e 53 45 2c 20 30 78 30 30 2c 20 30 78 30 30 ONSE, 0x00, 0x00
bb40: 2c 20 30 2c 20 4e 55 4c 4c 2c 20 6d 69 6e 6f 72 , 0, NULL, minor
bb50: 5f 72 63 2c 20 72 65 73 70 63 6f 64 65 2c 20 72 _rc, respcode, r
bb60: 65 73 70 64 61 74 61 2c 20 26 74 6d 70 5f 72 65 espdata, &tmp_re
bb70: 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 0a 09 09 spdata_len);....
bb80: 69 66 20 28 70 63 73 63 5f 67 65 74 72 65 73 70 if (pcsc_getresp
bb90: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 _ret != CACKEY_P
bba0: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 CSC_S_OK) {....C
bbb0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
bbc0: 54 46 28 22 42 75 66 66 65 72 20 72 65 61 64 20 TF("Buffer read
bbd0: 66 61 69 6c 65 64 21 20 20 52 65 74 75 72 6e 69 failed! Returni
bbe0: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b ng in failure");
bbf0: 0a 0a 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 ...../* End Smar
bc00: 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f tcard Transactio
bc10: 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 65 n */....cackey_e
bc20: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 nd_transaction(s
bc30: 6c 6f 74 29 3b 0a 0a 09 09 09 69 66 20 28 70 63 lot);.....if (pc
bc40: 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20 3d sc_getresp_ret =
bc50: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f = CACKEY_PCSC_E_
bc60: 52 45 54 52 59 29 20 7b 0a 09 09 09 09 72 65 74 RETRY) {.....ret
bc70: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f urn(CACKEY_PCSC_
bc80: 45 5f 52 45 54 52 59 29 3b 0a 09 09 09 7d 0a 0a E_RETRY);....}..
bc90: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 ...return(CACKEY
bca0: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 _PCSC_E_GENERIC)
bcb0: 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72 65 73 ;...}....if (res
bcc0: 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 09 09 pdata_len) {....
bcd0: 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 2b 3d *respdata_len +=
bce0: 20 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 tmp_respdata_le
bcf0: 6e 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 45 6e 64 n;...}..../* End
bd00: 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 Smartcard Trans
bd10: 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b action */...cack
bd20: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 ey_end_transacti
bd30: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 43 41 43 on(slot);....CAC
bd40: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
bd50: 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 ("Returning in s
bd60: 75 63 63 65 73 73 20 28 62 75 66 66 65 72 20 72 uccess (buffer r
bd70: 65 61 64 20 63 6f 6d 70 6c 65 74 65 29 22 29 3b ead complete)");
bd80: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 ...return(CACKEY
bd90: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a _PCSC_S_OK);..}.
bda0: 0a 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 ../* End Smartca
bdb0: 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a rd Transaction *
bdc0: 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 /..cackey_end_tr
bdd0: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b ansaction(slot);
bde0: 0a 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 72 63 20 ...if (major_rc
bdf0: 3d 3d 20 30 78 39 30 29 20 7b 0a 09 09 2f 2a 20 == 0x90) {.../*
be00: 53 75 63 63 65 73 73 20 2a 2f 0a 09 09 43 41 43 Success */...CAC
be10: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
be20: 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 ("Returning in s
be30: 75 63 63 65 73 73 20 28 6d 61 6a 6f 72 5f 72 63 uccess (major_rc
be40: 20 3d 20 30 78 39 30 29 22 29 3b 0a 0a 09 09 72 = 0x90)");....r
be50: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 eturn(CACKEY_PCS
be60: 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 0a 09 43 C_S_OK);..}....C
be70: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
be80: 54 46 28 22 41 50 44 55 20 52 65 74 75 72 6e 65 TF("APDU Returne
be90: 64 20 61 6e 20 65 72 72 6f 72 2c 20 72 65 74 75 d an error, retu
bea0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 rning in failure
beb0: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 ");...return(CAC
bec0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 KEY_PCSC_E_GENER
bed0: 49 43 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75 IC);.}..static u
bee0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 61 nsigned char *ca
bef0: 63 6b 65 79 5f 72 65 61 64 5f 62 65 72 74 6c 76 ckey_read_bertlv
bf00: 5f 74 61 67 28 75 6e 73 69 67 6e 65 64 20 63 68 _tag(unsigned ch
bf10: 61 72 20 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 ar *buffer, size
bf20: 5f 74 20 2a 62 75 66 66 65 72 5f 6c 65 6e 5f 70 _t *buffer_len_p
bf30: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 , unsigned char
bf40: 74 61 67 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 tag, unsigned ch
bf50: 61 72 20 2a 6f 75 74 62 75 66 66 65 72 2c 20 73 ar *outbuffer, s
bf60: 69 7a 65 5f 74 20 2a 6f 75 74 62 75 66 66 65 72 ize_t *outbuffer
bf70: 5f 6c 65 6e 5f 70 29 20 7b 0a 09 75 6e 73 69 67 _len_p) {..unsig
bf80: 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 ned char *buffer
bf90: 5f 70 3b 0a 09 73 69 7a 65 5f 74 20 6f 75 74 62 _p;..size_t outb
bfa0: 75 66 66 65 72 5f 6c 65 6e 2c 20 62 75 66 66 65 uffer_len, buffe
bfb0: 72 5f 6c 65 6e 3b 0a 09 73 69 7a 65 5f 74 20 73 r_len;..size_t s
bfc0: 69 7a 65 3b 0a 09 69 6e 74 20 69 64 78 3b 0a 0a ize;..int idx;..
bfd0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
bfe0: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
bff0: 0a 0a 09 69 66 20 28 62 75 66 66 65 72 5f 6c 65 ...if (buffer_le
c000: 6e 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 n_p == NULL) {..
c010: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
c020: 49 4e 54 46 28 22 62 75 66 66 65 72 5f 6c 65 6e INTF("buffer_len
c030: 5f 70 20 69 73 20 4e 55 4c 4c 2e 20 20 52 65 74 _p is NULL. Ret
c040: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 urning in failur
c050: 65 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 e.");....return(
c060: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 NULL);..}...if (
c070: 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20 outbuffer_len_p
c080: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 == NULL) {...CAC
c090: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
c0a0: 28 22 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 5f ("outbuffer_len_
c0b0: 70 20 69 73 20 4e 55 4c 4c 2e 20 20 52 65 74 75 p is NULL. Retu
c0c0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 rning in failure
c0d0: 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e .");....return(N
c0e0: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 62 75 66 66 65 ULL);..}...buffe
c0f0: 72 5f 6c 65 6e 20 3d 20 2a 6f 75 74 62 75 66 66 r_len = *outbuff
c100: 65 72 5f 6c 65 6e 5f 70 3b 0a 09 6f 75 74 62 75 er_len_p;..outbu
c110: 66 66 65 72 5f 6c 65 6e 20 3d 20 2a 6f 75 74 62 ffer_len = *outb
c120: 75 66 66 65 72 5f 6c 65 6e 5f 70 3b 0a 0a 09 69 uffer_len_p;...i
c130: 66 20 28 62 75 66 66 65 72 5f 6c 65 6e 20 3c 20 f (buffer_len <
c140: 32 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 2) {...CACKEY_DE
c150: 42 55 47 5f 50 52 49 4e 54 46 28 22 62 75 66 66 BUG_PRINTF("buff
c160: 65 72 5f 6c 65 6e 20 69 73 20 6c 65 73 73 20 74 er_len is less t
c170: 68 61 6e 20 32 2c 20 73 6f 20 77 65 20 63 61 6e han 2, so we can
c180: 27 74 20 72 65 61 64 20 61 6e 79 20 74 61 67 2e 't read any tag.
c190: 20 20 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 Returning in f
c1a0: 61 69 6c 75 72 65 2e 22 29 3b 0a 0a 09 09 72 65 ailure.");....re
c1b0: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a turn(NULL);..}..
c1c0: 09 62 75 66 66 65 72 5f 70 20 3d 20 62 75 66 66 .buffer_p = buff
c1d0: 65 72 3b 0a 09 69 66 20 28 62 75 66 66 65 72 5f er;..if (buffer_
c1e0: 70 5b 30 5d 20 21 3d 20 74 61 67 29 20 7b 0a 09 p[0] != tag) {..
c1f0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
c200: 49 4e 54 46 28 22 54 61 67 20 66 6f 75 6e 64 20 INTF("Tag found
c210: 77 61 73 20 6e 6f 74 20 74 61 67 20 65 78 70 65 was not tag expe
c220: 63 74 65 64 2e 20 20 54 61 67 20 3d 20 25 30 32 cted. Tag = %02
c230: 78 2c 20 45 78 70 65 63 74 65 64 20 3d 20 25 30 x, Expected = %0
c240: 32 78 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 69 2x. Returning i
c250: 6e 20 66 61 69 6c 75 72 65 2e 22 2c 20 28 75 6e n failure.", (un
c260: 73 69 67 6e 65 64 20 69 6e 74 29 20 62 75 66 66 signed int) buff
c270: 65 72 5f 70 5b 30 5d 2c 20 74 61 67 29 3b 0a 0a er_p[0], tag);..
c280: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a ..return(NULL);.
c290: 09 7d 0a 0a 09 62 75 66 66 65 72 5f 70 2b 2b 3b .}...buffer_p++;
c2a0: 0a 09 62 75 66 66 65 72 5f 6c 65 6e 2d 2d 3b 0a ..buffer_len--;.
c2b0: 0a 09 69 66 20 28 28 62 75 66 66 65 72 5f 70 5b ..if ((buffer_p[
c2c0: 30 5d 20 26 20 30 78 38 30 29 20 3d 3d 20 30 78 0] & 0x80) == 0x
c2d0: 38 30 29 20 7b 0a 09 09 73 69 7a 65 20 3d 20 30 80) {...size = 0
c2e0: 3b 0a 09 09 69 64 78 20 3d 20 28 62 75 66 66 65 ;...idx = (buffe
c2f0: 72 5f 70 5b 30 5d 20 26 20 30 78 37 66 29 3b 0a r_p[0] & 0x7f);.
c300: 0a 09 09 69 66 20 28 69 64 78 20 3e 20 62 75 66 ...if (idx > buf
c310: 66 65 72 5f 6c 65 6e 29 20 7b 0a 09 09 09 43 41 fer_len) {....CA
c320: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
c330: 46 28 22 4d 61 6c 66 6f 72 6d 65 64 20 42 45 52 F("Malformed BER
c340: 20 76 61 6c 75 65 20 2d 2d 20 6e 6f 74 20 65 6e value -- not en
c350: 6f 75 67 68 20 62 79 74 65 73 20 61 76 61 69 6c ough bytes avail
c360: 61 62 6c 65 20 74 6f 20 72 65 61 64 20 6c 65 6e able to read len
c370: 67 74 68 20 28 69 64 78 20 3d 20 25 69 2c 20 62 gth (idx = %i, b
c380: 75 66 66 65 72 5f 6c 65 6e 20 3d 20 25 6c 75 29 uffer_len = %lu)
c390: 22 2c 20 69 64 78 2c 20 28 75 6e 73 69 67 6e 65 ", idx, (unsigne
c3a0: 64 20 6c 6f 6e 67 29 20 62 75 66 66 65 72 5f 6c d long) buffer_l
c3b0: 65 6e 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 en);.....return(
c3c0: 4e 55 4c 4c 29 3b 0a 09 09 7d 0a 0a 09 09 66 6f NULL);...}....fo
c3d0: 72 20 28 3b 20 69 64 78 20 3e 20 30 3b 20 69 64 r (; idx > 0; id
c3e0: 78 2d 2d 29 20 7b 0a 09 09 09 62 75 66 66 65 72 x--) {....buffer
c3f0: 5f 70 2b 2b 3b 0a 09 09 09 62 75 66 66 65 72 5f _p++;....buffer_
c400: 6c 65 6e 2d 2d 3b 0a 0a 09 09 09 73 69 7a 65 20 len--;.....size
c410: 3c 3c 3d 20 38 3b 0a 09 09 09 73 69 7a 65 20 7c <<= 8;....size |
c420: 3d 20 62 75 66 66 65 72 5f 70 5b 30 5d 3b 0a 09 = buffer_p[0];..
c430: 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 73 .}..} else {...s
c440: 69 7a 65 20 3d 20 62 75 66 66 65 72 5f 70 5b 30 ize = buffer_p[0
c450: 5d 3b 0a 09 7d 0a 0a 09 62 75 66 66 65 72 5f 70 ];..}...buffer_p
c460: 2b 2b 3b 0a 09 62 75 66 66 65 72 5f 6c 65 6e 2d ++;..buffer_len-
c470: 2d 3b 0a 0a 09 69 66 20 28 73 69 7a 65 20 3e 20 -;...if (size >
c480: 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 29 20 7b outbuffer_len) {
c490: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
c4a0: 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 PRINTF("Unable t
c4b0: 6f 20 63 6f 70 79 20 76 61 6c 75 65 20 62 75 66 o copy value buf
c4c0: 66 65 72 20 74 6f 20 6f 75 74 62 75 66 66 65 72 fer to outbuffer
c4d0: 2c 20 6e 6f 74 20 65 6e 6f 75 67 68 20 72 6f 6f , not enough roo
c4e0: 6d 2e 20 20 56 61 6c 75 65 20 62 75 66 66 65 72 m. Value buffer
c4f0: 20 6c 65 6e 67 74 68 20 3d 20 25 6c 75 2c 20 6f length = %lu, o
c500: 75 74 20 62 75 66 66 65 72 20 6c 65 6e 67 74 68 ut buffer length
c510: 20 3d 20 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e = %lu", (unsign
c520: 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65 2c 20 28 ed long) size, (
c530: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f unsigned long) o
c540: 75 74 62 75 66 66 65 72 5f 6c 65 6e 29 3b 0a 0a utbuffer_len);..
c550: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a ..return(NULL);.
c560: 09 7d 0a 0a 09 2a 6f 75 74 62 75 66 66 65 72 5f .}...*outbuffer_
c570: 6c 65 6e 5f 70 20 3d 20 73 69 7a 65 3b 0a 09 69 len_p = size;..i
c580: 66 20 28 6f 75 74 62 75 66 66 65 72 29 20 7b 0a f (outbuffer) {.
c590: 09 09 6d 65 6d 63 70 79 28 6f 75 74 62 75 66 66 ..memcpy(outbuff
c5a0: 65 72 2c 20 62 75 66 66 65 72 5f 70 2c 20 73 69 er, buffer_p, si
c5b0: 7a 65 29 3b 0a 09 09 62 75 66 66 65 72 5f 70 20 ze);...buffer_p
c5c0: 2b 3d 20 73 69 7a 65 3b 0a 09 09 62 75 66 66 65 += size;...buffe
c5d0: 72 5f 6c 65 6e 20 2d 3d 20 73 69 7a 65 3b 0a 0a r_len -= size;..
c5e0: 09 09 2a 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20 ..*buffer_len_p
c5f0: 3d 20 62 75 66 66 65 72 5f 6c 65 6e 3b 0a 0a 09 = buffer_len;...
c600: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
c610: 49 4e 54 42 55 46 28 22 42 45 52 2d 54 4c 56 20 INTBUF("BER-TLV
c620: 72 65 73 75 6c 74 73 3a 22 2c 20 6f 75 74 62 75 results:", outbu
c630: 66 66 65 72 2c 20 73 69 7a 65 29 3b 0a 09 7d 20 ffer, size);..}
c640: 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 6d 6f 76 65 else {...memmove
c650: 28 62 75 66 66 65 72 2c 20 62 75 66 66 65 72 5f (buffer, buffer_
c660: 70 2c 20 73 69 7a 65 29 3b 0a 09 09 62 75 66 66 p, size);...buff
c670: 65 72 5f 70 20 3d 20 62 75 66 66 65 72 3b 0a 0a er_p = buffer;..
c680: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
c690: 52 49 4e 54 42 55 46 28 22 42 45 52 2d 54 4c 56 RINTBUF("BER-TLV
c6a0: 20 72 65 73 75 6c 74 73 3a 22 2c 20 62 75 66 66 results:", buff
c6b0: 65 72 2c 20 73 69 7a 65 29 3b 0a 09 7d 0a 0a 09 er, size);..}...
c6c0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
c6d0: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 NTF("Returning i
c6e0: 6e 20 73 75 63 63 65 73 73 2e 20 20 53 69 7a 65 n success. Size
c6f0: 20 6f 66 20 63 6f 6e 74 65 6e 74 73 20 66 6f 72 of contents for
c700: 20 74 61 67 20 25 30 32 78 20 69 73 20 25 6c 75 tag %02x is %lu
c710: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 ", (unsigned int
c720: 29 20 74 61 67 2c 20 28 75 6e 73 69 67 6e 65 64 ) tag, (unsigned
c730: 20 6c 6f 6e 67 29 20 73 69 7a 65 29 3b 0a 0a 09 long) size);...
c740: 72 65 74 75 72 6e 28 62 75 66 66 65 72 5f 70 29 return(buffer_p)
c750: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f ;.}../*. * SYNPO
c760: 53 49 53 0a 20 2a 20 20 20 20 20 73 73 69 7a 65 SIS. * ssize
c770: 5f 74 20 63 61 63 6b 65 79 5f 67 65 74 5f 64 61 _t cackey_get_da
c780: 74 61 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 ta(struct cackey
c790: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 _slot *slot, uns
c7a0: 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 igned char *buff
c7b0: 65 72 2c 20 73 69 7a 65 5f 74 20 62 75 66 66 65 er, size_t buffe
c7c0: 72 5f 6c 65 6e 2c 20 75 6e 73 69 67 6e 65 64 20 r_len, unsigned
c7d0: 63 68 61 72 20 6f 69 64 5b 33 5d 29 3b 0a 20 2a char oid[3]);. *
c7e0: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a . * ARGUMENTS. *
c7f0: 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63 6b struct cack
c800: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a ey_slot *slot. *
c810: 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f Slot to
c820: 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 send commands t
c830: 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 o. *. * unsi
c840: 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 gned char *buffe
c850: 72 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 r. * [OU
c860: 54 5d 20 42 75 66 66 65 72 0a 20 2a 0a 20 2a 20 T] Buffer. *. *
c870: 20 20 20 20 73 69 7a 65 5f 74 20 62 75 66 66 65 size_t buffe
c880: 72 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20 20 r_len. *
c890: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 Number of bytes
c8a0: 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 72 to attempt to r
c8b0: 65 61 64 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e ead. *. * un
c8c0: 73 69 67 6e 65 64 20 63 68 61 72 20 6f 69 64 5b signed char oid[
c8d0: 33 5d 0a 20 2a 20 20 20 20 20 20 20 20 20 33 2d 3]. * 3-
c8e0: 62 79 74 65 20 4f 49 44 20 74 6f 20 72 65 61 64 byte OID to read
c8f0: 0a 20 2a 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e . *. *. * RETURN
c900: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 54 68 VALUE. * Th
c910: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 is function retu
c920: 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f rns the number o
c930: 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 f bytes actually
c940: 20 72 65 61 64 2c 20 6f 72 20 2d 31 20 6f 6e 20 read, or -1 on
c950: 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 error.. *. * NOT
c960: 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 ES. * None.
c970: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 *. */.static ssi
c980: 7a 65 5f 74 20 63 61 63 6b 65 79 5f 67 65 74 5f ze_t cackey_get_
c990: 64 61 74 61 28 73 74 72 75 63 74 20 63 61 63 6b data(struct cack
c9a0: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 ey_slot *slot, u
c9b0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 nsigned char *bu
c9c0: 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 62 75 66 ffer, size_t buf
c9d0: 66 65 72 5f 6c 65 6e 2c 20 75 6e 73 69 67 6e 65 fer_len, unsigne
c9e0: 64 20 63 68 61 72 20 6f 69 64 5b 33 5d 29 20 7b d char oid[3]) {
c9f0: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 ..unsigned char
ca00: 63 6d 64 5b 5d 20 3d 20 7b 30 78 35 43 2c 20 30 cmd[] = {0x5C, 0
ca10: 78 30 33 2c 20 30 78 30 30 2c 20 30 78 30 30 2c x03, 0x00, 0x00,
ca20: 20 30 78 30 30 7d 3b 0a 09 75 6e 73 69 67 6e 65 0x00};..unsigne
ca30: 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 5f 70 d char *buffer_p
ca40: 3b 0a 09 73 69 7a 65 5f 74 20 69 6e 69 74 5f 62 ;..size_t init_b
ca50: 75 66 66 65 72 5f 6c 65 6e 2c 20 73 69 7a 65 3b uffer_len, size;
ca60: 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70 63 ..uint16_t respc
ca70: 6f 64 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 ode;..int send_r
ca80: 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 et;...CACKEY_DEB
ca90: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
caa0: 64 2e 22 29 3b 0a 0a 09 69 6e 69 74 5f 62 75 66 d.");...init_buf
cab0: 66 65 72 5f 6c 65 6e 20 3d 20 62 75 66 66 65 72 fer_len = buffer
cac0: 5f 6c 65 6e 3b 0a 0a 09 63 6d 64 5b 32 5d 20 3d _len;...cmd[2] =
cad0: 20 6f 69 64 5b 30 5d 3b 0a 09 63 6d 64 5b 33 5d oid[0];..cmd[3]
cae0: 20 3d 20 6f 69 64 5b 31 5d 3b 0a 09 63 6d 64 5b = oid[1];..cmd[
caf0: 34 5d 20 3d 20 6f 69 64 5b 32 5d 3b 0a 0a 09 2f 4] = oid[2];.../
cb00: 2a 20 32 35 36 20 74 6f 20 69 6e 64 69 63 61 74 * 256 to indicat
cb10: 65 20 74 68 65 20 6c 61 72 67 65 73 74 20 6d 65 e the largest me
cb20: 73 73 61 67 65 20 73 69 7a 65 20 2d 2d 20 6e 6f ssage size -- no
cb30: 74 20 63 6c 65 61 72 20 69 66 20 74 68 69 73 20 t clear if this
cb40: 77 69 6c 6c 20 77 6f 72 6b 20 77 69 74 68 20 61 will work with a
cb50: 6c 6c 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 09 ll messages */..
cb60: 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 send_ret = cacke
cb70: 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 y_send_apdu(slot
cb80: 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 , GSCIS_CLASS_IS
cb90: 4f 37 38 31 36 2c 20 4e 49 53 54 53 50 38 30 30 O7816, NISTSP800
cba0: 5f 37 33 5f 33 5f 49 4e 53 54 52 5f 47 45 54 5f _73_3_INSTR_GET_
cbb0: 44 41 54 41 2c 20 30 78 33 46 2c 20 30 78 46 46 DATA, 0x3F, 0xFF
cbc0: 2c 20 73 69 7a 65 6f 66 28 63 6d 64 29 2c 20 63 , sizeof(cmd), c
cbd0: 6d 64 2c 20 32 35 36 2c 20 26 72 65 73 70 63 6f md, 256, &respco
cbe0: 64 65 2c 20 62 75 66 66 65 72 2c 20 26 62 75 66 de, buffer, &buf
cbf0: 66 65 72 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 fer_len);...if (
cc00: 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b send_ret == CACK
cc10: 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29 EY_PCSC_E_RETRY)
cc20: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
cc30: 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20 53 G_PRINTF("ADPU S
cc40: 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 2c 20 72 ending failed, r
cc50: 65 74 72 79 69 6e 67 20 72 65 61 64 20 62 75 66 etrying read buf
cc60: 66 65 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e fer");....return
cc70: 28 63 61 63 6b 65 79 5f 67 65 74 5f 64 61 74 61 (cackey_get_data
cc80: 28 73 6c 6f 74 2c 20 62 75 66 66 65 72 2c 20 69 (slot, buffer, i
cc90: 6e 69 74 5f 62 75 66 66 65 72 5f 6c 65 6e 2c 20 nit_buffer_len,
cca0: 6f 69 64 29 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 oid));..}...if (
ccb0: 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b send_ret != CACK
ccc0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a EY_PCSC_S_OK) {.
ccd0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
cce0: 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 73 65 RINTF("cackey_se
ccf0: 6e 64 5f 61 70 64 75 28 29 20 66 61 69 6c 65 64 nd_apdu() failed
cd00: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 , returning in f
cd10: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 ailure");....ret
cd20: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 23 69 66 urn(-1);..}..#if
cd30: 64 65 66 20 43 41 43 4b 45 59 5f 50 41 52 41 4e def CACKEY_PARAN
cd40: 4f 49 44 0a 23 20 20 69 66 64 65 66 20 5f 50 4f OID.# ifdef _PO
cd50: 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69 SIX_SSIZE_MAX..i
cd60: 66 20 28 62 75 66 66 65 72 5f 6c 65 6e 20 3e 20 f (buffer_len >
cd70: 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 _POSIX_SSIZE_MAX
cd80: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
cd90: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 61 64 20 UG_PRINTF("Read
cda0: 62 79 74 65 73 20 28 62 75 66 66 65 72 5f 6c 65 bytes (buffer_le
cdb0: 6e 29 20 65 78 63 65 65 64 73 20 6d 61 78 69 6d n) exceeds maxim
cdc0: 75 6d 20 76 61 6c 75 65 2c 20 72 65 74 75 72 6e um value, return
cdd0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 ing in failure.
cde0: 28 6d 61 78 20 3d 20 25 6c 69 2c 20 62 75 66 66 (max = %li, buff
cdf0: 65 72 5f 6c 65 6e 20 3d 20 25 6c 75 29 22 2c 20 er_len = %lu)",
ce00: 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53 (long) _POSIX_SS
ce10: 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e IZE_MAX, (unsign
ce20: 65 64 20 6c 6f 6e 67 29 20 62 75 66 66 65 72 5f ed long) buffer_
ce30: 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 len);....return(
ce40: 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69 66 -1);..}.# endif
ce50: 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28 62 75 .#endif...if (bu
ce60: 66 66 65 72 5f 6c 65 6e 20 3c 20 32 29 20 7b 0a ffer_len < 2) {.
ce70: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
ce80: 52 49 4e 54 46 28 22 41 50 44 55 20 47 45 54 20 RINTF("APDU GET
ce90: 44 41 54 41 20 72 65 74 75 72 6e 65 64 20 25 6c DATA returned %l
cea0: 75 20 62 79 74 65 73 2c 20 77 68 69 63 68 20 69 u bytes, which i
ceb0: 73 20 74 6f 6f 20 73 68 6f 72 74 20 66 6f 72 20 s too short for
cec0: 61 20 42 45 52 2d 54 4c 56 20 72 65 73 70 6f 6e a BER-TLV respon
ced0: 73 65 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c se", (unsigned l
cee0: 6f 6e 67 29 20 62 75 66 66 65 72 5f 6c 65 6e 29 ong) buffer_len)
cef0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b ;....return(-1);
cf00: 0a 09 7d 0a 0a 09 73 69 7a 65 20 3d 20 62 75 66 ..}...size = buf
cf10: 66 65 72 5f 6c 65 6e 3b 0a 09 62 75 66 66 65 72 fer_len;..buffer
cf20: 5f 70 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 _p = cackey_read
cf30: 5f 62 65 72 74 6c 76 5f 74 61 67 28 62 75 66 66 _bertlv_tag(buff
cf40: 65 72 2c 20 26 62 75 66 66 65 72 5f 6c 65 6e 2c er, &buffer_len,
cf50: 20 30 78 35 33 2c 20 4e 55 4c 4c 2c 20 26 73 69 0x53, NULL, &si
cf60: 7a 65 29 3b 0a 0a 09 69 66 20 28 62 75 66 66 65 ze);...if (buffe
cf70: 72 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 r_p == NULL) {..
cf80: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
cf90: 49 4e 54 46 28 22 54 61 67 20 64 65 63 6f 64 69 INTF("Tag decodi
cfa0: 6e 67 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 ng failed, retur
cfb0: 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 2e 22 29 ning in error.")
cfc0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b ;....return(-1);
cfd0: 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 ..}...CACKEY_DEB
cfe0: 55 47 5f 50 52 49 4e 54 42 55 46 28 22 47 45 54 UG_PRINTBUF("GET
cff0: 20 44 41 54 41 20 72 65 73 75 6c 74 22 2c 20 62 DATA result", b
d000: 75 66 66 65 72 2c 20 73 69 7a 65 29 3b 0a 0a 09 uffer, size);...
d010: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
d020: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 NTF("Returning i
d030: 6e 20 73 75 63 63 65 73 73 2c 20 72 65 61 64 20 n success, read
d040: 25 6c 75 20 62 79 74 65 73 22 2c 20 28 75 6e 73 %lu bytes", (uns
d050: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65 igned long) size
d060: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 73 69 7a 65 );...return(size
d070: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 );.}../*. * SYNP
d080: 4f 53 49 53 0a 20 2a 20 20 20 20 20 73 73 69 7a OSIS. * ssiz
d090: 65 5f 74 20 63 61 63 6b 65 79 5f 72 65 61 64 5f e_t cackey_read_
d0a0: 62 75 66 66 65 72 28 73 74 72 75 63 74 20 63 61 buffer(struct ca
d0b0: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c ckey_slot *slot,
d0c0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
d0d0: 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 63 buffer, size_t c
d0e0: 6f 75 6e 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 ount, unsigned c
d0f0: 68 61 72 20 74 5f 6f 72 5f 76 2c 20 73 69 7a 65 har t_or_v, size
d100: 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 _t initial_offse
d110: 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 t);. *. * ARGUME
d120: 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63 NTS. * struc
d130: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 t cackey_slot *s
d140: 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 lot. * S
d150: 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d lot to send comm
d160: 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 ands to. *. *
d170: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 unsigned char
d180: 2a 62 75 66 66 65 72 0a 20 2a 20 20 20 20 20 20 *buffer. *
d190: 20 20 20 5b 4f 55 54 5d 20 42 75 66 66 65 72 0a [OUT] Buffer.
d1a0: 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 *. * size_t
d1b0: 20 63 6f 75 6e 74 0a 20 2a 20 20 20 20 20 20 20 count. *
d1c0: 20 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 Number of byte
d1d0: 73 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 s to attempt to
d1e0: 72 65 61 64 0a 20 2a 0a 20 2a 20 20 20 20 20 75 read. *. * u
d1f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 5f 6f nsigned char t_o
d200: 72 5f 76 0a 20 2a 20 20 20 20 20 20 20 20 20 53 r_v. * S
d210: 65 6c 65 63 74 20 74 68 65 20 54 2d 62 75 66 66 elect the T-buff
d220: 65 72 20 28 30 31 29 20 6f 72 20 56 2d 62 75 66 er (01) or V-buf
d230: 66 65 72 20 28 30 32 29 20 74 6f 20 72 65 61 64 fer (02) to read
d240: 20 66 72 6f 6d 2e 20 20 0a 20 2a 0a 20 2a 20 20 from. . *. *
d250: 20 20 20 73 69 7a 65 5f 74 20 69 6e 69 74 69 61 size_t initia
d260: 6c 5f 6f 66 66 73 65 74 0a 20 2a 20 20 20 20 20 l_offset. *
d270: 20 20 20 20 53 70 65 63 69 66 79 20 74 68 65 20 Specify the
d280: 6f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e 20 offset to begin
d290: 74 68 65 20 72 65 61 64 20 66 72 6f 6d 0a 20 2a the read from. *
d2a0: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 . *. * RETURN VA
d2b0: 4c 55 45 0a 20 2a 20 20 20 20 20 54 68 69 73 20 LUE. * This
d2c0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 function returns
d2d0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 the number of b
d2e0: 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 ytes actually re
d2f0: 61 64 2c 20 6f 72 20 2d 31 20 6f 6e 20 65 72 72 ad, or -1 on err
d300: 6f 72 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a or.. *. * NOTES.
d310: 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 * None. *.
d320: 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f */.static ssize_
d330: 74 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 t cackey_read_bu
d340: 66 66 65 72 28 73 74 72 75 63 74 20 63 61 63 6b ffer(struct cack
d350: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 ey_slot *slot, u
d360: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 nsigned char *bu
d370: 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 63 6f 75 ffer, size_t cou
d380: 6e 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nt, unsigned cha
d390: 72 20 74 5f 6f 72 5f 76 2c 20 73 69 7a 65 5f 74 r t_or_v, size_t
d3a0: 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 29 initial_offset)
d3b0: 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 {..unsigned cha
d3c0: 72 20 2a 69 6e 69 74 5f 62 75 66 66 65 72 3b 0a r *init_buffer;.
d3d0: 09 73 69 7a 65 5f 74 20 69 6e 69 74 5f 63 6f 75 .size_t init_cou
d3e0: 6e 74 3b 0a 09 73 69 7a 65 5f 74 20 69 6e 69 74 nt;..size_t init
d3f0: 5f 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 3b _initial_offset;
d400: 0a 0a 09 73 69 7a 65 5f 74 20 6f 66 66 73 65 74 ...size_t offset
d410: 20 3d 20 30 2c 20 6d 61 78 5f 6f 66 66 73 65 74 = 0, max_offset
d420: 2c 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09 75 6e , max_count;..un
d430: 73 69 67 6e 65 64 20 63 68 61 72 20 63 6d 64 5b signed char cmd[
d440: 32 5d 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 2];..uint16_t re
d450: 73 70 63 6f 64 65 3b 0a 09 69 6e 74 20 73 65 6e spcode;..int sen
d460: 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f d_ret;...CACKEY_
d470: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
d480: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 6e 69 74 5f lled.");...init_
d490: 62 75 66 66 65 72 20 3d 20 62 75 66 66 65 72 3b buffer = buffer;
d4a0: 0a 09 69 6e 69 74 5f 63 6f 75 6e 74 20 3d 20 63 ..init_count = c
d4b0: 6f 75 6e 74 3b 0a 09 69 6e 69 74 5f 69 6e 69 74 ount;..init_init
d4c0: 69 61 6c 5f 6f 66 66 73 65 74 20 3d 20 69 6e 69 ial_offset = ini
d4d0: 74 69 61 6c 5f 6f 66 66 73 65 74 3b 0a 0a 09 6d tial_offset;...m
d4e0: 61 78 5f 6f 66 66 73 65 74 20 3d 20 63 6f 75 6e ax_offset = coun
d4f0: 74 3b 0a 09 6d 61 78 5f 63 6f 75 6e 74 20 3d 20 t;..max_count =
d500: 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 3b CACKEY_APDU_MTU;
d510: 0a 0a 09 69 66 20 28 74 5f 6f 72 5f 76 20 21 3d ...if (t_or_v !=
d520: 20 31 20 26 26 20 74 5f 6f 72 5f 76 20 21 3d 20 1 && t_or_v !=
d530: 32 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 2) {...CACKEY_DE
d540: 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 BUG_PRINTF("Inva
d550: 6c 69 64 20 54 20 6f 72 20 56 20 70 61 72 61 6d lid T or V param
d560: 65 74 65 72 20 73 70 65 63 69 66 69 65 64 2c 20 eter specified,
d570: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 returning in fai
d580: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 lure");....retur
d590: 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 63 6d 64 5b n(-1);..}...cmd[
d5a0: 30 5d 20 3d 20 74 5f 6f 72 5f 76 3b 0a 0a 09 77 0] = t_or_v;...w
d5b0: 68 69 6c 65 20 28 31 29 20 7b 0a 09 09 69 66 20 hile (1) {...if
d5c0: 28 6f 66 66 73 65 74 20 3e 3d 20 6d 61 78 5f 6f (offset >= max_o
d5d0: 66 66 73 65 74 29 20 7b 0a 09 09 09 43 41 43 4b ffset) {....CACK
d5e0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
d5f0: 22 42 75 66 66 65 72 20 74 6f 6f 20 73 6d 61 6c "Buffer too smal
d600: 6c 2c 20 72 65 74 75 72 6e 69 6e 67 20 77 68 61 l, returning wha
d610: 74 20 77 65 20 67 6f 74 2e 2e 2e 22 29 3b 0a 0a t we got...");..
d620: 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 ...break;...}...
d630: 09 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 6f 66 66 .count = max_off
d640: 73 65 74 20 2d 20 6f 66 66 73 65 74 3b 0a 09 09 set - offset;...
d650: 69 66 20 28 63 6f 75 6e 74 20 3e 20 6d 61 78 5f if (count > max_
d660: 63 6f 75 6e 74 29 20 7b 0a 09 09 09 63 6f 75 6e count) {....coun
d670: 74 20 3d 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09 t = max_count;..
d680: 09 7d 0a 0a 09 09 63 6d 64 5b 31 5d 20 3d 20 63 .}....cmd[1] = c
d690: 6f 75 6e 74 3b 0a 0a 09 09 73 65 6e 64 5f 72 65 ount;....send_re
d6a0: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f t = cackey_send_
d6b0: 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 apdu(slot, GSCIS
d6c0: 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c _CLASS_GLOBAL_PL
d6d0: 41 54 46 4f 52 4d 2c 20 47 53 43 49 53 5f 49 4e ATFORM, GSCIS_IN
d6e0: 53 54 52 5f 52 45 41 44 5f 42 55 46 46 45 52 2c STR_READ_BUFFER,
d6f0: 20 28 28 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 ((initial_offse
d700: 74 20 2b 20 6f 66 66 73 65 74 29 20 3e 3e 20 38 t + offset) >> 8
d710: 29 20 26 20 30 78 66 66 2c 20 28 69 6e 69 74 69 ) & 0xff, (initi
d720: 61 6c 5f 6f 66 66 73 65 74 20 2b 20 6f 66 66 73 al_offset + offs
d730: 65 74 29 20 26 20 30 78 66 66 2c 20 73 69 7a 65 et) & 0xff, size
d740: 6f 66 28 63 6d 64 29 2c 20 63 6d 64 2c 20 30 78 of(cmd), cmd, 0x
d750: 30 30 2c 20 26 72 65 73 70 63 6f 64 65 2c 20 62 00, &respcode, b
d760: 75 66 66 65 72 20 2b 20 6f 66 66 73 65 74 2c 20 uffer + offset,
d770: 26 63 6f 75 6e 74 29 3b 0a 0a 09 09 69 66 20 28 &count);....if (
d780: 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b send_ret == CACK
d790: 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29 EY_PCSC_E_RETRY)
d7a0: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 {....CACKEY_DEB
d7b0: 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20 UG_PRINTF("ADPU
d7c0: 53 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 2c 20 Sending failed,
d7d0: 72 65 74 72 79 69 6e 67 20 72 65 61 64 20 62 75 retrying read bu
d7e0: 66 66 65 72 22 29 3b 0a 0a 09 09 09 72 65 74 75 ffer");.....retu
d7f0: 72 6e 28 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 rn(cackey_read_b
d800: 75 66 66 65 72 28 73 6c 6f 74 2c 20 69 6e 69 74 uffer(slot, init
d810: 5f 62 75 66 66 65 72 2c 20 69 6e 69 74 5f 63 6f _buffer, init_co
d820: 75 6e 74 2c 20 74 5f 6f 72 5f 76 2c 20 69 6e 69 unt, t_or_v, ini
d830: 74 5f 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 t_initial_offset
d840: 29 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 ));...}....if (s
d850: 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 end_ret != CACKE
d860: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 Y_PCSC_S_OK) {..
d870: 09 09 69 66 20 28 72 65 73 70 63 6f 64 65 20 3d ..if (respcode =
d880: 3d 20 30 78 36 41 38 36 29 20 7b 0a 09 09 09 09 = 0x6A86) {.....
d890: 69 66 20 28 6d 61 78 5f 63 6f 75 6e 74 20 3d 3d if (max_count ==
d8a0: 20 31 29 20 7b 0a 09 09 09 09 09 62 72 65 61 6b 1) {......break
d8b0: 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 6d 61 78 ;.....}......max
d8c0: 5f 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 63 6f 75 _count = max_cou
d8d0: 6e 74 20 2f 20 32 3b 0a 0a 09 09 09 09 63 6f 6e nt / 2;......con
d8e0: 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 tinue;....}.....
d8f0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
d900: 4e 54 46 28 22 63 61 63 6b 65 79 5f 73 65 6e 64 NTF("cackey_send
d910: 5f 61 70 64 75 28 29 20 66 61 69 6c 65 64 2c 20 _apdu() failed,
d920: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 returning in fai
d930: 6c 75 72 65 22 29 3b 0a 0a 09 09 09 72 65 74 75 lure");.....retu
d940: 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 6f rn(-1);...}....o
d950: 66 66 73 65 74 20 2b 3d 20 63 6f 75 6e 74 3b 0a ffset += count;.
d960: 0a 09 09 69 66 20 28 63 6f 75 6e 74 20 3c 20 6d ...if (count < m
d970: 61 78 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43 ax_count) {....C
d980: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
d990: 54 46 28 22 53 68 6f 72 74 20 72 65 61 64 20 2d TF("Short read -
d9a0: 2d 20 63 6f 75 6e 74 20 3d 20 25 69 2c 20 63 6d - count = %i, cm
d9b0: 64 5b 31 5d 20 3d 20 25 69 22 2c 20 28 69 6e 74 d[1] = %i", (int
d9c0: 29 20 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63 ) count, (int) c
d9d0: 6d 64 5b 31 5d 29 3b 0a 0a 09 09 09 62 72 65 61 md[1]);.....brea
d9e0: 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 k;...}..}..#ifde
d9f0: 66 20 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49 f CACKEY_PARANOI
da00: 44 0a 23 20 20 69 66 64 65 66 20 5f 50 4f 53 49 D.# ifdef _POSI
da10: 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20 X_SSIZE_MAX..if
da20: 28 6f 66 66 73 65 74 20 3e 20 5f 50 4f 53 49 58 (offset > _POSIX
da30: 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 _SSIZE_MAX) {...
da40: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
da50: 4e 54 46 28 22 4f 66 66 73 65 74 20 65 78 63 65 NTF("Offset exce
da60: 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 eds maximum valu
da70: 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 e, returning in
da80: 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20 failure. (max =
da90: 25 6c 69 2c 20 6f 66 66 73 65 74 20 3d 20 25 6c %li, offset = %l
daa0: 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 u)", (long) _POS
dab0: 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75 IX_SSIZE_MAX, (u
dac0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 66 nsigned long) of
dad0: 66 73 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e fset);....return
dae0: 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69 (-1);..}.# endi
daf0: 66 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 f.#endif...CACKE
db00: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
db10: 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 Returning in suc
db20: 63 65 73 73 2c 20 72 65 61 64 20 25 6c 75 20 62 cess, read %lu b
db30: 79 74 65 73 22 2c 20 28 75 6e 73 69 67 6e 65 64 ytes", (unsigned
db40: 20 6c 6f 6e 67 29 20 6f 66 66 73 65 74 29 3b 0a long) offset);.
db50: 0a 09 72 65 74 75 72 6e 28 6f 66 66 73 65 74 29 ..return(offset)
db60: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f ;.}../*. * SYNPO
db70: 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 SIS. * cacke
db80: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6c y_ret cackey_sel
db90: 65 63 74 5f 61 70 70 6c 65 74 28 73 74 72 75 63 ect_applet(struc
dba0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 t cackey_slot *s
dbb0: 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 lot, unsigned ch
dbc0: 61 72 20 2a 61 69 64 2c 20 73 69 7a 65 5f 74 20 ar *aid, size_t
dbd0: 61 69 64 5f 6c 65 6e 29 3b 0a 20 2a 0a 20 2a 20 aid_len);. *. *
dbe0: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 ARGUMENTS. *
dbf0: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 struct cackey_s
dc00: 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 lot *slot. *
dc10: 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e Slot to sen
dc20: 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a d commands to. *
dc30: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 . * unsigned
dc40: 20 63 68 61 72 20 2a 61 69 64 0a 20 2a 20 20 20 char *aid. *
dc50: 20 20 20 20 20 20 42 75 66 66 65 72 20 63 6f 6e Buffer con
dc60: 74 61 69 6e 69 6e 67 20 41 70 70 6c 65 74 20 49 taining Applet I
dc70: 44 20 74 6f 20 73 65 6c 65 63 74 0a 20 2a 0a 20 D to select. *.
dc80: 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 61 69 64 * size_t aid
dc90: 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 _len. *
dca0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 Number of bytes
dcb0: 69 6e 20 74 68 65 20 22 61 69 64 22 20 28 41 70 in the "aid" (Ap
dcc0: 70 6c 65 74 20 49 44 29 20 70 61 72 61 6d 65 74 plet ID) paramet
dcd0: 65 72 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 er. *. * RETURN
dce0: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 VALUE. * CAC
dcf0: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 KEY_PCSC_S_OK
dd00: 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 On success
dd10: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 . * CACKEY_P
dd20: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 CSC_E_GENERIC
dd30: 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 On error. *. *
dd40: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e NOTES. * Non
dd50: 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 e. *. */.static
dd60: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 cackey_ret cacke
dd70: 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 y_select_applet(
dd80: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c struct cackey_sl
dd90: 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e ot *slot, unsign
dda0: 65 64 20 63 68 61 72 20 2a 61 69 64 2c 20 73 69 ed char *aid, si
ddb0: 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 29 20 7b 0a ze_t aid_len) {.
ddc0: 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a .int send_ret;..
ddd0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
dde0: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
ddf0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
de00: 50 52 49 4e 54 42 55 46 28 22 53 65 6c 65 63 74 PRINTBUF("Select
de10: 69 6e 67 20 61 70 70 6c 65 74 3a 22 2c 20 61 69 ing applet:", ai
de20: 64 2c 20 61 69 64 5f 6c 65 6e 29 3b 0a 0a 09 73 d, aid_len);...s
de30: 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 end_ret = cackey
de40: 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c _send_apdu(slot,
de50: 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f GSCIS_CLASS_ISO
de60: 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 54 7816, GSCIS_INST
de70: 52 5f 53 45 4c 45 43 54 2c 20 47 53 43 49 53 5f R_SELECT, GSCIS_
de80: 50 41 52 41 4d 5f 53 45 4c 45 43 54 5f 41 50 50 PARAM_SELECT_APP
de90: 4c 45 54 2c 20 30 78 30 30 2c 20 61 69 64 5f 6c LET, 0x00, aid_l
dea0: 65 6e 2c 20 61 69 64 2c 20 30 78 30 30 2c 20 4e en, aid, 0x00, N
deb0: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 ULL, NULL, NULL)
dec0: 3b 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 ;...if (send_ret
ded0: 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f == CACKEY_PCSC_
dee0: 45 5f 52 45 54 52 59 29 20 7b 0a 09 09 43 41 43 E_RETRY) {...CAC
def0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
df00: 28 22 41 44 50 55 20 53 65 6e 64 69 6e 67 20 66 ("ADPU Sending f
df10: 61 69 6c 65 64 2c 20 72 65 74 72 79 69 6e 67 20 ailed, retrying
df20: 73 65 6c 65 63 74 20 61 70 70 6c 65 74 22 29 3b select applet");
df30: 0a 0a 09 09 72 65 74 75 72 6e 28 63 61 63 6b 65 ....return(cacke
df40: 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 y_select_applet(
df50: 73 6c 6f 74 2c 20 61 69 64 2c 20 61 69 64 5f 6c slot, aid, aid_l
df60: 65 6e 29 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 en));..}...if (s
df70: 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 end_ret != CACKE
df80: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 Y_PCSC_S_OK) {..
df90: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
dfa0: 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 INTF("Failed to
dfb0: 6f 70 65 6e 20 61 70 70 6c 65 74 2c 20 72 65 74 open applet, ret
dfc0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 urning in failur
dfd0: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 e");....return(C
dfe0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e ACKEY_PCSC_E_GEN
dff0: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b ERIC);..}...CACK
e000: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
e010: 22 53 75 63 63 65 73 73 66 75 6c 6c 79 20 73 65 "Successfully se
e020: 6c 65 63 74 65 64 20 66 69 6c 65 22 29 3b 0a 0a lected file");..
e030: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 .return(CACKEY_P
e040: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a CSC_S_OK);.}../*
e050: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 . * SYNPOSIS. *
e060: 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 cackey_ret c
e070: 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c ackey_select_fil
e080: 65 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f e(struct cackey_
e090: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74 slot *slot, uint
e0a0: 31 36 5f 74 20 65 66 29 3b 0a 20 2a 0a 20 2a 20 16_t ef);. *. *
e0b0: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 ARGUMENTS. *
e0c0: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 struct cackey_s
e0d0: 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 lot *slot. *
e0e0: 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e Slot to sen
e0f0: 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a d commands to. *
e100: 0a 20 2a 20 20 20 20 20 75 69 6e 74 31 36 5f 74 . * uint16_t
e110: 20 65 66 0a 20 2a 20 20 20 20 20 20 20 20 20 45 ef. * E
e120: 6c 65 6d 65 6e 74 61 6c 20 46 69 6c 65 20 74 6f lemental File to
e130: 20 73 65 6c 65 63 74 0a 20 2a 0a 20 2a 20 52 45 select. *. * RE
e140: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 TURN VALUE. *
e150: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f CACKEY_PCSC_S_
e160: 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 OK On su
e170: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 ccess. * CAC
e180: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 KEY_PCSC_E_GENER
e190: 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 IC On error.
e1a0: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 *. * NOTES. *
e1b0: 20 20 54 68 69 73 20 73 65 6c 65 63 74 73 20 61 This selects a
e1c0: 6e 20 45 6c 65 6d 65 6e 74 61 72 79 20 46 69 6c n Elementary Fil
e1d0: 65 20 28 45 46 29 20 75 6e 64 65 72 20 74 68 65 e (EF) under the
e1e0: 20 63 75 72 72 65 6e 74 6c 79 20 73 65 6c 65 63 currently selec
e1f0: 74 65 64 0a 20 2a 20 20 20 20 20 44 65 64 69 63 ted. * Dedic
e200: 61 74 65 64 20 46 69 6c 65 20 28 44 46 29 0a 20 ated File (DF).
e210: 2a 0a 20 2a 20 20 20 20 20 54 79 70 69 63 61 6c *. * Typical
e220: 6c 79 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 ly this is calle
e230: 64 20 61 66 74 65 72 20 73 65 6c 65 63 74 69 6e d after selectin
e240: 67 20 74 68 65 20 63 6f 72 72 65 63 74 20 41 70 g the correct Ap
e250: 70 6c 65 74 20 28 75 73 69 6e 67 0a 20 2a 20 20 plet (using. *
e260: 20 20 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 cackey_select
e270: 5f 61 70 70 6c 65 74 29 20 66 6f 72 20 56 4d 20 _applet) for VM
e280: 63 61 72 64 73 0a 20 2a 0a 20 2a 2f 0a 73 74 61 cards. *. */.sta
e290: 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 tic cackey_ret c
e2a0: 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c ackey_select_fil
e2b0: 65 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f e(struct cackey_
e2c0: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74 slot *slot, uint
e2d0: 31 36 5f 74 20 65 66 29 20 7b 0a 09 75 6e 73 69 16_t ef) {..unsi
e2e0: 67 6e 65 64 20 63 68 61 72 20 66 69 64 5f 62 75 gned char fid_bu
e2f0: 66 5b 32 5d 3b 0a 09 69 6e 74 20 73 65 6e 64 5f f[2];..int send_
e300: 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ret;...CACKEY_DE
e310: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
e320: 65 64 2e 22 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e ed.");.../* Open
e330: 20 74 68 65 20 65 6c 65 6d 65 6e 74 61 72 79 20 the elementary
e340: 66 69 6c 65 20 2a 2f 0a 09 66 69 64 5f 62 75 66 file */..fid_buf
e350: 5b 30 5d 20 3d 20 28 65 66 20 3e 3e 20 38 29 20 [0] = (ef >> 8)
e360: 26 20 30 78 66 66 3b 0a 09 66 69 64 5f 62 75 66 & 0xff;..fid_buf
e370: 5b 31 5d 20 3d 20 65 66 20 26 20 30 78 66 66 3b [1] = ef & 0xff;
e380: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
e390: 50 52 49 4e 54 46 28 22 53 65 6c 65 63 74 69 6e PRINTF("Selectin
e3a0: 67 20 66 69 6c 65 3a 20 25 30 34 6c 78 22 2c 20 g file: %04lx",
e3b0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
e3c0: 65 66 29 3b 0a 0a 09 73 65 6e 64 5f 72 65 74 20 ef);...send_ret
e3d0: 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 = cackey_send_ap
e3e0: 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 du(slot, GSCIS_C
e3f0: 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 LASS_ISO7816, GS
e400: 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54 CIS_INSTR_SELECT
e410: 2c 20 30 78 30 32 2c 20 30 78 30 43 2c 20 73 69 , 0x02, 0x0C, si
e420: 7a 65 6f 66 28 66 69 64 5f 62 75 66 29 2c 20 66 zeof(fid_buf), f
e430: 69 64 5f 62 75 66 2c 20 30 78 30 30 2c 20 4e 55 id_buf, 0x00, NU
e440: 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b LL, NULL, NULL);
e450: 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21 ..if (send_ret !
e460: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f = CACKEY_PCSC_S_
e470: 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 OK) {...CACKEY_D
e480: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69 EBUG_PRINTF("Fai
e490: 6c 65 64 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 led to open file
e4a0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 , returning in f
e4b0: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 ailure");....ret
e4c0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f urn(CACKEY_PCSC_
e4d0: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a E_GENERIC);..}..
e4e0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
e4f0: 49 4e 54 46 28 22 53 75 63 63 65 73 73 66 75 6c INTF("Successful
e500: 6c 79 20 73 65 6c 65 63 74 65 64 20 66 69 6c 65 ly selected file
e510: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 ");...return(CAC
e520: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a KEY_PCSC_S_OK);.
e530: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 }../*. * SYNPOSI
e540: 53 0a 20 2a 20 20 20 20 20 76 6f 69 64 20 63 61 S. * void ca
e550: 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 73 74 ckey_free_tlv(st
e560: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f ruct cackey_tlv_
e570: 65 6e 74 69 74 79 20 2a 72 6f 6f 74 29 3b 0a 20 entity *root);.
e580: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 *. * ARGUMENTS.
e590: 2a 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63 * struct cac
e5a0: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a key_tlv_entity *
e5b0: 72 6f 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 root. *
e5c0: 52 6f 6f 74 20 6f 66 20 74 68 65 20 54 4c 56 20 Root of the TLV
e5d0: 6c 69 73 74 20 74 6f 20 73 74 61 72 74 20 66 72 list to start fr
e5e0: 65 65 69 6e 67 0a 20 2a 0a 20 2a 20 52 45 54 55 eeing. *. * RETU
e5f0: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 RN VALUE. *
e600: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 None. *. * NOTES
e610: 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e . * This fun
e620: 63 74 69 6f 6e 20 66 72 65 65 73 20 74 68 65 20 ction frees the
e630: 54 4c 56 20 6c 69 6e 6b 65 64 20 6c 69 73 74 65 TLV linked liste
e640: 64 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 0a d returned from.
e650: 20 2a 20 20 20 20 20 22 63 61 63 6b 65 79 5f 72 * "cackey_r
e660: 65 61 64 5f 74 6c 76 22 0a 20 2a 0a 20 2a 2f 0a ead_tlv". *. */.
e670: 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b static void cack
e680: 65 79 5f 66 72 65 65 5f 74 6c 76 28 73 74 72 75 ey_free_tlv(stru
e690: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e ct cackey_tlv_en
e6a0: 74 69 74 79 20 2a 72 6f 6f 74 29 20 7b 0a 09 73 tity *root) {..s
e6b0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 truct cackey_tlv
e6c0: 5f 65 6e 74 69 74 79 20 2a 63 75 72 72 2c 20 2a _entity *curr, *
e6d0: 6e 65 78 74 3b 0a 0a 09 69 66 20 28 72 6f 6f 74 next;...if (root
e6e0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 == NULL) {...re
e6f0: 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 turn;..}...for (
e700: 63 75 72 72 20 3d 20 72 6f 6f 74 3b 20 63 75 72 curr = root; cur
e710: 72 3b 20 63 75 72 72 20 3d 20 6e 65 78 74 29 20 r; curr = next)
e720: 7b 0a 09 09 6e 65 78 74 20 3d 20 63 75 72 72 2d {...next = curr-
e730: 3e 5f 6e 65 78 74 3b 0a 0a 09 09 73 77 69 74 63 >_next;....switc
e740: 68 20 28 63 75 72 72 2d 3e 74 61 67 29 20 7b 0a h (curr->tag) {.
e750: 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 ...case GSCIS_TA
e760: 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 G_ACR_TABLE:....
e770: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 case GSCIS_TAG_C
e780: 45 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09 09 ERTIFICATE:.....
e790: 69 66 20 28 63 75 72 72 2d 3e 76 61 6c 75 65 29 if (curr->value)
e7a0: 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75 72 {......free(cur
e7b0: 72 2d 3e 76 61 6c 75 65 29 3b 0a 09 09 09 09 7d r->value);.....}
e7c0: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 .....break;....c
e7d0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 ase GSCIS_TAG_CA
e7e0: 52 44 55 52 4c 3a 0a 09 09 09 09 69 66 20 28 63 RDURL:.....if (c
e7f0: 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 urr->value_cardu
e800: 72 6c 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28 rl) {......free(
e810: 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 curr->value_card
e820: 75 72 6c 29 3b 0a 09 09 09 09 7d 0a 09 09 09 09 url);.....}.....
e830: 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 66 72 break;...}....fr
e840: 65 65 28 63 75 72 72 29 3b 0a 09 7d 0a 0a 09 72 ee(curr);..}...r
e850: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 eturn;.}../*. *
e860: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 SYNPOSIS. *
e870: 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 .... *. * ARGUME
e880: 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 NTS. * ....
e890: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 *. * RETURN VALU
e8a0: 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a E. * .... *.
e8b0: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 * NOTES. *
e8c0: 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 .... *. */.stati
e8d0: 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f c struct cackey_
e8e0: 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 61 63 6b tlv_entity *cack
e8f0: 65 79 5f 72 65 61 64 5f 74 6c 76 28 73 74 72 75 ey_read_tlv(stru
e900: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a ct cackey_slot *
e910: 73 6c 6f 74 29 20 7b 0a 09 73 74 72 75 63 74 20 slot) {..struct
e920: 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 cackey_tlv_entit
e930: 79 20 2a 63 75 72 72 5f 65 6e 74 69 74 79 2c 20 y *curr_entity,
e940: 2a 72 6f 6f 74 20 3d 20 4e 55 4c 4c 2c 20 2a 6c *root = NULL, *l
e950: 61 73 74 20 3d 20 4e 55 4c 4c 3b 0a 09 75 6e 73 ast = NULL;..uns
e960: 69 67 6e 65 64 20 63 68 61 72 20 74 6c 65 6e 5f igned char tlen_
e970: 62 75 66 5b 32 5d 2c 20 74 76 61 6c 5f 62 75 66 buf[2], tval_buf
e980: 5b 31 30 32 34 5d 2c 20 2a 74 76 61 6c 3b 0a 09 [1024], *tval;..
e990: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 76 6c unsigned char vl
e9a0: 65 6e 5f 62 75 66 5b 32 5d 2c 20 76 76 61 6c 5f en_buf[2], vval_
e9b0: 62 75 66 5b 38 31 39 32 5d 2c 20 2a 76 76 61 6c buf[8192], *vval
e9c0: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 ;..unsigned char
e9d0: 20 2a 74 6d 70 62 75 66 3b 0a 09 75 6e 73 69 67 *tmpbuf;..unsig
e9e0: 6e 65 64 20 6c 6f 6e 67 20 74 6d 70 62 75 66 6c ned long tmpbufl
e9f0: 65 6e 3b 0a 09 73 73 69 7a 65 5f 74 20 74 6c 65 en;..ssize_t tle
ea00: 6e 2c 20 76 6c 65 6e 3b 0a 09 73 73 69 7a 65 5f n, vlen;..ssize_
ea10: 74 20 72 65 61 64 5f 72 65 74 3b 0a 09 73 69 7a t read_ret;..siz
ea20: 65 5f 74 20 6f 66 66 73 65 74 5f 74 20 3d 20 30 e_t offset_t = 0
ea30: 2c 20 6f 66 66 73 65 74 5f 76 20 3d 20 30 3b 0a , offset_v = 0;.
ea40: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 .unsigned char t
ea50: 61 67 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 67 ag;..size_t leng
ea60: 74 68 3b 0a 23 69 66 64 65 66 20 48 41 56 45 5f th;.#ifdef HAVE_
ea70: 4c 49 42 5a 0a 09 69 6e 74 20 75 6e 63 6f 6d 70 LIBZ..int uncomp
ea80: 72 65 73 73 5f 72 65 74 3b 0a 23 65 6e 64 69 66 ress_ret;.#endif
ea90: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
eaa0: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
eab0: 29 3b 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20 );...read_ret =
eac0: 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 cackey_read_buff
ead0: 65 72 28 73 6c 6f 74 2c 20 74 6c 65 6e 5f 62 75 er(slot, tlen_bu
eae0: 66 2c 20 73 69 7a 65 6f 66 28 74 6c 65 6e 5f 62 f, sizeof(tlen_b
eaf0: 75 66 29 2c 20 31 2c 20 6f 66 66 73 65 74 5f 74 uf), 1, offset_t
eb00: 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74 );..if (read_ret
eb10: 20 21 3d 20 73 69 7a 65 6f 66 28 74 6c 65 6e 5f != sizeof(tlen_
eb20: 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 buf)) {...CACKEY
eb30: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
eb40: 65 61 64 20 66 61 69 6c 65 64 2c 20 72 65 74 75 ead failed, retu
eb50: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 rning in failure
eb60: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 ");....return(NU
eb70: 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 6c 65 6e 20 3d LL);..}...tlen =
eb80: 20 28 74 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c (tlen_buf[1] <<
eb90: 20 38 29 20 7c 20 74 6c 65 6e 5f 62 75 66 5b 30 8) | tlen_buf[0
eba0: 5d 3b 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20 ];...read_ret =
ebb0: 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 cackey_read_buff
ebc0: 65 72 28 73 6c 6f 74 2c 20 76 6c 65 6e 5f 62 75 er(slot, vlen_bu
ebd0: 66 2c 20 73 69 7a 65 6f 66 28 76 6c 65 6e 5f 62 f, sizeof(vlen_b
ebe0: 75 66 29 2c 20 32 2c 20 6f 66 66 73 65 74 5f 76 uf), 2, offset_v
ebf0: 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74 );..if (read_ret
ec00: 20 21 3d 20 73 69 7a 65 6f 66 28 76 6c 65 6e 5f != sizeof(vlen_
ec10: 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 buf)) {...CACKEY
ec20: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
ec30: 65 61 64 20 66 61 69 6c 65 64 2c 20 72 65 74 75 ead failed, retu
ec40: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 rning in failure
ec50: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 ");....return(NU
ec60: 4c 4c 29 3b 0a 09 7d 0a 0a 09 76 6c 65 6e 20 3d LL);..}...vlen =
ec70: 20 28 76 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c (vlen_buf[1] <<
ec80: 20 38 29 20 7c 20 76 6c 65 6e 5f 62 75 66 5b 30 8) | vlen_buf[0
ec90: 5d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 ];...CACKEY_DEBU
eca0: 47 5f 50 52 49 4e 54 46 28 22 54 61 67 20 4c 65 G_PRINTF("Tag Le
ecb0: 6e 67 74 68 20 3d 20 25 6c 75 2c 20 56 61 6c 75 ngth = %lu, Valu
ecc0: 65 20 4c 65 6e 67 74 68 20 3d 20 25 6c 75 22 2c e Length = %lu",
ecd0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
ece0: 20 74 6c 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64 tlen, (unsigned
ecf0: 20 6c 6f 6e 67 29 20 76 6c 65 6e 29 3b 0a 0a 09 long) vlen);...
ed00: 6f 66 66 73 65 74 5f 74 20 2b 3d 20 32 3b 0a 09 offset_t += 2;..
ed10: 6f 66 66 73 65 74 5f 76 20 2b 3d 20 32 3b 0a 0a offset_v += 2;..
ed20: 09 69 66 20 28 74 6c 65 6e 20 3e 20 73 69 7a 65 .if (tlen > size
ed30: 6f 66 28 74 76 61 6c 5f 62 75 66 29 29 20 7b 0a of(tval_buf)) {.
ed40: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
ed50: 52 49 4e 54 46 28 22 54 61 67 20 6c 65 6e 67 74 RINTF("Tag lengt
ed60: 68 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20 h is too large,
ed70: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 returning in fai
ed80: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 lure");....retur
ed90: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 n(NULL);..}...if
eda0: 20 28 76 6c 65 6e 20 3e 20 73 69 7a 65 6f 66 28 (vlen > sizeof(
edb0: 76 76 61 6c 5f 62 75 66 29 29 20 7b 0a 09 09 43 vval_buf)) {...C
edc0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
edd0: 54 46 28 22 56 61 6c 75 65 20 6c 65 6e 67 74 68 TF("Value length
ede0: 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20 72 is too large, r
edf0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c eturning in fail
ee00: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ure");....return
ee10: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61 (NULL);..}...rea
ee20: 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 d_ret = cackey_r
ee30: 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c ead_buffer(slot,
ee40: 20 74 76 61 6c 5f 62 75 66 2c 20 74 6c 65 6e 2c tval_buf, tlen,
ee50: 20 31 2c 20 6f 66 66 73 65 74 5f 74 29 3b 0a 09 1, offset_t);..
ee60: 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20 if (read_ret !=
ee70: 74 6c 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59 tlen) {...CACKEY
ee80: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 _DEBUG_PRINTF("U
ee90: 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20 65 6e nable to read en
eea0: 74 69 72 65 20 54 2d 62 75 66 66 65 72 2c 20 72 tire T-buffer, r
eeb0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c eturning in fail
eec0: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ure");....return
eed0: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61 (NULL);..}...rea
eee0: 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 d_ret = cackey_r
eef0: 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c ead_buffer(slot,
ef00: 20 76 76 61 6c 5f 62 75 66 2c 20 76 6c 65 6e 2c vval_buf, vlen,
ef10: 20 32 2c 20 6f 66 66 73 65 74 5f 76 29 3b 0a 09 2, offset_v);..
ef20: 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20 if (read_ret !=
ef30: 76 6c 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59 vlen) {...CACKEY
ef40: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 _DEBUG_PRINTF("U
ef50: 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20 65 6e nable to read en
ef60: 74 69 72 65 20 56 2d 62 75 66 66 65 72 2c 20 72 tire V-buffer, r
ef70: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c eturning in fail
ef80: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ure");....return
ef90: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 76 61 (NULL);..}...tva
efa0: 6c 20 3d 20 74 76 61 6c 5f 62 75 66 3b 0a 09 76 l = tval_buf;..v
efb0: 76 61 6c 20 3d 20 76 76 61 6c 5f 62 75 66 3b 0a val = vval_buf;.
efc0: 09 77 68 69 6c 65 20 28 74 6c 65 6e 20 3e 20 30 .while (tlen > 0
efd0: 20 26 26 20 76 6c 65 6e 20 3e 20 30 29 20 7b 0a && vlen > 0) {.
efe0: 09 09 74 61 67 20 3d 20 2a 74 76 61 6c 3b 0a 09 ..tag = *tval;..
eff0: 09 74 76 61 6c 2b 2b 3b 0a 09 09 74 6c 65 6e 2d .tval++;...tlen-
f000: 2d 3b 0a 0a 09 09 69 66 20 28 2a 74 76 61 6c 20 -;....if (*tval
f010: 3d 3d 20 30 78 66 66 29 20 7b 0a 09 09 09 6c 65 == 0xff) {....le
f020: 6e 67 74 68 20 3d 20 28 74 76 61 6c 5b 32 5d 20 ngth = (tval[2]
f030: 3c 3c 20 38 29 20 7c 20 74 76 61 6c 5b 31 5d 3b << 8) | tval[1];
f040: 0a 09 09 09 74 76 61 6c 20 2b 3d 20 33 3b 0a 09 ....tval += 3;..
f050: 09 09 74 6c 65 6e 20 2d 3d 20 33 3b 0a 09 09 7d ..tlen -= 3;...}
f060: 20 65 6c 73 65 20 7b 0a 09 09 09 6c 65 6e 67 74 else {....lengt
f070: 68 20 3d 20 2a 74 76 61 6c 3b 0a 09 09 09 74 76 h = *tval;....tv
f080: 61 6c 2b 2b 3b 0a 09 09 09 74 6c 65 6e 2d 2d 3b al++;....tlen--;
f090: 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 ...}....CACKEY_D
f0a0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67 EBUG_PRINTF("Tag
f0b0: 3a 20 25 73 20 28 25 30 32 78 29 22 2c 20 43 41 : %s (%02x)", CA
f0c0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f CKEY_DEBUG_FUNC_
f0d0: 54 41 47 5f 54 4f 5f 53 54 52 28 74 61 67 29 2c TAG_TO_STR(tag),
f0e0: 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 (unsigned int)
f0f0: 74 61 67 29 3b 0a 09 09 43 41 43 4b 45 59 5f 44 tag);...CACKEY_D
f100: 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 56 EBUG_PRINTBUF("V
f110: 61 6c 75 65 3a 22 2c 20 76 76 61 6c 2c 20 6c 65 alue:", vval, le
f120: 6e 67 74 68 29 3b 0a 0a 09 09 63 75 72 72 5f 65 ngth);....curr_e
f130: 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 ntity = NULL;...
f140: 73 77 69 74 63 68 20 28 74 61 67 29 20 7b 0a 09 switch (tag) {..
f150: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 ..case GSCIS_TAG
f160: 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09 09 63 75 _CARDURL:.....cu
f170: 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c rr_entity = mall
f180: 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f oc(sizeof(*curr_
f190: 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 63 75 entity));.....cu
f1a0: 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 rr_entity->value
f1b0: 5f 63 61 72 64 75 72 6c 20 3d 20 6d 61 6c 6c 6f _cardurl = mallo
f1c0: 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 c(sizeof(*curr_e
f1d0: 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 ntity->value_car
f1e0: 64 75 72 6c 29 29 3b 0a 0a 09 09 09 09 6d 65 6d durl));......mem
f1f0: 63 70 79 28 63 75 72 72 5f 65 6e 74 69 74 79 2d cpy(curr_entity-
f200: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e >value_cardurl->
f210: 72 69 64 2c 20 76 76 61 6c 2c 20 35 29 3b 0a 09 rid, vval, 5);..
f220: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e ...curr_entity->
f230: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 value_cardurl->a
f240: 70 70 74 79 70 65 20 3d 20 76 76 61 6c 5b 35 5d pptype = vval[5]
f250: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 ;.....curr_entit
f260: 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c y->value_cardurl
f270: 2d 3e 6f 62 6a 65 63 74 69 64 20 3d 20 28 76 76 ->objectid = (vv
f280: 61 6c 5b 36 5d 20 3c 3c 20 38 29 20 7c 20 76 76 al[6] << 8) | vv
f290: 61 6c 5b 37 5d 3b 0a 09 09 09 09 63 75 72 72 5f al[7];.....curr_
f2a0: 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 entity->value_ca
f2b0: 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 3d 20 28 rdurl->appid = (
f2c0: 76 76 61 6c 5b 38 5d 20 3c 3c 20 38 29 20 7c 20 vval[8] << 8) |
f2d0: 76 76 61 6c 5b 39 5d 3b 0a 0a 09 09 09 09 63 75 vval[9];......cu
f2e0: 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d rr_entity->tag =
f2f0: 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 tag;.....curr_e
f300: 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e ntity->_next = N
f310: 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b ULL;......break;
f320: 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 ....case GSCIS_T
f330: 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09 AG_ACR_TABLE:...
f340: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 ..curr_entity =
f350: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 malloc(sizeof(*c
f360: 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 09 09 urr_entity));...
f370: 09 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f ..tmpbuf = mallo
f380: 63 28 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 09 09 c(length);......
f390: 6d 65 6d 63 70 79 28 74 6d 70 62 75 66 2c 20 76 memcpy(tmpbuf, v
f3a0: 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 0a 09 val, length);...
f3b0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e ...curr_entity->
f3c0: 74 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 tag = tag;.....c
f3d0: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e 67 urr_entity->leng
f3e0: 74 68 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09 th = length;....
f3f0: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 .curr_entity->va
f400: 6c 75 65 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09 lue = tmpbuf;...
f410: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f ..curr_entity->_
f420: 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 next = NULL;....
f430: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 ..break;....case
f440: 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 GSCIS_TAG_CERTI
f450: 46 49 43 41 54 45 3a 0a 09 09 09 09 63 75 72 72 FICATE:.....curr
f460: 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 _entity = malloc
f470: 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e (sizeof(*curr_en
f480: 74 69 74 79 29 29 3b 0a 0a 23 69 66 64 65 66 20 tity));..#ifdef
f490: 48 41 56 45 5f 4c 49 42 5a 0a 09 09 09 09 74 6d HAVE_LIBZ.....tm
f4a0: 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 pbuflen = length
f4b0: 20 2a 20 32 3b 0a 09 09 09 09 74 6d 70 62 75 66 * 2;.....tmpbuf
f4c0: 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 66 = malloc(tmpbuf
f4d0: 6c 65 6e 29 3b 0a 0a 09 09 09 09 75 6e 63 6f 6d len);......uncom
f4e0: 70 72 65 73 73 5f 72 65 74 20 3d 20 75 6e 63 6f press_ret = unco
f4f0: 6d 70 72 65 73 73 28 74 6d 70 62 75 66 2c 20 26 mpress(tmpbuf, &
f500: 74 6d 70 62 75 66 6c 65 6e 2c 20 76 76 61 6c 2c tmpbuflen, vval,
f510: 20 6c 65 6e 67 74 68 29 3b 0a 09 09 09 09 69 66 length);.....if
f520: 20 28 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 (uncompress_ret
f530: 20 21 3d 20 5a 5f 4f 4b 29 20 7b 0a 09 09 09 09 != Z_OK) {.....
f540: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
f550: 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 INTF("Failed to
f560: 64 65 63 6f 6d 70 72 65 73 73 2c 20 75 6e 63 6f decompress, unco
f570: 6d 70 72 65 73 73 28 29 20 72 65 74 75 72 6e 65 mpress() returne
f580: 64 20 25 69 20 2d 2d 20 72 65 73 6f 72 74 69 6e d %i -- resortin
f590: 67 20 74 6f 20 64 69 72 65 63 74 20 63 6f 70 79 g to direct copy
f5a0: 22 2c 20 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 ", uncompress_re
f5b0: 74 29 3b 0a 0a 09 09 09 09 09 74 6d 70 62 75 66 t);.......tmpbuf
f5c0: 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 len = length;...
f5d0: 09 09 09 6d 65 6d 63 70 79 28 74 6d 70 62 75 66 ...memcpy(tmpbuf
f5e0: 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b , vval, length);
f5f0: 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b .....}......CACK
f600: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 EY_DEBUG_PRINTBU
f610: 46 28 22 44 65 63 6f 6d 70 72 65 73 73 65 64 20 F("Decompressed
f620: 74 6f 3a 22 2c 20 74 6d 70 62 75 66 2c 20 74 6d to:", tmpbuf, tm
f630: 70 62 75 66 6c 65 6e 29 3b 0a 23 65 6c 73 65 0a pbuflen);.#else.
f640: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
f650: 5f 50 52 49 4e 54 46 28 22 4d 69 73 73 69 6e 67 _PRINTF("Missing
f660: 20 5a 4c 49 42 20 53 75 70 70 6f 72 74 2c 20 74 ZLIB Support, t
f670: 68 69 73 20 63 65 72 74 69 66 69 63 61 74 65 20 his certificate
f680: 69 73 20 6c 69 6b 65 6c 79 20 75 73 65 6c 65 73 is likely useles
f690: 73 2e 2e 2e 22 29 3b 0a 0a 09 09 09 09 74 6d 70 s...");......tmp
f6a0: 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 3b buflen = length;
f6b0: 0a 09 09 09 09 6d 65 6d 63 70 79 28 74 6d 70 62 .....memcpy(tmpb
f6c0: 75 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 uf, vval, length
f6d0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 09 09 09 63 );.#endif......c
f6e0: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20 urr_entity->tag
f6f0: 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f = tag;.....curr_
f700: 65 6e 74 69 74 79 2d 3e 6c 65 6e 67 74 68 20 3d entity->length =
f710: 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 09 09 09 tmpbuflen;.....
f720: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c curr_entity->val
f730: 75 65 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09 ue = tmpbuf;....
f740: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e .curr_entity->_n
f750: 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 ext = NULL;.....
f760: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 .break;....case
f770: 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 53 31 35 GSCIS_TAG_PKCS15
f780: 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 :.....curr_entit
f790: 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f y = malloc(sizeo
f7a0: 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29 f(*curr_entity))
f7b0: 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 ;......curr_enti
f7c0: 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09 ty->tag = tag;..
f7d0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e ...curr_entity->
f7e0: 76 61 6c 75 65 5f 62 79 74 65 20 3d 20 76 76 61 value_byte = vva
f7f0: 6c 5b 30 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65 l[0];.....curr_e
f800: 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e ntity->_next = N
f810: 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b ULL;......break;
f820: 0a 09 09 7d 0a 0a 09 09 76 76 61 6c 20 2b 3d 20 ...}....vval +=
f830: 6c 65 6e 67 74 68 3b 0a 09 09 76 6c 65 6e 20 2d length;...vlen -
f840: 3d 20 6c 65 6e 67 74 68 3b 0a 0a 09 09 69 66 20 = length;....if
f850: 28 63 75 72 72 5f 65 6e 74 69 74 79 20 21 3d 20 (curr_entity !=
f860: 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28 72 NULL) {....if (r
f870: 6f 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 oot == NULL) {..
f880: 09 09 09 72 6f 6f 74 20 3d 20 63 75 72 72 5f 65 ...root = curr_e
f890: 6e 74 69 74 79 3b 0a 09 09 09 7d 0a 0a 09 09 09 ntity;....}.....
f8a0: 69 66 20 28 6c 61 73 74 20 21 3d 20 4e 55 4c 4c if (last != NULL
f8b0: 29 20 7b 0a 09 09 09 09 6c 61 73 74 2d 3e 5f 6e ) {.....last->_n
f8c0: 65 78 74 20 3d 20 63 75 72 72 5f 65 6e 74 69 74 ext = curr_entit
f8d0: 79 3b 0a 09 09 09 7d 0a 0a 09 09 09 6c 61 73 74 y;....}.....last
f8e0: 20 3d 20 63 75 72 72 5f 65 6e 74 69 74 79 3b 0a = curr_entity;.
f8f0: 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 ..}..}...return(
f900: 72 6f 6f 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 root);.}../*. *
f910: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 SYNPOSIS. *
f920: 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 .... *. * ARGUME
f930: 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 NTS. * ....
f940: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 *. * RETURN VALU
f950: 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a E. * .... *.
f960: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 * NOTES. *
f970: 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 .... *. */.stati
f980: 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72 c void cackey_fr
f990: 65 65 5f 63 65 72 74 73 28 73 74 72 75 63 74 20 ee_certs(struct
f9a0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e cackey_pcsc_iden
f9b0: 74 69 74 79 20 2a 73 74 61 72 74 2c 20 73 69 7a tity *start, siz
f9c0: 65 5f 74 20 63 6f 75 6e 74 2c 20 69 6e 74 20 66 e_t count, int f
f9d0: 72 65 65 5f 73 74 61 72 74 29 20 7b 0a 09 73 69 ree_start) {..si
f9e0: 7a 65 5f 74 20 69 64 78 3b 0a 0a 09 69 66 20 28 ze_t idx;...if (
f9f0: 73 74 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b start == NULL) {
fa00: 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 ...return;..}...
fa10: 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 for (idx = 0; id
fa20: 78 20 3c 20 63 6f 75 6e 74 3b 20 69 64 78 2b 2b x < count; idx++
fa30: 29 20 7b 0a 09 09 69 66 20 28 73 74 61 72 74 5b ) {...if (start[
fa40: 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 idx].certificate
fa50: 29 20 7b 0a 09 09 09 66 72 65 65 28 73 74 61 72 ) {....free(star
fa60: 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 t[idx].certifica
fa70: 74 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 te);...}..}...if
fa80: 20 28 66 72 65 65 5f 73 74 61 72 74 29 20 7b 0a (free_start) {.
fa90: 09 09 66 72 65 65 28 73 74 61 72 74 29 3b 0a 09 ..free(start);..
faa0: 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 }...return;.}..s
fab0: 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63 tatic struct cac
fac0: 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 key_pcsc_identit
fad0: 79 20 2a 63 61 63 6b 65 79 5f 63 6f 70 79 5f 63 y *cackey_copy_c
fae0: 65 72 74 73 28 73 74 72 75 63 74 20 63 61 63 6b erts(struct cack
faf0: 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 ey_pcsc_identity
fb00: 20 2a 64 65 73 74 2c 20 73 74 72 75 63 74 20 63 *dest, struct c
fb10: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 ackey_pcsc_ident
fb20: 69 74 79 20 2a 73 74 61 72 74 2c 20 73 69 7a 65 ity *start, size
fb30: 5f 74 20 63 6f 75 6e 74 29 20 7b 0a 09 73 69 7a _t count) {..siz
fb40: 65 5f 74 20 69 64 78 3b 0a 0a 09 69 66 20 28 73 e_t idx;...if (s
fb50: 74 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a tart == NULL) {.
fb60: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a ..return(NULL);.
fb70: 09 7d 0a 0a 09 69 66 20 28 64 65 73 74 20 3d 3d .}...if (dest ==
fb80: 20 4e 55 4c 4c 29 20 7b 0a 09 09 64 65 73 74 20 NULL) {...dest
fb90: 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 = malloc(sizeof(
fba0: 2a 64 65 73 74 29 20 2a 20 63 6f 75 6e 74 29 3b *dest) * count);
fbb0: 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d ..}...for (idx =
fbc0: 20 30 3b 20 69 64 78 20 3c 20 63 6f 75 6e 74 3b 0; idx < count;
fbd0: 20 69 64 78 2b 2b 29 20 7b 0a 09 09 64 65 73 74 idx++) {...dest
fbe0: 5b 69 64 78 5d 2e 69 64 5f 74 79 70 65 20 3d 20 [idx].id_type =
fbf0: 73 74 61 72 74 5b 69 64 78 5d 2e 69 64 5f 74 79 start[idx].id_ty
fc00: 70 65 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 64 pe;....switch (d
fc10: 65 73 74 5b 69 64 78 5d 2e 69 64 5f 74 79 70 65 est[idx].id_type
fc20: 29 20 7b 0a 09 09 09 63 61 73 65 20 43 41 43 4b ) {....case CACK
fc30: 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a 0a EY_ID_TYPE_CAC:.
fc40: 09 09 09 09 6d 65 6d 63 70 79 28 64 65 73 74 5b ....memcpy(dest[
fc50: 69 64 78 5d 2e 63 61 72 64 2e 63 61 63 2e 61 70 idx].card.cac.ap
fc60: 70 6c 65 74 2c 20 73 74 61 72 74 5b 69 64 78 5d plet, start[idx]
fc70: 2e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 .card.cac.applet
fc80: 2c 20 73 69 7a 65 6f 66 28 64 65 73 74 5b 69 64 , sizeof(dest[id
fc90: 78 5d 2e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c x].card.cac.appl
fca0: 65 74 29 29 3b 0a 09 09 09 09 64 65 73 74 5b 69 et));.....dest[i
fcb0: 64 78 5d 2e 63 61 72 64 2e 63 61 63 2e 66 69 6c dx].card.cac.fil
fcc0: 65 20 3d 20 73 74 61 72 74 5b 69 64 78 5d 2e 63 e = start[idx].c
fcd0: 61 72 64 2e 63 61 63 2e 66 69 6c 65 3b 0a 09 09 ard.cac.file;...
fce0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 ..break;....case
fcf0: 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f CACKEY_ID_TYPE_
fd00: 50 49 56 3a 0a 09 09 09 09 64 65 73 74 5b 69 64 PIV:.....dest[id
fd10: 78 5d 2e 63 61 72 64 2e 70 69 76 2e 6b 65 79 5f x].card.piv.key_
fd20: 69 64 20 3d 20 73 74 61 72 74 5b 69 64 78 5d 2e id = start[idx].
fd30: 63 61 72 64 2e 70 69 76 2e 6b 65 79 5f 69 64 3b card.piv.key_id;
fd40: 0a 09 09 09 09 6d 65 6d 63 70 79 28 64 65 73 74 .....memcpy(dest
fd50: 5b 69 64 78 5d 2e 63 61 72 64 2e 70 69 76 2e 6c [idx].card.piv.l
fd60: 61 62 65 6c 2c 20 73 74 61 72 74 5b 69 64 78 5d abel, start[idx]
fd70: 2e 63 61 72 64 2e 70 69 76 2e 6c 61 62 65 6c 2c .card.piv.label,
fd80: 20 73 69 7a 65 6f 66 28 64 65 73 74 5b 69 64 78 sizeof(dest[idx
fd90: 5d 2e 63 61 72 64 2e 70 69 76 2e 6c 61 62 65 6c ].card.piv.label
fda0: 29 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 ));.....break;..
fdb0: 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 ..case CACKEY_ID
fdc0: 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 3a _TYPE_CERT_ONLY:
fdd0: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a .....break;...}.
fde0: 09 09 64 65 73 74 5b 69 64 78 5d 2e 63 65 72 74 ..dest[idx].cert
fdf0: 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 73 74 ificate_len = st
fe00: 61 72 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 art[idx].certifi
fe10: 63 61 74 65 5f 6c 65 6e 3b 0a 09 09 64 65 73 74 cate_len;...dest
fe20: 5b 69 64 78 5d 2e 6b 65 79 73 69 7a 65 20 3d 20 [idx].keysize =
fe30: 73 74 61 72 74 5b 69 64 78 5d 2e 6b 65 79 73 69 start[idx].keysi
fe40: 7a 65 3b 0a 0a 09 09 64 65 73 74 5b 69 64 78 5d ze;....dest[idx]
fe50: 2e 63 65 72 74 69 66 69 63 61 74 65 20 3d 20 6d .certificate = m
fe60: 61 6c 6c 6f 63 28 64 65 73 74 5b 69 64 78 5d 2e alloc(dest[idx].
fe70: 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 certificate_len)
fe80: 3b 0a 09 09 6d 65 6d 63 70 79 28 64 65 73 74 5b ;...memcpy(dest[
fe90: 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 idx].certificate
fea0: 2c 20 73 74 61 72 74 5b 69 64 78 5d 2e 63 65 72 , start[idx].cer
feb0: 74 69 66 69 63 61 74 65 2c 20 64 65 73 74 5b 69 tificate, dest[i
fec0: 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f dx].certificate_
fed0: 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 len);..}...retur
fee0: 6e 28 64 65 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 n(dest);.}../*.
fef0: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 * SYNPOSIS. *
ff00: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 .... *. * ARGU
ff10: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e MENTS. * ...
ff20: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 . *. * RETURN VA
ff30: 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 LUE. * ....
ff40: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 *. * NOTES. *
ff50: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 .... *. */.sta
ff60: 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 tic struct cacke
ff70: 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 y_pcsc_identity
ff80: 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 *cackey_read_cer
ff90: 74 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 ts(struct cackey
ffa0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 73 74 72 _slot *slot, str
ffb0: 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f uct cackey_pcsc_
ffc0: 69 64 65 6e 74 69 74 79 20 2a 63 65 72 74 73 2c identity *certs,
ffd0: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a unsigned long *
ffe0: 63 6f 75 6e 74 29 20 7b 0a 09 73 74 72 75 63 74 count) {..struct
fff0: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 cackey_pcsc_ide
10000 6e 74 69 74 79 20 2a 63 75 72 72 5f 69 64 3b 0a ntity *curr_id;.
10010 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 .struct cackey_t
10020 6c 76 5f 65 6e 74 69 74 79 20 2a 63 63 63 5f 74 lv_entity *ccc_t
10030 6c 76 2c 20 2a 63 63 63 5f 63 75 72 72 2c 20 2a lv, *ccc_curr, *
10040 61 70 70 5f 74 6c 76 2c 20 2a 61 70 70 5f 63 75 app_tlv, *app_cu
10050 72 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 rr;..unsigned ch
10060 61 72 20 63 63 63 5f 61 69 64 5b 5d 20 3d 20 7b ar ccc_aid[] = {
10070 47 53 43 49 53 5f 41 49 44 5f 43 43 43 7d 2c 20 GSCIS_AID_CCC},
10080 70 69 76 5f 61 69 64 5b 5d 20 3d 20 7b 4e 49 53 piv_aid[] = {NIS
10090 54 53 50 38 30 30 5f 37 33 5f 33 5f 50 49 56 5f TSP800_73_3_PIV_
100a0 41 49 44 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 AID};..unsigned
100b0 63 68 61 72 20 2a 70 69 76 5f 6f 69 64 2c 20 70 char *piv_oid, p
100c0 69 76 5f 6f 69 64 5f 70 69 76 61 75 74 68 5b 5d iv_oid_pivauth[]
100d0 20 3d 20 7b 4e 49 53 54 53 50 38 30 30 5f 37 33 = {NISTSP800_73
100e0 5f 33 5f 4f 49 44 5f 50 49 56 41 55 54 48 7d 2c _3_OID_PIVAUTH},
100f0 20 70 69 76 5f 6f 69 64 5f 73 69 67 6e 61 74 75 piv_oid_signatu
10100 72 65 5b 5d 20 3d 20 7b 4e 49 53 54 53 50 38 30 re[] = {NISTSP80
10110 30 5f 37 33 5f 33 5f 4f 49 44 5f 53 49 47 4e 41 0_73_3_OID_SIGNA
10120 54 55 52 45 7d 2c 20 70 69 76 5f 6f 69 64 5f 6b TURE}, piv_oid_k
10130 65 79 6d 67 74 5b 5d 20 3d 20 7b 4e 49 53 54 53 eymgt[] = {NISTS
10140 50 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 4b 45 P800_73_3_OID_KE
10150 59 4d 47 54 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 YMGT};..unsigned
10160 20 63 68 61 72 20 63 75 72 72 5f 61 69 64 5b 37 char curr_aid[7
10170 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 ];..unsigned cha
10180 72 20 62 75 66 66 65 72 5b 38 31 39 32 5d 2c 20 r buffer[8192],
10190 2a 62 75 66 66 65 72 5f 70 2c 20 2a 74 6d 70 62 *buffer_p, *tmpb
101a0 75 66 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f uf;..unsigned lo
101b0 6e 67 20 6f 75 74 69 64 78 20 3d 20 30 3b 0a 09 ng outidx = 0;..
101c0 63 68 61 72 20 2a 70 69 76 5f 6c 61 62 65 6c 3b char *piv_label;
101d0 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 74 72 61 ..cackey_ret tra
101e0 6e 73 61 63 74 69 6f 6e 5f 72 65 74 3b 0a 09 73 nsaction_ret;..s
101f0 73 69 7a 65 5f 74 20 72 65 61 64 5f 72 65 74 3b size_t read_ret;
10200 0a 09 73 69 7a 65 5f 74 20 62 75 66 66 65 72 5f ..size_t buffer_
10210 6c 65 6e 2c 20 74 6d 70 62 75 66 6c 65 6e 3b 0a len, tmpbuflen;.
10220 09 69 6e 74 20 63 65 72 74 73 5f 72 65 73 69 7a .int certs_resiz
10230 61 62 6c 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f able;..int send_
10240 72 65 74 2c 20 73 65 6c 65 63 74 5f 72 65 74 3b ret, select_ret;
10250 0a 09 69 6e 74 20 70 69 76 5f 6b 65 79 2c 20 70 ..int piv_key, p
10260 69 76 20 3d 20 30 3b 0a 09 69 6e 74 20 69 64 78 iv = 0;..int idx
10270 3b 0a 23 69 66 64 65 66 20 48 41 56 45 5f 4c 49 ;.#ifdef HAVE_LI
10280 42 5a 0a 09 69 6e 74 20 75 6e 63 6f 6d 70 72 65 BZ..int uncompre
10290 73 73 5f 72 65 74 3b 0a 09 7a 5f 73 74 72 65 61 ss_ret;..z_strea
102a0 6d 20 67 7a 69 70 5f 73 74 72 65 61 6d 3b 0a 23 m gzip_stream;.#
102b0 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 endif...CACKEY_D
102c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
102d0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 6f led.");...if (co
102e0 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 unt == NULL) {..
102f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
10300 49 4e 54 46 28 22 63 6f 75 6e 74 20 69 73 20 4e INTF("count is N
10310 55 4c 4c 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 ULL, returning i
10320 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 n failure");....
10330 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d return(NULL);..}
10340 0a 0a 09 69 66 20 28 63 65 72 74 73 20 21 3d 20 ...if (certs !=
10350 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28 2a 63 NULL) {...if (*c
10360 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 09 ount == 0) {....
10370 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
10380 4e 54 46 28 22 52 65 71 75 65 73 74 65 64 20 77 NTF("Requested w
10390 65 20 72 65 74 75 72 6e 20 30 20 6f 62 6a 65 63 e return 0 objec
103a0 74 73 2c 20 73 68 6f 72 74 2d 63 69 72 63 75 69 ts, short-circui
103b0 74 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 t");.....return(
103c0 63 65 72 74 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a certs);...}..}..
103d0 09 69 66 20 28 21 73 6c 6f 74 2d 3e 73 6c 6f 74 .if (!slot->slot
103e0 5f 72 65 73 65 74 29 20 7b 0a 09 09 69 66 20 28 _reset) {...if (
103f0 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 slot->cached_cer
10400 74 73 29 20 7b 0a 09 09 09 69 66 20 28 63 65 72 ts) {....if (cer
10410 74 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 ts == NULL) {...
10420 09 09 63 65 72 74 73 20 3d 20 6d 61 6c 6c 6f 63 ..certs = malloc
10430 28 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 (sizeof(*certs)
10440 2a 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 * slot->cached_c
10450 65 72 74 73 5f 63 6f 75 6e 74 29 3b 0a 09 09 09 erts_count);....
10460 09 2a 63 6f 75 6e 74 20 3d 20 73 6c 6f 74 2d 3e .*count = slot->
10470 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 cached_certs_cou
10480 6e 74 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a nt;....} else {.
10490 09 09 09 09 69 66 20 28 2a 63 6f 75 6e 74 20 3e ....if (*count >
104a0 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 slot->cached_ce
104b0 72 74 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 rts_count) {....
104c0 09 09 2a 63 6f 75 6e 74 20 3d 20 73 6c 6f 74 2d ..*count = slot-
104d0 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f >cached_certs_co
104e0 75 6e 74 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a unt;.....}....}.
104f0 0a 09 09 09 63 61 63 6b 65 79 5f 63 6f 70 79 5f ....cackey_copy_
10500 63 65 72 74 73 28 63 65 72 74 73 2c 20 73 6c 6f certs(certs, slo
10510 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 2c t->cached_certs,
10520 20 2a 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 72 65 *count);.....re
10530 74 75 72 6e 28 63 65 72 74 73 29 3b 0a 09 09 7d turn(certs);...}
10540 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e ..}...if (slot->
10550 63 61 63 68 65 64 5f 63 65 72 74 73 29 20 7b 0a cached_certs) {.
10560 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 ..cackey_free_ce
10570 72 74 73 28 73 6c 6f 74 2d 3e 63 61 63 68 65 64 rts(slot->cached
10580 5f 63 65 72 74 73 2c 20 73 6c 6f 74 2d 3e 63 61 _certs, slot->ca
10590 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 ched_certs_count
105a0 2c 20 31 29 3b 0a 0a 09 09 73 6c 6f 74 2d 3e 63 , 1);....slot->c
105b0 61 63 68 65 64 5f 63 65 72 74 73 20 3d 20 4e 55 ached_certs = NU
105c0 4c 4c 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 LL;..}.../* Begi
105d0 6e 20 61 20 53 6d 61 72 74 43 61 72 64 20 74 72 n a SmartCard tr
105e0 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 74 72 ansaction */..tr
105f0 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74 20 3d 20 ansaction_ret =
10600 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 cackey_begin_tra
10610 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a nsaction(slot);.
10620 09 69 66 20 28 74 72 61 6e 73 61 63 74 69 6f 6e .if (transaction
10630 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 _ret != CACKEY_P
10640 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 CSC_S_OK) {...CA
10650 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
10660 46 28 22 55 6e 61 62 6c 65 20 62 65 67 69 6e 20 F("Unable begin
10670 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 transaction, ret
10680 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 urning in failur
10690 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e e");....return(N
106a0 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 ULL);..}.../* Se
106b0 6c 65 63 74 20 74 68 65 20 43 43 43 20 41 70 70 lect the CCC App
106c0 6c 65 74 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74 let */..send_ret
106d0 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 = cackey_select
106e0 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63 63 _applet(slot, cc
106f0 63 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 63 63 c_aid, sizeof(cc
10700 63 5f 61 69 64 29 29 3b 0a 09 69 66 20 28 73 65 c_aid));..if (se
10710 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 nd_ret != CACKEY
10720 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 _PCSC_S_OK) {...
10730 2f 2a 20 54 72 79 20 50 49 56 20 61 70 70 6c 69 /* Try PIV appli
10740 63 61 74 69 6f 6e 20 2a 2f 0a 09 09 73 65 6e 64 cation */...send
10750 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 _ret = cackey_se
10760 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 lect_applet(slot
10770 2c 20 70 69 76 5f 61 69 64 2c 20 73 69 7a 65 6f , piv_aid, sizeo
10780 66 28 70 69 76 5f 61 69 64 29 29 3b 0a 09 09 69 f(piv_aid));...i
10790 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 f (send_ret == C
107a0 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 ACKEY_PCSC_S_OK)
107b0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 {....CACKEY_DEB
107c0 55 47 5f 50 52 49 4e 54 46 28 22 57 65 20 68 61 UG_PRINTF("We ha
107d0 76 65 20 61 20 50 49 56 20 63 61 72 64 20 2d 2d ve a PIV card --
107e0 20 6e 6f 74 20 75 73 69 6e 67 20 74 68 65 20 43 not using the C
107f0 43 43 2c 20 70 75 6c 6c 69 6e 67 20 70 72 65 2d CC, pulling pre-
10800 73 65 6c 65 63 74 65 64 20 6b 65 79 73 22 29 3b selected keys");
10810 0a 0a 09 09 09 70 69 76 20 3d 20 31 3b 0a 09 09 .....piv = 1;...
10820 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b } else {....CACK
10830 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
10840 22 55 6e 61 62 6c 65 20 74 6f 20 73 65 6c 65 63 "Unable to selec
10850 74 20 43 43 43 20 41 70 70 6c 65 74 2c 20 72 65 t CCC Applet, re
10860 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 turning in failu
10870 72 65 22 29 3b 0a 0a 09 09 09 2f 2a 20 54 65 72 re");...../* Ter
10880 6d 69 6e 61 74 65 20 53 6d 61 72 74 43 61 72 64 minate SmartCard
10890 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a Transaction */.
108a0 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 ...cackey_end_tr
108b0 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b ansaction(slot);
108c0 0a 0a 09 09 09 69 66 20 28 63 65 72 74 73 20 3d .....if (certs =
108d0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 2a 63 = NULL) {.....*c
108e0 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 09 7d 0a 0a ount = 0;....}..
108f0 09 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b ...return(NULL);
10900 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 63 65 ...}..}...if (ce
10910 72 74 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 rts == NULL) {..
10920 09 63 65 72 74 73 20 3d 20 6d 61 6c 6c 6f 63 28 .certs = malloc(
10930 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 2a sizeof(*certs) *
10940 20 35 29 3b 0a 09 09 2a 63 6f 75 6e 74 20 3d 20 5);...*count =
10950 35 3b 0a 09 09 63 65 72 74 73 5f 72 65 73 69 7a 5;...certs_resiz
10960 61 62 6c 65 20 3d 20 31 3b 0a 09 7d 20 65 6c 73 able = 1;..} els
10970 65 20 7b 0a 09 09 63 65 72 74 73 5f 72 65 73 69 e {...certs_resi
10980 7a 61 62 6c 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 zable = 0;..}...
10990 69 66 20 28 70 69 76 29 20 7b 0a 09 09 66 6f 72 if (piv) {...for
109a0 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c (idx = 0; idx <
109b0 20 33 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 09 3; idx++) {....
109c0 73 77 69 74 63 68 20 28 69 64 78 29 20 7b 0a 09 switch (idx) {..
109d0 09 09 09 63 61 73 65 20 30 3a 0a 09 09 09 09 09 ...case 0:......
109e0 70 69 76 5f 6f 69 64 20 3d 20 70 69 76 5f 6f 69 piv_oid = piv_oi
109f0 64 5f 70 69 76 61 75 74 68 3b 0a 09 09 09 09 09 d_pivauth;......
10a00 70 69 76 5f 6b 65 79 20 3d 20 4e 49 53 54 53 50 piv_key = NISTSP
10a10 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 50 49 56 800_78_3_KEY_PIV
10a20 41 55 54 48 3b 0a 09 09 09 09 09 70 69 76 5f 6c AUTH;......piv_l
10a30 61 62 65 6c 20 3d 20 22 41 75 74 68 65 6e 74 69 abel = "Authenti
10a40 63 61 74 69 6f 6e 22 3b 0a 09 09 09 09 09 62 72 cation";......br
10a50 65 61 6b 3b 0a 09 09 09 09 63 61 73 65 20 31 3a eak;.....case 1:
10a60 0a 09 09 09 09 09 70 69 76 5f 6f 69 64 20 3d 20 ......piv_oid =
10a70 70 69 76 5f 6f 69 64 5f 73 69 67 6e 61 74 75 72 piv_oid_signatur
10a80 65 3b 0a 09 09 09 09 09 70 69 76 5f 6b 65 79 20 e;......piv_key
10a90 3d 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33 = NISTSP800_78_3
10aa0 5f 4b 45 59 5f 53 49 47 4e 41 54 55 52 45 3b 0a _KEY_SIGNATURE;.
10ab0 09 09 09 09 09 70 69 76 5f 6c 61 62 65 6c 20 3d .....piv_label =
10ac0 20 22 53 69 67 6e 61 74 75 72 65 22 3b 0a 09 09 "Signature";...
10ad0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 63 61 ...break;.....ca
10ae0 73 65 20 32 3a 0a 09 09 09 09 09 70 69 76 5f 6f se 2:......piv_o
10af0 69 64 20 3d 20 70 69 76 5f 6f 69 64 5f 6b 65 79 id = piv_oid_key
10b00 6d 67 74 3b 0a 09 09 09 09 09 70 69 76 5f 6b 65 mgt;......piv_ke
10b10 79 20 3d 20 4e 49 53 54 53 50 38 30 30 5f 37 38 y = NISTSP800_78
10b20 5f 33 5f 4b 45 59 5f 4b 45 59 4d 47 54 3b 0a 09 _3_KEY_KEYMGT;..
10b30 09 09 09 09 70 69 76 5f 6c 61 62 65 6c 20 3d 20 ....piv_label =
10b40 22 4b 65 79 20 4d 61 6e 61 67 65 6d 65 6e 74 22 "Key Management"
10b50 3b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 ;......break;...
10b60 09 7d 0a 0a 09 09 09 72 65 61 64 5f 72 65 74 20 .}.....read_ret
10b70 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 64 61 74 = cackey_get_dat
10b80 61 28 73 6c 6f 74 2c 20 62 75 66 66 65 72 2c 20 a(slot, buffer,
10b90 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2c 20 sizeof(buffer),
10ba0 70 69 76 5f 6f 69 64 29 3b 0a 0a 09 09 09 69 66 piv_oid);.....if
10bb0 20 28 72 65 61 64 5f 72 65 74 20 3c 3d 20 30 29 (read_ret <= 0)
10bc0 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b {.....continue;
10bd0 0a 09 09 09 7d 0a 0a 09 09 09 63 75 72 72 5f 69 ....}.....curr_i
10be0 64 20 3d 20 26 63 65 72 74 73 5b 6f 75 74 69 64 d = &certs[outid
10bf0 78 5d 3b 0a 09 09 09 6f 75 74 69 64 78 2b 2b 3b x];....outidx++;
10c00 0a 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 6b 65 .....curr_id->ke
10c10 79 73 69 7a 65 20 3d 20 2d 31 3b 0a 09 09 09 63 ysize = -1;....c
10c20 75 72 72 5f 69 64 2d 3e 69 64 5f 74 79 70 65 20 urr_id->id_type
10c30 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 = CACKEY_ID_TYPE
10c40 5f 50 49 56 3b 0a 09 09 09 63 75 72 72 5f 69 64 _PIV;....curr_id
10c50 2d 3e 63 61 72 64 2e 70 69 76 2e 6b 65 79 5f 69 ->card.piv.key_i
10c60 64 20 3d 20 70 69 76 5f 6b 65 79 3b 0a 09 09 09 d = piv_key;....
10c70 6d 65 6d 63 70 79 28 63 75 72 72 5f 69 64 2d 3e memcpy(curr_id->
10c80 63 61 72 64 2e 70 69 76 2e 6c 61 62 65 6c 2c 20 card.piv.label,
10c90 70 69 76 5f 6c 61 62 65 6c 2c 20 73 74 72 6c 65 piv_label, strle
10ca0 6e 28 70 69 76 5f 6c 61 62 65 6c 29 20 2b 20 31 n(piv_label) + 1
10cb0 29 3b 0a 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e );.....curr_id->
10cc0 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 certificate_len
10cd0 3d 20 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 63 = read_ret;....c
10ce0 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 urr_id->certific
10cf0 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 ate = malloc(cur
10d00 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 r_id->certificat
10d10 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 62 75 66 66 e_len);.....buff
10d20 65 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 er_len = sizeof(
10d30 62 75 66 66 65 72 29 3b 0a 09 09 09 62 75 66 66 buffer);....buff
10d40 65 72 5f 70 20 3d 20 63 61 63 6b 65 79 5f 72 65 er_p = cackey_re
10d50 61 64 5f 62 65 72 74 6c 76 5f 74 61 67 28 62 75 ad_bertlv_tag(bu
10d60 66 66 65 72 2c 20 26 62 75 66 66 65 72 5f 6c 65 ffer, &buffer_le
10d70 6e 2c 20 30 78 37 30 2c 20 63 75 72 72 5f 69 64 n, 0x70, curr_id
10d80 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20 26 ->certificate, &
10d90 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 curr_id->certifi
10da0 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 69 cate_len);.....i
10db0 66 20 28 62 75 66 66 65 72 5f 70 20 3d 3d 20 4e f (buffer_p == N
10dc0 55 4c 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 ULL) {.....CACKE
10dd0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
10de0 52 65 61 64 69 6e 67 20 63 65 72 74 69 66 69 63 Reading certific
10df0 61 74 65 20 66 72 6f 6d 20 42 45 52 2d 54 4c 56 ate from BER-TLV
10e00 20 72 65 73 70 6f 6e 73 65 20 66 61 69 6c 65 64 response failed
10e10 2c 20 73 6b 69 70 70 69 6e 67 20 6b 65 79 20 25 , skipping key %
10e20 69 22 2c 20 69 64 78 29 3b 0a 0a 09 09 09 09 66 i", idx);......f
10e30 72 65 65 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 ree(curr_id->cer
10e40 74 69 66 69 63 61 74 65 29 3b 0a 0a 09 09 09 09 tificate);......
10e50 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 curr_id->certifi
10e60 63 61 74 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 cate = NULL;....
10e70 09 09 6f 75 74 69 64 78 2d 2d 3b 0a 0a 09 09 09 ..outidx--;.....
10e80 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a .continue;....}.
10e90 0a 23 69 66 64 65 66 20 48 41 56 45 5f 4c 49 42 .#ifdef HAVE_LIB
10ea0 5a 0a 09 09 09 69 66 20 28 63 75 72 72 5f 69 64 Z....if (curr_id
10eb0 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 ->certificate_le
10ec0 6e 20 3e 20 34 29 20 7b 0a 09 09 09 09 69 66 20 n > 4) {.....if
10ed0 28 6d 65 6d 63 6d 70 28 63 75 72 72 5f 69 64 2d (memcmp(curr_id-
10ee0 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20 22 5c >certificate, "\
10ef0 78 31 66 5c 78 38 62 5c 78 30 38 5c 78 30 30 22 x1f\x8b\x08\x00"
10f00 2c 20 34 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09 , 4) == 0) {....
10f10 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 63 75 ..tmpbuflen = cu
10f20 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 rr_id->certifica
10f30 74 65 5f 6c 65 6e 20 2a 20 32 3b 0a 09 09 09 09 te_len * 2;.....
10f40 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 .tmpbuf = malloc
10f50 28 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 (tmpbuflen);....
10f60 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
10f70 50 52 49 4e 54 42 55 46 28 22 41 74 74 65 6d 70 PRINTBUF("Attemp
10f80 74 69 6e 67 20 74 6f 20 64 65 63 6f 6d 70 72 65 ting to decompre
10f90 73 73 3a 22 2c 20 63 75 72 72 5f 69 64 2d 3e 63 ss:", curr_id->c
10fa0 65 72 74 69 66 69 63 61 74 65 2c 20 63 75 72 72 ertificate, curr
10fb0 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 _id->certificate
10fc0 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 09 67 7a 69 _len);.......gzi
10fd0 70 5f 73 74 72 65 61 6d 2e 7a 61 6c 6c 6f 63 20 p_stream.zalloc
10fe0 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 67 7a 69 = NULL;......gzi
10ff0 70 5f 73 74 72 65 61 6d 2e 7a 66 72 65 65 20 3d p_stream.zfree =
11000 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 67 7a 69 70 NULL;......gzip
11010 5f 73 74 72 65 61 6d 2e 6f 70 61 71 75 65 20 3d _stream.opaque =
11020 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09 67 7a 69 NULL;.......gzi
11030 70 5f 73 74 72 65 61 6d 2e 6e 65 78 74 5f 69 6e p_stream.next_in
11040 20 20 3d 20 63 75 72 72 5f 69 64 2d 3e 63 65 72 = curr_id->cer
11050 74 69 66 69 63 61 74 65 3b 0a 09 09 09 09 09 67 tificate;......g
11060 7a 69 70 5f 73 74 72 65 61 6d 2e 61 76 61 69 6c zip_stream.avail
11070 5f 69 6e 20 3d 20 63 75 72 72 5f 69 64 2d 3e 63 _in = curr_id->c
11080 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a ertificate_len;.
11090 09 09 09 09 09 67 7a 69 70 5f 73 74 72 65 61 6d .....gzip_stream
110a0 2e 6e 65 78 74 5f 6f 75 74 20 3d 20 74 6d 70 62 .next_out = tmpb
110b0 75 66 3b 0a 09 09 09 09 09 67 7a 69 70 5f 73 74 uf;......gzip_st
110c0 72 65 61 6d 2e 61 76 61 69 6c 5f 6f 75 74 20 3d ream.avail_out =
110d0 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 tmpbuflen;.....
110e0 09 09 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 ..uncompress_ret
110f0 20 3d 20 69 6e 66 6c 61 74 65 49 6e 69 74 28 26 = inflateInit(&
11100 67 7a 69 70 5f 73 74 72 65 61 6d 29 3b 0a 09 09 gzip_stream);...
11110 09 09 09 69 66 20 28 75 6e 63 6f 6d 70 72 65 73 ...if (uncompres
11120 73 5f 72 65 74 20 3d 3d 20 5a 5f 4f 4b 29 20 7b s_ret == Z_OK) {
11130 0a 09 09 09 09 09 09 75 6e 63 6f 6d 70 72 65 73 .......uncompres
11140 73 5f 72 65 74 20 3d 20 69 6e 66 6c 61 74 65 52 s_ret = inflateR
11150 65 73 65 74 32 28 26 67 7a 69 70 5f 73 74 72 65 eset2(&gzip_stre
11160 61 6d 2c 20 33 31 29 3b 0a 09 09 09 09 09 7d 0a am, 31);......}.
11170 09 09 09 09 09 69 66 20 28 75 6e 63 6f 6d 70 72 .....if (uncompr
11180 65 73 73 5f 72 65 74 20 3d 3d 20 5a 5f 4f 4b 29 ess_ret == Z_OK)
11190 20 7b 0a 09 09 09 09 09 09 75 6e 63 6f 6d 70 72 {.......uncompr
111a0 65 73 73 5f 72 65 74 20 3d 20 69 6e 66 6c 61 74 ess_ret = inflat
111b0 65 28 26 67 7a 69 70 5f 73 74 72 65 61 6d 2c 20 e(&gzip_stream,
111c0 30 29 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 09 0);......}......
111d0 69 66 20 28 75 6e 63 6f 6d 70 72 65 73 73 5f 72 if (uncompress_r
111e0 65 74 20 3d 3d 20 5a 5f 53 54 52 45 41 4d 5f 45 et == Z_STREAM_E
111f0 4e 44 29 20 7b 0a 09 09 09 09 09 09 75 6e 63 6f ND) {.......unco
11200 6d 70 72 65 73 73 5f 72 65 74 20 3d 20 69 6e 66 mpress_ret = inf
11210 6c 61 74 65 45 6e 64 28 26 67 7a 69 70 5f 73 74 lateEnd(&gzip_st
11220 72 65 61 6d 29 3b 0a 09 09 09 09 09 7d 20 65 6c ream);......} el
11230 73 65 20 7b 0a 09 09 09 09 09 09 75 6e 63 6f 6d se {.......uncom
11240 70 72 65 73 73 5f 72 65 74 20 3d 20 5a 5f 44 41 press_ret = Z_DA
11250 54 41 5f 45 52 52 4f 52 3b 0a 09 09 09 09 09 7d TA_ERROR;......}
11260 0a 09 09 09 09 09 69 66 20 28 75 6e 63 6f 6d 70 ......if (uncomp
11270 72 65 73 73 5f 72 65 74 20 3d 3d 20 5a 5f 4f 4b ress_ret == Z_OK
11280 29 20 7b 0a 09 09 09 09 09 09 74 6d 70 62 75 66 ) {.......tmpbuf
11290 6c 65 6e 20 3d 20 67 7a 69 70 5f 73 74 72 65 61 len = gzip_strea
112a0 6d 2e 74 6f 74 61 6c 5f 6f 75 74 3b 0a 0a 09 09 m.total_out;....
112b0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
112c0 5f 50 52 49 4e 54 42 55 46 28 22 44 65 63 6f 6d _PRINTBUF("Decom
112d0 70 72 65 73 73 65 64 20 74 6f 3a 22 2c 20 74 6d pressed to:", tm
112e0 70 62 75 66 2c 20 74 6d 70 62 75 66 6c 65 6e 29 pbuf, tmpbuflen)
112f0 3b 0a 0a 09 09 09 09 09 09 66 72 65 65 28 63 75 ;........free(cu
11300 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 rr_id->certifica
11310 74 65 29 3b 0a 0a 09 09 09 09 09 09 63 75 72 72 te);........curr
11320 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 _id->certificate
11330 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09 09 09 = tmpbuf;......
11340 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 .curr_id->certif
11350 69 63 61 74 65 5f 6c 65 6e 20 3d 20 74 6d 70 62 icate_len = tmpb
11360 75 66 6c 65 6e 3b 0a 09 09 09 09 09 7d 20 65 6c uflen;......} el
11370 73 65 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 se {.......CACKE
11380 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
11390 44 65 63 6f 6d 70 72 65 73 73 69 6e 67 20 66 61 Decompressing fa
113a0 69 6c 65 64 21 20 75 6e 63 6f 6d 70 72 65 73 73 iled! uncompress
113b0 28 29 20 72 65 74 75 72 6e 65 64 20 25 69 22 2c () returned %i",
113c0 20 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 29 uncompress_ret)
113d0 3b 0a 0a 09 09 09 09 09 09 66 72 65 65 28 74 6d ;........free(tm
113e0 70 62 75 66 29 3b 0a 09 09 09 09 09 7d 0a 09 09 pbuf);......}...
113f0 09 09 7d 0a 09 09 09 7d 0a 23 65 6e 64 69 66 0a ..}....}.#endif.
11400 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 ..}..} else {...
11410 2f 2a 20 52 65 61 64 20 61 6c 6c 20 74 68 65 20 /* Read all the
11420 61 70 70 6c 65 74 73 20 66 72 6f 6d 20 74 68 65 applets from the
11430 20 43 43 43 27 73 20 54 4c 56 20 2a 2f 0a 09 09 CCC's TLV */...
11440 63 63 63 5f 74 6c 76 20 3d 20 63 61 63 6b 65 79 ccc_tlv = cackey
11450 5f 72 65 61 64 5f 74 6c 76 28 73 6c 6f 74 29 3b _read_tlv(slot);
11460 0a 0a 09 09 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 ..../* Look for
11470 43 41 52 44 55 52 4c 73 20 74 68 61 74 20 63 6f CARDURLs that co
11480 6f 72 65 73 70 6f 6e 64 20 74 6f 20 50 4b 49 20 orespond to PKI
11490 61 70 70 6c 65 74 73 20 2a 2f 0a 09 09 66 6f 72 applets */...for
114a0 20 28 63 63 63 5f 63 75 72 72 20 3d 20 63 63 63 (ccc_curr = ccc
114b0 5f 74 6c 76 3b 20 63 63 63 5f 63 75 72 72 3b 20 _tlv; ccc_curr;
114c0 63 63 63 5f 63 75 72 72 20 3d 20 63 63 63 5f 63 ccc_curr = ccc_c
114d0 75 72 72 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 urr->_next) {...
114e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
114f0 49 4e 54 46 28 22 46 6f 75 6e 64 20 74 61 67 3a INTF("Found tag:
11500 20 25 73 20 2e 2e 2e 20 22 2c 20 43 41 43 4b 45 %s ... ", CACKE
11510 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 Y_DEBUG_FUNC_TAG
11520 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72 _TO_STR(ccc_curr
11530 2d 3e 74 61 67 29 29 3b 0a 0a 09 09 09 69 66 20 ->tag));.....if
11540 28 63 63 63 5f 63 75 72 72 2d 3e 74 61 67 20 21 (ccc_curr->tag !
11550 3d 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 = GSCIS_TAG_CARD
11560 55 52 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 URL) {.....CACKE
11570 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
11580 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69 ... skipping i
11590 74 20 28 77 65 20 6f 6e 6c 79 20 63 61 72 65 20 t (we only care
115a0 61 62 6f 75 74 20 43 41 52 44 55 52 4c 73 29 22 about CARDURLs)"
115b0 29 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 );......continue
115c0 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 28 ;....}.....if ((
115d0 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f ccc_curr->value_
115e0 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 cardurl->apptype
115f0 20 26 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 & CACKEY_TLV_AP
11600 50 5f 50 4b 49 29 20 21 3d 20 43 41 43 4b 45 59 P_PKI) != CACKEY
11610 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 29 20 7b 0a _TLV_APP_PKI) {.
11620 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
11630 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73 _PRINTF(" ... s
11640 6b 69 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f kipping it (we o
11650 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 50 nly care about P
11660 4b 49 20 61 70 70 6c 65 74 73 2c 20 74 68 69 73 KI applets, this
11670 20 61 70 70 6c 65 74 20 73 75 70 70 6f 72 74 73 applet supports
11680 3a 20 25 73 2f 25 30 32 78 29 22 2c 20 43 41 43 : %s/%02x)", CAC
11690 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 KEY_DEBUG_FUNC_A
116a0 50 50 54 59 50 45 5f 54 4f 5f 53 54 52 28 63 63 PPTYPE_TO_STR(cc
116b0 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 c_curr->value_ca
116c0 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 29 2c rdurl->apptype),
116d0 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 (unsigned int)
116e0 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f ccc_curr->value_
116f0 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 cardurl->apptype
11700 29 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 );......continue
11710 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45 ;....}.....CACKE
11720 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 Y_DEBUG_PRINTBUF
11730 28 22 52 49 44 3a 22 2c 20 63 63 63 5f 63 75 72 ("RID:", ccc_cur
11740 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c r->value_cardurl
11750 2d 3e 72 69 64 2c 20 73 69 7a 65 6f 66 28 63 63 ->rid, sizeof(cc
11760 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 c_curr->value_ca
11770 72 64 75 72 6c 2d 3e 72 69 64 29 29 3b 0a 09 09 rdurl->rid));...
11780 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
11790 49 4e 54 46 28 22 41 70 70 49 44 20 3d 20 25 73 INTF("AppID = %s
117a0 2f 25 30 34 6c 78 22 2c 20 43 41 43 4b 45 59 5f /%04lx", CACKEY_
117b0 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 DEBUG_FUNC_OBJID
117c0 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72 _TO_STR(ccc_curr
117d0 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d ->value_cardurl-
117e0 3e 61 70 70 69 64 29 2c 20 28 75 6e 73 69 67 6e >appid), (unsign
117f0 65 64 20 6c 6f 6e 67 29 20 63 63 63 5f 63 75 72 ed long) ccc_cur
11800 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c r->value_cardurl
11810 2d 3e 61 70 70 69 64 29 3b 0a 09 09 09 43 41 43 ->appid);....CAC
11820 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
11830 28 22 4f 62 6a 65 63 74 49 44 20 3d 20 25 73 2f ("ObjectID = %s/
11840 25 30 34 6c 78 22 2c 20 43 41 43 4b 45 59 5f 44 %04lx", CACKEY_D
11850 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f EBUG_FUNC_OBJID_
11860 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d TO_STR(ccc_curr-
11870 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e >value_cardurl->
11880 6f 62 6a 65 63 74 69 64 29 2c 20 28 75 6e 73 69 objectid), (unsi
11890 67 6e 65 64 20 6c 6f 6e 67 29 20 63 63 63 5f 63 gned long) ccc_c
118a0 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 urr->value_cardu
118b0 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 3b 0a 0a rl->objectid);..
118c0 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61 ...memcpy(curr_a
118d0 69 64 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 id, ccc_curr->va
118e0 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 lue_cardurl->rid
118f0 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 63 75 72 , sizeof(ccc_cur
11900 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c r->value_cardurl
11910 2d 3e 72 69 64 29 29 3b 0a 09 09 09 63 75 72 72 ->rid));....curr
11920 5f 61 69 64 5b 73 69 7a 65 6f 66 28 63 75 72 72 _aid[sizeof(curr
11930 5f 61 69 64 29 20 2d 20 32 5d 20 3d 20 28 63 63 _aid) - 2] = (cc
11940 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 c_curr->value_ca
11950 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 3e 3e 20 rdurl->appid >>
11960 38 29 20 26 20 30 78 66 66 3b 0a 09 09 09 63 75 8) & 0xff;....cu
11970 72 72 5f 61 69 64 5b 73 69 7a 65 6f 66 28 63 75 rr_aid[sizeof(cu
11980 72 72 5f 61 69 64 29 20 2d 20 31 5d 20 3d 20 63 rr_aid) - 1] = c
11990 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 cc_curr->value_c
119a0 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 26 20 ardurl->appid &
119b0 30 78 66 66 3b 0a 0a 09 09 09 2f 2a 20 53 65 6c 0xff;...../* Sel
119c0 65 63 74 20 66 6f 75 6e 64 20 61 70 70 6c 65 74 ect found applet
119d0 20 2e 2e 2e 20 2a 2f 0a 09 09 09 73 65 6c 65 63 ... */....selec
119e0 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 t_ret = cackey_s
119f0 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f elect_applet(slo
11a00 74 2c 20 63 75 72 72 5f 61 69 64 2c 20 73 69 7a t, curr_aid, siz
11a10 65 6f 66 28 63 75 72 72 5f 61 69 64 29 29 3b 0a eof(curr_aid));.
11a20 09 09 09 69 66 20 28 73 65 6c 65 63 74 5f 72 65 ...if (select_re
11a30 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 t != CACKEY_PCSC
11a40 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 _S_OK) {.....CAC
11a50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
11a60 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6c 65 ("Failed to sele
11a70 63 74 20 61 70 70 6c 65 74 2c 20 73 6b 69 70 70 ct applet, skipp
11a80 69 6e 67 20 70 72 6f 63 65 73 73 69 6e 67 20 6f ing processing o
11a90 66 20 74 68 69 73 20 6f 62 6a 65 63 74 22 29 3b f this object");
11aa0 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a ......continue;.
11ab0 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 2e 2e 2e 20 ...}...../* ...
11ac0 61 6e 64 20 6f 62 6a 65 63 74 20 28 66 69 6c 65 and object (file
11ad0 29 20 2a 2f 0a 09 09 09 73 65 6c 65 63 74 5f 72 ) */....select_r
11ae0 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 et = cackey_sele
11af0 63 74 5f 66 69 6c 65 28 73 6c 6f 74 2c 20 63 63 ct_file(slot, cc
11b00 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 c_curr->value_ca
11b10 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 rdurl->objectid)
11b20 3b 0a 09 09 09 69 66 20 28 73 65 6c 65 63 74 5f ;....if (select_
11b30 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 ret != CACKEY_PC
11b40 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 SC_S_OK) {.....C
11b50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
11b60 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65 TF("Failed to se
11b70 6c 65 63 74 20 66 69 6c 65 2c 20 73 6b 69 70 70 lect file, skipp
11b80 69 6e 67 20 70 72 6f 63 65 73 73 69 6e 67 20 6f ing processing o
11b90 66 20 74 68 69 73 20 6f 62 6a 65 63 74 22 29 3b f this object");
11ba0 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a ......continue;.
11bb0 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 50 72 6f 63 ...}...../* Proc
11bc0 65 73 73 20 74 68 69 73 20 66 69 6c 65 27 73 20 ess this file's
11bd0 54 4c 56 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 TLV looking for
11be0 63 65 72 74 69 66 69 63 61 74 65 73 20 2a 2f 0a certificates */.
11bf0 09 09 09 61 70 70 5f 74 6c 76 20 3d 20 63 61 63 ...app_tlv = cac
11c00 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28 73 6c 6f key_read_tlv(slo
11c10 74 29 3b 0a 09 0a 09 09 09 66 6f 72 20 28 61 70 t);......for (ap
11c20 70 5f 63 75 72 72 20 3d 20 61 70 70 5f 74 6c 76 p_curr = app_tlv
11c30 3b 20 61 70 70 5f 63 75 72 72 3b 20 61 70 70 5f ; app_curr; app_
11c40 63 75 72 72 20 3d 20 61 70 70 5f 63 75 72 72 2d curr = app_curr-
11c50 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 09 09 43 41 >_next) {.....CA
11c60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
11c70 46 28 22 46 6f 75 6e 64 20 74 61 67 3a 20 25 73 F("Found tag: %s
11c80 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ", CACKEY_DEBUG_
11c90 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 FUNC_TAG_TO_STR(
11ca0 61 70 70 5f 63 75 72 72 2d 3e 74 61 67 29 29 3b app_curr->tag));
11cb0 0a 09 09 09 09 69 66 20 28 61 70 70 5f 63 75 72 .....if (app_cur
11cc0 72 2d 3e 74 61 67 20 21 3d 20 47 53 43 49 53 5f r->tag != GSCIS_
11cd0 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 29 TAG_CERTIFICATE)
11ce0 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 {......CACKEY_D
11cf0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e EBUG_PRINTF(" .
11d00 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69 74 20 28 .. skipping it (
11d10 77 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f we only care abo
11d20 75 74 20 43 45 52 54 49 46 49 43 41 54 45 73 29 ut CERTIFICATEs)
11d30 22 29 3b 0a 0a 09 09 09 09 09 63 6f 6e 74 69 6e ");.......contin
11d40 75 65 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 63 ue;.....}......c
11d50 75 72 72 5f 69 64 20 3d 20 26 63 65 72 74 73 5b urr_id = &certs[
11d60 6f 75 74 69 64 78 5d 3b 0a 09 09 09 09 6f 75 74 outidx];.....out
11d70 69 64 78 2b 2b 3b 0a 0a 09 09 09 09 63 75 72 72 idx++;......curr
11d80 5f 69 64 2d 3e 69 64 5f 74 79 70 65 20 3d 20 43 _id->id_type = C
11d90 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 ACKEY_ID_TYPE_CA
11da0 43 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 63 75 C;.....memcpy(cu
11db0 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e rr_id->card.cac.
11dc0 61 70 70 6c 65 74 2c 20 63 75 72 72 5f 61 69 64 applet, curr_aid
11dd0 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 69 64 , sizeof(curr_id
11de0 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 ->card.cac.apple
11df0 74 29 29 3b 0a 09 09 09 09 63 75 72 72 5f 69 64 t));.....curr_id
11e00 2d 3e 63 61 72 64 2e 63 61 63 2e 66 69 6c 65 20 ->card.cac.file
11e10 3d 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 = ccc_curr->valu
11e20 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 e_cardurl->objec
11e30 74 69 64 3b 0a 09 09 09 09 63 75 72 72 5f 69 64 tid;.....curr_id
11e40 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 2d 31 3b 0a ->keysize = -1;.
11e50 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
11e60 47 5f 50 52 49 4e 54 46 28 22 46 69 6c 6c 69 6e G_PRINTF("Fillin
11e70 67 20 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e g curr_id->card.
11e80 63 61 63 2e 61 70 70 6c 65 74 20 28 25 70 29 20 cac.applet (%p)
11e90 77 69 74 68 20 25 6c 75 20 62 79 74 65 73 3a 22 with %lu bytes:"
11ea0 2c 20 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e , curr_id->card.
11eb0 63 61 63 2e 61 70 70 6c 65 74 2c 20 28 75 6e 73 cac.applet, (uns
11ec0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65 igned long) size
11ed0 6f 66 28 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 of(curr_id->card
11ee0 2e 63 61 63 2e 61 70 70 6c 65 74 29 29 3b 0a 09 .cac.applet));..
11ef0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
11f00 50 52 49 4e 54 42 55 46 28 22 56 41 4c 3a 22 2c PRINTBUF("VAL:",
11f10 20 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 curr_id->card.c
11f20 61 63 2e 61 70 70 6c 65 74 2c 20 73 69 7a 65 6f ac.applet, sizeo
11f30 66 28 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e f(curr_id->card.
11f40 63 61 63 2e 61 70 70 6c 65 74 29 29 3b 0a 0a 09 cac.applet));...
11f50 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 ...curr_id->cert
11f60 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 61 70 ificate_len = ap
11f70 70 5f 63 75 72 72 2d 3e 6c 65 6e 67 74 68 3b 0a p_curr->length;.
11f80 0a 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 .....curr_id->ce
11f90 72 74 69 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c rtificate = mall
11fa0 6f 63 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 oc(curr_id->cert
11fb0 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 ificate_len);...
11fc0 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 69 64 ..memcpy(curr_id
11fd0 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20 61 ->certificate, a
11fe0 70 70 5f 63 75 72 72 2d 3e 76 61 6c 75 65 2c 20 pp_curr->value,
11ff0 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 curr_id->certifi
12000 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 cate_len);......
12010 69 66 20 28 6f 75 74 69 64 78 20 3e 3d 20 2a 63 if (outidx >= *c
12020 6f 75 6e 74 29 20 7b 0a 09 09 09 09 09 69 66 20 ount) {......if
12030 28 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 (certs_resizable
12040 29 20 7b 0a 09 09 09 09 09 09 2a 63 6f 75 6e 74 ) {.......*count
12050 20 2a 3d 20 32 3b 0a 09 09 09 09 09 09 69 66 20 *= 2;.......if
12060 28 2a 63 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a (*count != 0) {.
12070 09 09 09 09 09 09 09 63 65 72 74 73 20 3d 20 72 .......certs = r
12080 65 61 6c 6c 6f 63 28 63 65 72 74 73 2c 20 73 69 ealloc(certs, si
12090 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 28 zeof(*certs) * (
120a0 2a 63 6f 75 6e 74 29 29 3b 0a 09 09 09 09 09 09 *count));.......
120b0 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 09 } else {........
120c0 63 65 72 74 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 certs = NULL;...
120d0 09 09 09 09 7d 0a 09 09 09 09 09 7d 20 65 6c 73 ....}......} els
120e0 65 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b e {.......break;
120f0 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 ......}.....}...
12100 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 .}.....cackey_fr
12110 65 65 5f 74 6c 76 28 61 70 70 5f 74 6c 76 29 3b ee_tlv(app_tlv);
12120 0a 0a 09 09 09 69 66 20 28 6f 75 74 69 64 78 20 .....if (outidx
12130 3e 3d 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 09 09 >= *count) {....
12140 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d .break;....}...}
12150 0a 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f ....cackey_free_
12160 74 6c 76 28 63 63 63 5f 74 6c 76 29 3b 0a 09 7d tlv(ccc_tlv);..}
12170 0a 0a 09 2a 63 6f 75 6e 74 20 3d 20 6f 75 74 69 ...*count = outi
12180 64 78 3b 0a 0a 09 69 66 20 28 63 65 72 74 73 5f dx;...if (certs_
12190 72 65 73 69 7a 61 62 6c 65 29 20 7b 0a 09 09 69 resizable) {...i
121a0 66 20 28 2a 63 6f 75 6e 74 20 21 3d 20 30 29 20 f (*count != 0)
121b0 7b 0a 09 09 09 63 65 72 74 73 20 3d 20 72 65 61 {....certs = rea
121c0 6c 6c 6f 63 28 63 65 72 74 73 2c 20 73 69 7a 65 lloc(certs, size
121d0 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 28 2a 63 of(*certs) * (*c
121e0 6f 75 6e 74 29 29 3b 0a 09 09 7d 20 65 6c 73 65 ount));...} else
121f0 20 7b 0a 09 09 09 66 72 65 65 28 63 65 72 74 73 {....free(certs
12200 29 3b 0a 0a 09 09 09 63 65 72 74 73 20 3d 20 4e );.....certs = N
12210 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 73 6c ULL;...}..}...sl
12220 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 ot->cached_certs
12230 20 3d 20 63 61 63 6b 65 79 5f 63 6f 70 79 5f 63 = cackey_copy_c
12240 65 72 74 73 28 4e 55 4c 4c 2c 20 63 65 72 74 73 erts(NULL, certs
12250 2c 20 2a 63 6f 75 6e 74 29 3b 0a 09 73 6c 6f 74 , *count);..slot
12260 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 ->cached_certs_c
12270 6f 75 6e 74 20 3d 20 2a 63 6f 75 6e 74 3b 0a 0a ount = *count;..
12280 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20 53 6d ./* Terminate Sm
12290 61 72 74 43 61 72 64 20 54 72 61 6e 73 61 63 74 artCard Transact
122a0 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 ion */..cackey_e
122b0 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 nd_transaction(s
122c0 6c 6f 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 63 lot);...return(c
122d0 65 72 74 73 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 erts);.}../*. *
122e0 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 SYNPOSIS. *
122f0 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 .... *. * ARGUME
12300 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 NTS. * ....
12310 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 *. * RETURN VALU
12320 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a E. * .... *.
12330 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 * NOTES. *
12340 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 .... *. */.stati
12350 63 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 c ssize_t cackey
12360 5f 73 69 67 6e 64 65 63 72 79 70 74 28 73 74 72 _signdecrypt(str
12370 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 uct cackey_slot
12380 2a 73 6c 6f 74 2c 20 73 74 72 75 63 74 20 63 61 *slot, struct ca
12390 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 ckey_identity *i
123a0 64 65 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 dentity, unsigne
123b0 64 20 63 68 61 72 20 2a 62 75 66 2c 20 73 69 7a d char *buf, siz
123c0 65 5f 74 20 62 75 66 6c 65 6e 2c 20 75 6e 73 69 e_t buflen, unsi
123d0 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 62 75 gned char *outbu
123e0 66 2c 20 73 69 7a 65 5f 74 20 6f 75 74 62 75 66 f, size_t outbuf
123f0 6c 65 6e 2c 20 69 6e 74 20 70 61 64 49 6e 70 75 len, int padInpu
12400 74 2c 20 69 6e 74 20 75 6e 70 61 64 4f 75 74 70 t, int unpadOutp
12410 75 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f 70 63 ut) {..cackey_pc
12420 73 63 5f 69 64 5f 74 79 70 65 20 69 64 5f 74 79 sc_id_type id_ty
12430 70 65 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 pe;..unsigned ch
12440 61 72 20 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 ar dyn_auth_temp
12450 6c 61 74 65 5b 31 30 5d 2c 20 2a 64 79 6e 5f 61 late[10], *dyn_a
12460 75 74 68 5f 74 6d 70 62 75 66 3b 0a 09 75 6e 73 uth_tmpbuf;..uns
12470 69 67 6e 65 64 20 63 68 61 72 20 2a 74 6d 70 62 igned char *tmpb
12480 75 66 2c 20 2a 74 6d 70 62 75 66 5f 73 2c 20 2a uf, *tmpbuf_s, *
12490 6f 75 74 62 75 66 5f 73 2c 20 2a 6f 75 74 62 75 outbuf_s, *outbu
124a0 66 5f 70 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 f_p;..unsigned c
124b0 68 61 72 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e har bytes_to_sen
124c0 64 2c 20 70 31 2c 20 63 6c 61 73 73 3b 0a 09 75 d, p1, class;..u
124d0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62 6c 6f nsigned char blo
124e0 63 6b 74 79 70 65 3b 0a 09 63 61 63 6b 65 79 5f cktype;..cackey_
124f0 72 65 74 20 73 65 6e 64 5f 72 65 74 3b 0a 09 75 ret send_ret;..u
12500 69 6e 74 31 36 5f 74 20 72 65 73 70 63 6f 64 65 int16_t respcode
12510 3b 0a 09 73 73 69 7a 65 5f 74 20 72 65 74 76 61 ;..ssize_t retva
12520 6c 20 3d 20 30 2c 20 75 6e 70 61 64 6f 66 66 73 l = 0, unpadoffs
12530 65 74 3b 0a 09 73 69 7a 65 5f 74 20 74 6d 70 62 et;..size_t tmpb
12540 75 66 6c 65 6e 2c 20 70 61 64 6c 65 6e 2c 20 74 uflen, padlen, t
12550 6d 70 6f 75 74 62 75 66 6c 65 6e 2c 20 6f 75 74 mpoutbuflen, out
12560 62 75 66 5f 6c 65 6e 3b 0a 09 69 6e 74 20 66 72 buf_len;..int fr
12570 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09 ee_tmpbuf = 0;..
12580 69 6e 74 20 6c 65 3b 0a 0a 09 43 41 43 4b 45 59 int le;...CACKEY
12590 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 _DEBUG_PRINTF("C
125a0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 alled.");...if (
125b0 73 6c 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a slot == NULL) {.
125c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
125d0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 73 RINTF("Error. s
125e0 6c 6f 74 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a lot is NULL");..
125f0 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d ..return(-1);..}
12600 0a 0a 09 69 66 20 28 62 75 66 20 3d 3d 20 4e 55 ...if (buf == NU
12610 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 LL) {...CACKEY_D
12620 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
12630 6f 72 2e 20 20 62 75 66 20 69 73 20 4e 55 4c 4c or. buf is NULL
12640 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 ");....return(-1
12650 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 75 74 62 );..}...if (outb
12660 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 uf == NULL) {...
12670 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
12680 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 6f 75 74 NTF("Error. out
12690 62 75 66 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a buf is NULL");..
126a0 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d ..return(-1);..}
126b0 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79 20 ...if (identity
126c0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 == NULL) {...CAC
126d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
126e0 28 22 45 72 72 6f 72 2e 20 20 69 64 65 6e 74 69 ("Error. identi
126f0 74 79 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 ty is NULL");...
12700 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a .return(-1);..}.
12710 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e ..if (identity->
12720 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 3d pcsc_identity ==
12730 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 NULL) {...CACKE
12740 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
12750 45 72 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79 Error. identity
12760 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 ->pcsc_identity
12770 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 is NULL");....re
12780 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 turn(-1);..}...i
12790 64 5f 74 79 70 65 20 3d 20 69 64 65 6e 74 69 74 d_type = identit
127a0 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 y->pcsc_identity
127b0 2d 3e 69 64 5f 74 79 70 65 3b 0a 09 69 66 20 28 ->id_type;..if (
127c0 69 64 5f 74 79 70 65 20 3d 3d 20 43 41 43 4b 45 id_type == CACKE
127d0 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f Y_ID_TYPE_CERT_O
127e0 4e 4c 59 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f NLY) {...CACKEY_
127f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
12800 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79 2d 3e ror. identity->
12810 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 69 73 pcsc_identity is
12820 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f CACKEY_ID_TYPE_
12830 43 45 52 54 5f 4f 4e 4c 59 2c 20 77 68 69 63 68 CERT_ONLY, which
12840 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 cannot be used
12850 66 6f 72 20 73 69 67 6e 2f 64 65 63 72 79 70 74 for sign/decrypt
12860 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 ");....return(-1
12870 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 );..}...switch (
12880 69 64 5f 74 79 70 65 29 20 7b 0a 09 09 63 61 73 id_type) {...cas
12890 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 e CACKEY_ID_TYPE
128a0 5f 50 49 56 3a 0a 09 09 63 61 73 65 20 43 41 43 _PIV:...case CAC
128b0 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a KEY_ID_TYPE_CAC:
128c0 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 64 65 66 ....break;...def
128d0 61 75 6c 74 3a 0a 09 09 09 43 41 43 4b 45 59 5f ault:....CACKEY_
128e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
128f0 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79 2d 3e ror. identity->
12900 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 69 73 pcsc_identity is
12910 20 6e 6f 74 20 61 20 73 75 70 70 6f 72 74 65 64 not a supported
12920 20 76 61 6c 75 65 2e 20 54 79 70 65 20 69 73 3a value. Type is:
12930 20 30 78 25 6c 78 20 28 50 49 56 20 3d 20 30 78 0x%lx (PIV = 0x
12940 25 6c 78 2c 20 43 41 43 20 3d 20 30 78 25 6c 78 %lx, CAC = 0x%lx
12950 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f )", (unsigned lo
12960 6e 67 29 20 69 64 5f 74 79 70 65 2c 20 28 75 6e ng) id_type, (un
12970 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 43 41 43 signed long) CAC
12980 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 2c KEY_ID_TYPE_PIV,
12990 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
129a0 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f CACKEY_ID_TYPE_
129b0 43 41 43 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e CAC);.....return
129c0 28 2d 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 (-1);..}.../* De
129d0 74 65 72 6d 69 6e 65 20 69 64 65 6e 74 69 74 79 termine identity
129e0 20 4b 65 79 20 73 69 7a 65 20 2a 2f 0a 09 69 66 Key size */..if
129f0 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 (identity->pcsc
12a00 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 _identity->keysi
12a10 7a 65 20 3c 20 30 29 20 7b 0a 09 09 69 64 65 6e ze < 0) {...iden
12a20 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 tity->pcsc_ident
12a30 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 78 ity->keysize = x
12a40 35 30 39 5f 74 6f 5f 6b 65 79 73 69 7a 65 28 69 509_to_keysize(i
12a50 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 dentity->pcsc_id
12a60 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 entity->certific
12a70 61 74 65 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 ate, identity->p
12a80 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 csc_identity->ce
12a90 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a rtificate_len);.
12aa0 09 7d 0a 0a 09 2f 2a 20 50 61 64 20 6d 65 73 73 .}.../* Pad mess
12ab0 61 67 65 20 74 6f 20 6b 65 79 20 73 69 7a 65 20 age to key size
12ac0 2a 2f 0a 09 69 66 20 28 70 61 64 49 6e 70 75 74 */..if (padInput
12ad0 29 20 7b 0a 09 09 69 66 20 28 69 64 65 6e 74 69 ) {...if (identi
12ae0 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 ty->pcsc_identit
12af0 79 2d 3e 6b 65 79 73 69 7a 65 20 3e 20 30 29 20 y->keysize > 0)
12b00 7b 0a 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20 {....if (buflen
12b10 21 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 != identity->pcs
12b20 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 c_identity->keys
12b30 69 7a 65 29 20 7b 0a 09 09 09 09 69 66 20 28 62 ize) {.....if (b
12b40 75 66 6c 65 6e 20 3e 20 28 69 64 65 6e 74 69 74 uflen > (identit
12b50 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 y->pcsc_identity
12b60 2d 3e 6b 65 79 73 69 7a 65 20 2d 20 33 29 29 20 ->keysize - 3))
12b70 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 {......CACKEY_DE
12b80 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
12b90 72 2e 20 20 4d 65 73 73 61 67 65 20 69 73 20 74 r. Message is t
12ba0 6f 6f 20 6c 61 72 67 65 20 74 6f 20 73 69 67 6e oo large to sign
12bb0 2f 64 65 63 72 79 70 74 22 29 3b 0a 0a 09 09 09 /decrypt");.....
12bc0 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 ..return(-1);...
12bd0 09 09 7d 0a 0a 09 09 09 09 74 6d 70 62 75 66 6c ..}......tmpbufl
12be0 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70 en = identity->p
12bf0 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 csc_identity->ke
12c00 79 73 69 7a 65 3b 0a 09 09 09 09 74 6d 70 62 75 ysize;.....tmpbu
12c10 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 f = malloc(tmpbu
12c20 66 6c 65 6e 29 3b 0a 09 09 09 09 66 72 65 65 5f flen);.....free_
12c30 74 6d 70 62 75 66 20 3d 20 31 3b 0a 0a 09 09 09 tmpbuf = 1;.....
12c40 09 70 61 64 6c 65 6e 20 3d 20 74 6d 70 62 75 66 .padlen = tmpbuf
12c50 6c 65 6e 20 2d 20 62 75 66 6c 65 6e 20 2d 20 33 len - buflen - 3
12c60 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 ;......CACKEY_DE
12c70 42 55 47 5f 50 52 49 4e 54 46 28 22 4e 65 65 64 BUG_PRINTF("Need
12c80 20 74 6f 20 70 61 64 20 74 68 65 20 62 75 66 66 to pad the buff
12c90 65 72 20 77 69 74 68 20 25 6c 6c 75 20 62 79 74 er with %llu byt
12ca0 65 73 20 28 74 6d 70 62 75 66 6c 65 6e 20 3d 20 es (tmpbuflen =
12cb0 25 6c 6c 75 2c 20 62 75 66 6c 65 6e 20 3d 20 25 %llu, buflen = %
12cc0 6c 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 llu)", (unsigned
12cd0 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 70 61 64 6c long long) padl
12ce0 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f en, (unsigned lo
12cf0 6e 67 20 6c 6f 6e 67 29 20 74 6d 70 62 75 66 6c ng long) tmpbufl
12d00 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f en, (unsigned lo
12d10 6e 67 20 6c 6f 6e 67 29 20 62 75 66 6c 65 6e 29 ng long) buflen)
12d20 3b 0a 0a 09 09 09 09 2f 2a 20 52 53 41 20 50 4b ;....../* RSA PK
12d30 43 53 23 31 20 45 4d 53 41 2d 50 4b 43 53 31 2d CS#1 EMSA-PKCS1-
12d40 76 31 5f 35 20 50 61 64 64 69 6e 67 20 2a 2f 0a v1_5 Padding */.
12d50 09 09 09 09 74 6d 70 62 75 66 5b 30 5d 20 3d 20 ....tmpbuf[0] =
12d60 30 78 30 30 3b 0a 09 09 09 09 74 6d 70 62 75 66 0x00;.....tmpbuf
12d70 5b 31 5d 20 3d 20 30 78 30 31 3b 0a 09 09 09 09 [1] = 0x01;.....
12d80 6d 65 6d 73 65 74 28 26 74 6d 70 62 75 66 5b 32 memset(&tmpbuf[2
12d90 5d 2c 20 30 78 46 46 2c 20 70 61 64 6c 65 6e 29 ], 0xFF, padlen)
12da0 3b 0a 09 09 09 09 74 6d 70 62 75 66 5b 70 61 64 ;.....tmpbuf[pad
12db0 6c 65 6e 20 2b 20 32 5d 3d 20 30 78 30 30 3b 0a len + 2]= 0x00;.
12dc0 09 09 09 09 6d 65 6d 63 70 79 28 26 74 6d 70 62 ....memcpy(&tmpb
12dd0 75 66 5b 70 61 64 6c 65 6e 20 2b 20 33 5d 2c 20 uf[padlen + 3],
12de0 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b 0a 0a 09 buf, buflen);...
12df0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
12e00 50 52 49 4e 54 42 55 46 28 22 55 6e 70 61 64 64 PRINTBUF("Unpadd
12e10 65 64 3a 22 2c 20 62 75 66 2c 20 62 75 66 6c 65 ed:", buf, bufle
12e20 6e 29 3b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 n);.....CACKEY_D
12e30 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 50 EBUG_PRINTBUF("P
12e40 61 64 64 65 64 3a 22 2c 20 74 6d 70 62 75 66 2c added:", tmpbuf,
12e50 20 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 09 09 09 tmpbuflen);....
12e60 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 74 6d 70 } else {.....tmp
12e70 62 75 66 20 3d 20 62 75 66 3b 0a 09 09 09 09 74 buf = buf;.....t
12e80 6d 70 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65 mpbuflen = bufle
12e90 6e 3b 0a 09 09 09 09 66 72 65 65 5f 74 6d 70 62 n;.....free_tmpb
12ea0 75 66 20 3d 20 30 3b 0a 09 09 09 09 70 61 64 6c uf = 0;.....padl
12eb0 65 6e 20 3d 20 30 3b 0a 09 09 09 7d 0a 09 09 7d en = 0;....}...}
12ec0 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 else {....CACKE
12ed0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
12ee0 55 6e 61 62 6c 65 20 74 6f 20 64 65 74 65 72 6d Unable to determ
12ef0 69 6e 65 20 6b 65 79 20 73 69 7a 65 2c 20 68 6f ine key size, ho
12f00 70 69 6e 67 20 74 68 65 20 6d 65 73 73 61 67 65 ping the message
12f10 20 69 73 20 70 72 6f 70 65 72 6c 79 20 70 61 64 is properly pad
12f20 64 65 64 21 22 29 3b 0a 0a 09 09 09 74 6d 70 62 ded!");.....tmpb
12f30 75 66 20 3d 20 62 75 66 3b 0a 09 09 09 74 6d 70 uf = buf;....tmp
12f40 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b buflen = buflen;
12f50 0a 09 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20 ....free_tmpbuf
12f60 3d 20 30 3b 0a 09 09 09 70 61 64 6c 65 6e 20 3d = 0;....padlen =
12f70 20 30 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 0;...}..} else
12f80 7b 0a 09 09 74 6d 70 62 75 66 20 3d 20 62 75 66 {...tmpbuf = buf
12f90 3b 0a 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 ;...tmpbuflen =
12fa0 62 75 66 6c 65 6e 3b 0a 09 09 66 72 65 65 5f 74 buflen;...free_t
12fb0 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09 70 61 64 mpbuf = 0;...pad
12fc0 6c 65 6e 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a len = 0;..}.../*
12fd0 20 42 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69 Begin transacti
12fe0 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 62 65 on */..cackey_be
12ff0 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 gin_transaction(
13000 73 6c 6f 74 29 3b 0a 0a 09 2f 2a 20 53 65 6c 65 slot);.../* Sele
13010 63 74 20 63 6f 72 72 65 63 74 20 61 70 70 6c 65 ct correct apple
13020 74 20 2a 2f 0a 09 73 77 69 74 63 68 20 28 69 64 t */..switch (id
13030 5f 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20 _type) {...case
13040 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 CACKEY_ID_TYPE_C
13050 41 43 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 AC:....CACKEY_DE
13060 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 6c 65 BUG_PRINTF("Sele
13070 63 74 69 6e 67 20 61 70 70 6c 65 74 20 66 6f 75 cting applet fou
13080 6e 64 20 61 74 20 25 70 20 2e 2e 2e 22 2c 20 69 nd at %p ...", i
13090 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 dentity->pcsc_id
130a0 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 63 61 63 entity->card.cac
130b0 2e 61 70 70 6c 65 74 29 3b 0a 09 09 09 63 61 63 .applet);....cac
130c0 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 key_select_apple
130d0 74 28 73 6c 6f 74 2c 20 69 64 65 6e 74 69 74 79 t(slot, identity
130e0 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d ->pcsc_identity-
130f0 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 >card.cac.applet
13100 2c 20 73 69 7a 65 6f 66 28 69 64 65 6e 74 69 74 , sizeof(identit
13110 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 y->pcsc_identity
13120 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 ->card.cac.apple
13130 74 29 29 3b 0a 0a 09 09 09 2f 2a 20 53 65 6c 65 t));...../* Sele
13140 63 74 20 63 6f 72 72 65 63 74 20 66 69 6c 65 20 ct correct file
13150 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 6c */....cackey_sel
13160 65 63 74 5f 66 69 6c 65 28 73 6c 6f 74 2c 20 69 ect_file(slot, i
13170 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 dentity->pcsc_id
13180 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 63 61 63 entity->card.cac
13190 2e 66 69 6c 65 29 3b 0a 09 09 09 62 72 65 61 6b .file);....break
131a0 3b 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f ;...case CACKEY_
131b0 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09 09 ID_TYPE_PIV:....
131c0 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 dyn_auth_templat
131d0 65 5b 30 5d 20 3d 20 30 78 37 43 3b 0a 09 09 09 e[0] = 0x7C;....
131e0 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 dyn_auth_templat
131f0 65 5b 31 5d 20 3d 20 30 78 38 32 3b 0a 09 09 09 e[1] = 0x82;....
13200 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 dyn_auth_templat
13210 65 5b 32 5d 20 3d 20 28 28 74 6d 70 62 75 66 6c e[2] = ((tmpbufl
13220 65 6e 20 2b 20 36 29 20 26 20 30 78 66 66 30 30 en + 6) & 0xff00
13230 29 20 3e 3e 20 38 3b 0a 09 09 09 64 79 6e 5f 61 ) >> 8;....dyn_a
13240 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 33 5d 20 uth_template[3]
13250 3d 20 28 74 6d 70 62 75 66 6c 65 6e 20 2b 20 36 = (tmpbuflen + 6
13260 29 20 26 20 30 78 30 30 66 66 3b 0a 09 09 09 64 ) & 0x00ff;....d
13270 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 yn_auth_template
13280 5b 34 5d 20 3d 20 30 78 38 32 3b 0a 09 09 09 64 [4] = 0x82;....d
13290 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 yn_auth_template
132a0 5b 35 5d 20 3d 20 30 78 30 30 3b 0a 09 09 09 64 [5] = 0x00;....d
132b0 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 yn_auth_template
132c0 5b 36 5d 20 3d 20 30 78 38 31 3b 0a 09 09 09 64 [6] = 0x81;....d
132d0 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 yn_auth_template
132e0 5b 37 5d 20 3d 20 30 78 38 32 3b 0a 09 09 09 64 [7] = 0x82;....d
132f0 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 yn_auth_template
13300 5b 38 5d 20 3d 20 28 74 6d 70 62 75 66 6c 65 6e [8] = (tmpbuflen
13310 20 26 20 30 78 66 66 30 30 29 20 3e 3e 20 38 3b & 0xff00) >> 8;
13320 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d ....dyn_auth_tem
13330 70 6c 61 74 65 5b 39 5d 20 3d 20 74 6d 70 62 75 plate[9] = tmpbu
13340 66 6c 65 6e 20 26 20 30 78 30 30 66 66 3b 0a 0a flen & 0x00ff;..
13350 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 6d 70 62 ...dyn_auth_tmpb
13360 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 uf = malloc(tmpb
13370 75 66 6c 65 6e 20 2b 20 73 69 7a 65 6f 66 28 64 uflen + sizeof(d
13380 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 yn_auth_template
13390 29 29 3b 0a 09 09 09 6d 65 6d 63 70 79 28 64 79 ));....memcpy(dy
133a0 6e 5f 61 75 74 68 5f 74 6d 70 62 75 66 2c 20 64 n_auth_tmpbuf, d
133b0 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 yn_auth_template
133c0 2c 20 73 69 7a 65 6f 66 28 64 79 6e 5f 61 75 74 , sizeof(dyn_aut
133d0 68 5f 74 65 6d 70 6c 61 74 65 29 29 3b 0a 09 09 h_template));...
133e0 09 6d 65 6d 63 70 79 28 64 79 6e 5f 61 75 74 68 .memcpy(dyn_auth
133f0 5f 74 6d 70 62 75 66 20 2b 20 73 69 7a 65 6f 66 _tmpbuf + sizeof
13400 28 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 (dyn_auth_templa
13410 74 65 29 2c 20 74 6d 70 62 75 66 2c 20 74 6d 70 te), tmpbuf, tmp
13420 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 69 66 20 buflen);.....if
13430 28 66 72 65 65 5f 74 6d 70 62 75 66 29 20 7b 0a (free_tmpbuf) {.
13440 09 09 09 09 66 72 65 65 28 74 6d 70 62 75 66 29 ....free(tmpbuf)
13450 3b 0a 09 09 09 7d 0a 0a 09 09 09 74 6d 70 62 75 ;....}.....tmpbu
13460 66 6c 65 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 64 flen += sizeof(d
13470 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 yn_auth_template
13480 29 3b 0a 09 09 09 74 6d 70 62 75 66 20 3d 20 64 );....tmpbuf = d
13490 79 6e 5f 61 75 74 68 5f 74 6d 70 62 75 66 3b 0a yn_auth_tmpbuf;.
134a0 09 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d ...free_tmpbuf =
134b0 20 31 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 1;.....break;..
134c0 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f .case CACKEY_ID_
134d0 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 3a 0a TYPE_CERT_ONLY:.
134e0 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 74 ...break;..}...t
134f0 6d 70 62 75 66 5f 73 20 3d 20 74 6d 70 62 75 66 mpbuf_s = tmpbuf
13500 3b 0a 09 6f 75 74 62 75 66 5f 73 20 3d 20 6f 75 ;..outbuf_s = ou
13510 74 62 75 66 3b 0a 09 77 68 69 6c 65 20 28 74 6d tbuf;..while (tm
13520 70 62 75 66 6c 65 6e 29 20 7b 0a 09 09 74 6d 70 pbuflen) {...tmp
13530 6f 75 74 62 75 66 6c 65 6e 20 3d 20 6f 75 74 62 outbuflen = outb
13540 75 66 6c 65 6e 3b 0a 0a 09 09 69 66 20 28 74 6d uflen;....if (tm
13550 70 62 75 66 6c 65 6e 20 3e 20 43 41 43 4b 45 59 pbuflen > CACKEY
13560 5f 41 50 44 55 5f 4d 54 55 29 20 7b 0a 09 09 09 _APDU_MTU) {....
13570 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 20 3d 20 bytes_to_send =
13580 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 3b CACKEY_APDU_MTU;
13590 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 62 ...} else {....b
135a0 79 74 65 73 5f 74 6f 5f 73 65 6e 64 20 3d 20 74 ytes_to_send = t
135b0 6d 70 62 75 66 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 mpbuflen;...}...
135c0 09 73 65 6e 64 5f 72 65 74 20 3d 20 43 41 43 4b .send_ret = CACK
135d0 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 EY_PCSC_E_GENERI
135e0 43 3b 0a 09 09 73 77 69 74 63 68 20 28 69 64 5f C;...switch (id_
135f0 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20 type) {....case
13600 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 CACKEY_ID_TYPE_C
13610 41 43 3a 0a 09 09 09 09 69 66 20 28 74 6d 70 62 AC:.....if (tmpb
13620 75 66 6c 65 6e 20 3e 20 43 41 43 4b 45 59 5f 41 uflen > CACKEY_A
13630 50 44 55 5f 4d 54 55 29 20 7b 0a 09 09 09 09 09 PDU_MTU) {......
13640 70 31 20 3d 20 30 78 38 30 3b 0a 09 09 09 09 09 p1 = 0x80;......
13650 6c 65 20 3d 20 30 78 30 30 3b 0a 09 09 09 09 7d le = 0x00;.....}
13660 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 31 20 else {......p1
13670 3d 20 30 78 30 30 3b 0a 09 09 09 09 09 6c 65 20 = 0x00;......le
13680 3d 20 30 78 30 30 3b 0a 09 09 09 09 7d 0a 0a 09 = 0x00;.....}...
13690 09 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 ...send_ret = ca
136a0 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 ckey_send_apdu(s
136b0 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 lot, GSCIS_CLASS
136c0 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d _GLOBAL_PLATFORM
136d0 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 49 , GSCIS_INSTR_SI
136e0 47 4e 44 45 43 52 59 50 54 2c 20 70 31 2c 20 30 GNDECRYPT, p1, 0
136f0 78 30 30 2c 20 62 79 74 65 73 5f 74 6f 5f 73 65 x00, bytes_to_se
13700 6e 64 2c 20 74 6d 70 62 75 66 2c 20 6c 65 2c 20 nd, tmpbuf, le,
13710 26 72 65 73 70 63 6f 64 65 2c 20 6f 75 74 62 75 &respcode, outbu
13720 66 2c 20 26 74 6d 70 6f 75 74 62 75 66 6c 65 6e f, &tmpoutbuflen
13730 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 );.....break;...
13740 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f .case CACKEY_ID_
13750 54 59 50 45 5f 50 49 56 3a 0a 09 09 09 09 69 66 TYPE_PIV:.....if
13760 20 28 74 6d 70 62 75 66 6c 65 6e 20 3e 20 43 41 (tmpbuflen > CA
13770 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 29 20 7b CKEY_APDU_MTU) {
13780 0a 09 09 09 09 09 63 6c 61 73 73 20 3d 20 30 78 ......class = 0x
13790 31 30 3b 0a 09 09 09 09 09 6c 65 20 3d 20 30 78 10;......le = 0x
137a0 30 30 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 00;.....} else {
137b0 0a 09 09 09 09 09 63 6c 61 73 73 20 3d 20 47 53 ......class = GS
137c0 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 CIS_CLASS_ISO781
137d0 36 3b 0a 09 09 09 09 09 6c 65 20 3d 20 32 35 36 6;......le = 256
137e0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 73 65 6e ;.....}......sen
137f0 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 d_ret = cackey_s
13800 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 63 end_apdu(slot, c
13810 6c 61 73 73 2c 20 4e 49 53 54 53 50 38 30 30 5f lass, NISTSP800_
13820 37 33 5f 33 5f 49 4e 53 54 52 5f 47 45 4e 41 55 73_3_INSTR_GENAU
13830 54 48 2c 20 4e 49 53 54 53 50 38 30 30 5f 37 38 TH, NISTSP800_78
13840 5f 33 5f 41 4c 47 4f 5f 52 53 41 32 30 34 38 2c _3_ALGO_RSA2048,
13850 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f identity->pcsc_
13860 69 64 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 70 identity->card.p
13870 69 76 2e 6b 65 79 5f 69 64 2c 20 62 79 74 65 73 iv.key_id, bytes
13880 5f 74 6f 5f 73 65 6e 64 2c 20 74 6d 70 62 75 66 _to_send, tmpbuf
13890 2c 20 6c 65 2c 20 26 72 65 73 70 63 6f 64 65 2c , le, &respcode,
138a0 20 6f 75 74 62 75 66 2c 20 26 74 6d 70 6f 75 74 outbuf, &tmpout
138b0 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 62 72 65 buflen);.....bre
138c0 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 41 43 4b ak;....case CACK
138d0 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f EY_ID_TYPE_CERT_
138e0 4f 4e 4c 59 3a 0a 09 09 09 09 62 72 65 61 6b 3b ONLY:.....break;
138f0 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 65 6e 64 ...}....if (send
13900 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 _ret != CACKEY_P
13910 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 69 CSC_S_OK) {....i
13920 66 20 28 66 72 65 65 5f 74 6d 70 62 75 66 29 20 f (free_tmpbuf)
13930 7b 0a 09 09 09 09 69 66 20 28 74 6d 70 62 75 66 {.....if (tmpbuf
13940 5f 73 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28 _s) {......free(
13950 74 6d 70 62 75 66 5f 73 29 3b 0a 09 09 09 09 7d tmpbuf_s);.....}
13960 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 45 6e 64 ....}...../* End
13970 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a transaction */.
13980 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 ...cackey_end_tr
13990 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b ansaction(slot);
139a0 0a 0a 09 09 09 69 66 20 28 73 65 6e 64 5f 72 65 .....if (send_re
139b0 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 t == CACKEY_PCSC
139c0 5f 45 5f 52 45 54 52 59 29 20 7b 0a 09 09 09 09 _E_RETRY) {.....
139d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
139e0 4e 54 46 28 22 41 44 50 55 20 53 65 6e 64 69 6e NTF("ADPU Sendin
139f0 67 20 46 61 69 6c 65 64 20 2d 2d 20 72 65 74 72 g Failed -- retr
13a00 79 69 6e 67 2e 22 29 3b 0a 0a 09 09 09 09 72 65 ying.");......re
13a10 74 75 72 6e 28 63 61 63 6b 65 79 5f 73 69 67 6e turn(cackey_sign
13a20 64 65 63 72 79 70 74 28 73 6c 6f 74 2c 20 69 64 decrypt(slot, id
13a30 65 6e 74 69 74 79 2c 20 62 75 66 2c 20 62 75 66 entity, buf, buf
13a40 6c 65 6e 2c 20 6f 75 74 62 75 66 2c 20 6f 75 74 len, outbuf, out
13a50 62 75 66 6c 65 6e 2c 20 70 61 64 49 6e 70 75 74 buflen, padInput
13a60 2c 20 75 6e 70 61 64 4f 75 74 70 75 74 29 29 3b , unpadOutput));
13a70 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59 ....}.....CACKEY
13a80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 _DEBUG_PRINTF("A
13a90 44 50 55 20 53 65 6e 64 69 6e 67 20 46 61 69 6c DPU Sending Fail
13aa0 65 64 20 2d 2d 20 72 65 74 75 72 6e 69 6e 67 20 ed -- returning
13ab0 69 6e 20 65 72 72 6f 72 2e 22 29 3b 0a 0a 09 09 in error.");....
13ac0 09 69 66 20 28 72 65 73 70 63 6f 64 65 20 3d 3d .if (respcode ==
13ad0 20 30 78 36 39 38 32 20 7c 7c 20 72 65 73 70 63 0x6982 || respc
13ae0 6f 64 65 20 3d 3d 20 30 78 36 65 30 30 29 20 7b ode == 0x6e00) {
13af0 0a 09 09 09 09 69 66 20 28 72 65 73 70 63 6f 64 .....if (respcod
13b00 65 20 3d 3d 20 30 78 36 45 30 30 29 20 7b 0a 09 e == 0x6E00) {..
13b10 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
13b20 5f 50 52 49 4e 54 46 28 22 47 6f 74 20 5c 22 57 _PRINTF("Got \"W
13b30 52 4f 4e 47 20 43 4c 41 53 53 5c 22 2c 20 74 68 RONG CLASS\", th
13b40 69 73 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 is means we are
13b50 74 61 6c 6b 69 6e 67 20 74 6f 20 74 68 65 20 77 talking to the w
13b60 72 6f 6e 67 20 6f 62 6a 65 63 74 20 28 6c 69 6b rong object (lik
13b70 65 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20 ely because the
13b80 63 61 72 64 20 77 65 6e 74 20 61 77 61 79 29 20 card went away)
13b90 2d 2d 20 72 65 73 65 74 74 69 6e 67 22 29 3b 0a -- resetting");.
13ba0 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 ....} else {....
13bb0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
13bc0 52 49 4e 54 46 28 22 53 65 63 75 72 69 74 79 20 RINTF("Security
13bd0 73 74 61 74 75 73 20 6e 6f 74 20 73 61 74 69 73 status not satis
13be0 69 66 69 65 64 20 28 72 65 73 70 63 6f 64 65 20 ified (respcode
13bf0 3d 20 30 78 25 30 34 78 29 2e 20 20 52 65 74 75 = 0x%04x). Retu
13c00 72 6e 69 6e 67 20 4e 45 45 44 4c 4f 47 49 4e 22 rning NEEDLOGIN"
13c10 2c 20 28 69 6e 74 29 20 72 65 73 70 63 6f 64 65 , (int) respcode
13c20 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 63 61 );.....}......ca
13c30 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 ckey_mark_slot_r
13c40 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 eset(slot);.....
13c50 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 .slot->token_fla
13c60 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 gs = CKF_LOGIN_R
13c70 45 51 55 49 52 45 44 3b 0a 0a 09 09 09 09 72 65 EQUIRED;......re
13c80 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 turn(CACKEY_PCSC
13c90 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 3b 0a 09 _E_NEEDLOGIN);..
13ca0 09 09 7d 0a 0a 09 09 09 69 66 20 28 73 65 6e 64 ..}.....if (send
13cb0 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 _ret == CACKEY_P
13cc0 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e CSC_E_TOKENABSEN
13cd0 54 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f T) {.....CACKEY_
13ce0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 6f DEBUG_PRINTF("To
13cf0 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 52 65 74 ken absent. Ret
13d00 75 72 6e 69 6e 67 20 54 4f 4b 45 4e 41 42 53 45 urning TOKENABSE
13d10 4e 54 22 29 3b 0a 0a 09 09 09 09 63 61 63 6b 65 NT");......cacke
13d20 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 y_mark_slot_rese
13d30 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 72 65 t(slot);......re
13d40 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 turn(CACKEY_PCSC
13d50 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b _E_TOKENABSENT);
13d60 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59 ....}.....CACKEY
13d70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 _DEBUG_PRINTF("S
13d80 6f 6d 65 74 68 69 6e 67 20 77 65 6e 74 20 77 72 omething went wr
13d90 6f 6e 67 20 64 75 72 69 6e 67 20 73 69 67 6e 69 ong during signi
13da0 6e 67 2c 20 72 65 73 65 74 74 69 6e 67 20 74 68 ng, resetting th
13db0 65 20 73 6c 6f 74 20 61 6e 64 20 68 6f 70 69 6e e slot and hopin
13dc0 67 20 66 6f 72 20 74 68 65 20 62 65 73 74 2e 22 g for the best."
13dd0 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 6d 61 );.....cackey_ma
13de0 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c rk_slot_reset(sl
13df0 6f 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 ot);.....return(
13e00 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 CACKEY_PCSC_E_GE
13e10 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 74 NERIC);...}....t
13e20 6d 70 62 75 66 20 2b 3d 20 62 79 74 65 73 5f 74 mpbuf += bytes_t
13e30 6f 5f 73 65 6e 64 3b 0a 09 09 74 6d 70 62 75 66 o_send;...tmpbuf
13e40 6c 65 6e 20 2d 3d 20 62 79 74 65 73 5f 74 6f 5f len -= bytes_to_
13e50 73 65 6e 64 3b 0a 0a 09 09 6f 75 74 62 75 66 20 send;....outbuf
13e60 2b 3d 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b += tmpoutbuflen;
13e70 0a 09 09 6f 75 74 62 75 66 6c 65 6e 20 2d 3d 20 ...outbuflen -=
13e80 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 09 tmpoutbuflen;...
13e90 72 65 74 76 61 6c 20 2b 3d 20 74 6d 70 6f 75 74 retval += tmpout
13ea0 62 75 66 6c 65 6e 3b 0a 09 7d 0a 0a 09 69 66 20 buflen;..}...if
13eb0 28 66 72 65 65 5f 74 6d 70 62 75 66 29 20 7b 0a (free_tmpbuf) {.
13ec0 09 09 69 66 20 28 74 6d 70 62 75 66 5f 73 29 20 ..if (tmpbuf_s)
13ed0 7b 0a 09 09 09 66 72 65 65 28 74 6d 70 62 75 66 {....free(tmpbuf
13ee0 5f 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6f 75 _s);...}..}...ou
13ef0 74 62 75 66 20 3d 20 6f 75 74 62 75 66 5f 73 3b tbuf = outbuf_s;
13f00 0a 0a 09 2f 2a 20 45 6e 64 20 74 72 61 6e 73 61 .../* End transa
13f10 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 ction */..cackey
13f20 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e _end_transaction
13f30 28 73 6c 6f 74 29 3b 0a 0a 23 69 66 64 65 66 20 (slot);..#ifdef
13f40 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a CACKEY_PARANOID.
13f50 23 20 20 69 66 64 65 66 20 5f 50 4f 53 49 58 5f # ifdef _POSIX_
13f60 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28 6f SSIZE_MAX..if (o
13f70 75 74 62 75 66 6c 65 6e 20 3e 20 5f 50 4f 53 49 utbuflen > _POSI
13f80 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 X_SSIZE_MAX) {..
13f90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
13fa0 49 4e 54 46 28 22 4f 75 74 62 75 66 6c 65 6e 20 INTF("Outbuflen
13fb0 65 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d 20 exceeds maximum
13fc0 76 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e 67 value, returning
13fd0 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d 61 in failure. (ma
13fe0 78 20 3d 20 25 6c 69 2c 20 6f 75 74 62 75 66 6c x = %li, outbufl
13ff0 65 6e 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e en = %lu)", (lon
14000 67 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f g) _POSIX_SSIZE_
14010 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c MAX, (unsigned l
14020 6f 6e 67 29 20 6f 75 74 62 75 66 6c 65 6e 29 3b ong) outbuflen);
14030 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a ....return(-1);.
14040 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 .}.# endif.#end
14050 69 66 0a 0a 09 2f 2a 20 57 65 20 6d 75 73 74 20 if.../* We must
14060 72 65 6d 6f 76 65 20 74 68 65 20 22 37 43 22 20 remove the "7C"
14070 74 61 67 20 74 6f 20 67 65 74 20 74 6f 20 74 68 tag to get to th
14080 65 20 73 69 67 6e 61 74 75 72 65 20 2a 2f 0a 09 e signature */..
14090 73 77 69 74 63 68 20 28 69 64 5f 74 79 70 65 29 switch (id_type)
140a0 20 7b 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 {...case CACKEY
140b0 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09 _ID_TYPE_PIV:...
140c0 09 6f 75 74 62 75 66 5f 6c 65 6e 20 3d 20 72 65 .outbuf_len = re
140d0 74 76 61 6c 3b 0a 09 09 09 6f 75 74 62 75 66 5f tval;....outbuf_
140e0 70 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f p = cackey_read_
140f0 62 65 72 74 6c 76 5f 74 61 67 28 6f 75 74 62 75 bertlv_tag(outbu
14100 66 2c 20 26 6f 75 74 62 75 66 5f 6c 65 6e 2c 20 f, &outbuf_len,
14110 30 78 37 43 2c 20 4e 55 4c 4c 2c 20 20 26 6f 75 0x7C, NULL, &ou
14120 74 62 75 66 5f 6c 65 6e 29 3b 0a 09 09 09 69 66 tbuf_len);....if
14130 20 28 6f 75 74 62 75 66 5f 70 20 3d 3d 20 4e 55 (outbuf_p == NU
14140 4c 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 LL) {.....CACKEY
14150 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
14160 65 73 70 6f 6e 73 65 20 66 72 6f 6d 20 50 49 56 esponse from PIV
14170 20 66 6f 72 20 47 45 4e 45 52 41 54 45 20 41 55 for GENERATE AU
14180 54 48 45 4e 54 49 43 41 54 49 4f 4e 20 77 61 73 THENTICATION was
14190 20 6e 6f 74 20 61 20 30 78 37 43 20 74 61 67 2c not a 0x7C tag,
141a0 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 returning in fa
141b0 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 09 72 65 ilure");......re
141c0 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 0a turn(-1);....}..
141d0 09 09 09 72 65 74 76 61 6c 20 3d 20 6f 75 74 62 ...retval = outb
141e0 75 66 5f 6c 65 6e 3b 0a 0a 09 09 09 6f 75 74 62 uf_len;.....outb
141f0 75 66 5f 6c 65 6e 20 3d 20 72 65 74 76 61 6c 3b uf_len = retval;
14200 0a 09 09 09 6f 75 74 62 75 66 5f 70 20 3d 20 63 ....outbuf_p = c
14210 61 63 6b 65 79 5f 72 65 61 64 5f 62 65 72 74 6c ackey_read_bertl
14220 76 5f 74 61 67 28 6f 75 74 62 75 66 2c 20 26 6f v_tag(outbuf, &o
14230 75 74 62 75 66 5f 6c 65 6e 2c 20 30 78 38 32 2c utbuf_len, 0x82,
14240 20 4e 55 4c 4c 2c 20 20 26 6f 75 74 62 75 66 5f NULL, &outbuf_
14250 6c 65 6e 29 3b 0a 09 09 09 69 66 20 28 6f 75 74 len);....if (out
14260 62 75 66 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b buf_p == NULL) {
14270 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
14280 47 5f 50 52 49 4e 54 46 28 22 52 65 73 70 6f 6e G_PRINTF("Respon
14290 73 65 20 66 72 6f 6d 20 50 49 56 20 66 6f 72 20 se from PIV for
142a0 47 45 4e 45 52 41 54 45 20 41 55 54 48 45 4e 54 GENERATE AUTHENT
142b0 49 43 41 54 49 4f 4e 20 77 61 73 20 6e 6f 74 20 ICATION was not
142c0 61 20 30 78 38 32 20 77 69 74 68 69 6e 20 61 20 a 0x82 within a
142d0 30 78 37 43 20 74 61 67 2c 20 72 65 74 75 72 6e 0x7C tag, return
142e0 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 ing in failure")
142f0 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31 ;......return(-1
14300 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 76 );....}.....retv
14310 61 6c 20 3d 20 6f 75 74 62 75 66 5f 6c 65 6e 3b al = outbuf_len;
14320 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 .....break;...ca
14330 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 se CACKEY_ID_TYP
14340 45 5f 43 41 43 3a 0a 09 09 63 61 73 65 20 43 41 E_CAC:...case CA
14350 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 CKEY_ID_TYPE_CER
14360 54 5f 4f 4e 4c 59 3a 0a 09 09 09 62 72 65 61 6b T_ONLY:....break
14370 3b 0a 09 7d 0a 0a 09 2f 2a 20 55 6e 70 61 64 20 ;..}.../* Unpad
14380 72 65 70 6c 79 20 2a 2f 0a 09 69 66 20 28 75 6e reply */..if (un
14390 70 61 64 4f 75 74 70 75 74 29 20 7b 0a 09 09 69 padOutput) {...i
143a0 66 20 28 72 65 74 76 61 6c 20 3c 20 33 29 20 7b f (retval < 3) {
143b0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
143c0 5f 50 52 49 4e 54 46 28 22 52 65 70 6c 79 20 69 _PRINTF("Reply i
143d0 73 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 77 65 20 s too small, we
143e0 61 72 65 20 6e 6f 74 20 61 62 6c 65 20 74 6f 20 are not able to
143f0 75 6e 70 61 64 20 2d 2d 20 70 61 73 73 69 6e 67 unpad -- passing
14400 20 62 61 63 6b 20 61 6e 64 20 68 6f 70 69 6e 67 back and hoping
14410 20 66 6f 72 20 74 68 65 20 62 65 73 74 21 22 29 for the best!")
14420 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 ;.....CACKEY_DEB
14430 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
14440 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c ning in success,
14450 20 72 65 74 76 61 6c 20 3d 20 25 6c 69 20 28 62 retval = %li (b
14460 79 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29 20 72 ytes)", (long) r
14470 65 74 76 61 6c 29 3b 0a 09 09 09 72 65 74 75 72 etval);....retur
14480 6e 28 72 65 74 76 61 6c 29 3b 0a 09 09 7d 0a 0a n(retval);...}..
14490 09 09 69 66 20 28 6f 75 74 62 75 66 5b 30 5d 20 ..if (outbuf[0]
144a0 21 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 43 41 != 0x00) {....CA
144b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
144c0 46 28 22 55 6e 72 65 63 6f 67 6e 69 7a 65 64 20 F("Unrecognized
144d0 70 61 64 64 69 6e 67 20 73 63 68 65 6d 65 20 2d padding scheme -
144e0 2d 20 70 61 73 73 69 6e 67 20 62 61 63 6b 20 61 - passing back a
144f0 6e 64 20 68 6f 70 69 6e 67 20 66 6f 72 20 74 68 nd hoping for th
14500 65 20 62 65 73 74 21 22 29 3b 0a 0a 09 09 09 43 e best!");.....C
14510 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
14520 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e TF("Returning in
14530 20 73 75 63 63 65 73 73 2c 20 72 65 74 76 61 6c success, retval
14540 20 3d 20 25 6c 69 20 28 62 79 74 65 73 29 22 2c = %li (bytes)",
14550 20 28 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b (long) retval);
14560 0a 09 09 09 72 65 74 75 72 6e 28 72 65 74 76 61 ....return(retva
14570 6c 29 3b 0a 09 09 7d 0a 0a 09 09 62 6c 6f 63 6b l);...}....block
14580 74 79 70 65 20 3d 20 6f 75 74 62 75 66 5b 31 5d type = outbuf[1]
14590 3b 0a 09 09 75 6e 70 61 64 6f 66 66 73 65 74 20 ;...unpadoffset
145a0 3d 20 30 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 = 0;....switch (
145b0 62 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 09 09 09 blocktype) {....
145c0 63 61 73 65 20 30 78 30 30 3a 0a 09 09 09 09 2f case 0x00:...../
145d0 2a 20 50 61 64 64 69 6e 67 20 53 63 68 65 6d 65 * Padding Scheme
145e0 20 31 2c 20 74 68 65 20 66 69 72 73 74 20 6e 6f 1, the first no
145f0 6e 2d 7a 65 72 6f 20 62 79 74 65 20 69 73 20 74 n-zero byte is t
14600 68 65 20 73 74 61 72 74 20 6f 66 20 64 61 74 61 he start of data
14610 20 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75 6e 70 */.....for (unp
14620 61 64 6f 66 66 73 65 74 20 3d 20 32 3b 20 75 6e adoffset = 2; un
14630 70 61 64 6f 66 66 73 65 74 20 3c 20 72 65 74 76 padoffset < retv
14640 61 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 2b al; unpadoffset+
14650 2b 29 20 7b 0a 09 09 09 09 09 69 66 20 28 6f 75 +) {......if (ou
14660 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 tbuf[unpadoffset
14670 5d 20 21 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 ] != 0x00) {....
14680 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d ...break;......}
14690 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b .....}.....break
146a0 3b 0a 09 09 09 63 61 73 65 20 30 78 30 31 3a 0a ;....case 0x01:.
146b0 09 09 09 09 2f 2a 20 50 61 64 64 69 6e 67 20 53 ..../* Padding S
146c0 63 68 65 6d 65 20 32 2c 20 70 61 64 20 62 79 74 cheme 2, pad byt
146d0 65 73 20 61 72 65 20 30 78 46 46 20 66 6f 6c 6c es are 0xFF foll
146e0 6f 77 65 64 20 62 79 20 30 78 30 30 20 2a 2f 0a owed by 0x00 */.
146f0 09 09 09 09 66 6f 72 20 28 75 6e 70 61 64 6f 66 ....for (unpadof
14700 66 73 65 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f fset = 2; unpado
14710 66 66 73 65 74 20 3c 20 72 65 74 76 61 6c 3b 20 ffset < retval;
14720 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b unpadoffset++) {
14730 0a 09 09 09 09 09 69 66 20 28 6f 75 74 62 75 66 ......if (outbuf
14740 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 21 3d [unpadoffset] !=
14750 20 30 78 46 46 29 20 7b 0a 09 09 09 09 09 09 69 0xFF) {.......i
14760 66 20 28 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f f (outbuf[unpado
14770 66 66 73 65 74 5d 20 3d 3d 20 30 78 30 30 29 20 ffset] == 0x00)
14780 7b 0a 09 09 09 09 09 09 09 75 6e 70 61 64 6f 66 {........unpadof
14790 66 73 65 74 2b 2b 3b 0a 0a 09 09 09 09 09 09 09 fset++;.........
147a0 62 72 65 61 6b 3b 0a 09 09 09 09 09 09 7d 20 65 break;.......} e
147b0 6c 73 65 20 7b 0a 09 09 09 09 09 09 09 43 41 43 lse {........CAC
147c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
147d0 28 22 49 6e 76 61 6c 69 64 20 70 61 64 64 69 6e ("Invalid paddin
147e0 67 20 64 61 74 61 20 66 6f 75 6e 64 2c 20 72 65 g data found, re
147f0 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 turning in failu
14800 72 65 2c 20 73 68 6f 75 6c 64 20 68 61 76 65 20 re, should have
14810 62 65 65 6e 20 30 78 30 30 20 66 6f 75 6e 64 20 been 0x00 found
14820 30 78 25 30 32 78 22 2c 20 28 75 6e 73 69 67 6e 0x%02x", (unsign
14830 65 64 20 69 6e 74 29 20 6f 75 74 62 75 66 5b 75 ed int) outbuf[u
14840 6e 70 61 64 6f 66 66 73 65 74 5d 29 3b 0a 0a 09 npadoffset]);...
14850 09 09 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 ......return(-1)
14860 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d ;.......}......}
14870 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 43 41 else {.......CA
14880 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
14890 46 28 22 49 6e 76 61 6c 69 64 20 70 61 64 64 69 F("Invalid paddi
148a0 6e 67 20 64 61 74 61 20 66 6f 75 6e 64 2c 20 72 ng data found, r
148b0 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c eturning in fail
148c0 75 72 65 2c 20 73 68 6f 75 6c 64 20 68 61 76 65 ure, should have
148d0 20 62 65 65 6e 20 30 78 46 46 20 66 6f 75 6e 64 been 0xFF found
148e0 20 30 78 25 30 32 78 22 2c 20 28 75 6e 73 69 67 0x%02x", (unsig
148f0 6e 65 64 20 69 6e 74 29 20 6f 75 74 62 75 66 5b ned int) outbuf[
14900 75 6e 70 61 64 6f 66 66 73 65 74 5d 29 3b 0a 0a unpadoffset]);..
14910 09 09 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 ......return(-1)
14920 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 ;......}.....}..
14930 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 ...break;....cas
14940 65 20 30 78 30 32 3a 0a 09 09 09 09 2f 2a 20 50 e 0x02:...../* P
14950 61 64 64 69 6e 67 20 53 63 68 65 6d 65 20 33 2c adding Scheme 3,
14960 20 70 61 64 20 62 79 74 65 73 20 61 72 65 20 6e pad bytes are n
14970 6f 6e 2d 7a 65 72 6f 20 66 69 72 73 74 20 7a 65 on-zero first ze
14980 72 6f 20 62 79 74 65 20 66 6f 75 6e 64 20 69 73 ro byte found is
14990 20 74 68 65 20 73 65 70 65 72 61 74 6f 72 20 62 the seperator b
149a0 79 74 65 20 2a 2f 0a 09 09 09 09 66 6f 72 20 28 yte */.....for (
149b0 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 32 3b unpadoffset = 2;
149c0 20 75 6e 70 61 64 6f 66 66 73 65 74 20 3c 20 72 unpadoffset < r
149d0 65 74 76 61 6c 3b 20 75 6e 70 61 64 6f 66 66 73 etval; unpadoffs
149e0 65 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66 20 et++) {......if
149f0 28 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 (outbuf[unpadoff
14a00 73 65 74 5d 20 3d 3d 20 30 78 30 30 29 20 7b 0a set] == 0x00) {.
14a10 09 09 09 09 09 09 75 6e 70 61 64 6f 66 66 73 65 ......unpadoffse
14a20 74 2b 2b 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 t++;........brea
14a30 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a k;......}.....}.
14a40 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a ....break;...}..
14a50 09 09 69 66 20 28 75 6e 70 61 64 6f 66 66 73 65 ..if (unpadoffse
14a60 74 20 3e 20 72 65 74 76 61 6c 29 20 7b 0a 09 09 t > retval) {...
14a70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
14a80 49 4e 54 46 28 22 4f 66 66 73 65 74 20 67 72 65 INTF("Offset gre
14a90 61 74 65 72 20 74 68 61 6e 20 72 65 70 6c 79 20 ater than reply
14aa0 73 69 7a 65 2c 20 61 62 6f 72 74 69 6e 67 2e 20 size, aborting.
14ab0 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 (unpadoffset =
14ac0 25 6c 75 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c %lu, retval = %l
14ad0 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c u)", (unsigned l
14ae0 6f 6e 67 29 20 75 6e 70 61 64 6f 66 66 73 65 74 ong) unpadoffset
14af0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
14b00 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 ) retval);.....r
14b10 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a eturn(-1);...}..
14b20 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
14b30 52 49 4e 54 42 55 46 28 22 50 61 64 64 65 64 3a RINTBUF("Padded:
14b40 22 2c 20 6f 75 74 62 75 66 2c 20 72 65 74 76 61 ", outbuf, retva
14b50 6c 29 3b 0a 0a 09 09 72 65 74 76 61 6c 20 2d 3d l);....retval -=
14b60 20 75 6e 70 61 64 6f 66 66 73 65 74 3b 0a 09 09 unpadoffset;...
14b70 6d 65 6d 6d 6f 76 65 28 6f 75 74 62 75 66 2c 20 memmove(outbuf,
14b80 6f 75 74 62 75 66 20 2b 20 75 6e 70 61 64 6f 66 outbuf + unpadof
14b90 66 73 65 74 2c 20 72 65 74 76 61 6c 29 3b 0a 0a fset, retval);..
14ba0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
14bb0 52 49 4e 54 42 55 46 28 22 55 6e 70 61 64 64 65 RINTBUF("Unpadde
14bc0 64 3a 22 2c 20 6f 75 74 62 75 66 2c 20 72 65 74 d:", outbuf, ret
14bd0 76 61 6c 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b val);..}....CACK
14be0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
14bf0 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 "Returning in su
14c00 63 63 65 73 73 2c 20 72 65 74 76 61 6c 20 3d 20 ccess, retval =
14c10 25 6c 69 20 28 62 79 74 65 73 29 22 2c 20 28 6c %li (bytes)", (l
14c20 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 ong) retval);...
14c30 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a return(retval);.
14c40 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 }../*. * SYNPOSI
14c50 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a S. * .... *.
14c60 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 * ARGUMENTS. *
14c70 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 .... *. * RE
14c80 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 TURN VALUE. *
14c90 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 .... *. * NOTE
14ca0 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a S. * .... *.
14cb0 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 */.static cacke
14cc0 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 74 6f 6b y_ret cackey_tok
14cd0 65 6e 5f 70 72 65 73 65 6e 74 28 73 74 72 75 63 en_present(struc
14ce0 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 t cackey_slot *s
14cf0 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f 72 lot) {..cackey_r
14d00 65 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f et pcsc_connect_
14d10 72 65 74 3b 0a 09 44 57 4f 52 44 20 72 65 61 64 ret;..DWORD read
14d20 65 72 5f 6c 65 6e 20 3d 20 30 2c 20 73 74 61 74 er_len = 0, stat
14d30 65 20 3d 20 30 2c 20 70 72 6f 74 6f 63 6f 6c 20 e = 0, protocol
14d40 3d 20 30 2c 20 61 74 72 5f 6c 65 6e 3b 0a 09 42 = 0, atr_len;..B
14d50 59 54 45 20 61 74 72 5b 4d 41 58 5f 41 54 52 5f YTE atr[MAX_ATR_
14d60 53 49 5a 45 5d 3b 0a 09 4c 4f 4e 47 20 73 74 61 SIZE];..LONG sta
14d70 74 75 73 5f 72 65 74 2c 20 73 63 61 72 64 5f 72 tus_ret, scard_r
14d80 65 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 econn_ret;...CAC
14d90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
14da0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 ("Called.");...i
14db0 66 20 28 73 6c 6f 74 2d 3e 69 6e 74 65 72 6e 61 f (slot->interna
14dc0 6c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 l) {...CACKEY_DE
14dd0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
14de0 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 70 72 65 73 rning token pres
14df0 65 6e 74 20 28 69 6e 74 65 72 6e 61 6c 20 74 6f ent (internal to
14e00 6b 65 6e 29 22 29 3b 0a 0a 09 09 72 65 74 75 72 ken)");....retur
14e10 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f n(CACKEY_PCSC_S_
14e20 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 3b 0a 09 TOKENPRESENT);..
14e30 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 }...pcsc_connect
14e40 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f _ret = cackey_co
14e50 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 nnect_card(slot)
14e60 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e ;..if (pcsc_conn
14e70 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 ect_ret != CACKE
14e80 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 Y_PCSC_S_OK) {..
14e90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
14ea0 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 INTF("Unable to
14eb0 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c connect to card,
14ec0 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e returning token
14ed0 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09 72 65 absent");....re
14ee0 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 turn(CACKEY_PCSC
14ef0 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b _E_TOKENABSENT);
14f00 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 ..}...CACKEY_DEB
14f10 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 69 UG_PRINTF("Calli
14f20 6e 67 20 53 43 61 72 64 53 74 61 74 75 73 28 29 ng SCardStatus()
14f30 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 63 61 to determine ca
14f40 72 64 20 73 74 61 74 75 73 22 29 3b 0a 0a 09 61 rd status");...a
14f50 74 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 tr_len = sizeof(
14f60 61 74 72 29 3b 0a 09 73 74 61 74 75 73 5f 72 65 atr);..status_re
14f70 74 20 3d 20 53 43 61 72 64 53 74 61 74 75 73 28 t = SCardStatus(
14f80 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c slot->pcsc_card,
14f90 20 4e 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f 6c NULL, &reader_l
14fa0 65 6e 2c 20 26 73 74 61 74 65 2c 20 26 70 72 6f en, &state, &pro
14fb0 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74 72 tocol, atr, &atr
14fc0 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 73 74 61 _len);...if (sta
14fd0 74 75 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 tus_ret == SCARD
14fe0 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c _E_INVALID_HANDL
14ff0 45 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 E) {...CACKEY_DE
15000 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 BUG_PRINTF("SCar
15010 64 53 74 61 74 75 73 28 29 20 72 65 74 75 72 6e dStatus() return
15020 65 64 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c ed SCARD_E_INVAL
15030 49 44 5f 48 41 4e 44 4c 45 2c 20 6d 61 72 6b 69 ID_HANDLE, marki
15040 6e 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 ng is not alread
15050 79 20 63 6f 6e 6e 65 63 74 65 64 20 61 6e 64 20 y connected and
15060 74 72 79 69 6e 67 20 61 67 61 69 6e 22 29 3b 0a trying again");.
15070 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c ..cackey_mark_sl
15080 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a ot_reset(slot);.
15090 0a 09 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f ...pcsc_connect_
150a0 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e ret = cackey_con
150b0 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b nect_card(slot);
150c0 0a 09 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e ...if (pcsc_conn
150d0 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 ect_ret != CACKE
150e0 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 Y_PCSC_S_OK) {..
150f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
15100 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f RINTF("Unable to
15110 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 connect to card
15120 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 , returning toke
15130 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09 09 n absent");.....
15140 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 return(CACKEY_PC
15150 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 SC_E_TOKENABSENT
15160 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 );...}....CACKEY
15170 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 _DEBUG_PRINTF("C
15180 61 6c 6c 69 6e 67 20 53 43 61 72 64 53 74 61 74 alling SCardStat
15190 75 73 28 29 20 61 67 61 69 6e 22 29 3b 0a 0a 09 us() again");...
151a0 09 61 74 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f .atr_len = sizeo
151b0 66 28 61 74 72 29 3b 0a 09 09 73 74 61 74 75 73 f(atr);...status
151c0 5f 72 65 74 20 3d 20 53 43 61 72 64 53 74 61 74 _ret = SCardStat
151d0 75 73 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 us(slot->pcsc_ca
151e0 72 64 2c 20 4e 55 4c 4c 2c 20 26 72 65 61 64 65 rd, NULL, &reade
151f0 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65 2c 20 26 r_len, &state, &
15200 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26 protocol, atr, &
15210 61 74 72 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 69 atr_len);..}...i
15220 66 20 28 73 74 61 74 75 73 5f 72 65 74 20 21 3d f (status_ret !=
15230 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 SCARD_S_SUCCESS
15240 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72 ) {...cackey_mar
15250 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f k_slot_reset(slo
15260 74 29 3b 0a 0a 09 09 69 66 20 28 73 74 61 74 75 t);....if (statu
15270 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 57 s_ret == SCARD_W
15280 5f 52 45 53 45 54 5f 43 41 52 44 29 20 7b 0a 09 _RESET_CARD) {..
15290 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
152a0 52 49 4e 54 46 28 22 52 65 73 65 74 20 72 65 71 RINTF("Reset req
152b0 75 69 72 65 64 2c 20 70 6c 65 61 73 65 20 68 6f uired, please ho
152c0 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73 63 61 ld...");.....sca
152d0 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 20 rd_reconn_ret =
152e0 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74 cackey_reconnect
152f0 5f 63 61 72 64 28 73 6c 6f 74 2c 20 53 43 41 52 _card(slot, SCAR
15300 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 D_PROTOCOL_T0 |
15310 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 SCARD_PROTOCOL_T
15320 31 29 3b 0a 09 09 09 69 66 20 28 73 63 61 72 64 1);....if (scard
15330 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 _reconn_ret == S
15340 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 CARD_S_SUCCESS)
15350 7b 0a 09 09 09 09 2f 2a 20 52 65 2d 65 73 74 61 {...../* Re-esta
15360 62 6c 69 73 68 20 74 72 61 6e 73 61 63 74 69 6f blish transactio
15370 6e 2c 20 69 66 20 69 74 20 77 61 73 20 70 72 65 n, if it was pre
15380 73 65 6e 74 20 2a 2f 0a 09 09 09 09 69 66 20 28 sent */.....if (
15390 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f slot->transactio
153a0 6e 5f 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 n_depth > 0) {..
153b0 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 ....slot->transa
153c0 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 09 ction_depth--;..
153d0 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 ....slot->transa
153e0 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f ction_need_hw_lo
153f0 63 6b 20 3d 20 31 3b 0a 09 09 09 09 09 63 61 63 ck = 1;......cac
15400 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 key_begin_transa
15410 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09 09 ction(slot);....
15420 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 .}......CACKEY_D
15430 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 EBUG_PRINTF("Res
15440 65 74 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 et successful, r
15450 65 71 75 65 72 79 69 6e 67 22 29 3b 0a 09 09 09 equerying");....
15460 09 73 74 61 74 75 73 5f 72 65 74 20 3d 20 53 43 .status_ret = SC
15470 61 72 64 53 74 61 74 75 73 28 73 6c 6f 74 2d 3e ardStatus(slot->
15480 70 63 73 63 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c pcsc_card, NULL,
15490 20 26 72 65 61 64 65 72 5f 6c 65 6e 2c 20 26 73 &reader_len, &s
154a0 74 61 74 65 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c tate, &protocol,
154b0 20 61 74 72 2c 20 26 61 74 72 5f 6c 65 6e 29 3b atr, &atr_len);
154c0 0a 09 09 09 09 69 66 20 28 73 74 61 74 75 73 5f .....if (status_
154d0 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 ret != SCARD_S_S
154e0 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09 09 43 UCCESS) {......C
154f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
15500 54 46 28 22 53 74 69 6c 6c 20 75 6e 61 62 6c 65 TF("Still unable
15510 20 74 6f 20 71 75 65 72 79 20 63 61 72 64 20 73 to query card s
15520 74 61 74 75 73 2c 20 72 65 74 75 72 6e 69 6e 67 tatus, returning
15530 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 token absent.
15540 53 43 61 72 64 53 74 61 74 75 73 28 29 20 3d 20 SCardStatus() =
15550 25 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 %s", CACKEY_DEBU
15560 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f G_FUNC_SCARDERR_
15570 54 4f 5f 53 54 52 28 73 74 61 74 75 73 5f 72 65 TO_STR(status_re
15580 74 29 29 3b 0a 0a 09 09 09 09 09 72 65 74 75 72 t));.......retur
15590 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f n(CACKEY_PCSC_E_
155a0 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 TOKENABSENT);...
155b0 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a ..}....} else {.
155c0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
155d0 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 _PRINTF("Unable
155e0 74 6f 20 72 65 63 6f 6e 6e 65 63 74 20 74 6f 20 to reconnect to
155f0 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 card, returning
15600 74 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 53 token absent. S
15610 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 20 CardReconnect()
15620 3d 20 25 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 = %s", CACKEY_DE
15630 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 BUG_FUNC_SCARDER
15640 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 72 R_TO_STR(scard_r
15650 65 63 6f 6e 6e 5f 72 65 74 29 29 3b 0a 0a 09 09 econn_ret));....
15660 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f ..return(CACKEY_
15670 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 PCSC_E_TOKENABSE
15680 4e 54 29 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c NT);....}...} el
15690 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 se {....CACKEY_D
156a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 EBUG_PRINTF("Una
156b0 62 6c 65 20 74 6f 20 71 75 65 72 79 20 63 61 72 ble to query car
156c0 64 20 73 74 61 74 75 73 2c 20 72 65 74 75 72 6e d status, return
156d0 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 ing token absent
156e0 2e 20 20 53 43 61 72 64 53 74 61 74 75 73 28 29 . SCardStatus()
156f0 20 3d 20 25 73 22 2c 20 43 41 43 4b 45 59 5f 44 = %s", CACKEY_D
15700 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 EBUG_FUNC_SCARDE
15710 52 52 5f 54 4f 5f 53 54 52 28 73 74 61 74 75 73 RR_TO_STR(status
15720 5f 72 65 74 29 29 3b 0a 0a 09 09 09 72 65 74 75 _ret));.....retu
15730 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 rn(CACKEY_PCSC_E
15740 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 _TOKENABSENT);..
15750 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 28 73 74 61 .}..}...if ((sta
15760 74 65 20 26 20 53 43 41 52 44 5f 41 42 53 45 4e te & SCARD_ABSEN
15770 54 29 20 3d 3d 20 53 43 41 52 44 5f 41 42 53 45 T) == SCARD_ABSE
15780 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 NT) {...CACKEY_D
15790 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 72 EBUG_PRINTF("Car
157a0 64 20 69 73 20 61 62 73 65 6e 74 2c 20 72 65 74 d is absent, ret
157b0 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 urning token abs
157c0 65 6e 74 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ent");....return
157d0 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 (CACKEY_PCSC_E_T
157e0 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 7d 0a OKENABSENT);..}.
157f0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
15800 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
15810 20 74 6f 6b 65 6e 20 70 72 65 73 65 6e 74 2e 22 token present."
15820 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b );...return(CACK
15830 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 EY_PCSC_S_TOKENP
15840 52 45 53 45 4e 54 29 3b 0a 7d 0a 0a 2f 2a 0a 20 RESENT);.}../*.
15850 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 * SYNPOSIS. *
15860 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 .... *. * ARGU
15870 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e MENTS. * ...
15880 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 . *. * RETURN VA
15890 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 LUE. * ....
158a0 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 *. * NOTES. *
158b0 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 .... *. */.sta
158c0 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 tic cackey_ret c
158d0 61 63 6b 65 79 5f 73 65 74 5f 70 69 6e 28 73 74 ackey_set_pin(st
158e0 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 ruct cackey_slot
158f0 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 *slot, unsigned
15900 20 63 68 61 72 20 2a 6f 6c 64 5f 70 69 6e 2c 20 char *old_pin,
15910 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6f 6c unsigned long ol
15920 64 5f 70 69 6e 5f 6c 65 6e 2c 20 75 6e 73 69 67 d_pin_len, unsig
15930 6e 65 64 20 63 68 61 72 20 2a 70 69 6e 2c 20 75 ned char *pin, u
15940 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 70 69 6e nsigned long pin
15950 5f 6c 65 6e 29 20 7b 0a 09 73 74 72 75 63 74 20 _len) {..struct
15960 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e cackey_pcsc_iden
15970 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e 74 tity *pcsc_ident
15980 69 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 ities;..unsigned
15990 20 63 68 61 72 20 63 61 63 5f 70 69 6e 5b 38 5d char cac_pin[8]
159a0 20 3d 20 7b 30 78 46 46 2c 20 30 78 46 46 2c 20 = {0xFF, 0xFF,
159b0 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 0xFF, 0xFF, 0xFF
159c0 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 , 0xFF, 0xFF, 0x
159d0 46 46 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 FF};..unsigned c
159e0 68 61 72 20 6f 6c 64 5f 63 61 63 5f 70 69 6e 5b har old_cac_pin[
159f0 38 5d 20 3d 20 7b 30 78 46 46 2c 20 30 78 46 46 8] = {0xFF, 0xFF
15a00 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 , 0xFF, 0xFF, 0x
15a10 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 FF, 0xFF, 0xFF,
15a20 30 78 46 46 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 0xFF};..unsigned
15a30 20 63 68 61 72 20 70 69 6e 5f 75 70 64 61 74 65 char pin_update
15a40 5b 73 69 7a 65 6f 66 28 63 61 63 5f 70 69 6e 29 [sizeof(cac_pin)
15a50 20 2b 20 73 69 7a 65 6f 66 28 6f 6c 64 5f 63 61 + sizeof(old_ca
15a60 63 5f 70 69 6e 29 5d 3b 0a 09 75 6e 73 69 67 6e c_pin)];..unsign
15a70 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 ed long num_cert
15a80 73 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73 s;..uint16_t res
15a90 70 6f 6e 73 65 5f 63 6f 64 65 3b 0a 09 69 6e 74 ponse_code;..int
15aa0 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 tries_remaining
15ab0 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b ;..int send_ret;
15ac0 0a 09 69 6e 74 20 6b 65 79 5f 72 65 66 65 72 65 ..int key_refere
15ad0 6e 63 65 20 3d 20 30 78 30 30 3b 0a 0a 09 2f 2a nce = 0x00;.../*
15ae0 20 41 70 70 61 72 65 6e 74 6c 79 2c 20 43 41 43 Apparently, CAC
15af0 20 50 49 4e 73 20 61 72 65 20 2a 45 58 41 43 54 PINs are *EXACT
15b00 4c 59 2a 20 38 20 62 79 74 65 73 20 6c 6f 6e 67 LY* 8 bytes long
15b10 20 2d 2d 20 70 61 64 20 77 69 74 68 20 30 78 46 -- pad with 0xF
15b20 46 20 69 66 20 74 6f 6f 20 73 68 6f 72 74 20 2a F if too short *
15b30 2f 0a 09 69 66 20 28 70 69 6e 5f 6c 65 6e 20 3e /..if (pin_len >
15b40 3d 20 38 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28 = 8) {...memcpy(
15b50 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 38 29 cac_pin, pin, 8)
15b60 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d 65 ;..} else {...me
15b70 6d 63 70 79 28 63 61 63 5f 70 69 6e 2c 20 70 69 mcpy(cac_pin, pi
15b80 6e 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a 09 7d 0a n, pin_len);..}.
15b90 0a 09 69 66 20 28 6f 6c 64 5f 70 69 6e 5f 6c 65 ..if (old_pin_le
15ba0 6e 20 3e 3d 20 38 29 20 7b 0a 09 09 6d 65 6d 63 n >= 8) {...memc
15bb0 70 79 28 6f 6c 64 5f 63 61 63 5f 70 69 6e 2c 20 py(old_cac_pin,
15bc0 6f 6c 64 5f 70 69 6e 2c 20 38 29 3b 0a 09 7d 20 old_pin, 8);..}
15bd0 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 63 70 79 28 else {...memcpy(
15be0 6f 6c 64 5f 63 61 63 5f 70 69 6e 2c 20 6f 6c 64 old_cac_pin, old
15bf0 5f 70 69 6e 2c 20 6f 6c 64 5f 70 69 6e 5f 6c 65 _pin, old_pin_le
15c00 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6f 6e 63 n);..}.../* Conc
15c10 61 74 65 6e 61 74 65 20 62 6f 74 68 20 50 49 4e atenate both PIN
15c20 73 20 74 6f 67 65 74 68 65 72 20 74 6f 20 73 65 s together to se
15c30 6e 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69 nd as a single i
15c40 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 09 6d nstruction */..m
15c50 65 6d 63 70 79 28 70 69 6e 5f 75 70 64 61 74 65 emcpy(pin_update
15c60 2c 20 6f 6c 64 5f 63 61 63 5f 70 69 6e 2c 20 73 , old_cac_pin, s
15c70 69 7a 65 6f 66 28 6f 6c 64 5f 63 61 63 5f 70 69 izeof(old_cac_pi
15c80 6e 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 69 6e n));..memcpy(pin
15c90 5f 75 70 64 61 74 65 20 2b 20 73 69 7a 65 6f 66 _update + sizeof
15ca0 28 6f 6c 64 5f 63 61 63 5f 70 69 6e 29 2c 20 63 (old_cac_pin), c
15cb0 61 63 5f 70 69 6e 2c 20 73 69 7a 65 6f 66 28 63 ac_pin, sizeof(c
15cc0 61 63 5f 70 69 6e 29 29 3b 0a 0a 09 2f 2a 20 52 ac_pin));.../* R
15cd0 65 6a 65 63 74 20 50 49 4e 73 20 77 68 69 63 68 eject PINs which
15ce0 20 61 72 65 20 74 6f 6f 20 73 68 6f 72 74 20 2a are too short *
15cf0 2f 0a 09 69 66 20 28 70 69 6e 5f 6c 65 6e 20 3c /..if (pin_len <
15d00 20 35 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 5) {...CACKEY_D
15d10 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 6a EBUG_PRINTF("Rej
15d20 65 63 74 69 6e 67 20 4e 65 77 20 50 49 4e 20 77 ecting New PIN w
15d30 68 69 63 68 20 69 73 20 74 6f 6f 20 73 68 6f 72 hich is too shor
15d40 74 20 28 6c 65 6e 67 74 68 20 3d 20 25 6c 75 2c t (length = %lu,
15d50 20 6d 75 73 74 20 62 65 20 61 74 6c 65 61 73 74 must be atleast
15d60 20 35 29 22 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a 5)", pin_len);.
15d70 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 ...return(CACKEY
15d80 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b _PCSC_E_BADPIN);
15d90 0a 09 7d 0a 0a 09 69 66 20 28 6f 6c 64 5f 70 69 ..}...if (old_pi
15da0 6e 5f 6c 65 6e 20 3c 20 35 29 20 7b 0a 09 09 43 n_len < 5) {...C
15db0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
15dc0 54 46 28 22 52 65 6a 65 63 74 69 6e 67 20 4f 6c TF("Rejecting Ol
15dd0 64 20 50 49 4e 20 77 68 69 63 68 20 69 73 20 74 d PIN which is t
15de0 6f 6f 20 73 68 6f 72 74 20 28 6c 65 6e 67 74 68 oo short (length
15df0 20 3d 20 25 6c 75 2c 20 6d 75 73 74 20 62 65 20 = %lu, must be
15e00 61 74 6c 65 61 73 74 20 35 29 22 2c 20 6f 6c 64 atleast 5)", old
15e10 5f 70 69 6e 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65 _pin_len);....re
15e20 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 turn(CACKEY_PCSC
15e30 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09 7d 0a 0a _E_BADPIN);..}..
15e40 09 2f 2a 20 50 49 56 20 61 75 74 68 65 6e 74 69 ./* PIV authenti
15e50 63 61 74 69 6f 6e 20 75 73 65 73 20 61 20 22 6b cation uses a "k
15e60 65 79 5f 72 65 66 65 72 65 6e 63 65 22 20 6f 66 ey_reference" of
15e70 20 30 78 38 30 20 2a 2f 0a 09 70 63 73 63 5f 69 0x80 */..pcsc_i
15e80 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b dentities = cack
15e90 65 79 5f 72 65 61 64 5f 63 65 72 74 73 28 73 6c ey_read_certs(sl
15ea0 6f 74 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63 ot, NULL, &num_c
15eb0 65 72 74 73 29 3b 0a 09 69 66 20 28 6e 75 6d 5f erts);..if (num_
15ec0 63 65 72 74 73 20 3e 20 30 20 26 26 20 70 63 73 certs > 0 && pcs
15ed0 63 5f 69 64 65 6e 74 69 74 69 65 73 20 21 3d 20 c_identities !=
15ee0 4e 55 4c 4c 29 20 7b 0a 09 09 73 77 69 74 63 68 NULL) {...switch
15ef0 20 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 (pcsc_identitie
15f00 73 5b 30 5d 2e 69 64 5f 74 79 70 65 29 20 7b 0a s[0].id_type) {.
15f10 09 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 ...case CACKEY_I
15f20 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09 09 09 D_TYPE_PIV:.....
15f30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
15f40 4e 54 46 28 22 57 65 20 68 61 76 65 20 50 49 56 NTF("We have PIV
15f50 20 63 61 72 64 2c 20 73 6f 20 77 65 20 77 69 6c card, so we wil
15f60 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 75 74 l attempt to aut
15f70 68 65 6e 74 69 63 61 74 65 20 75 73 69 6e 67 20 henticate using
15f80 74 68 65 20 50 49 56 20 41 70 70 6c 69 63 61 74 the PIV Applicat
15f90 69 6f 6e 20 6b 65 79 20 72 65 66 65 72 65 6e 63 ion key referenc
15fa0 65 22 29 3b 0a 0a 09 09 09 09 6b 65 79 5f 72 65 e");......key_re
15fb0 66 65 72 65 6e 63 65 20 3d 20 30 78 38 30 3b 0a ference = 0x80;.
15fc0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 64 65 ....break;....de
15fd0 66 61 75 6c 74 3a 0a 09 09 09 09 62 72 65 61 6b fault:.....break
15fe0 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f ;...}....cackey_
15ff0 66 72 65 65 5f 63 65 72 74 73 28 70 63 73 63 5f free_certs(pcsc_
16000 69 64 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f identities, num_
16010 63 65 72 74 73 2c 20 31 29 3b 0a 09 7d 0a 0a 09 certs, 1);..}...
16020 2f 2a 20 49 73 73 75 65 20 61 20 53 65 74 20 50 /* Issue a Set P
16030 49 4e 20 28 43 48 41 4e 47 45 20 52 45 46 45 52 IN (CHANGE REFER
16040 45 4e 43 45 29 20 2a 2f 0a 09 73 65 6e 64 5f 72 ENCE) */..send_r
16050 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 et = cackey_send
16060 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 _apdu(slot, GSCI
16070 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c S_CLASS_ISO7816,
16080 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 43 48 41 GSCIS_INSTR_CHA
16090 4e 47 45 5f 52 45 46 45 52 45 4e 43 45 2c 20 30 NGE_REFERENCE, 0
160a0 78 30 30 2c 20 6b 65 79 5f 72 65 66 65 72 65 6e x00, key_referen
160b0 63 65 2c 20 73 69 7a 65 6f 66 28 70 69 6e 5f 75 ce, sizeof(pin_u
160c0 70 64 61 74 65 29 2c 20 70 69 6e 5f 75 70 64 61 pdate), pin_upda
160d0 74 65 2c 20 30 78 30 30 2c 20 26 72 65 73 70 6f te, 0x00, &respo
160e0 6e 73 65 5f 63 6f 64 65 2c 20 4e 55 4c 4c 2c 20 nse_code, NULL,
160f0 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 73 65 6e NULL);...if (sen
16100 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f d_ret != CACKEY_
16110 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 69 PCSC_S_OK) {...i
16120 66 20 28 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 f ((response_cod
16130 65 20 26 20 30 78 36 33 43 30 29 20 3d 3d 20 30 e & 0x63C0) == 0
16140 78 36 33 43 30 29 20 7b 0a 09 09 09 74 72 69 65 x63C0) {....trie
16150 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 20 28 72 s_remaining = (r
16160 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 26 20 30 esponse_code & 0
16170 78 46 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f xF);.....CACKEY_
16180 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49 DEBUG_PRINTF("PI
16190 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20 66 N Verification f
161a0 61 69 6c 65 64 2c 20 25 69 20 74 72 69 65 73 20 ailed, %i tries
161b0 72 65 6d 61 69 6e 69 6e 67 22 2c 20 74 72 69 65 remaining", trie
161c0 73 5f 72 65 6d 61 69 6e 69 6e 67 29 3b 0a 0a 09 s_remaining);...
161d0 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f ..return(CACKEY_
161e0 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a PCSC_E_BADPIN);.
161f0 09 09 7d 0a 0a 09 09 69 66 20 28 72 65 73 70 6f ..}....if (respo
16200 6e 73 65 5f 63 6f 64 65 20 3d 3d 20 30 78 36 39 nse_code == 0x69
16210 38 33 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 83) {....CACKEY_
16220 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e DEBUG_PRINTF("Un
16230 61 62 6c 65 20 74 6f 20 73 65 74 20 50 49 4e 2c able to set PIN,
16240 20 64 65 76 69 63 65 20 69 73 20 6c 6f 63 6b 65 device is locke
16250 64 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 74 68 d or changing th
16260 65 20 50 49 4e 20 69 73 20 64 69 73 61 62 6c 65 e PIN is disable
16270 64 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 d");.....return(
16280 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f CACKEY_PCSC_E_LO
16290 43 4b 45 44 29 3b 0a 09 09 7d 0a 0a 09 09 72 65 CKED);...}....re
162a0 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 turn(CACKEY_PCSC
162b0 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a _E_GENERIC);..}.
162c0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
162d0 52 49 4e 54 46 28 22 50 49 4e 20 43 68 61 6e 67 RINTF("PIN Chang
162e0 65 20 73 75 63 63 65 65 64 65 64 22 29 3b 0a 0a e succeeded");..
162f0 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 .return(CACKEY_P
16300 43 53 43 5f 53 5f 4f 4b 29 3b 0a 0a 09 2f 2a 20 CSC_S_OK);.../*
16310 44 69 73 61 62 6c 65 20 61 20 77 61 72 6e 69 6e Disable a warnin
16320 67 2c 20 73 69 6e 63 65 20 74 68 69 73 20 69 73 g, since this is
16330 20 6f 6e 6c 79 20 75 73 65 64 20 69 6e 20 64 65 only used in de
16340 62 75 67 20 6d 6f 64 65 20 2a 2f 0a 09 74 72 69 bug mode */..tri
16350 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 20 74 es_remaining = t
16360 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a ries_remaining;.
16370 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 }../*. * SYNPOSI
16380 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a S. * .... *.
16390 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 * ARGUMENTS. *
163a0 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 .... *. * RE
163b0 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 TURN VALUE. *
163c0 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 .... *. * NOTE
163d0 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a S. * .... *.
163e0 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 */.static cacke
163f0 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 6c 6f 67 y_ret cackey_log
16400 69 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 in(struct cackey
16410 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 _slot *slot, uns
16420 69 67 6e 65 64 20 63 68 61 72 20 2a 70 69 6e 2c igned char *pin,
16430 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 70 unsigned long p
16440 69 6e 5f 6c 65 6e 2c 20 69 6e 74 20 2a 74 72 69 in_len, int *tri
16450 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 2c 20 es_remaining_p,
16460 69 6e 74 20 72 65 74 72 69 65 73 29 20 7b 0a 09 int retries) {..
16470 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 struct cackey_pc
16480 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73 sc_identity *pcs
16490 63 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 c_identities;..u
164a0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 61 63 nsigned char cac
164b0 5f 70 69 6e 5b 38 5d 20 3d 20 7b 30 78 46 46 2c _pin[8] = {0xFF,
164c0 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 0xFF, 0xFF, 0xF
164d0 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 F, 0xFF, 0xFF, 0
164e0 78 46 46 2c 20 30 78 46 46 7d 3b 0a 09 75 6e 73 xFF, 0xFF};..uns
164f0 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 igned long num_c
16500 65 72 74 73 3b 0a 09 75 69 6e 74 31 36 5f 74 20 erts;..uint16_t
16510 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 3b 0a 09 response_code;..
16520 69 6e 74 20 74 72 69 65 73 5f 72 65 6d 61 69 6e int tries_remain
16530 69 6e 67 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 ing;..int send_r
16540 65 74 3b 0a 09 69 6e 74 20 6b 65 79 5f 72 65 66 et;..int key_ref
16550 65 72 65 6e 63 65 20 3d 20 30 78 30 30 2c 20 68 erence = 0x00, h
16560 61 76 65 5f 70 69 76 20 3d 20 30 3b 0a 09 63 61 ave_piv = 0;..ca
16570 63 6b 65 79 5f 72 65 74 20 63 6f 6e 6e 65 63 74 ckey_ret connect
16580 5f 72 65 74 2c 20 74 6f 6b 65 6e 5f 72 65 74 3b _ret, token_ret;
16590 0a 0a 09 2f 2a 20 49 6e 64 69 63 61 74 65 20 74 .../* Indicate t
165a0 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e hat we do not kn
165b0 6f 77 20 61 62 6f 75 74 20 68 6f 77 20 6d 61 6e ow about how man
165c0 79 20 74 72 69 65 73 20 61 72 65 20 72 65 6d 61 y tries are rema
165d0 69 6e 69 6e 67 20 2a 2f 0a 09 69 66 20 28 74 72 ining */..if (tr
165e0 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29 ies_remaining_p)
165f0 20 7b 0a 09 09 2a 74 72 69 65 73 5f 72 65 6d 61 {...*tries_rema
16600 69 6e 69 6e 67 5f 70 20 3d 20 2d 31 3b 0a 09 7d ining_p = -1;..}
16610 0a 0a 09 2f 2a 20 41 70 70 61 72 65 6e 74 6c 79 .../* Apparently
16620 2c 20 43 41 43 20 50 49 4e 73 20 61 72 65 20 2a , CAC PINs are *
16630 45 58 41 43 54 4c 59 2a 20 38 20 62 79 74 65 73 EXACTLY* 8 bytes
16640 20 6c 6f 6e 67 20 2d 2d 20 70 61 64 20 77 69 74 long -- pad wit
16650 68 20 30 78 46 46 20 69 66 20 74 6f 6f 20 73 68 h 0xFF if too sh
16660 6f 72 74 20 2a 2f 0a 09 69 66 20 28 70 69 6e 5f ort */..if (pin_
16670 6c 65 6e 20 3e 3d 20 38 29 20 7b 0a 09 09 6d 65 len >= 8) {...me
16680 6d 63 70 79 28 63 61 63 5f 70 69 6e 2c 20 70 69 mcpy(cac_pin, pi
16690 6e 2c 20 38 29 3b 0a 09 7d 20 65 6c 73 65 20 7b n, 8);..} else {
166a0 0a 09 09 6d 65 6d 63 70 79 28 63 61 63 5f 70 69 ...memcpy(cac_pi
166b0 6e 2c 20 70 69 6e 2c 20 70 69 6e 5f 6c 65 6e 29 n, pin, pin_len)
166c0 3b 0a 09 7d 0a 0a 09 2f 2a 20 52 65 6a 65 63 74 ;..}.../* Reject
166d0 20 50 49 4e 73 20 77 68 69 63 68 20 61 72 65 20 PINs which are
166e0 74 6f 6f 20 73 68 6f 72 74 20 2a 2f 0a 09 69 66 too short */..if
166f0 20 28 70 69 6e 5f 6c 65 6e 20 3c 20 35 29 20 7b (pin_len < 5) {
16700 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
16710 50 52 49 4e 54 46 28 22 52 65 6a 65 63 74 69 6e PRINTF("Rejectin
16720 67 20 50 49 4e 20 77 68 69 63 68 20 69 73 20 74 g PIN which is t
16730 6f 6f 20 73 68 6f 72 74 20 28 6c 65 6e 67 74 68 oo short (length
16740 20 3d 20 25 6c 75 2c 20 6d 75 73 74 20 62 65 20 = %lu, must be
16750 61 74 6c 65 61 73 74 20 35 29 22 2c 20 70 69 6e atleast 5)", pin
16760 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e _len);....return
16770 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 (CACKEY_PCSC_E_B
16780 41 44 50 49 4e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 ADPIN);..}.../*
16790 50 49 56 20 61 75 74 68 65 6e 74 69 63 61 74 69 PIV authenticati
167a0 6f 6e 20 75 73 65 73 20 61 20 22 6b 65 79 5f 72 on uses a "key_r
167b0 65 66 65 72 65 6e 63 65 22 20 6f 66 20 30 78 38 eference" of 0x8
167c0 30 20 2a 2f 0a 09 70 63 73 63 5f 69 64 65 6e 74 0 */..pcsc_ident
167d0 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 ities = cackey_r
167e0 65 61 64 5f 63 65 72 74 73 28 73 6c 6f 74 2c 20 ead_certs(slot,
167f0 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73 NULL, &num_certs
16800 29 3b 0a 09 69 66 20 28 6e 75 6d 5f 63 65 72 74 );..if (num_cert
16810 73 20 3e 20 30 20 26 26 20 70 63 73 63 5f 69 64 s > 0 && pcsc_id
16820 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c entities != NULL
16830 29 20 7b 0a 09 09 73 77 69 74 63 68 20 28 70 63 ) {...switch (pc
16840 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 30 5d sc_identities[0]
16850 2e 69 64 5f 74 79 70 65 29 20 7b 0a 09 09 09 63 .id_type) {....c
16860 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 ase CACKEY_ID_TY
16870 50 45 5f 50 49 56 3a 0a 09 09 09 09 43 41 43 4b PE_PIV:.....CACK
16880 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
16890 22 57 65 20 68 61 76 65 20 50 49 56 20 63 61 72 "We have PIV car
168a0 64 2c 20 73 6f 20 77 65 20 77 69 6c 6c 20 61 74 d, so we will at
168b0 74 65 6d 70 74 20 74 6f 20 61 75 74 68 65 6e 74 tempt to authent
168c0 69 63 61 74 65 20 75 73 69 6e 67 20 74 68 65 20 icate using the
168d0 50 49 56 20 41 70 70 6c 69 63 61 74 69 6f 6e 20 PIV Application
168e0 6b 65 79 20 72 65 66 65 72 65 6e 63 65 22 29 3b key reference");
168f0 0a 0a 09 09 09 09 68 61 76 65 5f 70 69 76 20 3d ......have_piv =
16900 20 31 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 1;.....break;..
16910 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 09 62 ..default:.....b
16920 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 reak;...}....cac
16930 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 70 key_free_certs(p
16940 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 csc_identities,
16950 6e 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b 0a 09 num_certs, 1);..
16960 7d 0a 0a 09 69 66 20 28 68 61 76 65 5f 70 69 76 }...if (have_piv
16970 20 3d 3d 20 31 29 20 7b 0a 09 09 6b 65 79 5f 72 == 1) {...key_r
16980 65 66 65 72 65 6e 63 65 20 3d 20 30 78 38 30 3b eference = 0x80;
16990 0a 09 7d 0a 0a 09 2f 2a 20 49 73 73 75 65 20 50 ..}.../* Issue P
169a0 49 4e 20 56 65 72 69 66 79 20 2a 2f 0a 09 73 65 IN Verify */..se
169b0 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f nd_ret = cackey_
169c0 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 send_apdu(slot,
169d0 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 GSCIS_CLASS_ISO7
169e0 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 816, GSCIS_INSTR
169f0 5f 56 45 52 49 46 59 2c 20 30 78 30 30 2c 20 6b _VERIFY, 0x00, k
16a00 65 79 5f 72 65 66 65 72 65 6e 63 65 2c 20 73 69 ey_reference, si
16a10 7a 65 6f 66 28 63 61 63 5f 70 69 6e 29 2c 20 63 zeof(cac_pin), c
16a20 61 63 5f 70 69 6e 2c 20 30 78 30 30 2c 20 26 72 ac_pin, 0x00, &r
16a30 65 73 70 6f 6e 73 65 5f 63 6f 64 65 2c 20 4e 55 esponse_code, NU
16a40 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 LL, NULL);...if
16a50 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 (send_ret != CAC
16a60 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b KEY_PCSC_S_OK) {
16a70 0a 09 09 69 66 20 28 28 72 65 73 70 6f 6e 73 65 ...if ((response
16a80 5f 63 6f 64 65 20 26 20 30 78 36 33 43 30 29 20 _code & 0x63C0)
16a90 3d 3d 20 30 78 36 33 43 30 29 20 7b 0a 09 09 09 == 0x63C0) {....
16aa0 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20 tries_remaining
16ab0 3d 20 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 = (response_code
16ac0 20 26 20 30 78 46 29 3b 0a 0a 09 09 09 43 41 43 & 0xF);.....CAC
16ad0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
16ae0 28 22 50 49 4e 20 56 65 72 69 66 69 63 61 74 69 ("PIN Verificati
16af0 6f 6e 20 66 61 69 6c 65 64 2c 20 25 69 20 74 72 on failed, %i tr
16b00 69 65 73 20 72 65 6d 61 69 6e 69 6e 67 22 2c 20 ies remaining",
16b10 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 29 tries_remaining)
16b20 3b 0a 0a 09 09 09 69 66 20 28 74 72 69 65 73 5f ;.....if (tries_
16b30 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 remaining_p) {..
16b40 09 09 09 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e ...*tries_remain
16b50 69 6e 67 5f 70 20 3d 20 74 72 69 65 73 5f 72 65 ing_p = tries_re
16b60 6d 61 69 6e 69 6e 67 3b 0a 09 09 09 7d 0a 0a 09 maining;....}...
16b70 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f ..return(CACKEY_
16b80 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a PCSC_E_BADPIN);.
16b90 09 09 7d 0a 0a 09 09 69 66 20 28 72 65 73 70 6f ..}....if (respo
16ba0 6e 73 65 5f 63 6f 64 65 20 3d 3d 20 30 78 36 39 nse_code == 0x69
16bb0 38 33 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 83) {....CACKEY_
16bc0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49 DEBUG_PRINTF("PI
16bd0 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20 66 N Verification f
16be0 61 69 6c 65 64 2c 20 64 65 76 69 63 65 20 69 73 ailed, device is
16bf0 20 6c 6f 63 6b 65 64 22 29 3b 0a 0a 09 09 09 72 locked");.....r
16c00 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 eturn(CACKEY_PCS
16c10 43 5f 45 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d C_E_LOCKED);...}
16c20 0a 0a 09 09 69 66 20 28 72 65 73 70 6f 6e 73 65 ....if (response
16c30 5f 63 6f 64 65 20 3d 3d 20 30 78 36 64 30 30 29 _code == 0x6d00)
16c40 20 7b 0a 09 09 09 69 66 20 28 72 65 74 72 69 65 {....if (retrie
16c50 73 20 3e 20 30 29 20 7b 0a 09 09 09 09 43 41 43 s > 0) {.....CAC
16c60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
16c70 28 22 47 6f 74 20 49 53 4f 20 37 38 31 36 20 52 ("Got ISO 7816 R
16c80 65 73 70 6f 6e 73 65 20 5c 22 36 44 20 30 30 5c esponse \"6D 00\
16c90 22 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f " in response to
16ca0 20 61 20 56 45 52 49 46 59 20 72 65 71 75 65 73 a VERIFY reques
16cb0 74 2e 22 29 3b 0a 09 09 09 09 43 41 43 4b 45 59 t.");.....CACKEY
16cc0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 57 _DEBUG_PRINTF("W
16cd0 65 20 64 69 64 20 6e 6f 74 20 65 78 70 65 63 74 e did not expect
16ce0 20 74 68 69 73 20 62 65 63 61 75 73 65 20 69 74 this because it
16cf0 20 69 73 20 6e 6f 74 20 6d 65 6e 74 69 6f 6e 65 is not mentione
16d00 64 20 69 6e 20 4e 49 53 54 20 53 50 20 38 30 30 d in NIST SP 800
16d10 2d 37 33 2d 33 20 50 61 72 74 20 32 20 53 65 63 -73-3 Part 2 Sec
16d20 74 69 6f 6e 20 33 2e 32 2e 31 20 6f 72 20 47 53 tion 3.2.1 or GS
16d30 43 2d 49 53 20 76 32 2e 31 22 29 3b 0a 09 09 09 C-IS v2.1");....
16d40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
16d50 49 4e 54 46 28 22 57 65 20 61 72 65 20 67 6f 69 INTF("We are goi
16d60 6e 67 20 74 6f 20 74 72 79 20 74 6f 20 72 65 73 ng to try to res
16d70 65 74 20 74 68 65 20 63 61 72 64 20 61 6e 64 20 et the card and
16d80 73 65 6c 65 63 74 20 74 68 65 20 61 70 70 6c 65 select the apple
16d90 74 20 61 67 61 69 6e 2e 22 29 3b 0a 0a 09 09 09 t again.");.....
16da0 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f .cackey_mark_slo
16db0 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a t_reset(slot);..
16dc0 09 09 09 09 63 6f 6e 6e 65 63 74 5f 72 65 74 20 ....connect_ret
16dd0 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 = cackey_connect
16de0 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 09 09 _card(slot);....
16df0 09 69 66 20 28 63 6f 6e 6e 65 63 74 5f 72 65 74 .if (connect_ret
16e00 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f != CACKEY_PCSC_
16e10 53 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 43 41 43 S_OK) {......CAC
16e20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
16e30 28 22 55 6e 61 62 6c 65 20 74 6f 20 72 65 63 6f ("Unable to reco
16e40 6e 6e 65 63 74 20 61 66 74 65 72 20 72 65 73 65 nnect after rese
16e50 74 74 69 6e 67 20 74 68 65 20 63 61 72 64 2c 20 tting the card,
16e60 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 returning in err
16e70 6f 72 2e 22 29 3b 0a 0a 09 09 09 09 09 72 65 74 or.");.......ret
16e80 75 72 6e 28 63 6f 6e 6e 65 63 74 5f 72 65 74 29 urn(connect_ret)
16e90 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 ;.....}......CAC
16ea0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
16eb0 28 22 56 65 72 69 66 79 69 6e 67 20 77 65 20 73 ("Verifying we s
16ec0 74 69 6c 6c 20 68 61 76 65 20 61 20 74 6f 6b 65 till have a toke
16ed0 6e 2e 22 29 3b 0a 09 09 09 09 74 6f 6b 65 6e 5f n.");.....token_
16ee0 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 74 6f 6b ret = cackey_tok
16ef0 65 6e 5f 70 72 65 73 65 6e 74 28 73 6c 6f 74 29 en_present(slot)
16f00 3b 0a 09 09 09 09 69 66 20 28 74 6f 6b 65 6e 5f ;.....if (token_
16f10 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 ret != CACKEY_PC
16f20 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e SC_S_TOKENPRESEN
16f30 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 T) {......CACKEY
16f40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 _DEBUG_PRINTF("T
16f50 6f 6b 65 6e 20 6e 6f 74 20 70 72 65 73 65 6e 74 oken not present
16f60 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 , returning in e
16f70 72 72 6f 72 2e 22 29 3b 0a 0a 09 09 09 09 09 72 rror.");.......r
16f80 65 74 75 72 6e 28 74 6f 6b 65 6e 5f 72 65 74 29 eturn(token_ret)
16f90 3b 0a 09 09 09 09 7d 0a 0a 0a 09 09 09 09 43 41 ;.....}.......CA
16fa0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
16fb0 46 28 22 54 72 79 69 6e 67 20 74 6f 20 6c 6f 67 F("Trying to log
16fc0 69 6e 20 61 67 61 69 6e 22 29 3b 0a 09 09 09 09 in again");.....
16fd0 72 65 74 75 72 6e 28 63 61 63 6b 65 79 5f 6c 6f return(cackey_lo
16fe0 67 69 6e 28 73 6c 6f 74 2c 20 70 69 6e 2c 20 70 gin(slot, pin, p
16ff0 69 6e 5f 6c 65 6e 2c 20 74 72 69 65 73 5f 72 65 in_len, tries_re
17000 6d 61 69 6e 69 6e 67 5f 70 2c 20 72 65 74 72 69 maining_p, retri
17010 65 73 20 2d 20 31 29 29 3b 0a 09 09 09 7d 0a 09 es - 1));....}..
17020 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 .}....return(CAC
17030 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 KEY_PCSC_E_GENER
17040 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 IC);..}...CACKEY
17050 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 _DEBUG_PRINTF("P
17060 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20 IN Verification
17070 73 75 63 63 65 65 64 65 64 22 29 3b 0a 0a 09 72 succeeded");...r
17080 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 eturn(CACKEY_PCS
17090 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 C_S_OK);.}../*.
170a0 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 * SYNPOSIS. *
170b0 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 .... *. * ARGU
170c0 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e MENTS. * ...
170d0 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 . *. * RETURN VA
170e0 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 LUE. * ....
170f0 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 *. * NOTES. *
17100 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 .... *. */.sta
17110 74 69 63 20 73 73 69 7a 65 5f 74 20 63 61 63 6b tic ssize_t cack
17120 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 ey_pcsc_identity
17130 5f 74 6f 5f 6c 61 62 65 6c 28 73 74 72 75 63 74 _to_label(struct
17140 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 cackey_pcsc_ide
17150 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79 2c ntity *identity,
17160 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
17170 6c 61 62 65 6c 5f 62 75 66 2c 20 75 6e 73 69 67 label_buf, unsig
17180 6e 65 64 20 6c 6f 6e 67 20 6c 61 62 65 6c 5f 62 ned long label_b
17190 75 66 5f 6c 65 6e 29 20 7b 0a 09 75 6e 73 69 67 uf_len) {..unsig
171a0 6e 65 64 20 6c 6f 6e 67 20 63 65 72 74 69 66 69 ned long certifi
171b0 63 61 74 65 5f 6c 65 6e 3b 0a 09 76 6f 69 64 20 cate_len;..void
171c0 2a 6c 61 62 65 6c 5f 61 73 6e 31 3b 0a 09 76 6f *label_asn1;..vo
171d0 69 64 20 2a 63 65 72 74 69 66 69 63 61 74 65 3b id *certificate;
171e0 0a 09 69 6e 74 20 78 35 30 39 5f 72 65 61 64 5f ..int x509_read_
171f0 72 65 74 3b 0a 0a 09 63 65 72 74 69 66 69 63 61 ret;...certifica
17200 74 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 te = identity->c
17210 65 72 74 69 66 69 63 61 74 65 3b 0a 09 63 65 72 ertificate;..cer
17220 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 69 tificate_len = i
17230 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 dentity->certifi
17240 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 cate_len;...if (
17250 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 certificate_len
17260 3c 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 < 0) {...return(
17270 2d 31 29 3b 0a 09 7d 0a 0a 09 78 35 30 39 5f 72 -1);..}...x509_r
17280 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 ead_ret = x509_t
17290 6f 5f 73 75 62 6a 65 63 74 28 63 65 72 74 69 66 o_subject(certif
172a0 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 icate, certifica
172b0 74 65 5f 6c 65 6e 2c 20 28 76 6f 69 64 20 2a 2a te_len, (void **
172c0 29 20 26 6c 61 62 65 6c 5f 61 73 6e 31 29 3b 0a ) &label_asn1);.
172d0 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 .if (x509_read_r
172e0 65 74 20 3c 20 30 29 20 7b 0a 09 09 72 65 74 75 et < 0) {...retu
172f0 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 78 35 30 rn(-1);..}...x50
17300 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 9_read_ret = x50
17310 39 5f 64 6e 5f 74 6f 5f 73 74 72 69 6e 67 28 6c 9_dn_to_string(l
17320 61 62 65 6c 5f 61 73 6e 31 2c 20 78 35 30 39 5f abel_asn1, x509_
17330 72 65 61 64 5f 72 65 74 2c 20 28 63 68 61 72 20 read_ret, (char
17340 2a 29 20 6c 61 62 65 6c 5f 62 75 66 2c 20 6c 61 *) label_buf, la
17350 62 65 6c 5f 62 75 66 5f 6c 65 6e 2c 20 22 43 4e bel_buf_len, "CN
17360 22 29 3b 0a 09 69 66 20 28 78 35 30 39 5f 72 65 ");..if (x509_re
17370 61 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09 ad_ret <= 0) {..
17380 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d .x509_read_ret =
17390 20 78 35 30 39 5f 64 6e 5f 74 6f 5f 73 74 72 69 x509_dn_to_stri
173a0 6e 67 28 6c 61 62 65 6c 5f 61 73 6e 31 2c 20 78 ng(label_asn1, x
173b0 35 30 39 5f 72 65 61 64 5f 72 65 74 2c 20 28 63 509_read_ret, (c
173c0 68 61 72 20 2a 29 20 6c 61 62 65 6c 5f 62 75 66 har *) label_buf
173d0 2c 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 2c , label_buf_len,
173e0 20 4e 55 4c 4c 29 3b 0a 0a 09 09 69 66 20 28 78 NULL);....if (x
173f0 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 3d 20 509_read_ret <=
17400 30 29 20 7b 0a 09 09 09 72 65 74 75 72 6e 28 2d 0) {....return(-
17410 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 1);...}..}..#ifd
17420 65 66 20 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f ef CACKEY_PARANO
17430 49 44 0a 23 20 20 69 66 64 65 66 20 5f 50 4f 53 ID.# ifdef _POS
17440 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66 IX_SSIZE_MAX..if
17450 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 (x509_read_ret
17460 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d > _POSIX_SSIZE_M
17470 41 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 AX) {...CACKEY_D
17480 45 42 55 47 5f 50 52 49 4e 54 46 28 22 78 35 30 EBUG_PRINTF("x50
17490 39 5f 72 65 61 64 5f 72 65 74 20 65 78 63 65 65 9_read_ret excee
174a0 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 ds maximum value
174b0 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 , returning in f
174c0 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20 25 ailure. (max = %
174d0 6c 69 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65 li, x509_read_re
174e0 74 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 t = %lu)", (long
174f0 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d ) _POSIX_SSIZE_M
17500 41 58 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f AX, (unsigned lo
17510 6e 67 29 20 78 35 30 39 5f 72 65 61 64 5f 72 65 ng) x509_read_re
17520 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 t);....return(-1
17530 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23 );..}.# endif.#
17540 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e 28 78 endif...return(x
17550 35 30 39 5f 72 65 61 64 5f 72 65 74 29 3b 0a 7d 509_read_ret);.}
17560 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30 20 6f ../* Returns 0 o
17570 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 73 74 61 n success */.sta
17580 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d tic int cackey_m
17590 75 74 65 78 5f 63 72 65 61 74 65 28 76 6f 69 64 utex_create(void
175a0 20 2a 2a 6d 75 74 65 78 29 20 7b 0a 09 70 74 68 **mutex) {..pth
175b0 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74 read_mutex_t *pt
175c0 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e hread_mutex;..in
175d0 74 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c t pthread_retval
175e0 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f ;..CK_RV custom_
175f0 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 retval;...CACKEY
17600 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 _DEBUG_PRINTF("C
17610 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 alled.");...if (
17620 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61 (cackey_args.fla
17630 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b gs & CKF_OS_LOCK
17640 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f ING_OK) == CKF_O
17650 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a S_LOCKING_OK) {.
17660 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 20 ..pthread_mutex
17670 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 = malloc(sizeof(
17680 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29 29 *pthread_mutex))
17690 3b 0a 09 09 69 66 20 28 21 70 74 68 72 65 61 64 ;...if (!pthread
176a0 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09 43 41 43 _mutex) {....CAC
176b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
176c0 28 22 46 61 69 6c 65 64 20 74 6f 20 61 6c 6c 6f ("Failed to allo
176d0 63 61 74 65 20 6d 65 6d 6f 72 79 2e 22 29 3b 0a cate memory.");.
176e0 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a ....return(-1);.
176f0 09 09 7d 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 ..}....pthread_r
17700 65 74 76 61 6c 20 3d 20 70 74 68 72 65 61 64 5f etval = pthread_
17710 6d 75 74 65 78 5f 69 6e 69 74 28 70 74 68 72 65 mutex_init(pthre
17720 61 64 5f 6d 75 74 65 78 2c 20 4e 55 4c 4c 29 3b ad_mutex, NULL);
17730 0a 09 09 69 66 20 28 70 74 68 72 65 61 64 5f 72 ...if (pthread_r
17740 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 etval != 0) {...
17750 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
17760 49 4e 54 46 28 22 70 74 68 72 65 61 64 5f 6d 75 INTF("pthread_mu
17770 74 65 78 5f 69 6e 69 74 28 29 20 72 65 74 75 72 tex_init() retur
17780 6e 65 64 20 65 72 72 6f 72 20 28 25 69 29 2e 22 ned error (%i)."
17790 2c 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c , pthread_retval
177a0 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 );.....return(-1
177b0 29 3b 0a 09 09 7d 0a 0a 09 09 2a 6d 75 74 65 78 );...}....*mutex
177c0 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 = pthread_mutex
177d0 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 ;..} else {...if
177e0 20 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 (cackey_args.Cr
177f0 65 61 74 65 4d 75 74 65 78 29 20 7b 0a 09 09 09 eateMutex) {....
17800 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 custom_retval =
17810 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 cackey_args.Crea
17820 74 65 4d 75 74 65 78 28 6d 75 74 65 78 29 3b 0a teMutex(mutex);.
17830 0a 09 09 09 69 66 20 28 63 75 73 74 6f 6d 5f 72 ....if (custom_r
17840 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 etval != CKR_OK)
17850 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 {.....CACKEY_DE
17860 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b BUG_PRINTF("cack
17870 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75 ey_args.CreateMu
17880 74 65 78 28 29 20 72 65 74 75 72 6e 65 64 20 65 tex() returned e
17890 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c rror (%li).", (l
178a0 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65 74 76 ong) custom_retv
178b0 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e al);......return
178c0 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 (-1);....}...}..
178d0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 }...CACKEY_DEBUG
178e0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
178f0 6e 67 20 73 75 63 65 73 73 66 75 6c 6c 79 20 28 ng sucessfully (
17900 30 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 0)");...return(0
17910 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 );.}../* Returns
17920 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f 0 on success */
17930 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b .static int cack
17940 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 76 6f ey_mutex_lock(vo
17950 69 64 20 2a 6d 75 74 65 78 29 20 7b 0a 09 70 74 id *mutex) {..pt
17960 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70 hread_mutex_t *p
17970 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69 thread_mutex;..i
17980 6e 74 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 nt pthread_retva
17990 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74 6f 6d l;..CK_RV custom
179a0 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 _retval;...CACKE
179b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
179c0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 Called.");...if
179d0 28 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c ((cackey_args.fl
179e0 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 ags & CKF_OS_LOC
179f0 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f KING_OK) == CKF_
17a00 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b OS_LOCKING_OK) {
17a10 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 ...pthread_mutex
17a20 20 3d 20 6d 75 74 65 78 3b 0a 0a 09 09 70 74 68 = mutex;....pth
17a30 72 65 61 64 5f 72 65 74 76 61 6c 20 3d 20 70 74 read_retval = pt
17a40 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b hread_mutex_lock
17a50 28 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29 3b (pthread_mutex);
17a60 0a 09 09 69 66 20 28 70 74 68 72 65 61 64 5f 72 ...if (pthread_r
17a70 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 etval != 0) {...
17a80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
17a90 49 4e 54 46 28 22 70 74 68 72 65 61 64 5f 6d 75 INTF("pthread_mu
17aa0 74 65 78 5f 6c 6f 63 6b 28 29 20 72 65 74 75 72 tex_lock() retur
17ab0 6e 65 64 20 65 72 72 6f 72 20 28 25 69 29 2e 22 ned error (%i)."
17ac0 2c 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c , pthread_retval
17ad0 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 );.....return(-1
17ae0 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b );...}..} else {
17af0 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 61 72 ...if (cackey_ar
17b00 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 29 20 7b 0a gs.LockMutex) {.
17b10 09 09 09 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c ...custom_retval
17b20 20 3d 20 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c = cackey_args.L
17b30 6f 63 6b 4d 75 74 65 78 28 6d 75 74 65 78 29 3b ockMutex(mutex);
17b40 0a 0a 09 09 09 69 66 20 28 63 75 73 74 6f 6d 5f .....if (custom_
17b50 72 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b retval != CKR_OK
17b60 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 ) {.....CACKEY_D
17b70 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63 EBUG_PRINTF("cac
17b80 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 key_args.LockMut
17b90 65 78 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 ex() returned er
17ba0 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f ror (%li).", (lo
17bb0 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 ng) custom_retva
17bc0 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 l);......return(
17bd0 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d -1);....}...}..}
17be0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
17bf0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e PRINTF("Returnin
17c00 67 20 73 75 63 65 73 73 66 75 6c 6c 79 20 28 30 g sucessfully (0
17c10 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 )");...return(0)
17c20 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20 ;.}../* Returns
17c30 30 20 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 0 on success */.
17c40 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 static int cacke
17c50 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 76 y_mutex_unlock(v
17c60 6f 69 64 20 2a 6d 75 74 65 78 29 20 7b 0a 09 70 oid *mutex) {..p
17c70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a thread_mutex_t *
17c80 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 pthread_mutex;..
17c90 69 6e 74 20 70 74 68 72 65 61 64 5f 72 65 74 76 int pthread_retv
17ca0 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74 6f al;..CK_RV custo
17cb0 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b m_retval;...CACK
17cc0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
17cd0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 "Called.");...if
17ce0 20 28 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 ((cackey_args.f
17cf0 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f lags & CKF_OS_LO
17d00 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 CKING_OK) == CKF
17d10 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 _OS_LOCKING_OK)
17d20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65 {...pthread_mute
17d30 78 20 3d 20 6d 75 74 65 78 3b 0a 0a 09 09 70 74 x = mutex;....pt
17d40 68 72 65 61 64 5f 72 65 74 76 61 6c 20 3d 20 70 hread_retval = p
17d50 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c thread_mutex_unl
17d60 6f 63 6b 28 70 74 68 72 65 61 64 5f 6d 75 74 65 ock(pthread_mute
17d70 78 29 3b 0a 09 09 69 66 20 28 70 74 68 72 65 61 x);...if (pthrea
17d80 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b d_retval != 0) {
17d90 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
17da0 5f 50 52 49 4e 54 46 28 22 70 74 68 72 65 61 64 _PRINTF("pthread
17db0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 29 20 _mutex_unlock()
17dc0 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 returned error (
17dd0 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f 72 %i).", pthread_r
17de0 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 etval);.....retu
17df0 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 rn(-1);...}..} e
17e00 6c 73 65 20 7b 0a 09 09 69 66 20 28 63 61 63 6b lse {...if (cack
17e10 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 ey_args.UnlockMu
17e20 74 65 78 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d tex) {....custom
17e30 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 _retval = cackey
17e40 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 _args.UnlockMute
17e50 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09 09 69 66 x(mutex);.....if
17e60 20 28 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 (custom_retval
17e70 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 != CKR_OK) {....
17e80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
17e90 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 61 72 67 INTF("cackey_arg
17ea0 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 28 29 20 s.UnlockMutex()
17eb0 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 returned error (
17ec0 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 %li).", (long) c
17ed0 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a ustom_retval);..
17ee0 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a ....return(-1);.
17ef0 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 ...}...}..}...CA
17f00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
17f10 46 28 22 52 65 74 75 72 6e 69 6e 67 20 73 75 63 F("Returning suc
17f20 65 73 73 66 75 6c 6c 79 20 28 30 29 22 29 3b 0a essfully (0)");.
17f30 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a ..return(0);.}..
17f40 73 74 61 74 69 63 20 43 4b 5f 41 54 54 52 49 42 static CK_ATTRIB
17f50 55 54 45 5f 50 54 52 20 63 61 63 6b 65 79 5f 67 UTE_PTR cackey_g
17f60 65 74 5f 61 74 74 72 69 62 75 74 65 73 28 43 4b et_attributes(CK
17f70 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 6f 62 _OBJECT_CLASS ob
17f80 6a 65 63 74 63 6c 61 73 73 2c 20 73 74 72 75 63 jectclass, struc
17f90 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 t cackey_pcsc_id
17fa0 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79 entity *identity
17fb0 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 , unsigned long
17fc0 69 64 65 6e 74 69 74 79 5f 6e 75 6d 2c 20 43 4b identity_num, CK
17fd0 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f _ULONG_PTR pulCo
17fe0 75 6e 74 29 20 7b 0a 09 73 74 61 74 69 63 20 43 unt) {..static C
17ff0 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 74 72 75 65 20 K_BBOOL ck_true
18000 3d 20 31 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f = 1;..static CK_
18010 42 42 4f 4f 4c 20 63 6b 5f 66 61 6c 73 65 20 3d BBOOL ck_false =
18020 20 30 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 54 0;..static CK_T
18030 52 55 53 54 20 63 6b 5f 74 72 75 73 74 65 64 20 RUST ck_trusted
18040 3d 20 43 4b 5f 54 52 55 53 54 45 44 5f 44 45 4c = CK_TRUSTED_DEL
18050 45 47 41 54 4f 52 3b 0a 09 43 4b 5f 55 4c 4f 4e EGATOR;..CK_ULON
18060 47 20 6e 75 6d 61 74 74 72 73 20 3d 20 30 2c 20 G numattrs = 0,
18070 72 65 74 76 61 6c 5f 63 6f 75 6e 74 3b 0a 09 43 retval_count;..C
18080 4b 5f 41 54 54 52 49 42 55 54 45 5f 54 59 50 45 K_ATTRIBUTE_TYPE
18090 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 3b curr_attr_type;
180a0 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20 63 ..CK_ATTRIBUTE c
180b0 75 72 72 5f 61 74 74 72 2c 20 2a 72 65 74 76 61 urr_attr, *retva
180c0 6c 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 l;..CK_VOID_PTR
180d0 70 56 61 6c 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e pValue;..CK_ULON
180e0 47 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 43 G ulValueLen;..C
180f0 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 63 K_OBJECT_CLASS c
18100 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 3b 0a k_object_class;.
18110 09 43 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f .CK_CERTIFICATE_
18120 54 59 50 45 20 63 6b 5f 63 65 72 74 69 66 69 63 TYPE ck_certific
18130 61 74 65 5f 74 79 70 65 3b 0a 09 43 4b 5f 4b 45 ate_type;..CK_KE
18140 59 5f 54 59 50 45 20 63 6b 5f 6b 65 79 5f 74 79 Y_TYPE ck_key_ty
18150 70 65 3b 0a 09 43 4b 5f 55 54 46 38 43 48 41 52 pe;..CK_UTF8CHAR
18160 20 75 63 54 6d 70 42 75 66 5b 31 30 32 34 5d 3b ucTmpBuf[1024];
18170 0a 09 53 48 41 31 43 6f 6e 74 65 78 74 20 73 68 ..SHA1Context sh
18180 61 31 5f 63 74 78 3b 0a 09 4d 44 35 5f 43 54 58 a1_ctx;..MD5_CTX
18190 20 6d 64 35 5f 63 74 78 3b 0a 09 75 69 6e 74 38 md5_ctx;..uint8
181a0 5f 74 20 73 68 61 31 5f 68 61 73 68 5b 53 48 41 _t sha1_hash[SHA
181b0 31 48 61 73 68 53 69 7a 65 5d 3b 0a 09 75 69 6e 1HashSize];..uin
181c0 74 38 5f 74 20 6d 64 35 5f 68 61 73 68 5b 4d 44 t8_t md5_hash[MD
181d0 35 48 61 73 68 53 69 7a 65 5d 3b 0a 09 75 6e 73 5HashSize];..uns
181e0 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 igned char *cert
181f0 69 66 69 63 61 74 65 3b 0a 09 73 73 69 7a 65 5f ificate;..ssize_
18200 74 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 t certificate_le
18210 6e 20 3d 20 2d 31 2c 20 78 35 30 39 5f 72 65 61 n = -1, x509_rea
18220 64 5f 72 65 74 3b 0a 09 69 6e 74 20 70 56 61 6c d_ret;..int pVal
18230 75 65 5f 66 72 65 65 3b 0a 0a 09 43 41 43 4b 45 ue_free;...CACKE
18240 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
18250 43 61 6c 6c 65 64 20 28 6f 62 6a 65 63 74 43 6c Called (objectCl
18260 61 73 73 20 3d 20 25 6c 75 2c 20 69 64 65 6e 74 ass = %lu, ident
18270 69 74 79 5f 6e 75 6d 20 3d 20 25 6c 75 29 2e 22 ity_num = %lu)."
18280 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
18290 29 20 6f 62 6a 65 63 74 63 6c 61 73 73 2c 20 69 ) objectclass, i
182a0 64 65 6e 74 69 74 79 5f 6e 75 6d 29 3b 0a 0a 09 dentity_num);...
182b0 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a *pulCount = 0;..
182c0 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 .if (objectclass
182d0 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 != CKO_CERTIFIC
182e0 41 54 45 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 ATE && objectcla
182f0 73 73 20 21 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 ss != CKO_PUBLIC
18300 5f 4b 45 59 20 26 26 20 6f 62 6a 65 63 74 63 6c _KEY && objectcl
18310 61 73 73 20 21 3d 20 43 4b 4f 5f 50 52 49 56 41 ass != CKO_PRIVA
18320 54 45 5f 4b 45 59 20 26 26 20 6f 62 6a 65 63 74 TE_KEY && object
18330 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 class != CKO_NET
18340 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 SCAPE_TRUST) {..
18350 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
18360 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
18370 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 0 objects (NULL)
18380 2c 20 69 6e 76 61 6c 69 64 20 6f 62 6a 65 63 74 , invalid object
18390 20 63 6c 61 73 73 22 29 3b 0a 0a 09 09 72 65 74 class");....ret
183a0 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 urn(NULL);..}...
183b0 2f 2a 20 47 65 74 20 43 65 72 74 20 2a 2f 0a 09 /* Get Cert */..
183c0 69 66 20 28 69 64 65 6e 74 69 74 79 20 3d 3d 20 if (identity ==
183d0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 NULL) {...CACKEY
183e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
183f0 65 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 eturning 0 objec
18400 74 73 20 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c ts (NULL), inval
18410 69 64 20 69 64 65 6e 74 69 79 20 70 72 6f 76 69 id identiy provi
18420 64 65 64 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ded");....return
18430 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 63 65 72 (NULL);..}...cer
18440 74 69 66 69 63 61 74 65 20 3d 20 69 64 65 6e 74 tificate = ident
18450 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 ity->certificate
18460 3b 0a 09 63 65 72 74 69 66 69 63 61 74 65 5f 6c ;..certificate_l
18470 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 en = identity->c
18480 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a ertificate_len;.
18490 0a 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 ..if (certificat
184a0 65 5f 6c 65 6e 20 3d 3d 20 2d 31 20 7c 7c 20 63 e_len == -1 || c
184b0 65 72 74 69 66 69 63 61 74 65 20 3d 3d 20 4e 55 ertificate == NU
184c0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 LL) {...CACKEY_D
184d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
184e0 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 urning 0 objects
184f0 20 28 4e 55 4c 4c 29 2c 20 74 68 69 73 20 69 64 (NULL), this id
18500 65 6e 74 69 74 79 20 64 6f 65 73 20 6e 6f 74 20 entity does not
18510 68 61 76 65 20 61 6e 20 58 2e 35 30 39 20 63 65 have an X.509 ce
18520 72 74 69 66 69 63 61 74 65 20 61 73 73 6f 63 69 rtificate associ
18530 61 74 65 64 20 77 69 74 68 20 69 74 20 61 6e 64 ated with it and
18540 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 22 29 will not work")
18550 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c ;....return(NULL
18560 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 );..}.../* Verif
18570 79 20 74 68 61 74 20 63 65 72 74 69 66 69 63 61 y that certifica
18580 74 65 20 69 73 20 41 53 4e 2e 31 20 65 6e 63 6f te is ASN.1 enco
18590 64 65 64 20 58 2e 35 30 39 20 63 65 72 74 69 66 ded X.509 certif
185a0 69 63 61 74 65 20 2a 2f 0a 09 69 66 20 28 78 35 icate */..if (x5
185b0 30 39 5f 74 6f 5f 73 65 72 69 61 6c 28 63 65 72 09_to_serial(cer
185c0 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 tificate, certif
185d0 69 63 61 74 65 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 icate_len, NULL)
185e0 20 3c 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 < 0) {...CACKEY
185f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
18600 65 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 eturning 0 objec
18610 74 73 20 28 4e 55 4c 4c 29 2c 20 74 68 65 20 58 ts (NULL), the X
18620 2e 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 .509 certificate
18630 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 associated with
18640 20 74 68 69 73 20 69 64 65 6e 74 69 74 79 20 69 this identity i
18650 73 20 6e 6f 74 20 76 61 6c 69 64 22 29 3b 0a 0a s not valid");..
18660 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a ..return(NULL);.
18670 09 7d 0a 0a 09 72 65 74 76 61 6c 5f 63 6f 75 6e .}...retval_coun
18680 74 20 3d 20 36 34 3b 0a 09 72 65 74 76 61 6c 20 t = 64;..retval
18690 3d 20 6d 61 6c 6c 6f 63 28 72 65 74 76 61 6c 5f = malloc(retval_
186a0 63 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a count * sizeof(*
186b0 72 65 74 76 61 6c 29 29 3b 0a 0a 09 66 6f 72 20 retval));...for
186c0 28 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20 (curr_attr_type
186d0 3d 20 30 3b 20 63 75 72 72 5f 61 74 74 72 5f 74 = 0; curr_attr_t
186e0 79 70 65 20 3c 20 30 78 63 65 35 33 36 33 62 66 ype < 0xce5363bf
186f0 3b 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 ; curr_attr_type
18700 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 75 72 72 ++) {...if (curr
18710 5f 61 74 74 72 5f 74 79 70 65 20 3d 3d 20 30 78 _attr_type == 0x
18720 38 30 30 29 20 7b 0a 09 09 09 63 75 72 72 5f 61 800) {....curr_a
18730 74 74 72 5f 74 79 70 65 20 3d 20 30 78 63 65 35 ttr_type = 0xce5
18740 33 36 33 30 30 3b 0a 09 09 7d 0a 0a 09 09 70 56 36300;...}....pV
18750 61 6c 75 65 5f 66 72 65 65 20 3d 20 30 3b 0a 09 alue_free = 0;..
18760 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a .pValue = NULL;.
18770 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 ..ulValueLen = (
18780 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 CK_LONG) -1;....
18790 73 77 69 74 63 68 20 28 63 75 72 72 5f 61 74 74 switch (curr_att
187a0 72 5f 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73 r_type) {....cas
187b0 65 20 43 4b 41 5f 43 4c 41 53 53 3a 0a 09 09 09 e CKA_CLASS:....
187c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
187d0 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 INTF("Requesting
187e0 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43 attribute CKA_C
187f0 4c 41 53 53 20 28 30 78 25 30 38 6c 78 29 20 2e LASS (0x%08lx) .
18800 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c ..", (unsigned l
18810 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 ong) curr_attr_t
18820 79 70 65 29 3b 0a 0a 09 09 09 09 63 6b 5f 6f 62 ype);......ck_ob
18830 6a 65 63 74 5f 63 6c 61 73 73 20 3d 20 6f 62 6a ject_class = obj
18840 65 63 74 63 6c 61 73 73 3b 0a 0a 09 09 09 09 70 ectclass;......p
18850 56 61 6c 75 65 20 3d 20 26 63 6b 5f 6f 62 6a 65 Value = &ck_obje
18860 63 74 5f 63 6c 61 73 73 3b 0a 09 09 09 09 75 6c ct_class;.....ul
18870 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f ValueLen = sizeo
18880 66 28 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 f(ck_object_clas
18890 73 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f s);......CACKEY_
188a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e DEBUG_PRINTF(" .
188b0 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 .. returning %lu
188c0 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 (%p/%lu)", (uns
188d0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 igned long) *((C
188e0 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 2a K_OBJECT_CLASS *
188f0 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 ) pValue), pValu
18900 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e e, (unsigned lon
18910 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a g) ulValueLen);.
18920 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 .....break;....c
18930 61 73 65 20 43 4b 41 5f 54 4f 4b 45 4e 3a 0a 09 ase CKA_TOKEN:..
18940 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
18950 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 PRINTF("Requesti
18960 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 ng attribute CKA
18970 5f 54 4f 4b 45 4e 20 28 30 78 25 30 38 6c 78 29 _TOKEN (0x%08lx)
18980 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 ...", (unsigned
18990 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 long) curr_attr
189a0 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 _type);......pVa
189b0 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a lue = &ck_true;.
189c0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d ....ulValueLen =
189d0 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 sizeof(ck_true)
189e0 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 ;......CACKEY_DE
189f0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e BUG_PRINTF(" ...
18a00 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 returning %lu (
18a10 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 %p/%lu)", (unsig
18a20 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f ned long) *((CK_
18a30 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 BBOOL *) pValue)
18a40 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 , pValue, (unsig
18a50 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 ned long) ulValu
18a60 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 eLen);......brea
18a70 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 50 k;....case CKA_P
18a80 52 49 56 41 54 45 3a 0a 09 09 09 09 43 41 43 4b RIVATE:.....CACK
18a90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
18aa0 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 "Requesting attr
18ab0 69 62 75 74 65 20 43 4b 41 5f 50 52 49 56 41 54 ibute CKA_PRIVAT
18ac0 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 E (0x%08lx) ..."
18ad0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
18ae0 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 ) curr_attr_type
18af0 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 );......if (obje
18b00 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e ctclass != CKO_N
18b10 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b ETSCAPE_TRUST) {
18b20 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 ......CACKEY_DEB
18b30 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 UG_PRINTF(" ...
18b40 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 but not getting
18b50 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 it because we ar
18b60 65 20 6e 6f 74 20 61 20 4e 65 74 73 63 61 70 65 e not a Netscape
18b70 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b trust object");
18b80 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 .......break;...
18b90 09 09 7d 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 ..}......pValue
18ba0 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 = &ck_false;....
18bb0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 .ulValueLen = si
18bc0 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a zeof(ck_false);.
18bd0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
18be0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 G_PRINTF(" ... r
18bf0 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 eturning %lu (%p
18c00 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 /%lu)", (unsigne
18c10 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 d long) *((CK_BB
18c20 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 OOL *) pValue),
18c30 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 pValue, (unsigne
18c40 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c d long) ulValueL
18c50 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b en);......break;
18c60 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 ....case CKA_TRU
18c70 53 54 45 44 3a 0a 09 09 09 09 43 41 43 4b 45 59 STED:.....CACKEY
18c80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
18c90 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 equesting attrib
18ca0 75 74 65 20 43 4b 41 5f 54 52 55 53 54 45 44 20 ute CKA_TRUSTED
18cb0 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 (0x%08lx) ...",
18cc0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
18cd0 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b curr_attr_type);
18ce0 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 ......if (object
18cf0 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 class == CKO_NET
18d00 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 SCAPE_TRUST) {..
18d10 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
18d20 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 _PRINTF(" ... bu
18d30 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 t not getting it
18d40 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 because we are
18d50 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 a Netscape trust
18d60 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 object");......
18d70 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 .break;.....}...
18d80 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f ...pValue = &ck_
18d90 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 true;.....ulValu
18da0 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b eLen = sizeof(ck
18db0 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43 _true);......CAC
18dc0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
18dd0 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 (" ... returning
18de0 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 %lu (%p/%lu)",
18df0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
18e00 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 *((CK_BBOOL *) p
18e10 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 Value), pValue,
18e20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
18e30 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 ulValueLen);....
18e40 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 ..break;....case
18e50 20 43 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45 3a CKA_MODIFIABLE:
18e60 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
18e70 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 G_PRINTF("Reques
18e80 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 ting attribute C
18e90 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45 20 28 30 KA_MODIFIABLE (0
18ea0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 x%08lx) ...", (u
18eb0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 nsigned long) cu
18ec0 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a rr_attr_type);..
18ed0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b ....pValue = &ck
18ee0 5f 66 61 6c 73 65 3b 0a 09 09 09 09 75 6c 56 61 _false;.....ulVa
18ef0 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 lueLen = sizeof(
18f00 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a 09 09 09 09 ck_false);......
18f10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
18f20 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e NTF(" ... return
18f30 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 ing %lu (%p/%lu)
18f40 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e ", (unsigned lon
18f50 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a g) *((CK_BBOOL *
18f60 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 ) pValue), pValu
18f70 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e e, (unsigned lon
18f80 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a g) ulValueLen);.
18f90 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 .....break;....c
18fa0 61 73 65 20 43 4b 41 5f 4c 41 42 45 4c 3a 0a 09 ase CKA_LABEL:..
18fb0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
18fc0 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 PRINTF("Requesti
18fd0 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 ng attribute CKA
18fe0 5f 4c 41 42 45 4c 20 28 30 78 25 30 38 6c 78 29 _LABEL (0x%08lx)
18ff0 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 ...", (unsigned
19000 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 long) curr_attr
19010 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 _type);......if
19020 28 69 64 65 6e 74 69 74 79 2d 3e 69 64 5f 74 79 (identity->id_ty
19030 70 65 20 3d 3d 20 43 41 43 4b 45 59 5f 49 44 5f pe == CACKEY_ID_
19040 54 59 50 45 5f 50 49 56 29 20 7b 0a 09 09 09 09 TYPE_PIV) {.....
19050 09 70 56 61 6c 75 65 20 3d 20 69 64 65 6e 74 69 .pValue = identi
19060 74 79 2d 3e 63 61 72 64 2e 70 69 76 2e 6c 61 62 ty->card.piv.lab
19070 65 6c 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 el;......ulValue
19080 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 70 56 61 Len = strlen(pVa
19090 6c 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 lue);.....} else
190a0 20 7b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c {......ulValueL
190b0 65 6e 20 3d 20 73 6e 70 72 69 6e 74 66 28 28 63 en = snprintf((c
190c0 68 61 72 20 2a 29 20 75 63 54 6d 70 42 75 66 2c har *) ucTmpBuf,
190d0 20 73 69 7a 65 6f 66 28 75 63 54 6d 70 42 75 66 sizeof(ucTmpBuf
190e0 29 2c 20 22 49 64 65 6e 74 69 74 79 20 23 25 6c ), "Identity #%l
190f0 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f u", (unsigned lo
19100 6e 67 29 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d ng) identity_num
19110 29 3b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d );......pValue =
19120 20 75 63 54 6d 70 42 75 66 3b 0a 0a 09 09 09 09 ucTmpBuf;......
19130 09 69 66 20 28 75 6c 56 61 6c 75 65 4c 65 6e 20 .if (ulValueLen
19140 3e 3d 20 73 69 7a 65 6f 66 28 75 63 54 6d 70 42 >= sizeof(ucTmpB
19150 75 66 29 29 20 7b 0a 09 09 09 09 09 09 75 6c 56 uf)) {.......ulV
19160 61 6c 75 65 4c 65 6e 20 3d 20 30 3b 0a 09 09 09 alueLen = 0;....
19170 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c ...pValue = NULL
19180 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a ;......}.....}..
19190 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
191a0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 _PRINTF(" ... re
191b0 74 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 turning (%p/%lu)
191c0 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 ", pValue, (unsi
191d0 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c gned long) ulVal
191e0 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 ueLen);......bre
191f0 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f ak;....case CKA_
19200 56 41 4c 55 45 3a 0a 09 09 09 09 43 41 43 4b 45 VALUE:.....CACKE
19210 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
19220 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 Requesting attri
19230 62 75 74 65 20 43 4b 41 5f 56 41 4c 55 45 20 28 bute CKA_VALUE (
19240 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 0x%08lx) ...", (
19250 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 unsigned long) c
19260 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a urr_attr_type);.
19270 0a 09 09 09 09 73 77 69 74 63 68 20 28 6f 62 6a .....switch (obj
19280 65 63 74 63 6c 61 73 73 29 20 7b 0a 09 09 09 09 ectclass) {.....
19290 09 63 61 73 65 20 43 4b 4f 5f 50 52 49 56 41 54 .case CKO_PRIVAT
192a0 45 5f 4b 45 59 3a 0a 09 09 09 09 09 09 43 41 43 E_KEY:.......CAC
192b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
192c0 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 (" ... but not g
192d0 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 etting it becaus
192e0 65 20 77 65 20 61 72 65 20 61 20 70 72 69 76 61 e we are a priva
192f0 74 65 20 6b 65 79 2e 22 29 3b 0a 0a 09 09 09 09 te key.");......
19300 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 ..break;......ca
19310 73 65 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f se CKO_NETSCAPE_
19320 54 52 55 53 54 3a 0a 09 09 09 09 09 09 43 41 43 TRUST:.......CAC
19330 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
19340 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 (" ... but not g
19350 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 etting it becaus
19360 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 e we are a Netsc
19370 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 ape trust object
19380 22 29 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b ");........break
19390 3b 0a 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f ;......case CKO_
193a0 50 55 42 4c 49 43 5f 4b 45 59 3a 0a 09 09 09 09 PUBLIC_KEY:.....
193b0 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 ..if (certificat
193c0 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 e_len >= 0) {...
193d0 09 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 .....x509_read_r
193e0 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 70 75 62 et = x509_to_pub
193f0 6b 65 79 28 63 65 72 74 69 66 69 63 61 74 65 2c key(certificate,
19400 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e certificate_len
19410 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 , &pValue);.....
19420 09 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 ...if (x509_read
19430 5f 72 65 74 20 3c 20 30 29 20 7b 20 0a 09 09 09 _ret < 0) { ....
19440 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 .....pValue = NU
19450 4c 4c 3b 0a 09 09 09 09 09 09 09 7d 20 65 6c 73 LL;........} els
19460 65 20 7b 0a 09 09 09 09 09 09 09 09 75 6c 56 61 e {.........ulVa
19470 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 lueLen = x509_re
19480 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 09 09 7d ad_ret;........}
19490 0a 09 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 09 .......}........
194a0 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73 65 break;......case
194b0 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 CKO_CERTIFICATE
194c0 3a 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d :.......pValue =
194d0 20 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 09 certificate;...
194e0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d ....ulValueLen =
194f0 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e certificate_len
19500 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a ;........break;.
19510 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 ....}......CACKE
19520 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
19530 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 ... returning %
19540 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 p/%lu", pValue,
19550 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
19560 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 ulValueLen);....
19570 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 ..break;....case
19580 20 43 4b 41 5f 49 53 53 55 45 52 3a 0a 09 09 09 CKA_ISSUER:....
19590 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
195a0 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 INTF("Requesting
195b0 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 49 attribute CKA_I
195c0 53 53 55 45 52 20 28 30 78 25 30 38 6c 78 29 20 SSUER (0x%08lx)
195d0 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 ...", (unsigned
195e0 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f long) curr_attr_
195f0 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 type);......if (
19600 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 objectclass != C
19610 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 20 26 KO_CERTIFICATE &
19620 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d & objectclass !=
19630 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 CKO_NETSCAPE_TR
19640 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b UST) {......CACK
19650 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
19660 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 " ... but not ge
19670 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 tting it because
19680 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65 we are not a ce
19690 72 74 69 66 69 63 61 74 65 20 6f 72 20 4e 65 74 rtificate or Net
196a0 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 scape trust obje
196b0 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 ct");.......brea
196c0 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 k;.....}......if
196d0 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 (certificate_le
196e0 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 n >= 0) {......x
196f0 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 509_read_ret = x
19700 35 30 39 5f 74 6f 5f 69 73 73 75 65 72 28 63 65 509_to_issuer(ce
19710 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 rtificate, certi
19720 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 ficate_len, &pVa
19730 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 lue);......if (x
19740 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 509_read_ret < 0
19750 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 ) {.......pValue
19760 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 = NULL;......}
19770 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 else {.......ulV
19780 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 alueLen = x509_r
19790 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a ead_ret;......}.
197a0 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 ....}......CACKE
197b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
197c0 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 ... returning %
197d0 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 p/%lu", pValue,
197e0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
197f0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 ulValueLen);....
19800 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 ..break;....case
19810 20 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42 CKA_SERIAL_NUMB
19820 45 52 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 ER:.....CACKEY_D
19830 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 EBUG_PRINTF("Req
19840 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 uesting attribut
19850 65 20 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d e CKA_SERIAL_NUM
19860 42 45 52 20 28 30 78 25 30 38 6c 78 29 20 2e 2e BER (0x%08lx) ..
19870 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f .", (unsigned lo
19880 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 ng) curr_attr_ty
19890 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 pe);......if (ob
198a0 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f jectclass != CKO
198b0 5f 43 45 52 54 49 46 49 43 41 54 45 20 26 26 20 _CERTIFICATE &&
198c0 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 objectclass != C
198d0 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 KO_NETSCAPE_TRUS
198e0 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 T) {......CACKEY
198f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 _DEBUG_PRINTF("
19900 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 ... but not gett
19910 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 ing it because w
19920 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74 e are not a cert
19930 69 66 69 63 61 74 65 20 6f 72 20 4e 65 74 73 63 ificate or Netsc
19940 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 ape trust object
19950 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b ");.......break;
19960 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 .....}......if (
19970 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 certificate_len
19980 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 >= 0) {......x50
19990 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 9_read_ret = x50
199a0 39 5f 74 6f 5f 73 65 72 69 61 6c 28 63 65 72 74 9_to_serial(cert
199b0 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 ificate, certifi
199c0 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 cate_len, &pValu
199d0 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 e);......if (x50
199e0 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 9_read_ret < 0)
199f0 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d {.......pValue =
19a00 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c NULL;......} el
19a10 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c se {.......ulVal
19a20 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 ueLen = x509_rea
19a30 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 d_ret;......}...
19a40 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f ..}......CACKEY_
19a50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e DEBUG_PRINTF(" .
19a60 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70 .. returning (%p
19a70 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 /%lu)", pValue,
19a80 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
19a90 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 ulValueLen);....
19aa0 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 ..break;....case
19ab0 20 43 4b 41 5f 53 55 42 4a 45 43 54 3a 0a 09 09 CKA_SUBJECT:...
19ac0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
19ad0 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e RINTF("Requestin
19ae0 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f g attribute CKA_
19af0 53 55 42 4a 45 43 54 20 28 30 78 25 30 38 6c 78 SUBJECT (0x%08lx
19b00 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 ) ...", (unsigne
19b10 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 d long) curr_att
19b20 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 r_type);......if
19b30 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d (objectclass !=
19b40 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 CKO_CERTIFICATE
19b50 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f ) {......CACKEY_
19b60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e DEBUG_PRINTF(" .
19b70 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 .. but not getti
19b80 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 ng it because we
19b90 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69 are not a certi
19ba0 66 69 63 61 74 65 22 29 3b 0a 0a 09 09 09 09 09 ficate");.......
19bb0 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 break;.....}....
19bc0 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 ..if (certificat
19bd0 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 e_len >= 0) {...
19be0 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 ...x509_read_ret
19bf0 20 3d 20 78 35 30 39 5f 74 6f 5f 73 75 62 6a 65 = x509_to_subje
19c00 63 74 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 ct(certificate,
19c10 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c certificate_len,
19c20 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 &pValue);......
19c30 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 if (x509_read_re
19c40 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 t < 0) {.......p
19c50 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 Value = NULL;...
19c60 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 ...} else {.....
19c70 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 ..ulValueLen = x
19c80 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 509_read_ret;...
19c90 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 ...}.....}......
19ca0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
19cb0 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e NTF(" ... return
19cc0 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 ing %p/%lu", pVa
19cd0 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c lue, (unsigned l
19ce0 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 ong) ulValueLen)
19cf0 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 ;......break;...
19d00 09 63 61 73 65 20 43 4b 41 5f 49 44 3a 0a 09 09 .case CKA_ID:...
19d10 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
19d20 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e RINTF("Requestin
19d30 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f g attribute CKA_
19d40 49 44 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e ID (0x%08lx) ...
19d50 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e ", (unsigned lon
19d60 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 g) curr_attr_typ
19d70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a e);......if (obj
19d80 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f ectclass == CKO_
19d90 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 NETSCAPE_TRUST)
19da0 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 {......CACKEY_DE
19db0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e BUG_PRINTF(" ...
19dc0 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 but not getting
19dd0 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 it because we a
19de0 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 re a Netscape tr
19df0 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 ust object");...
19e00 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d ....break;.....}
19e10 0a 0a 09 09 09 09 75 63 54 6d 70 42 75 66 5b 30 ......ucTmpBuf[0
19e20 5d 20 3d 20 28 28 69 64 65 6e 74 69 74 79 5f 6e ] = ((identity_n
19e30 75 6d 20 2b 20 31 29 20 3e 3e 20 38 29 20 26 20 um + 1) >> 8) &
19e40 30 78 66 66 3b 0a 09 09 09 09 75 63 54 6d 70 42 0xff;.....ucTmpB
19e50 75 66 5b 31 5d 20 3d 20 20 28 69 64 65 6e 74 69 uf[1] = (identi
19e60 74 79 5f 6e 75 6d 20 2b 20 31 29 20 26 20 30 78 ty_num + 1) & 0x
19e70 66 66 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 ff;......pValue
19e80 3d 20 26 75 63 54 6d 70 42 75 66 3b 0a 09 09 09 = &ucTmpBuf;....
19e90 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 32 3b .ulValueLen = 2;
19ea0 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 ......CACKEY_DEB
19eb0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 UG_PRINTF(" ...
19ec0 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 returning %p/%lu
19ed0 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 ", pValue, (unsi
19ee0 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c gned long) ulVal
19ef0 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 ueLen);......bre
19f00 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f ak;....case CKA_
19f10 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 CERTIFICATE_TYPE
19f20 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 :.....CACKEY_DEB
19f30 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 UG_PRINTF("Reque
19f40 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 sting attribute
19f50 43 4b 41 5f 43 45 52 54 49 46 49 43 41 54 45 5f CKA_CERTIFICATE_
19f60 54 59 50 45 20 28 30 78 25 30 38 6c 78 29 20 2e TYPE (0x%08lx) .
19f70 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c ..", (unsigned l
19f80 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 ong) curr_attr_t
19f90 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f ype);......if (o
19fa0 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b bjectclass != CK
19fb0 4f 5f 43 45 52 54 49 46 49 43 41 54 45 29 20 7b O_CERTIFICATE) {
19fc0 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 ......CACKEY_DEB
19fd0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 UG_PRINTF(" ...
19fe0 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 but not getting
19ff0 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 it because we ar
1a000 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63 e not a certific
1a010 61 74 65 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72 ate.");.......br
1a020 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 eak;.....}......
1a030 2f 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f /* We only suppo
1a040 72 74 20 6f 6e 65 20 63 65 72 74 69 66 69 63 61 rt one certifica
1a050 74 65 20 74 79 70 65 20 2a 2f 0a 09 09 09 09 63 te type */.....c
1a060 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74 79 k_certificate_ty
1a070 70 65 20 3d 20 43 4b 43 5f 58 5f 35 30 39 3b 0a pe = CKC_X_509;.
1a080 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 .....pValue = &c
1a090 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74 79 k_certificate_ty
1a0a0 70 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c pe;.....ulValueL
1a0b0 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 63 en = sizeof(ck_c
1a0c0 65 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 29 ertificate_type)
1a0d0 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 ;......CACKEY_DE
1a0e0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e BUG_PRINTF(" ...
1a0f0 20 72 65 74 75 72 6e 69 6e 67 20 43 4b 43 5f 58 returning CKC_X
1a100 5f 35 30 39 20 28 25 6c 75 29 20 28 25 70 2f 25 _509 (%lu) (%p/%
1a110 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 lu)", (unsigned
1a120 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 43 45 52 54 long) *((CK_CERT
1a130 49 46 49 43 41 54 45 5f 54 59 50 45 20 2a 29 20 IFICATE_TYPE *)
1a140 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c pValue), pValue,
1a150 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
1a160 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 ulValueLen);...
1a170 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 ...break;....cas
1a180 65 20 43 4b 41 5f 4b 45 59 5f 54 59 50 45 3a 0a e CKA_KEY_TYPE:.
1a190 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
1a1a0 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 _PRINTF("Request
1a1b0 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b ing attribute CK
1a1c0 41 5f 4b 45 59 5f 54 59 50 45 20 28 30 78 25 30 A_KEY_TYPE (0x%0
1a1d0 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 8lx) ...", (unsi
1a1e0 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f gned long) curr_
1a1f0 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 attr_type);.....
1a200 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 .if (objectclass
1a210 20 21 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f != CKO_PRIVATE_
1a220 4b 45 59 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 KEY && objectcla
1a230 73 73 20 21 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 ss != CKO_PUBLIC
1a240 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 43 41 43 _KEY) {......CAC
1a250 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1a260 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 (" ... but not g
1a270 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 etting it becaus
1a280 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 6b e we are not a k
1a290 65 79 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 ey.");.......bre
1a2a0 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f ak;.....}....../
1a2b0 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 * We only suppor
1a2c0 74 20 6f 6e 65 20 6b 65 79 20 74 79 70 65 20 2a t one key type *
1a2d0 2f 0a 09 09 09 09 63 6b 5f 6b 65 79 5f 74 79 70 /.....ck_key_typ
1a2e0 65 20 3d 20 43 4b 4b 5f 52 53 41 3b 0a 0a 09 09 e = CKK_RSA;....
1a2f0 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 6b ..pValue = &ck_k
1a300 65 79 5f 74 79 70 65 3b 0a 09 09 09 09 75 6c 56 ey_type;.....ulV
1a310 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 alueLen = sizeof
1a320 28 63 6b 5f 6b 65 79 5f 74 79 70 65 29 3b 0a 0a (ck_key_type);..
1a330 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
1a340 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 _PRINTF(" ... re
1a350 74 75 72 6e 69 6e 67 20 43 4b 4b 5f 52 53 41 20 turning CKK_RSA
1a360 28 25 6c 75 29 20 28 25 70 2f 25 6c 75 29 22 2c (%lu) (%p/%lu)",
1a370 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
1a380 20 2a 28 28 43 4b 5f 43 45 52 54 49 46 49 43 41 *((CK_CERTIFICA
1a390 54 45 5f 54 59 50 45 20 2a 29 20 70 56 61 6c 75 TE_TYPE *) pValu
1a3a0 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 e), pValue, (uns
1a3b0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 igned long) ulVa
1a3c0 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 lueLen);......br
1a3d0 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 eak;....case CKA
1a3e0 5f 53 49 47 4e 3a 0a 09 09 09 09 43 41 43 4b 45 _SIGN:.....CACKE
1a3f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1a400 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 Requesting attri
1a410 62 75 74 65 20 43 4b 41 5f 53 49 47 4e 20 28 30 bute CKA_SIGN (0
1a420 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 x%08lx) ...", (u
1a430 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 nsigned long) cu
1a440 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a rr_attr_type);..
1a450 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c ....if (objectcl
1a460 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 ass == CKO_NETSC
1a470 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 APE_TRUST) {....
1a480 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1a490 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 RINTF(" ... but
1a4a0 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 not getting it b
1a4b0 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20 ecause we are a
1a4c0 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f Netscape trust o
1a4d0 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 bject");.......b
1a4e0 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 reak;.....}.....
1a4f0 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 .if (objectclass
1a500 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f == CKO_PRIVATE_
1a510 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c KEY) {......pVal
1a520 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 ue = &ck_true;..
1a530 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d ....ulValueLen =
1a540 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 sizeof(ck_true)
1a550 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 ;.....} else {..
1a560 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b ....pValue = &ck
1a570 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 _false;......ulV
1a580 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 alueLen = sizeof
1a590 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 (ck_false);.....
1a5a0 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 }......CACKEY_DE
1a5b0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e BUG_PRINTF(" ...
1a5c0 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 returning %lu (
1a5d0 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 %p/%lu)", (unsig
1a5e0 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f ned long) *((CK_
1a5f0 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 BBOOL *) pValue)
1a600 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 , pValue, (unsig
1a610 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 ned long) ulValu
1a620 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 eLen);......brea
1a630 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53 k;....case CKA_S
1a640 49 47 4e 5f 52 45 43 4f 56 45 52 3a 0a 09 09 09 IGN_RECOVER:....
1a650 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1a660 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 INTF("Requesting
1a670 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 attribute CKA_S
1a680 49 47 4e 5f 52 45 43 4f 56 45 52 20 28 30 78 25 IGN_RECOVER (0x%
1a690 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 08lx) ...", (uns
1a6a0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 igned long) curr
1a6b0 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 _attr_type);....
1a6c0 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 ..if (objectclas
1a6d0 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 s == CKO_NETSCAP
1a6e0 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 E_TRUST) {......
1a6f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1a700 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f NTF(" ... but no
1a710 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 t getting it bec
1a720 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 ause we are a Ne
1a730 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a tscape trust obj
1a740 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 ect");.......bre
1a750 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f ak;.....}....../
1a760 2a 20 57 65 20 63 75 72 72 65 6e 74 6c 79 20 6f * We currently o
1a770 6e 6c 79 20 73 75 70 70 6f 72 74 20 22 53 69 67 nly support "Sig
1a780 6e 20 77 69 74 68 20 41 70 70 65 6e 64 69 78 22 n with Appendix"
1a790 20 2a 2f 0a 09 09 09 09 70 56 61 6c 75 65 20 3d */.....pValue =
1a7a0 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 &ck_false;.....
1a7b0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a ulValueLen = siz
1a7c0 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a eof(ck_false);..
1a7d0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
1a7e0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 _PRINTF(" ... re
1a7f0 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f turning %lu (%p/
1a800 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 %lu)", (unsigned
1a810 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f long) *((CK_BBO
1a820 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 OL *) pValue), p
1a830 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 Value, (unsigned
1a840 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 long) ulValueLe
1a850 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a n);......break;.
1a860 09 09 09 63 61 73 65 20 43 4b 41 5f 44 45 43 52 ...case CKA_DECR
1a870 59 50 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f YPT:.....CACKEY_
1a880 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
1a890 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 questing attribu
1a8a0 74 65 20 43 4b 41 5f 44 45 43 52 59 50 54 20 28 te CKA_DECRYPT (
1a8b0 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 0x%08lx) ...", (
1a8c0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 unsigned long) c
1a8d0 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a urr_attr_type);.
1a8e0 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 .....if (objectc
1a8f0 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 lass == CKO_NETS
1a900 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 CAPE_TRUST) {...
1a910 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1a920 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 PRINTF(" ... but
1a930 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 not getting it
1a940 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 because we are a
1a950 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 Netscape trust
1a960 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 object");.......
1a970 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 break;.....}....
1a980 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 ..if (objectclas
1a990 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 s == CKO_PRIVATE
1a9a0 5f 4b 45 59 20 7c 7c 20 6f 62 6a 65 63 74 63 6c _KEY || objectcl
1a9b0 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 55 42 4c 49 ass == CKO_PUBLI
1a9c0 43 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56 C_KEY) {......pV
1a9d0 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b alue = &ck_true;
1a9e0 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e ......ulValueLen
1a9f0 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 = sizeof(ck_tru
1aa00 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b e);.....} else {
1aa10 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 ......pValue = &
1aa20 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 ck_false;......u
1aa30 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 lValueLen = size
1aa40 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 of(ck_false);...
1aa50 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f ..}......CACKEY_
1aa60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e DEBUG_PRINTF(" .
1aa70 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 .. returning %lu
1aa80 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 (%p/%lu)", (uns
1aa90 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 igned long) *((C
1aaa0 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 K_BBOOL *) pValu
1aab0 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 e), pValue, (uns
1aac0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 igned long) ulVa
1aad0 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 lueLen);......br
1aae0 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 eak;....case CKA
1aaf0 5f 53 45 4e 53 49 54 49 56 45 3a 0a 09 09 09 09 _SENSITIVE:.....
1ab00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1ab10 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 NTF("Requesting
1ab20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 45 attribute CKA_SE
1ab30 4e 53 49 54 49 56 45 20 28 30 78 25 30 38 6c 78 NSITIVE (0x%08lx
1ab40 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 ) ...", (unsigne
1ab50 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 d long) curr_att
1ab60 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 r_type);......if
1ab70 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d (objectclass ==
1ab80 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 CKO_NETSCAPE_TR
1ab90 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b UST) {......CACK
1aba0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1abb0 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 " ... but not ge
1abc0 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 tting it because
1abd0 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 we are a Netsca
1abe0 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 pe trust object"
1abf0 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a );.......break;.
1ac00 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f ....}......if (o
1ac10 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b bjectclass == CK
1ac20 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 29 20 7b O_PRIVATE_KEY) {
1ac30 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 ......pValue = &
1ac40 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c ck_true;......ul
1ac50 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f ValueLen = sizeo
1ac60 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 f(ck_true);.....
1ac70 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 } else {......pV
1ac80 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 alue = &ck_false
1ac90 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 ;......ulValueLe
1aca0 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 n = sizeof(ck_fa
1acb0 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 lse);.....}.....
1acc0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1acd0 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 INTF(" ... retur
1ace0 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 ning %lu (%p/%lu
1acf0 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f )", (unsigned lo
1ad00 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 ng) *((CK_BBOOL
1ad10 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c *) pValue), pVal
1ad20 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f ue, (unsigned lo
1ad30 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b ng) ulValueLen);
1ad40 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 ......break;....
1ad50 63 61 73 65 20 43 4b 41 5f 45 58 54 52 41 43 54 case CKA_EXTRACT
1ad60 41 42 4c 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 ABLE:.....CACKEY
1ad70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
1ad80 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 equesting attrib
1ad90 75 74 65 20 43 4b 41 5f 45 58 54 52 41 43 54 41 ute CKA_EXTRACTA
1ada0 42 4c 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e BLE (0x%08lx) ..
1adb0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f .", (unsigned lo
1adc0 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 ng) curr_attr_ty
1add0 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 pe);......if (ob
1ade0 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f jectclass == CKO
1adf0 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 _NETSCAPE_TRUST)
1ae00 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 {......CACKEY_D
1ae10 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e EBUG_PRINTF(" ..
1ae20 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e . but not gettin
1ae30 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 g it because we
1ae40 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 are a Netscape t
1ae50 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a rust object");..
1ae60 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 .....break;.....
1ae70 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 }......if (objec
1ae80 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 tclass == CKO_PR
1ae90 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09 IVATE_KEY) {....
1aea0 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 ..pValue = &ck_f
1aeb0 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c alse;......ulVal
1aec0 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 ueLen = sizeof(c
1aed0 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 k_true);.....} e
1aee0 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 lse {......pValu
1aef0 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 e = &ck_true;...
1af00 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 ...ulValueLen =
1af10 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 sizeof(ck_false)
1af20 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 ;.....}......CAC
1af30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1af40 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 (" ... returning
1af50 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 %lu (%p/%lu)",
1af60 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
1af70 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 *((CK_BBOOL *) p
1af80 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 Value), pValue,
1af90 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
1afa0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 ulValueLen);....
1afb0 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 ..break;....case
1afc0 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09 09 CKA_MODULUS:...
1afd0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1afe0 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e RINTF("Requestin
1aff0 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f g attribute CKA_
1b000 4d 4f 44 55 4c 55 53 20 28 30 78 25 30 38 6c 78 MODULUS (0x%08lx
1b010 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 ) ...", (unsigne
1b020 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 d long) curr_att
1b030 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 r_type);......if
1b040 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d (objectclass ==
1b050 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 CKO_NETSCAPE_TR
1b060 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b UST) {......CACK
1b070 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1b080 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 " ... but not ge
1b090 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 tting it because
1b0a0 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 we are a Netsca
1b0b0 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 pe trust object"
1b0c0 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a );.......break;.
1b0d0 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 ....}......if (c
1b0e0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e ertificate_len >
1b0f0 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 = 0) {......x509
1b100 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 _read_ret = x509
1b110 5f 74 6f 5f 6d 6f 64 75 6c 75 73 28 63 65 72 74 _to_modulus(cert
1b120 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 ificate, certifi
1b130 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 cate_len, &pValu
1b140 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 e);......if (x50
1b150 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 9_read_ret < 0)
1b160 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d {.......pValue =
1b170 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c NULL;......} el
1b180 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c se {.......ulVal
1b190 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 ueLen = x509_rea
1b1a0 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 d_ret;......}...
1b1b0 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f ..}......CACKEY_
1b1c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e DEBUG_PRINTF(" .
1b1d0 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70 .. returning (%p
1b1e0 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 /%lu)", pValue,
1b1f0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
1b200 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 ulValueLen);....
1b210 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 ..break;....case
1b220 20 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f CKA_PUBLIC_EXPO
1b230 4e 45 4e 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 NENT:.....CACKEY
1b240 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
1b250 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 equesting attrib
1b260 75 74 65 20 43 4b 41 5f 50 55 42 4c 49 43 5f 45 ute CKA_PUBLIC_E
1b270 58 50 4f 4e 45 4e 54 20 28 30 78 25 30 38 6c 78 XPONENT (0x%08lx
1b280 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 ) ...", (unsigne
1b290 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 d long) curr_att
1b2a0 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 r_type);......if
1b2b0 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d (objectclass ==
1b2c0 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 CKO_NETSCAPE_TR
1b2d0 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b UST) {......CACK
1b2e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1b2f0 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 " ... but not ge
1b300 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 tting it because
1b310 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 we are a Netsca
1b320 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 pe trust object"
1b330 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a );.......break;.
1b340 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 ....}......if (c
1b350 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e ertificate_len >
1b360 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 = 0) {......x509
1b370 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 _read_ret = x509
1b380 5f 74 6f 5f 65 78 70 6f 6e 65 6e 74 28 63 65 72 _to_exponent(cer
1b390 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 tificate, certif
1b3a0 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c icate_len, &pVal
1b3b0 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 ue);......if (x5
1b3c0 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 09_read_ret < 0)
1b3d0 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 {.......pValue
1b3e0 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 = NULL;......} e
1b3f0 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 lse {.......ulVa
1b400 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 lueLen = x509_re
1b410 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 ad_ret;......}..
1b420 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 ...}......CACKEY
1b430 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 _DEBUG_PRINTF("
1b440 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25 ... returning (%
1b450 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c p/%lu)", pValue,
1b460 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
1b470 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 ulValueLen);...
1b480 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 ...break;....cas
1b490 65 20 43 4b 41 5f 54 52 55 53 54 5f 44 49 47 49 e CKA_TRUST_DIGI
1b4a0 54 41 4c 5f 53 49 47 4e 41 54 55 52 45 3a 0a 09 TAL_SIGNATURE:..
1b4b0 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 ..case CKA_TRUST
1b4c0 5f 4e 4f 4e 5f 52 45 50 55 44 49 41 54 49 4f 4e _NON_REPUDIATION
1b4d0 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 :....case CKA_TR
1b4e0 55 53 54 5f 4b 45 59 5f 45 4e 43 49 50 48 45 52 UST_KEY_ENCIPHER
1b4f0 4d 45 4e 54 3a 0a 09 09 09 63 61 73 65 20 43 4b MENT:....case CK
1b500 41 5f 54 52 55 53 54 5f 44 41 54 41 5f 45 4e 43 A_TRUST_DATA_ENC
1b510 49 50 48 45 52 4d 45 4e 54 3a 0a 09 09 09 63 61 IPHERMENT:....ca
1b520 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59 se CKA_TRUST_KEY
1b530 5f 41 47 52 45 45 4d 45 4e 54 3a 0a 09 09 09 63 _AGREEMENT:....c
1b540 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 4b 45 ase CKA_TRUST_KE
1b550 59 5f 43 45 52 54 5f 53 49 47 4e 3a 0a 09 09 09 Y_CERT_SIGN:....
1b560 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 case CKA_TRUST_C
1b570 52 4c 5f 53 49 47 4e 3a 0a 09 09 09 63 61 73 65 RL_SIGN:....case
1b580 20 43 4b 41 5f 54 52 55 53 54 5f 53 45 52 56 45 CKA_TRUST_SERVE
1b590 52 5f 41 55 54 48 3a 0a 09 09 09 63 61 73 65 20 R_AUTH:....case
1b5a0 43 4b 41 5f 54 52 55 53 54 5f 43 4c 49 45 4e 54 CKA_TRUST_CLIENT
1b5b0 5f 41 55 54 48 3a 0a 09 09 09 63 61 73 65 20 43 _AUTH:....case C
1b5c0 4b 41 5f 54 52 55 53 54 5f 43 4f 44 45 5f 53 49 KA_TRUST_CODE_SI
1b5d0 47 4e 49 4e 47 3a 0a 09 09 09 63 61 73 65 20 43 GNING:....case C
1b5e0 4b 41 5f 54 52 55 53 54 5f 45 4d 41 49 4c 5f 50 KA_TRUST_EMAIL_P
1b5f0 52 4f 54 45 43 54 49 4f 4e 3a 0a 09 09 09 09 43 ROTECTION:.....C
1b600 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1b610 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 TF("Requesting a
1b620 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52 55 ttribute CKA_TRU
1b630 53 54 5f 2e 2e 2e 20 28 30 78 25 30 38 6c 78 29 ST_... (0x%08lx)
1b640 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 ...", (unsigned
1b650 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 long) curr_attr
1b660 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 _type);......pVa
1b670 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 73 74 65 lue = &ck_truste
1b680 64 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 d;.....ulValueLe
1b690 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 n = sizeof(ck_tr
1b6a0 75 73 74 65 64 29 3b 0a 0a 09 09 09 09 43 41 43 usted);......CAC
1b6b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1b6c0 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 (" ... returning
1b6d0 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 %lu (%p/%lu)",
1b6e0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
1b6f0 2a 28 28 43 4b 5f 54 52 55 53 54 20 2a 29 20 70 *((CK_TRUST *) p
1b700 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 Value), pValue,
1b710 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
1b720 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 ulValueLen);....
1b730 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 ..break;....case
1b740 20 43 4b 41 5f 43 45 52 54 5f 53 48 41 31 5f 48 CKA_CERT_SHA1_H
1b750 41 53 48 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f ASH:.....CACKEY_
1b760 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
1b770 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 questing attribu
1b780 74 65 20 43 4b 41 5f 43 45 52 54 5f 53 48 41 31 te CKA_CERT_SHA1
1b790 5f 48 41 53 48 20 28 30 78 25 30 38 6c 78 29 20 _HASH (0x%08lx)
1b7a0 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 ...", (unsigned
1b7b0 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f long) curr_attr_
1b7c0 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 type);......if (
1b7d0 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 objectclass != C
1b7e0 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 KO_NETSCAPE_TRUS
1b7f0 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 T) {......CACKEY
1b800 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 _DEBUG_PRINTF("
1b810 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 ... but not gett
1b820 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 ing it because w
1b830 65 20 61 72 65 20 6e 6f 74 20 61 20 4e 65 74 73 e are not a Nets
1b840 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 cape trust objec
1b850 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b t");.......break
1b860 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 53 48 41 ;.....}......SHA
1b870 31 52 65 73 65 74 28 26 73 68 61 31 5f 63 74 78 1Reset(&sha1_ctx
1b880 29 3b 0a 09 09 09 09 53 48 41 31 49 6e 70 75 74 );.....SHA1Input
1b890 28 26 73 68 61 31 5f 63 74 78 2c 20 63 65 72 74 (&sha1_ctx, cert
1b8a0 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 ificate, certifi
1b8b0 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 53 cate_len);.....S
1b8c0 48 41 31 52 65 73 75 6c 74 28 26 73 68 61 31 5f HA1Result(&sha1_
1b8d0 63 74 78 2c 20 73 68 61 31 5f 68 61 73 68 29 3b ctx, sha1_hash);
1b8e0 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 73 ......pValue = s
1b8f0 68 61 31 5f 68 61 73 68 3b 0a 09 09 09 09 75 6c ha1_hash;.....ul
1b900 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f ValueLen = sizeo
1b910 66 28 73 68 61 31 5f 68 61 73 68 29 3b 0a 0a 09 f(sha1_hash);...
1b920 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1b930 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 PRINTF(" ... ret
1b940 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 urning %p/%lu",
1b950 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 pValue, (unsigne
1b960 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c d long) ulValueL
1b970 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b en);......break;
1b980 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52 ....case CKA_CER
1b990 54 5f 4d 44 35 5f 48 41 53 48 3a 0a 09 09 09 09 T_MD5_HASH:.....
1b9a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1b9b0 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 NTF("Requesting
1b9c0 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43 45 attribute CKA_CE
1b9d0 52 54 5f 4d 44 35 5f 48 41 53 48 20 28 30 78 25 RT_MD5_HASH (0x%
1b9e0 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 08lx) ...", (uns
1b9f0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 igned long) curr
1ba00 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 _attr_type);....
1ba10 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 ..if (objectclas
1ba20 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 s != CKO_NETSCAP
1ba30 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 E_TRUST) {......
1ba40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1ba50 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f NTF(" ... but no
1ba60 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 t getting it bec
1ba70 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 ause we are not
1ba80 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 a Netscape trust
1ba90 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 object");......
1baa0 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 .break;.....}...
1bab0 09 09 09 4d 44 35 49 6e 69 74 28 26 6d 64 35 5f ...MD5Init(&md5_
1bac0 63 74 78 29 3b 0a 09 09 09 09 4d 44 35 55 70 64 ctx);.....MD5Upd
1bad0 61 74 65 28 26 6d 64 35 5f 63 74 78 2c 20 63 65 ate(&md5_ctx, ce
1bae0 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 rtificate, certi
1baf0 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 ficate_len);....
1bb00 09 4d 44 35 46 69 6e 61 6c 28 6d 64 35 5f 68 61 .MD5Final(md5_ha
1bb10 73 68 2c 20 26 6d 64 35 5f 63 74 78 29 3b 0a 0a sh, &md5_ctx);..
1bb20 09 09 09 09 70 56 61 6c 75 65 20 3d 20 6d 64 35 ....pValue = md5
1bb30 5f 68 61 73 68 3b 0a 09 09 09 09 75 6c 56 61 6c _hash;.....ulVal
1bb40 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 6d ueLen = sizeof(m
1bb50 64 35 5f 68 61 73 68 29 3b 0a 0a 09 09 09 09 43 d5_hash);......C
1bb60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1bb70 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 TF(" ... returni
1bb80 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c ng %p/%lu", pVal
1bb90 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f ue, (unsigned lo
1bba0 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b ng) ulValueLen);
1bbb0 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 ......break;....
1bbc0 64 65 66 61 75 6c 74 3a 0a 09 09 09 09 70 56 61 default:.....pVa
1bbd0 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 lue = NULL;.....
1bbe0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b ulValueLen = (CK
1bbf0 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 09 09 09 09 62 _LONG) -1;.....b
1bc00 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 reak;...}....if
1bc10 28 28 28 43 4b 5f 4c 4f 4e 47 29 20 75 6c 56 61 (((CK_LONG) ulVa
1bc20 6c 75 65 4c 65 6e 29 20 21 3d 20 28 28 43 4b 5f lueLen) != ((CK_
1bc30 4c 4f 4e 47 29 20 2d 31 29 29 20 7b 0a 09 09 09 LONG) -1)) {....
1bc40 2f 2a 20 50 75 73 68 20 63 75 72 72 5f 61 74 74 /* Push curr_att
1bc50 72 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b r onto the stack
1bc60 20 2a 2f 0a 09 09 09 63 75 72 72 5f 61 74 74 72 */....curr_attr
1bc70 2e 74 79 70 65 20 3d 20 63 75 72 72 5f 61 74 74 .type = curr_att
1bc80 72 5f 74 79 70 65 3b 0a 09 09 09 63 75 72 72 5f r_type;....curr_
1bc90 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 20 attr.ulValueLen
1bca0 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 = ulValueLen;...
1bcb0 09 09 63 75 72 72 5f 61 74 74 72 2e 70 56 61 6c ..curr_attr.pVal
1bcc0 75 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72 ue = malloc(curr
1bcd0 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e _attr.ulValueLen
1bce0 29 3b 0a 09 09 09 6d 65 6d 63 70 79 28 63 75 72 );....memcpy(cur
1bcf0 72 5f 61 74 74 72 2e 70 56 61 6c 75 65 2c 20 70 r_attr.pValue, p
1bd00 56 61 6c 75 65 2c 20 63 75 72 72 5f 61 74 74 72 Value, curr_attr
1bd10 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 .ulValueLen);...
1bd20 09 09 69 66 20 28 70 56 61 6c 75 65 5f 66 72 65 ..if (pValue_fre
1bd30 65 20 26 26 20 70 56 61 6c 75 65 29 20 7b 0a 09 e && pValue) {..
1bd40 09 09 09 66 72 65 65 28 70 56 61 6c 75 65 29 3b ...free(pValue);
1bd50 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 6e 75 ....}.....if (nu
1bd60 6d 61 74 74 72 73 20 3e 3d 20 72 65 74 76 61 6c mattrs >= retval
1bd70 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 72 65 _count) {.....re
1bd80 74 76 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 72 tval = realloc(r
1bd90 65 74 76 61 6c 2c 20 72 65 74 76 61 6c 5f 63 6f etval, retval_co
1bda0 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 unt * sizeof(*re
1bdb0 74 76 61 6c 29 29 3b 0a 09 09 09 7d 0a 0a 09 09 tval));....}....
1bdc0 09 6d 65 6d 63 70 79 28 26 72 65 74 76 61 6c 5b .memcpy(&retval[
1bdd0 6e 75 6d 61 74 74 72 73 5d 2c 20 26 63 75 72 72 numattrs], &curr
1bde0 5f 61 74 74 72 2c 20 73 69 7a 65 6f 66 28 63 75 _attr, sizeof(cu
1bdf0 72 72 5f 61 74 74 72 29 29 3b 0a 09 09 09 6e 75 rr_attr));....nu
1be00 6d 61 74 74 72 73 2b 2b 3b 0a 09 09 7d 0a 09 7d mattrs++;...}..}
1be10 0a 0a 09 69 66 20 28 6e 75 6d 61 74 74 72 73 20 ...if (numattrs
1be20 21 3d 20 30 29 20 7b 0a 09 09 72 65 74 76 61 6c != 0) {...retval
1be30 5f 63 6f 75 6e 74 20 3d 20 6e 75 6d 61 74 74 72 _count = numattr
1be40 73 3b 0a 09 09 72 65 74 76 61 6c 20 3d 20 72 65 s;...retval = re
1be50 61 6c 6c 6f 63 28 72 65 74 76 61 6c 2c 20 72 65 alloc(retval, re
1be60 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a tval_count * siz
1be70 65 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a 09 eof(*retval));..
1be80 7d 20 65 6c 73 65 20 7b 0a 09 09 66 72 65 65 28 } else {...free(
1be90 72 65 74 76 61 6c 29 3b 0a 0a 09 09 72 65 74 76 retval);....retv
1bea0 61 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 al = NULL;..}...
1beb0 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 6e 75 6d 61 *pulCount = numa
1bec0 74 74 72 73 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 ttrs;...CACKEY_D
1bed0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
1bee0 75 72 6e 69 6e 67 20 25 6c 75 20 6f 62 6a 65 63 urning %lu objec
1bef0 74 73 20 28 25 70 29 2e 22 2c 20 6e 75 6d 61 74 ts (%p).", numat
1bf00 74 72 73 2c 20 28 76 6f 69 64 20 2a 29 20 72 65 trs, (void *) re
1bf10 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 tval);...return(
1bf20 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 retval);.}..stat
1bf30 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 ic void cackey_f
1bf40 72 65 65 5f 69 64 65 6e 74 69 74 69 65 73 28 73 ree_identities(s
1bf50 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 truct cackey_ide
1bf60 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65 ntity *identitie
1bf70 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 s, unsigned long
1bf80 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e identities_coun
1bf90 74 29 20 7b 0a 09 43 4b 5f 41 54 54 52 49 42 55 t) {..CK_ATTRIBU
1bfa0 54 45 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09 TE *curr_attr;..
1bfb0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 unsigned long id
1bfc0 5f 69 64 78 2c 20 61 74 74 72 5f 69 64 78 3b 0a _idx, attr_idx;.
1bfd0 0a 09 69 66 20 28 69 64 65 6e 74 69 74 69 65 73 ..if (identities
1bfe0 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 69 64 65 6e == NULL || iden
1bff0 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d 3d 20 tities_count ==
1c000 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 0) {...return;..
1c010 7d 0a 0a 09 66 6f 72 20 28 69 64 5f 69 64 78 20 }...for (id_idx
1c020 3d 20 30 3b 20 69 64 5f 69 64 78 20 3c 20 69 64 = 0; id_idx < id
1c030 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b 20 entities_count;
1c040 69 64 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 id_idx++) {...if
1c050 20 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f (identities[id_
1c060 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 29 idx].attributes)
1c070 20 7b 0a 09 09 09 66 6f 72 20 28 61 74 74 72 5f {....for (attr_
1c080 69 64 78 20 3d 20 30 3b 20 61 74 74 72 5f 69 64 idx = 0; attr_id
1c090 78 20 3c 20 69 64 65 6e 74 69 74 69 65 73 5b 69 x < identities[i
1c0a0 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 d_idx].attribute
1c0b0 73 5f 63 6f 75 6e 74 3b 20 61 74 74 72 5f 69 64 s_count; attr_id
1c0c0 78 2b 2b 29 20 7b 0a 09 09 09 09 63 75 72 72 5f x++) {.....curr_
1c0d0 61 74 74 72 20 3d 20 26 69 64 65 6e 74 69 74 69 attr = &identiti
1c0e0 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 es[id_idx].attri
1c0f0 62 75 74 65 73 5b 61 74 74 72 5f 69 64 78 5d 3b butes[attr_idx];
1c100 0a 0a 09 09 09 09 69 66 20 28 63 75 72 72 5f 61 ......if (curr_a
1c110 74 74 72 2d 3e 70 56 61 6c 75 65 29 20 7b 0a 09 ttr->pValue) {..
1c120 09 09 09 09 66 72 65 65 28 63 75 72 72 5f 61 74 ....free(curr_at
1c130 74 72 2d 3e 70 56 61 6c 75 65 29 3b 0a 09 09 09 tr->pValue);....
1c140 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 .}....}.....if (
1c150 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 identities[id_id
1c160 78 5d 2e 61 74 74 72 69 62 75 74 65 73 29 20 7b x].attributes) {
1c170 0a 09 09 09 09 66 72 65 65 28 69 64 65 6e 74 69 .....free(identi
1c180 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 ties[id_idx].att
1c190 72 69 62 75 74 65 73 29 3b 0a 09 09 09 7d 0a 0a ributes);....}..
1c1a0 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 ...cackey_free_c
1c1b0 65 72 74 73 28 69 64 65 6e 74 69 74 69 65 73 5b erts(identities[
1c1c0 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 id_idx].pcsc_ide
1c1d0 6e 74 69 74 79 2c 20 31 2c 20 31 29 3b 0a 09 09 ntity, 1, 1);...
1c1e0 7d 0a 09 7d 0a 0a 09 66 72 65 65 28 69 64 65 6e }..}...free(iden
1c1f0 74 69 74 69 65 73 29 3b 0a 7d 0a 0a 73 74 61 74 tities);.}..stat
1c200 69 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 ic unsigned long
1c210 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64 cackey_read_dod
1c220 5f 69 64 65 6e 74 69 74 69 65 73 28 73 74 72 75 _identities(stru
1c230 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 ct cackey_identi
1c240 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73 2c 20 ty *identities,
1c250 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 unsigned long nu
1c260 6d 5f 64 6f 64 5f 63 65 72 74 73 29 20 7b 0a 09 m_dod_certs) {..
1c270 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 65 unsigned long ce
1c280 72 74 5f 69 64 78 2c 20 69 64 5f 69 64 78 20 3d rt_idx, id_idx =
1c290 20 30 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 0;...if (identi
1c2a0 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a ties == NULL) {.
1c2b0 09 09 72 65 74 75 72 6e 28 6e 75 6d 5f 64 6f 64 ..return(num_dod
1c2c0 5f 63 65 72 74 73 20 2a 20 33 29 3b 0a 09 7d 0a _certs * 3);..}.
1c2d0 0a 09 66 6f 72 20 28 63 65 72 74 5f 69 64 78 20 ..for (cert_idx
1c2e0 3d 20 30 3b 20 63 65 72 74 5f 69 64 78 20 3c 20 = 0; cert_idx <
1c2f0 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 3b 20 63 num_dod_certs; c
1c300 65 72 74 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 69 ert_idx++) {...i
1c310 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 dentities[id_idx
1c320 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 ].pcsc_identity
1c330 3d 20 4e 55 4c 4c 3b 0a 09 09 69 64 65 6e 74 69 = NULL;...identi
1c340 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 ties[id_idx].att
1c350 72 69 62 75 74 65 73 20 3d 20 63 61 63 6b 65 79 ributes = cackey
1c360 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65 73 28 _get_attributes(
1c370 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 2c CKO_CERTIFICATE,
1c380 20 26 65 78 74 72 61 5f 63 65 72 74 73 5b 63 65 &extra_certs[ce
1c390 72 74 5f 69 64 78 5d 2c 20 30 78 66 30 30 30 20 rt_idx], 0xf000
1c3a0 7c 20 63 65 72 74 5f 69 64 78 2c 20 26 69 64 65 | cert_idx, &ide
1c3b0 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e ntities[id_idx].
1c3c0 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 attributes_count
1c3d0 29 3b 0a 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 0a );...id_idx++;..
1c3e0 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f ..identities[id_
1c3f0 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 idx].pcsc_identi
1c400 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 69 64 65 ty = NULL;...ide
1c410 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e ntities[id_idx].
1c420 61 74 74 72 69 62 75 74 65 73 20 3d 20 63 61 63 attributes = cac
1c430 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74 key_get_attribut
1c440 65 73 28 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 es(CKO_PUBLIC_KE
1c450 59 2c 20 26 65 78 74 72 61 5f 63 65 72 74 73 5b Y, &extra_certs[
1c460 63 65 72 74 5f 69 64 78 5d 2c 20 30 78 66 30 30 cert_idx], 0xf00
1c470 30 20 7c 20 63 65 72 74 5f 69 64 78 2c 20 26 69 0 | cert_idx, &i
1c480 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 dentities[id_idx
1c490 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 ].attributes_cou
1c4a0 6e 74 29 3b 0a 09 09 69 64 5f 69 64 78 2b 2b 3b nt);...id_idx++;
1c4b0 0a 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 ....identities[i
1c4c0 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e d_idx].pcsc_iden
1c4d0 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 69 tity = NULL;...i
1c4e0 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 dentities[id_idx
1c4f0 5d 2e 61 74 74 72 69 62 75 74 65 73 20 3d 20 63 ].attributes = c
1c500 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62 ackey_get_attrib
1c510 75 74 65 73 28 43 4b 4f 5f 4e 45 54 53 43 41 50 utes(CKO_NETSCAP
1c520 45 5f 54 52 55 53 54 2c 20 26 65 78 74 72 61 5f E_TRUST, &extra_
1c530 63 65 72 74 73 5b 63 65 72 74 5f 69 64 78 5d 2c certs[cert_idx],
1c540 20 30 78 66 30 30 30 20 7c 20 63 65 72 74 5f 69 0xf000 | cert_i
1c550 64 78 2c 20 26 69 64 65 6e 74 69 74 69 65 73 5b dx, &identities[
1c560 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 id_idx].attribut
1c570 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 09 69 64 5f es_count);...id_
1c580 69 64 78 2b 2b 3b 0a 09 7d 0a 0a 09 72 65 74 75 idx++;..}...retu
1c590 72 6e 28 69 64 5f 69 64 78 29 3b 0a 7d 0a 0a 73 rn(id_idx);.}..s
1c5a0 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63 tatic struct cac
1c5b0 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 63 61 key_identity *ca
1c5c0 63 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e 74 69 ckey_read_identi
1c5d0 74 69 65 73 28 73 74 72 75 63 74 20 63 61 63 6b ties(struct cack
1c5e0 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 ey_slot *slot, u
1c5f0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 69 64 nsigned long *id
1c600 73 5f 66 6f 75 6e 64 29 20 7b 0a 09 73 74 72 75 s_found) {..stru
1c610 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 ct cackey_pcsc_i
1c620 64 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64 dentity *pcsc_id
1c630 65 6e 74 69 74 69 65 73 3b 0a 09 73 74 72 75 63 entities;..struc
1c640 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 t cackey_identit
1c650 79 20 2a 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 y *identities;..
1c660 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 unsigned long nu
1c670 6d 5f 69 64 73 2c 20 69 64 5f 69 64 78 2c 20 63 m_ids, id_idx, c
1c680 75 72 72 5f 69 64 5f 74 79 70 65 3b 0a 09 75 6e urr_id_type;..un
1c690 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f signed long num_
1c6a0 63 65 72 74 73 2c 20 6e 75 6d 5f 64 6f 64 5f 63 certs, num_dod_c
1c6b0 65 72 74 73 2c 20 63 65 72 74 5f 69 64 78 3b 0a erts, cert_idx;.
1c6c0 09 69 6e 74 20 69 6e 63 6c 75 64 65 5f 65 78 74 .int include_ext
1c6d0 72 61 5f 63 65 72 74 73 20 3d 20 30 2c 20 69 6e ra_certs = 0, in
1c6e0 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 3b clude_dod_certs;
1c6f0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1c700 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
1c710 29 3b 0a 0a 09 69 66 20 28 69 64 73 5f 66 6f 75 );...if (ids_fou
1c720 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 nd == NULL) {...
1c730 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1c740 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64 73 NTF("Error. ids
1c750 5f 66 6f 75 6e 64 20 69 73 20 4e 55 4c 4c 22 29 _found is NULL")
1c760 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c ;....return(NULL
1c770 29 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 );..}..#ifdef CA
1c780 43 4b 45 59 5f 43 41 52 44 5f 53 4c 4f 54 5f 49 CKEY_CARD_SLOT_I
1c790 4e 43 4c 55 44 45 5f 45 58 54 52 41 5f 43 45 52 NCLUDE_EXTRA_CER
1c7a0 54 53 0a 09 69 6e 63 6c 75 64 65 5f 65 78 74 72 TS..include_extr
1c7b0 61 5f 63 65 72 74 73 20 3d 20 31 3b 0a 23 65 6e a_certs = 1;.#en
1c7c0 64 69 66 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 dif...if (getenv
1c7d0 28 22 43 41 43 4b 45 59 5f 44 4f 44 5f 43 45 52 ("CACKEY_DOD_CER
1c7e0 54 53 5f 4f 4e 5f 48 57 5f 53 4c 4f 54 53 22 29 TS_ON_HW_SLOTS")
1c7f0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e != NULL) {...in
1c800 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74 clude_extra_cert
1c810 73 20 3d 20 31 3b 0a 09 7d 0a 0a 09 69 66 20 28 s = 1;..}...if (
1c820 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 4e getenv("CACKEY_N
1c830 4f 5f 44 4f 44 5f 43 45 52 54 53 5f 4f 4e 5f 48 O_DOD_CERTS_ON_H
1c840 57 5f 53 4c 4f 54 53 22 29 20 21 3d 20 4e 55 4c W_SLOTS") != NUL
1c850 4c 29 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 65 L) {...include_e
1c860 78 74 72 61 5f 63 65 72 74 73 20 3d 20 30 3b 0a xtra_certs = 0;.
1c870 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 .}..#ifdef CACKE
1c880 59 5f 4e 4f 5f 45 58 54 52 41 5f 43 45 52 54 53 Y_NO_EXTRA_CERTS
1c890 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 43 41 ..if (getenv("CA
1c8a0 43 4b 45 59 5f 45 58 54 52 41 5f 43 45 52 54 53 CKEY_EXTRA_CERTS
1c8b0 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 ") != NULL) {...
1c8c0 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 include_dod_cert
1c8d0 73 20 3d 20 31 3b 0a 09 7d 20 65 6c 73 65 20 7b s = 1;..} else {
1c8e0 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 ...include_dod_c
1c8f0 65 72 74 73 20 3d 20 30 3b 0a 09 7d 0a 23 65 6c erts = 0;..}.#el
1c900 73 65 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 se..if (getenv("
1c910 43 41 43 4b 45 59 5f 4e 4f 5f 45 58 54 52 41 5f CACKEY_NO_EXTRA_
1c920 43 45 52 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 CERTS") != NULL)
1c930 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64 {...include_dod
1c940 5f 63 65 72 74 73 20 3d 20 30 3b 0a 09 7d 20 65 _certs = 0;..} e
1c950 6c 73 65 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f lse {...include_
1c960 64 6f 64 5f 63 65 72 74 73 20 3d 20 31 3b 0a 09 dod_certs = 1;..
1c970 7d 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28 69 }.#endif...if (i
1c980 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 nclude_dod_certs
1c990 29 20 7b 0a 09 09 6e 75 6d 5f 64 6f 64 5f 63 65 ) {...num_dod_ce
1c9a0 72 74 73 20 3d 20 73 69 7a 65 6f 66 28 65 78 74 rts = sizeof(ext
1c9b0 72 61 5f 63 65 72 74 73 29 20 2f 20 73 69 7a 65 ra_certs) / size
1c9c0 6f 66 28 65 78 74 72 61 5f 63 65 72 74 73 5b 30 of(extra_certs[0
1c9d0 5d 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 ]);..} else {...
1c9e0 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 num_dod_certs =
1c9f0 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 0;..}...if (slot
1ca00 2d 3e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 ->internal) {...
1ca10 6e 75 6d 5f 69 64 73 20 3d 20 63 61 63 6b 65 79 num_ids = cackey
1ca20 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69 _read_dod_identi
1ca30 74 69 65 73 28 4e 55 4c 4c 2c 20 6e 75 6d 5f 64 ties(NULL, num_d
1ca40 6f 64 5f 63 65 72 74 73 29 3b 0a 0a 09 09 69 66 od_certs);....if
1ca50 20 28 6e 75 6d 5f 69 64 73 20 21 3d 20 30 29 20 (num_ids != 0)
1ca60 7b 0a 09 09 09 69 64 65 6e 74 69 74 69 65 73 20 {....identities
1ca70 3d 20 6d 61 6c 6c 6f 63 28 6e 75 6d 5f 69 64 73 = malloc(num_ids
1ca80 20 2a 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 * sizeof(*ident
1ca90 69 74 69 65 73 29 29 3b 0a 0a 09 09 09 63 61 63 ities));.....cac
1caa0 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65 key_read_dod_ide
1cab0 6e 74 69 74 69 65 73 28 69 64 65 6e 74 69 74 69 ntities(identiti
1cac0 65 73 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 es, num_dod_cert
1cad0 73 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 s);...} else {..
1cae0 09 09 69 64 65 6e 74 69 74 69 65 73 20 3d 20 4e ..identities = N
1caf0 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09 2a 69 64 73 ULL;...}....*ids
1cb00 5f 66 6f 75 6e 64 20 3d 20 6e 75 6d 5f 69 64 73 _found = num_ids
1cb10 3b 0a 0a 09 09 72 65 74 75 72 6e 28 69 64 65 6e ;....return(iden
1cb20 74 69 74 69 65 73 29 3b 0a 09 7d 0a 0a 09 70 63 tities);..}...pc
1cb30 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 3d 20 sc_identities =
1cb40 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 cackey_read_cert
1cb50 73 28 73 6c 6f 74 2c 20 4e 55 4c 4c 2c 20 26 6e s(slot, NULL, &n
1cb60 75 6d 5f 63 65 72 74 73 29 3b 0a 09 69 66 20 28 um_certs);..if (
1cb70 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 pcsc_identities
1cb80 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2f 2a 20 != NULL) {.../*
1cb90 43 6f 6e 76 65 72 74 20 6e 75 6d 62 65 72 20 6f Convert number o
1cba0 66 20 43 65 72 74 73 20 74 6f 20 6e 75 6d 62 65 f Certs to numbe
1cbb0 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 2a 2f 0a r of objects */.
1cbc0 09 09 6e 75 6d 5f 69 64 73 20 3d 20 28 43 4b 4f ..num_ids = (CKO
1cbd0 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 2d 20 43 _PRIVATE_KEY - C
1cbe0 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 20 2b KO_CERTIFICATE +
1cbf0 20 31 29 20 2a 20 6e 75 6d 5f 63 65 72 74 73 3b 1) * num_certs;
1cc00 0a 0a 09 09 69 66 20 28 69 6e 63 6c 75 64 65 5f ....if (include_
1cc10 65 78 74 72 61 5f 63 65 72 74 73 29 20 7b 0a 09 extra_certs) {..
1cc20 09 09 6e 75 6d 5f 69 64 73 20 2b 3d 20 63 61 63 ..num_ids += cac
1cc30 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65 key_read_dod_ide
1cc40 6e 74 69 74 69 65 73 28 4e 55 4c 4c 2c 20 6e 75 ntities(NULL, nu
1cc50 6d 5f 64 6f 64 5f 63 65 72 74 73 29 3b 0a 09 09 m_dod_certs);...
1cc60 7d 0a 0a 09 09 69 64 65 6e 74 69 74 69 65 73 20 }....identities
1cc70 3d 20 6d 61 6c 6c 6f 63 28 6e 75 6d 5f 69 64 73 = malloc(num_ids
1cc80 20 2a 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 * sizeof(*ident
1cc90 69 74 69 65 73 29 29 3b 0a 0a 09 09 2f 2a 20 41 ities));..../* A
1cca0 64 64 20 63 65 72 74 69 66 69 63 61 74 65 73 2c dd certificates,
1ccb0 20 70 75 62 6c 69 63 20 6b 65 79 73 2c 20 61 6e public keys, an
1ccc0 64 20 70 72 69 76 61 74 65 20 6b 65 79 73 20 66 d private keys f
1ccd0 72 6f 6d 20 74 68 65 20 73 6d 61 72 74 63 61 72 rom the smartcar
1cce0 64 20 2a 2f 0a 09 09 69 64 5f 69 64 78 20 3d 20 d */...id_idx =
1ccf0 30 3b 0a 09 09 66 6f 72 20 28 63 65 72 74 5f 69 0;...for (cert_i
1cd00 64 78 20 3d 20 30 3b 20 63 65 72 74 5f 69 64 78 dx = 0; cert_idx
1cd10 20 3c 20 6e 75 6d 5f 63 65 72 74 73 3b 20 63 65 < num_certs; ce
1cd20 72 74 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 66 rt_idx++) {....f
1cd30 6f 72 20 28 63 75 72 72 5f 69 64 5f 74 79 70 65 or (curr_id_type
1cd40 20 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 = CKO_CERTIFICA
1cd50 54 45 3b 20 63 75 72 72 5f 69 64 5f 74 79 70 65 TE; curr_id_type
1cd60 20 3c 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f <= CKO_PRIVATE_
1cd70 4b 45 59 3b 20 63 75 72 72 5f 69 64 5f 74 79 70 KEY; curr_id_typ
1cd80 65 2b 2b 29 20 7b 0a 09 09 09 09 69 64 65 6e 74 e++) {.....ident
1cd90 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 ities[id_idx].at
1cda0 74 72 69 62 75 74 65 73 20 3d 20 63 61 63 6b 65 tributes = cacke
1cdb0 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65 73 y_get_attributes
1cdc0 28 63 75 72 72 5f 69 64 5f 74 79 70 65 2c 20 26 (curr_id_type, &
1cdd0 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b pcsc_identities[
1cde0 63 65 72 74 5f 69 64 78 5d 2c 20 63 65 72 74 5f cert_idx], cert_
1cdf0 69 64 78 2c 20 26 69 64 65 6e 74 69 74 69 65 73 idx, &identities
1ce00 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 [id_idx].attribu
1ce10 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 tes_count);.....
1ce20 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 .identities[id_i
1ce30 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 dx].pcsc_identit
1ce40 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f y = malloc(sizeo
1ce50 66 28 2a 69 64 65 6e 74 69 74 69 65 73 5b 69 64 f(*identities[id
1ce60 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 _idx].pcsc_ident
1ce70 69 74 79 29 29 3b 0a 09 09 09 09 6d 65 6d 63 70 ity));.....memcp
1ce80 79 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f y(identities[id_
1ce90 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 idx].pcsc_identi
1cea0 74 79 2c 20 26 70 63 73 63 5f 69 64 65 6e 74 69 ty, &pcsc_identi
1ceb0 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 ties[cert_idx],
1cec0 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69 sizeof(*identiti
1ced0 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f es[id_idx].pcsc_
1cee0 69 64 65 6e 74 69 74 79 29 29 3b 0a 0a 09 09 09 identity));.....
1cef0 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 .identities[id_i
1cf00 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 dx].pcsc_identit
1cf10 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 20 3d y->certificate =
1cf20 20 6d 61 6c 6c 6f 63 28 70 63 73 63 5f 69 64 65 malloc(pcsc_ide
1cf30 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78 ntities[cert_idx
1cf40 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 ].certificate_le
1cf50 6e 29 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 69 n);.....memcpy(i
1cf60 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 dentities[id_idx
1cf70 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d ].pcsc_identity-
1cf80 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20 70 63 >certificate, pc
1cf90 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 sc_identities[ce
1cfa0 72 74 5f 69 64 78 5d 2e 63 65 72 74 69 66 69 63 rt_idx].certific
1cfb0 61 74 65 2c 20 70 63 73 63 5f 69 64 65 6e 74 69 ate, pcsc_identi
1cfc0 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63 ties[cert_idx].c
1cfd0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b ertificate_len);
1cfe0 0a 0a 09 09 09 09 69 64 5f 69 64 78 2b 2b 3b 0a ......id_idx++;.
1cff0 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 ...}...}....if (
1d000 69 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 include_extra_ce
1d010 72 74 73 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 rts) {....CACKEY
1d020 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 _DEBUG_PRINTF("I
1d030 6e 63 6c 75 64 69 6e 67 20 55 53 20 47 6f 76 65 ncluding US Gove
1d040 72 6e 6d 65 6e 74 20 43 65 72 74 69 66 69 63 61 rnment Certifica
1d050 74 65 73 20 6f 6e 20 68 61 72 64 77 61 72 65 20 tes on hardware
1d060 73 6c 6f 74 22 29 3b 0a 0a 09 09 09 63 61 63 6b slot");.....cack
1d070 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e ey_read_dod_iden
1d080 74 69 74 69 65 73 28 69 64 65 6e 74 69 74 69 65 tities(identitie
1d090 73 20 2b 20 69 64 5f 69 64 78 2c 20 6e 75 6d 5f s + id_idx, num_
1d0a0 64 6f 64 5f 63 65 72 74 73 29 3b 0a 09 09 7d 0a dod_certs);...}.
1d0b0 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 ...cackey_free_c
1d0c0 65 72 74 73 28 70 63 73 63 5f 69 64 65 6e 74 69 erts(pcsc_identi
1d0d0 74 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c ties, num_certs,
1d0e0 20 31 29 3b 0a 0a 09 09 2a 69 64 73 5f 66 6f 75 1);....*ids_fou
1d0f0 6e 64 20 3d 20 6e 75 6d 5f 69 64 73 3b 0a 0a 09 nd = num_ids;...
1d100 09 72 65 74 75 72 6e 28 69 64 65 6e 74 69 74 69 .return(identiti
1d110 65 73 29 3b 0a 09 7d 0a 0a 0a 09 2a 69 64 73 5f es);..}....*ids_
1d120 66 6f 75 6e 64 20 3d 20 30 3b 0a 09 72 65 74 75 found = 0;..retu
1d130 72 6e 28 4e 55 4c 4c 29 3b 0a 7d 0a 0a 73 74 61 rn(NULL);.}..sta
1d140 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 tic cackey_ret c
1d150 61 63 6b 65 79 5f 67 65 74 5f 70 69 6e 28 63 68 ackey_get_pin(ch
1d160 61 72 20 2a 70 69 6e 62 75 66 29 20 7b 0a 09 46 ar *pinbuf) {..F
1d170 49 4c 45 20 2a 70 69 6e 66 64 3b 0a 09 63 68 61 ILE *pinfd;..cha
1d180 72 20 2a 66 67 65 74 73 5f 72 65 74 3b 0a 09 69 r *fgets_ret;..i
1d190 6e 74 20 70 63 6c 6f 73 65 5f 72 65 74 3b 0a 0a nt pclose_ret;..
1d1a0 09 69 66 20 28 63 61 63 6b 65 79 5f 70 69 6e 5f .if (cackey_pin_
1d1b0 63 6f 6d 6d 61 6e 64 20 3d 3d 20 4e 55 4c 4c 29 command == NULL)
1d1c0 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b {...return(CACK
1d1d0 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 EY_PCSC_E_GENERI
1d1e0 43 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 69 6e C);..}...if (pin
1d1f0 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 buf == NULL) {..
1d200 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 .return(CACKEY_P
1d210 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a CSC_E_GENERIC);.
1d220 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 .}...CACKEY_DEBU
1d230 47 5f 50 52 49 4e 54 46 28 22 43 41 43 4b 45 59 G_PRINTF("CACKEY
1d240 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 20 3d 20 25 _PIN_COMMAND = %
1d250 73 22 2c 20 63 61 63 6b 65 79 5f 70 69 6e 5f 63 s", cackey_pin_c
1d260 6f 6d 6d 61 6e 64 29 3b 0a 0a 09 70 69 6e 66 64 ommand);...pinfd
1d270 20 3d 20 70 6f 70 65 6e 28 63 61 63 6b 65 79 5f = popen(cackey_
1d280 70 69 6e 5f 63 6f 6d 6d 61 6e 64 2c 20 22 72 22 pin_command, "r"
1d290 29 3b 0a 09 69 66 20 28 70 69 6e 66 64 20 3d 3d );..if (pinfd ==
1d2a0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 NULL) {...CACKE
1d2b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1d2c0 45 72 72 6f 72 2e 20 20 25 73 3a 20 55 6e 61 62 Error. %s: Unab
1d2d0 6c 65 20 74 6f 20 72 75 6e 22 2c 20 63 61 63 6b le to run", cack
1d2e0 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 29 3b ey_pin_command);
1d2f0 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 ....return(CACKE
1d300 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 Y_PCSC_E_BADPIN)
1d310 3b 0a 09 7d 0a 0a 09 66 67 65 74 73 5f 72 65 74 ;..}...fgets_ret
1d320 20 3d 20 66 67 65 74 73 28 70 69 6e 62 75 66 2c = fgets(pinbuf,
1d330 20 33 32 2c 20 70 69 6e 66 64 29 3b 0a 09 69 66 32, pinfd);..if
1d340 20 28 66 67 65 74 73 5f 72 65 74 20 3d 3d 20 4e (fgets_ret == N
1d350 55 4c 4c 29 20 7b 0a 09 09 70 69 6e 62 75 66 5b ULL) {...pinbuf[
1d360 30 5d 20 3d 20 27 5c 30 27 3b 0a 09 7d 0a 0a 09 0] = '\0';..}...
1d370 70 63 6c 6f 73 65 5f 72 65 74 20 3d 20 70 63 6c pclose_ret = pcl
1d380 6f 73 65 28 70 69 6e 66 64 29 3b 0a 09 69 66 20 ose(pinfd);..if
1d390 28 70 63 6c 6f 73 65 5f 72 65 74 20 3d 3d 20 2d (pclose_ret == -
1d3a0 31 20 26 26 20 65 72 72 6e 6f 20 3d 3d 20 45 43 1 && errno == EC
1d3b0 48 49 4c 44 29 20 7b 0a 09 09 43 41 43 4b 45 59 HILD) {...CACKEY
1d3c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4e _DEBUG_PRINTF("N
1d3d0 6f 74 69 63 65 2e 20 20 70 63 6c 6f 73 65 28 29 otice. pclose()
1d3e0 20 69 6e 64 69 63 61 74 65 64 20 69 74 20 63 6f indicated it co
1d3f0 75 6c 64 20 6e 6f 74 20 67 65 74 20 74 68 65 20 uld not get the
1d400 73 74 61 74 75 73 20 6f 66 20 74 68 65 20 63 68 status of the ch
1d410 69 6c 64 2c 20 61 73 73 75 6d 69 6e 67 20 69 74 ild, assuming it
1d420 20 73 75 63 63 65 65 65 64 65 64 20 21 22 29 3b succeeeded !");
1d430 0a 0a 09 09 70 63 6c 6f 73 65 5f 72 65 74 20 3d ....pclose_ret =
1d440 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 63 6c 0;..}...if (pcl
1d450 6f 73 65 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a ose_ret != 0) {.
1d460 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1d470 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 25 RINTF("Error. %
1d480 73 3a 20 65 78 69 74 65 64 20 77 69 74 68 20 6e s: exited with n
1d490 6f 6e 2d 7a 65 72 6f 20 73 74 61 74 75 73 20 6f on-zero status o
1d4a0 66 20 25 69 22 2c 20 63 61 63 6b 65 79 5f 70 69 f %i", cackey_pi
1d4b0 6e 5f 63 6f 6d 6d 61 6e 64 2c 20 70 63 6c 6f 73 n_command, pclos
1d4c0 65 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 e_ret);....retur
1d4d0 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f n(CACKEY_PCSC_E_
1d4e0 42 41 44 50 49 4e 29 3b 0a 09 7d 0a 0a 09 69 66 BADPIN);..}...if
1d4f0 20 28 73 74 72 6c 65 6e 28 70 69 6e 62 75 66 29 (strlen(pinbuf)
1d500 20 3c 20 31 29 20 7b 0a 09 09 43 41 43 4b 45 59 < 1) {...CACKEY
1d510 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
1d520 72 72 6f 72 2e 20 20 25 73 3a 20 72 65 74 75 72 rror. %s: retur
1d530 6e 65 64 20 6e 6f 20 64 61 74 61 22 2c 20 63 61 ned no data", ca
1d540 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 ckey_pin_command
1d550 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 );....return(CAC
1d560 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 KEY_PCSC_E_BADPI
1d570 4e 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 69 6e N);..}...if (pin
1d580 62 75 66 5b 73 74 72 6c 65 6e 28 70 69 6e 62 75 buf[strlen(pinbu
1d590 66 29 20 2d 20 31 5d 20 3d 3d 20 27 5c 6e 27 29 f) - 1] == '\n')
1d5a0 20 7b 0a 09 09 70 69 6e 62 75 66 5b 73 74 72 6c {...pinbuf[strl
1d5b0 65 6e 28 70 69 6e 62 75 66 29 20 2d 20 31 5d 20 en(pinbuf) - 1]
1d5c0 3d 20 27 5c 30 27 3b 0a 09 7d 0a 0a 09 72 65 74 = '\0';..}...ret
1d5d0 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f urn(CACKEY_PCSC_
1d5e0 53 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 S_OK);.}..CK_DEF
1d5f0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f INE_FUNCTION(CK_
1d600 52 56 2c 20 43 5f 49 6e 69 74 69 61 6c 69 7a 65 RV, C_Initialize
1d610 29 28 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 49 )(CK_VOID_PTR pI
1d620 6e 69 74 41 72 67 73 29 20 7b 0a 09 43 4b 5f 43 nitArgs) {..CK_C
1d630 5f 49 4e 49 54 49 41 4c 49 5a 45 5f 41 52 47 53 _INITIALIZE_ARGS
1d640 20 43 4b 5f 50 54 52 20 61 72 67 73 3b 0a 09 75 CK_PTR args;..u
1d650 69 6e 74 33 32 5f 74 20 69 64 78 2c 20 68 69 67 int32_t idx, hig
1d660 68 65 73 74 5f 73 6c 6f 74 3b 0a 09 69 6e 74 20 hest_slot;..int
1d670 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 3b 0a mutex_init_ret;.
1d680 09 69 6e 74 20 69 6e 63 6c 75 64 65 5f 64 6f 64 .int include_dod
1d690 5f 63 65 72 74 73 3b 0a 0a 09 43 41 43 4b 45 59 _certs;...CACKEY
1d6a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 _DEBUG_PRINTF("C
1d6b0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 alled.");...if (
1d6c0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a cackey_initializ
1d6d0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...CACKEY_D
1d6e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
1d6f0 6f 72 2e 20 20 41 6c 72 65 61 64 79 20 69 6e 69 or. Already ini
1d700 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 tialized.");....
1d710 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 return(CKR_CRYPT
1d720 4f 4b 49 5f 41 4c 52 45 41 44 59 5f 49 4e 49 54 OKI_ALREADY_INIT
1d730 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 IALIZED);..}...i
1d740 66 20 28 70 49 6e 69 74 41 72 67 73 20 21 3d 20 f (pInitArgs !=
1d750 4e 55 4c 4c 29 20 7b 0a 09 09 61 72 67 73 20 3d NULL) {...args =
1d760 20 70 49 6e 69 74 41 72 67 73 3b 0a 09 09 6d 65 pInitArgs;...me
1d770 6d 63 70 79 28 26 63 61 63 6b 65 79 5f 61 72 67 mcpy(&cackey_arg
1d780 73 2c 20 61 72 67 73 2c 20 73 69 7a 65 6f 66 28 s, args, sizeof(
1d790 63 61 63 6b 65 79 5f 61 72 67 73 29 29 3b 0a 0a cackey_args));..
1d7a0 09 09 69 66 20 28 61 72 67 73 2d 3e 43 72 65 61 ..if (args->Crea
1d7b0 74 65 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 teMutex == NULL
1d7c0 7c 7c 20 61 72 67 73 2d 3e 44 65 73 74 72 6f 79 || args->Destroy
1d7d0 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c Mutex == NULL ||
1d7e0 20 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74 65 78 args->LockMutex
1d7f0 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 == NULL || args
1d800 2d 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d 3d ->UnlockMutex ==
1d810 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28 NULL) {....if (
1d820 61 72 67 73 2d 3e 43 72 65 61 74 65 4d 75 74 65 args->CreateMute
1d830 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 x != NULL || arg
1d840 73 2d 3e 44 65 73 74 72 6f 79 4d 75 74 65 78 20 s->DestroyMutex
1d850 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d != NULL || args-
1d860 3e 4c 6f 63 6b 4d 75 74 65 78 20 21 3d 20 4e 55 >LockMutex != NU
1d870 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 55 6e 6c 6f LL || args->Unlo
1d880 63 6b 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 29 ckMutex != NULL)
1d890 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 {.....CACKEY_DE
1d8a0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
1d8b0 72 2e 20 53 6f 6d 65 2c 20 62 75 74 20 6e 6f 74 r. Some, but not
1d8c0 20 41 6c 6c 20 74 68 72 65 61 64 69 6e 67 20 70 All threading p
1d8d0 72 69 6d 69 74 69 76 65 73 20 70 72 6f 76 69 64 rimitives provid
1d8e0 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 ed.");......retu
1d8f0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 rn(CKR_ARGUMENTS
1d900 5f 42 41 44 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a _BAD);....}...}.
1d910 09 7d 20 65 6c 73 65 20 7b 0a 09 09 63 61 63 6b .} else {...cack
1d920 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75 ey_args.CreateMu
1d930 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 tex = NULL;...ca
1d940 63 6b 65 79 5f 61 72 67 73 2e 44 65 73 74 72 6f ckey_args.Destro
1d950 79 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 yMutex = NULL;..
1d960 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 .cackey_args.Loc
1d970 6b 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 kMutex = NULL;..
1d980 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c .cackey_args.Unl
1d990 6f 63 6b 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b ockMutex = NULL;
1d9a0 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 ...cackey_args.f
1d9b0 6c 61 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 66 lags = 0;..}...f
1d9c0 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 or (idx = 0; idx
1d9d0 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 < (sizeof(cacke
1d9e0 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 y_sessions) / si
1d9f0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 zeof(cackey_sess
1da00 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b ions[0])); idx++
1da10 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 ) {...cackey_ses
1da20 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 sions[idx].activ
1da30 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 66 6f 72 20 e = 0;..}...for
1da40 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 (idx = 0; idx <
1da50 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 (sizeof(cackey_s
1da60 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 lots) / sizeof(c
1da70 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 ackey_slots[0]))
1da80 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 63 61 63 ; idx++) {...cac
1da90 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 61 key_slots[idx].a
1daa0 63 74 69 76 65 20 3d 20 30 3b 0a 09 09 63 61 63 ctive = 0;...cac
1dab0 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 key_slots[idx].p
1dac0 63 73 63 5f 72 65 61 64 65 72 20 3d 20 4e 55 4c csc_reader = NUL
1dad0 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 L;...cackey_slot
1dae0 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63 74 69 s[idx].transacti
1daf0 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 09 on_depth = 0;...
1db00 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 cackey_slots[idx
1db10 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 ].transaction_ne
1db20 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a ed_hw_lock = 0;.
1db30 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 ..cackey_slots[i
1db40 64 78 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 20 3d dx].slot_reset =
1db50 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 0;...cackey_slo
1db60 74 73 5b 69 64 78 5d 2e 74 6f 6b 65 6e 5f 66 6c ts[idx].token_fl
1db70 61 67 73 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 ags = 0;...cacke
1db80 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 y_slots[idx].lab
1db90 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 el = NULL;...cac
1dba0 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 69 key_slots[idx].i
1dbb0 6e 74 65 72 6e 61 6c 20 3d 20 30 3b 0a 09 7d 0a nternal = 0;..}.
1dbc0 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 4e .#ifdef CACKEY_N
1dbd0 4f 5f 45 58 54 52 41 5f 43 45 52 54 53 0a 09 69 O_EXTRA_CERTS..i
1dbe0 66 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45 f (getenv("CACKE
1dbf0 59 5f 45 58 54 52 41 5f 43 45 52 54 53 22 29 20 Y_EXTRA_CERTS")
1dc00 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 != NULL) {...inc
1dc10 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d lude_dod_certs =
1dc20 20 31 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 1;..} else {...
1dc30 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 include_dod_cert
1dc40 73 20 3d 20 30 3b 0a 09 7d 0a 23 65 6c 73 65 0a s = 0;..}.#else.
1dc50 09 69 66 20 28 67 65 74 65 6e 76 28 22 43 41 43 .if (getenv("CAC
1dc60 4b 45 59 5f 4e 4f 5f 45 58 54 52 41 5f 43 45 52 KEY_NO_EXTRA_CER
1dc70 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a TS") != NULL) {.
1dc80 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 ..include_dod_ce
1dc90 72 74 73 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 rts = 0;..} else
1dca0 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64 {...include_dod
1dcb0 5f 63 65 72 74 73 20 3d 20 31 3b 0a 09 7d 0a 23 _certs = 1;..}.#
1dcc0 65 6e 64 69 66 0a 0a 09 69 66 20 28 69 6e 63 6c endif...if (incl
1dcd0 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d 3d ude_dod_certs ==
1dce0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 0) {...CACKEY_D
1dcf0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 73 6b EBUG_PRINTF("Ask
1dd00 65 64 20 6e 6f 74 20 74 6f 20 69 6e 63 6c 75 64 ed not to includ
1dd10 65 20 44 6f 44 20 63 65 72 74 69 66 69 63 61 74 e DoD certificat
1dd20 65 73 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a es");..} else {.
1dd30 09 09 68 69 67 68 65 73 74 5f 73 6c 6f 74 20 3d ..highest_slot =
1dd40 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f (sizeof(cackey_
1dd50 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 slots) / sizeof(
1dd60 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 cackey_slots[0])
1dd70 29 20 2d 20 31 3b 0a 0a 09 09 43 41 43 4b 45 59 ) - 1;....CACKEY
1dd80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 _DEBUG_PRINTF("I
1dd90 6e 63 6c 75 64 69 6e 67 20 44 6f 44 20 63 65 72 ncluding DoD cer
1dda0 74 73 20 69 6e 20 73 6c 6f 74 20 25 6c 75 22 2c ts in slot %lu",
1ddb0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
1ddc0 20 68 69 67 68 65 73 74 5f 73 6c 6f 74 29 3b 0a highest_slot);.
1ddd0 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b ...cackey_slots[
1dde0 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 61 63 highest_slot].ac
1ddf0 74 69 76 65 20 3d 20 31 3b 0a 09 09 63 61 63 6b tive = 1;...cack
1de00 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73 74 ey_slots[highest
1de10 5f 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 20 _slot].internal
1de20 3d 20 31 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c = 1;...cackey_sl
1de30 6f 74 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74 ots[highest_slot
1de40 5d 2e 6c 61 62 65 6c 20 3d 20 28 75 6e 73 69 67 ].label = (unsig
1de50 6e 65 64 20 63 68 61 72 20 2a 29 20 22 55 53 20 ned char *) "US
1de60 47 6f 76 65 72 6e 6d 65 6e 74 20 43 65 72 74 69 Government Certi
1de70 66 69 63 61 74 65 73 22 3b 0a 09 09 63 61 63 6b ficates";...cack
1de80 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73 74 ey_slots[highest
1de90 5f 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 _slot].pcsc_read
1dea0 65 72 20 3d 20 22 43 41 43 4b 65 79 22 3b 0a 09 er = "CACKey";..
1deb0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 .cackey_slots[hi
1dec0 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 74 6f 6b 65 ghest_slot].toke
1ded0 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09 7d 0a n_flags = 0;..}.
1dee0 0a 09 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c ..cackey_initial
1def0 69 7a 65 64 20 3d 20 31 3b 0a 0a 09 69 66 20 28 ized = 1;...if (
1df00 21 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f !cackey_biglock_
1df10 69 6e 69 74 29 20 7b 0a 09 09 6d 75 74 65 78 5f init) {...mutex_
1df20 69 6e 69 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 init_ret = cacke
1df30 79 5f 6d 75 74 65 78 5f 63 72 65 61 74 65 28 26 y_mutex_create(&
1df40 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
1df50 0a 0a 09 09 69 66 20 28 6d 75 74 65 78 5f 69 6e ....if (mutex_in
1df60 69 74 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 it_ret != 0) {..
1df70 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1df80 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4d RINTF("Error. M
1df90 75 74 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 utex initializat
1dfa0 69 6f 6e 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a ion failed.");..
1dfb0 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 41 ...return(CKR_CA
1dfc0 4e 54 5f 4c 4f 43 4b 29 3b 0a 09 09 7d 0a 0a 09 NT_LOCK);...}...
1dfd0 09 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f .cackey_biglock_
1dfe0 69 6e 69 74 20 3d 20 31 3b 0a 09 7d 0a 0a 09 2f init = 1;..}.../
1dff0 2a 20 44 65 66 69 6e 65 20 61 20 63 6f 6d 6d 61 * Define a comma
1e000 6e 64 20 74 6f 20 70 72 6f 6d 70 74 20 75 73 65 nd to prompt use
1e010 72 20 66 6f 72 20 61 20 50 49 4e 20 2a 2f 0a 23 r for a PIN */.#
1e020 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50 49 4e ifdef CACKEY_PIN
1e030 5f 43 4f 4d 4d 41 4e 44 5f 44 45 46 41 55 4c 54 _COMMAND_DEFAULT
1e040 0a 09 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d ..cackey_pin_com
1e050 6d 61 6e 64 20 3d 20 73 74 72 64 75 70 28 43 41 mand = strdup(CA
1e060 43 4b 45 59 5f 4d 41 43 52 4f 5f 44 45 46 41 55 CKEY_MACRO_DEFAU
1e070 4c 54 5f 58 53 54 52 28 43 41 43 4b 45 59 5f 50 LT_XSTR(CACKEY_P
1e080 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 44 45 46 41 55 IN_COMMAND_DEFAU
1e090 4c 54 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 LT));.#endif..#i
1e0a0 66 64 65 66 20 43 41 43 4b 45 59 5f 50 49 4e 5f fdef CACKEY_PIN_
1e0b0 43 4f 4d 4d 41 4e 44 5f 58 4f 4e 4c 59 5f 44 45 COMMAND_XONLY_DE
1e0c0 46 41 55 4c 54 0a 09 69 66 20 28 67 65 74 65 6e FAULT..if (geten
1e0d0 76 28 22 44 49 53 50 4c 41 59 22 29 20 21 3d 20 v("DISPLAY") !=
1e0e0 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 NULL) {...cackey
1e0f0 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 20 73 _pin_command = s
1e100 74 72 64 75 70 28 43 41 43 4b 45 59 5f 4d 41 43 trdup(CACKEY_MAC
1e110 52 4f 5f 44 45 46 41 55 4c 54 5f 58 53 54 52 28 RO_DEFAULT_XSTR(
1e120 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 CACKEY_PIN_COMMA
1e130 4e 44 5f 58 4f 4e 4c 59 5f 44 45 46 41 55 4c 54 ND_XONLY_DEFAULT
1e140 29 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 ));..}.#endif...
1e150 69 66 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b if (getenv("CACK
1e160 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 22 29 EY_PIN_COMMAND")
1e170 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 != NULL) {...ca
1e180 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 ckey_pin_command
1e190 20 3d 20 73 74 72 64 75 70 28 67 65 74 65 6e 76 = strdup(getenv
1e1a0 28 22 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d ("CACKEY_PIN_COM
1e1b0 4d 41 4e 44 22 29 29 3b 0a 09 7d 0a 0a 09 69 66 MAND"));..}...if
1e1c0 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 (getenv("CACKEY
1e1d0 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 58 4f 4e _PIN_COMMAND_XON
1e1e0 4c 59 22 29 20 21 3d 20 4e 55 4c 4c 20 26 26 20 LY") != NULL &&
1e1f0 67 65 74 65 6e 76 28 22 44 49 53 50 4c 41 59 22 getenv("DISPLAY"
1e200 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 ) != NULL) {...c
1e210 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e ackey_pin_comman
1e220 64 20 3d 20 73 74 72 64 75 70 28 67 65 74 65 6e d = strdup(geten
1e230 76 28 22 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f v("CACKEY_PIN_CO
1e240 4d 4d 41 4e 44 5f 58 4f 4e 4c 59 22 29 29 3b 0a MMAND_XONLY"));.
1e250 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 .}..#ifdef CACKE
1e260 59 5f 52 45 41 44 45 52 53 5f 49 4e 43 4c 55 44 Y_READERS_INCLUD
1e270 45 5f 4f 4e 4c 59 5f 44 45 46 41 55 4c 54 0a 09 E_ONLY_DEFAULT..
1e280 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69 cackey_readers_i
1e290 6e 63 6c 75 64 65 5f 6f 6e 6c 79 20 3d 20 73 74 nclude_only = st
1e2a0 72 64 75 70 28 43 41 43 4b 45 59 5f 4d 41 43 52 rdup(CACKEY_MACR
1e2b0 4f 5f 44 45 46 41 55 4c 54 5f 58 53 54 52 28 43 O_DEFAULT_XSTR(C
1e2c0 41 43 4b 45 59 5f 52 45 41 44 45 52 53 5f 49 4e ACKEY_READERS_IN
1e2d0 43 4c 55 44 45 5f 4f 4e 4c 59 5f 44 45 46 41 55 CLUDE_ONLY_DEFAU
1e2e0 4c 54 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 LT));.#endif..#i
1e2f0 66 64 65 66 20 43 41 43 4b 45 59 5f 52 45 41 44 fdef CACKEY_READ
1e300 45 52 53 5f 45 58 43 4c 55 44 45 5f 44 45 46 41 ERS_EXCLUDE_DEFA
1e310 55 4c 54 0a 09 63 61 63 6b 65 79 5f 72 65 61 64 ULT..cackey_read
1e320 65 72 73 5f 65 78 63 6c 75 64 65 20 3d 20 73 74 ers_exclude = st
1e330 72 64 75 70 28 43 41 43 4b 45 59 5f 4d 41 43 52 rdup(CACKEY_MACR
1e340 4f 5f 44 45 46 41 55 4c 54 5f 58 53 54 52 28 43 O_DEFAULT_XSTR(C
1e350 41 43 4b 45 59 5f 52 45 41 44 45 52 53 5f 45 58 ACKEY_READERS_EX
1e360 43 4c 55 44 45 5f 44 45 46 41 55 4c 54 29 29 3b CLUDE_DEFAULT));
1e370 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28 67 65 .#endif...if (ge
1e380 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 52 45 41 tenv("CACKEY_REA
1e390 44 45 52 53 5f 49 4e 43 4c 55 44 45 5f 4f 4e 4c DERS_INCLUDE_ONL
1e3a0 59 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 Y") != NULL) {..
1e3b0 09 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f .cackey_readers_
1e3c0 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79 20 3d 20 73 include_only = s
1e3d0 74 72 64 75 70 28 67 65 74 65 6e 76 28 22 43 41 trdup(getenv("CA
1e3e0 43 4b 45 59 5f 52 45 41 44 45 52 53 5f 49 4e 43 CKEY_READERS_INC
1e3f0 4c 55 44 45 5f 4f 4e 4c 59 22 29 29 3b 0a 0a 09 LUDE_ONLY"));...
1e400 09 69 66 20 28 63 61 63 6b 65 79 5f 72 65 61 64 .if (cackey_read
1e410 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79 ers_include_only
1e420 5b 30 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 [0] == '\0') {..
1e430 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 72 65 ..free(cackey_re
1e440 61 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e aders_include_on
1e450 6c 79 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f ly);.....cackey_
1e460 72 65 61 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f readers_include_
1e470 6f 6e 6c 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d only = NULL;...}
1e480 0a 09 7d 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 ..}...if (getenv
1e490 28 22 43 41 43 4b 45 59 5f 52 45 41 44 45 52 53 ("CACKEY_READERS
1e4a0 5f 45 58 43 4c 55 44 45 22 29 20 21 3d 20 4e 55 _EXCLUDE") != NU
1e4b0 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 72 LL) {...cackey_r
1e4c0 65 61 64 65 72 73 5f 65 78 63 6c 75 64 65 20 3d eaders_exclude =
1e4d0 20 73 74 72 64 75 70 28 67 65 74 65 6e 76 28 22 strdup(getenv("
1e4e0 43 41 43 4b 45 59 5f 52 45 41 44 45 52 53 5f 45 CACKEY_READERS_E
1e4f0 58 43 4c 55 44 45 22 29 29 3b 0a 0a 09 09 69 66 XCLUDE"));....if
1e500 20 28 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 (cackey_readers
1e510 5f 65 78 63 6c 75 64 65 5b 30 5d 20 3d 3d 20 27 _exclude[0] == '
1e520 5c 30 27 29 20 7b 0a 09 09 09 66 72 65 65 28 63 \0') {....free(c
1e530 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78 ackey_readers_ex
1e540 63 6c 75 64 65 29 3b 0a 0a 09 09 09 63 61 63 6b clude);.....cack
1e550 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63 6c 75 ey_readers_exclu
1e560 64 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 de = NULL;...}..
1e570 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 }...CACKEY_DEBUG
1e580 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
1e590 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c ng CKR_OK (%i)",
1e5a0 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 CKR_OK);...retu
1e5b0 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 rn(CKR_OK);.}..C
1e5c0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f K_DEFINE_FUNCTIO
1e5d0 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 61 6c N(CK_RV, C_Final
1e5e0 69 7a 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54 52 ize)(CK_VOID_PTR
1e5f0 20 70 52 65 73 65 72 76 65 64 29 20 7b 0a 09 75 pReserved) {..u
1e600 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 0a 09 43 int32_t idx;...C
1e610 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1e620 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
1e630 09 69 66 20 28 70 52 65 73 65 72 76 65 64 20 21 .if (pReserved !
1e640 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b = NULL) {...CACK
1e650 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1e660 22 45 72 72 6f 72 2e 20 70 52 65 73 65 72 76 65 "Error. pReserve
1e670 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 d is not NULL.")
1e680 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
1e690 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a ARGUMENTS_BAD);.
1e6a0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 .}...if (!cackey
1e6b0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
1e6c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1e6d0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e RINTF("Error. N
1e6e0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 ot initialized."
1e6f0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
1e700 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e _CRYPTOKI_NOT_IN
1e710 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
1e720 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 .for (idx = 0; i
1e730 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 dx < (sizeof(cac
1e740 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 key_sessions) /
1e750 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 sizeof(cackey_se
1e760 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 ssions[0])); idx
1e770 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b ++) {...if (cack
1e780 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d ey_sessions[idx]
1e790 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 43 5f .active) {....C_
1e7a0 43 6c 6f 73 65 53 65 73 73 69 6f 6e 28 69 64 78 CloseSession(idx
1e7b0 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b );...}..}...cack
1e7c0 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e ey_slots_disconn
1e7d0 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 66 6f 72 ect_all();...for
1e7e0 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c (idx = 0; idx <
1e7f0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f (sizeof(cackey_
1e800 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 slots) / sizeof(
1e810 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 cackey_slots[0])
1e820 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 ); idx++) {...if
1e830 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 (cackey_slots[i
1e840 64 78 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a dx].internal) {.
1e850 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d ...continue;...}
1e860 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 ....if (cackey_s
1e870 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 lots[idx].pcsc_r
1e880 65 61 64 65 72 29 20 7b 0a 09 09 09 66 72 65 65 eader) {....free
1e890 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 (cackey_slots[id
1e8a0 78 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29 3b x].pcsc_reader);
1e8b0 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b ...}....if (cack
1e8c0 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 63 61 ey_slots[idx].ca
1e8d0 63 68 65 64 5f 63 65 72 74 73 29 20 7b 0a 09 09 ched_certs) {...
1e8e0 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 .cackey_free_cer
1e8f0 74 73 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b ts(cackey_slots[
1e900 69 64 78 5d 2e 63 61 63 68 65 64 5f 63 65 72 74 idx].cached_cert
1e910 73 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b s, cackey_slots[
1e920 69 64 78 5d 2e 63 61 63 68 65 64 5f 63 65 72 74 idx].cached_cert
1e930 73 5f 63 6f 75 6e 74 2c 20 31 29 3b 0a 0a 09 09 s_count, 1);....
1e940 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 .cackey_slots[id
1e950 78 5d 2e 63 61 63 68 65 64 5f 63 65 72 74 73 20 x].cached_certs
1e960 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 0a 0a = NULL;...}..}..
1e970 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 .cackey_pcsc_dis
1e980 63 6f 6e 6e 65 63 74 28 29 3b 0a 0a 09 69 66 20 connect();...if
1e990 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d (cackey_pin_comm
1e9a0 61 6e 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 and != NULL) {..
1e9b0 09 66 72 65 65 28 63 61 63 6b 65 79 5f 70 69 6e .free(cackey_pin
1e9c0 5f 63 6f 6d 6d 61 6e 64 29 3b 0a 0a 09 09 63 61 _command);....ca
1e9d0 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 ckey_pin_command
1e9e0 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 69 66 = NULL;..}...if
1e9f0 20 28 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 (cackey_readers
1ea00 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79 20 21 3d _include_only !=
1ea10 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 72 65 65 28 NULL) {...free(
1ea20 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69 cackey_readers_i
1ea30 6e 63 6c 75 64 65 5f 6f 6e 6c 79 29 3b 0a 0a 09 nclude_only);...
1ea40 09 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f .cackey_readers_
1ea50 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79 20 3d 20 4e include_only = N
1ea60 55 4c 4c 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 ULL;..}...if (ca
1ea70 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63 ckey_readers_exc
1ea80 6c 75 64 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a lude != NULL) {.
1ea90 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 72 65 ..free(cackey_re
1eaa0 61 64 65 72 73 5f 65 78 63 6c 75 64 65 29 3b 0a aders_exclude);.
1eab0 0a 09 09 63 61 63 6b 65 79 5f 72 65 61 64 65 72 ...cackey_reader
1eac0 73 5f 65 78 63 6c 75 64 65 20 3d 20 4e 55 4c 4c s_exclude = NULL
1ead0 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 69 6e ;..}...cackey_in
1eae0 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a itialized = 0;..
1eaf0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1eb00 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
1eb10 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b CKR_OK (%i)", CK
1eb20 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 R_OK);...return(
1eb30 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 CKR_OK);.}..CK_D
1eb40 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 EFINE_FUNCTION(C
1eb50 4b 5f 52 56 2c 20 43 5f 47 65 74 49 6e 66 6f 29 K_RV, C_GetInfo)
1eb60 28 43 4b 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e (CK_INFO_PTR pIn
1eb70 66 6f 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b fo) {..static CK
1eb80 5f 55 54 46 38 43 48 41 52 20 6d 61 6e 75 66 61 _UTF8CHAR manufa
1eb90 63 74 75 72 65 72 49 44 5b 5d 20 3d 20 22 55 2e cturerID[] = "U.
1eba0 53 2e 20 47 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a S. Government";.
1ebb0 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 .static CK_UTF8C
1ebc0 48 41 52 20 6c 69 62 72 61 72 79 44 65 73 63 72 HAR libraryDescr
1ebd0 69 70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b iption[] = "CACK
1ebe0 65 79 22 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ey";...CACKEY_DE
1ebf0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
1ec00 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e ed.");...if (pIn
1ec10 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 fo == NULL) {...
1ec20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1ec30 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 NTF("Error. pInf
1ec40 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 o is NULL.");...
1ec50 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 .return(CKR_ARGU
1ec60 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a MENTS_BAD);..}..
1ec70 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 .if (!cackey_ini
1ec80 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 tialized) {...CA
1ec90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
1eca0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 F("Error. Not i
1ecb0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a nitialized.");..
1ecc0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 ..return(CKR_CRY
1ecd0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 PTOKI_NOT_INITIA
1ece0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e LIZED);..}...pIn
1ecf0 66 6f 2d 3e 63 72 79 70 74 6f 6b 69 56 65 72 73 fo->cryptokiVers
1ed00 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43 41 ion.major = ((CA
1ed10 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 CKEY_CRYPTOKI_VE
1ed20 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 31 RSION_CODE) >> 1
1ed30 36 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6) & 0xff;..pInf
1ed40 6f 2d 3e 63 72 79 70 74 6f 6b 69 56 65 72 73 69 o->cryptokiVersi
1ed50 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41 43 on.minor = ((CAC
1ed60 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 KEY_CRYPTOKI_VER
1ed70 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38 29 SION_CODE) >> 8)
1ed80 20 26 20 30 78 66 66 3b 0a 0a 09 6d 65 6d 73 65 & 0xff;...memse
1ed90 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 t(pInfo->manufac
1eda0 74 75 72 65 72 49 44 2c 20 27 20 27 2c 20 73 69 turerID, ' ', si
1edb0 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 zeof(pInfo->manu
1edc0 66 61 63 74 75 72 65 72 49 44 29 29 3b 0a 09 6d facturerID));..m
1edd0 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e emcpy(pInfo->man
1ede0 75 66 61 63 74 75 72 65 72 49 44 2c 20 6d 61 6e ufacturerID, man
1edf0 75 66 61 63 74 75 72 65 72 49 44 2c 20 73 69 7a ufacturerID, siz
1ee00 65 6f 66 28 6d 61 6e 75 66 61 63 74 75 72 65 72 eof(manufacturer
1ee10 49 44 29 20 2d 20 31 29 3b 0a 0a 09 70 49 6e 66 ID) - 1);...pInf
1ee20 6f 2d 3e 66 6c 61 67 73 20 3d 20 30 78 30 30 3b o->flags = 0x00;
1ee30 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d ...memset(pInfo-
1ee40 3e 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74 >libraryDescript
1ee50 69 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 ion, ' ', sizeof
1ee60 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 (pInfo->libraryD
1ee70 65 73 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d escription));..m
1ee80 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 69 62 emcpy(pInfo->lib
1ee90 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c raryDescription,
1eea0 20 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74 libraryDescript
1eeb0 69 6f 6e 2c 20 73 69 7a 65 6f 66 28 6c 69 62 72 ion, sizeof(libr
1eec0 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 29 20 aryDescription)
1eed0 2d 20 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 6c - 1);...pInfo->l
1eee0 69 62 72 61 72 79 56 65 72 73 69 6f 6e 2e 6d 61 ibraryVersion.ma
1eef0 6a 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 jor = (cackey_ge
1ef00 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 tversion() >> 16
1ef10 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f ) & 0xff;..pInfo
1ef20 2d 3e 6c 69 62 72 61 72 79 56 65 72 73 69 6f 6e ->libraryVersion
1ef30 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 .minor = (cackey
1ef40 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e _getversion() >>
1ef50 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 43 41 8) & 0xff;...CA
1ef60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
1ef70 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 F("Returning CKR
1ef80 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f _OK (%i)", CKR_O
1ef90 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 K);...return(CKR
1efa0 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 50 _OK);.}../*. * P
1efb0 72 6f 63 65 73 73 20 6c 69 73 74 20 6f 66 20 72 rocess list of r
1efc0 65 61 64 65 72 73 2c 20 61 6e 64 20 63 72 65 61 eaders, and crea
1efd0 74 65 20 6d 61 70 70 69 6e 67 20 62 65 74 77 65 te mapping betwe
1efe0 65 6e 20 72 65 61 64 65 72 20 6e 61 6d 65 20 61 en reader name a
1eff0 6e 64 20 73 6c 6f 74 20 49 44 0a 20 2a 2f 0a 43 nd slot ID. */.C
1f000 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f K_DEFINE_FUNCTIO
1f010 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c N(CK_RV, C_GetSl
1f020 6f 74 4c 69 73 74 29 28 43 4b 5f 42 42 4f 4f 4c otList)(CK_BBOOL
1f030 20 74 6f 6b 65 6e 50 72 65 73 65 6e 74 2c 20 43 tokenPresent, C
1f040 4b 5f 53 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53 K_SLOT_ID_PTR pS
1f050 6c 6f 74 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e lotList, CK_ULON
1f060 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20 G_PTR pulCount)
1f070 7b 0a 09 73 74 61 74 69 63 20 69 6e 74 20 66 69 {..static int fi
1f080 72 73 74 5f 63 61 6c 6c 20 3d 20 31 3b 0a 09 69 rst_call = 1;..i
1f090 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b nt mutex_retval;
1f0a0 0a 09 69 6e 74 20 70 63 73 63 5f 63 6f 6e 6e 65 ..int pcsc_conne
1f0b0 63 74 5f 72 65 74 3b 0a 09 43 4b 5f 55 4c 4f 4e ct_ret;..CK_ULON
1f0c0 47 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63 6f G count, slot_co
1f0d0 75 6e 74 20 3d 20 30 2c 20 63 75 72 72 73 6c 6f unt = 0, currslo
1f0e0 74 2c 20 73 6c 6f 74 5f 69 64 78 3b 0a 09 63 68 t, slot_idx;..ch
1f0f0 61 72 20 2a 70 63 73 63 5f 72 65 61 64 65 72 73 ar *pcsc_readers
1f100 2c 20 2a 70 63 73 63 5f 72 65 61 64 65 72 73 5f , *pcsc_readers_
1f110 73 2c 20 2a 70 63 73 63 5f 72 65 61 64 65 72 73 s, *pcsc_readers
1f120 5f 65 3b 0a 09 63 68 61 72 20 2a 72 65 61 64 65 _e;..char *reade
1f130 72 5f 63 68 65 63 6b 5f 70 61 74 74 65 72 6e 3b r_check_pattern;
1f140 0a 09 44 57 4f 52 44 20 70 63 73 63 5f 72 65 61 ..DWORD pcsc_rea
1f150 64 65 72 73 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 ders_len;..LONG
1f160 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 scard_listreader
1f170 73 5f 72 65 74 3b 0a 09 73 69 7a 65 5f 74 20 63 s_ret;..size_t c
1f180 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 3b 0a urr_reader_len;.
1f190 09 69 6e 74 20 73 6c 6f 74 5f 72 65 73 65 74 3b .int slot_reset;
1f1a0 0a 09 69 6e 74 20 69 6e 63 6c 75 64 65 5f 72 65 ..int include_re
1f1b0 61 64 65 72 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 ader;...CACKEY_D
1f1c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
1f1d0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 75 led.");...if (pu
1f1e0 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 lCount == NULL)
1f1f0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
1f200 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
1f210 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e 55 4c 4c pulCount is NULL
1f220 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
1f230 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 KR_ARGUMENTS_BAD
1f240 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 );..}...if (!cac
1f250 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 key_initialized)
1f260 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
1f270 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
1f280 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 Not initialize
1f290 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
1f2a0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 CKR_CRYPTOKI_NOT
1f2b0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 _INITIALIZED);..
1f2c0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c }...mutex_retval
1f2d0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f = cackey_mutex_
1f2e0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
1f2f0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 ock);..if (mutex
1f300 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a _retval != 0) {.
1f310 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1f320 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c RINTF("Error. L
1f330 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 ocking failed.")
1f340 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
1f350 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a GENERAL_ERROR);.
1f360 09 7d 0a 0a 09 2f 2a 20 43 6c 65 61 72 20 6c 69 .}.../* Clear li
1f370 73 74 20 6f 66 20 73 6c 6f 74 73 20 2a 2f 0a 09 st of slots */..
1f380 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 30 3b 0a slot_reset = 0;.
1f390 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 29 20 .if (pSlotList)
1f3a0 7b 0a 09 09 69 66 20 28 66 69 72 73 74 5f 63 61 {...if (first_ca
1f3b0 6c 6c 29 20 7b 0a 09 09 09 66 69 72 73 74 5f 63 ll) {....first_c
1f3c0 61 6c 6c 20 3d 20 30 3b 0a 0a 09 09 09 73 6c 6f all = 0;.....slo
1f3d0 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 09 7d t_reset = 1;...}
1f3e0 0a 0a 09 09 2f 2a 20 49 66 20 61 6e 79 20 6f 66 ..../* If any of
1f3f0 20 74 68 65 20 73 6c 6f 74 73 20 68 61 76 65 20 the slots have
1f400 62 65 65 6e 20 72 65 73 65 74 20 74 68 65 6e 20 been reset then
1f410 70 75 72 67 65 20 61 6c 6c 20 69 6e 66 6f 72 6d purge all inform
1f420 61 74 69 6f 6e 20 61 6e 64 20 63 68 65 63 6b 20 ation and check
1f430 61 67 61 69 6e 20 2a 2f 0a 09 09 66 6f 72 20 28 again */...for (
1f440 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75 currslot = 0; cu
1f450 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 rrslot < (sizeof
1f460 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f (cackey_slots) /
1f470 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 sizeof(cackey_s
1f480 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73 lots[0])); currs
1f490 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28 lot++) {....if (
1f4a0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 cackey_slots[cur
1f4b0 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 29 rslot].internal)
1f4c0 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b {.....continue;
1f4d0 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 21 63 ....}.....if (!c
1f4e0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 ackey_slots[curr
1f4f0 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a slot].active) {.
1f500 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 ....continue;...
1f510 09 7d 0a 0a 09 09 09 69 66 20 28 63 61 63 6b 65 .}.....if (cacke
1f520 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 y_slots[currslot
1f530 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a ].slot_reset) {.
1f540 09 09 09 09 73 6c 6f 74 5f 72 65 73 65 74 20 3d ....slot_reset =
1f550 20 31 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 1;......break;.
1f560 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 ...}...}....if (
1f570 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09 09 slot_reset) {...
1f580 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1f590 49 4e 54 46 28 22 50 75 72 67 69 6e 67 20 61 6c INTF("Purging al
1f5a0 6c 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69 l slot informati
1f5b0 6f 6e 2e 22 29 3b 0a 0a 09 09 09 2f 2a 20 4f 6e on.");...../* On
1f5c0 6c 79 20 75 70 64 61 74 65 20 74 68 65 20 6c 69 ly update the li
1f5d0 73 74 20 6f 66 20 73 6c 6f 74 73 20 69 66 20 77 st of slots if w
1f5e0 65 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 62 e are actually b
1f5f0 65 69 6e 67 20 73 75 70 70 6c 79 20 74 68 65 20 eing supply the
1f600 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e slot information
1f610 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c */....cackey_sl
1f620 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 ots_disconnect_a
1f630 6c 6c 28 29 3b 0a 0a 09 09 09 66 6f 72 20 28 63 ll();.....for (c
1f640 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75 72 urrslot = 0; cur
1f650 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 rslot < (sizeof(
1f660 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 cackey_slots) /
1f670 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c sizeof(cackey_sl
1f680 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c ots[0])); currsl
1f690 6f 74 2b 2b 29 20 7b 0a 09 09 09 09 69 66 20 28 ot++) {.....if (
1f6a0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 cackey_slots[cur
1f6b0 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 29 rslot].internal)
1f6c0 20 7b 0a 09 09 09 09 09 63 6f 6e 74 69 6e 75 65 {......continue
1f6d0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 ;.....}......if
1f6e0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 (cackey_slots[cu
1f6f0 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 rrslot].pcsc_rea
1f700 64 65 72 29 20 7b 0a 09 09 09 09 09 66 72 65 65 der) {......free
1f710 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 (cackey_slots[cu
1f720 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 rrslot].pcsc_rea
1f730 64 65 72 29 3b 0a 0a 09 09 09 09 09 63 61 63 6b der);.......cack
1f740 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f ey_slots[currslo
1f750 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d t].pcsc_reader =
1f760 20 4e 55 4c 4c 3b 0a 09 09 09 09 7d 0a 0a 09 09 NULL;.....}....
1f770 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f ..if (cackey_slo
1f780 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 ts[currslot].lab
1f790 65 6c 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28 el) {......free(
1f7a0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 cackey_slots[cur
1f7b0 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 29 3b 0a 0a rslot].label);..
1f7c0 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 .....cackey_slot
1f7d0 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 s[currslot].labe
1f7e0 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 7d 0a l = NULL;.....}.
1f7f0 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 .....cackey_slot
1f800 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 s[currslot].acti
1f810 76 65 20 3d 20 30 3b 0a 09 09 09 7d 0a 09 09 7d ve = 0;....}...}
1f820 20 65 6c 73 65 20 7b 0a 09 09 09 0a 09 09 7d 0a else {.......}.
1f830 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e .}.../* Determin
1f840 65 20 6c 69 73 74 20 6f 66 20 72 65 61 64 65 72 e list of reader
1f850 73 20 2a 2f 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 s */..pcsc_conne
1f860 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f ct_ret = cackey_
1f870 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a pcsc_connect();.
1f880 2f 2a 20 58 58 58 3a 20 43 41 4e 20 48 41 4e 47 /* XXX: CAN HANG
1f890 20 48 45 52 45 20 21 20 2a 2f 0a 09 69 66 20 28 HERE ! */..if (
1f8a0 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 pcsc_connect_ret
1f8b0 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f != CACKEY_PCSC_
1f8c0 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 S_OK) {...CACKEY
1f8d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 _DEBUG_PRINTF("C
1f8e0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 50 43 2f onnection to PC/
1f8f0 53 43 20 66 61 69 6c 65 64 2c 20 61 73 73 75 6d SC failed, assum
1f900 69 6e 67 20 6e 6f 20 73 6c 6f 74 73 22 29 3b 0a ing no slots");.
1f910 0a 09 09 73 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20 ...slot_count =
1f920 30 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 70 0;..} else {...p
1f930 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 20 csc_readers_len
1f940 3d 20 30 3b 0a 0a 09 09 73 63 61 72 64 5f 6c 69 = 0;....scard_li
1f950 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d 20 streaders_ret =
1f960 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 SCardListReaders
1f970 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 (*cackey_pcsc_ha
1f980 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c ndle, NULL, NULL
1f990 2c 20 26 70 63 73 63 5f 72 65 61 64 65 72 73 5f , &pcsc_readers_
1f9a0 6c 65 6e 29 3b 0a 0a 09 09 69 66 20 28 73 63 61 len);....if (sca
1f9b0 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 rd_listreaders_r
1f9c0 65 74 20 3d 3d 20 53 43 41 52 44 5f 46 5f 43 4f et == SCARD_F_CO
1f9d0 4d 4d 5f 45 52 52 4f 52 29 20 7b 0a 09 09 09 43 MM_ERROR) {....C
1f9e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1f9f0 54 46 28 22 45 72 72 6f 72 2e 20 53 43 61 72 64 TF("Error. SCard
1fa00 4c 69 73 74 52 65 61 64 65 72 73 28 29 20 72 65 ListReaders() re
1fa10 74 75 72 6e 65 64 20 53 43 41 52 44 5f 46 5f 43 turned SCARD_F_C
1fa20 4f 4d 4d 5f 45 52 52 4f 52 2c 20 61 73 73 75 6d OMM_ERROR, assum
1fa30 69 6e 67 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 ing Connection t
1fa40 6f 20 50 43 2f 53 43 20 77 65 6e 74 20 61 77 61 o PC/SC went awa
1fa50 79 2e 20 52 65 63 6f 6e 6e 65 63 74 69 6e 67 2e y. Reconnecting.
1fa60 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 70 ");.....cackey_p
1fa70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 29 csc_disconnect()
1fa80 3b 0a 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63 ;....cackey_pcsc
1fa90 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 0a 09 09 09 _connect();.....
1faa0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1fab0 4e 54 46 28 22 54 72 79 69 6e 67 20 53 43 61 72 NTF("Trying SCar
1fac0 64 4c 69 73 74 52 65 61 64 65 72 73 28 29 20 61 dListReaders() a
1fad0 67 61 69 6e 22 29 3b 0a 09 09 09 73 63 61 72 64 gain");....scard
1fae0 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 _listreaders_ret
1faf0 20 3d 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 = SCardListRead
1fb00 65 72 73 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 ers(*cackey_pcsc
1fb10 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 4e _handle, NULL, N
1fb20 55 4c 4c 2c 20 26 70 63 73 63 5f 72 65 61 64 65 ULL, &pcsc_reade
1fb30 72 73 5f 6c 65 6e 29 3b 0a 09 09 7d 0a 0a 09 09 rs_len);...}....
1fb40 69 66 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65 if (scard_listre
1fb50 61 64 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41 aders_ret == SCA
1fb60 52 44 5f 53 5f 53 55 43 43 45 53 53 20 26 26 20 RD_S_SUCCESS &&
1fb70 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e pcsc_readers_len
1fb80 20 21 3d 20 30 29 20 7b 0a 09 09 09 70 63 73 63 != 0) {....pcsc
1fb90 5f 72 65 61 64 65 72 73 20 3d 20 6d 61 6c 6c 6f _readers = mallo
1fba0 63 28 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c c(pcsc_readers_l
1fbb0 65 6e 29 3b 0a 09 09 09 70 63 73 63 5f 72 65 61 en);....pcsc_rea
1fbc0 64 65 72 73 5f 73 20 3d 20 70 63 73 63 5f 72 65 ders_s = pcsc_re
1fbd0 61 64 65 72 73 3b 0a 0a 09 09 09 73 63 61 72 64 aders;.....scard
1fbe0 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 _listreaders_ret
1fbf0 20 3d 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 = SCardListRead
1fc00 65 72 73 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 ers(*cackey_pcsc
1fc10 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 70 _handle, NULL, p
1fc20 63 73 63 5f 72 65 61 64 65 72 73 2c 20 26 70 63 csc_readers, &pc
1fc30 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b sc_readers_len);
1fc40 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f 6c 69 ....if (scard_li
1fc50 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d 3d streaders_ret ==
1fc60 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 SCARD_S_SUCCESS
1fc70 29 20 7b 0a 09 09 09 09 70 63 73 63 5f 72 65 61 ) {.....pcsc_rea
1fc80 64 65 72 73 5f 65 20 3d 20 70 63 73 63 5f 72 65 ders_e = pcsc_re
1fc90 61 64 65 72 73 20 2b 20 70 63 73 63 5f 72 65 61 aders + pcsc_rea
1fca0 64 65 72 73 5f 6c 65 6e 3b 0a 0a 09 09 09 09 2f ders_len;....../
1fcb0 2a 20 53 74 61 72 74 20 77 69 74 68 20 53 6c 6f * Start with Slo
1fcc0 74 20 49 44 20 31 2c 20 74 6f 20 61 76 6f 69 64 t ID 1, to avoid
1fcd0 20 61 20 62 75 67 20 69 6e 20 47 44 4d 20 6f 6e a bug in GDM on
1fce0 20 52 48 45 4c 20 2a 2f 0a 09 09 09 09 2f 2a 20 RHEL */...../*
1fcf0 42 75 67 20 35 39 34 39 31 31 3a 20 68 74 74 70 Bug 594911: http
1fd00 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e 72 65 64 s://bugzilla.red
1fd10 68 61 74 2e 63 6f 6d 2f 73 68 6f 77 5f 62 75 67 hat.com/show_bug
1fd20 2e 63 67 69 3f 69 64 3d 35 39 34 39 31 31 20 2a .cgi?id=594911 *
1fd30 2f 0a 09 09 09 09 63 75 72 72 73 6c 6f 74 20 3d /.....currslot =
1fd40 20 31 3b 0a 09 09 09 09 73 6c 6f 74 5f 63 6f 75 1;.....slot_cou
1fd50 6e 74 20 3d 20 30 3b 0a 09 09 09 09 77 68 69 6c nt = 0;.....whil
1fd60 65 20 28 70 63 73 63 5f 72 65 61 64 65 72 73 20 e (pcsc_readers
1fd70 3c 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65 < pcsc_readers_e
1fd80 29 20 7b 0a 09 09 09 09 09 2f 2a 20 46 69 6e 64 ) {....../* Find
1fd90 20 6e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 next available
1fda0 73 6c 6f 74 20 2a 2f 0a 09 09 09 09 09 66 6f 72 slot */......for
1fdb0 20 28 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20 28 (; currslot < (
1fdc0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c sizeof(cackey_sl
1fdd0 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 ots) / sizeof(ca
1fde0 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b ckey_slots[0]));
1fdf0 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 currslot++) {..
1fe00 09 09 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 .....if (!cackey
1fe10 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d _slots[currslot]
1fe20 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09 09 .active) {......
1fe30 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 09 7d ..break;.......}
1fe40 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 63 75 ......}.......cu
1fe50 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 3d 20 rr_reader_len =
1fe60 73 74 72 6c 65 6e 28 70 63 73 63 5f 72 65 61 64 strlen(pcsc_read
1fe70 65 72 73 29 3b 0a 0a 09 09 09 09 09 69 66 20 28 ers);.......if (
1fe80 28 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b 20 (pcsc_readers +
1fe90 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 29 curr_reader_len)
1fea0 20 3e 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f > pcsc_readers_
1feb0 65 29 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b e) {.......break
1fec0 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 69 ;......}.......i
1fed0 66 20 28 63 75 72 72 5f 72 65 61 64 65 72 5f 6c f (curr_reader_l
1fee0 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 09 en == 0) {......
1fef0 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a .break;......}..
1ff00 09 09 09 09 09 69 66 20 28 63 75 72 72 73 6c 6f .....if (currslo
1ff10 74 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 t >= (sizeof(cac
1ff20 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a key_slots) / siz
1ff30 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 eof(cackey_slots
1ff40 5b 30 5d 29 29 29 20 7b 0a 09 09 09 09 09 09 43 [0]))) {.......C
1ff50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1ff60 54 46 28 22 46 6f 75 6e 64 20 6d 6f 72 65 20 72 TF("Found more r
1ff70 65 61 64 65 72 73 20 74 68 61 6e 20 73 6c 6f 74 eaders than slot
1ff80 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 21 s are available!
1ff90 22 29 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b ");........break
1ffa0 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 43 ;......}.......C
1ffb0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1ffc0 54 46 28 22 46 6f 75 6e 64 20 72 65 61 64 65 72 TF("Found reader
1ffd0 3a 20 25 73 20 28 63 75 72 72 73 6c 6f 74 20 3d : %s (currslot =
1ffe0 20 25 6c 75 29 22 2c 20 70 63 73 63 5f 72 65 61 %lu)", pcsc_rea
1fff0 64 65 72 73 2c 20 28 75 6e 73 69 67 6e 65 64 20 ders, (unsigned
20000 6c 6f 6e 67 29 20 63 75 72 72 73 6c 6f 74 29 3b long) currslot);
20010 0a 0a 09 09 09 09 09 69 66 20 28 63 61 63 6b 65 .......if (cacke
20020 79 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c 75 64 y_readers_includ
20030 65 5f 6f 6e 6c 79 20 21 3d 20 4e 55 4c 4c 29 20 e_only != NULL)
20040 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 {.......CACKEY_D
20050 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 73 6b EBUG_PRINTF("Ask
20060 65 64 20 74 6f 20 69 6e 63 6c 75 64 65 20 6f 6e ed to include on
20070 6c 79 20 72 65 61 64 65 72 73 20 6d 61 74 63 68 ly readers match
20080 69 6e 67 3a 20 25 73 22 2c 20 63 61 63 6b 65 79 ing: %s", cackey
20090 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c 75 64 65 _readers_include
200a0 5f 6f 6e 6c 79 29 3b 0a 0a 09 09 09 09 09 09 69 _only);........i
200b0 6e 63 6c 75 64 65 5f 72 65 61 64 65 72 20 3d 20 nclude_reader =
200c0 30 3b 0a 09 09 09 09 09 09 72 65 61 64 65 72 5f 0;.......reader_
200d0 63 68 65 63 6b 5f 70 61 74 74 65 72 6e 20 3d 20 check_pattern =
200e0 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69 cackey_readers_i
200f0 6e 63 6c 75 64 65 5f 6f 6e 6c 79 3b 0a 09 09 09 nclude_only;....
20100 09 09 7d 20 65 6c 73 65 20 69 66 20 28 63 61 63 ..} else if (cac
20110 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63 6c key_readers_excl
20120 75 64 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ude != NULL) {..
20130 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
20140 47 5f 50 52 49 4e 54 46 28 22 41 73 6b 65 64 20 G_PRINTF("Asked
20150 74 6f 20 65 78 63 6c 75 64 65 20 72 65 61 64 65 to exclude reade
20160 72 73 20 6d 61 74 63 68 69 6e 67 3a 20 25 73 22 rs matching: %s"
20170 2c 20 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 , cackey_readers
20180 5f 65 78 63 6c 75 64 65 29 3b 0a 0a 09 09 09 09 _exclude);......
20190 09 09 69 6e 63 6c 75 64 65 5f 72 65 61 64 65 72 ..include_reader
201a0 20 3d 20 31 3b 0a 09 09 09 09 09 09 72 65 61 64 = 1;.......read
201b0 65 72 5f 63 68 65 63 6b 5f 70 61 74 74 65 72 6e er_check_pattern
201c0 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 65 72 = cackey_reader
201d0 73 5f 65 78 63 6c 75 64 65 3b 0a 09 09 09 09 09 s_exclude;......
201e0 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 69 } else {.......i
201f0 6e 63 6c 75 64 65 5f 72 65 61 64 65 72 20 3d 20 nclude_reader =
20200 31 3b 0a 09 09 09 09 09 09 72 65 61 64 65 72 5f 1;.......reader_
20210 63 68 65 63 6b 5f 70 61 74 74 65 72 6e 20 3d 20 check_pattern =
20220 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 NULL;......}....
20230 09 09 09 69 66 20 28 72 65 61 64 65 72 5f 63 68 ...if (reader_ch
20240 65 63 6b 5f 70 61 74 74 65 72 6e 20 21 3d 20 4e eck_pattern != N
20250 55 4c 4c 29 20 7b 0a 09 09 09 09 09 09 69 66 20 ULL) {.......if
20260 28 73 74 72 73 74 72 28 70 63 73 63 5f 72 65 61 (strstr(pcsc_rea
20270 64 65 72 73 2c 20 72 65 61 64 65 72 5f 63 68 65 ders, reader_che
20280 63 6b 5f 70 61 74 74 65 72 6e 29 20 21 3d 20 4e ck_pattern) != N
20290 55 4c 4c 29 20 7b 0a 09 09 09 09 09 09 09 43 41 ULL) {........CA
202a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
202b0 46 28 22 54 68 69 73 20 72 65 61 64 65 72 20 6d F("This reader m
202c0 61 74 63 68 65 64 20 74 68 65 20 70 61 74 74 65 atched the patte
202d0 72 6e 2e 22 29 3b 0a 09 09 09 09 09 09 0a 09 09 rn.");..........
202e0 09 09 09 09 09 69 6e 63 6c 75 64 65 5f 72 65 61 .....include_rea
202f0 64 65 72 20 3d 20 21 69 6e 63 6c 75 64 65 5f 72 der = !include_r
20300 65 61 64 65 72 3b 0a 09 09 09 09 09 09 7d 0a 09 eader;.......}..
20310 09 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 ....}.......if (
20320 69 6e 63 6c 75 64 65 5f 72 65 61 64 65 72 20 21 include_reader !
20330 3d 20 31 29 20 7b 0a 09 09 09 09 09 09 43 41 43 = 1) {.......CAC
20340 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
20350 28 22 53 6b 69 70 70 69 6e 67 20 74 68 69 73 20 ("Skipping this
20360 72 65 61 64 65 72 2e 22 29 3b 0a 0a 09 09 09 09 reader.");......
20370 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b ..pcsc_readers +
20380 3d 20 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 = curr_reader_le
20390 6e 20 2b 20 31 3b 0a 0a 09 09 09 09 09 09 63 6f n + 1;........co
203a0 6e 74 69 6e 75 65 3b 0a 09 09 09 09 09 7d 0a 0a ntinue;......}..
203b0 09 09 09 09 09 2f 2a 20 4f 6e 6c 79 20 75 70 64 ...../* Only upd
203c0 61 74 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20 ate the list of
203d0 73 6c 6f 74 73 20 69 66 20 77 65 20 61 72 65 20 slots if we are
203e0 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 61 actually being a
203f0 73 6b 65 64 20 73 75 70 70 6c 79 20 74 68 65 20 sked supply the
20400 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e slot information
20410 20 2a 2f 0a 09 09 09 09 09 69 66 20 28 70 53 6c */......if (pSl
20420 6f 74 4c 69 73 74 29 20 7b 0a 09 09 09 09 09 09 otList) {.......
20430 69 66 20 28 73 6c 6f 74 5f 72 65 73 65 74 29 20 if (slot_reset)
20440 7b 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f {........cackey_
20450 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e slots[currslot].
20460 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 09 09 09 active = 1;.....
20470 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b ...cackey_slots[
20480 63 75 72 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e currslot].intern
20490 61 6c 20 3d 20 30 3b 0a 09 09 09 09 09 09 09 63 al = 0;........c
204a0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 ackey_slots[curr
204b0 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 slot].pcsc_reade
204c0 72 20 3d 20 73 74 72 64 75 70 28 70 63 73 63 5f r = strdup(pcsc_
204d0 72 65 61 64 65 72 73 29 3b 0a 09 09 09 09 09 09 readers);.......
204e0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 .cackey_slots[cu
204f0 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 63 61 72 rrslot].pcsc_car
20500 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b d_connected = 0;
20510 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 ........cackey_s
20520 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 lots[currslot].t
20530 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 ransaction_depth
20540 20 3d 20 30 3b 0a 09 09 09 09 09 09 09 63 61 63 = 0;........cac
20550 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c key_slots[currsl
20560 6f 74 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f ot].transaction_
20570 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 need_hw_lock = 0
20580 3b 0a 09 09 09 09 09 09 09 69 66 20 28 63 61 63 ;........if (cac
20590 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 key_pin_command
205a0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 09 == NULL) {......
205b0 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b ...cackey_slots[
205c0 63 75 72 72 73 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f currslot].token_
205d0 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 flags = CKF_LOGI
205e0 4e 5f 52 45 51 55 49 52 45 44 3b 0a 09 09 09 09 N_REQUIRED;.....
205f0 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 ...} else {.....
20600 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 ....cackey_slots
20610 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 6f 6b 65 6e [currslot].token
20620 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09 09 09 09 _flags = 0;.....
20630 09 09 09 7d 0a 09 09 09 09 09 09 09 63 61 63 6b ...}........cack
20640 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f ey_slots[currslo
20650 74 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b t].label = NULL;
20660 0a 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f .........cackey_
20670 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 mark_slot_reset(
20680 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 &cackey_slots[cu
20690 72 72 73 6c 6f 74 5d 29 3b 0a 09 09 09 09 09 09 rrslot]);.......
206a0 7d 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a }......} else {.
206b0 09 09 09 09 09 09 69 66 20 28 21 63 61 63 6b 65 ......if (!cacke
206c0 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 y_slots[currslot
206d0 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09 ].active) {.....
206e0 09 09 09 2f 2a 20 41 72 74 69 66 69 63 69 61 6c .../* Artificial
206f0 6c 79 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 ly increase the
20700 6e 75 6d 62 65 72 20 6f 66 20 61 63 74 69 76 65 number of active
20710 20 73 6c 6f 74 73 20 62 79 20 77 68 61 74 20 77 slots by what w
20720 69 6c 6c 20 62 65 63 6f 6d 65 20 61 63 74 69 76 ill become activ
20730 65 20 2a 2f 0a 09 09 09 09 09 09 09 43 41 43 4b e */........CACK
20740 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
20750 22 46 6f 75 6e 64 20 69 6e 2d 61 63 74 69 76 65 "Found in-active
20760 20 73 6c 6f 74 20 25 6c 75 2c 20 62 75 74 20 69 slot %lu, but i
20770 74 20 77 69 6c 6c 20 62 65 20 61 63 74 69 76 65 t will be active
20780 20 61 66 74 65 72 20 61 20 72 65 73 65 74 20 2d after a reset -
20790 2d 20 6d 61 72 6b 69 6e 67 20 61 73 20 61 63 74 - marking as act
207a0 69 76 65 20 66 6f 72 20 61 63 63 6f 75 6e 74 69 ive for accounti
207b0 6e 67 20 70 75 72 70 6f 73 65 73 22 2c 20 28 75 ng purposes", (u
207c0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 nsigned long) cu
207d0 72 72 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 09 09 rrslot);........
207e0 09 73 6c 6f 74 5f 63 6f 75 6e 74 2b 2b 3b 0a 09 .slot_count++;..
207f0 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 0a 09 09 .....}......}...
20800 09 09 09 63 75 72 72 73 6c 6f 74 2b 2b 3b 0a 0a ...currslot++;..
20810 09 09 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 .....pcsc_reader
20820 73 20 2b 3d 20 63 75 72 72 5f 72 65 61 64 65 72 s += curr_reader
20830 5f 6c 65 6e 20 2b 20 31 3b 0a 09 09 09 09 7d 0a _len + 1;.....}.
20840 0a 09 09 09 09 66 6f 72 20 28 63 75 72 72 73 6c .....for (currsl
20850 6f 74 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74 ot = 0; currslot
20860 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 < (sizeof(cacke
20870 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f y_slots) / sizeo
20880 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 f(cackey_slots[0
20890 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29 ])); currslot++)
208a0 20 7b 0a 09 09 09 09 09 69 66 20 28 63 61 63 6b {......if (cack
208b0 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f ey_slots[currslo
208c0 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 t].active) {....
208d0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
208e0 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 61 63 PRINTF("Found ac
208f0 74 69 76 65 20 73 6c 6f 74 20 25 6c 75 2c 20 72 tive slot %lu, r
20900 65 61 64 65 72 20 3d 20 25 73 22 2c 20 28 75 6e eader = %s", (un
20910 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 signed long) cur
20920 72 73 6c 6f 74 2c 20 63 61 63 6b 65 79 5f 73 6c rslot, cackey_sl
20930 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 ots[currslot].pc
20940 73 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09 09 09 sc_reader);.....
20950 09 09 09 73 6c 6f 74 5f 63 6f 75 6e 74 2b 2b 3b ...slot_count++;
20960 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 ......}.....}...
20970 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 .} else {.....CA
20980 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
20990 46 28 22 53 65 63 6f 6e 64 20 63 61 6c 6c 20 74 F("Second call t
209a0 6f 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 o SCardListReade
209b0 72 73 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 rs failed, retur
209c0 6e 20 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45 n %s/%li", CACKE
209d0 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 Y_DEBUG_FUNC_SCA
209e0 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 RDERR_TO_STR(sca
209f0 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 rd_listreaders_r
20a00 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 et), (long) scar
20a10 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 d_listreaders_re
20a20 74 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 66 72 65 t);....}.....fre
20a30 65 28 70 63 73 63 5f 72 65 61 64 65 72 73 5f 73 e(pcsc_readers_s
20a40 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 );...} else {...
20a50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
20a60 49 4e 54 46 28 22 46 69 72 73 74 20 63 61 6c 6c INTF("First call
20a70 20 74 6f 20 53 43 61 72 64 4c 69 73 74 52 65 61 to SCardListRea
20a80 64 65 72 73 20 66 61 69 6c 65 64 2c 20 72 65 74 ders failed, ret
20a90 75 72 6e 20 25 73 2f 25 6c 69 22 2c 20 43 41 43 urn %s/%li", CAC
20aa0 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 KEY_DEBUG_FUNC_S
20ab0 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 CARDERR_TO_STR(s
20ac0 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 card_listreaders
20ad0 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 _ret), (long) sc
20ae0 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f ard_listreaders_
20af0 72 65 74 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d ret);...}..}...m
20b00 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 utex_retval = ca
20b10 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 ckey_mutex_unloc
20b20 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
20b30 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 );..if (mutex_re
20b40 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 tval != 0) {...C
20b50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
20b60 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f TF("Error. Unlo
20b70 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b cking failed.");
20b80 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 ....return(CKR_G
20b90 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 ENERAL_ERROR);..
20ba0 7d 0a 0a 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 }...if (pSlotLis
20bb0 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a t == NULL) {...*
20bc0 70 75 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f pulCount = slot_
20bd0 63 6f 75 6e 74 3b 0a 0a 09 09 43 41 43 4b 45 59 count;....CACKEY
20be0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
20bf0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 eturning CKR_OK
20c00 28 25 69 29 2e 20 20 46 6f 75 6e 64 20 25 6c 75 (%i). Found %lu
20c10 20 72 65 61 64 65 72 73 2c 20 62 75 74 20 6e 6f readers, but no
20c20 74 20 73 74 6f 72 69 6e 67 20 49 44 73 20 28 70 t storing IDs (p
20c30 53 6c 6f 74 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c SlotList == NULL
20c40 29 22 2c 20 43 4b 52 5f 4f 4b 2c 20 28 75 6e 73 )", CKR_OK, (uns
20c50 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 6c 6f 74 igned long) slot
20c60 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75 _count);....retu
20c70 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a rn(CKR_OK);..}..
20c80 09 63 6f 75 6e 74 20 3d 20 2a 70 75 6c 43 6f 75 .count = *pulCou
20c90 6e 74 3b 0a 09 69 66 20 28 63 6f 75 6e 74 20 3c nt;..if (count <
20ca0 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 20 7b 0a 09 slot_count) {..
20cb0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
20cc0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 55 73 65 INTF("Error. Use
20cd0 72 20 61 6c 6c 6f 63 61 74 65 64 20 25 6c 75 20 r allocated %lu
20ce0 65 6e 74 72 69 65 73 2c 20 62 75 74 20 77 65 20 entries, but we
20cf0 68 61 76 65 20 25 6c 75 20 65 6e 74 72 69 65 73 have %lu entries
20d00 2e 22 2c 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f .", count, slot_
20d10 63 6f 75 6e 74 29 3b 0a 0a 09 09 43 41 43 4b 45 count);....CACKE
20d20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
20d30 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 42 55 Returning CKR_BU
20d40 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 22 29 FFER_TOO_SMALL")
20d50 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
20d60 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c BUFFER_TOO_SMALL
20d70 29 3b 09 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 );...}...mutex_r
20d80 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d etval = cackey_m
20d90 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 utex_lock(cackey
20da0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 _biglock);..if (
20db0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 mutex_retval !=
20dc0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 0) {...CACKEY_DE
20dd0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
20de0 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c r. Locking fail
20df0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
20e00 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 (CKR_GENERAL_ERR
20e10 4f 52 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 5f 69 OR);..}...slot_i
20e20 64 78 20 3d 20 30 3b 0a 09 66 6f 72 20 28 63 75 dx = 0;..for (cu
20e30 72 72 73 6c 6f 74 20 3d 20 30 3b 20 28 63 75 72 rrslot = 0; (cur
20e40 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 rslot < (sizeof(
20e50 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 cackey_slots) /
20e60 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c sizeof(cackey_sl
20e70 6f 74 73 5b 30 5d 29 29 29 3b 20 63 75 72 72 73 ots[0]))); currs
20e80 6c 6f 74 2b 2b 29 20 7b 0a 09 09 69 66 20 28 21 lot++) {...if (!
20e90 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 cackey_slots[cur
20ea0 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b rslot].active) {
20eb0 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 ....continue;...
20ec0 7d 0a 0a 09 09 69 66 20 28 73 6c 6f 74 5f 69 64 }....if (slot_id
20ed0 78 20 3e 3d 20 63 6f 75 6e 74 29 20 7b 0a 09 09 x >= count) {...
20ee0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
20ef0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 55 73 65 INTF("Error. Use
20f00 72 20 61 6c 6c 6f 63 61 74 65 64 20 25 6c 75 20 r allocated %lu
20f10 65 6e 74 72 69 65 73 2c 20 62 75 74 20 77 65 20 entries, but we
20f20 6a 75 73 74 20 74 72 69 65 64 20 74 6f 20 77 72 just tried to wr
20f30 69 74 65 20 74 6f 20 74 68 65 20 25 6c 75 20 69 ite to the %lu i
20f40 6e 64 65 78 20 2d 2d 20 69 67 6e 6f 72 69 6e 67 ndex -- ignoring
20f50 22 2c 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 69 ", count, slot_i
20f60 64 78 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 dx);.....continu
20f70 65 3b 0a 09 09 7d 0a 0a 09 09 70 53 6c 6f 74 4c e;...}....pSlotL
20f80 69 73 74 5b 73 6c 6f 74 5f 69 64 78 5d 20 3d 20 ist[slot_idx] =
20f90 63 75 72 72 73 6c 6f 74 3b 0a 09 09 73 6c 6f 74 currslot;...slot
20fa0 5f 69 64 78 2b 2b 3b 0a 09 7d 0a 0a 09 6d 75 74 _idx++;..}...mut
20fb0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b ex_retval = cack
20fc0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 ey_mutex_unlock(
20fd0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
20fe0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 ..if (mutex_retv
20ff0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 al != 0) {...CAC
21000 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
21010 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b ("Error. Unlock
21020 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a ing failed.");..
21030 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e ..return(CKR_GEN
21040 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a ERAL_ERROR);..}.
21050 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 73 6c ..*pulCount = sl
21060 6f 74 5f 63 6f 75 6e 74 3b 0a 0a 09 43 41 43 4b ot_count;...CACK
21070 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
21080 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f "Returning CKR_O
21090 4b 20 28 25 69 29 2e 20 20 46 6f 75 6e 64 20 25 K (%i). Found %
210a0 6c 75 20 72 65 61 64 65 72 73 2e 22 2c 20 43 4b lu readers.", CK
210b0 52 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e 65 64 20 R_OK, (unsigned
210c0 6c 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f 75 6e 74 long) slot_count
210d0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f );...return(CKR_
210e0 4f 4b 29 3b 0a 0a 09 74 6f 6b 65 6e 50 72 65 73 OK);...tokenPres
210f0 65 6e 74 20 3d 20 74 6f 6b 65 6e 50 72 65 73 65 ent = tokenPrese
21100 6e 74 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75 nt; /* Supress u
21110 6e 75 73 65 64 20 76 61 72 69 61 62 6c 65 20 77 nused variable w
21120 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f arning */.}..CK_
21130 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 DEFINE_FUNCTION(
21140 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74 CK_RV, C_GetSlot
21150 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 Info)(CK_SLOT_ID
21160 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 53 4c 4f 54 slotID, CK_SLOT
21170 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 _INFO_PTR pInfo)
21180 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 {..static CK_UT
21190 46 38 43 48 41 52 20 73 6c 6f 74 44 65 73 63 72 F8CHAR slotDescr
211a0 69 70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b iption[] = "CACK
211b0 65 79 20 53 6c 6f 74 22 3b 0a 09 69 6e 74 20 6d ey Slot";..int m
211c0 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e utex_retval;..in
211d0 74 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b t bytes_to_copy;
211e0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
211f0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
21200 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d );...if (pInfo =
21210 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b = NULL) {...CACK
21220 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
21230 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 "Error. pInfo is
21240 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 NULL.");....ret
21250 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 urn(CKR_ARGUMENT
21260 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 S_BAD);..}...if
21270 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c (!cackey_initial
21280 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 ized) {...CACKEY
21290 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
212a0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 rror. Not initi
212b0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 alized.");....re
212c0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b turn(CKR_CRYPTOK
212d0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 I_NOT_INITIALIZE
212e0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f D);..}...if (slo
212f0 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 tID < 0 || slotI
21300 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 D >= (sizeof(cac
21310 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a key_slots) / siz
21320 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 eof(cackey_slots
21330 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 [0]))) {...CACKE
21340 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
21350 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 Error. Invalid s
21360 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 lot requested (%
21370 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 lu), outside of
21380 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c valid range", sl
21390 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e otID);....return
213a0 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 (CKR_SLOT_ID_INV
213b0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 ALID);..}...mute
213c0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 x_retval = cacke
213d0 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 y_mutex_lock(cac
213e0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 key_biglock);..i
213f0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 f (mutex_retval
21400 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 != 0) {...CACKEY
21410 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
21420 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 rror. Locking f
21430 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 ailed.");....ret
21440 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f urn(CKR_GENERAL_
21450 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 ERROR);..}...if
21460 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c (cackey_slots[sl
21470 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 otID].active ==
21480 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 0) {...CACKEY_DE
21490 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
214a0 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 r. Invalid slot
214b0 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c requested (%lu),
214c0 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e slot not curren
214d0 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f tly active", slo
214e0 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f tID);....cackey_
214f0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 mutex_unlock(cac
21500 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 key_biglock);...
21510 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 .return(CKR_SLOT
21520 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d _ID_INVALID);..}
21530 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 ...pInfo->flags
21540 3d 20 43 4b 46 5f 48 57 5f 53 4c 4f 54 3b 0a 0a = CKF_HW_SLOT;..
21550 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f .if (!cackey_slo
21560 74 73 5b 73 6c 6f 74 49 44 5d 2e 69 6e 74 65 72 ts[slotID].inter
21570 6e 61 6c 29 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e nal) {...pInfo->
21580 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 52 45 4d flags |= CKF_REM
21590 4f 56 41 42 4c 45 5f 44 45 56 49 43 45 3b 0a 09 OVABLE_DEVICE;..
215a0 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 74 }...if (cackey_t
215b0 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 oken_present(&ca
215c0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 ckey_slots[slotI
215d0 44 5d 29 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 D]) == CACKEY_PC
215e0 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e SC_S_TOKENPRESEN
215f0 54 29 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c T) {...pInfo->fl
21600 61 67 73 20 7c 3d 20 43 4b 46 5f 54 4f 4b 45 4e ags |= CKF_TOKEN
21610 5f 50 52 45 53 45 4e 54 3b 0a 09 7d 0a 0a 09 62 _PRESENT;..}...b
21620 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 73 ytes_to_copy = s
21630 74 72 6c 65 6e 28 63 61 63 6b 65 79 5f 73 6c 6f trlen(cackey_slo
21640 74 73 5b 73 6c 6f 74 49 44 5d 2e 70 63 73 63 5f ts[slotID].pcsc_
21650 72 65 61 64 65 72 29 3b 0a 09 69 66 20 28 73 69 reader);..if (si
21660 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 zeof(pInfo->manu
21670 66 61 63 74 75 72 65 72 49 44 29 20 3c 20 62 79 facturerID) < by
21680 74 65 73 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a 09 tes_to_copy) {..
21690 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d .bytes_to_copy =
216a0 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d sizeof(pInfo->m
216b0 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 3b 0a anufacturerID);.
216c0 09 7d 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f .}..memcpy(pInfo
216d0 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 ->manufacturerID
216e0 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 , cackey_slots[s
216f0 6c 6f 74 49 44 5d 2e 70 63 73 63 5f 72 65 61 64 lotID].pcsc_read
21700 65 72 2c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 er, bytes_to_cop
21710 79 29 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 y);...mutex_retv
21720 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 al = cackey_mute
21730 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
21740 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d biglock);..if (m
21750 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 utex_retval != 0
21760 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
21770 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
21780 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 . Unlocking fai
21790 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 led.");....retur
217a0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 n(CKR_GENERAL_ER
217b0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 ROR);..}...memse
217c0 74 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 t(pInfo->slotDes
217d0 63 72 69 70 74 69 6f 6e 2c 20 27 20 27 2c 20 73 cription, ' ', s
217e0 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 73 6c 6f izeof(pInfo->slo
217f0 74 44 65 73 63 72 69 70 74 69 6f 6e 29 29 3b 0a tDescription));.
21800 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 73 .memcpy(pInfo->s
21810 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 lotDescription,
21820 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 2c slotDescription,
21830 20 73 69 7a 65 6f 66 28 73 6c 6f 74 44 65 73 63 sizeof(slotDesc
21840 72 69 70 74 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a ription) - 1);..
21850 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d .memset(pInfo->m
21860 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 27 anufacturerID, '
21870 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f ', sizeof(pInfo
21880 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 ->manufacturerID
21890 29 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 ));...pInfo->har
218a0 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a dwareVersion.maj
218b0 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 or = (cackey_get
218c0 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 version() >> 16)
218d0 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d & 0xff;..pInfo-
218e0 3e 68 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e >hardwareVersion
218f0 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 .minor = (cackey
21900 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e _getversion() >>
21910 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 49 8) & 0xff;...pI
21920 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 nfo->firmwareVer
21930 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 sion.major = 0x0
21940 30 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 0;..pInfo->firmw
21950 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 areVersion.minor
21960 20 3d 20 30 78 30 30 3b 0a 0a 09 43 41 43 4b 45 = 0x00;...CACKE
21970 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
21980 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b Returning CKR_OK
21990 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b (%i)", CKR_OK);
219a0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b ...return(CKR_OK
219b0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f );.}..CK_DEFINE_
219c0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 FUNCTION(CK_RV,
219d0 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 29 28 C_GetTokenInfo)(
219e0 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 CK_SLOT_ID slotI
219f0 44 2c 20 43 4b 5f 54 4f 4b 45 4e 5f 49 4e 46 4f D, CK_TOKEN_INFO
21a00 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73 _PTR pInfo) {..s
21a10 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 tatic CK_UTF8CHA
21a20 52 20 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 R manufacturerID
21a30 5b 5d 20 3d 20 22 55 2e 53 2e 20 47 6f 76 65 72 [] = "U.S. Gover
21a40 6e 6d 65 6e 74 22 3b 0a 09 73 74 61 74 69 63 20 nment";..static
21a50 43 4b 5f 55 54 46 38 43 48 41 52 20 64 65 66 61 CK_UTF8CHAR defa
21a60 75 6c 74 4c 61 62 65 6c 5b 5d 20 3d 20 22 55 6e ultLabel[] = "Un
21a70 6b 6e 6f 77 6e 20 54 6f 6b 65 6e 22 3b 0a 09 73 known Token";..s
21a80 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 tatic CK_UTF8CHA
21a90 52 20 6d 6f 64 65 6c 5b 5d 20 3d 20 22 43 41 43 R model[] = "CAC
21aa0 20 54 6f 6b 65 6e 22 3b 0a 09 73 74 72 75 63 74 Token";..struct
21ab0 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 cackey_pcsc_ide
21ac0 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e ntity *pcsc_iden
21ad0 74 69 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 tities;..unsigne
21ae0 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73 d long num_certs
21af0 3b 0a 09 73 73 69 7a 65 5f 74 20 6c 61 62 65 6c ;..ssize_t label
21b00 5f 72 65 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 _ret;..int mutex
21b10 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 75 73 _retval;..int us
21b20 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 3b e_default_label;
21b30 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
21b40 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
21b50 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d );...if (pInfo =
21b60 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b = NULL) {...CACK
21b70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
21b80 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 "Error. pInfo is
21b90 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 NULL.");....ret
21ba0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 urn(CKR_ARGUMENT
21bb0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 S_BAD);..}...if
21bc0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c (!cackey_initial
21bd0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 ized) {...CACKEY
21be0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
21bf0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 rror. Not initi
21c00 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 alized.");....re
21c10 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b turn(CKR_CRYPTOK
21c20 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 I_NOT_INITIALIZE
21c30 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f D);..}...if (slo
21c40 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 tID < 0 || slotI
21c50 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 D >= (sizeof(cac
21c60 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a key_slots) / siz
21c70 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 eof(cackey_slots
21c80 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 [0]))) {...CACKE
21c90 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
21ca0 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 Error. Invalid s
21cb0 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 lot requested (%
21cc0 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 lu), outside of
21cd0 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c valid range", sl
21ce0 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e otID);....return
21cf0 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 (CKR_SLOT_ID_INV
21d00 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 ALID);..}...mute
21d10 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 x_retval = cacke
21d20 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 y_mutex_lock(cac
21d30 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 key_biglock);..i
21d40 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 f (mutex_retval
21d50 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 != 0) {...CACKEY
21d60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
21d70 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 rror. Locking f
21d80 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 ailed.");....ret
21d90 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f urn(CKR_GENERAL_
21da0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 ERROR);..}...if
21db0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c (cackey_slots[sl
21dc0 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 otID].active ==
21dd0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 0) {...CACKEY_DE
21de0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
21df0 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 r. Invalid slot
21e00 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c requested (%lu),
21e10 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e slot not curren
21e20 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f tly active", slo
21e30 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f tID);....cackey_
21e40 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 mutex_unlock(cac
21e50 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 key_biglock);...
21e60 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 .return(CKR_SLOT
21e70 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d _ID_INVALID);..}
21e80 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 74 6f ...if (cackey_to
21e90 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 63 ken_present(&cac
21ea0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 key_slots[slotID
21eb0 5d 29 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 ]) != CACKEY_PCS
21ec0 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 C_S_TOKENPRESENT
21ed0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
21ee0 55 47 5f 50 52 49 4e 54 46 28 22 4e 6f 20 74 6f UG_PRINTF("No to
21ef0 6b 65 6e 20 69 73 20 70 72 65 73 65 6e 74 20 69 ken is present i
21f00 6e 20 73 6c 6f 74 49 44 20 3d 20 25 6c 75 22 2c n slotID = %lu",
21f10 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 slotID);....cac
21f20 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b key_mutex_unlock
21f30 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 (cackey_biglock)
21f40 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
21f50 54 4f 4b 45 4e 5f 4e 4f 54 5f 50 52 45 53 45 4e TOKEN_NOT_PRESEN
21f60 54 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 T);..}...mutex_r
21f70 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d etval = cackey_m
21f80 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b utex_unlock(cack
21f90 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 ey_biglock);..if
21fa0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 (mutex_retval !
21fb0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f = 0) {...CACKEY_
21fc0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
21fd0 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 ror. Unlocking
21fe0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 failed.");....re
21ff0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c turn(CKR_GENERAL
22000 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a _ERROR);..}.../*
22010 20 44 65 74 65 72 6d 69 6e 65 20 74 6f 6b 65 6e Determine token
22020 20 6c 61 62 65 6c 20 66 72 6f 6d 20 63 65 72 74 label from cert
22030 69 66 69 63 61 74 65 73 20 2a 2f 0a 09 6d 65 6d ificates */..mem
22040 73 65 74 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c set(pInfo->label
22050 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 , ' ', sizeof(pI
22060 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 75 nfo->label));..u
22070 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c se_default_label
22080 20 3d 20 31 3b 0a 0a 09 69 66 20 28 63 61 63 6b = 1;...if (cack
22090 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d ey_slots[slotID]
220a0 2e 6c 61 62 65 6c 20 3d 3d 20 4e 55 4c 4c 29 20 .label == NULL)
220b0 7b 0a 09 09 70 63 73 63 5f 69 64 65 6e 74 69 74 {...pcsc_identit
220c0 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 ies = cackey_rea
220d0 64 5f 63 65 72 74 73 28 26 63 61 63 6b 65 79 5f d_certs(&cackey_
220e0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 4e slots[slotID], N
220f0 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73 29 ULL, &num_certs)
22100 3b 0a 09 09 69 66 20 28 70 63 73 63 5f 69 64 65 ;...if (pcsc_ide
22110 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 ntities != NULL)
22120 20 7b 0a 09 09 09 69 66 20 28 6e 75 6d 5f 63 65 {....if (num_ce
22130 72 74 73 20 3e 20 30 29 20 7b 0a 09 09 09 09 6c rts > 0) {.....l
22140 61 62 65 6c 5f 72 65 74 20 3d 20 63 61 63 6b 65 abel_ret = cacke
22150 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 5f y_pcsc_identity_
22160 74 6f 5f 6c 61 62 65 6c 28 70 63 73 63 5f 69 64 to_label(pcsc_id
22170 65 6e 74 69 74 69 65 73 2c 20 70 49 6e 66 6f 2d entities, pInfo-
22180 3e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70 >label, sizeof(p
22190 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 Info->label));..
221a0 09 09 09 69 66 20 28 6c 61 62 65 6c 5f 72 65 74 ...if (label_ret
221b0 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 75 73 65 > 0) {......use
221c0 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d _default_label =
221d0 20 30 3b 0a 0a 09 09 09 09 09 63 61 63 6b 65 79 0;.......cackey
221e0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c _slots[slotID].l
221f0 61 62 65 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 abel = malloc(si
22200 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 zeof(pInfo->labe
22210 6c 29 29 3b 0a 0a 09 09 09 09 09 6d 65 6d 63 70 l));.......memcp
22220 79 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 y(cackey_slots[s
22230 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 2c 20 70 49 lotID].label, pI
22240 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 73 69 7a 65 nfo->label, size
22250 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 of(pInfo->label)
22260 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 );.....}....}...
22270 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 ..cackey_free_ce
22280 72 74 73 28 70 63 73 63 5f 69 64 65 6e 74 69 74 rts(pcsc_identit
22290 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20 ies, num_certs,
222a0 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 1);...}..} else
222b0 7b 0a 09 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f {...memcpy(pInfo
222c0 2d 3e 6c 61 62 65 6c 2c 20 63 61 63 6b 65 79 5f ->label, cackey_
222d0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 slots[slotID].la
222e0 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 bel, sizeof(pInf
222f0 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 0a 09 09 75 o->label));....u
22300 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c se_default_label
22310 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 = 0;..}...if (u
22320 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c se_default_label
22330 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28 70 49 6e ) {...memcpy(pIn
22340 66 6f 2d 3e 6c 61 62 65 6c 2c 20 64 65 66 61 75 fo->label, defau
22350 6c 74 4c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 ltLabel, sizeof(
22360 64 65 66 61 75 6c 74 4c 61 62 65 6c 29 20 2d 20 defaultLabel) -
22370 31 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 1);..}...memset(
22380 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 pInfo->manufactu
22390 72 65 72 49 44 2c 20 27 20 27 2c 20 73 69 7a 65 rerID, ' ', size
223a0 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 of(pInfo->manufa
223b0 63 74 75 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d cturerID));..mem
223c0 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 cpy(pInfo->manuf
223d0 61 63 74 75 72 65 72 49 44 2c 20 6d 61 6e 75 66 acturerID, manuf
223e0 61 63 74 75 72 65 72 49 44 2c 20 73 69 7a 65 6f acturerID, sizeo
223f0 66 28 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 f(manufacturerID
22400 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 ) - 1);...memset
22410 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 27 (pInfo->model, '
22420 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f ', sizeof(pInfo
22430 2d 3e 6d 6f 64 65 6c 29 29 3b 0a 09 6d 65 6d 63 ->model));..memc
22440 70 79 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c py(pInfo->model,
22450 20 6d 6f 64 65 6c 2c 20 73 69 7a 65 6f 66 28 6d model, sizeof(m
22460 6f 64 65 6c 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 odel) - 1);...me
22470 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 73 65 72 69 mset(pInfo->seri
22480 61 6c 4e 75 6d 62 65 72 2c 20 27 20 27 2c 20 73 alNumber, ' ', s
22490 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 73 65 72 izeof(pInfo->ser
224a0 69 61 6c 4e 75 6d 62 65 72 29 29 3b 0a 0a 09 6d ialNumber));...m
224b0 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 75 74 63 emset(pInfo->utc
224c0 54 69 6d 65 2c 20 27 20 27 2c 20 73 69 7a 65 6f Time, ' ', sizeo
224d0 66 28 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d 65 f(pInfo->utcTime
224e0 29 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 ));...pInfo->har
224f0 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a dwareVersion.maj
22500 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 or = (cackey_get
22510 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 version() >> 16)
22520 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d & 0xff;..pInfo-
22530 3e 68 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e >hardwareVersion
22540 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 .minor = (cackey
22550 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e _getversion() >>
22560 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 49 8) & 0xff;...pI
22570 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 nfo->firmwareVer
22580 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 sion.major = 0x0
22590 30 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 0;..pInfo->firmw
225a0 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 areVersion.minor
225b0 20 3d 20 30 78 30 30 3b 0a 0a 09 70 49 6e 66 6f = 0x00;...pInfo
225c0 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 57 52 ->flags = CKF_WR
225d0 49 54 45 5f 50 52 4f 54 45 43 54 45 44 20 7c 20 ITE_PROTECTED |
225e0 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 49 4e 49 CKF_USER_PIN_INI
225f0 54 49 41 4c 49 5a 45 44 20 7c 20 43 4b 46 5f 54 TIALIZED | CKF_T
22600 4f 4b 45 4e 5f 49 4e 49 54 49 41 4c 49 5a 45 44 OKEN_INITIALIZED
22610 20 7c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b | cackey_slots[
22620 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c slotID].token_fl
22630 61 67 73 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 ags;...if (cacke
22640 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 21 3d y_pin_command !=
22650 20 4e 55 4c 4c 29 20 7b 0a 09 09 70 49 6e 66 6f NULL) {...pInfo
22660 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 50 ->flags |= CKF_P
22670 52 4f 54 45 43 54 45 44 5f 41 55 54 48 45 4e 54 ROTECTED_AUTHENT
22680 49 43 41 54 49 4f 4e 5f 50 41 54 48 3b 0a 09 7d ICATION_PATH;..}
22690 0a 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 53 ...pInfo->ulMaxS
226a0 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 28 73 essionCount = (s
226b0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 izeof(cackey_ses
226c0 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 sions) / sizeof(
226d0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
226e0 30 5d 29 29 20 2d 20 31 3b 0a 09 70 49 6e 66 6f 0])) - 1;..pInfo
226f0 2d 3e 75 6c 53 65 73 73 69 6f 6e 43 6f 75 6e 74 ->ulSessionCount
22700 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c = CK_UNAVAILABL
22710 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 E_INFORMATION;..
22720 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 52 77 53 65 pInfo->ulMaxRwSe
22730 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 30 3b 0a ssionCount = 0;.
22740 09 70 49 6e 66 6f 2d 3e 75 6c 52 77 53 65 73 73 .pInfo->ulRwSess
22750 69 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f 55 4e ionCount = CK_UN
22760 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d AVAILABLE_INFORM
22770 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 ATION;..pInfo->u
22780 6c 4d 61 78 50 69 6e 4c 65 6e 20 3d 20 31 32 38 lMaxPinLen = 128
22790 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 50 ;..pInfo->ulMinP
227a0 69 6e 4c 65 6e 20 3d 20 30 3b 0a 09 70 49 6e 66 inLen = 0;..pInf
227b0 6f 2d 3e 75 6c 54 6f 74 61 6c 50 75 62 6c 69 63 o->ulTotalPublic
227c0 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 Memory = CK_UNAV
227d0 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 AILABLE_INFORMAT
227e0 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 46 ION;..pInfo->ulF
227f0 72 65 65 50 75 62 6c 69 63 4d 65 6d 6f 72 79 20 reePublicMemory
22800 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 = CK_UNAVAILABLE
22810 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 _INFORMATION;..p
22820 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61 6c 50 72 69 Info->ulTotalPri
22830 76 61 74 65 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f vateMemory = CK_
22840 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f UNAVAILABLE_INFO
22850 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d RMATION;..pInfo-
22860 3e 75 6c 46 72 65 65 50 72 69 76 61 74 65 4d 65 >ulFreePrivateMe
22870 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 mory = CK_UNAVAI
22880 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f LABLE_INFORMATIO
22890 4e 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 N;...CACKEY_DEBU
228a0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
228b0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 ing CKR_OK (%i)"
228c0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 , CKR_OK);...ret
228d0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a urn(CKR_OK);.}..
228e0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 CK_DEFINE_FUNCTI
228f0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 57 61 69 74 ON(CK_RV, C_Wait
22900 46 6f 72 53 6c 6f 74 45 76 65 6e 74 29 28 43 4b ForSlotEvent)(CK
22910 5f 46 4c 41 47 53 20 66 6c 61 67 73 2c 20 43 4b _FLAGS flags, CK
22920 5f 53 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53 6c _SLOT_ID_PTR pSl
22930 6f 74 49 44 2c 20 43 4b 5f 56 4f 49 44 5f 50 54 otID, CK_VOID_PT
22940 52 20 70 52 65 73 65 72 76 65 64 29 20 7b 0a 09 R pReserved) {..
22950 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
22960 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a NTF("Called.");.
22970 0a 09 69 66 20 28 70 52 65 73 65 72 76 65 64 20 ..if (pReserved
22980 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 != NULL) {...CAC
22990 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
229a0 28 22 45 72 72 6f 72 2e 20 70 52 65 73 65 72 76 ("Error. pReserv
229b0 65 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 ed is not NULL."
229c0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
229d0 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b _ARGUMENTS_BAD);
229e0 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ..}...if (!cacke
229f0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b y_initialized) {
22a00 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
22a10 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
22a20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e Not initialized.
22a30 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
22a40 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 R_CRYPTOKI_NOT_I
22a50 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
22a60 0a 09 2f 2a 20 58 58 58 3a 20 54 4f 44 4f 3a 20 ../* XXX: TODO:
22a70 49 6d 70 6c 65 6d 65 6e 74 20 74 68 69 73 2e 2e Implement this..
22a80 2e 20 2a 2f 0a 09 43 41 43 4b 45 59 5f 44 45 42 . */..CACKEY_DEB
22a90 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
22aa0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f ning CKR_FUNCTIO
22ab0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 N_NOT_SUPPORTED
22ac0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 (%i)", CKR_FUNCT
22ad0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
22ae0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 D);...return(CKR
22af0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
22b00 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f PPORTED);.}..CK_
22b10 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 DEFINE_FUNCTION(
22b20 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4d 65 63 68 CK_RV, C_GetMech
22b30 61 6e 69 73 6d 4c 69 73 74 29 28 43 4b 5f 53 4c anismList)(CK_SL
22b40 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b OT_ID slotID, CK
22b50 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 5f _MECHANISM_TYPE_
22b60 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 4c 69 PTR pMechanismLi
22b70 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 st, CK_ULONG_PTR
22b80 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41 pulCount) {..CA
22b90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
22ba0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
22bb0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 if (!cackey_init
22bc0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 ialized) {...CAC
22bd0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
22be0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e ("Error. Not in
22bf0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 itialized.");...
22c00 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 .return(CKR_CRYP
22c10 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c TOKI_NOT_INITIAL
22c20 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 IZED);..}...if (
22c30 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c pulCount == NULL
22c40 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
22c50 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
22c60 2e 20 20 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e . pulCount is N
22c70 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 ULL.");....retur
22c80 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f n(CKR_ARGUMENTS_
22c90 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 BAD);..}...if (p
22ca0 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 20 3d 3d MechanismList ==
22cb0 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c 43 NULL) {...*pulC
22cc0 6f 75 6e 74 20 3d 20 31 3b 0a 0a 09 09 43 41 43 ount = 1;....CAC
22cd0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
22ce0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f ("Returning CKR_
22cf0 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b OK (%i)", CKR_OK
22d00 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
22d10 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 2a _OK);..}...if (*
22d20 70 75 6c 43 6f 75 6e 74 20 3c 20 31 29 20 7b 0a pulCount < 1) {.
22d30 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
22d40 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 42 RINTF("Error. B
22d50 75 66 66 65 72 20 74 6f 6f 20 73 6d 61 6c 6c 2e uffer too small.
22d60 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
22d70 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 R_BUFFER_TOO_SMA
22d80 4c 4c 29 3b 0a 09 7d 0a 0a 09 70 4d 65 63 68 61 LL);..}...pMecha
22d90 6e 69 73 6d 4c 69 73 74 5b 30 5d 20 3d 20 43 4b nismList[0] = CK
22da0 4d 5f 52 53 41 5f 50 4b 43 53 3b 0a 09 2a 70 75 M_RSA_PKCS;..*pu
22db0 6c 43 6f 75 6e 74 20 3d 20 31 3b 0a 0a 09 43 41 lCount = 1;...CA
22dc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
22dd0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 F("Returning CKR
22de0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f _OK (%i)", CKR_O
22df0 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 K);...return(CKR
22e00 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 _OK);.}..CK_DEFI
22e10 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 NE_FUNCTION(CK_R
22e20 56 2c 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 V, C_GetMechanis
22e30 6d 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 mInfo)(CK_SLOT_I
22e40 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45 43 D slotID, CK_MEC
22e50 48 41 4e 49 53 4d 5f 54 59 50 45 20 74 79 70 65 HANISM_TYPE type
22e60 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 49 , CK_MECHANISM_I
22e70 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b NFO_PTR pInfo) {
22e80 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 ..int mutex_retv
22e90 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 al;...CACKEY_DEB
22ea0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
22eb0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 d.");...if (pInf
22ec0 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 o == NULL) {...C
22ed0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
22ee0 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f TF("Error. pInfo
22ef0 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 is NULL.");....
22f00 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d return(CKR_ARGUM
22f10 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 ENTS_BAD);..}...
22f20 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 if (!cackey_init
22f30 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 ialized) {...CAC
22f40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
22f50 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e ("Error. Not in
22f60 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 itialized.");...
22f70 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 .return(CKR_CRYP
22f80 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c TOKI_NOT_INITIAL
22f90 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 IZED);..}...if (
22fa0 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c slotID < 0 || sl
22fb0 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 otID >= (sizeof(
22fc0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 cackey_slots) /
22fd0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c sizeof(cackey_sl
22fe0 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 ots[0]))) {...CA
22ff0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
23000 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 F("Error. Invali
23010 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 d slot requested
23020 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 (%lu), outside
23030 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c of valid range",
23040 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 slotID);....ret
23050 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f urn(CKR_SLOT_ID_
23060 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d INVALID);..}...m
23070 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 utex_retval = ca
23080 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 ckey_mutex_lock(
23090 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
230a0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 ..if (mutex_retv
230b0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 al != 0) {...CAC
230c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
230d0 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e ("Error. Lockin
230e0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 g failed.");....
230f0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 return(CKR_GENER
23100 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 AL_ERROR);..}...
23110 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 if (cackey_slots
23120 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 [slotID].active
23130 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 == 0) {...CACKEY
23140 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
23150 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c rror. Invalid sl
23160 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c ot requested (%l
23170 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 u), slot not cur
23180 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 rently active",
23190 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b slotID);....cack
231a0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 ey_mutex_unlock(
231b0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
231c0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 ....return(CKR_S
231d0 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b LOT_ID_INVALID);
231e0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 ..}...mutex_retv
231f0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 al = cackey_mute
23200 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
23210 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d biglock);..if (m
23220 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 utex_retval != 0
23230 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
23240 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
23250 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 . Unlocking fai
23260 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 led.");....retur
23270 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 n(CKR_GENERAL_ER
23280 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 ROR);..}...switc
23290 68 20 28 74 79 70 65 29 20 7b 0a 09 09 63 61 73 h (type) {...cas
232a0 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a e CKM_RSA_PKCS:.
232b0 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 4b ...pInfo->ulMinK
232c0 65 79 53 69 7a 65 20 3d 20 35 31 32 3b 0a 09 09 eySize = 512;...
232d0 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 4b 65 79 .pInfo->ulMaxKey
232e0 53 69 7a 65 20 3d 20 38 31 39 32 3b 0a 09 09 09 Size = 8192;....
232f0 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 pInfo->flags = C
23300 4b 46 5f 48 57 20 7c 20 43 4b 46 5f 45 4e 43 52 KF_HW | CKF_ENCR
23310 59 50 54 20 7c 20 43 4b 46 5f 44 45 43 52 59 50 YPT | CKF_DECRYP
23320 54 20 7c 20 43 4b 46 5f 53 49 47 4e 20 7c 20 43 T | CKF_SIGN | C
23330 4b 46 5f 56 45 52 49 46 59 3b 0a 09 09 09 62 72 KF_VERIFY;....br
23340 65 61 6b 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 eak;..}...CACKEY
23350 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
23360 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 eturning CKR_OK
23370 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a (%i)", CKR_OK);.
23380 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 ..return(CKR_OK)
23390 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 ;.}../* We don't
233a0 20 73 75 70 70 6f 72 74 20 74 68 69 73 20 6d 65 support this me
233b0 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 thod. */.CK_DEFI
233c0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 NE_FUNCTION(CK_R
233d0 56 2c 20 43 5f 49 6e 69 74 54 6f 6b 65 6e 29 28 V, C_InitToken)(
233e0 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 CK_SLOT_ID slotI
233f0 44 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 D, CK_UTF8CHAR_P
23400 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e TR pPin, CK_ULON
23410 47 20 75 6c 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55 G ulPinLen, CK_U
23420 54 46 38 43 48 41 52 5f 50 54 52 20 70 4c 61 62 TF8CHAR_PTR pLab
23430 65 6c 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 el) {..CACKEY_DE
23440 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
23450 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 ed.");...if (!ca
23460 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 ckey_initialized
23470 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
23480 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
23490 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a . Not initializ
234a0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
234b0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f (CKR_CRYPTOKI_NO
234c0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a T_INITIALIZED);.
234d0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 .}...CACKEY_DEBU
234e0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
234f0 69 6e 67 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 ing CKR_TOKEN_WR
23500 49 54 45 5f 50 52 4f 54 45 43 54 45 44 20 28 25 ITE_PROTECTED (%
23510 69 29 22 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 i)", CKR_TOKEN_W
23520 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b RITE_PROTECTED);
23530 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f ...return(CKR_TO
23540 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 KEN_WRITE_PROTEC
23550 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 TED);.}../* We d
23560 6f 6e 27 74 20 73 75 70 70 6f 72 74 20 74 68 69 on't support thi
23570 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f s method. */.CK_
23580 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 DEFINE_FUNCTION(
23590 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 50 49 4e CK_RV, C_InitPIN
235a0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e )(CK_SESSION_HAN
235b0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b DLE hSession, CK
235c0 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 50 _UTF8CHAR_PTR pP
235d0 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 in, CK_ULONG ulP
235e0 69 6e 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 inLen) {..CACKEY
235f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 _DEBUG_PRINTF("C
23600 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 alled.");...if (
23610 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 !cackey_initiali
23620 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f zed) {...CACKEY_
23630 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
23640 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 ror. Not initia
23650 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 lized.");....ret
23660 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 urn(CKR_CRYPTOKI
23670 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 _NOT_INITIALIZED
23680 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 );..}...CACKEY_D
23690 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
236a0 75 72 6e 69 6e 67 20 43 4b 52 5f 54 4f 4b 45 4e urning CKR_TOKEN
236b0 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 _WRITE_PROTECTED
236c0 20 28 25 69 29 22 2c 20 43 4b 52 5f 54 4f 4b 45 (%i)", CKR_TOKE
236d0 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 N_WRITE_PROTECTE
236e0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 D);...return(CKR
236f0 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f _TOKEN_WRITE_PRO
23700 54 45 43 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 TECTED);.}..CK_D
23710 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 EFINE_FUNCTION(C
23720 4b 5f 52 56 2c 20 43 5f 53 65 74 50 49 4e 29 28 K_RV, C_SetPIN)(
23730 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c CK_SESSION_HANDL
23740 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 E hSession, CK_U
23750 54 46 38 43 48 41 52 5f 50 54 52 20 70 4f 6c 64 TF8CHAR_PTR pOld
23760 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c Pin, CK_ULONG ul
23770 4f 6c 64 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54 OldPinLen, CK_UT
23780 46 38 43 48 41 52 5f 50 54 52 20 70 4e 65 77 50 F8CHAR_PTR pNewP
23790 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4e in, CK_ULONG ulN
237a0 65 77 50 69 6e 4c 65 6e 29 20 7b 0a 09 63 68 61 ewPinLen) {..cha
237b0 72 20 6f 6c 64 70 69 6e 62 75 66 5b 36 34 5d 2c r oldpinbuf[64],
237c0 20 6e 65 77 70 69 6e 62 75 66 5b 36 34 5d 3b 0a newpinbuf[64];.
237d0 09 63 61 63 6b 65 79 5f 72 65 74 20 73 65 74 5f .cackey_ret set_
237e0 70 69 6e 5f 72 65 74 2c 20 67 65 74 5f 70 69 6e pin_ret, get_pin
237f0 5f 72 65 74 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 _ret;..CK_SLOT_I
23800 44 20 73 6c 6f 74 49 44 3b 0a 09 69 6e 74 20 6d D slotID;..int m
23810 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 utex_retval;...C
23820 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
23830 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
23840 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 .if (!cackey_ini
23850 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 tialized) {...CA
23860 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
23870 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 F("Error. Not i
23880 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a nitialized.");..
23890 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 ..return(CKR_CRY
238a0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 PTOKI_NOT_INITIA
238b0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 LIZED);..}...mut
238c0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b ex_retval = cack
238d0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 ey_mutex_lock(ca
238e0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 ckey_biglock);..
238f0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c if (mutex_retval
23900 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 != 0) {...CACKE
23910 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
23920 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 Error. Locking
23930 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 failed.");....re
23940 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c turn(CKR_GENERAL
23950 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 _ERROR);..}...if
23960 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f (!cackey_sessio
23970 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 ns[hSession].act
23980 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f ive) {...cackey_
23990 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 mutex_unlock(cac
239a0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 key_biglock);...
239b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
239c0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 INTF("Error. Se
239d0 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 ssion not active
239e0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e .");......return
239f0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e (CKR_SESSION_HAN
23a00 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d DLE_INVALID);..}
23a10 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b ...slotID = cack
23a20 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
23a30 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 sion].slotID;...
23a40 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c if (slotID < 0 |
23a50 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a | slotID >= (siz
23a60 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 eof(cackey_slots
23a70 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 ) / sizeof(cacke
23a80 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a y_slots[0]))) {.
23a90 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
23aa0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e RINTF("Error. In
23ab0 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 valid slot reque
23ac0 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 sted (%lu), outs
23ad0 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e ide of valid ran
23ae0 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 ge", slotID);...
23af0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e .cackey_mutex_un
23b00 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
23b10 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 ock);....return(
23b20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f CKR_GENERAL_ERRO
23b30 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 R);..}...if (cac
23b40 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 key_slots[slotID
23b50 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b ].active == 0) {
23b60 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
23b70 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 PRINTF("Error. I
23b80 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 nvalid slot requ
23b90 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f ested (%lu), slo
23ba0 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 t not currently
23bb0 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 active", slotID)
23bc0 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 ;....cackey_mute
23bd0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
23be0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 biglock);....ret
23bf0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f urn(CKR_GENERAL_
23c00 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 ERROR);..}...if
23c10 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d (cackey_pin_comm
23c20 61 6e 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 and != NULL) {..
23c30 09 2f 2a 20 47 65 74 20 6f 6c 64 20 50 49 4e 20 ./* Get old PIN
23c40 2a 2f 0a 09 09 67 65 74 5f 70 69 6e 5f 72 65 74 */...get_pin_ret
23c50 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 70 69 = cackey_get_pi
23c60 6e 28 6f 6c 64 70 69 6e 62 75 66 29 3b 0a 0a 09 n(oldpinbuf);...
23c70 09 69 66 20 28 67 65 74 5f 70 69 6e 5f 72 65 74 .if (get_pin_ret
23c80 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f != CACKEY_PCSC_
23c90 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 S_OK) {....CACKE
23ca0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
23cb0 45 72 72 6f 72 20 77 68 69 6c 65 20 67 65 74 74 Error while gett
23cc0 69 6e 67 20 4f 6c 64 20 50 49 4e 2c 20 72 65 74 ing Old PIN, ret
23cd0 75 72 6e 69 6e 67 20 43 4b 52 5f 50 49 4e 5f 49 urning CKR_PIN_I
23ce0 4e 43 4f 52 52 45 43 54 2e 22 29 3b 0a 0a 09 09 NCORRECT.");....
23cf0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e .cackey_mutex_un
23d00 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
23d10 6f 63 6b 29 3b 0a 09 09 09 0a 09 09 09 72 65 74 ock);........ret
23d20 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f urn(CKR_PIN_INCO
23d30 52 52 45 43 54 29 3b 0a 09 09 7d 0a 0a 09 09 70 RRECT);...}....p
23d40 4f 6c 64 50 69 6e 20 3d 20 28 43 4b 5f 55 54 46 OldPin = (CK_UTF
23d50 38 43 48 41 52 5f 50 54 52 29 20 6f 6c 64 70 69 8CHAR_PTR) oldpi
23d60 6e 62 75 66 3b 0a 09 09 75 6c 4f 6c 64 50 69 6e nbuf;...ulOldPin
23d70 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 6f 6c 64 Len = strlen(old
23d80 70 69 6e 62 75 66 29 3b 0a 0a 09 09 2f 2a 20 47 pinbuf);..../* G
23d90 65 74 20 6e 65 77 20 50 49 4e 20 2a 2f 0a 09 09 et new PIN */...
23da0 67 65 74 5f 70 69 6e 5f 72 65 74 20 3d 20 63 61 get_pin_ret = ca
23db0 63 6b 65 79 5f 67 65 74 5f 70 69 6e 28 6e 65 77 ckey_get_pin(new
23dc0 70 69 6e 62 75 66 29 3b 0a 0a 09 09 69 66 20 28 pinbuf);....if (
23dd0 67 65 74 5f 70 69 6e 5f 72 65 74 20 21 3d 20 43 get_pin_ret != C
23de0 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 ACKEY_PCSC_S_OK)
23df0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 {....CACKEY_DEB
23e00 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
23e10 20 77 68 69 6c 65 20 67 65 74 74 69 6e 67 20 4e while getting N
23e20 65 77 20 50 49 4e 2c 20 72 65 74 75 72 6e 69 6e ew PIN, returnin
23e30 67 20 43 4b 52 5f 50 49 4e 5f 49 4e 56 41 4c 49 g CKR_PIN_INVALI
23e40 44 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 D.");.....cackey
23e50 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 _mutex_unlock(ca
23e60 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 ckey_biglock);..
23e70 09 09 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 ......return(CKR
23e80 5f 50 49 4e 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 _PIN_INVALID);..
23e90 09 7d 0a 0a 09 09 70 4e 65 77 50 69 6e 20 3d 20 .}....pNewPin =
23ea0 28 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 (CK_UTF8CHAR_PTR
23eb0 29 20 6e 65 77 70 69 6e 62 75 66 3b 0a 09 09 75 ) newpinbuf;...u
23ec0 6c 4e 65 77 50 69 6e 4c 65 6e 20 3d 20 73 74 72 lNewPinLen = str
23ed0 6c 65 6e 28 6e 65 77 70 69 6e 62 75 66 29 3b 0a len(newpinbuf);.
23ee0 09 7d 0a 0a 09 69 66 20 28 70 4f 6c 64 50 69 6e .}...if (pOldPin
23ef0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 == NULL) {...CA
23f00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
23f10 46 28 22 4f 6c 64 20 50 49 4e 20 76 61 6c 75 65 F("Old PIN value
23f20 20 69 73 20 77 72 6f 6e 67 20 28 6e 75 6c 6c 29 is wrong (null)
23f30 2e 22 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d .");....cackey_m
23f40 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b utex_unlock(cack
23f50 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 ey_biglock);....
23f60 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 return(CKR_PIN_I
23f70 4e 43 4f 52 52 45 43 54 29 3b 0a 09 7d 0a 0a 09 NCORRECT);..}...
23f80 69 66 20 28 75 6c 4f 6c 64 50 69 6e 4c 65 6e 20 if (ulOldPinLen
23f90 3d 3d 20 30 20 7c 7c 20 75 6c 4f 6c 64 50 69 6e == 0 || ulOldPin
23fa0 4c 65 6e 20 3e 20 38 29 20 7b 0a 09 09 43 41 43 Len > 8) {...CAC
23fb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
23fc0 28 22 4f 6c 64 20 50 49 4e 20 6c 65 6e 67 74 68 ("Old PIN length
23fd0 20 69 73 20 77 72 6f 6e 67 3a 20 25 6c 75 2e 22 is wrong: %lu."
23fe0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
23ff0 29 20 75 6c 4f 6c 64 50 69 6e 4c 65 6e 29 3b 0a ) ulOldPinLen);.
24000 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f ...cackey_mutex_
24010 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 unlock(cackey_bi
24020 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 glock);....retur
24030 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 n(CKR_PIN_INCORR
24040 45 43 54 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 ECT);..}...if (p
24050 4e 65 77 50 69 6e 20 3d 3d 20 4e 55 4c 4c 29 20 NewPin == NULL)
24060 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
24070 5f 50 52 49 4e 54 46 28 22 4e 65 77 20 50 49 4e _PRINTF("New PIN
24080 20 76 61 6c 75 65 20 69 73 20 77 72 6f 6e 67 20 value is wrong
24090 28 65 69 74 68 65 72 20 4e 55 4c 4c 2c 20 6f 72 (either NULL, or
240a0 20 74 6f 6f 20 6c 6f 6e 67 2f 73 68 6f 72 74 29 too long/short)
240b0 2e 22 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d .");....cackey_m
240c0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b utex_unlock(cack
240d0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 ey_biglock);....
240e0 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 return(CKR_PIN_I
240f0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 NVALID);..}...if
24100 20 28 75 6c 4e 65 77 50 69 6e 4c 65 6e 20 3c 20 (ulNewPinLen <
24110 35 20 7c 7c 20 75 6c 4e 65 77 50 69 6e 4c 65 6e 5 || ulNewPinLen
24120 20 3e 20 38 29 20 7b 0a 09 09 43 41 43 4b 45 59 > 8) {...CACKEY
24130 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4e _DEBUG_PRINTF("N
24140 65 77 20 50 49 4e 20 6c 65 6e 67 74 68 20 69 73 ew PIN length is
24150 20 77 72 6f 6e 67 3a 20 25 6c 75 2c 20 6d 75 73 wrong: %lu, mus
24160 74 20 62 65 20 61 74 6c 65 61 73 74 20 35 20 61 t be atleast 5 a
24170 6e 64 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 nd no more than
24180 38 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 8.", (unsigned l
24190 6f 6e 67 29 20 75 6c 4e 65 77 50 69 6e 4c 65 6e ong) ulNewPinLen
241a0 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 );....cackey_mut
241b0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 ex_unlock(cackey
241c0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 _biglock);....re
241d0 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 4c 45 4e turn(CKR_PIN_LEN
241e0 5f 52 41 4e 47 45 29 3b 0a 09 7d 0a 0a 09 73 65 _RANGE);..}...se
241f0 74 5f 70 69 6e 5f 72 65 74 20 3d 20 63 61 63 6b t_pin_ret = cack
24200 65 79 5f 73 65 74 5f 70 69 6e 28 26 63 61 63 6b ey_set_pin(&cack
24210 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d ey_slots[slotID]
24220 2c 20 70 4f 6c 64 50 69 6e 2c 20 75 6c 4f 6c 64 , pOldPin, ulOld
24230 50 69 6e 4c 65 6e 2c 20 70 4e 65 77 50 69 6e 2c PinLen, pNewPin,
24240 20 75 6c 4e 65 77 50 69 6e 4c 65 6e 29 3b 0a 0a ulNewPinLen);..
24250 09 69 66 20 28 73 65 74 5f 70 69 6e 5f 72 65 74 .if (set_pin_ret
24260 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f != CACKEY_PCSC_
24270 53 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28 63 61 S_OK) {...if (ca
24280 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 ckey_pin_command
24290 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 63 == NULL) {....c
242a0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 ackey_slots[slot
242b0 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 ID].token_flags
242c0 7c 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 |= CKF_LOGIN_REQ
242d0 55 49 52 45 44 3b 0a 09 09 7d 0a 0a 09 09 69 66 UIRED;...}....if
242e0 20 28 73 65 74 5f 70 69 6e 5f 72 65 74 20 3d 3d (set_pin_ret ==
242f0 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c CACKEY_PCSC_E_L
24300 4f 43 4b 45 44 29 20 7b 0a 09 09 09 63 61 63 6b OCKED) {....cack
24310 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d ey_slots[slotID]
24320 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 .token_flags |=
24330 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 4c 4f 43 CKF_USER_PIN_LOC
24340 4b 45 44 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 KED;...}..}...mu
24350 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 tex_retval = cac
24360 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b key_mutex_unlock
24370 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 (cackey_biglock)
24380 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 ;..if (mutex_ret
24390 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 val != 0) {...CA
243a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
243b0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 F("Error. Unloc
243c0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a king failed.");.
243d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 ...return(CKR_GE
243e0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d NERAL_ERROR);..}
243f0 0a 0a 09 73 77 69 74 63 68 20 28 73 65 74 5f 70 ...switch (set_p
24400 69 6e 5f 72 65 74 29 20 7b 0a 09 09 63 61 73 65 in_ret) {...case
24410 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f CACKEY_PCSC_S_O
24420 4b 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 K:....CACKEY_DEB
24430 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63 63 65 UG_PRINTF("Succe
24440 73 73 66 75 6c 6c 79 20 73 65 74 20 50 49 4e 2e ssfully set PIN.
24450 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 ");.....return(C
24460 4b 52 5f 4f 4b 29 3b 0a 09 09 63 61 73 65 20 43 KR_OK);...case C
24470 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 ACKEY_PCSC_E_BAD
24480 50 49 4e 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 PIN:....CACKEY_D
24490 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e EBUG_PRINTF("PIN
244a0 20 77 61 73 20 69 6e 76 61 6c 69 64 2e 22 29 3b was invalid.");
244b0 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f .....return(CKR_
244c0 50 49 4e 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 09 PIN_INVALID);...
244d0 63 61 73 65 20 43 41 43 4b 45 59 5f 50 43 53 43 case CACKEY_PCSC
244e0 5f 45 5f 4c 4f 43 4b 45 44 3a 0a 09 09 09 43 41 _E_LOCKED:....CA
244f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
24500 46 28 22 54 6f 6b 65 6e 20 69 73 20 6c 6f 63 6b F("Token is lock
24510 65 64 20 6f 72 20 74 68 69 73 20 63 68 61 6e 67 ed or this chang
24520 65 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 e is not permitt
24530 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 ed.");.....retur
24540 6e 28 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 n(CKR_PIN_LOCKED
24550 29 3b 0a 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 );...default:...
24560 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
24570 49 4e 54 46 28 22 53 6f 6d 65 74 68 69 6e 67 20 INTF("Something
24580 65 6c 73 65 20 77 65 6e 74 20 77 72 6f 6e 67 20 else went wrong
24590 63 68 61 6e 67 69 6e 67 20 74 68 65 20 50 49 4e changing the PIN
245a0 3a 20 25 69 22 2c 20 73 65 74 5f 70 69 6e 5f 72 : %i", set_pin_r
245b0 65 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 et);.....return(
245c0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f CKR_GENERAL_ERRO
245d0 52 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 R);..}...return(
245e0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f CKR_GENERAL_ERRO
245f0 52 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 R);.}..CK_DEFINE
24600 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c _FUNCTION(CK_RV,
24610 20 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 29 28 C_OpenSession)(
24620 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 CK_SLOT_ID slotI
24630 44 2c 20 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67 D, CK_FLAGS flag
24640 73 2c 20 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 s, CK_VOID_PTR p
24650 41 70 70 6c 69 63 61 74 69 6f 6e 2c 20 43 4b 5f Application, CK_
24660 4e 4f 54 49 46 59 20 6e 6f 74 69 66 79 2c 20 43 NOTIFY notify, C
24670 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 K_SESSION_HANDLE
24680 5f 50 54 52 20 70 68 53 65 73 73 69 6f 6e 29 20 _PTR phSession)
24690 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 {..unsigned long
246a0 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 idx;..int mutex
246b0 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 66 6f _retval;..int fo
246c0 75 6e 64 5f 73 65 73 73 69 6f 6e 20 3d 20 30 3b und_session = 0;
246d0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
246e0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
246f0 29 3b 0a 0a 09 69 66 20 28 28 66 6c 61 67 73 20 );...if ((flags
24700 26 20 43 4b 46 5f 53 45 52 49 41 4c 5f 53 45 53 & CKF_SERIAL_SES
24710 53 49 4f 4e 29 20 21 3d 20 43 4b 46 5f 53 45 52 SION) != CKF_SER
24720 49 41 4c 5f 53 45 53 53 49 4f 4e 29 20 7b 0a 09 IAL_SESSION) {..
24730 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 .return(CKR_SESS
24740 49 4f 4e 5f 50 41 52 41 4c 4c 45 4c 5f 4e 4f 54 ION_PARALLEL_NOT
24750 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 09 7d 0a _SUPPORTED);..}.
24760 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e ..if (!cackey_in
24770 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 itialized) {...C
24780 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
24790 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 TF("Error. Not
247a0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a initialized.");.
247b0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 ...return(CKR_CR
247c0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 YPTOKI_NOT_INITI
247d0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 ALIZED);..}...if
247e0 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 (slotID < 0 ||
247f0 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f slotID >= (sizeo
24800 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 f(cackey_slots)
24810 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f / sizeof(cackey_
24820 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 slots[0]))) {...
24830 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
24840 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 NTF("Error. Inva
24850 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 lid slot request
24860 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 ed (%lu), outsid
24870 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 e of valid range
24880 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 ", slotID);....r
24890 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 eturn(CKR_SLOT_I
248a0 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a D_INVALID);..}..
248b0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 .mutex_retval =
248c0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 cackey_mutex_loc
248d0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
248e0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 );..if (mutex_re
248f0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 tval != 0) {...C
24900 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
24910 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b TF("Error. Lock
24920 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a ing failed.");..
24930 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e ..return(CKR_GEN
24940 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a ERAL_ERROR);..}.
24950 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f ..if (cackey_slo
24960 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 ts[slotID].activ
24970 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b e == 0) {...CACK
24980 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
24990 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 "Error. Invalid
249a0 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 slot requested (
249b0 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 %lu), slot not c
249c0 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 urrently active"
249d0 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 , slotID);....ca
249e0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 ckey_mutex_unloc
249f0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
24a00 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
24a10 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 _SLOT_ID_INVALID
24a20 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 );..}.../* Verif
24a30 79 20 74 68 61 74 20 74 68 65 20 63 61 72 64 20 y that the card
24a40 69 73 20 61 63 74 75 61 6c 6c 79 20 69 6e 20 74 is actually in t
24a50 68 65 20 73 6c 6f 74 2e 20 2a 2f 0a 09 2f 2a 20 he slot. */../*
24a60 58 58 58 3a 20 43 68 65 63 6b 20 74 6f 20 6d 61 XXX: Check to ma
24a70 6b 65 20 73 75 72 65 20 74 68 69 73 20 69 73 20 ke sure this is
24a80 69 6e 20 74 68 65 20 50 4b 43 53 23 31 31 20 73 in the PKCS#11 s
24a90 70 65 63 69 66 69 63 61 74 69 6f 6e 20 2a 2f 0a pecification */.
24aa0 09 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 .if (cackey_toke
24ab0 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65 n_present(&cacke
24ac0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 y_slots[slotID])
24ad0 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f != CACKEY_PCSC_
24ae0 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 S_TOKENPRESENT)
24af0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
24b00 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
24b10 20 43 61 72 64 20 6e 6f 74 20 70 72 65 73 65 6e Card not presen
24b20 74 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 43 4b t. Returning CK
24b30 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 R_DEVICE_REMOVED
24b40 22 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 ");....cackey_mu
24b50 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 tex_unlock(cacke
24b60 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 y_biglock);....r
24b70 65 74 75 72 6e 28 43 4b 52 5f 44 45 56 49 43 45 eturn(CKR_DEVICE
24b80 5f 52 45 4d 4f 56 45 44 29 3b 0a 09 7d 0a 0a 09 _REMOVED);..}...
24b90 66 6f 72 20 28 69 64 78 20 3d 20 31 3b 20 69 64 for (idx = 1; id
24ba0 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b x < (sizeof(cack
24bb0 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 ey_sessions) / s
24bc0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 izeof(cackey_ses
24bd0 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b sions[0])); idx+
24be0 2b 29 20 7b 0a 09 09 69 66 20 28 21 63 61 63 6b +) {...if (!cack
24bf0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d ey_sessions[idx]
24c00 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 66 6f .active) {....fo
24c10 75 6e 64 5f 73 65 73 73 69 6f 6e 20 3d 20 31 3b und_session = 1;
24c20 0a 0a 09 09 09 2a 70 68 53 65 73 73 69 6f 6e 20 .....*phSession
24c30 3d 20 69 64 78 3b 0a 0a 09 09 09 63 61 63 6b 65 = idx;.....cacke
24c40 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e y_sessions[idx].
24c50 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 09 09 63 active = 1;....c
24c60 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 ackey_sessions[i
24c70 64 78 5d 2e 73 6c 6f 74 49 44 20 3d 20 73 6c 6f dx].slotID = slo
24c80 74 49 44 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 tID;....cackey_s
24c90 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 74 61 essions[idx].sta
24ca0 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 50 55 42 4c te = CKS_RO_PUBL
24cb0 49 43 5f 53 45 53 53 49 4f 4e 3b 0a 09 09 09 63 IC_SESSION;....c
24cc0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 ackey_sessions[i
24cd0 64 78 5d 2e 66 6c 61 67 73 20 3d 20 66 6c 61 67 dx].flags = flag
24ce0 73 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 s;....cackey_ses
24cf0 73 69 6f 6e 73 5b 69 64 78 5d 2e 75 6c 44 65 76 sions[idx].ulDev
24d00 69 63 65 45 72 72 6f 72 20 3d 20 30 3b 0a 09 09 iceError = 0;...
24d10 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 .cackey_sessions
24d20 5b 69 64 78 5d 2e 70 41 70 70 6c 69 63 61 74 69 [idx].pApplicati
24d30 6f 6e 20 3d 20 70 41 70 70 6c 69 63 61 74 69 6f on = pApplicatio
24d40 6e 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 n;....cackey_ses
24d50 73 69 6f 6e 73 5b 69 64 78 5d 2e 4e 6f 74 69 66 sions[idx].Notif
24d60 79 20 3d 20 6e 6f 74 69 66 79 3b 0a 0a 09 09 09 y = notify;.....
24d70 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
24d80 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 idx].identities
24d90 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63 61 63 6b 65 = NULL;....cacke
24da0 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e y_sessions[idx].
24db0 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 identities_count
24dc0 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 = 0;.....cackey
24dd0 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 _sessions[idx].s
24de0 65 61 72 63 68 5f 61 63 74 69 76 65 20 3d 20 30 earch_active = 0
24df0 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 ;.....cackey_ses
24e00 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 69 67 6e 5f sions[idx].sign_
24e10 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 active = 0;.....
24e20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
24e30 69 64 78 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 idx].decrypt_act
24e40 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 ive = 0;.....cac
24e50 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 key_sessions[idx
24e60 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63 ].identities = c
24e70 61 63 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e 74 ackey_read_ident
24e80 69 74 69 65 73 28 26 63 61 63 6b 65 79 5f 73 6c ities(&cackey_sl
24e90 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 26 63 61 ots[slotID], &ca
24ea0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 ckey_sessions[id
24eb0 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f x].identities_co
24ec0 75 6e 74 29 3b 0a 0a 0a 09 09 09 62 72 65 61 6b unt);......break
24ed0 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 ;...}..}...mutex
24ee0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 _retval = cackey
24ef0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 _mutex_unlock(ca
24f00 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 ckey_biglock);..
24f10 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c if (mutex_retval
24f20 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 != 0) {...CACKE
24f30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
24f40 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e Error. Unlockin
24f50 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 g failed.");....
24f60 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 return(CKR_GENER
24f70 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 AL_ERROR);..}...
24f80 69 66 20 28 21 66 6f 75 6e 64 5f 73 65 73 73 69 if (!found_sessi
24f90 6f 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 on) {...CACKEY_D
24fa0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
24fb0 75 72 6e 69 6e 67 20 43 4b 52 5f 53 45 53 53 49 urning CKR_SESSI
24fc0 4f 4e 5f 43 4f 55 4e 54 20 28 25 69 29 22 2c 20 ON_COUNT (%i)",
24fd0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e CKR_SESSION_COUN
24fe0 54 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b T);....return(CK
24ff0 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 29 R_SESSION_COUNT)
25000 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ;..}...CACKEY_DE
25010 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
25020 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 rning CKR_OK (%i
25030 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 )", CKR_OK);...r
25040 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d eturn(CKR_OK);.}
25050 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 ..CK_DEFINE_FUNC
25060 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6c TION(CK_RV, C_Cl
25070 6f 73 65 53 65 73 73 69 6f 6e 29 28 43 4b 5f 53 oseSession)(CK_S
25080 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 ESSION_HANDLE hS
25090 65 73 73 69 6f 6e 29 20 7b 0a 09 69 6e 74 20 6d ession) {..int m
250a0 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 utex_retval;...C
250b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
250c0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
250d0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 .if (!cackey_ini
250e0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 tialized) {...CA
250f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
25100 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 F("Error. Not i
25110 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a nitialized.");..
25120 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 ..return(CKR_CRY
25130 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 PTOKI_NOT_INITIA
25140 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 LIZED);..}...if
25150 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c (hSession == 0 |
25160 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 | hSession >= (s
25170 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 izeof(cackey_ses
25180 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 sions) / sizeof(
25190 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
251a0 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 0]))) {...CACKEY
251b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
251c0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f rror. Session o
251d0 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a ut of range.");.
251e0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f .....return(CKR_
251f0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 SESSION_HANDLE_I
25200 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 NVALID);..}...mu
25210 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 tex_retval = cac
25220 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 key_mutex_lock(c
25230 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
25240 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 .if (mutex_retva
25250 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b l != 0) {...CACK
25260 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
25270 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 "Error. Locking
25280 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 failed.");....r
25290 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 eturn(CKR_GENERA
252a0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 L_ERROR);..}...i
252b0 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 f (!cackey_sessi
252c0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 ons[hSession].ac
252d0 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 tive) {...cackey
252e0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 _mutex_unlock(ca
252f0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a ckey_biglock);..
25300 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
25310 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 RINTF("Error. S
25320 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 ession not activ
25330 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 e.");......retur
25340 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 n(CKR_SESSION_HA
25350 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 NDLE_INVALID);..
25360 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 }...cackey_sessi
25370 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 ons[hSession].ac
25380 74 69 76 65 20 3d 20 30 3b 0a 09 63 61 63 6b 65 tive = 0;..cacke
25390 79 5f 66 72 65 65 5f 69 64 65 6e 74 69 74 69 65 y_free_identitie
253a0 73 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e s(cackey_session
253b0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e s[hSession].iden
253c0 74 69 74 69 65 73 2c 20 63 61 63 6b 65 79 5f 73 tities, cackey_s
253d0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
253e0 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 ].identities_cou
253f0 6e 74 29 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 nt);...mutex_ret
25400 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 val = cackey_mut
25410 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 ex_unlock(cackey
25420 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 _biglock);..if (
25430 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 mutex_retval !=
25440 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 0) {...CACKEY_DE
25450 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
25460 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 r. Unlocking fa
25470 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 iled.");....retu
25480 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 rn(CKR_GENERAL_E
25490 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b RROR);..}...CACK
254a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
254b0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f "Returning CKR_O
254c0 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 K (%i)", CKR_OK)
254d0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f ;...return(CKR_O
254e0 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 K);.}..CK_DEFINE
254f0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c _FUNCTION(CK_RV,
25500 20 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 C_CloseAllSessi
25510 6f 6e 73 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 ons)(CK_SLOT_ID
25520 73 6c 6f 74 49 44 29 20 7b 0a 09 75 69 6e 74 33 slotID) {..uint3
25530 32 5f 74 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 2_t idx;..int mu
25540 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 tex_retval;...CA
25550 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
25560 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
25570 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 if (!cackey_init
25580 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 ialized) {...CAC
25590 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
255a0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e ("Error. Not in
255b0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 itialized.");...
255c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 .return(CKR_CRYP
255d0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c TOKI_NOT_INITIAL
255e0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 IZED);..}...if (
255f0 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c slotID < 0 || sl
25600 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 otID >= (sizeof(
25610 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 cackey_slots) /
25620 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c sizeof(cackey_sl
25630 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 ots[0]))) {...CA
25640 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
25650 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 F("Error. Invali
25660 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 d slot requested
25670 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 (%lu), outside
25680 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c of valid range",
25690 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 slotID);....ret
256a0 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f urn(CKR_SLOT_ID_
256b0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d INVALID);..}...m
256c0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 utex_retval = ca
256d0 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 ckey_mutex_lock(
256e0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
256f0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 ..if (mutex_retv
25700 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 al != 0) {...CAC
25710 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
25720 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e ("Error. Lockin
25730 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 g failed.");....
25740 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 return(CKR_GENER
25750 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 AL_ERROR);..}...
25760 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 if (cackey_slots
25770 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 [slotID].active
25780 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 == 0) {...CACKEY
25790 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
257a0 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c rror. Invalid sl
257b0 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c ot requested (%l
257c0 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 u), slot not cur
257d0 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 rently active",
257e0 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b slotID);....cack
257f0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 ey_mutex_unlock(
25800 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
25810 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 ....return(CKR_S
25820 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b LOT_ID_INVALID);
25830 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d ..}...for (idx =
25840 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 0; idx < (sizeo
25850 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e f(cackey_session
25860 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b s) / sizeof(cack
25870 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 ey_sessions[0]))
25880 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 ; idx++) {...if
25890 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 (cackey_sessions
258a0 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a [idx].active) {.
258b0 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 ...if (cackey_se
258c0 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74 ssions[idx].slot
258d0 49 44 20 21 3d 20 73 6c 6f 74 49 44 29 20 7b 0a ID != slotID) {.
258e0 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 ....continue;...
258f0 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 .}.....cackey_mu
25900 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 tex_unlock(cacke
25910 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 43 y_biglock);....C
25920 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 28 69 64 _CloseSession(id
25930 78 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 x);....cackey_mu
25940 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f tex_lock(cackey_
25950 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 09 7d biglock);...}..}
25960 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 ...mutex_retval
25970 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 = cackey_mutex_u
25980 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 nlock(cackey_big
25990 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 lock);..if (mute
259a0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b x_retval != 0) {
259b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
259c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
259d0 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 Unlocking failed
259e0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
259f0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 KR_GENERAL_ERROR
25a00 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 );..}...CACKEY_D
25a10 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
25a20 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 urning CKR_OK (%
25a30 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 i)", CKR_OK);...
25a40 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a return(CKR_OK);.
25a50 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e }..CK_DEFINE_FUN
25a60 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 CTION(CK_RV, C_G
25a70 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f 29 28 43 etSessionInfo)(C
25a80 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 K_SESSION_HANDLE
25a90 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 53 45 hSession, CK_SE
25aa0 53 53 49 4f 4e 5f 49 4e 46 4f 5f 50 54 52 20 70 SSION_INFO_PTR p
25ab0 49 6e 66 6f 29 20 7b 0a 09 69 6e 74 20 6d 75 74 Info) {..int mut
25ac0 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 ex_retval;...CAC
25ad0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
25ae0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 ("Called.");...i
25af0 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c f (pInfo == NULL
25b00 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
25b10 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
25b20 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e . pInfo is NULL.
25b30 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
25b40 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 R_ARGUMENTS_BAD)
25b50 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b ;..}...if (!cack
25b60 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 ey_initialized)
25b70 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
25b80 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
25b90 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 Not initialized
25ba0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
25bb0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f KR_CRYPTOKI_NOT_
25bc0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d INITIALIZED);..}
25bd0 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 ...if (hSession
25be0 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e == 0 || hSession
25bf0 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b >= (sizeof(cack
25c00 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 ey_sessions) / s
25c10 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 izeof(cackey_ses
25c20 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 sions[0]))) {...
25c30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
25c40 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 NTF("Error. Ses
25c50 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 sion out of rang
25c60 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 e.");......retur
25c70 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 n(CKR_SESSION_HA
25c80 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 NDLE_INVALID);..
25c90 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c }...mutex_retval
25ca0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f = cackey_mutex_
25cb0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
25cc0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 ock);..if (mutex
25cd0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a _retval != 0) {.
25ce0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
25cf0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c RINTF("Error. L
25d00 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 ocking failed.")
25d10 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
25d20 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a GENERAL_ERROR);.
25d30 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 .}...if (!cackey
25d40 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
25d50 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 on].active) {...
25d60 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c cackey_mutex_unl
25d70 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
25d80 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 ck);....CACKEY_D
25d90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
25da0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 or. Session not
25db0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 active.");.....
25dc0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 .return(CKR_SESS
25dd0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c ION_HANDLE_INVAL
25de0 49 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d ID);..}...pInfo-
25df0 3e 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 >slotID = cackey
25e00 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
25e10 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 09 70 49 6e on].slotID;..pIn
25e20 66 6f 2d 3e 73 74 61 74 65 20 3d 20 63 61 63 6b fo->state = cack
25e30 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
25e40 73 69 6f 6e 5d 2e 73 74 61 74 65 3b 0a 09 70 49 sion].state;..pI
25e50 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 63 61 63 nfo->flags = cac
25e60 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
25e70 73 73 69 6f 6e 5d 2e 66 6c 61 67 73 3b 0a 09 70 ssion].flags;..p
25e80 49 6e 66 6f 2d 3e 75 6c 44 65 76 69 63 65 45 72 Info->ulDeviceEr
25e90 72 6f 72 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 ror = cackey_ses
25ea0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
25eb0 75 6c 44 65 76 69 63 65 45 72 72 6f 72 3b 0a 0a ulDeviceError;..
25ec0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 .mutex_retval =
25ed0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c cackey_mutex_unl
25ee0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
25ef0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f ck);..if (mutex_
25f00 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 retval != 0) {..
25f10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
25f20 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e INTF("Error. Un
25f30 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 locking failed."
25f40 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
25f50 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b _GENERAL_ERROR);
25f60 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 ..}...CACKEY_DEB
25f70 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
25f80 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 ning CKR_OK (%i)
25f90 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 ", CKR_OK);...re
25fa0 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a turn(CKR_OK);.}.
25fb0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 .CK_DEFINE_FUNCT
25fc0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 ION(CK_RV, C_Get
25fd0 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 29 28 OperationState)(
25fe0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c CK_SESSION_HANDL
25ff0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 E hSession, CK_B
26000 59 54 45 5f 50 54 52 20 70 4f 70 65 72 61 74 69 YTE_PTR pOperati
26010 6f 6e 53 74 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e onState, CK_ULON
26020 47 5f 50 54 52 20 70 75 6c 4f 70 65 72 61 74 69 G_PTR pulOperati
26030 6f 6e 53 74 61 74 65 4c 65 6e 29 20 7b 0a 09 43 onStateLen) {..C
26040 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
26050 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
26060 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 .if (!cackey_ini
26070 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 tialized) {...CA
26080 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
26090 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 F("Error. Not i
260a0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a nitialized.");..
260b0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 ..return(CKR_CRY
260c0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 PTOKI_NOT_INITIA
260d0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 LIZED);..}...CAC
260e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
260f0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f ("Returning CKR_
26100 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
26110 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b PORTED (%i)", CK
26120 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
26130 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 UPPORTED);...ret
26140 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e urn(CKR_FUNCTION
26150 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
26160 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 .}..CK_DEFINE_FU
26170 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f NCTION(CK_RV, C_
26180 53 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 SetOperationStat
26190 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 e)(CK_SESSION_HA
261a0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 NDLE hSession, C
261b0 4b 5f 42 59 54 45 5f 50 54 52 20 70 4f 70 65 72 K_BYTE_PTR pOper
261c0 61 74 69 6f 6e 53 74 61 74 65 2c 20 43 4b 5f 55 ationState, CK_U
261d0 4c 4f 4e 47 20 75 6c 4f 70 65 72 61 74 69 6f 6e LONG ulOperation
261e0 53 74 61 74 65 4c 65 6e 2c 20 43 4b 5f 4f 42 4a StateLen, CK_OBJ
261f0 45 43 54 5f 48 41 4e 44 4c 45 20 68 45 6e 63 72 ECT_HANDLE hEncr
26200 79 70 74 69 6f 6e 4b 65 79 2c 20 43 4b 5f 4f 42 yptionKey, CK_OB
26210 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 41 75 74 JECT_HANDLE hAut
26220 68 65 6e 74 69 63 61 74 69 6f 6e 4b 65 79 29 20 henticationKey)
26230 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f {..CACKEY_DEBUG_
26240 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
26250 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 );...if (!cackey
26260 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
26270 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
26280 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e RINTF("Error. N
26290 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 ot initialized."
262a0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
262b0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e _CRYPTOKI_NOT_IN
262c0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
262d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
262e0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
262f0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
26300 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 _SUPPORTED (%i)"
26310 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e , CKR_FUNCTION_N
26320 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a OT_SUPPORTED);..
26330 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 .return(CKR_FUNC
26340 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
26350 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e ED);.}..CK_DEFIN
26360 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 E_FUNCTION(CK_RV
26370 2c 20 5f 43 5f 4c 6f 67 69 6e 4d 75 74 65 78 41 , _C_LoginMutexA
26380 72 67 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 rg)(CK_SESSION_H
26390 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 ANDLE hSession,
263a0 43 4b 5f 55 53 45 52 5f 54 59 50 45 20 75 73 65 CK_USER_TYPE use
263b0 72 54 79 70 65 2c 20 43 4b 5f 55 54 46 38 43 48 rType, CK_UTF8CH
263c0 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f AR_PTR pPin, CK_
263d0 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 2c 20 ULONG ulPinLen,
263e0 69 6e 74 20 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 int lock_mutex)
263f0 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c {..CK_SLOT_ID sl
26400 6f 74 49 44 3b 0a 09 63 61 63 6b 65 79 5f 72 65 otID;..cackey_re
26410 74 20 67 65 74 5f 70 69 6e 5f 72 65 74 3b 0a 09 t get_pin_ret;..
26420 63 68 61 72 20 70 69 6e 62 75 66 5b 36 34 5d 3b char pinbuf[64];
26430 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 ..int mutex_retv
26440 61 6c 3b 0a 09 69 6e 74 20 74 72 69 65 73 5f 72 al;..int tries_r
26450 65 6d 61 69 6e 69 6e 67 3b 0a 09 69 6e 74 20 6c emaining;..int l
26460 6f 67 69 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b ogin_ret;...CACK
26470 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
26480 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 "Called.");...if
26490 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 (!cackey_initia
264a0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 lized) {...CACKE
264b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
264c0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 Error. Not init
264d0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 ialized.");....r
264e0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f eturn(CKR_CRYPTO
264f0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a KI_NOT_INITIALIZ
26500 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 ED);..}...if (hS
26510 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 ession == 0 || h
26520 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 Session >= (size
26530 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f of(cackey_sessio
26540 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 ns) / sizeof(cac
26550 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 key_sessions[0])
26560 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 )) {...CACKEY_DE
26570 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
26580 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 r. Session out
26590 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a of range.");....
265a0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 ..return(CKR_SES
265b0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 SION_HANDLE_INVA
265c0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 LID);..}...if (u
265d0 73 65 72 54 79 70 65 20 21 3d 20 43 4b 55 5f 55 serType != CKU_U
265e0 53 45 52 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f SER) {...CACKEY_
265f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
26600 72 6f 72 2e 20 20 57 65 20 6f 6e 6c 79 20 73 75 ror. We only su
26610 70 70 6f 72 74 20 55 53 45 52 20 6d 6f 64 65 2c pport USER mode,
26620 20 61 73 6b 65 64 20 66 6f 72 20 25 6c 75 20 6d asked for %lu m
26630 6f 64 65 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 ode.", (unsigned
26640 20 6c 6f 6e 67 29 20 75 73 65 72 54 79 70 65 29 long) userType)
26650 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 55 ....return(CKR_U
26660 53 45 52 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 SER_TYPE_INVALID
26670 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6c 6f 63 6b );..}...if (lock
26680 5f 6d 75 74 65 78 29 20 7b 0a 09 09 6d 75 74 65 _mutex) {...mute
26690 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 x_retval = cacke
266a0 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 y_mutex_lock(cac
266b0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 key_biglock);...
266c0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c if (mutex_retval
266d0 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b != 0) {....CACK
266e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
266f0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 "Error. Locking
26700 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 failed.");.....
26710 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 return(CKR_GENER
26720 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 09 AL_ERROR);...}..
26730 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f }...if (!cackey_
26740 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
26750 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 69 n].active) {...i
26760 66 20 28 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b f (lock_mutex) {
26770 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 ....cackey_mutex
26780 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 _unlock(cackey_b
26790 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 0a 09 09 iglock);...}....
267a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
267b0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 NTF("Error. Ses
267c0 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e sion not active.
267d0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 ");......return(
267e0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 CKR_SESSION_HAND
267f0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a LE_INVALID);..}.
26800 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 ..slotID = cacke
26810 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
26820 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 ion].slotID;...i
26830 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c f (slotID < 0 ||
26840 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 slotID >= (size
26850 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 of(cackey_slots)
26860 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 / sizeof(cackey
26870 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 _slots[0]))) {..
26880 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
26890 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 INTF("Error. Inv
268a0 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 alid slot reques
268b0 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 ted (%lu), outsi
268c0 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 de of valid rang
268d0 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 e", slotID);....
268e0 69 66 20 28 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 if (lock_mutex)
268f0 7b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 {....cackey_mute
26900 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
26910 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 0a 09 biglock);...}...
26920 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 .return(CKR_GENE
26930 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a RAL_ERROR);..}..
26940 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 .if (cackey_slot
26950 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 s[slotID].active
26960 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 == 0) {...CACKE
26970 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
26980 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 Error. Invalid s
26990 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 lot requested (%
269a0 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 lu), slot not cu
269b0 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c rrently active",
269c0 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 69 66 20 slotID);....if
269d0 28 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 (lock_mutex) {..
269e0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 ..cackey_mutex_u
269f0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 nlock(cackey_big
26a00 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 0a 09 09 72 65 lock);...}....re
26a10 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c turn(CKR_GENERAL
26a20 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 _ERROR);..}...if
26a30 20 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d (cackey_pin_com
26a40 6d 61 6e 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a mand != NULL) {.
26a50 09 09 69 66 20 28 70 50 69 6e 20 21 3d 20 4e 55 ..if (pPin != NU
26a60 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f LL) {....CACKEY_
26a70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 72 DEBUG_PRINTF("Pr
26a80 6f 74 65 63 74 65 64 20 61 75 74 68 65 6e 74 69 otected authenti
26a90 63 61 74 69 6f 6e 20 70 61 74 68 20 69 6e 20 65 cation path in e
26aa0 66 66 65 63 74 20 61 6e 64 20 50 49 4e 20 70 72 ffect and PIN pr
26ab0 6f 76 69 64 65 64 20 21 3f 22 29 3b 0a 09 09 7d ovided !?");...}
26ac0 0a 0a 09 09 67 65 74 5f 70 69 6e 5f 72 65 74 20 ....get_pin_ret
26ad0 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 70 69 6e = cackey_get_pin
26ae0 28 70 69 6e 62 75 66 29 3b 0a 0a 09 09 69 66 20 (pinbuf);....if
26af0 28 67 65 74 5f 70 69 6e 5f 72 65 74 20 21 3d 20 (get_pin_ret !=
26b00 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b CACKEY_PCSC_S_OK
26b10 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 ) {....CACKEY_DE
26b20 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b BUG_PRINTF("cack
26b30 65 79 5f 67 65 74 5f 70 69 6e 28 29 20 72 65 74 ey_get_pin() ret
26b40 75 72 6e 65 64 20 69 6e 20 66 61 69 6c 75 72 65 urned in failure
26b50 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 65 20 50 , assuming the P
26b60 49 4e 20 77 61 73 20 69 6e 63 6f 72 72 65 63 74 IN was incorrect
26b70 2e 22 29 3b 0a 0a 09 09 09 69 66 20 28 6c 6f 63 .");.....if (loc
26b80 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09 09 63 k_mutex) {.....c
26b90 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f ackey_mutex_unlo
26ba0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
26bb0 6b 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 k);....}.....ret
26bc0 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f urn(CKR_PIN_INCO
26bd0 52 52 45 43 54 29 3b 0a 09 09 7d 0a 0a 09 09 70 RRECT);...}....p
26be0 50 69 6e 20 3d 20 28 43 4b 5f 55 54 46 38 43 48 Pin = (CK_UTF8CH
26bf0 41 52 5f 50 54 52 29 20 70 69 6e 62 75 66 3b 0a AR_PTR) pinbuf;.
26c00 09 09 75 6c 50 69 6e 4c 65 6e 20 3d 20 73 74 72 ..ulPinLen = str
26c10 6c 65 6e 28 70 69 6e 62 75 66 29 3b 0a 09 7d 0a len(pinbuf);..}.
26c20 0a 09 6c 6f 67 69 6e 5f 72 65 74 20 3d 20 63 61 ..login_ret = ca
26c30 63 6b 65 79 5f 6c 6f 67 69 6e 28 26 63 61 63 6b ckey_login(&cack
26c40 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d ey_slots[slotID]
26c50 2c 20 70 50 69 6e 2c 20 75 6c 50 69 6e 4c 65 6e , pPin, ulPinLen
26c60 2c 20 26 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 , &tries_remaini
26c70 6e 67 2c 20 33 29 3b 0a 09 69 66 20 28 6c 6f 67 ng, 3);..if (log
26c80 69 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 in_ret != CACKEY
26c90 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 _PCSC_S_OK) {...
26ca0 69 66 20 28 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 if (lock_mutex)
26cb0 7b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 {....cackey_mute
26cc0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
26cd0 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 0a 09 biglock);...}...
26ce0 09 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20 3d .if (login_ret =
26cf0 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f = CACKEY_PCSC_E_
26d00 4c 4f 43 4b 45 44 29 20 7b 0a 09 09 09 43 41 43 LOCKED) {....CAC
26d10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
26d20 28 22 45 72 72 6f 72 2e 20 20 54 6f 6b 65 6e 20 ("Error. Token
26d30 69 73 20 6c 6f 63 6b 65 64 2e 22 29 3b 0a 0a 09 is locked.");...
26d40 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 ..cackey_slots[s
26d50 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 lotID].token_fla
26d60 67 73 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50 gs |= CKF_USER_P
26d70 49 4e 5f 4c 4f 43 4b 45 44 3b 0a 0a 09 09 09 43 IN_LOCKED;.....C
26d80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
26d90 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b TF("Returning CK
26da0 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 20 28 25 69 R_PIN_LOCKED (%i
26db0 29 22 2c 20 28 69 6e 74 29 20 43 4b 52 5f 50 49 )", (int) CKR_PI
26dc0 4e 5f 4c 4f 43 4b 45 44 29 3b 0a 0a 09 09 09 72 N_LOCKED);.....r
26dd0 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 4c 4f eturn(CKR_PIN_LO
26de0 43 4b 45 44 29 3b 0a 09 09 7d 20 65 6c 73 65 20 CKED);...} else
26df0 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d if (login_ret ==
26e00 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 CACKEY_PCSC_E_B
26e10 41 44 50 49 4e 29 20 7b 0a 09 09 09 43 41 43 4b ADPIN) {....CACK
26e20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
26e30 22 45 72 72 6f 72 2e 20 20 49 6e 76 61 6c 69 64 "Error. Invalid
26e40 20 50 49 4e 2e 22 29 3b 0a 0a 09 09 09 63 61 63 PIN.");.....cac
26e50 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 key_slots[slotID
26e60 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d ].token_flags |=
26e70 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 43 4f CKF_USER_PIN_CO
26e80 55 4e 54 5f 4c 4f 57 3b 0a 0a 09 09 09 69 66 20 UNT_LOW;.....if
26e90 28 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 (tries_remaining
26ea0 20 3d 3d 20 31 29 20 7b 0a 09 09 09 09 63 61 63 == 1) {.....cac
26eb0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 key_slots[slotID
26ec0 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d ].token_flags |=
26ed0 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 46 49 CKF_USER_PIN_FI
26ee0 4e 41 4c 5f 54 52 59 3b 0a 09 09 09 7d 0a 0a 09 NAL_TRY;....}...
26ef0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
26f00 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
26f10 20 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 CKR_PIN_INCORRE
26f20 43 54 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20 CT (%i)", (int)
26f30 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 CKR_PIN_INCORREC
26f40 54 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 T);.....return(C
26f50 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 KR_PIN_INCORRECT
26f60 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 );...}....CACKEY
26f70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
26f80 72 72 6f 72 2e 20 20 55 6e 6b 6e 6f 77 6e 20 65 rror. Unknown e
26f90 72 72 6f 72 20 72 65 74 75 72 6e 65 64 20 66 72 rror returned fr
26fa0 6f 6d 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 om cackey_login(
26fb0 29 20 28 25 69 29 22 2c 20 6c 6f 67 69 6e 5f 72 ) (%i)", login_r
26fc0 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 et);....return(C
26fd0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 KR_GENERAL_ERROR
26fe0 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 );..}...cackey_s
26ff0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b lots[slotID].tok
27000 65 6e 5f 66 6c 61 67 73 20 26 3d 20 7e 28 43 4b en_flags &= ~(CK
27010 46 5f 55 53 45 52 5f 50 49 4e 5f 4c 4f 43 4b 45 F_USER_PIN_LOCKE
27020 44 20 7c 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e D | CKF_USER_PIN
27030 5f 43 4f 55 4e 54 5f 4c 4f 57 20 7c 20 43 4b 46 _COUNT_LOW | CKF
27040 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 20 _LOGIN_REQUIRED
27050 7c 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 46 | CKF_USER_PIN_F
27060 49 4e 41 4c 5f 54 52 59 29 3b 0a 0a 09 63 61 63 INAL_TRY);...cac
27070 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
27080 73 73 69 6f 6e 5d 2e 73 74 61 74 65 20 3d 20 43 ssion].state = C
27090 4b 53 5f 52 4f 5f 55 53 45 52 5f 46 55 4e 43 54 KS_RO_USER_FUNCT
270a0 49 4f 4e 53 3b 0a 0a 09 69 66 20 28 6c 6f 63 6b IONS;...if (lock
270b0 5f 6d 75 74 65 78 29 20 7b 0a 09 09 6d 75 74 65 _mutex) {...mute
270c0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 x_retval = cacke
270d0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
270e0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
270f0 09 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 ..if (mutex_retv
27100 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 al != 0) {....CA
27110 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
27120 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 F("Error. Unloc
27130 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a king failed.");.
27140 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 ....return(CKR_G
27150 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 ENERAL_ERROR);..
27160 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 .}..}...CACKEY_D
27170 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
27180 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 urning CKR_OK (%
27190 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 i)", CKR_OK);...
271a0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a return(CKR_OK);.
271b0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e }..CK_DEFINE_FUN
271c0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c CTION(CK_RV, C_L
271d0 6f 67 69 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e ogin)(CK_SESSION
271e0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e _HANDLE hSession
271f0 2c 20 43 4b 5f 55 53 45 52 5f 54 59 50 45 20 75 , CK_USER_TYPE u
27200 73 65 72 54 79 70 65 2c 20 43 4b 5f 55 54 46 38 serType, CK_UTF8
27210 43 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 CHAR_PTR pPin, C
27220 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e K_ULONG ulPinLen
27230 29 20 7b 0a 09 72 65 74 75 72 6e 28 5f 43 5f 4c ) {..return(_C_L
27240 6f 67 69 6e 4d 75 74 65 78 41 72 67 28 68 53 65 oginMutexArg(hSe
27250 73 73 69 6f 6e 2c 20 75 73 65 72 54 79 70 65 2c ssion, userType,
27260 20 70 50 69 6e 2c 20 75 6c 50 69 6e 4c 65 6e 2c pPin, ulPinLen,
27270 20 31 29 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 1));.}..CK_DEFI
27280 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 NE_FUNCTION(CK_R
27290 56 2c 20 43 5f 4c 6f 67 6f 75 74 29 28 43 4b 5f V, C_Logout)(CK_
272a0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 SESSION_HANDLE h
272b0 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 4b 5f 53 Session) {..CK_S
272c0 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 LOT_ID slotID;..
272d0 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c int mutex_retval
272e0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ;...CACKEY_DEBUG
272f0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
27300 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ");...if (!cacke
27310 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b y_initialized) {
27320 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
27330 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
27340 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e Not initialized.
27350 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
27360 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 R_CRYPTOKI_NOT_I
27370 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
27380 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d ..if (hSession =
27390 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 = 0 || hSession
273a0 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 >= (sizeof(cacke
273b0 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 y_sessions) / si
273c0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 zeof(cackey_sess
273d0 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 ions[0]))) {...C
273e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
273f0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 TF("Error. Sess
27400 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 ion out of range
27410 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e .");......return
27420 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e (CKR_SESSION_HAN
27430 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d DLE_INVALID);..}
27440 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 ...mutex_retval
27450 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c = cackey_mutex_l
27460 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
27470 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f ck);..if (mutex_
27480 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 retval != 0) {..
27490 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
274a0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f INTF("Error. Lo
274b0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b cking failed.");
274c0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 ....return(CKR_G
274d0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 ENERAL_ERROR);..
274e0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f }...if (!cackey_
274f0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
27500 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 n].active) {...c
27510 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f ackey_mutex_unlo
27520 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
27530 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 k);....CACKEY_DE
27540 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
27550 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 r. Session not
27560 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 active.");......
27570 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 return(CKR_SESSI
27580 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 ON_HANDLE_INVALI
27590 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 D);..}...slotID
275a0 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e = cackey_session
275b0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 s[hSession].slot
275c0 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 ID;...if (slotID
275d0 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e < 0 || slotID >
275e0 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 = (sizeof(cackey
275f0 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 _slots) / sizeof
27600 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d (cackey_slots[0]
27610 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ))) {...CACKEY_D
27620 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
27630 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 or. Invalid slot
27640 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 requested (%lu)
27650 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c , outside of val
27660 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 id range", slotI
27670 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b D);....return(CK
27680 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 R_GENERAL_ERROR)
27690 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 ;..}...if (cacke
276a0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e y_slots[slotID].
276b0 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 active == 0) {..
276c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
276d0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 INTF("Error. Inv
276e0 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 alid slot reques
276f0 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 ted (%lu), slot
27700 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 not currently ac
27710 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a tive", slotID);.
27720 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f ...cackey_mutex_
27730 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 unlock(cackey_bi
27740 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 glock);....retur
27750 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 n(CKR_GENERAL_ER
27760 52 4f 52 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 ROR);..}...cacke
27770 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
27780 69 6f 6e 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53 ion].state = CKS
27790 5f 52 4f 5f 50 55 42 4c 49 43 5f 53 45 53 53 49 _RO_PUBLIC_SESSI
277a0 4f 4e 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 ON;...if (cackey
277b0 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 3d 20 _pin_command ==
277c0 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 NULL) {...cackey
277d0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 _slots[slotID].t
277e0 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 oken_flags = CKF
277f0 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b _LOGIN_REQUIRED;
27800 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 63 61 63 ..} else {...cac
27810 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 key_slots[slotID
27820 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 ].token_flags =
27830 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 0;..}...mutex_re
27840 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 tval = cackey_mu
27850 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 tex_unlock(cacke
27860 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 y_biglock);..if
27870 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d (mutex_retval !=
27880 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 0) {...CACKEY_D
27890 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
278a0 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 or. Unlocking f
278b0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 ailed.");....ret
278c0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f urn(CKR_GENERAL_
278d0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 ERROR);..}...CAC
278e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
278f0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f ("Returning CKR_
27900 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b OK (%i)", CKR_OK
27910 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f );...return(CKR_
27920 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e OK);.}..CK_DEFIN
27930 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 E_FUNCTION(CK_RV
27940 2c 20 43 5f 43 72 65 61 74 65 4f 62 6a 65 63 74 , C_CreateObject
27950 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e )(CK_SESSION_HAN
27960 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b DLE hSession, CK
27970 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 _ATTRIBUTE_PTR p
27980 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f Template, CK_ULO
27990 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f NG ulCount, CK_O
279a0 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 BJECT_HANDLE_PTR
279b0 20 70 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 phObject) {..CA
279c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
279d0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
279e0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 if (!cackey_init
279f0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 ialized) {...CAC
27a00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
27a10 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e ("Error. Not in
27a20 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 itialized.");...
27a30 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 .return(CKR_CRYP
27a40 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c TOKI_NOT_INITIAL
27a50 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b IZED);..}...CACK
27a60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
27a70 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 "Returning CKR_F
27a80 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
27a90 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 ORTED (%i)", CKR
27aa0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
27ab0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 PPORTED);...retu
27ac0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f rn(CKR_FUNCTION_
27ad0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
27ae0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e }..CK_DEFINE_FUN
27af0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 CTION(CK_RV, C_C
27b00 6f 70 79 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45 opyObject)(CK_SE
27b10 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 SSION_HANDLE hSe
27b20 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 ssion, CK_OBJECT
27b30 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c _HANDLE hObject,
27b40 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 CK_ATTRIBUTE_PT
27b50 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f R pTemplate, CK_
27b60 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43 ULONG ulCount, C
27b70 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f K_OBJECT_HANDLE_
27b80 50 54 52 20 70 68 4e 65 77 4f 62 6a 65 63 74 29 PTR phNewObject)
27b90 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {..CACKEY_DEBUG
27ba0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
27bb0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ");...if (!cacke
27bc0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b y_initialized) {
27bd0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
27be0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
27bf0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e Not initialized.
27c00 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
27c10 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 R_CRYPTOKI_NOT_I
27c20 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
27c30 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
27c40 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
27c50 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f CKR_FUNCTION_NO
27c60 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 T_SUPPORTED (%i)
27c70 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f ", CKR_FUNCTION_
27c80 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
27c90 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e ..return(CKR_FUN
27ca0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
27cb0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 TED);.}..CK_DEFI
27cc0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 NE_FUNCTION(CK_R
27cd0 56 2c 20 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65 V, C_DestroyObje
27ce0 63 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 ct)(CK_SESSION_H
27cf0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 ANDLE hSession,
27d00 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 CK_OBJECT_HANDLE
27d10 20 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43 hObject) {..CAC
27d20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
27d30 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 ("Called.");...i
27d40 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 f (!cackey_initi
27d50 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b alized) {...CACK
27d60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
27d70 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 "Error. Not ini
27d80 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 tialized.");....
27d90 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 return(CKR_CRYPT
27da0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 OKI_NOT_INITIALI
27db0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 ZED);..}...CACKE
27dc0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
27dd0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 Returning CKR_FU
27de0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
27df0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f RTED (%i)", CKR_
27e00 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
27e10 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 PORTED);...retur
27e20 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e n(CKR_FUNCTION_N
27e30 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d OT_SUPPORTED);.}
27e40 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 ..CK_DEFINE_FUNC
27e50 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 TION(CK_RV, C_Ge
27e60 74 4f 62 6a 65 63 74 53 69 7a 65 29 28 43 4b 5f tObjectSize)(CK_
27e70 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 SESSION_HANDLE h
27e80 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 Session, CK_OBJE
27e90 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 CT_HANDLE hObjec
27ea0 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 t, CK_ULONG_PTR
27eb0 70 75 6c 53 69 7a 65 29 20 7b 0a 09 43 41 43 4b pulSize) {..CACK
27ec0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
27ed0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 "Called.");...if
27ee0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 (!cackey_initia
27ef0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 lized) {...CACKE
27f00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
27f10 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 Error. Not init
27f20 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 ialized.");....r
27f30 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f eturn(CKR_CRYPTO
27f40 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a KI_NOT_INITIALIZ
27f50 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 ED);..}...CACKEY
27f60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
27f70 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e eturning CKR_FUN
27f80 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
27f90 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 TED (%i)", CKR_F
27fa0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
27fb0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e ORTED);...return
27fc0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f (CKR_FUNCTION_NO
27fd0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a T_SUPPORTED);.}.
27fe0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 .CK_DEFINE_FUNCT
27ff0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 ION(CK_RV, C_Get
28000 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 29 28 AttributeValue)(
28010 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c CK_SESSION_HANDL
28020 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f E hSession, CK_O
28030 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 BJECT_HANDLE hOb
28040 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 ject, CK_ATTRIBU
28050 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 TE_PTR pTemplate
28060 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 , CK_ULONG ulCou
28070 6e 74 29 20 7b 0a 09 43 4b 5f 41 54 54 52 49 42 nt) {..CK_ATTRIB
28080 55 54 45 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a UTE *curr_attr;.
28090 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 .struct cackey_i
280a0 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 dentity *identit
280b0 79 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e y;..unsigned lon
280c0 67 20 69 64 65 6e 74 69 74 79 5f 69 64 78 2c 20 g identity_idx,
280d0 61 74 74 72 5f 69 64 78 2c 20 73 65 73 73 5f 61 attr_idx, sess_a
280e0 74 74 72 5f 69 64 78 2c 20 6e 75 6d 5f 69 64 73 ttr_idx, num_ids
280f0 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 ;..int mutex_ret
28100 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 val;..CK_RV retv
28110 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 43 4b al = CKR_OK;..CK
28120 5f 56 4f 49 44 5f 50 54 52 20 70 56 61 6c 75 65 _VOID_PTR pValue
28130 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 ;..CK_ULONG ulVa
28140 6c 75 65 4c 65 6e 3b 0a 0a 09 43 41 43 4b 45 59 lueLen;...CACKEY
28150 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 _DEBUG_PRINTF("C
28160 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 alled.");...if (
28170 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 !cackey_initiali
28180 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f zed) {...CACKEY_
28190 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
281a0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 ror. Not initia
281b0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 lized.");....ret
281c0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 urn(CKR_CRYPTOKI
281d0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 _NOT_INITIALIZED
281e0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 );..}...if (hSes
281f0 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 sion == 0 || hSe
28200 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 ssion >= (sizeof
28210 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 (cackey_sessions
28220 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 ) / sizeof(cacke
28230 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 y_sessions[0])))
28240 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
28250 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
28260 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 Session out of
28270 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 range.");......
28280 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 return(CKR_SESSI
28290 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 ON_HANDLE_INVALI
282a0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4f 62 D);..}...if (hOb
282b0 6a 65 63 74 20 3d 3d 20 30 29 20 7b 0a 09 09 43 ject == 0) {...C
282c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
282d0 54 46 28 22 45 72 72 6f 72 2e 20 20 4f 62 6a 65 TF("Error. Obje
282e0 63 74 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 ct handle out of
282f0 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 range.");......
28300 72 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 return(CKR_OBJEC
28310 54 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 T_HANDLE_INVALID
28320 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 43 6f );..}...if (ulCo
28330 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a unt == 0) {.../*
28340 20 53 68 6f 72 74 20 63 69 72 63 75 69 74 2c 20 Short circuit,
28350 69 66 20 7a 65 72 6f 20 6f 62 6a 65 63 74 73 20 if zero objects
28360 77 65 72 65 20 73 70 65 63 69 66 69 65 64 20 72 were specified r
28370 65 74 75 72 6e 20 7a 65 72 6f 20 69 74 65 6d 73 eturn zero items
28380 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a immediately */.
28390 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
283a0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
283b0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 CKR_OK (%i) (sh
283c0 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 ort circuit)", C
283d0 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 KR_OK);....retur
283e0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 n(CKR_OK);..}...
283f0 69 66 20 28 70 54 65 6d 70 6c 61 74 65 20 3d 3d if (pTemplate ==
28400 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 NULL) {...CACKE
28410 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
28420 45 72 72 6f 72 2e 20 20 70 54 65 6d 70 6c 61 74 Error. pTemplat
28430 65 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 e is NULL.");...
28440 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 .return(CKR_ARGU
28450 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a MENTS_BAD);..}..
28460 09 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3d 20 .identity_idx =
28470 68 4f 62 6a 65 63 74 20 2d 20 31 3b 0a 0a 09 6d hObject - 1;...m
28480 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 utex_retval = ca
28490 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 ckey_mutex_lock(
284a0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
284b0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 ..if (mutex_retv
284c0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 al != 0) {...CAC
284d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
284e0 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e ("Error. Lockin
284f0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 g failed.");....
28500 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 return(CKR_GENER
28510 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 AL_ERROR);..}...
28520 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 if (!cackey_sess
28530 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 ions[hSession].a
28540 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 ctive) {...cacke
28550 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
28560 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
28570 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
28580 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
28590 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 Session not acti
285a0 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 ve.");......retu
285b0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 rn(CKR_SESSION_H
285c0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a ANDLE_INVALID);.
285d0 09 7d 0a 0a 09 6e 75 6d 5f 69 64 73 20 3d 20 63 .}...num_ids = c
285e0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
285f0 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 Session].identit
28600 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69 66 20 ies_count;...if
28610 28 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3e 3d (identity_idx >=
28620 20 6e 75 6d 5f 69 64 73 29 20 7b 0a 09 09 63 61 num_ids) {...ca
28630 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 ckey_mutex_unloc
28640 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
28650 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 );....CACKEY_DEB
28660 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
28670 2e 20 20 4f 62 6a 65 63 74 20 68 61 6e 64 6c 65 . Object handle
28680 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 out of range.
28690 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3d 20 25 identity_idx = %
286a0 6c 75 2c 20 6e 75 6d 5f 69 64 73 20 3d 20 25 6c lu, num_ids = %l
286b0 75 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c u.", (unsigned l
286c0 6f 6e 67 29 20 69 64 65 6e 74 69 74 79 5f 69 64 ong) identity_id
286d0 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e x, (unsigned lon
286e0 67 29 20 6e 75 6d 5f 69 64 73 29 3b 0a 0a 09 09 g) num_ids);....
286f0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 return(CKR_OBJEC
28700 54 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 T_HANDLE_INVALID
28710 29 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74 69 74 79 );..}...identity
28720 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 = &cackey_sessi
28730 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 ons[hSession].id
28740 65 6e 74 69 74 69 65 73 5b 69 64 65 6e 74 69 74 entities[identit
28750 79 5f 69 64 78 5d 3b 0a 0a 09 66 6f 72 20 28 61 y_idx];...for (a
28760 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 61 74 74 ttr_idx = 0; att
28770 72 5f 69 64 78 20 3c 20 75 6c 43 6f 75 6e 74 3b r_idx < ulCount;
28780 20 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 attr_idx++) {..
28790 09 63 75 72 72 5f 61 74 74 72 20 3d 20 26 70 54 .curr_attr = &pT
287a0 65 6d 70 6c 61 74 65 5b 61 74 74 72 5f 69 64 78 emplate[attr_idx
287b0 5d 3b 0a 0a 09 09 70 56 61 6c 75 65 20 3d 20 4e ];....pValue = N
287c0 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65 4c 65 ULL;...ulValueLe
287d0 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 n = (CK_LONG) -1
287e0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 ;....CACKEY_DEBU
287f0 47 5f 50 52 49 4e 54 46 28 22 4c 6f 6f 6b 69 6e G_PRINTF("Lookin
28800 67 20 66 6f 72 20 61 74 74 72 69 62 75 74 65 20 g for attribute
28810 30 78 25 30 38 6c 78 20 28 69 64 65 6e 74 69 74 0x%08lx (identit
28820 79 3a 25 6c 75 29 20 2e 2e 2e 22 2c 20 28 75 6e y:%lu) ...", (un
28830 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 signed long) cur
28840 72 5f 61 74 74 72 2d 3e 74 79 70 65 2c 20 28 75 r_attr->type, (u
28850 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 nsigned long) id
28860 65 6e 74 69 74 79 5f 69 64 78 29 3b 0a 0a 09 09 entity_idx);....
28870 66 6f 72 20 28 73 65 73 73 5f 61 74 74 72 5f 69 for (sess_attr_i
28880 64 78 20 3d 20 30 3b 20 73 65 73 73 5f 61 74 74 dx = 0; sess_att
28890 72 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74 79 r_idx < identity
288a0 2d 3e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 ->attributes_cou
288b0 6e 74 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64 nt; sess_attr_id
288c0 78 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28 69 64 x++) {....if (id
288d0 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 entity->attribut
288e0 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 es[sess_attr_idx
288f0 5d 2e 74 79 70 65 20 3d 3d 20 63 75 72 72 5f 61 ].type == curr_a
28900 74 74 72 2d 3e 74 79 70 65 29 20 7b 0a 09 09 09 ttr->type) {....
28910 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
28920 49 4e 54 46 28 22 20 2e 2e 2e 20 66 6f 75 6e 64 INTF(" ... found
28930 20 69 74 2c 20 70 56 61 6c 75 65 20 3d 20 25 70 it, pValue = %p
28940 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 25 , ulValueLen = %
28950 6c 75 22 2c 20 69 64 65 6e 74 69 74 79 2d 3e 61 lu", identity->a
28960 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 ttributes[sess_a
28970 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 2c ttr_idx].pValue,
28980 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 identity->attri
28990 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f butes[sess_attr_
289a0 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 idx].ulValueLen)
289b0 3b 0a 09 09 09 09 0a 09 09 09 09 70 56 61 6c 75 ;..........pValu
289c0 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 e = identity->at
289d0 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 tributes[sess_at
289e0 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 3b 0a tr_idx].pValue;.
289f0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d ....ulValueLen =
28a00 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 identity->attri
28a10 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f butes[sess_attr_
28a20 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 3b idx].ulValueLen;
28a30 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 ....}...}....if
28a40 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c (curr_attr->pVal
28a50 75 65 20 26 26 20 70 56 61 6c 75 65 29 20 7b 0a ue && pValue) {.
28a60 09 09 09 69 66 20 28 63 75 72 72 5f 61 74 74 72 ...if (curr_attr
28a70 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d 20 ->ulValueLen >=
28a80 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09 ulValueLen) {...
28a90 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61 74 ..memcpy(curr_at
28aa0 74 72 2d 3e 70 56 61 6c 75 65 2c 20 70 56 61 6c tr->pValue, pVal
28ab0 75 65 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b ue, ulValueLen);
28ac0 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 ....} else {....
28ad0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 .ulValueLen = (C
28ae0 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 09 K_LONG) -1;.....
28af0 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 .retval = CKR_BU
28b00 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a FFER_TOO_SMALL;.
28b10 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 75 72 72 ...}...}....curr
28b20 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 _attr->ulValueLe
28b30 6e 20 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a n = ulValueLen;.
28b40 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 .}...mutex_retva
28b50 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 l = cackey_mutex
28b60 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 _unlock(cackey_b
28b70 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 iglock);..if (mu
28b80 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 tex_retval != 0)
28b90 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
28ba0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
28bb0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c Unlocking fail
28bc0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
28bd0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 (CKR_GENERAL_ERR
28be0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65 OR);..}...if (re
28bf0 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 41 54 54 52 tval == CKR_ATTR
28c00 49 42 55 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c IBUTE_TYPE_INVAL
28c10 49 44 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ID) {...CACKEY_D
28c20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
28c30 75 72 6e 69 6e 67 20 43 4b 52 5f 41 54 54 52 49 urning CKR_ATTRI
28c40 42 55 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49 BUTE_TYPE_INVALI
28c50 44 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20 72 D (%i)", (int) r
28c60 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 etval);..} else
28c70 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b if (retval == CK
28c80 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 R_BUFFER_TOO_SMA
28c90 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 LL) {...CACKEY_D
28ca0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
28cb0 75 72 6e 69 6e 67 20 43 4b 52 5f 42 55 46 46 45 urning CKR_BUFFE
28cc0 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28 25 69 29 R_TOO_SMALL (%i)
28cd0 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 ", (int) retval)
28ce0 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 72 65 ;..} else if (re
28cf0 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20 tval == CKR_OK)
28d00 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
28d10 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
28d20 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c ng CKR_OK (%i)",
28d30 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a (int) retval);.
28d40 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b .} else {...CACK
28d50 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
28d60 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 "Returning %i",
28d70 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 (int) retval);..
28d80 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 }...return(retva
28d90 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 l);.}..CK_DEFINE
28da0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c _FUNCTION(CK_RV,
28db0 20 43 5f 53 65 74 41 74 74 72 69 62 75 74 65 56 C_SetAttributeV
28dc0 61 6c 75 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e alue)(CK_SESSION
28dd0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e _HANDLE hSession
28de0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 , CK_OBJECT_HAND
28df0 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 LE hObject, CK_A
28e00 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 TTRIBUTE_PTR pTe
28e10 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 mplate, CK_ULONG
28e20 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41 43 ulCount) {..CAC
28e30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
28e40 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 ("Called.");...i
28e50 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 f (!cackey_initi
28e60 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b alized) {...CACK
28e70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
28e80 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 "Error. Not ini
28e90 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 tialized.");....
28ea0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 return(CKR_CRYPT
28eb0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 OKI_NOT_INITIALI
28ec0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 ZED);..}...CACKE
28ed0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
28ee0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 Returning CKR_FU
28ef0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
28f00 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f RTED (%i)", CKR_
28f10 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
28f20 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 PORTED);...retur
28f30 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e n(CKR_FUNCTION_N
28f40 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d OT_SUPPORTED);.}
28f50 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 ..CK_DEFINE_FUNC
28f60 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 TION(CK_RV, C_Fi
28f70 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 29 28 43 ndObjectsInit)(C
28f80 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 K_SESSION_HANDLE
28f90 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 41 54 hSession, CK_AT
28fa0 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d TRIBUTE_PTR pTem
28fb0 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 plate, CK_ULONG
28fc0 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 53 ulCount) {..CK_S
28fd0 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 LOT_ID slotID;..
28fe0 43 4b 5f 55 4c 4f 4e 47 20 69 64 78 3b 0a 09 69 CK_ULONG idx;..i
28ff0 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b nt mutex_retval;
29000 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
29010 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
29020 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 );...if (!cackey
29030 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
29040 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
29050 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e RINTF("Error. N
29060 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 ot initialized."
29070 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
29080 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e _CRYPTOKI_NOT_IN
29090 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
290a0 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d .if (hSession ==
290b0 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 0 || hSession >
290c0 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 = (sizeof(cackey
290d0 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a _sessions) / siz
290e0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 eof(cackey_sessi
290f0 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 ons[0]))) {...CA
29100 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
29110 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 F("Error. Sessi
29120 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e on out of range.
29130 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 ");......return(
29140 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 CKR_SESSION_HAND
29150 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a LE_INVALID);..}.
29160 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d ..mutex_retval =
29170 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f cackey_mutex_lo
29180 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
29190 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 k);..if (mutex_r
291a0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 etval != 0) {...
291b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
291c0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 NTF("Error. Loc
291d0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a king failed.");.
291e0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 ...return(CKR_GE
291f0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d NERAL_ERROR);..}
29200 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 ...if (!cackey_s
29210 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
29220 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 ].active) {...ca
29230 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 ckey_mutex_unloc
29240 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
29250 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 );....CACKEY_DEB
29260 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
29270 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 . Session not a
29280 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 ctive.");......r
29290 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f eturn(CKR_SESSIO
292a0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 N_HANDLE_INVALID
292b0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b );..}...if (cack
292c0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
292d0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 sion].search_act
292e0 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f ive) {...cackey_
292f0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 mutex_unlock(cac
29300 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 key_biglock);...
29310 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
29320 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 INTF("Error. Se
29330 61 72 63 68 20 61 6c 72 65 61 64 79 20 61 63 74 arch already act
29340 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 ive.");......ret
29350 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f urn(CKR_OPERATIO
29360 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 N_ACTIVE);..}...
29370 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f slotID = cackey_
29380 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
29390 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 n].slotID;...if
293a0 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 (slotID < 0 || s
293b0 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 lotID >= (sizeof
293c0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f (cackey_slots) /
293d0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 sizeof(cackey_s
293e0 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 lots[0]))) {...C
293f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
29400 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c TF("Error. Inval
29410 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 id slot requeste
29420 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 d (%lu), outside
29430 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 of valid range"
29440 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 , slotID);....re
29450 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c turn(CKR_GENERAL
29460 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 _ERROR);..}...if
29470 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 (cackey_slots[s
29480 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d lotID].active ==
29490 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 0) {...CACKEY_D
294a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
294b0 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 or. Invalid slot
294c0 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 requested (%lu)
294d0 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 , slot not curre
294e0 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c ntly active", sl
294f0 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 otID);....cackey
29500 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 _mutex_unlock(ca
29510 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a ckey_biglock);..
29520 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e ..return(CKR_GEN
29530 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a ERAL_ERROR);..}.
29540 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f ..if (cackey_slo
29550 74 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f ts[slotID].slot_
29560 72 65 73 65 74 29 20 7b 0a 09 09 43 41 43 4b 45 reset) {...CACKE
29570 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
29580 54 68 65 20 73 6c 6f 74 20 68 61 73 20 62 65 65 The slot has bee
29590 6e 20 72 65 73 65 74 20 73 69 6e 63 65 20 77 65 n reset since we
295a0 20 6c 61 73 74 20 6c 6f 6f 6b 65 64 20 66 6f 72 last looked for
295b0 20 69 64 65 6e 74 69 74 69 65 73 20 2d 2d 20 72 identities -- r
295c0 65 73 63 61 6e 6e 69 6e 67 22 29 3b 0a 0a 09 09 escanning");....
295d0 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 if (cackey_sessi
295e0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 ons[hSession].id
295f0 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c entities != NULL
29600 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 ) {....cackey_fr
29610 65 65 5f 69 64 65 6e 74 69 74 69 65 73 28 63 61 ee_identities(ca
29620 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
29630 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 ession].identiti
29640 65 73 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 es, cackey_sessi
29650 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 ons[hSession].id
29660 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b entities_count);
29670 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 .....cackey_sess
29680 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 ions[hSession].i
29690 64 65 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c 4c dentities = NULL
296a0 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 ;....cackey_sess
296b0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 ions[hSession].i
296c0 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 dentities_count
296d0 3d 20 30 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 = 0;...}....if (
296e0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f cackey_slots[slo
296f0 74 49 44 5d 2e 6c 61 62 65 6c 20 21 3d 20 4e 55 tID].label != NU
29700 4c 4c 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 LL) {....free(ca
29710 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 ckey_slots[slotI
29720 44 5d 2e 6c 61 62 65 6c 29 3b 0a 09 09 09 63 61 D].label);....ca
29730 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 ckey_slots[slotI
29740 44 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b D].label = NULL;
29750 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 6d ...}....cackey_m
29760 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 26 ark_slot_reset(&
29770 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f cackey_slots[slo
29780 74 49 44 5d 29 3b 0a 09 09 63 61 63 6b 65 79 5f tID]);...cackey_
29790 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c slots[slotID].sl
297a0 6f 74 5f 72 65 73 65 74 20 3d 20 30 3b 0a 09 7d ot_reset = 0;..}
297b0 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 ...if (cackey_se
297c0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
297d0 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 3d 20 4e .identities == N
297e0 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f ULL) {...cackey_
297f0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
29800 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20 n].identities =
29810 63 61 63 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e cackey_read_iden
29820 74 69 74 69 65 73 28 26 63 61 63 6b 65 79 5f 73 tities(&cackey_s
29830 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 26 63 lots[slotID], &c
29840 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
29850 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 Session].identit
29860 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 7d 0a 0a ies_count);..}..
29870 09 69 66 20 28 70 54 65 6d 70 6c 61 74 65 20 21 .if (pTemplate !
29880 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28 = NULL) {...if (
29890 75 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a ulCount != 0) {.
298a0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f ...cackey_sessio
298b0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 ns[hSession].sea
298c0 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 rch_query_count
298d0 3d 20 75 6c 43 6f 75 6e 74 3b 0a 09 09 09 63 61 = ulCount;....ca
298e0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
298f0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 ession].search_q
29900 75 65 72 79 20 3d 20 6d 61 6c 6c 6f 63 28 75 6c uery = malloc(ul
29910 43 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a Count * sizeof(*
29920 70 54 65 6d 70 6c 61 74 65 29 29 3b 0a 0a 09 09 pTemplate));....
29930 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 .memcpy(cackey_s
29940 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
29950 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 2c 20 ].search_query,
29960 70 54 65 6d 70 6c 61 74 65 2c 20 75 6c 43 6f 75 pTemplate, ulCou
29970 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70 54 65 nt * sizeof(*pTe
29980 6d 70 6c 61 74 65 29 29 3b 0a 09 09 09 66 6f 72 mplate));....for
29990 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c (idx = 0; idx <
299a0 20 75 6c 43 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 ulCount; idx++)
299b0 20 7b 0a 09 09 09 09 69 66 20 28 70 54 65 6d 70 {.....if (pTemp
299c0 6c 61 74 65 5b 69 64 78 5d 2e 75 6c 56 61 6c 75 late[idx].ulValu
299d0 65 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 09 eLen == 0) {....
299e0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e ..cackey_session
299f0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 s[hSession].sear
29a00 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 ch_query[idx].pV
29a10 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 alue = NULL;....
29a20 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 ...continue;....
29a30 09 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 .}......cackey_s
29a40 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
29a50 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69 ].search_query[i
29a60 64 78 5d 2e 70 56 61 6c 75 65 20 3d 20 6d 61 6c dx].pValue = mal
29a70 6c 6f 63 28 70 54 65 6d 70 6c 61 74 65 5b 69 64 loc(pTemplate[id
29a80 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a x].ulValueLen);.
29a90 0a 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f .....if (cackey_
29aa0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
29ab0 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b n].search_query[
29ac0 69 64 78 5d 2e 70 56 61 6c 75 65 29 20 7b 0a 09 idx].pValue) {..
29ad0 09 09 09 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 ....memcpy(cacke
29ae0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
29af0 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 ion].search_quer
29b00 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 70 y[idx].pValue, p
29b10 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 70 56 Template[idx].pV
29b20 61 6c 75 65 2c 20 70 54 65 6d 70 6c 61 74 65 5b alue, pTemplate[
29b30 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 idx].ulValueLen)
29b40 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 09 09 7d ;.....}....}...}
29b50 20 65 6c 73 65 20 7b 0a 09 09 09 63 61 63 6b 65 else {....cacke
29b60 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
29b70 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 ion].search_quer
29b80 79 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 09 y_count = 0;....
29b90 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
29ba0 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 hSession].search
29bb0 5f 71 75 65 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09 _query = NULL;..
29bc0 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 .}..} else {...i
29bd0 66 20 28 75 6c 43 6f 75 6e 74 20 21 3d 20 30 29 f (ulCount != 0)
29be0 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 {....cackey_mut
29bf0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 ex_unlock(cackey
29c00 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43 _biglock);.....C
29c10 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
29c20 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 TF("Error. Sear
29c30 63 68 20 71 75 65 72 79 20 73 70 65 63 69 66 69 ch query specifi
29c40 65 64 20 61 73 20 4e 55 4c 4c 2c 20 62 75 74 20 ed as NULL, but
29c50 6e 75 6d 62 65 72 20 6f 66 20 71 75 65 72 79 20 number of query
29c60 74 65 72 6d 73 20 6e 6f 74 20 73 70 65 63 69 66 terms not specif
29c70 69 65 64 20 61 73 20 30 2e 22 29 3b 0a 0a 09 09 ied as 0.");....
29c80 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 .return(CKR_ARGU
29c90 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09 7d 0a MENTS_BAD);...}.
29ca0 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f ...cackey_sessio
29cb0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 ns[hSession].sea
29cc0 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 rch_query_count
29cd0 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 65 = 0;...cackey_se
29ce0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
29cf0 2e 73 65 61 72 63 68 5f 71 75 65 72 79 20 3d 20 .search_query =
29d00 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 NULL;..}...cacke
29d10 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
29d20 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 ion].search_acti
29d30 76 65 20 3d 20 31 3b 0a 09 63 61 63 6b 65 79 5f ve = 1;..cackey_
29d40 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
29d50 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 5f 69 n].search_curr_i
29d60 64 20 3d 20 30 3b 0a 0a 09 6d 75 74 65 78 5f 72 d = 0;...mutex_r
29d70 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d etval = cackey_m
29d80 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b utex_unlock(cack
29d90 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 ey_biglock);..if
29da0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 (mutex_retval !
29db0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f = 0) {...CACKEY_
29dc0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
29dd0 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 ror. Unlocking
29de0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 failed.");....re
29df0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c turn(CKR_GENERAL
29e00 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 _ERROR);..}...CA
29e10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
29e20 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 F("Returning CKR
29e30 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f _OK (%i)", CKR_O
29e40 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 K);...return(CKR
29e50 5f 4f 4b 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 _OK);.}..static
29e60 69 6e 74 20 63 61 63 6b 65 79 5f 70 6b 63 73 31 int cackey_pkcs1
29e70 31 5f 63 6f 6d 70 61 72 65 5f 61 74 74 72 69 62 1_compare_attrib
29e80 75 74 65 73 28 43 4b 5f 41 54 54 52 49 42 55 54 utes(CK_ATTRIBUT
29e90 45 20 2a 61 2c 20 43 4b 5f 41 54 54 52 49 42 55 E *a, CK_ATTRIBU
29ea0 54 45 20 2a 62 29 20 7b 0a 09 75 6e 73 69 67 6e TE *b) {..unsign
29eb0 65 64 20 63 68 61 72 20 2a 73 6d 61 6c 6c 62 75 ed char *smallbu
29ec0 66 2c 20 2a 6c 61 72 67 65 62 75 66 3b 0a 09 73 f, *largebuf;..s
29ed0 69 7a 65 5f 74 20 73 6d 61 6c 6c 62 75 66 5f 6c ize_t smallbuf_l
29ee0 65 6e 2c 20 6c 61 72 67 65 62 75 66 5f 6c 65 6e en, largebuf_len
29ef0 3b 0a 0a 09 69 66 20 28 61 2d 3e 74 79 70 65 20 ;...if (a->type
29f00 21 3d 20 62 2d 3e 74 79 70 65 29 20 7b 0a 09 09 != b->type) {...
29f10 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 09 return(0);..}...
29f20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
29f30 4e 54 46 28 22 20 20 20 20 2e 2e 2e 20 66 6f 75 NTF(" ... fou
29f40 6e 64 20 6d 61 74 63 68 69 6e 67 20 74 79 70 65 nd matching type
29f50 20 2e 2e 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 ...");...CACKEY
29f60 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 _DEBUG_PRINTBUF(
29f70 22 20 20 20 20 2e 2e 2e 20 6f 75 72 20 76 61 6c " ... our val
29f80 75 65 3a 22 2c 20 61 2d 3e 70 56 61 6c 75 65 2c ue:", a->pValue,
29f90 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b a->ulValueLen);
29fa0 0a 0a 09 69 66 20 28 62 2d 3e 70 56 61 6c 75 65 ...if (b->pValue
29fb0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 == NULL) {...CA
29fc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
29fd0 46 28 22 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f F(" ... fo
29fe0 75 6e 64 20 77 69 6c 64 63 61 72 64 20 6d 61 74 und wildcard mat
29ff0 63 68 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 ch");....return(
2a000 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 61 2d 3e 1);..}...if (a->
2a010 70 56 61 6c 75 65 20 3d 3d 20 4e 55 4c 4c 29 20 pValue == NULL)
2a020 7b 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 {...return(0);..
2a030 7d 0a 0a 20 09 69 66 20 28 62 2d 3e 75 6c 56 61 }.. .if (b->ulVa
2a040 6c 75 65 4c 65 6e 20 3d 3d 20 61 2d 3e 75 6c 56 lueLen == a->ulV
2a050 61 6c 75 65 4c 65 6e 20 26 26 20 6d 65 6d 63 6d alueLen && memcm
2a060 70 28 61 2d 3e 70 56 61 6c 75 65 2c 20 62 2d 3e p(a->pValue, b->
2a070 70 56 61 6c 75 65 2c 20 62 2d 3e 75 6c 56 61 6c pValue, b->ulVal
2a080 75 65 4c 65 6e 29 20 3d 3d 20 30 29 20 7b 0a 09 ueLen) == 0) {..
2a090 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
2a0a0 49 4e 54 46 28 22 20 20 20 20 20 20 20 2e 2e 2e INTF(" ...
2a0b0 20 66 6f 75 6e 64 20 65 78 61 63 74 20 6d 61 74 found exact mat
2a0c0 63 68 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 ch");....return(
2a0d0 31 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 1);..}...switch
2a0e0 28 61 2d 3e 74 79 70 65 29 20 7b 0a 09 09 63 61 (a->type) {...ca
2a0f0 73 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a se CKA_MODULUS:.
2a100 09 09 09 69 66 20 28 61 2d 3e 75 6c 56 61 6c 75 ...if (a->ulValu
2a110 65 4c 65 6e 20 3d 3d 20 62 2d 3e 75 6c 56 61 6c eLen == b->ulVal
2a120 75 65 4c 65 6e 29 20 7b 0a 09 09 09 09 62 72 65 ueLen) {.....bre
2a130 61 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 ak;....}.....if
2a140 28 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3e (a->ulValueLen >
2a150 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 20 b->ulValueLen)
2a160 7b 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66 20 3d {.....smallbuf =
2a170 20 62 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09 b->pValue;.....
2a180 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 20 3d 20 62 smallbuf_len = b
2a190 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 ->ulValueLen;...
2a1a0 09 09 09 6c 61 72 67 65 62 75 66 20 3d 20 61 2d ...largebuf = a-
2a1b0 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09 6c 61 72 >pValue;.....lar
2a1c0 67 65 62 75 66 5f 6c 65 6e 20 3d 20 61 2d 3e 75 gebuf_len = a->u
2a1d0 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d 20 lValueLen;....}
2a1e0 65 6c 73 65 20 7b 0a 09 09 09 09 73 6d 61 6c 6c else {.....small
2a1f0 62 75 66 20 3d 20 61 2d 3e 70 56 61 6c 75 65 3b buf = a->pValue;
2a200 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66 5f 6c 65 .....smallbuf_le
2a210 6e 20 3d 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 n = a->ulValueLe
2a220 6e 3b 0a 0a 09 09 09 09 6c 61 72 67 65 62 75 66 n;......largebuf
2a230 20 3d 20 62 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 = b->pValue;...
2a240 09 09 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20 3d ..largebuf_len =
2a250 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a b->ulValueLen;.
2a260 09 09 09 7d 0a 0a 09 09 09 66 6f 72 20 28 3b 20 ...}.....for (;
2a270 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20 21 3d 20 largebuf_len !=
2a280 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 3b 20 6c 61 smallbuf_len; la
2a290 72 67 65 62 75 66 2b 2b 2c 6c 61 72 67 65 62 75 rgebuf++,largebu
2a2a0 66 5f 6c 65 6e 2d 2d 29 20 7b 0a 09 09 09 09 69 f_len--) {.....i
2a2b0 66 20 28 6c 61 72 67 65 62 75 66 5b 30 5d 20 21 f (largebuf[0] !
2a2c0 3d 20 30 29 20 7b 0a 09 09 09 09 09 62 72 65 61 = 0) {......brea
2a2d0 6b 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 k;.....}....}...
2a2e0 09 09 69 66 20 28 6c 61 72 67 65 62 75 66 5f 6c ..if (largebuf_l
2a2f0 65 6e 20 21 3d 20 73 6d 61 6c 6c 62 75 66 5f 6c en != smallbuf_l
2a300 65 6e 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b en) {.....break;
2a310 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 6d 65 ....}.....if (me
2a320 6d 63 6d 70 28 6c 61 72 67 65 62 75 66 2c 20 73 mcmp(largebuf, s
2a330 6d 61 6c 6c 62 75 66 2c 20 73 6d 61 6c 6c 62 75 mallbuf, smallbu
2a340 66 5f 6c 65 6e 29 20 3d 3d 20 30 29 20 7b 0a 09 f_len) == 0) {..
2a350 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
2a360 50 52 49 4e 54 46 28 22 20 20 20 20 20 20 20 2e PRINTF(" .
2a370 2e 2e 20 66 6f 75 6e 64 20 61 70 70 72 6f 78 69 .. found approxi
2a380 6d 61 74 65 20 6d 61 74 63 68 22 29 3b 0a 0a 09 mate match");...
2a390 09 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 09 ...return(1);...
2a3a0 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d .}.....break;..}
2a3b0 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a ...return(0);.}.
2a3c0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 .CK_DEFINE_FUNCT
2a3d0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e ION(CK_RV, C_Fin
2a3e0 64 4f 62 6a 65 63 74 73 29 28 43 4b 5f 53 45 53 dObjects)(CK_SES
2a3f0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 SION_HANDLE hSes
2a400 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f sion, CK_OBJECT_
2a410 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4f 62 6a HANDLE_PTR phObj
2a420 65 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c ect, CK_ULONG ul
2a430 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 2c 20 MaxObjectCount,
2a440 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c CK_ULONG_PTR pul
2a450 4f 62 6a 65 63 74 43 6f 75 6e 74 29 20 7b 0a 09 ObjectCount) {..
2a460 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 struct cackey_id
2a470 65 6e 74 69 74 79 20 2a 63 75 72 72 5f 69 64 3b entity *curr_id;
2a480 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a ..CK_ATTRIBUTE *
2a490 63 75 72 72 5f 61 74 74 72 3b 0a 09 43 4b 5f 55 curr_attr;..CK_U
2a4a0 4c 4f 4e 47 20 63 75 72 72 5f 69 64 5f 69 64 78 LONG curr_id_idx
2a4b0 2c 20 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 , curr_out_id_id
2a4c0 78 2c 20 63 75 72 72 5f 61 74 74 72 5f 69 64 78 x, curr_attr_idx
2a4d0 2c 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 3b , sess_attr_idx;
2a4e0 0a 09 43 4b 5f 55 4c 4f 4e 47 20 6d 61 74 63 68 ..CK_ULONG match
2a4f0 65 64 5f 63 6f 75 6e 74 2c 20 70 72 65 76 5f 6d ed_count, prev_m
2a500 61 74 63 68 65 64 5f 63 6f 75 6e 74 3b 0a 09 69 atched_count;..i
2a510 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b nt mutex_retval;
2a520 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44 .#ifdef CACKEY_D
2a530 45 42 55 47 5f 53 45 41 52 43 48 5f 53 50 45 45 EBUG_SEARCH_SPEE
2a540 44 54 45 53 54 0a 09 73 74 72 75 63 74 20 74 69 DTEST..struct ti
2a550 6d 65 76 61 6c 20 73 74 61 72 74 2c 20 65 6e 64 meval start, end
2a560 3b 0a 09 75 69 6e 74 36 34 5f 74 20 73 74 61 72 ;..uint64_t star
2a570 74 5f 69 6e 74 2c 20 65 6e 64 5f 69 6e 74 3b 0a t_int, end_int;.
2a580 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f #endif...CACKEY_
2a590 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
2a5a0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 lled.");...if (!
2a5b0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a cackey_initializ
2a5c0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...CACKEY_D
2a5d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
2a5e0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c or. Not initial
2a5f0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 ized.");....retu
2a600 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f rn(CKR_CRYPTOKI_
2a610 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 NOT_INITIALIZED)
2a620 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 4f 62 ;..}...if (pulOb
2a630 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c jectCount == NUL
2a640 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 L) {...CACKEY_DE
2a650 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
2a660 72 2e 20 20 70 75 6c 4f 62 6a 65 63 74 43 6f 75 r. pulObjectCou
2a670 6e 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a nt is NULL.");..
2a680 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 ..return(CKR_ARG
2a690 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a UMENTS_BAD);..}.
2a6a0 0a 09 69 66 20 28 70 68 4f 62 6a 65 63 74 20 3d ..if (phObject =
2a6b0 3d 20 4e 55 4c 4c 20 26 26 20 75 6c 4d 61 78 4f = NULL && ulMaxO
2a6c0 62 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20 30 29 bjectCount == 0)
2a6d0 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 {.../* Short ci
2a6e0 72 63 75 69 74 2c 20 69 66 20 7a 65 72 6f 20 6f rcuit, if zero o
2a6f0 62 6a 65 63 74 73 20 77 65 72 65 20 73 70 65 63 bjects were spec
2a700 69 66 69 65 64 20 72 65 74 75 72 6e 20 7a 65 72 ified return zer
2a710 6f 20 69 74 65 6d 73 20 69 6d 6d 65 64 69 61 74 o items immediat
2a720 65 6c 79 20 2a 2f 0a 09 09 2a 70 75 6c 4f 62 6a ely */...*pulObj
2a730 65 63 74 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 ectCount = 0;...
2a740 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
2a750 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
2a760 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f CKR_OK (%i) (sho
2a770 72 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b rt circuit)", CK
2a780 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e R_OK);....return
2a790 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 (CKR_OK);..}...i
2a7a0 66 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e f (phObject == N
2a7b0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f ULL) {...CACKEY_
2a7c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
2a7d0 72 6f 72 2e 20 20 70 68 4f 62 6a 65 63 74 20 69 ror. phObject i
2a7e0 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 s NULL.");....re
2a7f0 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e turn(CKR_ARGUMEN
2a800 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 TS_BAD);..}...if
2a810 20 28 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 (ulMaxObjectCou
2a820 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 nt == 0) {...CAC
2a830 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
2a840 28 22 45 72 72 6f 72 2e 20 20 4d 61 78 69 6d 75 ("Error. Maximu
2a850 6d 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 m number of obje
2a860 63 74 73 20 73 70 65 63 69 66 69 65 64 20 61 73 cts specified as
2a870 20 7a 65 72 6f 2e 22 29 3b 0a 0a 09 09 72 65 74 zero.");....ret
2a880 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 urn(CKR_ARGUMENT
2a890 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 S_BAD);..}...if
2a8a0 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c (hSession == 0 |
2a8b0 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 | hSession >= (s
2a8c0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 izeof(cackey_ses
2a8d0 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 sions) / sizeof(
2a8e0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
2a8f0 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 0]))) {...CACKEY
2a900 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
2a910 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f rror. Session o
2a920 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a ut of range.");.
2a930 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f .....return(CKR_
2a940 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 SESSION_HANDLE_I
2a950 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 NVALID);..}...mu
2a960 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 tex_retval = cac
2a970 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 key_mutex_lock(c
2a980 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
2a990 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 .if (mutex_retva
2a9a0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b l != 0) {...CACK
2a9b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
2a9c0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 "Error. Locking
2a9d0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 failed.");....r
2a9e0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 eturn(CKR_GENERA
2a9f0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 L_ERROR);..}...i
2aa00 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 f (!cackey_sessi
2aa10 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 ons[hSession].ac
2aa20 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 tive) {...cackey
2aa30 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 _mutex_unlock(ca
2aa40 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a ckey_biglock);..
2aa50 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
2aa60 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 RINTF("Error. S
2aa70 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 ession not activ
2aa80 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 e.");......retur
2aa90 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 n(CKR_SESSION_HA
2aaa0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 NDLE_INVALID);..
2aab0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f }...if (!cackey_
2aac0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
2aad0 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 n].search_active
2aae0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 ) {...cackey_mut
2aaf0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 ex_unlock(cackey
2ab00 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 _biglock);....CA
2ab10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
2ab20 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 F("Error. Searc
2ab30 68 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b h not active.");
2ab40 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 ......return(CKR
2ab50 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 _OPERATION_NOT_I
2ab60 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
2ab70 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44 .#ifdef CACKEY_D
2ab80 45 42 55 47 5f 53 45 41 52 43 48 5f 53 50 45 45 EBUG_SEARCH_SPEE
2ab90 44 54 45 53 54 0a 09 67 65 74 74 69 6d 65 6f 66 DTEST..gettimeof
2aba0 64 61 79 28 26 73 74 61 72 74 2c 20 4e 55 4c 4c day(&start, NULL
2abb0 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 63 75 72 72 );.#endif...curr
2abc0 5f 6f 75 74 5f 69 64 5f 69 64 78 20 3d 20 30 3b _out_id_idx = 0;
2abd0 0a 09 66 6f 72 20 28 63 75 72 72 5f 69 64 5f 69 ..for (curr_id_i
2abe0 64 78 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 dx = cackey_sess
2abf0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 ions[hSession].s
2ac00 65 61 72 63 68 5f 63 75 72 72 5f 69 64 3b 20 63 earch_curr_id; c
2ac10 75 72 72 5f 69 64 5f 69 64 78 20 3c 20 63 61 63 urr_id_idx < cac
2ac20 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
2ac30 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 ssion].identitie
2ac40 73 5f 63 6f 75 6e 74 20 26 26 20 75 6c 4d 61 78 s_count && ulMax
2ac50 4f 62 6a 65 63 74 43 6f 75 6e 74 3b 20 63 75 72 ObjectCount; cur
2ac60 72 5f 69 64 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 r_id_idx++) {...
2ac70 63 75 72 72 5f 69 64 20 3d 20 26 63 61 63 6b 65 curr_id = &cacke
2ac80 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
2ac90 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b ion].identities[
2aca0 63 75 72 72 5f 69 64 5f 69 64 78 5d 3b 0a 0a 09 curr_id_idx];...
2acb0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
2acc0 49 4e 54 46 28 22 50 72 6f 63 65 73 73 69 6e 67 INTF("Processing
2acd0 20 69 64 65 6e 74 69 74 79 3a 25 6c 75 22 2c 20 identity:%lu",
2ace0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
2acf0 63 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a 0a 09 curr_id_idx);...
2ad00 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d .matched_count =
2ad10 20 30 3b 0a 0a 09 09 66 6f 72 20 28 63 75 72 72 0;....for (curr
2ad20 5f 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 63 _attr_idx = 0; c
2ad30 75 72 72 5f 61 74 74 72 5f 69 64 78 20 3c 20 63 urr_attr_idx < c
2ad40 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
2ad50 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f Session].search_
2ad60 71 75 65 72 79 5f 63 6f 75 6e 74 3b 20 63 75 72 query_count; cur
2ad70 72 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a r_attr_idx++) {.
2ad80 09 09 09 70 72 65 76 5f 6d 61 74 63 68 65 64 5f ...prev_matched_
2ad90 63 6f 75 6e 74 20 3d 20 6d 61 74 63 68 65 64 5f count = matched_
2ada0 63 6f 75 6e 74 3b 0a 0a 09 09 09 63 75 72 72 5f count;.....curr_
2adb0 61 74 74 72 20 3d 20 26 63 61 63 6b 65 79 5f 73 attr = &cackey_s
2adc0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
2add0 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 63 ].search_query[c
2ade0 75 72 72 5f 61 74 74 72 5f 69 64 78 5d 3b 0a 0a urr_attr_idx];..
2adf0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
2ae00 50 52 49 4e 54 46 28 22 20 20 43 68 65 63 6b 69 PRINTF(" Checki
2ae10 6e 67 20 66 6f 72 20 61 74 74 72 69 62 75 74 65 ng for attribute
2ae20 20 25 73 20 28 30 78 25 30 38 6c 78 29 20 69 6e %s (0x%08lx) in
2ae30 20 69 64 65 6e 74 69 74 79 3a 25 69 2e 2e 2e 22 identity:%i..."
2ae40 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 , CACKEY_DEBUG_F
2ae50 55 4e 43 5f 41 54 54 52 49 42 55 54 45 5f 54 4f UNC_ATTRIBUTE_TO
2ae60 5f 53 54 52 28 63 75 72 72 5f 61 74 74 72 2d 3e _STR(curr_attr->
2ae70 74 79 70 65 29 2c 20 28 75 6e 73 69 67 6e 65 64 type), (unsigned
2ae80 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 long) curr_attr
2ae90 2d 3e 74 79 70 65 2c 20 28 69 6e 74 29 20 63 75 ->type, (int) cu
2aea0 72 72 5f 69 64 5f 69 64 78 29 3b 0a 09 09 09 43 rr_id_idx);....C
2aeb0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
2aec0 54 42 55 46 28 22 20 20 20 20 56 61 6c 75 65 20 TBUF(" Value
2aed0 6c 6f 6f 6b 69 6e 67 20 66 6f 72 3a 22 2c 20 63 looking for:", c
2aee0 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 urr_attr->pValue
2aef0 2c 20 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56 , curr_attr->ulV
2af00 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 66 6f alueLen);.....fo
2af10 72 20 28 73 65 73 73 5f 61 74 74 72 5f 69 64 78 r (sess_attr_idx
2af20 20 3d 20 30 3b 20 73 65 73 73 5f 61 74 74 72 5f = 0; sess_attr_
2af30 69 64 78 20 3c 20 63 75 72 72 5f 69 64 2d 3e 61 idx < curr_id->a
2af40 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b ttributes_count;
2af50 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 2b 2b sess_attr_idx++
2af60 29 20 7b 0a 09 09 09 09 69 66 20 28 63 61 63 6b ) {.....if (cack
2af70 65 79 5f 70 6b 63 73 31 31 5f 63 6f 6d 70 61 72 ey_pkcs11_compar
2af80 65 5f 61 74 74 72 69 62 75 74 65 73 28 26 63 75 e_attributes(&cu
2af90 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65 rr_id->attribute
2afa0 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d s[sess_attr_idx]
2afb0 2c 20 63 75 72 72 5f 61 74 74 72 29 29 20 7b 0a , curr_attr)) {.
2afc0 09 09 09 09 09 6d 61 74 63 68 65 64 5f 63 6f 75 .....matched_cou
2afd0 6e 74 2b 2b 3b 0a 0a 09 09 09 09 09 62 72 65 61 nt++;.......brea
2afe0 6b 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 k;.....}....}...
2aff0 09 09 2f 2a 20 49 66 20 74 68 65 20 61 74 74 72 ../* If the attr
2b000 69 62 75 74 65 20 63 6f 75 6c 64 20 6e 6f 74 20 ibute could not
2b010 62 65 20 6d 61 74 63 68 65 64 2c 20 64 6f 20 6e be matched, do n
2b020 6f 74 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20 ot try to match
2b030 61 64 64 69 74 69 6f 6e 61 6c 20 61 74 74 72 69 additional attri
2b040 62 75 74 65 73 20 2a 2f 0a 09 09 09 69 66 20 28 butes */....if (
2b050 70 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75 prev_matched_cou
2b060 6e 74 20 3d 3d 20 6d 61 74 63 68 65 64 5f 63 6f nt == matched_co
2b070 75 6e 74 29 20 7b 0a 09 09 09 09 62 72 65 61 6b unt) {.....break
2b080 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 ;....}...}....if
2b090 20 28 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 (matched_count
2b0a0 3d 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f == cackey_sessio
2b0b0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 ns[hSession].sea
2b0c0 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 29 rch_query_count)
2b0d0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 {....CACKEY_DEB
2b0e0 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e UG_PRINTF(" ...
2b0f0 20 41 6c 6c 20 25 69 20 61 74 74 72 69 62 75 74 All %i attribut
2b100 65 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 66 es checked for f
2b110 6f 75 6e 64 2c 20 61 64 64 69 6e 67 20 69 64 65 ound, adding ide
2b120 6e 74 69 74 79 3a 25 69 20 74 6f 20 72 65 74 75 ntity:%i to retu
2b130 72 6e 65 64 20 6c 69 73 74 22 2c 20 28 69 6e 74 rned list", (int
2b140 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e ) cackey_session
2b150 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 s[hSession].sear
2b160 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 2c 20 ch_query_count,
2b170 28 69 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64 (int) curr_id_id
2b180 78 29 3b 0a 0a 09 09 09 70 68 4f 62 6a 65 63 74 x);.....phObject
2b190 5b 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 [curr_out_id_idx
2b1a0 5d 20 3d 20 63 75 72 72 5f 69 64 5f 69 64 78 20 ] = curr_id_idx
2b1b0 2b 20 31 3b 0a 0a 09 09 09 75 6c 4d 61 78 4f 62 + 1;.....ulMaxOb
2b1c0 6a 65 63 74 43 6f 75 6e 74 2d 2d 3b 0a 0a 09 09 jectCount--;....
2b1d0 09 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 .curr_out_id_idx
2b1e0 2b 2b 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 ++;...} else {..
2b1f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
2b200 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 4e 6f 74 RINTF(" ... Not
2b210 20 61 6c 6c 20 25 69 20 28 6f 6e 6c 79 20 66 6f all %i (only fo
2b220 75 6e 64 20 25 69 29 20 61 74 74 72 69 62 75 74 und %i) attribut
2b230 65 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 66 es checked for f
2b240 6f 75 6e 64 2c 20 6e 6f 74 20 61 64 64 69 6e 67 ound, not adding
2b250 20 69 64 65 6e 74 69 74 79 3a 25 69 22 2c 20 28 identity:%i", (
2b260 69 6e 74 29 20 63 61 63 6b 65 79 5f 73 65 73 73 int) cackey_sess
2b270 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 ions[hSession].s
2b280 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e earch_query_coun
2b290 74 2c 20 28 69 6e 74 29 20 6d 61 74 63 68 65 64 t, (int) matched
2b2a0 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63 75 _count, (int) cu
2b2b0 72 72 5f 69 64 5f 69 64 78 29 3b 0a 09 09 7d 0a rr_id_idx);...}.
2b2c0 09 7d 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 .}..cackey_sessi
2b2d0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 ons[hSession].se
2b2e0 61 72 63 68 5f 63 75 72 72 5f 69 64 20 3d 20 63 arch_curr_id = c
2b2f0 75 72 72 5f 69 64 5f 69 64 78 3b 0a 09 2a 70 75 urr_id_idx;..*pu
2b300 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 20 63 lObjectCount = c
2b310 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 3b 0a urr_out_id_idx;.
2b320 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44 .#ifdef CACKEY_D
2b330 45 42 55 47 5f 53 45 41 52 43 48 5f 53 50 45 45 EBUG_SEARCH_SPEE
2b340 44 54 45 53 54 0a 09 67 65 74 74 69 6d 65 6f 66 DTEST..gettimeof
2b350 64 61 79 28 26 65 6e 64 2c 20 4e 55 4c 4c 29 3b day(&end, NULL);
2b360 0a 09 73 74 61 72 74 5f 69 6e 74 20 3d 20 28 73 ..start_int = (s
2b370 74 61 72 74 2e 74 76 5f 73 65 63 20 2a 20 31 30 tart.tv_sec * 10
2b380 30 30 30 30 30 29 20 2b 20 73 74 61 72 74 2e 74 00000) + start.t
2b390 76 5f 75 73 65 63 3b 0a 09 65 6e 64 5f 69 6e 74 v_usec;..end_int
2b3a0 20 3d 20 28 65 6e 64 2e 74 76 5f 73 65 63 20 2a = (end.tv_sec *
2b3b0 20 31 30 30 30 30 30 30 29 20 2b 20 65 6e 64 2e 1000000) + end.
2b3c0 74 76 5f 75 73 65 63 3b 0a 09 66 70 72 69 6e 74 tv_usec;..fprint
2b3d0 66 28 73 74 64 65 72 72 2c 20 22 53 65 61 72 63 f(stderr, "Searc
2b3e0 68 20 74 6f 6f 6b 20 25 6c 75 20 6d 69 63 72 6f h took %lu micro
2b3f0 73 65 63 6f 6e 64 73 5c 6e 22 2c 20 28 75 6e 73 seconds\n", (uns
2b400 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 65 6e 64 igned long) (end
2b410 5f 69 6e 74 20 2d 20 73 74 61 72 74 5f 69 6e 74 _int - start_int
2b420 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 6d 75 74 ));.#endif...mut
2b430 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b ex_retval = cack
2b440 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 ey_mutex_unlock(
2b450 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
2b460 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 ..if (mutex_retv
2b470 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 al != 0) {...CAC
2b480 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
2b490 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b ("Error. Unlock
2b4a0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a ing failed.");..
2b4b0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e ..return(CKR_GEN
2b4c0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a ERAL_ERROR);..}.
2b4d0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
2b4e0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
2b4f0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 2c 20 6e 75 CKR_OK (%i), nu
2b500 6d 20 6f 62 6a 65 63 74 73 20 3d 20 25 6c 75 22 m objects = %lu"
2b510 2c 20 43 4b 52 5f 4f 4b 2c 20 2a 70 75 6c 4f 62 , CKR_OK, *pulOb
2b520 6a 65 63 74 43 6f 75 6e 74 29 3b 0a 0a 09 72 65 jectCount);...re
2b530 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a turn(CKR_OK);.}.
2b540 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 .CK_DEFINE_FUNCT
2b550 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e ION(CK_RV, C_Fin
2b560 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c 29 28 43 dObjectsFinal)(C
2b570 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 K_SESSION_HANDLE
2b580 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 4b hSession) {..CK
2b590 5f 55 4c 4f 4e 47 20 69 64 78 3b 0a 09 69 6e 74 _ULONG idx;..int
2b5a0 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a mutex_retval;..
2b5b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
2b5c0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
2b5d0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 ...if (!cackey_i
2b5e0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 nitialized) {...
2b5f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
2b600 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 NTF("Error. Not
2b610 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b initialized.");
2b620 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 ....return(CKR_C
2b630 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 RYPTOKI_NOT_INIT
2b640 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 IALIZED);..}...i
2b650 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 f (hSession == 0
2b660 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 || hSession >=
2b670 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 (sizeof(cackey_s
2b680 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f essions) / sizeo
2b690 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e f(cackey_session
2b6a0 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b s[0]))) {...CACK
2b6b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
2b6c0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e "Error. Session
2b6d0 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 out of range.")
2b6e0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b ;......return(CK
2b6f0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 R_SESSION_HANDLE
2b700 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 _INVALID);..}...
2b710 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 mutex_retval = c
2b720 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b ackey_mutex_lock
2b730 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 (cackey_biglock)
2b740 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 ;..if (mutex_ret
2b750 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 val != 0) {...CA
2b760 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
2b770 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 F("Error. Locki
2b780 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 ng failed.");...
2b790 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 .return(CKR_GENE
2b7a0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a RAL_ERROR);..}..
2b7b0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 .if (!cackey_ses
2b7c0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
2b7d0 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b active) {...cack
2b7e0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 ey_mutex_unlock(
2b7f0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
2b800 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
2b810 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
2b820 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 Session not act
2b830 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 ive.");......ret
2b840 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f urn(CKR_SESSION_
2b850 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b HANDLE_INVALID);
2b860 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ..}...if (!cacke
2b870 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
2b880 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 ion].search_acti
2b890 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d ve) {...cackey_m
2b8a0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b utex_unlock(cack
2b8b0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 ey_biglock);....
2b8c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
2b8d0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 NTF("Error. Sea
2b8e0 72 63 68 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 rch not active."
2b8f0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 );......return(C
2b900 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 KR_OPERATION_NOT
2b910 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 _INITIALIZED);..
2b920 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 }...cackey_sessi
2b930 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 ons[hSession].se
2b940 61 72 63 68 5f 61 63 74 69 76 65 20 3d 20 30 3b arch_active = 0;
2b950 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b ...for (idx = 0;
2b960 20 69 64 78 20 3c 20 63 61 63 6b 65 79 5f 73 65 idx < cackey_se
2b970 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
2b980 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f .search_query_co
2b990 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 unt; idx++) {...
2b9a0 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 if (cackey_sessi
2b9b0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 ons[hSession].se
2b9c0 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e arch_query[idx].
2b9d0 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 66 72 65 pValue) {....fre
2b9e0 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e e(cackey_session
2b9f0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 s[hSession].sear
2ba00 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 ch_query[idx].pV
2ba10 61 6c 75 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 alue);...}..}...
2ba20 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 if (cackey_sessi
2ba30 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 ons[hSession].se
2ba40 61 72 63 68 5f 71 75 65 72 79 29 20 7b 0a 09 09 arch_query) {...
2ba50 66 72 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73 free(cackey_sess
2ba60 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 ions[hSession].s
2ba70 65 61 72 63 68 5f 71 75 65 72 79 29 3b 0a 09 7d earch_query);..}
2ba80 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 ...mutex_retval
2ba90 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 = cackey_mutex_u
2baa0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 nlock(cackey_big
2bab0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 lock);..if (mute
2bac0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b x_retval != 0) {
2bad0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
2bae0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
2baf0 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 Unlocking failed
2bb00 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
2bb10 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 KR_GENERAL_ERROR
2bb20 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 );..}...CACKEY_D
2bb30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
2bb40 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 urning CKR_OK (%
2bb50 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 i)", CKR_OK);...
2bb60 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a return(CKR_OK);.
2bb70 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e }..CK_DEFINE_FUN
2bb80 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 CTION(CK_RV, C_E
2bb90 6e 63 72 79 70 74 49 6e 69 74 29 28 43 4b 5f 53 ncryptInit)(CK_S
2bba0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 ESSION_HANDLE hS
2bbb0 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 ession, CK_MECHA
2bbc0 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e NISM_PTR pMechan
2bbd0 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 ism, CK_OBJECT_H
2bbe0 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 ANDLE hKey) {..C
2bbf0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
2bc00 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
2bc10 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 .if (!cackey_ini
2bc20 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 tialized) {...CA
2bc30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
2bc40 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 F("Error. Not i
2bc50 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a nitialized.");..
2bc60 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 ..return(CKR_CRY
2bc70 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 PTOKI_NOT_INITIA
2bc80 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 LIZED);..}...CAC
2bc90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
2bca0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f ("Returning CKR_
2bcb0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
2bcc0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b PORTED (%i)", CK
2bcd0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
2bce0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 UPPORTED);...ret
2bcf0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e urn(CKR_FUNCTION
2bd00 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
2bd10 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 .}..CK_DEFINE_FU
2bd20 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f NCTION(CK_RV, C_
2bd30 45 6e 63 72 79 70 74 29 28 43 4b 5f 53 45 53 53 Encrypt)(CK_SESS
2bd40 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 ION_HANDLE hSess
2bd50 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 ion, CK_BYTE_PTR
2bd60 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 pData, CK_ULONG
2bd70 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 ulDataLen, CK_B
2bd80 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 YTE_PTR pEncrypt
2bd90 65 64 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 edData, CK_ULONG
2bda0 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65 _PTR pulEncrypte
2bdb0 64 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43 dDataLen) {..CAC
2bdc0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
2bdd0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 ("Called.");...i
2bde0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 f (!cackey_initi
2bdf0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b alized) {...CACK
2be00 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
2be10 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 "Error. Not ini
2be20 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 tialized.");....
2be30 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 return(CKR_CRYPT
2be40 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 OKI_NOT_INITIALI
2be50 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 ZED);..}...CACKE
2be60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
2be70 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 Returning CKR_FU
2be80 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
2be90 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f RTED (%i)", CKR_
2bea0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
2beb0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 PORTED);...retur
2bec0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e n(CKR_FUNCTION_N
2bed0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d OT_SUPPORTED);.}
2bee0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 ..CK_DEFINE_FUNC
2bef0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e TION(CK_RV, C_En
2bf00 63 72 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f cryptUpdate)(CK_
2bf10 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 SESSION_HANDLE h
2bf20 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 Session, CK_BYTE
2bf30 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 _PTR pPart, CK_U
2bf40 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 LONG ulPartLen,
2bf50 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 CK_BYTE_PTR pEnc
2bf60 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 ryptedPart, CK_U
2bf70 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 LONG_PTR pulEncr
2bf80 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a yptedPartLen) {.
2bf90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
2bfa0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
2bfb0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 ...if (!cackey_i
2bfc0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 nitialized) {...
2bfd0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
2bfe0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 NTF("Error. Not
2bff0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b initialized.");
2c000 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 ....return(CKR_C
2c010 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 RYPTOKI_NOT_INIT
2c020 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 IALIZED);..}...C
2c030 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
2c040 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b TF("Returning CK
2c050 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
2c060 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 UPPORTED (%i)",
2c070 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
2c080 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 _SUPPORTED);...r
2c090 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 eturn(CKR_FUNCTI
2c0a0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
2c0b0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f );.}..CK_DEFINE_
2c0c0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 FUNCTION(CK_RV,
2c0d0 43 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c 29 28 C_EncryptFinal)(
2c0e0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c CK_SESSION_HANDL
2c0f0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 E hSession, CK_B
2c100 59 54 45 5f 50 54 52 20 70 4c 61 73 74 45 6e 63 YTE_PTR pLastEnc
2c110 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 ryptedPart, CK_U
2c120 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4c 61 73 74 LONG_PTR pulLast
2c130 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e EncryptedPartLen
2c140 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 ) {..CACKEY_DEBU
2c150 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 G_PRINTF("Called
2c160 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b .");...if (!cack
2c170 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 ey_initialized)
2c180 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
2c190 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
2c1a0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 Not initialized
2c1b0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
2c1c0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f KR_CRYPTOKI_NOT_
2c1d0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d INITIALIZED);..}
2c1e0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
2c1f0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e PRINTF("Returnin
2c200 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e g CKR_FUNCTION_N
2c210 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 OT_SUPPORTED (%i
2c220 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e )", CKR_FUNCTION
2c230 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
2c240 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 ...return(CKR_FU
2c250 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
2c260 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 RTED);.}..CK_DEF
2c270 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f INE_FUNCTION(CK_
2c280 52 56 2c 20 43 5f 44 65 63 72 79 70 74 49 6e 69 RV, C_DecryptIni
2c290 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 t)(CK_SESSION_HA
2c2a0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 NDLE hSession, C
2c2b0 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 K_MECHANISM_PTR
2c2c0 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f pMechanism, CK_O
2c2d0 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 BJECT_HANDLE hKe
2c2e0 79 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f y) {..int mutex_
2c2f0 72 65 74 76 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d retval;...hKey--
2c300 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ;...CACKEY_DEBUG
2c310 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
2c320 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ");...if (!cacke
2c330 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b y_initialized) {
2c340 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
2c350 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
2c360 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e Not initialized.
2c370 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
2c380 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 R_CRYPTOKI_NOT_I
2c390 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
2c3a0 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d ..if (pMechanism
2c3b0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 == NULL) {...CA
2c3c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
2c3d0 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 F("Error. pMecha
2c3e0 6e 69 73 6d 20 69 73 20 4e 55 4c 4c 2e 22 29 3b nism is NULL.");
2c3f0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 ....return(CKR_A
2c400 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 RGUMENTS_BAD);..
2c410 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69 }...if (pMechani
2c420 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 21 3d sm->mechanism !=
2c430 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 29 20 7b CKM_RSA_PKCS) {
2c440 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
2c450 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 PRINTF("Error. p
2c460 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 Mechanism->mecha
2c470 6e 69 73 6d 20 6e 6f 74 20 73 70 65 63 69 66 69 nism not specifi
2c480 65 64 20 61 73 20 43 4b 4d 5f 52 53 41 5f 50 4b ed as CKM_RSA_PK
2c490 43 53 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 CS");....return(
2c4a0 43 4b 52 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 41 CKR_MECHANISM_PA
2c4b0 52 41 4d 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d RAM_INVALID);..}
2c4c0 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 ...if (hSession
2c4d0 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e == 0 || hSession
2c4e0 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b >= (sizeof(cack
2c4f0 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 ey_sessions) / s
2c500 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 izeof(cackey_ses
2c510 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 sions[0]))) {...
2c520 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
2c530 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 NTF("Error. Ses
2c540 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 sion out of rang
2c550 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 e.");......retur
2c560 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 n(CKR_SESSION_HA
2c570 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 NDLE_INVALID);..
2c580 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c }...mutex_retval
2c590 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f = cackey_mutex_
2c5a0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
2c5b0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 ock);..if (mutex
2c5c0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a _retval != 0) {.
2c5d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
2c5e0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c RINTF("Error. L
2c5f0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 ocking failed.")
2c600 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
2c610 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a GENERAL_ERROR);.
2c620 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 .}...if (!cackey
2c630 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
2c640 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 on].active) {...
2c650 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c cackey_mutex_unl
2c660 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
2c670 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 ck);....CACKEY_D
2c680 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
2c690 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 or. Session not
2c6a0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 active.");.....
2c6b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 .return(CKR_SESS
2c6c0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c ION_HANDLE_INVAL
2c6d0 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 ID);..}...if (ca
2c6e0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
2c6f0 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f ession].decrypt_
2c700 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b active) {...cack
2c710 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 ey_mutex_unlock(
2c720 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
2c730 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
2c740 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
2c750 20 44 65 63 72 79 70 74 20 61 6c 72 65 61 64 79 Decrypt already
2c760 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 22 29 3b in progress.");
2c770 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 ......return(CKR
2c780 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 _OPERATION_ACTIV
2c790 45 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65 E);..}...if (hKe
2c7a0 79 20 3e 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 y >= cackey_sess
2c7b0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 ions[hSession].i
2c7c0 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 dentities_count)
2c7d0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 {...cackey_mute
2c7e0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
2c7f0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 biglock);....CAC
2c800 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
2c810 28 22 45 72 72 6f 72 2e 20 20 4b 65 79 20 68 61 ("Error. Key ha
2c820 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 ndle out of rang
2c830 65 20 28 72 65 71 75 65 73 74 65 64 20 6b 65 79 e (requested key
2c840 20 25 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75 20 69 %lu, only %lu i
2c850 64 65 6e 74 69 74 69 65 73 20 61 76 61 69 6c 61 dentities availa
2c860 62 6c 65 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 ble).", (unsigne
2c870 64 20 6c 6f 6e 67 29 20 68 4b 65 79 2c 20 28 75 d long) hKey, (u
2c880 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61 nsigned long) ca
2c890 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
2c8a0 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 ession].identiti
2c8b0 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 es_count);....re
2c8c0 74 75 72 6e 28 43 4b 52 5f 4b 45 59 5f 48 41 4e turn(CKR_KEY_HAN
2c8d0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d DLE_INVALID);..}
2c8e0 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f ...cackey_sessio
2c8f0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 ns[hSession].dec
2c900 72 79 70 74 5f 61 63 74 69 76 65 20 3d 20 31 3b rypt_active = 1;
2c910 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f ...cackey_sessio
2c920 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 ns[hSession].dec
2c930 72 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d 20 3d rypt_mechanism =
2c940 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 pMechanism->mec
2c950 68 61 6e 69 73 6d 3b 0a 09 63 61 63 6b 65 79 5f hanism;..cackey_
2c960 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
2c970 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 5f n].decrypt_mech_
2c980 70 61 72 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73 parm = pMechanis
2c990 6d 2d 3e 70 50 61 72 61 6d 65 74 65 72 3b 0a 09 m->pParameter;..
2c9a0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
2c9b0 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 hSession].decryp
2c9c0 74 5f 6d 65 63 68 5f 70 61 72 6d 6c 65 6e 20 3d t_mech_parmlen =
2c9d0 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 75 6c 50 pMechanism->ulP
2c9e0 61 72 61 6d 65 74 65 72 4c 65 6e 3b 0a 09 63 61 arameterLen;..ca
2c9f0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
2ca00 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f ession].decrypt_
2ca10 69 64 65 6e 74 69 74 79 20 3d 20 26 63 61 63 6b identity = &cack
2ca20 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
2ca30 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 sion].identities
2ca40 5b 68 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f [hKey];...mutex_
2ca50 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f retval = cackey_
2ca60 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 mutex_unlock(cac
2ca70 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 key_biglock);..i
2ca80 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 f (mutex_retval
2ca90 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 != 0) {...CACKEY
2caa0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
2cab0 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 rror. Unlocking
2cac0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 failed.");....r
2cad0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 eturn(CKR_GENERA
2cae0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 L_ERROR);..}...C
2caf0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
2cb00 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b TF("Returning CK
2cb10 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f R_OK (%i)", CKR_
2cb20 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b OK);...return(CK
2cb30 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 R_OK);.}..CK_DEF
2cb40 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f INE_FUNCTION(CK_
2cb50 52 56 2c 20 43 5f 44 65 63 72 79 70 74 29 28 43 RV, C_Decrypt)(C
2cb60 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 K_SESSION_HANDLE
2cb70 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 hSession, CK_BY
2cb80 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 TE_PTR pEncrypte
2cb90 64 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 dData, CK_ULONG
2cba0 75 6c 45 6e 63 72 79 70 74 65 64 44 61 74 61 4c ulEncryptedDataL
2cbb0 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 en, CK_BYTE_PTR
2cbc0 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f pData, CK_ULONG_
2cbd0 50 54 52 20 70 75 6c 44 61 74 61 4c 65 6e 29 20 PTR pulDataLen)
2cbe0 7b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 64 61 74 61 {..CK_ULONG data
2cbf0 6c 65 6e 5f 75 70 64 61 74 65 2c 20 64 61 74 61 len_update, data
2cc00 6c 65 6e 5f 66 69 6e 61 6c 3b 0a 09 43 4b 5f 52 len_final;..CK_R
2cc10 56 20 64 65 63 72 79 70 74 5f 72 65 74 3b 0a 09 V decrypt_ret;..
2cc20 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c int mutex_retval
2cc30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ;...CACKEY_DEBUG
2cc40 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
2cc50 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ");...if (!cacke
2cc60 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b y_initialized) {
2cc70 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
2cc80 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
2cc90 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e Not initialized.
2cca0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
2ccb0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 R_CRYPTOKI_NOT_I
2ccc0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
2ccd0 0a 09 69 66 20 28 70 75 6c 44 61 74 61 4c 65 6e ..if (pulDataLen
2cce0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 == NULL) {...CA
2ccf0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
2cd00 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 44 61 74 F("Error. pulDat
2cd10 61 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b aLen is NULL.");
2cd20 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 ....return(CKR_A
2cd30 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 RGUMENTS_BAD);..
2cd40 7d 0a 0a 09 64 61 74 61 6c 65 6e 5f 75 70 64 61 }...datalen_upda
2cd50 74 65 20 3d 20 2a 70 75 6c 44 61 74 61 4c 65 6e te = *pulDataLen
2cd60 3b 0a 0a 09 64 65 63 72 79 70 74 5f 72 65 74 20 ;...decrypt_ret
2cd70 3d 20 43 5f 44 65 63 72 79 70 74 55 70 64 61 74 = C_DecryptUpdat
2cd80 65 28 68 53 65 73 73 69 6f 6e 2c 20 70 45 6e 63 e(hSession, pEnc
2cd90 72 79 70 74 65 64 44 61 74 61 2c 20 75 6c 45 6e ryptedData, ulEn
2cda0 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e 2c 20 cryptedDataLen,
2cdb0 70 44 61 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f pData, &datalen_
2cdc0 75 70 64 61 74 65 29 3b 0a 09 69 66 20 28 64 65 update);..if (de
2cdd0 63 72 79 70 74 5f 72 65 74 20 21 3d 20 43 4b 52 crypt_ret != CKR
2cde0 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f _OK) {...CACKEY_
2cdf0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
2ce00 72 6f 72 2e 20 20 44 65 63 72 79 70 74 55 70 64 ror. DecryptUpd
2ce10 61 74 65 28 29 20 72 65 74 75 72 6e 65 64 20 66 ate() returned f
2ce20 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75 ailure (rv = %lu
2ce30 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c ).", (unsigned l
2ce40 6f 6e 67 29 20 64 65 63 72 79 70 74 5f 72 65 74 ong) decrypt_ret
2ce50 29 3b 0a 0a 09 09 69 66 20 28 64 65 63 72 79 70 );....if (decryp
2ce60 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f 42 55 46 t_ret != CKR_BUF
2ce70 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b FER_TOO_SMALL) {
2ce80 0a 09 09 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65 ..../* Terminate
2ce90 20 64 65 63 72 79 70 74 69 6f 6e 20 6f 70 65 72 decryption oper
2cea0 61 74 69 6f 6e 20 2a 2f 0a 0a 09 09 09 6d 75 74 ation */.....mut
2ceb0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b ex_retval = cack
2cec0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 ey_mutex_lock(ca
2ced0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 ckey_biglock);..
2cee0 09 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 ..if (mutex_retv
2cef0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 43 al != 0) {.....C
2cf00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
2cf10 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b TF("Error. Lock
2cf20 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a ing failed.");..
2cf30 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 ....return(CKR_G
2cf40 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 ENERAL_ERROR);..
2cf50 09 09 7d 0a 0a 09 09 09 69 66 20 28 21 63 61 63 ..}.....if (!cac
2cf60 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
2cf70 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b ssion].active) {
2cf80 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 .....cackey_mute
2cf90 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
2cfa0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 biglock);......C
2cfb0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
2cfc0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 TF("Error. Sess
2cfd0 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 ion not active."
2cfe0 29 3b 0a 09 09 0a 09 09 09 09 72 65 74 75 72 6e );........return
2cff0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e (CKR_SESSION_HAN
2d000 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 09 DLE_INVALID);...
2d010 09 7d 0a 0a 09 09 09 69 66 20 28 21 63 61 63 6b .}.....if (!cack
2d020 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
2d030 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 sion].decrypt_ac
2d040 74 69 76 65 29 20 7b 0a 09 09 09 09 63 61 63 6b tive) {.....cack
2d050 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 ey_mutex_unlock(
2d060 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
2d070 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 ......CACKEY_DEB
2d080 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
2d090 2e 20 20 44 65 63 72 79 70 74 20 6e 6f 74 20 61 . Decrypt not a
2d0a0 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09 ctive.");.......
2d0b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 .return(CKR_OPER
2d0c0 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 ATION_NOT_INITIA
2d0d0 4c 49 5a 45 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 LIZED);....}....
2d0e0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 .cackey_sessions
2d0f0 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 [hSession].decry
2d100 70 74 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a pt_active = 0;..
2d110 09 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 ...mutex_retval
2d120 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 = cackey_mutex_u
2d130 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 nlock(cackey_big
2d140 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75 lock);....if (mu
2d150 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 tex_retval != 0)
2d160 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 {.....CACKEY_DE
2d170 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
2d180 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 r. Unlocking fa
2d190 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 iled.");......re
2d1a0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c turn(CKR_GENERAL
2d1b0 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 09 09 _ERROR);....}...
2d1c0 7d 0a 0a 09 09 72 65 74 75 72 6e 28 64 65 63 72 }....return(decr
2d1d0 79 70 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 69 ypt_ret);..}...i
2d1e0 66 20 28 70 44 61 74 61 29 20 7b 0a 09 09 70 44 f (pData) {...pD
2d1f0 61 74 61 20 2b 3d 20 64 61 74 61 6c 65 6e 5f 75 ata += datalen_u
2d200 70 64 61 74 65 3b 0a 09 7d 0a 09 64 61 74 61 6c pdate;..}..datal
2d210 65 6e 5f 66 69 6e 61 6c 20 3d 20 2a 70 75 6c 44 en_final = *pulD
2d220 61 74 61 4c 65 6e 20 2d 20 64 61 74 61 6c 65 6e ataLen - datalen
2d230 5f 75 70 64 61 74 65 3b 0a 0a 09 64 65 63 72 79 _update;...decry
2d240 70 74 5f 72 65 74 20 3d 20 43 5f 44 65 63 72 79 pt_ret = C_Decry
2d250 70 74 46 69 6e 61 6c 28 68 53 65 73 73 69 6f 6e ptFinal(hSession
2d260 2c 20 70 44 61 74 61 2c 20 26 64 61 74 61 6c 65 , pData, &datale
2d270 6e 5f 66 69 6e 61 6c 29 3b 0a 09 69 66 20 28 64 n_final);..if (d
2d280 65 63 72 79 70 74 5f 72 65 74 20 21 3d 20 43 4b ecrypt_ret != CK
2d290 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 R_OK) {...CACKEY
2d2a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
2d2b0 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 46 69 rror. DecryptFi
2d2c0 6e 61 6c 28 29 20 72 65 74 75 72 6e 65 64 20 66 nal() returned f
2d2d0 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75 ailure (rv = %lu
2d2e0 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c ).", (unsigned l
2d2f0 6f 6e 67 29 20 64 65 63 72 79 70 74 5f 72 65 74 ong) decrypt_ret
2d300 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 64 65 63 );....return(dec
2d310 72 79 70 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 rypt_ret);..}...
2d320 2a 70 75 6c 44 61 74 61 4c 65 6e 20 3d 20 64 61 *pulDataLen = da
2d330 74 61 6c 65 6e 5f 75 70 64 61 74 65 20 2b 20 64 talen_update + d
2d340 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 3b 0a 0a 09 atalen_final;...
2d350 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
2d360 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 NTF("Returning C
2d370 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 KR_OK (%i)", CKR
2d380 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 _OK);...return(C
2d390 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 KR_OK);.}..CK_DE
2d3a0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b FINE_FUNCTION(CK
2d3b0 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 55 70 _RV, C_DecryptUp
2d3c0 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e date)(CK_SESSION
2d3d0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e _HANDLE hSession
2d3e0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 , CK_BYTE_PTR pE
2d3f0 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b ncryptedPart, CK
2d400 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 _ULONG ulEncrypt
2d410 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 edPartLen, CK_BY
2d420 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b TE_PTR pPart, CK
2d430 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61 _ULONG_PTR pulPa
2d440 72 74 4c 65 6e 29 20 7b 0a 09 73 74 61 74 69 63 rtLen) {..static
2d450 20 43 4b 5f 42 59 54 45 20 62 75 66 5b 31 36 33 CK_BYTE buf[163
2d460 38 34 5d 3b 0a 09 73 73 69 7a 65 5f 74 20 62 75 84];..ssize_t bu
2d470 66 6c 65 6e 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 flen;..CK_SLOT_I
2d480 44 20 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 52 56 D slotID;..CK_RV
2d490 20 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 retval = CKR_GE
2d4a0 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 69 6e NERAL_ERROR;..in
2d4b0 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a t mutex_retval;.
2d4c0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
2d4d0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
2d4e0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f ;...if (!cackey_
2d4f0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 initialized) {..
2d500 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
2d510 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f INTF("Error. No
2d520 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 t initialized.")
2d530 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
2d540 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 CRYPTOKI_NOT_INI
2d550 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 TIALIZED);..}...
2d560 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 if (hSession ==
2d570 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 0 || hSession >=
2d580 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f (sizeof(cackey_
2d590 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 sessions) / size
2d5a0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f of(cackey_sessio
2d5b0 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 ns[0]))) {...CAC
2d5c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
2d5d0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f ("Error. Sessio
2d5e0 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 n out of range."
2d5f0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 );......return(C
2d600 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c KR_SESSION_HANDL
2d610 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a E_INVALID);..}..
2d620 09 69 66 20 28 70 45 6e 63 72 79 70 74 65 64 50 .if (pEncryptedP
2d630 61 72 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 art == NULL && u
2d640 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 lEncryptedPartLe
2d650 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 n == 0) {.../* S
2d660 68 6f 72 74 20 63 69 72 63 75 69 74 20 69 66 20 hort circuit if
2d670 77 65 20 61 72 65 20 61 73 6b 65 64 20 74 6f 20 we are asked to
2d680 64 65 63 72 79 70 74 20 6e 6f 74 68 69 6e 67 2e decrypt nothing.
2d690 2e 2e 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 .. */...CACKEY_D
2d6a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
2d6b0 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 urning CKR_OK (%
2d6c0 69 29 20 28 73 68 6f 72 74 20 63 69 72 63 75 69 i) (short circui
2d6d0 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 t)", CKR_OK);...
2d6e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b .return(CKR_OK);
2d6f0 0a 09 7d 0a 0a 09 69 66 20 28 70 45 6e 63 72 79 ..}...if (pEncry
2d700 70 74 65 64 50 61 72 74 20 3d 3d 20 4e 55 4c 4c ptedPart == NULL
2d710 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
2d720 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
2d730 2e 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 . pEncryptedPart
2d740 20 69 73 20 4e 55 4c 4c 2c 20 62 75 74 20 75 6c is NULL, but ul
2d750 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e EncryptedPartLen
2d760 20 69 73 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09 is not 0.");...
2d770 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 .return(CKR_ARGU
2d780 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a MENTS_BAD);..}..
2d790 09 69 66 20 28 75 6c 45 6e 63 72 79 70 74 65 64 .if (ulEncrypted
2d7a0 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a PartLen == 0) {.
2d7b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
2d7c0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 75 6c RINTF("Error. ul
2d7d0 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e EncryptedPartLen
2d7e0 20 69 73 20 30 2c 20 62 75 74 20 70 50 61 72 74 is 0, but pPart
2d7f0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b is not NULL.");
2d800 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 ....return(CKR_A
2d810 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 RGUMENTS_BAD);..
2d820 7d 0a 0a 09 69 66 20 28 70 75 6c 50 61 72 74 4c }...if (pulPartL
2d830 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 en == NULL) {...
2d840 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
2d850 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 50 NTF("Error. pulP
2d860 61 72 74 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 artLen is NULL."
2d870 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
2d880 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b _ARGUMENTS_BAD);
2d890 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 ..}...mutex_retv
2d8a0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 al = cackey_mute
2d8b0 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 x_lock(cackey_bi
2d8c0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 glock);..if (mut
2d8d0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 ex_retval != 0)
2d8e0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
2d8f0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
2d900 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e Locking failed.
2d910 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
2d920 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 R_GENERAL_ERROR)
2d930 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b ;..}...if (!cack
2d940 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
2d950 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a sion].active) {.
2d960 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 ..cackey_mutex_u
2d970 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 nlock(cackey_big
2d980 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 lock);....CACKEY
2d990 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
2d9a0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e rror. Session n
2d9b0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 ot active.");...
2d9c0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 ...return(CKR_SE
2d9d0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 SSION_HANDLE_INV
2d9e0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 ALID);..}...if (
2d9f0 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 !cackey_sessions
2da00 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 [hSession].decry
2da10 70 74 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 pt_active) {...c
2da20 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f ackey_mutex_unlo
2da30 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
2da40 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 k);....CACKEY_DE
2da50 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
2da60 72 2e 20 20 44 65 63 72 79 70 74 20 6e 6f 74 20 r. Decrypt not
2da70 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 active.");......
2da80 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 return(CKR_OPERA
2da90 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c TION_NOT_INITIAL
2daa0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 IZED);..}...slot
2dab0 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 ID = cackey_sess
2dac0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 ions[hSession].s
2dad0 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f lotID;...if (slo
2dae0 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 tID < 0 || slotI
2daf0 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 D >= (sizeof(cac
2db00 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a key_slots) / siz
2db10 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 eof(cackey_slots
2db20 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 [0]))) {...CACKE
2db30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
2db40 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 Error. Invalid s
2db50 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 lot requested (%
2db60 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 lu), outside of
2db70 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c valid range", sl
2db80 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e otID);....return
2db90 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 (CKR_GENERAL_ERR
2dba0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 OR);..}...if (ca
2dbb0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 ckey_slots[slotI
2dbc0 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 D].active == 0)
2dbd0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
2dbe0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
2dbf0 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 Invalid slot req
2dc00 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c uested (%lu), sl
2dc10 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 ot not currently
2dc20 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 active", slotID
2dc30 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 );....cackey_mut
2dc40 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 ex_unlock(cackey
2dc50 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 _biglock);....re
2dc60 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c turn(CKR_GENERAL
2dc70 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 _ERROR);..}...sw
2dc80 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73 65 73 itch (cackey_ses
2dc90 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
2dca0 64 65 63 72 79 70 74 5f 6d 65 63 68 61 6e 69 73 decrypt_mechanis
2dcb0 6d 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f m) {...case CKM_
2dcc0 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 RSA_PKCS:..../*
2dcd0 41 73 6b 20 63 61 72 64 20 74 6f 20 64 65 63 72 Ask card to decr
2dce0 79 70 74 20 2a 2f 0a 09 09 09 62 75 66 6c 65 6e ypt */....buflen
2dcf0 20 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 = cackey_signde
2dd00 63 72 79 70 74 28 26 63 61 63 6b 65 79 5f 73 6c crypt(&cackey_sl
2dd10 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63 ots[slotID], cac
2dd20 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
2dd30 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69 ssion].decrypt_i
2dd40 64 65 6e 74 69 74 79 2c 20 70 45 6e 63 72 79 70 dentity, pEncryp
2dd50 74 65 64 50 61 72 74 2c 20 75 6c 45 6e 63 72 79 tedPart, ulEncry
2dd60 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 62 75 66 ptedPartLen, buf
2dd70 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 2c 20 30 , sizeof(buf), 0
2dd80 2c 20 31 29 3b 0a 0a 09 09 09 69 66 20 28 62 75 , 1);.....if (bu
2dd90 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 flen == CACKEY_P
2dda0 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 20 CSC_E_NEEDLOGIN
2ddb0 26 26 20 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f && cackey_pin_co
2ddc0 6d 6d 61 6e 64 20 21 3d 20 4e 55 4c 4c 29 20 7b mmand != NULL) {
2ddd0 0a 09 09 09 09 69 66 20 28 5f 43 5f 4c 6f 67 69 .....if (_C_Logi
2dde0 6e 4d 75 74 65 78 41 72 67 28 68 53 65 73 73 69 nMutexArg(hSessi
2ddf0 6f 6e 2c 20 43 4b 55 5f 55 53 45 52 2c 20 4e 55 on, CKU_USER, NU
2de00 4c 4c 2c 20 30 2c 20 30 29 20 3d 3d 20 43 4b 52 LL, 0, 0) == CKR
2de10 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 62 75 66 6c _OK) {......bufl
2de20 65 6e 20 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e en = cackey_sign
2de30 64 65 63 72 79 70 74 28 26 63 61 63 6b 65 79 5f decrypt(&cackey_
2de40 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 slots[slotID], c
2de50 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
2de60 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 Session].decrypt
2de70 5f 69 64 65 6e 74 69 74 79 2c 20 70 45 6e 63 72 _identity, pEncr
2de80 79 70 74 65 64 50 61 72 74 2c 20 75 6c 45 6e 63 yptedPart, ulEnc
2de90 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 62 ryptedPartLen, b
2dea0 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 2c uf, sizeof(buf),
2deb0 20 30 2c 20 31 29 3b 0a 09 09 09 09 7d 0a 09 09 0, 1);.....}...
2dec0 09 7d 0a 0a 09 09 09 69 66 20 28 62 75 66 6c 65 .}.....if (bufle
2ded0 6e 20 3c 20 30 29 20 7b 0a 09 09 09 09 2f 2a 20 n < 0) {...../*
2dee0 44 65 63 72 79 70 74 69 6f 6e 20 66 61 69 6c 65 Decryption faile
2def0 64 2e 20 2a 2f 0a 09 09 09 09 69 66 20 28 62 75 d. */.....if (bu
2df00 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 flen == CACKEY_P
2df10 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 CSC_E_NEEDLOGIN)
2df20 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d {......retval =
2df30 20 43 4b 52 5f 55 53 45 52 5f 4e 4f 54 5f 4c 4f CKR_USER_NOT_LO
2df40 47 47 45 44 5f 49 4e 3b 0a 09 09 09 09 7d 20 65 GGED_IN;.....} e
2df50 6c 73 65 20 69 66 20 28 62 75 66 6c 65 6e 20 3d lse if (buflen =
2df60 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f = CACKEY_PCSC_E_
2df70 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b 0a 09 TOKENABSENT) {..
2df80 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 ....retval = CKR
2df90 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 3b _DEVICE_REMOVED;
2dfa0 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 .....} else {...
2dfb0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
2dfc0 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 PRINTF("Failed t
2dfd0 6f 20 73 65 6e 64 20 41 50 44 55 2c 20 65 72 72 o send APDU, err
2dfe0 6f 72 20 3d 20 25 6c 69 22 2c 20 28 6c 6f 6e 67 or = %li", (long
2dff0 20 69 6e 74 29 20 62 75 66 6c 65 6e 29 3b 0a 0a int) buflen);..
2e000 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b .....retval = CK
2e010 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b R_GENERAL_ERROR;
2e020 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 .....}....} else
2e030 20 69 66 20 28 28 28 75 6e 73 69 67 6e 65 64 20 if (((unsigned
2e040 6c 6f 6e 67 29 20 62 75 66 6c 65 6e 29 20 3e 20 long) buflen) >
2e050 2a 70 75 6c 50 61 72 74 4c 65 6e 20 26 26 20 70 *pulPartLen && p
2e060 50 61 72 74 29 20 7b 0a 09 09 09 09 2f 2a 20 44 Part) {...../* D
2e070 65 63 72 79 70 74 65 64 20 64 61 74 61 20 74 6f ecrypted data to
2e080 6f 20 6c 61 72 67 65 20 2a 2f 0a 09 09 09 09 72 o large */.....r
2e090 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 etval = CKR_BUFF
2e0a0 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 ER_TOO_SMALL;...
2e0b0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 69 66 .} else {.....if
2e0c0 20 28 70 50 61 72 74 29 20 7b 0a 09 09 09 09 09 (pPart) {......
2e0d0 6d 65 6d 63 70 79 28 70 50 61 72 74 2c 20 62 75 memcpy(pPart, bu
2e0e0 66 2c 20 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 f, buflen);.....
2e0f0 7d 0a 0a 09 09 09 09 2a 70 75 6c 50 61 72 74 4c }......*pulPartL
2e100 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 0a 09 09 en = buflen;....
2e110 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f ..retval = CKR_O
2e120 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61 K;....}.....brea
2e130 6b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 k;..}...mutex_re
2e140 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 tval = cackey_mu
2e150 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 tex_unlock(cacke
2e160 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 y_biglock);..if
2e170 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d (mutex_retval !=
2e180 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 0) {...CACKEY_D
2e190 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
2e1a0 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 or. Unlocking f
2e1b0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 ailed.");....ret
2e1c0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f urn(CKR_GENERAL_
2e1d0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 ERROR);..}...CAC
2e1e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
2e1f0 28 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c ("Returning %i",
2e200 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a (int) retval);.
2e210 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 ..return(retval)
2e220 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 ;.}..CK_DEFINE_F
2e230 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 UNCTION(CK_RV, C
2e240 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 29 28 43 _DecryptFinal)(C
2e250 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 K_SESSION_HANDLE
2e260 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 hSession, CK_BY
2e270 54 45 5f 50 54 52 20 70 4c 61 73 74 50 61 72 74 TE_PTR pLastPart
2e280 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 , CK_ULONG_PTR p
2e290 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 29 20 7b ulLastPartLen) {
2e2a0 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 ..int mutex_retv
2e2b0 61 6c 3b 0a 09 69 6e 74 20 74 65 72 6d 69 6e 61 al;..int termina
2e2c0 74 65 5f 64 65 63 72 79 70 74 20 3d 20 31 3b 0a te_decrypt = 1;.
2e2d0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
2e2e0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
2e2f0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f ;...if (!cackey_
2e300 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 initialized) {..
2e310 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
2e320 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f INTF("Error. No
2e330 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 t initialized.")
2e340 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
2e350 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 CRYPTOKI_NOT_INI
2e360 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 TIALIZED);..}...
2e370 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 if (hSession ==
2e380 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 0 || hSession >=
2e390 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f (sizeof(cackey_
2e3a0 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 sessions) / size
2e3b0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f of(cackey_sessio
2e3c0 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 ns[0]))) {...CAC
2e3d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
2e3e0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f ("Error. Sessio
2e3f0 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 n out of range."
2e400 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 );......return(C
2e410 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c KR_SESSION_HANDL
2e420 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a E_INVALID);..}..
2e430 09 69 66 20 28 70 75 6c 4c 61 73 74 50 61 72 74 .if (pulLastPart
2e440 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 Len == NULL) {..
2e450 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
2e460 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c INTF("Error. pul
2e470 4c 61 73 74 50 61 72 74 4c 65 6e 20 69 73 20 4e LastPartLen is N
2e480 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 ULL.");....retur
2e490 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f n(CKR_ARGUMENTS_
2e4a0 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 BAD);..}...mutex
2e4b0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 _retval = cackey
2e4c0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b _mutex_lock(cack
2e4d0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 ey_biglock);..if
2e4e0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 (mutex_retval !
2e4f0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f = 0) {...CACKEY_
2e500 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
2e510 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 ror. Locking fa
2e520 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 iled.");....retu
2e530 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 rn(CKR_GENERAL_E
2e540 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 RROR);..}...if (
2e550 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 !cackey_sessions
2e560 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 [hSession].activ
2e570 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 e) {...cackey_mu
2e580 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 tex_unlock(cacke
2e590 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 y_biglock);....C
2e5a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
2e5b0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 TF("Error. Sess
2e5c0 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 ion not active."
2e5d0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 );......return(C
2e5e0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c KR_SESSION_HANDL
2e5f0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a E_INVALID);..}..
2e600 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 .if (!cackey_ses
2e610 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
2e620 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 29 20 decrypt_active)
2e630 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 {...cackey_mutex
2e640 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 _unlock(cackey_b
2e650 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b iglock);....CACK
2e660 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
2e670 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 "Error. Decrypt
2e680 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a not active.");.
2e690 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f .....return(CKR_
2e6a0 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e OPERATION_NOT_IN
2e6b0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
2e6c0 09 2a 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e .*pulLastPartLen
2e6d0 20 3d 20 30 3b 0a 0a 09 69 66 20 28 70 4c 61 73 = 0;...if (pLas
2e6e0 74 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b tPart == NULL) {
2e6f0 0a 09 09 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 ...terminate_dec
2e700 72 79 70 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 rypt = 0;..}...i
2e710 66 20 28 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 f (terminate_dec
2e720 72 79 70 74 29 20 7b 0a 09 09 63 61 63 6b 65 79 rypt) {...cackey
2e730 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
2e740 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 on].decrypt_acti
2e750 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74 ve = 0;..}...mut
2e760 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b ex_retval = cack
2e770 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 ey_mutex_unlock(
2e780 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
2e790 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 ..if (mutex_retv
2e7a0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 al != 0) {...CAC
2e7b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
2e7c0 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b ("Error. Unlock
2e7d0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a ing failed.");..
2e7e0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e ..return(CKR_GEN
2e7f0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a ERAL_ERROR);..}.
2e800 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
2e810 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
2e820 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 CKR_OK (%i)", C
2e830 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e KR_OK);...return
2e840 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f (CKR_OK);.}..CK_
2e850 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 DEFINE_FUNCTION(
2e860 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 49 CK_RV, C_DigestI
2e870 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f nit)(CK_SESSION_
2e880 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c HANDLE hSession,
2e890 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 CK_MECHANISM_PT
2e8a0 52 20 70 4d 65 63 68 61 6e 69 73 6d 29 20 7b 0a R pMechanism) {.
2e8b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
2e8c0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
2e8d0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 ...if (!cackey_i
2e8e0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 nitialized) {...
2e8f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
2e900 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 NTF("Error. Not
2e910 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b initialized.");
2e920 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 ....return(CKR_C
2e930 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 RYPTOKI_NOT_INIT
2e940 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 IALIZED);..}...C
2e950 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
2e960 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b TF("Returning CK
2e970 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
2e980 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 UPPORTED (%i)",
2e990 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
2e9a0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 _SUPPORTED);...r
2e9b0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 eturn(CKR_FUNCTI
2e9c0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
2e9d0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f );.}..CK_DEFINE_
2e9e0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 FUNCTION(CK_RV,
2e9f0 43 5f 44 69 67 65 73 74 29 28 43 4b 5f 53 45 53 C_Digest)(CK_SES
2ea00 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 SION_HANDLE hSes
2ea10 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 sion, CK_BYTE_PT
2ea20 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e R pData, CK_ULON
2ea30 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f G ulDataLen, CK_
2ea40 42 59 54 45 5f 50 54 52 20 70 44 69 67 65 73 74 BYTE_PTR pDigest
2ea50 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 , CK_ULONG_PTR p
2ea60 75 6c 44 69 67 65 73 74 4c 65 6e 29 20 7b 0a 09 ulDigestLen) {..
2ea70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
2ea80 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a NTF("Called.");.
2ea90 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e ..if (!cackey_in
2eaa0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 itialized) {...C
2eab0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
2eac0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 TF("Error. Not
2ead0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a initialized.");.
2eae0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 ...return(CKR_CR
2eaf0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 YPTOKI_NOT_INITI
2eb00 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 ALIZED);..}...CA
2eb10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
2eb20 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 F("Returning CKR
2eb30 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
2eb40 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 PPORTED (%i)", C
2eb50 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
2eb60 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 SUPPORTED);...re
2eb70 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f turn(CKR_FUNCTIO
2eb80 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 N_NOT_SUPPORTED)
2eb90 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 ;.}..CK_DEFINE_F
2eba0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 UNCTION(CK_RV, C
2ebb0 5f 44 69 67 65 73 74 55 70 64 61 74 65 29 28 43 _DigestUpdate)(C
2ebc0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 K_SESSION_HANDLE
2ebd0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 hSession, CK_BY
2ebe0 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b TE_PTR pPart, CK
2ebf0 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e _ULONG ulPartLen
2ec00 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 ) {..CACKEY_DEBU
2ec10 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 G_PRINTF("Called
2ec20 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b .");...if (!cack
2ec30 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 ey_initialized)
2ec40 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
2ec50 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
2ec60 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 Not initialized
2ec70 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
2ec80 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f KR_CRYPTOKI_NOT_
2ec90 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d INITIALIZED);..}
2eca0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
2ecb0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e PRINTF("Returnin
2ecc0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e g CKR_FUNCTION_N
2ecd0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 OT_SUPPORTED (%i
2ece0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e )", CKR_FUNCTION
2ecf0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
2ed00 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 ...return(CKR_FU
2ed10 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
2ed20 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 RTED);.}..CK_DEF
2ed30 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f INE_FUNCTION(CK_
2ed40 52 56 2c 20 43 5f 44 69 67 65 73 74 4b 65 79 29 RV, C_DigestKey)
2ed50 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 (CK_SESSION_HAND
2ed60 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f LE hSession, CK_
2ed70 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b OBJECT_HANDLE hK
2ed80 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 ey) {..CACKEY_DE
2ed90 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
2eda0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 ed.");...if (!ca
2edb0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 ckey_initialized
2edc0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
2edd0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
2ede0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a . Not initializ
2edf0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
2ee00 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f (CKR_CRYPTOKI_NO
2ee10 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a T_INITIALIZED);.
2ee20 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 .}...CACKEY_DEBU
2ee30 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
2ee40 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e ing CKR_FUNCTION
2ee50 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 _NOT_SUPPORTED (
2ee60 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 %i)", CKR_FUNCTI
2ee70 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
2ee80 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f );...return(CKR_
2ee90 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
2eea0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 PORTED);.}..CK_D
2eeb0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 EFINE_FUNCTION(C
2eec0 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 46 69 K_RV, C_DigestFi
2eed0 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f nal)(CK_SESSION_
2eee0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c HANDLE hSession,
2eef0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 69 CK_BYTE_PTR pDi
2ef00 67 65 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 gest, CK_ULONG_P
2ef10 54 52 20 70 75 6c 44 69 67 65 73 74 4c 65 6e 29 TR pulDigestLen)
2ef20 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {..CACKEY_DEBUG
2ef30 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
2ef40 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ");...if (!cacke
2ef50 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b y_initialized) {
2ef60 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
2ef70 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
2ef80 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e Not initialized.
2ef90 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
2efa0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 R_CRYPTOKI_NOT_I
2efb0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
2efc0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
2efd0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
2efe0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f CKR_FUNCTION_NO
2eff0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 T_SUPPORTED (%i)
2f000 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f ", CKR_FUNCTION_
2f010 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
2f020 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e ..return(CKR_FUN
2f030 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
2f040 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 TED);.}..CK_DEFI
2f050 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 NE_FUNCTION(CK_R
2f060 56 2c 20 43 5f 53 69 67 6e 49 6e 69 74 29 28 43 V, C_SignInit)(C
2f070 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 K_SESSION_HANDLE
2f080 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 hSession, CK_ME
2f090 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 CHANISM_PTR pMec
2f0a0 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 hanism, CK_OBJEC
2f0b0 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b T_HANDLE hKey) {
2f0c0 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 ..int mutex_retv
2f0d0 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09 al;...hKey--;...
2f0e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
2f0f0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a NTF("Called.");.
2f100 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e ..if (!cackey_in
2f110 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 itialized) {...C
2f120 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
2f130 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 TF("Error. Not
2f140 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a initialized.");.
2f150 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 ...return(CKR_CR
2f160 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 YPTOKI_NOT_INITI
2f170 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 ALIZED);..}...if
2f180 20 28 70 4d 65 63 68 61 6e 69 73 6d 20 3d 3d 20 (pMechanism ==
2f190 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 NULL) {...CACKEY
2f1a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
2f1b0 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d rror. pMechanism
2f1c0 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 is NULL.");....
2f1d0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d return(CKR_ARGUM
2f1e0 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 ENTS_BAD);..}...
2f1f0 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 2d 3e if (pMechanism->
2f200 6d 65 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d mechanism != CKM
2f210 5f 52 53 41 5f 50 4b 43 53 29 20 7b 0a 09 09 43 _RSA_PKCS) {...C
2f220 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
2f230 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 TF("Error. pMech
2f240 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d anism->mechanism
2f250 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20 61 not specified a
2f260 73 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 22 29 s CKM_RSA_PKCS")
2f270 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
2f280 4d 45 43 48 41 4e 49 53 4d 5f 50 41 52 41 4d 5f MECHANISM_PARAM_
2f290 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 INVALID);..}...i
2f2a0 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 f (hSession == 0
2f2b0 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 || hSession >=
2f2c0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 (sizeof(cackey_s
2f2d0 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f essions) / sizeo
2f2e0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e f(cackey_session
2f2f0 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b s[0]))) {...CACK
2f300 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
2f310 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e "Error. Session
2f320 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 out of range.")
2f330 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b ;......return(CK
2f340 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 R_SESSION_HANDLE
2f350 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 _INVALID);..}...
2f360 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 mutex_retval = c
2f370 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b ackey_mutex_lock
2f380 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 (cackey_biglock)
2f390 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 ;..if (mutex_ret
2f3a0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 val != 0) {...CA
2f3b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
2f3c0 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 F("Error. Locki
2f3d0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 ng failed.");...
2f3e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 .return(CKR_GENE
2f3f0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a RAL_ERROR);..}..
2f400 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 .if (!cackey_ses
2f410 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
2f420 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b active) {...cack
2f430 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 ey_mutex_unlock(
2f440 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
2f450 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
2f460 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
2f470 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 Session not act
2f480 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 ive.");......ret
2f490 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f urn(CKR_SESSION_
2f4a0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b HANDLE_INVALID);
2f4b0 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 ..}...if (cackey
2f4c0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
2f4d0 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 on].sign_active)
2f4e0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 {...cackey_mute
2f4f0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
2f500 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 biglock);....CAC
2f510 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
2f520 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 61 ("Error. Sign a
2f530 6c 72 65 61 64 79 20 69 6e 20 70 72 6f 67 72 65 lready in progre
2f540 73 73 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 ss.");......retu
2f550 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e rn(CKR_OPERATION
2f560 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 69 _ACTIVE);..}...i
2f570 66 20 28 68 4b 65 79 20 3e 3d 20 63 61 63 6b 65 f (hKey >= cacke
2f580 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
2f590 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f ion].identities_
2f5a0 63 6f 75 6e 74 29 20 7b 0a 09 09 63 61 63 6b 65 count) {...cacke
2f5b0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
2f5c0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
2f5d0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
2f5e0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
2f5f0 4b 65 79 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f Key handle out o
2f600 66 20 72 61 6e 67 65 20 28 72 65 71 75 65 73 74 f range (request
2f610 65 64 20 6b 65 79 20 25 6c 75 2c 20 6f 6e 6c 79 ed key %lu, only
2f620 20 25 6c 75 20 69 64 65 6e 74 69 74 69 65 73 20 %lu identities
2f630 61 76 61 69 6c 61 62 6c 65 29 2e 22 2c 20 28 75 available).", (u
2f640 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b nsigned long) hK
2f650 65 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f ey, (unsigned lo
2f660 6e 67 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69 ng) cackey_sessi
2f670 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 ons[hSession].id
2f680 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b entities_count);
2f690 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4b ....return(CKR_K
2f6a0 45 59 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 EY_HANDLE_INVALI
2f6b0 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f D);..}...cackey_
2f6c0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
2f6d0 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d n].sign_active =
2f6e0 20 31 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 1;...cackey_ses
2f6f0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
2f700 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 20 3d sign_mechanism =
2f710 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 pMechanism->mec
2f720 68 61 6e 69 73 6d 3b 0a 0a 09 63 61 63 6b 65 79 hanism;...cackey
2f730 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
2f740 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20 on].sign_buflen
2f750 3d 20 31 32 38 3b 0a 09 63 61 63 6b 65 79 5f 73 = 128;..cackey_s
2f760 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
2f770 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d ].sign_bufused =
2f780 20 30 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 0;..cackey_sess
2f790 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 ions[hSession].s
2f7a0 69 67 6e 5f 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 ign_buf = malloc
2f7b0 28 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f (sizeof(*cackey_
2f7c0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
2f7d0 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20 2a 20 63 n].sign_buf) * c
2f7e0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
2f7f0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 Session].sign_bu
2f800 66 6c 65 6e 29 3b 0a 0a 09 43 41 43 4b 45 59 5f flen);...CACKEY_
2f810 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 DEBUG_PRINTF("Se
2f820 73 73 69 6f 6e 20 25 6c 75 20 73 69 67 6e 5f 69 ssion %lu sign_i
2f830 64 65 6e 74 69 74 79 20 69 73 20 25 70 20 28 69 dentity is %p (i
2f840 64 65 6e 74 69 74 79 20 23 25 6c 75 29 22 2c 20 dentity #%lu)",
2f850 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
2f860 68 53 65 73 73 69 6f 6e 2c 20 28 76 6f 69 64 20 hSession, (void
2f870 2a 29 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 *) &cackey_sessi
2f880 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 ons[hSession].id
2f890 65 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d 2c 20 entities[hKey],
2f8a0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
2f8b0 68 4b 65 79 29 3b 0a 09 63 61 63 6b 65 79 5f 73 hKey);..cackey_s
2f8c0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
2f8d0 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 20 ].sign_identity
2f8e0 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f = &cackey_sessio
2f8f0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 ns[hSession].ide
2f900 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d 3b 0a 0a ntities[hKey];..
2f910 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 .mutex_retval =
2f920 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c cackey_mutex_unl
2f930 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
2f940 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f ck);..if (mutex_
2f950 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 retval != 0) {..
2f960 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
2f970 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e INTF("Error. Un
2f980 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 locking failed."
2f990 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
2f9a0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b _GENERAL_ERROR);
2f9b0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 ..}...CACKEY_DEB
2f9c0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
2f9d0 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 ning CKR_OK (%i)
2f9e0 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 ", CKR_OK);...re
2f9f0 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a turn(CKR_OK);.}.
2fa00 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 .CK_DEFINE_FUNCT
2fa10 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 ION(CK_RV, C_Sig
2fa20 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 n)(CK_SESSION_HA
2fa30 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 NDLE hSession, C
2fa40 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 K_BYTE_PTR pData
2fa50 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 , CK_ULONG ulDat
2fa60 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 aLen, CK_BYTE_PT
2fa70 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b R pSignature, CK
2fa80 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 _ULONG_PTR pulSi
2fa90 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 75 gnatureLen) {..u
2faa0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 74 61 nsigned long sta
2fab0 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 3b rt_sign_bufused;
2fac0 0a 09 43 4b 5f 52 56 20 73 69 67 6e 5f 72 65 74 ..CK_RV sign_ret
2fad0 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 ;..int mutex_ret
2fae0 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 val;...CACKEY_DE
2faf0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
2fb00 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 ed.");...if (!ca
2fb10 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 ckey_initialized
2fb20 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
2fb30 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
2fb40 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a . Not initializ
2fb50 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
2fb60 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f (CKR_CRYPTOKI_NO
2fb70 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a T_INITIALIZED);.
2fb80 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f .}...if (hSessio
2fb90 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 n == 0 || hSessi
2fba0 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 on >= (sizeof(ca
2fbb0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f ckey_sessions) /
2fbc0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 sizeof(cackey_s
2fbd0 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a essions[0]))) {.
2fbe0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
2fbf0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 RINTF("Error. S
2fc00 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 ession out of ra
2fc10 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 nge.");......ret
2fc20 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f urn(CKR_SESSION_
2fc30 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b HANDLE_INVALID);
2fc40 0a 09 7d 0a 0a 09 73 74 61 72 74 5f 73 69 67 6e ..}...start_sign
2fc50 5f 62 75 66 75 73 65 64 20 3d 20 63 61 63 6b 65 _bufused = cacke
2fc60 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
2fc70 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 ion].sign_bufuse
2fc80 64 3b 0a 0a 09 73 69 67 6e 5f 72 65 74 20 3d 20 d;...sign_ret =
2fc90 43 5f 53 69 67 6e 55 70 64 61 74 65 28 68 53 65 C_SignUpdate(hSe
2fca0 73 73 69 6f 6e 2c 20 70 44 61 74 61 2c 20 75 6c ssion, pData, ul
2fcb0 44 61 74 61 4c 65 6e 29 3b 0a 09 69 66 20 28 73 DataLen);..if (s
2fcc0 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f ign_ret != CKR_O
2fcd0 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 K) {...CACKEY_DE
2fce0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
2fcf0 72 2e 20 20 53 69 67 6e 55 70 64 61 74 65 28 29 r. SignUpdate()
2fd00 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72 returned failur
2fd10 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 e (rv = %lu).",
2fd20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
2fd30 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 69 66 sign_ret);....if
2fd40 20 28 73 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b (sign_ret != CK
2fd50 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 R_BUFFER_TOO_SMA
2fd60 4c 4c 29 20 7b 0a 09 09 09 6d 75 74 65 78 5f 72 LL) {....mutex_r
2fd70 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d etval = cackey_m
2fd80 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 utex_lock(cackey
2fd90 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 _biglock);....if
2fda0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 (mutex_retval !
2fdb0 3d 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 = 0) {.....CACKE
2fdc0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
2fdd0 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 Error. Locking
2fde0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09 failed.");......
2fdf0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 return(CKR_GENER
2fe00 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a AL_ERROR);....}.
2fe10 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f ....if (!cackey_
2fe20 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
2fe30 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 n].active) {....
2fe40 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e .cackey_mutex_un
2fe50 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
2fe60 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 ock);......CACKE
2fe70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
2fe80 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 Error. Session
2fe90 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 not active.");..
2fea0 09 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 ......return(CKR
2feb0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f _SESSION_HANDLE_
2fec0 49 4e 56 41 4c 49 44 29 3b 0a 09 09 09 7d 0a 0a INVALID);....}..
2fed0 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 ...if (!cackey_s
2fee0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
2fef0 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b ].sign_active) {
2ff00 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 .....cackey_mute
2ff10 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
2ff20 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 biglock);......C
2ff30 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
2ff40 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e TF("Error. Sign
2ff50 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a not active.");.
2ff60 09 09 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b .......return(CK
2ff70 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f R_OPERATION_NOT_
2ff80 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 09 INITIALIZED);...
2ff90 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 .}.....cackey_se
2ffa0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
2ffb0 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 30 .sign_active = 0
2ffc0 3b 0a 0a 09 09 09 6d 75 74 65 78 5f 72 65 74 76 ;.....mutex_retv
2ffd0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 al = cackey_mute
2ffe0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
2fff0 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20 biglock);....if
30000 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d (mutex_retval !=
30010 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 0) {.....CACKEY
30020 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
30030 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 rror. Unlocking
30040 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 failed.");.....
30050 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 .return(CKR_GENE
30060 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d RAL_ERROR);....}
30070 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 73 ...}....return(s
30080 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 73 ign_ret);..}...s
30090 69 67 6e 5f 72 65 74 20 3d 20 43 5f 53 69 67 6e ign_ret = C_Sign
300a0 46 69 6e 61 6c 28 68 53 65 73 73 69 6f 6e 2c 20 Final(hSession,
300b0 70 53 69 67 6e 61 74 75 72 65 2c 20 70 75 6c 53 pSignature, pulS
300c0 69 67 6e 61 74 75 72 65 4c 65 6e 29 3b 0a 09 69 ignatureLen);..i
300d0 66 20 28 73 69 67 6e 5f 72 65 74 20 21 3d 20 43 f (sign_ret != C
300e0 4b 52 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28 73 KR_OK) {...if (s
300f0 69 67 6e 5f 72 65 74 20 3d 3d 20 43 4b 52 5f 42 ign_ret == CKR_B
30100 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 UFFER_TOO_SMALL)
30110 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 {....CACKEY_DEB
30120 55 47 5f 50 52 49 4e 54 46 28 22 53 69 67 6e 46 UG_PRINTF("SignF
30130 69 6e 61 6c 28 29 20 72 65 74 75 72 6e 65 64 20 inal() returned
30140 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 CKR_BUFFER_TOO_S
30150 4d 41 4c 4c 20 28 72 76 20 3d 20 25 6c 75 29 2c MALL (rv = %lu),
30160 20 75 6e 64 6f 69 6e 67 20 43 5f 53 69 67 6e 55 undoing C_SignU
30170 70 64 61 74 65 28 29 22 2c 20 28 75 6e 73 69 67 pdate()", (unsig
30180 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 ned long) sign_r
30190 65 74 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f et);.....cackey_
301a0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
301b0 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 n].sign_bufused
301c0 3d 20 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 66 = start_sign_buf
301d0 75 73 65 64 3b 0a 0a 09 09 09 72 65 74 75 72 6e used;.....return
301e0 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 09 7d 0a (sign_ret);...}.
301f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
30200 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
30210 53 69 67 6e 46 69 6e 61 6c 28 29 20 72 65 74 75 SignFinal() retu
30220 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72 76 rned failure (rv
30230 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 = %lu).", (unsi
30240 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f gned long) sign_
30250 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 ret);....return(
30260 73 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 sign_ret);..}...
30270 69 66 20 28 70 53 69 67 6e 61 74 75 72 65 20 3d if (pSignature =
30280 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b = NULL) {...CACK
30290 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
302a0 22 70 53 69 67 6e 61 74 75 72 65 20 73 70 65 63 "pSignature spec
302b0 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 75 ified as NULL, u
302c0 6e 64 6f 69 6e 67 20 43 5f 53 69 67 6e 55 70 64 ndoing C_SignUpd
302d0 61 74 65 28 29 22 29 3b 0a 0a 09 09 63 61 63 6b ate()");....cack
302e0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
302f0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 sion].sign_bufus
30300 65 64 20 3d 20 73 74 61 72 74 5f 73 69 67 6e 5f ed = start_sign_
30310 62 75 66 75 73 65 64 3b 0a 0a 09 09 72 65 74 75 bufused;....retu
30320 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 7d rn(sign_ret);..}
30330 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
30340 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e PRINTF("Returnin
30350 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 g CKR_OK (%i)",
30360 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 CKR_OK);...retur
30370 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b n(CKR_OK);.}..CK
30380 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e _DEFINE_FUNCTION
30390 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 55 70 (CK_RV, C_SignUp
303a0 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e date)(CK_SESSION
303b0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e _HANDLE hSession
303c0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 , CK_BYTE_PTR pP
303d0 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c art, CK_ULONG ul
303e0 50 61 72 74 4c 65 6e 29 20 7b 0a 09 69 6e 74 20 PartLen) {..int
303f0 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 mutex_retval;..i
30400 6e 74 20 72 65 73 69 7a 65 52 65 74 72 79 3b 0a nt resizeRetry;.
30410 09 69 6e 74 20 6e 65 65 64 52 65 73 69 7a 65 3b .int needResize;
30420 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
30430 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
30440 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 );...if (!cackey
30450 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
30460 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
30470 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e RINTF("Error. N
30480 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 ot initialized."
30490 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
304a0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e _CRYPTOKI_NOT_IN
304b0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
304c0 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d .if (hSession ==
304d0 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 0 || hSession >
304e0 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 = (sizeof(cackey
304f0 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a _sessions) / siz
30500 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 eof(cackey_sessi
30510 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 ons[0]))) {...CA
30520 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
30530 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 F("Error. Sessi
30540 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e on out of range.
30550 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 ");......return(
30560 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 CKR_SESSION_HAND
30570 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a LE_INVALID);..}.
30580 0a 09 69 66 20 28 70 50 61 72 74 20 3d 3d 20 4e ..if (pPart == N
30590 55 4c 4c 20 26 26 20 75 6c 50 61 72 74 4c 65 6e ULL && ulPartLen
305a0 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 == 0) {.../* Sh
305b0 6f 72 74 20 63 69 72 63 75 69 74 20 69 66 20 77 ort circuit if w
305c0 65 20 61 72 65 20 61 73 6b 65 64 20 74 6f 20 73 e are asked to s
305d0 69 67 6e 20 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a ign nothing... *
305e0 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 /...CACKEY_DEBUG
305f0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
30600 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 ng CKR_OK (%i) (
30610 73 68 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c short circuit)",
30620 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 CKR_OK);....ret
30630 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a urn(CKR_OK);..}.
30640 0a 09 69 66 20 28 70 50 61 72 74 20 3d 3d 20 4e ..if (pPart == N
30650 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f ULL) {...CACKEY_
30660 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
30670 72 6f 72 2e 20 70 50 61 72 74 20 69 73 20 4e 55 ror. pPart is NU
30680 4c 4c 2c 20 62 75 74 20 75 6c 50 61 72 74 4c 65 LL, but ulPartLe
30690 6e 20 69 73 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a n is not 0.");..
306a0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 ..return(CKR_ARG
306b0 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a UMENTS_BAD);..}.
306c0 0a 09 69 66 20 28 75 6c 50 61 72 74 4c 65 6e 20 ..if (ulPartLen
306d0 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 == 0) {...CACKEY
306e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
306f0 72 72 6f 72 2e 20 75 6c 50 61 72 74 4c 65 6e 20 rror. ulPartLen
30700 69 73 20 30 2c 20 62 75 74 20 70 50 61 72 74 20 is 0, but pPart
30710 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a is not NULL.");.
30720 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 ...return(CKR_AR
30730 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d GUMENTS_BAD);..}
30740 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 ...mutex_retval
30750 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c = cackey_mutex_l
30760 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
30770 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f ck);..if (mutex_
30780 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 retval != 0) {..
30790 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
307a0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f INTF("Error. Lo
307b0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b cking failed.");
307c0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 ....return(CKR_G
307d0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 ENERAL_ERROR);..
307e0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f }...if (!cackey_
307f0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
30800 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 n].active) {...c
30810 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f ackey_mutex_unlo
30820 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
30830 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 k);....CACKEY_DE
30840 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
30850 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 r. Session not
30860 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 active.");......
30870 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 return(CKR_SESSI
30880 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 ON_HANDLE_INVALI
30890 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 D);..}...if (!ca
308a0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
308b0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 ession].sign_act
308c0 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f ive) {...cackey_
308d0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 mutex_unlock(cac
308e0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 key_biglock);...
308f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
30900 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 INTF("Error. Si
30910 67 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 gn not active.")
30920 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b ;......return(CK
30930 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f R_OPERATION_NOT_
30940 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d INITIALIZED);..}
30950 0a 0a 09 73 77 69 74 63 68 20 28 63 61 63 6b 65 ...switch (cacke
30960 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
30970 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e ion].sign_mechan
30980 69 73 6d 29 20 7b 0a 09 09 63 61 73 65 20 43 4b ism) {...case CK
30990 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f M_RSA_PKCS:..../
309a0 2a 20 41 63 63 75 6d 75 6c 61 74 65 20 64 69 72 * Accumulate dir
309b0 65 63 74 6c 79 20 2a 2f 0a 09 09 09 66 6f 72 20 ectly */....for
309c0 28 72 65 73 69 7a 65 52 65 74 72 79 20 3d 20 30 (resizeRetry = 0
309d0 3b 20 72 65 73 69 7a 65 52 65 74 72 79 20 3c 20 ; resizeRetry <
309e0 31 31 3b 20 72 65 73 69 7a 65 52 65 74 72 79 2b 11; resizeRetry+
309f0 2b 29 20 7b 0a 09 09 09 09 6e 65 65 64 52 65 73 +) {.....needRes
30a00 69 7a 65 20 3d 20 30 3b 0a 09 09 09 09 69 66 20 ize = 0;.....if
30a10 28 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e ((cackey_session
30a20 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e s[hSession].sign
30a30 5f 62 75 66 75 73 65 64 20 2b 20 75 6c 50 61 72 _bufused + ulPar
30a40 74 4c 65 6e 29 20 3e 20 63 61 63 6b 65 79 5f 73 tLen) > cackey_s
30a50 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
30a60 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29 20 7b ].sign_buflen) {
30a70 0a 09 09 09 09 09 6e 65 65 64 52 65 73 69 7a 65 ......needResize
30a80 20 3d 20 31 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 = 1;.....}.....
30a90 09 69 66 20 28 21 6e 65 65 64 52 65 73 69 7a 65 .if (!needResize
30aa0 29 20 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a ) {......break;.
30ab0 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 ....}......CACKE
30ac0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
30ad0 52 65 73 69 7a 69 6e 67 20 73 69 67 6e 69 6e 67 Resizing signing
30ae0 20 62 75 66 66 65 72 20 28 74 72 79 20 23 25 69 buffer (try #%i
30af0 20 6f 66 20 31 30 20 2d 2d 20 31 31 74 68 20 69 of 10 -- 11th i
30b00 73 20 66 61 74 61 6c 29 22 2c 20 72 65 73 69 7a s fatal)", resiz
30b10 65 52 65 74 72 79 29 3b 0a 0a 09 09 09 09 69 66 eRetry);......if
30b20 20 28 72 65 73 69 7a 65 52 65 74 72 79 20 3d 3d (resizeRetry ==
30b30 20 31 30 29 20 7b 0a 09 09 09 09 09 66 72 65 65 10) {......free
30b40 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 (cackey_sessions
30b50 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f [hSession].sign_
30b60 62 75 66 29 3b 0a 0a 09 09 09 09 09 63 61 63 6b buf);.......cack
30b70 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
30b80 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 sion].sign_bufle
30b90 6e 20 3d 20 30 3b 0a 09 09 09 09 09 63 61 63 6b n = 0;......cack
30ba0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
30bb0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 3d sion].sign_buf =
30bc0 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09 62 72 65 NULL;.......bre
30bd0 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 63 ak;.....}......c
30be0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
30bf0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 Session].sign_bu
30c00 66 6c 65 6e 20 2a 3d 20 32 3b 0a 0a 09 09 09 09 flen *= 2;......
30c10 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
30c20 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 hSession].sign_b
30c30 75 66 20 3d 20 72 65 61 6c 6c 6f 63 28 63 61 63 uf = realloc(cac
30c40 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
30c50 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c ssion].sign_buf,
30c60 20 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f sizeof(*cackey_
30c70 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
30c80 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20 2a 20 63 n].sign_buf) * c
30c90 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
30ca0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 Session].sign_bu
30cb0 66 6c 65 6e 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 flen);....}.....
30cc0 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 if (cackey_sessi
30cd0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 ons[hSession].si
30ce0 67 6e 5f 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 gn_buf == NULL)
30cf0 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 {.....cackey_mut
30d00 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 ex_unlock(cackey
30d10 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 _biglock);......
30d20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
30d30 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 NTF("Error. Sig
30d40 6e 69 6e 67 20 62 75 66 66 65 72 20 69 73 20 4e ning buffer is N
30d50 55 4c 4c 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 ULL.");......ret
30d60 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f urn(CKR_GENERAL_
30d70 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 0a 09 09 ERROR);....}....
30d80 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 .memcpy(cackey_s
30d90 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
30da0 5d 2e 73 69 67 6e 5f 62 75 66 20 2b 20 63 61 63 ].sign_buf + cac
30db0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
30dc0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 ssion].sign_bufu
30dd0 73 65 64 2c 20 70 50 61 72 74 2c 20 75 6c 50 61 sed, pPart, ulPa
30de0 72 74 4c 65 6e 29 3b 0a 0a 09 09 09 63 61 63 6b rtLen);.....cack
30df0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
30e00 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 sion].sign_bufus
30e10 65 64 20 2b 3d 20 75 6c 50 61 72 74 4c 65 6e 3b ed += ulPartLen;
30e20 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a .....break;..}..
30e30 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 .mutex_retval =
30e40 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c cackey_mutex_unl
30e50 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
30e60 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f ck);..if (mutex_
30e70 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 retval != 0) {..
30e80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
30e90 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e INTF("Error. Un
30ea0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 locking failed."
30eb0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
30ec0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b _GENERAL_ERROR);
30ed0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 ..}...CACKEY_DEB
30ee0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
30ef0 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 ning CKR_OK (%i)
30f00 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 ", CKR_OK);...re
30f10 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a turn(CKR_OK);.}.
30f20 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 .CK_DEFINE_FUNCT
30f30 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 ION(CK_RV, C_Sig
30f40 6e 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 nFinal)(CK_SESSI
30f50 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 ON_HANDLE hSessi
30f60 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 on, CK_BYTE_PTR
30f70 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 pSignature, CK_U
30f80 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 67 6e LONG_PTR pulSign
30f90 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 73 74 61 atureLen) {..sta
30fa0 74 69 63 20 43 4b 5f 42 59 54 45 20 73 69 67 62 tic CK_BYTE sigb
30fb0 75 66 5b 31 30 32 34 5d 3b 0a 09 73 73 69 7a 65 uf[1024];..ssize
30fc0 5f 74 20 73 69 67 62 75 66 6c 65 6e 3b 0a 09 43 _t sigbuflen;..C
30fd0 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 K_SLOT_ID slotID
30fe0 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20 ;..CK_RV retval
30ff0 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 = CKR_GENERAL_ER
31000 52 4f 52 3b 0a 09 69 6e 74 20 74 65 72 6d 69 6e ROR;..int termin
31010 61 74 65 5f 73 69 67 6e 20 3d 20 31 3b 0a 09 69 ate_sign = 1;..i
31020 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b nt mutex_retval;
31030 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
31040 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
31050 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 );...if (!cackey
31060 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
31070 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
31080 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e RINTF("Error. N
31090 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 ot initialized."
310a0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
310b0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e _CRYPTOKI_NOT_IN
310c0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
310d0 09 69 66 20 28 70 75 6c 53 69 67 6e 61 74 75 72 .if (pulSignatur
310e0 65 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a eLen == NULL) {.
310f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
31100 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 RINTF("Error. pu
31110 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 69 73 lSignatureLen is
31120 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 NULL.");....ret
31130 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 urn(CKR_ARGUMENT
31140 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 S_BAD);..}...if
31150 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c (hSession == 0 |
31160 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 | hSession >= (s
31170 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 izeof(cackey_ses
31180 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 sions) / sizeof(
31190 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
311a0 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 0]))) {...CACKEY
311b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
311c0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f rror. Session o
311d0 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a ut of range.");.
311e0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f .....return(CKR_
311f0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 SESSION_HANDLE_I
31200 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 NVALID);..}...mu
31210 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 tex_retval = cac
31220 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 key_mutex_lock(c
31230 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
31240 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 .if (mutex_retva
31250 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b l != 0) {...CACK
31260 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
31270 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 "Error. Locking
31280 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 failed.");....r
31290 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 eturn(CKR_GENERA
312a0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 L_ERROR);..}...i
312b0 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 f (!cackey_sessi
312c0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 ons[hSession].ac
312d0 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 tive) {...cackey
312e0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 _mutex_unlock(ca
312f0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a ckey_biglock);..
31300 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
31310 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 RINTF("Error. S
31320 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 ession not activ
31330 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 e.");......retur
31340 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 n(CKR_SESSION_HA
31350 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 NDLE_INVALID);..
31360 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f }...if (!cackey_
31370 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
31380 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20 n].sign_active)
31390 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 {...cackey_mutex
313a0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 _unlock(cackey_b
313b0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b iglock);....CACK
313c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
313d0 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f "Error. Sign no
313e0 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a t active.");....
313f0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 ..return(CKR_OPE
31400 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 RATION_NOT_INITI
31410 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 6c ALIZED);..}...sl
31420 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 otID = cackey_se
31430 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
31440 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 .slotID;...if (s
31450 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f lotID < 0 || slo
31460 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 tID >= (sizeof(c
31470 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 ackey_slots) / s
31480 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f izeof(cackey_slo
31490 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 ts[0]))) {...CAC
314a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
314b0 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 ("Error. Invalid
314c0 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 slot requested
314d0 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f (%lu), outside o
314e0 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 f valid range",
314f0 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 slotID);....retu
31500 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 rn(CKR_GENERAL_E
31510 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 RROR);..}...if (
31520 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f cackey_slots[slo
31530 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 tID].active == 0
31540 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
31550 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
31560 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 . Invalid slot r
31570 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 equested (%lu),
31580 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 slot not current
31590 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 ly active", slot
315a0 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d ID);....cackey_m
315b0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b utex_unlock(cack
315c0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 ey_biglock);....
315d0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 return(CKR_GENER
315e0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 AL_ERROR);..}...
315f0 73 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73 switch (cackey_s
31600 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
31610 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d ].sign_mechanism
31620 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 ) {...case CKM_R
31630 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 SA_PKCS:..../* A
31640 73 6b 20 63 61 72 64 20 74 6f 20 73 69 67 6e 20 sk card to sign
31650 2a 2f 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 */....CACKEY_DEB
31660 55 47 5f 50 52 49 4e 54 46 28 22 41 73 6b 69 6e UG_PRINTF("Askin
31670 67 20 74 6f 20 73 69 67 6e 20 66 72 6f 6d 20 69 g to sign from i
31680 64 65 6e 74 69 74 79 20 25 70 20 69 6e 20 73 65 dentity %p in se
31690 73 73 69 6f 6e 20 25 6c 75 22 2c 20 28 76 6f 69 ssion %lu", (voi
316a0 64 20 2a 29 20 63 61 63 6b 65 79 5f 73 65 73 73 d *) cackey_sess
316b0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 ions[hSession].s
316c0 69 67 6e 5f 69 64 65 6e 74 69 74 79 2c 20 28 75 ign_identity, (u
316d0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 53 nsigned long) hS
316e0 65 73 73 69 6f 6e 29 3b 0a 09 09 09 73 69 67 62 ession);....sigb
316f0 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65 79 5f 73 uflen = cackey_s
31700 69 67 6e 64 65 63 72 79 70 74 28 26 63 61 63 6b igndecrypt(&cack
31710 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d ey_slots[slotID]
31720 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e , cackey_session
31730 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e s[hSession].sign
31740 5f 69 64 65 6e 74 69 74 79 2c 20 63 61 63 6b 65 _identity, cacke
31750 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
31760 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 63 ion].sign_buf, c
31770 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
31780 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 Session].sign_bu
31790 66 75 73 65 64 2c 20 73 69 67 62 75 66 2c 20 73 fused, sigbuf, s
317a0 69 7a 65 6f 66 28 73 69 67 62 75 66 29 2c 20 31 izeof(sigbuf), 1
317b0 2c 20 30 29 3b 0a 0a 09 09 09 69 66 20 28 73 69 , 0);.....if (si
317c0 67 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 gbuflen == CACKE
317d0 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 Y_PCSC_E_NEEDLOG
317e0 49 4e 20 26 26 20 63 61 63 6b 65 79 5f 70 69 6e IN && cackey_pin
317f0 5f 63 6f 6d 6d 61 6e 64 20 21 3d 20 4e 55 4c 4c _command != NULL
31800 29 20 7b 0a 09 09 09 09 69 66 20 28 5f 43 5f 4c ) {.....if (_C_L
31810 6f 67 69 6e 4d 75 74 65 78 41 72 67 28 68 53 65 oginMutexArg(hSe
31820 73 73 69 6f 6e 2c 20 43 4b 55 5f 55 53 45 52 2c ssion, CKU_USER,
31830 20 4e 55 4c 4c 2c 20 30 2c 20 30 29 20 3d 3d 20 NULL, 0, 0) ==
31840 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 73 CKR_OK) {......s
31850 69 67 62 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65 igbuflen = cacke
31860 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28 26 63 y_signdecrypt(&c
31870 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 ackey_slots[slot
31880 49 44 5d 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 ID], cackey_sess
31890 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 ions[hSession].s
318a0 69 67 6e 5f 69 64 65 6e 74 69 74 79 2c 20 63 61 ign_identity, ca
318b0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
318c0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 ession].sign_buf
318d0 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e , cackey_session
318e0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e s[hSession].sign
318f0 5f 62 75 66 75 73 65 64 2c 20 73 69 67 62 75 66 _bufused, sigbuf
31900 2c 20 73 69 7a 65 6f 66 28 73 69 67 62 75 66 29 , sizeof(sigbuf)
31910 2c 20 31 2c 20 30 29 3b 0a 09 09 09 09 7d 0a 09 , 1, 0);.....}..
31920 09 09 7d 0a 0a 09 09 09 69 66 20 28 73 69 67 62 ..}.....if (sigb
31930 75 66 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 09 uflen < 0) {....
31940 09 2f 2a 20 53 69 67 6e 69 6e 67 20 66 61 69 6c ./* Signing fail
31950 65 64 2e 20 2a 2f 0a 09 09 09 09 69 66 20 28 73 ed. */.....if (s
31960 69 67 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b igbuflen == CACK
31970 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f EY_PCSC_E_NEEDLO
31980 47 49 4e 29 20 7b 0a 09 09 09 09 09 72 65 74 76 GIN) {......retv
31990 61 6c 20 3d 20 43 4b 52 5f 55 53 45 52 5f 4e 4f al = CKR_USER_NO
319a0 54 5f 4c 4f 47 47 45 44 5f 49 4e 3b 0a 09 09 09 T_LOGGED_IN;....
319b0 09 7d 20 65 6c 73 65 20 69 66 20 28 73 69 67 62 .} else if (sigb
319c0 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f uflen == CACKEY_
319d0 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 PCSC_E_TOKENABSE
319e0 4e 54 29 20 7b 0a 09 09 09 09 09 72 65 74 76 61 NT) {......retva
319f0 6c 20 3d 20 43 4b 52 5f 44 45 56 49 43 45 5f 52 l = CKR_DEVICE_R
31a00 45 4d 4f 56 45 44 3b 0a 09 09 09 09 7d 20 65 6c EMOVED;.....} el
31a10 73 65 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c se {......retval
31a20 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 = CKR_GENERAL_E
31a30 52 52 4f 52 3b 0a 09 09 09 09 7d 0a 09 09 09 7d RROR;.....}....}
31a40 20 65 6c 73 65 20 69 66 20 28 28 28 75 6e 73 69 else if (((unsi
31a50 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 62 75 gned long) sigbu
31a60 66 6c 65 6e 29 20 3e 20 2a 70 75 6c 53 69 67 6e flen) > *pulSign
31a70 61 74 75 72 65 4c 65 6e 20 26 26 20 70 53 69 67 atureLen && pSig
31a80 6e 61 74 75 72 65 29 20 7b 0a 09 09 09 09 2f 2a nature) {...../*
31a90 20 53 69 67 6e 65 64 20 64 61 74 61 20 74 6f 6f Signed data too
31aa0 20 6c 61 72 67 65 20 2a 2f 0a 09 09 09 09 43 41 large */.....CA
31ab0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
31ac0 46 28 22 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f F("retval = CKR_
31ad0 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c BUFFER_TOO_SMALL
31ae0 3b 20 20 73 69 67 62 75 66 6c 65 6e 20 3d 20 25 ; sigbuflen = %
31af0 6c 75 2c 20 70 75 6c 53 69 67 6e 61 74 75 72 65 lu, pulSignature
31b00 4c 65 6e 20 3d 20 25 6c 75 22 2c 20 28 75 6e 73 Len = %lu", (uns
31b10 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 62 igned long) sigb
31b20 75 66 6c 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64 uflen, (unsigned
31b30 20 6c 6f 6e 67 29 20 2a 70 75 6c 53 69 67 6e 61 long) *pulSigna
31b40 74 75 72 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 72 tureLen);......r
31b50 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 etval = CKR_BUFF
31b60 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 0a 09 ER_TOO_SMALL;...
31b70 09 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 ...terminate_sig
31b80 6e 20 3d 20 30 3b 0a 09 09 09 7d 20 65 6c 73 65 n = 0;....} else
31b90 20 7b 0a 09 09 09 09 74 65 72 6d 69 6e 61 74 65 {.....terminate
31ba0 5f 73 69 67 6e 20 3d 20 30 3b 0a 0a 09 09 09 09 _sign = 0;......
31bb0 69 66 20 28 70 53 69 67 6e 61 74 75 72 65 29 20 if (pSignature)
31bc0 7b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 70 53 {......memcpy(pS
31bd0 69 67 6e 61 74 75 72 65 2c 20 73 69 67 62 75 66 ignature, sigbuf
31be0 2c 20 73 69 67 62 75 66 6c 65 6e 29 3b 0a 0a 09 , sigbuflen);...
31bf0 09 09 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 ....terminate_si
31c00 67 6e 20 3d 20 31 3b 0a 09 09 09 09 7d 0a 0a 09 gn = 1;.....}...
31c10 09 09 09 2a 70 75 6c 53 69 67 6e 61 74 75 72 65 ...*pulSignature
31c20 4c 65 6e 20 3d 20 73 69 67 62 75 66 6c 65 6e 3b Len = sigbuflen;
31c30 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 ......retval = C
31c40 4b 52 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09 KR_OK;....}.....
31c50 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 69 66 20 28 break;..}...if (
31c60 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 29 20 terminate_sign)
31c70 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 {...if (cackey_s
31c80 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
31c90 5d 2e 73 69 67 6e 5f 62 75 66 29 20 7b 0a 09 09 ].sign_buf) {...
31ca0 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 65 73 .free(cackey_ses
31cb0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
31cc0 73 69 67 6e 5f 62 75 66 29 3b 0a 09 09 7d 0a 0a sign_buf);...}..
31cd0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e ..cackey_session
31ce0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e s[hSession].sign
31cf0 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a _active = 0;..}.
31d00 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d ..mutex_retval =
31d10 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e cackey_mutex_un
31d20 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
31d30 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 ock);..if (mutex
31d40 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a _retval != 0) {.
31d50 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
31d60 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 RINTF("Error. U
31d70 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e nlocking failed.
31d80 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
31d90 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 R_GENERAL_ERROR)
31da0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ;..}...CACKEY_DE
31db0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
31dc0 72 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e 74 29 rning %i", (int)
31dd0 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 retval);...retu
31de0 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 rn(retval);.}..C
31df0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f K_DEFINE_FUNCTIO
31e00 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 52 N(CK_RV, C_SignR
31e10 65 63 6f 76 65 72 49 6e 69 74 29 28 43 4b 5f 53 ecoverInit)(CK_S
31e20 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 ESSION_HANDLE hS
31e30 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 ession, CK_MECHA
31e40 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e NISM_PTR pMechan
31e50 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 ism, CK_OBJECT_H
31e60 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 ANDLE hKey) {..C
31e70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
31e80 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
31e90 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 .if (!cackey_ini
31ea0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 tialized) {...CA
31eb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
31ec0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 F("Error. Not i
31ed0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a nitialized.");..
31ee0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 ..return(CKR_CRY
31ef0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 PTOKI_NOT_INITIA
31f00 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 LIZED);..}...CAC
31f10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
31f20 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f ("Returning CKR_
31f30 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
31f40 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b PORTED (%i)", CK
31f50 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
31f60 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 UPPORTED);...ret
31f70 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e urn(CKR_FUNCTION
31f80 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
31f90 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 .}..CK_DEFINE_FU
31fa0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f NCTION(CK_RV, C_
31fb0 53 69 67 6e 52 65 63 6f 76 65 72 29 28 43 4b 5f SignRecover)(CK_
31fc0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 SESSION_HANDLE h
31fd0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 Session, CK_BYTE
31fe0 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 _PTR pData, CK_U
31ff0 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 LONG ulDataLen,
32000 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 CK_BYTE_PTR pSig
32010 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 nature, CK_ULONG
32020 5f 50 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72 _PTR pulSignatur
32030 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f eLen) {..CACKEY_
32040 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
32050 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 lled.");...if (!
32060 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a cackey_initializ
32070 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...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 4e 6f 74 20 69 6e 69 74 69 61 6c or. Not initial
320a0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 ized.");....retu
320b0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f rn(CKR_CRYPTOKI_
320c0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 NOT_INITIALIZED)
320d0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ;..}...CACKEY_DE
320e0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
320f0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 rning CKR_FUNCTI
32100 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
32110 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 (%i)", CKR_FUNC
32120 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
32130 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b ED);...return(CK
32140 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
32150 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b UPPORTED);.}..CK
32160 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e _DEFINE_FUNCTION
32170 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 (CK_RV, C_Verify
32180 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e Init)(CK_SESSION
32190 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e _HANDLE hSession
321a0 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 , CK_MECHANISM_P
321b0 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 TR pMechanism, C
321c0 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 K_OBJECT_HANDLE
321d0 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f hKey) {..CACKEY_
321e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
321f0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 lled.");...if (!
32200 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a cackey_initializ
32210 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...CACKEY_D
32220 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
32230 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c or. Not initial
32240 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 ized.");....retu
32250 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f rn(CKR_CRYPTOKI_
32260 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 NOT_INITIALIZED)
32270 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ;..}...CACKEY_DE
32280 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
32290 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 rning CKR_FUNCTI
322a0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
322b0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 (%i)", CKR_FUNC
322c0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
322d0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b ED);...return(CK
322e0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
322f0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b UPPORTED);.}..CK
32300 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e _DEFINE_FUNCTION
32310 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 (CK_RV, C_Verify
32320 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e )(CK_SESSION_HAN
32330 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b DLE hSession, CK
32340 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c _BYTE_PTR pData,
32350 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 CK_ULONG ulData
32360 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 Len, CK_BYTE_PTR
32370 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f pSignature, CK_
32380 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72 ULONG ulSignatur
32390 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f eLen) {..CACKEY_
323a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
323b0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 lled.");...if (!
323c0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a cackey_initializ
323d0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...CACKEY_D
323e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
323f0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c or. Not initial
32400 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 ized.");....retu
32410 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f rn(CKR_CRYPTOKI_
32420 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 NOT_INITIALIZED)
32430 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ;..}...CACKEY_DE
32440 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
32450 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 rning CKR_FUNCTI
32460 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
32470 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 (%i)", CKR_FUNC
32480 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
32490 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b ED);...return(CK
324a0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
324b0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b UPPORTED);.}..CK
324c0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e _DEFINE_FUNCTION
324d0 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 (CK_RV, C_Verify
324e0 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 Update)(CK_SESSI
324f0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 ON_HANDLE hSessi
32500 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 on, CK_BYTE_PTR
32510 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 pPart, CK_ULONG
32520 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 ulPartLen) {..CA
32530 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
32540 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
32550 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 if (!cackey_init
32560 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 ialized) {...CAC
32570 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
32580 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e ("Error. Not in
32590 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 itialized.");...
325a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 .return(CKR_CRYP
325b0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c TOKI_NOT_INITIAL
325c0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b IZED);..}...CACK
325d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
325e0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 "Returning CKR_F
325f0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
32600 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 ORTED (%i)", CKR
32610 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
32620 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 PPORTED);...retu
32630 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f rn(CKR_FUNCTION_
32640 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
32650 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e }..CK_DEFINE_FUN
32660 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 CTION(CK_RV, C_V
32670 65 72 69 66 79 46 69 6e 61 6c 29 28 43 4b 5f 53 erifyFinal)(CK_S
32680 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 ESSION_HANDLE hS
32690 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f ession, CK_BYTE_
326a0 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 PTR pSignature,
326b0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 CK_ULONG ulSigna
326c0 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b tureLen) {..CACK
326d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
326e0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 "Called.");...if
326f0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 (!cackey_initia
32700 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 lized) {...CACKE
32710 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
32720 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 Error. Not init
32730 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 ialized.");....r
32740 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f eturn(CKR_CRYPTO
32750 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a KI_NOT_INITIALIZ
32760 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 ED);..}...CACKEY
32770 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
32780 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e eturning CKR_FUN
32790 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
327a0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 TED (%i)", CKR_F
327b0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
327c0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e ORTED);...return
327d0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f (CKR_FUNCTION_NO
327e0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a T_SUPPORTED);.}.
327f0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 .CK_DEFINE_FUNCT
32800 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 ION(CK_RV, C_Ver
32810 69 66 79 52 65 63 6f 76 65 72 49 6e 69 74 29 28 ifyRecoverInit)(
32820 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c CK_SESSION_HANDL
32830 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d E hSession, CK_M
32840 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 ECHANISM_PTR pMe
32850 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 chanism, CK_OBJE
32860 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 CT_HANDLE hKey)
32870 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f {..CACKEY_DEBUG_
32880 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
32890 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 );...if (!cackey
328a0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
328b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
328c0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e RINTF("Error. N
328d0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 ot initialized."
328e0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
328f0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e _CRYPTOKI_NOT_IN
32900 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
32910 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
32920 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
32930 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
32940 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 _SUPPORTED (%i)"
32950 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e , CKR_FUNCTION_N
32960 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a OT_SUPPORTED);..
32970 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 .return(CKR_FUNC
32980 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
32990 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e ED);.}..CK_DEFIN
329a0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 E_FUNCTION(CK_RV
329b0 2c 20 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 , C_VerifyRecove
329c0 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 r)(CK_SESSION_HA
329d0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 NDLE hSession, C
329e0 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e K_BYTE_PTR pSign
329f0 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 ature, CK_ULONG
32a00 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 2c 20 ulSignatureLen,
32a10 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 CK_BYTE_PTR pDat
32a20 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 a, CK_ULONG_PTR
32a30 70 75 6c 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 pulDataLen) {..C
32a40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
32a50 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
32a60 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 .if (!cackey_ini
32a70 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 tialized) {...CA
32a80 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
32a90 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 F("Error. Not i
32aa0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a nitialized.");..
32ab0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 ..return(CKR_CRY
32ac0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 PTOKI_NOT_INITIA
32ad0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 LIZED);..}...CAC
32ae0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
32af0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f ("Returning CKR_
32b00 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
32b10 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b PORTED (%i)", CK
32b20 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
32b30 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 UPPORTED);...ret
32b40 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e urn(CKR_FUNCTION
32b50 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
32b60 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 .}..CK_DEFINE_FU
32b70 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f NCTION(CK_RV, C_
32b80 44 69 67 65 73 74 45 6e 63 72 79 70 74 55 70 64 DigestEncryptUpd
32b90 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f ate)(CK_SESSION_
32ba0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c HANDLE hSession,
32bb0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 CK_BYTE_PTR pPa
32bc0 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 rt, CK_ULONG ulP
32bd0 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f artLen, CK_BYTE_
32be0 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 PTR pEncryptedPa
32bf0 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 rt, CK_ULONG_PTR
32c00 20 70 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 pulEncryptedPar
32c10 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f tLen) {..CACKEY_
32c20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
32c30 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 lled.");...if (!
32c40 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a cackey_initializ
32c50 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...CACKEY_D
32c60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
32c70 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c or. Not initial
32c80 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 ized.");....retu
32c90 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f rn(CKR_CRYPTOKI_
32ca0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 NOT_INITIALIZED)
32cb0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ;..}...CACKEY_DE
32cc0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
32cd0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 rning CKR_FUNCTI
32ce0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
32cf0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 (%i)", CKR_FUNC
32d00 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
32d10 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b ED);...return(CK
32d20 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
32d30 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b UPPORTED);.}..CK
32d40 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e _DEFINE_FUNCTION
32d50 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 (CK_RV, C_Decryp
32d60 74 44 69 67 65 73 74 55 70 64 61 74 65 29 28 43 tDigestUpdate)(C
32d70 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 K_SESSION_HANDLE
32d80 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 hSession, CK_BY
32d90 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 TE_PTR pEncrypte
32da0 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 dPart, CK_ULONG
32db0 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c ulEncryptedPartL
32dc0 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 en, CK_BYTE_PTR
32dd0 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f pPart, CK_ULONG_
32de0 50 54 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20 PTR pulPartLen)
32df0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f {..CACKEY_DEBUG_
32e00 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
32e10 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 );...if (!cackey
32e20 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
32e30 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
32e40 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e RINTF("Error. N
32e50 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 ot initialized."
32e60 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
32e70 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e _CRYPTOKI_NOT_IN
32e80 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
32e90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
32ea0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
32eb0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
32ec0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 _SUPPORTED (%i)"
32ed0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e , CKR_FUNCTION_N
32ee0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a OT_SUPPORTED);..
32ef0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 .return(CKR_FUNC
32f00 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
32f10 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e ED);.}..CK_DEFIN
32f20 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 E_FUNCTION(CK_RV
32f30 2c 20 43 5f 53 69 67 6e 45 6e 63 72 79 70 74 55 , C_SignEncryptU
32f40 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f pdate)(CK_SESSIO
32f50 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f N_HANDLE hSessio
32f60 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 n, CK_BYTE_PTR p
32f70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 Part, CK_ULONG u
32f80 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 lPartLen, CK_BYT
32f90 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 E_PTR pEncrypted
32fa0 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 Part, CK_ULONG_P
32fb0 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64 50 TR pulEncryptedP
32fc0 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 artLen) {..CACKE
32fd0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
32fe0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 Called.");...if
32ff0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c (!cackey_initial
33000 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 ized) {...CACKEY
33010 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
33020 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 rror. Not initi
33030 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 alized.");....re
33040 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b turn(CKR_CRYPTOK
33050 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 I_NOT_INITIALIZE
33060 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f D);..}...CACKEY_
33070 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
33080 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 turning CKR_FUNC
33090 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
330a0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 ED (%i)", CKR_FU
330b0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
330c0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 RTED);...return(
330d0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
330e0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a _SUPPORTED);.}..
330f0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 CK_DEFINE_FUNCTI
33100 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 ON(CK_RV, C_Decr
33110 79 70 74 56 65 72 69 66 79 55 70 64 61 74 65 29 yptVerifyUpdate)
33120 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 (CK_SESSION_HAND
33130 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f LE hSession, CK_
33140 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 BYTE_PTR pEncryp
33150 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e tedPart, CK_ULON
33160 47 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 G ulEncryptedPar
33170 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 tLen, CK_BYTE_PT
33180 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e R pPart, CK_ULON
33190 47 5f 50 54 52 20 70 75 6c 50 61 72 74 4c 65 6e G_PTR pulPartLen
331a0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 ) {..CACKEY_DEBU
331b0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 G_PRINTF("Called
331c0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b .");...if (!cack
331d0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 ey_initialized)
331e0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
331f0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
33200 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 Not initialized
33210 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
33220 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f KR_CRYPTOKI_NOT_
33230 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d INITIALIZED);..}
33240 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
33250 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e PRINTF("Returnin
33260 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e g CKR_FUNCTION_N
33270 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 OT_SUPPORTED (%i
33280 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e )", CKR_FUNCTION
33290 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
332a0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 ...return(CKR_FU
332b0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
332c0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 RTED);.}..CK_DEF
332d0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f INE_FUNCTION(CK_
332e0 52 56 2c 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 RV, C_GenerateKe
332f0 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 y)(CK_SESSION_HA
33300 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 NDLE hSession, C
33310 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 K_MECHANISM_PTR
33320 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 41 pMechanism, CK_A
33330 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 TTRIBUTE_PTR pTe
33340 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 mplate, CK_ULONG
33350 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a ulCount, CK_OBJ
33360 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 ECT_HANDLE_PTR p
33370 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f hKey) {..CACKEY_
33380 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
33390 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 lled.");...if (!
333a0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a cackey_initializ
333b0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...CACKEY_D
333c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
333d0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c or. Not initial
333e0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 ized.");....retu
333f0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f rn(CKR_CRYPTOKI_
33400 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 NOT_INITIALIZED)
33410 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ;..}...CACKEY_DE
33420 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
33430 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 rning CKR_FUNCTI
33440 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
33450 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 (%i)", CKR_FUNC
33460 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
33470 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b ED);...return(CK
33480 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
33490 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b UPPORTED);.}..CK
334a0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e _DEFINE_FUNCTION
334b0 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61 (CK_RV, C_Genera
334c0 74 65 4b 65 79 50 61 69 72 29 28 43 4b 5f 53 45 teKeyPair)(CK_SE
334d0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 SSION_HANDLE hSe
334e0 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e ssion, CK_MECHAN
334f0 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 ISM_PTR pMechani
33500 73 6d 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 sm, CK_ATTRIBUTE
33510 5f 50 54 52 20 70 50 75 62 6c 69 63 4b 65 79 54 _PTR pPublicKeyT
33520 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e emplate, CK_ULON
33530 47 20 75 6c 50 75 62 6c 69 63 4b 65 79 41 74 74 G ulPublicKeyAtt
33540 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f ributeCount, CK_
33550 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 50 ATTRIBUTE_PTR pP
33560 72 69 76 61 74 65 4b 65 79 54 65 6d 70 6c 61 74 rivateKeyTemplat
33570 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 72 e, CK_ULONG ulPr
33580 69 76 61 74 65 4b 65 79 41 74 74 72 69 62 75 74 ivateKeyAttribut
33590 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 eCount, CK_OBJEC
335a0 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 50 T_HANDLE_PTR phP
335b0 75 62 6c 69 63 4b 65 79 2c 20 43 4b 5f 4f 42 4a ublicKey, CK_OBJ
335c0 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 ECT_HANDLE_PTR p
335d0 68 50 72 69 76 61 74 65 4b 65 79 29 20 7b 0a 09 hPrivateKey) {..
335e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
335f0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a NTF("Called.");.
33600 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e ..if (!cackey_in
33610 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 itialized) {...C
33620 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
33630 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 TF("Error. Not
33640 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a initialized.");.
33650 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 ...return(CKR_CR
33660 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 YPTOKI_NOT_INITI
33670 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 ALIZED);..}...CA
33680 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
33690 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 F("Returning CKR
336a0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
336b0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 PPORTED (%i)", C
336c0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
336d0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 SUPPORTED);...re
336e0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f turn(CKR_FUNCTIO
336f0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 N_NOT_SUPPORTED)
33700 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 ;.}..CK_DEFINE_F
33710 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 UNCTION(CK_RV, C
33720 5f 57 72 61 70 4b 65 79 29 28 43 4b 5f 53 45 53 _WrapKey)(CK_SES
33730 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 SION_HANDLE hSes
33740 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 sion, CK_MECHANI
33750 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 SM_PTR pMechanis
33760 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e m, CK_OBJECT_HAN
33770 44 4c 45 20 68 57 72 61 70 70 69 6e 67 4b 65 79 DLE hWrappingKey
33780 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 , CK_OBJECT_HAND
33790 4c 45 20 68 4b 65 79 2c 20 43 4b 5f 42 59 54 45 LE hKey, CK_BYTE
337a0 5f 50 54 52 20 70 57 72 61 70 70 65 64 4b 65 79 _PTR pWrappedKey
337b0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 , CK_ULONG_PTR p
337c0 75 6c 57 72 61 70 70 65 64 4b 65 79 4c 65 6e 29 ulWrappedKeyLen)
337d0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {..CACKEY_DEBUG
337e0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
337f0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ");...if (!cacke
33800 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b y_initialized) {
33810 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
33820 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
33830 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e Not initialized.
33840 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
33850 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 R_CRYPTOKI_NOT_I
33860 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
33870 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
33880 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
33890 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f CKR_FUNCTION_NO
338a0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 T_SUPPORTED (%i)
338b0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f ", CKR_FUNCTION_
338c0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
338d0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e ..return(CKR_FUN
338e0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
338f0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 TED);.}..CK_DEFI
33900 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 NE_FUNCTION(CK_R
33910 56 2c 20 43 5f 55 6e 77 72 61 70 4b 65 79 29 28 V, C_UnwrapKey)(
33920 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c CK_SESSION_HANDL
33930 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d E hSession, CK_M
33940 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 ECHANISM_PTR pMe
33950 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 chanism, CK_OBJE
33960 43 54 5f 48 41 4e 44 4c 45 20 68 55 6e 77 72 61 CT_HANDLE hUnwra
33970 70 70 69 6e 67 4b 65 79 2c 20 43 4b 5f 42 59 54 ppingKey, CK_BYT
33980 45 5f 50 54 52 20 70 57 72 61 70 70 65 64 4b 65 E_PTR pWrappedKe
33990 79 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 57 72 y, CK_ULONG ulWr
339a0 61 70 70 65 64 4b 65 79 4c 65 6e 2c 20 43 4b 5f appedKeyLen, CK_
339b0 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 ATTRIBUTE_PTR pT
339c0 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e emplate, CK_ULON
339d0 47 20 75 6c 41 74 74 72 69 62 75 74 65 43 6f 75 G ulAttributeCou
339e0 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 nt, CK_OBJECT_HA
339f0 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65 79 29 20 NDLE_PTR phKey)
33a00 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f {..CACKEY_DEBUG_
33a10 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
33a20 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 );...if (!cackey
33a30 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
33a40 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
33a50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e RINTF("Error. N
33a60 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 ot initialized."
33a70 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
33a80 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e _CRYPTOKI_NOT_IN
33a90 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
33aa0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
33ab0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
33ac0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
33ad0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 _SUPPORTED (%i)"
33ae0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e , CKR_FUNCTION_N
33af0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a OT_SUPPORTED);..
33b00 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 .return(CKR_FUNC
33b10 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
33b20 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e ED);.}..CK_DEFIN
33b30 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 E_FUNCTION(CK_RV
33b40 2c 20 43 5f 44 65 72 69 76 65 4b 65 79 29 28 43 , C_DeriveKey)(C
33b50 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 K_SESSION_HANDLE
33b60 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 hSession, CK_ME
33b70 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 CHANISM_PTR pMec
33b80 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 hanism, CK_OBJEC
33b90 54 5f 48 41 4e 44 4c 45 20 68 42 61 73 65 4b 65 T_HANDLE hBaseKe
33ba0 79 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f y, CK_ATTRIBUTE_
33bb0 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 PTR pTemplate, C
33bc0 4b 5f 55 4c 4f 4e 47 20 75 6c 41 74 74 72 69 62 K_ULONG ulAttrib
33bd0 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a uteCount, CK_OBJ
33be0 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 ECT_HANDLE_PTR p
33bf0 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f hKey) {..CACKEY_
33c00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
33c10 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 lled.");...if (!
33c20 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a cackey_initializ
33c30 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...CACKEY_D
33c40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
33c50 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c or. Not initial
33c60 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 ized.");....retu
33c70 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f rn(CKR_CRYPTOKI_
33c80 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 NOT_INITIALIZED)
33c90 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ;..}...CACKEY_DE
33ca0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
33cb0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 rning CKR_FUNCTI
33cc0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
33cd0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 (%i)", CKR_FUNC
33ce0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
33cf0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b ED);...return(CK
33d00 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
33d10 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b UPPORTED);.}..CK
33d20 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e _DEFINE_FUNCTION
33d30 28 43 4b 5f 52 56 2c 20 43 5f 53 65 65 64 52 61 (CK_RV, C_SeedRa
33d40 6e 64 6f 6d 29 28 43 4b 5f 53 45 53 53 49 4f 4e ndom)(CK_SESSION
33d50 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e _HANDLE hSession
33d60 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 , CK_BYTE_PTR pS
33d70 65 65 64 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c eed, CK_ULONG ul
33d80 53 65 65 64 4c 65 6e 29 20 7b 0a 09 43 41 43 4b SeedLen) {..CACK
33d90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
33da0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 "Called.");...if
33db0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 (!cackey_initia
33dc0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 lized) {...CACKE
33dd0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
33de0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 Error. Not init
33df0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 ialized.");....r
33e00 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f eturn(CKR_CRYPTO
33e10 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a KI_NOT_INITIALIZ
33e20 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 ED);..}...CACKEY
33e30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
33e40 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e eturning CKR_FUN
33e50 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
33e60 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 TED (%i)", CKR_F
33e70 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
33e80 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e ORTED);...return
33e90 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f (CKR_FUNCTION_NO
33ea0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a T_SUPPORTED);.}.
33eb0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 .CK_DEFINE_FUNCT
33ec0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e ION(CK_RV, C_Gen
33ed0 65 72 61 74 65 52 61 6e 64 6f 6d 29 28 43 4b 5f erateRandom)(CK_
33ee0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 SESSION_HANDLE h
33ef0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 Session, CK_BYTE
33f00 5f 50 54 52 20 70 52 61 6e 64 6f 6d 44 61 74 61 _PTR pRandomData
33f10 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 52 61 6e , CK_ULONG ulRan
33f20 64 6f 6d 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 domLen) {..CACKE
33f30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
33f40 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 Called.");...if
33f50 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c (!cackey_initial
33f60 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 ized) {...CACKEY
33f70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
33f80 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 rror. Not initi
33f90 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 alized.");....re
33fa0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b turn(CKR_CRYPTOK
33fb0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 I_NOT_INITIALIZE
33fc0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f D);..}...CACKEY_
33fd0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
33fe0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 turning CKR_FUNC
33ff0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
34000 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 ED (%i)", CKR_FU
34010 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
34020 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 RTED);...return(
34030 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
34040 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a _SUPPORTED);.}..
34050 2f 2a 20 44 65 70 72 65 63 61 74 65 64 20 46 75 /* Deprecated Fu
34060 6e 63 74 69 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 46 nction */.CK_DEF
34070 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f INE_FUNCTION(CK_
34080 52 56 2c 20 43 5f 47 65 74 46 75 6e 63 74 69 6f RV, C_GetFunctio
34090 6e 53 74 61 74 75 73 29 28 43 4b 5f 53 45 53 53 nStatus)(CK_SESS
340a0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 ION_HANDLE hSess
340b0 69 6f 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 ion) {..CACKEY_D
340c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
340d0 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 led.");...CACKEY
340e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
340f0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e eturning CKR_FUN
34100 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c CTION_NOT_PARALL
34110 45 4c 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 EL (%i)", CKR_FU
34120 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c NCTION_NOT_PARAL
34130 4c 45 4c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 LEL);...return(C
34140 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
34150 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65 PARALLEL);...hSe
34160 73 73 69 6f 6e 20 3d 20 68 53 65 73 73 69 6f 6e ssion = hSession
34170 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75 6e 75 ; /* Supress unu
34180 73 65 64 20 76 61 72 69 61 62 6c 65 20 77 61 72 sed variable war
34190 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 20 44 65 ning */.}../* De
341a0 70 72 65 63 61 74 65 64 20 46 75 6e 63 74 69 6f precated Functio
341b0 6e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 n */.CK_DEFINE_F
341c0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 UNCTION(CK_RV, C
341d0 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 29 _CancelFunction)
341e0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 (CK_SESSION_HAND
341f0 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 LE hSession) {..
34200 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
34210 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a NTF("Called.");.
34220 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
34230 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
34240 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f CKR_FUNCTION_NO
34250 54 5f 50 41 52 41 4c 4c 45 4c 20 28 25 69 29 22 T_PARALLEL (%i)"
34260 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e , CKR_FUNCTION_N
34270 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 OT_PARALLEL);...
34280 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 return(CKR_FUNCT
34290 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c ION_NOT_PARALLEL
342a0 29 3b 0a 0a 09 68 53 65 73 73 69 6f 6e 20 3d 20 );...hSession =
342b0 68 53 65 73 73 69 6f 6e 3b 20 2f 2a 20 53 75 70 hSession; /* Sup
342c0 72 65 73 73 20 75 6e 75 73 65 64 20 76 61 72 69 ress unused vari
342d0 61 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a able warning */.
342e0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e }..CK_DEFINE_FUN
342f0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 CTION(CK_RV, C_G
34300 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 28 etFunctionList)(
34310 43 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 CK_FUNCTION_LIST
34320 5f 50 54 52 5f 50 54 52 20 70 70 46 75 6e 63 74 _PTR_PTR ppFunct
34330 69 6f 6e 4c 69 73 74 29 20 7b 0a 09 73 74 61 74 ionList) {..stat
34340 69 63 20 43 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c ic CK_FUNCTION_L
34350 49 53 54 5f 50 54 52 20 73 70 46 75 6e 63 74 69 IST_PTR spFuncti
34360 6f 6e 4c 69 73 74 20 3d 20 4e 55 4c 4c 3b 0a 09 onList = NULL;..
34370 43 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 CK_FUNCTION_LIST
34380 5f 50 54 52 20 70 46 75 6e 63 74 69 6f 6e 4c 69 _PTR pFunctionLi
34390 73 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 st;...CACKEY_DEB
343a0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
343b0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 70 46 75 d.");...if (ppFu
343c0 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 3d 20 4e 55 nctionList == NU
343d0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 LL) {...CACKEY_D
343e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
343f0 6f 72 2e 20 70 70 46 75 6e 63 74 69 6f 6e 4c 69 or. ppFunctionLi
34400 73 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a st is NULL.");..
34410 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 ..return(CKR_ARG
34420 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a UMENTS_BAD);..}.
34430 0a 09 69 66 20 28 73 70 46 75 6e 63 74 69 6f 6e ..if (spFunction
34440 4c 69 73 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a List != NULL) {.
34450 09 09 2a 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 ..*ppFunctionLis
34460 74 20 3d 20 73 70 46 75 6e 63 74 69 6f 6e 4c 69 t = spFunctionLi
34470 73 74 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 st;....CACKEY_DE
34480 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
34490 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 rning CKR_OK (%i
344a0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 )", CKR_OK);....
344b0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a return(CKR_OK);.
344c0 09 7d 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 .}...pFunctionLi
344d0 73 74 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 st = malloc(size
344e0 6f 66 28 2a 70 46 75 6e 63 74 69 6f 6e 4c 69 73 of(*pFunctionLis
344f0 74 29 29 3b 0a 0a 09 70 46 75 6e 63 74 69 6f 6e t));...pFunction
34500 4c 69 73 74 2d 3e 76 65 72 73 69 6f 6e 2e 6d 61 List->version.ma
34510 6a 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 jor = ((CACKEY_C
34520 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f RYPTOKI_VERSION_
34530 43 4f 44 45 29 20 3e 3e 20 31 36 29 20 26 20 30 CODE) >> 16) & 0
34540 78 66 66 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c xff;..pFunctionL
34550 69 73 74 2d 3e 76 65 72 73 69 6f 6e 2e 6d 69 6e ist->version.min
34560 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 52 or = ((CACKEY_CR
34570 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 YPTOKI_VERSION_C
34580 4f 44 45 29 20 3e 3e 20 38 29 20 26 20 30 78 66 ODE) >> 8) & 0xf
34590 66 3b 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 f;...pFunctionLi
345a0 73 74 2d 3e 43 5f 49 6e 69 74 69 61 6c 69 7a 65 st->C_Initialize
345b0 20 3d 20 43 5f 49 6e 69 74 69 61 6c 69 7a 65 3b = C_Initialize;
345c0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d ..pFunctionList-
345d0 3e 43 5f 46 69 6e 61 6c 69 7a 65 20 3d 20 43 5f >C_Finalize = C_
345e0 46 69 6e 61 6c 69 7a 65 3b 0a 09 70 46 75 6e 63 Finalize;..pFunc
345f0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 49 tionList->C_GetI
34600 6e 66 6f 20 3d 20 43 5f 47 65 74 49 6e 66 6f 3b nfo = C_GetInfo;
34610 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d ..pFunctionList-
34620 3e 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74 20 3d >C_GetSlotList =
34630 20 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74 3b 0a C_GetSlotList;.
34640 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e .pFunctionList->
34650 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 20 3d 20 C_GetSlotInfo =
34660 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 3b 0a 09 C_GetSlotInfo;..
34670 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 pFunctionList->C
34680 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 20 3d 20 _GetTokenInfo =
34690 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 3b 0a C_GetTokenInfo;.
346a0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e .pFunctionList->
346b0 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74 45 76 65 C_WaitForSlotEve
346c0 6e 74 20 3d 20 43 5f 57 61 69 74 46 6f 72 53 6c nt = C_WaitForSl
346d0 6f 74 45 76 65 6e 74 3b 0a 09 70 46 75 6e 63 74 otEvent;..pFunct
346e0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4d 65 ionList->C_GetMe
346f0 63 68 61 6e 69 73 6d 4c 69 73 74 20 3d 20 43 5f chanismList = C_
34700 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 GetMechanismList
34710 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 ;..pFunctionList
34720 2d 3e 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d ->C_GetMechanism
34730 49 6e 66 6f 20 3d 20 43 5f 47 65 74 4d 65 63 68 Info = C_GetMech
34740 61 6e 69 73 6d 49 6e 66 6f 3b 0a 09 70 46 75 6e anismInfo;..pFun
34750 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 ctionList->C_Ini
34760 74 54 6f 6b 65 6e 20 3d 20 43 5f 49 6e 69 74 54 tToken = C_InitT
34770 6f 6b 65 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e oken;..pFunction
34780 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 50 49 4e 20 List->C_InitPIN
34790 3d 20 43 5f 49 6e 69 74 50 49 4e 3b 0a 09 70 46 = C_InitPIN;..pF
347a0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 unctionList->C_S
347b0 65 74 50 49 4e 20 3d 20 43 5f 53 65 74 50 49 4e etPIN = C_SetPIN
347c0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 ;..pFunctionList
347d0 2d 3e 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 20 ->C_OpenSession
347e0 3d 20 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 3b = C_OpenSession;
347f0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d ..pFunctionList-
34800 3e 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 20 >C_CloseSession
34810 3d 20 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e = C_CloseSession
34820 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 ;..pFunctionList
34830 2d 3e 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73 ->C_CloseAllSess
34840 69 6f 6e 73 20 3d 20 43 5f 43 6c 6f 73 65 41 6c ions = C_CloseAl
34850 6c 53 65 73 73 69 6f 6e 73 3b 0a 09 70 46 75 6e lSessions;..pFun
34860 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 ctionList->C_Get
34870 53 65 73 73 69 6f 6e 49 6e 66 6f 20 3d 20 43 5f SessionInfo = C_
34880 47 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f 3b 0a GetSessionInfo;.
34890 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e .pFunctionList->
348a0 43 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 C_GetOperationSt
348b0 61 74 65 20 3d 20 43 5f 47 65 74 4f 70 65 72 61 ate = C_GetOpera
348c0 74 69 6f 6e 53 74 61 74 65 3b 0a 09 70 46 75 6e tionState;..pFun
348d0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 ctionList->C_Set
348e0 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 20 3d OperationState =
348f0 20 43 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e 53 C_SetOperationS
34900 74 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e tate;..pFunction
34910 4c 69 73 74 2d 3e 43 5f 4c 6f 67 69 6e 20 3d 20 List->C_Login =
34920 43 5f 4c 6f 67 69 6e 3b 0a 09 70 46 75 6e 63 74 C_Login;..pFunct
34930 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4c 6f 67 6f 75 ionList->C_Logou
34940 74 20 3d 20 43 5f 4c 6f 67 6f 75 74 3b 0a 09 70 t = C_Logout;..p
34950 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f FunctionList->C_
34960 43 72 65 61 74 65 4f 62 6a 65 63 74 20 3d 20 43 CreateObject = C
34970 5f 43 72 65 61 74 65 4f 62 6a 65 63 74 3b 0a 09 _CreateObject;..
34980 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 pFunctionList->C
34990 5f 43 6f 70 79 4f 62 6a 65 63 74 20 3d 20 43 5f _CopyObject = C_
349a0 43 6f 70 79 4f 62 6a 65 63 74 3b 0a 09 70 46 75 CopyObject;..pFu
349b0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 nctionList->C_De
349c0 73 74 72 6f 79 4f 62 6a 65 63 74 20 3d 20 43 5f stroyObject = C_
349d0 44 65 73 74 72 6f 79 4f 62 6a 65 63 74 3b 0a 09 DestroyObject;..
349e0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 pFunctionList->C
349f0 5f 47 65 74 4f 62 6a 65 63 74 53 69 7a 65 20 3d _GetObjectSize =
34a00 20 43 5f 47 65 74 4f 62 6a 65 63 74 53 69 7a 65 C_GetObjectSize
34a10 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 ;..pFunctionList
34a20 2d 3e 43 5f 47 65 74 41 74 74 72 69 62 75 74 65 ->C_GetAttribute
34a30 56 61 6c 75 65 20 3d 20 43 5f 47 65 74 41 74 74 Value = C_GetAtt
34a40 72 69 62 75 74 65 56 61 6c 75 65 3b 0a 09 70 46 ributeValue;..pF
34a50 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 unctionList->C_S
34a60 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 etAttributeValue
34a70 20 3d 20 43 5f 53 65 74 41 74 74 72 69 62 75 74 = C_SetAttribut
34a80 65 56 61 6c 75 65 3b 0a 09 70 46 75 6e 63 74 69 eValue;..pFuncti
34a90 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 onList->C_FindOb
34aa0 6a 65 63 74 73 49 6e 69 74 20 3d 20 43 5f 46 69 jectsInit = C_Fi
34ab0 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 3b 0a 09 ndObjectsInit;..
34ac0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 pFunctionList->C
34ad0 5f 46 69 6e 64 4f 62 6a 65 63 74 73 20 3d 20 43 _FindObjects = C
34ae0 5f 46 69 6e 64 4f 62 6a 65 63 74 73 3b 0a 09 70 _FindObjects;..p
34af0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f FunctionList->C_
34b00 46 69 6e 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c FindObjectsFinal
34b10 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 = C_FindObjects
34b20 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f Final;..pFunctio
34b30 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 nList->C_Encrypt
34b40 49 6e 69 74 20 3d 20 43 5f 45 6e 63 72 79 70 74 Init = C_Encrypt
34b50 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e Init;..pFunction
34b60 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 20 List->C_Encrypt
34b70 3d 20 43 5f 45 6e 63 72 79 70 74 3b 0a 09 70 46 = C_Encrypt;..pF
34b80 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 unctionList->C_E
34b90 6e 63 72 79 70 74 55 70 64 61 74 65 20 3d 20 43 ncryptUpdate = C
34ba0 5f 45 6e 63 72 79 70 74 55 70 64 61 74 65 3b 0a _EncryptUpdate;.
34bb0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e .pFunctionList->
34bc0 43 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c 20 3d C_EncryptFinal =
34bd0 20 43 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c 3b C_EncryptFinal;
34be0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d ..pFunctionList-
34bf0 3e 43 5f 44 65 63 72 79 70 74 49 6e 69 74 20 3d >C_DecryptInit =
34c00 20 43 5f 44 65 63 72 79 70 74 49 6e 69 74 3b 0a C_DecryptInit;.
34c10 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e .pFunctionList->
34c20 43 5f 44 65 63 72 79 70 74 20 3d 20 43 5f 44 65 C_Decrypt = C_De
34c30 63 72 79 70 74 3b 0a 09 70 46 75 6e 63 74 69 6f crypt;..pFunctio
34c40 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 nList->C_Decrypt
34c50 55 70 64 61 74 65 20 3d 20 43 5f 44 65 63 72 79 Update = C_Decry
34c60 70 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 ptUpdate;..pFunc
34c70 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 tionList->C_Decr
34c80 79 70 74 46 69 6e 61 6c 20 3d 20 43 5f 44 65 63 yptFinal = C_Dec
34c90 72 79 70 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e ryptFinal;..pFun
34ca0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 ctionList->C_Dig
34cb0 65 73 74 49 6e 69 74 20 3d 20 43 5f 44 69 67 65 estInit = C_Dige
34cc0 73 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 stInit;..pFuncti
34cd0 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 onList->C_Digest
34ce0 20 3d 20 43 5f 44 69 67 65 73 74 3b 0a 09 70 46 = C_Digest;..pF
34cf0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 unctionList->C_D
34d00 69 67 65 73 74 55 70 64 61 74 65 20 3d 20 43 5f igestUpdate = C_
34d10 44 69 67 65 73 74 55 70 64 61 74 65 3b 0a 09 70 DigestUpdate;..p
34d20 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f FunctionList->C_
34d30 44 69 67 65 73 74 4b 65 79 20 3d 20 43 5f 44 69 DigestKey = C_Di
34d40 67 65 73 74 4b 65 79 3b 0a 09 70 46 75 6e 63 74 gestKey;..pFunct
34d50 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 ionList->C_Diges
34d60 74 46 69 6e 61 6c 20 3d 20 43 5f 44 69 67 65 73 tFinal = C_Diges
34d70 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 tFinal;..pFuncti
34d80 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 49 6e onList->C_SignIn
34d90 69 74 20 3d 20 43 5f 53 69 67 6e 49 6e 69 74 3b it = C_SignInit;
34da0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d ..pFunctionList-
34db0 3e 43 5f 53 69 67 6e 20 3d 20 43 5f 53 69 67 6e >C_Sign = C_Sign
34dc0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 ;..pFunctionList
34dd0 2d 3e 43 5f 53 69 67 6e 55 70 64 61 74 65 20 3d ->C_SignUpdate =
34de0 20 43 5f 53 69 67 6e 55 70 64 61 74 65 3b 0a 09 C_SignUpdate;..
34df0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 pFunctionList->C
34e00 5f 53 69 67 6e 46 69 6e 61 6c 20 3d 20 43 5f 53 _SignFinal = C_S
34e10 69 67 6e 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 ignFinal;..pFunc
34e20 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e tionList->C_Sign
34e30 52 65 63 6f 76 65 72 49 6e 69 74 20 3d 20 43 5f RecoverInit = C_
34e40 53 69 67 6e 52 65 63 6f 76 65 72 49 6e 69 74 3b SignRecoverInit;
34e50 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d ..pFunctionList-
34e60 3e 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 20 3d >C_SignRecover =
34e70 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 3b 0a C_SignRecover;.
34e80 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e .pFunctionList->
34e90 43 5f 56 65 72 69 66 79 49 6e 69 74 20 3d 20 43 C_VerifyInit = C
34ea0 5f 56 65 72 69 66 79 49 6e 69 74 3b 0a 09 70 46 _VerifyInit;..pF
34eb0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 unctionList->C_V
34ec0 65 72 69 66 79 20 3d 20 43 5f 56 65 72 69 66 79 erify = C_Verify
34ed0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 ;..pFunctionList
34ee0 2d 3e 43 5f 56 65 72 69 66 79 55 70 64 61 74 65 ->C_VerifyUpdate
34ef0 20 3d 20 43 5f 56 65 72 69 66 79 55 70 64 61 74 = C_VerifyUpdat
34f00 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 e;..pFunctionLis
34f10 74 2d 3e 43 5f 56 65 72 69 66 79 46 69 6e 61 6c t->C_VerifyFinal
34f20 20 3d 20 43 5f 56 65 72 69 66 79 46 69 6e 61 6c = C_VerifyFinal
34f30 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 ;..pFunctionList
34f40 2d 3e 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 ->C_VerifyRecove
34f50 72 49 6e 69 74 20 3d 20 43 5f 56 65 72 69 66 79 rInit = C_Verify
34f60 52 65 63 6f 76 65 72 49 6e 69 74 3b 0a 09 70 46 RecoverInit;..pF
34f70 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 unctionList->C_V
34f80 65 72 69 66 79 52 65 63 6f 76 65 72 20 3d 20 43 erifyRecover = C
34f90 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 3b 0a _VerifyRecover;.
34fa0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e .pFunctionList->
34fb0 43 5f 44 69 67 65 73 74 45 6e 63 72 79 70 74 55 C_DigestEncryptU
34fc0 70 64 61 74 65 20 3d 20 43 5f 44 69 67 65 73 74 pdate = C_Digest
34fd0 45 6e 63 72 79 70 74 55 70 64 61 74 65 3b 0a 09 EncryptUpdate;..
34fe0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 pFunctionList->C
34ff0 5f 44 65 63 72 79 70 74 44 69 67 65 73 74 55 70 _DecryptDigestUp
35000 64 61 74 65 20 3d 20 43 5f 44 65 63 72 79 70 74 date = C_Decrypt
35010 44 69 67 65 73 74 55 70 64 61 74 65 3b 0a 09 70 DigestUpdate;..p
35020 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f FunctionList->C_
35030 53 69 67 6e 45 6e 63 72 79 70 74 55 70 64 61 74 SignEncryptUpdat
35040 65 20 3d 20 43 5f 53 69 67 6e 45 6e 63 72 79 70 e = C_SignEncryp
35050 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 tUpdate;..pFunct
35060 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 ionList->C_Decry
35070 70 74 56 65 72 69 66 79 55 70 64 61 74 65 20 3d ptVerifyUpdate =
35080 20 43 5f 44 65 63 72 79 70 74 56 65 72 69 66 79 C_DecryptVerify
35090 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 Update;..pFuncti
350a0 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e 65 72 61 onList->C_Genera
350b0 74 65 4b 65 79 20 3d 20 43 5f 47 65 6e 65 72 61 teKey = C_Genera
350c0 74 65 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f teKey;..pFunctio
350d0 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e 65 72 61 74 nList->C_Generat
350e0 65 4b 65 79 50 61 69 72 20 3d 20 43 5f 47 65 6e eKeyPair = C_Gen
350f0 65 72 61 74 65 4b 65 79 50 61 69 72 3b 0a 09 70 erateKeyPair;..p
35100 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f FunctionList->C_
35110 57 72 61 70 4b 65 79 20 3d 20 43 5f 57 72 61 70 WrapKey = C_Wrap
35120 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c Key;..pFunctionL
35130 69 73 74 2d 3e 43 5f 55 6e 77 72 61 70 4b 65 79 ist->C_UnwrapKey
35140 20 3d 20 43 5f 55 6e 77 72 61 70 4b 65 79 3b 0a = C_UnwrapKey;.
35150 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e .pFunctionList->
35160 43 5f 44 65 72 69 76 65 4b 65 79 20 3d 20 43 5f C_DeriveKey = C_
35170 44 65 72 69 76 65 4b 65 79 3b 0a 09 70 46 75 6e DeriveKey;..pFun
35180 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 65 ctionList->C_See
35190 64 52 61 6e 64 6f 6d 20 3d 20 43 5f 53 65 65 64 dRandom = C_Seed
351a0 52 61 6e 64 6f 6d 3b 0a 09 70 46 75 6e 63 74 69 Random;..pFuncti
351b0 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e 65 72 61 onList->C_Genera
351c0 74 65 52 61 6e 64 6f 6d 20 3d 20 43 5f 47 65 6e teRandom = C_Gen
351d0 65 72 61 74 65 52 61 6e 64 6f 6d 3b 0a 09 70 46 erateRandom;..pF
351e0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 unctionList->C_G
351f0 65 74 46 75 6e 63 74 69 6f 6e 53 74 61 74 75 73 etFunctionStatus
35200 20 3d 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e = C_GetFunction
35210 53 74 61 74 75 73 3b 0a 09 70 46 75 6e 63 74 69 Status;..pFuncti
35220 6f 6e 4c 69 73 74 2d 3e 43 5f 43 61 6e 63 65 6c onList->C_Cancel
35230 46 75 6e 63 74 69 6f 6e 20 3d 20 43 5f 43 61 6e Function = C_Can
35240 63 65 6c 46 75 6e 63 74 69 6f 6e 3b 0a 09 70 46 celFunction;..pF
35250 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 unctionList->C_G
35260 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d etFunctionList =
35270 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 4c 69 C_GetFunctionLi
35280 73 74 3b 0a 0a 09 73 70 46 75 6e 63 74 69 6f 6e st;...spFunction
35290 4c 69 73 74 20 20 3d 20 70 46 75 6e 63 74 69 6f List = pFunctio
352a0 6e 4c 69 73 74 3b 0a 09 2a 70 70 46 75 6e 63 74 nList;..*ppFunct
352b0 69 6f 6e 4c 69 73 74 20 3d 20 70 46 75 6e 63 74 ionList = pFunct
352c0 69 6f 6e 4c 69 73 74 3b 0a 0a 09 43 41 43 4b 45 ionList;...CACKE
352d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
352e0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b Returning CKR_OK
352f0 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b (%i)", CKR_OK);
35300 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b ...return(CKR_OK
35310 29 3b 0a 7d 0a );.}.