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 50 43 53 .#ifdef HAVE_PCS
0040: 43 4c 49 54 45 5f 48 0a 23 20 20 69 6e 63 6c 75 CLITE_H.# inclu
0050: 64 65 20 3c 70 63 73 63 6c 69 74 65 2e 68 3e 0a de <pcsclite.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 57 49 4e 53 43 41 52 44 5f 48 0a 23 20 VE_WINSCARD_H.#
0080: 20 69 6e 63 6c 75 64 65 20 3c 77 69 6e 73 63 61 include <winsca
0090: 72 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 rd.h>.#endif.#if
00a0: 64 65 66 20 48 41 56 45 5f 53 54 44 49 4e 54 5f def HAVE_STDINT_
00b0: 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 74 H.# include <st
00c0: 64 69 6e 74 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 dint.h>.#endif.#
00d0: 69 66 64 65 66 20 48 41 56 45 5f 49 4e 54 54 59 ifdef HAVE_INTTY
00e0: 50 45 53 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 PES_H.# include
00f0: 20 3c 69 6e 74 74 79 70 65 73 2e 68 3e 0a 23 65 <inttypes.h>.#e
0100: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45 ndif.#ifdef HAVE
0110: 5f 53 54 44 4c 49 42 5f 48 0a 23 20 20 69 6e 63 _STDLIB_H.# inc
0120: 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a lude <stdlib.h>.
0130: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 #endif.#ifdef HA
0140: 56 45 5f 55 4e 49 53 54 44 5f 48 0a 23 20 20 69 VE_UNISTD_H.# i
0150: 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 nclude <unistd.h
0160: 3e 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 >.#endif.#ifdef
0170: 48 41 56 45 5f 53 54 52 49 4e 47 5f 48 0a 23 20 HAVE_STRING_H.#
0180: 20 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 include <string
0190: 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 .h>.#endif.#ifde
01a0: 66 20 48 41 56 45 5f 50 54 48 52 45 41 44 5f 48 f HAVE_PTHREAD_H
01b0: 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 70 74 68 .# include <pth
01c0: 72 65 61 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 read.h>.#endif.#
01d0: 69 66 64 65 66 20 48 41 56 45 5f 4c 49 4d 49 54 ifdef HAVE_LIMIT
01e0: 53 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c S_H.# include <
01f0: 6c 69 6d 69 74 73 2e 68 3e 0a 23 65 6e 64 69 66 limits.h>.#endif
0200: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 5a 4c 49 .#ifdef HAVE_ZLI
0210: 42 5f 48 0a 23 20 20 69 66 64 65 66 20 48 41 56 B_H.# ifdef HAV
0220: 45 5f 4c 49 42 5a 0a 23 20 20 20 20 69 6e 63 6c E_LIBZ.# incl
0230: 75 64 65 20 3c 7a 6c 69 62 2e 68 3e 0a 23 20 20 ude <zlib.h>.#
0240: 65 6e 64 69 66 0a 23 65 6c 73 65 0a 23 20 20 69 endif.#else.# i
0250: 66 64 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 23 fdef HAVE_LIBZ.#
0260: 20 20 20 20 75 6e 64 65 66 20 48 41 56 45 5f 4c undef HAVE_L
0270: 49 42 5a 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e IBZ.# endif.#en
0280: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 43 4b 5f dif..#define CK_
0290: 50 54 52 20 2a 0a 23 64 65 66 69 6e 65 20 43 4b PTR *.#define CK
02a0: 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e _DEFINE_FUNCTION
02b0: 28 72 65 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d (returnType, nam
02c0: 65 29 20 72 65 74 75 72 6e 54 79 70 65 20 6e 61 e) returnType na
02d0: 6d 65 0a 23 64 65 66 69 6e 65 20 43 4b 5f 44 45 me.#define CK_DE
02e0: 43 4c 41 52 45 5f 46 55 4e 43 54 49 4f 4e 28 72 CLARE_FUNCTION(r
02f0: 65 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d 65 29 eturnType, name)
0300: 20 72 65 74 75 72 6e 54 79 70 65 20 6e 61 6d 65 returnType name
0310: 0a 23 64 65 66 69 6e 65 20 43 4b 5f 44 45 43 4c .#define CK_DECL
0320: 41 52 45 5f 46 55 4e 43 54 49 4f 4e 5f 50 4f 49 ARE_FUNCTION_POI
0330: 4e 54 45 52 28 72 65 74 75 72 6e 54 79 70 65 2c NTER(returnType,
0340: 20 6e 61 6d 65 29 20 72 65 74 75 72 6e 54 79 70 name) returnTyp
0350: 65 20 28 2a 20 6e 61 6d 65 29 0a 23 64 65 66 69 e (* name).#defi
0360: 6e 65 20 43 4b 5f 43 41 4c 4c 42 41 43 4b 5f 46 ne CK_CALLBACK_F
0370: 55 4e 43 54 49 4f 4e 28 72 65 74 75 72 6e 54 79 UNCTION(returnTy
0380: 70 65 2c 20 6e 61 6d 65 29 20 72 65 74 75 72 6e pe, name) return
0390: 54 79 70 65 20 28 2a 20 6e 61 6d 65 29 0a 23 69 Type (* name).#i
03a0: 66 6e 64 65 66 20 4e 55 4c 4c 5f 50 54 52 0a 23 fndef NULL_PTR.#
03b0: 20 20 64 65 66 69 6e 65 20 4e 55 4c 4c 5f 50 54 define NULL_PT
03c0: 52 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69 6e 63 R 0.#endif..#inc
03d0: 6c 75 64 65 20 22 70 6b 63 73 31 31 2e 68 22 0a lude "pkcs11.h".
03e0: 23 69 6e 63 6c 75 64 65 20 22 61 73 6e 31 2d 78 #include "asn1-x
03f0: 35 30 39 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 509.h"..#ifndef
0400: 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f CACKEY_CRYPTOKI_
0410: 56 45 52 53 49 4f 4e 5f 43 4f 44 45 0a 23 20 20 VERSION_CODE.#
0420: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 43 52 define CACKEY_CR
0430: 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 YPTOKI_VERSION_C
0440: 4f 44 45 20 30 78 30 32 31 65 30 30 0a 23 65 6e ODE 0x021e00.#en
0450: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 43 4b 41 dif..#ifndef CKA
0460: 5f 54 52 55 53 54 5f 53 45 52 56 45 52 5f 41 55 _TRUST_SERVER_AU
0470: 54 48 0a 23 20 20 64 65 66 69 6e 65 20 43 4b 41 TH.# define CKA
0480: 5f 54 52 55 53 54 5f 53 45 52 56 45 52 5f 41 55 _TRUST_SERVER_AU
0490: 54 48 20 30 78 63 65 35 33 36 33 35 38 0a 23 65 TH 0xce536358.#e
04a0: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 43 4b 41 ndif.#ifndef CKA
04b0: 5f 54 52 55 53 54 5f 43 4c 49 45 4e 54 5f 41 55 _TRUST_CLIENT_AU
04c0: 54 48 0a 23 20 20 64 65 66 69 6e 65 20 43 4b 41 TH.# define CKA
04d0: 5f 54 52 55 53 54 5f 43 4c 49 45 4e 54 5f 41 55 _TRUST_CLIENT_AU
04e0: 54 48 20 30 78 63 65 35 33 36 33 35 39 0a 23 65 TH 0xce536359.#e
04f0: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 43 4b 41 ndif.#ifndef CKA
0500: 5f 54 52 55 53 54 5f 43 4f 44 45 5f 53 49 47 4e _TRUST_CODE_SIGN
0510: 49 4e 47 0a 23 20 20 64 65 66 69 6e 65 20 43 4b ING.# define CK
0520: 41 5f 54 52 55 53 54 5f 43 4f 44 45 5f 53 49 47 A_TRUST_CODE_SIG
0530: 4e 49 4e 47 20 30 78 63 65 35 33 36 33 35 61 0a NING 0xce53635a.
0540: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 43 #endif.#ifndef C
0550: 4b 41 5f 54 52 55 53 54 5f 45 4d 41 49 4c 5f 50 KA_TRUST_EMAIL_P
0560: 52 4f 54 45 43 54 49 4f 4e 0a 23 20 20 64 65 66 ROTECTION.# def
0570: 69 6e 65 20 43 4b 41 5f 54 52 55 53 54 5f 45 4d ine CKA_TRUST_EM
0580: 41 49 4c 5f 50 52 4f 54 45 43 54 49 4f 4e 20 30 AIL_PROTECTION 0
0590: 78 63 65 35 33 36 33 35 62 0a 23 65 6e 64 69 66 xce53635b.#endif
05a0: 0a 0a 2f 2a 20 47 53 43 2d 49 53 20 76 32 2e 31 ../* GSC-IS v2.1
05b0: 20 44 65 66 69 6e 69 74 69 6f 6e 73 20 2a 2f 0a Definitions */.
05c0: 2f 2a 2a 20 43 6c 61 73 73 65 73 20 2a 2a 2f 0a /** Classes **/.
05d0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 43 4c #define GSCIS_CL
05e0: 41 53 53 5f 49 53 4f 37 38 31 36 20 20 20 20 20 ASS_ISO7816
05f0: 20 20 20 20 20 20 30 78 30 30 0a 23 64 65 66 69 0x00.#defi
0600: 6e 65 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 47 ne GSCIS_CLASS_G
0610: 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 20 20 LOBAL_PLATFORM
0620: 20 30 78 38 30 0a 0a 2f 2a 2a 20 49 6e 73 74 72 0x80../** Instr
0630: 75 63 74 69 6f 6e 73 20 2a 2a 2f 0a 23 64 65 66 uctions **/.#def
0640: 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f ine GSCIS_INSTR_
0650: 47 45 54 5f 52 45 53 50 4f 4e 53 45 20 20 20 20 GET_RESPONSE
0660: 20 20 30 78 43 30 0a 23 64 65 66 69 6e 65 20 47 0xC0.#define G
0670: 53 43 49 53 5f 49 4e 53 54 52 5f 52 45 41 44 5f SCIS_INSTR_READ_
0680: 42 49 4e 41 52 59 20 20 20 20 20 20 20 30 78 42 BINARY 0xB
0690: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 0.#define GSCIS_
06a0: 49 4e 53 54 52 5f 55 50 44 41 54 45 5f 42 49 4e INSTR_UPDATE_BIN
06b0: 41 52 59 20 20 20 20 20 30 78 44 36 0a 23 64 65 ARY 0xD6.#de
06c0: 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 fine GSCIS_INSTR
06d0: 5f 53 45 4c 45 43 54 20 20 20 20 20 20 20 20 20 _SELECT
06e0: 20 20 20 30 78 41 34 0a 23 64 65 66 69 6e 65 20 0xA4.#define
06f0: 47 53 43 49 53 5f 49 4e 53 54 52 5f 45 58 54 45 GSCIS_INSTR_EXTE
0700: 52 4e 41 4c 5f 41 55 54 48 20 20 20 20 20 30 78 RNAL_AUTH 0x
0710: 38 32 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 82.#define GSCIS
0720: 5f 49 4e 53 54 52 5f 47 45 54 5f 43 48 41 4c 4c _INSTR_GET_CHALL
0730: 45 4e 47 45 20 20 20 20 20 30 78 38 34 0a 23 64 ENGE 0x84.#d
0740: 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 efine GSCIS_INST
0750: 52 5f 49 4e 54 45 52 4e 41 4c 5f 41 55 54 48 20 R_INTERNAL_AUTH
0760: 20 20 20 20 30 78 38 38 0a 23 64 65 66 69 6e 65 0x88.#define
0770: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 56 45 52 GSCIS_INSTR_VER
0780: 49 46 59 20 20 20 20 20 20 20 20 20 20 20 20 30 IFY 0
0790: 78 32 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 x20.#define GSCI
07a0: 53 5f 49 4e 53 54 52 5f 53 49 47 4e 20 20 20 20 S_INSTR_SIGN
07b0: 20 20 20 20 20 20 20 20 20 20 30 78 32 41 0a 23 0x2A.#
07c0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 define GSCIS_INS
07d0: 54 52 5f 47 45 54 5f 50 52 4f 50 20 20 20 20 20 TR_GET_PROP
07e0: 20 20 20 20 20 30 78 35 36 0a 23 64 65 66 69 6e 0x56.#defin
07f0: 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45 e GSCIS_INSTR_GE
0800: 54 5f 41 43 52 20 20 20 20 20 20 20 20 20 20 20 T_ACR
0810: 30 78 34 43 0a 23 64 65 66 69 6e 65 20 47 53 43 0x4C.#define GSC
0820: 49 53 5f 49 4e 53 54 52 5f 52 45 41 44 5f 42 55 IS_INSTR_READ_BU
0830: 46 46 45 52 20 20 20 20 20 20 20 30 78 35 32 0a FFER 0x52.
0840: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e #define GSCIS_IN
0850: 53 54 52 5f 53 49 47 4e 44 45 43 52 59 50 54 20 STR_SIGNDECRYPT
0860: 20 20 20 20 20 20 30 78 34 32 0a 0a 23 64 65 66 0x42..#def
0870: 69 6e 65 20 47 53 43 49 53 5f 50 41 52 41 4d 5f ine GSCIS_PARAM_
0880: 53 45 4c 45 43 54 5f 41 50 50 4c 45 54 20 20 20 SELECT_APPLET
0890: 20 20 30 78 30 34 0a 0a 2f 2a 2a 20 54 61 67 73 0x04../** Tags
08a0: 20 2a 2a 2f 0a 2f 2a 2a 2a 20 43 43 43 20 54 61 **/./*** CCC Ta
08b0: 67 73 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 gs ***/.#define
08c0: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 GSCIS_TAG_CARDID
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 0x
08e0: 46 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 F0.#define GSCIS
08f0: 5f 54 41 47 5f 43 43 43 5f 56 45 52 20 20 20 20 _TAG_CCC_VER
0900: 20 20 20 20 20 20 20 20 20 30 78 46 31 0a 23 64 0xF1.#d
0910: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f efine GSCIS_TAG_
0920: 43 43 47 5f 56 45 52 20 20 20 20 20 20 20 20 20 CCG_VER
0930: 20 20 20 20 30 78 46 32 0a 23 64 65 66 69 6e 65 0xF2.#define
0940: 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55 GSCIS_TAG_CARDU
0950: 52 4c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 RL 0
0960: 78 46 33 0a 23 64 65 66 69 6e 65 20 47 53 43 49 xF3.#define GSCI
0970: 53 5f 54 41 47 5f 50 4b 43 53 31 35 20 20 20 20 S_TAG_PKCS15
0980: 20 20 20 20 20 20 20 20 20 20 30 78 46 34 0a 23 0xF4.#
0990: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 define GSCIS_TAG
09a0: 5f 52 45 47 5f 44 41 54 41 5f 4d 4f 44 45 4c 20 _REG_DATA_MODEL
09b0: 20 20 20 20 20 30 78 46 35 0a 23 64 65 66 69 6e 0xF5.#defin
09c0: 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f e GSCIS_TAG_ACR_
09d0: 54 41 42 4c 45 20 20 20 20 20 20 20 20 20 20 20 TABLE
09e0: 30 78 46 36 0a 23 64 65 66 69 6e 65 20 47 53 43 0xF6.#define GSC
09f0: 49 53 5f 54 41 47 5f 43 41 52 44 5f 41 50 44 55 IS_TAG_CARD_APDU
0a00: 20 20 20 20 20 20 20 20 20 20 20 30 78 46 37 0a 0xF7.
0a10: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 #define GSCIS_TA
0a20: 47 5f 52 45 44 49 52 45 43 54 49 4f 4e 20 20 20 G_REDIRECTION
0a30: 20 20 20 20 20 20 30 78 46 41 0a 23 64 65 66 69 0xFA.#defi
0a40: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 54 20 ne GSCIS_TAG_CT
0a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0a60: 20 30 78 46 42 0a 23 64 65 66 69 6e 65 20 47 53 0xFB.#define GS
0a70: 43 49 53 5f 54 41 47 5f 53 54 20 20 20 20 20 20 CIS_TAG_ST
0a80: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 46 43 0xFC
0a90: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 .#define GSCIS_T
0aa0: 41 47 5f 4e 45 58 54 43 43 43 20 20 20 20 20 20 AG_NEXTCCC
0ab0: 20 20 20 20 20 20 20 30 78 46 44 0a 0a 2f 2a 2a 0xFD../**
0ac0: 2a 20 47 65 6e 65 72 61 6c 20 2d 20 45 46 20 32 * General - EF 2
0ad0: 32 30 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 200 ***/.#define
0ae0: 20 47 53 43 49 53 5f 54 41 47 5f 46 4e 41 4d 45 GSCIS_TAG_FNAME
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0
0b00: 78 30 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49 x01.#define GSCI
0b10: 53 5f 54 41 47 5f 4d 4e 41 4d 45 20 20 20 20 20 S_TAG_MNAME
0b20: 20 20 20 20 20 20 20 20 20 20 30 78 30 32 0a 23 0x02.#
0b30: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 define GSCIS_TAG
0b40: 5f 4c 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20 _LNAME
0b50: 20 20 20 20 20 30 78 30 33 0a 23 64 65 66 69 6e 0x03.#defin
0b60: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 55 46 46 e GSCIS_TAG_SUFF
0b70: 49 58 20 20 20 20 20 20 20 20 20 20 20 20 20 20 IX
0b80: 30 78 30 34 0a 23 64 65 66 69 6e 65 20 47 53 43 0x04.#define GSC
0b90: 49 53 5f 54 41 47 5f 47 4f 56 54 5f 41 47 45 4e IS_TAG_GOVT_AGEN
0ba0: 43 59 20 20 20 20 20 20 20 20 20 30 78 30 35 0a CY 0x05.
0bb0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 #define GSCIS_TA
0bc0: 47 5f 42 55 52 45 41 55 20 20 20 20 20 20 20 20 G_BUREAU
0bd0: 20 20 20 20 20 20 30 78 30 36 0a 23 64 65 66 69 0x06.#defi
0be0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 52 ne GSCIS_TAG_BUR
0bf0: 45 41 55 5f 43 4f 44 45 20 20 20 20 20 20 20 20 EAU_CODE
0c00: 20 30 78 30 37 0a 23 64 65 66 69 6e 65 20 47 53 0x07.#define GS
0c10: 43 49 53 5f 54 41 47 5f 44 45 50 54 5f 43 4f 44 CIS_TAG_DEPT_COD
0c20: 45 20 20 20 20 20 20 20 20 20 20 20 30 78 30 38 E 0x08
0c30: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 .#define GSCIS_T
0c40: 41 47 5f 54 49 54 4c 45 20 20 20 20 20 20 20 20 AG_TITLE
0c50: 20 20 20 20 20 20 20 30 78 30 39 0a 23 64 65 66 0x09.#def
0c60: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 ine GSCIS_TAG_BU
0c70: 49 4c 44 49 4e 47 20 20 20 20 20 20 20 20 20 20 ILDING
0c80: 20 20 30 78 31 30 0a 23 64 65 66 69 6e 65 20 47 0x10.#define G
0c90: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f SCIS_TAG_OFFICE_
0ca0: 41 44 44 52 31 20 20 20 20 20 20 20 20 30 78 31 ADDR1 0x1
0cb0: 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 1.#define GSCIS_
0cc0: 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 32 TAG_OFFICE_ADDR2
0cd0: 20 20 20 20 20 20 20 20 30 78 31 32 0a 23 64 65 0x12.#de
0ce0: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f fine GSCIS_TAG_O
0cf0: 46 46 49 43 45 5f 43 49 54 59 20 20 20 20 20 20 FFICE_CITY
0d00: 20 20 20 30 78 31 33 0a 23 64 65 66 69 6e 65 20 0x13.#define
0d10: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 GSCIS_TAG_OFFICE
0d20: 5f 53 54 41 54 45 20 20 20 20 20 20 20 20 30 78 _STATE 0x
0d30: 31 34 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 14.#define GSCIS
0d40: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 5a 49 50 20 _TAG_OFFICE_ZIP
0d50: 20 20 20 20 20 20 20 20 20 30 78 31 35 0a 23 64 0x15.#d
0d60: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f efine GSCIS_TAG_
0d70: 4f 46 46 49 43 45 5f 43 4f 55 4e 54 52 59 20 20 OFFICE_COUNTRY
0d80: 20 20 20 20 30 78 31 36 0a 23 64 65 66 69 6e 65 0x16.#define
0d90: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 GSCIS_TAG_OFFIC
0da0: 45 5f 50 48 4f 4e 45 20 20 20 20 20 20 20 20 30 E_PHONE 0
0db0: 78 31 37 0a 23 64 65 66 69 6e 65 20 47 53 43 49 x17.#define GSCI
0dc0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f S_TAG_OFFICE_PHO
0dd0: 4e 45 5f 45 58 54 20 20 20 20 30 78 31 38 0a 23 NE_EXT 0x18.#
0de0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 define GSCIS_TAG
0df0: 5f 4f 46 46 49 43 45 5f 46 41 58 20 20 20 20 20 _OFFICE_FAX
0e00: 20 20 20 20 20 30 78 31 39 0a 23 64 65 66 69 6e 0x19.#defin
0e10: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 e GSCIS_TAG_OFFI
0e20: 43 45 5f 45 4d 41 49 4c 20 20 20 20 20 20 20 20 CE_EMAIL
0e30: 30 78 31 41 0a 23 64 65 66 69 6e 65 20 47 53 43 0x1A.#define GSC
0e40: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52 4f IS_TAG_OFFICE_RO
0e50: 4f 4d 20 20 20 20 20 20 20 20 20 30 78 31 42 0a OM 0x1B.
0e60: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 #define GSCIS_TA
0e70: 47 5f 4e 4f 4e 47 4f 56 5f 41 47 45 4e 43 59 20 G_NONGOV_AGENCY
0e80: 20 20 20 20 20 20 30 78 31 43 0a 23 64 65 66 69 0x1C.#defi
0e90: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53 53 4e ne GSCIS_TAG_SSN
0ea0: 5f 44 45 53 49 47 4e 41 54 4f 52 20 20 20 20 20 _DESIGNATOR
0eb0: 20 30 78 31 44 0a 0a 2f 2a 2a 2a 20 50 49 49 20 0x1D../*** PII
0ec0: 2d 20 45 46 20 32 31 30 30 20 2a 2a 2a 2f 0a 23 - EF 2100 ***/.#
0ed0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 define GSCIS_TAG
0ee0: 5f 53 53 4e 20 20 20 20 20 20 20 20 20 20 20 20 _SSN
0ef0: 20 20 20 20 20 30 78 32 30 0a 23 64 65 66 69 6e 0x20.#defin
0f00: 65 20 47 53 43 49 53 5f 54 41 47 5f 44 4f 42 20 e GSCIS_TAG_DOB
0f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0f20: 30 78 32 31 0a 23 64 65 66 69 6e 65 20 47 53 43 0x21.#define GSC
0f30: 49 53 5f 54 41 47 5f 47 45 4e 44 45 52 20 20 20 IS_TAG_GENDER
0f40: 20 20 20 20 20 20 20 20 20 20 20 30 78 32 32 0a 0x22.
0f50: 0a 2f 2a 2a 2a 20 4c 6f 67 69 6e 20 49 6e 66 6f ./*** Login Info
0f60: 72 6d 61 74 69 6f 6e 20 2d 20 45 46 20 34 30 30 rmation - EF 400
0f70: 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 0 ***/.#define G
0f80: 53 43 49 53 5f 54 41 47 5f 55 53 45 52 49 44 20 SCIS_TAG_USERID
0f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 34 0x4
0fa0: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 0.#define GSCIS_
0fb0: 54 41 47 5f 44 4f 4d 41 49 4e 20 20 20 20 20 20 TAG_DOMAIN
0fc0: 20 20 20 20 20 20 20 20 30 78 34 31 0a 23 64 65 0x41.#de
0fd0: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 50 fine GSCIS_TAG_P
0fe0: 41 53 53 57 4f 52 44 20 20 20 20 20 20 20 20 20 ASSWORD
0ff0: 20 20 20 30 78 34 32 0a 0a 2f 2a 2a 2a 20 43 61 0x42../*** Ca
1000: 72 64 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d rd Information -
1010: 20 45 46 20 35 30 30 30 20 2a 2a 2a 2f 0a 23 64 EF 5000 ***/.#d
1020: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f efine GSCIS_TAG_
1030: 49 53 53 55 45 52 49 44 20 20 20 20 20 20 20 20 ISSUERID
1040: 20 20 20 20 30 78 35 30 0a 23 64 65 66 69 6e 65 0x50.#define
1050: 20 47 53 43 49 53 5f 54 41 47 5f 53 45 52 4e 4f GSCIS_TAG_SERNO
1060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0
1070: 78 35 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49 x51.#define GSCI
1080: 53 5f 54 41 47 5f 49 53 53 55 45 5f 44 41 54 45 S_TAG_ISSUE_DATE
1090: 20 20 20 20 20 20 20 20 20 20 30 78 35 32 0a 23 0x52.#
10a0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 define GSCIS_TAG
10b0: 5f 45 58 50 49 52 45 5f 44 41 54 45 20 20 20 20 _EXPIRE_DATE
10c0: 20 20 20 20 20 30 78 35 33 0a 23 64 65 66 69 6e 0x53.#defin
10d0: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 e GSCIS_TAG_CARD
10e0: 5f 54 59 50 45 20 20 20 20 20 20 20 20 20 20 20 _TYPE
10f0: 30 78 35 34 0a 23 64 65 66 69 6e 65 20 47 53 43 0x54.#define GSC
1100: 49 53 5f 54 41 47 5f 53 45 43 55 52 49 54 59 5f IS_TAG_SECURITY_
1110: 43 4f 44 45 20 20 20 20 20 20 20 30 78 35 37 0a CODE 0x57.
1120: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 #define GSCIS_TA
1130: 47 5f 43 41 52 44 49 44 5f 41 49 44 20 20 20 20 G_CARDID_AID
1140: 20 20 20 20 20 20 30 78 35 38 0a 0a 2f 2a 2a 2a 0x58../***
1150: 20 50 4b 49 20 49 6e 66 6f 72 6d 61 74 69 6f 6e PKI Information
1160: 20 2d 20 45 46 20 37 30 30 30 20 2a 2a 2a 2f 0a - EF 7000 ***/.
1170: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 #define GSCIS_TA
1180: 47 5f 43 45 52 54 49 46 49 43 41 54 45 20 20 20 G_CERTIFICATE
1190: 20 20 20 20 20 20 30 78 37 30 0a 23 64 65 66 69 0x70.#defi
11a0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 ne GSCIS_TAG_CER
11b0: 54 5f 49 53 53 55 45 5f 44 41 54 45 20 20 20 20 T_ISSUE_DATE
11c0: 20 30 78 37 31 0a 23 64 65 66 69 6e 65 20 47 53 0x71.#define GS
11d0: 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 45 58 50 CIS_TAG_CERT_EXP
11e0: 49 52 45 5f 44 41 54 45 20 20 20 20 30 78 37 32 IRE_DATE 0x72
11f0: 0a 0a 2f 2a 2a 20 41 70 70 6c 65 74 20 49 44 73 ../** Applet IDs
1200: 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 **/.#define GSC
1210: 49 53 5f 41 49 44 5f 43 43 43 20 20 20 20 20 20 IS_AID_CCC
1220: 20 20 20 20 20 20 20 20 20 20 20 30 78 41 30 2c 0xA0,
1230: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 0x00, 0x00, 0x0
1240: 31 2c 20 30 78 31 36 2c 20 30 78 44 42 2c 20 30 1, 0x16, 0xDB, 0
1250: 78 30 30 0a 0a 23 69 66 64 65 66 20 43 41 43 4b x00..#ifdef CACK
1260: 45 59 5f 44 45 42 55 47 0a 23 20 20 69 66 64 65 EY_DEBUG.# ifde
1270: 66 20 48 41 56 45 5f 53 54 44 49 4f 5f 48 0a 23 f HAVE_STDIO_H.#
1280: 20 20 20 20 69 6e 63 6c 75 64 65 20 3c 73 74 64 include <std
1290: 69 6f 2e 68 3e 0a 23 20 20 65 6e 64 69 66 0a 0a io.h>.# endif..
12a0: 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 # define CACKEY
12b0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 78 2e _DEBUG_PRINTF(x.
12c0: 2e 2e 29 20 7b 20 66 70 72 69 6e 74 66 28 73 74 ..) { fprintf(st
12d0: 64 65 72 72 2c 20 22 25 73 28 29 3a 25 69 3a 20 derr, "%s():%i:
12e0: 22 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c ", __func__, __L
12f0: 49 4e 45 5f 5f 29 3b 20 66 70 72 69 6e 74 66 28 INE__); fprintf(
1300: 73 74 64 65 72 72 2c 20 78 29 3b 20 66 70 72 69 stderr, x); fpri
1310: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 5c 6e 22 ntf(stderr, "\n"
1320: 29 3b 20 7d 0a 23 20 20 64 65 66 69 6e 65 20 43 ); }.# define C
1330: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1340: 54 42 55 46 28 66 2c 20 78 2c 20 79 29 20 7b 20 TBUF(f, x, y) {
1350: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 54 unsigned char *T
1360: 4d 50 42 55 46 3b 20 75 6e 73 69 67 6e 65 64 20 MPBUF; unsigned
1370: 6c 6f 6e 67 20 69 64 78 3b 20 54 4d 50 42 55 46 long idx; TMPBUF
1380: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 = (unsigned cha
1390: 72 20 2a 29 20 28 78 29 3b 20 66 70 72 69 6e 74 r *) (x); fprint
13a0: 66 28 73 74 64 65 72 72 2c 20 22 25 73 28 29 3a f(stderr, "%s():
13b0: 25 69 3a 20 25 73 20 20 28 25 73 2f 25 6c 75 20 %i: %s (%s/%lu
13c0: 3d 20 7b 25 30 32 78 22 2c 20 5f 5f 66 75 6e 63 = {%02x", __func
13d0: 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 2c 20 66 2c __, __LINE__, f,
13e0: 20 23 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c #x, (unsigned l
13f0: 6f 6e 67 29 20 28 79 29 2c 20 54 4d 50 42 55 46 ong) (y), TMPBUF
1400: 5b 30 5d 29 3b 20 66 6f 72 20 28 69 64 78 20 3d [0]); for (idx =
1410: 20 31 3b 20 69 64 78 20 3c 20 28 79 29 3b 20 69 1; idx < (y); i
1420: 64 78 2b 2b 29 20 7b 20 66 70 72 69 6e 74 66 28 dx++) { fprintf(
1430: 73 74 64 65 72 72 2c 20 22 2c 20 25 30 32 78 22 stderr, ", %02x"
1440: 2c 20 54 4d 50 42 55 46 5b 69 64 78 5d 29 3b 20 , TMPBUF[idx]);
1450: 7d 3b 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 }; fprintf(stder
1460: 72 2c 20 22 7d 29 5c 6e 22 29 3b 20 7d 0a 23 20 r, "})\n"); }.#
1470: 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 define CACKEY_D
1480: 45 42 55 47 5f 50 45 52 52 4f 52 28 78 29 20 7b EBUG_PERROR(x) {
1490: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c fprintf(stderr,
14a0: 20 22 25 73 28 29 3a 25 69 3a 20 22 2c 20 5f 5f "%s():%i: ", __
14b0: 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f func__, __LINE__
14c0: 29 3b 20 70 65 72 72 6f 72 28 78 29 3b 20 7d 0a ); perror(x); }.
14d0: 23 20 20 64 65 66 69 6e 65 20 66 72 65 65 28 78 # define free(x
14e0: 29 20 7b 20 43 41 43 4b 45 59 5f 44 45 42 55 47 ) { CACKEY_DEBUG
14f0: 5f 50 52 49 4e 54 46 28 22 46 52 45 45 28 25 70 _PRINTF("FREE(%p
1500: 29 20 28 25 73 29 22 2c 20 78 2c 20 23 78 29 3b ) (%s)", x, #x);
1510: 20 66 72 65 65 28 78 29 3b 20 7d 0a 0a 73 74 61 free(x); }..sta
1520: 74 69 63 20 76 6f 69 64 20 2a 43 41 43 4b 45 59 tic void *CACKEY
1530: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4d 41 4c 4c _DEBUG_FUNC_MALL
1540: 4f 43 28 73 69 7a 65 5f 74 20 73 69 7a 65 2c 20 OC(size_t size,
1550: 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 75 6e 63 const char *func
1560: 2c 20 69 6e 74 20 6c 69 6e 65 29 20 7b 0a 09 76 , int line) {..v
1570: 6f 69 64 20 2a 72 65 74 76 61 6c 3b 0a 0a 09 72 oid *retval;...r
1580: 65 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 etval = malloc(s
1590: 69 7a 65 29 3b 0a 0a 09 66 70 72 69 6e 74 66 28 ize);...fprintf(
15a0: 73 74 64 65 72 72 2c 20 22 25 73 28 29 3a 25 69 stderr, "%s():%i
15b0: 3a 20 22 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 29 : ", func, line)
15c0: 3b 0a 09 66 70 72 69 6e 74 66 28 73 74 64 65 72 ;..fprintf(stder
15d0: 72 2c 20 22 4d 41 4c 4c 4f 43 28 29 20 3d 20 25 r, "MALLOC() = %
15e0: 70 22 2c 20 72 65 74 76 61 6c 29 3b 0a 09 66 70 p", retval);..fp
15f0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 5c rintf(stderr, "\
1600: 6e 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 n");...return(re
1610: 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 tval);.}..static
1620: 20 76 6f 69 64 20 2a 43 41 43 4b 45 59 5f 44 45 void *CACKEY_DE
1630: 42 55 47 5f 46 55 4e 43 5f 52 45 41 4c 4c 4f 43 BUG_FUNC_REALLOC
1640: 28 76 6f 69 64 20 2a 70 74 72 2c 20 73 69 7a 65 (void *ptr, size
1650: 5f 74 20 73 69 7a 65 2c 20 63 6f 6e 73 74 20 63 _t size, const c
1660: 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20 6c har *func, int l
1670: 69 6e 65 29 20 7b 0a 09 76 6f 69 64 20 2a 72 65 ine) {..void *re
1680: 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d tval;...retval =
1690: 20 72 65 61 6c 6c 6f 63 28 70 74 72 2c 20 73 69 realloc(ptr, si
16a0: 7a 65 29 3b 0a 0a 09 69 66 20 28 72 65 74 76 61 ze);...if (retva
16b0: 6c 20 21 3d 20 70 74 72 29 20 7b 0a 09 09 66 70 l != ptr) {...fp
16c0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 rintf(stderr, "%
16d0: 73 28 29 3a 25 69 3a 20 22 2c 20 66 75 6e 63 2c s():%i: ", func,
16e0: 20 6c 69 6e 65 29 3b 0a 09 09 66 70 72 69 6e 74 line);...fprint
16f0: 66 28 73 74 64 65 72 72 2c 20 22 52 45 41 4c 4c f(stderr, "REALL
1700: 4f 43 28 25 70 29 20 3d 20 25 70 22 2c 20 70 74 OC(%p) = %p", pt
1710: 72 2c 20 72 65 74 76 61 6c 29 3b 0a 09 09 66 70 r, retval);...fp
1720: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 5c rintf(stderr, "\
1730: 6e 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e n");..}...return
1740: 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 (retval);.}..sta
1750: 74 69 63 20 63 68 61 72 20 2a 43 41 43 4b 45 59 tic char *CACKEY
1760: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 54 52 44 _DEBUG_FUNC_STRD
1770: 55 50 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 UP(const char *p
1780: 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a tr, const char *
1790: 66 75 6e 63 2c 20 69 6e 74 20 6c 69 6e 65 29 20 func, int line)
17a0: 7b 0a 09 63 68 61 72 20 2a 72 65 74 76 61 6c 3b {..char *retval;
17b0: 0a 0a 09 72 65 74 76 61 6c 20 3d 20 73 74 72 64 ...retval = strd
17c0: 75 70 28 70 74 72 29 3b 0a 0a 09 66 70 72 69 6e up(ptr);...fprin
17d0: 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 28 29 tf(stderr, "%s()
17e0: 3a 25 69 3a 20 22 2c 20 66 75 6e 63 2c 20 6c 69 :%i: ", func, li
17f0: 6e 65 29 3b 0a 09 66 70 72 69 6e 74 66 28 73 74 ne);..fprintf(st
1800: 64 65 72 72 2c 20 22 53 54 52 44 55 50 5f 4d 41 derr, "STRDUP_MA
1810: 4c 4c 4f 43 28 29 20 3d 20 25 70 22 2c 20 72 65 LLOC() = %p", re
1820: 74 76 61 6c 29 3b 0a 09 66 70 72 69 6e 74 66 28 tval);..fprintf(
1830: 73 74 64 65 72 72 2c 20 22 5c 6e 22 29 3b 0a 0a stderr, "\n");..
1840: 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b .return(retval);
1850: 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 .}..static const
1860: 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 char *CACKEY_DE
1870: 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f BUG_FUNC_TAG_TO_
1880: 53 54 52 28 75 6e 73 69 67 6e 65 64 20 63 68 61 STR(unsigned cha
1890: 72 20 74 61 67 29 20 7b 0a 09 73 77 69 74 63 68 r tag) {..switch
18a0: 20 28 74 61 67 29 20 7b 0a 09 09 63 61 73 65 20 (tag) {...case
18b0: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 GSCIS_TAG_CARDID
18c0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 :....return("GSC
18d0: 49 53 5f 54 41 47 5f 43 41 52 44 49 44 22 29 3b IS_TAG_CARDID");
18e0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 ...case GSCIS_TA
18f0: 47 5f 43 43 43 5f 56 45 52 3a 0a 09 09 09 72 65 G_CCC_VER:....re
1900: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f turn("GSCIS_TAG_
1910: 43 43 43 5f 56 45 52 22 29 3b 0a 09 09 63 61 73 CCC_VER");...cas
1920: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 43 47 5f e GSCIS_TAG_CCG_
1930: 56 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 VER:....return("
1940: 47 53 43 49 53 5f 54 41 47 5f 43 43 47 5f 56 45 GSCIS_TAG_CCG_VE
1950: 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 R");...case GSCI
1960: 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09 S_TAG_CARDURL:..
1970: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f ..return("GSCIS_
1980: 54 41 47 5f 43 41 52 44 55 52 4c 22 29 3b 0a 09 TAG_CARDURL");..
1990: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f .case GSCIS_TAG_
19a0: 50 4b 43 53 31 35 3a 0a 09 09 09 72 65 74 75 72 PKCS15:....retur
19b0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 n("GSCIS_TAG_PKC
19c0: 53 31 35 22 29 3b 0a 09 09 63 61 73 65 20 47 53 S15");...case GS
19d0: 43 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 41 CIS_TAG_REG_DATA
19e0: 5f 4d 4f 44 45 4c 3a 0a 09 09 09 72 65 74 75 72 _MODEL:....retur
19f0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 52 45 47 n("GSCIS_TAG_REG
1a00: 5f 44 41 54 41 5f 4d 4f 44 45 4c 22 29 3b 0a 09 _DATA_MODEL");..
1a10: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f .case GSCIS_TAG_
1a20: 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 72 65 ACR_TABLE:....re
1a30: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f turn("GSCIS_TAG_
1a40: 41 43 52 5f 54 41 42 4c 45 22 29 3b 0a 09 09 63 ACR_TABLE");...c
1a50: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 ase GSCIS_TAG_CA
1a60: 52 44 5f 41 50 44 55 3a 0a 09 09 09 72 65 74 75 RD_APDU:....retu
1a70: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41 rn("GSCIS_TAG_CA
1a80: 52 44 5f 41 50 44 55 22 29 3b 0a 09 09 63 61 73 RD_APDU");...cas
1a90: 65 20 47 53 43 49 53 5f 54 41 47 5f 52 45 44 49 e GSCIS_TAG_REDI
1aa0: 52 45 43 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75 RECTION:....retu
1ab0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 52 45 rn("GSCIS_TAG_RE
1ac0: 44 49 52 45 43 54 49 4f 4e 22 29 3b 0a 09 09 63 DIRECTION");...c
1ad0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 54 ase GSCIS_TAG_CT
1ae0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 :....return("GSC
1af0: 49 53 5f 54 41 47 5f 43 54 22 29 3b 0a 09 09 63 IS_TAG_CT");...c
1b00: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53 54 ase GSCIS_TAG_ST
1b10: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 :....return("GSC
1b20: 49 53 5f 54 41 47 5f 53 54 22 29 3b 0a 09 09 63 IS_TAG_ST");...c
1b30: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 45 ase GSCIS_TAG_NE
1b40: 58 54 43 43 43 3a 0a 09 09 09 72 65 74 75 72 6e XTCCC:....return
1b50: 28 22 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54 ("GSCIS_TAG_NEXT
1b60: 43 43 43 22 29 3b 0a 09 09 63 61 73 65 20 47 53 CCC");...case GS
1b70: 43 49 53 5f 54 41 47 5f 46 4e 41 4d 45 3a 0a 09 CIS_TAG_FNAME:..
1b80: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f ..return("GSCIS_
1b90: 54 41 47 5f 46 4e 41 4d 45 22 29 3b 0a 09 09 63 TAG_FNAME");...c
1ba0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4d 4e ase GSCIS_TAG_MN
1bb0: 41 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 AME:....return("
1bc0: 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41 4d 45 22 GSCIS_TAG_MNAME"
1bd0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f );...case GSCIS_
1be0: 54 41 47 5f 4c 4e 41 4d 45 3a 0a 09 09 09 72 65 TAG_LNAME:....re
1bf0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f turn("GSCIS_TAG_
1c00: 4c 4e 41 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 LNAME");...case
1c10: 47 53 43 49 53 5f 54 41 47 5f 53 55 46 46 49 58 GSCIS_TAG_SUFFIX
1c20: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 :....return("GSC
1c30: 49 53 5f 54 41 47 5f 53 55 46 46 49 58 22 29 3b IS_TAG_SUFFIX");
1c40: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 ...case GSCIS_TA
1c50: 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59 3a 0a 09 G_GOVT_AGENCY:..
1c60: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f ..return("GSCIS_
1c70: 54 41 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59 22 TAG_GOVT_AGENCY"
1c80: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f );...case GSCIS_
1c90: 54 41 47 5f 42 55 52 45 41 55 3a 0a 09 09 09 72 TAG_BUREAU:....r
1ca0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 eturn("GSCIS_TAG
1cb0: 5f 42 55 52 45 41 55 22 29 3b 0a 09 09 63 61 73 _BUREAU");...cas
1cc0: 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45 e GSCIS_TAG_BURE
1cd0: 41 55 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75 AU_CODE:....retu
1ce0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 42 55 rn("GSCIS_TAG_BU
1cf0: 52 45 41 55 5f 43 4f 44 45 22 29 3b 0a 09 09 63 REAU_CODE");...c
1d00: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 44 45 ase GSCIS_TAG_DE
1d10: 50 54 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75 PT_CODE:....retu
1d20: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 44 45 rn("GSCIS_TAG_DE
1d30: 50 54 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61 73 PT_CODE");...cas
1d40: 65 20 47 53 43 49 53 5f 54 41 47 5f 54 49 54 4c e GSCIS_TAG_TITL
1d50: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 E:....return("GS
1d60: 43 49 53 5f 54 41 47 5f 54 49 54 4c 45 22 29 3b CIS_TAG_TITLE");
1d70: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 ...case GSCIS_TA
1d80: 47 5f 42 55 49 4c 44 49 4e 47 3a 0a 09 09 09 72 G_BUILDING:....r
1d90: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 eturn("GSCIS_TAG
1da0: 5f 42 55 49 4c 44 49 4e 47 22 29 3b 0a 09 09 63 _BUILDING");...c
1db0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 ase GSCIS_TAG_OF
1dc0: 46 49 43 45 5f 41 44 44 52 31 3a 0a 09 09 09 72 FICE_ADDR1:....r
1dd0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 eturn("GSCIS_TAG
1de0: 5f 4f 46 46 49 43 45 5f 41 44 44 52 31 22 29 3b _OFFICE_ADDR1");
1df0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 ...case GSCIS_TA
1e00: 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 32 3a 0a G_OFFICE_ADDR2:.
1e10: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 ...return("GSCIS
1e20: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 _TAG_OFFICE_ADDR
1e30: 32 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 2");...case GSCI
1e40: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54 S_TAG_OFFICE_CIT
1e50: 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 Y:....return("GS
1e60: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 CIS_TAG_OFFICE_C
1e70: 49 54 59 22 29 3b 0a 09 09 63 61 73 65 20 47 53 ITY");...case GS
1e80: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53 CIS_TAG_OFFICE_S
1e90: 54 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 TATE:....return(
1ea0: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 "GSCIS_TAG_OFFIC
1eb0: 45 5f 53 54 41 54 45 22 29 3b 0a 09 09 63 61 73 E_STATE");...cas
1ec0: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 e GSCIS_TAG_OFFI
1ed0: 43 45 5f 5a 49 50 3a 0a 09 09 09 72 65 74 75 72 CE_ZIP:....retur
1ee0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 n("GSCIS_TAG_OFF
1ef0: 49 43 45 5f 5a 49 50 22 29 3b 0a 09 09 63 61 73 ICE_ZIP");...cas
1f00: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 e GSCIS_TAG_OFFI
1f10: 43 45 5f 43 4f 55 4e 54 52 59 3a 0a 09 09 09 72 CE_COUNTRY:....r
1f20: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 eturn("GSCIS_TAG
1f30: 5f 4f 46 46 49 43 45 5f 43 4f 55 4e 54 52 59 22 _OFFICE_COUNTRY"
1f40: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f );...case GSCIS_
1f50: 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 TAG_OFFICE_PHONE
1f60: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 :....return("GSC
1f70: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 IS_TAG_OFFICE_PH
1f80: 4f 4e 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 ONE");...case GS
1f90: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 CIS_TAG_OFFICE_P
1fa0: 48 4f 4e 45 5f 45 58 54 3a 0a 09 09 09 72 65 74 HONE_EXT:....ret
1fb0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f urn("GSCIS_TAG_O
1fc0: 46 46 49 43 45 5f 50 48 4f 4e 45 5f 45 58 54 22 FFICE_PHONE_EXT"
1fd0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f );...case GSCIS_
1fe0: 54 41 47 5f 4f 46 46 49 43 45 5f 46 41 58 3a 0a TAG_OFFICE_FAX:.
1ff0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 ...return("GSCIS
2000: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 46 41 58 22 _TAG_OFFICE_FAX"
2010: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f );...case GSCIS_
2020: 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c TAG_OFFICE_EMAIL
2030: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 :....return("GSC
2040: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d IS_TAG_OFFICE_EM
2050: 41 49 4c 22 29 3b 0a 09 09 63 61 73 65 20 47 53 AIL");...case GS
2060: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52 CIS_TAG_OFFICE_R
2070: 4f 4f 4d 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 OOM:....return("
2080: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 GSCIS_TAG_OFFICE
2090: 5f 52 4f 4f 4d 22 29 3b 0a 09 09 63 61 73 65 20 _ROOM");...case
20a0: 47 53 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 GSCIS_TAG_NONGOV
20b0: 5f 41 47 45 4e 43 59 3a 0a 09 09 09 72 65 74 75 _AGENCY:....retu
20c0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4e 4f rn("GSCIS_TAG_NO
20d0: 4e 47 4f 56 5f 41 47 45 4e 43 59 22 29 3b 0a 09 NGOV_AGENCY");..
20e0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f .case GSCIS_TAG_
20f0: 53 53 4e 5f 44 45 53 49 47 4e 41 54 4f 52 3a 0a SSN_DESIGNATOR:.
2100: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 ...return("GSCIS
2110: 5f 54 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41 _TAG_SSN_DESIGNA
2120: 54 4f 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53 TOR");...case GS
2130: 43 49 53 5f 54 41 47 5f 53 53 4e 3a 0a 09 09 09 CIS_TAG_SSN:....
2140: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 return("GSCIS_TA
2150: 47 5f 53 53 4e 22 29 3b 0a 09 09 63 61 73 65 20 G_SSN");...case
2160: 47 53 43 49 53 5f 54 41 47 5f 44 4f 42 3a 0a 09 GSCIS_TAG_DOB:..
2170: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f ..return("GSCIS_
2180: 54 41 47 5f 44 4f 42 22 29 3b 0a 09 09 63 61 73 TAG_DOB");...cas
2190: 65 20 47 53 43 49 53 5f 54 41 47 5f 47 45 4e 44 e GSCIS_TAG_GEND
21a0: 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 ER:....return("G
21b0: 53 43 49 53 5f 54 41 47 5f 47 45 4e 44 45 52 22 SCIS_TAG_GENDER"
21c0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f );...case GSCIS_
21d0: 54 41 47 5f 55 53 45 52 49 44 3a 0a 09 09 09 72 TAG_USERID:....r
21e0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 eturn("GSCIS_TAG
21f0: 5f 55 53 45 52 49 44 22 29 3b 0a 09 09 63 61 73 _USERID");...cas
2200: 65 20 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41 e GSCIS_TAG_DOMA
2210: 49 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 IN:....return("G
2220: 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49 4e 22 SCIS_TAG_DOMAIN"
2230: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f );...case GSCIS_
2240: 54 41 47 5f 50 41 53 53 57 4f 52 44 3a 0a 09 09 TAG_PASSWORD:...
2250: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 .return("GSCIS_T
2260: 41 47 5f 50 41 53 53 57 4f 52 44 22 29 3b 0a 09 AG_PASSWORD");..
2270: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f .case GSCIS_TAG_
2280: 49 53 53 55 45 52 49 44 3a 0a 09 09 09 72 65 74 ISSUERID:....ret
2290: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 49 urn("GSCIS_TAG_I
22a0: 53 53 55 45 52 49 44 22 29 3b 0a 09 09 63 61 73 SSUERID");...cas
22b0: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 45 52 4e e GSCIS_TAG_SERN
22c0: 4f 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 O:....return("GS
22d0: 43 49 53 5f 54 41 47 5f 53 45 52 4e 4f 22 29 3b CIS_TAG_SERNO");
22e0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 ...case GSCIS_TA
22f0: 47 5f 49 53 53 55 45 5f 44 41 54 45 3a 0a 09 09 G_ISSUE_DATE:...
2300: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 .return("GSCIS_T
2310: 41 47 5f 49 53 53 55 45 5f 44 41 54 45 22 29 3b AG_ISSUE_DATE");
2320: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 ...case GSCIS_TA
2330: 47 5f 45 58 50 49 52 45 5f 44 41 54 45 3a 0a 09 G_EXPIRE_DATE:..
2340: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f ..return("GSCIS_
2350: 54 41 47 5f 45 58 50 49 52 45 5f 44 41 54 45 22 TAG_EXPIRE_DATE"
2360: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f );...case GSCIS_
2370: 54 41 47 5f 43 41 52 44 5f 54 59 50 45 3a 0a 09 TAG_CARD_TYPE:..
2380: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f ..return("GSCIS_
2390: 54 41 47 5f 43 41 52 44 5f 54 59 50 45 22 29 3b TAG_CARD_TYPE");
23a0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 ...case GSCIS_TA
23b0: 47 5f 53 45 43 55 52 49 54 59 5f 43 4f 44 45 3a G_SECURITY_CODE:
23c0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 ....return("GSCI
23d0: 53 5f 54 41 47 5f 53 45 43 55 52 49 54 59 5f 43 S_TAG_SECURITY_C
23e0: 4f 44 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 ODE");...case GS
23f0: 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f 41 CIS_TAG_CARDID_A
2400: 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 ID:....return("G
2410: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f SCIS_TAG_CARDID_
2420: 41 49 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53 AID");...case GS
2430: 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 CIS_TAG_CERTIFIC
2440: 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 ATE:....return("
2450: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 GSCIS_TAG_CERTIF
2460: 49 43 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 ICATE");...case
2470: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 49 GSCIS_TAG_CERT_I
2480: 53 53 55 45 5f 44 41 54 45 3a 0a 09 09 09 72 65 SSUE_DATE:....re
2490: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f turn("GSCIS_TAG_
24a0: 43 45 52 54 5f 49 53 53 55 45 5f 44 41 54 45 22 CERT_ISSUE_DATE"
24b0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f );...case GSCIS_
24c0: 54 41 47 5f 43 45 52 54 5f 45 58 50 49 52 45 5f TAG_CERT_EXPIRE_
24d0: 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 DATE:....return(
24e0: 22 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f "GSCIS_TAG_CERT_
24f0: 45 58 50 49 52 45 5f 44 41 54 45 22 29 3b 0a 09 EXPIRE_DATE");..
2500: 7d 0a 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e }...return("UNKN
2510: 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 OWN");.}..static
2520: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43 const char *CAC
2530: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 KEY_DEBUG_FUNC_S
2540: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 4c CARDERR_TO_STR(L
2550: 4f 4e 47 20 72 65 74 63 6f 64 65 29 20 7b 0a 09 ONG retcode) {..
2560: 73 77 69 74 63 68 20 28 72 65 74 63 6f 64 65 29 switch (retcode)
2570: 20 7b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f {...case SCARD_
2580: 53 5f 53 55 43 43 45 53 53 3a 0a 09 09 09 72 65 S_SUCCESS:....re
2590: 74 75 72 6e 28 22 53 43 41 52 44 5f 53 5f 53 55 turn("SCARD_S_SU
25a0: 43 43 45 53 53 22 29 3b 0a 09 09 63 61 73 65 20 CCESS");...case
25b0: 53 43 41 52 44 5f 45 5f 43 41 4e 43 45 4c 4c 45 SCARD_E_CANCELLE
25c0: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 D:....return("SC
25d0: 41 52 44 5f 45 5f 43 41 4e 43 45 4c 4c 45 44 22 ARD_E_CANCELLED"
25e0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f );...case SCARD_
25f0: 45 5f 43 41 4e 54 5f 44 49 53 50 4f 53 45 3a 0a E_CANT_DISPOSE:.
2600: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 ...return("SCARD
2610: 5f 45 5f 43 41 4e 54 5f 44 49 53 50 4f 53 45 22 _E_CANT_DISPOSE"
2620: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f );...case SCARD_
2630: 45 5f 49 4e 53 55 46 46 49 43 49 45 4e 54 5f 42 E_INSUFFICIENT_B
2640: 55 46 46 45 52 3a 0a 09 09 09 72 65 74 75 72 6e UFFER:....return
2650: 28 22 53 43 41 52 44 5f 45 5f 49 4e 53 55 46 46 ("SCARD_E_INSUFF
2660: 49 43 49 45 4e 54 5f 42 55 46 46 45 52 22 29 3b ICIENT_BUFFER");
2670: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f ...case SCARD_E_
2680: 49 4e 56 41 4c 49 44 5f 41 54 52 3a 0a 09 09 09 INVALID_ATR:....
2690: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f return("SCARD_E_
26a0: 49 4e 56 41 4c 49 44 5f 41 54 52 22 29 3b 0a 09 INVALID_ATR");..
26b0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e .case SCARD_E_IN
26c0: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 3a 0a 09 09 VALID_HANDLE:...
26d0: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 .return("SCARD_E
26e0: 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 22 _INVALID_HANDLE"
26f0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f );...case SCARD_
2700: 45 5f 49 4e 56 41 4c 49 44 5f 50 41 52 41 4d 45 E_INVALID_PARAME
2710: 54 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 TER:....return("
2720: 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f SCARD_E_INVALID_
2730: 50 41 52 41 4d 45 54 45 52 22 29 3b 0a 09 09 63 PARAMETER");...c
2740: 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 ase SCARD_E_INVA
2750: 4c 49 44 5f 54 41 52 47 45 54 3a 0a 09 09 09 72 LID_TARGET:....r
2760: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 eturn("SCARD_E_I
2770: 4e 56 41 4c 49 44 5f 54 41 52 47 45 54 22 29 3b NVALID_TARGET");
2780: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f ...case SCARD_E_
2790: 49 4e 56 41 4c 49 44 5f 56 41 4c 55 45 3a 0a 09 INVALID_VALUE:..
27a0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f ..return("SCARD_
27b0: 45 5f 49 4e 56 41 4c 49 44 5f 56 41 4c 55 45 22 E_INVALID_VALUE"
27c0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f );...case SCARD_
27d0: 45 5f 4e 4f 5f 4d 45 4d 4f 52 59 3a 0a 09 09 09 E_NO_MEMORY:....
27e0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f return("SCARD_E_
27f0: 4e 4f 5f 4d 45 4d 4f 52 59 22 29 3b 0a 09 09 63 NO_MEMORY");...c
2800: 61 73 65 20 53 43 41 52 44 5f 45 5f 55 4e 4b 4e ase SCARD_E_UNKN
2810: 4f 57 4e 5f 52 45 41 44 45 52 3a 0a 09 09 09 72 OWN_READER:....r
2820: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55 eturn("SCARD_E_U
2830: 4e 4b 4e 4f 57 4e 5f 52 45 41 44 45 52 22 29 3b NKNOWN_READER");
2840: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f ...case SCARD_E_
2850: 54 49 4d 45 4f 55 54 3a 0a 09 09 09 72 65 74 75 TIMEOUT:....retu
2860: 72 6e 28 22 53 43 41 52 44 5f 45 5f 54 49 4d 45 rn("SCARD_E_TIME
2870: 4f 55 54 22 29 3b 0a 09 09 63 61 73 65 20 53 43 OUT");...case SC
2880: 41 52 44 5f 45 5f 53 48 41 52 49 4e 47 5f 56 49 ARD_E_SHARING_VI
2890: 4f 4c 41 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75 OLATION:....retu
28a0: 72 6e 28 22 53 43 41 52 44 5f 45 5f 53 48 41 52 rn("SCARD_E_SHAR
28b0: 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 22 29 3b ING_VIOLATION");
28c0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f ...case SCARD_E_
28d0: 4e 4f 5f 53 4d 41 52 54 43 41 52 44 3a 0a 09 09 NO_SMARTCARD:...
28e0: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 .return("SCARD_E
28f0: 5f 4e 4f 5f 53 4d 41 52 54 43 41 52 44 22 29 3b _NO_SMARTCARD");
2900: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f ...case SCARD_E_
2910: 55 4e 4b 4e 4f 57 4e 5f 43 41 52 44 3a 0a 09 09 UNKNOWN_CARD:...
2920: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 .return("SCARD_E
2930: 5f 55 4e 4b 4e 4f 57 4e 5f 43 41 52 44 22 29 3b _UNKNOWN_CARD");
2940: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f ...case SCARD_E_
2950: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 3a 0a PROTO_MISMATCH:.
2960: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 ...return("SCARD
2970: 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 _E_PROTO_MISMATC
2980: 48 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 H");...case SCAR
2990: 44 5f 45 5f 4e 4f 54 5f 52 45 41 44 59 3a 0a 09 D_E_NOT_READY:..
29a0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f ..return("SCARD_
29b0: 45 5f 4e 4f 54 5f 52 45 41 44 59 22 29 3b 0a 09 E_NOT_READY");..
29c0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 53 59 .case SCARD_E_SY
29d0: 53 54 45 4d 5f 43 41 4e 43 45 4c 4c 45 44 3a 0a STEM_CANCELLED:.
29e0: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 ...return("SCARD
29f0: 5f 45 5f 53 59 53 54 45 4d 5f 43 41 4e 43 45 4c _E_SYSTEM_CANCEL
2a00: 4c 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 LED");...case SC
2a10: 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41 ARD_E_NOT_TRANSA
2a20: 43 54 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 CTED:....return(
2a30: 22 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 "SCARD_E_NOT_TRA
2a40: 4e 53 41 43 54 45 44 22 29 3b 0a 09 09 63 61 73 NSACTED");...cas
2a50: 65 20 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52 e SCARD_E_READER
2a60: 5f 55 4e 41 56 41 49 4c 41 42 4c 45 3a 0a 09 09 _UNAVAILABLE:...
2a70: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 .return("SCARD_E
2a80: 5f 52 45 41 44 45 52 5f 55 4e 41 56 41 49 4c 41 _READER_UNAVAILA
2a90: 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43 BLE");...case SC
2aa0: 41 52 44 5f 57 5f 55 4e 53 55 50 50 4f 52 54 45 ARD_W_UNSUPPORTE
2ab0: 44 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 D_CARD:....retur
2ac0: 6e 28 22 53 43 41 52 44 5f 57 5f 55 4e 53 55 50 n("SCARD_W_UNSUP
2ad0: 50 4f 52 54 45 44 5f 43 41 52 44 22 29 3b 0a 09 PORTED_CARD");..
2ae0: 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f 55 4e .case SCARD_W_UN
2af0: 52 45 53 50 4f 4e 53 49 56 45 5f 43 41 52 44 3a RESPONSIVE_CARD:
2b00: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 ....return("SCAR
2b10: 44 5f 57 5f 55 4e 52 45 53 50 4f 4e 53 49 56 45 D_W_UNRESPONSIVE
2b20: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 _CARD");...case
2b30: 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 SCARD_W_UNPOWERE
2b40: 44 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 D_CARD:....retur
2b50: 6e 28 22 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57 n("SCARD_W_UNPOW
2b60: 45 52 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63 ERED_CARD");...c
2b70: 61 73 65 20 53 43 41 52 44 5f 57 5f 52 45 53 45 ase SCARD_W_RESE
2b80: 54 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 T_CARD:....retur
2b90: 6e 28 22 53 43 41 52 44 5f 57 5f 52 45 53 45 54 n("SCARD_W_RESET
2ba0: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 _CARD");...case
2bb0: 53 43 41 52 44 5f 57 5f 52 45 4d 4f 56 45 44 5f SCARD_W_REMOVED_
2bc0: 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 CARD:....return(
2bd0: 22 53 43 41 52 44 5f 57 5f 52 45 4d 4f 56 45 44 "SCARD_W_REMOVED
2be0: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 _CARD");...case
2bf0: 53 43 41 52 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f SCARD_E_PCI_TOO_
2c00: 53 4d 41 4c 4c 3a 0a 09 09 09 72 65 74 75 72 6e SMALL:....return
2c10: 28 22 53 43 41 52 44 5f 45 5f 50 43 49 5f 54 4f ("SCARD_E_PCI_TO
2c20: 4f 5f 53 4d 41 4c 4c 22 29 3b 0a 09 09 63 61 73 O_SMALL");...cas
2c30: 65 20 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52 e SCARD_E_READER
2c40: 5f 55 4e 53 55 50 50 4f 52 54 45 44 3a 0a 09 09 _UNSUPPORTED:...
2c50: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 .return("SCARD_E
2c60: 5f 52 45 41 44 45 52 5f 55 4e 53 55 50 50 4f 52 _READER_UNSUPPOR
2c70: 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 TED");...case SC
2c80: 41 52 44 5f 45 5f 44 55 50 4c 49 43 41 54 45 5f ARD_E_DUPLICATE_
2c90: 52 45 41 44 45 52 3a 0a 09 09 09 72 65 74 75 72 READER:....retur
2ca0: 6e 28 22 53 43 41 52 44 5f 45 5f 44 55 50 4c 49 n("SCARD_E_DUPLI
2cb0: 43 41 54 45 5f 52 45 41 44 45 52 22 29 3b 0a 09 CATE_READER");..
2cc0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 43 41 .case SCARD_E_CA
2cd0: 52 44 5f 55 4e 53 55 50 50 4f 52 54 45 44 3a 0a RD_UNSUPPORTED:.
2ce0: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 ...return("SCARD
2cf0: 5f 45 5f 43 41 52 44 5f 55 4e 53 55 50 50 4f 52 _E_CARD_UNSUPPOR
2d00: 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 TED");...case SC
2d10: 41 52 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45 ARD_E_NO_SERVICE
2d20: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 :....return("SCA
2d30: 52 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45 22 RD_E_NO_SERVICE"
2d40: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f );...case SCARD_
2d50: 45 5f 53 45 52 56 49 43 45 5f 53 54 4f 50 50 45 E_SERVICE_STOPPE
2d60: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 D:....return("SC
2d70: 41 52 44 5f 45 5f 53 45 52 56 49 43 45 5f 53 54 ARD_E_SERVICE_ST
2d80: 4f 50 50 45 44 22 29 3b 0a 09 09 63 61 73 65 20 OPPED");...case
2d90: 53 43 41 52 44 5f 57 5f 49 4e 53 45 52 54 45 44 SCARD_W_INSERTED
2da0: 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e _CARD:....return
2db0: 28 22 53 43 41 52 44 5f 57 5f 49 4e 53 45 52 54 ("SCARD_W_INSERT
2dc0: 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 ED_CARD");...cas
2dd0: 65 20 53 43 41 52 44 5f 45 5f 55 4e 53 55 50 50 e SCARD_E_UNSUPP
2de0: 4f 52 54 45 44 5f 46 45 41 54 55 52 45 3a 0a 09 ORTED_FEATURE:..
2df0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f ..return("SCARD_
2e00: 45 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f 46 45 E_UNSUPPORTED_FE
2e10: 41 54 55 52 45 22 29 3b 0a 09 7d 0a 0a 09 72 65 ATURE");..}...re
2e20: 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b turn("UNKNOWN");
2e30: 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 .}..static const
2e40: 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 char *CACKEY_DE
2e50: 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 BUG_FUNC_OBJID_T
2e60: 4f 5f 53 54 52 28 75 69 6e 74 31 36 5f 74 20 6f O_STR(uint16_t o
2e70: 62 6a 69 64 29 20 7b 0a 09 73 77 69 74 63 68 20 bjid) {..switch
2e80: 28 6f 62 6a 69 64 29 20 7b 0a 09 09 63 61 73 65 (objid) {...case
2e90: 20 30 78 32 30 30 30 3a 0a 09 09 09 72 65 74 75 0x2000:....retu
2ea0: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f rn("CACKEY_TLV_O
2eb0: 42 4a 49 44 5f 47 45 4e 45 52 41 4c 49 4e 46 4f BJID_GENERALINFO
2ec0: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 32 31 30 ");...case 0x210
2ed0: 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 0:....return("CA
2ee0: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 50 CKEY_TLV_OBJID_P
2ef0: 52 4f 50 45 52 53 4f 4e 41 4c 49 4e 46 4f 22 29 ROPERSONALINFO")
2f00: 3b 0a 09 09 63 61 73 65 20 30 78 33 30 30 30 3a ;...case 0x3000:
2f10: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b ....return("CACK
2f20: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 41 43 43 EY_TLV_OBJID_ACC
2f30: 45 53 53 43 4f 4e 54 52 4f 4c 22 29 3b 0a 09 09 ESSCONTROL");...
2f40: 63 61 73 65 20 30 78 34 30 30 30 3a 0a 09 09 09 case 0x4000:....
2f50: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 return("CACKEY_T
2f60: 4c 56 5f 4f 42 4a 49 44 5f 4c 4f 47 49 4e 22 29 LV_OBJID_LOGIN")
2f70: 3b 0a 09 09 63 61 73 65 20 30 78 35 30 30 30 3a ;...case 0x5000:
2f80: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b ....return("CACK
2f90: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 52 EY_TLV_OBJID_CAR
2fa0: 44 49 4e 46 4f 22 29 3b 0a 09 09 63 61 73 65 20 DINFO");...case
2fb0: 30 78 36 30 30 30 3a 0a 09 09 09 72 65 74 75 72 0x6000:....retur
2fc0: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 n("CACKEY_TLV_OB
2fd0: 4a 49 44 5f 42 49 4f 4d 45 54 52 49 43 53 22 29 JID_BIOMETRICS")
2fe0: 3b 0a 09 09 63 61 73 65 20 30 78 37 30 30 30 3a ;...case 0x7000:
2ff0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b ....return("CACK
3000: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 44 49 47 EY_TLV_OBJID_DIG
3010: 49 54 41 4c 53 49 47 43 45 52 54 22 29 3b 0a 09 ITALSIGCERT");..
3020: 09 63 61 73 65 20 30 78 30 32 30 30 3a 0a 09 09 .case 0x0200:...
3030: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f .return("CACKEY_
3040: 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 TLV_OBJID_CAC_PE
3050: 52 53 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 30 RSON");...case 0
3060: 78 30 32 30 32 3a 0a 09 09 09 72 65 74 75 72 6e x0202:....return
3070: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a ("CACKEY_TLV_OBJ
3080: 49 44 5f 43 41 43 5f 42 45 4e 45 46 49 54 53 22 ID_CAC_BENEFITS"
3090: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32 30 33 );...case 0x0203
30a0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 :....return("CAC
30b0: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 KEY_TLV_OBJID_CA
30c0: 43 5f 4f 54 48 45 52 42 45 4e 45 46 49 54 53 22 C_OTHERBENEFITS"
30d0: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32 30 31 );...case 0x0201
30e0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 :....return("CAC
30f0: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 KEY_TLV_OBJID_CA
3100: 43 5f 50 45 52 53 4f 4e 4e 45 4c 22 29 3b 0a 09 C_PERSONNEL");..
3110: 09 63 61 73 65 20 30 78 30 32 46 45 3a 0a 09 09 .case 0x02FE:...
3120: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f .return("CACKEY_
3130: 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 4b TLV_OBJID_CAC_PK
3140: 49 43 45 52 54 22 29 3b 0a 09 7d 0a 09 0a 09 72 ICERT");..}....r
3150: 65 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 eturn("UNKNOWN")
3160: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 ;.}..static cons
3170: 74 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 t char *CACKEY_D
3180: 45 42 55 47 5f 46 55 4e 43 5f 41 50 50 54 59 50 EBUG_FUNC_APPTYP
3190: 45 5f 54 4f 5f 53 54 52 28 75 69 6e 74 38 5f 74 E_TO_STR(uint8_t
31a0: 20 61 70 70 74 79 70 65 29 20 7b 0a 09 73 77 69 apptype) {..swi
31b0: 74 63 68 20 28 61 70 70 74 79 70 65 29 20 7b 0a tch (apptype) {.
31c0: 09 09 63 61 73 65 20 30 78 30 30 3a 0a 09 09 09 ..case 0x00:....
31d0: 72 65 74 75 72 6e 28 22 4e 4f 4e 45 22 29 3b 0a return("NONE");.
31e0: 09 09 63 61 73 65 20 30 78 30 31 3a 0a 09 09 09 ..case 0x01:....
31f0: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 return("CACKEY_T
3200: 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 22 29 LV_APP_GENERIC")
3210: 3b 0a 09 09 63 61 73 65 20 30 78 30 32 3a 0a 09 ;...case 0x02:..
3220: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 ..return("CACKEY
3230: 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 22 29 3b 0a _TLV_APP_SKI");.
3240: 09 09 63 61 73 65 20 30 78 30 33 3a 0a 09 09 09 ..case 0x03:....
3250: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 return("CACKEY_T
3260: 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 7c LV_APP_GENERIC |
3270: 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f CACKEY_TLV_APP_
3280: 53 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78 SKI");...case 0x
3290: 30 34 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 04:....return("C
32a0: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b ACKEY_TLV_APP_PK
32b0: 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 35 I");...case 0x05
32c0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 :....return("CAC
32d0: 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 KEY_TLV_APP_GENE
32e0: 52 49 43 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 RIC | CACKEY_TLV
32f0: 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61 _APP_PKI");...ca
3300: 73 65 20 30 78 30 36 3a 0a 09 09 09 72 65 74 75 se 0x06:....retu
3310: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 rn("CACKEY_TLV_A
3320: 50 50 5f 53 4b 49 20 7c 20 43 41 43 4b 45 59 5f PP_SKI | CACKEY_
3330: 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09 TLV_APP_PKI");..
3340: 09 63 61 73 65 20 30 78 30 37 3a 0a 09 09 09 72 .case 0x07:....r
3350: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c eturn("CACKEY_TL
3360: 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 7c 20 V_APP_GENERIC |
3370: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 CACKEY_TLV_APP_S
3380: 4b 49 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f KI | CACKEY_TLV_
3390: 41 50 50 5f 50 4b 49 22 29 3b 0a 09 7d 0a 0a 09 APP_PKI");..}...
33a0: 72 65 74 75 72 6e 28 22 49 4e 56 41 4c 49 44 22 return("INVALID"
33b0: 29 3b 0a 7d 0a 0a 23 20 20 64 65 66 69 6e 65 20 );.}..# define
33c0: 6d 61 6c 6c 6f 63 28 78 29 20 43 41 43 4b 45 59 malloc(x) CACKEY
33d0: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4d 41 4c 4c _DEBUG_FUNC_MALL
33e0: 4f 43 28 78 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 OC(x, __func__,
33f0: 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 20 20 64 65 66 __LINE__).# def
3400: 69 6e 65 20 72 65 61 6c 6c 6f 63 28 78 2c 20 79 ine realloc(x, y
3410: 29 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 ) CACKEY_DEBUG_F
3420: 55 4e 43 5f 52 45 41 4c 4c 4f 43 28 78 2c 20 79 UNC_REALLOC(x, y
3430: 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 , __func__, __LI
3440: 4e 45 5f 5f 29 0a 23 20 20 69 66 64 65 66 20 73 NE__).# ifdef s
3450: 74 72 64 75 70 0a 23 20 20 20 20 75 6e 64 65 66 trdup.# undef
3460: 20 73 74 72 64 75 70 0a 23 20 20 65 6e 64 69 66 strdup.# endif
3470: 0a 23 20 20 64 65 66 69 6e 65 20 73 74 72 64 75 .# define strdu
3480: 70 28 78 29 20 43 41 43 4b 45 59 5f 44 45 42 55 p(x) CACKEY_DEBU
3490: 47 5f 46 55 4e 43 5f 53 54 52 44 55 50 28 78 2c G_FUNC_STRDUP(x,
34a0: 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e __func__, __LIN
34b0: 45 5f 5f 29 0a 23 65 6c 73 65 0a 23 20 20 64 65 E__).#else.# de
34c0: 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 fine CACKEY_DEBU
34d0: 47 5f 50 52 49 4e 54 46 28 78 2e 2e 2e 29 20 2f G_PRINTF(x...) /
34e0: 2a 2a 2f 0a 23 20 20 64 65 66 69 6e 65 20 43 41 **/.# define CA
34f0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
3500: 42 55 46 28 66 2c 20 78 2c 20 79 29 20 2f 2a 2a BUF(f, x, y) /**
3510: 2f 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b /.# define CACK
3520: 45 59 5f 44 45 42 55 47 5f 50 45 52 52 4f 52 28 EY_DEBUG_PERROR(
3530: 78 29 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 69 6e x) /**/.# defin
3540: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 e CACKEY_DEBUG_F
3550: 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 78 UNC_TAG_TO_STR(x
3560: 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c 45 ) "DEBUG_DISABLE
3570: 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 D".# define CAC
3580: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 KEY_DEBUG_FUNC_S
3590: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 78 CARDERR_TO_STR(x
35a0: 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c 45 ) "DEBUG_DISABLE
35b0: 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 D".# define CAC
35c0: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4f KEY_DEBUG_FUNC_O
35d0: 42 4a 49 44 5f 54 4f 5f 53 54 52 28 78 29 20 22 BJID_TO_STR(x) "
35e0: 44 45 42 55 47 5f 44 49 53 41 42 4c 45 44 22 0a DEBUG_DISABLED".
35f0: 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 # define CACKEY
3600: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 50 50 54 _DEBUG_FUNC_APPT
3610: 59 50 45 5f 54 4f 5f 53 54 52 28 78 29 20 22 44 YPE_TO_STR(x) "D
3620: 45 42 55 47 5f 44 49 53 41 42 4c 45 44 22 0a 23 EBUG_DISABLED".#
3630: 65 6e 64 69 66 0a 0a 73 74 72 75 63 74 20 63 61 endif..struct ca
3640: 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 ckey_pcsc_identi
3650: 74 79 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 ty {..unsigned c
3660: 68 61 72 20 61 70 70 6c 65 74 5b 37 5d 3b 0a 09 har applet[7];..
3670: 75 69 6e 74 31 36 5f 74 20 66 69 6c 65 3b 0a 0a uint16_t file;..
3680: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a .unsigned char *
3690: 6c 61 62 65 6c 3b 0a 0a 09 73 69 7a 65 5f 74 20 label;...size_t
36a0: 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b certificate_len;
36b0: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 ..unsigned char
36c0: 2a 63 65 72 74 69 66 69 63 61 74 65 3b 0a 7d 3b *certificate;.};
36d0: 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f ..struct cackey_
36e0: 69 64 65 6e 74 69 74 79 20 7b 0a 09 73 74 72 75 identity {..stru
36f0: 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 ct cackey_pcsc_i
3700: 64 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64 dentity *pcsc_id
3710: 65 6e 74 69 74 79 3b 0a 0a 09 43 4b 5f 41 54 54 entity;...CK_ATT
3720: 52 49 42 55 54 45 20 2a 61 74 74 72 69 62 75 74 RIBUTE *attribut
3730: 65 73 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 61 74 es;..CK_ULONG at
3740: 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 0a tributes_count;.
3750: 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65 };..struct cacke
3760: 79 5f 73 65 73 73 69 6f 6e 20 7b 0a 09 69 6e 74 y_session {..int
3770: 20 61 63 74 69 76 65 3b 0a 0a 09 43 4b 5f 53 4c active;...CK_SL
3780: 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 0a 09 OT_ID slotID;...
3790: 43 4b 5f 53 54 41 54 45 20 73 74 61 74 65 3b 0a CK_STATE state;.
37a0: 09 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73 3b .CK_FLAGS flags;
37b0: 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 65 76 ..CK_ULONG ulDev
37c0: 69 63 65 45 72 72 6f 72 3b 0a 09 43 4b 5f 56 4f iceError;..CK_VO
37d0: 49 44 5f 50 54 52 20 70 41 70 70 6c 69 63 61 74 ID_PTR pApplicat
37e0: 69 6f 6e 3b 0a 09 43 4b 5f 4e 4f 54 49 46 59 20 ion;..CK_NOTIFY
37f0: 4e 6f 74 69 66 79 3b 0a 0a 09 73 74 72 75 63 74 Notify;...struct
3800: 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 cackey_identity
3810: 20 2a 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 *identities;..u
3820: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 nsigned long ide
3830: 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a ntities_count;..
3840: 09 69 6e 74 20 73 65 61 72 63 68 5f 61 63 74 69 .int search_acti
3850: 76 65 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 ve;..CK_ATTRIBUT
3860: 45 5f 50 54 52 20 73 65 61 72 63 68 5f 71 75 65 E_PTR search_que
3870: 72 79 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 73 65 ry;..CK_ULONG se
3880: 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 arch_query_count
3890: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 ;..unsigned long
38a0: 20 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64 3b search_curr_id;
38b0: 0a 0a 09 69 6e 74 20 73 69 67 6e 5f 61 63 74 69 ...int sign_acti
38c0: 76 65 3b 0a 09 43 4b 5f 4d 45 43 48 41 4e 49 53 ve;..CK_MECHANIS
38d0: 4d 5f 54 59 50 45 20 73 69 67 6e 5f 6d 65 63 68 M_TYPE sign_mech
38e0: 61 6e 69 73 6d 3b 0a 09 43 4b 5f 42 59 54 45 5f anism;..CK_BYTE_
38f0: 50 54 52 20 73 69 67 6e 5f 62 75 66 3b 0a 09 75 PTR sign_buf;..u
3900: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69 67 nsigned long sig
3910: 6e 5f 62 75 66 6c 65 6e 3b 0a 09 75 6e 73 69 67 n_buflen;..unsig
3920: 6e 65 64 20 6c 6f 6e 67 20 73 69 67 6e 5f 62 75 ned long sign_bu
3930: 66 75 73 65 64 3b 0a 09 73 74 72 75 63 74 20 63 fused;..struct c
3940: 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a ackey_identity *
3950: 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 3b 0a 0a sign_identity;..
3960: 09 69 6e 74 20 64 65 63 72 79 70 74 5f 61 63 74 .int decrypt_act
3970: 69 76 65 3b 0a 09 43 4b 5f 4d 45 43 48 41 4e 49 ive;..CK_MECHANI
3980: 53 4d 5f 54 59 50 45 20 64 65 63 72 79 70 74 5f SM_TYPE decrypt_
3990: 6d 65 63 68 61 6e 69 73 6d 3b 0a 09 43 4b 5f 56 mechanism;..CK_V
39a0: 4f 49 44 5f 50 54 52 20 64 65 63 72 79 70 74 5f OID_PTR decrypt_
39b0: 6d 65 63 68 5f 70 61 72 6d 3b 0a 09 43 4b 5f 55 mech_parm;..CK_U
39c0: 4c 4f 4e 47 20 64 65 63 72 79 70 74 5f 6d 65 63 LONG decrypt_mec
39d0: 68 5f 70 61 72 6d 6c 65 6e 3b 0a 09 73 74 72 75 h_parmlen;..stru
39e0: 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 ct cackey_identi
39f0: 74 79 20 2a 64 65 63 72 79 70 74 5f 69 64 65 6e ty *decrypt_iden
3a00: 74 69 74 79 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 tity;.};..struct
3a10: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 7b 0a 09 cackey_slot {..
3a20: 69 6e 74 20 61 63 74 69 76 65 3b 0a 0a 09 63 68 int active;...ch
3a30: 61 72 20 2a 70 63 73 63 5f 72 65 61 64 65 72 3b ar *pcsc_reader;
3a40: 0a 0a 09 69 6e 74 20 70 63 73 63 5f 63 61 72 64 ...int pcsc_card
3a50: 5f 63 6f 6e 6e 65 63 74 65 64 3b 0a 09 53 43 41 _connected;..SCA
3a60: 52 44 48 41 4e 44 4c 45 20 70 63 73 63 5f 63 61 RDHANDLE pcsc_ca
3a70: 72 64 3b 0a 0a 09 69 6e 74 20 74 72 61 6e 73 61 rd;...int transa
3a80: 63 74 69 6f 6e 5f 64 65 70 74 68 3b 0a 0a 09 69 ction_depth;...i
3a90: 6e 74 20 73 6c 6f 74 5f 72 65 73 65 74 3b 0a 7d nt slot_reset;.}
3aa0: 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20 ;..typedef enum
3ab0: 7b 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 {..CACKEY_TLV_AP
3ac0: 50 5f 47 45 4e 45 52 49 43 20 3d 20 30 78 30 31 P_GENERIC = 0x01
3ad0: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 ,..CACKEY_TLV_AP
3ae0: 50 5f 53 4b 49 20 20 20 20 20 3d 20 30 78 30 32 P_SKI = 0x02
3af0: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 ,..CACKEY_TLV_AP
3b00: 50 5f 50 4b 49 20 20 20 20 20 3d 20 30 78 30 34 P_PKI = 0x04
3b10: 0a 7d 20 63 61 63 6b 65 79 5f 74 6c 76 5f 61 70 .} cackey_tlv_ap
3b20: 70 74 79 70 65 3b 0a 0a 74 79 70 65 64 65 66 20 ptype;..typedef
3b30: 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 54 enum {..CACKEY_T
3b40: 4c 56 5f 4f 42 4a 49 44 5f 47 45 4e 45 52 41 4c LV_OBJID_GENERAL
3b50: 49 4e 46 4f 20 20 20 20 20 20 20 3d 20 30 78 32 INFO = 0x2
3b60: 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 000,..CACKEY_TLV
3b70: 5f 4f 42 4a 49 44 5f 50 52 4f 50 45 52 53 4f 4e _OBJID_PROPERSON
3b80: 41 4c 49 4e 46 4f 20 20 20 3d 20 30 78 32 31 30 ALINFO = 0x210
3b90: 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 0,..CACKEY_TLV_O
3ba0: 42 4a 49 44 5f 41 43 43 45 53 53 43 4f 4e 54 52 BJID_ACCESSCONTR
3bb0: 4f 4c 20 20 20 20 20 3d 20 30 78 33 30 30 30 2c OL = 0x3000,
3bc0: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a ..CACKEY_TLV_OBJ
3bd0: 49 44 5f 4c 4f 47 49 4e 20 20 20 20 20 20 20 20 ID_LOGIN
3be0: 20 20 20 20 20 3d 20 30 78 34 30 30 30 2c 0a 09 = 0x4000,..
3bf0: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 CACKEY_TLV_OBJID
3c00: 5f 43 41 52 44 49 4e 46 4f 20 20 20 20 20 20 20 _CARDINFO
3c10: 20 20 20 3d 20 30 78 35 30 30 30 2c 0a 09 43 41 = 0x5000,..CA
3c20: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 42 CKEY_TLV_OBJID_B
3c30: 49 4f 4d 45 54 52 49 43 53 20 20 20 20 20 20 20 IOMETRICS
3c40: 20 3d 20 30 78 36 30 30 30 2c 0a 09 43 41 43 4b = 0x6000,..CACK
3c50: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 44 49 47 EY_TLV_OBJID_DIG
3c60: 49 54 41 4c 53 49 47 43 45 52 54 20 20 20 20 3d ITALSIGCERT =
3c70: 20 30 78 37 30 30 30 2c 0a 09 43 41 43 4b 45 59 0x7000,..CACKEY
3c80: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 _TLV_OBJID_CAC_P
3c90: 45 52 53 4f 4e 20 20 20 20 20 20 20 20 3d 20 30 ERSON = 0
3ca0: 78 30 32 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 x0200,..CACKEY_T
3cb0: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 42 45 4e LV_OBJID_CAC_BEN
3cc0: 45 46 49 54 53 20 20 20 20 20 20 3d 20 30 78 30 EFITS = 0x0
3cd0: 32 30 32 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 202,..CACKEY_TLV
3ce0: 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f 54 48 45 52 _OBJID_CAC_OTHER
3cf0: 42 45 4e 45 46 49 54 53 20 3d 20 30 78 30 32 30 BENEFITS = 0x020
3d00: 33 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 3,..CACKEY_TLV_O
3d10: 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e 4e BJID_CAC_PERSONN
3d20: 45 4c 20 20 20 20 20 3d 20 30 78 30 32 30 31 2c EL = 0x0201,
3d30: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a ..CACKEY_TLV_OBJ
3d40: 49 44 5f 43 41 43 5f 50 4b 49 43 45 52 54 20 20 ID_CAC_PKICERT
3d50: 20 20 20 20 20 3d 20 30 78 30 32 46 45 0a 7d 20 = 0x02FE.}
3d60: 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 cackey_tlv_objec
3d70: 74 69 64 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e tid;..typedef en
3d80: 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 50 43 53 um {..CACKEY_PCS
3d90: 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 C_S_TOKENPRESENT
3da0: 20 20 20 20 3d 20 32 2c 0a 09 43 41 43 4b 45 59 = 2,..CACKEY
3db0: 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 41 42 53 _PCSC_S_TOKENABS
3dc0: 45 4e 54 20 20 20 20 20 3d 20 31 2c 0a 09 43 41 ENT = 1,..CA
3dd0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 CKEY_PCSC_S_OK
3de0: 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 2c = 0,
3df0: 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f ..CACKEY_PCSC_E_
3e00: 47 45 4e 45 52 49 43 20 20 20 20 20 20 20 20 20 GENERIC
3e10: 3d 20 2d 31 2c 0a 09 43 41 43 4b 45 59 5f 50 43 = -1,..CACKEY_PC
3e20: 53 43 5f 45 5f 42 41 44 50 49 4e 20 20 20 20 20 SC_E_BADPIN
3e30: 20 20 20 20 20 3d 20 2d 32 2c 0a 09 43 41 43 4b = -2,..CACK
3e40: 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 EY_PCSC_E_LOCKED
3e50: 20 20 20 20 20 20 20 20 20 20 3d 20 2d 33 2c 0a = -3,.
3e60: 7d 20 63 61 63 6b 65 79 5f 72 65 74 3b 0a 0a 73 } cackey_ret;..s
3e70: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 truct cackey_tlv
3e80: 5f 63 61 72 64 75 72 6c 20 7b 0a 09 75 6e 73 69 _cardurl {..unsi
3e90: 67 6e 65 64 20 63 68 61 72 20 20 20 20 20 20 20 gned char
3ea0: 20 72 69 64 5b 35 5d 3b 0a 09 63 61 63 6b 65 79 rid[5];..cackey
3eb0: 5f 74 6c 76 5f 61 70 70 74 79 70 65 20 20 20 61 _tlv_apptype a
3ec0: 70 70 74 79 70 65 3b 0a 09 63 61 63 6b 65 79 5f pptype;..cackey_
3ed0: 74 6c 76 5f 6f 62 6a 65 63 74 69 64 20 20 6f 62 tlv_objectid ob
3ee0: 6a 65 63 74 69 64 3b 0a 09 63 61 63 6b 65 79 5f jectid;..cackey_
3ef0: 74 6c 76 5f 6f 62 6a 65 63 74 69 64 20 20 61 70 tlv_objectid ap
3f00: 70 69 64 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 pid;..unsigned c
3f10: 68 61 72 20 20 20 20 20 20 20 20 70 69 6e 69 64 har pinid
3f20: 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 ;.};..struct cac
3f30: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 3b 0a key_tlv_entity;.
3f40: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c struct cackey_tl
3f50: 76 5f 65 6e 74 69 74 79 20 7b 0a 09 75 69 6e 74 v_entity {..uint
3f60: 38 5f 74 20 74 61 67 3b 0a 09 73 69 7a 65 5f 74 8_t tag;..size_t
3f70: 20 6c 65 6e 67 74 68 3b 0a 0a 09 75 6e 69 6f 6e length;...union
3f80: 20 7b 0a 09 09 76 6f 69 64 20 2a 76 61 6c 75 65 {...void *value
3f90: 3b 0a 09 09 73 74 72 75 63 74 20 63 61 63 6b 65 ;...struct cacke
3fa0: 79 5f 74 6c 76 5f 63 61 72 64 75 72 6c 20 2a 76 y_tlv_cardurl *v
3fb0: 61 6c 75 65 5f 63 61 72 64 75 72 6c 3b 0a 09 09 alue_cardurl;...
3fc0: 75 69 6e 74 38 5f 74 20 76 61 6c 75 65 5f 62 79 uint8_t value_by
3fd0: 74 65 3b 0a 09 7d 3b 0a 0a 09 73 74 72 75 63 74 te;..};...struct
3fe0: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 cackey_tlv_enti
3ff0: 74 79 20 2a 5f 6e 65 78 74 3b 0a 7d 3b 0a 0a 2f ty *_next;.};../
4000: 2a 20 43 41 43 4b 45 59 20 47 6c 6f 62 61 6c 20 * CACKEY Global
4010: 48 61 6e 64 6c 65 73 20 2a 2f 0a 73 74 61 74 69 Handles */.stati
4020: 63 20 76 6f 69 64 20 2a 63 61 63 6b 65 79 5f 62 c void *cackey_b
4030: 69 67 6c 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 73 iglock = NULL;.s
4040: 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63 tatic struct cac
4050: 6b 65 79 5f 73 65 73 73 69 6f 6e 20 63 61 63 6b key_session cack
4060: 65 79 5f 73 65 73 73 69 6f 6e 73 5b 31 32 38 5d ey_sessions[128]
4070: 3b 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 ;.static struct
4080: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 63 61 63 6b cackey_slot cack
4090: 65 79 5f 73 6c 6f 74 73 5b 31 32 38 5d 3b 0a 73 ey_slots[128];.s
40a0: 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 tatic int cackey
40b0: 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 _initialized = 0
40c0: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 ;.static int cac
40d0: 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 key_biglock_init
40e0: 20 3d 20 30 3b 0a 43 4b 5f 43 5f 49 4e 49 54 49 = 0;.CK_C_INITI
40f0: 41 4c 49 5a 45 5f 41 52 47 53 20 63 61 63 6b 65 ALIZE_ARGS cacke
4100: 79 5f 61 72 67 73 3b 0a 0a 2f 2a 20 50 43 53 43 y_args;../* PCSC
4110: 20 47 6c 6f 62 61 6c 20 48 61 6e 64 6c 65 73 20 Global Handles
4120: 2a 2f 0a 73 74 61 74 69 63 20 4c 50 53 43 41 52 */.static LPSCAR
4130: 44 43 4f 4e 54 45 58 54 20 63 61 63 6b 65 79 5f DCONTEXT cackey_
4140: 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 pcsc_handle = NU
4150: 4c 4c 3b 0a 0a 73 74 61 74 69 63 20 75 6e 73 69 LL;..static unsi
4160: 67 6e 65 64 20 6c 6f 6e 67 20 63 61 63 6b 65 79 gned long cackey
4170: 5f 67 65 74 76 65 72 73 69 6f 6e 28 76 6f 69 64 _getversion(void
4180: 29 20 7b 0a 09 73 74 61 74 69 63 20 75 6e 73 69 ) {..static unsi
4190: 67 6e 65 64 20 6c 6f 6e 67 20 72 65 74 76 61 6c gned long retval
41a0: 20 3d 20 32 35 35 3b 0a 09 75 6e 73 69 67 6e 65 = 255;..unsigne
41b0: 64 20 6c 6f 6e 67 20 6d 61 6a 6f 72 20 3d 20 30 d long major = 0
41c0: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 ;..unsigned long
41d0: 20 6d 69 6e 6f 72 20 3d 20 30 3b 0a 09 63 68 61 minor = 0;..cha
41e0: 72 20 2a 6d 61 6a 6f 72 5f 73 74 72 20 3d 20 4e r *major_str = N
41f0: 55 4c 4c 3b 0a 09 63 68 61 72 20 2a 6d 69 6e 6f ULL;..char *mino
4200: 72 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 r_str = NULL;...
4210: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
4220: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a NTF("Called.");.
4230: 0a 09 69 66 20 28 72 65 74 76 61 6c 20 21 3d 20 ..if (retval !=
4240: 32 35 35 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 255) {...CACKEY_
4250: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
4260: 74 75 72 6e 69 6e 67 20 30 78 25 6c 78 20 28 63 turning 0x%lx (c
4270: 61 63 68 65 64 29 2e 22 2c 20 72 65 74 76 61 6c ached).", retval
4280: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 72 65 74 );....return(ret
4290: 76 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65 74 76 61 val);..}...retva
42a0: 6c 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 50 l = 0;..#ifdef P
42b0: 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 0a 20 ACKAGE_VERSION.
42c0: 20 20 20 20 20 20 20 6d 61 6a 6f 72 5f 73 74 72 major_str
42d0: 20 3d 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 = PACKAGE_VERSI
42e0: 4f 4e 3b 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 73 ON;..if (major_s
42f0: 74 72 29 20 7b 0a 09 20 20 20 20 20 20 20 20 6d tr) {.. m
4300: 61 6a 6f 72 20 3d 20 73 74 72 74 6f 75 6c 28 6d ajor = strtoul(m
4310: 61 6a 6f 72 5f 73 74 72 2c 20 26 6d 69 6e 6f 72 ajor_str, &minor
4320: 5f 73 74 72 2c 20 31 30 29 3b 0a 0a 09 09 69 66 _str, 10);....if
4330: 20 28 6d 69 6e 6f 72 5f 73 74 72 29 20 7b 0a 09 (minor_str) {..
4340: 09 09 6d 69 6e 6f 72 20 3d 20 73 74 72 74 6f 75 ..minor = strtou
4350: 6c 28 6d 69 6e 6f 72 5f 73 74 72 20 2b 20 31 2c l(minor_str + 1,
4360: 20 4e 55 4c 4c 2c 20 31 30 29 3b 0a 09 09 7d 0a NULL, 10);...}.
4370: 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20 28 6d .}...retval = (m
4380: 61 6a 6f 72 20 3c 3c 20 31 36 29 20 7c 20 28 6d ajor << 16) | (m
4390: 69 6e 6f 72 20 3c 3c 20 38 29 3b 0a 23 65 6e 64 inor << 8);.#end
43a0: 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 if...CACKEY_DEBU
43b0: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
43c0: 69 6e 67 20 30 78 25 6c 78 22 2c 20 72 65 74 76 ing 0x%lx", retv
43d0: 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 al);...return(re
43e0: 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 20 50 43 2f tval);.}../* PC/
43f0: 53 43 20 52 65 6c 61 74 65 64 20 46 75 6e 63 74 SC Related Funct
4400: 69 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a 20 53 59 ions */./*. * SY
4410: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 76 6f NPOSIS. * vo
4420: 69 64 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f id cackey_slots_
4430: 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 76 disconnect_all(v
4440: 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 oid);. *. * ARGU
4450: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e MENTS. * Non
4460: 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 e. *. * RETURN V
4470: 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 ALUE. * None
4480: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 . *. * NOTES. *
4490: 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f This functio
44a0: 6e 20 64 69 73 63 6f 6e 6e 65 63 74 73 20 66 72 n disconnects fr
44b0: 6f 6d 20 61 6c 6c 20 63 61 72 64 73 2e 0a 20 2a om all cards.. *
44c0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 . */.static void
44d0: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 cackey_slots_di
44e0: 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 76 6f 69 sconnect_all(voi
44f0: 64 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69 d) {..uint32_t i
4500: 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 dx;...CACKEY_DEB
4510: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
4520: 64 2e 22 29 3b 0a 0a 09 66 6f 72 20 28 69 64 78 d.");...for (idx
4530: 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a = 0; idx < (siz
4540: 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 eof(cackey_slots
4550: 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 ) / sizeof(cacke
4560: 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69 64 y_slots[0])); id
4570: 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63 x++) {...if (cac
4580: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 key_slots[idx].p
4590: 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 csc_card_connect
45a0: 65 64 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f ed) {....CACKEY_
45b0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 DEBUG_PRINTF("SC
45c0: 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 25 6c ardDisconnect(%l
45d0: 75 29 20 63 61 6c 6c 65 64 22 2c 20 28 75 6e 73 u) called", (uns
45e0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 78 29 igned long) idx)
45f0: 3b 0a 0a 09 09 09 53 43 61 72 64 44 69 73 63 6f ;.....SCardDisco
4600: 6e 6e 65 63 74 28 63 61 63 6b 65 79 5f 73 6c 6f nnect(cackey_slo
4610: 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 63 61 72 ts[idx].pcsc_car
4620: 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 d, SCARD_LEAVE_C
4630: 41 52 44 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 ARD);...}....cac
4640: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 key_slots[idx].p
4650: 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 csc_card_connect
4660: 65 64 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 ed = 0;...cackey
4670: 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e _slots[idx].tran
4680: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 saction_depth =
4690: 30 3b 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 0;....if (cackey
46a0: 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 61 63 74 69 _slots[idx].acti
46b0: 76 65 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f ve) {....CACKEY_
46c0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 61 DEBUG_PRINTF("Ma
46d0: 72 6b 69 6e 67 20 61 63 74 69 76 65 20 73 6c 6f rking active slo
46e0: 74 20 25 6c 75 20 61 73 20 62 65 69 6e 67 20 72 t %lu as being r
46f0: 65 73 65 74 22 2c 20 28 75 6e 73 69 67 6e 65 64 eset", (unsigned
4700: 20 6c 6f 6e 67 29 20 69 64 78 29 3b 0a 09 09 7d long) idx);...}
4710: 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 ....cackey_slots
4720: 5b 69 64 78 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 [idx].slot_reset
4730: 20 3d 20 31 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 = 1;..}...CACKE
4740: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
4750: 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a 0a 09 72 Returning");...r
4760: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 eturn;.}../*. *
4770: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 SYNPOSIS. *
4780: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 cackey_ret cacke
4790: 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 76 y_pcsc_connect(v
47a0: 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 oid);. *. * ARGU
47b0: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e MENTS. * Non
47c0: 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 e. *. * RETURN V
47d0: 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b ALUE. * CACK
47e0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 EY_PCSC_S_OK
47f0: 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a On success.
4800: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 * CACKEY_PC
4810: 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 SC_E_GENERIC
4820: 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e On error. *. * N
4830: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 OTES. * This
4840: 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 6e 65 63 function connec
4850: 74 73 20 74 6f 20 74 68 65 20 50 43 2f 53 43 20 ts to the PC/SC
4860: 43 6f 6e 6e 65 63 74 69 6f 6e 20 4d 61 6e 61 67 Connection Manag
4870: 65 72 20 61 6e 64 20 75 70 64 61 74 65 73 20 74 er and updates t
4880: 68 65 0a 20 2a 20 20 20 20 20 67 6c 6f 62 61 6c he. * global
4890: 20 68 61 6e 64 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a handle.. *. */.
48a0: 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 static cackey_re
48b0: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f t cackey_pcsc_co
48c0: 6e 6e 65 63 74 28 76 6f 69 64 29 20 7b 0a 09 4c nnect(void) {..L
48d0: 4f 4e 47 20 73 63 61 72 64 5f 65 73 74 5f 63 6f ONG scard_est_co
48e0: 6e 74 65 78 74 5f 72 65 74 3b 0a 23 69 66 64 65 ntext_ret;.#ifde
48f0: 66 20 48 41 56 45 5f 53 43 41 52 44 49 53 56 41 f HAVE_SCARDISVA
4900: 4c 49 44 43 4f 4e 54 45 58 54 0a 09 4c 4f 4e 47 LIDCONTEXT..LONG
4910: 20 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 scard_isvalid_r
4920: 65 74 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 et;.#endif...CAC
4930: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
4940: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 ("Called.");...i
4950: 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 f (cackey_pcsc_h
4960: 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b andle == NULL) {
4970: 0a 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 ...cackey_pcsc_h
4980: 61 6e 64 6c 65 20 3d 20 6d 61 6c 6c 6f 63 28 73 andle = malloc(s
4990: 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f 70 63 izeof(*cackey_pc
49a0: 73 63 5f 68 61 6e 64 6c 65 29 29 3b 0a 09 09 69 sc_handle));...i
49b0: 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 f (cackey_pcsc_h
49c0: 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b andle == NULL) {
49d0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
49e0: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 20 74 6f _PRINTF("Call to
49f0: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 malloc() failed
4a00: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 , returning in f
4a10: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 63 61 ailure");.....ca
4a20: 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f ckey_slots_disco
4a30: 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 nnect_all();....
4a40: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 .return(CACKEY_P
4a50: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a CSC_E_GENERIC);.
4a60: 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 ..}....CACKEY_DE
4a70: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 BUG_PRINTF("SCar
4a80: 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 dEstablishContex
4a90: 74 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09 09 t() called");...
4aa0: 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 scard_est_contex
4ab0: 74 5f 72 65 74 20 3d 20 53 43 61 72 64 45 73 74 t_ret = SCardEst
4ac0: 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 53 43 ablishContext(SC
4ad0: 41 52 44 5f 53 43 4f 50 45 5f 53 59 53 54 45 4d ARD_SCOPE_SYSTEM
4ae0: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 63 61 , NULL, NULL, ca
4af0: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 ckey_pcsc_handle
4b00: 29 3b 0a 09 09 69 66 20 28 73 63 61 72 64 5f 65 );...if (scard_e
4b10: 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 21 st_context_ret !
4b20: 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 = SCARD_S_SUCCES
4b30: 53 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 S) {....CACKEY_D
4b40: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
4b50: 6c 20 74 6f 20 53 43 61 72 64 45 73 74 61 62 6c l to SCardEstabl
4b60: 69 73 68 43 6f 6e 74 65 78 74 20 66 61 69 6c 65 ishContext faile
4b70: 64 20 28 72 65 74 75 72 6e 65 64 20 25 73 2f 25 d (returned %s/%
4b80: 6c 69 29 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 li), returning i
4b90: 6e 20 66 61 69 6c 75 72 65 22 2c 20 43 41 43 4b n failure", CACK
4ba0: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 EY_DEBUG_FUNC_SC
4bb0: 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 ARDERR_TO_STR(sc
4bc0: 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f ard_est_context_
4bd0: 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 ret), (long) sca
4be0: 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 rd_est_context_r
4bf0: 65 74 29 3b 0a 0a 09 09 09 66 72 65 65 28 63 61 et);.....free(ca
4c00: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 ckey_pcsc_handle
4c10: 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 70 63 73 );....cackey_pcs
4c20: 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b c_handle = NULL;
4c30: 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 .....cackey_slot
4c40: 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c s_disconnect_all
4c50: 28 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 ();.....return(C
4c60: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e ACKEY_PCSC_E_GEN
4c70: 45 52 49 43 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 ERIC);...}..}..#
4c80: 69 66 64 65 66 20 48 41 56 45 5f 53 43 41 52 44 ifdef HAVE_SCARD
4c90: 49 53 56 41 4c 49 44 43 4f 4e 54 45 58 54 0a 09 ISVALIDCONTEXT..
4ca0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
4cb0: 4e 54 46 28 22 53 43 61 72 64 49 73 56 61 6c 69 NTF("SCardIsVali
4cc0: 64 43 6f 6e 74 65 78 74 28 29 20 63 61 6c 6c 65 dContext() calle
4cd0: 64 22 29 3b 0a 09 73 63 61 72 64 5f 69 73 76 61 d");..scard_isva
4ce0: 6c 69 64 5f 72 65 74 20 3d 20 53 43 61 72 64 49 lid_ret = SCardI
4cf0: 73 56 61 6c 69 64 43 6f 6e 74 65 78 74 28 2a 63 sValidContext(*c
4d00: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c ackey_pcsc_handl
4d10: 65 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 69 e);..if (scard_i
4d20: 73 76 61 6c 69 64 5f 72 65 74 20 21 3d 20 53 43 svalid_ret != SC
4d30: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b ARD_S_SUCCESS) {
4d40: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
4d50: 50 52 49 4e 54 46 28 22 48 61 6e 64 6c 65 20 68 PRINTF("Handle h
4d60: 61 73 20 62 65 63 6f 6d 65 20 69 6e 76 61 6c 69 as become invali
4d70: 64 20 28 53 43 61 72 64 49 73 56 61 6c 69 64 43 d (SCardIsValidC
4d80: 6f 6e 74 65 78 74 20 3d 20 25 73 2f 25 6c 69 29 ontext = %s/%li)
4d90: 2c 20 74 72 79 69 6e 67 20 74 6f 20 72 65 2d 65 , trying to re-e
4da0: 73 74 61 62 6c 69 73 68 2e 2e 2e 22 2c 20 43 41 stablish...", CA
4db0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f CKEY_DEBUG_FUNC_
4dc0: 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 SCARDERR_TO_STR(
4dd0: 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 scard_isvalid_re
4de0: 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 t), (long) scard
4df0: 5f 69 73 76 61 6c 69 64 5f 72 65 74 29 3b 0a 0a _isvalid_ret);..
4e00: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
4e10: 52 49 4e 54 46 28 22 53 43 61 72 64 45 73 74 61 RINTF("SCardEsta
4e20: 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 29 20 63 blishContext() c
4e30: 61 6c 6c 65 64 22 29 3b 0a 09 09 73 63 61 72 64 alled");...scard
4e40: 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 _est_context_ret
4e50: 20 3d 20 53 43 61 72 64 45 73 74 61 62 6c 69 73 = SCardEstablis
4e60: 68 43 6f 6e 74 65 78 74 28 53 43 41 52 44 5f 53 hContext(SCARD_S
4e70: 43 4f 50 45 5f 53 59 53 54 45 4d 2c 20 4e 55 4c COPE_SYSTEM, NUL
4e80: 4c 2c 20 4e 55 4c 4c 2c 20 63 61 63 6b 65 79 5f L, NULL, cackey_
4e90: 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 pcsc_handle);...
4ea0: 69 66 20 28 73 63 61 72 64 5f 65 73 74 5f 63 6f if (scard_est_co
4eb0: 6e 74 65 78 74 5f 72 65 74 20 21 3d 20 53 43 41 ntext_ret != SCA
4ec0: 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a RD_S_SUCCESS) {.
4ed0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
4ee0: 50 52 49 4e 54 46 28 22 43 61 6c 6c 20 74 6f 20 PRINTF("Call to
4ef0: 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f SCardEstablishCo
4f00: 6e 74 65 78 74 20 66 61 69 6c 65 64 20 28 72 65 ntext failed (re
4f10: 74 75 72 6e 65 64 20 25 73 2f 25 6c 69 29 2c 20 turned %s/%li),
4f20: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 returning in fai
4f30: 6c 75 72 65 22 2c 20 43 41 43 4b 45 59 5f 44 45 lure", CACKEY_DE
4f40: 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 BUG_FUNC_SCARDER
4f50: 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 65 R_TO_STR(scard_e
4f60: 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 2c st_context_ret),
4f70: 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 65 73 (long) scard_es
4f80: 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 3b 0a t_context_ret);.
4f90: 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f ....free(cackey_
4fa0: 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 pcsc_handle);...
4fb0: 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e .cackey_pcsc_han
4fc0: 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 dle = NULL;.....
4fd0: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 cackey_slots_dis
4fe0: 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a connect_all();..
4ff0: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 ...return(CACKEY
5000: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 _PCSC_E_GENERIC)
5010: 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f ;...}....CACKEY_
5020: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 48 61 DEBUG_PRINTF("Ha
5030: 6e 64 6c 65 20 68 61 73 20 62 65 65 6e 20 72 65 ndle has been re
5040: 2d 65 73 74 61 62 6c 69 73 68 65 64 22 29 3b 0a -established");.
5050: 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b .}.#endif...CACK
5060: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
5070: 22 53 75 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e "Sucessfully con
5080: 6e 65 63 74 65 64 20 74 6f 20 50 43 2f 53 43 2c nected to PC/SC,
5090: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 returning in su
50a0: 63 63 65 73 73 22 29 3b 0a 0a 09 72 65 74 75 72 ccess");...retur
50b0: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f n(CACKEY_PCSC_S_
50c0: 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 OK);.}../*. * SY
50d0: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 NPOSIS. * ca
50e0: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f ckey_ret cackey_
50f0: 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 pcsc_disconnect(
5100: 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 void);. *. * ARG
5110: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f UMENTS. * No
5120: 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 ne. *. * RETURN
5130: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 VALUE. * CAC
5140: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 KEY_PCSC_S_OK
5150: 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 On success
5160: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 . * CACKEY_P
5170: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 CSC_E_GENERIC
5180: 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 On error. *. *
5190: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 NOTES. * Thi
51a0: 73 20 66 75 6e 63 74 69 6f 6e 20 64 69 73 63 6f s function disco
51b0: 6e 6e 65 63 74 73 20 66 72 6f 6d 20 74 68 65 20 nnects from the
51c0: 50 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e PC/SC Connection
51d0: 20 6d 61 6e 61 67 65 72 20 61 6e 64 20 75 70 64 manager and upd
51e0: 61 74 65 73 0a 20 2a 20 20 20 20 20 74 68 65 20 ates. * the
51f0: 67 6c 6f 62 61 6c 20 68 61 6e 64 6c 65 2e 0a 20 global handle..
5200: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 *. */.static cac
5210: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 70 key_ret cackey_p
5220: 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 76 csc_disconnect(v
5230: 6f 69 64 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 oid) {..LONG sca
5240: 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72 rd_rel_context_r
5250: 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 et;...CACKEY_DEB
5260: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
5270: 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b d.");...if (cack
5280: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d ey_pcsc_handle =
5290: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 = NULL) {...retu
52a0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 rn(CACKEY_PCSC_S
52b0: 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 63 61 72 64 _OK);..}...scard
52c0: 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72 65 74 _rel_context_ret
52d0: 20 3d 20 53 43 61 72 64 52 65 6c 65 61 73 65 43 = SCardReleaseC
52e0: 6f 6e 74 65 78 74 28 2a 63 61 63 6b 65 79 5f 70 ontext(*cackey_p
52f0: 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 0a 09 69 csc_handle);...i
5300: 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 f (cackey_pcsc_h
5310: 61 6e 64 6c 65 29 20 7b 0a 09 09 66 72 65 65 28 andle) {...free(
5320: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 cackey_pcsc_hand
5330: 6c 65 29 3b 0a 09 0a 09 09 63 61 63 6b 65 79 5f le);.....cackey_
5340: 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 pcsc_handle = NU
5350: 4c 4c 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 63 61 LL;..}...if (sca
5360: 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72 rd_rel_context_r
5370: 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 et != SCARD_S_SU
5380: 43 43 45 53 53 29 20 7b 0a 09 09 72 65 74 75 72 CCESS) {...retur
5390: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f n(CACKEY_PCSC_E_
53a0: 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 72 GENERIC);..}...r
53b0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 eturn(CACKEY_PCS
53c0: 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 C_S_OK);.}../*.
53d0: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 * SYNPOSIS. *
53e0: 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 cackey_ret cac
53f0: 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 key_connect_card
5400: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 (struct cackey_s
5410: 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 lot *slot);. *.
5420: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 * ARGUMENTS. *
5430: 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a cackey_slot *
5440: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 slot. *
5450: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d Slot to send com
5460: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 mands to. *. * R
5470: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 ETURN VALUE. *
5480: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 CACKEY_PCSC_S
5490: 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 _OK On s
54a0: 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 uccess. * CA
54b0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 CKEY_PCSC_E_GENE
54c0: 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a RIC On error.
54d0: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 *. * NOTES. *
54e0: 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 None. *. */.s
54f0: 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 tatic cackey_ret
5500: 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f cackey_connect_
5510: 63 61 72 64 28 73 74 72 75 63 74 20 63 61 63 6b card(struct cack
5520: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b ey_slot *slot) {
5530: 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 70 63 73 ..cackey_ret pcs
5540: 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 c_connect_ret;..
5550: 44 57 4f 52 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a DWORD protocol;.
5560: 09 4c 4f 4e 47 20 73 63 61 72 64 5f 63 6f 6e 6e .LONG scard_conn
5570: 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 _ret;...CACKEY_D
5580: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
5590: 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 led.");...if (!s
55a0: 6c 6f 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f lot) {...CACKEY_
55b0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e DEBUG_PRINTF("In
55c0: 76 61 6c 69 64 20 73 6c 6f 74 20 73 70 65 63 69 valid slot speci
55d0: 66 69 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 fied, returning
55e0: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 in failure");...
55f0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 .return(CACKEY_P
5600: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a CSC_E_GENERIC);.
5610: 09 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 .}...pcsc_connec
5620: 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70 t_ret = cackey_p
5630: 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 csc_connect();..
5640: 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 if (pcsc_connect
5650: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 _ret != CACKEY_P
5660: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 CSC_S_OK) {...CA
5670: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
5680: 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f F("Connection to
5690: 20 50 43 2f 53 43 20 66 61 69 6c 65 64 2c 20 72 PC/SC failed, r
56a0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c eturning in fail
56b0: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ure");....return
56c0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 (CACKEY_PCSC_E_G
56d0: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a ENERIC);..}.../*
56e0: 20 43 6f 6e 6e 65 63 74 20 74 6f 20 72 65 61 64 Connect to read
56f0: 65 72 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f er, if needed */
5700: 0a 09 69 66 20 28 21 73 6c 6f 74 2d 3e 70 63 73 ..if (!slot->pcs
5710: 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 c_card_connected
5720: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
5730: 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 UG_PRINTF("SCard
5740: 43 6f 6e 6e 65 63 74 28 25 73 29 20 63 61 6c 6c Connect(%s) call
5750: 65 64 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f ed", slot->pcsc_
5760: 72 65 61 64 65 72 29 3b 0a 09 09 73 63 61 72 64 reader);...scard
5770: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 _conn_ret = SCar
5780: 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 dConnect(*cackey
5790: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c _pcsc_handle, sl
57a0: 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c ot->pcsc_reader,
57b0: 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 SCARD_SHARE_SHA
57c0: 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f RED, SCARD_PROTO
57d0: 43 4f 4c 5f 54 30 2c 20 26 73 6c 6f 74 2d 3e 70 COL_T0, &slot->p
57e0: 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f csc_card, &proto
57f0: 63 6f 6c 29 3b 0a 0a 09 09 69 66 20 28 73 63 61 col);....if (sca
5800: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 21 3d 20 53 rd_conn_ret != S
5810: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 CARD_S_SUCCESS)
5820: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {....CACKEY_DEBU
5830: 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63 G_PRINTF("Connec
5840: 74 69 6f 6e 20 74 6f 20 63 61 72 64 20 66 61 69 tion to card fai
5850: 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 led, returning i
5860: 6e 20 66 61 69 6c 75 72 65 20 28 53 43 61 72 64 n failure (SCard
5870: 43 6f 6e 6e 65 63 74 28 29 20 3d 20 25 73 2f 25 Connect() = %s/%
5880: 6c 69 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 li)", CACKEY_DEB
5890: 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 UG_FUNC_SCARDERR
58a0: 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 63 6f _TO_STR(scard_co
58b0: 6e 6e 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 nn_ret), (long)
58c0: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 29 3b scard_conn_ret);
58d0: 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b .....return(CACK
58e0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 EY_PCSC_E_GENERI
58f0: 43 29 3b 0a 09 09 7d 0a 0a 09 09 73 6c 6f 74 2d C);...}....slot-
5900: 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 >pcsc_card_conne
5910: 63 74 65 64 20 3d 20 31 3b 0a 09 09 73 6c 6f 74 cted = 1;...slot
5920: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 ->transaction_de
5930: 70 74 68 20 3d 20 30 3b 0a 09 7d 0a 0a 09 72 65 pth = 0;..}...re
5940: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 turn(CACKEY_PCSC
5950: 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a _S_OK);.}../*. *
5960: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 SYNPOSIS. *
5970: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b cackey_ret cack
5980: 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 ey_begin_transac
5990: 74 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b tion(struct cack
59a0: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a ey_slot *slot);.
59b0: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a *. * ARGUMENTS.
59c0: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c * cackey_sl
59d0: 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 ot *slot. *
59e0: 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 Slot to send
59f0: 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a commands to. *.
5a00: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a * RETURN VALUE.
5a10: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 * CACKEY_PC
5a20: 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 SC_S_OK
5a30: 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 On success. *
5a40: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f CACKEY_PCSC_E_
5a50: 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 GENERIC On er
5a60: 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a ror. *. * NOTES.
5a70: 20 2a 20 20 20 20 20 54 68 65 20 74 72 61 6e 73 * The trans
5a80: 61 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 action should be
5a90: 20 74 65 72 6d 69 6e 61 74 65 64 20 75 73 69 6e terminated usin
5aa0: 67 20 22 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 g "cackey_end_tr
5ab0: 61 6e 73 61 63 74 69 6f 6e 22 0a 20 2a 0a 20 2a ansaction". *. *
5ac0: 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f /.static cackey_
5ad0: 72 65 74 20 63 61 63 6b 65 79 5f 62 65 67 69 6e ret cackey_begin
5ae0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 _transaction(str
5af0: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 uct cackey_slot
5b00: 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79 *slot) {..cackey
5b10: 5f 72 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e _ret cackey_conn
5b20: 5f 72 65 74 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 _ret;..LONG scar
5b30: 64 5f 74 72 61 6e 73 5f 72 65 74 3b 0a 0a 09 43 d_trans_ret;...C
5b40: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
5b50: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
5b60: 09 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74 .cackey_conn_ret
5b70: 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 = cackey_connec
5b80: 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69 t_card(slot);..i
5b90: 66 20 28 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 f (cackey_conn_r
5ba0: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 et != CACKEY_PCS
5bb0: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b C_S_OK) {...CACK
5bc0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
5bd0: 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 "Unable to conne
5be0: 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75 ct to card, retu
5bf0: 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29 rning in error")
5c00: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b ;....return(CACK
5c10: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 EY_PCSC_E_GENERI
5c20: 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 C);..}...slot->t
5c30: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 ransaction_depth
5c40: 2b 2b 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e ++;...if (slot->
5c50: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 transaction_dept
5c60: 68 20 3e 20 31 29 20 7b 0a 09 09 43 41 43 4b 45 h > 1) {...CACKE
5c70: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
5c80: 41 6c 72 65 61 64 79 20 69 6e 20 61 20 74 72 61 Already in a tra
5c90: 6e 73 61 63 74 69 6f 6e 2c 20 70 65 72 66 6f 72 nsaction, perfor
5ca0: 6d 69 6e 67 20 6e 6f 20 61 63 74 69 6f 6e 20 28 ming no action (
5cb0: 6e 65 77 20 64 65 70 74 68 20 3d 20 25 69 29 22 new depth = %i)"
5cc0: 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 , slot->transact
5cd0: 69 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a 09 09 72 ion_depth);....r
5ce0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 eturn(CACKEY_PCS
5cf0: 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 63 C_S_OK);..}...sc
5d00: 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 20 3d 20 ard_trans_ret =
5d10: 53 43 61 72 64 42 65 67 69 6e 54 72 61 6e 73 61 SCardBeginTransa
5d20: 63 74 69 6f 6e 28 73 6c 6f 74 2d 3e 70 63 73 63 ction(slot->pcsc
5d30: 5f 63 61 72 64 29 3b 0a 09 69 66 20 28 73 63 61 _card);..if (sca
5d40: 72 64 5f 74 72 61 6e 73 5f 72 65 74 20 21 3d 20 rd_trans_ret !=
5d50: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 SCARD_S_SUCCESS)
5d60: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
5d70: 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 G_PRINTF("Unable
5d80: 20 74 6f 20 62 65 67 69 6e 20 74 72 61 6e 73 61 to begin transa
5d90: 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e 69 6e 67 ction, returning
5da0: 20 69 6e 20 65 72 72 6f 72 22 29 3b 0a 0a 09 09 in error");....
5db0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 return(CACKEY_PC
5dc0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 SC_E_GENERIC);..
5dd0: 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 }...CACKEY_DEBUG
5de0: 5f 50 52 49 4e 54 46 28 22 53 75 63 65 73 73 66 _PRINTF("Sucessf
5df0: 75 6c 6c 79 20 62 65 67 61 6e 20 74 72 61 6e 73 ully began trans
5e00: 61 63 74 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28 action on slot (
5e10: 25 73 29 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 %s)", slot->pcsc
5e20: 5f 72 65 61 64 65 72 29 3b 0a 0a 09 72 65 74 75 _reader);...retu
5e30: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 rn(CACKEY_PCSC_S
5e40: 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 _OK);.}../*. * S
5e50: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 YNPOSIS. * c
5e60: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 ackey_ret cackey
5e70: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e _end_transaction
5e80: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 (struct cackey_s
5e90: 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 lot *slot);. *.
5ea0: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 * ARGUMENTS. *
5eb0: 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a cackey_slot *
5ec0: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 slot. *
5ed0: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d Slot to send com
5ee0: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 mands to. *. * R
5ef0: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 ETURN VALUE. *
5f00: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 CACKEY_PCSC_S
5f10: 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 _OK On s
5f20: 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 uccess. * CA
5f30: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 CKEY_PCSC_E_GENE
5f40: 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a RIC On error.
5f50: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 *. * NOTES. *
5f60: 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e This function
5f70: 20 72 65 71 75 69 72 65 73 20 22 63 61 63 6b 65 requires "cacke
5f80: 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 y_begin_transact
5f90: 69 6f 6e 22 20 74 6f 20 62 65 20 63 61 6c 6c 65 ion" to be calle
5fa0: 64 20 66 69 72 73 74 0a 20 2a 0a 20 2a 2f 0a 73 d first. *. */.s
5fb0: 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 tatic cackey_ret
5fc0: 20 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e cackey_end_tran
5fd0: 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20 63 saction(struct c
5fe0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 ackey_slot *slot
5ff0: 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f ) {..LONG scard_
6000: 74 72 61 6e 73 5f 72 65 74 3b 0a 0a 09 43 41 43 trans_ret;...CAC
6010: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
6020: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 ("Called.");...i
6030: 66 20 28 21 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 f (!slot->pcsc_c
6040: 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b ard_connected) {
6050: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
6060: 50 52 49 4e 54 46 28 22 43 61 72 64 20 69 73 20 PRINTF("Card is
6070: 6e 6f 74 20 63 6f 6e 6e 65 63 74 65 64 2c 20 75 not connected, u
6080: 6e 61 62 6c 65 20 74 6f 20 65 6e 64 20 74 72 61 nable to end tra
6090: 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 0a 09 09 72 nsaction");....r
60a0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 eturn(CACKEY_PCS
60b0: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d C_E_GENERIC);..}
60c0: 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 ...if (slot->tra
60d0: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d nsaction_depth =
60e0: 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f = 0) {...CACKEY_
60f0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 65 DEBUG_PRINTF("Te
6100: 72 6d 69 6e 61 74 69 6e 67 20 61 20 74 72 61 6e rminating a tran
6110: 73 61 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73 saction that has
6120: 20 6e 6f 74 20 62 65 67 75 6e 21 22 29 3b 0a 0a not begun!");..
6130: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f ..return(CACKEY_
6140: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b PCSC_E_GENERIC);
6150: 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e ..}...slot->tran
6160: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b saction_depth--;
6170: 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 ...if (slot->tra
6180: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e nsaction_depth >
6190: 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 0) {...CACKEY_D
61a0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 72 61 EBUG_PRINTF("Tra
61b0: 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 nsactions still
61c0: 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 6e 6f 74 in progress, not
61d0: 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6f 6e 2d terminating on-
61e0: 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e card Transaction
61f0: 20 28 63 75 72 72 65 6e 74 20 64 65 70 74 68 20 (current depth
6200: 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72 = %i)", slot->tr
6210: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 29 ansaction_depth)
6220: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b ;....return(CACK
6230: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 EY_PCSC_E_GENERI
6240: 43 29 3b 0a 09 7d 0a 0a 09 73 63 61 72 64 5f 74 C);..}...scard_t
6250: 72 61 6e 73 5f 72 65 74 20 3d 20 53 43 61 72 64 rans_ret = SCard
6260: 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 73 EndTransaction(s
6270: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 lot->pcsc_card,
6280: 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 SCARD_LEAVE_CARD
6290: 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 74 72 );..if (scard_tr
62a0: 61 6e 73 5f 72 65 74 20 21 3d 20 53 43 41 52 44 ans_ret != SCARD
62b0: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 _S_SUCCESS) {...
62c0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
62d0: 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 65 NTF("Unable to e
62e0: 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 nd transaction,
62f0: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 returning in err
6300: 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 or");....return(
6310: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 CACKEY_PCSC_E_GE
6320: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 NERIC);..}...CAC
6330: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
6340: 28 22 53 75 63 65 73 73 66 75 6c 6c 79 20 74 65 ("Sucessfully te
6350: 72 6d 69 6e 61 74 65 64 20 74 72 61 6e 73 61 63 rminated transac
6360: 74 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28 25 73 tion on slot (%s
6370: 29 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 )", slot->pcsc_r
6380: 65 61 64 65 72 29 3b 0a 0a 09 72 65 74 75 72 6e eader);...return
6390: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f (CACKEY_PCSC_S_O
63a0: 4b 29 3b 0a 7d 0a 0a 2f 2a 20 41 50 44 55 20 52 K);.}../* APDU R
63b0: 65 6c 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 73 elated Functions
63c0: 20 2a 2f 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 */./*. * SYNPOS
63d0: 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 IS. * cackey
63e0: 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6e 64 _ret cackey_send
63f0: 5f 61 70 64 75 28 73 74 72 75 63 74 20 63 61 63 _apdu(struct cac
6400: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 key_slot *slot,
6410: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6c unsigned char cl
6420: 61 73 73 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 ass, unsigned ch
6430: 61 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 ar instruction,
6440: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 31 unsigned char p1
6450: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 , unsigned char
6460: 70 32 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 p2, unsigned cha
6470: 72 20 6c 63 2c 20 75 6e 73 69 67 6e 65 64 20 63 r lc, unsigned c
6480: 68 61 72 20 2a 64 61 74 61 2c 20 75 6e 73 69 67 har *data, unsig
6490: 6e 65 64 20 63 68 61 72 20 6c 65 2c 20 75 69 6e ned char le, uin
64a0: 74 31 36 5f 74 20 2a 72 65 73 70 63 6f 64 65 2c t16_t *respcode,
64b0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
64c0: 72 65 73 70 64 61 74 61 2c 20 73 69 7a 65 5f 74 respdata, size_t
64d0: 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b *respdata_len);
64e0: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 . *. * ARGUMENTS
64f0: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 . * cackey_s
6500: 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 lot *slot. *
6510: 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e Slot to sen
6520: 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a d commands to. *
6530: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 . * unsigned
6540: 20 63 68 61 72 20 63 6c 61 73 73 0a 20 2a 20 20 char class. *
6550: 20 20 20 20 20 20 20 41 50 44 55 20 43 6c 61 73 APDU Clas
6560: 73 20 28 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 s (GSCIS_CLASS_I
6570: 53 4f 37 38 31 36 20 6f 72 20 47 53 43 49 53 5f SO7816 or GSCIS_
6580: 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 CLASS_GLOBAL_PLA
6590: 54 46 4f 52 4d 0a 20 2a 20 20 20 20 20 20 20 20 TFORM. *
65a0: 20 75 73 75 61 6c 6c 79 29 2c 20 28 43 4c 41 29 usually), (CLA)
65b0: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 . *. * unsig
65c0: 6e 65 64 20 63 68 61 72 20 69 6e 73 74 72 75 63 ned char instruc
65d0: 74 69 6f 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 tion. *
65e0: 41 50 44 55 20 49 6e 73 74 72 75 63 74 69 6f 6e APDU Instruction
65f0: 20 28 49 4e 53 29 0a 20 2a 0a 20 2a 20 20 20 20 (INS). *. *
6600: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 unsigned char p
6610: 31 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 1. * APD
6620: 55 20 50 61 72 61 6d 65 74 65 72 20 31 20 28 50 U Parameter 1 (P
6630: 31 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 1). *. * uns
6640: 69 67 6e 65 64 20 63 68 61 72 20 70 32 0a 20 2a igned char p2. *
6650: 20 20 20 20 20 20 20 20 20 41 50 44 55 20 50 61 APDU Pa
6660: 72 61 6d 65 74 65 72 20 32 20 28 50 32 29 0a 20 rameter 2 (P2).
6670: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 *. * unsigne
6680: 64 20 63 68 61 72 20 6c 63 0a 20 2a 20 20 20 20 d char lc. *
6690: 20 20 20 20 20 41 50 44 55 20 4c 65 6e 67 74 68 APDU Length
66a0: 20 6f 66 20 43 6f 6e 74 65 6e 74 20 28 4c 63 29 of Content (Lc)
66b0: 20 2d 2d 20 74 68 69 73 20 69 73 20 74 68 65 20 -- this is the
66c0: 6c 65 6e 67 74 68 20 6f 66 20 22 64 61 74 61 22 length of "data"
66d0: 0a 20 2a 20 20 20 20 20 20 20 20 20 70 61 72 61 . * para
66e0: 6d 65 74 65 72 2e 20 20 49 66 20 22 64 61 74 61 meter. If "data
66f0: 22 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61 " is specified a
6700: 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20 70 61 72 s NULL, this par
6710: 61 6d 65 74 65 72 20 77 69 6c 6c 0a 20 2a 20 20 ameter will. *
6720: 20 20 20 20 20 20 20 62 65 20 69 67 6e 6f 72 65 be ignore
6730: 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 d.. *. * uns
6740: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 igned char *data
6750: 0a 20 2a 20 20 20 20 20 20 20 20 20 50 6f 69 6e . * Poin
6760: 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 74 6f ter to buffer to
6770: 20 73 65 6e 64 2e 20 20 49 74 20 73 68 6f 75 6c send. It shoul
6780: 64 20 62 65 20 22 4c 63 22 20 62 79 74 65 73 20 d be "Lc" bytes
6790: 6c 6f 6e 67 2e 20 20 49 66 0a 20 2a 20 20 20 20 long. If. *
67a0: 20 20 20 20 20 73 70 65 63 69 66 69 65 64 20 61 specified a
67b0: 73 20 4e 55 4c 4c 2c 20 22 4c 63 22 20 77 69 6c s NULL, "Lc" wil
67c0: 6c 20 6e 6f 74 20 62 65 20 73 65 6e 74 2c 20 61 l not be sent, a
67d0: 6e 64 20 74 68 69 73 20 62 75 66 66 65 72 20 77 nd this buffer w
67e0: 69 6c 6c 20 62 65 0a 20 2a 20 20 20 20 20 20 20 ill be. *
67f0: 20 20 69 67 6e 6f 72 65 64 2e 0a 20 2a 0a 20 2a ignored.. *. *
6800: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 unsigned ch
6810: 61 72 20 6c 65 0a 20 2a 20 20 20 20 20 20 20 20 ar le. *
6820: 20 41 50 44 55 20 4c 65 6e 67 74 68 20 6f 66 20 APDU Length of
6830: 45 78 70 65 63 74 61 74 69 6f 6e 20 28 4c 65 29 Expectation (Le)
6840: 20 2d 2d 20 74 68 69 73 20 69 73 20 74 68 65 20 -- this is the
6850: 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 0a 20 2a length of the. *
6860: 20 20 20 20 20 20 20 20 20 65 78 70 65 63 74 65 expecte
6870: 64 20 72 65 70 6c 79 2e 20 20 49 66 20 74 68 69 d reply. If thi
6880: 73 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61 s is specified a
6890: 73 20 30 20 74 68 65 6e 20 69 74 20 77 69 6c 6c s 0 then it will
68a0: 20 6e 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 not. *
68b0: 62 65 20 73 65 6e 74 2e 0a 20 2a 0a 20 2a 20 20 be sent.. *. *
68c0: 20 20 20 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 uint16_t *res
68d0: 70 63 6f 64 65 0a 20 2a 20 20 20 20 20 20 20 20 pcode. *
68e0: 20 5b 4f 55 54 5d 20 50 6f 69 6e 74 65 72 20 74 [OUT] Pointer t
68f0: 6f 20 73 74 6f 72 61 67 65 20 6f 66 20 41 50 44 o storage of APD
6900: 55 20 72 65 73 70 6f 6e 73 65 20 63 6f 64 65 2e U response code.
6910: 20 20 49 66 20 74 68 69 73 20 69 73 0a 20 2a 20 If this is. *
6920: 20 20 20 20 20 20 20 20 73 70 65 63 69 66 69 65 specifie
6930: 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 d as NULL, the r
6940: 65 73 70 6f 6e 73 65 20 63 6f 64 65 20 77 69 6c esponse code wil
6950: 6c 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a l be discarded..
6960: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e *. * unsign
6970: 65 64 20 63 68 61 72 20 2a 72 65 73 70 64 61 74 ed char *respdat
6980: 61 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 a. * [OU
6990: 54 5d 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74 T] Pointer to st
69a0: 6f 72 61 67 65 20 6f 66 20 41 50 44 55 20 72 65 orage of APDU re
69b0: 73 70 6f 6e 73 65 20 64 61 74 61 2e 20 20 49 66 sponse data. If
69c0: 20 74 68 69 73 20 69 73 0a 20 2a 20 20 20 20 20 this is. *
69d0: 20 20 20 20 73 70 65 63 69 66 69 65 64 20 61 73 specified as
69e0: 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 70 6f NULL, the respo
69f0: 6e 73 65 20 64 61 74 61 20 77 69 6c 6c 20 62 65 nse data will be
6a00: 20 64 69 73 63 61 72 64 65 64 2e 20 20 49 66 0a discarded. If.
6a10: 20 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 22 * the "
6a20: 72 65 73 70 64 61 74 61 5f 6c 65 6e 22 20 70 61 respdata_len" pa
6a30: 72 61 6d 65 74 65 72 20 69 73 20 73 70 65 63 69 rameter is speci
6a40: 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68 fied as NULL, th
6a50: 69 73 20 62 75 66 66 65 72 0a 20 2a 20 20 20 20 is buffer. *
6a60: 20 20 20 20 20 77 69 6c 6c 20 6e 6f 74 20 62 65 will not be
6a70: 20 75 70 64 61 74 65 64 2e 0a 20 2a 0a 20 2a 20 updated.. *. *
6a80: 20 20 20 20 73 69 7a 65 5f 74 20 2a 72 65 73 70 size_t *resp
6a90: 64 61 74 61 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 data_len. *
6aa0: 20 20 20 20 5b 49 4e 2c 20 4f 55 54 5d 20 50 6f [IN, OUT] Po
6ab0: 69 6e 74 65 72 20 69 6e 69 74 69 61 6c 69 6e 67 inter initialing
6ac0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 containing the
6ad0: 73 69 7a 65 20 6f 66 20 74 68 65 20 22 72 65 73 size of the "res
6ae0: 70 64 61 74 61 22 0a 20 2a 20 20 20 20 20 20 20 pdata". *
6af0: 20 20 62 75 66 66 65 72 2e 20 20 42 65 66 6f 72 buffer. Befor
6b00: 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 74 68 65 e returning, the
6b10: 20 70 6f 69 6e 74 65 64 20 74 6f 20 76 61 6c 75 pointed to valu
6b20: 65 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 e is updated to
6b30: 74 68 65 0a 20 2a 20 20 20 20 20 20 20 20 20 6e the. * n
6b40: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 umber of bytes w
6b50: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 62 75 ritten to the bu
6b60: 66 66 65 72 2e 20 20 49 66 20 74 68 69 73 20 69 ffer. If this i
6b70: 73 20 73 70 65 63 69 66 69 65 64 20 61 73 0a 20 s specified as.
6b80: 2a 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 * NULL,
6b90: 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 it will not be u
6ba0: 70 64 61 74 65 64 2c 20 61 6e 64 20 22 72 65 73 pdated, and "res
6bb0: 70 64 61 74 61 22 20 77 69 6c 6c 20 62 65 20 69 pdata" will be i
6bc0: 67 6e 6f 72 65 64 20 63 61 75 73 69 6e 67 0a 20 gnored causing.
6bd0: 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 72 65 * the re
6be0: 73 70 6f 6e 73 65 20 64 61 74 61 20 74 6f 20 62 sponse data to b
6bf0: 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20 2a 0a e discarded.. *.
6c00: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a * RETURN VALUE.
6c10: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 * CACKEY_PC
6c20: 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 SC_S_OK
6c30: 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 On success. *
6c40: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f CACKEY_PCSC_E_
6c50: 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 GENERIC On er
6c60: 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a ror. *. * NOTES.
6c70: 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 * This func
6c80: 74 69 6f 6e 20 77 69 6c 6c 20 63 6f 6e 6e 65 63 tion will connec
6c90: 74 20 74 6f 20 74 68 65 20 50 43 2f 53 43 20 43 t to the PC/SC C
6ca0: 6f 6e 6e 65 63 74 69 6f 6e 20 4d 61 6e 61 67 65 onnection Manage
6cb0: 72 20 76 69 61 0a 20 2a 20 20 20 20 20 63 61 63 r via. * cac
6cc0: 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 key_pcsc_connect
6cd0: 28 29 20 69 66 20 6e 65 65 64 65 64 2e 0a 20 2a () if needed.. *
6ce0: 0a 20 2a 20 20 20 20 20 49 74 20 77 69 6c 6c 20 . * It will
6cf0: 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20 63 connect to the c
6d00: 61 72 64 20 69 6e 20 74 68 65 20 72 65 61 64 65 ard in the reade
6d10: 72 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 r attached to th
6d20: 65 20 73 6c 6f 74 0a 20 2a 20 20 20 20 20 73 70 e slot. * sp
6d30: 65 63 69 66 69 65 64 2e 20 20 49 74 20 77 69 6c ecified. It wil
6d40: 6c 20 72 65 63 6f 6e 6e 65 63 74 20 74 6f 20 74 l reconnect to t
6d50: 68 65 20 63 61 72 64 20 69 66 20 74 68 65 20 63 he card if the c
6d60: 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 20 20 20 20 onnection. *
6d70: 20 67 6f 65 73 20 61 77 61 79 2e 0a 20 2a 0a 20 goes away.. *.
6d80: 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 */.static cackey
6d90: 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6e 64 _ret cackey_send
6da0: 5f 61 70 64 75 28 73 74 72 75 63 74 20 63 61 63 _apdu(struct cac
6db0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 key_slot *slot,
6dc0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6c unsigned char cl
6dd0: 61 73 73 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 ass, unsigned ch
6de0: 61 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 ar instruction,
6df0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 31 unsigned char p1
6e00: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 , unsigned char
6e10: 70 32 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 p2, unsigned cha
6e20: 72 20 6c 63 2c 20 75 6e 73 69 67 6e 65 64 20 63 r lc, unsigned c
6e30: 68 61 72 20 2a 64 61 74 61 2c 20 75 6e 73 69 67 har *data, unsig
6e40: 6e 65 64 20 63 68 61 72 20 6c 65 2c 20 75 69 6e ned char le, uin
6e50: 74 31 36 5f 74 20 2a 72 65 73 70 63 6f 64 65 2c t16_t *respcode,
6e60: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
6e70: 72 65 73 70 64 61 74 61 2c 20 73 69 7a 65 5f 74 respdata, size_t
6e80: 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 20 *respdata_len)
6e90: 7b 0a 09 75 69 6e 74 38 5f 74 20 6d 61 6a 6f 72 {..uint8_t major
6ea0: 5f 72 63 2c 20 6d 69 6e 6f 72 5f 72 63 3b 0a 09 _rc, minor_rc;..
6eb0: 73 69 7a 65 5f 74 20 62 79 74 65 73 5f 74 6f 5f size_t bytes_to_
6ec0: 63 6f 70 79 2c 20 74 6d 70 5f 72 65 73 70 64 61 copy, tmp_respda
6ed0: 74 61 5f 6c 65 6e 3b 0a 09 44 57 4f 52 44 20 70 ta_len;..DWORD p
6ee0: 72 6f 74 6f 63 6f 6c 3b 0a 09 44 57 4f 52 44 20 rotocol;..DWORD
6ef0: 78 6d 69 74 5f 6c 65 6e 2c 20 72 65 63 76 5f 6c xmit_len, recv_l
6f00: 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f en;..LONG scard_
6f10: 78 6d 69 74 5f 72 65 74 2c 20 73 63 61 72 64 5f xmit_ret, scard_
6f20: 72 65 63 6f 6e 6e 5f 72 65 74 3b 0a 09 42 59 54 reconn_ret;..BYT
6f30: 45 20 78 6d 69 74 5f 62 75 66 5b 31 30 32 34 5d E xmit_buf[1024]
6f40: 2c 20 72 65 63 76 5f 62 75 66 5b 31 30 32 34 5d , recv_buf[1024]
6f50: 3b 0a 09 69 6e 74 20 70 63 73 63 5f 63 6f 6e 6e ;..int pcsc_conn
6f60: 65 63 74 5f 72 65 74 2c 20 70 63 73 63 5f 67 65 ect_ret, pcsc_ge
6f70: 74 72 65 73 70 5f 72 65 74 3b 0a 09 69 6e 74 20 tresp_ret;..int
6f80: 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 idx;...CACKEY_DE
6f90: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
6fa0: 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c ed.");...if (!sl
6fb0: 6f 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ot) {...CACKEY_D
6fc0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 EBUG_PRINTF("Inv
6fd0: 61 6c 69 64 20 73 6c 6f 74 20 73 70 65 63 69 66 alid slot specif
6fe0: 69 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 ied.");....retur
6ff0: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f n(CACKEY_PCSC_E_
7000: 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 70 GENERIC);..}...p
7010: 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 csc_connect_ret
7020: 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 = cackey_connect
7030: 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69 66 _card(slot);..if
7040: 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 (pcsc_connect_r
7050: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 et != CACKEY_PCS
7060: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b C_S_OK) {...CACK
7070: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
7080: 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 "Unable to conne
7090: 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75 ct to card, retu
70a0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 rning in failure
70b0: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 ");....return(CA
70c0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 CKEY_PCSC_E_GENE
70d0: 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 72 RIC);..}.../* Tr
70e0: 61 6e 73 6d 69 74 20 2a 2f 0a 09 78 6d 69 74 5f ansmit */..xmit_
70f0: 6c 65 6e 20 3d 20 30 3b 0a 09 78 6d 69 74 5f 62 len = 0;..xmit_b
7100: 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d uf[xmit_len++] =
7110: 20 63 6c 61 73 73 3b 0a 09 78 6d 69 74 5f 62 75 class;..xmit_bu
7120: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 f[xmit_len++] =
7130: 69 6e 73 74 72 75 63 74 69 6f 6e 3b 0a 09 78 6d instruction;..xm
7140: 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b it_buf[xmit_len+
7150: 2b 5d 20 3d 20 70 31 3b 0a 09 78 6d 69 74 5f 62 +] = p1;..xmit_b
7160: 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d uf[xmit_len++] =
7170: 20 70 32 3b 0a 09 69 66 20 28 64 61 74 61 29 20 p2;..if (data)
7180: 7b 0a 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 {...xmit_buf[xmi
7190: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 63 3b 0a 09 t_len++] = lc;..
71a0: 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 .for (idx = 0; i
71b0: 64 78 20 3c 20 6c 63 3b 20 69 64 78 2b 2b 29 20 dx < lc; idx++)
71c0: 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d {....xmit_buf[xm
71d0: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 64 61 74 61 it_len++] = data
71e0: 5b 69 64 78 5d 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 [idx];...}..}...
71f0: 69 66 20 28 6c 65 20 21 3d 20 30 78 30 30 29 20 if (le != 0x00)
7200: 7b 0a 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 {...xmit_buf[xmi
7210: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 65 3b 0a 09 t_len++] = le;..
7220: 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 53 6d 61 }.../* Begin Sma
7230: 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 rtcard Transacti
7240: 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 62 65 on */..cackey_be
7250: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 gin_transaction(
7260: 73 6c 6f 74 29 3b 0a 0a 09 69 66 20 28 63 6c 61 slot);...if (cla
7270: 73 73 20 3d 3d 20 47 53 43 49 53 5f 43 4c 41 53 ss == GSCIS_CLAS
7280: 53 5f 49 53 4f 37 38 31 36 20 26 26 20 69 6e 73 S_ISO7816 && ins
7290: 74 72 75 63 74 69 6f 6e 20 3d 3d 20 47 53 43 49 truction == GSCI
72a0: 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 20 26 S_INSTR_VERIFY &
72b0: 26 20 70 31 20 3d 3d 20 30 78 30 30 20 26 26 20 & p1 == 0x00 &&
72c0: 70 32 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 p2 == 0x00) {...
72d0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
72e0: 4e 54 46 28 22 53 65 6e 64 69 6e 67 20 41 50 44 NTF("Sending APD
72f0: 55 3a 20 3c 3c 63 65 6e 73 6f 72 65 64 3e 3e 22 U: <<censored>>"
7300: 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43 );..} else {...C
7310: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
7320: 54 42 55 46 28 22 53 65 6e 64 69 6e 67 20 41 50 TBUF("Sending AP
7330: 44 55 3a 22 2c 20 78 6d 69 74 5f 62 75 66 2c 20 DU:", xmit_buf,
7340: 78 6d 69 74 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 xmit_len);..}...
7350: 72 65 63 76 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f recv_len = sizeo
7360: 66 28 72 65 63 76 5f 62 75 66 29 3b 0a 09 73 63 f(recv_buf);..sc
7370: 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 20 53 ard_xmit_ret = S
7380: 43 61 72 64 54 72 61 6e 73 6d 69 74 28 73 6c 6f CardTransmit(slo
7390: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 t->pcsc_card, SC
73a0: 41 52 44 5f 50 43 49 5f 54 30 2c 20 78 6d 69 74 ARD_PCI_T0, xmit
73b0: 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20 _buf, xmit_len,
73c0: 53 43 41 52 44 5f 50 43 49 5f 54 31 2c 20 72 65 SCARD_PCI_T1, re
73d0: 63 76 5f 62 75 66 2c 20 26 72 65 63 76 5f 6c 65 cv_buf, &recv_le
73e0: 6e 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 78 n);..if (scard_x
73f0: 6d 69 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44 mit_ret != SCARD
7400: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 _S_SUCCESS) {...
7410: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
7420: 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73 NTF("Failed to s
7430: 65 6e 64 20 41 50 44 55 20 74 6f 20 63 61 72 64 end APDU to card
7440: 20 28 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28 (SCardTransmit(
7450: 29 20 3d 20 25 73 2f 25 6c 78 29 22 2c 20 43 41 ) = %s/%lx)", CA
7460: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f CKEY_DEBUG_FUNC_
7470: 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 SCARDERR_TO_STR(
7480: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c scard_xmit_ret),
7490: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
74a0: 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 scard_xmit_ret)
74b0: 3b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ;...CACKEY_DEBUG
74c0: 5f 50 52 49 4e 54 46 28 22 4d 61 72 6b 69 6e 67 _PRINTF("Marking
74d0: 20 73 6c 6f 74 20 61 73 20 68 61 76 69 6e 67 20 slot as having
74e0: 62 65 65 6e 20 72 65 73 65 74 22 29 3b 0a 0a 09 been reset");...
74f0: 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 .slot->transacti
7500: 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 09 on_depth = 0;...
7510: 73 6c 6f 74 2d 3e 73 6c 6f 74 5f 72 65 73 65 74 slot->slot_reset
7520: 20 3d 20 31 3b 0a 0a 09 09 69 66 20 28 73 63 61 = 1;....if (sca
7530: 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 3d 20 53 rd_xmit_ret == S
7540: 43 41 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52 CARD_W_RESET_CAR
7550: 44 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 D) {....CACKEY_D
7560: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 EBUG_PRINTF("Res
7570: 65 74 20 72 65 71 75 69 72 65 64 2c 20 70 6c 65 et required, ple
7580: 61 73 65 20 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a ase hold...");..
7590: 09 09 09 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f ...scard_reconn_
75a0: 72 65 74 20 3d 20 53 43 61 72 64 52 65 63 6f 6e ret = SCardRecon
75b0: 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f nect(slot->pcsc_
75c0: 63 61 72 64 2c 20 53 43 41 52 44 5f 53 48 41 52 card, SCARD_SHAR
75d0: 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f E_SHARED, SCARD_
75e0: 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20 53 43 41 PROTOCOL_T0, SCA
75f0: 52 44 5f 52 45 53 45 54 5f 43 41 52 44 2c 20 26 RD_RESET_CARD, &
7600: 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09 69 66 protocol);....if
7610: 20 28 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 (scard_reconn_r
7620: 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 et == SCARD_S_SU
7630: 43 43 45 53 53 29 20 7b 0a 09 09 09 09 2f 2a 20 CCESS) {...../*
7640: 52 65 2d 65 73 74 61 62 6c 69 73 68 20 74 72 61 Re-establish tra
7650: 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 69 74 20 nsaction, if it
7660: 77 61 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 09 was present */..
7670: 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 ...if (slot->tra
7680: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e nsaction_depth >
7690: 20 30 29 20 7b 0a 09 09 09 09 09 73 6c 6f 74 2d 0) {......slot-
76a0: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 >transaction_dep
76b0: 74 68 2d 2d 3b 0a 09 09 09 09 09 63 61 63 6b 65 th--;......cacke
76c0: 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 y_begin_transact
76d0: 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09 09 09 7d ion(slot);.....}
76e0: 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 ......CACKEY_DEB
76f0: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74 UG_PRINTF("Reset
7700: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 successful, ret
7710: 72 61 6e 73 6d 69 74 74 69 6e 67 22 29 3b 0a 09 ransmitting");..
7720: 09 09 09 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 ...scard_xmit_re
7730: 74 20 3d 20 53 43 61 72 64 54 72 61 6e 73 6d 69 t = SCardTransmi
7740: 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 t(slot->pcsc_car
7750: 64 2c 20 53 43 41 52 44 5f 50 43 49 5f 54 30 2c d, SCARD_PCI_T0,
7760: 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69 74 5f xmit_buf, xmit_
7770: 6c 65 6e 2c 20 53 43 41 52 44 5f 50 43 49 5f 54 len, SCARD_PCI_T
7780: 30 2c 20 72 65 63 76 5f 62 75 66 2c 20 26 72 65 0, recv_buf, &re
7790: 63 76 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 69 66 cv_len);......if
77a0: 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 (scard_xmit_ret
77b0: 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 != SCARD_S_SUCC
77c0: 45 53 53 29 20 7b 0a 09 09 09 09 09 43 41 43 4b ESS) {......CACK
77d0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
77e0: 22 52 65 74 72 61 6e 73 6d 69 74 20 66 61 69 6c "Retransmit fail
77f0: 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e ed, returning in
7800: 20 66 61 69 6c 75 72 65 20 61 66 74 65 72 20 64 failure after d
7810: 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20 74 68 65 isconnecting the
7820: 20 63 61 72 64 20 28 53 43 61 72 64 54 72 61 6e card (SCardTran
7830: 73 6d 69 74 20 3d 20 25 73 2f 25 6c 69 29 22 2c smit = %s/%li)",
7840: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 CACKEY_DEBUG_FU
7850: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 NC_SCARDERR_TO_S
7860: 54 52 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 TR(scard_xmit_re
7870: 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 t), (long) scard
7880: 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a 09 09 09 _xmit_ret);.....
7890: 09 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 ..SCardDisconnec
78a0: 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 t(slot->pcsc_car
78b0: 64 2c 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43 d, SCARD_RESET_C
78c0: 41 52 44 29 3b 0a 09 09 09 09 09 73 6c 6f 74 2d ARD);......slot-
78d0: 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 >pcsc_card_conne
78e0: 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09 09 09 cted = 0;.......
78f0: 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 /* End Smartcard
7900: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a Transaction */.
7910: 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 .....slot->trans
7920: 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31 action_depth = 1
7930: 3b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 65 6e ;......cackey_en
7940: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c d_transaction(sl
7950: 6f 74 29 3b 0a 0a 09 09 09 09 09 72 65 74 75 72 ot);.......retur
7960: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f n(CACKEY_PCSC_E_
7970: 47 45 4e 45 52 49 43 29 3b 0a 09 09 09 09 7d 0a GENERIC);.....}.
7980: 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 ...} else {.....
7990: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
79a0: 4e 54 46 28 22 44 69 73 63 6f 6e 6e 65 63 74 69 NTF("Disconnecti
79b0: 6e 67 20 63 61 72 64 22 29 3b 0a 0a 09 09 09 09 ng card");......
79c0: 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 SCardDisconnect(
79d0: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c slot->pcsc_card,
79e0: 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52 SCARD_RESET_CAR
79f0: 44 29 3b 0a 09 09 09 09 73 6c 6f 74 2d 3e 70 63 D);.....slot->pc
7a00: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 sc_card_connecte
7a10: 64 20 3d 20 30 3b 0a 0a 09 09 09 09 2f 2a 20 45 d = 0;....../* E
7a20: 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 nd Smartcard Tra
7a30: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 09 nsaction */.....
7a40: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f slot->transactio
7a50: 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a 09 09 09 n_depth = 1;....
7a60: 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e .cackey_end_tran
7a70: 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a saction(slot);..
7a80: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
7a90: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
7aa0: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b ng in failure");
7ab0: 0a 09 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b .....return(CACK
7ac0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 EY_PCSC_E_GENERI
7ad0: 43 29 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 C);....}...} els
7ae0: 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 e {....CACKEY_DE
7af0: 42 55 47 5f 50 52 49 4e 54 46 28 22 44 69 73 63 BUG_PRINTF("Disc
7b00: 6f 6e 6e 65 63 74 69 6e 67 20 63 61 72 64 22 29 onnecting card")
7b10: 3b 0a 0a 09 09 09 53 43 61 72 64 44 69 73 63 6f ;.....SCardDisco
7b20: 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 nnect(slot->pcsc
7b30: 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 52 45 53 _card, SCARD_RES
7b40: 45 54 5f 43 41 52 44 29 3b 0a 09 09 09 73 6c 6f ET_CARD);....slo
7b50: 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e t->pcsc_card_con
7b60: 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09 nected = 0;.....
7b70: 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 /* End Smartcard
7b80: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a Transaction */.
7b90: 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 ...slot->transac
7ba0: 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a tion_depth = 1;.
7bb0: 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 ...cackey_end_tr
7bc0: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b ansaction(slot);
7bd0: 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
7be0: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
7bf0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 ing in failure")
7c00: 3b 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b ;....return(CACK
7c10: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 EY_PCSC_E_GENERI
7c20: 43 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 C);...}..}...CAC
7c30: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 KEY_DEBUG_PRINTB
7c40: 55 46 28 22 52 65 74 75 72 6e 65 64 20 56 61 6c UF("Returned Val
7c50: 75 65 3a 22 2c 20 72 65 63 76 5f 62 75 66 2c 20 ue:", recv_buf,
7c60: 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 recv_len);...if
7c70: 28 72 65 63 76 5f 6c 65 6e 20 3c 20 32 29 20 7b (recv_len < 2) {
7c80: 0a 09 09 2f 2a 20 4d 69 6e 69 6d 61 6c 20 72 65 .../* Minimal re
7c90: 73 70 6f 6e 73 65 20 6c 65 6e 67 74 68 20 69 73 sponse length is
7ca0: 20 32 20 62 79 74 65 73 2c 20 72 65 74 75 72 6e 2 bytes, return
7cb0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20 2a ing in failure *
7cc0: 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 /...CACKEY_DEBUG
7cd0: 5f 50 52 49 4e 54 46 28 22 52 65 73 70 6f 6e 73 _PRINTF("Respons
7ce0: 65 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65 74 e too small, ret
7cf0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 urning in failur
7d00: 65 20 28 72 65 63 76 5f 6c 65 6e 20 3d 20 25 6c e (recv_len = %l
7d10: 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c u)", (unsigned l
7d20: 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e 29 3b 0a ong) recv_len);.
7d30: 0a 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 .../* End Smartc
7d40: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 ard Transaction
7d50: 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f */...cackey_end_
7d60: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 transaction(slot
7d70: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 );....return(CAC
7d80: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 KEY_PCSC_E_GENER
7d90: 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 IC);..}.../* Det
7da0: 65 72 6d 69 6e 65 20 72 65 73 75 6c 74 20 63 6f ermine result co
7db0: 64 65 20 2a 2f 0a 09 6d 61 6a 6f 72 5f 72 63 20 de */..major_rc
7dc0: 3d 20 72 65 63 76 5f 62 75 66 5b 72 65 63 76 5f = recv_buf[recv_
7dd0: 6c 65 6e 20 2d 20 32 5d 3b 0a 09 6d 69 6e 6f 72 len - 2];..minor
7de0: 5f 72 63 20 3d 20 72 65 63 76 5f 62 75 66 5b 72 _rc = recv_buf[r
7df0: 65 63 76 5f 6c 65 6e 20 2d 20 31 5d 3b 0a 09 69 ecv_len - 1];..i
7e00: 66 20 28 72 65 73 70 63 6f 64 65 29 20 7b 0a 09 f (respcode) {..
7e10: 09 2a 72 65 73 70 63 6f 64 65 20 3d 20 28 6d 61 .*respcode = (ma
7e20: 6a 6f 72 5f 72 63 20 3c 3c 20 38 29 20 7c 20 6d jor_rc << 8) | m
7e30: 69 6e 6f 72 5f 72 63 3b 0a 09 7d 0a 0a 09 2f 2a inor_rc;..}.../*
7e40: 20 41 64 6a 75 73 74 20 6d 65 73 73 61 67 65 20 Adjust message
7e50: 62 75 66 66 65 72 20 2a 2f 0a 09 72 65 63 76 5f buffer */..recv_
7e60: 6c 65 6e 20 2d 3d 20 32 3b 0a 0a 09 2f 2a 20 41 len -= 2;.../* A
7e70: 64 64 20 62 79 74 65 73 20 74 6f 20 72 65 74 75 dd bytes to retu
7e80: 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 09 74 6d 70 rn value */..tmp
7e90: 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20 _respdata_len =
7ea0: 30 3b 0a 09 69 66 20 28 72 65 73 70 64 61 74 61 0;..if (respdata
7eb0: 20 26 26 20 72 65 73 70 64 61 74 61 5f 6c 65 6e && respdata_len
7ec0: 29 20 7b 0a 09 09 74 6d 70 5f 72 65 73 70 64 61 ) {...tmp_respda
7ed0: 74 61 5f 6c 65 6e 20 3d 20 2a 72 65 73 70 64 61 ta_len = *respda
7ee0: 74 61 5f 6c 65 6e 3b 0a 0a 09 09 62 79 74 65 73 ta_len;....bytes
7ef0: 5f 74 6f 5f 63 6f 70 79 20 3d 20 2a 72 65 73 70 _to_copy = *resp
7f00: 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 69 66 20 data_len;....if
7f10: 28 72 65 63 76 5f 6c 65 6e 20 3c 20 62 79 74 65 (recv_len < byte
7f20: 73 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a 09 09 09 s_to_copy) {....
7f30: 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 bytes_to_copy =
7f40: 72 65 63 76 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 recv_len;...}...
7f50: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
7f60: 49 4e 54 46 28 22 43 6f 70 79 69 6e 67 20 25 6c INTF("Copying %l
7f70: 75 20 62 79 74 65 73 20 74 6f 20 74 68 65 20 62 u bytes to the b
7f80: 75 66 66 65 72 22 2c 20 28 75 6e 73 69 67 6e 65 uffer", (unsigne
7f90: 64 20 6c 6f 6e 67 29 20 62 79 74 65 73 5f 74 6f d long) bytes_to
7fa0: 5f 63 6f 70 79 29 3b 0a 0a 09 09 6d 65 6d 63 70 _copy);....memcp
7fb0: 79 28 72 65 73 70 64 61 74 61 2c 20 72 65 63 76 y(respdata, recv
7fc0: 5f 62 75 66 2c 20 62 79 74 65 73 5f 74 6f 5f 63 _buf, bytes_to_c
7fd0: 6f 70 79 29 3b 0a 09 09 72 65 73 70 64 61 74 61 opy);...respdata
7fe0: 20 2b 3d 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 += bytes_to_cop
7ff0: 79 3b 0a 0a 09 09 2a 72 65 73 70 64 61 74 61 5f y;....*respdata_
8000: 6c 65 6e 20 3d 20 62 79 74 65 73 5f 74 6f 5f 63 len = bytes_to_c
8010: 6f 70 79 3b 0a 09 09 74 6d 70 5f 72 65 73 70 64 opy;...tmp_respd
8020: 61 74 61 5f 6c 65 6e 20 2d 3d 20 62 79 74 65 73 ata_len -= bytes
8030: 5f 74 6f 5f 63 6f 70 79 3b 0a 09 7d 20 65 6c 73 _to_copy;..} els
8040: 65 20 7b 0a 09 09 69 66 20 28 72 65 63 76 5f 6c e {...if (recv_l
8050: 65 6e 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 en != 0) {....CA
8060: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
8070: 46 28 22 54 68 72 6f 77 69 6e 67 20 61 77 61 79 F("Throwing away
8080: 20 25 6c 75 20 62 79 74 65 73 2c 20 6e 6f 77 68 %lu bytes, nowh
8090: 65 72 65 20 74 6f 20 70 75 74 20 74 68 65 6d 21 ere to put them!
80a0: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e ", (unsigned lon
80b0: 67 29 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 09 09 g) recv_len);...
80c0: 7d 0a 09 7d 0a 0a 09 69 66 20 28 6d 61 6a 6f 72 }..}...if (major
80d0: 5f 72 63 20 3d 3d 20 30 78 36 31 29 20 7b 0a 09 _rc == 0x61) {..
80e0: 09 2f 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 52 ./* We need to R
80f0: 45 41 44 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f EAD */...CACKEY_
8100: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 42 75 DEBUG_PRINTF("Bu
8110: 66 66 65 72 20 72 65 61 64 20 72 65 71 75 69 72 ffer read requir
8120: 65 64 22 29 3b 0a 0a 09 09 70 63 73 63 5f 67 65 ed");....pcsc_ge
8130: 74 72 65 73 70 5f 72 65 74 20 3d 20 63 61 63 6b tresp_ret = cack
8140: 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f ey_send_apdu(slo
8150: 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 t, GSCIS_CLASS_I
8160: 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e SO7816, GSCIS_IN
8170: 53 54 52 5f 47 45 54 5f 52 45 53 50 4f 4e 53 45 STR_GET_RESPONSE
8180: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 2c , 0x00, 0x00, 0,
8190: 20 4e 55 4c 4c 2c 20 6d 69 6e 6f 72 5f 72 63 2c NULL, minor_rc,
81a0: 20 72 65 73 70 63 6f 64 65 2c 20 72 65 73 70 64 respcode, respd
81b0: 61 74 61 2c 20 26 74 6d 70 5f 72 65 73 70 64 61 ata, &tmp_respda
81c0: 74 61 5f 6c 65 6e 29 3b 0a 09 09 69 66 20 28 70 ta_len);...if (p
81d0: 63 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20 csc_getresp_ret
81e0: 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 != CACKEY_PCSC_S
81f0: 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 _OK) {....CACKEY
8200: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 42 _DEBUG_PRINTF("B
8210: 75 66 66 65 72 20 72 65 61 64 20 66 61 69 6c 65 uffer read faile
8220: 64 21 20 20 52 65 74 75 72 6e 69 6e 67 20 69 6e d! Returning in
8230: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 failure");.....
8240: 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 /* End Smartcard
8250: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a Transaction */.
8260: 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 ...cackey_end_tr
8270: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b ansaction(slot);
8280: 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b .....return(CACK
8290: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 EY_PCSC_E_GENERI
82a0: 43 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72 C);...}....if (r
82b0: 65 73 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 espdata_len) {..
82c0: 09 09 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 ..*respdata_len
82d0: 2b 3d 20 74 6d 70 5f 72 65 73 70 64 61 74 61 5f += tmp_respdata_
82e0: 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 45 len;...}..../* E
82f0: 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 nd Smartcard Tra
8300: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 nsaction */...ca
8310: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 ckey_end_transac
8320: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 43 tion(slot);....C
8330: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
8340: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e TF("Returning in
8350: 20 73 75 63 63 65 73 73 20 28 62 75 66 66 65 72 success (buffer
8360: 20 72 65 61 64 20 63 6f 6d 70 6c 65 74 65 29 22 read complete)"
8370: 29 3b 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b );...return(CACK
8380: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 EY_PCSC_S_OK);..
8390: 7d 0a 0a 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 }.../* End Smart
83a0: 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e card Transaction
83b0: 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f */..cackey_end_
83c0: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 transaction(slot
83d0: 29 3b 0a 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 72 );...if (major_r
83e0: 63 20 3d 3d 20 30 78 39 30 29 20 7b 0a 09 09 2f c == 0x90) {.../
83f0: 2a 20 53 75 63 63 65 73 73 20 2a 2f 0a 09 09 43 * Success */...C
8400: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
8410: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e TF("Returning in
8420: 20 73 75 63 63 65 73 73 20 28 6d 61 6a 6f 72 5f success (major_
8430: 72 63 20 3d 20 30 78 39 30 29 22 29 3b 0a 0a 09 rc = 0x90)");...
8440: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 .return(CACKEY_P
8450: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 0a CSC_S_OK);..}...
8460: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
8470: 49 4e 54 46 28 22 41 50 44 55 20 52 65 74 75 72 INTF("APDU Retur
8480: 6e 65 64 20 61 6e 20 65 72 72 6f 72 2c 20 72 65 ned an error, re
8490: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 turning in failu
84a0: 72 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 re");...return(C
84b0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e ACKEY_PCSC_E_GEN
84c0: 45 52 49 43 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 ERIC);.}../*. *
84d0: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 SYNPOSIS. *
84e0: 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 72 ssize_t cackey_r
84f0: 65 61 64 5f 62 75 66 66 65 72 28 73 74 72 75 63 ead_buffer(struc
8500: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 t cackey_slot *s
8510: 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 lot, unsigned ch
8520: 61 72 20 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 ar *buffer, size
8530: 5f 74 20 63 6f 75 6e 74 2c 20 75 6e 73 69 67 6e _t count, unsign
8540: 65 64 20 63 68 61 72 20 74 5f 6f 72 5f 76 2c 20 ed char t_or_v,
8550: 73 69 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f size_t initial_o
8560: 66 66 73 65 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 ffset);. *. * AR
8570: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 GUMENTS. * s
8580: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f truct cackey_slo
8590: 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 t *slot. *
85a0: 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 Slot to send
85b0: 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 commands to. *.
85c0: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 * unsigned c
85d0: 68 61 72 20 2a 62 75 66 66 65 72 0a 20 2a 20 20 har *buffer. *
85e0: 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 42 75 66 [OUT] Buf
85f0: 66 65 72 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 fer. *. * si
8600: 7a 65 5f 74 20 63 6f 75 6e 74 0a 20 2a 20 20 20 ze_t count. *
8610: 20 20 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 Number of
8620: 62 79 74 65 73 20 74 6f 20 61 74 74 65 6d 70 74 bytes to attempt
8630: 20 74 6f 20 72 65 61 64 0a 20 2a 0a 20 2a 20 20 to read. *. *
8640: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 unsigned char
8650: 20 74 5f 6f 72 5f 76 0a 20 2a 20 20 20 20 20 20 t_or_v. *
8660: 20 20 20 53 65 6c 65 63 74 20 74 68 65 20 54 2d Select the T-
8670: 62 75 66 66 65 72 20 28 30 31 29 20 6f 72 20 56 buffer (01) or V
8680: 2d 62 75 66 66 65 72 20 28 30 32 29 20 74 6f 20 -buffer (02) to
8690: 72 65 61 64 20 66 72 6f 6d 2e 20 20 0a 20 2a 0a read from. . *.
86a0: 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 69 6e * size_t in
86b0: 69 74 69 61 6c 5f 6f 66 66 73 65 74 0a 20 2a 20 itial_offset. *
86c0: 20 20 20 20 20 20 20 20 53 70 65 63 69 66 79 20 Specify
86d0: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 62 65 the offset to be
86e0: 67 69 6e 20 74 68 65 20 72 65 61 64 20 66 72 6f gin the read fro
86f0: 6d 0a 20 2a 0a 20 2a 0a 20 2a 20 52 45 54 55 52 m. *. *. * RETUR
8700: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 54 N VALUE. * T
8710: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 his function ret
8720: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 urns the number
8730: 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c of bytes actuall
8740: 79 20 72 65 61 64 2c 20 6f 72 20 2d 31 20 6f 6e y read, or -1 on
8750: 20 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 20 4e 4f error.. *. * NO
8760: 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a TES. * None.
8770: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73 *. */.static ss
8780: 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 72 65 61 ize_t cackey_rea
8790: 64 5f 62 75 66 66 65 72 28 73 74 72 75 63 74 20 d_buffer(struct
87a0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f cackey_slot *slo
87b0: 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 t, unsigned char
87c0: 20 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 *buffer, size_t
87d0: 20 63 6f 75 6e 74 2c 20 75 6e 73 69 67 6e 65 64 count, unsigned
87e0: 20 63 68 61 72 20 74 5f 6f 72 5f 76 2c 20 73 69 char t_or_v, si
87f0: 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66 ze_t initial_off
8800: 73 65 74 29 20 7b 0a 09 73 69 7a 65 5f 74 20 6f set) {..size_t o
8810: 66 66 73 65 74 20 3d 20 30 2c 20 6d 61 78 5f 6f ffset = 0, max_o
8820: 66 66 73 65 74 2c 20 6d 61 78 5f 63 6f 75 6e 74 ffset, max_count
8830: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 ;..unsigned char
8840: 20 63 6d 64 5b 32 5d 3b 0a 09 75 69 6e 74 31 36 cmd[2];..uint16
8850: 5f 74 20 72 65 73 70 63 6f 64 65 3b 0a 09 69 6e _t respcode;..in
8860: 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 t send_ret;...CA
8870: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
8880: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
8890: 6d 61 78 5f 6f 66 66 73 65 74 20 3d 20 63 6f 75 max_offset = cou
88a0: 6e 74 3b 0a 09 6d 61 78 5f 63 6f 75 6e 74 20 3d nt;..max_count =
88b0: 20 32 35 32 3b 0a 0a 09 69 66 20 28 74 5f 6f 72 252;...if (t_or
88c0: 5f 76 20 21 3d 20 31 20 26 26 20 74 5f 6f 72 5f _v != 1 && t_or_
88d0: 76 20 21 3d 20 32 29 20 7b 0a 09 09 43 41 43 4b v != 2) {...CACK
88e0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
88f0: 22 49 6e 76 61 6c 69 64 20 54 20 6f 72 20 56 20 "Invalid T or V
8900: 70 61 72 61 6d 65 74 65 72 20 73 70 65 63 69 66 parameter specif
8910: 69 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 ied, returning i
8920: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 n failure");....
8930: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a return(-1);..}..
8940: 09 63 6d 64 5b 30 5d 20 3d 20 74 5f 6f 72 5f 76 .cmd[0] = t_or_v
8950: 3b 0a 0a 09 77 68 69 6c 65 20 28 31 29 20 7b 0a ;...while (1) {.
8960: 09 09 69 66 20 28 6f 66 66 73 65 74 20 3e 3d 20 ..if (offset >=
8970: 6d 61 78 5f 6f 66 66 73 65 74 29 20 7b 0a 09 09 max_offset) {...
8980: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
8990: 49 4e 54 46 28 22 42 75 66 66 65 72 20 74 6f 6f INTF("Buffer too
89a0: 20 73 6d 61 6c 6c 2c 20 72 65 74 75 72 6e 69 6e small, returnin
89b0: 67 20 77 68 61 74 20 77 65 20 67 6f 74 2e 2e 2e g what we got...
89c0: 22 29 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 ");.....break;..
89d0: 09 7d 0a 0a 09 09 63 6f 75 6e 74 20 3d 20 6d 61 .}....count = ma
89e0: 78 5f 6f 66 66 73 65 74 20 2d 20 6f 66 66 73 65 x_offset - offse
89f0: 74 3b 0a 09 09 69 66 20 28 63 6f 75 6e 74 20 3e t;...if (count >
8a00: 20 6d 61 78 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 max_count) {...
8a10: 09 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 63 6f 75 .count = max_cou
8a20: 6e 74 3b 0a 09 09 7d 0a 0a 09 09 63 6d 64 5b 31 nt;...}....cmd[1
8a30: 5d 20 3d 20 63 6f 75 6e 74 3b 0a 0a 09 09 73 65 ] = count;....se
8a40: 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f nd_ret = cackey_
8a50: 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 send_apdu(slot,
8a60: 47 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 GSCIS_CLASS_GLOB
8a70: 41 4c 5f 50 4c 41 54 46 4f 52 4d 2c 20 47 53 43 AL_PLATFORM, GSC
8a80: 49 53 5f 49 4e 53 54 52 5f 52 45 41 44 5f 42 55 IS_INSTR_READ_BU
8a90: 46 46 45 52 2c 20 28 28 69 6e 69 74 69 61 6c 5f FFER, ((initial_
8aa0: 6f 66 66 73 65 74 20 2b 20 6f 66 66 73 65 74 29 offset + offset)
8ab0: 20 3e 3e 20 38 29 20 26 20 30 78 66 66 2c 20 28 >> 8) & 0xff, (
8ac0: 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 20 2b initial_offset +
8ad0: 20 6f 66 66 73 65 74 29 20 26 20 30 78 66 66 2c offset) & 0xff,
8ae0: 20 73 69 7a 65 6f 66 28 63 6d 64 29 2c 20 63 6d sizeof(cmd), cm
8af0: 64 2c 20 30 78 30 30 2c 20 26 72 65 73 70 63 6f d, 0x00, &respco
8b00: 64 65 2c 20 62 75 66 66 65 72 20 2b 20 6f 66 66 de, buffer + off
8b10: 73 65 74 2c 20 26 63 6f 75 6e 74 29 3b 0a 09 09 set, &count);...
8b20: 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 if (send_ret !=
8b30: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b CACKEY_PCSC_S_OK
8b40: 29 20 7b 0a 09 09 09 69 66 20 28 72 65 73 70 63 ) {....if (respc
8b50: 6f 64 65 20 3d 3d 20 30 78 36 41 38 36 29 20 7b ode == 0x6A86) {
8b60: 0a 09 09 09 09 69 66 20 28 6d 61 78 5f 63 6f 75 .....if (max_cou
8b70: 6e 74 20 3d 3d 20 31 29 20 7b 0a 09 09 09 09 09 nt == 1) {......
8b80: 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 break;.....}....
8b90: 09 09 6d 61 78 5f 63 6f 75 6e 74 20 3d 20 6d 61 ..max_count = ma
8ba0: 78 5f 63 6f 75 6e 74 20 2f 20 32 3b 0a 0a 09 09 x_count / 2;....
8bb0: 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d ..continue;....}
8bc0: 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
8bd0: 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79 G_PRINTF("cackey
8be0: 5f 73 65 6e 64 5f 61 70 64 75 28 29 20 66 61 69 _send_apdu() fai
8bf0: 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 led, returning i
8c00: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 n failure");....
8c10: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d .return(-1);...}
8c20: 0a 0a 09 09 6f 66 66 73 65 74 20 2b 3d 20 63 6f ....offset += co
8c30: 75 6e 74 3b 0a 0a 09 09 69 66 20 28 63 6f 75 6e unt;....if (coun
8c40: 74 20 3c 20 6d 61 78 5f 63 6f 75 6e 74 29 20 7b t < max_count) {
8c50: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
8c60: 5f 50 52 49 4e 54 46 28 22 53 68 6f 72 74 20 72 _PRINTF("Short r
8c70: 65 61 64 20 2d 2d 20 63 6f 75 6e 74 20 3d 20 25 ead -- count = %
8c80: 69 2c 20 63 6d 64 5b 31 5d 20 3d 20 25 69 22 2c i, cmd[1] = %i",
8c90: 20 28 69 6e 74 29 20 63 6f 75 6e 74 2c 20 28 69 (int) count, (i
8ca0: 6e 74 29 20 63 6d 64 5b 31 5d 29 3b 0a 0a 09 09 nt) cmd[1]);....
8cb0: 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a .break;...}..}..
8cc0: 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41 #ifdef CACKEY_PA
8cd0: 52 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20 RANOID.# ifdef
8ce0: 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 _POSIX_SSIZE_MAX
8cf0: 0a 09 69 66 20 28 6f 66 66 73 65 74 20 3e 20 5f ..if (offset > _
8d00: 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29 POSIX_SSIZE_MAX)
8d10: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
8d20: 47 5f 50 52 49 4e 54 46 28 22 4f 66 66 73 65 74 G_PRINTF("Offset
8d30: 20 65 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d exceeds maximum
8d40: 20 76 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e value, returnin
8d50: 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d g in failure. (m
8d60: 61 78 20 3d 20 25 6c 69 2c 20 6f 66 66 73 65 74 ax = %li, offset
8d70: 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 = %lu)", (long)
8d80: 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 _POSIX_SSIZE_MA
8d90: 58 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e X, (unsigned lon
8da0: 67 29 20 6f 66 66 73 65 74 29 3b 0a 0a 09 09 72 g) offset);....r
8db0: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 eturn(-1);..}.#
8dc0: 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09 endif.#endif...
8dd0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
8de0: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 NTF("Returning i
8df0: 6e 20 73 75 63 63 65 73 73 2c 20 72 65 61 64 20 n success, read
8e00: 25 6c 75 20 62 79 74 65 73 22 2c 20 28 75 6e 73 %lu bytes", (uns
8e10: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 66 66 73 igned long) offs
8e20: 65 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 6f 66 et);...return(of
8e30: 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 fset);.}../*. *
8e40: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 SYNPOSIS. *
8e50: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 cackey_ret cacke
8e60: 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 y_select_applet(
8e70: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c struct cackey_sl
8e80: 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e ot *slot, unsign
8e90: 65 64 20 63 68 61 72 20 2a 61 69 64 2c 20 73 69 ed char *aid, si
8ea0: 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 29 3b 0a 20 ze_t aid_len);.
8eb0: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 *. * ARGUMENTS.
8ec0: 2a 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63 * struct cac
8ed0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 key_slot *slot.
8ee0: 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 * Slot t
8ef0: 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 o send commands
8f00: 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 to. *. * uns
8f10: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 69 64 0a igned char *aid.
8f20: 20 2a 20 20 20 20 20 20 20 20 20 42 75 66 66 65 * Buffe
8f30: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 41 70 70 r containing App
8f40: 6c 65 74 20 49 44 20 74 6f 20 73 65 6c 65 63 74 let ID to select
8f50: 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f . *. * size_
8f60: 74 20 61 69 64 5f 6c 65 6e 0a 20 2a 20 20 20 20 t aid_len. *
8f70: 20 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 62 Number of b
8f80: 79 74 65 73 20 69 6e 20 74 68 65 20 22 61 69 64 ytes in the "aid
8f90: 22 20 28 41 70 70 6c 65 74 20 49 44 29 20 70 61 " (Applet ID) pa
8fa0: 72 61 6d 65 74 65 72 0a 20 2a 0a 20 2a 20 52 45 rameter. *. * RE
8fb0: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 TURN VALUE. *
8fc0: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f CACKEY_PCSC_S_
8fd0: 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 OK On su
8fe0: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 ccess. * CAC
8ff0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 KEY_PCSC_E_GENER
9000: 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 IC On error.
9010: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 *. * NOTES. *
9020: 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 None. *. */.st
9030: 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 atic cackey_ret
9040: 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 cackey_select_ap
9050: 70 6c 65 74 28 73 74 72 75 63 74 20 63 61 63 6b plet(struct cack
9060: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 ey_slot *slot, u
9070: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 69 nsigned char *ai
9080: 64 2c 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65 d, size_t aid_le
9090: 6e 29 20 7b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 n) {..int send_r
90a0: 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 et;...CACKEY_DEB
90b0: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
90c0: 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 d.");...CACKEY_D
90d0: 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 53 EBUG_PRINTBUF("S
90e0: 65 6c 65 63 74 69 6e 67 20 61 70 70 6c 65 74 3a electing applet:
90f0: 22 2c 20 61 69 64 2c 20 61 69 64 5f 6c 65 6e 29 ", aid, aid_len)
9100: 3b 0a 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 ;...send_ret = c
9110: 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 ackey_send_apdu(
9120: 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 slot, GSCIS_CLAS
9130: 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53 S_ISO7816, GSCIS
9140: 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54 2c 20 47 _INSTR_SELECT, G
9150: 53 43 49 53 5f 50 41 52 41 4d 5f 53 45 4c 45 43 SCIS_PARAM_SELEC
9160: 54 5f 41 50 50 4c 45 54 2c 20 30 78 30 43 2c 20 T_APPLET, 0x0C,
9170: 61 69 64 5f 6c 65 6e 2c 20 61 69 64 2c 20 30 78 aid_len, aid, 0x
9180: 30 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 00, NULL, NULL,
9190: 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 73 65 6e 64 NULL);..if (send
91a0: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 _ret != CACKEY_P
91b0: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 CSC_S_OK) {...CA
91c0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
91d0: 46 28 22 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 F("Failed to ope
91e0: 6e 20 61 70 70 6c 65 74 2c 20 72 65 74 75 72 6e n applet, return
91f0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 ing in failure")
9200: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b ;....return(CACK
9210: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 EY_PCSC_E_GENERI
9220: 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f C);..}...CACKEY_
9230: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75 DEBUG_PRINTF("Su
9240: 63 63 65 73 73 66 75 6c 6c 79 20 73 65 6c 65 63 ccessfully selec
9250: 74 65 64 20 66 69 6c 65 22 29 3b 0a 0a 09 72 65 ted file");...re
9260: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 turn(CACKEY_PCSC
9270: 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a _S_OK);.}../*. *
9280: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 SYNPOSIS. *
9290: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b cackey_ret cack
92a0: 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 ey_select_file(s
92b0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f truct cackey_slo
92c0: 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74 31 36 5f t *slot, uint16_
92d0: 74 20 65 66 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 t ef);. *. * ARG
92e0: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 UMENTS. * st
92f0: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 ruct cackey_slot
9300: 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 *slot. *
9310: 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 Slot to send c
9320: 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a ommands to. *. *
9330: 20 20 20 20 20 75 69 6e 74 31 36 5f 74 20 65 66 uint16_t ef
9340: 0a 20 2a 20 20 20 20 20 20 20 20 20 45 6c 65 6d . * Elem
9350: 65 6e 74 61 6c 20 46 69 6c 65 20 74 6f 20 73 65 ental File to se
9360: 6c 65 63 74 0a 20 2a 0a 20 2a 20 52 45 54 55 52 lect. *. * RETUR
9370: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 N VALUE. * C
9380: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 ACKEY_PCSC_S_OK
9390: 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 On succe
93a0: 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 ss. * CACKEY
93b0: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 _PCSC_E_GENERIC
93c0: 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 On error. *.
93d0: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 * NOTES. * T
93e0: 68 69 73 20 73 65 6c 65 63 74 73 20 61 6e 20 45 his selects an E
93f0: 6c 65 6d 65 6e 74 61 72 79 20 46 69 6c 65 20 28 lementary File (
9400: 45 46 29 20 75 6e 64 65 72 20 74 68 65 20 63 75 EF) under the cu
9410: 72 72 65 6e 74 6c 79 20 73 65 6c 65 63 74 65 64 rrently selected
9420: 0a 20 2a 20 20 20 20 20 44 65 64 69 63 61 74 65 . * Dedicate
9430: 64 20 46 69 6c 65 20 28 44 46 29 0a 20 2a 0a 20 d File (DF). *.
9440: 2a 20 20 20 20 20 54 79 70 69 63 61 6c 6c 79 20 * Typically
9450: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61 this is called a
9460: 66 74 65 72 20 73 65 6c 65 63 74 69 6e 67 20 74 fter selecting t
9470: 68 65 20 63 6f 72 72 65 63 74 20 41 70 70 6c 65 he correct Apple
9480: 74 20 28 75 73 69 6e 67 0a 20 2a 20 20 20 20 20 t (using. *
9490: 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 cackey_select_ap
94a0: 70 6c 65 74 29 20 66 6f 72 20 56 4d 20 63 61 72 plet) for VM car
94b0: 64 73 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 ds. *. */.static
94c0: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b cackey_ret cack
94d0: 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 ey_select_file(s
94e0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f truct cackey_slo
94f0: 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74 31 36 5f t *slot, uint16_
9500: 74 20 65 66 29 20 7b 0a 09 75 6e 73 69 67 6e 65 t ef) {..unsigne
9510: 64 20 63 68 61 72 20 66 69 64 5f 62 75 66 5b 32 d char fid_buf[2
9520: 5d 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 ];..int send_ret
9530: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ;...CACKEY_DEBUG
9540: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
9550: 22 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 20 74 68 ");.../* Open th
9560: 65 20 65 6c 65 6d 65 6e 74 61 72 79 20 66 69 6c e elementary fil
9570: 65 20 2a 2f 0a 09 66 69 64 5f 62 75 66 5b 30 5d e */..fid_buf[0]
9580: 20 3d 20 28 65 66 20 3e 3e 20 38 29 20 26 20 30 = (ef >> 8) & 0
9590: 78 66 66 3b 0a 09 66 69 64 5f 62 75 66 5b 31 5d xff;..fid_buf[1]
95a0: 20 3d 20 65 66 20 26 20 30 78 66 66 3b 0a 0a 09 = ef & 0xff;...
95b0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
95c0: 4e 54 46 28 22 53 65 6c 65 63 74 69 6e 67 20 66 NTF("Selecting f
95d0: 69 6c 65 3a 20 25 30 34 6c 78 22 2c 20 28 75 6e ile: %04lx", (un
95e0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 65 66 29 signed long) ef)
95f0: 3b 0a 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 ;...send_ret = c
9600: 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 ackey_send_apdu(
9610: 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 slot, GSCIS_CLAS
9620: 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53 S_ISO7816, GSCIS
9630: 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54 2c 20 30 _INSTR_SELECT, 0
9640: 78 30 32 2c 20 30 78 30 43 2c 20 73 69 7a 65 6f x02, 0x0C, sizeo
9650: 66 28 66 69 64 5f 62 75 66 29 2c 20 66 69 64 5f f(fid_buf), fid_
9660: 62 75 66 2c 20 30 78 30 30 2c 20 4e 55 4c 4c 2c buf, 0x00, NULL,
9670: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69 NULL, NULL);..i
9680: 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 f (send_ret != C
9690: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 ACKEY_PCSC_S_OK)
96a0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
96b0: 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 G_PRINTF("Failed
96c0: 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 2c 20 72 to open file, r
96d0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c eturning in fail
96e0: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ure");....return
96f0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 (CACKEY_PCSC_E_G
9700: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 ENERIC);..}...CA
9710: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
9720: 46 28 22 53 75 63 63 65 73 73 66 75 6c 6c 79 20 F("Successfully
9730: 73 65 6c 65 63 74 65 64 20 66 69 6c 65 22 29 3b selected file");
9740: 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 ...return(CACKEY
9750: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a _PCSC_S_OK);.}..
9760: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 /*. * SYNPOSIS.
9770: 2a 20 20 20 20 20 76 6f 69 64 20 63 61 63 6b 65 * void cacke
9780: 79 5f 66 72 65 65 5f 74 6c 76 28 73 74 72 75 63 y_free_tlv(struc
9790: 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 t cackey_tlv_ent
97a0: 69 74 79 20 2a 72 6f 6f 74 29 3b 0a 20 2a 0a 20 ity *root);. *.
97b0: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 * ARGUMENTS. *
97c0: 20 20 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 struct cackey
97d0: 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 72 6f 6f _tlv_entity *roo
97e0: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 52 6f 6f t. * Roo
97f0: 74 20 6f 66 20 74 68 65 20 54 4c 56 20 6c 69 73 t of the TLV lis
9800: 74 20 74 6f 20 73 74 61 72 74 20 66 72 65 65 69 t to start freei
9810: 6e 67 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 ng. *. * RETURN
9820: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f 6e VALUE. * Non
9830: 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a e. *. * NOTES. *
9840: 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 This functi
9850: 6f 6e 20 66 72 65 65 73 20 74 68 65 20 54 4c 56 on frees the TLV
9860: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 65 64 20 72 linked listed r
9870: 65 74 75 72 6e 65 64 20 66 72 6f 6d 0a 20 2a 20 eturned from. *
9880: 20 20 20 20 22 63 61 63 6b 65 79 5f 72 65 61 64 "cackey_read
9890: 5f 74 6c 76 22 0a 20 2a 0a 20 2a 2f 0a 73 74 61 _tlv". *. */.sta
98a0: 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f tic void cackey_
98b0: 66 72 65 65 5f 74 6c 76 28 73 74 72 75 63 74 20 free_tlv(struct
98c0: 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 cackey_tlv_entit
98d0: 79 20 2a 72 6f 6f 74 29 20 7b 0a 09 73 74 72 75 y *root) {..stru
98e0: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e ct cackey_tlv_en
98f0: 74 69 74 79 20 2a 63 75 72 72 2c 20 2a 6e 65 78 tity *curr, *nex
9900: 74 3b 0a 0a 09 69 66 20 28 72 6f 6f 74 20 3d 3d t;...if (root ==
9910: 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 NULL) {...retur
9920: 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 63 75 72 n;..}...for (cur
9930: 72 20 3d 20 72 6f 6f 74 3b 20 63 75 72 72 3b 20 r = root; curr;
9940: 63 75 72 72 20 3d 20 6e 65 78 74 29 20 7b 0a 09 curr = next) {..
9950: 09 6e 65 78 74 20 3d 20 63 75 72 72 2d 3e 5f 6e .next = curr->_n
9960: 65 78 74 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 ext;....switch (
9970: 63 75 72 72 2d 3e 74 61 67 29 20 7b 0a 09 09 09 curr->tag) {....
9980: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 41 case GSCIS_TAG_A
9990: 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 63 61 73 CR_TABLE:....cas
99a0: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 e GSCIS_TAG_CERT
99b0: 49 46 49 43 41 54 45 3a 0a 09 09 09 09 69 66 20 IFICATE:.....if
99c0: 28 63 75 72 72 2d 3e 76 61 6c 75 65 29 20 7b 0a (curr->value) {.
99d0: 09 09 09 09 09 66 72 65 65 28 63 75 72 72 2d 3e .....free(curr->
99e0: 76 61 6c 75 65 29 3b 0a 09 09 09 09 7d 0a 09 09 value);.....}...
99f0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 ..break;....case
9a00: 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55 GSCIS_TAG_CARDU
9a10: 52 4c 3a 0a 09 09 09 09 69 66 20 28 63 75 72 72 RL:.....if (curr
9a20: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 29 ->value_cardurl)
9a30: 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75 72 {......free(cur
9a40: 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c r->value_cardurl
9a50: 29 3b 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65 );.....}.....bre
9a60: 61 6b 3b 0a 09 09 7d 0a 0a 09 09 66 72 65 65 28 ak;...}....free(
9a70: 63 75 72 72 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 curr);..}...retu
9a80: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e rn;.}../*. * SYN
9a90: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e POSIS. * ...
9aa0: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 . *. * ARGUMENTS
9ab0: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 . * .... *.
9ac0: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 * RETURN VALUE.
9ad0: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 * .... *. *
9ae0: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e NOTES. * ...
9af0: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 . *. */.static s
9b00: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 truct cackey_tlv
9b10: 5f 65 6e 74 69 74 79 20 2a 63 61 63 6b 65 79 5f _entity *cackey_
9b20: 72 65 61 64 5f 74 6c 76 28 73 74 72 75 63 74 20 read_tlv(struct
9b30: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f cackey_slot *slo
9b40: 74 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 t) {..struct cac
9b50: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a key_tlv_entity *
9b60: 63 75 72 72 5f 65 6e 74 69 74 79 2c 20 2a 72 6f curr_entity, *ro
9b70: 6f 74 20 3d 20 4e 55 4c 4c 2c 20 2a 6c 61 73 74 ot = NULL, *last
9b80: 20 3d 20 4e 55 4c 4c 3b 0a 09 75 6e 73 69 67 6e = NULL;..unsign
9b90: 65 64 20 63 68 61 72 20 74 6c 65 6e 5f 62 75 66 ed char tlen_buf
9ba0: 5b 32 5d 2c 20 74 76 61 6c 5f 62 75 66 5b 31 30 [2], tval_buf[10
9bb0: 32 34 5d 2c 20 2a 74 76 61 6c 3b 0a 09 75 6e 73 24], *tval;..uns
9bc0: 69 67 6e 65 64 20 63 68 61 72 20 76 6c 65 6e 5f igned char vlen_
9bd0: 62 75 66 5b 32 5d 2c 20 76 76 61 6c 5f 62 75 66 buf[2], vval_buf
9be0: 5b 38 31 39 32 5d 2c 20 2a 76 76 61 6c 3b 0a 09 [8192], *vval;..
9bf0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 unsigned char *t
9c00: 6d 70 62 75 66 3b 0a 09 73 73 69 7a 65 5f 74 20 mpbuf;..ssize_t
9c10: 74 6c 65 6e 2c 20 76 6c 65 6e 3b 0a 09 73 73 69 tlen, vlen;..ssi
9c20: 7a 65 5f 74 20 72 65 61 64 5f 72 65 74 3b 0a 09 ze_t read_ret;..
9c30: 73 69 7a 65 5f 74 20 6f 66 66 73 65 74 5f 74 20 size_t offset_t
9c40: 3d 20 30 2c 20 6f 66 66 73 65 74 5f 76 20 3d 20 = 0, offset_v =
9c50: 30 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 0;..unsigned cha
9c60: 72 20 74 61 67 3b 0a 09 73 69 7a 65 5f 74 20 6c r tag;..size_t l
9c70: 65 6e 67 74 68 3b 0a 23 69 66 64 65 66 20 48 41 ength;.#ifdef HA
9c80: 56 45 5f 4c 49 42 5a 0a 09 75 4c 6f 6e 67 66 20 VE_LIBZ..uLongf
9c90: 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 69 6e 74 20 tmpbuflen;..int
9ca0: 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 3b 0a uncompress_ret;.
9cb0: 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f #endif...CACKEY_
9cc0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
9cd0: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 72 65 61 64 5f lled.");...read_
9ce0: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 ret = cackey_rea
9cf0: 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 74 d_buffer(slot, t
9d00: 6c 65 6e 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28 len_buf, sizeof(
9d10: 74 6c 65 6e 5f 62 75 66 29 2c 20 31 2c 20 6f 66 tlen_buf), 1, of
9d20: 66 73 65 74 5f 74 29 3b 0a 09 69 66 20 28 72 65 fset_t);..if (re
9d30: 61 64 5f 72 65 74 20 21 3d 20 73 69 7a 65 6f 66 ad_ret != sizeof
9d40: 28 74 6c 65 6e 5f 62 75 66 29 29 20 7b 0a 09 09 (tlen_buf)) {...
9d50: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
9d60: 4e 54 46 28 22 52 65 61 64 20 66 61 69 6c 65 64 NTF("Read failed
9d70: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 , returning in f
9d80: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 ailure");....ret
9d90: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 urn(NULL);..}...
9da0: 74 6c 65 6e 20 3d 20 28 74 6c 65 6e 5f 62 75 66 tlen = (tlen_buf
9db0: 5b 31 5d 20 3c 3c 20 38 29 20 7c 20 74 6c 65 6e [1] << 8) | tlen
9dc0: 5f 62 75 66 5b 30 5d 3b 0a 0a 09 72 65 61 64 5f _buf[0];...read_
9dd0: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 ret = cackey_rea
9de0: 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 76 d_buffer(slot, v
9df0: 6c 65 6e 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28 len_buf, sizeof(
9e00: 76 6c 65 6e 5f 62 75 66 29 2c 20 32 2c 20 6f 66 vlen_buf), 2, of
9e10: 66 73 65 74 5f 76 29 3b 0a 09 69 66 20 28 72 65 fset_v);..if (re
9e20: 61 64 5f 72 65 74 20 21 3d 20 73 69 7a 65 6f 66 ad_ret != sizeof
9e30: 28 76 6c 65 6e 5f 62 75 66 29 29 20 7b 0a 09 09 (vlen_buf)) {...
9e40: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
9e50: 4e 54 46 28 22 52 65 61 64 20 66 61 69 6c 65 64 NTF("Read failed
9e60: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 , returning in f
9e70: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 ailure");....ret
9e80: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 urn(NULL);..}...
9e90: 76 6c 65 6e 20 3d 20 28 76 6c 65 6e 5f 62 75 66 vlen = (vlen_buf
9ea0: 5b 31 5d 20 3c 3c 20 38 29 20 7c 20 76 6c 65 6e [1] << 8) | vlen
9eb0: 5f 62 75 66 5b 30 5d 3b 0a 0a 09 43 41 43 4b 45 _buf[0];...CACKE
9ec0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
9ed0: 54 61 67 20 4c 65 6e 67 74 68 20 3d 20 25 69 2c Tag Length = %i,
9ee0: 20 56 61 6c 75 65 20 4c 65 6e 67 74 68 20 3d 20 Value Length =
9ef0: 25 69 22 2c 20 74 6c 65 6e 2c 20 76 6c 65 6e 29 %i", tlen, vlen)
9f00: 3b 0a 0a 09 6f 66 66 73 65 74 5f 74 20 2b 3d 20 ;...offset_t +=
9f10: 32 3b 0a 09 6f 66 66 73 65 74 5f 76 20 2b 3d 20 2;..offset_v +=
9f20: 32 3b 0a 0a 09 69 66 20 28 74 6c 65 6e 20 3e 20 2;...if (tlen >
9f30: 73 69 7a 65 6f 66 28 74 76 61 6c 5f 62 75 66 29 sizeof(tval_buf)
9f40: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
9f50: 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67 20 6c UG_PRINTF("Tag l
9f60: 65 6e 67 74 68 20 69 73 20 74 6f 6f 20 6c 61 72 ength is too lar
9f70: 67 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e ge, returning in
9f80: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 failure");....r
9f90: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a eturn(NULL);..}.
9fa0: 0a 09 69 66 20 28 76 6c 65 6e 20 3e 20 73 69 7a ..if (vlen > siz
9fb0: 65 6f 66 28 76 76 61 6c 5f 62 75 66 29 29 20 7b eof(vval_buf)) {
9fc0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
9fd0: 50 52 49 4e 54 46 28 22 56 61 6c 75 65 20 6c 65 PRINTF("Value le
9fe0: 6e 67 74 68 20 69 73 20 74 6f 6f 20 6c 61 72 67 ngth is too larg
9ff0: 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 e, returning in
a000: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 failure");....re
a010: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a turn(NULL);..}..
a020: 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b .read_ret = cack
a030: 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 ey_read_buffer(s
a040: 6c 6f 74 2c 20 74 76 61 6c 5f 62 75 66 2c 20 74 lot, tval_buf, t
a050: 6c 65 6e 2c 20 31 2c 20 6f 66 66 73 65 74 5f 74 len, 1, offset_t
a060: 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74 );..if (read_ret
a070: 20 21 3d 20 74 6c 65 6e 29 20 7b 0a 09 09 43 41 != tlen) {...CA
a080: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
a090: 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 72 65 61 F("Unable to rea
a0a0: 64 20 65 6e 74 69 72 65 20 54 2d 62 75 66 66 65 d entire T-buffe
a0b0: 72 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 r, returning in
a0c0: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 failure");....re
a0d0: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a turn(NULL);..}..
a0e0: 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b .read_ret = cack
a0f0: 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 ey_read_buffer(s
a100: 6c 6f 74 2c 20 76 76 61 6c 5f 62 75 66 2c 20 76 lot, vval_buf, v
a110: 6c 65 6e 2c 20 32 2c 20 6f 66 66 73 65 74 5f 76 len, 2, offset_v
a120: 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74 );..if (read_ret
a130: 20 21 3d 20 76 6c 65 6e 29 20 7b 0a 09 09 43 41 != vlen) {...CA
a140: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
a150: 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 72 65 61 F("Unable to rea
a160: 64 20 65 6e 74 69 72 65 20 56 2d 62 75 66 66 65 d entire V-buffe
a170: 72 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 r, returning in
a180: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 failure");....re
a190: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a turn(NULL);..}..
a1a0: 09 74 76 61 6c 20 3d 20 74 76 61 6c 5f 62 75 66 .tval = tval_buf
a1b0: 3b 0a 09 76 76 61 6c 20 3d 20 76 76 61 6c 5f 62 ;..vval = vval_b
a1c0: 75 66 3b 0a 09 77 68 69 6c 65 20 28 74 6c 65 6e uf;..while (tlen
a1d0: 20 3e 20 30 20 26 26 20 76 6c 65 6e 20 3e 20 30 > 0 && vlen > 0
a1e0: 29 20 7b 0a 09 09 74 61 67 20 3d 20 2a 74 76 61 ) {...tag = *tva
a1f0: 6c 3b 0a 09 09 74 76 61 6c 2b 2b 3b 0a 09 09 74 l;...tval++;...t
a200: 6c 65 6e 2d 2d 3b 0a 0a 09 09 69 66 20 28 2a 74 len--;....if (*t
a210: 76 61 6c 20 3d 3d 20 30 78 66 66 29 20 7b 0a 09 val == 0xff) {..
a220: 09 09 6c 65 6e 67 74 68 20 3d 20 28 74 76 61 6c ..length = (tval
a230: 5b 32 5d 20 3c 3c 20 38 29 20 7c 20 74 76 61 6c [2] << 8) | tval
a240: 5b 31 5d 3b 0a 09 09 09 74 76 61 6c 20 2b 3d 20 [1];....tval +=
a250: 33 3b 0a 09 09 09 74 6c 65 6e 20 2d 3d 20 33 3b 3;....tlen -= 3;
a260: 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 6c ...} else {....l
a270: 65 6e 67 74 68 20 3d 20 2a 74 76 61 6c 3b 0a 09 ength = *tval;..
a280: 09 09 74 76 61 6c 2b 2b 3b 0a 09 09 09 74 6c 65 ..tval++;....tle
a290: 6e 2d 2d 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b n--;...}....CACK
a2a0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
a2b0: 22 54 61 67 3a 20 25 73 20 28 25 30 32 78 29 22 "Tag: %s (%02x)"
a2c0: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 , CACKEY_DEBUG_F
a2d0: 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 74 UNC_TAG_TO_STR(t
a2e0: 61 67 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 ag), (unsigned i
a2f0: 6e 74 29 20 74 61 67 29 3b 0a 09 09 43 41 43 4b nt) tag);...CACK
a300: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 EY_DEBUG_PRINTBU
a310: 46 28 22 56 61 6c 75 65 3a 22 2c 20 76 76 61 6c F("Value:", vval
a320: 2c 20 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 63 75 , length);....cu
a330: 72 72 5f 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c rr_entity = NULL
a340: 3b 0a 09 09 73 77 69 74 63 68 20 28 74 61 67 29 ;...switch (tag)
a350: 20 7b 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 {....case GSCIS
a360: 5f 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09 _TAG_CARDURL:...
a370: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 ..curr_entity =
a380: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 malloc(sizeof(*c
a390: 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 09 09 urr_entity));...
a3a0: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 ..curr_entity->v
a3b0: 61 6c 75 65 5f 63 61 72 64 75 72 6c 20 3d 20 6d alue_cardurl = m
a3c0: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 alloc(sizeof(*cu
a3d0: 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 rr_entity->value
a3e0: 5f 63 61 72 64 75 72 6c 29 29 3b 0a 0a 09 09 09 _cardurl));.....
a3f0: 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 65 6e 74 .memcpy(curr_ent
a400: 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 ity->value_cardu
a410: 72 6c 2d 3e 72 69 64 2c 20 76 76 61 6c 2c 20 35 rl->rid, vval, 5
a420: 29 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 );.....curr_enti
a430: 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 ty->value_cardur
a440: 6c 2d 3e 61 70 70 74 79 70 65 20 3d 20 76 76 61 l->apptype = vva
a450: 6c 5b 35 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65 l[5];.....curr_e
a460: 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 ntity->value_car
a470: 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 20 3d durl->objectid =
a480: 20 28 76 76 61 6c 5b 36 5d 20 3c 3c 20 38 29 20 (vval[6] << 8)
a490: 7c 20 76 76 61 6c 5b 37 5d 3b 0a 09 09 09 09 63 | vval[7];.....c
a4a0: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 urr_entity->valu
a4b0: 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 e_cardurl->appid
a4c0: 20 3d 20 28 76 76 61 6c 5b 38 5d 20 3c 3c 20 38 = (vval[8] << 8
a4d0: 29 20 7c 20 76 76 61 6c 5b 39 5d 3b 0a 0a 09 09 ) | vval[9];....
a4e0: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 ..curr_entity->t
a4f0: 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 ag = tag;.....cu
a500: 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 rr_entity->_next
a510: 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 = NULL;......br
a520: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43 eak;....case GSC
a530: 49 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45 IS_TAG_ACR_TABLE
a540: 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 :.....curr_entit
a550: 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f y = malloc(sizeo
a560: 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29 f(*curr_entity))
a570: 3b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20 6d ;.....tmpbuf = m
a580: 61 6c 6c 6f 63 28 6c 65 6e 67 74 68 29 3b 0a 0a alloc(length);..
a590: 09 09 09 09 6d 65 6d 63 70 79 28 74 6d 70 62 75 ....memcpy(tmpbu
a5a0: 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 f, vval, length)
a5b0: 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 ;......curr_enti
a5c0: 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09 ty->tag = tag;..
a5d0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e ...curr_entity->
a5e0: 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b length = length;
a5f0: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 .....curr_entity
a600: 2d 3e 76 61 6c 75 65 20 3d 20 74 6d 70 62 75 66 ->value = tmpbuf
a610: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 ;.....curr_entit
a620: 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b y->_next = NULL;
a630: 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 ......break;....
a640: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 case GSCIS_TAG_C
a650: 45 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09 09 ERTIFICATE:.....
a660: 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 curr_entity = ma
a670: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 lloc(sizeof(*cur
a680: 72 5f 65 6e 74 69 74 79 29 29 3b 0a 0a 09 09 09 r_entity));.....
a690: 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e .tmpbuflen = len
a6a0: 67 74 68 20 2a 20 32 3b 0a 09 09 09 09 74 6d 70 gth * 2;.....tmp
a6b0: 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 buf = malloc(tmp
a6c0: 62 75 66 6c 65 6e 29 3b 0a 0a 23 69 66 64 65 66 buflen);..#ifdef
a6d0: 20 48 41 56 45 5f 4c 49 42 5a 0a 09 09 09 09 75 HAVE_LIBZ.....u
a6e0: 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 20 ncompress_ret =
a6f0: 75 6e 63 6f 6d 70 72 65 73 73 28 74 6d 70 62 75 uncompress(tmpbu
a700: 66 2c 20 26 74 6d 70 62 75 66 6c 65 6e 2c 20 76 f, &tmpbuflen, v
a710: 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 09 09 val, length);...
a720: 09 09 69 66 20 28 75 6e 63 6f 6d 70 72 65 73 73 ..if (uncompress
a730: 5f 72 65 74 20 21 3d 20 5a 5f 4f 4b 29 20 7b 0a _ret != Z_OK) {.
a740: 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
a750: 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 G_PRINTF("Failed
a760: 20 74 6f 20 64 65 63 6f 6d 70 72 65 73 73 2c 20 to decompress,
a770: 75 6e 63 6f 6d 70 72 65 73 73 28 29 20 72 65 74 uncompress() ret
a780: 75 72 6e 65 64 20 25 69 20 2d 2d 20 72 65 73 6f urned %i -- reso
a790: 72 74 69 6e 67 20 74 6f 20 64 69 72 65 63 74 20 rting to direct
a7a0: 63 6f 70 79 22 2c 20 75 6e 63 6f 6d 70 72 65 73 copy", uncompres
a7b0: 73 5f 72 65 74 29 3b 0a 0a 09 09 09 09 09 74 6d s_ret);.......tm
a7c0: 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 pbuflen = length
a7d0: 3b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 74 6d ;......memcpy(tm
a7e0: 70 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 pbuf, vval, leng
a7f0: 74 68 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 th);.....}......
a800: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
a810: 4e 54 42 55 46 28 22 44 65 63 6f 6d 70 72 65 73 NTBUF("Decompres
a820: 73 65 64 20 74 6f 3a 22 2c 20 74 6d 70 62 75 66 sed to:", tmpbuf
a830: 2c 20 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 23 65 , tmpbuflen);.#e
a840: 6c 73 65 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 lse.....CACKEY_D
a850: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 69 73 EBUG_PRINTF("Mis
a860: 73 69 6e 67 20 5a 4c 49 42 20 53 75 70 70 6f 72 sing ZLIB Suppor
a870: 74 2c 20 74 68 69 73 20 63 65 72 74 69 66 69 63 t, this certific
a880: 61 74 65 20 69 73 20 6c 69 6b 65 6c 79 20 75 73 ate is likely us
a890: 65 6c 65 73 73 2e 2e 2e 22 29 3b 0a 0a 09 09 09 eless...");.....
a8a0: 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e .tmpbuflen = len
a8b0: 67 74 68 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 gth;.....memcpy(
a8c0: 74 6d 70 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65 tmpbuf, vval, le
a8d0: 6e 67 74 68 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 ngth);.#endif...
a8e0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e ...curr_entity->
a8f0: 74 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 tag = tag;.....c
a900: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e 67 urr_entity->leng
a910: 74 68 20 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a th = tmpbuflen;.
a920: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d ....curr_entity-
a930: 3e 76 61 6c 75 65 20 3d 20 74 6d 70 62 75 66 3b >value = tmpbuf;
a940: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 .....curr_entity
a950: 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a ->_next = NULL;.
a960: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 .....break;....c
a970: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b ase GSCIS_TAG_PK
a980: 43 53 31 35 3a 0a 09 09 09 09 63 75 72 72 5f 65 CS15:.....curr_e
a990: 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 ntity = malloc(s
a9a0: 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 izeof(*curr_enti
a9b0: 74 79 29 29 3b 0a 0a 09 09 09 09 63 75 72 72 5f ty));......curr_
a9c0: 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61 entity->tag = ta
a9d0: 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 g;.....curr_enti
a9e0: 74 79 2d 3e 76 61 6c 75 65 5f 62 79 74 65 20 3d ty->value_byte =
a9f0: 20 76 76 61 6c 5b 30 5d 3b 0a 09 09 09 09 63 75 vval[0];.....cu
aa00: 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 rr_entity->_next
aa10: 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 = NULL;......br
aa20: 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 76 76 61 6c eak;...}....vval
aa30: 20 2b 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 76 6c += length;...vl
aa40: 65 6e 20 2d 3d 20 6c 65 6e 67 74 68 3b 0a 0a 09 en -= length;...
aa50: 09 69 66 20 28 63 75 72 72 5f 65 6e 74 69 74 79 .if (curr_entity
aa60: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 != NULL) {....i
aa70: 66 20 28 72 6f 6f 74 20 3d 3d 20 4e 55 4c 4c 29 f (root == NULL)
aa80: 20 7b 0a 09 09 09 09 72 6f 6f 74 20 3d 20 63 75 {.....root = cu
aa90: 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09 09 7d 0a rr_entity;....}.
aaa0: 0a 09 09 09 69 66 20 28 6c 61 73 74 20 21 3d 20 ....if (last !=
aab0: 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 6c 61 73 74 NULL) {.....last
aac0: 2d 3e 5f 6e 65 78 74 20 3d 20 63 75 72 72 5f 65 ->_next = curr_e
aad0: 6e 74 69 74 79 3b 0a 09 09 09 7d 0a 0a 09 09 09 ntity;....}.....
aae0: 6c 61 73 74 20 3d 20 63 75 72 72 5f 65 6e 74 69 last = curr_enti
aaf0: 74 79 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 ty;...}..}...ret
ab00: 75 72 6e 28 72 6f 6f 74 29 3b 0a 7d 0a 0a 2f 2a urn(root);.}../*
ab10: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 . * SYNPOSIS. *
ab20: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 .... *. * AR
ab30: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e GUMENTS. * .
ab40: 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 ... *. * RETURN
ab50: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e VALUE. * ...
ab60: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 . *. * NOTES. *
ab70: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 .... *. */.s
ab80: 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 tatic void cacke
ab90: 79 5f 66 72 65 65 5f 63 65 72 74 73 28 73 74 72 y_free_certs(str
aba0: 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f uct cackey_pcsc_
abb0: 69 64 65 6e 74 69 74 79 20 2a 73 74 61 72 74 2c identity *start,
abc0: 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 69 size_t count, i
abd0: 6e 74 20 66 72 65 65 5f 73 74 61 72 74 29 20 7b nt free_start) {
abe0: 0a 09 73 69 7a 65 5f 74 20 69 64 78 3b 0a 0a 09 ..size_t idx;...
abf0: 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 for (idx = 0; id
ac00: 78 20 3c 20 63 6f 75 6e 74 3b 20 69 64 78 2b 2b x < count; idx++
ac10: 29 20 7b 0a 09 09 69 66 20 28 73 74 61 72 74 5b ) {...if (start[
ac20: 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 idx].certificate
ac30: 29 20 7b 0a 09 09 09 66 72 65 65 28 73 74 61 72 ) {....free(star
ac40: 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 t[idx].certifica
ac50: 74 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 te);...}..}...if
ac60: 20 28 66 72 65 65 5f 73 74 61 72 74 29 20 7b 0a (free_start) {.
ac70: 09 09 66 72 65 65 28 73 74 61 72 74 29 3b 0a 09 ..free(start);..
ac80: 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f }...return;.}../
ac90: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a *. * SYNPOSIS. *
aca0: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 .... *. * A
acb0: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 RGUMENTS. *
acc0: 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e .... *. * RETURN
acd0: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e VALUE. * ..
ace0: 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a .. *. * NOTES. *
acf0: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a .... *. */.
ad00: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61 static struct ca
ad10: 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 ckey_pcsc_identi
ad20: 74 79 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f ty *cackey_read_
ad30: 63 65 72 74 73 28 73 74 72 75 63 74 20 63 61 63 certs(struct cac
ad40: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 key_slot *slot,
ad50: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 struct cackey_pc
ad60: 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 65 72 sc_identity *cer
ad70: 74 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e ts, unsigned lon
ad80: 67 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 73 74 72 g *count) {..str
ad90: 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f uct cackey_pcsc_
ada0: 69 64 65 6e 74 69 74 79 20 2a 63 75 72 72 5f 69 identity *curr_i
adb0: 64 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 d;..struct cacke
adc0: 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 63 y_tlv_entity *cc
add0: 63 5f 74 6c 76 2c 20 2a 63 63 63 5f 63 75 72 72 c_tlv, *ccc_curr
ade0: 2c 20 2a 61 70 70 5f 74 6c 76 2c 20 2a 61 70 70 , *app_tlv, *app
adf0: 5f 63 75 72 72 3b 0a 09 75 6e 73 69 67 6e 65 64 _curr;..unsigned
ae00: 20 63 68 61 72 20 63 63 63 5f 61 69 64 5b 5d 20 char ccc_aid[]
ae10: 3d 20 7b 47 53 43 49 53 5f 41 49 44 5f 43 43 43 = {GSCIS_AID_CCC
ae20: 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 };..unsigned cha
ae30: 72 20 63 75 72 72 5f 61 69 64 5b 37 5d 3b 0a 09 r curr_aid[7];..
ae40: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6f 75 unsigned long ou
ae50: 74 69 64 78 20 3d 20 30 3b 0a 09 63 61 63 6b 65 tidx = 0;..cacke
ae60: 79 5f 72 65 74 20 74 72 61 6e 73 61 63 74 69 6f y_ret transactio
ae70: 6e 5f 72 65 74 3b 0a 09 69 6e 74 20 63 65 72 74 n_ret;..int cert
ae80: 73 5f 72 65 73 69 7a 61 62 6c 65 3b 0a 09 69 6e s_resizable;..in
ae90: 74 20 73 65 6e 64 5f 72 65 74 2c 20 73 65 6c 65 t send_ret, sele
aea0: 63 74 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 ct_ret;...CACKEY
aeb0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 _DEBUG_PRINTF("C
aec0: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 alled.");...if (
aed0: 63 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b count == NULL) {
aee0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
aef0: 50 52 49 4e 54 46 28 22 63 6f 75 6e 74 20 69 73 PRINTF("count is
af00: 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 69 6e 67 NULL, returning
af10: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a in failure");..
af20: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a ..return(NULL);.
af30: 09 7d 0a 0a 09 69 66 20 28 63 65 72 74 73 20 21 .}...if (certs !
af40: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28 = NULL) {...if (
af50: 2a 63 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 *count == 0) {..
af60: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
af70: 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 65 64 RINTF("Requested
af80: 20 77 65 20 72 65 74 75 72 6e 20 30 20 6f 62 6a we return 0 obj
af90: 65 63 74 73 2c 20 73 68 6f 72 74 2d 63 69 72 63 ects, short-circ
afa0: 75 69 74 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 uit");.....retur
afb0: 6e 28 63 65 72 74 73 29 3b 0a 09 09 7d 0a 09 7d n(certs);...}..}
afc0: 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 61 20 53 6d .../* Begin a Sm
afd0: 61 72 74 43 61 72 64 20 74 72 61 6e 73 61 63 74 artCard transact
afe0: 69 6f 6e 20 2a 2f 0a 09 74 72 61 6e 73 61 63 74 ion */..transact
aff0: 69 6f 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 ion_ret = cackey
b000: 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 _begin_transacti
b010: 6f 6e 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28 74 on(slot);..if (t
b020: 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74 20 21 ransaction_ret !
b030: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f = CACKEY_PCSC_S_
b040: 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 OK) {...CACKEY_D
b050: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 EBUG_PRINTF("Una
b060: 62 6c 65 20 62 65 67 69 6e 20 74 72 61 6e 73 61 ble begin transa
b070: 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e 69 6e 67 ction, returning
b080: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a in failure");..
b090: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a ..return(NULL);.
b0a0: 09 7d 0a 0a 09 69 66 20 28 63 65 72 74 73 20 3d .}...if (certs =
b0b0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 65 72 74 = NULL) {...cert
b0c0: 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f s = malloc(sizeo
b0d0: 66 28 2a 63 65 72 74 73 29 20 2a 20 35 29 3b 0a f(*certs) * 5);.
b0e0: 09 09 2a 63 6f 75 6e 74 20 3d 20 35 3b 0a 09 09 ..*count = 5;...
b0f0: 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 20 certs_resizable
b100: 3d 20 31 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 = 1;..} else {..
b110: 09 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 .certs_resizable
b120: 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 = 0;..}.../* Se
b130: 6c 65 63 74 20 74 68 65 20 43 43 43 20 41 70 70 lect the CCC App
b140: 6c 65 74 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74 let */..send_ret
b150: 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 = cackey_select
b160: 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63 63 _applet(slot, cc
b170: 63 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 63 63 c_aid, sizeof(cc
b180: 63 5f 61 69 64 29 29 3b 0a 09 69 66 20 28 73 65 c_aid));..if (se
b190: 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 nd_ret != CACKEY
b1a0: 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 _PCSC_S_OK) {...
b1b0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
b1c0: 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 73 NTF("Unable to s
b1d0: 65 6c 65 63 74 20 43 43 43 20 41 70 70 6c 65 74 elect CCC Applet
b1e0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 , returning in f
b1f0: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 2f 2a 20 ailure");..../*
b200: 54 65 72 6d 69 6e 61 74 65 20 53 6d 61 72 74 43 Terminate SmartC
b210: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 ard Transaction
b220: 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f */...cackey_end_
b230: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 transaction(slot
b240: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c );....return(NUL
b250: 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 52 65 61 64 L);..}.../* Read
b260: 20 61 6c 6c 20 74 68 65 20 61 70 70 6c 65 74 73 all the applets
b270: 20 66 72 6f 6d 20 74 68 65 20 43 43 43 27 73 20 from the CCC's
b280: 54 4c 56 20 2a 2f 0a 09 63 63 63 5f 74 6c 76 20 TLV */..ccc_tlv
b290: 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c = cackey_read_tl
b2a0: 76 28 73 6c 6f 74 29 3b 0a 0a 09 2f 2a 20 4c 6f v(slot);.../* Lo
b2b0: 6f 6b 20 66 6f 72 20 43 41 52 44 55 52 4c 73 20 ok for CARDURLs
b2c0: 74 68 61 74 20 63 6f 6f 72 65 73 70 6f 6e 64 20 that coorespond
b2d0: 74 6f 20 50 4b 49 20 61 70 70 6c 65 74 73 20 2a to PKI applets *
b2e0: 2f 0a 09 66 6f 72 20 28 63 63 63 5f 63 75 72 72 /..for (ccc_curr
b2f0: 20 3d 20 63 63 63 5f 74 6c 76 3b 20 63 63 63 5f = ccc_tlv; ccc_
b300: 63 75 72 72 3b 20 63 63 63 5f 63 75 72 72 20 3d curr; ccc_curr =
b310: 20 63 63 63 5f 63 75 72 72 2d 3e 5f 6e 65 78 74 ccc_curr->_next
b320: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
b330: 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 UG_PRINTF("Found
b340: 20 74 61 67 3a 20 25 73 20 2e 2e 2e 20 22 2c 20 tag: %s ... ",
b350: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e CACKEY_DEBUG_FUN
b360: 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 63 63 63 C_TAG_TO_STR(ccc
b370: 5f 63 75 72 72 2d 3e 74 61 67 29 29 3b 0a 0a 09 _curr->tag));...
b380: 09 69 66 20 28 63 63 63 5f 63 75 72 72 2d 3e 74 .if (ccc_curr->t
b390: 61 67 20 21 3d 20 47 53 43 49 53 5f 54 41 47 5f ag != GSCIS_TAG_
b3a0: 43 41 52 44 55 52 4c 29 20 7b 0a 09 09 09 43 41 CARDURL) {....CA
b3b0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
b3c0: 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e F(" ... skippin
b3d0: 67 20 69 74 20 28 77 65 20 6f 6e 6c 79 20 63 61 g it (we only ca
b3e0: 72 65 20 61 62 6f 75 74 20 43 41 52 44 55 52 4c re about CARDURL
b3f0: 73 29 22 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e s)");.....contin
b400: 75 65 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 ue;...}....if ((
b410: 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f ccc_curr->value_
b420: 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 cardurl->apptype
b430: 20 26 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 & CACKEY_TLV_AP
b440: 50 5f 50 4b 49 29 20 21 3d 20 43 41 43 4b 45 59 P_PKI) != CACKEY
b450: 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 29 20 7b 0a _TLV_APP_PKI) {.
b460: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
b470: 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b PRINTF(" ... sk
b480: 69 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f 6e ipping it (we on
b490: 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 50 4b ly care about PK
b4a0: 49 20 61 70 70 6c 65 74 73 2c 20 74 68 69 73 20 I applets, this
b4b0: 61 70 70 6c 65 74 20 73 75 70 70 6f 72 74 73 3a applet supports:
b4c0: 20 25 73 2f 25 30 32 78 29 22 2c 20 43 41 43 4b %s/%02x)", CACK
b4d0: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 50 EY_DEBUG_FUNC_AP
b4e0: 50 54 59 50 45 5f 54 4f 5f 53 54 52 28 63 63 63 PTYPE_TO_STR(ccc
b4f0: 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 _curr->value_car
b500: 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 29 2c 20 durl->apptype),
b510: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 63 (unsigned int) c
b520: 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 cc_curr->value_c
b530: 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 29 ardurl->apptype)
b540: 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a ;.....continue;.
b550: 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 ..}....CACKEY_DE
b560: 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 52 49 BUG_PRINTBUF("RI
b570: 44 3a 22 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76 D:", ccc_curr->v
b580: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 alue_cardurl->ri
b590: 64 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 63 75 d, sizeof(ccc_cu
b5a0: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 rr->value_cardur
b5b0: 6c 2d 3e 72 69 64 29 29 3b 0a 09 09 43 41 43 4b l->rid));...CACK
b5c0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
b5d0: 22 41 70 70 49 44 20 3d 20 25 73 2f 25 30 34 6c "AppID = %s/%04l
b5e0: 78 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 x", CACKEY_DEBUG
b5f0: 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 _FUNC_OBJID_TO_S
b600: 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c TR(ccc_curr->val
b610: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 ue_cardurl->appi
b620: 64 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f d), (unsigned lo
b630: 6e 67 29 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 ng) ccc_curr->va
b640: 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 lue_cardurl->app
b650: 69 64 29 3b 0a 09 09 43 41 43 4b 45 59 5f 44 45 id);...CACKEY_DE
b660: 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 62 6a 65 BUG_PRINTF("Obje
b670: 63 74 49 44 20 3d 20 25 73 2f 25 30 34 6c 78 22 ctID = %s/%04lx"
b680: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 , CACKEY_DEBUG_F
b690: 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 UNC_OBJID_TO_STR
b6a0: 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 (ccc_curr->value
b6b0: 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 _cardurl->object
b6c0: 69 64 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c id), (unsigned l
b6d0: 6f 6e 67 29 20 63 63 63 5f 63 75 72 72 2d 3e 76 ong) ccc_curr->v
b6e0: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 alue_cardurl->ob
b6f0: 6a 65 63 74 69 64 29 3b 0a 0a 09 09 6d 65 6d 63 jectid);....memc
b700: 70 79 28 63 75 72 72 5f 61 69 64 2c 20 63 63 63 py(curr_aid, ccc
b710: 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 _curr->value_car
b720: 64 75 72 6c 2d 3e 72 69 64 2c 20 73 69 7a 65 6f durl->rid, sizeo
b730: 66 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 f(ccc_curr->valu
b740: 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 29 29 e_cardurl->rid))
b750: 3b 0a 09 09 63 75 72 72 5f 61 69 64 5b 73 69 7a ;...curr_aid[siz
b760: 65 6f 66 28 63 75 72 72 5f 61 69 64 29 20 2d 20 eof(curr_aid) -
b770: 32 5d 20 3d 20 28 63 63 63 5f 63 75 72 72 2d 3e 2] = (ccc_curr->
b780: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 value_cardurl->a
b790: 70 70 69 64 20 3e 3e 20 38 29 20 26 20 30 78 66 ppid >> 8) & 0xf
b7a0: 66 3b 0a 09 09 63 75 72 72 5f 61 69 64 5b 73 69 f;...curr_aid[si
b7b0: 7a 65 6f 66 28 63 75 72 72 5f 61 69 64 29 20 2d zeof(curr_aid) -
b7c0: 20 31 5d 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e 1] = ccc_curr->
b7d0: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 value_cardurl->a
b7e0: 70 70 69 64 20 26 20 30 78 66 66 3b 0a 0a 09 09 ppid & 0xff;....
b7f0: 2f 2a 20 53 65 6c 65 63 74 20 66 6f 75 6e 64 20 /* Select found
b800: 61 70 70 6c 65 74 20 2e 2e 2e 20 2a 2f 0a 09 09 applet ... */...
b810: 73 65 6c 65 63 74 5f 72 65 74 20 3d 20 63 61 63 select_ret = cac
b820: 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 key_select_apple
b830: 74 28 73 6c 6f 74 2c 20 63 75 72 72 5f 61 69 64 t(slot, curr_aid
b840: 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 69 , sizeof(curr_ai
b850: 64 29 29 3b 0a 09 09 69 66 20 28 73 65 6c 65 63 d));...if (selec
b860: 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f t_ret != CACKEY_
b870: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 PCSC_S_OK) {....
b880: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
b890: 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73 NTF("Failed to s
b8a0: 65 6c 65 63 74 20 61 70 70 6c 65 74 2c 20 73 6b elect applet, sk
b8b0: 69 70 70 69 6e 67 20 70 72 6f 63 65 73 73 69 6e ipping processin
b8c0: 67 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 g of this object
b8d0: 22 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65 ");.....continue
b8e0: 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 2e 2e 2e 20 ;...}..../* ...
b8f0: 61 6e 64 20 6f 62 6a 65 63 74 20 28 66 69 6c 65 and object (file
b900: 29 20 2a 2f 0a 09 09 73 65 6c 65 63 74 5f 72 65 ) */...select_re
b910: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 t = cackey_selec
b920: 74 5f 66 69 6c 65 28 73 6c 6f 74 2c 20 63 63 63 t_file(slot, ccc
b930: 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 _curr->value_car
b940: 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 3b durl->objectid);
b950: 0a 09 09 69 66 20 28 73 65 6c 65 63 74 5f 72 65 ...if (select_re
b960: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 t != CACKEY_PCSC
b970: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b _S_OK) {....CACK
b980: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
b990: 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6c 65 63 "Failed to selec
b9a0: 74 20 66 69 6c 65 2c 20 73 6b 69 70 70 69 6e 67 t file, skipping
b9b0: 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 processing of t
b9c0: 68 69 73 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 his object");...
b9d0: 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a ..continue;...}.
b9e0: 0a 09 09 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 .../* Process th
b9f0: 69 73 20 66 69 6c 65 27 73 20 54 4c 56 20 6c 6f is file's TLV lo
ba00: 6f 6b 69 6e 67 20 66 6f 72 20 63 65 72 74 69 66 oking for certif
ba10: 69 63 61 74 65 73 20 2a 2f 0a 09 09 61 70 70 5f icates */...app_
ba20: 74 6c 76 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 tlv = cackey_rea
ba30: 64 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a 0a 09 09 d_tlv(slot);....
ba40: 66 6f 72 20 28 61 70 70 5f 63 75 72 72 20 3d 20 for (app_curr =
ba50: 61 70 70 5f 74 6c 76 3b 20 61 70 70 5f 63 75 72 app_tlv; app_cur
ba60: 72 3b 20 61 70 70 5f 63 75 72 72 20 3d 20 61 70 r; app_curr = ap
ba70: 70 5f 63 75 72 72 2d 3e 5f 6e 65 78 74 29 20 7b p_curr->_next) {
ba80: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
ba90: 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 74 _PRINTF("Found t
baa0: 61 67 3a 20 25 73 22 2c 20 43 41 43 4b 45 59 5f ag: %s", CACKEY_
bab0: 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 DEBUG_FUNC_TAG_T
bac0: 4f 5f 53 54 52 28 61 70 70 5f 63 75 72 72 2d 3e O_STR(app_curr->
bad0: 74 61 67 29 29 3b 0a 09 09 09 69 66 20 28 61 70 tag));....if (ap
bae0: 70 5f 63 75 72 72 2d 3e 74 61 67 20 21 3d 20 47 p_curr->tag != G
baf0: 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 SCIS_TAG_CERTIFI
bb00: 43 41 54 45 29 20 7b 0a 09 09 09 09 43 41 43 4b CATE) {.....CACK
bb10: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
bb20: 22 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20 " ... skipping
bb30: 69 74 20 28 77 65 20 6f 6e 6c 79 20 63 61 72 65 it (we only care
bb40: 20 61 62 6f 75 74 20 43 45 52 54 49 46 49 43 41 about CERTIFICA
bb50: 54 45 73 29 22 29 3b 0a 0a 09 09 09 09 63 6f 6e TEs)");......con
bb60: 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 tinue;....}.....
bb70: 63 75 72 72 5f 69 64 20 3d 20 26 63 65 72 74 73 curr_id = &certs
bb80: 5b 6f 75 74 69 64 78 5d 3b 0a 09 09 09 6f 75 74 [outidx];....out
bb90: 69 64 78 2b 2b 3b 0a 0a 09 09 09 6d 65 6d 63 70 idx++;.....memcp
bba0: 79 28 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 y(curr_id->apple
bbb0: 74 2c 20 63 75 72 72 5f 61 69 64 2c 20 73 69 7a t, curr_aid, siz
bbc0: 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e 61 70 70 eof(curr_id->app
bbd0: 6c 65 74 29 29 3b 0a 09 09 09 63 75 72 72 5f 69 let));....curr_i
bbe0: 64 2d 3e 66 69 6c 65 20 3d 20 63 63 63 5f 63 75 d->file = ccc_cu
bbf0: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 rr->value_cardur
bc00: 6c 2d 3e 6f 62 6a 65 63 74 69 64 3b 0a 09 09 09 l->objectid;....
bc10: 63 75 72 72 5f 69 64 2d 3e 6c 61 62 65 6c 20 3d curr_id->label =
bc20: 20 4e 55 4c 4c 3b 0a 0a 09 09 09 43 41 43 4b 45 NULL;.....CACKE
bc30: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
bc40: 46 69 6c 6c 69 6e 67 20 63 75 72 72 5f 69 64 2d Filling curr_id-
bc50: 3e 61 70 70 6c 65 74 20 28 25 70 29 20 77 69 74 >applet (%p) wit
bc60: 68 20 25 6c 75 20 62 79 74 65 73 3a 22 2c 20 63 h %lu bytes:", c
bc70: 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 2c 20 urr_id->applet,
bc80: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
bc90: 73 69 7a 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e sizeof(curr_id->
bca0: 61 70 70 6c 65 74 29 29 3b 0a 09 09 09 43 41 43 applet));....CAC
bcb0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 KEY_DEBUG_PRINTB
bcc0: 55 46 28 22 56 41 4c 3a 22 2c 20 63 75 72 72 5f UF("VAL:", curr_
bcd0: 69 64 2d 3e 61 70 70 6c 65 74 2c 20 73 69 7a 65 id->applet, size
bce0: 6f 66 28 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c of(curr_id->appl
bcf0: 65 74 29 29 3b 0a 0a 09 09 09 63 75 72 72 5f 69 et));.....curr_i
bd00: 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c d->certificate_l
bd10: 65 6e 20 3d 20 61 70 70 5f 63 75 72 72 2d 3e 6c en = app_curr->l
bd20: 65 6e 67 74 68 3b 0a 0a 09 09 09 63 75 72 72 5f ength;.....curr_
bd30: 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 20 id->certificate
bd40: 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72 5f 69 64 = malloc(curr_id
bd50: 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 ->certificate_le
bd60: 6e 29 3b 0a 09 09 09 6d 65 6d 63 70 79 28 63 75 n);....memcpy(cu
bd70: 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 rr_id->certifica
bd80: 74 65 2c 20 61 70 70 5f 63 75 72 72 2d 3e 76 61 te, app_curr->va
bd90: 6c 75 65 2c 20 63 75 72 72 5f 69 64 2d 3e 63 65 lue, curr_id->ce
bda0: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a rtificate_len);.
bdb0: 0a 09 09 09 69 66 20 28 6f 75 74 69 64 78 20 3e ....if (outidx >
bdc0: 3d 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 = *count) {.....
bdd0: 69 66 20 28 63 65 72 74 73 5f 72 65 73 69 7a 61 if (certs_resiza
bde0: 62 6c 65 29 20 7b 0a 09 09 09 09 09 2a 63 6f 75 ble) {......*cou
bdf0: 6e 74 20 2a 3d 20 32 3b 0a 09 09 09 09 09 63 65 nt *= 2;......ce
be00: 72 74 73 20 3d 20 72 65 61 6c 6c 6f 63 28 63 65 rts = realloc(ce
be10: 72 74 73 2c 20 73 69 7a 65 6f 66 28 2a 63 65 72 rts, sizeof(*cer
be20: 74 73 29 20 2a 20 28 2a 63 6f 75 6e 74 29 29 3b ts) * (*count));
be30: 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 .....} else {...
be40: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a ...break;.....}.
be50: 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 61 63 6b ...}...}....cack
be60: 65 79 5f 66 72 65 65 5f 74 6c 76 28 61 70 70 5f ey_free_tlv(app_
be70: 74 6c 76 29 3b 0a 0a 09 09 69 66 20 28 6f 75 74 tlv);....if (out
be80: 69 64 78 20 3e 3d 20 2a 63 6f 75 6e 74 29 20 7b idx >= *count) {
be90: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 ....break;...}..
bea0: 7d 0a 0a 09 63 61 63 6b 65 79 5f 66 72 65 65 5f }...cackey_free_
beb0: 74 6c 76 28 63 63 63 5f 74 6c 76 29 3b 0a 0a 09 tlv(ccc_tlv);...
bec0: 2a 63 6f 75 6e 74 20 3d 20 6f 75 74 69 64 78 3b *count = outidx;
bed0: 0a 0a 09 69 66 20 28 63 65 72 74 73 5f 72 65 73 ...if (certs_res
bee0: 69 7a 61 62 6c 65 29 20 7b 0a 09 09 63 65 72 74 izable) {...cert
bef0: 73 20 3d 20 72 65 61 6c 6c 6f 63 28 63 65 72 74 s = realloc(cert
bf00: 73 2c 20 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 s, sizeof(*certs
bf10: 29 20 2a 20 28 2a 63 6f 75 6e 74 29 29 3b 0a 09 ) * (*count));..
bf20: 7d 0a 0a 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65 }.../* Terminate
bf30: 20 53 6d 61 72 74 43 61 72 64 20 54 72 61 6e 73 SmartCard Trans
bf40: 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 action */..cacke
bf50: 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f y_end_transactio
bf60: 6e 28 73 6c 6f 74 29 3b 0a 0a 09 72 65 74 75 72 n(slot);...retur
bf70: 6e 28 63 65 72 74 73 29 3b 0a 7d 0a 0a 2f 2a 0a n(certs);.}../*.
bf80: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 * SYNPOSIS. *
bf90: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 .... *. * ARG
bfa0: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e UMENTS. * ..
bfb0: 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 .. *. * RETURN V
bfc0: 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a ALUE. * ....
bfd0: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 *. * NOTES. *
bfe0: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 .... *. */.st
bff0: 61 74 69 63 20 73 73 69 7a 65 5f 74 20 63 61 63 atic ssize_t cac
c000: 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28 key_signdecrypt(
c010: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c struct cackey_sl
c020: 6f 74 20 2a 73 6c 6f 74 2c 20 73 74 72 75 63 74 ot *slot, struct
c030: 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 cackey_identity
c040: 20 2a 69 64 65 6e 74 69 74 79 2c 20 75 6e 73 69 *identity, unsi
c050: 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 gned char *buf,
c060: 73 69 7a 65 5f 74 20 62 75 66 6c 65 6e 2c 20 75 size_t buflen, u
c070: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 nsigned char *ou
c080: 74 62 75 66 2c 20 73 69 7a 65 5f 74 20 6f 75 74 tbuf, size_t out
c090: 62 75 66 6c 65 6e 29 20 7b 0a 09 63 61 63 6b 65 buflen) {..cacke
c0a0: 79 5f 72 65 74 20 73 65 6e 64 5f 72 65 74 3b 0a y_ret send_ret;.
c0b0: 09 69 6e 74 20 6c 65 3b 0a 0a 09 43 41 43 4b 45 .int le;...CACKE
c0c0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
c0d0: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 Called.");...if
c0e0: 28 62 75 66 6c 65 6e 20 3e 20 32 35 35 29 20 7b (buflen > 255) {
c0f0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
c100: 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
c110: 62 75 66 6c 65 6e 20 69 73 20 67 72 65 61 74 65 buflen is greate
c120: 72 20 74 68 61 6e 20 32 35 35 20 28 62 75 66 6c r than 255 (bufl
c130: 65 6e 20 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73 en = %lu)", (uns
c140: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62 75 66 6c igned long) bufl
c150: 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d en);....return(-
c160: 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 75 74 1);..}...if (out
c170: 62 75 66 6c 65 6e 20 3e 20 32 35 33 29 20 7b 0a buflen > 253) {.
c180: 09 09 6c 65 20 3d 20 32 35 33 3b 0a 09 7d 20 65 ..le = 253;..} e
c190: 6c 73 65 20 7b 0a 09 09 6c 65 20 3d 20 6f 75 74 lse {...le = out
c1a0: 62 75 66 6c 65 6e 3b 0a 09 7d 0a 0a 09 69 66 20 buflen;..}...if
c1b0: 28 73 6c 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b (slot == NULL) {
c1c0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
c1d0: 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
c1e0: 73 6c 6f 74 20 69 73 20 4e 55 4c 4c 22 29 3b 0a slot is NULL");.
c1f0: 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 ...return(-1);..
c200: 7d 0a 0a 09 69 66 20 28 62 75 66 20 3d 3d 20 4e }...if (buf == N
c210: 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f ULL) {...CACKEY_
c220: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
c230: 72 6f 72 2e 20 20 62 75 66 20 69 73 20 4e 55 4c ror. buf is NUL
c240: 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d L");....return(-
c250: 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 75 74 1);..}...if (out
c260: 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 buf == NULL) {..
c270: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
c280: 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 6f 75 INTF("Error. ou
c290: 74 62 75 66 20 69 73 20 4e 55 4c 4c 22 29 3b 0a tbuf is NULL");.
c2a0: 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 ...return(-1);..
c2b0: 7d 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79 }...if (identity
c2c0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 == NULL) {...CA
c2d0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
c2e0: 46 28 22 45 72 72 6f 72 2e 20 20 69 64 65 6e 74 F("Error. ident
c2f0: 69 74 79 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a ity is NULL");..
c300: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d ..return(-1);..}
c310: 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d ...if (identity-
c320: 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d >pcsc_identity =
c330: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b = NULL) {...CACK
c340: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
c350: 22 45 72 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 "Error. identit
c360: 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 y->pcsc_identity
c370: 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 is NULL");....r
c380: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 eturn(-1);..}...
c390: 2f 2a 20 42 65 67 69 6e 20 74 72 61 6e 73 61 63 /* Begin transac
c3a0: 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f tion */..cackey_
c3b0: 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f begin_transactio
c3c0: 6e 28 73 6c 6f 74 29 3b 0a 0a 09 2f 2a 20 53 65 n(slot);.../* Se
c3d0: 6c 65 63 74 20 63 6f 72 72 65 63 74 20 61 70 70 lect correct app
c3e0: 6c 65 74 20 2a 2f 0a 09 43 41 43 4b 45 59 5f 44 let */..CACKEY_D
c3f0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 6c EBUG_PRINTF("Sel
c400: 65 63 74 69 6e 67 20 61 70 70 6c 65 74 20 66 6f ecting applet fo
c410: 75 6e 64 20 61 74 20 25 70 20 2e 2e 2e 22 2c 20 und at %p ...",
c420: 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 identity->pcsc_i
c430: 64 65 6e 74 69 74 79 2d 3e 61 70 70 6c 65 74 29 dentity->applet)
c440: 3b 0a 09 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 ;..cackey_select
c450: 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 69 64 _applet(slot, id
c460: 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 entity->pcsc_ide
c470: 6e 74 69 74 79 2d 3e 61 70 70 6c 65 74 2c 20 73 ntity->applet, s
c480: 69 7a 65 6f 66 28 69 64 65 6e 74 69 74 79 2d 3e izeof(identity->
c490: 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 61 pcsc_identity->a
c4a0: 70 70 6c 65 74 29 29 3b 0a 0a 09 2f 2a 20 53 65 pplet));.../* Se
c4b0: 6c 65 63 74 20 63 6f 72 72 65 63 74 20 66 69 6c lect correct fil
c4c0: 65 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 73 65 6c e */..cackey_sel
c4d0: 65 63 74 5f 66 69 6c 65 28 73 6c 6f 74 2c 20 69 ect_file(slot, i
c4e0: 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 dentity->pcsc_id
c4f0: 65 6e 74 69 74 79 2d 3e 66 69 6c 65 29 3b 0a 0a entity->file);..
c500: 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b .send_ret = cack
c510: 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f ey_send_apdu(slo
c520: 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 47 t, GSCIS_CLASS_G
c530: 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 2c 20 LOBAL_PLATFORM,
c540: 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 49 47 4e GSCIS_INSTR_SIGN
c550: 44 45 43 52 59 50 54 2c 20 30 78 30 30 2c 20 30 DECRYPT, 0x00, 0
c560: 78 30 30 2c 20 62 75 66 6c 65 6e 2c 20 62 75 66 x00, buflen, buf
c570: 2c 20 6c 65 2c 20 4e 55 4c 4c 2c 20 6f 75 74 62 , le, NULL, outb
c580: 75 66 2c 20 26 6f 75 74 62 75 66 6c 65 6e 29 3b uf, &outbuflen);
c590: 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21 ..if (send_ret !
c5a0: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f = CACKEY_PCSC_S_
c5b0: 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 OK) {...CACKEY_D
c5c0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50 EBUG_PRINTF("ADP
c5d0: 55 20 53 65 6e 64 69 6e 67 20 46 61 69 6c 65 64 U Sending Failed
c5e0: 20 2d 2d 20 72 65 74 75 72 6e 69 6e 67 20 69 6e -- returning in
c5f0: 20 65 72 72 6f 72 2e 22 29 3b 0a 0a 09 09 2f 2a error.");..../*
c600: 20 45 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e End transaction
c610: 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64 */...cackey_end
c620: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f _transaction(slo
c630: 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 t);....return(-1
c640: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 64 20 74 );..}.../* End t
c650: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 ransaction */..c
c660: 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 ackey_end_transa
c670: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 23 69 ction(slot);..#i
c680: 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41 52 41 fdef CACKEY_PARA
c690: 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20 5f 50 NOID.# ifdef _P
c6a0: 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 OSIX_SSIZE_MAX..
c6b0: 69 66 20 28 6f 75 74 62 75 66 6c 65 6e 20 3e 20 if (outbuflen >
c6c0: 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 _POSIX_SSIZE_MAX
c6d0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
c6e0: 55 47 5f 50 52 49 4e 54 46 28 22 4f 75 74 62 75 UG_PRINTF("Outbu
c6f0: 66 6c 65 6e 20 65 78 63 65 65 64 73 20 6d 61 78 flen exceeds max
c700: 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74 75 imum value, retu
c710: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 rning in failure
c720: 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 6f 75 . (max = %li, ou
c730: 74 62 75 66 6c 65 6e 20 3d 20 25 6c 75 29 22 2c tbuflen = %lu)",
c740: 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53 (long) _POSIX_S
c750: 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67 SIZE_MAX, (unsig
c760: 6e 65 64 20 6c 6f 6e 67 29 20 6f 75 74 62 75 66 ned long) outbuf
c770: 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 len);....return(
c780: 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69 66 -1);..}.# endif
c790: 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 .#endif...CACKEY
c7a0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
c7b0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 eturning in succ
c7c0: 65 73 73 2e 22 29 3b 0a 0a 09 72 65 74 75 72 6e ess.");...return
c7d0: 28 6f 75 74 62 75 66 6c 65 6e 29 3b 0a 7d 0a 0a (outbuflen);.}..
c7e0: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 /*. * SYNPOSIS.
c7f0: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 * .... *. *
c800: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 ARGUMENTS. *
c810: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 .... *. * RETUR
c820: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e N VALUE. * .
c830: 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 ... *. * NOTES.
c840: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f * .... *. */
c850: 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 .static cackey_r
c860: 65 74 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 et cackey_login(
c870: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c struct cackey_sl
c880: 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e ot *slot, unsign
c890: 65 64 20 63 68 61 72 20 2a 70 69 6e 2c 20 75 6e ed char *pin, un
c8a0: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 70 69 6e 5f signed long pin_
c8b0: 6c 65 6e 2c 20 69 6e 74 20 2a 74 72 69 65 73 5f len, int *tries_
c8c0: 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 remaining_p) {..
c8d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 61 unsigned char ca
c8e0: 63 5f 70 69 6e 5b 38 5d 20 3d 20 7b 30 78 46 46 c_pin[8] = {0xFF
c8f0: 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 , 0xFF, 0xFF, 0x
c900: 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 FF, 0xFF, 0xFF,
c910: 30 78 46 46 2c 20 30 78 46 46 7d 3b 0a 09 75 69 0xFF, 0xFF};..ui
c920: 6e 74 31 36 5f 74 20 72 65 73 70 6f 6e 73 65 5f nt16_t response_
c930: 63 6f 64 65 3b 0a 09 69 6e 74 20 74 72 69 65 73 code;..int tries
c940: 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 69 6e 74 _remaining;..int
c950: 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 2f 2a 20 send_ret;.../*
c960: 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 77 65 Indicate that we
c970: 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 61 62 6f do not know abo
c980: 75 74 20 68 6f 77 20 6d 61 6e 79 20 74 72 69 65 ut how many trie
c990: 73 20 61 72 65 20 72 65 6d 61 69 6e 69 6e 67 20 s are remaining
c9a0: 2a 2f 0a 09 69 66 20 28 74 72 69 65 73 5f 72 65 */..if (tries_re
c9b0: 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 09 2a maining_p) {...*
c9c0: 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f tries_remaining_
c9d0: 70 20 3d 20 2d 31 3b 0a 09 7d 0a 0a 09 2f 2a 20 p = -1;..}.../*
c9e0: 41 70 70 61 72 65 6e 74 6c 79 2c 20 43 41 43 20 Apparently, CAC
c9f0: 50 49 4e 73 20 61 72 65 20 2a 45 58 41 43 54 4c PINs are *EXACTL
ca00: 59 2a 20 38 20 62 79 74 65 73 20 6c 6f 6e 67 20 Y* 8 bytes long
ca10: 2d 2d 20 70 61 64 20 77 69 74 68 20 30 78 46 46 -- pad with 0xFF
ca20: 20 69 66 20 74 6f 6f 20 73 68 6f 72 74 20 2a 2f if too short */
ca30: 0a 09 69 66 20 28 70 69 6e 5f 6c 65 6e 20 3e 3d ..if (pin_len >=
ca40: 20 38 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28 63 8) {...memcpy(c
ca50: 61 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 38 29 3b ac_pin, pin, 8);
ca60: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d 65 6d ..} else {...mem
ca70: 63 70 79 28 63 61 63 5f 70 69 6e 2c 20 70 69 6e cpy(cac_pin, pin
ca80: 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a , pin_len);..}..
ca90: 09 2f 2a 20 49 73 73 75 65 20 50 49 4e 20 56 65 ./* Issue PIN Ve
caa0: 72 69 66 79 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 rify */..send_re
cab0: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f t = cackey_send_
cac0: 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 apdu(slot, GSCIS
cad0: 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 _CLASS_ISO7816,
cae0: 47 53 43 49 53 5f 49 4e 53 54 52 5f 56 45 52 49 GSCIS_INSTR_VERI
caf0: 46 59 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 FY, 0x00, 0x00,
cb00: 73 69 7a 65 6f 66 28 63 61 63 5f 70 69 6e 29 2c sizeof(cac_pin),
cb10: 20 63 61 63 5f 70 69 6e 2c 20 30 78 30 30 2c 20 cac_pin, 0x00,
cb20: 26 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 2c 20 &response_code,
cb30: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 NULL, NULL);..if
cb40: 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 (send_ret != CA
cb50: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 CKEY_PCSC_S_OK)
cb60: 7b 0a 09 09 69 66 20 28 28 72 65 73 70 6f 6e 73 {...if ((respons
cb70: 65 5f 63 6f 64 65 20 26 20 30 78 36 33 43 30 29 e_code & 0x63C0)
cb80: 20 3d 3d 20 30 78 36 33 43 30 29 20 7b 0a 09 09 == 0x63C0) {...
cb90: 09 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 .tries_remaining
cba0: 20 3d 20 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 = (response_cod
cbb0: 65 20 26 20 30 78 46 29 3b 0a 0a 09 09 09 43 41 e & 0xF);.....CA
cbc0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
cbd0: 46 28 22 50 49 4e 20 56 65 72 69 66 69 63 61 74 F("PIN Verificat
cbe0: 69 6f 6e 20 66 61 69 6c 65 64 2c 20 25 69 20 74 ion failed, %i t
cbf0: 72 69 65 73 20 72 65 6d 61 69 6e 69 6e 67 22 2c ries remaining",
cc00: 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 tries_remaining
cc10: 29 3b 0a 0a 09 09 09 69 66 20 28 74 72 69 65 73 );.....if (tries
cc20: 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a _remaining_p) {.
cc30: 09 09 09 09 2a 74 72 69 65 73 5f 72 65 6d 61 69 ....*tries_remai
cc40: 6e 69 6e 67 5f 70 20 3d 20 74 72 69 65 73 5f 72 ning_p = tries_r
cc50: 65 6d 61 69 6e 69 6e 67 3b 0a 09 09 09 7d 0a 0a emaining;....}..
cc60: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 ...return(CACKEY
cc70: 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b _PCSC_E_BADPIN);
cc80: 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72 65 73 70 ...}....if (resp
cc90: 6f 6e 73 65 5f 63 6f 64 65 20 3d 3d 20 30 78 36 onse_code == 0x6
cca0: 39 38 33 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 983) {....CACKEY
ccb0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 _DEBUG_PRINTF("P
ccc0: 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20 IN Verification
ccd0: 66 61 69 6c 65 64 2c 20 64 65 76 69 63 65 20 69 failed, device i
cce0: 73 20 6c 6f 63 6b 65 64 22 29 3b 0a 0a 09 09 09 s locked");.....
ccf0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 return(CACKEY_PC
cd00: 53 43 5f 45 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09 SC_E_LOCKED);...
cd10: 7d 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b }....return(CACK
cd20: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 EY_PCSC_E_GENERI
cd30: 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f C);..}...CACKEY_
cd40: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49 DEBUG_PRINTF("PI
cd50: 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20 73 N Verification s
cd60: 75 63 63 65 65 64 65 64 22 29 3b 0a 0a 09 72 65 ucceeded");...re
cd70: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 turn(CACKEY_PCSC
cd80: 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a _S_OK);.}../*. *
cd90: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 SYNPOSIS. *
cda0: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d .... *. * ARGUM
cdb0: 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a ENTS. * ....
cdc0: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c *. * RETURN VAL
cdd0: 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a UE. * .... *
cde0: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 . * NOTES. *
cdf0: 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 .... *. */.stat
ce00: 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 ic cackey_ret ca
ce10: 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 ckey_token_prese
ce20: 6e 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 nt(struct cackey
ce30: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 _slot *slot) {..
ce40: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 63 unsigned char cc
ce50: 63 5f 61 69 64 5b 5d 20 3d 20 7b 47 53 43 49 53 c_aid[] = {GSCIS
ce60: 5f 41 49 44 5f 43 43 43 7d 3b 0a 09 69 6e 74 20 _AID_CCC};..int
ce70: 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 2f 2a 20 53 send_ret;.../* S
ce80: 65 6c 65 63 74 20 74 68 65 20 43 43 43 20 41 70 elect the CCC Ap
ce90: 70 6c 65 74 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 plet */..send_re
cea0: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 t = cackey_selec
ceb0: 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63 t_applet(slot, c
cec0: 63 63 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 63 cc_aid, sizeof(c
ced0: 63 63 5f 61 69 64 29 29 3b 0a 09 69 66 20 28 73 cc_aid));..if (s
cee0: 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 end_ret != CACKE
cef0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 Y_PCSC_S_OK) {..
cf00: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 .return(CACKEY_P
cf10: 43 53 43 5f 53 5f 54 4f 4b 45 4e 41 42 53 45 4e CSC_S_TOKENABSEN
cf20: 54 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 T);..}...return(
cf30: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f CACKEY_PCSC_S_TO
cf40: 4b 45 4e 50 52 45 53 45 4e 54 29 3b 0a 7d 0a 0a KENPRESENT);.}..
cf50: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 /*. * SYNPOSIS.
cf60: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 * .... *. *
cf70: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 ARGUMENTS. *
cf80: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 .... *. * RETUR
cf90: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e N VALUE. * .
cfa0: 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 ... *. * NOTES.
cfb0: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f * .... *. */
cfc0: 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f 74 20 .static ssize_t
cfd0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e cackey_pcsc_iden
cfe0: 74 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28 73 74 tity_to_label(st
cff0: 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 ruct cackey_pcsc
d000: 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 _identity *ident
d010: 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 ity, unsigned ch
d020: 61 72 20 2a 6c 61 62 65 6c 5f 62 75 66 2c 20 75 ar *label_buf, u
d030: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 61 62 nsigned long lab
d040: 65 6c 5f 62 75 66 5f 6c 65 6e 29 20 7b 0a 09 75 el_buf_len) {..u
d050: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 65 72 nsigned long cer
d060: 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 63 tificate_len;..c
d070: 68 61 72 20 2a 6c 61 62 65 6c 5f 61 73 6e 31 3b har *label_asn1;
d080: 0a 09 76 6f 69 64 20 2a 63 65 72 74 69 66 69 63 ..void *certific
d090: 61 74 65 3b 0a 09 69 6e 74 20 78 35 30 39 5f 72 ate;..int x509_r
d0a0: 65 61 64 5f 72 65 74 3b 0a 0a 09 63 65 72 74 69 ead_ret;...certi
d0b0: 66 69 63 61 74 65 20 3d 20 69 64 65 6e 74 69 74 ficate = identit
d0c0: 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 3b 0a y->certificate;.
d0d0: 09 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e .certificate_len
d0e0: 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 = identity->cer
d0f0: 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09 tificate_len;...
d100: 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f if (certificate_
d110: 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 72 65 74 len < 0) {...ret
d120: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 78 35 urn(-1);..}...x5
d130: 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 09_read_ret = x5
d140: 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74 28 63 65 09_to_subject(ce
d150: 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 rtificate, certi
d160: 66 69 63 61 74 65 5f 6c 65 6e 2c 20 28 76 6f 69 ficate_len, (voi
d170: 64 20 2a 2a 29 20 26 6c 61 62 65 6c 5f 61 73 6e d **) &label_asn
d180: 31 29 3b 0a 09 69 66 20 28 78 35 30 39 5f 72 65 1);..if (x509_re
d190: 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 ad_ret < 0) {...
d1a0: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a return(-1);..}..
d1b0: 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d .x509_read_ret =
d1c0: 20 78 35 30 39 5f 64 6e 5f 74 6f 5f 73 74 72 69 x509_dn_to_stri
d1d0: 6e 67 28 6c 61 62 65 6c 5f 61 73 6e 31 2c 20 78 ng(label_asn1, x
d1e0: 35 30 39 5f 72 65 61 64 5f 72 65 74 2c 20 28 63 509_read_ret, (c
d1f0: 68 61 72 20 2a 29 20 6c 61 62 65 6c 5f 62 75 66 har *) label_buf
d200: 2c 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 2c , label_buf_len,
d210: 20 22 43 4e 22 29 3b 0a 09 69 66 20 28 78 35 30 "CN");..if (x50
d220: 39 5f 72 65 61 64 5f 72 65 74 20 3c 3d 20 30 29 9_read_ret <= 0)
d230: 20 7b 0a 09 09 78 35 30 39 5f 72 65 61 64 5f 72 {...x509_read_r
d240: 65 74 20 3d 20 78 35 30 39 5f 64 6e 5f 74 6f 5f et = x509_dn_to_
d250: 73 74 72 69 6e 67 28 6c 61 62 65 6c 5f 61 73 6e string(label_asn
d260: 31 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 1, x509_read_ret
d270: 2c 20 28 63 68 61 72 20 2a 29 20 6c 61 62 65 6c , (char *) label
d280: 5f 62 75 66 2c 20 6c 61 62 65 6c 5f 62 75 66 5f _buf, label_buf_
d290: 6c 65 6e 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 09 69 len, NULL);....i
d2a0: 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 f (x509_read_ret
d2b0: 20 3c 3d 20 30 29 20 7b 0a 09 09 09 72 65 74 75 <= 0) {....retu
d2c0: 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a rn(-1);...}..}..
d2d0: 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41 #ifdef CACKEY_PA
d2e0: 52 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20 RANOID.# ifdef
d2f0: 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 _POSIX_SSIZE_MAX
d300: 0a 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f ..if (x509_read_
d310: 72 65 74 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49 ret > _POSIX_SSI
d320: 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b ZE_MAX) {...CACK
d330: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
d340: 22 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 65 "x509_read_ret e
d350: 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 xceeds maximum v
d360: 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 alue, returning
d370: 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 in failure. (max
d380: 20 3d 20 25 6c 69 2c 20 78 35 30 39 5f 72 65 61 = %li, x509_rea
d390: 64 5f 72 65 74 20 3d 20 25 6c 75 29 22 2c 20 28 d_ret = %lu)", (
d3a0: 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53 49 long) _POSIX_SSI
d3b0: 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65 ZE_MAX, (unsigne
d3c0: 64 20 6c 6f 6e 67 29 20 78 35 30 39 5f 72 65 61 d long) x509_rea
d3d0: 64 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 d_ret);....retur
d3e0: 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 n(-1);..}.# end
d3f0: 69 66 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 if.#endif...retu
d400: 72 6e 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 rn(x509_read_ret
d410: 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 );.}../* Returns
d420: 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f 0 on success */
d430: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b .static int cack
d440: 65 79 5f 6d 75 74 65 78 5f 63 72 65 61 74 65 28 ey_mutex_create(
d450: 76 6f 69 64 20 2a 2a 6d 75 74 65 78 29 20 7b 0a void **mutex) {.
d460: 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 .pthread_mutex_t
d470: 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b *pthread_mutex;
d480: 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f 72 65 ..int pthread_re
d490: 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73 tval;..CK_RV cus
d4a0: 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 tom_retval;...CA
d4b0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
d4c0: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
d4d0: 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72 67 73 if ((cackey_args
d4e0: 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f .flags & CKF_OS_
d4f0: 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 LOCKING_OK) == C
d500: 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b KF_OS_LOCKING_OK
d510: 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 ) {...pthread_mu
d520: 74 65 78 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a tex = malloc(siz
d530: 65 6f 66 28 2a 70 74 68 72 65 61 64 5f 6d 75 74 eof(*pthread_mut
d540: 65 78 29 29 3b 0a 09 09 69 66 20 28 21 70 74 68 ex));...if (!pth
d550: 72 65 61 64 5f 6d 75 74 65 78 29 20 7b 0a 09 09 read_mutex) {...
d560: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
d570: 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 INTF("Failed to
d580: 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 2e allocate memory.
d590: 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d ");.....return(-
d5a0: 31 29 3b 0a 09 09 7d 0a 0a 09 09 70 74 68 72 65 1);...}....pthre
d5b0: 61 64 5f 72 65 74 76 61 6c 20 3d 20 70 74 68 72 ad_retval = pthr
d5c0: 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 70 ead_mutex_init(p
d5d0: 74 68 72 65 61 64 5f 6d 75 74 65 78 2c 20 4e 55 thread_mutex, NU
d5e0: 4c 4c 29 3b 0a 09 09 69 66 20 28 70 74 68 72 65 LL);...if (pthre
d5f0: 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 ad_retval != 0)
d600: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {....CACKEY_DEBU
d610: 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72 65 61 G_PRINTF("pthrea
d620: 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 29 20 72 d_mutex_init() r
d630: 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 eturned error (%
d640: 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f 72 65 i).", pthread_re
d650: 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72 tval);.....retur
d660: 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 2a 6d n(-1);...}....*m
d670: 75 74 65 78 20 3d 20 70 74 68 72 65 61 64 5f 6d utex = pthread_m
d680: 75 74 65 78 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a utex;..} else {.
d690: 09 09 69 66 20 28 63 61 63 6b 65 79 5f 61 72 67 ..if (cackey_arg
d6a0: 73 2e 43 72 65 61 74 65 4d 75 74 65 78 29 20 7b s.CreateMutex) {
d6b0: 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65 74 76 61 ....custom_retva
d6c0: 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72 67 73 2e l = cackey_args.
d6d0: 43 72 65 61 74 65 4d 75 74 65 78 28 6d 75 74 65 CreateMutex(mute
d6e0: 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 75 73 74 x);.....if (cust
d6f0: 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b 52 om_retval != CKR
d700: 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 _OK) {.....CACKE
d710: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
d720: 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 cackey_args.Crea
d730: 74 65 4d 75 74 65 78 28 29 20 72 65 74 75 72 6e teMutex() return
d740: 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29 2e 22 ed error (%li)."
d750: 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f , (long) custom_
d760: 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65 retval);......re
d770: 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 turn(-1);....}..
d780: 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 .}..}...CACKEY_D
d790: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
d7a0: 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66 75 6c urning sucessful
d7b0: 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 74 75 ly (0)");...retu
d7c0: 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 rn(0);.}../* Ret
d7d0: 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 73 urns 0 on succes
d7e0: 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 s */.static int
d7f0: 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 cackey_mutex_loc
d800: 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78 29 20 7b k(void *mutex) {
d810: 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f ..pthread_mutex_
d820: 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78 t *pthread_mutex
d830: 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f 72 ;..int pthread_r
d840: 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 etval;..CK_RV cu
d850: 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 stom_retval;...C
d860: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
d870: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
d880: 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72 67 .if ((cackey_arg
d890: 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53 s.flags & CKF_OS
d8a0: 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 _LOCKING_OK) ==
d8b0: 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f CKF_OS_LOCKING_O
d8c0: 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d K) {...pthread_m
d8d0: 75 74 65 78 20 3d 20 6d 75 74 65 78 3b 0a 0a 09 utex = mutex;...
d8e0: 09 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 .pthread_retval
d8f0: 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f = pthread_mutex_
d900: 6c 6f 63 6b 28 70 74 68 72 65 61 64 5f 6d 75 74 lock(pthread_mut
d910: 65 78 29 3b 0a 09 09 69 66 20 28 70 74 68 72 65 ex);...if (pthre
d920: 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 ad_retval != 0)
d930: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {....CACKEY_DEBU
d940: 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72 65 61 G_PRINTF("pthrea
d950: 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 29 20 72 d_mutex_lock() r
d960: 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 eturned error (%
d970: 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f 72 65 i).", pthread_re
d980: 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72 tval);.....retur
d990: 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c n(-1);...}..} el
d9a0: 73 65 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 se {...if (cacke
d9b0: 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 y_args.LockMutex
d9c0: 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65 ) {....custom_re
d9d0: 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72 tval = cackey_ar
d9e0: 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 28 6d 75 74 gs.LockMutex(mut
d9f0: 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 75 73 ex);.....if (cus
da00: 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b tom_retval != CK
da10: 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b R_OK) {.....CACK
da20: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
da30: 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 "cackey_args.Loc
da40: 6b 4d 75 74 65 78 28 29 20 72 65 74 75 72 6e 65 kMutex() returne
da50: 64 20 65 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c d error (%li).",
da60: 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72 (long) custom_r
da70: 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74 etval);......ret
da80: 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 urn(-1);....}...
da90: 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 }..}...CACKEY_DE
daa0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
dab0: 72 6e 69 6e 67 20 73 75 63 65 73 73 66 75 6c 6c rning sucessfull
dac0: 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 74 75 72 y (0)");...retur
dad0: 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 n(0);.}../* Retu
dae0: 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 73 73 rns 0 on success
daf0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 */.static int c
db00: 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f ackey_mutex_unlo
db10: 63 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78 29 20 ck(void *mutex)
db20: 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 {..pthread_mutex
db30: 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 _t *pthread_mute
db40: 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f x;..int pthread_
db50: 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 retval;..CK_RV c
db60: 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 ustom_retval;...
db70: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
db80: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a NTF("Called.");.
db90: 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72 ..if ((cackey_ar
dba0: 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f gs.flags & CKF_O
dbb0: 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d S_LOCKING_OK) ==
dbc0: 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f CKF_OS_LOCKING_
dbd0: 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f OK) {...pthread_
dbe0: 6d 75 74 65 78 20 3d 20 6d 75 74 65 78 3b 0a 0a mutex = mutex;..
dbf0: 09 09 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c ..pthread_retval
dc00: 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 = pthread_mutex
dc10: 5f 75 6e 6c 6f 63 6b 28 70 74 68 72 65 61 64 5f _unlock(pthread_
dc20: 6d 75 74 65 78 29 3b 0a 09 09 69 66 20 28 70 74 mutex);...if (pt
dc30: 68 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 hread_retval !=
dc40: 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 0) {....CACKEY_D
dc50: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68 EBUG_PRINTF("pth
dc60: 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 read_mutex_unloc
dc70: 6b 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 k() returned err
dc80: 6f 72 20 28 25 69 29 2e 22 2c 20 70 74 68 72 65 or (%i).", pthre
dc90: 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 ad_retval);.....
dca0: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a return(-1);...}.
dcb0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 .} else {...if (
dcc0: 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f cackey_args.Unlo
dcd0: 63 6b 4d 75 74 65 78 29 20 7b 0a 09 09 09 63 75 ckMutex) {....cu
dce0: 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61 stom_retval = ca
dcf0: 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b ckey_args.Unlock
dd00: 4d 75 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09 Mutex(mutex);...
dd10: 09 09 69 66 20 28 63 75 73 74 6f 6d 5f 72 65 74 ..if (custom_ret
dd20: 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b val != CKR_OK) {
dd30: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
dd40: 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79 G_PRINTF("cackey
dd50: 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 _args.UnlockMute
dd60: 78 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 x() returned err
dd70: 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e or (%li).", (lon
dd80: 67 29 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c g) custom_retval
dd90: 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d );......return(-
dda0: 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 1);....}...}..}.
ddb0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
ddc0: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
ddd0: 20 73 75 63 65 73 73 66 75 6c 6c 79 20 28 30 29 sucessfully (0)
dde0: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b ");...return(0);
ddf0: 0a 7d 0a 0a 73 74 61 74 69 63 20 43 4b 5f 41 54 .}..static CK_AT
de00: 54 52 49 42 55 54 45 5f 50 54 52 20 63 61 63 6b TRIBUTE_PTR cack
de10: 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65 ey_get_attribute
de20: 73 28 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 s(CK_OBJECT_CLAS
de30: 53 20 6f 62 6a 65 63 74 63 6c 61 73 73 2c 20 73 S objectclass, s
de40: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 truct cackey_pcs
de50: 63 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e c_identity *iden
de60: 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 20 6c tity, unsigned l
de70: 6f 6e 67 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d ong identity_num
de80: 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 , CK_ULONG_PTR p
de90: 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 73 74 61 74 ulCount) {..stat
dea0: 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 74 ic CK_BBOOL ck_t
deb0: 72 75 65 20 3d 20 31 3b 0a 09 73 74 61 74 69 63 rue = 1;..static
dec0: 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 66 61 6c CK_BBOOL ck_fal
ded0: 73 65 20 3d 20 30 3b 0a 09 43 4b 5f 55 4c 4f 4e se = 0;..CK_ULON
dee0: 47 20 6e 75 6d 61 74 74 72 73 20 3d 20 30 2c 20 G numattrs = 0,
def0: 72 65 74 76 61 6c 5f 63 6f 75 6e 74 3b 0a 09 43 retval_count;..C
df00: 4b 5f 41 54 54 52 49 42 55 54 45 5f 54 59 50 45 K_ATTRIBUTE_TYPE
df10: 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 3b curr_attr_type;
df20: 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20 63 ..CK_ATTRIBUTE c
df30: 75 72 72 5f 61 74 74 72 2c 20 2a 72 65 74 76 61 urr_attr, *retva
df40: 6c 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 l;..CK_VOID_PTR
df50: 70 56 61 6c 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e pValue;..CK_ULON
df60: 47 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 43 G ulValueLen;..C
df70: 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 63 K_OBJECT_CLASS c
df80: 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 3b 0a k_object_class;.
df90: 09 43 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f .CK_CERTIFICATE_
dfa0: 54 59 50 45 20 63 6b 5f 63 65 72 74 69 66 69 63 TYPE ck_certific
dfb0: 61 74 65 5f 74 79 70 65 3b 0a 09 43 4b 5f 4b 45 ate_type;..CK_KE
dfc0: 59 5f 54 59 50 45 20 63 6b 5f 6b 65 79 5f 74 79 Y_TYPE ck_key_ty
dfd0: 70 65 3b 0a 09 43 4b 5f 55 54 46 38 43 48 41 52 pe;..CK_UTF8CHAR
dfe0: 20 75 63 54 6d 70 42 75 66 5b 31 30 32 34 5d 3b ucTmpBuf[1024];
dff0: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 ..unsigned char
e000: 2a 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 73 *certificate;..s
e010: 73 69 7a 65 5f 74 20 63 65 72 74 69 66 69 63 61 size_t certifica
e020: 74 65 5f 6c 65 6e 20 3d 20 2d 31 2c 20 78 35 30 te_len = -1, x50
e030: 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 69 6e 74 9_read_ret;..int
e040: 20 70 56 61 6c 75 65 5f 66 72 65 65 3b 0a 0a 09 pValue_free;...
e050: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
e060: 4e 54 46 28 22 43 61 6c 6c 65 64 20 28 6f 62 6a NTF("Called (obj
e070: 65 63 74 43 6c 61 73 73 20 3d 20 25 6c 75 2c 20 ectClass = %lu,
e080: 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 3d 20 25 identity_num = %
e090: 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 lu).", (unsigned
e0a0: 20 6c 6f 6e 67 29 20 6f 62 6a 65 63 74 63 6c 61 long) objectcla
e0b0: 73 73 2c 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d ss, identity_num
e0c0: 29 3b 0a 0a 09 69 66 20 28 6f 62 6a 65 63 74 63 );...if (objectc
e0d0: 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 lass != CKO_CERT
e0e0: 49 46 49 43 41 54 45 20 26 26 20 6f 62 6a 65 63 IFICATE && objec
e0f0: 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 55 tclass != CKO_PU
e100: 42 4c 49 43 5f 4b 45 59 20 26 26 20 6f 62 6a 65 BLIC_KEY && obje
e110: 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 ctclass != CKO_P
e120: 52 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 RIVATE_KEY) {...
e130: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
e140: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 NTF("Returning 0
e150: 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c objects (NULL),
e160: 20 69 6e 76 61 6c 69 64 20 6f 62 6a 65 63 74 20 invalid object
e170: 63 6c 61 73 73 22 29 3b 0a 0a 09 09 72 65 74 75 class");....retu
e180: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f rn(NULL);..}.../
e190: 2a 20 47 65 74 20 43 65 72 74 20 2a 2f 0a 09 69 * Get Cert */..i
e1a0: 66 20 28 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e f (identity == N
e1b0: 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f ULL) {...CACKEY_
e1c0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
e1d0: 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 turning 0 object
e1e0: 73 20 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69 s (NULL), invali
e1f0: 64 20 69 64 65 6e 74 69 79 20 70 72 6f 76 69 64 d identiy provid
e200: 65 64 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 ed");....return(
e210: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 63 65 72 74 NULL);..}...cert
e220: 69 66 69 63 61 74 65 20 3d 20 69 64 65 6e 74 69 ificate = identi
e230: 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 3b ty->certificate;
e240: 0a 09 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 ..certificate_le
e250: 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 n = identity->ce
e260: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a rtificate_len;..
e270: 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65 .if (certificate
e280: 5f 6c 65 6e 20 3d 3d 20 2d 31 20 7c 7c 20 63 65 _len == -1 || ce
e290: 72 74 69 66 69 63 61 74 65 20 3d 3d 20 4e 55 4c rtificate == NUL
e2a0: 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 L) {...CACKEY_DE
e2b0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
e2c0: 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 rning 0 objects
e2d0: 28 4e 55 4c 4c 29 2c 20 74 68 69 73 20 69 64 65 (NULL), this ide
e2e0: 6e 74 69 74 79 20 64 6f 65 73 20 6e 6f 74 20 68 ntity does not h
e2f0: 61 76 65 20 61 6e 20 58 2e 35 30 39 20 63 65 72 ave an X.509 cer
e300: 74 69 66 69 63 61 74 65 20 61 73 73 6f 63 69 61 tificate associa
e310: 74 65 64 20 77 69 74 68 20 69 74 20 61 6e 64 20 ted with it and
e320: 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 22 29 3b will not work");
e330: 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 ....return(NULL)
e340: 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 79 ;..}.../* Verify
e350: 20 74 68 61 74 20 63 65 72 74 69 66 69 63 61 74 that certificat
e360: 65 20 69 73 20 41 53 4e 2e 31 20 65 6e 63 6f 64 e is ASN.1 encod
e370: 65 64 20 58 2e 35 30 39 20 63 65 72 74 69 66 69 ed X.509 certifi
e380: 63 61 74 65 20 2a 2f 0a 09 69 66 20 28 78 35 30 cate */..if (x50
e390: 39 5f 74 6f 5f 73 65 72 69 61 6c 28 63 65 72 74 9_to_serial(cert
e3a0: 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 ificate, certifi
e3b0: 63 61 74 65 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 20 cate_len, NULL)
e3c0: 3c 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f < 0) {...CACKEY_
e3d0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
e3e0: 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 turning 0 object
e3f0: 73 20 28 4e 55 4c 4c 29 2c 20 74 68 65 20 58 2e s (NULL), the X.
e400: 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20 509 certificate
e410: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 associated with
e420: 74 68 69 73 20 69 64 65 6e 74 69 74 79 20 69 73 this identity is
e430: 20 6e 6f 74 20 76 61 6c 69 64 22 29 3b 0a 0a 09 not valid");...
e440: 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 .return(NULL);..
e450: 7d 0a 0a 09 72 65 74 76 61 6c 5f 63 6f 75 6e 74 }...retval_count
e460: 20 3d 20 31 36 3b 0a 09 72 65 74 76 61 6c 20 3d = 16;..retval =
e470: 20 6d 61 6c 6c 6f 63 28 72 65 74 76 61 6c 5f 63 malloc(retval_c
e480: 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 ount * sizeof(*r
e490: 65 74 76 61 6c 29 29 3b 0a 0a 09 66 6f 72 20 28 etval));...for (
e4a0: 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3d curr_attr_type =
e4b0: 20 30 3b 20 63 75 72 72 5f 61 74 74 72 5f 74 79 0; curr_attr_ty
e4c0: 70 65 20 3c 20 30 78 63 65 35 33 36 33 35 66 3b pe < 0xce53635f;
e4d0: 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 2b curr_attr_type+
e4e0: 2b 29 20 7b 0a 09 09 69 66 20 28 63 75 72 72 5f +) {...if (curr_
e4f0: 61 74 74 72 5f 74 79 70 65 20 3d 3d 20 30 78 38 attr_type == 0x8
e500: 30 30 29 20 7b 0a 09 09 09 63 75 72 72 5f 61 74 00) {....curr_at
e510: 74 72 5f 74 79 70 65 20 3d 20 30 78 63 65 35 33 tr_type = 0xce53
e520: 36 33 30 30 3b 0a 09 09 7d 0a 0a 09 09 70 56 61 6300;...}....pVa
e530: 6c 75 65 5f 66 72 65 65 20 3d 20 30 3b 0a 09 09 lue_free = 0;...
e540: 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 pValue = NULL;..
e550: 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 .ulValueLen = (C
e560: 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 73 K_LONG) -1;....s
e570: 77 69 74 63 68 20 28 63 75 72 72 5f 61 74 74 72 witch (curr_attr
e580: 5f 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65 _type) {....case
e590: 20 43 4b 41 5f 43 4c 41 53 53 3a 0a 09 09 09 09 CKA_CLASS:.....
e5a0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
e5b0: 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 NTF("Requesting
e5c0: 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43 4c attribute CKA_CL
e5d0: 41 53 53 20 28 30 78 25 30 38 6c 78 29 20 2e 2e ASS (0x%08lx) ..
e5e0: 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f .", (unsigned lo
e5f0: 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 ng) curr_attr_ty
e600: 70 65 29 3b 0a 0a 09 09 09 09 63 6b 5f 6f 62 6a pe);......ck_obj
e610: 65 63 74 5f 63 6c 61 73 73 20 3d 20 6f 62 6a 65 ect_class = obje
e620: 63 74 63 6c 61 73 73 3b 0a 0a 09 09 09 09 70 56 ctclass;......pV
e630: 61 6c 75 65 20 3d 20 26 63 6b 5f 6f 62 6a 65 63 alue = &ck_objec
e640: 74 5f 63 6c 61 73 73 3b 0a 09 09 09 09 75 6c 56 t_class;.....ulV
e650: 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 alueLen = sizeof
e660: 28 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 (ck_object_class
e670: 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 );......CACKEY_D
e680: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e EBUG_PRINTF(" ..
e690: 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 . returning %lu
e6a0: 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 (%p/%lu)", (unsi
e6b0: 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b gned long) *((CK
e6c0: 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 2a 29 _OBJECT_CLASS *)
e6d0: 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 pValue), pValue
e6e0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
e6f0: 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a ) ulValueLen);..
e700: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 ....break;....ca
e710: 73 65 20 43 4b 41 5f 54 4f 4b 45 4e 3a 0a 09 09 se CKA_TOKEN:...
e720: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
e730: 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e RINTF("Requestin
e740: 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f g attribute CKA_
e750: 54 4f 4b 45 4e 20 28 30 78 25 30 38 6c 78 29 20 TOKEN (0x%08lx)
e760: 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 ...", (unsigned
e770: 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f long) curr_attr_
e780: 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c type);......pVal
e790: 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 ue = &ck_true;..
e7a0: 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 ...ulValueLen =
e7b0: 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b sizeof(ck_true);
e7c0: 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 ......CACKEY_DEB
e7d0: 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 UG_PRINTF(" ...
e7e0: 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 returning %lu (%
e7f0: 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e p/%lu)", (unsign
e800: 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 ed long) *((CK_B
e810: 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c BOOL *) pValue),
e820: 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e pValue, (unsign
e830: 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 ed long) ulValue
e840: 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b Len);......break
e850: 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f ;....case CKA_MO
e860: 44 49 46 49 41 42 4c 45 3a 0a 09 09 09 09 43 41 DIFIABLE:.....CA
e870: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
e880: 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 F("Requesting at
e890: 74 72 69 62 75 74 65 20 43 4b 41 5f 4d 4f 44 49 tribute CKA_MODI
e8a0: 46 49 41 42 4c 45 20 28 30 78 25 30 38 6c 78 29 FIABLE (0x%08lx)
e8b0: 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 ...", (unsigned
e8c0: 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 long) curr_attr
e8d0: 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 _type);......pVa
e8e0: 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b lue = &ck_false;
e8f0: 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 .....ulValueLen
e900: 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 = sizeof(ck_fals
e910: 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f e);......CACKEY_
e920: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e DEBUG_PRINTF(" .
e930: 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 .. returning %lu
e940: 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 (%p/%lu)", (uns
e950: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 igned long) *((C
e960: 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 K_BBOOL *) pValu
e970: 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 e), pValue, (uns
e980: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 igned long) ulVa
e990: 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 lueLen);......br
e9a0: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 eak;....case CKA
e9b0: 5f 4c 41 42 45 4c 3a 0a 09 09 09 09 43 41 43 4b _LABEL:.....CACK
e9c0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
e9d0: 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 "Requesting attr
e9e0: 69 62 75 74 65 20 43 4b 41 5f 4c 41 42 45 4c 20 ibute CKA_LABEL
e9f0: 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 (0x%08lx) ...",
ea00: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
ea10: 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b curr_attr_type);
ea20: 0a 0a 09 09 09 09 2f 2a 20 44 65 74 65 72 6d 69 ....../* Determi
ea30: 6e 65 20 6e 61 6d 65 20 2a 2f 0a 09 09 09 09 78 ne name */.....x
ea40: 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 63 509_read_ret = c
ea50: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 ackey_pcsc_ident
ea60: 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28 69 64 65 ity_to_label(ide
ea70: 6e 74 69 74 79 2c 20 75 63 54 6d 70 42 75 66 2c ntity, ucTmpBuf,
ea80: 20 73 69 7a 65 6f 66 28 75 63 54 6d 70 42 75 66 sizeof(ucTmpBuf
ea90: 29 29 3b 0a 09 09 09 09 69 66 20 28 78 35 30 39 ));.....if (x509
eaa0: 5f 72 65 61 64 5f 72 65 74 20 3e 20 30 29 20 7b _read_ret > 0) {
eab0: 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 75 ......pValue = u
eac0: 63 54 6d 70 42 75 66 3b 0a 09 09 09 09 09 75 6c cTmpBuf;......ul
ead0: 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f ValueLen = x509_
eae0: 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 7d 0a read_ret;.....}.
eaf0: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
eb00: 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 G_PRINTF(" ... r
eb10: 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75 eturning (%p/%lu
eb20: 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 )", pValue, (uns
eb30: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 igned long) ulVa
eb40: 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 lueLen);......br
eb50: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 eak;....case CKA
eb60: 5f 56 41 4c 55 45 3a 0a 09 09 09 09 43 41 43 4b _VALUE:.....CACK
eb70: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
eb80: 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 "Requesting attr
eb90: 69 62 75 74 65 20 43 4b 41 5f 56 41 4c 55 45 20 ibute CKA_VALUE
eba0: 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 (0x%08lx) ...",
ebb0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
ebc0: 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b curr_attr_type);
ebd0: 0a 0a 09 09 09 09 73 77 69 74 63 68 20 28 6f 62 ......switch (ob
ebe0: 6a 65 63 74 63 6c 61 73 73 29 20 7b 0a 09 09 09 jectclass) {....
ebf0: 09 09 63 61 73 65 20 43 4b 4f 5f 50 52 49 56 41 ..case CKO_PRIVA
ec00: 54 45 5f 4b 45 59 3a 0a 09 09 09 09 09 09 43 41 TE_KEY:.......CA
ec10: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
ec20: 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 F(" ... but not
ec30: 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 getting it becau
ec40: 73 65 20 77 65 20 61 72 65 20 61 20 70 72 69 76 se we are a priv
ec50: 61 74 65 20 6b 65 79 2e 22 29 3b 0a 0a 09 09 09 ate key.");.....
ec60: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 ...break;......c
ec70: 61 73 65 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b ase CKO_PUBLIC_K
ec80: 45 59 3a 0a 09 09 09 09 09 09 2f 2a 20 58 58 58 EY:......./* XXX
ec90: 3a 20 54 4f 44 4f 20 2a 2f 0a 0a 09 09 09 09 09 : TODO */.......
eca0: 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73 .break;......cas
ecb0: 65 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 e CKO_CERTIFICAT
ecc0: 45 3a 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 E:.......pValue
ecd0: 3d 20 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 = certificate;..
ece0: 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 .....ulValueLen
ecf0: 3d 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 = certificate_le
ed00: 6e 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b n;........break;
ed10: 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b .....}......CACK
ed20: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
ed30: 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 " ... returning
ed40: 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c %p/%lu", pValue,
ed50: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
ed60: 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 ulValueLen);...
ed70: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 ...break;....cas
ed80: 65 20 43 4b 41 5f 49 53 53 55 45 52 3a 0a 09 09 e CKA_ISSUER:...
ed90: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
eda0: 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e RINTF("Requestin
edb0: 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f g attribute CKA_
edc0: 49 53 53 55 45 52 20 28 30 78 25 30 38 6c 78 29 ISSUER (0x%08lx)
edd0: 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 ...", (unsigned
ede0: 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 long) curr_attr
edf0: 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 _type);......if
ee00: 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 (objectclass !=
ee10: 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 29 CKO_CERTIFICATE)
ee20: 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 {......CACKEY_D
ee30: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e EBUG_PRINTF(" ..
ee40: 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e . but not gettin
ee50: 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 g it because we
ee60: 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66 are not a certif
ee70: 69 63 61 74 65 2e 22 29 3b 0a 0a 09 09 09 09 09 icate.");.......
ee80: 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 break;.....}....
ee90: 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 ..if (certificat
eea0: 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 e_len >= 0) {...
eeb0: 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 ...x509_read_ret
eec0: 20 3d 20 78 35 30 39 5f 74 6f 5f 69 73 73 75 65 = x509_to_issue
eed0: 72 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 r(certificate, c
eee0: 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 ertificate_len,
eef0: 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 &pValue);......i
ef00: 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 f (x509_read_ret
ef10: 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56 < 0) {.......pV
ef20: 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 alue = NULL;....
ef30: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 ..} else {......
ef40: 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 .ulValueLen = x5
ef50: 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09_read_ret;....
ef60: 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 ..}.....}......C
ef70: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
ef80: 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 TF(" ... returni
ef90: 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c ng %p/%lu", pVal
efa0: 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f ue, (unsigned lo
efb0: 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b ng) ulValueLen);
efc0: 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 ......break;....
efd0: 63 61 73 65 20 43 4b 41 5f 53 45 52 49 41 4c 5f case CKA_SERIAL_
efe0: 4e 55 4d 42 45 52 3a 0a 09 09 09 09 43 41 43 4b NUMBER:.....CACK
eff0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
f000: 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 "Requesting attr
f010: 69 62 75 74 65 20 43 4b 41 5f 53 45 52 49 41 4c ibute CKA_SERIAL
f020: 5f 4e 55 4d 42 45 52 20 28 30 78 25 30 38 6c 78 _NUMBER (0x%08lx
f030: 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 ) ...", (unsigne
f040: 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 d long) curr_att
f050: 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 r_type);......if
f060: 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d (objectclass !=
f070: 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 CKO_CERTIFICATE
f080: 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f ) {......CACKEY_
f090: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e DEBUG_PRINTF(" .
f0a0: 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 .. but not getti
f0b0: 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 ng it because we
f0c0: 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69 are not a certi
f0d0: 66 69 63 61 74 65 2e 22 29 3b 0a 0a 09 09 09 09 ficate.");......
f0e0: 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 .break;.....}...
f0f0: 09 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61 ...if (certifica
f100: 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 te_len >= 0) {..
f110: 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 ....x509_read_re
f120: 74 20 3d 20 78 35 30 39 5f 74 6f 5f 73 65 72 69 t = x509_to_seri
f130: 61 6c 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 al(certificate,
f140: 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c certificate_len,
f150: 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 &pValue);......
f160: 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 if (x509_read_re
f170: 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 t < 0) {.......p
f180: 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 Value = NULL;...
f190: 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 ...} else {.....
f1a0: 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 ..ulValueLen = x
f1b0: 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 509_read_ret;...
f1c0: 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 ...}.....}......
f1d0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
f1e0: 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e NTF(" ... return
f1f0: 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 ing (%p/%lu)", p
f200: 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 Value, (unsigned
f210: 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 long) ulValueLe
f220: 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a n);......break;.
f230: 09 09 09 63 61 73 65 20 43 4b 41 5f 53 55 42 4a ...case CKA_SUBJ
f240: 45 43 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f ECT:.....CACKEY_
f250: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
f260: 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 questing attribu
f270: 74 65 20 43 4b 41 5f 53 55 42 4a 45 43 54 20 28 te CKA_SUBJECT (
f280: 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 0x%08lx) ...", (
f290: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 unsigned long) c
f2a0: 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a urr_attr_type);.
f2b0: 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 .....if (objectc
f2c0: 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 lass != CKO_CERT
f2d0: 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09 09 IFICATE) {......
f2e0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
f2f0: 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f NTF(" ... but no
f300: 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 t getting it bec
f310: 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 ause we are not
f320: 61 20 63 65 72 74 69 66 69 63 61 74 65 2e 22 29 a certificate.")
f330: 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 ;.......break;..
f340: 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 ...}......if (ce
f350: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d rtificate_len >=
f360: 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 0) {......x509_
f370: 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f read_ret = x509_
f380: 74 6f 5f 73 75 62 6a 65 63 74 28 63 65 72 74 69 to_subject(certi
f390: 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 ficate, certific
f3a0: 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 ate_len, &pValue
f3b0: 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 39 );......if (x509
f3c0: 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b _read_ret < 0) {
f3d0: 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 .......pValue =
f3e0: 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 NULL;......} els
f3f0: 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 e {.......ulValu
f400: 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 eLen = x509_read
f410: 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 _ret;......}....
f420: 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 .}......CACKEY_D
f430: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e EBUG_PRINTF(" ..
f440: 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 . returning %p/%
f450: 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e lu", pValue, (un
f460: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 signed long) ulV
f470: 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 alueLen);......b
f480: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b reak;....case CK
f490: 41 5f 49 44 3a 0a 09 09 09 09 43 41 43 4b 45 59 A_ID:.....CACKEY
f4a0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
f4b0: 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 equesting attrib
f4c0: 75 74 65 20 43 4b 41 5f 49 44 20 28 30 78 25 30 ute CKA_ID (0x%0
f4d0: 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 8lx) ...", (unsi
f4e0: 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f gned long) curr_
f4f0: 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 attr_type);.....
f500: 09 75 63 54 6d 70 42 75 66 5b 30 5d 20 3d 20 28 .ucTmpBuf[0] = (
f510: 28 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 2b 20 (identity_num +
f520: 31 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 1) >> 8) & 0xff;
f530: 0a 09 09 09 09 75 63 54 6d 70 42 75 66 5b 31 5d .....ucTmpBuf[1]
f540: 20 3d 20 20 28 69 64 65 6e 74 69 74 79 5f 6e 75 = (identity_nu
f550: 6d 20 2b 20 31 29 20 26 20 30 78 66 66 3b 0a 0a m + 1) & 0xff;..
f560: 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 75 63 ....pValue = &uc
f570: 54 6d 70 42 75 66 3b 0a 09 09 09 09 75 6c 56 61 TmpBuf;.....ulVa
f580: 6c 75 65 4c 65 6e 20 3d 20 32 3b 0a 0a 09 09 09 lueLen = 2;.....
f590: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
f5a0: 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 INTF(" ... retur
f5b0: 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 ning %p/%lu", pV
f5c0: 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 alue, (unsigned
f5d0: 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e long) ulValueLen
f5e0: 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 );......break;..
f5f0: 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52 54 49 ..case CKA_CERTI
f600: 46 49 43 41 54 45 5f 54 59 50 45 3a 0a 09 09 09 FICATE_TYPE:....
f610: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
f620: 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 INTF("Requesting
f630: 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43 attribute CKA_C
f640: 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 20 ERTIFICATE_TYPE
f650: 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 (0x%08lx) ...",
f660: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
f670: 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b curr_attr_type);
f680: 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 ......if (object
f690: 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 class != CKO_CER
f6a0: 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09 TIFICATE) {.....
f6b0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
f6c0: 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e INTF(" ... but n
f6d0: 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 ot getting it be
f6e0: 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 cause we are not
f6f0: 20 61 20 63 65 72 74 69 66 69 63 61 74 65 2e 22 a certificate."
f700: 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a );.......break;.
f710: 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 57 65 ....}....../* We
f720: 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 6f 6e only support on
f730: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 74 79 e certificate ty
f740: 70 65 20 2a 2f 0a 09 09 09 09 63 6b 5f 63 65 72 pe */.....ck_cer
f750: 74 69 66 69 63 61 74 65 5f 74 79 70 65 20 3d 20 tificate_type =
f760: 43 4b 43 5f 58 5f 35 30 39 3b 0a 0a 09 09 09 09 CKC_X_509;......
f770: 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 63 65 72 pValue = &ck_cer
f780: 74 69 66 69 63 61 74 65 5f 74 79 70 65 3b 0a 09 tificate_type;..
f790: 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 ...ulValueLen =
f7a0: 73 69 7a 65 6f 66 28 63 6b 5f 63 65 72 74 69 66 sizeof(ck_certif
f7b0: 69 63 61 74 65 5f 74 79 70 65 29 3b 0a 0a 09 09 icate_type);....
f7c0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
f7d0: 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 RINTF(" ... retu
f7e0: 72 6e 69 6e 67 20 43 4b 43 5f 58 5f 35 30 39 20 rning CKC_X_509
f7f0: 28 25 6c 75 29 20 28 25 70 2f 25 6c 75 29 22 2c (%lu) (%p/%lu)",
f800: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
f810: 20 2a 28 28 43 4b 5f 43 45 52 54 49 46 49 43 41 *((CK_CERTIFICA
f820: 54 45 5f 54 59 50 45 20 2a 29 20 70 56 61 6c 75 TE_TYPE *) pValu
f830: 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 e), pValue, (uns
f840: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 igned long) ulVa
f850: 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 lueLen);......br
f860: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 eak;....case CKA
f870: 5f 4b 45 59 5f 54 59 50 45 3a 0a 09 09 09 09 43 _KEY_TYPE:.....C
f880: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
f890: 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 TF("Requesting a
f8a0: 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4b 45 59 ttribute CKA_KEY
f8b0: 5f 54 59 50 45 20 28 30 78 25 30 38 6c 78 29 20 _TYPE (0x%08lx)
f8c0: 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 ...", (unsigned
f8d0: 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f long) curr_attr_
f8e0: 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 type);......if (
f8f0: 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 objectclass != C
f900: 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 26 KO_PRIVATE_KEY &
f910: 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d & objectclass !=
f920: 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 29 CKO_PUBLIC_KEY)
f930: 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 {......CACKEY_D
f940: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e EBUG_PRINTF(" ..
f950: 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e . but not gettin
f960: 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 g it because we
f970: 61 72 65 20 6e 6f 74 20 61 20 6b 65 79 2e 22 29 are not a key.")
f980: 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 ;.......break;..
f990: 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 57 65 20 ...}....../* We
f9a0: 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 6f 6e 65 only support one
f9b0: 20 6b 65 79 20 74 79 70 65 20 2a 2f 0a 09 09 09 key type */....
f9c0: 09 63 6b 5f 6b 65 79 5f 74 79 70 65 20 3d 20 43 .ck_key_type = C
f9d0: 4b 4b 5f 52 53 41 3b 0a 0a 09 09 09 09 70 56 61 KK_RSA;......pVa
f9e0: 6c 75 65 20 3d 20 26 63 6b 5f 6b 65 79 5f 74 79 lue = &ck_key_ty
f9f0: 70 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c pe;.....ulValueL
fa00: 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 6b en = sizeof(ck_k
fa10: 65 79 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 43 ey_type);......C
fa20: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
fa30: 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 TF(" ... returni
fa40: 6e 67 20 43 4b 4b 5f 52 53 41 20 28 25 6c 75 29 ng CKK_RSA (%lu)
fa50: 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 (%p/%lu)", (uns
fa60: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 igned long) *((C
fa70: 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 K_CERTIFICATE_TY
fa80: 50 45 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 PE *) pValue), p
fa90: 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 Value, (unsigned
faa0: 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 long) ulValueLe
fab0: 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a n);......break;.
fac0: 09 09 09 63 61 73 65 20 43 4b 41 5f 53 49 47 4e ...case CKA_SIGN
fad0: 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 :.....CACKEY_DEB
fae0: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 UG_PRINTF("Reque
faf0: 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 sting attribute
fb00: 43 4b 41 5f 53 49 47 4e 20 28 30 78 25 30 38 6c CKA_SIGN (0x%08l
fb10: 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e x) ...", (unsign
fb20: 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 ed long) curr_at
fb30: 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 tr_type);......i
fb40: 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d f (objectclass =
fb50: 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 = CKO_PRIVATE_KE
fb60: 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 Y) {......pValue
fb70: 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 = &ck_true;....
fb80: 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 ..ulValueLen = s
fb90: 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a izeof(ck_true);.
fba0: 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 ....} else {....
fbb0: 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 ..pValue = &ck_f
fbc0: 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c alse;......ulVal
fbd0: 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 ueLen = sizeof(c
fbe0: 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a k_false);.....}.
fbf0: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
fc00: 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 G_PRINTF(" ... r
fc10: 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 eturning %lu (%p
fc20: 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 /%lu)", (unsigne
fc30: 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 d long) *((CK_BB
fc40: 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 OOL *) pValue),
fc50: 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 pValue, (unsigne
fc60: 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c d long) ulValueL
fc70: 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b en);......break;
fc80: 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 44 45 43 ....case CKA_DEC
fc90: 52 59 50 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 RYPT:.....CACKEY
fca0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
fcb0: 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 equesting attrib
fcc0: 75 74 65 20 43 4b 41 5f 44 45 43 52 59 50 54 20 ute CKA_DECRYPT
fcd0: 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 (0x%08lx) ...",
fce0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
fcf0: 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b curr_attr_type);
fd00: 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 ......if (object
fd10: 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 class == CKO_PRI
fd20: 56 41 54 45 5f 4b 45 59 20 7c 7c 20 6f 62 6a 65 VATE_KEY || obje
fd30: 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 ctclass == CKO_P
fd40: 55 42 4c 49 43 5f 4b 45 59 29 20 7b 0a 09 09 09 UBLIC_KEY) {....
fd50: 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 ..pValue = &ck_t
fd60: 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 rue;......ulValu
fd70: 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b eLen = sizeof(ck
fd80: 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c _true);.....} el
fd90: 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 se {......pValue
fda0: 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 = &ck_false;...
fdb0: 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 ...ulValueLen =
fdc0: 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 sizeof(ck_false)
fdd0: 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 ;.....}......CAC
fde0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
fdf0: 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 (" ... returning
fe00: 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 %lu (%p/%lu)",
fe10: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
fe20: 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 *((CK_BBOOL *) p
fe30: 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 Value), pValue,
fe40: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
fe50: 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 ulValueLen);....
fe60: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 ..break;....case
fe70: 20 43 4b 41 5f 54 52 55 53 54 5f 53 45 52 56 45 CKA_TRUST_SERVE
fe80: 52 5f 41 55 54 48 3a 0a 09 09 09 09 43 41 43 4b R_AUTH:.....CACK
fe90: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
fea0: 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 "Requesting attr
feb0: 69 62 75 74 65 20 43 4b 41 5f 54 52 55 53 54 5f ibute CKA_TRUST_
fec0: 53 45 52 56 45 52 5f 41 55 54 48 20 28 30 78 25 SERVER_AUTH (0x%
fed0: 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 08lx) ...", (uns
fee0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 igned long) curr
fef0: 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 _attr_type);....
ff00: 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 ..pValue = &ck_t
ff10: 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 rue;.....ulValue
ff20: 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f Len = sizeof(ck_
ff30: 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b true);......CACK
ff40: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
ff50: 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 " ... returning
ff60: 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 %lu (%p/%lu)", (
ff70: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a unsigned long) *
ff80: 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 ((CK_BBOOL *) pV
ff90: 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 alue), pValue, (
ffa0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 unsigned long) u
ffb0: 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 lValueLen);.....
ffc0: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 .break;....case
ffd0: 43 4b 41 5f 54 52 55 53 54 5f 43 4c 49 45 4e 54 CKA_TRUST_CLIENT
ffe0: 5f 41 55 54 48 3a 0a 09 09 09 09 43 41 43 4b 45 _AUTH:.....CACKE
fff0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
10000 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 Requesting attri
10010 62 75 74 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 bute CKA_TRUST_C
10020 4c 49 45 4e 54 5f 41 55 54 48 20 28 30 78 25 30 LIENT_AUTH (0x%0
10030 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 8lx) ...", (unsi
10040 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f gned long) curr_
10050 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 attr_type);.....
10060 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 .pValue = &ck_tr
10070 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c ue;.....ulValueL
10080 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 en = sizeof(ck_t
10090 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 rue);......CACKE
100a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
100b0 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 ... returning %
100c0 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 lu (%p/%lu)", (u
100d0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 nsigned long) *(
100e0 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 (CK_BBOOL *) pVa
100f0 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 lue), pValue, (u
10100 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c nsigned long) ul
10110 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 ValueLen);......
10120 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 break;....case C
10130 4b 41 5f 54 52 55 53 54 5f 43 4f 44 45 5f 53 49 KA_TRUST_CODE_SI
10140 47 4e 49 4e 47 3a 0a 09 09 09 09 43 41 43 4b 45 GNING:.....CACKE
10150 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
10160 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 Requesting attri
10170 62 75 74 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 bute CKA_TRUST_C
10180 4f 44 45 5f 53 49 47 4e 49 4e 47 20 28 30 78 25 ODE_SIGNING (0x%
10190 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 08lx) ...", (uns
101a0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 igned long) curr
101b0 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 _attr_type);....
101c0 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 ..pValue = &ck_t
101d0 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 rue;.....ulValue
101e0 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f Len = sizeof(ck_
101f0 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b true);......CACK
10200 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
10210 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 " ... returning
10220 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 %lu (%p/%lu)", (
10230 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a unsigned long) *
10240 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 ((CK_BBOOL *) pV
10250 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 alue), pValue, (
10260 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 unsigned long) u
10270 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 lValueLen);.....
10280 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 .break;....case
10290 43 4b 41 5f 54 52 55 53 54 5f 45 4d 41 49 4c 5f CKA_TRUST_EMAIL_
102a0 50 52 4f 54 45 43 54 49 4f 4e 3a 0a 09 09 09 09 PROTECTION:.....
102b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
102c0 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 NTF("Requesting
102d0 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52 attribute CKA_TR
102e0 55 53 54 5f 45 4d 41 49 4c 5f 50 52 4f 54 45 43 UST_EMAIL_PROTEC
102f0 54 49 4f 4e 20 28 30 78 25 30 38 6c 78 29 20 2e TION (0x%08lx) .
10300 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c ..", (unsigned l
10310 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 ong) curr_attr_t
10320 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 ype);......pValu
10330 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 e = &ck_true;...
10340 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 ..ulValueLen = s
10350 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a izeof(ck_true);.
10360 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
10370 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 G_PRINTF(" ... r
10380 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 eturning %lu (%p
10390 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 /%lu)", (unsigne
103a0 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 d long) *((CK_BB
103b0 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 OOL *) pValue),
103c0 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 pValue, (unsigne
103d0 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c d long) ulValueL
103e0 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b en);......break;
103f0 0a 09 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 ....default:....
10400 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a .pValue = NULL;.
10410 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d ....ulValueLen =
10420 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 09 (CK_LONG) -1;..
10430 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 ...break;...}...
10440 09 69 66 20 28 28 28 43 4b 5f 4c 4f 4e 47 29 20 .if (((CK_LONG)
10450 75 6c 56 61 6c 75 65 4c 65 6e 29 20 21 3d 20 28 ulValueLen) != (
10460 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 29 29 20 7b (CK_LONG) -1)) {
10470 0a 09 09 09 2f 2a 20 50 75 73 68 20 63 75 72 72 ..../* Push curr
10480 5f 61 74 74 72 20 6f 6e 74 6f 20 74 68 65 20 73 _attr onto the s
10490 74 61 63 6b 20 2a 2f 0a 09 09 09 63 75 72 72 5f tack */....curr_
104a0 61 74 74 72 2e 74 79 70 65 20 3d 20 63 75 72 72 attr.type = curr
104b0 5f 61 74 74 72 5f 74 79 70 65 3b 0a 09 09 09 63 _attr_type;....c
104c0 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65 urr_attr.ulValue
104d0 4c 65 6e 20 3d 20 75 6c 56 61 6c 75 65 4c 65 6e Len = ulValueLen
104e0 3b 0a 0a 09 09 09 63 75 72 72 5f 61 74 74 72 2e ;.....curr_attr.
104f0 70 56 61 6c 75 65 20 3d 20 6d 61 6c 6c 6f 63 28 pValue = malloc(
10500 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75 curr_attr.ulValu
10510 65 4c 65 6e 29 3b 0a 09 09 09 6d 65 6d 63 70 79 eLen);....memcpy
10520 28 63 75 72 72 5f 61 74 74 72 2e 70 56 61 6c 75 (curr_attr.pValu
10530 65 2c 20 70 56 61 6c 75 65 2c 20 63 75 72 72 5f e, pValue, curr_
10540 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 attr.ulValueLen)
10550 3b 0a 0a 09 09 09 69 66 20 28 70 56 61 6c 75 65 ;.....if (pValue
10560 5f 66 72 65 65 20 26 26 20 70 56 61 6c 75 65 29 _free && pValue)
10570 20 7b 0a 09 09 09 09 66 72 65 65 28 70 56 61 6c {.....free(pVal
10580 75 65 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 ue);....}.....if
10590 20 28 6e 75 6d 61 74 74 72 73 20 3e 3d 20 72 65 (numattrs >= re
105a0 74 76 61 6c 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 tval_count) {...
105b0 09 09 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a ..retval_count *
105c0 3d 20 32 3b 0a 09 09 09 09 72 65 74 76 61 6c 20 = 2;.....retval
105d0 3d 20 72 65 61 6c 6c 6f 63 28 72 65 74 76 61 6c = realloc(retval
105e0 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a , retval_count *
105f0 20 73 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29 sizeof(*retval)
10600 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d 65 6d 63 );....}.....memc
10610 70 79 28 26 72 65 74 76 61 6c 5b 6e 75 6d 61 74 py(&retval[numat
10620 74 72 73 5d 2c 20 26 63 75 72 72 5f 61 74 74 72 trs], &curr_attr
10630 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 74 , sizeof(curr_at
10640 74 72 29 29 3b 0a 09 09 09 6e 75 6d 61 74 74 72 tr));....numattr
10650 73 2b 2b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 s++;...}..}...if
10660 20 28 6e 75 6d 61 74 74 72 73 20 21 3d 20 30 29 (numattrs != 0)
10670 20 7b 0a 09 09 72 65 74 76 61 6c 5f 63 6f 75 6e {...retval_coun
10680 74 20 3d 20 6e 75 6d 61 74 74 72 73 3b 0a 09 09 t = numattrs;...
10690 72 65 74 76 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 retval = realloc
106a0 28 72 65 74 76 61 6c 2c 20 72 65 74 76 61 6c 5f (retval, retval_
106b0 63 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a count * sizeof(*
106c0 72 65 74 76 61 6c 29 29 3b 0a 09 7d 20 65 6c 73 retval));..} els
106d0 65 20 7b 0a 09 09 66 72 65 65 28 72 65 74 76 61 e {...free(retva
106e0 6c 29 3b 0a 0a 09 09 72 65 74 76 61 6c 20 3d 20 l);....retval =
106f0 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 43 NULL;..}...*pulC
10700 6f 75 6e 74 20 3d 20 6e 75 6d 61 74 74 72 73 3b ount = numattrs;
10710 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
10720 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e PRINTF("Returnin
10730 67 20 25 6c 75 20 6f 62 6a 65 63 74 73 20 28 25 g %lu objects (%
10740 70 29 2e 22 2c 20 6e 75 6d 61 74 74 72 73 2c 20 p).", numattrs,
10750 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 retval);...retur
10760 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 n(retval);.}..st
10770 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 atic void cackey
10780 5f 66 72 65 65 5f 69 64 65 6e 74 69 74 69 65 73 _free_identities
10790 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 (struct cackey_i
107a0 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 dentity *identit
107b0 69 65 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f ies, unsigned lo
107c0 6e 67 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f ng identities_co
107d0 75 6e 74 29 20 7b 0a 09 43 4b 5f 41 54 54 52 49 unt) {..CK_ATTRI
107e0 42 55 54 45 20 2a 63 75 72 72 5f 61 74 74 72 3b BUTE *curr_attr;
107f0 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 ..unsigned long
10800 69 64 5f 69 64 78 2c 20 61 74 74 72 5f 69 64 78 id_idx, attr_idx
10810 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74 69 ;...if (identiti
10820 65 73 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 69 64 es == NULL || id
10830 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d entities_count =
10840 3d 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b = 0) {...return;
10850 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 5f 69 64 ..}...for (id_id
10860 78 20 3d 20 30 3b 20 69 64 5f 69 64 78 20 3c 20 x = 0; id_idx <
10870 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 identities_count
10880 3b 20 69 64 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 ; id_idx++) {...
10890 69 66 20 28 69 64 65 6e 74 69 74 69 65 73 5b 69 if (identities[i
108a0 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 d_idx].attribute
108b0 73 29 20 7b 0a 09 09 09 66 6f 72 20 28 61 74 74 s) {....for (att
108c0 72 5f 69 64 78 20 3d 20 30 3b 20 61 74 74 72 5f r_idx = 0; attr_
108d0 69 64 78 20 3c 20 69 64 65 6e 74 69 74 69 65 73 idx < identities
108e0 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 [id_idx].attribu
108f0 74 65 73 5f 63 6f 75 6e 74 3b 20 61 74 74 72 5f tes_count; attr_
10900 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 63 75 72 idx++) {.....cur
10910 72 5f 61 74 74 72 20 3d 20 26 69 64 65 6e 74 69 r_attr = &identi
10920 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 ties[id_idx].att
10930 72 69 62 75 74 65 73 5b 61 74 74 72 5f 69 64 78 ributes[attr_idx
10940 5d 3b 0a 0a 09 09 09 09 69 66 20 28 63 75 72 72 ];......if (curr
10950 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 29 20 7b _attr->pValue) {
10960 0a 09 09 09 09 09 66 72 65 65 28 63 75 72 72 5f ......free(curr_
10970 61 74 74 72 2d 3e 70 56 61 6c 75 65 29 3b 0a 09 attr->pValue);..
10980 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 69 66 ...}....}.....if
10990 20 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f (identities[id_
109a0 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 29 idx].attributes)
109b0 20 7b 0a 09 09 09 09 66 72 65 65 28 69 64 65 6e {.....free(iden
109c0 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 tities[id_idx].a
109d0 74 74 72 69 62 75 74 65 73 29 3b 0a 09 09 09 7d ttributes);....}
109e0 0a 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65 .....cackey_free
109f0 5f 63 65 72 74 73 28 69 64 65 6e 74 69 74 69 65 _certs(identitie
10a00 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 s[id_idx].pcsc_i
10a10 64 65 6e 74 69 74 79 2c 20 31 2c 20 31 29 3b 0a dentity, 1, 1);.
10a20 09 09 7d 0a 09 7d 0a 0a 09 66 72 65 65 28 69 64 ..}..}...free(id
10a30 65 6e 74 69 74 69 65 73 29 3b 0a 7d 0a 0a 73 74 entities);.}..st
10a40 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b atic struct cack
10a50 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 63 61 63 ey_identity *cac
10a60 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e 74 69 74 key_read_identit
10a70 69 65 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 ies(struct cacke
10a80 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e y_slot *slot, un
10a90 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 69 64 73 signed long *ids
10aa0 5f 66 6f 75 6e 64 29 20 7b 0a 09 73 74 72 75 63 _found) {..struc
10ab0 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 t cackey_pcsc_id
10ac0 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65 entity *pcsc_ide
10ad0 6e 74 69 74 69 65 73 3b 0a 09 73 74 72 75 63 74 ntities;..struct
10ae0 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 cackey_identity
10af0 20 2a 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 *identities;..u
10b00 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d nsigned long num
10b10 5f 69 64 73 2c 20 69 64 5f 69 64 78 2c 20 63 75 _ids, id_idx, cu
10b20 72 72 5f 69 64 5f 74 79 70 65 3b 0a 09 75 6e 73 rr_id_type;..uns
10b30 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 igned long num_c
10b40 65 72 74 73 2c 20 63 65 72 74 5f 69 64 78 3b 0a erts, cert_idx;.
10b50 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
10b60 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
10b70 3b 0a 0a 09 69 66 20 28 69 64 73 5f 66 6f 75 6e ;...if (ids_foun
10b80 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 d == NULL) {...C
10b90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
10ba0 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64 73 5f TF("Error. ids_
10bb0 66 6f 75 6e 64 20 69 73 20 4e 55 4c 4c 22 29 3b found is NULL");
10bc0 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 ....return(NULL)
10bd0 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 69 64 65 6e ;..}...pcsc_iden
10be0 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f tities = cackey_
10bf0 72 65 61 64 5f 63 65 72 74 73 28 73 6c 6f 74 2c read_certs(slot,
10c00 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 NULL, &num_cert
10c10 73 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 69 64 s);..if (pcsc_id
10c20 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c entities != NULL
10c30 29 20 7b 0a 09 09 2f 2a 20 43 6f 6e 76 65 72 74 ) {.../* Convert
10c40 20 6e 75 6d 62 65 72 20 6f 66 20 43 65 72 74 73 number of Certs
10c50 20 74 6f 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62 to number of ob
10c60 6a 65 63 74 73 20 2a 2f 0a 09 09 6e 75 6d 5f 69 jects */...num_i
10c70 64 73 20 3d 20 28 43 4b 4f 5f 50 52 49 56 41 54 ds = (CKO_PRIVAT
10c80 45 5f 4b 45 59 20 2d 20 43 4b 4f 5f 43 45 52 54 E_KEY - CKO_CERT
10c90 49 46 49 43 41 54 45 20 2b 20 31 29 20 2a 20 6e IFICATE + 1) * n
10ca0 75 6d 5f 63 65 72 74 73 3b 0a 0a 09 09 69 64 65 um_certs;....ide
10cb0 6e 74 69 74 69 65 73 20 3d 20 6d 61 6c 6c 6f 63 ntities = malloc
10cc0 28 6e 75 6d 5f 69 64 73 20 2a 20 73 69 7a 65 6f (num_ids * sizeo
10cd0 66 28 2a 69 64 65 6e 74 69 74 69 65 73 29 29 3b f(*identities));
10ce0 0a 0a 09 09 69 64 5f 69 64 78 20 3d 20 30 3b 0a ....id_idx = 0;.
10cf0 09 09 66 6f 72 20 28 63 65 72 74 5f 69 64 78 20 ..for (cert_idx
10d00 3d 20 30 3b 20 63 65 72 74 5f 69 64 78 20 3c 20 = 0; cert_idx <
10d10 6e 75 6d 5f 63 65 72 74 73 3b 20 63 65 72 74 5f num_certs; cert_
10d20 69 64 78 2b 2b 29 20 7b 0a 09 09 09 66 6f 72 20 idx++) {....for
10d30 28 63 75 72 72 5f 69 64 5f 74 79 70 65 20 3d 20 (curr_id_type =
10d40 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 3b CKO_CERTIFICATE;
10d50 20 63 75 72 72 5f 69 64 5f 74 79 70 65 20 3c 3d curr_id_type <=
10d60 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 CKO_PRIVATE_KEY
10d70 3b 20 63 75 72 72 5f 69 64 5f 74 79 70 65 2b 2b ; curr_id_type++
10d80 29 20 7b 0a 09 09 09 09 69 64 65 6e 74 69 74 69 ) {.....identiti
10d90 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 es[id_idx].attri
10da0 62 75 74 65 73 20 3d 20 63 61 63 6b 65 79 5f 67 butes = cackey_g
10db0 65 74 5f 61 74 74 72 69 62 75 74 65 73 28 63 75 et_attributes(cu
10dc0 72 72 5f 69 64 5f 74 79 70 65 2c 20 26 70 63 73 rr_id_type, &pcs
10dd0 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 c_identities[cer
10de0 74 5f 69 64 78 5d 2c 20 63 65 72 74 5f 69 64 78 t_idx], cert_idx
10df0 2c 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64 , &identities[id
10e00 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 _idx].attributes
10e10 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 09 69 66 _count);......if
10e20 20 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f (identities[id_
10e30 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 20 idx].attributes
10e40 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 09 == NULL) {......
10e50 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 identities[id_id
10e60 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f x].attributes_co
10e70 75 6e 74 20 3d 20 30 3b 0a 09 09 09 09 7d 0a 0a unt = 0;.....}..
10e80 09 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 ....identities[i
10e90 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e d_idx].pcsc_iden
10ea0 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 tity = malloc(si
10eb0 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69 65 73 zeof(*identities
10ec0 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 [id_idx].pcsc_id
10ed0 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 6d 65 entity));.....me
10ee0 6d 63 70 79 28 69 64 65 6e 74 69 74 69 65 73 5b mcpy(identities[
10ef0 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 id_idx].pcsc_ide
10f00 6e 74 69 74 79 2c 20 26 70 63 73 63 5f 69 64 65 ntity, &pcsc_ide
10f10 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78 ntities[cert_idx
10f20 5d 2c 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 ], sizeof(*ident
10f30 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 ities[id_idx].pc
10f40 73 63 5f 69 64 65 6e 74 69 74 79 29 29 3b 0a 0a sc_identity));..
10f50 09 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 ....identities[i
10f60 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e d_idx].pcsc_iden
10f70 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 tity->certificat
10f80 65 20 3d 20 6d 61 6c 6c 6f 63 28 70 63 73 63 5f e = malloc(pcsc_
10f90 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f identities[cert_
10fa0 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 idx].certificate
10fb0 5f 6c 65 6e 29 3b 0a 09 09 09 09 6d 65 6d 63 70 _len);.....memcp
10fc0 79 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f y(identities[id_
10fd0 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 idx].pcsc_identi
10fe0 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c ty->certificate,
10ff0 20 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 pcsc_identities
11000 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65 72 74 69 [cert_idx].certi
11010 66 69 63 61 74 65 2c 20 70 63 73 63 5f 69 64 65 ficate, pcsc_ide
11020 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78 ntities[cert_idx
11030 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 ].certificate_le
11040 6e 29 3b 0a 0a 09 09 09 09 69 64 5f 69 64 78 2b n);......id_idx+
11050 2b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 +;....}...}....c
11060 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73 ackey_free_certs
11070 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 (pcsc_identities
11080 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b , num_certs, 1);
11090 0a 0a 09 09 2a 69 64 73 5f 66 6f 75 6e 64 20 3d ....*ids_found =
110a0 20 6e 75 6d 5f 69 64 73 3b 0a 09 09 72 65 74 75 num_ids;...retu
110b0 72 6e 28 69 64 65 6e 74 69 74 69 65 73 29 3b 0a rn(identities);.
110c0 09 7d 0a 0a 09 2a 69 64 73 5f 66 6f 75 6e 64 20 .}...*ids_found
110d0 3d 20 30 3b 0a 09 72 65 74 75 72 6e 28 4e 55 4c = 0;..return(NUL
110e0 4c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 L);.}..CK_DEFINE
110f0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c _FUNCTION(CK_RV,
11100 20 43 5f 49 6e 69 74 69 61 6c 69 7a 65 29 28 43 C_Initialize)(C
11110 4b 5f 56 4f 49 44 5f 50 54 52 20 70 49 6e 69 74 K_VOID_PTR pInit
11120 41 72 67 73 29 20 7b 0a 09 43 4b 5f 43 5f 49 4e Args) {..CK_C_IN
11130 49 54 49 41 4c 49 5a 45 5f 41 52 47 53 20 43 4b ITIALIZE_ARGS CK
11140 5f 50 54 52 20 61 72 67 73 3b 0a 09 75 69 6e 74 _PTR args;..uint
11150 33 32 5f 74 20 69 64 78 3b 0a 09 69 6e 74 20 6d 32_t idx;..int m
11160 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 3b 0a 0a utex_init_ret;..
11170 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
11180 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
11190 0a 0a 09 69 66 20 28 70 49 6e 69 74 41 72 67 73 ...if (pInitArgs
111a0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 61 72 != NULL) {...ar
111b0 67 73 20 3d 20 70 49 6e 69 74 41 72 67 73 3b 0a gs = pInitArgs;.
111c0 09 09 6d 65 6d 63 70 79 28 26 63 61 63 6b 65 79 ..memcpy(&cackey
111d0 5f 61 72 67 73 2c 20 61 72 67 73 2c 20 73 69 7a _args, args, siz
111e0 65 6f 66 28 63 61 63 6b 65 79 5f 61 72 67 73 29 eof(cackey_args)
111f0 29 3b 0a 0a 09 09 69 66 20 28 61 72 67 73 2d 3e );....if (args->
11200 43 72 65 61 74 65 4d 75 74 65 78 20 3d 3d 20 4e CreateMutex == N
11210 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 44 65 73 ULL || args->Des
11220 74 72 6f 79 4d 75 74 65 78 20 3d 3d 20 4e 55 4c troyMutex == NUL
11230 4c 20 7c 7c 20 61 72 67 73 2d 3e 4c 6f 63 6b 4d L || args->LockM
11240 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 utex == NULL ||
11250 61 72 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 74 65 args->UnlockMute
11260 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 x == NULL) {....
11270 69 66 20 28 61 72 67 73 2d 3e 43 72 65 61 74 65 if (args->Create
11280 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c Mutex != NULL ||
11290 20 61 72 67 73 2d 3e 44 65 73 74 72 6f 79 4d 75 args->DestroyMu
112a0 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 tex != NULL || a
112b0 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74 65 78 20 21 rgs->LockMutex !
112c0 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e = NULL || args->
112d0 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 21 3d 20 4e UnlockMutex != N
112e0 55 4c 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 ULL) {.....CACKE
112f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
11300 45 72 72 6f 72 2e 20 53 6f 6d 65 2c 20 62 75 74 Error. Some, but
11310 20 6e 6f 74 20 41 6c 6c 20 74 68 72 65 61 64 69 not All threadi
11320 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20 70 72 ng primitives pr
11330 6f 76 69 64 65 64 2e 22 29 3b 0a 0a 09 09 09 09 ovided.");......
11340 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d return(CKR_ARGUM
11350 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09 09 7d 0a ENTS_BAD);....}.
11360 09 09 7d 0a 0a 09 09 69 66 20 28 61 72 67 73 2d ..}....if (args-
11370 3e 70 52 65 73 65 72 76 65 64 20 21 3d 20 4e 55 >pReserved != NU
11380 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f LL) {....CACKEY_
11390 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
113a0 72 6f 72 2e 20 70 52 65 73 65 72 76 65 64 20 69 ror. pReserved i
113b0 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a s not NULL.");..
113c0 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 ...return(CKR_AR
113d0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09 GUMENTS_BAD);...
113e0 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 63 61 }..} else {...ca
113f0 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65 ckey_args.Create
11400 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 Mutex = NULL;...
11410 63 61 63 6b 65 79 5f 61 72 67 73 2e 44 65 73 74 cackey_args.Dest
11420 72 6f 79 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b royMutex = NULL;
11430 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c ...cackey_args.L
11440 6f 63 6b 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b ockMutex = NULL;
11450 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 ...cackey_args.U
11460 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d 20 4e 55 4c nlockMutex = NUL
11470 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 L;...cackey_args
11480 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a .flags = 0;..}..
11490 09 69 66 20 28 63 61 63 6b 65 79 5f 69 6e 69 74 .if (cackey_init
114a0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 ialized) {...CAC
114b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
114c0 28 22 45 72 72 6f 72 2e 20 20 41 6c 72 65 61 64 ("Error. Alread
114d0 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 y initialized.")
114e0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
114f0 43 52 59 50 54 4f 4b 49 5f 41 4c 52 45 41 44 59 CRYPTOKI_ALREADY
11500 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 _INITIALIZED);..
11510 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 }...for (idx = 0
11520 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 ; idx < (sizeof(
11530 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 cackey_sessions)
11540 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 / sizeof(cackey
11550 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 _sessions[0]));
11560 69 64 78 2b 2b 29 20 7b 0a 09 09 63 61 63 6b 65 idx++) {...cacke
11570 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e y_sessions[idx].
11580 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a active = 0;..}..
11590 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 .for (idx = 0; i
115a0 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 dx < (sizeof(cac
115b0 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a key_slots) / siz
115c0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 eof(cackey_slots
115d0 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a [0])); idx++) {.
115e0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 ..cackey_slots[i
115f0 64 78 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a dx].active = 0;.
11600 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 ..cackey_slots[i
11610 64 78 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20 dx].pcsc_reader
11620 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 = NULL;...cackey
11630 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e _slots[idx].tran
11640 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 saction_depth =
11650 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 0;...cackey_slot
11660 73 5b 69 64 78 5d 2e 73 6c 6f 74 5f 72 65 73 65 s[idx].slot_rese
11670 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 63 61 63 6b t = 0;..}...cack
11680 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d ey_initialized =
11690 20 31 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 1;...if (!cacke
116a0 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 29 20 y_biglock_init)
116b0 7b 0a 09 09 6d 75 74 65 78 5f 69 6e 69 74 5f 72 {...mutex_init_r
116c0 65 74 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 et = cackey_mute
116d0 78 5f 63 72 65 61 74 65 28 26 63 61 63 6b 65 79 x_create(&cackey
116e0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 69 66 _biglock);....if
116f0 20 28 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 (mutex_init_ret
11700 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b != 0) {....CACK
11710 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
11720 22 45 72 72 6f 72 2e 20 20 4d 75 74 65 78 20 69 "Error. Mutex i
11730 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 61 nitialization fa
11740 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74 iled.");.....ret
11750 75 72 6e 28 43 4b 52 5f 43 41 4e 54 5f 4c 4f 43 urn(CKR_CANT_LOC
11760 4b 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 K);...}....cacke
11770 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d y_biglock_init =
11780 20 31 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 1;..}...CACKEY_
11790 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
117a0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 turning CKR_OK (
117b0 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a %i)", CKR_OK);..
117c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b .return(CKR_OK);
117d0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 .}..CK_DEFINE_FU
117e0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f NCTION(CK_RV, C_
117f0 46 69 6e 61 6c 69 7a 65 29 28 43 4b 5f 56 4f 49 Finalize)(CK_VOI
11800 44 5f 50 54 52 20 70 52 65 73 65 72 76 65 64 29 D_PTR pReserved)
11810 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78 {..uint32_t idx
11820 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ;...CACKEY_DEBUG
11830 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
11840 22 29 3b 0a 0a 09 69 66 20 28 70 52 65 73 65 72 ");...if (pReser
11850 76 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ved != NULL) {..
11860 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
11870 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 52 65 INTF("Error. pRe
11880 73 65 72 76 65 64 20 69 73 20 6e 6f 74 20 4e 55 served is not NU
11890 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e LL.");....return
118a0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 (CKR_ARGUMENTS_B
118b0 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 AD);..}...if (!c
118c0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 ackey_initialize
118d0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 d) {...CACKEY_DE
118e0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
118f0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 r. Not initiali
11900 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 zed.");....retur
11910 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e n(CKR_CRYPTOKI_N
11920 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b OT_INITIALIZED);
11930 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d ..}...for (idx =
11940 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 0; idx < (sizeo
11950 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e f(cackey_session
11960 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b s) / sizeof(cack
11970 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 ey_sessions[0]))
11980 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 ; idx++) {...if
11990 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 (cackey_sessions
119a0 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a [idx].active) {.
119b0 09 09 09 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f ...C_CloseSessio
119c0 6e 28 69 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a 0a n(idx);...}..}..
119d0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 .cackey_slots_di
119e0 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a sconnect_all();.
119f0 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 ..for (idx = 0;
11a00 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 idx < (sizeof(ca
11a10 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 ckey_slots) / si
11a20 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 zeof(cackey_slot
11a30 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b s[0])); idx++) {
11a40 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c ...if (cackey_sl
11a50 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 ots[idx].pcsc_re
11a60 61 64 65 72 29 20 7b 0a 09 09 09 66 72 65 65 28 ader) {....free(
11a70 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 cackey_slots[idx
11a80 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a ].pcsc_reader);.
11a90 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f ..}..}...cackey_
11aa0 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 pcsc_disconnect(
11ab0 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 69 6e 69 74 );...cackey_init
11ac0 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 09 43 ialized = 0;...C
11ad0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
11ae0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b TF("Returning CK
11af0 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f R_OK (%i)", CKR_
11b00 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b OK);...return(CK
11b10 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 R_OK);.}..CK_DEF
11b20 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f INE_FUNCTION(CK_
11b30 52 56 2c 20 43 5f 47 65 74 49 6e 66 6f 29 28 43 RV, C_GetInfo)(C
11b40 4b 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f K_INFO_PTR pInfo
11b50 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 ) {..static CK_U
11b60 54 46 38 43 48 41 52 20 6d 61 6e 75 66 61 63 74 TF8CHAR manufact
11b70 75 72 65 72 49 44 5b 5d 20 3d 20 22 55 2e 53 2e urerID[] = "U.S.
11b80 20 47 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 Government";..s
11b90 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 tatic CK_UTF8CHA
11ba0 52 20 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 R libraryDescrip
11bb0 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b 65 79 tion[] = "CACKey
11bc0 22 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 ";...CACKEY_DEBU
11bd0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 G_PRINTF("Called
11be0 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f .");...if (pInfo
11bf0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 == NULL) {...CA
11c00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
11c10 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 F("Error. pInfo
11c20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 is NULL.");....r
11c30 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 eturn(CKR_ARGUME
11c40 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 NTS_BAD);..}...i
11c50 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 f (!cackey_initi
11c60 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b alized) {...CACK
11c70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
11c80 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 "Error. Not ini
11c90 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 tialized.");....
11ca0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 return(CKR_CRYPT
11cb0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 OKI_NOT_INITIALI
11cc0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f ZED);..}...pInfo
11cd0 2d 3e 63 72 79 70 74 6f 6b 69 56 65 72 73 69 6f ->cryptokiVersio
11ce0 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43 41 43 4b n.major = ((CACK
11cf0 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 EY_CRYPTOKI_VERS
11d00 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 31 36 29 ION_CODE) >> 16)
11d10 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d & 0xff;..pInfo-
11d20 3e 63 72 79 70 74 6f 6b 69 56 65 72 73 69 6f 6e >cryptokiVersion
11d30 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41 43 4b 45 .minor = ((CACKE
11d40 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 Y_CRYPTOKI_VERSI
11d50 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38 29 20 26 ON_CODE) >> 8) &
11d60 20 30 78 66 66 3b 0a 0a 09 6d 65 6d 73 65 74 28 0xff;...memset(
11d70 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 pInfo->manufactu
11d80 72 65 72 49 44 2c 20 27 20 27 2c 20 73 69 7a 65 rerID, ' ', size
11d90 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 of(pInfo->manufa
11da0 63 74 75 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d cturerID));..mem
11db0 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 cpy(pInfo->manuf
11dc0 61 63 74 75 72 65 72 49 44 2c 20 6d 61 6e 75 66 acturerID, manuf
11dd0 61 63 74 75 72 65 72 49 44 2c 20 73 69 7a 65 6f acturerID, sizeo
11de0 66 28 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 f(manufacturerID
11df0 29 20 2d 20 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d ) - 1);...pInfo-
11e00 3e 66 6c 61 67 73 20 3d 20 30 78 30 30 3b 0a 0a >flags = 0x00;..
11e10 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6c .memset(pInfo->l
11e20 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f ibraryDescriptio
11e30 6e 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 n, ' ', sizeof(p
11e40 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73 Info->libraryDes
11e50 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d cription));..mem
11e60 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 cpy(pInfo->libra
11e70 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 6c ryDescription, l
11e80 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f ibraryDescriptio
11e90 6e 2c 20 73 69 7a 65 6f 66 28 6c 69 62 72 61 72 n, sizeof(librar
11ea0 79 44 65 73 63 72 69 70 74 69 6f 6e 29 20 2d 20 yDescription) -
11eb0 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62 1);...pInfo->lib
11ec0 72 61 72 79 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f raryVersion.majo
11ed0 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 r = (cackey_getv
11ee0 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 ersion() >> 16)
11ef0 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e & 0xff;..pInfo->
11f00 6c 69 62 72 61 72 79 56 65 72 73 69 6f 6e 2e 6d libraryVersion.m
11f10 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 inor = (cackey_g
11f20 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 etversion() >> 8
11f30 29 20 26 20 30 78 66 66 3b 0a 0a 09 43 41 43 4b ) & 0xff;...CACK
11f40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
11f50 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f "Returning CKR_O
11f60 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 K (%i)", CKR_OK)
11f70 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f ;...return(CKR_O
11f80 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 50 72 6f K);.}../*. * Pro
11f90 63 65 73 73 20 6c 69 73 74 20 6f 66 20 72 65 61 cess list of rea
11fa0 64 65 72 73 2c 20 61 6e 64 20 63 72 65 61 74 65 ders, and create
11fb0 20 6d 61 70 70 69 6e 67 20 62 65 74 77 65 65 6e mapping between
11fc0 20 72 65 61 64 65 72 20 6e 61 6d 65 20 61 6e 64 reader name and
11fd0 20 73 6c 6f 74 20 49 44 0a 20 2a 2f 0a 43 4b 5f slot ID. */.CK_
11fe0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 DEFINE_FUNCTION(
11ff0 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74 CK_RV, C_GetSlot
12000 4c 69 73 74 29 28 43 4b 5f 42 42 4f 4f 4c 20 74 List)(CK_BBOOL t
12010 6f 6b 65 6e 50 72 65 73 65 6e 74 2c 20 43 4b 5f okenPresent, CK_
12020 53 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53 6c 6f SLOT_ID_PTR pSlo
12030 74 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f tList, CK_ULONG_
12040 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a PTR pulCount) {.
12050 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 .int mutex_retva
12060 6c 3b 0a 09 69 6e 74 20 70 63 73 63 5f 63 6f 6e l;..int pcsc_con
12070 6e 65 63 74 5f 72 65 74 3b 0a 09 43 4b 5f 55 4c nect_ret;..CK_UL
12080 4f 4e 47 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f ONG count, slot_
12090 63 6f 75 6e 74 20 3d 20 30 2c 20 63 75 72 72 73 count = 0, currs
120a0 6c 6f 74 3b 0a 09 63 68 61 72 20 2a 70 63 73 63 lot;..char *pcsc
120b0 5f 72 65 61 64 65 72 73 2c 20 2a 70 63 73 63 5f _readers, *pcsc_
120c0 72 65 61 64 65 72 73 5f 73 2c 20 2a 70 63 73 63 readers_s, *pcsc
120d0 5f 72 65 61 64 65 72 73 5f 65 3b 0a 09 44 57 4f _readers_e;..DWO
120e0 52 44 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f RD pcsc_readers_
120f0 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 len;..LONG scard
12100 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 _listreaders_ret
12110 3b 0a 09 73 69 7a 65 5f 74 20 63 75 72 72 5f 72 ;..size_t curr_r
12120 65 61 64 65 72 5f 6c 65 6e 3b 0a 0a 09 43 41 43 eader_len;...CAC
12130 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
12140 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 ("Called.");...i
12150 66 20 28 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e f (pulCount == N
12160 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f ULL) {...CACKEY_
12170 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
12180 72 6f 72 2e 20 70 75 6c 43 6f 75 6e 74 20 69 73 ror. pulCount is
12190 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 NULL.");....ret
121a0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 urn(CKR_ARGUMENT
121b0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 S_BAD);..}...if
121c0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c (!cackey_initial
121d0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 ized) {...CACKEY
121e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
121f0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 rror. Not initi
12200 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 alized.");....re
12210 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b turn(CKR_CRYPTOK
12220 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 I_NOT_INITIALIZE
12230 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 D);..}...mutex_r
12240 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d etval = cackey_m
12250 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 utex_lock(cackey
12260 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 _biglock);..if (
12270 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 mutex_retval !=
12280 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 0) {...CACKEY_DE
12290 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
122a0 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c r. Locking fail
122b0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
122c0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 (CKR_GENERAL_ERR
122d0 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6c 65 OR);..}.../* Cle
122e0 61 72 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73 ar list of slots
122f0 20 2a 2f 0a 09 69 66 20 28 70 53 6c 6f 74 4c 69 */..if (pSlotLi
12300 73 74 29 20 7b 0a 09 09 2f 2a 20 4f 6e 6c 79 20 st) {.../* Only
12310 75 70 64 61 74 65 20 74 68 65 20 6c 69 73 74 20 update the list
12320 6f 66 20 73 6c 6f 74 73 20 69 66 20 77 65 20 61 of slots if we a
12330 72 65 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e re actually bein
12340 67 20 73 75 70 70 6c 79 20 74 68 65 20 73 6c 6f g supply the slo
12350 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f t information */
12360 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f ...cackey_slots_
12370 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 disconnect_all()
12380 3b 0a 0a 09 09 66 6f 72 20 28 63 75 72 72 73 6c ;....for (currsl
12390 6f 74 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74 ot = 0; currslot
123a0 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 < (sizeof(cacke
123b0 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f y_slots) / sizeo
123c0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 f(cackey_slots[0
123d0 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29 ])); currslot++)
123e0 20 7b 0a 09 09 09 69 66 20 28 63 61 63 6b 65 79 {....if (cackey
123f0 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d _slots[currslot]
12400 2e 70 63 73 63 5f 72 65 61 64 65 72 29 20 7b 0a .pcsc_reader) {.
12410 09 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f ....free(cackey_
12420 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e slots[currslot].
12430 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09 pcsc_reader);...
12440 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b ...cackey_slots[
12450 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 currslot].pcsc_r
12460 65 61 64 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 09 eader = NULL;...
12470 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c .}.....cackey_sl
12480 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 ots[currslot].ac
12490 74 69 76 65 20 3d 20 30 3b 0a 09 09 7d 0a 09 7d tive = 0;...}..}
124a0 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 .../* Determine
124b0 6c 69 73 74 20 6f 66 20 72 65 61 64 65 72 73 20 list of readers
124c0 2a 2f 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 */..pcsc_connect
124d0 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70 63 _ret = cackey_pc
124e0 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 69 sc_connect();..i
124f0 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f f (pcsc_connect_
12500 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 ret != CACKEY_PC
12510 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 SC_S_OK) {...CAC
12520 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
12530 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 ("Connection to
12540 50 43 2f 53 43 20 66 61 69 6c 65 64 2c 20 61 73 PC/SC failed, as
12550 73 75 6d 69 6e 67 20 6e 6f 20 73 6c 6f 74 73 22 suming no slots"
12560 29 3b 0a 0a 09 09 73 6c 6f 74 5f 63 6f 75 6e 74 );....slot_count
12570 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a = 0;..} else {.
12580 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c ..pcsc_readers_l
12590 65 6e 20 3d 20 30 3b 0a 0a 09 09 73 63 61 72 64 en = 0;....scard
125a0 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 _listreaders_ret
125b0 20 3d 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 = SCardListRead
125c0 65 72 73 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 ers(*cackey_pcsc
125d0 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 4e _handle, NULL, N
125e0 55 4c 4c 2c 20 26 70 63 73 63 5f 72 65 61 64 65 ULL, &pcsc_reade
125f0 72 73 5f 6c 65 6e 29 3b 0a 09 09 69 66 20 28 73 rs_len);...if (s
12600 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 card_listreaders
12610 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f _ret == SCARD_S_
12620 53 55 43 43 45 53 53 20 26 26 20 70 63 73 63 5f SUCCESS && pcsc_
12630 72 65 61 64 65 72 73 5f 6c 65 6e 20 21 3d 20 30 readers_len != 0
12640 29 20 7b 0a 09 09 09 70 63 73 63 5f 72 65 61 64 ) {....pcsc_read
12650 65 72 73 20 3d 20 6d 61 6c 6c 6f 63 28 70 63 73 ers = malloc(pcs
12660 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a c_readers_len);.
12670 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f ...pcsc_readers_
12680 73 20 3d 20 70 63 73 63 5f 72 65 61 64 65 72 73 s = pcsc_readers
12690 3b 0a 0a 09 09 09 73 63 61 72 64 5f 6c 69 73 74 ;.....scard_list
126a0 72 65 61 64 65 72 73 5f 72 65 74 20 3d 20 53 43 readers_ret = SC
126b0 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 28 2a ardListReaders(*
126c0 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 cackey_pcsc_hand
126d0 6c 65 2c 20 4e 55 4c 4c 2c 20 70 63 73 63 5f 72 le, NULL, pcsc_r
126e0 65 61 64 65 72 73 2c 20 26 70 63 73 63 5f 72 65 eaders, &pcsc_re
126f0 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 09 69 aders_len);....i
12700 66 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 f (scard_listrea
12710 64 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 ders_ret == SCAR
12720 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 D_S_SUCCESS) {..
12730 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f ...pcsc_readers_
12740 65 20 3d 20 70 63 73 63 5f 72 65 61 64 65 72 73 e = pcsc_readers
12750 20 2b 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f + pcsc_readers_
12760 6c 65 6e 3b 0a 0a 09 09 09 09 63 75 72 72 73 6c len;......currsl
12770 6f 74 20 3d 20 30 3b 0a 09 09 09 09 77 68 69 6c ot = 0;.....whil
12780 65 20 28 70 63 73 63 5f 72 65 61 64 65 72 73 20 e (pcsc_readers
12790 3c 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65 < pcsc_readers_e
127a0 29 20 7b 0a 09 09 09 09 09 63 75 72 72 5f 72 65 ) {......curr_re
127b0 61 64 65 72 5f 6c 65 6e 20 3d 20 73 74 72 6c 65 ader_len = strle
127c0 6e 28 70 63 73 63 5f 72 65 61 64 65 72 73 29 3b n(pcsc_readers);
127d0 0a 0a 09 09 09 09 09 69 66 20 28 28 70 63 73 63 .......if ((pcsc
127e0 5f 72 65 61 64 65 72 73 20 2b 20 63 75 72 72 5f _readers + curr_
127f0 72 65 61 64 65 72 5f 6c 65 6e 29 20 3e 20 70 63 reader_len) > pc
12800 73 63 5f 72 65 61 64 65 72 73 5f 65 29 20 7b 0a sc_readers_e) {.
12810 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 ......break;....
12820 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 63 75 ..}.......if (cu
12830 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 3d 3d rr_reader_len ==
12840 20 30 29 20 7b 0a 09 09 09 09 09 09 62 72 65 61 0) {.......brea
12850 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 k;......}.......
12860 69 66 20 28 63 75 72 72 73 6c 6f 74 20 3e 3d 20 if (currslot >=
12870 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 (sizeof(cackey_s
12880 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 lots) / sizeof(c
12890 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 ackey_slots[0]))
128a0 29 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59 ) {.......CACKEY
128b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 _DEBUG_PRINTF("F
128c0 6f 75 6e 64 20 6d 6f 72 65 20 72 65 61 64 65 72 ound more reader
128d0 73 20 74 68 61 6e 20 73 6c 6f 74 73 20 61 72 65 s than slots are
128e0 20 61 76 61 69 6c 61 62 6c 65 21 22 29 3b 0a 0a available!");..
128f0 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 ......break;....
12900 09 09 7d 0a 0a 09 09 09 09 09 43 41 43 4b 45 59 ..}.......CACKEY
12910 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 _DEBUG_PRINTF("F
12920 6f 75 6e 64 20 72 65 61 64 65 72 3a 20 25 73 22 ound reader: %s"
12930 2c 20 70 63 73 63 5f 72 65 61 64 65 72 73 29 3b , pcsc_readers);
12940 0a 0a 09 09 09 09 09 2f 2a 20 4f 6e 6c 79 20 75 ......./* Only u
12950 70 64 61 74 65 20 74 68 65 20 6c 69 73 74 20 6f pdate the list o
12960 66 20 73 6c 6f 74 73 20 69 66 20 77 65 20 61 72 f slots if we ar
12970 65 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 e actually being
12980 20 73 75 70 70 6c 79 20 74 68 65 20 73 6c 6f 74 supply the slot
12990 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a information */.
129a0 09 09 09 09 09 69 66 20 28 70 53 6c 6f 74 4c 69 .....if (pSlotLi
129b0 73 74 29 20 7b 0a 09 09 09 09 09 09 63 61 63 6b st) {.......cack
129c0 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f ey_slots[currslo
129d0 74 5d 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 t].active = 1;..
129e0 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 .....cackey_slot
129f0 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 s[currslot].pcsc
12a00 5f 72 65 61 64 65 72 20 3d 20 73 74 72 64 75 70 _reader = strdup
12a10 28 70 63 73 63 5f 72 65 61 64 65 72 73 29 3b 0a (pcsc_readers);.
12a20 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f ......cackey_slo
12a30 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 ts[currslot].pcs
12a40 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 c_card_connected
12a50 20 3d 20 30 3b 0a 09 09 09 09 09 09 63 61 63 6b = 0;.......cack
12a60 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f ey_slots[currslo
12a70 74 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 t].transaction_d
12a80 65 70 74 68 20 3d 20 30 3b 0a 09 09 09 09 09 09 epth = 0;.......
12a90 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 cackey_slots[cur
12aa0 72 73 6c 6f 74 5d 2e 73 6c 6f 74 5f 72 65 73 65 rslot].slot_rese
12ab0 74 20 3d 20 31 3b 0a 09 09 09 09 09 7d 0a 09 09 t = 1;......}...
12ac0 09 09 09 63 75 72 72 73 6c 6f 74 2b 2b 3b 0a 0a ...currslot++;..
12ad0 09 09 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 .....pcsc_reader
12ae0 73 20 2b 3d 20 63 75 72 72 5f 72 65 61 64 65 72 s += curr_reader
12af0 5f 6c 65 6e 20 2b 20 31 3b 0a 09 09 09 09 7d 0a _len + 1;.....}.
12b00 0a 09 09 09 09 69 66 20 28 63 75 72 72 73 6c 6f .....if (currslo
12b10 74 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 73 6c t > 0) {......sl
12b20 6f 74 5f 63 6f 75 6e 74 20 3d 20 63 75 72 72 73 ot_count = currs
12b30 6c 6f 74 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 lot;.....}....}
12b40 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45 else {.....CACKE
12b50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
12b60 53 65 63 6f 6e 64 20 63 61 6c 6c 20 74 6f 20 53 Second call to S
12b70 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 20 CardListReaders
12b80 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 20 25 failed, return %
12b90 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59 5f 44 s/%li", CACKEY_D
12ba0 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 EBUG_FUNC_SCARDE
12bb0 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f RR_TO_STR(scard_
12bc0 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29 listreaders_ret)
12bd0 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 6c , (long) scard_l
12be0 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29 3b istreaders_ret);
12bf0 0a 09 09 09 7d 0a 0a 09 09 09 66 72 65 65 28 70 ....}.....free(p
12c00 63 73 63 5f 72 65 61 64 65 72 73 5f 73 29 3b 0a csc_readers_s);.
12c10 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 ..} else {....CA
12c20 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
12c30 46 28 22 46 69 72 73 74 20 63 61 6c 6c 20 74 6f F("First call to
12c40 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 SCardListReader
12c50 73 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e s failed, return
12c60 20 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59 %s/%li", CACKEY
12c70 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 _DEBUG_FUNC_SCAR
12c80 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 DERR_TO_STR(scar
12c90 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 d_listreaders_re
12ca0 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 t), (long) scard
12cb0 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 _listreaders_ret
12cc0 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 );...}..}...mute
12cd0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 x_retval = cacke
12ce0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
12cf0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
12d00 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 .if (mutex_retva
12d10 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b l != 0) {...CACK
12d20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
12d30 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 "Error. Unlocki
12d40 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 ng failed.");...
12d50 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 .return(CKR_GENE
12d60 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a RAL_ERROR);..}..
12d70 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 20 3d .if (pSlotList =
12d80 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c = NULL) {...*pul
12d90 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f 75 Count = slot_cou
12da0 6e 74 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 nt;....CACKEY_DE
12db0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
12dc0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 rning CKR_OK (%i
12dd0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 )", CKR_OK);....
12de0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a return(CKR_OK);.
12df0 09 7d 0a 0a 09 63 6f 75 6e 74 20 3d 20 2a 70 75 .}...count = *pu
12e00 6c 43 6f 75 6e 74 3b 0a 09 69 66 20 28 63 6f 75 lCount;..if (cou
12e10 6e 74 20 3c 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 nt < slot_count)
12e20 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
12e30 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
12e40 20 55 73 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 User allocated
12e50 25 6c 75 20 65 6e 74 72 69 65 73 2c 20 62 75 74 %lu entries, but
12e60 20 77 65 20 68 61 76 65 20 25 6c 75 20 65 6e 74 we have %lu ent
12e70 72 69 65 73 2e 22 2c 20 63 6f 75 6e 74 2c 20 73 ries.", count, s
12e80 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 lot_count);....r
12e90 65 74 75 72 6e 28 43 4b 52 5f 42 55 46 46 45 52 eturn(CKR_BUFFER
12ea0 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 09 0a 09 7d _TOO_SMALL);...}
12eb0 0a 0a 09 66 6f 72 20 28 63 75 72 72 73 6c 6f 74 ...for (currslot
12ec0 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74 20 3c = 0; currslot <
12ed0 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b 20 63 75 72 slot_count; cur
12ee0 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 70 53 6c rslot++) {...pSl
12ef0 6f 74 4c 69 73 74 5b 63 75 72 72 73 6c 6f 74 5d otList[currslot]
12f00 20 3d 20 63 75 72 72 73 6c 6f 74 3b 0a 09 7d 0a = currslot;..}.
12f10 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 73 6c ..*pulCount = sl
12f20 6f 74 5f 63 6f 75 6e 74 3b 0a 0a 09 43 41 43 4b ot_count;...CACK
12f30 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
12f40 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f "Returning CKR_O
12f50 4b 20 28 25 69 29 2e 20 20 46 6f 75 6e 64 20 25 K (%i). Found %
12f60 6c 75 20 72 65 61 64 65 72 73 2e 22 2c 20 43 4b lu readers.", CK
12f70 52 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e 65 64 20 R_OK, (unsigned
12f80 6c 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f 75 6e 74 long) slot_count
12f90 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f );...return(CKR_
12fa0 4f 4b 29 3b 0a 0a 09 74 6f 6b 65 6e 50 72 65 73 OK);...tokenPres
12fb0 65 6e 74 20 3d 20 74 6f 6b 65 6e 50 72 65 73 65 ent = tokenPrese
12fc0 6e 74 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75 nt; /* Supress u
12fd0 6e 75 73 65 64 20 76 61 72 69 61 62 6c 65 20 77 nused variable w
12fe0 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f arning */.}..CK_
12ff0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 DEFINE_FUNCTION(
13000 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74 CK_RV, C_GetSlot
13010 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 Info)(CK_SLOT_ID
13020 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 53 4c 4f 54 slotID, CK_SLOT
13030 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 _INFO_PTR pInfo)
13040 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 {..static CK_UT
13050 46 38 43 48 41 52 20 73 6c 6f 74 44 65 73 63 72 F8CHAR slotDescr
13060 69 70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b iption[] = "CACK
13070 65 79 20 53 6c 6f 74 22 3b 0a 09 69 6e 74 20 6d ey Slot";..int m
13080 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e utex_retval;..in
13090 74 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b t bytes_to_copy;
130a0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
130b0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
130c0 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d );...if (pInfo =
130d0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b = NULL) {...CACK
130e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
130f0 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 "Error. pInfo is
13100 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 NULL.");....ret
13110 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 urn(CKR_ARGUMENT
13120 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 S_BAD);..}...if
13130 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c (!cackey_initial
13140 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 ized) {...CACKEY
13150 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
13160 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 rror. Not initi
13170 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 alized.");....re
13180 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b turn(CKR_CRYPTOK
13190 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 I_NOT_INITIALIZE
131a0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f D);..}...if (slo
131b0 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 tID < 0 || slotI
131c0 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 D >= (sizeof(cac
131d0 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a key_slots) / siz
131e0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 eof(cackey_slots
131f0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 [0]))) {...CACKE
13200 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
13210 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 Error. Invalid s
13220 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 lot requested (%
13230 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 lu), outside of
13240 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c valid range", sl
13250 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e otID);....return
13260 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 (CKR_SLOT_ID_INV
13270 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 ALID);..}...mute
13280 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 x_retval = cacke
13290 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 y_mutex_lock(cac
132a0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 key_biglock);..i
132b0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 f (mutex_retval
132c0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 != 0) {...CACKEY
132d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
132e0 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 rror. Locking f
132f0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 ailed.");....ret
13300 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f urn(CKR_GENERAL_
13310 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 ERROR);..}...if
13320 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c (cackey_slots[sl
13330 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 otID].active ==
13340 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 0) {...CACKEY_DE
13350 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
13360 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 r. Invalid slot
13370 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c requested (%lu),
13380 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e slot not curren
13390 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f tly active", slo
133a0 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f tID);....cackey_
133b0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 mutex_unlock(cac
133c0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 key_biglock);...
133d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 .return(CKR_SLOT
133e0 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d _ID_INVALID);..}
133f0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 ...mutex_retval
13400 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 = cackey_mutex_u
13410 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 nlock(cackey_big
13420 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 lock);..if (mute
13430 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b x_retval != 0) {
13440 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
13450 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
13460 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 Unlocking failed
13470 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
13480 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 KR_GENERAL_ERROR
13490 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 );..}...memset(p
134a0 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69 Info->slotDescri
134b0 70 74 69 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65 ption, ' ', size
134c0 6f 66 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 of(pInfo->slotDe
134d0 73 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65 scription));..me
134e0 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 mcpy(pInfo->slot
134f0 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 6c 6f Description, slo
13500 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 69 tDescription, si
13510 7a 65 6f 66 28 73 6c 6f 74 44 65 73 63 72 69 70 zeof(slotDescrip
13520 74 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 tion) - 1);...me
13530 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 mset(pInfo->manu
13540 66 61 63 74 75 72 65 72 49 44 2c 20 27 20 27 2c facturerID, ' ',
13550 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d sizeof(pInfo->m
13560 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 29 3b anufacturerID));
13570 0a 0a 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 ...bytes_to_copy
13580 20 3d 20 73 74 72 6c 65 6e 28 63 61 63 6b 65 79 = strlen(cackey
13590 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 70 _slots[slotID].p
135a0 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 69 66 csc_reader);..if
135b0 20 28 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e (sizeof(pInfo->
135c0 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 20 manufacturerID)
135d0 3c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 < bytes_to_copy)
135e0 20 7b 0a 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f {...bytes_to_co
135f0 70 79 20 3d 20 73 69 7a 65 6f 66 28 70 49 6e 66 py = sizeof(pInf
13600 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 o->manufacturerI
13610 44 29 3b 0a 09 7d 0a 09 6d 65 6d 63 70 79 28 70 D);..}..memcpy(p
13620 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 Info->manufactur
13630 65 72 49 44 2c 20 63 61 63 6b 65 79 5f 73 6c 6f erID, cackey_slo
13640 74 73 5b 73 6c 6f 74 49 44 5d 2e 70 63 73 63 5f ts[slotID].pcsc_
13650 72 65 61 64 65 72 2c 20 62 79 74 65 73 5f 74 6f reader, bytes_to
13660 5f 63 6f 70 79 29 3b 0a 0a 09 70 49 6e 66 6f 2d _copy);...pInfo-
13670 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 52 45 4d >flags = CKF_REM
13680 4f 56 41 42 4c 45 5f 44 45 56 49 43 45 3b 0a 0a OVABLE_DEVICE;..
13690 09 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 .if (cackey_toke
136a0 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65 n_present(&cacke
136b0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 y_slots[slotID])
136c0 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f == CACKEY_PCSC_
136d0 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 S_TOKENPRESENT)
136e0 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 {...pInfo->flags
136f0 20 7c 3d 20 43 4b 46 5f 54 4f 4b 45 4e 5f 50 52 |= CKF_TOKEN_PR
13700 45 53 45 4e 54 3b 0a 09 7d 0a 0a 09 70 49 6e 66 ESENT;..}...pInf
13710 6f 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73 69 o->hardwareVersi
13720 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b on.major = (cack
13730 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 ey_getversion()
13740 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09 >> 16) & 0xff;..
13750 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 pInfo->hardwareV
13760 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 ersion.minor = (
13770 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f cackey_getversio
13780 6e 28 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 n() >> 8) & 0xff
13790 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 ;...pInfo->firmw
137a0 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 areVersion.major
137b0 20 3d 20 30 78 30 30 3b 0a 09 70 49 6e 66 6f 2d = 0x00;..pInfo-
137c0 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e >firmwareVersion
137d0 2e 6d 69 6e 6f 72 20 3d 20 30 78 30 30 3b 0a 0a .minor = 0x00;..
137e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
137f0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
13800 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b CKR_OK (%i)", CK
13810 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 R_OK);...return(
13820 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 CKR_OK);.}..CK_D
13830 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 EFINE_FUNCTION(C
13840 4b 5f 52 56 2c 20 43 5f 47 65 74 54 6f 6b 65 6e K_RV, C_GetToken
13850 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 Info)(CK_SLOT_ID
13860 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 54 4f 4b 45 slotID, CK_TOKE
13870 4e 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f N_INFO_PTR pInfo
13880 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 ) {..static CK_U
13890 54 46 38 43 48 41 52 20 6d 61 6e 75 66 61 63 74 TF8CHAR manufact
138a0 75 72 65 72 49 44 5b 5d 20 3d 20 22 55 2e 53 2e urerID[] = "U.S.
138b0 20 47 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 Government";..s
138c0 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 tatic CK_UTF8CHA
138d0 52 20 64 65 66 61 75 6c 74 4c 61 62 65 6c 5b 5d R defaultLabel[]
138e0 20 3d 20 22 55 6e 6b 6e 6f 77 6e 20 54 6f 6b 65 = "Unknown Toke
138f0 6e 22 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 n";..static CK_U
13900 54 46 38 43 48 41 52 20 6d 6f 64 65 6c 5b 5d 20 TF8CHAR model[]
13910 3d 20 22 43 41 43 20 54 6f 6b 65 6e 22 3b 0a 09 = "CAC Token";..
13920 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 struct cackey_pc
13930 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73 sc_identity *pcs
13940 63 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 c_identities;..u
13950 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d nsigned long num
13960 5f 63 65 72 74 73 3b 0a 09 73 73 69 7a 65 5f 74 _certs;..ssize_t
13970 20 6c 61 62 65 6c 5f 72 65 74 3b 0a 09 69 6e 74 label_ret;..int
13980 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 mutex_retval;..
13990 69 6e 74 20 75 73 65 5f 64 65 66 61 75 6c 74 5f int use_default_
139a0 6c 61 62 65 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f label;...CACKEY_
139b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
139c0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 lled.");...if (p
139d0 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a Info == NULL) {.
139e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
139f0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49 RINTF("Error. pI
13a00 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a nfo is NULL.");.
13a10 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 ...return(CKR_AR
13a20 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d GUMENTS_BAD);..}
13a30 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 ...if (!cackey_i
13a40 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 nitialized) {...
13a50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
13a60 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 NTF("Error. Not
13a70 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b initialized.");
13a80 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 ....return(CKR_C
13a90 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 RYPTOKI_NOT_INIT
13aa0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 IALIZED);..}...i
13ab0 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c f (slotID < 0 ||
13ac0 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 slotID >= (size
13ad0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 of(cackey_slots)
13ae0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 / sizeof(cackey
13af0 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 _slots[0]))) {..
13b00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
13b10 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 INTF("Error. Inv
13b20 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 alid slot reques
13b30 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 ted (%lu), outsi
13b40 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 de of valid rang
13b50 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 e", slotID);....
13b60 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f return(CKR_SLOT_
13b70 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a ID_INVALID);..}.
13b80 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d ..mutex_retval =
13b90 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f cackey_mutex_lo
13ba0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
13bb0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 k);..if (mutex_r
13bc0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 etval != 0) {...
13bd0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
13be0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 NTF("Error. Loc
13bf0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a king failed.");.
13c00 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 ...return(CKR_GE
13c10 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d NERAL_ERROR);..}
13c20 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c ...if (cackey_sl
13c30 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 ots[slotID].acti
13c40 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 ve == 0) {...CAC
13c50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
13c60 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 ("Error. Invalid
13c70 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 slot requested
13c80 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 (%lu), slot not
13c90 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 currently active
13ca0 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 ", slotID);....c
13cb0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f ackey_mutex_unlo
13cc0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
13cd0 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b k);....return(CK
13ce0 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 R_SLOT_ID_INVALI
13cf0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 D);..}...if (cac
13d00 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e key_token_presen
13d10 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b t(&cackey_slots[
13d20 73 6c 6f 74 49 44 5d 29 20 21 3d 20 43 41 43 4b slotID]) != CACK
13d30 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 EY_PCSC_S_TOKENP
13d40 52 45 53 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b RESENT) {...CACK
13d50 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
13d60 22 4e 6f 20 74 6f 6b 65 6e 20 69 73 20 70 72 65 "No token is pre
13d70 73 65 6e 74 20 69 6e 20 73 6c 6f 74 49 44 20 3d sent in slotID =
13d80 20 25 6c 75 22 2c 20 73 6c 6f 74 49 44 29 3b 0a %lu", slotID);.
13d90 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f ...cackey_mutex_
13da0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 unlock(cackey_bi
13db0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 glock);....retur
13dc0 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 4e 4f 54 5f n(CKR_TOKEN_NOT_
13dd0 50 52 45 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 6d PRESENT);..}...m
13de0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 utex_retval = ca
13df0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 ckey_mutex_unloc
13e00 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
13e10 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 );..if (mutex_re
13e20 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 tval != 0) {...C
13e30 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
13e40 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f TF("Error. Unlo
13e50 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b cking failed.");
13e60 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 ....return(CKR_G
13e70 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 ENERAL_ERROR);..
13e80 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 }.../* Determine
13e90 20 74 6f 6b 65 6e 20 6c 61 62 65 6c 20 66 72 6f token label fro
13ea0 6d 20 63 65 72 74 69 66 69 63 61 74 65 73 20 2a m certificates *
13eb0 2f 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d /..memset(pInfo-
13ec0 3e 6c 61 62 65 6c 2c 20 27 20 27 2c 20 73 69 7a >label, ' ', siz
13ed0 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c eof(pInfo->label
13ee0 29 29 3b 0a 09 75 73 65 5f 64 65 66 61 75 6c 74 ));..use_default
13ef0 5f 6c 61 62 65 6c 20 3d 20 31 3b 0a 0a 09 70 63 _label = 1;...pc
13f00 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 3d 20 sc_identities =
13f10 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 cackey_read_cert
13f20 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b s(&cackey_slots[
13f30 73 6c 6f 74 49 44 5d 2c 20 4e 55 4c 4c 2c 20 26 slotID], NULL, &
13f40 6e 75 6d 5f 63 65 72 74 73 29 3b 0a 09 69 66 20 num_certs);..if
13f50 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 (pcsc_identities
13f60 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 != NULL) {...if
13f70 20 28 6e 75 6d 5f 63 65 72 74 73 20 3e 20 30 29 (num_certs > 0)
13f80 20 7b 0a 09 09 09 6c 61 62 65 6c 5f 72 65 74 20 {....label_ret
13f90 3d 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 = cackey_pcsc_id
13fa0 65 6e 74 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28 entity_to_label(
13fb0 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c pcsc_identities,
13fc0 20 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 73 pInfo->label, s
13fd0 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 izeof(pInfo->lab
13fe0 65 6c 29 29 3b 0a 09 09 09 69 66 20 28 6c 61 62 el));....if (lab
13ff0 65 6c 5f 72 65 74 20 3e 20 30 29 20 7b 0a 09 09 el_ret > 0) {...
14000 09 09 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 ..use_default_la
14010 62 65 6c 20 3d 20 30 3b 0a 09 09 09 7d 0a 09 09 bel = 0;....}...
14020 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65 }....cackey_free
14030 5f 63 65 72 74 73 28 70 63 73 63 5f 69 64 65 6e _certs(pcsc_iden
14040 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74 tities, num_cert
14050 73 2c 20 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 s, 1);..}...if (
14060 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 use_default_labe
14070 6c 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28 70 49 l) {...memcpy(pI
14080 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 64 65 66 61 nfo->label, defa
14090 75 6c 74 4c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 ultLabel, sizeof
140a0 28 64 65 66 61 75 6c 74 4c 61 62 65 6c 29 20 2d (defaultLabel) -
140b0 20 31 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 1);..}...memset
140c0 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 (pInfo->manufact
140d0 75 72 65 72 49 44 2c 20 27 20 27 2c 20 73 69 7a urerID, ' ', siz
140e0 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 eof(pInfo->manuf
140f0 61 63 74 75 72 65 72 49 44 29 29 3b 0a 09 6d 65 acturerID));..me
14100 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 mcpy(pInfo->manu
14110 66 61 63 74 75 72 65 72 49 44 2c 20 6d 61 6e 75 facturerID, manu
14120 66 61 63 74 75 72 65 72 49 44 2c 20 73 69 7a 65 facturerID, size
14130 6f 66 28 6d 61 6e 75 66 61 63 74 75 72 65 72 49 of(manufacturerI
14140 44 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 D) - 1);...memse
14150 74 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 t(pInfo->model,
14160 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 ' ', sizeof(pInf
14170 6f 2d 3e 6d 6f 64 65 6c 29 29 3b 0a 09 6d 65 6d o->model));..mem
14180 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c cpy(pInfo->model
14190 2c 20 6d 6f 64 65 6c 2c 20 73 69 7a 65 6f 66 28 , model, sizeof(
141a0 6d 6f 64 65 6c 29 20 2d 20 31 29 3b 0a 0a 09 6d model) - 1);...m
141b0 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 73 65 72 emset(pInfo->ser
141c0 69 61 6c 4e 75 6d 62 65 72 2c 20 27 20 27 2c 20 ialNumber, ' ',
141d0 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 73 65 sizeof(pInfo->se
141e0 72 69 61 6c 4e 75 6d 62 65 72 29 29 3b 0a 0a 09 rialNumber));...
141f0 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 75 74 memset(pInfo->ut
14200 63 54 69 6d 65 2c 20 27 20 27 2c 20 73 69 7a 65 cTime, ' ', size
14210 6f 66 28 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d of(pInfo->utcTim
14220 65 29 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 e));...pInfo->ha
14230 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 rdwareVersion.ma
14240 6a 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 jor = (cackey_ge
14250 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 tversion() >> 16
14260 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f ) & 0xff;..pInfo
14270 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73 69 6f ->hardwareVersio
14280 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 n.minor = (cacke
14290 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e y_getversion() >
142a0 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 > 8) & 0xff;...p
142b0 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 Info->firmwareVe
142c0 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 rsion.major = 0x
142d0 30 30 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 00;..pInfo->firm
142e0 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f wareVersion.mino
142f0 72 20 3d 20 30 78 30 30 3b 0a 0a 09 70 49 6e 66 r = 0x00;...pInf
14300 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 57 o->flags = CKF_W
14310 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 20 7c RITE_PROTECTED |
14320 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 49 4e CKF_USER_PIN_IN
14330 49 54 49 41 4c 49 5a 45 44 20 7c 20 43 4b 46 5f ITIALIZED | CKF_
14340 54 4f 4b 45 4e 5f 49 4e 49 54 49 41 4c 49 5a 45 TOKEN_INITIALIZE
14350 44 20 7c 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 D | CKF_LOGIN_RE
14360 51 55 49 52 45 44 3b 0a 0a 09 70 49 6e 66 6f 2d QUIRED;...pInfo-
14370 3e 75 6c 4d 61 78 53 65 73 73 69 6f 6e 43 6f 75 >ulMaxSessionCou
14380 6e 74 20 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 nt = (sizeof(cac
14390 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 key_sessions) /
143a0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 sizeof(cackey_se
143b0 73 73 69 6f 6e 73 5b 30 5d 29 29 20 2d 20 31 3b ssions[0])) - 1;
143c0 0a 09 70 49 6e 66 6f 2d 3e 75 6c 53 65 73 73 69 ..pInfo->ulSessi
143d0 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f 55 4e 41 onCount = CK_UNA
143e0 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 VAILABLE_INFORMA
143f0 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c TION;..pInfo->ul
14400 4d 61 78 52 77 53 65 73 73 69 6f 6e 43 6f 75 6e MaxRwSessionCoun
14410 74 20 3d 20 30 3b 0a 09 70 49 6e 66 6f 2d 3e 75 t = 0;..pInfo->u
14420 6c 52 77 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 lRwSessionCount
14430 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 = CK_UNAVAILABLE
14440 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 _INFORMATION;..p
14450 49 6e 66 6f 2d 3e 75 6c 4d 61 78 50 69 6e 4c 65 Info->ulMaxPinLe
14460 6e 20 3d 20 31 32 38 3b 0a 09 70 49 6e 66 6f 2d n = 128;..pInfo-
14470 3e 75 6c 4d 69 6e 50 69 6e 4c 65 6e 20 3d 20 30 >ulMinPinLen = 0
14480 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61 ;..pInfo->ulTota
14490 6c 50 75 62 6c 69 63 4d 65 6d 6f 72 79 20 3d 20 lPublicMemory =
144a0 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 CK_UNAVAILABLE_I
144b0 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e NFORMATION;..pIn
144c0 66 6f 2d 3e 75 6c 46 72 65 65 50 75 62 6c 69 63 fo->ulFreePublic
144d0 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 Memory = CK_UNAV
144e0 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 AILABLE_INFORMAT
144f0 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54 ION;..pInfo->ulT
14500 6f 74 61 6c 50 72 69 76 61 74 65 4d 65 6d 6f 72 otalPrivateMemor
14510 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 y = CK_UNAVAILAB
14520 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a LE_INFORMATION;.
14530 09 70 49 6e 66 6f 2d 3e 75 6c 46 72 65 65 50 72 .pInfo->ulFreePr
14540 69 76 61 74 65 4d 65 6d 6f 72 79 20 3d 20 43 4b ivateMemory = CK
14550 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 _UNAVAILABLE_INF
14560 4f 52 4d 41 54 49 4f 4e 3b 0a 0a 09 43 41 43 4b ORMATION;...CACK
14570 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
14580 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f "Returning CKR_O
14590 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 K (%i)", CKR_OK)
145a0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f ;...return(CKR_O
145b0 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 K);.}..CK_DEFINE
145c0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c _FUNCTION(CK_RV,
145d0 20 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74 45 76 C_WaitForSlotEv
145e0 65 6e 74 29 28 43 4b 5f 46 4c 41 47 53 20 66 6c ent)(CK_FLAGS fl
145f0 61 67 73 2c 20 43 4b 5f 53 4c 4f 54 5f 49 44 5f ags, CK_SLOT_ID_
14600 50 54 52 20 70 53 6c 6f 74 49 44 2c 20 43 4b 5f PTR pSlotID, CK_
14610 56 4f 49 44 5f 50 54 52 20 70 52 65 73 65 72 76 VOID_PTR pReserv
14620 65 64 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 ed) {..CACKEY_DE
14630 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
14640 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 52 65 ed.");...if (pRe
14650 73 65 72 76 65 64 20 21 3d 20 4e 55 4c 4c 29 20 served != NULL)
14660 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
14670 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
14680 70 52 65 73 65 72 76 65 64 20 69 73 20 6e 6f 74 pReserved is not
14690 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 NULL.");....ret
146a0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 urn(CKR_ARGUMENT
146b0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 S_BAD);..}...if
146c0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c (!cackey_initial
146d0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 ized) {...CACKEY
146e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
146f0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 rror. Not initi
14700 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 alized.");....re
14710 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b turn(CKR_CRYPTOK
14720 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 I_NOT_INITIALIZE
14730 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f D);..}...CACKEY_
14740 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
14750 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 turning CKR_FUNC
14760 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
14770 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 ED (%i)", CKR_FU
14780 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
14790 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 RTED);...return(
147a0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
147b0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a _SUPPORTED);.}..
147c0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 CK_DEFINE_FUNCTI
147d0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4d ON(CK_RV, C_GetM
147e0 65 63 68 61 6e 69 73 6d 4c 69 73 74 29 28 43 4b echanismList)(CK
147f0 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c _SLOT_ID slotID,
14800 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59 CK_MECHANISM_TY
14810 50 45 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 PE_PTR pMechanis
14820 6d 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f mList, CK_ULONG_
14830 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a PTR pulCount) {.
14840 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
14850 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
14860 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 ...if (!cackey_i
14870 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 nitialized) {...
14880 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
14890 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 NTF("Error. Not
148a0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b initialized.");
148b0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 ....return(CKR_C
148c0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 RYPTOKI_NOT_INIT
148d0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 IALIZED);..}...i
148e0 66 20 28 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e f (pulCount == N
148f0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f ULL) {...CACKEY_
14900 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
14910 72 6f 72 2e 20 20 70 75 6c 43 6f 75 6e 74 20 69 ror. pulCount i
14920 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 s NULL.");....re
14930 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e turn(CKR_ARGUMEN
14940 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 TS_BAD);..}...if
14950 20 28 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 (pMechanismList
14960 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 == NULL) {...*p
14970 75 6c 43 6f 75 6e 74 20 3d 20 33 3b 0a 0a 09 09 ulCount = 3;....
14980 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
14990 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 NTF("Returning C
149a0 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 KR_OK (%i)", CKR
149b0 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 _OK);....return(
149c0 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 CKR_OK);..}...if
149d0 20 28 2a 70 75 6c 43 6f 75 6e 74 20 3c 20 33 29 (*pulCount < 3)
149e0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
149f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
14a00 20 20 42 75 66 66 65 72 20 74 6f 6f 20 73 6d 61 Buffer too sma
14a10 6c 6c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ll.");....return
14a20 28 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f (CKR_BUFFER_TOO_
14a30 53 4d 41 4c 4c 29 3b 0a 09 7d 0a 0a 09 70 4d 65 SMALL);..}...pMe
14a40 63 68 61 6e 69 73 6d 4c 69 73 74 5b 30 5d 20 3d chanismList[0] =
14a50 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3b 0a 09 CKM_RSA_PKCS;..
14a60 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 5b 31 pMechanismList[1
14a70 5d 20 3d 20 43 4b 4d 5f 53 48 41 31 5f 52 53 41 ] = CKM_SHA1_RSA
14a80 5f 50 4b 43 53 3b 0a 09 2a 70 75 6c 43 6f 75 6e _PKCS;..*pulCoun
14a90 74 20 3d 20 32 3b 0a 0a 09 43 41 43 4b 45 59 5f t = 2;...CACKEY_
14aa0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
14ab0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 turning CKR_OK (
14ac0 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a %i)", CKR_OK);..
14ad0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b .return(CKR_OK);
14ae0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 .}..CK_DEFINE_FU
14af0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f NCTION(CK_RV, C_
14b00 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f GetMechanismInfo
14b10 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f )(CK_SLOT_ID slo
14b20 74 49 44 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 tID, CK_MECHANIS
14b30 4d 5f 54 59 50 45 20 74 79 70 65 2c 20 43 4b 5f M_TYPE type, CK_
14b40 4d 45 43 48 41 4e 49 53 4d 5f 49 4e 46 4f 5f 50 MECHANISM_INFO_P
14b50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 69 6e 74 TR pInfo) {..int
14b60 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a mutex_retval;..
14b70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
14b80 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
14b90 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 ...if (pInfo ==
14ba0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 NULL) {...CACKEY
14bb0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
14bc0 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e rror. pInfo is N
14bd0 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 ULL.");....retur
14be0 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f n(CKR_ARGUMENTS_
14bf0 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 BAD);..}...if (!
14c00 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a cackey_initializ
14c10 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...CACKEY_D
14c20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
14c30 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c or. Not initial
14c40 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 ized.");....retu
14c50 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f rn(CKR_CRYPTOKI_
14c60 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 NOT_INITIALIZED)
14c70 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 ;..}...if (slotI
14c80 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 D < 0 || slotID
14c90 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 >= (sizeof(cacke
14ca0 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f y_slots) / sizeo
14cb0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 f(cackey_slots[0
14cc0 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f ]))) {...CACKEY_
14cd0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
14ce0 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f ror. Invalid slo
14cf0 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 t requested (%lu
14d00 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 ), outside of va
14d10 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 lid range", slot
14d20 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 ID);....return(C
14d30 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c KR_SLOT_ID_INVAL
14d40 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f ID);..}...mutex_
14d50 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f retval = cackey_
14d60 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 mutex_lock(cacke
14d70 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 y_biglock);..if
14d80 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d (mutex_retval !=
14d90 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 0) {...CACKEY_D
14da0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
14db0 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 or. Locking fai
14dc0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 led.");....retur
14dd0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 n(CKR_GENERAL_ER
14de0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 ROR);..}...if (c
14df0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 ackey_slots[slot
14e00 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 ID].active == 0)
14e10 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
14e20 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
14e30 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 Invalid slot re
14e40 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 quested (%lu), s
14e50 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c lot not currentl
14e60 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 y active", slotI
14e70 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 D);....cackey_mu
14e80 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 tex_unlock(cacke
14e90 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 y_biglock);....r
14ea0 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 eturn(CKR_SLOT_I
14eb0 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a D_INVALID);..}..
14ec0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 .mutex_retval =
14ed0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c cackey_mutex_unl
14ee0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
14ef0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f ck);..if (mutex_
14f00 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 retval != 0) {..
14f10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
14f20 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e INTF("Error. Un
14f30 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 locking failed."
14f40 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
14f50 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b _GENERAL_ERROR);
14f60 0a 09 7d 0a 0a 09 2f 2a 20 58 58 58 3a 20 54 68 ..}.../* XXX: Th
14f70 69 73 20 69 73 20 75 6e 74 65 73 74 65 64 2c 20 is is untested,
14f80 61 6e 64 20 66 75 72 74 68 65 72 20 49 27 6d 20 and further I'm
14f90 6e 6f 74 20 72 65 61 6c 6c 79 20 73 75 72 65 20 not really sure
14fa0 69 66 20 74 68 69 73 20 69 73 20 63 6f 72 72 65 if this is corre
14fb0 63 74 2e 20 2a 2f 0a 09 73 77 69 74 63 68 20 28 ct. */..switch (
14fc0 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20 43 type) {...case C
14fd0 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 KM_RSA_PKCS:....
14fe0 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 4b 65 79 53 pInfo->ulMinKeyS
14ff0 69 7a 65 20 3d 20 35 31 32 3b 0a 09 09 09 70 49 ize = 512;....pI
15000 6e 66 6f 2d 3e 75 6c 4d 61 78 4b 65 79 53 69 7a nfo->ulMaxKeySiz
15010 65 20 3d 20 38 31 39 32 3b 0a 09 09 09 70 49 6e e = 8192;....pIn
15020 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f fo->flags = CKF_
15030 48 57 20 7c 20 43 4b 46 5f 45 4e 43 52 59 50 54 HW | CKF_ENCRYPT
15040 20 7c 20 43 4b 46 5f 44 45 43 52 59 50 54 20 7c | CKF_DECRYPT |
15050 20 43 4b 46 5f 53 49 47 4e 20 7c 20 43 4b 46 5f CKF_SIGN | CKF_
15060 56 45 52 49 46 59 3b 0a 09 09 09 62 72 65 61 6b VERIFY;....break
15070 3b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 ;...case CKM_RSA
15080 5f 58 5f 35 30 39 3a 0a 09 09 09 70 49 6e 66 6f _X_509:....pInfo
15090 2d 3e 75 6c 4d 69 6e 4b 65 79 53 69 7a 65 20 3d ->ulMinKeySize =
150a0 20 35 31 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 512;....pInfo->
150b0 75 6c 4d 61 78 4b 65 79 53 69 7a 65 20 3d 20 38 ulMaxKeySize = 8
150c0 31 39 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 66 192;....pInfo->f
150d0 6c 61 67 73 20 3d 20 43 4b 46 5f 48 57 20 7c 20 lags = CKF_HW |
150e0 43 4b 46 5f 45 4e 43 52 59 50 54 20 7c 20 43 4b CKF_ENCRYPT | CK
150f0 46 5f 44 45 43 52 59 50 54 20 7c 20 43 4b 46 5f F_DECRYPT | CKF_
15100 53 49 47 4e 20 7c 20 43 4b 46 5f 56 45 52 49 46 SIGN | CKF_VERIF
15110 59 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 Y;....break;...c
15120 61 73 65 20 43 4b 4d 5f 53 48 41 31 5f 52 53 41 ase CKM_SHA1_RSA
15130 5f 50 4b 43 53 3a 0a 09 09 09 70 49 6e 66 6f 2d _PKCS:....pInfo-
15140 3e 75 6c 4d 69 6e 4b 65 79 53 69 7a 65 20 3d 20 >ulMinKeySize =
15150 35 31 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 512;....pInfo->u
15160 6c 4d 61 78 4b 65 79 53 69 7a 65 20 3d 20 38 31 lMaxKeySize = 81
15170 39 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 66 6c 92;....pInfo->fl
15180 61 67 73 20 3d 20 43 4b 46 5f 48 57 20 7c 20 43 ags = CKF_HW | C
15190 4b 46 5f 53 49 47 4e 20 7c 20 43 4b 46 5f 56 45 KF_SIGN | CKF_VE
151a0 52 49 46 59 3b 0a 09 09 09 62 72 65 61 6b 3b 0a RIFY;....break;.
151b0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 .}...CACKEY_DEBU
151c0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
151d0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 ing CKR_OK (%i)"
151e0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 , CKR_OK);...ret
151f0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a urn(CKR_OK);.}..
15200 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73 75 70 70 /* We don't supp
15210 6f 72 74 20 74 68 69 73 20 6d 65 74 68 6f 64 2e ort this method.
15220 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 */.CK_DEFINE_FU
15230 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f NCTION(CK_RV, C_
15240 49 6e 69 74 54 6f 6b 65 6e 29 28 43 4b 5f 53 4c InitToken)(CK_SL
15250 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b OT_ID slotID, CK
15260 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 50 _UTF8CHAR_PTR pP
15270 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 in, CK_ULONG ulP
15280 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 38 43 48 inLen, CK_UTF8CH
15290 41 52 5f 50 54 52 20 70 4c 61 62 65 6c 29 20 7b AR_PTR pLabel) {
152a0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
152b0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
152c0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f ;...if (!cackey_
152d0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 initialized) {..
152e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
152f0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f INTF("Error. No
15300 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 t initialized.")
15310 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
15320 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 CRYPTOKI_NOT_INI
15330 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 TIALIZED);..}...
15340 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
15350 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 NTF("Returning C
15360 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 KR_TOKEN_WRITE_P
15370 52 4f 54 45 43 54 45 44 20 28 25 69 29 22 2c 20 ROTECTED (%i)",
15380 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f CKR_TOKEN_WRITE_
15390 50 52 4f 54 45 43 54 45 44 29 3b 0a 0a 09 72 65 PROTECTED);...re
153a0 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57 turn(CKR_TOKEN_W
153b0 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b RITE_PROTECTED);
153c0 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20 .}../* We don't
153d0 73 75 70 70 6f 72 74 20 74 68 69 73 20 6d 65 74 support this met
153e0 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e hod. */.CK_DEFIN
153f0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 E_FUNCTION(CK_RV
15400 2c 20 43 5f 49 6e 69 74 50 49 4e 29 28 43 4b 5f , C_InitPIN)(CK_
15410 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 SESSION_HANDLE h
15420 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 54 46 38 Session, CK_UTF8
15430 43 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 CHAR_PTR pPin, C
15440 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e K_ULONG ulPinLen
15450 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 ) {..CACKEY_DEBU
15460 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 G_PRINTF("Called
15470 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b .");...if (!cack
15480 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 ey_initialized)
15490 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
154a0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
154b0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 Not initialized
154c0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
154d0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f KR_CRYPTOKI_NOT_
154e0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d INITIALIZED);..}
154f0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
15500 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e PRINTF("Returnin
15510 67 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 g CKR_TOKEN_WRIT
15520 45 5f 50 52 4f 54 45 43 54 45 44 20 28 25 69 29 E_PROTECTED (%i)
15530 22 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 ", CKR_TOKEN_WRI
15540 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 0a TE_PROTECTED);..
15550 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 .return(CKR_TOKE
15560 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 N_WRITE_PROTECTE
15570 44 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e D);.}../* We don
15580 27 74 20 73 75 70 70 6f 72 74 20 74 68 69 73 20 't support this
15590 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 method. */.CK_DE
155a0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b FINE_FUNCTION(CK
155b0 5f 52 56 2c 20 43 5f 53 65 74 50 49 4e 29 28 43 _RV, C_SetPIN)(C
155c0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 K_SESSION_HANDLE
155d0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 54 hSession, CK_UT
155e0 46 38 43 48 41 52 5f 50 54 52 20 70 4f 6c 64 50 F8CHAR_PTR pOldP
155f0 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f in, CK_ULONG ulO
15600 6c 64 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 ldPinLen, CK_UTF
15610 38 43 48 41 52 5f 50 54 52 20 70 4e 65 77 50 69 8CHAR_PTR pNewPi
15620 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4e 65 n, CK_ULONG ulNe
15630 77 50 69 6e 4c 65 6e 29 20 7b 0a 09 43 41 43 4b wPinLen) {..CACK
15640 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
15650 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 "Called.");...if
15660 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 (!cackey_initia
15670 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 lized) {...CACKE
15680 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
15690 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 Error. Not init
156a0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 ialized.");....r
156b0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f eturn(CKR_CRYPTO
156c0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a KI_NOT_INITIALIZ
156d0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 ED);..}...CACKEY
156e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
156f0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e eturning CKR_FUN
15700 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
15710 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 TED (%i)", CKR_F
15720 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
15730 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e ORTED);...return
15740 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f (CKR_FUNCTION_NO
15750 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a T_SUPPORTED);.}.
15760 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 .CK_DEFINE_FUNCT
15770 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4f 70 65 ION(CK_RV, C_Ope
15780 6e 53 65 73 73 69 6f 6e 29 28 43 4b 5f 53 4c 4f nSession)(CK_SLO
15790 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f T_ID slotID, CK_
157a0 46 4c 41 47 53 20 66 6c 61 67 73 2c 20 43 4b 5f FLAGS flags, CK_
157b0 56 4f 49 44 5f 50 54 52 20 70 41 70 70 6c 69 63 VOID_PTR pApplic
157c0 61 74 69 6f 6e 2c 20 43 4b 5f 4e 4f 54 49 46 59 ation, CK_NOTIFY
157d0 20 6e 6f 74 69 66 79 2c 20 43 4b 5f 53 45 53 53 notify, CK_SESS
157e0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 ION_HANDLE_PTR p
157f0 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 75 6e 73 hSession) {..uns
15800 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 78 3b 0a igned long idx;.
15810 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 .int mutex_retva
15820 6c 3b 0a 09 69 6e 74 20 66 6f 75 6e 64 5f 73 65 l;..int found_se
15830 73 73 69 6f 6e 20 3d 20 30 3b 0a 0a 09 43 41 43 ssion = 0;...CAC
15840 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
15850 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 ("Called.");...i
15860 66 20 28 28 66 6c 61 67 73 20 26 20 43 4b 46 5f f ((flags & CKF_
15870 53 45 52 49 41 4c 5f 53 45 53 53 49 4f 4e 29 20 SERIAL_SESSION)
15880 21 3d 20 43 4b 46 5f 53 45 52 49 41 4c 5f 53 45 != CKF_SERIAL_SE
15890 53 53 49 4f 4e 29 20 7b 0a 09 09 72 65 74 75 72 SSION) {...retur
158a0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 50 41 n(CKR_SESSION_PA
158b0 52 41 4c 4c 45 4c 5f 4e 4f 54 5f 53 55 50 50 4f RALLEL_NOT_SUPPO
158c0 52 54 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 RTED);..}...if (
158d0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 !cackey_initiali
158e0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f zed) {...CACKEY_
158f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
15900 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 ror. Not initia
15910 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 lized.");....ret
15920 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 urn(CKR_CRYPTOKI
15930 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 _NOT_INITIALIZED
15940 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 );..}...if (slot
15950 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 ID < 0 || slotID
15960 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b >= (sizeof(cack
15970 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 ey_slots) / size
15980 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b of(cackey_slots[
15990 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 0]))) {...CACKEY
159a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
159b0 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c rror. Invalid sl
159c0 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c ot requested (%l
159d0 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 u), outside of v
159e0 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f alid range", slo
159f0 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 tID);....return(
15a00 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 CKR_SLOT_ID_INVA
15a10 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 LID);..}...mutex
15a20 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 _retval = cackey
15a30 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b _mutex_lock(cack
15a40 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 ey_biglock);..if
15a50 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 (mutex_retval !
15a60 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f = 0) {...CACKEY_
15a70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
15a80 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 ror. Locking fa
15a90 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 iled.");....retu
15aa0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 rn(CKR_GENERAL_E
15ab0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 RROR);..}...if (
15ac0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f cackey_slots[slo
15ad0 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 tID].active == 0
15ae0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
15af0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
15b00 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 . Invalid slot r
15b10 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 equested (%lu),
15b20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 slot not current
15b30 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 ly active", slot
15b40 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d ID);....cackey_m
15b50 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b utex_unlock(cack
15b60 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 ey_biglock);....
15b70 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f return(CKR_SLOT_
15b80 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a ID_INVALID);..}.
15b90 0a 09 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 ../* Verify that
15ba0 20 74 68 65 20 63 61 72 64 20 69 73 20 61 63 74 the card is act
15bb0 75 61 6c 6c 79 20 69 6e 20 74 68 65 20 73 6c 6f ually in the slo
15bc0 74 2e 20 2a 2f 0a 09 2f 2a 20 58 58 58 3a 20 43 t. */../* XXX: C
15bd0 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 heck to make sur
15be0 65 20 74 68 69 73 20 69 73 20 69 6e 20 74 68 65 e this is in the
15bf0 20 50 4b 43 53 23 31 31 20 73 70 65 63 69 66 69 PKCS#11 specifi
15c00 63 61 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 63 cation */..if (c
15c10 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 ackey_token_pres
15c20 65 6e 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 ent(&cackey_slot
15c30 73 5b 73 6c 6f 74 49 44 5d 29 20 21 3d 20 43 41 s[slotID]) != CA
15c40 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 CKEY_PCSC_S_TOKE
15c50 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09 09 43 41 NPRESENT) {...CA
15c60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
15c70 46 28 22 45 72 72 6f 72 2e 20 20 43 61 72 64 20 F("Error. Card
15c80 6e 6f 74 20 70 72 65 73 65 6e 74 2e 20 20 52 65 not present. Re
15c90 74 75 72 6e 69 6e 67 20 43 4b 52 5f 44 45 56 49 turning CKR_DEVI
15ca0 43 45 5f 52 45 4d 4f 56 45 44 22 29 3b 0a 0a 09 CE_REMOVED");...
15cb0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e .cackey_mutex_un
15cc0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
15cd0 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 ock);....return(
15ce0 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 CKR_DEVICE_REMOV
15cf0 45 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 ED);..}...for (i
15d00 64 78 20 3d 20 31 3b 20 69 64 78 20 3c 20 28 73 dx = 1; idx < (s
15d10 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 izeof(cackey_ses
15d20 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 sions) / sizeof(
15d30 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
15d40 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 0])); idx++) {..
15d50 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 .if (!cackey_ses
15d60 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 sions[idx].activ
15d70 65 29 20 7b 0a 09 09 09 66 6f 75 6e 64 5f 73 65 e) {....found_se
15d80 73 73 69 6f 6e 20 3d 20 31 3b 0a 0a 09 09 09 2a ssion = 1;.....*
15d90 70 68 53 65 73 73 69 6f 6e 20 3d 20 69 64 78 3b phSession = idx;
15da0 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 .....cackey_sess
15db0 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 ions[idx].active
15dc0 20 3d 20 31 3b 0a 09 09 09 63 61 63 6b 65 79 5f = 1;....cackey_
15dd0 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 6c sessions[idx].sl
15de0 6f 74 49 44 20 3d 20 73 6c 6f 74 49 44 3b 0a 09 otID = slotID;..
15df0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e ..cackey_session
15e00 73 5b 69 64 78 5d 2e 73 74 61 74 65 20 3d 20 43 s[idx].state = C
15e10 4b 53 5f 52 4f 5f 50 55 42 4c 49 43 5f 53 45 53 KS_RO_PUBLIC_SES
15e20 53 49 4f 4e 3b 0a 09 09 09 63 61 63 6b 65 79 5f SION;....cackey_
15e30 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 66 6c sessions[idx].fl
15e40 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 09 09 09 ags = flags;....
15e50 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
15e60 69 64 78 5d 2e 75 6c 44 65 76 69 63 65 45 72 72 idx].ulDeviceErr
15e70 6f 72 20 3d 20 30 3b 0a 09 09 09 63 61 63 6b 65 or = 0;....cacke
15e80 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e y_sessions[idx].
15e90 70 41 70 70 6c 69 63 61 74 69 6f 6e 20 3d 20 70 pApplication = p
15ea0 41 70 70 6c 69 63 61 74 69 6f 6e 3b 0a 09 09 09 Application;....
15eb0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
15ec0 69 64 78 5d 2e 4e 6f 74 69 66 79 20 3d 20 6e 6f idx].Notify = no
15ed0 74 69 66 79 3b 0a 0a 09 09 09 63 61 63 6b 65 79 tify;.....cackey
15ee0 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 _sessions[idx].i
15ef0 64 65 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c 4c dentities = NULL
15f00 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 ;....cackey_sess
15f10 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 ions[idx].identi
15f20 74 69 65 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a ties_count = 0;.
15f30 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 ....cackey_sessi
15f40 6f 6e 73 5b 69 64 78 5d 2e 73 65 61 72 63 68 5f ons[idx].search_
15f50 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 active = 0;.....
15f60 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
15f70 69 64 78 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 idx].sign_active
15f80 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 = 0;.....cackey
15f90 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 64 _sessions[idx].d
15fa0 65 63 72 79 70 74 5f 61 63 74 69 76 65 20 3d 20 ecrypt_active =
15fb0 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 0;.....cackey_se
15fc0 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e ssions[idx].iden
15fd0 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f tities = cackey_
15fe0 72 65 61 64 5f 69 64 65 6e 74 69 74 69 65 73 28 read_identities(
15ff0 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c &cackey_slots[sl
16000 6f 74 49 44 5d 2c 20 26 63 61 63 6b 65 79 5f 73 otID], &cackey_s
16010 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 essions[idx].ide
16020 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a ntities_count);.
16030 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a .....break;...}.
16040 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 .}...mutex_retva
16050 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 l = cackey_mutex
16060 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 _unlock(cackey_b
16070 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 iglock);..if (mu
16080 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 tex_retval != 0)
16090 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
160a0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
160b0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c Unlocking fail
160c0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
160d0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 (CKR_GENERAL_ERR
160e0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 66 OR);..}...if (!f
160f0 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 29 20 7b 0a ound_session) {.
16100 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
16110 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
16120 20 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 CKR_SESSION_COU
16130 4e 54 20 28 25 69 29 22 2c 20 43 4b 52 5f 53 45 NT (%i)", CKR_SE
16140 53 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a 0a 09 SSION_COUNT);...
16150 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 .return(CKR_SESS
16160 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a 09 7d 0a 0a ION_COUNT);..}..
16170 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
16180 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
16190 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b CKR_OK (%i)", CK
161a0 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 R_OK);...return(
161b0 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 CKR_OK);.}..CK_D
161c0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 EFINE_FUNCTION(C
161d0 4b 5f 52 56 2c 20 43 5f 43 6c 6f 73 65 53 65 73 K_RV, C_CloseSes
161e0 73 69 6f 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e sion)(CK_SESSION
161f0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e _HANDLE hSession
16200 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 ) {..int mutex_r
16210 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f etval;...CACKEY_
16220 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
16230 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 lled.");...if (!
16240 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a cackey_initializ
16250 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...CACKEY_D
16260 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
16270 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c or. Not initial
16280 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 ized.");....retu
16290 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f rn(CKR_CRYPTOKI_
162a0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 NOT_INITIALIZED)
162b0 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 ;..}...if (hSess
162c0 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 ion == 0 || hSes
162d0 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 sion >= (sizeof(
162e0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 cackey_sessions)
162f0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 / sizeof(cackey
16300 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 _sessions[0])))
16310 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
16320 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
16330 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 Session out of
16340 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 range.");......r
16350 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f eturn(CKR_SESSIO
16360 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 N_HANDLE_INVALID
16370 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 );..}...mutex_re
16380 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 tval = cackey_mu
16390 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f tex_lock(cackey_
163a0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d biglock);..if (m
163b0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 utex_retval != 0
163c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
163d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
163e0 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 . Locking faile
163f0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
16400 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f CKR_GENERAL_ERRO
16410 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 R);..}...if (!ca
16420 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
16430 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 ession].active)
16440 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 {...cackey_mutex
16450 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 _unlock(cackey_b
16460 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b iglock);....CACK
16470 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
16480 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e "Error. Session
16490 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a not active.");.
164a0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f .....return(CKR_
164b0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 SESSION_HANDLE_I
164c0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 NVALID);..}...ca
164d0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
164e0 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 20 3d ession].active =
164f0 20 30 3b 0a 09 63 61 63 6b 65 79 5f 66 72 65 65 0;..cackey_free
16500 5f 69 64 65 6e 74 69 74 69 65 73 28 63 61 63 6b _identities(cack
16510 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
16520 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 sion].identities
16530 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e , cackey_session
16540 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e s[hSession].iden
16550 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a tities_count);..
16560 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 .mutex_retval =
16570 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c cackey_mutex_unl
16580 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
16590 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f ck);..if (mutex_
165a0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 retval != 0) {..
165b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
165c0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e INTF("Error. Un
165d0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 locking failed."
165e0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
165f0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b _GENERAL_ERROR);
16600 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 ..}...CACKEY_DEB
16610 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
16620 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 ning CKR_OK (%i)
16630 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 ", CKR_OK);...re
16640 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a turn(CKR_OK);.}.
16650 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 .CK_DEFINE_FUNCT
16660 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6c 6f ION(CK_RV, C_Clo
16670 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73 29 28 43 seAllSessions)(C
16680 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 K_SLOT_ID slotID
16690 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 ) {..uint32_t id
166a0 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 x;..int mutex_re
166b0 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 tval;...CACKEY_D
166c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
166d0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 led.");...if (!c
166e0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 ackey_initialize
166f0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 d) {...CACKEY_DE
16700 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
16710 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 r. Not initiali
16720 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 zed.");....retur
16730 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e n(CKR_CRYPTOKI_N
16740 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b OT_INITIALIZED);
16750 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 ..}...if (slotID
16760 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e < 0 || slotID >
16770 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 = (sizeof(cackey
16780 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 _slots) / sizeof
16790 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d (cackey_slots[0]
167a0 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ))) {...CACKEY_D
167b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
167c0 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 or. Invalid slot
167d0 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 requested (%lu)
167e0 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c , outside of val
167f0 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 id range", slotI
16800 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b D);....return(CK
16810 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 R_SLOT_ID_INVALI
16820 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 D);..}...mutex_r
16830 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d etval = cackey_m
16840 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 utex_lock(cackey
16850 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 _biglock);..if (
16860 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 mutex_retval !=
16870 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 0) {...CACKEY_DE
16880 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
16890 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c r. Locking fail
168a0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
168b0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 (CKR_GENERAL_ERR
168c0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 OR);..}...if (ca
168d0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 ckey_slots[slotI
168e0 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 D].active == 0)
168f0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
16900 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
16910 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 Invalid slot req
16920 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c uested (%lu), sl
16930 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 ot not currently
16940 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 active", slotID
16950 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 );....cackey_mut
16960 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 ex_unlock(cackey
16970 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 _biglock);....re
16980 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 turn(CKR_SLOT_ID
16990 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 _INVALID);..}...
169a0 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 for (idx = 0; id
169b0 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b x < (sizeof(cack
169c0 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 ey_sessions) / s
169d0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 izeof(cackey_ses
169e0 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b sions[0])); idx+
169f0 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 +) {...if (cacke
16a00 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e y_sessions[idx].
16a10 61 63 74 69 76 65 29 20 7b 0a 09 09 09 69 66 20 active) {....if
16a20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 (cackey_sessions
16a30 5b 69 64 78 5d 2e 73 6c 6f 74 49 44 20 21 3d 20 [idx].slotID !=
16a40 73 6c 6f 74 49 44 29 20 7b 0a 09 09 09 09 63 6f slotID) {.....co
16a50 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 ntinue;....}....
16a60 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e .cackey_mutex_un
16a70 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
16a80 6f 63 6b 29 3b 0a 09 09 09 43 5f 43 6c 6f 73 65 ock);....C_Close
16a90 53 65 73 73 69 6f 6e 28 69 64 78 29 3b 0a 09 09 Session(idx);...
16aa0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f .cackey_mutex_lo
16ab0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
16ac0 6b 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 k);...}..}...mut
16ad0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b ex_retval = cack
16ae0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 ey_mutex_unlock(
16af0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
16b00 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 ..if (mutex_retv
16b10 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 al != 0) {...CAC
16b20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
16b30 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b ("Error. Unlock
16b40 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a ing failed.");..
16b50 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e ..return(CKR_GEN
16b60 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a ERAL_ERROR);..}.
16b70 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
16b80 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
16b90 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 CKR_OK (%i)", C
16ba0 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e KR_OK);...return
16bb0 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f (CKR_OK);.}..CK_
16bc0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 DEFINE_FUNCTION(
16bd0 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 65 73 73 CK_RV, C_GetSess
16be0 69 6f 6e 49 6e 66 6f 29 28 43 4b 5f 53 45 53 53 ionInfo)(CK_SESS
16bf0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 ION_HANDLE hSess
16c00 69 6f 6e 2c 20 43 4b 5f 53 45 53 53 49 4f 4e 5f ion, CK_SESSION_
16c10 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 INFO_PTR pInfo)
16c20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 {..int mutex_ret
16c30 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 val;...CACKEY_DE
16c40 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
16c50 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e ed.");...if (pIn
16c60 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 fo == NULL) {...
16c70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
16c80 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 NTF("Error. pInf
16c90 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 o is NULL.");...
16ca0 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 .return(CKR_ARGU
16cb0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a MENTS_BAD);..}..
16cc0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 .if (!cackey_ini
16cd0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 tialized) {...CA
16ce0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
16cf0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 F("Error. Not i
16d00 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a nitialized.");..
16d10 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 ..return(CKR_CRY
16d20 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 PTOKI_NOT_INITIA
16d30 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 LIZED);..}...if
16d40 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c (hSession == 0 |
16d50 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 | hSession >= (s
16d60 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 izeof(cackey_ses
16d70 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 sions) / sizeof(
16d80 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
16d90 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 0]))) {...CACKEY
16da0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
16db0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f rror. Session o
16dc0 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a ut of range.");.
16dd0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f .....return(CKR_
16de0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 SESSION_HANDLE_I
16df0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 NVALID);..}...mu
16e00 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 tex_retval = cac
16e10 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 key_mutex_lock(c
16e20 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
16e30 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 .if (mutex_retva
16e40 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b l != 0) {...CACK
16e50 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
16e60 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 "Error. Locking
16e70 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 failed.");....r
16e80 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 eturn(CKR_GENERA
16e90 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 L_ERROR);..}...i
16ea0 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 f (!cackey_sessi
16eb0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 ons[hSession].ac
16ec0 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 tive) {...cackey
16ed0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 _mutex_unlock(ca
16ee0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a ckey_biglock);..
16ef0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
16f00 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 RINTF("Error. S
16f10 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 ession not activ
16f20 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 e.");......retur
16f30 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 n(CKR_SESSION_HA
16f40 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 NDLE_INVALID);..
16f50 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 73 6c 6f 74 49 }...pInfo->slotI
16f60 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 D = cackey_sessi
16f70 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c ons[hSession].sl
16f80 6f 74 49 44 3b 0a 09 70 49 6e 66 6f 2d 3e 73 74 otID;..pInfo->st
16f90 61 74 65 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 ate = cackey_ses
16fa0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
16fb0 73 74 61 74 65 3b 0a 09 70 49 6e 66 6f 2d 3e 66 state;..pInfo->f
16fc0 6c 61 67 73 20 3d 20 63 61 63 6b 65 79 5f 73 65 lags = cackey_se
16fd0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
16fe0 2e 66 6c 61 67 73 3b 0a 09 70 49 6e 66 6f 2d 3e .flags;..pInfo->
16ff0 75 6c 44 65 76 69 63 65 45 72 72 6f 72 20 3d 20 ulDeviceError =
17000 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
17010 68 53 65 73 73 69 6f 6e 5d 2e 75 6c 44 65 76 69 hSession].ulDevi
17020 63 65 45 72 72 6f 72 3b 0a 0a 09 6d 75 74 65 78 ceError;...mutex
17030 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 _retval = cackey
17040 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 _mutex_unlock(ca
17050 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 ckey_biglock);..
17060 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c if (mutex_retval
17070 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 != 0) {...CACKE
17080 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
17090 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e Error. Unlockin
170a0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 g failed.");....
170b0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 return(CKR_GENER
170c0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 AL_ERROR);..}...
170d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
170e0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 NTF("Returning C
170f0 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 KR_OK (%i)", CKR
17100 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 _OK);...return(C
17110 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 KR_OK);.}..CK_DE
17120 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b FINE_FUNCTION(CK
17130 5f 52 56 2c 20 43 5f 47 65 74 4f 70 65 72 61 74 _RV, C_GetOperat
17140 69 6f 6e 53 74 61 74 65 29 28 43 4b 5f 53 45 53 ionState)(CK_SES
17150 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 SION_HANDLE hSes
17160 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 sion, CK_BYTE_PT
17170 52 20 70 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 R pOperationStat
17180 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 e, CK_ULONG_PTR
17190 70 75 6c 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 pulOperationStat
171a0 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f eLen) {..CACKEY_
171b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
171c0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 lled.");...if (!
171d0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a cackey_initializ
171e0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...CACKEY_D
171f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
17200 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c or. Not initial
17210 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 ized.");....retu
17220 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f rn(CKR_CRYPTOKI_
17230 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 NOT_INITIALIZED)
17240 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ;..}...CACKEY_DE
17250 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
17260 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 rning CKR_FUNCTI
17270 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
17280 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 (%i)", CKR_FUNC
17290 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
172a0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b ED);...return(CK
172b0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
172c0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b UPPORTED);.}..CK
172d0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e _DEFINE_FUNCTION
172e0 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74 4f 70 65 (CK_RV, C_SetOpe
172f0 72 61 74 69 6f 6e 53 74 61 74 65 29 28 43 4b 5f rationState)(CK_
17300 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 SESSION_HANDLE h
17310 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 Session, CK_BYTE
17320 5f 50 54 52 20 70 4f 70 65 72 61 74 69 6f 6e 53 _PTR pOperationS
17330 74 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 tate, CK_ULONG u
17340 6c 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 4c lOperationStateL
17350 65 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 en, CK_OBJECT_HA
17360 4e 44 4c 45 20 68 45 6e 63 72 79 70 74 69 6f 6e NDLE hEncryption
17370 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 Key, CK_OBJECT_H
17380 41 4e 44 4c 45 20 68 41 75 74 68 65 6e 74 69 63 ANDLE hAuthentic
17390 61 74 69 6f 6e 4b 65 79 29 20 7b 0a 09 43 41 43 ationKey) {..CAC
173a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
173b0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 ("Called.");...i
173c0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 f (!cackey_initi
173d0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b alized) {...CACK
173e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
173f0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 "Error. Not ini
17400 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 tialized.");....
17410 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 return(CKR_CRYPT
17420 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 OKI_NOT_INITIALI
17430 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 ZED);..}...CACKE
17440 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
17450 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 Returning CKR_FU
17460 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
17470 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f RTED (%i)", CKR_
17480 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
17490 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 PORTED);...retur
174a0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e n(CKR_FUNCTION_N
174b0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d OT_SUPPORTED);.}
174c0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 ..CK_DEFINE_FUNC
174d0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f TION(CK_RV, C_Lo
174e0 67 69 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f gin)(CK_SESSION_
174f0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c HANDLE hSession,
17500 20 43 4b 5f 55 53 45 52 5f 54 59 50 45 20 75 73 CK_USER_TYPE us
17510 65 72 54 79 70 65 2c 20 43 4b 5f 55 54 46 38 43 erType, CK_UTF8C
17520 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b HAR_PTR pPin, CK
17530 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 29 _ULONG ulPinLen)
17540 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 {..int mutex_re
17550 74 76 61 6c 3b 0a 09 69 6e 74 20 6c 6f 67 69 6e tval;..int login
17560 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 _ret;...CACKEY_D
17570 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
17580 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 led.");...if (!c
17590 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 ackey_initialize
175a0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 d) {...CACKEY_DE
175b0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
175c0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 r. Not initiali
175d0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 zed.");....retur
175e0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e n(CKR_CRYPTOKI_N
175f0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b OT_INITIALIZED);
17600 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 ..}...if (hSessi
17610 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 on == 0 || hSess
17620 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 ion >= (sizeof(c
17630 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 ackey_sessions)
17640 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f / sizeof(cackey_
17650 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b sessions[0]))) {
17660 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
17670 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
17680 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 Session out of r
17690 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 ange.");......re
176a0 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e turn(CKR_SESSION
176b0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 _HANDLE_INVALID)
176c0 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73 65 72 54 ;..}...if (userT
176d0 79 70 65 20 21 3d 20 43 4b 55 5f 55 53 45 52 29 ype != CKU_USER)
176e0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
176f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
17700 20 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 We only suppor
17710 74 20 55 53 45 52 20 6d 6f 64 65 2c 20 61 73 6b t USER mode, ask
17720 65 64 20 66 6f 72 20 25 6c 75 20 6d 6f 64 65 2e ed for %lu mode.
17730 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e ", (unsigned lon
17740 67 29 20 75 73 65 72 54 79 70 65 29 0a 0a 09 09 g) userType)....
17750 72 65 74 75 72 6e 28 43 4b 52 5f 55 53 45 52 5f return(CKR_USER_
17760 54 59 50 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 TYPE_INVALID);..
17770 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c }...mutex_retval
17780 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f = cackey_mutex_
17790 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
177a0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 ock);..if (mutex
177b0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a _retval != 0) {.
177c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
177d0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c RINTF("Error. L
177e0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 ocking failed.")
177f0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
17800 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a GENERAL_ERROR);.
17810 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 .}...if (!cackey
17820 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
17830 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 on].active) {...
17840 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c cackey_mutex_unl
17850 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
17860 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 ck);....CACKEY_D
17870 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
17880 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 or. Session not
17890 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 active.");.....
178a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 .return(CKR_SESS
178b0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c ION_HANDLE_INVAL
178c0 49 44 29 3b 0a 09 7d 0a 0a 09 6c 6f 67 69 6e 5f ID);..}...login_
178d0 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 6c 6f 67 ret = cackey_log
178e0 69 6e 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 in(&cackey_slots
178f0 5b 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 [cackey_sessions
17900 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 [hSession].slotI
17910 44 5d 2c 20 70 50 69 6e 2c 20 75 6c 50 69 6e 4c D], pPin, ulPinL
17920 65 6e 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 en, NULL);..if (
17930 6c 6f 67 69 6e 5f 72 65 74 20 21 3d 20 43 41 43 login_ret != CAC
17940 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b KEY_PCSC_S_OK) {
17950 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f ...cackey_mutex_
17960 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 unlock(cackey_bi
17970 67 6c 6f 63 6b 29 3b 0a 0a 09 09 69 66 20 28 6c glock);....if (l
17980 6f 67 69 6e 5f 72 65 74 20 3d 3d 20 43 41 43 4b ogin_ret == CACK
17990 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 EY_PCSC_E_LOCKED
179a0 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 ) {....CACKEY_DE
179b0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
179c0 72 2e 20 20 54 6f 6b 65 6e 20 69 73 20 6c 6f 63 r. Token is loc
179d0 6b 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 ked.");.....retu
179e0 72 6e 28 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b 45 rn(CKR_PIN_LOCKE
179f0 44 29 3b 0a 09 09 7d 20 65 6c 73 65 20 69 66 20 D);...} else if
17a00 28 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d 20 43 41 (login_ret == CA
17a10 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 CKEY_PCSC_E_BADP
17a20 49 4e 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f IN) {....CACKEY_
17a30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
17a40 72 6f 72 2e 20 20 49 6e 76 61 6c 69 64 20 50 49 ror. Invalid PI
17a50 4e 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e N.");.....return
17a60 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 (CKR_PIN_INCORRE
17a70 43 54 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b CT);...}....CACK
17a80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
17a90 22 45 72 72 6f 72 2e 20 20 55 6e 6b 6e 6f 77 6e "Error. Unknown
17aa0 20 65 72 72 6f 72 20 72 65 74 75 72 6e 65 64 20 error returned
17ab0 66 72 6f 6d 20 63 61 63 6b 65 79 5f 6c 6f 67 69 from cackey_logi
17ac0 6e 28 29 20 28 25 69 29 22 2c 20 6c 6f 67 69 6e n() (%i)", login
17ad0 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e _ret);....return
17ae0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 (CKR_GENERAL_ERR
17af0 4f 52 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 OR);..}...cackey
17b00 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
17b10 6f 6e 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f on].state = CKS_
17b20 52 4f 5f 55 53 45 52 5f 46 55 4e 43 54 49 4f 4e RO_USER_FUNCTION
17b30 53 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 S;...mutex_retva
17b40 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 l = cackey_mutex
17b50 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 _unlock(cackey_b
17b60 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 iglock);..if (mu
17b70 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 tex_retval != 0)
17b80 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
17b90 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
17ba0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c Unlocking fail
17bb0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
17bc0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 (CKR_GENERAL_ERR
17bd0 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 OR);..}...CACKEY
17be0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
17bf0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 eturning CKR_OK
17c00 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a (%i)", CKR_OK);.
17c10 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 ..return(CKR_OK)
17c20 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 ;.}..CK_DEFINE_F
17c30 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 UNCTION(CK_RV, C
17c40 5f 4c 6f 67 6f 75 74 29 28 43 4b 5f 53 45 53 53 _Logout)(CK_SESS
17c50 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 ION_HANDLE hSess
17c60 69 6f 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 ion) {..int mute
17c70 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b x_retval;...CACK
17c80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
17c90 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 "Called.");...if
17ca0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 (!cackey_initia
17cb0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 lized) {...CACKE
17cc0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
17cd0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 Error. Not init
17ce0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 ialized.");....r
17cf0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f eturn(CKR_CRYPTO
17d00 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a KI_NOT_INITIALIZ
17d10 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 ED);..}...if (hS
17d20 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 ession == 0 || h
17d30 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 Session >= (size
17d40 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f of(cackey_sessio
17d50 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 ns) / sizeof(cac
17d60 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 key_sessions[0])
17d70 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 )) {...CACKEY_DE
17d80 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
17d90 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 r. Session out
17da0 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a of range.");....
17db0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 ..return(CKR_SES
17dc0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 SION_HANDLE_INVA
17dd0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 LID);..}...mutex
17de0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 _retval = cackey
17df0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b _mutex_lock(cack
17e00 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 ey_biglock);..if
17e10 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 (mutex_retval !
17e20 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f = 0) {...CACKEY_
17e30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
17e40 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 ror. Locking fa
17e50 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 iled.");....retu
17e60 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 rn(CKR_GENERAL_E
17e70 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 RROR);..}...if (
17e80 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 !cackey_sessions
17e90 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 [hSession].activ
17ea0 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 e) {...cackey_mu
17eb0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 tex_unlock(cacke
17ec0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 y_biglock);....C
17ed0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
17ee0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 TF("Error. Sess
17ef0 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 ion not active."
17f00 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 );......return(C
17f10 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c KR_SESSION_HANDL
17f20 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a E_INVALID);..}..
17f30 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 .cackey_sessions
17f40 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65 [hSession].state
17f50 20 3d 20 43 4b 53 5f 52 4f 5f 50 55 42 4c 49 43 = CKS_RO_PUBLIC
17f60 5f 53 45 53 53 49 4f 4e 3b 0a 0a 09 6d 75 74 65 _SESSION;...mute
17f70 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 x_retval = cacke
17f80 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
17f90 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
17fa0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 .if (mutex_retva
17fb0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b l != 0) {...CACK
17fc0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
17fd0 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 "Error. Unlocki
17fe0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 ng failed.");...
17ff0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 .return(CKR_GENE
18000 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a RAL_ERROR);..}..
18010 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
18020 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
18030 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b CKR_OK (%i)", CK
18040 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 R_OK);...return(
18050 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 CKR_OK);.}..CK_D
18060 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 EFINE_FUNCTION(C
18070 4b 5f 52 56 2c 20 43 5f 43 72 65 61 74 65 4f 62 K_RV, C_CreateOb
18080 6a 65 63 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e ject)(CK_SESSION
18090 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e _HANDLE hSession
180a0 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 , CK_ATTRIBUTE_P
180b0 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b TR pTemplate, CK
180c0 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 _ULONG ulCount,
180d0 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 CK_OBJECT_HANDLE
180e0 5f 50 54 52 20 70 68 4f 62 6a 65 63 74 29 20 7b _PTR phObject) {
180f0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
18100 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
18110 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f ;...if (!cackey_
18120 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 initialized) {..
18130 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
18140 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f INTF("Error. No
18150 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 t initialized.")
18160 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
18170 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 CRYPTOKI_NOT_INI
18180 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 TIALIZED);..}...
18190 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
181a0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 NTF("Returning C
181b0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
181c0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c SUPPORTED (%i)",
181d0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f CKR_FUNCTION_NO
181e0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 T_SUPPORTED);...
181f0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 return(CKR_FUNCT
18200 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
18210 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 D);.}..CK_DEFINE
18220 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c _FUNCTION(CK_RV,
18230 20 43 5f 43 6f 70 79 4f 62 6a 65 63 74 29 28 43 C_CopyObject)(C
18240 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 K_SESSION_HANDLE
18250 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 hSession, CK_OB
18260 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a JECT_HANDLE hObj
18270 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 ect, CK_ATTRIBUT
18280 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c E_PTR pTemplate,
18290 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e CK_ULONG ulCoun
182a0 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e t, CK_OBJECT_HAN
182b0 44 4c 45 5f 50 54 52 20 70 68 4e 65 77 4f 62 6a DLE_PTR phNewObj
182c0 65 63 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 ect) {..CACKEY_D
182d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
182e0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 led.");...if (!c
182f0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 ackey_initialize
18300 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 d) {...CACKEY_DE
18310 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
18320 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 r. Not initiali
18330 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 zed.");....retur
18340 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e n(CKR_CRYPTOKI_N
18350 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b OT_INITIALIZED);
18360 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 ..}...CACKEY_DEB
18370 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
18380 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f ning CKR_FUNCTIO
18390 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 N_NOT_SUPPORTED
183a0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 (%i)", CKR_FUNCT
183b0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
183c0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 D);...return(CKR
183d0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
183e0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f PPORTED);.}..CK_
183f0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 DEFINE_FUNCTION(
18400 43 4b 5f 52 56 2c 20 43 5f 44 65 73 74 72 6f 79 CK_RV, C_Destroy
18410 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45 53 53 49 Object)(CK_SESSI
18420 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 ON_HANDLE hSessi
18430 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 on, CK_OBJECT_HA
18440 4e 44 4c 45 20 68 4f 62 6a 65 63 74 29 20 7b 0a NDLE hObject) {.
18450 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
18460 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
18470 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 ...if (!cackey_i
18480 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 nitialized) {...
18490 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
184a0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 NTF("Error. Not
184b0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b initialized.");
184c0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 ....return(CKR_C
184d0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 RYPTOKI_NOT_INIT
184e0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 IALIZED);..}...C
184f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
18500 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b TF("Returning CK
18510 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
18520 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 UPPORTED (%i)",
18530 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
18540 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 _SUPPORTED);...r
18550 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 eturn(CKR_FUNCTI
18560 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
18570 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f );.}..CK_DEFINE_
18580 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 FUNCTION(CK_RV,
18590 43 5f 47 65 74 4f 62 6a 65 63 74 53 69 7a 65 29 C_GetObjectSize)
185a0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 (CK_SESSION_HAND
185b0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f LE hSession, CK_
185c0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f OBJECT_HANDLE hO
185d0 62 6a 65 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f bject, CK_ULONG_
185e0 50 54 52 20 70 75 6c 53 69 7a 65 29 20 7b 0a 09 PTR pulSize) {..
185f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
18600 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a NTF("Called.");.
18610 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e ..if (!cackey_in
18620 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 itialized) {...C
18630 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
18640 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 TF("Error. Not
18650 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a initialized.");.
18660 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 ...return(CKR_CR
18670 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 YPTOKI_NOT_INITI
18680 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 ALIZED);..}...CA
18690 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
186a0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 F("Returning CKR
186b0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
186c0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 PPORTED (%i)", C
186d0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
186e0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 SUPPORTED);...re
186f0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f turn(CKR_FUNCTIO
18700 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 N_NOT_SUPPORTED)
18710 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 ;.}..CK_DEFINE_F
18720 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 UNCTION(CK_RV, C
18730 5f 47 65 74 41 74 74 72 69 62 75 74 65 56 61 6c _GetAttributeVal
18740 75 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 ue)(CK_SESSION_H
18750 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 ANDLE hSession,
18760 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 CK_OBJECT_HANDLE
18770 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54 hObject, CK_ATT
18780 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 RIBUTE_PTR pTemp
18790 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 late, CK_ULONG u
187a0 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 41 54 lCount) {..CK_AT
187b0 54 52 49 42 55 54 45 20 2a 63 75 72 72 5f 61 74 TRIBUTE *curr_at
187c0 74 72 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b tr;..struct cack
187d0 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 ey_identity *ide
187e0 6e 74 69 74 79 3b 0a 09 75 6e 73 69 67 6e 65 64 ntity;..unsigned
187f0 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 79 5f 69 long identity_i
18800 64 78 2c 20 61 74 74 72 5f 69 64 78 2c 20 73 65 dx, attr_idx, se
18810 73 73 5f 61 74 74 72 5f 69 64 78 2c 20 6e 75 6d ss_attr_idx, num
18820 5f 69 64 73 3b 0a 09 69 6e 74 20 6d 75 74 65 78 _ids;..int mutex
18830 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 _retval;..CK_RV
18840 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b retval = CKR_OK;
18850 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 56 ..CK_VOID_PTR pV
18860 61 6c 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 alue;..CK_ULONG
18870 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 43 41 ulValueLen;...CA
18880 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
18890 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
188a0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 if (!cackey_init
188b0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 ialized) {...CAC
188c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
188d0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e ("Error. Not in
188e0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 itialized.");...
188f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 .return(CKR_CRYP
18900 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c TOKI_NOT_INITIAL
18910 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 IZED);..}...if (
18920 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c hSession == 0 ||
18930 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 hSession >= (si
18940 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 zeof(cackey_sess
18950 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 ions) / sizeof(c
18960 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 ackey_sessions[0
18970 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f ]))) {...CACKEY_
18980 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
18990 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 ror. Session ou
189a0 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 t of range.");..
189b0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 ....return(CKR_S
189c0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e ESSION_HANDLE_IN
189d0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 VALID);..}...if
189e0 28 68 4f 62 6a 65 63 74 20 3d 3d 20 30 29 20 7b (hObject == 0) {
189f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
18a00 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
18a10 4f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 6f 75 Object handle ou
18a20 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 t of range.");..
18a30 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f ....return(CKR_O
18a40 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 49 4e 56 BJECT_HANDLE_INV
18a50 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 ALID);..}...if (
18a60 75 6c 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a ulCount == 0) {.
18a70 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75 ../* Short circu
18a80 69 74 2c 20 69 66 20 7a 65 72 6f 20 6f 62 6a 65 it, if zero obje
18a90 63 74 73 20 77 65 72 65 20 73 70 65 63 69 66 69 cts were specifi
18aa0 65 64 20 72 65 74 75 72 6e 20 7a 65 72 6f 20 69 ed return zero i
18ab0 74 65 6d 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 tems immediately
18ac0 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 */...CACKEY_DEB
18ad0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
18ae0 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 ning CKR_OK (%i)
18af0 20 28 73 68 6f 72 74 20 63 69 72 63 75 69 74 29 (short circuit)
18b00 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 ", CKR_OK);....r
18b10 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 eturn(CKR_OK);..
18b20 7d 0a 0a 09 69 66 20 28 70 54 65 6d 70 6c 61 74 }...if (pTemplat
18b30 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 e == NULL) {...C
18b40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
18b50 54 46 28 22 45 72 72 6f 72 2e 20 20 70 54 65 6d TF("Error. pTem
18b60 70 6c 61 74 65 20 69 73 20 4e 55 4c 4c 2e 22 29 plate is NULL.")
18b70 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
18b80 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a ARGUMENTS_BAD);.
18b90 09 7d 0a 0a 09 69 64 65 6e 74 69 74 79 5f 69 64 .}...identity_id
18ba0 78 20 3d 20 68 4f 62 6a 65 63 74 20 2d 20 31 3b x = hObject - 1;
18bb0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 ...mutex_retval
18bc0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c = cackey_mutex_l
18bd0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
18be0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f ck);..if (mutex_
18bf0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 retval != 0) {..
18c00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
18c10 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f INTF("Error. Lo
18c20 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b cking failed.");
18c30 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 ....return(CKR_G
18c40 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 ENERAL_ERROR);..
18c50 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f }...if (!cackey_
18c60 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
18c70 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 n].active) {...c
18c80 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f ackey_mutex_unlo
18c90 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
18ca0 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 k);....CACKEY_DE
18cb0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
18cc0 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 r. Session not
18cd0 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 active.");......
18ce0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 return(CKR_SESSI
18cf0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 ON_HANDLE_INVALI
18d00 44 29 3b 0a 09 7d 0a 0a 09 6e 75 6d 5f 69 64 73 D);..}...num_ids
18d10 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f = cackey_sessio
18d20 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 ns[hSession].ide
18d30 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a ntities_count;..
18d40 09 69 66 20 28 69 64 65 6e 74 69 74 79 5f 69 64 .if (identity_id
18d50 78 20 3e 3d 20 6e 75 6d 5f 69 64 73 29 20 7b 0a x >= num_ids) {.
18d60 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 ..cackey_mutex_u
18d70 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 nlock(cackey_big
18d80 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 lock);....CACKEY
18d90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
18da0 72 72 6f 72 2e 20 20 4f 62 6a 65 63 74 20 68 61 rror. Object ha
18db0 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 ndle out of rang
18dc0 65 2e 20 20 69 64 65 6e 74 69 74 79 5f 69 64 78 e. identity_idx
18dd0 20 3d 20 25 6c 75 2c 20 6e 75 6d 5f 69 64 73 20 = %lu, num_ids
18de0 3d 20 25 6c 75 2e 22 2c 20 28 75 6e 73 69 67 6e = %lu.", (unsign
18df0 65 64 20 6c 6f 6e 67 29 20 69 64 65 6e 74 69 74 ed long) identit
18e00 79 5f 69 64 78 2c 20 28 75 6e 73 69 67 6e 65 64 y_idx, (unsigned
18e10 20 6c 6f 6e 67 29 20 6e 75 6d 5f 69 64 73 29 3b long) num_ids);
18e20 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f ....return(CKR_O
18e30 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 49 4e 56 BJECT_HANDLE_INV
18e40 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 64 65 6e ALID);..}...iden
18e50 74 69 74 79 20 3d 20 26 63 61 63 6b 65 79 5f 73 tity = &cackey_s
18e60 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
18e70 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 69 64 65 ].identities[ide
18e80 6e 74 69 74 79 5f 69 64 78 5d 3b 0a 0a 09 66 6f ntity_idx];...fo
18e90 72 20 28 61 74 74 72 5f 69 64 78 20 3d 20 30 3b r (attr_idx = 0;
18ea0 20 61 74 74 72 5f 69 64 78 20 3c 20 75 6c 43 6f attr_idx < ulCo
18eb0 75 6e 74 3b 20 61 74 74 72 5f 69 64 78 2b 2b 29 unt; attr_idx++)
18ec0 20 7b 0a 09 09 63 75 72 72 5f 61 74 74 72 20 3d {...curr_attr =
18ed0 20 26 70 54 65 6d 70 6c 61 74 65 5b 61 74 74 72 &pTemplate[attr
18ee0 5f 69 64 78 5d 3b 0a 0a 09 09 70 56 61 6c 75 65 _idx];....pValue
18ef0 20 3d 20 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c = NULL;...ulVal
18f00 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 ueLen = (CK_LONG
18f10 29 20 2d 31 3b 0a 0a 09 09 43 41 43 4b 45 59 5f ) -1;....CACKEY_
18f20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4c 6f DEBUG_PRINTF("Lo
18f30 6f 6b 69 6e 67 20 66 6f 72 20 61 74 74 72 69 62 oking for attrib
18f40 75 74 65 20 30 78 25 30 38 6c 78 20 28 69 64 65 ute 0x%08lx (ide
18f50 6e 74 69 74 79 3a 25 6c 75 29 20 2e 2e 2e 22 2c ntity:%lu) ...",
18f60 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
18f70 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 curr_attr->type
18f80 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
18f90 29 20 69 64 65 6e 74 69 74 79 5f 69 64 78 29 3b ) identity_idx);
18fa0 0a 0a 09 09 66 6f 72 20 28 73 65 73 73 5f 61 74 ....for (sess_at
18fb0 74 72 5f 69 64 78 20 3d 20 30 3b 20 73 65 73 73 tr_idx = 0; sess
18fc0 5f 61 74 74 72 5f 69 64 78 20 3c 20 69 64 65 6e _attr_idx < iden
18fd0 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 tity->attributes
18fe0 5f 63 6f 75 6e 74 3b 20 73 65 73 73 5f 61 74 74 _count; sess_att
18ff0 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 69 66 r_idx++) {....if
19000 20 28 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 (identity->attr
19010 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 ibutes[sess_attr
19020 5f 69 64 78 5d 2e 74 79 70 65 20 3d 3d 20 63 75 _idx].type == cu
19030 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 29 20 7b rr_attr->type) {
19040 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
19050 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 66 G_PRINTF(" ... f
19060 6f 75 6e 64 20 69 74 2c 20 70 56 61 6c 75 65 20 ound it, pValue
19070 3d 20 25 70 2c 20 75 6c 56 61 6c 75 65 4c 65 6e = %p, ulValueLen
19080 20 3d 20 25 6c 75 22 2c 20 69 64 65 6e 74 69 74 = %lu", identit
19090 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 y->attributes[se
190a0 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 70 56 61 ss_attr_idx].pVa
190b0 6c 75 65 2c 20 69 64 65 6e 74 69 74 79 2d 3e 61 lue, identity->a
190c0 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 ttributes[sess_a
190d0 74 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65 ttr_idx].ulValue
190e0 4c 65 6e 29 3b 0a 09 09 09 09 0a 09 09 09 09 70 Len);..........p
190f0 56 61 6c 75 65 20 3d 20 69 64 65 6e 74 69 74 79 Value = identity
19100 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 ->attributes[ses
19110 73 5f 61 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c s_attr_idx].pVal
19120 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c ue;.....ulValueL
19130 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 61 en = identity->a
19140 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 ttributes[sess_a
19150 74 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65 ttr_idx].ulValue
19160 4c 65 6e 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 Len;....}...}...
19170 09 69 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e .if (curr_attr->
19180 70 56 61 6c 75 65 20 26 26 20 70 56 61 6c 75 65 pValue && pValue
19190 29 20 7b 0a 09 09 09 69 66 20 28 63 75 72 72 5f ) {....if (curr_
191a0 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e attr->ulValueLen
191b0 20 3e 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 29 20 >= ulValueLen)
191c0 7b 0a 09 09 09 09 6d 65 6d 63 70 79 28 63 75 72 {.....memcpy(cur
191d0 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20 r_attr->pValue,
191e0 70 56 61 6c 75 65 2c 20 75 6c 56 61 6c 75 65 4c pValue, ulValueL
191f0 65 6e 29 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b en);....} else {
19200 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 .....ulValueLen
19210 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a = (CK_LONG) -1;.
19220 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b .....retval = CK
19230 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 R_BUFFER_TOO_SMA
19240 4c 4c 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 LL;....}...}....
19250 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c curr_attr->ulVal
19260 75 65 4c 65 6e 20 3d 20 75 6c 56 61 6c 75 65 4c ueLen = ulValueL
19270 65 6e 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 en;..}...mutex_r
19280 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d etval = cackey_m
19290 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b utex_unlock(cack
192a0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 ey_biglock);..if
192b0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 (mutex_retval !
192c0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f = 0) {...CACKEY_
192d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
192e0 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 ror. Unlocking
192f0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 failed.");....re
19300 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c turn(CKR_GENERAL
19310 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 _ERROR);..}...if
19320 20 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f (retval == CKR_
19330 41 54 54 52 49 42 55 54 45 5f 54 59 50 45 5f 49 ATTRIBUTE_TYPE_I
19340 4e 56 41 4c 49 44 29 20 7b 0a 09 09 43 41 43 4b NVALID) {...CACK
19350 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
19360 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 41 "Returning CKR_A
19370 54 54 52 49 42 55 54 45 5f 54 59 50 45 5f 49 4e TTRIBUTE_TYPE_IN
19380 56 41 4c 49 44 20 28 25 69 29 22 2c 20 28 69 6e VALID (%i)", (in
19390 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65 t) retval);..} e
193a0 6c 73 65 20 69 66 20 28 72 65 74 76 61 6c 20 3d lse if (retval =
193b0 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f = CKR_BUFFER_TOO
193c0 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 43 41 43 4b _SMALL) {...CACK
193d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
193e0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 42 "Returning CKR_B
193f0 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 UFFER_TOO_SMALL
19400 28 25 69 29 22 2c 20 28 69 6e 74 29 20 72 65 74 (%i)", (int) ret
19410 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66 val);..} else if
19420 20 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f (retval == CKR_
19430 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 OK) {...CACKEY_D
19440 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
19450 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 urning CKR_OK (%
19460 69 29 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 i)", (int) retva
19470 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 l);..} else {...
19480 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
19490 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 25 NTF("Returning %
194a0 69 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c i", (int) retval
194b0 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 );..}...return(r
194c0 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 etval);.}..CK_DE
194d0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b FINE_FUNCTION(CK
194e0 5f 52 56 2c 20 43 5f 53 65 74 41 74 74 72 69 62 _RV, C_SetAttrib
194f0 75 74 65 56 61 6c 75 65 29 28 43 4b 5f 53 45 53 uteValue)(CK_SES
19500 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 SION_HANDLE hSes
19510 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f sion, CK_OBJECT_
19520 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 HANDLE hObject,
19530 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 CK_ATTRIBUTE_PTR
19540 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 pTemplate, CK_U
19550 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20 7b 0a LONG ulCount) {.
19560 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
19570 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
19580 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 ...if (!cackey_i
19590 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 nitialized) {...
195a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
195b0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 NTF("Error. Not
195c0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b initialized.");
195d0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 ....return(CKR_C
195e0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 RYPTOKI_NOT_INIT
195f0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 IALIZED);..}...C
19600 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
19610 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b TF("Returning CK
19620 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
19630 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 UPPORTED (%i)",
19640 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
19650 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 _SUPPORTED);...r
19660 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 eturn(CKR_FUNCTI
19670 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
19680 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f );.}..CK_DEFINE_
19690 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 FUNCTION(CK_RV,
196a0 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 C_FindObjectsIni
196b0 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 t)(CK_SESSION_HA
196c0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 NDLE hSession, C
196d0 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 K_ATTRIBUTE_PTR
196e0 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c pTemplate, CK_UL
196f0 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 ONG ulCount) {..
19700 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c int mutex_retval
19710 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ;...CACKEY_DEBUG
19720 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
19730 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ");...if (!cacke
19740 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b y_initialized) {
19750 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
19760 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
19770 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e Not initialized.
19780 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
19790 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 R_CRYPTOKI_NOT_I
197a0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
197b0 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d ..if (hSession =
197c0 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 = 0 || hSession
197d0 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 >= (sizeof(cacke
197e0 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 y_sessions) / si
197f0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 zeof(cackey_sess
19800 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 ions[0]))) {...C
19810 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
19820 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 TF("Error. Sess
19830 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 ion out of range
19840 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e .");......return
19850 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e (CKR_SESSION_HAN
19860 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d DLE_INVALID);..}
19870 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 ...mutex_retval
19880 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c = cackey_mutex_l
19890 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
198a0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f ck);..if (mutex_
198b0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 retval != 0) {..
198c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
198d0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f INTF("Error. Lo
198e0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b cking failed.");
198f0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 ....return(CKR_G
19900 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 ENERAL_ERROR);..
19910 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f }...if (!cackey_
19920 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
19930 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 n].active) {...c
19940 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f ackey_mutex_unlo
19950 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
19960 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 k);....CACKEY_DE
19970 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
19980 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 r. Session not
19990 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 active.");......
199a0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 return(CKR_SESSI
199b0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 ON_HANDLE_INVALI
199c0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 D);..}...if (cac
199d0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
199e0 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 ssion].search_ac
199f0 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 tive) {...cackey
19a00 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 _mutex_unlock(ca
19a10 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a ckey_biglock);..
19a20 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
19a30 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 RINTF("Error. S
19a40 65 61 72 63 68 20 61 6c 72 65 61 64 79 20 61 63 earch already ac
19a50 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 tive.");......re
19a60 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 turn(CKR_OPERATI
19a70 4f 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a ON_ACTIVE);..}..
19a80 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 .if (cackey_slot
19a90 73 5b 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e s[cackey_session
19aa0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 s[hSession].slot
19ab0 49 44 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 29 20 ID].slot_reset)
19ac0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
19ad0 5f 50 52 49 4e 54 46 28 22 54 68 65 20 73 6c 6f _PRINTF("The slo
19ae0 74 20 68 61 73 20 62 65 65 6e 20 72 65 73 65 74 t has been reset
19af0 20 73 69 6e 63 65 20 77 65 20 6c 61 73 74 20 6c since we last l
19b00 6f 6f 6b 65 64 20 66 6f 72 20 69 64 65 6e 74 69 ooked for identi
19b10 74 69 65 73 20 2d 2d 20 72 65 73 63 61 6e 6e 69 ties -- rescanni
19b20 6e 67 22 29 3b 0a 0a 09 09 69 66 20 28 63 61 63 ng");....if (cac
19b30 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
19b40 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 ssion].identitie
19b50 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 s != NULL) {....
19b60 63 61 63 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e cackey_free_iden
19b70 74 69 74 69 65 73 28 63 61 63 6b 65 79 5f 73 65 tities(cackey_se
19b80 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
19b90 2e 69 64 65 6e 74 69 74 69 65 73 2c 20 63 61 63 .identities, cac
19ba0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
19bb0 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 ssion].identitie
19bc0 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 63 61 s_count);.....ca
19bd0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
19be0 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 ession].identiti
19bf0 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63 61 es = NULL;....ca
19c00 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
19c10 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 ession].identiti
19c20 65 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 es_count = 0;...
19c30 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 }....cackey_slot
19c40 73 5b 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e s[cackey_session
19c50 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 s[hSession].slot
19c60 49 44 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 20 3d ID].slot_reset =
19c70 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 0;..}...if (cac
19c80 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
19c90 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 ssion].identitie
19ca0 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 s == NULL) {...c
19cb0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
19cc0 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 Session].identit
19cd0 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 ies = cackey_rea
19ce0 64 5f 69 64 65 6e 74 69 74 69 65 73 28 26 63 61 d_identities(&ca
19cf0 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 61 63 6b 65 ckey_slots[cacke
19d00 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
19d10 69 6f 6e 5d 2e 73 6c 6f 74 49 44 5d 2c 20 26 63 ion].slotID], &c
19d20 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
19d30 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 Session].identit
19d40 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 7d 0a 0a ies_count);..}..
19d50 09 69 66 20 28 70 54 65 6d 70 6c 61 74 65 20 21 .if (pTemplate !
19d60 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28 = NULL) {...if (
19d70 75 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a ulCount != 0) {.
19d80 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f ...cackey_sessio
19d90 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 ns[hSession].sea
19da0 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 rch_query_count
19db0 3d 20 75 6c 43 6f 75 6e 74 3b 0a 09 09 09 63 61 = ulCount;....ca
19dc0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
19dd0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 ession].search_q
19de0 75 65 72 79 20 3d 20 6d 61 6c 6c 6f 63 28 75 6c uery = malloc(ul
19df0 43 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a Count * sizeof(*
19e00 70 54 65 6d 70 6c 61 74 65 29 29 3b 0a 0a 09 09 pTemplate));....
19e10 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 .memcpy(cackey_s
19e20 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
19e30 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 2c 20 ].search_query,
19e40 70 54 65 6d 70 6c 61 74 65 2c 20 75 6c 43 6f 75 pTemplate, ulCou
19e50 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70 54 65 nt * sizeof(*pTe
19e60 6d 70 6c 61 74 65 29 29 3b 0a 09 09 7d 20 65 6c mplate));...} el
19e70 73 65 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 73 se {....cackey_s
19e80 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
19e90 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 ].search_query_c
19ea0 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 09 63 61 63 ount = 0;....cac
19eb0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
19ec0 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 ssion].search_qu
19ed0 65 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a ery = NULL;...}.
19ee0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 .} else {...if (
19ef0 75 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a ulCount != 0) {.
19f00 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f ...cackey_mutex_
19f10 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 unlock(cackey_bi
19f20 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43 41 43 4b glock);.....CACK
19f30 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
19f40 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 "Error. Search
19f50 71 75 65 72 79 20 73 70 65 63 69 66 69 65 64 20 query specified
19f60 61 73 20 4e 55 4c 4c 2c 20 62 75 74 20 6e 75 6d as NULL, but num
19f70 62 65 72 20 6f 66 20 71 75 65 72 79 20 74 65 72 ber of query ter
19f80 6d 73 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 ms not specified
19f90 20 61 73 20 30 2e 22 29 3b 0a 0a 09 09 09 72 65 as 0.");.....re
19fa0 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e turn(CKR_ARGUMEN
19fb0 54 53 5f 42 41 44 29 3b 0a 09 09 7d 0a 0a 09 09 TS_BAD);...}....
19fc0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
19fd0 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 hSession].search
19fe0 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20 30 _query_count = 0
19ff0 3b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 ;...cackey_sessi
1a000 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 ons[hSession].se
1a010 61 72 63 68 5f 71 75 65 72 79 20 3d 20 4e 55 4c arch_query = NUL
1a020 4c 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 L;..}...cackey_s
1a030 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
1a040 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 20 ].search_active
1a050 3d 20 31 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 = 1;..cackey_ses
1a060 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
1a070 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64 20 3d search_curr_id =
1a080 20 30 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 0;...mutex_retv
1a090 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 al = cackey_mute
1a0a0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
1a0b0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d biglock);..if (m
1a0c0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 utex_retval != 0
1a0d0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
1a0e0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
1a0f0 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 . Unlocking fai
1a100 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 led.");....retur
1a110 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 n(CKR_GENERAL_ER
1a120 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 ROR);..}...CACKE
1a130 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1a140 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b Returning CKR_OK
1a150 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b (%i)", CKR_OK);
1a160 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b ...return(CKR_OK
1a170 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f );.}..CK_DEFINE_
1a180 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 FUNCTION(CK_RV,
1a190 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 29 28 43 C_FindObjects)(C
1a1a0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 K_SESSION_HANDLE
1a1b0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 hSession, CK_OB
1a1c0 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 JECT_HANDLE_PTR
1a1d0 70 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 55 4c 4f phObject, CK_ULO
1a1e0 4e 47 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f NG ulMaxObjectCo
1a1f0 75 6e 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 unt, CK_ULONG_PT
1a200 52 20 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 R pulObjectCount
1a210 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b ) {..struct cack
1a220 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 63 75 72 ey_identity *cur
1a230 72 5f 69 64 3b 0a 09 43 4b 5f 41 54 54 52 49 42 r_id;..CK_ATTRIB
1a240 55 54 45 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a UTE *curr_attr;.
1a250 09 43 4b 5f 55 4c 4f 4e 47 20 63 75 72 72 5f 69 .CK_ULONG curr_i
1a260 64 5f 69 64 78 2c 20 63 75 72 72 5f 6f 75 74 5f d_idx, curr_out_
1a270 69 64 5f 69 64 78 2c 20 63 75 72 72 5f 61 74 74 id_idx, curr_att
1a280 72 5f 69 64 78 2c 20 73 65 73 73 5f 61 74 74 72 r_idx, sess_attr
1a290 5f 69 64 78 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 _idx;..CK_ULONG
1a2a0 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2c 20 70 matched_count, p
1a2b0 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e rev_matched_coun
1a2c0 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 t;..int mutex_re
1a2d0 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 tval;...CACKEY_D
1a2e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
1a2f0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 led.");...if (!c
1a300 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 ackey_initialize
1a310 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 d) {...CACKEY_DE
1a320 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
1a330 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 r. Not initiali
1a340 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 zed.");....retur
1a350 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e n(CKR_CRYPTOKI_N
1a360 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b OT_INITIALIZED);
1a370 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 4f 62 6a ..}...if (pulObj
1a380 65 63 74 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c ectCount == NULL
1a390 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
1a3a0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
1a3b0 2e 20 20 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e . pulObjectCoun
1a3c0 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 t is NULL.");...
1a3d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 .return(CKR_ARGU
1a3e0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a MENTS_BAD);..}..
1a3f0 09 69 66 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d .if (phObject ==
1a400 20 4e 55 4c 4c 20 26 26 20 75 6c 4d 61 78 4f 62 NULL && ulMaxOb
1a410 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20 30 29 20 jectCount == 0)
1a420 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 {.../* Short cir
1a430 63 75 69 74 2c 20 69 66 20 7a 65 72 6f 20 6f 62 cuit, if zero ob
1a440 6a 65 63 74 73 20 77 65 72 65 20 73 70 65 63 69 jects were speci
1a450 66 69 65 64 20 72 65 74 75 72 6e 20 7a 65 72 6f fied return zero
1a460 20 69 74 65 6d 73 20 69 6d 6d 65 64 69 61 74 65 items immediate
1a470 6c 79 20 2a 2f 0a 09 09 2a 70 75 6c 4f 62 6a 65 ly */...*pulObje
1a480 63 74 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 ctCount = 0;....
1a490 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1a4a0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 NTF("Returning C
1a4b0 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 KR_OK (%i) (shor
1a4c0 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 t circuit)", CKR
1a4d0 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 _OK);....return(
1a4e0 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 CKR_OK);..}...if
1a4f0 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55 (phObject == NU
1a500 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 LL) {...CACKEY_D
1a510 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
1a520 6f 72 2e 20 20 70 68 4f 62 6a 65 63 74 20 69 73 or. phObject is
1a530 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 NULL.");....ret
1a540 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 urn(CKR_ARGUMENT
1a550 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 S_BAD);..}...if
1a560 28 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e (ulMaxObjectCoun
1a570 74 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b t == 0) {...CACK
1a580 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1a590 22 45 72 72 6f 72 2e 20 20 4d 61 78 69 6d 75 6d "Error. Maximum
1a5a0 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 number of objec
1a5b0 74 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20 ts specified as
1a5c0 7a 65 72 6f 2e 22 29 3b 0a 0a 09 09 72 65 74 75 zero.");....retu
1a5d0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 rn(CKR_ARGUMENTS
1a5e0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 _BAD);..}...if (
1a5f0 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c hSession == 0 ||
1a600 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 hSession >= (si
1a610 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 zeof(cackey_sess
1a620 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 ions) / sizeof(c
1a630 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 ackey_sessions[0
1a640 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f ]))) {...CACKEY_
1a650 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
1a660 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 ror. Session ou
1a670 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 t of range.");..
1a680 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 ....return(CKR_S
1a690 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e ESSION_HANDLE_IN
1a6a0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 VALID);..}...mut
1a6b0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b ex_retval = cack
1a6c0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 ey_mutex_lock(ca
1a6d0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 ckey_biglock);..
1a6e0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c if (mutex_retval
1a6f0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 != 0) {...CACKE
1a700 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1a710 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 Error. Locking
1a720 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 failed.");....re
1a730 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c turn(CKR_GENERAL
1a740 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 _ERROR);..}...if
1a750 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f (!cackey_sessio
1a760 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 ns[hSession].act
1a770 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f ive) {...cackey_
1a780 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 mutex_unlock(cac
1a790 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 key_biglock);...
1a7a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1a7b0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 INTF("Error. Se
1a7c0 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 ssion not active
1a7d0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e .");......return
1a7e0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e (CKR_SESSION_HAN
1a7f0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d DLE_INVALID);..}
1a800 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 ...if (!cackey_s
1a810 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
1a820 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 29 ].search_active)
1a830 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 {...cackey_mute
1a840 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
1a850 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 biglock);....CAC
1a860 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1a870 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 ("Error. Search
1a880 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a not active.");.
1a890 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f .....return(CKR_
1a8a0 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e OPERATION_NOT_IN
1a8b0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
1a8c0 09 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 .curr_out_id_idx
1a8d0 20 3d 20 30 3b 0a 09 66 6f 72 20 28 63 75 72 72 = 0;..for (curr
1a8e0 5f 69 64 5f 69 64 78 20 3d 20 63 61 63 6b 65 79 _id_idx = cackey
1a8f0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
1a900 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 5f on].search_curr_
1a910 69 64 3b 20 63 75 72 72 5f 69 64 5f 69 64 78 20 id; curr_id_idx
1a920 3c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e < cackey_session
1a930 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e s[hSession].iden
1a940 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 26 26 20 tities_count &&
1a950 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 ulMaxObjectCount
1a960 3b 20 63 75 72 72 5f 69 64 5f 69 64 78 2b 2b 29 ; curr_id_idx++)
1a970 20 7b 0a 09 09 63 75 72 72 5f 69 64 20 3d 20 26 {...curr_id = &
1a980 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
1a990 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 hSession].identi
1a9a0 74 69 65 73 5b 63 75 72 72 5f 69 64 5f 69 64 78 ties[curr_id_idx
1a9b0 5d 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ];....CACKEY_DEB
1a9c0 55 47 5f 50 52 49 4e 54 46 28 22 50 72 6f 63 65 UG_PRINTF("Proce
1a9d0 73 73 69 6e 67 20 69 64 65 6e 74 69 74 79 3a 25 ssing identity:%
1a9e0 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c lu", (unsigned l
1a9f0 6f 6e 67 29 20 63 75 72 72 5f 69 64 5f 69 64 78 ong) curr_id_idx
1aa00 29 3b 0a 0a 09 09 6d 61 74 63 68 65 64 5f 63 6f );....matched_co
1aa10 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 66 6f 72 20 unt = 0;....for
1aa20 28 63 75 72 72 5f 61 74 74 72 5f 69 64 78 20 3d (curr_attr_idx =
1aa30 20 30 3b 20 63 75 72 72 5f 61 74 74 72 5f 69 64 0; curr_attr_id
1aa40 78 20 3c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 x < cackey_sessi
1aa50 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 ons[hSession].se
1aa60 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 arch_query_count
1aa70 3b 20 63 75 72 72 5f 61 74 74 72 5f 69 64 78 2b ; curr_attr_idx+
1aa80 2b 29 20 7b 0a 09 09 09 70 72 65 76 5f 6d 61 74 +) {....prev_mat
1aa90 63 68 65 64 5f 63 6f 75 6e 74 20 3d 20 6d 61 74 ched_count = mat
1aaa0 63 68 65 64 5f 63 6f 75 6e 74 3b 0a 0a 09 09 09 ched_count;.....
1aab0 63 75 72 72 5f 61 74 74 72 20 3d 20 26 63 61 63 curr_attr = &cac
1aac0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
1aad0 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 ssion].search_qu
1aae0 65 72 79 5b 63 75 72 72 5f 61 74 74 72 5f 69 64 ery[curr_attr_id
1aaf0 78 5d 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 x];.....CACKEY_D
1ab00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 43 EBUG_PRINTF(" C
1ab10 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 74 74 72 hecking for attr
1ab20 69 62 75 74 65 20 30 78 25 30 38 6c 78 20 69 6e ibute 0x%08lx in
1ab30 20 69 64 65 6e 74 69 74 79 3a 25 69 2e 2e 2e 22 identity:%i..."
1ab40 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
1ab50 29 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 ) curr_attr->typ
1ab60 65 2c 20 28 69 6e 74 29 20 63 75 72 72 5f 69 64 e, (int) curr_id
1ab70 5f 69 64 78 29 3b 0a 09 09 09 43 41 43 4b 45 59 _idx);....CACKEY
1ab80 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 _DEBUG_PRINTBUF(
1ab90 22 20 20 20 20 56 61 6c 75 65 20 6c 6f 6f 6b 69 " Value looki
1aba0 6e 67 20 66 6f 72 3a 22 2c 20 63 75 72 72 5f 61 ng for:", curr_a
1abb0 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20 63 75 72 ttr->pValue, cur
1abc0 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c r_attr->ulValueL
1abd0 65 6e 29 3b 0a 0a 09 09 09 66 6f 72 20 28 73 65 en);.....for (se
1abe0 73 73 5f 61 74 74 72 5f 69 64 78 20 3d 20 30 3b ss_attr_idx = 0;
1abf0 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3c sess_attr_idx <
1ac00 20 63 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 curr_id->attrib
1ac10 75 74 65 73 5f 63 6f 75 6e 74 3b 20 73 65 73 73 utes_count; sess
1ac20 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 _attr_idx++) {..
1ac30 09 09 09 69 66 20 28 63 75 72 72 5f 69 64 2d 3e ...if (curr_id->
1ac40 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f attributes[sess_
1ac50 61 74 74 72 5f 69 64 78 5d 2e 74 79 70 65 20 3d attr_idx].type =
1ac60 3d 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 = curr_attr->typ
1ac70 65 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 e) {......CACKEY
1ac80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 _DEBUG_PRINTF("
1ac90 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 6d 61 74 ... found mat
1aca0 63 68 69 6e 67 20 74 79 70 65 20 2e 2e 2e 22 29 ching type ...")
1acb0 3b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 ;......CACKEY_DE
1acc0 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 20 20 BUG_PRINTBUF("
1acd0 20 20 2e 2e 2e 20 6f 75 72 20 76 61 6c 75 65 3a ... our value:
1ace0 22 2c 20 63 75 72 72 5f 69 64 2d 3e 61 74 74 72 ", curr_id->attr
1acf0 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 ibutes[sess_attr
1ad00 5f 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 63 75 _idx].pValue, cu
1ad10 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65 rr_id->attribute
1ad20 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d s[sess_attr_idx]
1ad30 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 .ulValueLen);...
1ad40 09 09 09 09 69 66 20 28 63 75 72 72 5f 61 74 74 ....if (curr_att
1ad50 72 2d 3e 70 56 61 6c 75 65 20 3d 3d 20 4e 55 4c r->pValue == NUL
1ad60 4c 29 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 L) {.......CACKE
1ad70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1ad80 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 ... found
1ad90 20 77 69 6c 64 63 61 72 64 20 6d 61 74 63 68 22 wildcard match"
1ada0 29 3b 0a 0a 09 09 09 09 09 09 6d 61 74 63 68 65 );........matche
1adb0 64 5f 63 6f 75 6e 74 2b 2b 3b 0a 0a 09 09 09 09 d_count++;......
1adc0 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a ..break;......}.
1add0 0a 20 09 09 09 09 09 69 66 20 28 63 75 72 72 5f . .....if (curr_
1ade0 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e attr->ulValueLen
1adf0 20 3d 3d 20 63 75 72 72 5f 69 64 2d 3e 61 74 74 == curr_id->att
1ae00 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 ributes[sess_att
1ae10 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 r_idx].ulValueLe
1ae20 6e 20 26 26 20 6d 65 6d 63 6d 70 28 63 75 72 72 n && memcmp(curr
1ae30 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20 63 _attr->pValue, c
1ae40 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 urr_id->attribut
1ae50 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 es[sess_attr_idx
1ae60 5d 2e 70 56 61 6c 75 65 2c 20 63 75 72 72 5f 69 ].pValue, curr_i
1ae70 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 d->attributes[se
1ae80 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c 56 ss_attr_idx].ulV
1ae90 61 6c 75 65 4c 65 6e 29 20 3d 3d 20 30 29 20 7b alueLen) == 0) {
1aea0 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 .......CACKEY_DE
1aeb0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20 20 BUG_PRINTF("
1aec0 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 65 78 61 ... found exa
1aed0 63 74 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09 09 ct match");.....
1aee0 09 09 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 ...matched_count
1aef0 2b 2b 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b ++;........break
1af00 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 ;......}.....}..
1af10 09 09 7d 0a 0a 09 09 09 2f 2a 20 49 66 20 74 68 ..}...../* If th
1af20 65 20 61 74 74 72 69 62 75 74 65 20 63 6f 75 6c e attribute coul
1af30 64 20 6e 6f 74 20 62 65 20 6d 61 74 63 68 65 64 d not be matched
1af40 2c 20 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 , do not try to
1af50 6d 61 74 63 68 20 61 64 64 69 74 69 6f 6e 61 6c match additional
1af60 20 61 74 74 72 69 62 75 74 65 73 20 2a 2f 0a 09 attributes */..
1af70 09 09 69 66 20 28 70 72 65 76 5f 6d 61 74 63 68 ..if (prev_match
1af80 65 64 5f 63 6f 75 6e 74 20 3d 3d 20 6d 61 74 63 ed_count == matc
1af90 68 65 64 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 hed_count) {....
1afa0 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d .break;....}...}
1afb0 0a 0a 09 09 69 66 20 28 6d 61 74 63 68 65 64 5f ....if (matched_
1afc0 63 6f 75 6e 74 20 3d 3d 20 63 61 63 6b 65 79 5f count == cackey_
1afd0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
1afe0 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f n].search_query_
1aff0 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b count) {....CACK
1b000 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1b010 22 20 20 2e 2e 2e 20 41 6c 6c 20 25 69 20 61 74 " ... All %i at
1b020 74 72 69 62 75 74 65 73 20 63 68 65 63 6b 65 64 tributes checked
1b030 20 66 6f 72 20 66 6f 75 6e 64 2c 20 61 64 64 69 for found, addi
1b040 6e 67 20 69 64 65 6e 74 69 74 79 3a 25 69 20 74 ng identity:%i t
1b050 6f 20 72 65 74 75 72 6e 65 64 20 6c 69 73 74 22 o returned list"
1b060 2c 20 28 69 6e 74 29 20 63 61 63 6b 65 79 5f 73 , (int) cackey_s
1b070 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
1b080 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 ].search_query_c
1b090 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63 75 72 72 ount, (int) curr
1b0a0 5f 69 64 5f 69 64 78 29 3b 0a 0a 09 09 09 70 68 _id_idx);.....ph
1b0b0 4f 62 6a 65 63 74 5b 63 75 72 72 5f 6f 75 74 5f Object[curr_out_
1b0c0 69 64 5f 69 64 78 5d 20 3d 20 63 75 72 72 5f 69 id_idx] = curr_i
1b0d0 64 5f 69 64 78 20 2b 20 31 3b 0a 0a 09 09 09 75 d_idx + 1;.....u
1b0e0 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 2d lMaxObjectCount-
1b0f0 2d 3b 0a 0a 09 09 09 63 75 72 72 5f 6f 75 74 5f -;.....curr_out_
1b100 69 64 5f 69 64 78 2b 2b 3b 0a 09 09 7d 20 65 6c id_idx++;...} el
1b110 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 se {....CACKEY_D
1b120 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e EBUG_PRINTF(" .
1b130 2e 2e 20 4e 6f 74 20 61 6c 6c 20 25 69 20 28 6f .. Not all %i (o
1b140 6e 6c 79 20 66 6f 75 6e 64 20 25 69 29 20 61 74 nly found %i) at
1b150 74 72 69 62 75 74 65 73 20 63 68 65 63 6b 65 64 tributes checked
1b160 20 66 6f 72 20 66 6f 75 6e 64 2c 20 6e 6f 74 20 for found, not
1b170 61 64 64 69 6e 67 20 69 64 65 6e 74 69 74 79 3a adding identity:
1b180 25 69 22 2c 20 28 69 6e 74 29 20 63 61 63 6b 65 %i", (int) cacke
1b190 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
1b1a0 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 ion].search_quer
1b1b0 79 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 6d y_count, (int) m
1b1c0 61 74 63 68 65 64 5f 63 6f 75 6e 74 2c 20 28 69 atched_count, (i
1b1d0 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29 nt) curr_id_idx)
1b1e0 3b 0a 09 09 7d 0a 09 7d 0a 09 63 61 63 6b 65 79 ;...}..}..cackey
1b1f0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
1b200 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 5f on].search_curr_
1b210 69 64 20 3d 20 63 75 72 72 5f 69 64 5f 69 64 78 id = curr_id_idx
1b220 3b 0a 09 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75 ;..*pulObjectCou
1b230 6e 74 20 3d 20 63 75 72 72 5f 6f 75 74 5f 69 64 nt = curr_out_id
1b240 5f 69 64 78 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 _idx;...mutex_re
1b250 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 tval = cackey_mu
1b260 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 tex_unlock(cacke
1b270 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 y_biglock);..if
1b280 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d (mutex_retval !=
1b290 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 0) {...CACKEY_D
1b2a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
1b2b0 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 or. Unlocking f
1b2c0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 ailed.");....ret
1b2d0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f urn(CKR_GENERAL_
1b2e0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 ERROR);..}...CAC
1b2f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1b300 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f ("Returning CKR_
1b310 4f 4b 20 28 25 69 29 2c 20 6e 75 6d 20 6f 62 6a OK (%i), num obj
1b320 65 63 74 73 20 3d 20 25 6c 75 22 2c 20 43 4b 52 ects = %lu", CKR
1b330 5f 4f 4b 2c 20 2a 70 75 6c 4f 62 6a 65 63 74 43 _OK, *pulObjectC
1b340 6f 75 6e 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 ount);...return(
1b350 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 CKR_OK);.}..CK_D
1b360 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 EFINE_FUNCTION(C
1b370 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 K_RV, C_FindObje
1b380 63 74 73 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 ctsFinal)(CK_SES
1b390 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 SION_HANDLE hSes
1b3a0 73 69 6f 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 sion) {..int mut
1b3b0 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 ex_retval;...CAC
1b3c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1b3d0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 ("Called.");...i
1b3e0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 f (!cackey_initi
1b3f0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b alized) {...CACK
1b400 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1b410 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 "Error. Not ini
1b420 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 tialized.");....
1b430 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 return(CKR_CRYPT
1b440 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 OKI_NOT_INITIALI
1b450 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 ZED);..}...if (h
1b460 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 Session == 0 ||
1b470 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a hSession >= (siz
1b480 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 eof(cackey_sessi
1b490 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 ons) / sizeof(ca
1b4a0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d ckey_sessions[0]
1b4b0 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ))) {...CACKEY_D
1b4c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
1b4d0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 or. Session out
1b4e0 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 of range.");...
1b4f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 ...return(CKR_SE
1b500 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 SSION_HANDLE_INV
1b510 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 ALID);..}...mute
1b520 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 x_retval = cacke
1b530 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 y_mutex_lock(cac
1b540 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 key_biglock);..i
1b550 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 f (mutex_retval
1b560 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 != 0) {...CACKEY
1b570 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
1b580 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 rror. Locking f
1b590 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 ailed.");....ret
1b5a0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f urn(CKR_GENERAL_
1b5b0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 ERROR);..}...if
1b5c0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e (!cackey_session
1b5d0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 s[hSession].acti
1b5e0 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d ve) {...cackey_m
1b5f0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b utex_unlock(cack
1b600 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 ey_biglock);....
1b610 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1b620 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 NTF("Error. Ses
1b630 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e sion not active.
1b640 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 ");......return(
1b650 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 CKR_SESSION_HAND
1b660 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a LE_INVALID);..}.
1b670 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 ..if (!cackey_se
1b680 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
1b690 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 29 20 .search_active)
1b6a0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 {...cackey_mutex
1b6b0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 _unlock(cackey_b
1b6c0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b iglock);....CACK
1b6d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1b6e0 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 "Error. Search
1b6f0 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 not active.");..
1b700 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f ....return(CKR_O
1b710 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 PERATION_NOT_INI
1b720 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 TIALIZED);..}...
1b730 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
1b740 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 hSession].search
1b750 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 69 66 _active = 0;..if
1b760 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e (cackey_session
1b770 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 s[hSession].sear
1b780 63 68 5f 71 75 65 72 79 29 20 7b 0a 09 09 66 72 ch_query) {...fr
1b790 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f ee(cackey_sessio
1b7a0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 ns[hSession].sea
1b7b0 72 63 68 5f 71 75 65 72 79 29 3b 0a 09 7d 0a 0a rch_query);..}..
1b7c0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 .mutex_retval =
1b7d0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c cackey_mutex_unl
1b7e0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
1b7f0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f ck);..if (mutex_
1b800 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 retval != 0) {..
1b810 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1b820 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e INTF("Error. Un
1b830 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 locking failed."
1b840 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
1b850 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b _GENERAL_ERROR);
1b860 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 ..}...CACKEY_DEB
1b870 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
1b880 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 ning CKR_OK (%i)
1b890 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 ", CKR_OK);...re
1b8a0 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a turn(CKR_OK);.}.
1b8b0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 .CK_DEFINE_FUNCT
1b8c0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 ION(CK_RV, C_Enc
1b8d0 72 79 70 74 49 6e 69 74 29 28 43 4b 5f 53 45 53 ryptInit)(CK_SES
1b8e0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 SION_HANDLE hSes
1b8f0 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 sion, CK_MECHANI
1b900 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 SM_PTR pMechanis
1b910 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e m, CK_OBJECT_HAN
1b920 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 DLE hKey) {..CAC
1b930 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1b940 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 ("Called.");...i
1b950 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 f (!cackey_initi
1b960 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b alized) {...CACK
1b970 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1b980 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 "Error. Not ini
1b990 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 tialized.");....
1b9a0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 return(CKR_CRYPT
1b9b0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 OKI_NOT_INITIALI
1b9c0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 ZED);..}...CACKE
1b9d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1b9e0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 Returning CKR_FU
1b9f0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
1ba00 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f RTED (%i)", CKR_
1ba10 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
1ba20 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 PORTED);...retur
1ba30 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e n(CKR_FUNCTION_N
1ba40 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d OT_SUPPORTED);.}
1ba50 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 ..CK_DEFINE_FUNC
1ba60 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e TION(CK_RV, C_En
1ba70 63 72 79 70 74 29 28 43 4b 5f 53 45 53 53 49 4f crypt)(CK_SESSIO
1ba80 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f N_HANDLE hSessio
1ba90 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 n, CK_BYTE_PTR p
1baa0 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 Data, CK_ULONG u
1bab0 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 lDataLen, CK_BYT
1bac0 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 E_PTR pEncrypted
1bad0 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 Data, CK_ULONG_P
1bae0 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64 44 TR pulEncryptedD
1baf0 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 ataLen) {..CACKE
1bb00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1bb10 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 Called.");...if
1bb20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c (!cackey_initial
1bb30 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 ized) {...CACKEY
1bb40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
1bb50 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 rror. Not initi
1bb60 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 alized.");....re
1bb70 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b turn(CKR_CRYPTOK
1bb80 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 I_NOT_INITIALIZE
1bb90 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f D);..}...CACKEY_
1bba0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
1bbb0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 turning CKR_FUNC
1bbc0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
1bbd0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 ED (%i)", CKR_FU
1bbe0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
1bbf0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 RTED);...return(
1bc00 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
1bc10 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a _SUPPORTED);.}..
1bc20 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 CK_DEFINE_FUNCTI
1bc30 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 ON(CK_RV, C_Encr
1bc40 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 yptUpdate)(CK_SE
1bc50 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 SSION_HANDLE hSe
1bc60 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 ssion, CK_BYTE_P
1bc70 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f TR pPart, CK_ULO
1bc80 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b NG ulPartLen, CK
1bc90 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 _BYTE_PTR pEncry
1bca0 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f ptedPart, CK_ULO
1bcb0 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70 NG_PTR pulEncryp
1bcc0 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 tedPartLen) {..C
1bcd0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1bce0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
1bcf0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 .if (!cackey_ini
1bd00 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 tialized) {...CA
1bd10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
1bd20 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 F("Error. Not i
1bd30 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a nitialized.");..
1bd40 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 ..return(CKR_CRY
1bd50 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 PTOKI_NOT_INITIA
1bd60 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 LIZED);..}...CAC
1bd70 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1bd80 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f ("Returning CKR_
1bd90 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
1bda0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b PORTED (%i)", CK
1bdb0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
1bdc0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 UPPORTED);...ret
1bdd0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e urn(CKR_FUNCTION
1bde0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
1bdf0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 .}..CK_DEFINE_FU
1be00 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f NCTION(CK_RV, C_
1be10 45 6e 63 72 79 70 74 46 69 6e 61 6c 29 28 43 4b EncryptFinal)(CK
1be20 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 _SESSION_HANDLE
1be30 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 hSession, CK_BYT
1be40 45 5f 50 54 52 20 70 4c 61 73 74 45 6e 63 72 79 E_PTR pLastEncry
1be50 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f ptedPart, CK_ULO
1be60 4e 47 5f 50 54 52 20 70 75 6c 4c 61 73 74 45 6e NG_PTR pulLastEn
1be70 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20 cryptedPartLen)
1be80 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f {..CACKEY_DEBUG_
1be90 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
1bea0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 );...if (!cackey
1beb0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
1bec0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1bed0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e RINTF("Error. N
1bee0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 ot initialized."
1bef0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
1bf00 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e _CRYPTOKI_NOT_IN
1bf10 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
1bf20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1bf30 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
1bf40 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
1bf50 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 _SUPPORTED (%i)"
1bf60 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e , CKR_FUNCTION_N
1bf70 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a OT_SUPPORTED);..
1bf80 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 .return(CKR_FUNC
1bf90 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
1bfa0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e ED);.}..CK_DEFIN
1bfb0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 E_FUNCTION(CK_RV
1bfc0 2c 20 43 5f 44 65 63 72 79 70 74 49 6e 69 74 29 , C_DecryptInit)
1bfd0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 (CK_SESSION_HAND
1bfe0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f LE hSession, CK_
1bff0 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d MECHANISM_PTR pM
1c000 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a echanism, CK_OBJ
1c010 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 ECT_HANDLE hKey)
1c020 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 {..int mutex_re
1c030 74 76 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a tval;...hKey--;.
1c040 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1c050 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
1c060 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f ;...if (!cackey_
1c070 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 initialized) {..
1c080 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1c090 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f INTF("Error. No
1c0a0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 t initialized.")
1c0b0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
1c0c0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 CRYPTOKI_NOT_INI
1c0d0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 TIALIZED);..}...
1c0e0 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 20 3d if (pMechanism =
1c0f0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b = NULL) {...CACK
1c100 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1c110 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 "Error. pMechani
1c120 73 6d 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a sm is NULL.");..
1c130 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 ..return(CKR_ARG
1c140 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a UMENTS_BAD);..}.
1c150 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d ..if (pMechanism
1c160 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 21 3d 20 43 ->mechanism != C
1c170 4b 4d 5f 52 53 41 5f 50 4b 43 53 29 20 7b 0a 09 KM_RSA_PKCS) {..
1c180 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1c190 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 INTF("Error. pMe
1c1a0 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 chanism->mechani
1c1b0 73 6d 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 sm not specified
1c1c0 20 61 73 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 as CKM_RSA_PKCS
1c1d0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
1c1e0 52 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 41 52 41 R_MECHANISM_PARA
1c1f0 4d 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a M_INVALID);..}..
1c200 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d .if (hSession ==
1c210 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 0 || hSession >
1c220 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 = (sizeof(cackey
1c230 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a _sessions) / siz
1c240 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 eof(cackey_sessi
1c250 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 ons[0]))) {...CA
1c260 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
1c270 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 F("Error. Sessi
1c280 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e on out of range.
1c290 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 ");......return(
1c2a0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 CKR_SESSION_HAND
1c2b0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a LE_INVALID);..}.
1c2c0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d ..mutex_retval =
1c2d0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f cackey_mutex_lo
1c2e0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
1c2f0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 k);..if (mutex_r
1c300 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 etval != 0) {...
1c310 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1c320 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 NTF("Error. Loc
1c330 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a king failed.");.
1c340 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 ...return(CKR_GE
1c350 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d NERAL_ERROR);..}
1c360 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 ...if (!cackey_s
1c370 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
1c380 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 ].active) {...ca
1c390 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 ckey_mutex_unloc
1c3a0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
1c3b0 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 );....CACKEY_DEB
1c3c0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
1c3d0 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 . Session not a
1c3e0 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 ctive.");......r
1c3f0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f eturn(CKR_SESSIO
1c400 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 N_HANDLE_INVALID
1c410 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b );..}...if (cack
1c420 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
1c430 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 sion].decrypt_ac
1c440 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 tive) {...cackey
1c450 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 _mutex_unlock(ca
1c460 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a ckey_biglock);..
1c470 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1c480 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 RINTF("Error. D
1c490 65 63 72 79 70 74 20 61 6c 72 65 61 64 79 20 69 ecrypt already i
1c4a0 6e 20 70 72 6f 67 72 65 73 73 2e 22 29 3b 0a 09 n progress.");..
1c4b0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f ....return(CKR_O
1c4c0 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 45 29 PERATION_ACTIVE)
1c4d0 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65 79 20 ;..}...if (hKey
1c4e0 3e 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f >= cackey_sessio
1c4f0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 ns[hSession].ide
1c500 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b ntities_count) {
1c510 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f ...cackey_mutex_
1c520 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 unlock(cackey_bi
1c530 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 glock);....CACKE
1c540 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1c550 45 72 72 6f 72 2e 20 20 4b 65 79 20 68 61 6e 64 Error. Key hand
1c560 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 le out of range
1c570 28 72 65 71 75 65 73 74 65 64 20 6b 65 79 20 25 (requested key %
1c580 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75 20 69 64 65 lu, only %lu ide
1c590 6e 74 69 74 69 65 73 20 61 76 61 69 6c 61 62 6c ntities availabl
1c5a0 65 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 e).", (unsigned
1c5b0 6c 6f 6e 67 29 20 68 4b 65 79 2c 20 28 75 6e 73 long) hKey, (uns
1c5c0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63 6b igned long) cack
1c5d0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
1c5e0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 sion].identities
1c5f0 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75 _count);....retu
1c600 72 6e 28 43 4b 52 5f 4b 45 59 5f 48 41 4e 44 4c rn(CKR_KEY_HANDL
1c610 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a E_INVALID);..}..
1c620 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 .cackey_sessions
1c630 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 [hSession].decry
1c640 70 74 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a pt_active = 1;..
1c650 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 .cackey_sessions
1c660 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 [hSession].decry
1c670 70 74 5f 6d 65 63 68 61 6e 69 73 6d 20 3d 20 70 pt_mechanism = p
1c680 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 Mechanism->mecha
1c690 6e 69 73 6d 3b 0a 09 63 61 63 6b 65 79 5f 73 65 nism;..cackey_se
1c6a0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
1c6b0 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61 .decrypt_mech_pa
1c6c0 72 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d 2d rm = pMechanism-
1c6d0 3e 70 50 61 72 61 6d 65 74 65 72 3b 0a 09 63 61 >pParameter;..ca
1c6e0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
1c6f0 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f ession].decrypt_
1c700 6d 65 63 68 5f 70 61 72 6d 6c 65 6e 20 3d 20 70 mech_parmlen = p
1c710 4d 65 63 68 61 6e 69 73 6d 2d 3e 75 6c 50 61 72 Mechanism->ulPar
1c720 61 6d 65 74 65 72 4c 65 6e 3b 0a 09 63 61 63 6b ameterLen;..cack
1c730 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
1c740 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64 sion].decrypt_id
1c750 65 6e 74 69 74 79 20 3d 20 26 63 61 63 6b 65 79 entity = &cackey
1c760 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
1c770 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 68 on].identities[h
1c780 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 Key];...mutex_re
1c790 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 tval = cackey_mu
1c7a0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 tex_unlock(cacke
1c7b0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 y_biglock);..if
1c7c0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d (mutex_retval !=
1c7d0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 0) {...CACKEY_D
1c7e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
1c7f0 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 or. Unlocking f
1c800 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 ailed.");....ret
1c810 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f urn(CKR_GENERAL_
1c820 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 ERROR);..}...CAC
1c830 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1c840 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f ("Returning CKR_
1c850 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b OK (%i)", CKR_OK
1c860 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f );...return(CKR_
1c870 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e OK);.}..CK_DEFIN
1c880 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 E_FUNCTION(CK_RV
1c890 2c 20 43 5f 44 65 63 72 79 70 74 29 28 43 4b 5f , C_Decrypt)(CK_
1c8a0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 SESSION_HANDLE h
1c8b0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 Session, CK_BYTE
1c8c0 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 44 _PTR pEncryptedD
1c8d0 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c ata, CK_ULONG ul
1c8e0 45 6e 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e EncryptedDataLen
1c8f0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 , CK_BYTE_PTR pD
1c900 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 ata, CK_ULONG_PT
1c910 52 20 70 75 6c 44 61 74 61 4c 65 6e 29 20 7b 0a R pulDataLen) {.
1c920 09 43 4b 5f 55 4c 4f 4e 47 20 64 61 74 61 6c 65 .CK_ULONG datale
1c930 6e 5f 75 70 64 61 74 65 2c 20 64 61 74 61 6c 65 n_update, datale
1c940 6e 5f 66 69 6e 61 6c 3b 0a 09 43 4b 5f 52 56 20 n_final;..CK_RV
1c950 64 65 63 72 79 70 74 5f 72 65 74 3b 0a 0a 09 43 decrypt_ret;...C
1c960 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1c970 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
1c980 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 .if (!cackey_ini
1c990 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 tialized) {...CA
1c9a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
1c9b0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 F("Error. Not i
1c9c0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a nitialized.");..
1c9d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 ..return(CKR_CRY
1c9e0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 PTOKI_NOT_INITIA
1c9f0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 LIZED);..}...if
1ca00 28 70 75 6c 44 61 74 61 4c 65 6e 20 3d 3d 20 4e (pulDataLen == N
1ca10 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f ULL) {...CACKEY_
1ca20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
1ca30 72 6f 72 2e 20 70 75 6c 44 61 74 61 4c 65 6e 20 ror. pulDataLen
1ca40 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 is NULL.");....r
1ca50 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 eturn(CKR_ARGUME
1ca60 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 64 NTS_BAD);..}...d
1ca70 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 20 3d 20 atalen_update =
1ca80 2a 70 75 6c 44 61 74 61 4c 65 6e 3b 0a 0a 09 64 *pulDataLen;...d
1ca90 65 63 72 79 70 74 5f 72 65 74 20 3d 20 43 5f 44 ecrypt_ret = C_D
1caa0 65 63 72 79 70 74 55 70 64 61 74 65 28 68 53 65 ecryptUpdate(hSe
1cab0 73 73 69 6f 6e 2c 20 70 45 6e 63 72 79 70 74 65 ssion, pEncrypte
1cac0 64 44 61 74 61 2c 20 75 6c 45 6e 63 72 79 70 74 dData, ulEncrypt
1cad0 65 64 44 61 74 61 4c 65 6e 2c 20 70 44 61 74 61 edDataLen, pData
1cae0 2c 20 26 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 , &datalen_updat
1caf0 65 29 3b 0a 09 69 66 20 28 64 65 63 72 79 70 74 e);..if (decrypt
1cb00 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 _ret != CKR_OK)
1cb10 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
1cb20 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
1cb30 20 44 65 63 72 79 70 74 55 70 64 61 74 65 28 29 DecryptUpdate()
1cb40 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72 returned failur
1cb50 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 e (rv = %lu).",
1cb60 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
1cb70 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 0a 09 decrypt_ret);...
1cb80 09 72 65 74 75 72 6e 28 64 65 63 72 79 70 74 5f .return(decrypt_
1cb90 72 65 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 ret);..}...if (p
1cba0 44 61 74 61 29 20 7b 0a 09 09 70 44 61 74 61 20 Data) {...pData
1cbb0 2b 3d 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 += datalen_updat
1cbc0 65 3b 0a 09 7d 0a 09 64 61 74 61 6c 65 6e 5f 66 e;..}..datalen_f
1cbd0 69 6e 61 6c 20 3d 20 2a 70 75 6c 44 61 74 61 4c inal = *pulDataL
1cbe0 65 6e 20 2d 20 64 61 74 61 6c 65 6e 5f 75 70 64 en - datalen_upd
1cbf0 61 74 65 3b 0a 0a 09 64 65 63 72 79 70 74 5f 72 ate;...decrypt_r
1cc00 65 74 20 3d 20 43 5f 44 65 63 72 79 70 74 46 69 et = C_DecryptFi
1cc10 6e 61 6c 28 68 53 65 73 73 69 6f 6e 2c 20 70 44 nal(hSession, pD
1cc20 61 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f 66 69 ata, &datalen_fi
1cc30 6e 61 6c 29 3b 0a 09 69 66 20 28 64 65 63 72 79 nal);..if (decry
1cc40 70 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b pt_ret != CKR_OK
1cc50 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
1cc60 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
1cc70 2e 20 20 44 65 63 72 79 70 74 46 69 6e 61 6c 28 . DecryptFinal(
1cc80 29 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75 ) returned failu
1cc90 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c re (rv = %lu).",
1cca0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
1ccb0 20 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 0a decrypt_ret);..
1ccc0 09 09 72 65 74 75 72 6e 28 64 65 63 72 79 70 74 ..return(decrypt
1ccd0 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c _ret);..}...*pul
1cce0 44 61 74 61 4c 65 6e 20 3d 20 64 61 74 61 6c 65 DataLen = datale
1ccf0 6e 5f 75 70 64 61 74 65 20 2b 20 64 61 74 61 6c n_update + datal
1cd00 65 6e 5f 66 69 6e 61 6c 3b 0a 0a 09 43 41 43 4b en_final;...CACK
1cd10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1cd20 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f "Returning CKR_O
1cd30 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 K (%i)", CKR_OK)
1cd40 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f ;...return(CKR_O
1cd50 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 K);.}..CK_DEFINE
1cd60 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c _FUNCTION(CK_RV,
1cd70 20 43 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 C_DecryptUpdate
1cd80 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e )(CK_SESSION_HAN
1cd90 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b DLE hSession, CK
1cda0 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 _BYTE_PTR pEncry
1cdb0 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f ptedPart, CK_ULO
1cdc0 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 NG ulEncryptedPa
1cdd0 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 rtLen, CK_BYTE_P
1cde0 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f TR pPart, CK_ULO
1cdf0 4e 47 5f 50 54 52 20 70 75 6c 50 61 72 74 4c 65 NG_PTR pulPartLe
1ce00 6e 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f n) {..static CK_
1ce10 42 59 54 45 20 62 75 66 5b 31 36 33 38 34 5d 3b BYTE buf[16384];
1ce20 0a 09 73 73 69 7a 65 5f 74 20 62 75 66 6c 65 6e ..ssize_t buflen
1ce30 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20 ;..CK_RV retval
1ce40 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 = CKR_GENERAL_ER
1ce50 52 4f 52 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f ROR;..int mutex_
1ce60 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 retval;...CACKEY
1ce70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 _DEBUG_PRINTF("C
1ce80 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 alled.");...if (
1ce90 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 !cackey_initiali
1cea0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f zed) {...CACKEY_
1ceb0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
1cec0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 ror. Not initia
1ced0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 lized.");....ret
1cee0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 urn(CKR_CRYPTOKI
1cef0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 _NOT_INITIALIZED
1cf00 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 );..}...if (hSes
1cf10 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 sion == 0 || hSe
1cf20 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 ssion >= (sizeof
1cf30 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 (cackey_sessions
1cf40 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 ) / sizeof(cacke
1cf50 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 y_sessions[0])))
1cf60 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
1cf70 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
1cf80 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 Session out of
1cf90 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 range.");......
1cfa0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 return(CKR_SESSI
1cfb0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 ON_HANDLE_INVALI
1cfc0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 45 6e D);..}...if (pEn
1cfd0 63 72 79 70 74 65 64 50 61 72 74 20 3d 3d 20 4e cryptedPart == N
1cfe0 55 4c 4c 20 26 26 20 75 6c 45 6e 63 72 79 70 74 ULL && ulEncrypt
1cff0 65 64 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 edPartLen == 0)
1d000 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 {.../* Short cir
1d010 63 75 69 74 20 69 66 20 77 65 20 61 72 65 20 61 cuit if we are a
1d020 73 6b 65 64 20 74 6f 20 64 65 63 72 79 70 74 20 sked to decrypt
1d030 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 nothing... */...
1d040 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1d050 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 NTF("Returning C
1d060 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 KR_OK (%i) (shor
1d070 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 t circuit)", CKR
1d080 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 _OK);....return(
1d090 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 CKR_OK);..}...if
1d0a0 20 28 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 (pEncryptedPart
1d0b0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 == NULL) {...CA
1d0c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
1d0d0 46 28 22 45 72 72 6f 72 2e 20 70 45 6e 63 72 79 F("Error. pEncry
1d0e0 70 74 65 64 50 61 72 74 20 69 73 20 4e 55 4c 4c ptedPart is NULL
1d0f0 2c 20 62 75 74 20 75 6c 45 6e 63 72 79 70 74 65 , but ulEncrypte
1d100 64 50 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74 20 dPartLen is not
1d110 30 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 0.");....return(
1d120 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 CKR_ARGUMENTS_BA
1d130 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 45 D);..}...if (ulE
1d140 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20 ncryptedPartLen
1d150 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 == 0) {...CACKEY
1d160 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
1d170 72 72 6f 72 2e 20 75 6c 45 6e 63 72 79 70 74 65 rror. ulEncrypte
1d180 64 50 61 72 74 4c 65 6e 20 69 73 20 30 2c 20 62 dPartLen is 0, b
1d190 75 74 20 70 50 61 72 74 20 69 73 20 6e 6f 74 20 ut pPart is not
1d1a0 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 NULL.");....retu
1d1b0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 rn(CKR_ARGUMENTS
1d1c0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 _BAD);..}...if (
1d1d0 70 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 4e 55 pulPartLen == NU
1d1e0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 LL) {...CACKEY_D
1d1f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
1d200 6f 72 2e 20 70 75 6c 50 61 72 74 4c 65 6e 20 69 or. pulPartLen i
1d210 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 s NULL.");....re
1d220 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e turn(CKR_ARGUMEN
1d230 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 TS_BAD);..}...mu
1d240 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 tex_retval = cac
1d250 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 key_mutex_lock(c
1d260 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
1d270 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 .if (mutex_retva
1d280 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b l != 0) {...CACK
1d290 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1d2a0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 "Error. Locking
1d2b0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 failed.");....r
1d2c0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 eturn(CKR_GENERA
1d2d0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 L_ERROR);..}...i
1d2e0 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 f (!cackey_sessi
1d2f0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 ons[hSession].ac
1d300 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 tive) {...cackey
1d310 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 _mutex_unlock(ca
1d320 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a ckey_biglock);..
1d330 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1d340 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 RINTF("Error. S
1d350 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 ession not activ
1d360 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 e.");......retur
1d370 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 n(CKR_SESSION_HA
1d380 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 NDLE_INVALID);..
1d390 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f }...if (!cackey_
1d3a0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
1d3b0 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 n].decrypt_activ
1d3c0 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 e) {...cackey_mu
1d3d0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 tex_unlock(cacke
1d3e0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 y_biglock);....C
1d3f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1d400 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72 TF("Error. Decr
1d410 79 70 74 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 ypt not active."
1d420 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 );......return(C
1d430 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 KR_OPERATION_NOT
1d440 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 _INITIALIZED);..
1d450 7d 0a 0a 09 73 77 69 74 63 68 20 28 63 61 63 6b }...switch (cack
1d460 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
1d470 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 sion].decrypt_me
1d480 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61 73 chanism) {...cas
1d490 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a e CKM_RSA_PKCS:.
1d4a0 09 09 09 2f 2a 20 41 73 6b 20 63 61 72 64 20 74 .../* Ask card t
1d4b0 6f 20 64 65 63 72 79 70 74 20 2a 2f 0a 09 09 09 o decrypt */....
1d4c0 62 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65 79 5f buflen = cackey_
1d4d0 73 69 67 6e 64 65 63 72 79 70 74 28 26 63 61 63 signdecrypt(&cac
1d4e0 6b 65 79 5f 73 6c 6f 74 73 5b 63 61 63 6b 65 79 key_slots[cackey
1d4f0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
1d500 6f 6e 5d 2e 73 6c 6f 74 49 44 5d 2c 20 63 61 63 on].slotID], cac
1d510 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
1d520 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69 ssion].decrypt_i
1d530 64 65 6e 74 69 74 79 2c 20 70 45 6e 63 72 79 70 dentity, pEncryp
1d540 74 65 64 50 61 72 74 2c 20 75 6c 45 6e 63 72 79 tedPart, ulEncry
1d550 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 62 75 66 ptedPartLen, buf
1d560 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 3b 0a , sizeof(buf));.
1d570 0a 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20 3c ....if (buflen <
1d580 20 30 29 20 7b 0a 09 09 09 09 2f 2a 20 44 65 63 0) {...../* Dec
1d590 72 79 70 74 69 6f 6e 20 66 61 69 6c 65 64 2e 20 ryption failed.
1d5a0 2a 2f 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 */.....retval =
1d5b0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f CKR_GENERAL_ERRO
1d5c0 52 3b 0a 09 09 09 7d 20 65 6c 73 65 20 69 66 20 R;....} else if
1d5d0 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 (((unsigned long
1d5e0 29 20 62 75 66 6c 65 6e 29 20 3e 20 2a 70 75 6c ) buflen) > *pul
1d5f0 50 61 72 74 4c 65 6e 20 26 26 20 70 50 61 72 74 PartLen && pPart
1d600 29 20 7b 0a 09 09 09 09 2f 2a 20 44 65 63 72 79 ) {...../* Decry
1d610 70 74 65 64 20 64 61 74 61 20 74 6f 6f 20 6c 61 pted data too la
1d620 72 67 65 20 2a 2f 0a 09 09 09 09 72 65 74 76 61 rge */.....retva
1d630 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 l = CKR_BUFFER_T
1d640 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d 20 65 OO_SMALL;....} e
1d650 6c 73 65 20 7b 0a 09 09 09 09 69 66 20 28 70 50 lse {.....if (pP
1d660 61 72 74 29 20 7b 0a 09 09 09 09 09 6d 65 6d 63 art) {......memc
1d670 70 79 28 70 50 61 72 74 2c 20 62 75 66 2c 20 62 py(pPart, buf, b
1d680 75 66 6c 65 6e 29 3b 0a 09 09 09 09 7d 0a 0a 09 uflen);.....}...
1d690 09 09 09 2a 70 75 6c 50 61 72 74 4c 65 6e 20 3d ...*pulPartLen =
1d6a0 20 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09 72 65 buflen;......re
1d6b0 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 tval = CKR_OK;..
1d6c0 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 ..}.....break;..
1d6d0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c }...mutex_retval
1d6e0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f = cackey_mutex_
1d6f0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 unlock(cackey_bi
1d700 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 glock);..if (mut
1d710 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 ex_retval != 0)
1d720 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
1d730 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
1d740 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 Unlocking faile
1d750 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
1d760 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f CKR_GENERAL_ERRO
1d770 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f R);..}...CACKEY_
1d780 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
1d790 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e turning %i", (in
1d7a0 74 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 t) retval);...re
1d7b0 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a turn(retval);.}.
1d7c0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 .CK_DEFINE_FUNCT
1d7d0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 ION(CK_RV, C_Dec
1d7e0 72 79 70 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45 ryptFinal)(CK_SE
1d7f0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 SSION_HANDLE hSe
1d800 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 ssion, CK_BYTE_P
1d810 54 52 20 70 4c 61 73 74 50 61 72 74 2c 20 43 4b TR pLastPart, CK
1d820 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4c 61 _ULONG_PTR pulLa
1d830 73 74 50 61 72 74 4c 65 6e 29 20 7b 0a 09 69 6e stPartLen) {..in
1d840 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a t mutex_retval;.
1d850 09 69 6e 74 20 74 65 72 6d 69 6e 61 74 65 5f 64 .int terminate_d
1d860 65 63 72 79 70 74 20 3d 20 31 3b 0a 0a 09 43 41 ecrypt = 1;...CA
1d870 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
1d880 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
1d890 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 if (!cackey_init
1d8a0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 ialized) {...CAC
1d8b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1d8c0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e ("Error. Not in
1d8d0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 itialized.");...
1d8e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 .return(CKR_CRYP
1d8f0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c TOKI_NOT_INITIAL
1d900 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 IZED);..}...if (
1d910 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c hSession == 0 ||
1d920 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 hSession >= (si
1d930 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 zeof(cackey_sess
1d940 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 ions) / sizeof(c
1d950 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 ackey_sessions[0
1d960 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f ]))) {...CACKEY_
1d970 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
1d980 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 ror. Session ou
1d990 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 t of range.");..
1d9a0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 ....return(CKR_S
1d9b0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e ESSION_HANDLE_IN
1d9c0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 VALID);..}...if
1d9d0 28 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20 (pulLastPartLen
1d9e0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 == NULL) {...CAC
1d9f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1da00 28 22 45 72 72 6f 72 2e 20 70 75 6c 4c 61 73 74 ("Error. pulLast
1da10 50 61 72 74 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e PartLen is NULL.
1da20 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
1da30 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 R_ARGUMENTS_BAD)
1da40 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 ;..}...mutex_ret
1da50 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 val = cackey_mut
1da60 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 ex_lock(cackey_b
1da70 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 iglock);..if (mu
1da80 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 tex_retval != 0)
1da90 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
1daa0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
1dab0 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 Locking failed
1dac0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
1dad0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 KR_GENERAL_ERROR
1dae0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 );..}...if (!cac
1daf0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
1db00 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b ssion].active) {
1db10 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f ...cackey_mutex_
1db20 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 unlock(cackey_bi
1db30 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 glock);....CACKE
1db40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1db50 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 Error. Session
1db60 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 not active.");..
1db70 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 ....return(CKR_S
1db80 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e ESSION_HANDLE_IN
1db90 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 VALID);..}...if
1dba0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e (!cackey_session
1dbb0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 s[hSession].decr
1dbc0 79 70 74 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 ypt_active) {...
1dbd0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c cackey_mutex_unl
1dbe0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
1dbf0 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 ck);....CACKEY_D
1dc00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
1dc10 6f 72 2e 20 20 44 65 63 72 79 70 74 20 6e 6f 74 or. Decrypt not
1dc20 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 active.");.....
1dc30 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 .return(CKR_OPER
1dc40 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 ATION_NOT_INITIA
1dc50 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 2a 70 75 LIZED);..}...*pu
1dc60 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20 3d 20 30 lLastPartLen = 0
1dc70 3b 0a 0a 09 69 66 20 28 70 4c 61 73 74 50 61 72 ;...if (pLastPar
1dc80 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 74 t == NULL) {...t
1dc90 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79 70 74 erminate_decrypt
1dca0 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 74 = 0;..}...if (t
1dcb0 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79 70 74 erminate_decrypt
1dcc0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 ) {...cackey_ses
1dcd0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
1dce0 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 20 3d decrypt_active =
1dcf0 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 0;..}...mutex_r
1dd00 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d etval = cackey_m
1dd10 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b utex_unlock(cack
1dd20 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 ey_biglock);..if
1dd30 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 (mutex_retval !
1dd40 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f = 0) {...CACKEY_
1dd50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
1dd60 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 ror. Unlocking
1dd70 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 failed.");....re
1dd80 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c turn(CKR_GENERAL
1dd90 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 _ERROR);..}...CA
1dda0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
1ddb0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 F("Returning CKR
1ddc0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f _OK (%i)", CKR_O
1ddd0 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 K);...return(CKR
1dde0 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 _OK);.}..CK_DEFI
1ddf0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 NE_FUNCTION(CK_R
1de00 56 2c 20 43 5f 44 69 67 65 73 74 49 6e 69 74 29 V, C_DigestInit)
1de10 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 (CK_SESSION_HAND
1de20 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f LE hSession, CK_
1de30 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d MECHANISM_PTR pM
1de40 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 43 41 43 echanism) {..CAC
1de50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1de60 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 ("Called.");...i
1de70 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 f (!cackey_initi
1de80 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b alized) {...CACK
1de90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1dea0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 "Error. Not ini
1deb0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 tialized.");....
1dec0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 return(CKR_CRYPT
1ded0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 OKI_NOT_INITIALI
1dee0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 ZED);..}...CACKE
1def0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1df00 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 Returning CKR_FU
1df10 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
1df20 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f RTED (%i)", CKR_
1df30 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
1df40 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 PORTED);...retur
1df50 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e n(CKR_FUNCTION_N
1df60 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d OT_SUPPORTED);.}
1df70 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 ..CK_DEFINE_FUNC
1df80 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 TION(CK_RV, C_Di
1df90 67 65 73 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e gest)(CK_SESSION
1dfa0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e _HANDLE hSession
1dfb0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 , CK_BYTE_PTR pD
1dfc0 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c ata, CK_ULONG ul
1dfd0 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 DataLen, CK_BYTE
1dfe0 5f 50 54 52 20 70 44 69 67 65 73 74 2c 20 43 4b _PTR pDigest, CK
1dff0 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 69 _ULONG_PTR pulDi
1e000 67 65 73 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b gestLen) {..CACK
1e010 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1e020 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 "Called.");...if
1e030 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 (!cackey_initia
1e040 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 lized) {...CACKE
1e050 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1e060 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 Error. Not init
1e070 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 ialized.");....r
1e080 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f eturn(CKR_CRYPTO
1e090 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a KI_NOT_INITIALIZ
1e0a0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 ED);..}...CACKEY
1e0b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
1e0c0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e eturning CKR_FUN
1e0d0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
1e0e0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 TED (%i)", CKR_F
1e0f0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
1e100 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e ORTED);...return
1e110 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f (CKR_FUNCTION_NO
1e120 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a T_SUPPORTED);.}.
1e130 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 .CK_DEFINE_FUNCT
1e140 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 ION(CK_RV, C_Dig
1e150 65 73 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 estUpdate)(CK_SE
1e160 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 SSION_HANDLE hSe
1e170 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 ssion, CK_BYTE_P
1e180 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f TR pPart, CK_ULO
1e190 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a NG ulPartLen) {.
1e1a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1e1b0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
1e1c0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 ...if (!cackey_i
1e1d0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 nitialized) {...
1e1e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1e1f0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 NTF("Error. Not
1e200 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b initialized.");
1e210 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 ....return(CKR_C
1e220 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 RYPTOKI_NOT_INIT
1e230 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 IALIZED);..}...C
1e240 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1e250 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b TF("Returning CK
1e260 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
1e270 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 UPPORTED (%i)",
1e280 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
1e290 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 _SUPPORTED);...r
1e2a0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 eturn(CKR_FUNCTI
1e2b0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
1e2c0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f );.}..CK_DEFINE_
1e2d0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 FUNCTION(CK_RV,
1e2e0 43 5f 44 69 67 65 73 74 4b 65 79 29 28 43 4b 5f C_DigestKey)(CK_
1e2f0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 SESSION_HANDLE h
1e300 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 Session, CK_OBJE
1e310 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 CT_HANDLE hKey)
1e320 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f {..CACKEY_DEBUG_
1e330 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
1e340 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 );...if (!cackey
1e350 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
1e360 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1e370 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e RINTF("Error. N
1e380 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 ot initialized."
1e390 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
1e3a0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e _CRYPTOKI_NOT_IN
1e3b0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
1e3c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1e3d0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
1e3e0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
1e3f0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 _SUPPORTED (%i)"
1e400 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e , CKR_FUNCTION_N
1e410 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a OT_SUPPORTED);..
1e420 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 .return(CKR_FUNC
1e430 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
1e440 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e ED);.}..CK_DEFIN
1e450 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 E_FUNCTION(CK_RV
1e460 2c 20 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 29 , C_DigestFinal)
1e470 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 (CK_SESSION_HAND
1e480 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f LE hSession, CK_
1e490 42 59 54 45 5f 50 54 52 20 70 44 69 67 65 73 74 BYTE_PTR pDigest
1e4a0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 , CK_ULONG_PTR p
1e4b0 75 6c 44 69 67 65 73 74 4c 65 6e 29 20 7b 0a 09 ulDigestLen) {..
1e4c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1e4d0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a NTF("Called.");.
1e4e0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e ..if (!cackey_in
1e4f0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 itialized) {...C
1e500 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1e510 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 TF("Error. Not
1e520 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a initialized.");.
1e530 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 ...return(CKR_CR
1e540 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 YPTOKI_NOT_INITI
1e550 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 ALIZED);..}...CA
1e560 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
1e570 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 F("Returning CKR
1e580 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
1e590 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 PPORTED (%i)", C
1e5a0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
1e5b0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 SUPPORTED);...re
1e5c0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f turn(CKR_FUNCTIO
1e5d0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 N_NOT_SUPPORTED)
1e5e0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 ;.}..CK_DEFINE_F
1e5f0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 UNCTION(CK_RV, C
1e600 5f 53 69 67 6e 49 6e 69 74 29 28 43 4b 5f 53 45 _SignInit)(CK_SE
1e610 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 SSION_HANDLE hSe
1e620 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e ssion, CK_MECHAN
1e630 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 ISM_PTR pMechani
1e640 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 sm, CK_OBJECT_HA
1e650 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 69 6e NDLE hKey) {..in
1e660 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a t mutex_retval;.
1e670 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43 4b ..hKey--;...CACK
1e680 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1e690 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 "Called.");...if
1e6a0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 (!cackey_initia
1e6b0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 lized) {...CACKE
1e6c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1e6d0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 Error. Not init
1e6e0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 ialized.");....r
1e6f0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f eturn(CKR_CRYPTO
1e700 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a KI_NOT_INITIALIZ
1e710 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d ED);..}...if (pM
1e720 65 63 68 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c 4c echanism == NULL
1e730 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
1e740 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
1e750 2e 20 70 4d 65 63 68 61 6e 69 73 6d 20 69 73 20 . pMechanism is
1e760 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 NULL.");....retu
1e770 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 rn(CKR_ARGUMENTS
1e780 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 _BAD);..}...if (
1e790 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 pMechanism->mech
1e7a0 61 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f 52 53 41 anism != CKM_RSA
1e7b0 5f 50 4b 43 53 20 26 26 20 70 4d 65 63 68 61 6e _PKCS && pMechan
1e7c0 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 21 ism->mechanism !
1e7d0 3d 20 43 4b 4d 5f 53 48 41 31 5f 52 53 41 5f 50 = CKM_SHA1_RSA_P
1e7e0 4b 43 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f KCS) {...CACKEY_
1e7f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
1e800 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 2d ror. pMechanism-
1e810 3e 6d 65 63 68 61 6e 69 73 6d 20 6e 6f 74 20 73 >mechanism not s
1e820 70 65 63 69 66 69 65 64 20 61 73 20 43 4b 4d 5f pecified as CKM_
1e830 52 53 41 5f 50 4b 43 53 20 6f 72 20 43 4b 4d 5f RSA_PKCS or CKM_
1e840 53 48 41 31 5f 52 53 41 5f 50 4b 43 53 22 29 3b SHA1_RSA_PKCS");
1e850 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4d ....return(CKR_M
1e860 45 43 48 41 4e 49 53 4d 5f 50 41 52 41 4d 5f 49 ECHANISM_PARAM_I
1e870 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 NVALID);..}...if
1e880 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 (hSession == 0
1e890 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 || hSession >= (
1e8a0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 sizeof(cackey_se
1e8b0 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 ssions) / sizeof
1e8c0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 (cackey_sessions
1e8d0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 [0]))) {...CACKE
1e8e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1e8f0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 Error. Session
1e900 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b out of range.");
1e910 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 ......return(CKR
1e920 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f _SESSION_HANDLE_
1e930 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d INVALID);..}...m
1e940 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 utex_retval = ca
1e950 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 ckey_mutex_lock(
1e960 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
1e970 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 ..if (mutex_retv
1e980 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 al != 0) {...CAC
1e990 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1e9a0 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e ("Error. Lockin
1e9b0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 g failed.");....
1e9c0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 return(CKR_GENER
1e9d0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 AL_ERROR);..}...
1e9e0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 if (!cackey_sess
1e9f0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 ions[hSession].a
1ea00 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 ctive) {...cacke
1ea10 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
1ea20 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
1ea30 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1ea40 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
1ea50 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 Session not acti
1ea60 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 ve.");......retu
1ea70 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 rn(CKR_SESSION_H
1ea80 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a ANDLE_INVALID);.
1ea90 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f .}...if (cackey_
1eaa0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
1eab0 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20 n].sign_active)
1eac0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 {...cackey_mutex
1ead0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 _unlock(cackey_b
1eae0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b iglock);....CACK
1eaf0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1eb00 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 61 6c "Error. Sign al
1eb10 72 65 61 64 79 20 69 6e 20 70 72 6f 67 72 65 73 ready in progres
1eb20 73 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 s.");......retur
1eb30 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f n(CKR_OPERATION_
1eb40 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 69 66 ACTIVE);..}...if
1eb50 20 28 68 4b 65 79 20 3e 3d 20 63 61 63 6b 65 79 (hKey >= cackey
1eb60 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
1eb70 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 on].identities_c
1eb80 6f 75 6e 74 29 20 7b 0a 09 09 63 61 63 6b 65 79 ount) {...cackey
1eb90 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 _mutex_unlock(ca
1eba0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a ckey_biglock);..
1ebb0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1ebc0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4b RINTF("Error. K
1ebd0 65 79 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 ey handle out of
1ebe0 20 72 61 6e 67 65 20 28 72 65 71 75 65 73 74 65 range (requeste
1ebf0 64 20 6b 65 79 20 25 6c 75 2c 20 6f 6e 6c 79 20 d key %lu, only
1ec00 25 6c 75 20 69 64 65 6e 74 69 74 69 65 73 20 61 %lu identities a
1ec10 76 61 69 6c 61 62 6c 65 29 2e 22 2c 20 28 75 6e vailable).", (un
1ec20 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b 65 signed long) hKe
1ec30 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e y, (unsigned lon
1ec40 67 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f g) cackey_sessio
1ec50 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 ns[hSession].ide
1ec60 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a ntities_count);.
1ec70 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4b 45 ...return(CKR_KE
1ec80 59 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 Y_HANDLE_INVALID
1ec90 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 );..}...cackey_s
1eca0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
1ecb0 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 ].sign_active =
1ecc0 31 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 1;...cackey_sess
1ecd0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 ions[hSession].s
1ece0 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 20 3d 20 ign_mechanism =
1ecf0 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 pMechanism->mech
1ed00 61 6e 69 73 6d 3b 0a 0a 09 63 61 63 6b 65 79 5f anism;...cackey_
1ed10 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
1ed20 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20 3d n].sign_buflen =
1ed30 20 31 32 38 3b 0a 09 63 61 63 6b 65 79 5f 73 65 128;..cackey_se
1ed40 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
1ed50 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d 20 .sign_bufused =
1ed60 30 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 0;..cackey_sessi
1ed70 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 ons[hSession].si
1ed80 67 6e 5f 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 gn_buf = malloc(
1ed90 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f 73 sizeof(*cackey_s
1eda0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
1edb0 5d 2e 73 69 67 6e 5f 62 75 66 29 20 2a 20 63 61 ].sign_buf) * ca
1edc0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
1edd0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 ession].sign_buf
1ede0 6c 65 6e 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 len);...CACKEY_D
1edf0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 73 EBUG_PRINTF("Ses
1ee00 73 69 6f 6e 20 25 6c 75 20 73 69 67 6e 5f 69 64 sion %lu sign_id
1ee10 65 6e 74 69 74 79 20 69 73 20 25 70 20 28 69 64 entity is %p (id
1ee20 65 6e 74 69 74 79 20 23 25 6c 75 29 22 2c 20 28 entity #%lu)", (
1ee30 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 unsigned long) h
1ee40 53 65 73 73 69 6f 6e 2c 20 26 63 61 63 6b 65 79 Session, &cackey
1ee50 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
1ee60 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 68 on].identities[h
1ee70 4b 65 79 5d 2c 20 28 75 6e 73 69 67 6e 65 64 20 Key], (unsigned
1ee80 6c 6f 6e 67 29 20 68 4b 65 79 29 3b 0a 09 63 61 long) hKey);..ca
1ee90 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
1eea0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 ession].sign_ide
1eeb0 6e 74 69 74 79 20 3d 20 26 63 61 63 6b 65 79 5f ntity = &cackey_
1eec0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
1eed0 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 68 4b n].identities[hK
1eee0 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 ey];...mutex_ret
1eef0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 val = cackey_mut
1ef00 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 ex_unlock(cackey
1ef10 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 _biglock);..if (
1ef20 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 mutex_retval !=
1ef30 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 0) {...CACKEY_DE
1ef40 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
1ef50 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 r. Unlocking fa
1ef60 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 iled.");....retu
1ef70 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 rn(CKR_GENERAL_E
1ef80 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b RROR);..}...CACK
1ef90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1efa0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f "Returning CKR_O
1efb0 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 K (%i)", CKR_OK)
1efc0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f ;...return(CKR_O
1efd0 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 K);.}..CK_DEFINE
1efe0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c _FUNCTION(CK_RV,
1eff0 20 43 5f 53 69 67 6e 29 28 43 4b 5f 53 45 53 53 C_Sign)(CK_SESS
1f000 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 ION_HANDLE hSess
1f010 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 ion, CK_BYTE_PTR
1f020 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 pData, CK_ULONG
1f030 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 ulDataLen, CK_B
1f040 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 YTE_PTR pSignatu
1f050 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 re, CK_ULONG_PTR
1f060 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e pulSignatureLen
1f070 29 20 7b 0a 09 43 4b 5f 52 56 20 73 69 67 6e 5f ) {..CK_RV sign_
1f080 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ret;...CACKEY_DE
1f090 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
1f0a0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 ed.");...if (!ca
1f0b0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 ckey_initialized
1f0c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
1f0d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
1f0e0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a . Not initializ
1f0f0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
1f100 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f (CKR_CRYPTOKI_NO
1f110 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a T_INITIALIZED);.
1f120 09 7d 0a 0a 09 73 69 67 6e 5f 72 65 74 20 3d 20 .}...sign_ret =
1f130 43 5f 53 69 67 6e 55 70 64 61 74 65 28 68 53 65 C_SignUpdate(hSe
1f140 73 73 69 6f 6e 2c 20 70 44 61 74 61 2c 20 75 6c ssion, pData, ul
1f150 44 61 74 61 4c 65 6e 29 3b 0a 09 69 66 20 28 73 DataLen);..if (s
1f160 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f ign_ret != CKR_O
1f170 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 K) {...CACKEY_DE
1f180 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
1f190 72 2e 20 20 53 69 67 6e 55 70 64 61 74 65 28 29 r. SignUpdate()
1f1a0 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72 returned failur
1f1b0 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 e (rv = %lu).",
1f1c0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
1f1d0 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 72 65 sign_ret);....re
1f1e0 74 75 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a turn(sign_ret);.
1f1f0 09 7d 0a 0a 09 73 69 67 6e 5f 72 65 74 20 3d 20 .}...sign_ret =
1f200 43 5f 53 69 67 6e 46 69 6e 61 6c 28 68 53 65 73 C_SignFinal(hSes
1f210 73 69 6f 6e 2c 20 70 53 69 67 6e 61 74 75 72 65 sion, pSignature
1f220 2c 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 , pulSignatureLe
1f230 6e 29 3b 0a 09 69 66 20 28 73 69 67 6e 5f 72 65 n);..if (sign_re
1f240 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 t != CKR_OK) {..
1f250 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1f260 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 INTF("Error. Si
1f270 67 6e 46 69 6e 61 6c 28 29 20 72 65 74 75 72 6e gnFinal() return
1f280 65 64 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d ed failure (rv =
1f290 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e %lu).", (unsign
1f2a0 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 ed long) sign_re
1f2b0 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 73 69 t);....return(si
1f2c0 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 43 41 gn_ret);..}...CA
1f2d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
1f2e0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 F("Returning CKR
1f2f0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f _OK (%i)", CKR_O
1f300 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 K);...return(CKR
1f310 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 _OK);.}..CK_DEFI
1f320 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 NE_FUNCTION(CK_R
1f330 56 2c 20 43 5f 53 69 67 6e 55 70 64 61 74 65 29 V, C_SignUpdate)
1f340 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 (CK_SESSION_HAND
1f350 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f LE hSession, CK_
1f360 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 BYTE_PTR pPart,
1f370 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c CK_ULONG ulPartL
1f380 65 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 en) {..int mutex
1f390 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 _retval;...CACKE
1f3a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1f3b0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 Called.");...if
1f3c0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c (!cackey_initial
1f3d0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 ized) {...CACKEY
1f3e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
1f3f0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 rror. Not initi
1f400 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 alized.");....re
1f410 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b turn(CKR_CRYPTOK
1f420 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 I_NOT_INITIALIZE
1f430 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 D);..}...if (hSe
1f440 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 ssion == 0 || hS
1f450 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f ession >= (sizeo
1f460 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e f(cackey_session
1f470 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b s) / sizeof(cack
1f480 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 ey_sessions[0]))
1f490 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
1f4a0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
1f4b0 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f . Session out o
1f4c0 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 f range.");.....
1f4d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 .return(CKR_SESS
1f4e0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c ION_HANDLE_INVAL
1f4f0 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50 ID);..}...if (pP
1f500 61 72 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 art == NULL && u
1f510 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b lPartLen == 0) {
1f520 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 .../* Short circ
1f530 75 69 74 20 69 66 20 77 65 20 61 72 65 20 61 73 uit if we are as
1f540 6b 65 64 20 74 6f 20 73 69 67 6e 20 6e 6f 74 68 ked to sign noth
1f550 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 43 41 43 4b ing... */...CACK
1f560 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1f570 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f "Returning CKR_O
1f580 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20 63 69 K (%i) (short ci
1f590 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 rcuit)", CKR_OK)
1f5a0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
1f5b0 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50 OK);..}...if (pP
1f5c0 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 art == NULL) {..
1f5d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1f5e0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 50 61 INTF("Error. pPa
1f5f0 72 74 20 69 73 20 4e 55 4c 4c 2c 20 62 75 74 20 rt is NULL, but
1f600 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74 ulPartLen is not
1f610 20 30 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 0.");....return
1f620 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 (CKR_ARGUMENTS_B
1f630 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c AD);..}...if (ul
1f640 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a PartLen == 0) {.
1f650 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1f660 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 75 6c RINTF("Error. ul
1f670 50 61 72 74 4c 65 6e 20 69 73 20 30 2c 20 62 75 PartLen is 0, bu
1f680 74 20 70 50 61 72 74 20 69 73 20 6e 6f 74 20 4e t pPart is not N
1f690 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 ULL.");....retur
1f6a0 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f n(CKR_ARGUMENTS_
1f6b0 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 BAD);..}...mutex
1f6c0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 _retval = cackey
1f6d0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b _mutex_lock(cack
1f6e0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 ey_biglock);..if
1f6f0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 (mutex_retval !
1f700 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f = 0) {...CACKEY_
1f710 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
1f720 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 ror. Locking fa
1f730 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 iled.");....retu
1f740 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 rn(CKR_GENERAL_E
1f750 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 RROR);..}...if (
1f760 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 !cackey_sessions
1f770 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 [hSession].activ
1f780 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 e) {...cackey_mu
1f790 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 tex_unlock(cacke
1f7a0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 y_biglock);....C
1f7b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1f7c0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 TF("Error. Sess
1f7d0 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 ion not active."
1f7e0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 );......return(C
1f7f0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c KR_SESSION_HANDL
1f800 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a E_INVALID);..}..
1f810 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 .if (!cackey_ses
1f820 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
1f830 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 sign_active) {..
1f840 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e .cackey_mutex_un
1f850 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
1f860 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f ock);....CACKEY_
1f870 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
1f880 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61 ror. Sign not a
1f890 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 ctive.");......r
1f8a0 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 eturn(CKR_OPERAT
1f8b0 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 ION_NOT_INITIALI
1f8c0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 ZED);..}...switc
1f8d0 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f h (cackey_sessio
1f8e0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 ns[hSession].sig
1f8f0 6e 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 n_mechanism) {..
1f900 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b .case CKM_RSA_PK
1f910 43 53 3a 0a 09 09 09 2f 2a 20 41 63 63 75 6d 75 CS:..../* Accumu
1f920 6c 61 74 65 20 64 69 72 65 63 74 6c 79 20 2a 2f late directly */
1f930 0a 09 09 09 69 66 20 28 28 63 61 63 6b 65 79 5f ....if ((cackey_
1f940 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
1f950 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 n].sign_bufused
1f960 2b 20 75 6c 50 61 72 74 4c 65 6e 29 20 3e 20 63 + ulPartLen) > c
1f970 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
1f980 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 Session].sign_bu
1f990 66 6c 65 6e 29 20 7b 0a 09 09 09 09 63 61 63 6b flen) {.....cack
1f9a0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
1f9b0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 sion].sign_bufle
1f9c0 6e 20 2a 3d 20 32 3b 0a 0a 09 09 09 09 63 61 63 n *= 2;......cac
1f9d0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
1f9e0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 ssion].sign_buf
1f9f0 3d 20 72 65 61 6c 6c 6f 63 28 63 61 63 6b 65 79 = realloc(cackey
1fa00 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
1fa10 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 73 69 on].sign_buf, si
1fa20 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f 73 65 73 zeof(*cackey_ses
1fa30 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
1fa40 73 69 67 6e 5f 62 75 66 29 20 2a 20 63 61 63 6b sign_buf) * cack
1fa50 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
1fa60 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 sion].sign_bufle
1fa70 6e 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d 65 6d n);....}.....mem
1fa80 63 70 79 28 63 61 63 6b 65 79 5f 73 65 73 73 69 cpy(cackey_sessi
1fa90 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 ons[hSession].si
1faa0 67 6e 5f 62 75 66 20 2b 20 63 61 63 6b 65 79 5f gn_buf + cackey_
1fab0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
1fac0 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 2c n].sign_bufused,
1fad0 20 70 50 61 72 74 2c 20 75 6c 50 61 72 74 4c 65 pPart, ulPartLe
1fae0 6e 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 n);.....cackey_s
1faf0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
1fb00 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 2b ].sign_bufused +
1fb10 3d 20 75 6c 50 61 72 74 4c 65 6e 3b 0a 0a 09 09 = ulPartLen;....
1fb20 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 43 .break;...case C
1fb30 4b 4d 5f 53 48 41 31 5f 52 53 41 5f 50 4b 43 53 KM_SHA1_RSA_PKCS
1fb40 3a 0a 09 09 09 2f 2a 20 41 63 63 75 6d 75 6c 61 :..../* Accumula
1fb50 74 65 20 69 6e 74 6f 20 61 20 53 48 41 31 20 68 te into a SHA1 h
1fb60 61 73 68 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 ash */....cackey
1fb70 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 _mutex_unlock(ca
1fb80 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a ckey_biglock);..
1fb90 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1fba0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e PRINTF("Returnin
1fbb0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e g CKR_FUNCTION_N
1fbc0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 OT_SUPPORTED (%i
1fbd0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e )", CKR_FUNCTION
1fbe0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
1fbf0 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f .....return(CKR_
1fc00 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
1fc10 50 4f 52 54 45 44 29 3b 0a 09 09 09 62 72 65 61 PORTED);....brea
1fc20 6b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 k;..}...mutex_re
1fc30 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 tval = cackey_mu
1fc40 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 tex_unlock(cacke
1fc50 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 y_biglock);..if
1fc60 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d (mutex_retval !=
1fc70 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 0) {...CACKEY_D
1fc80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
1fc90 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 or. Unlocking f
1fca0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 ailed.");....ret
1fcb0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f urn(CKR_GENERAL_
1fcc0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 ERROR);..}...CAC
1fcd0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1fce0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f ("Returning CKR_
1fcf0 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b OK (%i)", CKR_OK
1fd00 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f );...return(CKR_
1fd10 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e OK);.}..CK_DEFIN
1fd20 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 E_FUNCTION(CK_RV
1fd30 2c 20 43 5f 53 69 67 6e 46 69 6e 61 6c 29 28 43 , C_SignFinal)(C
1fd40 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 K_SESSION_HANDLE
1fd50 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 hSession, CK_BY
1fd60 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 TE_PTR pSignatur
1fd70 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 e, CK_ULONG_PTR
1fd80 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 pulSignatureLen)
1fd90 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 59 {..static CK_BY
1fda0 54 45 20 73 69 67 62 75 66 5b 31 30 32 34 5d 3b TE sigbuf[1024];
1fdb0 0a 09 73 73 69 7a 65 5f 74 20 73 69 67 62 75 66 ..ssize_t sigbuf
1fdc0 6c 65 6e 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 len;..CK_RV retv
1fdd0 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c al = CKR_GENERAL
1fde0 5f 45 52 52 4f 52 3b 0a 09 69 6e 74 20 74 65 72 _ERROR;..int ter
1fdf0 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 31 3b minate_sign = 1;
1fe00 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 ..int mutex_retv
1fe10 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 al;...CACKEY_DEB
1fe20 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
1fe30 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 d.");...if (!cac
1fe40 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 key_initialized)
1fe50 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
1fe60 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
1fe70 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 Not initialize
1fe80 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
1fe90 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 CKR_CRYPTOKI_NOT
1fea0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 _INITIALIZED);..
1feb0 7d 0a 0a 09 69 66 20 28 70 75 6c 53 69 67 6e 61 }...if (pulSigna
1fec0 74 75 72 65 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 tureLen == NULL)
1fed0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
1fee0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
1fef0 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e pulSignatureLen
1ff00 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 is NULL.");....
1ff10 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d return(CKR_ARGUM
1ff20 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 ENTS_BAD);..}...
1ff30 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 if (hSession ==
1ff40 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 0 || hSession >=
1ff50 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f (sizeof(cackey_
1ff60 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 sessions) / size
1ff70 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f of(cackey_sessio
1ff80 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 ns[0]))) {...CAC
1ff90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1ffa0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f ("Error. Sessio
1ffb0 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 n out of range."
1ffc0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 );......return(C
1ffd0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c KR_SESSION_HANDL
1ffe0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a E_INVALID);..}..
1fff0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 .mutex_retval =
20000 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 cackey_mutex_loc
20010 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
20020 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 );..if (mutex_re
20030 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 tval != 0) {...C
20040 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
20050 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b TF("Error. Lock
20060 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a ing failed.");..
20070 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e ..return(CKR_GEN
20080 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a ERAL_ERROR);..}.
20090 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 ..if (!cackey_se
200a0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
200b0 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 .active) {...cac
200c0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b key_mutex_unlock
200d0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 (cackey_biglock)
200e0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 ;....CACKEY_DEBU
200f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
20100 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 Session not ac
20110 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 tive.");......re
20120 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e turn(CKR_SESSION
20130 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 _HANDLE_INVALID)
20140 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b ;..}...if (!cack
20150 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
20160 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 sion].sign_activ
20170 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 e) {...cackey_mu
20180 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 tex_unlock(cacke
20190 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 y_biglock);....C
201a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
201b0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e TF("Error. Sign
201c0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a not active.");.
201d0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f .....return(CKR_
201e0 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e OPERATION_NOT_IN
201f0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
20200 09 73 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f .switch (cackey_
20210 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
20220 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 n].sign_mechanis
20230 6d 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f m) {...case CKM_
20240 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 RSA_PKCS:..../*
20250 41 73 6b 20 63 61 72 64 20 74 6f 20 73 69 67 6e Ask card to sign
20260 20 2a 2f 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 */....CACKEY_DE
20270 42 55 47 5f 50 52 49 4e 54 46 28 22 41 73 6b 69 BUG_PRINTF("Aski
20280 6e 67 20 74 6f 20 64 65 63 72 79 70 74 20 66 72 ng to decrypt fr
20290 6f 6d 20 69 64 65 6e 74 69 74 79 20 25 70 20 69 om identity %p i
202a0 6e 20 73 65 73 73 69 6f 6e 20 25 6c 75 22 2c 20 n session %lu",
202b0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
202c0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 hSession].sign_i
202d0 64 65 6e 74 69 74 79 2c 20 28 75 6e 73 69 67 6e dentity, (unsign
202e0 65 64 20 6c 6f 6e 67 29 20 68 53 65 73 73 69 6f ed long) hSessio
202f0 6e 29 3b 0a 09 09 09 73 69 67 62 75 66 6c 65 6e n);....sigbuflen
20300 20 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 = cackey_signde
20310 63 72 79 70 74 28 26 63 61 63 6b 65 79 5f 73 6c crypt(&cackey_sl
20320 6f 74 73 5b 63 61 63 6b 65 79 5f 73 65 73 73 69 ots[cackey_sessi
20330 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c ons[hSession].sl
20340 6f 74 49 44 5d 2c 20 63 61 63 6b 65 79 5f 73 65 otID], cackey_se
20350 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
20360 2e 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 2c 20 .sign_identity,
20370 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
20380 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 hSession].sign_b
20390 75 66 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 uf, cackey_sessi
203a0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 ons[hSession].si
203b0 67 6e 5f 62 75 66 6c 65 6e 2c 20 73 69 67 62 75 gn_buflen, sigbu
203c0 66 2c 20 73 69 7a 65 6f 66 28 73 69 67 62 75 66 f, sizeof(sigbuf
203d0 29 29 3b 0a 0a 09 09 09 69 66 20 28 73 69 67 62 ));.....if (sigb
203e0 75 66 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 09 uflen < 0) {....
203f0 09 2f 2a 20 53 69 67 6e 69 6e 67 20 66 61 69 6c ./* Signing fail
20400 65 64 2e 20 2a 2f 0a 09 09 09 09 72 65 74 76 61 ed. */.....retva
20410 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f l = CKR_GENERAL_
20420 45 52 52 4f 52 3b 0a 09 09 09 7d 20 65 6c 73 65 ERROR;....} else
20430 20 69 66 20 28 28 28 75 6e 73 69 67 6e 65 64 20 if (((unsigned
20440 6c 6f 6e 67 29 20 73 69 67 62 75 66 6c 65 6e 29 long) sigbuflen)
20450 20 3e 20 2a 70 75 6c 53 69 67 6e 61 74 75 72 65 > *pulSignature
20460 4c 65 6e 20 26 26 20 70 53 69 67 6e 61 74 75 72 Len && pSignatur
20470 65 29 20 7b 0a 09 09 09 09 2f 2a 20 53 69 67 6e e) {...../* Sign
20480 65 64 20 64 61 74 61 20 74 6f 6f 20 6c 61 72 67 ed data too larg
20490 65 20 2a 2f 0a 09 09 09 09 72 65 74 76 61 6c 20 e */.....retval
204a0 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f = CKR_BUFFER_TOO
204b0 5f 53 4d 41 4c 4c 3b 0a 0a 09 09 09 09 74 65 72 _SMALL;......ter
204c0 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 30 3b minate_sign = 0;
204d0 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 ....} else {....
204e0 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 .terminate_sign
204f0 3d 20 30 3b 0a 0a 09 09 09 09 69 66 20 28 70 53 = 0;......if (pS
20500 69 67 6e 61 74 75 72 65 29 20 7b 0a 09 09 09 09 ignature) {.....
20510 09 6d 65 6d 63 70 79 28 70 53 69 67 6e 61 74 75 .memcpy(pSignatu
20520 72 65 2c 20 73 69 67 62 75 66 2c 20 73 69 67 62 re, sigbuf, sigb
20530 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 09 74 65 uflen);.......te
20540 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 31 rminate_sign = 1
20550 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2a 70 75 ;.....}......*pu
20560 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d 20 lSignatureLen =
20570 73 69 67 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09 sigbuflen;......
20580 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b retval = CKR_OK;
20590 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b ....}.....break;
205a0 0a 09 09 63 61 73 65 20 43 4b 4d 5f 53 48 41 31 ...case CKM_SHA1
205b0 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a _RSA_PKCS:..../*
205c0 20 41 63 63 75 6d 75 6c 61 74 65 20 69 6e 74 6f Accumulate into
205d0 20 61 20 53 48 41 31 20 68 61 73 68 20 2a 2f 0a a SHA1 hash */.
205e0 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f ...cackey_mutex_
205f0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 unlock(cackey_bi
20600 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43 41 43 4b glock);.....CACK
20610 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
20620 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 "Returning CKR_F
20630 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
20640 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 ORTED (%i)", CKR
20650 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
20660 50 50 4f 52 54 45 44 29 3b 0a 0a 09 09 09 72 65 PPORTED);.....re
20670 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f turn(CKR_FUNCTIO
20680 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 N_NOT_SUPPORTED)
20690 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a ;....break;..}..
206a0 09 69 66 20 28 74 65 72 6d 69 6e 61 74 65 5f 73 .if (terminate_s
206b0 69 67 6e 29 20 7b 0a 09 09 69 66 20 28 63 61 63 ign) {...if (cac
206c0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
206d0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 ssion].sign_buf)
206e0 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 {....free(cacke
206f0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
20700 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 3b 0a ion].sign_buf);.
20710 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 65 ..}....cackey_se
20720 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
20730 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 30 .sign_active = 0
20740 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 ;..}...mutex_ret
20750 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 val = cackey_mut
20760 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 ex_unlock(cackey
20770 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 _biglock);..if (
20780 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 mutex_retval !=
20790 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 0) {...CACKEY_DE
207a0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
207b0 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 r. Unlocking fa
207c0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 iled.");....retu
207d0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 rn(CKR_GENERAL_E
207e0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b RROR);..}...CACK
207f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
20800 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 "Returning %i",
20810 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 0a (int) retval);..
20820 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b .return(retval);
20830 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 .}..CK_DEFINE_FU
20840 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f NCTION(CK_RV, C_
20850 53 69 67 6e 52 65 63 6f 76 65 72 49 6e 69 74 29 SignRecoverInit)
20860 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 (CK_SESSION_HAND
20870 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f LE hSession, CK_
20880 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d MECHANISM_PTR pM
20890 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a echanism, CK_OBJ
208a0 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 ECT_HANDLE hKey)
208b0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {..CACKEY_DEBUG
208c0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
208d0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ");...if (!cacke
208e0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b y_initialized) {
208f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
20900 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
20910 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e Not initialized.
20920 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
20930 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 R_CRYPTOKI_NOT_I
20940 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
20950 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
20960 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
20970 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f CKR_FUNCTION_NO
20980 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 T_SUPPORTED (%i)
20990 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f ", CKR_FUNCTION_
209a0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
209b0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e ..return(CKR_FUN
209c0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
209d0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 TED);.}..CK_DEFI
209e0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 NE_FUNCTION(CK_R
209f0 56 2c 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 V, C_SignRecover
20a00 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e )(CK_SESSION_HAN
20a10 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b DLE hSession, CK
20a20 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c _BYTE_PTR pData,
20a30 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 CK_ULONG ulData
20a40 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 Len, CK_BYTE_PTR
20a50 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f pSignature, CK_
20a60 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 67 ULONG_PTR pulSig
20a70 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43 41 natureLen) {..CA
20a80 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
20a90 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
20aa0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 if (!cackey_init
20ab0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 ialized) {...CAC
20ac0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
20ad0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e ("Error. Not in
20ae0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 itialized.");...
20af0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 .return(CKR_CRYP
20b00 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c TOKI_NOT_INITIAL
20b10 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b IZED);..}...CACK
20b20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
20b30 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 "Returning CKR_F
20b40 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
20b50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 ORTED (%i)", CKR
20b60 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
20b70 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 PPORTED);...retu
20b80 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f rn(CKR_FUNCTION_
20b90 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
20ba0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e }..CK_DEFINE_FUN
20bb0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 CTION(CK_RV, C_V
20bc0 65 72 69 66 79 49 6e 69 74 29 28 43 4b 5f 53 45 erifyInit)(CK_SE
20bd0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 SSION_HANDLE hSe
20be0 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e ssion, CK_MECHAN
20bf0 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 ISM_PTR pMechani
20c00 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 sm, CK_OBJECT_HA
20c10 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 NDLE hKey) {..CA
20c20 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
20c30 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
20c40 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 if (!cackey_init
20c50 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 ialized) {...CAC
20c60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
20c70 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e ("Error. Not in
20c80 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 itialized.");...
20c90 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 .return(CKR_CRYP
20ca0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c TOKI_NOT_INITIAL
20cb0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b IZED);..}...CACK
20cc0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
20cd0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 "Returning CKR_F
20ce0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
20cf0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 ORTED (%i)", CKR
20d00 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
20d10 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 PPORTED);...retu
20d20 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f rn(CKR_FUNCTION_
20d30 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
20d40 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e }..CK_DEFINE_FUN
20d50 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 CTION(CK_RV, C_V
20d60 65 72 69 66 79 29 28 43 4b 5f 53 45 53 53 49 4f erify)(CK_SESSIO
20d70 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f N_HANDLE hSessio
20d80 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 n, CK_BYTE_PTR p
20d90 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 Data, CK_ULONG u
20da0 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 lDataLen, CK_BYT
20db0 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 E_PTR pSignature
20dc0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 , CK_ULONG ulSig
20dd0 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43 41 natureLen) {..CA
20de0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
20df0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
20e00 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 if (!cackey_init
20e10 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 ialized) {...CAC
20e20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
20e30 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e ("Error. Not in
20e40 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 itialized.");...
20e50 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 .return(CKR_CRYP
20e60 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c TOKI_NOT_INITIAL
20e70 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b IZED);..}...CACK
20e80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
20e90 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 "Returning CKR_F
20ea0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
20eb0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 ORTED (%i)", CKR
20ec0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
20ed0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 PPORTED);...retu
20ee0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f rn(CKR_FUNCTION_
20ef0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
20f00 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e }..CK_DEFINE_FUN
20f10 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 CTION(CK_RV, C_V
20f20 65 72 69 66 79 55 70 64 61 74 65 29 28 43 4b 5f erifyUpdate)(CK_
20f30 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 SESSION_HANDLE h
20f40 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 Session, CK_BYTE
20f50 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 _PTR pPart, CK_U
20f60 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29 20 LONG ulPartLen)
20f70 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f {..CACKEY_DEBUG_
20f80 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
20f90 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 );...if (!cackey
20fa0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
20fb0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
20fc0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e RINTF("Error. N
20fd0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 ot initialized."
20fe0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
20ff0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e _CRYPTOKI_NOT_IN
21000 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
21010 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
21020 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
21030 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
21040 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 _SUPPORTED (%i)"
21050 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e , CKR_FUNCTION_N
21060 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a OT_SUPPORTED);..
21070 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 .return(CKR_FUNC
21080 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
21090 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e ED);.}..CK_DEFIN
210a0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 E_FUNCTION(CK_RV
210b0 2c 20 43 5f 56 65 72 69 66 79 46 69 6e 61 6c 29 , C_VerifyFinal)
210c0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 (CK_SESSION_HAND
210d0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f LE hSession, CK_
210e0 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 BYTE_PTR pSignat
210f0 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c ure, CK_ULONG ul
21100 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a SignatureLen) {.
21110 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
21120 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
21130 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 ...if (!cackey_i
21140 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 nitialized) {...
21150 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
21160 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 NTF("Error. Not
21170 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b initialized.");
21180 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 ....return(CKR_C
21190 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 RYPTOKI_NOT_INIT
211a0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 IALIZED);..}...C
211b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
211c0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b TF("Returning CK
211d0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
211e0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 UPPORTED (%i)",
211f0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
21200 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 _SUPPORTED);...r
21210 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 eturn(CKR_FUNCTI
21220 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
21230 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f );.}..CK_DEFINE_
21240 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 FUNCTION(CK_RV,
21250 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 49 C_VerifyRecoverI
21260 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f nit)(CK_SESSION_
21270 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c HANDLE hSession,
21280 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 CK_MECHANISM_PT
21290 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b R pMechanism, CK
212a0 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 _OBJECT_HANDLE h
212b0 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 Key) {..CACKEY_D
212c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
212d0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 led.");...if (!c
212e0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 ackey_initialize
212f0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 d) {...CACKEY_DE
21300 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
21310 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 r. Not initiali
21320 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 zed.");....retur
21330 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e n(CKR_CRYPTOKI_N
21340 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b OT_INITIALIZED);
21350 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 ..}...CACKEY_DEB
21360 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
21370 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f ning CKR_FUNCTIO
21380 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 N_NOT_SUPPORTED
21390 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 (%i)", CKR_FUNCT
213a0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
213b0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 D);...return(CKR
213c0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
213d0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f PPORTED);.}..CK_
213e0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 DEFINE_FUNCTION(
213f0 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 52 CK_RV, C_VerifyR
21400 65 63 6f 76 65 72 29 28 43 4b 5f 53 45 53 53 49 ecover)(CK_SESSI
21410 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 ON_HANDLE hSessi
21420 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 on, CK_BYTE_PTR
21430 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 pSignature, CK_U
21440 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72 65 LONG ulSignature
21450 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 Len, CK_BYTE_PTR
21460 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 pData, CK_ULONG
21470 5f 50 54 52 20 70 75 6c 44 61 74 61 4c 65 6e 29 _PTR pulDataLen)
21480 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {..CACKEY_DEBUG
21490 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
214a0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ");...if (!cacke
214b0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b y_initialized) {
214c0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
214d0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
214e0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e Not initialized.
214f0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
21500 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 R_CRYPTOKI_NOT_I
21510 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
21520 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
21530 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
21540 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f CKR_FUNCTION_NO
21550 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 T_SUPPORTED (%i)
21560 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f ", CKR_FUNCTION_
21570 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
21580 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e ..return(CKR_FUN
21590 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
215a0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 TED);.}..CK_DEFI
215b0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 NE_FUNCTION(CK_R
215c0 56 2c 20 43 5f 44 69 67 65 73 74 45 6e 63 72 79 V, C_DigestEncry
215d0 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 ptUpdate)(CK_SES
215e0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 SION_HANDLE hSes
215f0 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 sion, CK_BYTE_PT
21600 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e R pPart, CK_ULON
21610 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f G ulPartLen, CK_
21620 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 BYTE_PTR pEncryp
21630 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e tedPart, CK_ULON
21640 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74 G_PTR pulEncrypt
21650 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 edPartLen) {..CA
21660 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
21670 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
21680 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 if (!cackey_init
21690 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 ialized) {...CAC
216a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
216b0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e ("Error. Not in
216c0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 itialized.");...
216d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 .return(CKR_CRYP
216e0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c TOKI_NOT_INITIAL
216f0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b IZED);..}...CACK
21700 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
21710 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 "Returning CKR_F
21720 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
21730 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 ORTED (%i)", CKR
21740 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
21750 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 PPORTED);...retu
21760 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f rn(CKR_FUNCTION_
21770 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
21780 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e }..CK_DEFINE_FUN
21790 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 CTION(CK_RV, C_D
217a0 65 63 72 79 70 74 44 69 67 65 73 74 55 70 64 61 ecryptDigestUpda
217b0 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 te)(CK_SESSION_H
217c0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 ANDLE hSession,
217d0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 CK_BYTE_PTR pEnc
217e0 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 ryptedPart, CK_U
217f0 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64 LONG ulEncrypted
21800 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 PartLen, CK_BYTE
21810 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 _PTR pPart, CK_U
21820 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61 72 74 LONG_PTR pulPart
21830 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 Len) {..CACKEY_D
21840 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
21850 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 led.");...if (!c
21860 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 ackey_initialize
21870 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 d) {...CACKEY_DE
21880 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
21890 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 r. Not initiali
218a0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 zed.");....retur
218b0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e n(CKR_CRYPTOKI_N
218c0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b OT_INITIALIZED);
218d0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 ..}...CACKEY_DEB
218e0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
218f0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f ning CKR_FUNCTIO
21900 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 N_NOT_SUPPORTED
21910 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 (%i)", CKR_FUNCT
21920 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
21930 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 D);...return(CKR
21940 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
21950 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f PPORTED);.}..CK_
21960 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 DEFINE_FUNCTION(
21970 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 45 6e 63 CK_RV, C_SignEnc
21980 72 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53 ryptUpdate)(CK_S
21990 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 ESSION_HANDLE hS
219a0 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f ession, CK_BYTE_
219b0 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c PTR pPart, CK_UL
219c0 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43 ONG ulPartLen, C
219d0 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 K_BYTE_PTR pEncr
219e0 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c yptedPart, CK_UL
219f0 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 ONG_PTR pulEncry
21a00 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 ptedPartLen) {..
21a10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
21a20 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a NTF("Called.");.
21a30 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e ..if (!cackey_in
21a40 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 itialized) {...C
21a50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
21a60 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 TF("Error. Not
21a70 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a initialized.");.
21a80 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 ...return(CKR_CR
21a90 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 YPTOKI_NOT_INITI
21aa0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 ALIZED);..}...CA
21ab0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
21ac0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 F("Returning CKR
21ad0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
21ae0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 PPORTED (%i)", C
21af0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
21b00 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 SUPPORTED);...re
21b10 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f turn(CKR_FUNCTIO
21b20 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 N_NOT_SUPPORTED)
21b30 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 ;.}..CK_DEFINE_F
21b40 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 UNCTION(CK_RV, C
21b50 5f 44 65 63 72 79 70 74 56 65 72 69 66 79 55 70 _DecryptVerifyUp
21b60 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e date)(CK_SESSION
21b70 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e _HANDLE hSession
21b80 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 , CK_BYTE_PTR pE
21b90 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b ncryptedPart, CK
21ba0 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 _ULONG ulEncrypt
21bb0 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 edPartLen, CK_BY
21bc0 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b TE_PTR pPart, CK
21bd0 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61 _ULONG_PTR pulPa
21be0 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 rtLen) {..CACKEY
21bf0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 _DEBUG_PRINTF("C
21c00 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 alled.");...if (
21c10 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 !cackey_initiali
21c20 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f zed) {...CACKEY_
21c30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
21c40 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 ror. Not initia
21c50 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 lized.");....ret
21c60 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 urn(CKR_CRYPTOKI
21c70 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 _NOT_INITIALIZED
21c80 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 );..}...CACKEY_D
21c90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
21ca0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 urning CKR_FUNCT
21cb0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
21cc0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e D (%i)", CKR_FUN
21cd0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
21ce0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 TED);...return(C
21cf0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
21d00 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 SUPPORTED);.}..C
21d10 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f K_DEFINE_FUNCTIO
21d20 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72 N(CK_RV, C_Gener
21d30 61 74 65 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 ateKey)(CK_SESSI
21d40 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 ON_HANDLE hSessi
21d50 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d on, CK_MECHANISM
21d60 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c _PTR pMechanism,
21d70 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 CK_ATTRIBUTE_PT
21d80 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f R pTemplate, CK_
21d90 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43 ULONG ulCount, C
21da0 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f K_OBJECT_HANDLE_
21db0 50 54 52 20 70 68 4b 65 79 29 20 7b 0a 09 43 41 PTR phKey) {..CA
21dc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
21dd0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
21de0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 if (!cackey_init
21df0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 ialized) {...CAC
21e00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
21e10 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e ("Error. Not in
21e20 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 itialized.");...
21e30 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 .return(CKR_CRYP
21e40 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c TOKI_NOT_INITIAL
21e50 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b IZED);..}...CACK
21e60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
21e70 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 "Returning CKR_F
21e80 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
21e90 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 ORTED (%i)", CKR
21ea0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
21eb0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 PPORTED);...retu
21ec0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f rn(CKR_FUNCTION_
21ed0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
21ee0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e }..CK_DEFINE_FUN
21ef0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 CTION(CK_RV, C_G
21f00 65 6e 65 72 61 74 65 4b 65 79 50 61 69 72 29 28 enerateKeyPair)(
21f10 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c CK_SESSION_HANDL
21f20 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d E hSession, CK_M
21f30 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 ECHANISM_PTR pMe
21f40 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 41 54 54 52 chanism, CK_ATTR
21f50 49 42 55 54 45 5f 50 54 52 20 70 50 75 62 6c 69 IBUTE_PTR pPubli
21f60 63 4b 65 79 54 65 6d 70 6c 61 74 65 2c 20 43 4b cKeyTemplate, CK
21f70 5f 55 4c 4f 4e 47 20 75 6c 50 75 62 6c 69 63 4b _ULONG ulPublicK
21f80 65 79 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74 eyAttributeCount
21f90 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 , CK_ATTRIBUTE_P
21fa0 54 52 20 70 50 72 69 76 61 74 65 4b 65 79 54 65 TR pPrivateKeyTe
21fb0 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 mplate, CK_ULONG
21fc0 20 75 6c 50 72 69 76 61 74 65 4b 65 79 41 74 74 ulPrivateKeyAtt
21fd0 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f ributeCount, CK_
21fe0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 OBJECT_HANDLE_PT
21ff0 52 20 70 68 50 75 62 6c 69 63 4b 65 79 2c 20 43 R phPublicKey, C
22000 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f K_OBJECT_HANDLE_
22010 50 54 52 20 70 68 50 72 69 76 61 74 65 4b 65 79 PTR phPrivateKey
22020 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 ) {..CACKEY_DEBU
22030 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 G_PRINTF("Called
22040 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b .");...if (!cack
22050 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 ey_initialized)
22060 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
22070 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
22080 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 Not initialized
22090 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
220a0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f KR_CRYPTOKI_NOT_
220b0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d INITIALIZED);..}
220c0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
220d0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e PRINTF("Returnin
220e0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e g CKR_FUNCTION_N
220f0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 OT_SUPPORTED (%i
22100 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e )", CKR_FUNCTION
22110 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
22120 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 ...return(CKR_FU
22130 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
22140 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 RTED);.}..CK_DEF
22150 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f INE_FUNCTION(CK_
22160 52 56 2c 20 43 5f 57 72 61 70 4b 65 79 29 28 43 RV, C_WrapKey)(C
22170 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 K_SESSION_HANDLE
22180 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 hSession, CK_ME
22190 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 CHANISM_PTR pMec
221a0 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 hanism, CK_OBJEC
221b0 54 5f 48 41 4e 44 4c 45 20 68 57 72 61 70 70 69 T_HANDLE hWrappi
221c0 6e 67 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 ngKey, CK_OBJECT
221d0 5f 48 41 4e 44 4c 45 20 68 4b 65 79 2c 20 43 4b _HANDLE hKey, CK
221e0 5f 42 59 54 45 5f 50 54 52 20 70 57 72 61 70 70 _BYTE_PTR pWrapp
221f0 65 64 4b 65 79 2c 20 43 4b 5f 55 4c 4f 4e 47 5f edKey, CK_ULONG_
22200 50 54 52 20 70 75 6c 57 72 61 70 70 65 64 4b 65 PTR pulWrappedKe
22210 79 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f yLen) {..CACKEY_
22220 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
22230 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 lled.");...if (!
22240 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a cackey_initializ
22250 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...CACKEY_D
22260 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
22270 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c or. Not initial
22280 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 ized.");....retu
22290 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f rn(CKR_CRYPTOKI_
222a0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 NOT_INITIALIZED)
222b0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ;..}...CACKEY_DE
222c0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
222d0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 rning CKR_FUNCTI
222e0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
222f0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 (%i)", CKR_FUNC
22300 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
22310 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b ED);...return(CK
22320 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
22330 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b UPPORTED);.}..CK
22340 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e _DEFINE_FUNCTION
22350 28 43 4b 5f 52 56 2c 20 43 5f 55 6e 77 72 61 70 (CK_RV, C_Unwrap
22360 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f Key)(CK_SESSION_
22370 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c HANDLE hSession,
22380 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 CK_MECHANISM_PT
22390 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b R pMechanism, CK
223a0 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 _OBJECT_HANDLE h
223b0 55 6e 77 72 61 70 70 69 6e 67 4b 65 79 2c 20 43 UnwrappingKey, C
223c0 4b 5f 42 59 54 45 5f 50 54 52 20 70 57 72 61 70 K_BYTE_PTR pWrap
223d0 70 65 64 4b 65 79 2c 20 43 4b 5f 55 4c 4f 4e 47 pedKey, CK_ULONG
223e0 20 75 6c 57 72 61 70 70 65 64 4b 65 79 4c 65 6e ulWrappedKeyLen
223f0 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 , CK_ATTRIBUTE_P
22400 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b TR pTemplate, CK
22410 5f 55 4c 4f 4e 47 20 75 6c 41 74 74 72 69 62 75 _ULONG ulAttribu
22420 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 teCount, CK_OBJE
22430 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 CT_HANDLE_PTR ph
22440 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 Key) {..CACKEY_D
22450 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
22460 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 led.");...if (!c
22470 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 ackey_initialize
22480 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 d) {...CACKEY_DE
22490 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
224a0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 r. Not initiali
224b0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 zed.");....retur
224c0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e n(CKR_CRYPTOKI_N
224d0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b OT_INITIALIZED);
224e0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 ..}...CACKEY_DEB
224f0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
22500 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f ning CKR_FUNCTIO
22510 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 N_NOT_SUPPORTED
22520 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 (%i)", CKR_FUNCT
22530 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
22540 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 D);...return(CKR
22550 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
22560 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f PPORTED);.}..CK_
22570 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 DEFINE_FUNCTION(
22580 43 4b 5f 52 56 2c 20 43 5f 44 65 72 69 76 65 4b CK_RV, C_DeriveK
22590 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 ey)(CK_SESSION_H
225a0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 ANDLE hSession,
225b0 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 CK_MECHANISM_PTR
225c0 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f pMechanism, CK_
225d0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 42 OBJECT_HANDLE hB
225e0 61 73 65 4b 65 79 2c 20 43 4b 5f 41 54 54 52 49 aseKey, CK_ATTRI
225f0 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 BUTE_PTR pTempla
22600 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 41 te, CK_ULONG ulA
22610 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 ttributeCount, C
22620 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f K_OBJECT_HANDLE_
22630 50 54 52 20 70 68 4b 65 79 29 20 7b 0a 09 43 41 PTR phKey) {..CA
22640 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
22650 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
22660 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 if (!cackey_init
22670 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 ialized) {...CAC
22680 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
22690 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e ("Error. Not in
226a0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 itialized.");...
226b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 .return(CKR_CRYP
226c0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c TOKI_NOT_INITIAL
226d0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b IZED);..}...CACK
226e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
226f0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 "Returning CKR_F
22700 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
22710 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 ORTED (%i)", CKR
22720 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
22730 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 PPORTED);...retu
22740 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f rn(CKR_FUNCTION_
22750 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
22760 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e }..CK_DEFINE_FUN
22770 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 CTION(CK_RV, C_S
22780 65 65 64 52 61 6e 64 6f 6d 29 28 43 4b 5f 53 45 eedRandom)(CK_SE
22790 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 SSION_HANDLE hSe
227a0 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 ssion, CK_BYTE_P
227b0 54 52 20 70 53 65 65 64 2c 20 43 4b 5f 55 4c 4f TR pSeed, CK_ULO
227c0 4e 47 20 75 6c 53 65 65 64 4c 65 6e 29 20 7b 0a NG ulSeedLen) {.
227d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
227e0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
227f0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 ...if (!cackey_i
22800 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 nitialized) {...
22810 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
22820 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 NTF("Error. Not
22830 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b initialized.");
22840 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 ....return(CKR_C
22850 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 RYPTOKI_NOT_INIT
22860 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 IALIZED);..}...C
22870 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
22880 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b TF("Returning CK
22890 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
228a0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 UPPORTED (%i)",
228b0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
228c0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 _SUPPORTED);...r
228d0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 eturn(CKR_FUNCTI
228e0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
228f0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f );.}..CK_DEFINE_
22900 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 FUNCTION(CK_RV,
22910 43 5f 47 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d C_GenerateRandom
22920 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e )(CK_SESSION_HAN
22930 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b DLE hSession, CK
22940 5f 42 59 54 45 5f 50 54 52 20 70 52 61 6e 64 6f _BYTE_PTR pRando
22950 6d 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 mData, CK_ULONG
22960 75 6c 52 61 6e 64 6f 6d 4c 65 6e 29 20 7b 0a 09 ulRandomLen) {..
22970 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
22980 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a NTF("Called.");.
22990 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e ..if (!cackey_in
229a0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 itialized) {...C
229b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
229c0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 TF("Error. Not
229d0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a initialized.");.
229e0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 ...return(CKR_CR
229f0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 YPTOKI_NOT_INITI
22a00 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 ALIZED);..}...CA
22a10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
22a20 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 F("Returning CKR
22a30 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
22a40 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 PPORTED (%i)", C
22a50 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
22a60 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 SUPPORTED);...re
22a70 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f turn(CKR_FUNCTIO
22a80 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 N_NOT_SUPPORTED)
22a90 3b 0a 7d 0a 0a 2f 2a 20 44 65 70 72 65 63 61 74 ;.}../* Deprecat
22aa0 65 64 20 46 75 6e 63 74 69 6f 6e 20 2a 2f 0a 43 ed Function */.C
22ab0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f K_DEFINE_FUNCTIO
22ac0 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 46 75 N(CK_RV, C_GetFu
22ad0 6e 63 74 69 6f 6e 53 74 61 74 75 73 29 28 43 4b nctionStatus)(CK
22ae0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 _SESSION_HANDLE
22af0 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 41 43 hSession) {..CAC
22b00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
22b10 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 ("Called.");...C
22b20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
22b30 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b TF("Returning CK
22b40 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 R_FUNCTION_NOT_P
22b50 41 52 41 4c 4c 45 4c 20 28 25 69 29 22 2c 20 43 ARALLEL (%i)", C
22b60 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
22b70 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72 65 74 PARALLEL);...ret
22b80 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e urn(CKR_FUNCTION
22b90 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a _NOT_PARALLEL);.
22ba0 0a 09 68 53 65 73 73 69 6f 6e 20 3d 20 68 53 65 ..hSession = hSe
22bb0 73 73 69 6f 6e 3b 20 2f 2a 20 53 75 70 72 65 73 ssion; /* Supres
22bc0 73 20 75 6e 75 73 65 64 20 76 61 72 69 61 62 6c s unused variabl
22bd0 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a e warning */.}..
22be0 2f 2a 20 44 65 70 72 65 63 61 74 65 64 20 46 75 /* Deprecated Fu
22bf0 6e 63 74 69 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 46 nction */.CK_DEF
22c00 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f INE_FUNCTION(CK_
22c10 52 56 2c 20 43 5f 43 61 6e 63 65 6c 46 75 6e 63 RV, C_CancelFunc
22c20 74 69 6f 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e tion)(CK_SESSION
22c30 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e _HANDLE hSession
22c40 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 ) {..CACKEY_DEBU
22c50 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 G_PRINTF("Called
22c60 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 .");...CACKEY_DE
22c70 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
22c80 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 rning CKR_FUNCTI
22c90 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 20 ON_NOT_PARALLEL
22ca0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 (%i)", CKR_FUNCT
22cb0 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c ION_NOT_PARALLEL
22cc0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f );...return(CKR_
22cd0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 FUNCTION_NOT_PAR
22ce0 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65 73 73 69 ALLEL);...hSessi
22cf0 6f 6e 20 3d 20 68 53 65 73 73 69 6f 6e 3b 20 2f on = hSession; /
22d00 2a 20 53 75 70 72 65 73 73 20 75 6e 75 73 65 64 * Supress unused
22d10 20 76 61 72 69 61 62 6c 65 20 77 61 72 6e 69 6e variable warnin
22d20 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e g */.}..CK_DEFIN
22d30 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 E_FUNCTION(CK_RV
22d40 2c 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 4c , C_GetFunctionL
22d50 69 73 74 29 28 43 4b 5f 46 55 4e 43 54 49 4f 4e ist)(CK_FUNCTION
22d60 5f 4c 49 53 54 5f 50 54 52 5f 50 54 52 20 70 70 _LIST_PTR_PTR pp
22d70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 20 7b 0a FunctionList) {.
22d80 09 43 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 .CK_FUNCTION_LIS
22d90 54 5f 50 54 52 20 70 46 75 6e 63 74 69 6f 6e 4c T_PTR pFunctionL
22da0 69 73 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ist;...CACKEY_DE
22db0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
22dc0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 70 46 ed.");...if (ppF
22dd0 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 3d 20 4e unctionList == N
22de0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f ULL) {...CACKEY_
22df0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
22e00 72 6f 72 2e 20 70 70 46 75 6e 63 74 69 6f 6e 4c ror. ppFunctionL
22e10 69 73 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a ist is NULL.");.
22e20 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 ...return(CKR_AR
22e30 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d GUMENTS_BAD);..}
22e40 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 ...pFunctionList
22e50 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 = malloc(sizeof
22e60 28 2a 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 (*pFunctionList)
22e70 29 3b 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 );...pFunctionLi
22e80 73 74 2d 3e 76 65 72 73 69 6f 6e 2e 6d 61 6a 6f st->version.majo
22e90 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 52 59 r = ((CACKEY_CRY
22ea0 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f PTOKI_VERSION_CO
22eb0 44 45 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66 DE) >> 16) & 0xf
22ec0 66 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 f;..pFunctionLis
22ed0 74 2d 3e 76 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 t->version.minor
22ee0 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 52 59 50 = ((CACKEY_CRYP
22ef0 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 TOKI_VERSION_COD
22f00 45 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b E) >> 8) & 0xff;
22f10 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 ...pFunctionList
22f20 2d 3e 43 5f 49 6e 69 74 69 61 6c 69 7a 65 20 3d ->C_Initialize =
22f30 20 43 5f 49 6e 69 74 69 61 6c 69 7a 65 3b 0a 09 C_Initialize;..
22f40 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 pFunctionList->C
22f50 5f 46 69 6e 61 6c 69 7a 65 20 3d 20 43 5f 46 69 _Finalize = C_Fi
22f60 6e 61 6c 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69 nalize;..pFuncti
22f70 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 49 6e 66 onList->C_GetInf
22f80 6f 20 3d 20 43 5f 47 65 74 49 6e 66 6f 3b 0a 09 o = C_GetInfo;..
22f90 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 pFunctionList->C
22fa0 5f 47 65 74 53 6c 6f 74 4c 69 73 74 20 3d 20 43 _GetSlotList = C
22fb0 5f 47 65 74 53 6c 6f 74 4c 69 73 74 3b 0a 09 70 _GetSlotList;..p
22fc0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f FunctionList->C_
22fd0 47 65 74 53 6c 6f 74 49 6e 66 6f 20 3d 20 43 5f GetSlotInfo = C_
22fe0 47 65 74 53 6c 6f 74 49 6e 66 6f 3b 0a 09 70 46 GetSlotInfo;..pF
22ff0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 unctionList->C_G
23000 65 74 54 6f 6b 65 6e 49 6e 66 6f 20 3d 20 43 5f etTokenInfo = C_
23010 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 3b 0a 09 70 GetTokenInfo;..p
23020 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f FunctionList->C_
23030 57 61 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74 WaitForSlotEvent
23040 20 3d 20 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74 = C_WaitForSlot
23050 45 76 65 6e 74 3b 0a 09 70 46 75 6e 63 74 69 6f Event;..pFunctio
23060 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4d 65 63 68 nList->C_GetMech
23070 61 6e 69 73 6d 4c 69 73 74 20 3d 20 43 5f 47 65 anismList = C_Ge
23080 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 3b 0a tMechanismList;.
23090 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e .pFunctionList->
230a0 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e C_GetMechanismIn
230b0 66 6f 20 3d 20 43 5f 47 65 74 4d 65 63 68 61 6e fo = C_GetMechan
230c0 69 73 6d 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 ismInfo;..pFunct
230d0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 54 ionList->C_InitT
230e0 6f 6b 65 6e 20 3d 20 43 5f 49 6e 69 74 54 6f 6b oken = C_InitTok
230f0 65 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 en;..pFunctionLi
23100 73 74 2d 3e 43 5f 49 6e 69 74 50 49 4e 20 3d 20 st->C_InitPIN =
23110 43 5f 49 6e 69 74 50 49 4e 3b 0a 09 70 46 75 6e C_InitPIN;..pFun
23120 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 ctionList->C_Set
23130 50 49 4e 20 3d 20 43 5f 53 65 74 50 49 4e 3b 0a PIN = C_SetPIN;.
23140 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e .pFunctionList->
23150 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 20 3d 20 C_OpenSession =
23160 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 3b 0a 09 C_OpenSession;..
23170 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 pFunctionList->C
23180 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 20 3d 20 _CloseSession =
23190 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 3b 0a C_CloseSession;.
231a0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e .pFunctionList->
231b0 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f C_CloseAllSessio
231c0 6e 73 20 3d 20 43 5f 43 6c 6f 73 65 41 6c 6c 53 ns = C_CloseAllS
231d0 65 73 73 69 6f 6e 73 3b 0a 09 70 46 75 6e 63 74 essions;..pFunct
231e0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 65 ionList->C_GetSe
231f0 73 73 69 6f 6e 49 6e 66 6f 20 3d 20 43 5f 47 65 ssionInfo = C_Ge
23200 74 53 65 73 73 69 6f 6e 49 6e 66 6f 3b 0a 09 70 tSessionInfo;..p
23210 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f FunctionList->C_
23220 47 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 GetOperationStat
23230 65 20 3d 20 43 5f 47 65 74 4f 70 65 72 61 74 69 e = C_GetOperati
23240 6f 6e 53 74 61 74 65 3b 0a 09 70 46 75 6e 63 74 onState;..pFunct
23250 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 4f 70 ionList->C_SetOp
23260 65 72 61 74 69 6f 6e 53 74 61 74 65 20 3d 20 43 erationState = C
23270 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 _SetOperationSta
23280 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 te;..pFunctionLi
23290 73 74 2d 3e 43 5f 4c 6f 67 69 6e 20 3d 20 43 5f st->C_Login = C_
232a0 4c 6f 67 69 6e 3b 0a 09 70 46 75 6e 63 74 69 6f Login;..pFunctio
232b0 6e 4c 69 73 74 2d 3e 43 5f 4c 6f 67 6f 75 74 20 nList->C_Logout
232c0 3d 20 43 5f 4c 6f 67 6f 75 74 3b 0a 09 70 46 75 = C_Logout;..pFu
232d0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 72 nctionList->C_Cr
232e0 65 61 74 65 4f 62 6a 65 63 74 20 3d 20 43 5f 43 eateObject = C_C
232f0 72 65 61 74 65 4f 62 6a 65 63 74 3b 0a 09 70 46 reateObject;..pF
23300 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 unctionList->C_C
23310 6f 70 79 4f 62 6a 65 63 74 20 3d 20 43 5f 43 6f opyObject = C_Co
23320 70 79 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e 63 pyObject;..pFunc
23330 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 73 74 tionList->C_Dest
23340 72 6f 79 4f 62 6a 65 63 74 20 3d 20 43 5f 44 65 royObject = C_De
23350 73 74 72 6f 79 4f 62 6a 65 63 74 3b 0a 09 70 46 stroyObject;..pF
23360 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 unctionList->C_G
23370 65 74 4f 62 6a 65 63 74 53 69 7a 65 20 3d 20 43 etObjectSize = C
23380 5f 47 65 74 4f 62 6a 65 63 74 53 69 7a 65 3b 0a _GetObjectSize;.
23390 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e .pFunctionList->
233a0 43 5f 47 65 74 41 74 74 72 69 62 75 74 65 56 61 C_GetAttributeVa
233b0 6c 75 65 20 3d 20 43 5f 47 65 74 41 74 74 72 69 lue = C_GetAttri
233c0 62 75 74 65 56 61 6c 75 65 3b 0a 09 70 46 75 6e buteValue;..pFun
233d0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 ctionList->C_Set
233e0 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 20 3d AttributeValue =
233f0 20 43 5f 53 65 74 41 74 74 72 69 62 75 74 65 56 C_SetAttributeV
23400 61 6c 75 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e alue;..pFunction
23410 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 List->C_FindObje
23420 63 74 73 49 6e 69 74 20 3d 20 43 5f 46 69 6e 64 ctsInit = C_Find
23430 4f 62 6a 65 63 74 73 49 6e 69 74 3b 0a 09 70 46 ObjectsInit;..pF
23440 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 unctionList->C_F
23450 69 6e 64 4f 62 6a 65 63 74 73 20 3d 20 43 5f 46 indObjects = C_F
23460 69 6e 64 4f 62 6a 65 63 74 73 3b 0a 09 70 46 75 indObjects;..pFu
23470 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 nctionList->C_Fi
23480 6e 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c 20 3d ndObjectsFinal =
23490 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46 69 C_FindObjectsFi
234a0 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c nal;..pFunctionL
234b0 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 49 6e ist->C_EncryptIn
234c0 69 74 20 3d 20 43 5f 45 6e 63 72 79 70 74 49 6e it = C_EncryptIn
234d0 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 it;..pFunctionLi
234e0 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 20 3d 20 st->C_Encrypt =
234f0 43 5f 45 6e 63 72 79 70 74 3b 0a 09 70 46 75 6e C_Encrypt;..pFun
23500 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 ctionList->C_Enc
23510 72 79 70 74 55 70 64 61 74 65 20 3d 20 43 5f 45 ryptUpdate = C_E
23520 6e 63 72 79 70 74 55 70 64 61 74 65 3b 0a 09 70 ncryptUpdate;..p
23530 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f FunctionList->C_
23540 45 6e 63 72 79 70 74 46 69 6e 61 6c 20 3d 20 43 EncryptFinal = C
23550 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c 3b 0a 09 _EncryptFinal;..
23560 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 pFunctionList->C
23570 5f 44 65 63 72 79 70 74 49 6e 69 74 20 3d 20 43 _DecryptInit = C
23580 5f 44 65 63 72 79 70 74 49 6e 69 74 3b 0a 09 70 _DecryptInit;..p
23590 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f FunctionList->C_
235a0 44 65 63 72 79 70 74 20 3d 20 43 5f 44 65 63 72 Decrypt = C_Decr
235b0 79 70 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c ypt;..pFunctionL
235c0 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 55 70 ist->C_DecryptUp
235d0 64 61 74 65 20 3d 20 43 5f 44 65 63 72 79 70 74 date = C_Decrypt
235e0 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 Update;..pFuncti
235f0 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 onList->C_Decryp
23600 74 46 69 6e 61 6c 20 3d 20 43 5f 44 65 63 72 79 tFinal = C_Decry
23610 70 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 ptFinal;..pFunct
23620 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 ionList->C_Diges
23630 74 49 6e 69 74 20 3d 20 43 5f 44 69 67 65 73 74 tInit = C_Digest
23640 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e Init;..pFunction
23650 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 20 3d List->C_Digest =
23660 20 43 5f 44 69 67 65 73 74 3b 0a 09 70 46 75 6e C_Digest;..pFun
23670 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 ctionList->C_Dig
23680 65 73 74 55 70 64 61 74 65 20 3d 20 43 5f 44 69 estUpdate = C_Di
23690 67 65 73 74 55 70 64 61 74 65 3b 0a 09 70 46 75 gestUpdate;..pFu
236a0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 nctionList->C_Di
236b0 67 65 73 74 4b 65 79 20 3d 20 43 5f 44 69 67 65 gestKey = C_Dige
236c0 73 74 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f stKey;..pFunctio
236d0 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 46 nList->C_DigestF
236e0 69 6e 61 6c 20 3d 20 43 5f 44 69 67 65 73 74 46 inal = C_DigestF
236f0 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e inal;..pFunction
23700 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 49 6e 69 74 List->C_SignInit
23710 20 3d 20 43 5f 53 69 67 6e 49 6e 69 74 3b 0a 09 = C_SignInit;..
23720 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 pFunctionList->C
23730 5f 53 69 67 6e 20 3d 20 43 5f 53 69 67 6e 3b 0a _Sign = C_Sign;.
23740 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e .pFunctionList->
23750 43 5f 53 69 67 6e 55 70 64 61 74 65 20 3d 20 43 C_SignUpdate = C
23760 5f 53 69 67 6e 55 70 64 61 74 65 3b 0a 09 70 46 _SignUpdate;..pF
23770 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 unctionList->C_S
23780 69 67 6e 46 69 6e 61 6c 20 3d 20 43 5f 53 69 67 ignFinal = C_Sig
23790 6e 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 nFinal;..pFuncti
237a0 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 52 65 onList->C_SignRe
237b0 63 6f 76 65 72 49 6e 69 74 20 3d 20 43 5f 53 69 coverInit = C_Si
237c0 67 6e 52 65 63 6f 76 65 72 49 6e 69 74 3b 0a 09 gnRecoverInit;..
237d0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 pFunctionList->C
237e0 5f 53 69 67 6e 52 65 63 6f 76 65 72 20 3d 20 43 _SignRecover = C
237f0 5f 53 69 67 6e 52 65 63 6f 76 65 72 3b 0a 09 70 _SignRecover;..p
23800 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f FunctionList->C_
23810 56 65 72 69 66 79 49 6e 69 74 20 3d 20 43 5f 56 VerifyInit = C_V
23820 65 72 69 66 79 49 6e 69 74 3b 0a 09 70 46 75 6e erifyInit;..pFun
23830 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 ctionList->C_Ver
23840 69 66 79 20 3d 20 43 5f 56 65 72 69 66 79 3b 0a ify = C_Verify;.
23850 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e .pFunctionList->
23860 43 5f 56 65 72 69 66 79 55 70 64 61 74 65 20 3d C_VerifyUpdate =
23870 20 43 5f 56 65 72 69 66 79 55 70 64 61 74 65 3b C_VerifyUpdate;
23880 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d ..pFunctionList-
23890 3e 43 5f 56 65 72 69 66 79 46 69 6e 61 6c 20 3d >C_VerifyFinal =
238a0 20 43 5f 56 65 72 69 66 79 46 69 6e 61 6c 3b 0a C_VerifyFinal;.
238b0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e .pFunctionList->
238c0 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 49 C_VerifyRecoverI
238d0 6e 69 74 20 3d 20 43 5f 56 65 72 69 66 79 52 65 nit = C_VerifyRe
238e0 63 6f 76 65 72 49 6e 69 74 3b 0a 09 70 46 75 6e coverInit;..pFun
238f0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 ctionList->C_Ver
23900 69 66 79 52 65 63 6f 76 65 72 20 3d 20 43 5f 56 ifyRecover = C_V
23910 65 72 69 66 79 52 65 63 6f 76 65 72 3b 0a 09 70 erifyRecover;..p
23920 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f FunctionList->C_
23930 44 69 67 65 73 74 45 6e 63 72 79 70 74 55 70 64 DigestEncryptUpd
23940 61 74 65 20 3d 20 43 5f 44 69 67 65 73 74 45 6e ate = C_DigestEn
23950 63 72 79 70 74 55 70 64 61 74 65 3b 0a 09 70 46 cryptUpdate;..pF
23960 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 unctionList->C_D
23970 65 63 72 79 70 74 44 69 67 65 73 74 55 70 64 61 ecryptDigestUpda
23980 74 65 20 3d 20 43 5f 44 65 63 72 79 70 74 44 69 te = C_DecryptDi
23990 67 65 73 74 55 70 64 61 74 65 3b 0a 09 70 46 75 gestUpdate;..pFu
239a0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 nctionList->C_Si
239b0 67 6e 45 6e 63 72 79 70 74 55 70 64 61 74 65 20 gnEncryptUpdate
239c0 3d 20 43 5f 53 69 67 6e 45 6e 63 72 79 70 74 55 = C_SignEncryptU
239d0 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f pdate;..pFunctio
239e0 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 nList->C_Decrypt
239f0 56 65 72 69 66 79 55 70 64 61 74 65 20 3d 20 43 VerifyUpdate = C
23a00 5f 44 65 63 72 79 70 74 56 65 72 69 66 79 55 70 _DecryptVerifyUp
23a10 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e date;..pFunction
23a20 4c 69 73 74 2d 3e 43 5f 47 65 6e 65 72 61 74 65 List->C_Generate
23a30 4b 65 79 20 3d 20 43 5f 47 65 6e 65 72 61 74 65 Key = C_Generate
23a40 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c Key;..pFunctionL
23a50 69 73 74 2d 3e 43 5f 47 65 6e 65 72 61 74 65 4b ist->C_GenerateK
23a60 65 79 50 61 69 72 20 3d 20 43 5f 47 65 6e 65 72 eyPair = C_Gener
23a70 61 74 65 4b 65 79 50 61 69 72 3b 0a 09 70 46 75 ateKeyPair;..pFu
23a80 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 57 72 nctionList->C_Wr
23a90 61 70 4b 65 79 20 3d 20 43 5f 57 72 61 70 4b 65 apKey = C_WrapKe
23aa0 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 y;..pFunctionLis
23ab0 74 2d 3e 43 5f 55 6e 77 72 61 70 4b 65 79 20 3d t->C_UnwrapKey =
23ac0 20 43 5f 55 6e 77 72 61 70 4b 65 79 3b 0a 09 70 C_UnwrapKey;..p
23ad0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f FunctionList->C_
23ae0 44 65 72 69 76 65 4b 65 79 20 3d 20 43 5f 44 65 DeriveKey = C_De
23af0 72 69 76 65 4b 65 79 3b 0a 09 70 46 75 6e 63 74 riveKey;..pFunct
23b00 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 65 64 52 ionList->C_SeedR
23b10 61 6e 64 6f 6d 20 3d 20 43 5f 53 65 65 64 52 61 andom = C_SeedRa
23b20 6e 64 6f 6d 3b 0a 09 70 46 75 6e 63 74 69 6f 6e ndom;..pFunction
23b30 4c 69 73 74 2d 3e 43 5f 47 65 6e 65 72 61 74 65 List->C_Generate
23b40 52 61 6e 64 6f 6d 20 3d 20 43 5f 47 65 6e 65 72 Random = C_Gener
23b50 61 74 65 52 61 6e 64 6f 6d 3b 0a 09 70 46 75 6e ateRandom;..pFun
23b60 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 ctionList->C_Get
23b70 46 75 6e 63 74 69 6f 6e 53 74 61 74 75 73 20 3d FunctionStatus =
23b80 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53 74 C_GetFunctionSt
23b90 61 74 75 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e atus;..pFunction
23ba0 4c 69 73 74 2d 3e 43 5f 43 61 6e 63 65 6c 46 75 List->C_CancelFu
23bb0 6e 63 74 69 6f 6e 20 3d 20 43 5f 43 61 6e 63 65 nction = C_Cance
23bc0 6c 46 75 6e 63 74 69 6f 6e 3b 0a 09 70 46 75 6e lFunction;..pFun
23bd0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 ctionList->C_Get
23be0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 43 FunctionList = C
23bf0 5f 47 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73 74 _GetFunctionList
23c00 3b 0a 0a 09 2a 70 70 46 75 6e 63 74 69 6f 6e 4c ;...*ppFunctionL
23c10 69 73 74 20 3d 20 70 46 75 6e 63 74 69 6f 6e 4c ist = pFunctionL
23c20 69 73 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ist;...CACKEY_DE
23c30 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
23c40 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 rning CKR_OK (%i
23c50 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 )", CKR_OK);...r
23c60 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d eturn(CKR_OK);.}
23c70 0a 0a ..