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 53 54 44 .#ifdef HAVE_STD
0210: 49 4f 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 IO_H.# include
0220: 3c 73 74 64 69 6f 2e 68 3e 0a 23 65 6e 64 69 66 <stdio.h>.#endif
0230: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 5a 4c 49 .#ifdef HAVE_ZLI
0240: 42 5f 48 0a 23 20 20 69 66 64 65 66 20 48 41 56 B_H.# ifdef HAV
0250: 45 5f 4c 49 42 5a 0a 23 20 20 20 20 69 6e 63 6c E_LIBZ.# incl
0260: 75 64 65 20 3c 7a 6c 69 62 2e 68 3e 0a 23 20 20 ude <zlib.h>.#
0270: 65 6e 64 69 66 0a 23 65 6c 73 65 0a 23 20 20 69 endif.#else.# i
0280: 66 64 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 23 fdef HAVE_LIBZ.#
0290: 20 20 20 20 75 6e 64 65 66 20 48 41 56 45 5f 4c undef HAVE_L
02a0: 49 42 5a 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e IBZ.# endif.#en
02b0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 43 4b 5f dif..#define CK_
02c0: 50 54 52 20 2a 0a 23 64 65 66 69 6e 65 20 43 4b PTR *.#define CK
02d0: 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e _DEFINE_FUNCTION
02e0: 28 72 65 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d (returnType, nam
02f0: 65 29 20 72 65 74 75 72 6e 54 79 70 65 20 6e 61 e) returnType na
0300: 6d 65 0a 23 64 65 66 69 6e 65 20 43 4b 5f 44 45 me.#define CK_DE
0310: 43 4c 41 52 45 5f 46 55 4e 43 54 49 4f 4e 28 72 CLARE_FUNCTION(r
0320: 65 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d 65 29 eturnType, name)
0330: 20 72 65 74 75 72 6e 54 79 70 65 20 6e 61 6d 65 returnType name
0340: 0a 23 64 65 66 69 6e 65 20 43 4b 5f 44 45 43 4c .#define CK_DECL
0350: 41 52 45 5f 46 55 4e 43 54 49 4f 4e 5f 50 4f 49 ARE_FUNCTION_POI
0360: 4e 54 45 52 28 72 65 74 75 72 6e 54 79 70 65 2c NTER(returnType,
0370: 20 6e 61 6d 65 29 20 72 65 74 75 72 6e 54 79 70 name) returnTyp
0380: 65 20 28 2a 20 6e 61 6d 65 29 0a 23 64 65 66 69 e (* name).#defi
0390: 6e 65 20 43 4b 5f 43 41 4c 4c 42 41 43 4b 5f 46 ne CK_CALLBACK_F
03a0: 55 4e 43 54 49 4f 4e 28 72 65 74 75 72 6e 54 79 UNCTION(returnTy
03b0: 70 65 2c 20 6e 61 6d 65 29 20 72 65 74 75 72 6e pe, name) return
03c0: 54 79 70 65 20 28 2a 20 6e 61 6d 65 29 0a 23 69 Type (* name).#i
03d0: 66 6e 64 65 66 20 4e 55 4c 4c 5f 50 54 52 0a 23 fndef NULL_PTR.#
03e0: 20 20 64 65 66 69 6e 65 20 4e 55 4c 4c 5f 50 54 define NULL_PT
03f0: 52 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69 6e 63 R 0.#endif..#inc
0400: 6c 75 64 65 20 22 70 6b 63 73 31 31 2e 68 22 0a lude "pkcs11.h".
0410: 23 69 6e 63 6c 75 64 65 20 22 61 73 6e 31 2d 78 #include "asn1-x
0420: 35 30 39 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 509.h"..#ifndef
0430: 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f CACKEY_CRYPTOKI_
0440: 56 45 52 53 49 4f 4e 5f 43 4f 44 45 0a 23 20 20 VERSION_CODE.#
0450: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 43 52 define CACKEY_CR
0460: 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 YPTOKI_VERSION_C
0470: 4f 44 45 20 30 78 30 32 31 65 30 30 0a 23 65 6e ODE 0x021e00.#en
0480: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 43 4b 41 dif..#ifndef CKA
0490: 5f 54 52 55 53 54 5f 53 45 52 56 45 52 5f 41 55 _TRUST_SERVER_AU
04a0: 54 48 0a 23 20 20 64 65 66 69 6e 65 20 43 4b 41 TH.# define CKA
04b0: 5f 54 52 55 53 54 5f 53 45 52 56 45 52 5f 41 55 _TRUST_SERVER_AU
04c0: 54 48 20 30 78 63 65 35 33 36 33 35 38 0a 23 65 TH 0xce536358.#e
04d0: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 43 4b 41 ndif.#ifndef CKA
04e0: 5f 54 52 55 53 54 5f 43 4c 49 45 4e 54 5f 41 55 _TRUST_CLIENT_AU
04f0: 54 48 0a 23 20 20 64 65 66 69 6e 65 20 43 4b 41 TH.# define CKA
0500: 5f 54 52 55 53 54 5f 43 4c 49 45 4e 54 5f 41 55 _TRUST_CLIENT_AU
0510: 54 48 20 30 78 63 65 35 33 36 33 35 39 0a 23 65 TH 0xce536359.#e
0520: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 43 4b 41 ndif.#ifndef CKA
0530: 5f 54 52 55 53 54 5f 43 4f 44 45 5f 53 49 47 4e _TRUST_CODE_SIGN
0540: 49 4e 47 0a 23 20 20 64 65 66 69 6e 65 20 43 4b ING.# define CK
0550: 41 5f 54 52 55 53 54 5f 43 4f 44 45 5f 53 49 47 A_TRUST_CODE_SIG
0560: 4e 49 4e 47 20 30 78 63 65 35 33 36 33 35 61 0a NING 0xce53635a.
0570: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 43 #endif.#ifndef C
0580: 4b 41 5f 54 52 55 53 54 5f 45 4d 41 49 4c 5f 50 KA_TRUST_EMAIL_P
0590: 52 4f 54 45 43 54 49 4f 4e 0a 23 20 20 64 65 66 ROTECTION.# def
05a0: 69 6e 65 20 43 4b 41 5f 54 52 55 53 54 5f 45 4d ine CKA_TRUST_EM
05b0: 41 49 4c 5f 50 52 4f 54 45 43 54 49 4f 4e 20 30 AIL_PROTECTION 0
05c0: 78 63 65 35 33 36 33 35 62 0a 23 65 6e 64 69 66 xce53635b.#endif
05d0: 0a 0a 2f 2a 20 47 53 43 2d 49 53 20 76 32 2e 31 ../* GSC-IS v2.1
05e0: 20 44 65 66 69 6e 69 74 69 6f 6e 73 20 2a 2f 0a Definitions */.
05f0: 2f 2a 2a 20 43 6c 61 73 73 65 73 20 2a 2a 2f 0a /** Classes **/.
0600: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 43 4c #define GSCIS_CL
0610: 41 53 53 5f 49 53 4f 37 38 31 36 20 20 20 20 20 ASS_ISO7816
0620: 20 20 20 20 20 20 30 78 30 30 0a 23 64 65 66 69 0x00.#defi
0630: 6e 65 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 47 ne GSCIS_CLASS_G
0640: 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 20 20 LOBAL_PLATFORM
0650: 20 30 78 38 30 0a 0a 2f 2a 2a 20 49 6e 73 74 72 0x80../** Instr
0660: 75 63 74 69 6f 6e 73 20 2a 2a 2f 0a 23 64 65 66 uctions **/.#def
0670: 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f ine GSCIS_INSTR_
0680: 47 45 54 5f 52 45 53 50 4f 4e 53 45 20 20 20 20 GET_RESPONSE
0690: 20 20 30 78 43 30 0a 23 64 65 66 69 6e 65 20 47 0xC0.#define G
06a0: 53 43 49 53 5f 49 4e 53 54 52 5f 52 45 41 44 5f SCIS_INSTR_READ_
06b0: 42 49 4e 41 52 59 20 20 20 20 20 20 20 30 78 42 BINARY 0xB
06c0: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 0.#define GSCIS_
06d0: 49 4e 53 54 52 5f 55 50 44 41 54 45 5f 42 49 4e INSTR_UPDATE_BIN
06e0: 41 52 59 20 20 20 20 20 30 78 44 36 0a 23 64 65 ARY 0xD6.#de
06f0: 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 fine GSCIS_INSTR
0700: 5f 53 45 4c 45 43 54 20 20 20 20 20 20 20 20 20 _SELECT
0710: 20 20 20 30 78 41 34 0a 23 64 65 66 69 6e 65 20 0xA4.#define
0720: 47 53 43 49 53 5f 49 4e 53 54 52 5f 45 58 54 45 GSCIS_INSTR_EXTE
0730: 52 4e 41 4c 5f 41 55 54 48 20 20 20 20 20 30 78 RNAL_AUTH 0x
0740: 38 32 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 82.#define GSCIS
0750: 5f 49 4e 53 54 52 5f 47 45 54 5f 43 48 41 4c 4c _INSTR_GET_CHALL
0760: 45 4e 47 45 20 20 20 20 20 30 78 38 34 0a 23 64 ENGE 0x84.#d
0770: 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 efine GSCIS_INST
0780: 52 5f 49 4e 54 45 52 4e 41 4c 5f 41 55 54 48 20 R_INTERNAL_AUTH
0790: 20 20 20 20 30 78 38 38 0a 23 64 65 66 69 6e 65 0x88.#define
07a0: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 56 45 52 GSCIS_INSTR_VER
07b0: 49 46 59 20 20 20 20 20 20 20 20 20 20 20 20 30 IFY 0
07c0: 78 32 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 x20.#define GSCI
07d0: 53 5f 49 4e 53 54 52 5f 53 49 47 4e 20 20 20 20 S_INSTR_SIGN
07e0: 20 20 20 20 20 20 20 20 20 20 30 78 32 41 0a 23 0x2A.#
07f0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 define GSCIS_INS
0800: 54 52 5f 47 45 54 5f 50 52 4f 50 20 20 20 20 20 TR_GET_PROP
0810: 20 20 20 20 20 30 78 35 36 0a 23 64 65 66 69 6e 0x56.#defin
0820: 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45 e GSCIS_INSTR_GE
0830: 54 5f 41 43 52 20 20 20 20 20 20 20 20 20 20 20 T_ACR
0840: 30 78 34 43 0a 23 64 65 66 69 6e 65 20 47 53 43 0x4C.#define GSC
0850: 49 53 5f 49 4e 53 54 52 5f 52 45 41 44 5f 42 55 IS_INSTR_READ_BU
0860: 46 46 45 52 20 20 20 20 20 20 20 30 78 35 32 0a FFER 0x52.
0870: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e #define GSCIS_IN
0880: 53 54 52 5f 53 49 47 4e 44 45 43 52 59 50 54 20 STR_SIGNDECRYPT
0890: 20 20 20 20 20 20 30 78 34 32 0a 0a 23 64 65 66 0x42..#def
08a0: 69 6e 65 20 47 53 43 49 53 5f 50 41 52 41 4d 5f ine GSCIS_PARAM_
08b0: 53 45 4c 45 43 54 5f 41 50 50 4c 45 54 20 20 20 SELECT_APPLET
08c0: 20 20 30 78 30 34 0a 0a 2f 2a 2a 20 54 61 67 73 0x04../** Tags
08d0: 20 2a 2a 2f 0a 2f 2a 2a 2a 20 43 43 43 20 54 61 **/./*** CCC Ta
08e0: 67 73 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 gs ***/.#define
08f0: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 GSCIS_TAG_CARDID
0900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 0x
0910: 46 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 F0.#define GSCIS
0920: 5f 54 41 47 5f 43 43 43 5f 56 45 52 20 20 20 20 _TAG_CCC_VER
0930: 20 20 20 20 20 20 20 20 20 30 78 46 31 0a 23 64 0xF1.#d
0940: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f efine GSCIS_TAG_
0950: 43 43 47 5f 56 45 52 20 20 20 20 20 20 20 20 20 CCG_VER
0960: 20 20 20 20 30 78 46 32 0a 23 64 65 66 69 6e 65 0xF2.#define
0970: 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55 GSCIS_TAG_CARDU
0980: 52 4c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 RL 0
0990: 78 46 33 0a 23 64 65 66 69 6e 65 20 47 53 43 49 xF3.#define GSCI
09a0: 53 5f 54 41 47 5f 50 4b 43 53 31 35 20 20 20 20 S_TAG_PKCS15
09b0: 20 20 20 20 20 20 20 20 20 20 30 78 46 34 0a 23 0xF4.#
09c0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 define GSCIS_TAG
09d0: 5f 52 45 47 5f 44 41 54 41 5f 4d 4f 44 45 4c 20 _REG_DATA_MODEL
09e0: 20 20 20 20 20 30 78 46 35 0a 23 64 65 66 69 6e 0xF5.#defin
09f0: 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f e GSCIS_TAG_ACR_
0a00: 54 41 42 4c 45 20 20 20 20 20 20 20 20 20 20 20 TABLE
0a10: 30 78 46 36 0a 23 64 65 66 69 6e 65 20 47 53 43 0xF6.#define GSC
0a20: 49 53 5f 54 41 47 5f 43 41 52 44 5f 41 50 44 55 IS_TAG_CARD_APDU
0a30: 20 20 20 20 20 20 20 20 20 20 20 30 78 46 37 0a 0xF7.
0a40: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 #define GSCIS_TA
0a50: 47 5f 52 45 44 49 52 45 43 54 49 4f 4e 20 20 20 G_REDIRECTION
0a60: 20 20 20 20 20 20 30 78 46 41 0a 23 64 65 66 69 0xFA.#defi
0a70: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 54 20 ne GSCIS_TAG_CT
0a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0a90: 20 30 78 46 42 0a 23 64 65 66 69 6e 65 20 47 53 0xFB.#define GS
0aa0: 43 49 53 5f 54 41 47 5f 53 54 20 20 20 20 20 20 CIS_TAG_ST
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 46 43 0xFC
0ac0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 .#define GSCIS_T
0ad0: 41 47 5f 4e 45 58 54 43 43 43 20 20 20 20 20 20 AG_NEXTCCC
0ae0: 20 20 20 20 20 20 20 30 78 46 44 0a 0a 2f 2a 2a 0xFD../**
0af0: 2a 20 47 65 6e 65 72 61 6c 20 2d 20 45 46 20 32 * General - EF 2
0b00: 32 30 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 200 ***/.#define
0b10: 20 47 53 43 49 53 5f 54 41 47 5f 46 4e 41 4d 45 GSCIS_TAG_FNAME
0b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0
0b30: 78 30 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49 x01.#define GSCI
0b40: 53 5f 54 41 47 5f 4d 4e 41 4d 45 20 20 20 20 20 S_TAG_MNAME
0b50: 20 20 20 20 20 20 20 20 20 20 30 78 30 32 0a 23 0x02.#
0b60: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 define GSCIS_TAG
0b70: 5f 4c 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20 _LNAME
0b80: 20 20 20 20 20 30 78 30 33 0a 23 64 65 66 69 6e 0x03.#defin
0b90: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 55 46 46 e GSCIS_TAG_SUFF
0ba0: 49 58 20 20 20 20 20 20 20 20 20 20 20 20 20 20 IX
0bb0: 30 78 30 34 0a 23 64 65 66 69 6e 65 20 47 53 43 0x04.#define GSC
0bc0: 49 53 5f 54 41 47 5f 47 4f 56 54 5f 41 47 45 4e IS_TAG_GOVT_AGEN
0bd0: 43 59 20 20 20 20 20 20 20 20 20 30 78 30 35 0a CY 0x05.
0be0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 #define GSCIS_TA
0bf0: 47 5f 42 55 52 45 41 55 20 20 20 20 20 20 20 20 G_BUREAU
0c00: 20 20 20 20 20 20 30 78 30 36 0a 23 64 65 66 69 0x06.#defi
0c10: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 52 ne GSCIS_TAG_BUR
0c20: 45 41 55 5f 43 4f 44 45 20 20 20 20 20 20 20 20 EAU_CODE
0c30: 20 30 78 30 37 0a 23 64 65 66 69 6e 65 20 47 53 0x07.#define GS
0c40: 43 49 53 5f 54 41 47 5f 44 45 50 54 5f 43 4f 44 CIS_TAG_DEPT_COD
0c50: 45 20 20 20 20 20 20 20 20 20 20 20 30 78 30 38 E 0x08
0c60: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 .#define GSCIS_T
0c70: 41 47 5f 54 49 54 4c 45 20 20 20 20 20 20 20 20 AG_TITLE
0c80: 20 20 20 20 20 20 20 30 78 30 39 0a 23 64 65 66 0x09.#def
0c90: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 ine GSCIS_TAG_BU
0ca0: 49 4c 44 49 4e 47 20 20 20 20 20 20 20 20 20 20 ILDING
0cb0: 20 20 30 78 31 30 0a 23 64 65 66 69 6e 65 20 47 0x10.#define G
0cc0: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f SCIS_TAG_OFFICE_
0cd0: 41 44 44 52 31 20 20 20 20 20 20 20 20 30 78 31 ADDR1 0x1
0ce0: 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 1.#define GSCIS_
0cf0: 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 32 TAG_OFFICE_ADDR2
0d00: 20 20 20 20 20 20 20 20 30 78 31 32 0a 23 64 65 0x12.#de
0d10: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f fine GSCIS_TAG_O
0d20: 46 46 49 43 45 5f 43 49 54 59 20 20 20 20 20 20 FFICE_CITY
0d30: 20 20 20 30 78 31 33 0a 23 64 65 66 69 6e 65 20 0x13.#define
0d40: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 GSCIS_TAG_OFFICE
0d50: 5f 53 54 41 54 45 20 20 20 20 20 20 20 20 30 78 _STATE 0x
0d60: 31 34 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 14.#define GSCIS
0d70: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 5a 49 50 20 _TAG_OFFICE_ZIP
0d80: 20 20 20 20 20 20 20 20 20 30 78 31 35 0a 23 64 0x15.#d
0d90: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f efine GSCIS_TAG_
0da0: 4f 46 46 49 43 45 5f 43 4f 55 4e 54 52 59 20 20 OFFICE_COUNTRY
0db0: 20 20 20 20 30 78 31 36 0a 23 64 65 66 69 6e 65 0x16.#define
0dc0: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 GSCIS_TAG_OFFIC
0dd0: 45 5f 50 48 4f 4e 45 20 20 20 20 20 20 20 20 30 E_PHONE 0
0de0: 78 31 37 0a 23 64 65 66 69 6e 65 20 47 53 43 49 x17.#define GSCI
0df0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f S_TAG_OFFICE_PHO
0e00: 4e 45 5f 45 58 54 20 20 20 20 30 78 31 38 0a 23 NE_EXT 0x18.#
0e10: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 define GSCIS_TAG
0e20: 5f 4f 46 46 49 43 45 5f 46 41 58 20 20 20 20 20 _OFFICE_FAX
0e30: 20 20 20 20 20 30 78 31 39 0a 23 64 65 66 69 6e 0x19.#defin
0e40: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 e GSCIS_TAG_OFFI
0e50: 43 45 5f 45 4d 41 49 4c 20 20 20 20 20 20 20 20 CE_EMAIL
0e60: 30 78 31 41 0a 23 64 65 66 69 6e 65 20 47 53 43 0x1A.#define GSC
0e70: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52 4f IS_TAG_OFFICE_RO
0e80: 4f 4d 20 20 20 20 20 20 20 20 20 30 78 31 42 0a OM 0x1B.
0e90: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 #define GSCIS_TA
0ea0: 47 5f 4e 4f 4e 47 4f 56 5f 41 47 45 4e 43 59 20 G_NONGOV_AGENCY
0eb0: 20 20 20 20 20 20 30 78 31 43 0a 23 64 65 66 69 0x1C.#defi
0ec0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53 53 4e ne GSCIS_TAG_SSN
0ed0: 5f 44 45 53 49 47 4e 41 54 4f 52 20 20 20 20 20 _DESIGNATOR
0ee0: 20 30 78 31 44 0a 0a 2f 2a 2a 2a 20 50 49 49 20 0x1D../*** PII
0ef0: 2d 20 45 46 20 32 31 30 30 20 2a 2a 2a 2f 0a 23 - EF 2100 ***/.#
0f00: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 define GSCIS_TAG
0f10: 5f 53 53 4e 20 20 20 20 20 20 20 20 20 20 20 20 _SSN
0f20: 20 20 20 20 20 30 78 32 30 0a 23 64 65 66 69 6e 0x20.#defin
0f30: 65 20 47 53 43 49 53 5f 54 41 47 5f 44 4f 42 20 e GSCIS_TAG_DOB
0f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0f50: 30 78 32 31 0a 23 64 65 66 69 6e 65 20 47 53 43 0x21.#define GSC
0f60: 49 53 5f 54 41 47 5f 47 45 4e 44 45 52 20 20 20 IS_TAG_GENDER
0f70: 20 20 20 20 20 20 20 20 20 20 20 30 78 32 32 0a 0x22.
0f80: 0a 2f 2a 2a 2a 20 4c 6f 67 69 6e 20 49 6e 66 6f ./*** Login Info
0f90: 72 6d 61 74 69 6f 6e 20 2d 20 45 46 20 34 30 30 rmation - EF 400
0fa0: 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 0 ***/.#define G
0fb0: 53 43 49 53 5f 54 41 47 5f 55 53 45 52 49 44 20 SCIS_TAG_USERID
0fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 34 0x4
0fd0: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 0.#define GSCIS_
0fe0: 54 41 47 5f 44 4f 4d 41 49 4e 20 20 20 20 20 20 TAG_DOMAIN
0ff0: 20 20 20 20 20 20 20 20 30 78 34 31 0a 23 64 65 0x41.#de
1000: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 50 fine GSCIS_TAG_P
1010: 41 53 53 57 4f 52 44 20 20 20 20 20 20 20 20 20 ASSWORD
1020: 20 20 20 30 78 34 32 0a 0a 2f 2a 2a 2a 20 43 61 0x42../*** Ca
1030: 72 64 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d rd Information -
1040: 20 45 46 20 35 30 30 30 20 2a 2a 2a 2f 0a 23 64 EF 5000 ***/.#d
1050: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f efine GSCIS_TAG_
1060: 49 53 53 55 45 52 49 44 20 20 20 20 20 20 20 20 ISSUERID
1070: 20 20 20 20 30 78 35 30 0a 23 64 65 66 69 6e 65 0x50.#define
1080: 20 47 53 43 49 53 5f 54 41 47 5f 53 45 52 4e 4f GSCIS_TAG_SERNO
1090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0
10a0: 78 35 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49 x51.#define GSCI
10b0: 53 5f 54 41 47 5f 49 53 53 55 45 5f 44 41 54 45 S_TAG_ISSUE_DATE
10c0: 20 20 20 20 20 20 20 20 20 20 30 78 35 32 0a 23 0x52.#
10d0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 define GSCIS_TAG
10e0: 5f 45 58 50 49 52 45 5f 44 41 54 45 20 20 20 20 _EXPIRE_DATE
10f0: 20 20 20 20 20 30 78 35 33 0a 23 64 65 66 69 6e 0x53.#defin
1100: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 e GSCIS_TAG_CARD
1110: 5f 54 59 50 45 20 20 20 20 20 20 20 20 20 20 20 _TYPE
1120: 30 78 35 34 0a 23 64 65 66 69 6e 65 20 47 53 43 0x54.#define GSC
1130: 49 53 5f 54 41 47 5f 53 45 43 55 52 49 54 59 5f IS_TAG_SECURITY_
1140: 43 4f 44 45 20 20 20 20 20 20 20 30 78 35 37 0a CODE 0x57.
1150: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 #define GSCIS_TA
1160: 47 5f 43 41 52 44 49 44 5f 41 49 44 20 20 20 20 G_CARDID_AID
1170: 20 20 20 20 20 20 30 78 35 38 0a 0a 2f 2a 2a 2a 0x58../***
1180: 20 50 4b 49 20 49 6e 66 6f 72 6d 61 74 69 6f 6e PKI Information
1190: 20 2d 20 45 46 20 37 30 30 30 20 2a 2a 2a 2f 0a - EF 7000 ***/.
11a0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 #define GSCIS_TA
11b0: 47 5f 43 45 52 54 49 46 49 43 41 54 45 20 20 20 G_CERTIFICATE
11c0: 20 20 20 20 20 20 30 78 37 30 0a 23 64 65 66 69 0x70.#defi
11d0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 ne GSCIS_TAG_CER
11e0: 54 5f 49 53 53 55 45 5f 44 41 54 45 20 20 20 20 T_ISSUE_DATE
11f0: 20 30 78 37 31 0a 23 64 65 66 69 6e 65 20 47 53 0x71.#define GS
1200: 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 45 58 50 CIS_TAG_CERT_EXP
1210: 49 52 45 5f 44 41 54 45 20 20 20 20 30 78 37 32 IRE_DATE 0x72
1220: 0a 0a 2f 2a 2a 20 41 70 70 6c 65 74 20 49 44 73 ../** Applet IDs
1230: 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 **/.#define GSC
1240: 49 53 5f 41 49 44 5f 43 43 43 20 20 20 20 20 20 IS_AID_CCC
1250: 20 20 20 20 20 20 20 20 20 20 20 30 78 41 30 2c 0xA0,
1260: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 0x00, 0x00, 0x0
1270: 31 2c 20 30 78 31 36 2c 20 30 78 44 42 2c 20 30 1, 0x16, 0xDB, 0
1280: 78 30 30 0a 0a 2f 2a 20 4d 61 78 69 6d 75 6d 20 x00../* Maximum
1290: 73 69 7a 65 20 6f 66 20 64 61 74 61 20 70 6f 72 size of data por
12a0: 74 69 6f 6e 20 6f 66 20 41 50 44 55 73 20 2a 2f tion of APDUs */
12b0: 0a 2f 2a 2a 20 44 6f 20 6e 6f 74 20 73 65 74 20 ./** Do not set
12c0: 74 68 69 73 20 61 62 6f 76 65 20 32 35 30 20 2a this above 250 *
12d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 41 43 4b 45 */.#define CACKE
12e0: 59 5f 41 50 44 55 5f 4d 54 55 20 20 20 20 20 20 Y_APDU_MTU
12f0: 20 20 20 20 20 20 20 20 20 32 35 30 0a 0a 23 69 250..#i
1300: 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45 42 55 fdef CACKEY_DEBU
1310: 47 0a 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 G..# define CAC
1320: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1330: 28 78 2e 2e 2e 29 20 7b 20 66 70 72 69 6e 74 66 (x...) { fprintf
1340: 28 73 74 64 65 72 72 2c 20 22 25 73 28 29 3a 25 (stderr, "%s():%
1350: 69 3a 20 22 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 i: ", __func__,
1360: 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 66 70 72 69 6e __LINE__); fprin
1370: 74 66 28 73 74 64 65 72 72 2c 20 78 29 3b 20 66 tf(stderr, x); f
1380: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 printf(stderr, "
1390: 5c 6e 22 29 3b 20 66 66 6c 75 73 68 28 73 74 64 \n"); fflush(std
13a0: 65 72 72 29 3b 20 7d 0a 23 20 20 64 65 66 69 6e err); }.# defin
13b0: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 e CACKEY_DEBUG_P
13c0: 52 49 4e 54 42 55 46 28 66 2c 20 78 2c 20 79 29 RINTBUF(f, x, y)
13d0: 20 7b 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 { unsigned char
13e0: 20 2a 54 4d 50 42 55 46 3b 20 75 6e 73 69 67 6e *TMPBUF; unsign
13f0: 65 64 20 6c 6f 6e 67 20 69 64 78 3b 20 54 4d 50 ed long idx; TMP
1400: 42 55 46 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 BUF = (unsigned
1410: 63 68 61 72 20 2a 29 20 28 78 29 3b 20 66 70 72 char *) (x); fpr
1420: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 intf(stderr, "%s
1430: 28 29 3a 25 69 3a 20 25 73 20 20 28 25 73 2f 25 ():%i: %s (%s/%
1440: 6c 75 20 3d 20 7b 25 30 32 78 22 2c 20 5f 5f 66 lu = {%02x", __f
1450: 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 2c unc__, __LINE__,
1460: 20 66 2c 20 23 78 2c 20 28 75 6e 73 69 67 6e 65 f, #x, (unsigne
1470: 64 20 6c 6f 6e 67 29 20 28 79 29 2c 20 54 4d 50 d long) (y), TMP
1480: 42 55 46 5b 30 5d 29 3b 20 66 6f 72 20 28 69 64 BUF[0]); for (id
1490: 78 20 3d 20 31 3b 20 69 64 78 20 3c 20 28 79 29 x = 1; idx < (y)
14a0: 3b 20 69 64 78 2b 2b 29 20 7b 20 66 70 72 69 6e ; idx++) { fprin
14b0: 74 66 28 73 74 64 65 72 72 2c 20 22 2c 20 25 30 tf(stderr, ", %0
14c0: 32 78 22 2c 20 54 4d 50 42 55 46 5b 69 64 78 5d 2x", TMPBUF[idx]
14d0: 29 3b 20 7d 3b 20 66 70 72 69 6e 74 66 28 73 74 ); }; fprintf(st
14e0: 64 65 72 72 2c 20 22 7d 29 5c 6e 22 29 3b 20 66 derr, "})\n"); f
14f0: 66 6c 75 73 68 28 73 74 64 65 72 72 29 3b 20 7d flush(stderr); }
1500: 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 .# define CACKE
1510: 59 5f 44 45 42 55 47 5f 50 45 52 52 4f 52 28 78 Y_DEBUG_PERROR(x
1520: 29 20 7b 20 66 70 72 69 6e 74 66 28 73 74 64 65 ) { fprintf(stde
1530: 72 72 2c 20 22 25 73 28 29 3a 25 69 3a 20 22 2c rr, "%s():%i: ",
1540: 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e __func__, __LIN
1550: 45 5f 5f 29 3b 20 70 65 72 72 6f 72 28 78 29 3b E__); perror(x);
1560: 20 66 66 6c 75 73 68 28 73 74 64 65 72 72 29 3b fflush(stderr);
1570: 20 7d 0a 23 20 20 64 65 66 69 6e 65 20 66 72 65 }.# define fre
1580: 65 28 78 29 20 7b 20 43 41 43 4b 45 59 5f 44 45 e(x) { CACKEY_DE
1590: 42 55 47 5f 50 52 49 4e 54 46 28 22 46 52 45 45 BUG_PRINTF("FREE
15a0: 28 25 70 29 20 28 25 73 29 22 2c 20 78 2c 20 23 (%p) (%s)", x, #
15b0: 78 29 3b 20 66 72 65 65 28 78 29 3b 20 7d 0a 0a x); free(x); }..
15c0: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 43 41 43 static void *CAC
15d0: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4d KEY_DEBUG_FUNC_M
15e0: 41 4c 4c 4f 43 28 73 69 7a 65 5f 74 20 73 69 7a ALLOC(size_t siz
15f0: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 e, const char *f
1600: 75 6e 63 2c 20 69 6e 74 20 6c 69 6e 65 29 20 7b unc, int line) {
1610: 0a 09 76 6f 69 64 20 2a 72 65 74 76 61 6c 3b 0a ..void *retval;.
1620: 0a 09 72 65 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f ..retval = mallo
1630: 63 28 73 69 7a 65 29 3b 0a 0a 09 66 70 72 69 6e c(size);...fprin
1640: 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 28 29 tf(stderr, "%s()
1650: 3a 25 69 3a 20 22 2c 20 66 75 6e 63 2c 20 6c 69 :%i: ", func, li
1660: 6e 65 29 3b 0a 09 66 70 72 69 6e 74 66 28 73 74 ne);..fprintf(st
1670: 64 65 72 72 2c 20 22 4d 41 4c 4c 4f 43 28 29 20 derr, "MALLOC()
1680: 3d 20 25 70 22 2c 20 72 65 74 76 61 6c 29 3b 0a = %p", retval);.
1690: 09 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c .fprintf(stderr,
16a0: 20 22 5c 6e 22 29 3b 0a 09 66 66 6c 75 73 68 28 "\n");..fflush(
16b0: 73 74 64 65 72 72 29 3b 0a 0a 09 72 65 74 75 72 stderr);...retur
16c0: 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 n(retval);.}..st
16d0: 61 74 69 63 20 76 6f 69 64 20 2a 43 41 43 4b 45 atic void *CACKE
16e0: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 52 45 41 Y_DEBUG_FUNC_REA
16f0: 4c 4c 4f 43 28 76 6f 69 64 20 2a 70 74 72 2c 20 LLOC(void *ptr,
1700: 73 69 7a 65 5f 74 20 73 69 7a 65 2c 20 63 6f 6e size_t size, con
1710: 73 74 20 63 68 61 72 20 2a 66 75 6e 63 2c 20 69 st char *func, i
1720: 6e 74 20 6c 69 6e 65 29 20 7b 0a 09 76 6f 69 64 nt line) {..void
1730: 20 2a 72 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76 *retval;...retv
1740: 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 70 74 72 al = realloc(ptr
1750: 2c 20 73 69 7a 65 29 3b 0a 0a 09 69 66 20 28 72 , size);...if (r
1760: 65 74 76 61 6c 20 21 3d 20 70 74 72 29 20 7b 0a etval != ptr) {.
1770: 09 09 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 ..fprintf(stderr
1780: 2c 20 22 25 73 28 29 3a 25 69 3a 20 22 2c 20 66 , "%s():%i: ", f
1790: 75 6e 63 2c 20 6c 69 6e 65 29 3b 0a 09 09 66 70 unc, line);...fp
17a0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 52 rintf(stderr, "R
17b0: 45 41 4c 4c 4f 43 28 25 70 29 20 3d 20 25 70 22 EALLOC(%p) = %p"
17c0: 2c 20 70 74 72 2c 20 72 65 74 76 61 6c 29 3b 0a , ptr, retval);.
17d0: 09 09 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 ..fprintf(stderr
17e0: 2c 20 22 5c 6e 22 29 3b 0a 09 09 66 66 6c 75 73 , "\n");...fflus
17f0: 68 28 73 74 64 65 72 72 29 3b 0a 09 7d 0a 0a 09 h(stderr);..}...
1800: 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 4e 55 if (retval == NU
1810: 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 LL) {...CACKEY_D
1820: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2a 2a EBUG_PRINTF(" **
1830: 2a 20 45 52 52 4f 52 20 2a 2a 2a 20 72 65 61 6c * ERROR *** real
1840: 6c 6f 63 20 72 65 74 75 72 6e 65 64 20 4e 55 4c loc returned NUL
1850: 4c 20 28 73 69 7a 65 20 3d 20 25 6c 75 29 22 2c L (size = %lu)",
1860: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
1870: 20 73 69 7a 65 29 3b 0a 09 7d 0a 0a 09 72 65 74 size);..}...ret
1880: 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a urn(retval);.}..
1890: 73 74 61 74 69 63 20 63 68 61 72 20 2a 43 41 43 static char *CAC
18a0: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 KEY_DEBUG_FUNC_S
18b0: 54 52 44 55 50 28 63 6f 6e 73 74 20 63 68 61 72 TRDUP(const char
18c0: 20 2a 70 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 *ptr, const cha
18d0: 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20 6c 69 6e r *func, int lin
18e0: 65 29 20 7b 0a 09 63 68 61 72 20 2a 72 65 74 76 e) {..char *retv
18f0: 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20 73 al;...retval = s
1900: 74 72 64 75 70 28 70 74 72 29 3b 0a 0a 09 66 70 trdup(ptr);...fp
1910: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 rintf(stderr, "%
1920: 73 28 29 3a 25 69 3a 20 22 2c 20 66 75 6e 63 2c s():%i: ", func,
1930: 20 6c 69 6e 65 29 3b 0a 09 66 70 72 69 6e 74 66 line);..fprintf
1940: 28 73 74 64 65 72 72 2c 20 22 53 54 52 44 55 50 (stderr, "STRDUP
1950: 5f 4d 41 4c 4c 4f 43 28 29 20 3d 20 25 70 22 2c _MALLOC() = %p",
1960: 20 72 65 74 76 61 6c 29 3b 0a 09 66 70 72 69 6e retval);..fprin
1970: 74 66 28 73 74 64 65 72 72 2c 20 22 5c 6e 22 29 tf(stderr, "\n")
1980: 3b 0a 09 66 66 6c 75 73 68 28 73 74 64 65 72 72 ;..fflush(stderr
1990: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 );...return(retv
19a0: 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 al);.}..static c
19b0: 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43 4b 45 onst char *CACKE
19c0: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 Y_DEBUG_FUNC_TAG
19d0: 5f 54 4f 5f 53 54 52 28 75 6e 73 69 67 6e 65 64 _TO_STR(unsigned
19e0: 20 63 68 61 72 20 74 61 67 29 20 7b 0a 09 73 77 char tag) {..sw
19f0: 69 74 63 68 20 28 74 61 67 29 20 7b 0a 09 09 63 itch (tag) {...c
1a00: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 ase GSCIS_TAG_CA
1a10: 52 44 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 RDID:....return(
1a20: 22 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 "GSCIS_TAG_CARDI
1a30: 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 D");...case GSCI
1a40: 53 5f 54 41 47 5f 43 43 43 5f 56 45 52 3a 0a 09 S_TAG_CCC_VER:..
1a50: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f ..return("GSCIS_
1a60: 54 41 47 5f 43 43 43 5f 56 45 52 22 29 3b 0a 09 TAG_CCC_VER");..
1a70: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f .case GSCIS_TAG_
1a80: 43 43 47 5f 56 45 52 3a 0a 09 09 09 72 65 74 75 CCG_VER:....retu
1a90: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 43 rn("GSCIS_TAG_CC
1aa0: 47 5f 56 45 52 22 29 3b 0a 09 09 63 61 73 65 20 G_VER");...case
1ab0: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52 GSCIS_TAG_CARDUR
1ac0: 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 L:....return("GS
1ad0: 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 22 CIS_TAG_CARDURL"
1ae0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f );...case GSCIS_
1af0: 54 41 47 5f 50 4b 43 53 31 35 3a 0a 09 09 09 72 TAG_PKCS15:....r
1b00: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 eturn("GSCIS_TAG
1b10: 5f 50 4b 43 53 31 35 22 29 3b 0a 09 09 63 61 73 _PKCS15");...cas
1b20: 65 20 47 53 43 49 53 5f 54 41 47 5f 52 45 47 5f e GSCIS_TAG_REG_
1b30: 44 41 54 41 5f 4d 4f 44 45 4c 3a 0a 09 09 09 72 DATA_MODEL:....r
1b40: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 eturn("GSCIS_TAG
1b50: 5f 52 45 47 5f 44 41 54 41 5f 4d 4f 44 45 4c 22 _REG_DATA_MODEL"
1b60: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f );...case GSCIS_
1b70: 54 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09 TAG_ACR_TABLE:..
1b80: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f ..return("GSCIS_
1b90: 54 41 47 5f 41 43 52 5f 54 41 42 4c 45 22 29 3b TAG_ACR_TABLE");
1ba0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 ...case GSCIS_TA
1bb0: 47 5f 43 41 52 44 5f 41 50 44 55 3a 0a 09 09 09 G_CARD_APDU:....
1bc0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 return("GSCIS_TA
1bd0: 47 5f 43 41 52 44 5f 41 50 44 55 22 29 3b 0a 09 G_CARD_APDU");..
1be0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f .case GSCIS_TAG_
1bf0: 52 45 44 49 52 45 43 54 49 4f 4e 3a 0a 09 09 09 REDIRECTION:....
1c00: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 return("GSCIS_TA
1c10: 47 5f 52 45 44 49 52 45 43 54 49 4f 4e 22 29 3b G_REDIRECTION");
1c20: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 ...case GSCIS_TA
1c30: 47 5f 43 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 G_CT:....return(
1c40: 22 47 53 43 49 53 5f 54 41 47 5f 43 54 22 29 3b "GSCIS_TAG_CT");
1c50: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 ...case GSCIS_TA
1c60: 47 5f 53 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 G_ST:....return(
1c70: 22 47 53 43 49 53 5f 54 41 47 5f 53 54 22 29 3b "GSCIS_TAG_ST");
1c80: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 ...case GSCIS_TA
1c90: 47 5f 4e 45 58 54 43 43 43 3a 0a 09 09 09 72 65 G_NEXTCCC:....re
1ca0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f turn("GSCIS_TAG_
1cb0: 4e 45 58 54 43 43 43 22 29 3b 0a 09 09 63 61 73 NEXTCCC");...cas
1cc0: 65 20 47 53 43 49 53 5f 54 41 47 5f 46 4e 41 4d e GSCIS_TAG_FNAM
1cd0: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 E:....return("GS
1ce0: 43 49 53 5f 54 41 47 5f 46 4e 41 4d 45 22 29 3b CIS_TAG_FNAME");
1cf0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 ...case GSCIS_TA
1d00: 47 5f 4d 4e 41 4d 45 3a 0a 09 09 09 72 65 74 75 G_MNAME:....retu
1d10: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4d 4e rn("GSCIS_TAG_MN
1d20: 41 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 AME");...case GS
1d30: 43 49 53 5f 54 41 47 5f 4c 4e 41 4d 45 3a 0a 09 CIS_TAG_LNAME:..
1d40: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f ..return("GSCIS_
1d50: 54 41 47 5f 4c 4e 41 4d 45 22 29 3b 0a 09 09 63 TAG_LNAME");...c
1d60: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53 55 ase GSCIS_TAG_SU
1d70: 46 46 49 58 3a 0a 09 09 09 72 65 74 75 72 6e 28 FFIX:....return(
1d80: 22 47 53 43 49 53 5f 54 41 47 5f 53 55 46 46 49 "GSCIS_TAG_SUFFI
1d90: 58 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 X");...case GSCI
1da0: 53 5f 54 41 47 5f 47 4f 56 54 5f 41 47 45 4e 43 S_TAG_GOVT_AGENC
1db0: 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 Y:....return("GS
1dc0: 43 49 53 5f 54 41 47 5f 47 4f 56 54 5f 41 47 45 CIS_TAG_GOVT_AGE
1dd0: 4e 43 59 22 29 3b 0a 09 09 63 61 73 65 20 47 53 NCY");...case GS
1de0: 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 3a 0a CIS_TAG_BUREAU:.
1df0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 ...return("GSCIS
1e00: 5f 54 41 47 5f 42 55 52 45 41 55 22 29 3b 0a 09 _TAG_BUREAU");..
1e10: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f .case GSCIS_TAG_
1e20: 42 55 52 45 41 55 5f 43 4f 44 45 3a 0a 09 09 09 BUREAU_CODE:....
1e30: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 return("GSCIS_TA
1e40: 47 5f 42 55 52 45 41 55 5f 43 4f 44 45 22 29 3b G_BUREAU_CODE");
1e50: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 ...case GSCIS_TA
1e60: 47 5f 44 45 50 54 5f 43 4f 44 45 3a 0a 09 09 09 G_DEPT_CODE:....
1e70: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 return("GSCIS_TA
1e80: 47 5f 44 45 50 54 5f 43 4f 44 45 22 29 3b 0a 09 G_DEPT_CODE");..
1e90: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f .case GSCIS_TAG_
1ea0: 54 49 54 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e TITLE:....return
1eb0: 28 22 47 53 43 49 53 5f 54 41 47 5f 54 49 54 4c ("GSCIS_TAG_TITL
1ec0: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 E");...case GSCI
1ed0: 53 5f 54 41 47 5f 42 55 49 4c 44 49 4e 47 3a 0a S_TAG_BUILDING:.
1ee0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 ...return("GSCIS
1ef0: 5f 54 41 47 5f 42 55 49 4c 44 49 4e 47 22 29 3b _TAG_BUILDING");
1f00: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 ...case GSCIS_TA
1f10: 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 31 3a 0a G_OFFICE_ADDR1:.
1f20: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 ...return("GSCIS
1f30: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 _TAG_OFFICE_ADDR
1f40: 31 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 1");...case GSCI
1f50: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 S_TAG_OFFICE_ADD
1f60: 52 32 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 R2:....return("G
1f70: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f SCIS_TAG_OFFICE_
1f80: 41 44 44 52 32 22 29 3b 0a 09 09 63 61 73 65 20 ADDR2");...case
1f90: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 GSCIS_TAG_OFFICE
1fa0: 5f 43 49 54 59 3a 0a 09 09 09 72 65 74 75 72 6e _CITY:....return
1fb0: 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 ("GSCIS_TAG_OFFI
1fc0: 43 45 5f 43 49 54 59 22 29 3b 0a 09 09 63 61 73 CE_CITY");...cas
1fd0: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 e GSCIS_TAG_OFFI
1fe0: 43 45 5f 53 54 41 54 45 3a 0a 09 09 09 72 65 74 CE_STATE:....ret
1ff0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f urn("GSCIS_TAG_O
2000: 46 46 49 43 45 5f 53 54 41 54 45 22 29 3b 0a 09 FFICE_STATE");..
2010: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f .case GSCIS_TAG_
2020: 4f 46 46 49 43 45 5f 5a 49 50 3a 0a 09 09 09 72 OFFICE_ZIP:....r
2030: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 eturn("GSCIS_TAG
2040: 5f 4f 46 46 49 43 45 5f 5a 49 50 22 29 3b 0a 09 _OFFICE_ZIP");..
2050: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f .case GSCIS_TAG_
2060: 4f 46 46 49 43 45 5f 43 4f 55 4e 54 52 59 3a 0a OFFICE_COUNTRY:.
2070: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 ...return("GSCIS
2080: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 4f 55 4e _TAG_OFFICE_COUN
2090: 54 52 59 22 29 3b 0a 09 09 63 61 73 65 20 47 53 TRY");...case GS
20a0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 CIS_TAG_OFFICE_P
20b0: 48 4f 4e 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 HONE:....return(
20c0: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 "GSCIS_TAG_OFFIC
20d0: 45 5f 50 48 4f 4e 45 22 29 3b 0a 09 09 63 61 73 E_PHONE");...cas
20e0: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 e GSCIS_TAG_OFFI
20f0: 43 45 5f 50 48 4f 4e 45 5f 45 58 54 3a 0a 09 09 CE_PHONE_EXT:...
2100: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 .return("GSCIS_T
2110: 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 5f AG_OFFICE_PHONE_
2120: 45 58 54 22 29 3b 0a 09 09 63 61 73 65 20 47 53 EXT");...case GS
2130: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 46 CIS_TAG_OFFICE_F
2140: 41 58 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 AX:....return("G
2150: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f SCIS_TAG_OFFICE_
2160: 46 41 58 22 29 3b 0a 09 09 63 61 73 65 20 47 53 FAX");...case GS
2170: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 45 CIS_TAG_OFFICE_E
2180: 4d 41 49 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 MAIL:....return(
2190: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 "GSCIS_TAG_OFFIC
21a0: 45 5f 45 4d 41 49 4c 22 29 3b 0a 09 09 63 61 73 E_EMAIL");...cas
21b0: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 e GSCIS_TAG_OFFI
21c0: 43 45 5f 52 4f 4f 4d 3a 0a 09 09 09 72 65 74 75 CE_ROOM:....retu
21d0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 rn("GSCIS_TAG_OF
21e0: 46 49 43 45 5f 52 4f 4f 4d 22 29 3b 0a 09 09 63 FICE_ROOM");...c
21f0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 4f ase GSCIS_TAG_NO
2200: 4e 47 4f 56 5f 41 47 45 4e 43 59 3a 0a 09 09 09 NGOV_AGENCY:....
2210: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 return("GSCIS_TA
2220: 47 5f 4e 4f 4e 47 4f 56 5f 41 47 45 4e 43 59 22 G_NONGOV_AGENCY"
2230: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f );...case GSCIS_
2240: 54 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41 54 TAG_SSN_DESIGNAT
2250: 4f 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 OR:....return("G
2260: 53 43 49 53 5f 54 41 47 5f 53 53 4e 5f 44 45 53 SCIS_TAG_SSN_DES
2270: 49 47 4e 41 54 4f 52 22 29 3b 0a 09 09 63 61 73 IGNATOR");...cas
2280: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 3a e GSCIS_TAG_SSN:
2290: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 ....return("GSCI
22a0: 53 5f 54 41 47 5f 53 53 4e 22 29 3b 0a 09 09 63 S_TAG_SSN");...c
22b0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 44 4f ase GSCIS_TAG_DO
22c0: 42 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 B:....return("GS
22d0: 43 49 53 5f 54 41 47 5f 44 4f 42 22 29 3b 0a 09 CIS_TAG_DOB");..
22e0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f .case GSCIS_TAG_
22f0: 47 45 4e 44 45 52 3a 0a 09 09 09 72 65 74 75 72 GENDER:....retur
2300: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 47 45 4e n("GSCIS_TAG_GEN
2310: 44 45 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53 DER");...case GS
2320: 43 49 53 5f 54 41 47 5f 55 53 45 52 49 44 3a 0a CIS_TAG_USERID:.
2330: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 ...return("GSCIS
2340: 5f 54 41 47 5f 55 53 45 52 49 44 22 29 3b 0a 09 _TAG_USERID");..
2350: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f .case GSCIS_TAG_
2360: 44 4f 4d 41 49 4e 3a 0a 09 09 09 72 65 74 75 72 DOMAIN:....retur
2370: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d n("GSCIS_TAG_DOM
2380: 41 49 4e 22 29 3b 0a 09 09 63 61 73 65 20 47 53 AIN");...case GS
2390: 43 49 53 5f 54 41 47 5f 50 41 53 53 57 4f 52 44 CIS_TAG_PASSWORD
23a0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 :....return("GSC
23b0: 49 53 5f 54 41 47 5f 50 41 53 53 57 4f 52 44 22 IS_TAG_PASSWORD"
23c0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f );...case GSCIS_
23d0: 54 41 47 5f 49 53 53 55 45 52 49 44 3a 0a 09 09 TAG_ISSUERID:...
23e0: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 .return("GSCIS_T
23f0: 41 47 5f 49 53 53 55 45 52 49 44 22 29 3b 0a 09 AG_ISSUERID");..
2400: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f .case GSCIS_TAG_
2410: 53 45 52 4e 4f 3a 0a 09 09 09 72 65 74 75 72 6e SERNO:....return
2420: 28 22 47 53 43 49 53 5f 54 41 47 5f 53 45 52 4e ("GSCIS_TAG_SERN
2430: 4f 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 O");...case GSCI
2440: 53 5f 54 41 47 5f 49 53 53 55 45 5f 44 41 54 45 S_TAG_ISSUE_DATE
2450: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 :....return("GSC
2460: 49 53 5f 54 41 47 5f 49 53 53 55 45 5f 44 41 54 IS_TAG_ISSUE_DAT
2470: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 E");...case GSCI
2480: 53 5f 54 41 47 5f 45 58 50 49 52 45 5f 44 41 54 S_TAG_EXPIRE_DAT
2490: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 E:....return("GS
24a0: 43 49 53 5f 54 41 47 5f 45 58 50 49 52 45 5f 44 CIS_TAG_EXPIRE_D
24b0: 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 ATE");...case GS
24c0: 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 54 59 50 CIS_TAG_CARD_TYP
24d0: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 E:....return("GS
24e0: 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 54 59 50 CIS_TAG_CARD_TYP
24f0: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 E");...case GSCI
2500: 53 5f 54 41 47 5f 53 45 43 55 52 49 54 59 5f 43 S_TAG_SECURITY_C
2510: 4f 44 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 ODE:....return("
2520: 47 53 43 49 53 5f 54 41 47 5f 53 45 43 55 52 49 GSCIS_TAG_SECURI
2530: 54 59 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61 73 TY_CODE");...cas
2540: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 e GSCIS_TAG_CARD
2550: 49 44 5f 41 49 44 3a 0a 09 09 09 72 65 74 75 72 ID_AID:....retur
2560: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41 52 n("GSCIS_TAG_CAR
2570: 44 49 44 5f 41 49 44 22 29 3b 0a 09 09 63 61 73 DID_AID");...cas
2580: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 e GSCIS_TAG_CERT
2590: 49 46 49 43 41 54 45 3a 0a 09 09 09 72 65 74 75 IFICATE:....retu
25a0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 45 rn("GSCIS_TAG_CE
25b0: 52 54 49 46 49 43 41 54 45 22 29 3b 0a 09 09 63 RTIFICATE");...c
25c0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45 ase GSCIS_TAG_CE
25d0: 52 54 5f 49 53 53 55 45 5f 44 41 54 45 3a 0a 09 RT_ISSUE_DATE:..
25e0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f ..return("GSCIS_
25f0: 54 41 47 5f 43 45 52 54 5f 49 53 53 55 45 5f 44 TAG_CERT_ISSUE_D
2600: 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 ATE");...case GS
2610: 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 45 58 50 CIS_TAG_CERT_EXP
2620: 49 52 45 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 IRE_DATE:....ret
2630: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 urn("GSCIS_TAG_C
2640: 45 52 54 5f 45 58 50 49 52 45 5f 44 41 54 45 22 ERT_EXPIRE_DATE"
2650: 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 22 );..}...return("
2660: 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74 UNKNOWN");.}..st
2670: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 atic const char
2680: 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 *CACKEY_DEBUG_FU
2690: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 NC_SCARDERR_TO_S
26a0: 54 52 28 4c 4f 4e 47 20 72 65 74 63 6f 64 65 29 TR(LONG retcode)
26b0: 20 7b 0a 09 73 77 69 74 63 68 20 28 72 65 74 63 {..switch (retc
26c0: 6f 64 65 29 20 7b 0a 09 09 63 61 73 65 20 53 43 ode) {...case SC
26d0: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 3a 0a 09 ARD_S_SUCCESS:..
26e0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f ..return("SCARD_
26f0: 53 5f 53 55 43 43 45 53 53 22 29 3b 0a 09 09 63 S_SUCCESS");...c
2700: 61 73 65 20 53 43 41 52 44 5f 45 5f 43 41 4e 43 ase SCARD_E_CANC
2710: 45 4c 4c 45 44 3a 0a 09 09 09 72 65 74 75 72 6e ELLED:....return
2720: 28 22 53 43 41 52 44 5f 45 5f 43 41 4e 43 45 4c ("SCARD_E_CANCEL
2730: 4c 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 LED");...case SC
2740: 41 52 44 5f 45 5f 43 41 4e 54 5f 44 49 53 50 4f ARD_E_CANT_DISPO
2750: 53 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 SE:....return("S
2760: 43 41 52 44 5f 45 5f 43 41 4e 54 5f 44 49 53 50 CARD_E_CANT_DISP
2770: 4f 53 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43 OSE");...case SC
2780: 41 52 44 5f 45 5f 49 4e 53 55 46 46 49 43 49 45 ARD_E_INSUFFICIE
2790: 4e 54 5f 42 55 46 46 45 52 3a 0a 09 09 09 72 65 NT_BUFFER:....re
27a0: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e turn("SCARD_E_IN
27b0: 53 55 46 46 49 43 49 45 4e 54 5f 42 55 46 46 45 SUFFICIENT_BUFFE
27c0: 52 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 R");...case SCAR
27d0: 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 41 54 52 3a D_E_INVALID_ATR:
27e0: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 ....return("SCAR
27f0: 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 41 54 52 22 D_E_INVALID_ATR"
2800: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f );...case SCARD_
2810: 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 E_INVALID_HANDLE
2820: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 :....return("SCA
2830: 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e RD_E_INVALID_HAN
2840: 44 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43 DLE");...case SC
2850: 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 50 41 ARD_E_INVALID_PA
2860: 52 41 4d 45 54 45 52 3a 0a 09 09 09 72 65 74 75 RAMETER:....retu
2870: 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 rn("SCARD_E_INVA
2880: 4c 49 44 5f 50 41 52 41 4d 45 54 45 52 22 29 3b LID_PARAMETER");
2890: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f ...case SCARD_E_
28a0: 49 4e 56 41 4c 49 44 5f 54 41 52 47 45 54 3a 0a INVALID_TARGET:.
28b0: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 ...return("SCARD
28c0: 5f 45 5f 49 4e 56 41 4c 49 44 5f 54 41 52 47 45 _E_INVALID_TARGE
28d0: 54 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 T");...case SCAR
28e0: 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 56 41 4c 55 D_E_INVALID_VALU
28f0: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 E:....return("SC
2900: 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 56 41 ARD_E_INVALID_VA
2910: 4c 55 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43 LUE");...case SC
2920: 41 52 44 5f 45 5f 4e 4f 5f 4d 45 4d 4f 52 59 3a ARD_E_NO_MEMORY:
2930: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 ....return("SCAR
2940: 44 5f 45 5f 4e 4f 5f 4d 45 4d 4f 52 59 22 29 3b D_E_NO_MEMORY");
2950: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f ...case SCARD_E_
2960: 55 4e 4b 4e 4f 57 4e 5f 52 45 41 44 45 52 3a 0a UNKNOWN_READER:.
2970: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 ...return("SCARD
2980: 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 52 45 41 44 45 _E_UNKNOWN_READE
2990: 52 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 R");...case SCAR
29a0: 44 5f 45 5f 54 49 4d 45 4f 55 54 3a 0a 09 09 09 D_E_TIMEOUT:....
29b0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f return("SCARD_E_
29c0: 54 49 4d 45 4f 55 54 22 29 3b 0a 09 09 63 61 73 TIMEOUT");...cas
29d0: 65 20 53 43 41 52 44 5f 45 5f 53 48 41 52 49 4e e SCARD_E_SHARIN
29e0: 47 5f 56 49 4f 4c 41 54 49 4f 4e 3a 0a 09 09 09 G_VIOLATION:....
29f0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f return("SCARD_E_
2a00: 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f SHARING_VIOLATIO
2a10: 4e 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 N");...case SCAR
2a20: 44 5f 45 5f 4e 4f 5f 53 4d 41 52 54 43 41 52 44 D_E_NO_SMARTCARD
2a30: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 :....return("SCA
2a40: 52 44 5f 45 5f 4e 4f 5f 53 4d 41 52 54 43 41 52 RD_E_NO_SMARTCAR
2a50: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 D");...case SCAR
2a60: 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 43 41 52 44 D_E_UNKNOWN_CARD
2a70: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 :....return("SCA
2a80: 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 43 41 52 RD_E_UNKNOWN_CAR
2a90: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 D");...case SCAR
2aa0: 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 D_E_PROTO_MISMAT
2ab0: 43 48 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 CH:....return("S
2ac0: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 CARD_E_PROTO_MIS
2ad0: 4d 41 54 43 48 22 29 3b 0a 09 09 63 61 73 65 20 MATCH");...case
2ae0: 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 52 45 41 44 SCARD_E_NOT_READ
2af0: 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 Y:....return("SC
2b00: 41 52 44 5f 45 5f 4e 4f 54 5f 52 45 41 44 59 22 ARD_E_NOT_READY"
2b10: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f );...case SCARD_
2b20: 45 5f 53 59 53 54 45 4d 5f 43 41 4e 43 45 4c 4c E_SYSTEM_CANCELL
2b30: 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 ED:....return("S
2b40: 43 41 52 44 5f 45 5f 53 59 53 54 45 4d 5f 43 41 CARD_E_SYSTEM_CA
2b50: 4e 43 45 4c 4c 45 44 22 29 3b 0a 09 09 63 61 73 NCELLED");...cas
2b60: 65 20 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 e SCARD_E_NOT_TR
2b70: 41 4e 53 41 43 54 45 44 3a 0a 09 09 09 72 65 74 ANSACTED:....ret
2b80: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 54 urn("SCARD_E_NOT
2b90: 5f 54 52 41 4e 53 41 43 54 45 44 22 29 3b 0a 09 _TRANSACTED");..
2ba0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 52 45 .case SCARD_E_RE
2bb0: 41 44 45 52 5f 55 4e 41 56 41 49 4c 41 42 4c 45 ADER_UNAVAILABLE
2bc0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 :....return("SCA
2bd0: 52 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 41 56 RD_E_READER_UNAV
2be0: 41 49 4c 41 42 4c 45 22 29 3b 0a 09 09 63 61 73 AILABLE");...cas
2bf0: 65 20 53 43 41 52 44 5f 57 5f 55 4e 53 55 50 50 e SCARD_W_UNSUPP
2c00: 4f 52 54 45 44 5f 43 41 52 44 3a 0a 09 09 09 72 ORTED_CARD:....r
2c10: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 55 eturn("SCARD_W_U
2c20: 4e 53 55 50 50 4f 52 54 45 44 5f 43 41 52 44 22 NSUPPORTED_CARD"
2c30: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f );...case SCARD_
2c40: 57 5f 55 4e 52 45 53 50 4f 4e 53 49 56 45 5f 43 W_UNRESPONSIVE_C
2c50: 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 ARD:....return("
2c60: 53 43 41 52 44 5f 57 5f 55 4e 52 45 53 50 4f 4e SCARD_W_UNRESPON
2c70: 53 49 56 45 5f 43 41 52 44 22 29 3b 0a 09 09 63 SIVE_CARD");...c
2c80: 61 73 65 20 53 43 41 52 44 5f 57 5f 55 4e 50 4f ase SCARD_W_UNPO
2c90: 57 45 52 45 44 5f 43 41 52 44 3a 0a 09 09 09 72 WERED_CARD:....r
2ca0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 55 eturn("SCARD_W_U
2cb0: 4e 50 4f 57 45 52 45 44 5f 43 41 52 44 22 29 3b NPOWERED_CARD");
2cc0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f ...case SCARD_W_
2cd0: 52 45 53 45 54 5f 43 41 52 44 3a 0a 09 09 09 72 RESET_CARD:....r
2ce0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 52 eturn("SCARD_W_R
2cf0: 45 53 45 54 5f 43 41 52 44 22 29 3b 0a 09 09 63 ESET_CARD");...c
2d00: 61 73 65 20 53 43 41 52 44 5f 57 5f 52 45 4d 4f ase SCARD_W_REMO
2d10: 56 45 44 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 VED_CARD:....ret
2d20: 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 52 45 4d urn("SCARD_W_REM
2d30: 4f 56 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63 OVED_CARD");...c
2d40: 61 73 65 20 53 43 41 52 44 5f 45 5f 50 43 49 5f ase SCARD_E_PCI_
2d50: 54 4f 4f 5f 53 4d 41 4c 4c 3a 0a 09 09 09 72 65 TOO_SMALL:....re
2d60: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 50 43 turn("SCARD_E_PC
2d70: 49 5f 54 4f 4f 5f 53 4d 41 4c 4c 22 29 3b 0a 09 I_TOO_SMALL");..
2d80: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 52 45 .case SCARD_E_RE
2d90: 41 44 45 52 5f 55 4e 53 55 50 50 4f 52 54 45 44 ADER_UNSUPPORTED
2da0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 :....return("SCA
2db0: 52 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 53 55 RD_E_READER_UNSU
2dc0: 50 50 4f 52 54 45 44 22 29 3b 0a 09 09 63 61 73 PPORTED");...cas
2dd0: 65 20 53 43 41 52 44 5f 45 5f 44 55 50 4c 49 43 e SCARD_E_DUPLIC
2de0: 41 54 45 5f 52 45 41 44 45 52 3a 0a 09 09 09 72 ATE_READER:....r
2df0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 44 eturn("SCARD_E_D
2e00: 55 50 4c 49 43 41 54 45 5f 52 45 41 44 45 52 22 UPLICATE_READER"
2e10: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f );...case SCARD_
2e20: 45 5f 43 41 52 44 5f 55 4e 53 55 50 50 4f 52 54 E_CARD_UNSUPPORT
2e30: 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 ED:....return("S
2e40: 43 41 52 44 5f 45 5f 43 41 52 44 5f 55 4e 53 55 CARD_E_CARD_UNSU
2e50: 50 50 4f 52 54 45 44 22 29 3b 0a 09 09 63 61 73 PPORTED");...cas
2e60: 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 45 52 e SCARD_E_NO_SER
2e70: 56 49 43 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 VICE:....return(
2e80: 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 45 52 56 "SCARD_E_NO_SERV
2e90: 49 43 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43 ICE");...case SC
2ea0: 41 52 44 5f 45 5f 53 45 52 56 49 43 45 5f 53 54 ARD_E_SERVICE_ST
2eb0: 4f 50 50 45 44 3a 0a 09 09 09 72 65 74 75 72 6e OPPED:....return
2ec0: 28 22 53 43 41 52 44 5f 45 5f 53 45 52 56 49 43 ("SCARD_E_SERVIC
2ed0: 45 5f 53 54 4f 50 50 45 44 22 29 3b 0a 09 09 63 E_STOPPED");...c
2ee0: 61 73 65 20 53 43 41 52 44 5f 45 5f 55 4e 53 55 ase SCARD_E_UNSU
2ef0: 50 50 4f 52 54 45 44 5f 46 45 41 54 55 52 45 3a PPORTED_FEATURE:
2f00: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 ....return("SCAR
2f10: 44 5f 45 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f D_E_UNSUPPORTED_
2f20: 46 45 41 54 55 52 45 22 29 3b 0a 23 69 66 64 65 FEATURE");.#ifde
2f30: 66 20 53 43 41 52 44 5f 57 5f 49 4e 53 45 52 54 f SCARD_W_INSERT
2f40: 45 44 5f 43 41 52 44 0a 09 09 63 61 73 65 20 53 ED_CARD...case S
2f50: 43 41 52 44 5f 57 5f 49 4e 53 45 52 54 45 44 5f CARD_W_INSERTED_
2f60: 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 CARD:....return(
2f70: 22 53 43 41 52 44 5f 57 5f 49 4e 53 45 52 54 45 "SCARD_W_INSERTE
2f80: 44 5f 43 41 52 44 22 29 3b 0a 23 65 6e 64 69 66 D_CARD");.#endif
2f90: 0a 23 69 66 64 65 66 20 53 43 41 52 44 5f 45 5f .#ifdef SCARD_E_
2fa0: 4e 4f 5f 52 45 41 44 45 52 53 5f 41 56 41 49 4c NO_READERS_AVAIL
2fb0: 41 42 4c 45 0a 09 09 63 61 73 65 20 53 43 41 52 ABLE...case SCAR
2fc0: 44 5f 45 5f 4e 4f 5f 52 45 41 44 45 52 53 5f 41 D_E_NO_READERS_A
2fd0: 56 41 49 4c 41 42 4c 45 3a 0a 09 09 09 72 65 74 VAILABLE:....ret
2fe0: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f urn("SCARD_E_NO_
2ff0: 52 45 41 44 45 52 53 5f 41 56 41 49 4c 41 42 4c READERS_AVAILABL
3000: 45 22 29 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 0a E");.#endif..}..
3010: 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e .return("UNKNOWN
3020: 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f ");.}..static co
3030: 6e 73 74 20 63 68 61 72 20 2a 43 41 43 4b 45 59 nst char *CACKEY
3040: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 _DEBUG_FUNC_OBJI
3050: 44 5f 54 4f 5f 53 54 52 28 75 69 6e 74 31 36 5f D_TO_STR(uint16_
3060: 74 20 6f 62 6a 69 64 29 20 7b 0a 09 73 77 69 74 t objid) {..swit
3070: 63 68 20 28 6f 62 6a 69 64 29 20 7b 0a 09 09 63 ch (objid) {...c
3080: 61 73 65 20 30 78 32 30 30 30 3a 0a 09 09 09 72 ase 0x2000:....r
3090: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c eturn("CACKEY_TL
30a0: 56 5f 4f 42 4a 49 44 5f 47 45 4e 45 52 41 4c 49 V_OBJID_GENERALI
30b0: 4e 46 4f 22 29 3b 0a 09 09 63 61 73 65 20 30 78 NFO");...case 0x
30c0: 32 31 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 2100:....return(
30d0: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 "CACKEY_TLV_OBJI
30e0: 44 5f 50 52 4f 50 45 52 53 4f 4e 41 4c 49 4e 46 D_PROPERSONALINF
30f0: 4f 22 29 3b 0a 09 09 63 61 73 65 20 30 78 33 30 O");...case 0x30
3100: 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 00:....return("C
3110: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f ACKEY_TLV_OBJID_
3120: 41 43 43 45 53 53 43 4f 4e 54 52 4f 4c 22 29 3b ACCESSCONTROL");
3130: 0a 09 09 63 61 73 65 20 30 78 34 30 30 30 3a 0a ...case 0x4000:.
3140: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 ...return("CACKE
3150: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 4c 4f 47 49 Y_TLV_OBJID_LOGI
3160: 4e 22 29 3b 0a 09 09 63 61 73 65 20 30 78 35 30 N");...case 0x50
3170: 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 00:....return("C
3180: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f ACKEY_TLV_OBJID_
3190: 43 41 52 44 49 4e 46 4f 22 29 3b 0a 09 09 63 61 CARDINFO");...ca
31a0: 73 65 20 30 78 36 30 30 30 3a 0a 09 09 09 72 65 se 0x6000:....re
31b0: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 turn("CACKEY_TLV
31c0: 5f 4f 42 4a 49 44 5f 42 49 4f 4d 45 54 52 49 43 _OBJID_BIOMETRIC
31d0: 53 22 29 3b 0a 09 09 63 61 73 65 20 30 78 37 30 S");...case 0x70
31e0: 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 00:....return("C
31f0: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f ACKEY_TLV_OBJID_
3200: 44 49 47 49 54 41 4c 53 49 47 43 45 52 54 22 29 DIGITALSIGCERT")
3210: 3b 0a 09 09 63 61 73 65 20 30 78 30 32 30 30 3a ;...case 0x0200:
3220: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b ....return("CACK
3230: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 EY_TLV_OBJID_CAC
3240: 5f 50 45 52 53 4f 4e 22 29 3b 0a 09 09 63 61 73 _PERSON");...cas
3250: 65 20 30 78 30 32 30 32 3a 0a 09 09 09 72 65 74 e 0x0202:....ret
3260: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f urn("CACKEY_TLV_
3270: 4f 42 4a 49 44 5f 43 41 43 5f 42 45 4e 45 46 49 OBJID_CAC_BENEFI
3280: 54 53 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 TS");...case 0x0
3290: 32 30 33 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 203:....return("
32a0: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 CACKEY_TLV_OBJID
32b0: 5f 43 41 43 5f 4f 54 48 45 52 42 45 4e 45 46 49 _CAC_OTHERBENEFI
32c0: 54 53 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 TS");...case 0x0
32d0: 32 30 31 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 201:....return("
32e0: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 CACKEY_TLV_OBJID
32f0: 5f 43 41 43 5f 50 45 52 53 4f 4e 4e 45 4c 22 29 _CAC_PERSONNEL")
3300: 3b 0a 09 09 63 61 73 65 20 30 78 30 32 46 45 3a ;...case 0x02FE:
3310: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b ....return("CACK
3320: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 EY_TLV_OBJID_CAC
3330: 5f 50 4b 49 43 45 52 54 22 29 3b 0a 09 7d 0a 09 _PKICERT");..}..
3340: 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 ..return("UNKNOW
3350: 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 N");.}..static c
3360: 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43 4b 45 onst char *CACKE
3370: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 50 50 Y_DEBUG_FUNC_APP
3380: 54 59 50 45 5f 54 4f 5f 53 54 52 28 75 69 6e 74 TYPE_TO_STR(uint
3390: 38 5f 74 20 61 70 70 74 79 70 65 29 20 7b 0a 09 8_t apptype) {..
33a0: 73 77 69 74 63 68 20 28 61 70 70 74 79 70 65 29 switch (apptype)
33b0: 20 7b 0a 09 09 63 61 73 65 20 30 78 30 30 3a 0a {...case 0x00:.
33c0: 09 09 09 72 65 74 75 72 6e 28 22 4e 4f 4e 45 22 ...return("NONE"
33d0: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 31 3a 0a );...case 0x01:.
33e0: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 ...return("CACKE
33f0: 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 Y_TLV_APP_GENERI
3400: 43 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32 C");...case 0x02
3410: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 :....return("CAC
3420: 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 22 KEY_TLV_APP_SKI"
3430: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 33 3a 0a );...case 0x03:.
3440: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 ...return("CACKE
3450: 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 Y_TLV_APP_GENERI
3460: 43 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 C | CACKEY_TLV_A
3470: 50 50 5f 53 4b 49 22 29 3b 0a 09 09 63 61 73 65 PP_SKI");...case
3480: 20 30 78 30 34 3a 0a 09 09 09 72 65 74 75 72 6e 0x04:....return
3490: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 ("CACKEY_TLV_APP
34a0: 5f 50 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 30 _PKI");...case 0
34b0: 78 30 35 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 x05:....return("
34c0: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47 CACKEY_TLV_APP_G
34d0: 45 4e 45 52 49 43 20 7c 20 43 41 43 4b 45 59 5f ENERIC | CACKEY_
34e0: 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09 TLV_APP_PKI");..
34f0: 09 63 61 73 65 20 30 78 30 36 3a 0a 09 09 09 72 .case 0x06:....r
3500: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c eturn("CACKEY_TL
3510: 56 5f 41 50 50 5f 53 4b 49 20 7c 20 43 41 43 4b V_APP_SKI | CACK
3520: 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29 EY_TLV_APP_PKI")
3530: 3b 0a 09 09 63 61 73 65 20 30 78 30 37 3a 0a 09 ;...case 0x07:..
3540: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 ..return("CACKEY
3550: 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 _TLV_APP_GENERIC
3560: 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 | CACKEY_TLV_AP
3570: 50 5f 53 4b 49 20 7c 20 43 41 43 4b 45 59 5f 54 P_SKI | CACKEY_T
3580: 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09 7d LV_APP_PKI");..}
3590: 0a 0a 09 72 65 74 75 72 6e 28 22 49 4e 56 41 4c ...return("INVAL
35a0: 49 44 22 29 3b 0a 7d 0a 0a 23 20 20 64 65 66 69 ID");.}..# defi
35b0: 6e 65 20 6d 61 6c 6c 6f 63 28 78 29 20 43 41 43 ne malloc(x) CAC
35c0: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4d KEY_DEBUG_FUNC_M
35d0: 41 4c 4c 4f 43 28 78 2c 20 5f 5f 66 75 6e 63 5f ALLOC(x, __func_
35e0: 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 20 20 _, __LINE__).#
35f0: 64 65 66 69 6e 65 20 72 65 61 6c 6c 6f 63 28 78 define realloc(x
3600: 2c 20 79 29 20 43 41 43 4b 45 59 5f 44 45 42 55 , y) CACKEY_DEBU
3610: 47 5f 46 55 4e 43 5f 52 45 41 4c 4c 4f 43 28 78 G_FUNC_REALLOC(x
3620: 2c 20 79 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f , y, __func__, _
3630: 5f 4c 49 4e 45 5f 5f 29 0a 23 20 20 69 66 64 65 _LINE__).# ifde
3640: 66 20 73 74 72 64 75 70 0a 23 20 20 20 20 75 6e f strdup.# un
3650: 64 65 66 20 73 74 72 64 75 70 0a 23 20 20 65 6e def strdup.# en
3660: 64 69 66 0a 23 20 20 64 65 66 69 6e 65 20 73 74 dif.# define st
3670: 72 64 75 70 28 78 29 20 43 41 43 4b 45 59 5f 44 rdup(x) CACKEY_D
3680: 45 42 55 47 5f 46 55 4e 43 5f 53 54 52 44 55 50 EBUG_FUNC_STRDUP
3690: 28 78 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f (x, __func__, __
36a0: 4c 49 4e 45 5f 5f 29 0a 23 65 6c 73 65 0a 23 20 LINE__).#else.#
36b0: 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 define CACKEY_D
36c0: 45 42 55 47 5f 50 52 49 4e 54 46 28 78 2e 2e 2e EBUG_PRINTF(x...
36d0: 29 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 69 6e 65 ) /**/.# define
36e0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 CACKEY_DEBUG_PR
36f0: 49 4e 54 42 55 46 28 66 2c 20 78 2c 20 79 29 20 INTBUF(f, x, y)
3700: 2f 2a 2a 2f 0a 23 20 20 64 65 66 69 6e 65 20 43 /**/.# define C
3710: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 45 52 52 ACKEY_DEBUG_PERR
3720: 4f 52 28 78 29 20 2f 2a 2a 2f 0a 23 20 20 64 65 OR(x) /**/.# de
3730: 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 fine CACKEY_DEBU
3740: 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 G_FUNC_TAG_TO_ST
3750: 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53 41 R(x) "DEBUG_DISA
3760: 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65 20 BLED".# define
3770: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e CACKEY_DEBUG_FUN
3780: 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 C_SCARDERR_TO_ST
3790: 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53 41 R(x) "DEBUG_DISA
37a0: 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65 20 BLED".# define
37b0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e CACKEY_DEBUG_FUN
37c0: 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28 78 C_OBJID_TO_STR(x
37d0: 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c 45 ) "DEBUG_DISABLE
37e0: 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 D".# define CAC
37f0: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 KEY_DEBUG_FUNC_A
3800: 50 50 54 59 50 45 5f 54 4f 5f 53 54 52 28 78 29 PPTYPE_TO_STR(x)
3810: 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c 45 44 "DEBUG_DISABLED
3820: 22 0a 23 65 6e 64 69 66 0a 0a 73 74 72 75 63 74 ".#endif..struct
3830: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 cackey_pcsc_ide
3840: 6e 74 69 74 79 20 7b 0a 09 75 6e 73 69 67 6e 65 ntity {..unsigne
3850: 64 20 63 68 61 72 20 61 70 70 6c 65 74 5b 37 5d d char applet[7]
3860: 3b 0a 09 75 69 6e 74 31 36 5f 74 20 66 69 6c 65 ;..uint16_t file
3870: 3b 0a 0a 09 73 69 7a 65 5f 74 20 63 65 72 74 69 ;...size_t certi
3880: 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 75 6e 73 ficate_len;..uns
3890: 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 igned char *cert
38a0: 69 66 69 63 61 74 65 3b 0a 0a 09 73 73 69 7a 65 ificate;...ssize
38b0: 5f 74 20 6b 65 79 73 69 7a 65 3b 0a 7d 3b 0a 0a _t keysize;.};..
38c0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 struct cackey_id
38d0: 65 6e 74 69 74 79 20 7b 0a 09 73 74 72 75 63 74 entity {..struct
38e0: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 cackey_pcsc_ide
38f0: 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e ntity *pcsc_iden
3900: 74 69 74 79 3b 0a 0a 09 43 4b 5f 41 54 54 52 49 tity;...CK_ATTRI
3910: 42 55 54 45 20 2a 61 74 74 72 69 62 75 74 65 73 BUTE *attributes
3920: 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 61 74 74 72 ;..CK_ULONG attr
3930: 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 0a 7d 3b ibutes_count;.};
3940: 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f ..struct cackey_
3950: 73 65 73 73 69 6f 6e 20 7b 0a 09 69 6e 74 20 61 session {..int a
3960: 63 74 69 76 65 3b 0a 0a 09 43 4b 5f 53 4c 4f 54 ctive;...CK_SLOT
3970: 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 0a 09 43 4b _ID slotID;...CK
3980: 5f 53 54 41 54 45 20 73 74 61 74 65 3b 0a 09 43 _STATE state;..C
3990: 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73 3b 0a 09 K_FLAGS flags;..
39a0: 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 65 76 69 63 CK_ULONG ulDevic
39b0: 65 45 72 72 6f 72 3b 0a 09 43 4b 5f 56 4f 49 44 eError;..CK_VOID
39c0: 5f 50 54 52 20 70 41 70 70 6c 69 63 61 74 69 6f _PTR pApplicatio
39d0: 6e 3b 0a 09 43 4b 5f 4e 4f 54 49 46 59 20 4e 6f n;..CK_NOTIFY No
39e0: 74 69 66 79 3b 0a 0a 09 73 74 72 75 63 74 20 63 tify;...struct c
39f0: 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a ackey_identity *
3a00: 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73 identities;..uns
3a10: 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74 igned long ident
3a20: 69 74 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69 ities_count;...i
3a30: 6e 74 20 73 65 61 72 63 68 5f 61 63 74 69 76 65 nt search_active
3a40: 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 5f ;..CK_ATTRIBUTE_
3a50: 50 54 52 20 73 65 61 72 63 68 5f 71 75 65 72 79 PTR search_query
3a60: 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 73 65 61 72 ;..CK_ULONG sear
3a70: 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b 0a ch_query_count;.
3a80: 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 .unsigned long s
3a90: 65 61 72 63 68 5f 63 75 72 72 5f 69 64 3b 0a 0a earch_curr_id;..
3aa0: 09 69 6e 74 20 73 69 67 6e 5f 61 63 74 69 76 65 .int sign_active
3ab0: 3b 0a 09 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f ;..CK_MECHANISM_
3ac0: 54 59 50 45 20 73 69 67 6e 5f 6d 65 63 68 61 6e TYPE sign_mechan
3ad0: 69 73 6d 3b 0a 09 43 4b 5f 42 59 54 45 5f 50 54 ism;..CK_BYTE_PT
3ae0: 52 20 73 69 67 6e 5f 62 75 66 3b 0a 09 75 6e 73 R sign_buf;..uns
3af0: 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69 67 6e 5f igned long sign_
3b00: 62 75 66 6c 65 6e 3b 0a 09 75 6e 73 69 67 6e 65 buflen;..unsigne
3b10: 64 20 6c 6f 6e 67 20 73 69 67 6e 5f 62 75 66 75 d long sign_bufu
3b20: 73 65 64 3b 0a 09 73 74 72 75 63 74 20 63 61 63 sed;..struct cac
3b30: 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 73 69 key_identity *si
3b40: 67 6e 5f 69 64 65 6e 74 69 74 79 3b 0a 0a 09 69 gn_identity;...i
3b50: 6e 74 20 64 65 63 72 79 70 74 5f 61 63 74 69 76 nt decrypt_activ
3b60: 65 3b 0a 09 43 4b 5f 4d 45 43 48 41 4e 49 53 4d e;..CK_MECHANISM
3b70: 5f 54 59 50 45 20 64 65 63 72 79 70 74 5f 6d 65 _TYPE decrypt_me
3b80: 63 68 61 6e 69 73 6d 3b 0a 09 43 4b 5f 56 4f 49 chanism;..CK_VOI
3b90: 44 5f 50 54 52 20 64 65 63 72 79 70 74 5f 6d 65 D_PTR decrypt_me
3ba0: 63 68 5f 70 61 72 6d 3b 0a 09 43 4b 5f 55 4c 4f ch_parm;..CK_ULO
3bb0: 4e 47 20 64 65 63 72 79 70 74 5f 6d 65 63 68 5f NG decrypt_mech_
3bc0: 70 61 72 6d 6c 65 6e 3b 0a 09 73 74 72 75 63 74 parmlen;..struct
3bd0: 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 cackey_identity
3be0: 20 2a 64 65 63 72 79 70 74 5f 69 64 65 6e 74 69 *decrypt_identi
3bf0: 74 79 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 ty;.};..struct c
3c00: 61 63 6b 65 79 5f 73 6c 6f 74 20 7b 0a 09 69 6e ackey_slot {..in
3c10: 74 20 61 63 74 69 76 65 3b 0a 0a 09 63 68 61 72 t active;...char
3c20: 20 2a 70 63 73 63 5f 72 65 61 64 65 72 3b 0a 0a *pcsc_reader;..
3c30: 09 69 6e 74 20 70 63 73 63 5f 63 61 72 64 5f 63 .int pcsc_card_c
3c40: 6f 6e 6e 65 63 74 65 64 3b 0a 09 53 43 41 52 44 onnected;..SCARD
3c50: 48 41 4e 44 4c 45 20 70 63 73 63 5f 63 61 72 64 HANDLE pcsc_card
3c60: 3b 0a 0a 09 69 6e 74 20 74 72 61 6e 73 61 63 74 ;...int transact
3c70: 69 6f 6e 5f 64 65 70 74 68 3b 0a 0a 09 69 6e 74 ion_depth;...int
3c80: 20 73 6c 6f 74 5f 72 65 73 65 74 3b 0a 0a 09 43 slot_reset;...C
3c90: 4b 5f 46 4c 41 47 53 20 74 6f 6b 65 6e 5f 66 6c K_FLAGS token_fl
3ca0: 61 67 73 3b 0a 0a 09 75 6e 73 69 67 6e 65 64 20 ags;...unsigned
3cb0: 63 68 61 72 20 2a 6c 61 62 65 6c 3b 0a 7d 3b 0a char *label;.};.
3cc0: 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a .typedef enum {.
3cd0: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f .CACKEY_TLV_APP_
3ce0: 47 45 4e 45 52 49 43 20 3d 20 30 78 30 31 2c 0a GENERIC = 0x01,.
3cf0: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f .CACKEY_TLV_APP_
3d00: 53 4b 49 20 20 20 20 20 3d 20 30 78 30 32 2c 0a SKI = 0x02,.
3d10: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f .CACKEY_TLV_APP_
3d20: 50 4b 49 20 20 20 20 20 3d 20 30 78 30 34 0a 7d PKI = 0x04.}
3d30: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 61 70 70 74 cackey_tlv_appt
3d40: 79 70 65 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e ype;..typedef en
3d50: 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 54 4c 56 um {..CACKEY_TLV
3d60: 5f 4f 42 4a 49 44 5f 47 45 4e 45 52 41 4c 49 4e _OBJID_GENERALIN
3d70: 46 4f 20 20 20 20 20 20 20 3d 20 30 78 32 30 30 FO = 0x200
3d80: 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 0,..CACKEY_TLV_O
3d90: 42 4a 49 44 5f 50 52 4f 50 45 52 53 4f 4e 41 4c BJID_PROPERSONAL
3da0: 49 4e 46 4f 20 20 20 3d 20 30 78 32 31 30 30 2c INFO = 0x2100,
3db0: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a ..CACKEY_TLV_OBJ
3dc0: 49 44 5f 41 43 43 45 53 53 43 4f 4e 54 52 4f 4c ID_ACCESSCONTROL
3dd0: 20 20 20 20 20 3d 20 30 78 33 30 30 30 2c 0a 09 = 0x3000,..
3de0: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 CACKEY_TLV_OBJID
3df0: 5f 4c 4f 47 49 4e 20 20 20 20 20 20 20 20 20 20 _LOGIN
3e00: 20 20 20 3d 20 30 78 34 30 30 30 2c 0a 09 43 41 = 0x4000,..CA
3e10: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 CKEY_TLV_OBJID_C
3e20: 41 52 44 49 4e 46 4f 20 20 20 20 20 20 20 20 20 ARDINFO
3e30: 20 3d 20 30 78 35 30 30 30 2c 0a 09 43 41 43 4b = 0x5000,..CACK
3e40: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 42 49 4f EY_TLV_OBJID_BIO
3e50: 4d 45 54 52 49 43 53 20 20 20 20 20 20 20 20 3d METRICS =
3e60: 20 30 78 36 30 30 30 2c 0a 09 43 41 43 4b 45 59 0x6000,..CACKEY
3e70: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 44 49 47 49 54 _TLV_OBJID_DIGIT
3e80: 41 4c 53 49 47 43 45 52 54 20 20 20 20 3d 20 30 ALSIGCERT = 0
3e90: 78 37 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 x7000,..CACKEY_T
3ea0: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 LV_OBJID_CAC_PER
3eb0: 53 4f 4e 20 20 20 20 20 20 20 20 3d 20 30 78 30 SON = 0x0
3ec0: 32 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 200,..CACKEY_TLV
3ed0: 5f 4f 42 4a 49 44 5f 43 41 43 5f 42 45 4e 45 46 _OBJID_CAC_BENEF
3ee0: 49 54 53 20 20 20 20 20 20 3d 20 30 78 30 32 30 ITS = 0x020
3ef0: 32 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 2,..CACKEY_TLV_O
3f00: 42 4a 49 44 5f 43 41 43 5f 4f 54 48 45 52 42 45 BJID_CAC_OTHERBE
3f10: 4e 45 46 49 54 53 20 3d 20 30 78 30 32 30 33 2c NEFITS = 0x0203,
3f20: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a ..CACKEY_TLV_OBJ
3f30: 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e 4e 45 4c ID_CAC_PERSONNEL
3f40: 20 20 20 20 20 3d 20 30 78 30 32 30 31 2c 0a 09 = 0x0201,..
3f50: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 CACKEY_TLV_OBJID
3f60: 5f 43 41 43 5f 50 4b 49 43 45 52 54 20 20 20 20 _CAC_PKICERT
3f70: 20 20 20 3d 20 30 78 30 32 46 45 0a 7d 20 63 61 = 0x02FE.} ca
3f80: 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74 69 ckey_tlv_objecti
3f90: 64 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d d;..typedef enum
3fa0: 20 7b 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f {..CACKEY_PCSC_
3fb0: 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 20 20 S_TOKENPRESENT
3fc0: 20 20 3d 20 31 2c 0a 09 43 41 43 4b 45 59 5f 50 = 1,..CACKEY_P
3fd0: 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 CSC_S_OK
3fe0: 20 20 20 20 20 20 3d 20 30 2c 0a 09 43 41 43 4b = 0,..CACK
3ff0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 EY_PCSC_E_GENERI
4000: 43 20 20 20 20 20 20 20 20 20 3d 20 2d 31 2c 0a C = -1,.
4010: 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 .CACKEY_PCSC_E_B
4020: 41 44 50 49 4e 20 20 20 20 20 20 20 20 20 20 3d ADPIN =
4030: 20 2d 32 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 -2,..CACKEY_PCS
4040: 43 5f 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20 C_E_LOCKED
4050: 20 20 20 20 3d 20 2d 33 2c 0a 09 43 41 43 4b 45 = -3,..CACKE
4060: 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 Y_PCSC_E_NEEDLOG
4070: 49 4e 20 20 20 20 20 20 20 3d 20 2d 34 2c 0a 09 IN = -4,..
4080: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f CACKEY_PCSC_E_TO
4090: 4b 45 4e 41 42 53 45 4e 54 20 20 20 20 20 3d 20 KENABSENT =
40a0: 2d 36 0a 7d 20 63 61 63 6b 65 79 5f 72 65 74 3b -6.} cackey_ret;
40b0: 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f ..struct cackey_
40c0: 74 6c 76 5f 63 61 72 64 75 72 6c 20 7b 0a 09 75 tlv_cardurl {..u
40d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 20 20 20 nsigned char
40e0: 20 20 20 20 72 69 64 5b 35 5d 3b 0a 09 63 61 63 rid[5];..cac
40f0: 6b 65 79 5f 74 6c 76 5f 61 70 70 74 79 70 65 20 key_tlv_apptype
4100: 20 20 61 70 70 74 79 70 65 3b 0a 09 63 61 63 6b apptype;..cack
4110: 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74 69 64 20 ey_tlv_objectid
4120: 20 6f 62 6a 65 63 74 69 64 3b 0a 09 63 61 63 6b objectid;..cack
4130: 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74 69 64 20 ey_tlv_objectid
4140: 20 61 70 70 69 64 3b 0a 09 75 6e 73 69 67 6e 65 appid;..unsigne
4150: 64 20 63 68 61 72 20 20 20 20 20 20 20 20 70 69 d char pi
4160: 6e 69 64 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 nid;.};..struct
4170: 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 cackey_tlv_entit
4180: 79 3b 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 y;.struct cackey
4190: 5f 74 6c 76 5f 65 6e 74 69 74 79 20 7b 0a 09 75 _tlv_entity {..u
41a0: 69 6e 74 38 5f 74 20 74 61 67 3b 0a 09 73 69 7a int8_t tag;..siz
41b0: 65 5f 74 20 6c 65 6e 67 74 68 3b 0a 0a 09 75 6e e_t length;...un
41c0: 69 6f 6e 20 7b 0a 09 09 76 6f 69 64 20 2a 76 61 ion {...void *va
41d0: 6c 75 65 3b 0a 09 09 73 74 72 75 63 74 20 63 61 lue;...struct ca
41e0: 63 6b 65 79 5f 74 6c 76 5f 63 61 72 64 75 72 6c ckey_tlv_cardurl
41f0: 20 2a 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 3b *value_cardurl;
4200: 0a 09 09 75 69 6e 74 38 5f 74 20 76 61 6c 75 65 ...uint8_t value
4210: 5f 62 79 74 65 3b 0a 09 7d 3b 0a 0a 09 73 74 72 _byte;..};...str
4220: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 uct cackey_tlv_e
4230: 6e 74 69 74 79 20 2a 5f 6e 65 78 74 3b 0a 7d 3b ntity *_next;.};
4240: 0a 0a 2f 2a 20 43 41 43 4b 45 59 20 47 6c 6f 62 ../* CACKEY Glob
4250: 61 6c 20 48 61 6e 64 6c 65 73 20 2a 2f 0a 73 74 al Handles */.st
4260: 61 74 69 63 20 76 6f 69 64 20 2a 63 61 63 6b 65 atic void *cacke
4270: 79 5f 62 69 67 6c 6f 63 6b 20 3d 20 4e 55 4c 4c y_biglock = NULL
4280: 3b 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 ;.static struct
4290: 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 20 63 cackey_session c
42a0: 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 31 ackey_sessions[1
42b0: 32 38 5d 3b 0a 73 74 61 74 69 63 20 73 74 72 75 28];.static stru
42c0: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 63 ct cackey_slot c
42d0: 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 31 32 38 5d ackey_slots[128]
42e0: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 ;.static int cac
42f0: 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20 key_initialized
4300: 3d 20 30 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 = 0;.static int
4310: 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f 69 cackey_biglock_i
4320: 6e 69 74 20 3d 20 30 3b 0a 43 4b 5f 43 5f 49 4e nit = 0;.CK_C_IN
4330: 49 54 49 41 4c 49 5a 45 5f 41 52 47 53 20 63 61 ITIALIZE_ARGS ca
4340: 63 6b 65 79 5f 61 72 67 73 3b 0a 0a 2f 2a 20 50 ckey_args;../* P
4350: 43 53 43 20 47 6c 6f 62 61 6c 20 48 61 6e 64 6c CSC Global Handl
4360: 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 4c 50 53 es */.static LPS
4370: 43 41 52 44 43 4f 4e 54 45 58 54 20 63 61 63 6b CARDCONTEXT cack
4380: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d ey_pcsc_handle =
4390: 20 4e 55 4c 4c 3b 0a 0a 73 74 61 74 69 63 20 75 NULL;..static u
43a0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 61 63 nsigned long cac
43b0: 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 76 key_getversion(v
43c0: 6f 69 64 29 20 7b 0a 09 73 74 61 74 69 63 20 75 oid) {..static u
43d0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 72 65 74 nsigned long ret
43e0: 76 61 6c 20 3d 20 32 35 35 3b 0a 09 75 6e 73 69 val = 255;..unsi
43f0: 67 6e 65 64 20 6c 6f 6e 67 20 6d 61 6a 6f 72 20 gned long major
4400: 3d 20 30 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c = 0;..unsigned l
4410: 6f 6e 67 20 6d 69 6e 6f 72 20 3d 20 30 3b 0a 09 ong minor = 0;..
4420: 63 68 61 72 20 2a 6d 61 6a 6f 72 5f 73 74 72 20 char *major_str
4430: 3d 20 4e 55 4c 4c 3b 0a 09 63 68 61 72 20 2a 6d = NULL;..char *m
4440: 69 6e 6f 72 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b inor_str = NULL;
4450: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
4460: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
4470: 29 3b 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20 );...if (retval
4480: 21 3d 20 32 35 35 29 20 7b 0a 09 09 43 41 43 4b != 255) {...CACK
4490: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
44a0: 22 52 65 74 75 72 6e 69 6e 67 20 30 78 25 6c 78 "Returning 0x%lx
44b0: 20 28 63 61 63 68 65 64 29 2e 22 2c 20 72 65 74 (cached).", ret
44c0: 76 61 6c 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 val);....return(
44d0: 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65 retval);..}...re
44e0: 74 76 61 6c 20 3d 20 30 3b 0a 0a 23 69 66 64 65 tval = 0;..#ifde
44f0: 66 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f f PACKAGE_VERSIO
4500: 4e 0a 20 20 20 20 20 20 20 20 6d 61 6a 6f 72 5f N. major_
4510: 73 74 72 20 3d 20 50 41 43 4b 41 47 45 5f 56 45 str = PACKAGE_VE
4520: 52 53 49 4f 4e 3b 0a 09 69 66 20 28 6d 61 6a 6f RSION;..if (majo
4530: 72 5f 73 74 72 29 20 7b 0a 09 20 20 20 20 20 20 r_str) {..
4540: 20 20 6d 61 6a 6f 72 20 3d 20 73 74 72 74 6f 75 major = strtou
4550: 6c 28 6d 61 6a 6f 72 5f 73 74 72 2c 20 26 6d 69 l(major_str, &mi
4560: 6e 6f 72 5f 73 74 72 2c 20 31 30 29 3b 0a 0a 09 nor_str, 10);...
4570: 09 69 66 20 28 6d 69 6e 6f 72 5f 73 74 72 29 20 .if (minor_str)
4580: 7b 0a 09 09 09 6d 69 6e 6f 72 20 3d 20 73 74 72 {....minor = str
4590: 74 6f 75 6c 28 6d 69 6e 6f 72 5f 73 74 72 20 2b toul(minor_str +
45a0: 20 31 2c 20 4e 55 4c 4c 2c 20 31 30 29 3b 0a 09 1, NULL, 10);..
45b0: 09 7d 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d .}..}...retval =
45c0: 20 28 6d 61 6a 6f 72 20 3c 3c 20 31 36 29 20 7c (major << 16) |
45d0: 20 28 6d 69 6e 6f 72 20 3c 3c 20 38 29 3b 0a 23 (minor << 8);.#
45e0: 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 endif...CACKEY_D
45f0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
4600: 75 72 6e 69 6e 67 20 30 78 25 6c 78 22 2c 20 72 urning 0x%lx", r
4610: 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e etval);...return
4620: 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 20 (retval);.}../*
4630: 50 43 2f 53 43 20 52 65 6c 61 74 65 64 20 46 75 PC/SC Related Fu
4640: 6e 63 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a nctions */./*. *
4650: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 SYNPOSIS. *
4660: 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 73 6c 6f void cackey_slo
4670: 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c ts_disconnect_al
4680: 6c 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 l(void);. *. * A
4690: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 RGUMENTS. *
46a0: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 None. *. * RETUR
46b0: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e N VALUE. * N
46c0: 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a one. *. * NOTES.
46d0: 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 * This func
46e0: 74 69 6f 6e 20 64 69 73 63 6f 6e 6e 65 63 74 73 tion disconnects
46f0: 20 66 72 6f 6d 20 61 6c 6c 20 63 61 72 64 73 2e from all cards.
4700: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 . *. */.static v
4710: 6f 69 64 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 oid cackey_slots
4720: 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 _disconnect_all(
4730: 76 6f 69 64 29 20 7b 0a 09 75 69 6e 74 33 32 5f void) {..uint32_
4740: 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f t idx;...CACKEY_
4750: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
4760: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 66 6f 72 20 28 lled.");...for (
4770: 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 idx = 0; idx < (
4780: 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c sizeof(cackey_sl
4790: 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 ots) / sizeof(ca
47a0: 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b ckey_slots[0]));
47b0: 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 idx++) {...if (
47c0: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 cackey_slots[idx
47d0: 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e ].pcsc_card_conn
47e0: 65 63 74 65 64 29 20 7b 0a 09 09 09 43 41 43 4b ected) {....CACK
47f0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
4800: 22 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 "SCardDisconnect
4810: 28 25 6c 75 29 20 63 61 6c 6c 65 64 22 2c 20 28 (%lu) called", (
4820: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 unsigned long) i
4830: 64 78 29 3b 0a 0a 09 09 09 53 43 61 72 64 44 69 dx);.....SCardDi
4840: 73 63 6f 6e 6e 65 63 74 28 63 61 63 6b 65 79 5f sconnect(cackey_
4850: 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f slots[idx].pcsc_
4860: 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 card, SCARD_LEAV
4870: 45 5f 43 41 52 44 29 3b 0a 09 09 7d 0a 0a 09 09 E_CARD);...}....
4880: 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 if (cackey_slots
4890: 5b 69 64 78 5d 2e 6c 61 62 65 6c 29 20 7b 0a 09 [idx].label) {..
48a0: 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c ..free(cackey_sl
48b0: 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 29 3b ots[idx].label);
48c0: 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 .....cackey_slot
48d0: 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 20 3d 20 4e s[idx].label = N
48e0: 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b ULL;...}....cack
48f0: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 ey_slots[idx].pc
4900: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 sc_card_connecte
4910: 64 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f d = 0;...cackey_
4920: 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73 slots[idx].trans
4930: 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30 action_depth = 0
4940: 3b 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f ;....if (cackey_
4950: 73 6c 6f 74 73 5b 69 64 78 5d 2e 61 63 74 69 76 slots[idx].activ
4960: 65 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 e) {....CACKEY_D
4970: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 61 72 EBUG_PRINTF("Mar
4980: 6b 69 6e 67 20 61 63 74 69 76 65 20 73 6c 6f 74 king active slot
4990: 20 25 6c 75 20 61 73 20 62 65 69 6e 67 20 72 65 %lu as being re
49a0: 73 65 74 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 set", (unsigned
49b0: 6c 6f 6e 67 29 20 69 64 78 29 3b 0a 09 09 7d 0a long) idx);...}.
49c0: 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b ...cackey_slots[
49d0: 69 64 78 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 20 idx].slot_reset
49e0: 3d 20 31 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 = 1;..}...CACKEY
49f0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
4a00: 65 74 75 72 6e 69 6e 67 22 29 3b 0a 0a 09 72 65 eturning");...re
4a10: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 turn;.}../*. * S
4a20: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 YNPOSIS. * c
4a30: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 ackey_ret cackey
4a40: 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 76 6f _pcsc_connect(vo
4a50: 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d id);. *. * ARGUM
4a60: 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 ENTS. * None
4a70: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 . *. * RETURN VA
4a80: 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 LUE. * CACKE
4a90: 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 Y_PCSC_S_OK
4aa0: 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 On success.
4ab0: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 * CACKEY_PCS
4ac0: 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f C_E_GENERIC O
4ad0: 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f n error. *. * NO
4ae0: 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 TES. * This
4af0: 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 6e 65 63 74 function connect
4b00: 73 20 74 6f 20 74 68 65 20 50 43 2f 53 43 20 43 s to the PC/SC C
4b10: 6f 6e 6e 65 63 74 69 6f 6e 20 4d 61 6e 61 67 65 onnection Manage
4b20: 72 20 61 6e 64 20 75 70 64 61 74 65 73 20 74 68 r and updates th
4b30: 65 0a 20 2a 20 20 20 20 20 67 6c 6f 62 61 6c 20 e. * global
4b40: 68 61 6e 64 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a 73 handle.. *. */.s
4b50: 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 tatic cackey_ret
4b60: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e cackey_pcsc_con
4b70: 6e 65 63 74 28 76 6f 69 64 29 20 7b 0a 09 4c 4f nect(void) {..LO
4b80: 4e 47 20 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e NG scard_est_con
4b90: 74 65 78 74 5f 72 65 74 3b 0a 23 69 66 64 65 66 text_ret;.#ifdef
4ba0: 20 48 41 56 45 5f 53 43 41 52 44 49 53 56 41 4c HAVE_SCARDISVAL
4bb0: 49 44 43 4f 4e 54 45 58 54 0a 09 4c 4f 4e 47 20 IDCONTEXT..LONG
4bc0: 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 scard_isvalid_re
4bd0: 74 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b t;.#endif...CACK
4be0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
4bf0: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 "Called.");...if
4c00: 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 (cackey_pcsc_ha
4c10: 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a ndle == NULL) {.
4c20: 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 ..cackey_pcsc_ha
4c30: 6e 64 6c 65 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 ndle = malloc(si
4c40: 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f 70 63 73 zeof(*cackey_pcs
4c50: 63 5f 68 61 6e 64 6c 65 29 29 3b 0a 09 09 69 66 c_handle));...if
4c60: 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 (cackey_pcsc_ha
4c70: 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a ndle == NULL) {.
4c80: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
4c90: 50 52 49 4e 54 46 28 22 43 61 6c 6c 20 74 6f 20 PRINTF("Call to
4ca0: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 2c malloc() failed,
4cb0: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 returning in fa
4cc0: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 63 61 63 ilure");.....cac
4cd0: 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e key_slots_discon
4ce0: 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 nect_all();.....
4cf0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 return(CACKEY_PC
4d00: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 SC_E_GENERIC);..
4d10: 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 .}....CACKEY_DEB
4d20: 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 UG_PRINTF("SCard
4d30: 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 EstablishContext
4d40: 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09 09 73 () called");...s
4d50: 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 card_est_context
4d60: 5f 72 65 74 20 3d 20 53 43 61 72 64 45 73 74 61 _ret = SCardEsta
4d70: 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 53 43 41 blishContext(SCA
4d80: 52 44 5f 53 43 4f 50 45 5f 53 59 53 54 45 4d 2c RD_SCOPE_SYSTEM,
4d90: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 63 61 63 NULL, NULL, cac
4da0: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 key_pcsc_handle)
4db0: 3b 0a 09 09 69 66 20 28 73 63 61 72 64 5f 65 73 ;...if (scard_es
4dc0: 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 21 3d t_context_ret !=
4dd0: 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 SCARD_S_SUCCESS
4de0: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 ) {....CACKEY_DE
4df0: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
4e00: 20 74 6f 20 53 43 61 72 64 45 73 74 61 62 6c 69 to SCardEstabli
4e10: 73 68 43 6f 6e 74 65 78 74 20 66 61 69 6c 65 64 shContext failed
4e20: 20 28 72 65 74 75 72 6e 65 64 20 25 73 2f 25 6c (returned %s/%l
4e30: 69 29 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e i), returning in
4e40: 20 66 61 69 6c 75 72 65 22 2c 20 43 41 43 4b 45 failure", CACKE
4e50: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 Y_DEBUG_FUNC_SCA
4e60: 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 RDERR_TO_STR(sca
4e70: 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 rd_est_context_r
4e80: 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 et), (long) scar
4e90: 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 d_est_context_re
4ea0: 74 29 3b 0a 0a 09 09 09 66 72 65 65 28 63 61 63 t);.....free(cac
4eb0: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 key_pcsc_handle)
4ec0: 3b 0a 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63 ;....cackey_pcsc
4ed0: 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a _handle = NULL;.
4ee0: 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 ....cackey_slots
4ef0: 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 _disconnect_all(
4f00: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 );.....return(CA
4f10: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 CKEY_PCSC_E_GENE
4f20: 52 49 43 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 RIC);...}..}..#i
4f30: 66 64 65 66 20 48 41 56 45 5f 53 43 41 52 44 49 fdef HAVE_SCARDI
4f40: 53 56 41 4c 49 44 43 4f 4e 54 45 58 54 0a 09 43 SVALIDCONTEXT..C
4f50: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
4f60: 54 46 28 22 53 43 61 72 64 49 73 56 61 6c 69 64 TF("SCardIsValid
4f70: 43 6f 6e 74 65 78 74 28 29 20 63 61 6c 6c 65 64 Context() called
4f80: 22 29 3b 0a 09 73 63 61 72 64 5f 69 73 76 61 6c ");..scard_isval
4f90: 69 64 5f 72 65 74 20 3d 20 53 43 61 72 64 49 73 id_ret = SCardIs
4fa0: 56 61 6c 69 64 43 6f 6e 74 65 78 74 28 2a 63 61 ValidContext(*ca
4fb0: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 ckey_pcsc_handle
4fc0: 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 69 73 );..if (scard_is
4fd0: 76 61 6c 69 64 5f 72 65 74 20 21 3d 20 53 43 41 valid_ret != SCA
4fe0: 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a RD_S_SUCCESS) {.
4ff0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
5000: 52 49 4e 54 46 28 22 48 61 6e 64 6c 65 20 68 61 RINTF("Handle ha
5010: 73 20 62 65 63 6f 6d 65 20 69 6e 76 61 6c 69 64 s become invalid
5020: 20 28 53 43 61 72 64 49 73 56 61 6c 69 64 43 6f (SCardIsValidCo
5030: 6e 74 65 78 74 20 3d 20 25 73 2f 25 6c 69 29 2c ntext = %s/%li),
5040: 20 74 72 79 69 6e 67 20 74 6f 20 72 65 2d 65 73 trying to re-es
5050: 74 61 62 6c 69 73 68 2e 2e 2e 22 2c 20 43 41 43 tablish...", CAC
5060: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 KEY_DEBUG_FUNC_S
5070: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 CARDERR_TO_STR(s
5080: 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 card_isvalid_ret
5090: 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f ), (long) scard_
50a0: 69 73 76 61 6c 69 64 5f 72 65 74 29 3b 0a 0a 09 isvalid_ret);...
50b0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
50c0: 49 4e 54 46 28 22 53 43 61 72 64 45 73 74 61 62 INTF("SCardEstab
50d0: 6c 69 73 68 43 6f 6e 74 65 78 74 28 29 20 63 61 lishContext() ca
50e0: 6c 6c 65 64 22 29 3b 0a 09 09 73 63 61 72 64 5f lled");...scard_
50f0: 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 est_context_ret
5100: 3d 20 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 = SCardEstablish
5110: 43 6f 6e 74 65 78 74 28 53 43 41 52 44 5f 53 43 Context(SCARD_SC
5120: 4f 50 45 5f 53 59 53 54 45 4d 2c 20 4e 55 4c 4c OPE_SYSTEM, NULL
5130: 2c 20 4e 55 4c 4c 2c 20 63 61 63 6b 65 79 5f 70 , NULL, cackey_p
5140: 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 69 csc_handle);...i
5150: 66 20 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e f (scard_est_con
5160: 74 65 78 74 5f 72 65 74 20 21 3d 20 53 43 41 52 text_ret != SCAR
5170: 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 D_S_SUCCESS) {..
5180: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
5190: 52 49 4e 54 46 28 22 43 61 6c 6c 20 74 6f 20 53 RINTF("Call to S
51a0: 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e CardEstablishCon
51b0: 74 65 78 74 20 66 61 69 6c 65 64 20 28 72 65 74 text failed (ret
51c0: 75 72 6e 65 64 20 25 73 2f 25 6c 69 29 2c 20 72 urned %s/%li), r
51d0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c eturning in fail
51e0: 75 72 65 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 ure", CACKEY_DEB
51f0: 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 UG_FUNC_SCARDERR
5200: 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 65 73 _TO_STR(scard_es
5210: 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 2c 20 t_context_ret),
5220: 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 65 73 74 (long) scard_est
5230: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 3b 0a 0a _context_ret);..
5240: 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 70 ...free(cackey_p
5250: 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 09 csc_handle);....
5260: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 cackey_pcsc_hand
5270: 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 63 le = NULL;.....c
5280: 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 ackey_slots_disc
5290: 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 onnect_all();...
52a0: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f ..return(CACKEY_
52b0: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b PCSC_E_GENERIC);
52c0: 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 ...}....CACKEY_D
52d0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 48 61 6e EBUG_PRINTF("Han
52e0: 64 6c 65 20 68 61 73 20 62 65 65 6e 20 72 65 2d dle has been re-
52f0: 65 73 74 61 62 6c 69 73 68 65 64 22 29 3b 0a 09 established");..
5300: 7d 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 }.#endif...CACKE
5310: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
5320: 53 75 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e 6e Sucessfully conn
5330: 65 63 74 65 64 20 74 6f 20 50 43 2f 53 43 2c 20 ected to PC/SC,
5340: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 returning in suc
5350: 63 65 73 73 22 29 3b 0a 0a 09 72 65 74 75 72 6e cess");...return
5360: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f (CACKEY_PCSC_S_O
5370: 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e K);.}../*. * SYN
5380: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 POSIS. * cac
5390: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 70 key_ret cackey_p
53a0: 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 76 csc_disconnect(v
53b0: 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 oid);. *. * ARGU
53c0: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e MENTS. * Non
53d0: 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 e. *. * RETURN V
53e0: 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b ALUE. * CACK
53f0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 EY_PCSC_S_OK
5400: 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a On success.
5410: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 * CACKEY_PC
5420: 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 SC_E_GENERIC
5430: 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e On error. *. * N
5440: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 OTES. * This
5450: 20 66 75 6e 63 74 69 6f 6e 20 64 69 73 63 6f 6e function discon
5460: 6e 65 63 74 73 20 66 72 6f 6d 20 74 68 65 20 50 nects from the P
5470: 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 C/SC Connection
5480: 6d 61 6e 61 67 65 72 20 61 6e 64 20 75 70 64 61 manager and upda
5490: 74 65 73 0a 20 2a 20 20 20 20 20 74 68 65 20 67 tes. * the g
54a0: 6c 6f 62 61 6c 20 68 61 6e 64 6c 65 2e 0a 20 2a lobal handle.. *
54b0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b . */.static cack
54c0: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 70 63 ey_ret cackey_pc
54d0: 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 76 6f sc_disconnect(vo
54e0: 69 64 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 id) {..LONG scar
54f0: 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72 65 d_rel_context_re
5500: 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 t;...CACKEY_DEBU
5510: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 G_PRINTF("Called
5520: 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 .");...if (cacke
5530: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 3d y_pcsc_handle ==
5540: 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 NULL) {...retur
5550: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f n(CACKEY_PCSC_S_
5560: 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 63 61 72 64 5f OK);..}...scard_
5570: 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 rel_context_ret
5580: 3d 20 53 43 61 72 64 52 65 6c 65 61 73 65 43 6f = SCardReleaseCo
5590: 6e 74 65 78 74 28 2a 63 61 63 6b 65 79 5f 70 63 ntext(*cackey_pc
55a0: 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 0a 09 69 66 sc_handle);...if
55b0: 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 (cackey_pcsc_ha
55c0: 6e 64 6c 65 29 20 7b 0a 09 09 66 72 65 65 28 63 ndle) {...free(c
55d0: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c ackey_pcsc_handl
55e0: 65 29 3b 0a 09 0a 09 09 63 61 63 6b 65 79 5f 70 e);.....cackey_p
55f0: 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c csc_handle = NUL
5600: 4c 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 63 61 72 L;..}...if (scar
5610: 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72 65 d_rel_context_re
5620: 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 t != SCARD_S_SUC
5630: 43 45 53 53 29 20 7b 0a 09 09 72 65 74 75 72 6e CESS) {...return
5640: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 (CACKEY_PCSC_E_G
5650: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 72 65 ENERIC);..}...re
5660: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 turn(CACKEY_PCSC
5670: 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a _S_OK);.}../*. *
5680: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 SYNPOSIS. *
5690: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b cackey_ret cack
56a0: 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 ey_connect_card(
56b0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c struct cackey_sl
56c0: 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a ot *slot);. *. *
56d0: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 ARGUMENTS. *
56e0: 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 cackey_slot *s
56f0: 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 lot. * S
5700: 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d lot to send comm
5710: 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45 ands to. *. * RE
5720: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 TURN VALUE. *
5730: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f CACKEY_PCSC_S_
5740: 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 OK On su
5750: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 ccess. * CAC
5760: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 KEY_PCSC_E_GENER
5770: 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 IC On error.
5780: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 *. * NOTES. *
5790: 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 None. *. */.st
57a0: 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 atic cackey_ret
57b0: 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 cackey_connect_c
57c0: 61 72 64 28 73 74 72 75 63 74 20 63 61 63 6b 65 ard(struct cacke
57d0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a y_slot *slot) {.
57e0: 09 63 61 63 6b 65 79 5f 72 65 74 20 70 63 73 63 .cackey_ret pcsc
57f0: 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 44 _connect_ret;..D
5800: 57 4f 52 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 WORD protocol;..
5810: 4c 4f 4e 47 20 73 63 61 72 64 5f 63 6f 6e 6e 5f LONG scard_conn_
5820: 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ret;...CACKEY_DE
5830: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
5840: 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c ed.");...if (!sl
5850: 6f 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ot) {...CACKEY_D
5860: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 EBUG_PRINTF("Inv
5870: 61 6c 69 64 20 73 6c 6f 74 20 73 70 65 63 69 66 alid slot specif
5880: 69 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 ied, returning i
5890: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 n failure");....
58a0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 return(CACKEY_PC
58b0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 SC_E_GENERIC);..
58c0: 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 }...pcsc_connect
58d0: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70 63 _ret = cackey_pc
58e0: 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 69 sc_connect();..i
58f0: 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f f (pcsc_connect_
5900: 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 ret != CACKEY_PC
5910: 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 SC_S_OK) {...CAC
5920: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
5930: 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 ("Connection to
5940: 50 43 2f 53 43 20 66 61 69 6c 65 64 2c 20 72 65 PC/SC failed, re
5950: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 turning in failu
5960: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 re");....return(
5970: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 CACKEY_PCSC_E_GE
5980: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 NERIC);..}.../*
5990: 43 6f 6e 6e 65 63 74 20 74 6f 20 72 65 61 64 65 Connect to reade
59a0: 72 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a r, if needed */.
59b0: 09 69 66 20 28 21 73 6c 6f 74 2d 3e 70 63 73 63 .if (!slot->pcsc
59c0: 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 _card_connected)
59d0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
59e0: 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 43 G_PRINTF("SCardC
59f0: 6f 6e 6e 65 63 74 28 25 73 29 20 63 61 6c 6c 65 onnect(%s) calle
5a00: 64 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 d", slot->pcsc_r
5a10: 65 61 64 65 72 29 3b 0a 09 09 73 63 61 72 64 5f eader);...scard_
5a20: 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 conn_ret = SCard
5a30: 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f Connect(*cackey_
5a40: 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f pcsc_handle, slo
5a50: 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c 20 t->pcsc_reader,
5a60: 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 SCARD_SHARE_SHAR
5a70: 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 ED, SCARD_PROTOC
5a80: 4f 4c 5f 54 30 20 7c 20 53 43 41 52 44 5f 50 52 OL_T0 | SCARD_PR
5a90: 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74 OTOCOL_T1, &slot
5aa0: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72 ->pcsc_card, &pr
5ab0: 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 69 66 20 28 otocol);....if (
5ac0: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 21 scard_conn_ret !
5ad0: 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 = SCARD_S_SUCCES
5ae0: 53 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 S) {....CACKEY_D
5af0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e EBUG_PRINTF("Con
5b00: 6e 65 63 74 69 6f 6e 20 74 6f 20 63 61 72 64 20 nection to card
5b10: 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e failed, returnin
5b20: 67 20 69 6e 20 66 61 69 6c 75 72 65 20 28 53 43 g in failure (SC
5b30: 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 3d 20 25 ardConnect() = %
5b40: 73 2f 25 6c 69 29 22 2c 20 43 41 43 4b 45 59 5f s/%li)", CACKEY_
5b50: 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 DEBUG_FUNC_SCARD
5b60: 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 ERR_TO_STR(scard
5b70: 5f 63 6f 6e 6e 5f 72 65 74 29 2c 20 28 6c 6f 6e _conn_ret), (lon
5b80: 67 29 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 g) scard_conn_re
5b90: 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 t);.....return(C
5ba0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e ACKEY_PCSC_E_GEN
5bb0: 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 73 6c ERIC);...}....sl
5bc0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f ot->pcsc_card_co
5bd0: 6e 6e 65 63 74 65 64 20 3d 20 31 3b 0a 09 09 73 nnected = 1;...s
5be0: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e lot->transaction
5bf0: 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 7d 0a 0a _depth = 0;..}..
5c00: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 .return(CACKEY_P
5c10: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a CSC_S_OK);.}../*
5c20: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 . * SYNPOSIS. *
5c30: 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 cackey_ret c
5c40: 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e ackey_begin_tran
5c50: 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20 63 saction(struct c
5c60: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 ackey_slot *slot
5c70: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e );. *. * ARGUMEN
5c80: 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 TS. * cackey
5c90: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 _slot *slot. *
5ca0: 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 Slot to s
5cb0: 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a end commands to.
5cc0: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c *. * RETURN VAL
5cd0: 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 UE. * CACKEY
5ce0: 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 _PCSC_S_OK
5cf0: 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a On success. *
5d00: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 CACKEY_PCSC
5d10: 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e _E_GENERIC On
5d20: 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 error. *. * NOT
5d30: 45 53 0a 20 2a 20 20 20 20 20 54 68 65 20 74 72 ES. * The tr
5d40: 61 6e 73 61 63 74 69 6f 6e 20 73 68 6f 75 6c 64 ansaction should
5d50: 20 62 65 20 74 65 72 6d 69 6e 61 74 65 64 20 75 be terminated u
5d60: 73 69 6e 67 20 22 63 61 63 6b 65 79 5f 65 6e 64 sing "cackey_end
5d70: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 0a 20 2a _transaction". *
5d80: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b . */.static cack
5d90: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 62 65 ey_ret cackey_be
5da0: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 gin_transaction(
5db0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c struct cackey_sl
5dc0: 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63 ot *slot) {..cac
5dd0: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 63 key_ret cackey_c
5de0: 6f 6e 6e 5f 72 65 74 3b 0a 09 4c 4f 4e 47 20 73 onn_ret;..LONG s
5df0: 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 3b 0a card_trans_ret;.
5e00: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
5e10: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
5e20: 3b 0a 0a 09 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f ;...cackey_conn_
5e30: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e ret = cackey_con
5e40: 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b nect_card(slot);
5e50: 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 63 6f 6e ..if (cackey_con
5e60: 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f n_ret != CACKEY_
5e70: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 PCSC_S_OK) {...C
5e80: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
5e90: 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f TF("Unable to co
5ea0: 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72 nnect to card, r
5eb0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f eturning in erro
5ec0: 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 r");....return(C
5ed0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e ACKEY_PCSC_E_GEN
5ee0: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 ERIC);..}...slot
5ef0: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 ->transaction_de
5f00: 70 74 68 2b 2b 3b 0a 0a 09 69 66 20 28 73 6c 6f pth++;...if (slo
5f10: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 t->transaction_d
5f20: 65 70 74 68 20 3e 20 31 29 20 7b 0a 09 09 43 41 epth > 1) {...CA
5f30: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
5f40: 46 28 22 41 6c 72 65 61 64 79 20 69 6e 20 61 20 F("Already in a
5f50: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 70 65 72 transaction, per
5f60: 66 6f 72 6d 69 6e 67 20 6e 6f 20 61 63 74 69 6f forming no actio
5f70: 6e 20 28 6e 65 77 20 64 65 70 74 68 20 3d 20 25 n (new depth = %
5f80: 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e 73 i)", slot->trans
5f90: 61 63 74 69 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a action_depth);..
5fa0: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f ..return(CACKEY_
5fb0: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a PCSC_S_OK);..}..
5fc0: 09 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 .scard_trans_ret
5fd0: 20 3d 20 53 43 61 72 64 42 65 67 69 6e 54 72 61 = SCardBeginTra
5fe0: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 2d 3e 70 nsaction(slot->p
5ff0: 63 73 63 5f 63 61 72 64 29 3b 0a 09 69 66 20 28 csc_card);..if (
6000: 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 20 scard_trans_ret
6010: 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 != SCARD_S_SUCCE
6020: 53 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 SS) {...CACKEY_D
6030: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 EBUG_PRINTF("Una
6040: 62 6c 65 20 74 6f 20 62 65 67 69 6e 20 74 72 61 ble to begin tra
6050: 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e nsaction, return
6060: 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29 3b 0a ing in error");.
6070: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 ...return(CACKEY
6080: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 _PCSC_E_GENERIC)
6090: 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ;..}...CACKEY_DE
60a0: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63 65 BUG_PRINTF("Suce
60b0: 73 73 66 75 6c 6c 79 20 62 65 67 61 6e 20 74 72 ssfully began tr
60c0: 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 73 6c 6f ansaction on slo
60d0: 74 20 28 25 73 29 22 2c 20 73 6c 6f 74 2d 3e 70 t (%s)", slot->p
60e0: 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09 72 csc_reader);...r
60f0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 eturn(CACKEY_PCS
6100: 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 C_S_OK);.}../*.
6110: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 * SYNPOSIS. *
6120: 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 cackey_ret cac
6130: 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 key_end_transact
6140: 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65 ion(struct cacke
6150: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 y_slot *slot);.
6160: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 *. * ARGUMENTS.
6170: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f * cackey_slo
6180: 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 t *slot. *
6190: 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 Slot to send
61a0: 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 commands to. *.
61b0: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 * RETURN VALUE.
61c0: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 * CACKEY_PCS
61d0: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f C_S_OK O
61e0: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 n success. *
61f0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 CACKEY_PCSC_E_G
6200: 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 ENERIC On err
6210: 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 or. *. * NOTES.
6220: 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 * This funct
6230: 69 6f 6e 20 72 65 71 75 69 72 65 73 20 22 63 61 ion requires "ca
6240: 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 ckey_begin_trans
6250: 61 63 74 69 6f 6e 22 20 74 6f 20 62 65 20 63 61 action" to be ca
6260: 6c 6c 65 64 20 66 69 72 73 74 0a 20 2a 0a 20 2a lled first. *. *
6270: 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f /.static cackey_
6280: 72 65 74 20 63 61 63 6b 65 79 5f 65 6e 64 5f 74 ret cackey_end_t
6290: 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75 63 ransaction(struc
62a0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 t cackey_slot *s
62b0: 6c 6f 74 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 lot) {..LONG sca
62c0: 72 64 5f 74 72 61 6e 73 5f 72 65 74 3b 0a 0a 09 rd_trans_ret;...
62d0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
62e0: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a NTF("Called.");.
62f0: 0a 09 69 66 20 28 21 73 6c 6f 74 2d 3e 70 63 73 ..if (!slot->pcs
6300: 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 c_card_connected
6310: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
6320: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 72 64 20 UG_PRINTF("Card
6330: 69 73 20 6e 6f 74 20 63 6f 6e 6e 65 63 74 65 64 is not connected
6340: 2c 20 75 6e 61 62 6c 65 20 74 6f 20 65 6e 64 20 , unable to end
6350: 74 72 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 0a transaction");..
6360: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f ..return(CACKEY_
6370: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b PCSC_E_GENERIC);
6380: 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e ..}...if (slot->
6390: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 transaction_dept
63a0: 68 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b h == 0) {...CACK
63b0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
63c0: 22 54 65 72 6d 69 6e 61 74 69 6e 67 20 61 20 74 "Terminating a t
63d0: 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 ransaction that
63e0: 68 61 73 20 6e 6f 74 20 62 65 67 75 6e 21 22 29 has not begun!")
63f0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b ;....return(CACK
6400: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 EY_PCSC_E_GENERI
6410: 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 C);..}...slot->t
6420: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 ransaction_depth
6430: 2d 2d 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e --;...if (slot->
6440: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 transaction_dept
6450: 68 20 3e 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 h > 0) {...CACKE
6460: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
6470: 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 Transactions sti
6480: 6c 6c 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 ll in progress,
6490: 6e 6f 74 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 not terminating
64a0: 6f 6e 2d 63 61 72 64 20 54 72 61 6e 73 61 63 74 on-card Transact
64b0: 69 6f 6e 20 28 63 75 72 72 65 6e 74 20 64 65 70 ion (current dep
64c0: 74 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d th = %i)", slot-
64d0: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 >transaction_dep
64e0: 74 68 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 th);....return(C
64f0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e ACKEY_PCSC_E_GEN
6500: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 73 63 61 72 ERIC);..}...scar
6510: 64 5f 74 72 61 6e 73 5f 72 65 74 20 3d 20 53 43 d_trans_ret = SC
6520: 61 72 64 45 6e 64 54 72 61 6e 73 61 63 74 69 6f ardEndTransactio
6530: 6e 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 n(slot->pcsc_car
6540: 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 d, SCARD_LEAVE_C
6550: 41 52 44 29 3b 0a 09 69 66 20 28 73 63 61 72 64 ARD);..if (scard
6560: 5f 74 72 61 6e 73 5f 72 65 74 20 21 3d 20 53 43 _trans_ret != SC
6570: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b ARD_S_SUCCESS) {
6580: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
6590: 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 PRINTF("Unable t
65a0: 6f 20 65 6e 64 20 74 72 61 6e 73 61 63 74 69 6f o end transactio
65b0: 6e 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 n, returning in
65c0: 65 72 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75 error");....retu
65d0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 rn(CACKEY_PCSC_E
65e0: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 _GENERIC);..}...
65f0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
6600: 4e 54 46 28 22 53 75 63 65 73 73 66 75 6c 6c 79 NTF("Sucessfully
6610: 20 74 65 72 6d 69 6e 61 74 65 64 20 74 72 61 6e terminated tran
6620: 73 61 63 74 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20 saction on slot
6630: 28 25 73 29 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 (%s)", slot->pcs
6640: 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09 72 65 74 c_reader);...ret
6650: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f urn(CACKEY_PCSC_
6660: 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20 41 50 44 S_OK);.}../* APD
6670: 55 20 52 65 6c 61 74 65 64 20 46 75 6e 63 74 69 U Related Functi
6680: 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a 20 53 59 4e ons */./*. * SYN
6690: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 POSIS. * cac
66a0: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 key_ret cackey_s
66b0: 65 6e 64 5f 61 70 64 75 28 73 74 72 75 63 74 20 end_apdu(struct
66c0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f cackey_slot *slo
66d0: 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 t, unsigned char
66e0: 20 63 6c 61 73 73 2c 20 75 6e 73 69 67 6e 65 64 class, unsigned
66f0: 20 63 68 61 72 20 69 6e 73 74 72 75 63 74 69 6f char instructio
6700: 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 n, unsigned char
6710: 20 70 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 p1, unsigned ch
6720: 61 72 20 70 32 2c 20 75 6e 73 69 67 6e 65 64 20 ar p2, unsigned
6730: 63 68 61 72 20 6c 63 2c 20 75 6e 73 69 67 6e 65 char lc, unsigne
6740: 64 20 63 68 61 72 20 2a 64 61 74 61 2c 20 75 6e d char *data, un
6750: 73 69 67 6e 65 64 20 63 68 61 72 20 6c 65 2c 20 signed char le,
6760: 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f uint16_t *respco
6770: 64 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 de, unsigned cha
6780: 72 20 2a 72 65 73 70 64 61 74 61 2c 20 73 69 7a r *respdata, siz
6790: 65 5f 74 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 e_t *respdata_le
67a0: 6e 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 n);. *. * ARGUME
67b0: 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 NTS. * cacke
67c0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 y_slot *slot. *
67d0: 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 Slot to
67e0: 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f send commands to
67f0: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 . *. * unsig
6800: 6e 65 64 20 63 68 61 72 20 63 6c 61 73 73 0a 20 ned char class.
6810: 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 20 43 * APDU C
6820: 6c 61 73 73 20 28 47 53 43 49 53 5f 43 4c 41 53 lass (GSCIS_CLAS
6830: 53 5f 49 53 4f 37 38 31 36 20 6f 72 20 47 53 43 S_ISO7816 or GSC
6840: 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f IS_CLASS_GLOBAL_
6850: 50 4c 41 54 46 4f 52 4d 0a 20 2a 20 20 20 20 20 PLATFORM. *
6860: 20 20 20 20 75 73 75 61 6c 6c 79 29 2c 20 28 43 usually), (C
6870: 4c 41 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e LA). *. * un
6880: 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e 73 74 signed char inst
6890: 72 75 63 74 69 6f 6e 0a 20 2a 20 20 20 20 20 20 ruction. *
68a0: 20 20 20 41 50 44 55 20 49 6e 73 74 72 75 63 74 APDU Instruct
68b0: 69 6f 6e 20 28 49 4e 53 29 0a 20 2a 0a 20 2a 20 ion (INS). *. *
68c0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 unsigned cha
68d0: 72 20 70 31 0a 20 2a 20 20 20 20 20 20 20 20 20 r p1. *
68e0: 41 50 44 55 20 50 61 72 61 6d 65 74 65 72 20 31 APDU Parameter 1
68f0: 20 28 50 31 29 0a 20 2a 0a 20 2a 20 20 20 20 20 (P1). *. *
6900: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 32 unsigned char p2
6910: 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 . * APDU
6920: 20 50 61 72 61 6d 65 74 65 72 20 32 20 28 50 32 Parameter 2 (P2
6930: 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 ). *. * unsi
6940: 67 6e 65 64 20 63 68 61 72 20 6c 63 0a 20 2a 20 gned char lc. *
6950: 20 20 20 20 20 20 20 20 41 50 44 55 20 4c 65 6e APDU Len
6960: 67 74 68 20 6f 66 20 43 6f 6e 74 65 6e 74 20 28 gth of Content (
6970: 4c 63 29 20 2d 2d 20 74 68 69 73 20 69 73 20 74 Lc) -- this is t
6980: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 22 64 61 he length of "da
6990: 74 61 22 0a 20 2a 20 20 20 20 20 20 20 20 20 70 ta". * p
69a0: 61 72 61 6d 65 74 65 72 2e 20 20 49 66 20 22 64 arameter. If "d
69b0: 61 74 61 22 20 69 73 20 73 70 65 63 69 66 69 65 ata" is specifie
69c0: 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20 d as NULL, this
69d0: 70 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 0a 20 parameter will.
69e0: 2a 20 20 20 20 20 20 20 20 20 62 65 20 69 67 6e * be ign
69f0: 6f 72 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 ored.. *. *
6a00: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 unsigned char *d
6a10: 61 74 61 0a 20 2a 20 20 20 20 20 20 20 20 20 50 ata. * P
6a20: 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 ointer to buffer
6a30: 20 74 6f 20 73 65 6e 64 2e 20 20 49 74 20 73 68 to send. It sh
6a40: 6f 75 6c 64 20 62 65 20 22 4c 63 22 20 62 79 74 ould be "Lc" byt
6a50: 65 73 20 6c 6f 6e 67 2e 20 20 49 66 0a 20 2a 20 es long. If. *
6a60: 20 20 20 20 20 20 20 20 73 70 65 63 69 66 69 65 specifie
6a70: 64 20 61 73 20 4e 55 4c 4c 2c 20 22 4c 63 22 20 d as NULL, "Lc"
6a80: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 6e 74 will not be sent
6a90: 2c 20 61 6e 64 20 74 68 69 73 20 62 75 66 66 65 , and this buffe
6aa0: 72 20 77 69 6c 6c 20 62 65 0a 20 2a 20 20 20 20 r will be. *
6ab0: 20 20 20 20 20 69 67 6e 6f 72 65 64 2e 0a 20 2a ignored.. *
6ac0: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 . * unsigned
6ad0: 20 63 68 61 72 20 6c 65 0a 20 2a 20 20 20 20 20 char le. *
6ae0: 20 20 20 20 41 50 44 55 20 4c 65 6e 67 74 68 20 APDU Length
6af0: 6f 66 20 45 78 70 65 63 74 61 74 69 6f 6e 20 28 of Expectation (
6b00: 4c 65 29 20 2d 2d 20 74 68 69 73 20 69 73 20 74 Le) -- this is t
6b10: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 he length of the
6b20: 0a 20 2a 20 20 20 20 20 20 20 20 20 65 78 70 65 . * expe
6b30: 63 74 65 64 20 72 65 70 6c 79 2e 20 20 49 66 20 cted reply. If
6b40: 74 68 69 73 20 69 73 20 73 70 65 63 69 66 69 65 this is specifie
6b50: 64 20 61 73 20 30 20 74 68 65 6e 20 69 74 20 77 d as 0 then it w
6b60: 69 6c 6c 20 6e 6f 74 0a 20 2a 20 20 20 20 20 20 ill not. *
6b70: 20 20 20 62 65 20 73 65 6e 74 2e 0a 20 2a 0a 20 be sent.. *.
6b80: 2a 20 20 20 20 20 75 69 6e 74 31 36 5f 74 20 2a * uint16_t *
6b90: 72 65 73 70 63 6f 64 65 0a 20 2a 20 20 20 20 20 respcode. *
6ba0: 20 20 20 20 5b 4f 55 54 5d 20 50 6f 69 6e 74 65 [OUT] Pointe
6bb0: 72 20 74 6f 20 73 74 6f 72 61 67 65 20 6f 66 20 r to storage of
6bc0: 41 50 44 55 20 72 65 73 70 6f 6e 73 65 20 63 6f APDU response co
6bd0: 64 65 2e 20 20 49 66 20 74 68 69 73 20 69 73 0a de. If this is.
6be0: 20 2a 20 20 20 20 20 20 20 20 20 73 70 65 63 69 * speci
6bf0: 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68 fied as NULL, th
6c00: 65 20 72 65 73 70 6f 6e 73 65 20 63 6f 64 65 20 e response code
6c10: 77 69 6c 6c 20 62 65 20 64 69 73 63 61 72 64 65 will be discarde
6c20: 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 d.. *. * uns
6c30: 69 67 6e 65 64 20 63 68 61 72 20 2a 72 65 73 70 igned char *resp
6c40: 64 61 74 61 0a 20 2a 20 20 20 20 20 20 20 20 20 data. *
6c50: 5b 4f 55 54 5d 20 50 6f 69 6e 74 65 72 20 74 6f [OUT] Pointer to
6c60: 20 73 74 6f 72 61 67 65 20 6f 66 20 41 50 44 55 storage of APDU
6c70: 20 72 65 73 70 6f 6e 73 65 20 64 61 74 61 2e 20 response data.
6c80: 20 49 66 20 74 68 69 73 20 69 73 0a 20 2a 20 20 If this is. *
6c90: 20 20 20 20 20 20 20 73 70 65 63 69 66 69 65 64 specified
6ca0: 20 61 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 as NULL, the re
6cb0: 73 70 6f 6e 73 65 20 64 61 74 61 20 77 69 6c 6c sponse data will
6cc0: 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 20 20 be discarded.
6cd0: 49 66 0a 20 2a 20 20 20 20 20 20 20 20 20 74 68 If. * th
6ce0: 65 20 22 72 65 73 70 64 61 74 61 5f 6c 65 6e 22 e "respdata_len"
6cf0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 73 70 parameter is sp
6d00: 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c ecified as NULL,
6d10: 20 74 68 69 73 20 62 75 66 66 65 72 0a 20 2a 20 this buffer. *
6d20: 20 20 20 20 20 20 20 20 77 69 6c 6c 20 6e 6f 74 will not
6d30: 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 2a 0a be updated.. *.
6d40: 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 2a 72 * size_t *r
6d50: 65 73 70 64 61 74 61 5f 6c 65 6e 0a 20 2a 20 20 espdata_len. *
6d60: 20 20 20 20 20 20 20 5b 49 4e 2c 20 4f 55 54 5d [IN, OUT]
6d70: 20 50 6f 69 6e 74 65 72 20 69 6e 69 74 69 61 6c Pointer initial
6d80: 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 ing containing t
6d90: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 22 he size of the "
6da0: 72 65 73 70 64 61 74 61 22 0a 20 2a 20 20 20 20 respdata". *
6db0: 20 20 20 20 20 62 75 66 66 65 72 2e 20 20 42 65 buffer. Be
6dc0: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 fore returning,
6dd0: 74 68 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 76 the pointed to v
6de0: 61 6c 75 65 20 69 73 20 75 70 64 61 74 65 64 20 alue is updated
6df0: 74 6f 20 74 68 65 0a 20 2a 20 20 20 20 20 20 20 to the. *
6e00: 20 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 number of byte
6e10: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 s written to the
6e20: 20 62 75 66 66 65 72 2e 20 20 49 66 20 74 68 69 buffer. If thi
6e30: 73 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61 s is specified a
6e40: 73 0a 20 2a 20 20 20 20 20 20 20 20 20 4e 55 4c s. * NUL
6e50: 4c 2c 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 L, it will not b
6e60: 65 20 75 70 64 61 74 65 64 2c 20 61 6e 64 20 22 e updated, and "
6e70: 72 65 73 70 64 61 74 61 22 20 77 69 6c 6c 20 62 respdata" will b
6e80: 65 20 69 67 6e 6f 72 65 64 20 63 61 75 73 69 6e e ignored causin
6e90: 67 0a 20 2a 20 20 20 20 20 20 20 20 20 74 68 65 g. * the
6ea0: 20 72 65 73 70 6f 6e 73 65 20 64 61 74 61 20 74 response data t
6eb0: 6f 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a o be discarded..
6ec0: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c *. * RETURN VAL
6ed0: 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 UE. * CACKEY
6ee0: 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 _PCSC_S_OK
6ef0: 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a On success.
6f00: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 * CACKEY_PC
6f10: 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 SC_E_GENERIC
6f20: 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 20 20 20 On error. *
6f30: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f CACKEY_PCSC_E_
6f40: 54 4f 4b 45 4e 41 42 53 45 4e 54 20 20 49 66 20 TOKENABSENT If
6f50: 74 68 65 20 73 65 6e 64 69 6e 67 20 66 61 69 6c the sending fail
6f60: 65 64 20 62 65 63 61 75 73 65 20 74 68 65 20 74 ed because the t
6f70: 6f 6b 65 6e 20 69 73 0a 20 2a 20 20 20 20 20 20 oken is. *
6f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6f90: 20 20 20 20 20 20 20 20 20 20 61 62 73 65 6e 74 absent
6fa0: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 . *. * NOTES. *
6fb0: 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f This functio
6fc0: 6e 20 77 69 6c 6c 20 63 6f 6e 6e 65 63 74 20 74 n will connect t
6fd0: 6f 20 74 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e o the PC/SC Conn
6fe0: 65 63 74 69 6f 6e 20 4d 61 6e 61 67 65 72 20 76 ection Manager v
6ff0: 69 61 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 ia. * cackey
7000: 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 20 _pcsc_connect()
7010: 69 66 20 6e 65 65 64 65 64 2e 0a 20 2a 0a 20 2a if needed.. *. *
7020: 20 20 20 20 20 49 74 20 77 69 6c 6c 20 63 6f 6e It will con
7030: 6e 65 63 74 20 74 6f 20 74 68 65 20 63 61 72 64 nect to the card
7040: 20 69 6e 20 74 68 65 20 72 65 61 64 65 72 20 61 in the reader a
7050: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 73 ttached to the s
7060: 6c 6f 74 0a 20 2a 20 20 20 20 20 73 70 65 63 69 lot. * speci
7070: 66 69 65 64 2e 20 20 49 74 20 77 69 6c 6c 20 72 fied. It will r
7080: 65 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20 econnect to the
7090: 63 61 72 64 20 69 66 20 74 68 65 20 63 6f 6e 6e card if the conn
70a0: 65 63 74 69 6f 6e 0a 20 2a 20 20 20 20 20 67 6f ection. * go
70b0: 65 73 20 61 77 61 79 2e 0a 20 2a 0a 20 2a 2f 0a es away.. *. */.
70c0: 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 static cackey_re
70d0: 74 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 t cackey_send_ap
70e0: 64 75 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 du(struct cackey
70f0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 _slot *slot, uns
7100: 69 67 6e 65 64 20 63 68 61 72 20 63 6c 61 73 73 igned char class
7110: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 , unsigned char
7120: 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 75 6e 73 instruction, uns
7130: 69 67 6e 65 64 20 63 68 61 72 20 70 31 2c 20 75 igned char p1, u
7140: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 32 2c nsigned char p2,
7150: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c unsigned char l
7160: 63 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 c, unsigned char
7170: 20 2a 64 61 74 61 2c 20 75 6e 73 69 67 6e 65 64 *data, unsigned
7180: 20 63 68 61 72 20 6c 65 2c 20 75 69 6e 74 31 36 char le, uint16
7190: 5f 74 20 2a 72 65 73 70 63 6f 64 65 2c 20 75 6e _t *respcode, un
71a0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 72 65 73 signed char *res
71b0: 70 64 61 74 61 2c 20 73 69 7a 65 5f 74 20 2a 72 pdata, size_t *r
71c0: 65 73 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 espdata_len) {..
71d0: 75 69 6e 74 38 5f 74 20 6d 61 6a 6f 72 5f 72 63 uint8_t major_rc
71e0: 2c 20 6d 69 6e 6f 72 5f 72 63 3b 0a 09 73 69 7a , minor_rc;..siz
71f0: 65 5f 74 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 e_t bytes_to_cop
7200: 79 2c 20 74 6d 70 5f 72 65 73 70 64 61 74 61 5f y, tmp_respdata_
7210: 6c 65 6e 3b 0a 09 44 57 4f 52 44 20 70 72 6f 74 len;..DWORD prot
7220: 6f 63 6f 6c 3b 0a 09 44 57 4f 52 44 20 78 6d 69 ocol;..DWORD xmi
7230: 74 5f 6c 65 6e 2c 20 72 65 63 76 5f 6c 65 6e 3b t_len, recv_len;
7240: 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 78 6d 69 ..LONG scard_xmi
7250: 74 5f 72 65 74 2c 20 73 63 61 72 64 5f 72 65 63 t_ret, scard_rec
7260: 6f 6e 6e 5f 72 65 74 3b 0a 09 42 59 54 45 20 78 onn_ret;..BYTE x
7270: 6d 69 74 5f 62 75 66 5b 31 30 32 34 5d 2c 20 72 mit_buf[1024], r
7280: 65 63 76 5f 62 75 66 5b 31 30 32 34 5d 3b 0a 09 ecv_buf[1024];..
7290: 69 6e 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 int pcsc_connect
72a0: 5f 72 65 74 2c 20 70 63 73 63 5f 67 65 74 72 65 _ret, pcsc_getre
72b0: 73 70 5f 72 65 74 3b 0a 09 69 6e 74 20 69 64 78 sp_ret;..int idx
72c0: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ;...CACKEY_DEBUG
72d0: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
72e0: 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c 6f 74 29 ");...if (!slot)
72f0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
7300: 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 G_PRINTF("Invali
7310: 64 20 73 6c 6f 74 20 73 70 65 63 69 66 69 65 64 d slot specified
7320: 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
7330: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e ACKEY_PCSC_E_GEN
7340: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 ERIC);..}...pcsc
7350: 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 _connect_ret = c
7360: 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 ackey_connect_ca
7370: 72 64 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28 70 rd(slot);..if (p
7380: 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 csc_connect_ret
7390: 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 != CACKEY_PCSC_S
73a0: 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f _OK) {...CACKEY_
73b0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e DEBUG_PRINTF("Un
73c0: 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20 able to connect
73d0: 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69 to card, returni
73e0: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b ng in failure");
73f0: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 ....return(CACKE
7400: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 Y_PCSC_E_GENERIC
7410: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 72 61 6e 73 );..}.../* Trans
7420: 6d 69 74 20 2a 2f 0a 09 78 6d 69 74 5f 6c 65 6e mit */..xmit_len
7430: 20 3d 20 30 3b 0a 09 78 6d 69 74 5f 62 75 66 5b = 0;..xmit_buf[
7440: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 63 6c xmit_len++] = cl
7450: 61 73 73 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78 ass;..xmit_buf[x
7460: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 69 6e 73 mit_len++] = ins
7470: 74 72 75 63 74 69 6f 6e 3b 0a 09 78 6d 69 74 5f truction;..xmit_
7480: 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 buf[xmit_len++]
7490: 3d 20 70 31 3b 0a 09 78 6d 69 74 5f 62 75 66 5b = p1;..xmit_buf[
74a0: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 70 32 xmit_len++] = p2
74b0: 3b 0a 09 69 66 20 28 64 61 74 61 29 20 7b 0a 09 ;..if (data) {..
74c0: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c .xmit_buf[xmit_l
74d0: 65 6e 2b 2b 5d 20 3d 20 6c 63 3b 0a 09 09 66 6f en++] = lc;...fo
74e0: 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 r (idx = 0; idx
74f0: 3c 20 6c 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 < lc; idx++) {..
7500: 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f ..xmit_buf[xmit_
7510: 6c 65 6e 2b 2b 5d 20 3d 20 64 61 74 61 5b 69 64 len++] = data[id
7520: 78 5d 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 x];...}..}...if
7530: 28 6c 65 20 21 3d 20 30 78 30 30 29 20 7b 0a 09 (le != 0x00) {..
7540: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c .xmit_buf[xmit_l
7550: 65 6e 2b 2b 5d 20 3d 20 6c 65 3b 0a 09 7d 0a 0a en++] = le;..}..
7560: 09 2f 2a 20 42 65 67 69 6e 20 53 6d 61 72 74 63 ./* Begin Smartc
7570: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 ard Transaction
7580: 2a 2f 0a 09 63 61 63 6b 65 79 5f 62 65 67 69 6e */..cackey_begin
7590: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f _transaction(slo
75a0: 74 29 3b 0a 0a 09 69 66 20 28 63 6c 61 73 73 20 t);...if (class
75b0: 3d 3d 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 == GSCIS_CLASS_I
75c0: 53 4f 37 38 31 36 20 26 26 20 69 6e 73 74 72 75 SO7816 && instru
75d0: 63 74 69 6f 6e 20 3d 3d 20 47 53 43 49 53 5f 49 ction == GSCIS_I
75e0: 4e 53 54 52 5f 56 45 52 49 46 59 20 26 26 20 70 NSTR_VERIFY && p
75f0: 31 20 3d 3d 20 30 78 30 30 20 26 26 20 70 32 20 1 == 0x00 && p2
7600: 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 43 41 43 == 0x00) {...CAC
7610: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
7620: 28 22 53 65 6e 64 69 6e 67 20 41 50 44 55 3a 20 ("Sending APDU:
7630: 3c 3c 63 65 6e 73 6f 72 65 64 3e 3e 22 29 3b 0a <<censored>>");.
7640: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b .} else {...CACK
7650: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 EY_DEBUG_PRINTBU
7660: 46 28 22 53 65 6e 64 69 6e 67 20 41 50 44 55 3a F("Sending APDU:
7670: 22 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69 ", xmit_buf, xmi
7680: 74 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 72 65 63 t_len);..}...rec
7690: 76 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 72 v_len = sizeof(r
76a0: 65 63 76 5f 62 75 66 29 3b 0a 09 73 63 61 72 64 ecv_buf);..scard
76b0: 5f 78 6d 69 74 5f 72 65 74 20 3d 20 53 43 61 72 _xmit_ret = SCar
76c0: 64 54 72 61 6e 73 6d 69 74 28 73 6c 6f 74 2d 3e dTransmit(slot->
76d0: 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 pcsc_card, SCARD
76e0: 5f 50 43 49 5f 54 30 2c 20 78 6d 69 74 5f 62 75 _PCI_T0, xmit_bu
76f0: 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20 4e 55 4c f, xmit_len, NUL
7700: 4c 2c 20 72 65 63 76 5f 62 75 66 2c 20 26 72 65 L, recv_buf, &re
7710: 63 76 5f 6c 65 6e 29 3b 0a 09 69 66 20 28 73 63 cv_len);..if (sc
7720: 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 21 3d 20 ard_xmit_ret !=
7730: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 SCARD_S_SUCCESS)
7740: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
7750: 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 G_PRINTF("Failed
7760: 20 74 6f 20 73 65 6e 64 20 41 50 44 55 20 74 6f to send APDU to
7770: 20 63 61 72 64 20 28 53 43 61 72 64 54 72 61 6e card (SCardTran
7780: 73 6d 69 74 28 29 20 3d 20 25 73 2f 25 6c 78 29 smit() = %s/%lx)
7790: 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ", CACKEY_DEBUG_
77a0: 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f FUNC_SCARDERR_TO
77b0: 5f 53 54 52 28 73 63 61 72 64 5f 78 6d 69 74 5f _STR(scard_xmit_
77c0: 72 65 74 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 ret), (unsigned
77d0: 6c 6f 6e 67 29 20 73 63 61 72 64 5f 78 6d 69 74 long) scard_xmit
77e0: 5f 72 65 74 29 3b 0a 09 09 43 41 43 4b 45 59 5f _ret);...CACKEY_
77f0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 61 DEBUG_PRINTF("Ma
7800: 72 6b 69 6e 67 20 73 6c 6f 74 20 61 73 20 68 61 rking slot as ha
7810: 76 69 6e 67 20 62 65 65 6e 20 72 65 73 65 74 22 ving been reset"
7820: 29 3b 0a 0a 09 09 73 6c 6f 74 2d 3e 74 72 61 6e );....slot->tran
7830: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 saction_depth =
7840: 30 3b 0a 09 09 73 6c 6f 74 2d 3e 73 6c 6f 74 5f 0;...slot->slot_
7850: 72 65 73 65 74 20 3d 20 31 3b 0a 0a 09 09 69 66 reset = 1;....if
7860: 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 (scard_xmit_ret
7870: 20 3d 3d 20 53 43 41 52 44 5f 57 5f 52 45 53 45 == SCARD_W_RESE
7880: 54 5f 43 41 52 44 29 20 7b 0a 09 09 09 43 41 43 T_CARD) {....CAC
7890: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
78a0: 28 22 52 65 73 65 74 20 72 65 71 75 69 72 65 64 ("Reset required
78b0: 2c 20 70 6c 65 61 73 65 20 68 6f 6c 64 2e 2e 2e , please hold...
78c0: 22 29 3b 0a 0a 09 09 09 73 63 61 72 64 5f 72 65 ");.....scard_re
78d0: 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 conn_ret = SCard
78e0: 52 65 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e Reconnect(slot->
78f0: 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 pcsc_card, SCARD
7900: 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 _SHARE_SHARED, S
7910: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 CARD_PROTOCOL_T0
7920: 20 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f | SCARD_PROTOCO
7930: 4c 5f 54 31 2c 20 53 43 41 52 44 5f 52 45 53 45 L_T1, SCARD_RESE
7940: 54 5f 43 41 52 44 2c 20 26 70 72 6f 74 6f 63 6f T_CARD, &protoco
7950: 6c 29 3b 0a 09 09 09 69 66 20 28 73 63 61 72 64 l);....if (scard
7960: 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 _reconn_ret == S
7970: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 CARD_S_SUCCESS)
7980: 7b 0a 09 09 09 09 2f 2a 20 52 65 2d 65 73 74 61 {...../* Re-esta
7990: 62 6c 69 73 68 20 74 72 61 6e 73 61 63 74 69 6f blish transactio
79a0: 6e 2c 20 69 66 20 69 74 20 77 61 73 20 70 72 65 n, if it was pre
79b0: 73 65 6e 74 20 2a 2f 0a 09 09 09 09 69 66 20 28 sent */.....if (
79c0: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f slot->transactio
79d0: 6e 5f 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 n_depth > 0) {..
79e0: 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 ....slot->transa
79f0: 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 09 ction_depth--;..
7a00: 09 09 09 09 63 61 63 6b 65 79 5f 62 65 67 69 6e ....cackey_begin
7a10: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f _transaction(slo
7a20: 74 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 t);.....}......C
7a30: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
7a40: 54 46 28 22 52 65 73 65 74 20 73 75 63 63 65 73 TF("Reset succes
7a50: 73 66 75 6c 2c 20 72 65 74 72 61 6e 73 6d 69 74 sful, retransmit
7a60: 74 69 6e 67 22 29 3b 0a 0a 09 09 09 09 72 65 63 ting");......rec
7a70: 76 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 72 v_len = sizeof(r
7a80: 65 63 76 5f 62 75 66 29 3b 0a 09 09 09 09 73 63 ecv_buf);.....sc
7a90: 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 20 53 ard_xmit_ret = S
7aa0: 43 61 72 64 54 72 61 6e 73 6d 69 74 28 73 6c 6f CardTransmit(slo
7ab0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 t->pcsc_card, SC
7ac0: 41 52 44 5f 50 43 49 5f 54 30 2c 20 78 6d 69 74 ARD_PCI_T0, xmit
7ad0: 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20 _buf, xmit_len,
7ae0: 4e 55 4c 4c 2c 20 72 65 63 76 5f 62 75 66 2c 20 NULL, recv_buf,
7af0: 26 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 09 09 &recv_len);.....
7b00: 09 69 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f .if (scard_xmit_
7b10: 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 ret != SCARD_S_S
7b20: 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09 09 43 UCCESS) {......C
7b30: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
7b40: 54 46 28 22 52 65 74 72 61 6e 73 6d 69 74 20 66 TF("Retransmit f
7b50: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 ailed, returning
7b60: 20 69 6e 20 66 61 69 6c 75 72 65 20 61 66 74 65 in failure afte
7b70: 72 20 64 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20 r disconnecting
7b80: 74 68 65 20 63 61 72 64 20 28 53 43 61 72 64 54 the card (SCardT
7b90: 72 61 6e 73 6d 69 74 20 3d 20 25 73 2f 25 6c 69 ransmit = %s/%li
7ba0: 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 )", CACKEY_DEBUG
7bb0: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 _FUNC_SCARDERR_T
7bc0: 4f 5f 53 54 52 28 73 63 61 72 64 5f 78 6d 69 74 O_STR(scard_xmit
7bd0: 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 _ret), (long) sc
7be0: 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a ard_xmit_ret);..
7bf0: 09 09 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e .....SCardDiscon
7c00: 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f nect(slot->pcsc_
7c10: 63 61 72 64 2c 20 53 43 41 52 44 5f 52 45 53 45 card, SCARD_RESE
7c20: 54 5f 43 41 52 44 29 3b 0a 09 09 09 09 09 73 6c T_CARD);......sl
7c30: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f ot->pcsc_card_co
7c40: 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 nnected = 0;....
7c50: 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 .../* End Smartc
7c60: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 ard Transaction
7c70: 2a 2f 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72 */......slot->tr
7c80: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 ansaction_depth
7c90: 3d 20 31 3b 0a 09 09 09 09 09 63 61 63 6b 65 79 = 1;......cackey
7ca0: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e _end_transaction
7cb0: 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 09 72 65 (slot);.......re
7cc0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 turn(CACKEY_PCSC
7cd0: 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b _E_TOKENABSENT);
7ce0: 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 .....}....} else
7cf0: 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 {.....CACKEY_DE
7d00: 42 55 47 5f 50 52 49 4e 54 46 28 22 44 69 73 63 BUG_PRINTF("Disc
7d10: 6f 6e 6e 65 63 74 69 6e 67 20 63 61 72 64 22 29 onnecting card")
7d20: 3b 0a 0a 09 09 09 09 53 43 61 72 64 44 69 73 63 ;......SCardDisc
7d30: 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 onnect(slot->pcs
7d40: 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 52 45 c_card, SCARD_RE
7d50: 53 45 54 5f 43 41 52 44 29 3b 0a 09 09 09 09 73 SET_CARD);.....s
7d60: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 lot->pcsc_card_c
7d70: 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 onnected = 0;...
7d80: 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 .../* End Smartc
7d90: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 ard Transaction
7da0: 2a 2f 0a 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 */.....slot->tra
7db0: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d nsaction_depth =
7dc0: 20 31 3b 0a 09 09 09 09 63 61 63 6b 65 79 5f 65 1;.....cackey_e
7dd0: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 nd_transaction(s
7de0: 6c 6f 74 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 lot);......CACKE
7df0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
7e00: 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 Returning in fai
7e10: 6c 75 72 65 22 29 3b 0a 09 09 09 09 72 65 74 75 lure");.....retu
7e20: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 rn(CACKEY_PCSC_E
7e30: 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 _TOKENABSENT);..
7e40: 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 ..}...} else {..
7e50: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
7e60: 52 49 4e 54 46 28 22 44 69 73 63 6f 6e 6e 65 63 RINTF("Disconnec
7e70: 74 69 6e 67 20 63 61 72 64 22 29 3b 0a 0a 09 09 ting card");....
7e80: 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 .SCardDisconnect
7e90: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 (slot->pcsc_card
7ea0: 2c 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41 , SCARD_RESET_CA
7eb0: 52 44 29 3b 0a 09 09 09 73 6c 6f 74 2d 3e 70 63 RD);....slot->pc
7ec0: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 sc_card_connecte
7ed0: 64 20 3d 20 30 3b 0a 0a 09 09 09 2f 2a 20 45 6e d = 0;...../* En
7ee0: 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e d Smartcard Tran
7ef0: 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 73 6c saction */....sl
7f00: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f ot->transaction_
7f10: 64 65 70 74 68 20 3d 20 31 3b 0a 09 09 09 63 61 depth = 1;....ca
7f20: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 ckey_end_transac
7f30: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 tion(slot);.....
7f40: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
7f50: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 NTF("Returning i
7f60: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 09 09 09 n failure");....
7f70: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 return(CACKEY_PC
7f80: 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 SC_E_TOKENABSENT
7f90: 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b );...}..}...CACK
7fa0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 EY_DEBUG_PRINTBU
7fb0: 46 28 22 52 65 74 75 72 6e 65 64 20 56 61 6c 75 F("Returned Valu
7fc0: 65 3a 22 2c 20 72 65 63 76 5f 62 75 66 2c 20 72 e:", recv_buf, r
7fd0: 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 ecv_len);...if (
7fe0: 72 65 63 76 5f 6c 65 6e 20 3c 20 32 29 20 7b 0a recv_len < 2) {.
7ff0: 09 09 2f 2a 20 4d 69 6e 69 6d 61 6c 20 72 65 73 ../* Minimal res
8000: 70 6f 6e 73 65 20 6c 65 6e 67 74 68 20 69 73 20 ponse length is
8010: 32 20 62 79 74 65 73 2c 20 72 65 74 75 72 6e 69 2 bytes, returni
8020: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20 2a 2f ng in failure */
8030: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
8040: 50 52 49 4e 54 46 28 22 52 65 73 70 6f 6e 73 65 PRINTF("Response
8050: 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65 74 75 too small, retu
8060: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 rning in failure
8070: 20 28 72 65 63 76 5f 6c 65 6e 20 3d 20 25 6c 75 (recv_len = %lu
8080: 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f )", (unsigned lo
8090: 6e 67 29 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a ng) recv_len);..
80a0: 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 ../* End Smartca
80b0: 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a rd Transaction *
80c0: 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 /...cackey_end_t
80d0: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 ransaction(slot)
80e0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b ;....return(CACK
80f0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 EY_PCSC_E_GENERI
8100: 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 C);..}.../* Dete
8110: 72 6d 69 6e 65 20 72 65 73 75 6c 74 20 63 6f 64 rmine result cod
8120: 65 20 2a 2f 0a 09 6d 61 6a 6f 72 5f 72 63 20 3d e */..major_rc =
8130: 20 72 65 63 76 5f 62 75 66 5b 72 65 63 76 5f 6c recv_buf[recv_l
8140: 65 6e 20 2d 20 32 5d 3b 0a 09 6d 69 6e 6f 72 5f en - 2];..minor_
8150: 72 63 20 3d 20 72 65 63 76 5f 62 75 66 5b 72 65 rc = recv_buf[re
8160: 63 76 5f 6c 65 6e 20 2d 20 31 5d 3b 0a 09 69 66 cv_len - 1];..if
8170: 20 28 72 65 73 70 63 6f 64 65 29 20 7b 0a 09 09 (respcode) {...
8180: 2a 72 65 73 70 63 6f 64 65 20 3d 20 28 6d 61 6a *respcode = (maj
8190: 6f 72 5f 72 63 20 3c 3c 20 38 29 20 7c 20 6d 69 or_rc << 8) | mi
81a0: 6e 6f 72 5f 72 63 3b 0a 09 7d 0a 0a 09 2f 2a 20 nor_rc;..}.../*
81b0: 41 64 6a 75 73 74 20 6d 65 73 73 61 67 65 20 62 Adjust message b
81c0: 75 66 66 65 72 20 2a 2f 0a 09 72 65 63 76 5f 6c uffer */..recv_l
81d0: 65 6e 20 2d 3d 20 32 3b 0a 0a 09 2f 2a 20 41 64 en -= 2;.../* Ad
81e0: 64 20 62 79 74 65 73 20 74 6f 20 72 65 74 75 72 d bytes to retur
81f0: 6e 20 76 61 6c 75 65 20 2a 2f 0a 09 74 6d 70 5f n value */..tmp_
8200: 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20 30 respdata_len = 0
8210: 3b 0a 09 69 66 20 28 72 65 73 70 64 61 74 61 20 ;..if (respdata
8220: 26 26 20 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 && respdata_len)
8230: 20 7b 0a 09 09 74 6d 70 5f 72 65 73 70 64 61 74 {...tmp_respdat
8240: 61 5f 6c 65 6e 20 3d 20 2a 72 65 73 70 64 61 74 a_len = *respdat
8250: 61 5f 6c 65 6e 3b 0a 0a 09 09 62 79 74 65 73 5f a_len;....bytes_
8260: 74 6f 5f 63 6f 70 79 20 3d 20 2a 72 65 73 70 64 to_copy = *respd
8270: 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 69 66 20 28 ata_len;....if (
8280: 72 65 63 76 5f 6c 65 6e 20 3c 20 62 79 74 65 73 recv_len < bytes
8290: 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a 09 09 09 62 _to_copy) {....b
82a0: 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 72 ytes_to_copy = r
82b0: 65 63 76 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09 ecv_len;...}....
82c0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
82d0: 4e 54 46 28 22 43 6f 70 79 69 6e 67 20 25 6c 75 NTF("Copying %lu
82e0: 20 62 79 74 65 73 20 74 6f 20 74 68 65 20 62 75 bytes to the bu
82f0: 66 66 65 72 20 28 72 65 63 76 27 64 20 25 6c 75 ffer (recv'd %lu
8300: 20 62 79 74 65 73 2c 20 62 75 74 20 6f 6e 6c 79 bytes, but only
8310: 20 25 6c 75 20 62 79 74 65 73 20 6c 65 66 74 20 %lu bytes left
8320: 69 6e 20 6f 75 72 20 62 75 66 66 65 72 29 22 2c in our buffer)",
8330: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
8340: 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 2c 20 bytes_to_copy,
8350: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
8360: 72 65 63 76 5f 6c 65 6e 2c 20 28 75 6e 73 69 67 recv_len, (unsig
8370: 6e 65 64 20 6c 6f 6e 67 29 20 2a 72 65 73 70 64 ned long) *respd
8380: 61 74 61 5f 6c 65 6e 29 3b 0a 0a 09 09 6d 65 6d ata_len);....mem
8390: 63 70 79 28 72 65 73 70 64 61 74 61 2c 20 72 65 cpy(respdata, re
83a0: 63 76 5f 62 75 66 2c 20 62 79 74 65 73 5f 74 6f cv_buf, bytes_to
83b0: 5f 63 6f 70 79 29 3b 0a 09 09 72 65 73 70 64 61 _copy);...respda
83c0: 74 61 20 2b 3d 20 62 79 74 65 73 5f 74 6f 5f 63 ta += bytes_to_c
83d0: 6f 70 79 3b 0a 0a 09 09 2a 72 65 73 70 64 61 74 opy;....*respdat
83e0: 61 5f 6c 65 6e 20 3d 20 62 79 74 65 73 5f 74 6f a_len = bytes_to
83f0: 5f 63 6f 70 79 3b 0a 09 09 74 6d 70 5f 72 65 73 _copy;...tmp_res
8400: 70 64 61 74 61 5f 6c 65 6e 20 2d 3d 20 62 79 74 pdata_len -= byt
8410: 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 09 7d 20 65 es_to_copy;..} e
8420: 6c 73 65 20 7b 0a 09 09 69 66 20 28 72 65 63 76 lse {...if (recv
8430: 5f 6c 65 6e 20 21 3d 20 30 29 20 7b 0a 09 09 09 _len != 0) {....
8440: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
8450: 4e 54 46 28 22 54 68 72 6f 77 69 6e 67 20 61 77 NTF("Throwing aw
8460: 61 79 20 25 6c 75 20 62 79 74 65 73 2c 20 6e 6f ay %lu bytes, no
8470: 77 68 65 72 65 20 74 6f 20 70 75 74 20 74 68 65 where to put the
8480: 6d 21 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c m!", (unsigned l
8490: 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e 29 3b 0a ong) recv_len);.
84a0: 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6d 61 6a ..}..}...if (maj
84b0: 6f 72 5f 72 63 20 3d 3d 20 30 78 36 31 29 20 7b or_rc == 0x61) {
84c0: 0a 09 09 2f 2a 20 57 65 20 6e 65 65 64 20 74 6f .../* We need to
84d0: 20 52 45 41 44 20 2a 2f 0a 09 09 43 41 43 4b 45 READ */...CACKE
84e0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
84f0: 42 75 66 66 65 72 20 72 65 61 64 20 72 65 71 75 Buffer read requ
8500: 69 72 65 64 22 29 3b 0a 0a 09 09 69 66 20 28 6d ired");....if (m
8510: 69 6e 6f 72 5f 72 63 20 3d 3d 20 30 78 30 30 29 inor_rc == 0x00)
8520: 20 7b 0a 09 09 09 6d 69 6e 6f 72 5f 72 63 20 3d {....minor_rc =
8530: 20 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 CACKEY_APDU_MTU
8540: 3b 0a 09 09 7d 0a 0a 09 09 70 63 73 63 5f 67 65 ;...}....pcsc_ge
8550: 74 72 65 73 70 5f 72 65 74 20 3d 20 63 61 63 6b tresp_ret = cack
8560: 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f ey_send_apdu(slo
8570: 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 t, GSCIS_CLASS_I
8580: 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e SO7816, GSCIS_IN
8590: 53 54 52 5f 47 45 54 5f 52 45 53 50 4f 4e 53 45 STR_GET_RESPONSE
85a0: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 2c , 0x00, 0x00, 0,
85b0: 20 4e 55 4c 4c 2c 20 6d 69 6e 6f 72 5f 72 63 2c NULL, minor_rc,
85c0: 20 72 65 73 70 63 6f 64 65 2c 20 72 65 73 70 64 respcode, respd
85d0: 61 74 61 2c 20 26 74 6d 70 5f 72 65 73 70 64 61 ata, &tmp_respda
85e0: 74 61 5f 6c 65 6e 29 3b 0a 09 09 69 66 20 28 70 ta_len);...if (p
85f0: 63 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20 csc_getresp_ret
8600: 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 != CACKEY_PCSC_S
8610: 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 _OK) {....CACKEY
8620: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 42 _DEBUG_PRINTF("B
8630: 75 66 66 65 72 20 72 65 61 64 20 66 61 69 6c 65 uffer read faile
8640: 64 21 20 20 52 65 74 75 72 6e 69 6e 67 20 69 6e d! Returning in
8650: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 failure");.....
8660: 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 /* End Smartcard
8670: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a Transaction */.
8680: 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 ...cackey_end_tr
8690: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b ansaction(slot);
86a0: 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b .....return(CACK
86b0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 EY_PCSC_E_GENERI
86c0: 43 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72 C);...}....if (r
86d0: 65 73 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 espdata_len) {..
86e0: 09 09 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 ..*respdata_len
86f0: 2b 3d 20 74 6d 70 5f 72 65 73 70 64 61 74 61 5f += tmp_respdata_
8700: 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 45 len;...}..../* E
8710: 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 nd Smartcard Tra
8720: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 nsaction */...ca
8730: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 ckey_end_transac
8740: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 43 tion(slot);....C
8750: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
8760: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e TF("Returning in
8770: 20 73 75 63 63 65 73 73 20 28 62 75 66 66 65 72 success (buffer
8780: 20 72 65 61 64 20 63 6f 6d 70 6c 65 74 65 29 22 read complete)"
8790: 29 3b 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b );...return(CACK
87a0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 EY_PCSC_S_OK);..
87b0: 7d 0a 0a 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 }.../* End Smart
87c0: 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e card Transaction
87d0: 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f */..cackey_end_
87e0: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 transaction(slot
87f0: 29 3b 0a 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 72 );...if (major_r
8800: 63 20 3d 3d 20 30 78 39 30 29 20 7b 0a 09 09 2f c == 0x90) {.../
8810: 2a 20 53 75 63 63 65 73 73 20 2a 2f 0a 09 09 43 * Success */...C
8820: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
8830: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e TF("Returning in
8840: 20 73 75 63 63 65 73 73 20 28 6d 61 6a 6f 72 5f success (major_
8850: 72 63 20 3d 20 30 78 39 30 29 22 29 3b 0a 0a 09 rc = 0x90)");...
8860: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 .return(CACKEY_P
8870: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 0a CSC_S_OK);..}...
8880: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
8890: 49 4e 54 46 28 22 41 50 44 55 20 52 65 74 75 72 INTF("APDU Retur
88a0: 6e 65 64 20 61 6e 20 65 72 72 6f 72 2c 20 72 65 ned an error, re
88b0: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 turning in failu
88c0: 72 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 re");...return(C
88d0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e ACKEY_PCSC_E_GEN
88e0: 45 52 49 43 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 ERIC);.}../*. *
88f0: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 SYNPOSIS. *
8900: 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 72 ssize_t cackey_r
8910: 65 61 64 5f 62 75 66 66 65 72 28 73 74 72 75 63 ead_buffer(struc
8920: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 t cackey_slot *s
8930: 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 lot, unsigned ch
8940: 61 72 20 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 ar *buffer, size
8950: 5f 74 20 63 6f 75 6e 74 2c 20 75 6e 73 69 67 6e _t count, unsign
8960: 65 64 20 63 68 61 72 20 74 5f 6f 72 5f 76 2c 20 ed char t_or_v,
8970: 73 69 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f size_t initial_o
8980: 66 66 73 65 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 ffset);. *. * AR
8990: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 GUMENTS. * s
89a0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f truct cackey_slo
89b0: 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 t *slot. *
89c0: 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 Slot to send
89d0: 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 commands to. *.
89e0: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 * unsigned c
89f0: 68 61 72 20 2a 62 75 66 66 65 72 0a 20 2a 20 20 har *buffer. *
8a00: 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 42 75 66 [OUT] Buf
8a10: 66 65 72 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 fer. *. * si
8a20: 7a 65 5f 74 20 63 6f 75 6e 74 0a 20 2a 20 20 20 ze_t count. *
8a30: 20 20 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 Number of
8a40: 62 79 74 65 73 20 74 6f 20 61 74 74 65 6d 70 74 bytes to attempt
8a50: 20 74 6f 20 72 65 61 64 0a 20 2a 0a 20 2a 20 20 to read. *. *
8a60: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 unsigned char
8a70: 20 74 5f 6f 72 5f 76 0a 20 2a 20 20 20 20 20 20 t_or_v. *
8a80: 20 20 20 53 65 6c 65 63 74 20 74 68 65 20 54 2d Select the T-
8a90: 62 75 66 66 65 72 20 28 30 31 29 20 6f 72 20 56 buffer (01) or V
8aa0: 2d 62 75 66 66 65 72 20 28 30 32 29 20 74 6f 20 -buffer (02) to
8ab0: 72 65 61 64 20 66 72 6f 6d 2e 20 20 0a 20 2a 0a read from. . *.
8ac0: 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 69 6e * size_t in
8ad0: 69 74 69 61 6c 5f 6f 66 66 73 65 74 0a 20 2a 20 itial_offset. *
8ae0: 20 20 20 20 20 20 20 20 53 70 65 63 69 66 79 20 Specify
8af0: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 62 65 the offset to be
8b00: 67 69 6e 20 74 68 65 20 72 65 61 64 20 66 72 6f gin the read fro
8b10: 6d 0a 20 2a 0a 20 2a 0a 20 2a 20 52 45 54 55 52 m. *. *. * RETUR
8b20: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 54 N VALUE. * T
8b30: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 his function ret
8b40: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 urns the number
8b50: 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c of bytes actuall
8b60: 79 20 72 65 61 64 2c 20 6f 72 20 2d 31 20 6f 6e y read, or -1 on
8b70: 20 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 20 4e 4f error.. *. * NO
8b80: 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a TES. * None.
8b90: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73 *. */.static ss
8ba0: 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 72 65 61 ize_t cackey_rea
8bb0: 64 5f 62 75 66 66 65 72 28 73 74 72 75 63 74 20 d_buffer(struct
8bc0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f cackey_slot *slo
8bd0: 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 t, unsigned char
8be0: 20 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 *buffer, size_t
8bf0: 20 63 6f 75 6e 74 2c 20 75 6e 73 69 67 6e 65 64 count, unsigned
8c00: 20 63 68 61 72 20 74 5f 6f 72 5f 76 2c 20 73 69 char t_or_v, si
8c10: 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66 ze_t initial_off
8c20: 73 65 74 29 20 7b 0a 09 73 69 7a 65 5f 74 20 6f set) {..size_t o
8c30: 66 66 73 65 74 20 3d 20 30 2c 20 6d 61 78 5f 6f ffset = 0, max_o
8c40: 66 66 73 65 74 2c 20 6d 61 78 5f 63 6f 75 6e 74 ffset, max_count
8c50: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 ;..unsigned char
8c60: 20 63 6d 64 5b 32 5d 3b 0a 09 75 69 6e 74 31 36 cmd[2];..uint16
8c70: 5f 74 20 72 65 73 70 63 6f 64 65 3b 0a 09 69 6e _t respcode;..in
8c80: 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 t send_ret;...CA
8c90: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
8ca0: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
8cb0: 6d 61 78 5f 6f 66 66 73 65 74 20 3d 20 63 6f 75 max_offset = cou
8cc0: 6e 74 3b 0a 09 6d 61 78 5f 63 6f 75 6e 74 20 3d nt;..max_count =
8cd0: 20 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 CACKEY_APDU_MTU
8ce0: 3b 0a 0a 09 69 66 20 28 74 5f 6f 72 5f 76 20 21 ;...if (t_or_v !
8cf0: 3d 20 31 20 26 26 20 74 5f 6f 72 5f 76 20 21 3d = 1 && t_or_v !=
8d00: 20 32 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 2) {...CACKEY_D
8d10: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 EBUG_PRINTF("Inv
8d20: 61 6c 69 64 20 54 20 6f 72 20 56 20 70 61 72 61 alid T or V para
8d30: 6d 65 74 65 72 20 73 70 65 63 69 66 69 65 64 2c meter specified,
8d40: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 returning in fa
8d50: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 ilure");....retu
8d60: 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 63 6d 64 rn(-1);..}...cmd
8d70: 5b 30 5d 20 3d 20 74 5f 6f 72 5f 76 3b 0a 0a 09 [0] = t_or_v;...
8d80: 77 68 69 6c 65 20 28 31 29 20 7b 0a 09 09 69 66 while (1) {...if
8d90: 20 28 6f 66 66 73 65 74 20 3e 3d 20 6d 61 78 5f (offset >= max_
8da0: 6f 66 66 73 65 74 29 20 7b 0a 09 09 09 43 41 43 offset) {....CAC
8db0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
8dc0: 28 22 42 75 66 66 65 72 20 74 6f 6f 20 73 6d 61 ("Buffer too sma
8dd0: 6c 6c 2c 20 72 65 74 75 72 6e 69 6e 67 20 77 68 ll, returning wh
8de0: 61 74 20 77 65 20 67 6f 74 2e 2e 2e 22 29 3b 0a at we got...");.
8df0: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a ....break;...}..
8e00: 09 09 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 6f 66 ..count = max_of
8e10: 66 73 65 74 20 2d 20 6f 66 66 73 65 74 3b 0a 09 fset - offset;..
8e20: 09 69 66 20 28 63 6f 75 6e 74 20 3e 20 6d 61 78 .if (count > max
8e30: 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 63 6f 75 _count) {....cou
8e40: 6e 74 20 3d 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a nt = max_count;.
8e50: 09 09 7d 0a 0a 09 09 63 6d 64 5b 31 5d 20 3d 20 ..}....cmd[1] =
8e60: 63 6f 75 6e 74 3b 0a 0a 09 09 73 65 6e 64 5f 72 count;....send_r
8e70: 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 et = cackey_send
8e80: 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 _apdu(slot, GSCI
8e90: 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 S_CLASS_GLOBAL_P
8ea0: 4c 41 54 46 4f 52 4d 2c 20 47 53 43 49 53 5f 49 LATFORM, GSCIS_I
8eb0: 4e 53 54 52 5f 52 45 41 44 5f 42 55 46 46 45 52 NSTR_READ_BUFFER
8ec0: 2c 20 28 28 69 6e 69 74 69 61 6c 5f 6f 66 66 73 , ((initial_offs
8ed0: 65 74 20 2b 20 6f 66 66 73 65 74 29 20 3e 3e 20 et + offset) >>
8ee0: 38 29 20 26 20 30 78 66 66 2c 20 28 69 6e 69 74 8) & 0xff, (init
8ef0: 69 61 6c 5f 6f 66 66 73 65 74 20 2b 20 6f 66 66 ial_offset + off
8f00: 73 65 74 29 20 26 20 30 78 66 66 2c 20 73 69 7a set) & 0xff, siz
8f10: 65 6f 66 28 63 6d 64 29 2c 20 63 6d 64 2c 20 30 eof(cmd), cmd, 0
8f20: 78 30 30 2c 20 26 72 65 73 70 63 6f 64 65 2c 20 x00, &respcode,
8f30: 62 75 66 66 65 72 20 2b 20 6f 66 66 73 65 74 2c buffer + offset,
8f40: 20 26 63 6f 75 6e 74 29 3b 0a 09 09 69 66 20 28 &count);...if (
8f50: 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b send_ret != CACK
8f60: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a EY_PCSC_S_OK) {.
8f70: 09 09 09 69 66 20 28 72 65 73 70 63 6f 64 65 20 ...if (respcode
8f80: 3d 3d 20 30 78 36 41 38 36 29 20 7b 0a 09 09 09 == 0x6A86) {....
8f90: 09 69 66 20 28 6d 61 78 5f 63 6f 75 6e 74 20 3d .if (max_count =
8fa0: 3d 20 31 29 20 7b 0a 09 09 09 09 09 62 72 65 61 = 1) {......brea
8fb0: 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 6d 61 k;.....}......ma
8fc0: 78 5f 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 63 6f x_count = max_co
8fd0: 75 6e 74 20 2f 20 32 3b 0a 0a 09 09 09 09 63 6f unt / 2;......co
8fe0: 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 ntinue;....}....
8ff0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
9000: 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 73 65 6e INTF("cackey_sen
9010: 64 5f 61 70 64 75 28 29 20 66 61 69 6c 65 64 2c d_apdu() failed,
9020: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 returning in fa
9030: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 72 65 74 ilure");.....ret
9040: 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 urn(-1);...}....
9050: 6f 66 66 73 65 74 20 2b 3d 20 63 6f 75 6e 74 3b offset += count;
9060: 0a 0a 09 09 69 66 20 28 63 6f 75 6e 74 20 3c 20 ....if (count <
9070: 6d 61 78 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 max_count) {....
9080: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
9090: 4e 54 46 28 22 53 68 6f 72 74 20 72 65 61 64 20 NTF("Short read
90a0: 2d 2d 20 63 6f 75 6e 74 20 3d 20 25 69 2c 20 63 -- count = %i, c
90b0: 6d 64 5b 31 5d 20 3d 20 25 69 22 2c 20 28 69 6e md[1] = %i", (in
90c0: 74 29 20 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 t) count, (int)
90d0: 63 6d 64 5b 31 5d 29 3b 0a 0a 09 09 09 62 72 65 cmd[1]);.....bre
90e0: 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 ak;...}..}..#ifd
90f0: 65 66 20 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f ef CACKEY_PARANO
9100: 49 44 0a 23 20 20 69 66 64 65 66 20 5f 50 4f 53 ID.# ifdef _POS
9110: 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66 IX_SSIZE_MAX..if
9120: 20 28 6f 66 66 73 65 74 20 3e 20 5f 50 4f 53 49 (offset > _POSI
9130: 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 X_SSIZE_MAX) {..
9140: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
9150: 49 4e 54 46 28 22 4f 66 66 73 65 74 20 65 78 63 INTF("Offset exc
9160: 65 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c eeds maximum val
9170: 75 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e ue, returning in
9180: 20 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d failure. (max =
9190: 20 25 6c 69 2c 20 6f 66 66 73 65 74 20 3d 20 25 %li, offset = %
91a0: 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f lu)", (long) _PO
91b0: 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28 SIX_SSIZE_MAX, (
91c0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f unsigned long) o
91d0: 66 66 73 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 ffset);....retur
91e0: 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 n(-1);..}.# end
91f0: 69 66 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b if.#endif...CACK
9200: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
9210: 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 "Returning in su
9220: 63 63 65 73 73 2c 20 72 65 61 64 20 25 6c 75 20 ccess, read %lu
9230: 62 79 74 65 73 22 2c 20 28 75 6e 73 69 67 6e 65 bytes", (unsigne
9240: 64 20 6c 6f 6e 67 29 20 6f 66 66 73 65 74 29 3b d long) offset);
9250: 0a 0a 09 72 65 74 75 72 6e 28 6f 66 66 73 65 74 ...return(offset
9260: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 );.}../*. * SYNP
9270: 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b OSIS. * cack
9280: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65 ey_ret cackey_se
9290: 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 74 72 75 lect_applet(stru
92a0: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a ct cackey_slot *
92b0: 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 slot, unsigned c
92c0: 68 61 72 20 2a 61 69 64 2c 20 73 69 7a 65 5f 74 har *aid, size_t
92d0: 20 61 69 64 5f 6c 65 6e 29 3b 0a 20 2a 0a 20 2a aid_len);. *. *
92e0: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 ARGUMENTS. *
92f0: 20 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f struct cackey_
9300: 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 slot *slot. *
9310: 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 Slot to se
9320: 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 nd commands to.
9330: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 *. * unsigne
9340: 64 20 63 68 61 72 20 2a 61 69 64 0a 20 2a 20 20 d char *aid. *
9350: 20 20 20 20 20 20 20 42 75 66 66 65 72 20 63 6f Buffer co
9360: 6e 74 61 69 6e 69 6e 67 20 41 70 70 6c 65 74 20 ntaining Applet
9370: 49 44 20 74 6f 20 73 65 6c 65 63 74 0a 20 2a 0a ID to select. *.
9380: 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 61 69 * size_t ai
9390: 64 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20 20 d_len. *
93a0: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 Number of bytes
93b0: 20 69 6e 20 74 68 65 20 22 61 69 64 22 20 28 41 in the "aid" (A
93c0: 70 70 6c 65 74 20 49 44 29 20 70 61 72 61 6d 65 pplet ID) parame
93d0: 74 65 72 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e ter. *. * RETURN
93e0: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 VALUE. * CA
93f0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 CKEY_PCSC_S_OK
9400: 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 On succes
9410: 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f s. * CACKEY_
9420: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 PCSC_E_GENERIC
9430: 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a On error. *. *
9440: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f NOTES. * No
9450: 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 ne. *. */.static
9460: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b cackey_ret cack
9470: 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 ey_select_applet
9480: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 (struct cackey_s
9490: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 lot *slot, unsig
94a0: 6e 65 64 20 63 68 61 72 20 2a 61 69 64 2c 20 73 ned char *aid, s
94b0: 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 29 20 7b ize_t aid_len) {
94c0: 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a ..int send_ret;.
94d0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
94e0: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
94f0: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ;...CACKEY_DEBUG
9500: 5f 50 52 49 4e 54 42 55 46 28 22 53 65 6c 65 63 _PRINTBUF("Selec
9510: 74 69 6e 67 20 61 70 70 6c 65 74 3a 22 2c 20 61 ting applet:", a
9520: 69 64 2c 20 61 69 64 5f 6c 65 6e 29 3b 0a 0a 09 id, aid_len);...
9530: 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 send_ret = cacke
9540: 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 y_send_apdu(slot
9550: 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 , GSCIS_CLASS_IS
9560: 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 O7816, GSCIS_INS
9570: 54 52 5f 53 45 4c 45 43 54 2c 20 47 53 43 49 53 TR_SELECT, GSCIS
9580: 5f 50 41 52 41 4d 5f 53 45 4c 45 43 54 5f 41 50 _PARAM_SELECT_AP
9590: 50 4c 45 54 2c 20 30 78 30 30 2c 20 61 69 64 5f PLET, 0x00, aid_
95a0: 6c 65 6e 2c 20 61 69 64 2c 20 30 78 30 30 2c 20 len, aid, 0x00,
95b0: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c NULL, NULL, NULL
95c0: 29 3b 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 );..if (send_ret
95d0: 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f != CACKEY_PCSC_
95e0: 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 S_OK) {...CACKEY
95f0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 _DEBUG_PRINTF("F
9600: 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 61 70 ailed to open ap
9610: 70 6c 65 74 2c 20 72 65 74 75 72 6e 69 6e 67 20 plet, returning
9620: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 in failure");...
9630: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 .return(CACKEY_P
9640: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a CSC_E_GENERIC);.
9650: 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 .}...CACKEY_DEBU
9660: 47 5f 50 52 49 4e 54 46 28 22 53 75 63 63 65 73 G_PRINTF("Succes
9670: 73 66 75 6c 6c 79 20 73 65 6c 65 63 74 65 64 20 sfully selected
9680: 66 69 6c 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e file");...return
9690: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f (CACKEY_PCSC_S_O
96a0: 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e K);.}../*. * SYN
96b0: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 POSIS. * cac
96c0: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 key_ret cackey_s
96d0: 65 6c 65 63 74 5f 66 69 6c 65 28 73 74 72 75 63 elect_file(struc
96e0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 t cackey_slot *s
96f0: 6c 6f 74 2c 20 75 69 6e 74 31 36 5f 74 20 65 66 lot, uint16_t ef
9700: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e );. *. * ARGUMEN
9710: 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74 TS. * struct
9720: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c cackey_slot *sl
9730: 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c ot. * Sl
9740: 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 ot to send comma
9750: 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 nds to. *. *
9760: 20 75 69 6e 74 31 36 5f 74 20 65 66 0a 20 2a 20 uint16_t ef. *
9770: 20 20 20 20 20 20 20 20 45 6c 65 6d 65 6e 74 61 Elementa
9780: 6c 20 46 69 6c 65 20 74 6f 20 73 65 6c 65 63 74 l File to select
9790: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 . *. * RETURN VA
97a0: 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 LUE. * CACKE
97b0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 Y_PCSC_S_OK
97c0: 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 On success.
97d0: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 * CACKEY_PCS
97e0: 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f C_E_GENERIC O
97f0: 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f n error. *. * NO
9800: 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 TES. * This
9810: 73 65 6c 65 63 74 73 20 61 6e 20 45 6c 65 6d 65 selects an Eleme
9820: 6e 74 61 72 79 20 46 69 6c 65 20 28 45 46 29 20 ntary File (EF)
9830: 75 6e 64 65 72 20 74 68 65 20 63 75 72 72 65 6e under the curren
9840: 74 6c 79 20 73 65 6c 65 63 74 65 64 0a 20 2a 20 tly selected. *
9850: 20 20 20 20 44 65 64 69 63 61 74 65 64 20 46 69 Dedicated Fi
9860: 6c 65 20 28 44 46 29 0a 20 2a 0a 20 2a 20 20 20 le (DF). *. *
9870: 20 20 54 79 70 69 63 61 6c 6c 79 20 74 68 69 73 Typically this
9880: 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 is called after
9890: 20 73 65 6c 65 63 74 69 6e 67 20 74 68 65 20 63 selecting the c
98a0: 6f 72 72 65 63 74 20 41 70 70 6c 65 74 20 28 75 orrect Applet (u
98b0: 73 69 6e 67 0a 20 2a 20 20 20 20 20 63 61 63 6b sing. * cack
98c0: 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 ey_select_applet
98d0: 29 20 66 6f 72 20 56 4d 20 63 61 72 64 73 0a 20 ) for VM cards.
98e0: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 *. */.static cac
98f0: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 key_ret cackey_s
9900: 65 6c 65 63 74 5f 66 69 6c 65 28 73 74 72 75 63 elect_file(struc
9910: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 t cackey_slot *s
9920: 6c 6f 74 2c 20 75 69 6e 74 31 36 5f 74 20 65 66 lot, uint16_t ef
9930: 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 ) {..unsigned ch
9940: 61 72 20 66 69 64 5f 62 75 66 5b 32 5d 3b 0a 09 ar fid_buf[2];..
9950: 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 int send_ret;...
9960: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
9970: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a NTF("Called.");.
9980: 0a 09 2f 2a 20 4f 70 65 6e 20 74 68 65 20 65 6c ../* Open the el
9990: 65 6d 65 6e 74 61 72 79 20 66 69 6c 65 20 2a 2f ementary file */
99a0: 0a 09 66 69 64 5f 62 75 66 5b 30 5d 20 3d 20 28 ..fid_buf[0] = (
99b0: 65 66 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b ef >> 8) & 0xff;
99c0: 0a 09 66 69 64 5f 62 75 66 5b 31 5d 20 3d 20 65 ..fid_buf[1] = e
99d0: 66 20 26 20 30 78 66 66 3b 0a 0a 09 43 41 43 4b f & 0xff;...CACK
99e0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
99f0: 22 53 65 6c 65 63 74 69 6e 67 20 66 69 6c 65 3a "Selecting file:
9a00: 20 25 30 34 6c 78 22 2c 20 28 75 6e 73 69 67 6e %04lx", (unsign
9a10: 65 64 20 6c 6f 6e 67 29 20 65 66 29 3b 0a 0a 09 ed long) ef);...
9a20: 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 send_ret = cacke
9a30: 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 y_send_apdu(slot
9a40: 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 , GSCIS_CLASS_IS
9a50: 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 O7816, GSCIS_INS
9a60: 54 52 5f 53 45 4c 45 43 54 2c 20 30 78 30 32 2c TR_SELECT, 0x02,
9a70: 20 30 78 30 43 2c 20 73 69 7a 65 6f 66 28 66 69 0x0C, sizeof(fi
9a80: 64 5f 62 75 66 29 2c 20 66 69 64 5f 62 75 66 2c d_buf), fid_buf,
9a90: 20 30 78 30 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 0x00, NULL, NUL
9aa0: 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 73 L, NULL);..if (s
9ab0: 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 end_ret != CACKE
9ac0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 Y_PCSC_S_OK) {..
9ad0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
9ae0: 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 INTF("Failed to
9af0: 6f 70 65 6e 20 66 69 6c 65 2c 20 72 65 74 75 72 open file, retur
9b00: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 ning in failure"
9b10: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 );....return(CAC
9b20: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 KEY_PCSC_E_GENER
9b30: 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 IC);..}...CACKEY
9b40: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 _DEBUG_PRINTF("S
9b50: 75 63 63 65 73 73 66 75 6c 6c 79 20 73 65 6c 65 uccessfully sele
9b60: 63 74 65 64 20 66 69 6c 65 22 29 3b 0a 0a 09 72 cted file");...r
9b70: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 eturn(CACKEY_PCS
9b80: 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 C_S_OK);.}../*.
9b90: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 * SYNPOSIS. *
9ba0: 20 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72 void cackey_fr
9bb0: 65 65 5f 74 6c 76 28 73 74 72 75 63 74 20 63 61 ee_tlv(struct ca
9bc0: 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 ckey_tlv_entity
9bd0: 2a 72 6f 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 *root);. *. * AR
9be0: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 GUMENTS. * s
9bf0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 truct cackey_tlv
9c00: 5f 65 6e 74 69 74 79 20 2a 72 6f 6f 74 0a 20 2a _entity *root. *
9c10: 20 20 20 20 20 20 20 20 20 52 6f 6f 74 20 6f 66 Root of
9c20: 20 74 68 65 20 54 4c 56 20 6c 69 73 74 20 74 6f the TLV list to
9c30: 20 73 74 61 72 74 20 66 72 65 65 69 6e 67 0a 20 start freeing.
9c40: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 *. * RETURN VALU
9c50: 45 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a E. * None. *
9c60: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 . * NOTES. *
9c70: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 This function f
9c80: 72 65 65 73 20 74 68 65 20 54 4c 56 20 6c 69 6e rees the TLV lin
9c90: 6b 65 64 20 6c 69 73 74 65 64 20 72 65 74 75 72 ked listed retur
9ca0: 6e 65 64 20 66 72 6f 6d 0a 20 2a 20 20 20 20 20 ned from. *
9cb0: 22 63 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76 "cackey_read_tlv
9cc0: 22 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ". *. */.static
9cd0: 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72 65 65 void cackey_free
9ce0: 5f 74 6c 76 28 73 74 72 75 63 74 20 63 61 63 6b _tlv(struct cack
9cf0: 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 72 ey_tlv_entity *r
9d00: 6f 6f 74 29 20 7b 0a 09 73 74 72 75 63 74 20 63 oot) {..struct c
9d10: 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 ackey_tlv_entity
9d20: 20 2a 63 75 72 72 2c 20 2a 6e 65 78 74 3b 0a 0a *curr, *next;..
9d30: 09 69 66 20 28 72 6f 6f 74 20 3d 3d 20 4e 55 4c .if (root == NUL
9d40: 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 L) {...return;..
9d50: 7d 0a 0a 09 66 6f 72 20 28 63 75 72 72 20 3d 20 }...for (curr =
9d60: 72 6f 6f 74 3b 20 63 75 72 72 3b 20 63 75 72 72 root; curr; curr
9d70: 20 3d 20 6e 65 78 74 29 20 7b 0a 09 09 6e 65 78 = next) {...nex
9d80: 74 20 3d 20 63 75 72 72 2d 3e 5f 6e 65 78 74 3b t = curr->_next;
9d90: 0a 0a 09 09 73 77 69 74 63 68 20 28 63 75 72 72 ....switch (curr
9da0: 2d 3e 74 61 67 29 20 7b 0a 09 09 09 63 61 73 65 ->tag) {....case
9db0: 20 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f 54 GSCIS_TAG_ACR_T
9dc0: 41 42 4c 45 3a 0a 09 09 09 63 61 73 65 20 47 53 ABLE:....case GS
9dd0: 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 CIS_TAG_CERTIFIC
9de0: 41 54 45 3a 0a 09 09 09 09 69 66 20 28 63 75 72 ATE:.....if (cur
9df0: 72 2d 3e 76 61 6c 75 65 29 20 7b 0a 09 09 09 09 r->value) {.....
9e00: 09 66 72 65 65 28 63 75 72 72 2d 3e 76 61 6c 75 .free(curr->valu
9e10: 65 29 3b 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 e);.....}.....br
9e20: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43 eak;....case GSC
9e30: 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a IS_TAG_CARDURL:.
9e40: 09 09 09 09 69 66 20 28 63 75 72 72 2d 3e 76 61 ....if (curr->va
9e50: 6c 75 65 5f 63 61 72 64 75 72 6c 29 20 7b 0a 09 lue_cardurl) {..
9e60: 09 09 09 09 66 72 65 65 28 63 75 72 72 2d 3e 76 ....free(curr->v
9e70: 61 6c 75 65 5f 63 61 72 64 75 72 6c 29 3b 0a 09 alue_cardurl);..
9e80: 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a ...}.....break;.
9e90: 09 09 7d 0a 0a 09 09 66 72 65 65 28 63 75 72 72 ..}....free(curr
9ea0: 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a );..}...return;.
9eb0: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 }../*. * SYNPOSI
9ec0: 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a S. * .... *.
9ed0: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 * ARGUMENTS. *
9ee0: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 .... *. * RE
9ef0: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 TURN VALUE. *
9f00: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 .... *. * NOTE
9f10: 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a S. * .... *.
9f20: 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 */.static struc
9f30: 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 t cackey_tlv_ent
9f40: 69 74 79 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 ity *cackey_read
9f50: 5f 74 6c 76 28 73 74 72 75 63 74 20 63 61 63 6b _tlv(struct cack
9f60: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b ey_slot *slot) {
9f70: 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f ..struct cackey_
9f80: 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 75 72 72 tlv_entity *curr
9f90: 5f 65 6e 74 69 74 79 2c 20 2a 72 6f 6f 74 20 3d _entity, *root =
9fa0: 20 4e 55 4c 4c 2c 20 2a 6c 61 73 74 20 3d 20 4e NULL, *last = N
9fb0: 55 4c 4c 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 ULL;..unsigned c
9fc0: 68 61 72 20 74 6c 65 6e 5f 62 75 66 5b 32 5d 2c har tlen_buf[2],
9fd0: 20 74 76 61 6c 5f 62 75 66 5b 31 30 32 34 5d 2c tval_buf[1024],
9fe0: 20 2a 74 76 61 6c 3b 0a 09 75 6e 73 69 67 6e 65 *tval;..unsigne
9ff0: 64 20 63 68 61 72 20 76 6c 65 6e 5f 62 75 66 5b d char vlen_buf[
a000: 32 5d 2c 20 76 76 61 6c 5f 62 75 66 5b 38 31 39 2], vval_buf[819
a010: 32 5d 2c 20 2a 76 76 61 6c 3b 0a 09 75 6e 73 69 2], *vval;..unsi
a020: 67 6e 65 64 20 63 68 61 72 20 2a 74 6d 70 62 75 gned char *tmpbu
a030: 66 3b 0a 09 73 73 69 7a 65 5f 74 20 74 6c 65 6e f;..ssize_t tlen
a040: 2c 20 76 6c 65 6e 3b 0a 09 73 73 69 7a 65 5f 74 , vlen;..ssize_t
a050: 20 72 65 61 64 5f 72 65 74 3b 0a 09 73 69 7a 65 read_ret;..size
a060: 5f 74 20 6f 66 66 73 65 74 5f 74 20 3d 20 30 2c _t offset_t = 0,
a070: 20 6f 66 66 73 65 74 5f 76 20 3d 20 30 3b 0a 09 offset_v = 0;..
a080: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 61 unsigned char ta
a090: 67 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 67 74 g;..size_t lengt
a0a0: 68 3b 0a 23 69 66 64 65 66 20 48 41 56 45 5f 4c h;.#ifdef HAVE_L
a0b0: 49 42 5a 0a 09 75 4c 6f 6e 67 66 20 74 6d 70 62 IBZ..uLongf tmpb
a0c0: 75 66 6c 65 6e 3b 0a 09 69 6e 74 20 75 6e 63 6f uflen;..int unco
a0d0: 6d 70 72 65 73 73 5f 72 65 74 3b 0a 23 65 6e 64 mpress_ret;.#end
a0e0: 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 if...CACKEY_DEBU
a0f0: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 G_PRINTF("Called
a100: 2e 22 29 3b 0a 0a 09 72 65 61 64 5f 72 65 74 20 .");...read_ret
a110: 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 = cackey_read_bu
a120: 66 66 65 72 28 73 6c 6f 74 2c 20 74 6c 65 6e 5f ffer(slot, tlen_
a130: 62 75 66 2c 20 73 69 7a 65 6f 66 28 74 6c 65 6e buf, sizeof(tlen
a140: 5f 62 75 66 29 2c 20 31 2c 20 6f 66 66 73 65 74 _buf), 1, offset
a150: 5f 74 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 _t);..if (read_r
a160: 65 74 20 21 3d 20 73 69 7a 65 6f 66 28 74 6c 65 et != sizeof(tle
a170: 6e 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b n_buf)) {...CACK
a180: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
a190: 22 52 65 61 64 20 66 61 69 6c 65 64 2c 20 72 65 "Read failed, re
a1a0: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 turning in failu
a1b0: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 re");....return(
a1c0: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 6c 65 6e NULL);..}...tlen
a1d0: 20 3d 20 28 74 6c 65 6e 5f 62 75 66 5b 31 5d 20 = (tlen_buf[1]
a1e0: 3c 3c 20 38 29 20 7c 20 74 6c 65 6e 5f 62 75 66 << 8) | tlen_buf
a1f0: 5b 30 5d 3b 0a 0a 09 72 65 61 64 5f 72 65 74 20 [0];...read_ret
a200: 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 = cackey_read_bu
a210: 66 66 65 72 28 73 6c 6f 74 2c 20 76 6c 65 6e 5f ffer(slot, vlen_
a220: 62 75 66 2c 20 73 69 7a 65 6f 66 28 76 6c 65 6e buf, sizeof(vlen
a230: 5f 62 75 66 29 2c 20 32 2c 20 6f 66 66 73 65 74 _buf), 2, offset
a240: 5f 76 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 _v);..if (read_r
a250: 65 74 20 21 3d 20 73 69 7a 65 6f 66 28 76 6c 65 et != sizeof(vle
a260: 6e 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b n_buf)) {...CACK
a270: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
a280: 22 52 65 61 64 20 66 61 69 6c 65 64 2c 20 72 65 "Read failed, re
a290: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 turning in failu
a2a0: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 re");....return(
a2b0: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 76 6c 65 6e NULL);..}...vlen
a2c0: 20 3d 20 28 76 6c 65 6e 5f 62 75 66 5b 31 5d 20 = (vlen_buf[1]
a2d0: 3c 3c 20 38 29 20 7c 20 76 6c 65 6e 5f 62 75 66 << 8) | vlen_buf
a2e0: 5b 30 5d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 [0];...CACKEY_DE
a2f0: 42 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67 20 BUG_PRINTF("Tag
a300: 4c 65 6e 67 74 68 20 3d 20 25 69 2c 20 56 61 6c Length = %i, Val
a310: 75 65 20 4c 65 6e 67 74 68 20 3d 20 25 69 22 2c ue Length = %i",
a320: 20 74 6c 65 6e 2c 20 76 6c 65 6e 29 3b 0a 0a 09 tlen, vlen);...
a330: 6f 66 66 73 65 74 5f 74 20 2b 3d 20 32 3b 0a 09 offset_t += 2;..
a340: 6f 66 66 73 65 74 5f 76 20 2b 3d 20 32 3b 0a 0a offset_v += 2;..
a350: 09 69 66 20 28 74 6c 65 6e 20 3e 20 73 69 7a 65 .if (tlen > size
a360: 6f 66 28 74 76 61 6c 5f 62 75 66 29 29 20 7b 0a of(tval_buf)) {.
a370: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
a380: 52 49 4e 54 46 28 22 54 61 67 20 6c 65 6e 67 74 RINTF("Tag lengt
a390: 68 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20 h is too large,
a3a0: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 returning in fai
a3b0: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 lure");....retur
a3c0: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 n(NULL);..}...if
a3d0: 20 28 76 6c 65 6e 20 3e 20 73 69 7a 65 6f 66 28 (vlen > sizeof(
a3e0: 76 76 61 6c 5f 62 75 66 29 29 20 7b 0a 09 09 43 vval_buf)) {...C
a3f0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
a400: 54 46 28 22 56 61 6c 75 65 20 6c 65 6e 67 74 68 TF("Value length
a410: 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20 72 is too large, r
a420: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c eturning in fail
a430: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ure");....return
a440: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61 (NULL);..}...rea
a450: 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 d_ret = cackey_r
a460: 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c ead_buffer(slot,
a470: 20 74 76 61 6c 5f 62 75 66 2c 20 74 6c 65 6e 2c tval_buf, tlen,
a480: 20 31 2c 20 6f 66 66 73 65 74 5f 74 29 3b 0a 09 1, offset_t);..
a490: 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20 if (read_ret !=
a4a0: 74 6c 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59 tlen) {...CACKEY
a4b0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 _DEBUG_PRINTF("U
a4c0: 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20 65 6e nable to read en
a4d0: 74 69 72 65 20 54 2d 62 75 66 66 65 72 2c 20 72 tire T-buffer, r
a4e0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c eturning in fail
a4f0: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ure");....return
a500: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61 (NULL);..}...rea
a510: 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 d_ret = cackey_r
a520: 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c ead_buffer(slot,
a530: 20 76 76 61 6c 5f 62 75 66 2c 20 76 6c 65 6e 2c vval_buf, vlen,
a540: 20 32 2c 20 6f 66 66 73 65 74 5f 76 29 3b 0a 09 2, offset_v);..
a550: 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20 if (read_ret !=
a560: 76 6c 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59 vlen) {...CACKEY
a570: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 _DEBUG_PRINTF("U
a580: 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20 65 6e nable to read en
a590: 74 69 72 65 20 56 2d 62 75 66 66 65 72 2c 20 72 tire V-buffer, r
a5a0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c eturning in fail
a5b0: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ure");....return
a5c0: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 76 61 (NULL);..}...tva
a5d0: 6c 20 3d 20 74 76 61 6c 5f 62 75 66 3b 0a 09 76 l = tval_buf;..v
a5e0: 76 61 6c 20 3d 20 76 76 61 6c 5f 62 75 66 3b 0a val = vval_buf;.
a5f0: 09 77 68 69 6c 65 20 28 74 6c 65 6e 20 3e 20 30 .while (tlen > 0
a600: 20 26 26 20 76 6c 65 6e 20 3e 20 30 29 20 7b 0a && vlen > 0) {.
a610: 09 09 74 61 67 20 3d 20 2a 74 76 61 6c 3b 0a 09 ..tag = *tval;..
a620: 09 74 76 61 6c 2b 2b 3b 0a 09 09 74 6c 65 6e 2d .tval++;...tlen-
a630: 2d 3b 0a 0a 09 09 69 66 20 28 2a 74 76 61 6c 20 -;....if (*tval
a640: 3d 3d 20 30 78 66 66 29 20 7b 0a 09 09 09 6c 65 == 0xff) {....le
a650: 6e 67 74 68 20 3d 20 28 74 76 61 6c 5b 32 5d 20 ngth = (tval[2]
a660: 3c 3c 20 38 29 20 7c 20 74 76 61 6c 5b 31 5d 3b << 8) | tval[1];
a670: 0a 09 09 09 74 76 61 6c 20 2b 3d 20 33 3b 0a 09 ....tval += 3;..
a680: 09 09 74 6c 65 6e 20 2d 3d 20 33 3b 0a 09 09 7d ..tlen -= 3;...}
a690: 20 65 6c 73 65 20 7b 0a 09 09 09 6c 65 6e 67 74 else {....lengt
a6a0: 68 20 3d 20 2a 74 76 61 6c 3b 0a 09 09 09 74 76 h = *tval;....tv
a6b0: 61 6c 2b 2b 3b 0a 09 09 09 74 6c 65 6e 2d 2d 3b al++;....tlen--;
a6c0: 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 ...}....CACKEY_D
a6d0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67 EBUG_PRINTF("Tag
a6e0: 3a 20 25 73 20 28 25 30 32 78 29 22 2c 20 43 41 : %s (%02x)", CA
a6f0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f CKEY_DEBUG_FUNC_
a700: 54 41 47 5f 54 4f 5f 53 54 52 28 74 61 67 29 2c TAG_TO_STR(tag),
a710: 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 (unsigned int)
a720: 74 61 67 29 3b 0a 09 09 43 41 43 4b 45 59 5f 44 tag);...CACKEY_D
a730: 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 56 EBUG_PRINTBUF("V
a740: 61 6c 75 65 3a 22 2c 20 76 76 61 6c 2c 20 6c 65 alue:", vval, le
a750: 6e 67 74 68 29 3b 0a 0a 09 09 63 75 72 72 5f 65 ngth);....curr_e
a760: 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 ntity = NULL;...
a770: 73 77 69 74 63 68 20 28 74 61 67 29 20 7b 0a 09 switch (tag) {..
a780: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 ..case GSCIS_TAG
a790: 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09 09 63 75 _CARDURL:.....cu
a7a0: 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c rr_entity = mall
a7b0: 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f oc(sizeof(*curr_
a7c0: 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 63 75 entity));.....cu
a7d0: 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 rr_entity->value
a7e0: 5f 63 61 72 64 75 72 6c 20 3d 20 6d 61 6c 6c 6f _cardurl = mallo
a7f0: 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 c(sizeof(*curr_e
a800: 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 ntity->value_car
a810: 64 75 72 6c 29 29 3b 0a 0a 09 09 09 09 6d 65 6d durl));......mem
a820: 63 70 79 28 63 75 72 72 5f 65 6e 74 69 74 79 2d cpy(curr_entity-
a830: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e >value_cardurl->
a840: 72 69 64 2c 20 76 76 61 6c 2c 20 35 29 3b 0a 09 rid, vval, 5);..
a850: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e ...curr_entity->
a860: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 value_cardurl->a
a870: 70 70 74 79 70 65 20 3d 20 76 76 61 6c 5b 35 5d pptype = vval[5]
a880: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 ;.....curr_entit
a890: 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c y->value_cardurl
a8a0: 2d 3e 6f 62 6a 65 63 74 69 64 20 3d 20 28 76 76 ->objectid = (vv
a8b0: 61 6c 5b 36 5d 20 3c 3c 20 38 29 20 7c 20 76 76 al[6] << 8) | vv
a8c0: 61 6c 5b 37 5d 3b 0a 09 09 09 09 63 75 72 72 5f al[7];.....curr_
a8d0: 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 entity->value_ca
a8e0: 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 3d 20 28 rdurl->appid = (
a8f0: 76 76 61 6c 5b 38 5d 20 3c 3c 20 38 29 20 7c 20 vval[8] << 8) |
a900: 76 76 61 6c 5b 39 5d 3b 0a 0a 09 09 09 09 63 75 vval[9];......cu
a910: 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d rr_entity->tag =
a920: 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 tag;.....curr_e
a930: 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e ntity->_next = N
a940: 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b ULL;......break;
a950: 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 ....case GSCIS_T
a960: 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09 AG_ACR_TABLE:...
a970: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 ..curr_entity =
a980: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 malloc(sizeof(*c
a990: 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 09 09 urr_entity));...
a9a0: 09 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f ..tmpbuf = mallo
a9b0: 63 28 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 09 09 c(length);......
a9c0: 6d 65 6d 63 70 79 28 74 6d 70 62 75 66 2c 20 76 memcpy(tmpbuf, v
a9d0: 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 0a 09 val, length);...
a9e0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e ...curr_entity->
a9f0: 74 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 tag = tag;.....c
aa00: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e 67 urr_entity->leng
aa10: 74 68 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09 th = length;....
aa20: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 .curr_entity->va
aa30: 6c 75 65 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09 lue = tmpbuf;...
aa40: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f ..curr_entity->_
aa50: 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 next = NULL;....
aa60: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 ..break;....case
aa70: 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 GSCIS_TAG_CERTI
aa80: 46 49 43 41 54 45 3a 0a 09 09 09 09 63 75 72 72 FICATE:.....curr
aa90: 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 _entity = malloc
aaa0: 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e (sizeof(*curr_en
aab0: 74 69 74 79 29 29 3b 0a 0a 09 09 09 09 74 6d 70 tity));......tmp
aac0: 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 20 buflen = length
aad0: 2a 20 32 3b 0a 09 09 09 09 74 6d 70 62 75 66 20 * 2;.....tmpbuf
aae0: 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 66 6c = malloc(tmpbufl
aaf0: 65 6e 29 3b 0a 0a 23 69 66 64 65 66 20 48 41 56 en);..#ifdef HAV
ab00: 45 5f 4c 49 42 5a 0a 09 09 09 09 75 6e 63 6f 6d E_LIBZ.....uncom
ab10: 70 72 65 73 73 5f 72 65 74 20 3d 20 75 6e 63 6f press_ret = unco
ab20: 6d 70 72 65 73 73 28 74 6d 70 62 75 66 2c 20 26 mpress(tmpbuf, &
ab30: 74 6d 70 62 75 66 6c 65 6e 2c 20 76 76 61 6c 2c tmpbuflen, vval,
ab40: 20 6c 65 6e 67 74 68 29 3b 0a 09 09 09 09 69 66 length);.....if
ab50: 20 28 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 (uncompress_ret
ab60: 20 21 3d 20 5a 5f 4f 4b 29 20 7b 0a 09 09 09 09 != Z_OK) {.....
ab70: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
ab80: 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 INTF("Failed to
ab90: 64 65 63 6f 6d 70 72 65 73 73 2c 20 75 6e 63 6f decompress, unco
aba0: 6d 70 72 65 73 73 28 29 20 72 65 74 75 72 6e 65 mpress() returne
abb0: 64 20 25 69 20 2d 2d 20 72 65 73 6f 72 74 69 6e d %i -- resortin
abc0: 67 20 74 6f 20 64 69 72 65 63 74 20 63 6f 70 79 g to direct copy
abd0: 22 2c 20 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 ", uncompress_re
abe0: 74 29 3b 0a 0a 09 09 09 09 09 74 6d 70 62 75 66 t);.......tmpbuf
abf0: 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 len = length;...
ac00: 09 09 09 6d 65 6d 63 70 79 28 74 6d 70 62 75 66 ...memcpy(tmpbuf
ac10: 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b , vval, length);
ac20: 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b .....}......CACK
ac30: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 EY_DEBUG_PRINTBU
ac40: 46 28 22 44 65 63 6f 6d 70 72 65 73 73 65 64 20 F("Decompressed
ac50: 74 6f 3a 22 2c 20 74 6d 70 62 75 66 2c 20 74 6d to:", tmpbuf, tm
ac60: 70 62 75 66 6c 65 6e 29 3b 0a 23 65 6c 73 65 0a pbuflen);.#else.
ac70: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
ac80: 5f 50 52 49 4e 54 46 28 22 4d 69 73 73 69 6e 67 _PRINTF("Missing
ac90: 20 5a 4c 49 42 20 53 75 70 70 6f 72 74 2c 20 74 ZLIB Support, t
aca0: 68 69 73 20 63 65 72 74 69 66 69 63 61 74 65 20 his certificate
acb0: 69 73 20 6c 69 6b 65 6c 79 20 75 73 65 6c 65 73 is likely useles
acc0: 73 2e 2e 2e 22 29 3b 0a 0a 09 09 09 09 74 6d 70 s...");......tmp
acd0: 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 3b buflen = length;
ace0: 0a 09 09 09 09 6d 65 6d 63 70 79 28 74 6d 70 62 .....memcpy(tmpb
acf0: 75 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 uf, vval, length
ad00: 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 09 09 09 63 );.#endif......c
ad10: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20 urr_entity->tag
ad20: 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f = tag;.....curr_
ad30: 65 6e 74 69 74 79 2d 3e 6c 65 6e 67 74 68 20 3d entity->length =
ad40: 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 09 09 09 tmpbuflen;.....
ad50: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c curr_entity->val
ad60: 75 65 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09 ue = tmpbuf;....
ad70: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e .curr_entity->_n
ad80: 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 ext = NULL;.....
ad90: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 .break;....case
ada0: 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 53 31 35 GSCIS_TAG_PKCS15
adb0: 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 :.....curr_entit
adc0: 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f y = malloc(sizeo
add0: 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29 f(*curr_entity))
ade0: 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 ;......curr_enti
adf0: 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09 ty->tag = tag;..
ae00: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e ...curr_entity->
ae10: 76 61 6c 75 65 5f 62 79 74 65 20 3d 20 76 76 61 value_byte = vva
ae20: 6c 5b 30 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65 l[0];.....curr_e
ae30: 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e ntity->_next = N
ae40: 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b ULL;......break;
ae50: 0a 09 09 7d 0a 0a 09 09 76 76 61 6c 20 2b 3d 20 ...}....vval +=
ae60: 6c 65 6e 67 74 68 3b 0a 09 09 76 6c 65 6e 20 2d length;...vlen -
ae70: 3d 20 6c 65 6e 67 74 68 3b 0a 0a 09 09 69 66 20 = length;....if
ae80: 28 63 75 72 72 5f 65 6e 74 69 74 79 20 21 3d 20 (curr_entity !=
ae90: 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28 72 NULL) {....if (r
aea0: 6f 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 oot == NULL) {..
aeb0: 09 09 09 72 6f 6f 74 20 3d 20 63 75 72 72 5f 65 ...root = curr_e
aec0: 6e 74 69 74 79 3b 0a 09 09 09 7d 0a 0a 09 09 09 ntity;....}.....
aed0: 69 66 20 28 6c 61 73 74 20 21 3d 20 4e 55 4c 4c if (last != NULL
aee0: 29 20 7b 0a 09 09 09 09 6c 61 73 74 2d 3e 5f 6e ) {.....last->_n
aef0: 65 78 74 20 3d 20 63 75 72 72 5f 65 6e 74 69 74 ext = curr_entit
af00: 79 3b 0a 09 09 09 7d 0a 0a 09 09 09 6c 61 73 74 y;....}.....last
af10: 20 3d 20 63 75 72 72 5f 65 6e 74 69 74 79 3b 0a = curr_entity;.
af20: 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 ..}..}...return(
af30: 72 6f 6f 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 root);.}../*. *
af40: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 SYNPOSIS. *
af50: 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 .... *. * ARGUME
af60: 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 NTS. * ....
af70: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 *. * RETURN VALU
af80: 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a E. * .... *.
af90: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 * NOTES. *
afa0: 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 .... *. */.stati
afb0: 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72 c void cackey_fr
afc0: 65 65 5f 63 65 72 74 73 28 73 74 72 75 63 74 20 ee_certs(struct
afd0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e cackey_pcsc_iden
afe0: 74 69 74 79 20 2a 73 74 61 72 74 2c 20 73 69 7a tity *start, siz
aff0: 65 5f 74 20 63 6f 75 6e 74 2c 20 69 6e 74 20 66 e_t count, int f
b000: 72 65 65 5f 73 74 61 72 74 29 20 7b 0a 09 73 69 ree_start) {..si
b010: 7a 65 5f 74 20 69 64 78 3b 0a 0a 09 66 6f 72 20 ze_t idx;...for
b020: 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 (idx = 0; idx <
b030: 63 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a count; idx++) {.
b040: 09 09 69 66 20 28 73 74 61 72 74 5b 69 64 78 5d ..if (start[idx]
b050: 2e 63 65 72 74 69 66 69 63 61 74 65 29 20 7b 0a .certificate) {.
b060: 09 09 09 66 72 65 65 28 73 74 61 72 74 5b 69 64 ...free(start[id
b070: 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 29 3b x].certificate);
b080: 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 66 72 ...}..}...if (fr
b090: 65 65 5f 73 74 61 72 74 29 20 7b 0a 09 09 66 72 ee_start) {...fr
b0a0: 65 65 28 73 74 61 72 74 29 3b 0a 09 7d 0a 0a 09 ee(start);..}...
b0b0: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a return;.}../*. *
b0c0: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 SYNPOSIS. *
b0d0: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d .... *. * ARGUM
b0e0: 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a ENTS. * ....
b0f0: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c *. * RETURN VAL
b100: 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a UE. * .... *
b110: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 . * NOTES. *
b120: 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 .... *. */.stat
b130: 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 ic struct cackey
b140: 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a _pcsc_identity *
b150: 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 cackey_read_cert
b160: 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f s(struct cackey_
b170: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 73 74 72 75 slot *slot, stru
b180: 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 ct cackey_pcsc_i
b190: 64 65 6e 74 69 74 79 20 2a 63 65 72 74 73 2c 20 dentity *certs,
b1a0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 63 unsigned long *c
b1b0: 6f 75 6e 74 29 20 7b 0a 09 73 74 72 75 63 74 20 ount) {..struct
b1c0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e cackey_pcsc_iden
b1d0: 74 69 74 79 20 2a 63 75 72 72 5f 69 64 3b 0a 09 tity *curr_id;..
b1e0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c struct cackey_tl
b1f0: 76 5f 65 6e 74 69 74 79 20 2a 63 63 63 5f 74 6c v_entity *ccc_tl
b200: 76 2c 20 2a 63 63 63 5f 63 75 72 72 2c 20 2a 61 v, *ccc_curr, *a
b210: 70 70 5f 74 6c 76 2c 20 2a 61 70 70 5f 63 75 72 pp_tlv, *app_cur
b220: 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 r;..unsigned cha
b230: 72 20 63 63 63 5f 61 69 64 5b 5d 20 3d 20 7b 47 r ccc_aid[] = {G
b240: 53 43 49 53 5f 41 49 44 5f 43 43 43 7d 3b 0a 09 SCIS_AID_CCC};..
b250: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 75 unsigned char cu
b260: 72 72 5f 61 69 64 5b 37 5d 3b 0a 09 75 6e 73 69 rr_aid[7];..unsi
b270: 67 6e 65 64 20 6c 6f 6e 67 20 6f 75 74 69 64 78 gned long outidx
b280: 20 3d 20 30 3b 0a 09 63 61 63 6b 65 79 5f 72 65 = 0;..cackey_re
b290: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65 t transaction_re
b2a0: 74 3b 0a 09 69 6e 74 20 63 65 72 74 73 5f 72 65 t;..int certs_re
b2b0: 73 69 7a 61 62 6c 65 3b 0a 09 69 6e 74 20 73 65 sizable;..int se
b2c0: 6e 64 5f 72 65 74 2c 20 73 65 6c 65 63 74 5f 72 nd_ret, select_r
b2d0: 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 et;...CACKEY_DEB
b2e0: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
b2f0: 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 6f 75 6e d.");...if (coun
b300: 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 t == NULL) {...C
b310: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
b320: 54 46 28 22 63 6f 75 6e 74 20 69 73 20 4e 55 4c TF("count is NUL
b330: 4c 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 L, returning in
b340: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 failure");....re
b350: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a turn(NULL);..}..
b360: 09 69 66 20 28 63 65 72 74 73 20 21 3d 20 4e 55 .if (certs != NU
b370: 4c 4c 29 20 7b 0a 09 09 69 66 20 28 2a 63 6f 75 LL) {...if (*cou
b380: 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 09 43 41 nt == 0) {....CA
b390: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
b3a0: 46 28 22 52 65 71 75 65 73 74 65 64 20 77 65 20 F("Requested we
b3b0: 72 65 74 75 72 6e 20 30 20 6f 62 6a 65 63 74 73 return 0 objects
b3c0: 2c 20 73 68 6f 72 74 2d 63 69 72 63 75 69 74 22 , short-circuit"
b3d0: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 63 65 );.....return(ce
b3e0: 72 74 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f rts);...}..}.../
b3f0: 2a 20 42 65 67 69 6e 20 61 20 53 6d 61 72 74 43 * Begin a SmartC
b400: 61 72 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 ard transaction
b410: 2a 2f 0a 09 74 72 61 6e 73 61 63 74 69 6f 6e 5f */..transaction_
b420: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 62 65 67 ret = cackey_beg
b430: 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 in_transaction(s
b440: 6c 6f 74 29 3b 0a 09 69 66 20 28 74 72 61 6e 73 lot);..if (trans
b450: 61 63 74 69 6f 6e 5f 72 65 74 20 21 3d 20 43 41 action_ret != CA
b460: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 CKEY_PCSC_S_OK)
b470: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
b480: 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 _PRINTF("Unable
b490: 62 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f begin transactio
b4a0: 6e 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 n, returning in
b4b0: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 failure");....re
b4c0: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a turn(NULL);..}..
b4d0: 09 69 66 20 28 63 65 72 74 73 20 3d 3d 20 4e 55 .if (certs == NU
b4e0: 4c 4c 29 20 7b 0a 09 09 63 65 72 74 73 20 3d 20 LL) {...certs =
b4f0: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 malloc(sizeof(*c
b500: 65 72 74 73 29 20 2a 20 35 29 3b 0a 09 09 2a 63 erts) * 5);...*c
b510: 6f 75 6e 74 20 3d 20 35 3b 0a 09 09 63 65 72 74 ount = 5;...cert
b520: 73 5f 72 65 73 69 7a 61 62 6c 65 20 3d 20 31 3b s_resizable = 1;
b530: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 63 65 72 ..} else {...cer
b540: 74 73 5f 72 65 73 69 7a 61 62 6c 65 20 3d 20 30 ts_resizable = 0
b550: 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 6c 65 63 74 ;..}.../* Select
b560: 20 74 68 65 20 43 43 43 20 41 70 70 6c 65 74 20 the CCC Applet
b570: 2a 2f 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 */..send_ret = c
b580: 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 ackey_select_app
b590: 6c 65 74 28 73 6c 6f 74 2c 20 63 63 63 5f 61 69 let(slot, ccc_ai
b5a0: 64 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 61 69 d, sizeof(ccc_ai
b5b0: 64 29 29 3b 0a 09 69 66 20 28 73 65 6e 64 5f 72 d));..if (send_r
b5c0: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 et != CACKEY_PCS
b5d0: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b C_S_OK) {...CACK
b5e0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
b5f0: 22 55 6e 61 62 6c 65 20 74 6f 20 73 65 6c 65 63 "Unable to selec
b600: 74 20 43 43 43 20 41 70 70 6c 65 74 2c 20 72 65 t CCC Applet, re
b610: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 turning in failu
b620: 72 65 22 29 3b 0a 0a 09 09 2f 2a 20 54 65 72 6d re");..../* Term
b630: 69 6e 61 74 65 20 53 6d 61 72 74 43 61 72 64 20 inate SmartCard
b640: 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 Transaction */..
b650: 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e .cackey_end_tran
b660: 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a saction(slot);..
b670: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a ..return(NULL);.
b680: 09 7d 0a 0a 09 2f 2a 20 52 65 61 64 20 61 6c 6c .}.../* Read all
b690: 20 74 68 65 20 61 70 70 6c 65 74 73 20 66 72 6f the applets fro
b6a0: 6d 20 74 68 65 20 43 43 43 27 73 20 54 4c 56 20 m the CCC's TLV
b6b0: 2a 2f 0a 09 63 63 63 5f 74 6c 76 20 3d 20 63 61 */..ccc_tlv = ca
b6c0: 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28 73 6c ckey_read_tlv(sl
b6d0: 6f 74 29 3b 0a 0a 09 2f 2a 20 4c 6f 6f 6b 20 66 ot);.../* Look f
b6e0: 6f 72 20 43 41 52 44 55 52 4c 73 20 74 68 61 74 or CARDURLs that
b6f0: 20 63 6f 6f 72 65 73 70 6f 6e 64 20 74 6f 20 50 coorespond to P
b700: 4b 49 20 61 70 70 6c 65 74 73 20 2a 2f 0a 09 66 KI applets */..f
b710: 6f 72 20 28 63 63 63 5f 63 75 72 72 20 3d 20 63 or (ccc_curr = c
b720: 63 63 5f 74 6c 76 3b 20 63 63 63 5f 63 75 72 72 cc_tlv; ccc_curr
b730: 3b 20 63 63 63 5f 63 75 72 72 20 3d 20 63 63 63 ; ccc_curr = ccc
b740: 5f 63 75 72 72 2d 3e 5f 6e 65 78 74 29 20 7b 0a _curr->_next) {.
b750: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
b760: 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 74 61 67 RINTF("Found tag
b770: 3a 20 25 73 20 2e 2e 2e 20 22 2c 20 43 41 43 4b : %s ... ", CACK
b780: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 EY_DEBUG_FUNC_TA
b790: 47 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 G_TO_STR(ccc_cur
b7a0: 72 2d 3e 74 61 67 29 29 3b 0a 0a 09 09 69 66 20 r->tag));....if
b7b0: 28 63 63 63 5f 63 75 72 72 2d 3e 74 61 67 20 21 (ccc_curr->tag !
b7c0: 3d 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 = GSCIS_TAG_CARD
b7d0: 55 52 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 URL) {....CACKEY
b7e0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 _DEBUG_PRINTF("
b7f0: 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69 74 ... skipping it
b800: 20 28 77 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 (we only care a
b810: 62 6f 75 74 20 43 41 52 44 55 52 4c 73 29 22 29 bout CARDURLs)")
b820: 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a ;.....continue;.
b830: 09 09 7d 0a 0a 09 09 69 66 20 28 28 63 63 63 5f ..}....if ((ccc_
b840: 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 curr->value_card
b850: 75 72 6c 2d 3e 61 70 70 74 79 70 65 20 26 20 43 url->apptype & C
b860: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b ACKEY_TLV_APP_PK
b870: 49 29 20 21 3d 20 43 41 43 4b 45 59 5f 54 4c 56 I) != CACKEY_TLV
b880: 5f 41 50 50 5f 50 4b 49 29 20 7b 0a 09 09 09 43 _APP_PKI) {....C
b890: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
b8a0: 54 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70 70 69 TF(" ... skippi
b8b0: 6e 67 20 69 74 20 28 77 65 20 6f 6e 6c 79 20 63 ng it (we only c
b8c0: 61 72 65 20 61 62 6f 75 74 20 50 4b 49 20 61 70 are about PKI ap
b8d0: 70 6c 65 74 73 2c 20 74 68 69 73 20 61 70 70 6c plets, this appl
b8e0: 65 74 20 73 75 70 70 6f 72 74 73 3a 20 25 73 2f et supports: %s/
b8f0: 25 30 32 78 29 22 2c 20 43 41 43 4b 45 59 5f 44 %02x)", CACKEY_D
b900: 45 42 55 47 5f 46 55 4e 43 5f 41 50 50 54 59 50 EBUG_FUNC_APPTYP
b910: 45 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 E_TO_STR(ccc_cur
b920: 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c r->value_cardurl
b930: 2d 3e 61 70 70 74 79 70 65 29 2c 20 28 75 6e 73 ->apptype), (uns
b940: 69 67 6e 65 64 20 69 6e 74 29 20 63 63 63 5f 63 igned int) ccc_c
b950: 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 urr->value_cardu
b960: 72 6c 2d 3e 61 70 70 74 79 70 65 29 3b 0a 0a 09 rl->apptype);...
b970: 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a ..continue;...}.
b980: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
b990: 50 52 49 4e 54 42 55 46 28 22 52 49 44 3a 22 2c PRINTBUF("RID:",
b9a0: 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 ccc_curr->value
b9b0: 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20 73 _cardurl->rid, s
b9c0: 69 7a 65 6f 66 28 63 63 63 5f 63 75 72 72 2d 3e izeof(ccc_curr->
b9d0: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 value_cardurl->r
b9e0: 69 64 29 29 3b 0a 09 09 43 41 43 4b 45 59 5f 44 id));...CACKEY_D
b9f0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 70 70 EBUG_PRINTF("App
ba00: 49 44 20 3d 20 25 73 2f 25 30 34 6c 78 22 2c 20 ID = %s/%04lx",
ba10: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e CACKEY_DEBUG_FUN
ba20: 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28 63 C_OBJID_TO_STR(c
ba30: 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 cc_curr->value_c
ba40: 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 29 2c 20 ardurl->appid),
ba50: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
ba60: 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f ccc_curr->value_
ba70: 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 29 3b cardurl->appid);
ba80: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
ba90: 50 52 49 4e 54 46 28 22 4f 62 6a 65 63 74 49 44 PRINTF("ObjectID
baa0: 20 3d 20 25 73 2f 25 30 34 6c 78 22 2c 20 43 41 = %s/%04lx", CA
bab0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f CKEY_DEBUG_FUNC_
bac0: 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28 63 63 63 OBJID_TO_STR(ccc
bad0: 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 _curr->value_car
bae0: 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 2c durl->objectid),
baf0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
bb00: 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 ccc_curr->value
bb10: 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 _cardurl->object
bb20: 69 64 29 3b 0a 0a 09 09 6d 65 6d 63 70 79 28 63 id);....memcpy(c
bb30: 75 72 72 5f 61 69 64 2c 20 63 63 63 5f 63 75 72 urr_aid, ccc_cur
bb40: 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c r->value_cardurl
bb50: 2d 3e 72 69 64 2c 20 73 69 7a 65 6f 66 28 63 63 ->rid, sizeof(cc
bb60: 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 c_curr->value_ca
bb70: 72 64 75 72 6c 2d 3e 72 69 64 29 29 3b 0a 09 09 rdurl->rid));...
bb80: 63 75 72 72 5f 61 69 64 5b 73 69 7a 65 6f 66 28 curr_aid[sizeof(
bb90: 63 75 72 72 5f 61 69 64 29 20 2d 20 32 5d 20 3d curr_aid) - 2] =
bba0: 20 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 (ccc_curr->valu
bbb0: 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 e_cardurl->appid
bbc0: 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 09 >> 8) & 0xff;..
bbd0: 09 63 75 72 72 5f 61 69 64 5b 73 69 7a 65 6f 66 .curr_aid[sizeof
bbe0: 28 63 75 72 72 5f 61 69 64 29 20 2d 20 31 5d 20 (curr_aid) - 1]
bbf0: 3d 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 = ccc_curr->valu
bc00: 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 e_cardurl->appid
bc10: 20 26 20 30 78 66 66 3b 0a 0a 09 09 2f 2a 20 53 & 0xff;..../* S
bc20: 65 6c 65 63 74 20 66 6f 75 6e 64 20 61 70 70 6c elect found appl
bc30: 65 74 20 2e 2e 2e 20 2a 2f 0a 09 09 73 65 6c 65 et ... */...sele
bc40: 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f ct_ret = cackey_
bc50: 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c select_applet(sl
bc60: 6f 74 2c 20 63 75 72 72 5f 61 69 64 2c 20 73 69 ot, curr_aid, si
bc70: 7a 65 6f 66 28 63 75 72 72 5f 61 69 64 29 29 3b zeof(curr_aid));
bc80: 0a 09 09 69 66 20 28 73 65 6c 65 63 74 5f 72 65 ...if (select_re
bc90: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 t != CACKEY_PCSC
bca0: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b _S_OK) {....CACK
bcb0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
bcc0: 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6c 65 63 "Failed to selec
bcd0: 74 20 61 70 70 6c 65 74 2c 20 73 6b 69 70 70 69 t applet, skippi
bce0: 6e 67 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 ng processing of
bcf0: 20 74 68 69 73 20 6f 62 6a 65 63 74 22 29 3b 0a this object");.
bd00: 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 ....continue;...
bd10: 7d 0a 0a 09 09 2f 2a 20 2e 2e 2e 20 61 6e 64 20 }..../* ... and
bd20: 6f 62 6a 65 63 74 20 28 66 69 6c 65 29 20 2a 2f object (file) */
bd30: 0a 09 09 73 65 6c 65 63 74 5f 72 65 74 20 3d 20 ...select_ret =
bd40: 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 cackey_select_fi
bd50: 6c 65 28 73 6c 6f 74 2c 20 63 63 63 5f 63 75 72 le(slot, ccc_cur
bd60: 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c r->value_cardurl
bd70: 2d 3e 6f 62 6a 65 63 74 69 64 29 3b 0a 09 09 69 ->objectid);...i
bd80: 66 20 28 73 65 6c 65 63 74 5f 72 65 74 20 21 3d f (select_ret !=
bd90: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f CACKEY_PCSC_S_O
bda0: 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 K) {....CACKEY_D
bdb0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69 EBUG_PRINTF("Fai
bdc0: 6c 65 64 20 74 6f 20 73 65 6c 65 63 74 20 66 69 led to select fi
bdd0: 6c 65 2c 20 73 6b 69 70 70 69 6e 67 20 70 72 6f le, skipping pro
bde0: 63 65 73 73 69 6e 67 20 6f 66 20 74 68 69 73 20 cessing of this
bdf0: 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 63 6f object");.....co
be00: 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 2f ntinue;...}..../
be10: 2a 20 50 72 6f 63 65 73 73 20 74 68 69 73 20 66 * Process this f
be20: 69 6c 65 27 73 20 54 4c 56 20 6c 6f 6f 6b 69 6e ile's TLV lookin
be30: 67 20 66 6f 72 20 63 65 72 74 69 66 69 63 61 74 g for certificat
be40: 65 73 20 2a 2f 0a 09 09 61 70 70 5f 74 6c 76 20 es */...app_tlv
be50: 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c = cackey_read_tl
be60: 76 28 73 6c 6f 74 29 3b 0a 0a 09 09 66 6f 72 20 v(slot);....for
be70: 28 61 70 70 5f 63 75 72 72 20 3d 20 61 70 70 5f (app_curr = app_
be80: 74 6c 76 3b 20 61 70 70 5f 63 75 72 72 3b 20 61 tlv; app_curr; a
be90: 70 70 5f 63 75 72 72 20 3d 20 61 70 70 5f 63 75 pp_curr = app_cu
bea0: 72 72 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 09 rr->_next) {....
beb0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
bec0: 4e 54 46 28 22 46 6f 75 6e 64 20 74 61 67 3a 20 NTF("Found tag:
bed0: 25 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 %s", CACKEY_DEBU
bee0: 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 G_FUNC_TAG_TO_ST
bef0: 52 28 61 70 70 5f 63 75 72 72 2d 3e 74 61 67 29 R(app_curr->tag)
bf00: 29 3b 0a 09 09 09 69 66 20 28 61 70 70 5f 63 75 );....if (app_cu
bf10: 72 72 2d 3e 74 61 67 20 21 3d 20 47 53 43 49 53 rr->tag != GSCIS
bf20: 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 _TAG_CERTIFICATE
bf30: 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 ) {.....CACKEY_D
bf40: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e EBUG_PRINTF(" .
bf50: 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69 74 20 28 .. skipping it (
bf60: 77 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f we only care abo
bf70: 75 74 20 43 45 52 54 49 46 49 43 41 54 45 73 29 ut CERTIFICATEs)
bf80: 22 29 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 ");......continu
bf90: 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 75 72 72 e;....}.....curr
bfa0: 5f 69 64 20 3d 20 26 63 65 72 74 73 5b 6f 75 74 _id = &certs[out
bfb0: 69 64 78 5d 3b 0a 09 09 09 6f 75 74 69 64 78 2b idx];....outidx+
bfc0: 2b 3b 0a 0a 09 09 09 6d 65 6d 63 70 79 28 63 75 +;.....memcpy(cu
bfd0: 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 2c 20 63 rr_id->applet, c
bfe0: 75 72 72 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 urr_aid, sizeof(
bff0: 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 29 curr_id->applet)
c000: 29 3b 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 66 );....curr_id->f
c010: 69 6c 65 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e ile = ccc_curr->
c020: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f value_cardurl->o
c030: 62 6a 65 63 74 69 64 3b 0a 09 09 09 63 75 72 72 bjectid;....curr
c040: 5f 69 64 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 2d _id->keysize = -
c050: 31 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 1;.....CACKEY_DE
c060: 42 55 47 5f 50 52 49 4e 54 46 28 22 46 69 6c 6c BUG_PRINTF("Fill
c070: 69 6e 67 20 63 75 72 72 5f 69 64 2d 3e 61 70 70 ing curr_id->app
c080: 6c 65 74 20 28 25 70 29 20 77 69 74 68 20 25 6c let (%p) with %l
c090: 75 20 62 79 74 65 73 3a 22 2c 20 63 75 72 72 5f u bytes:", curr_
c0a0: 69 64 2d 3e 61 70 70 6c 65 74 2c 20 28 75 6e 73 id->applet, (uns
c0b0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65 igned long) size
c0c0: 6f 66 28 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c of(curr_id->appl
c0d0: 65 74 29 29 3b 0a 09 09 09 43 41 43 4b 45 59 5f et));....CACKEY_
c0e0: 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 DEBUG_PRINTBUF("
c0f0: 56 41 4c 3a 22 2c 20 63 75 72 72 5f 69 64 2d 3e VAL:", curr_id->
c100: 61 70 70 6c 65 74 2c 20 73 69 7a 65 6f 66 28 63 applet, sizeof(c
c110: 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 29 29 urr_id->applet))
c120: 3b 0a 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 ;.....curr_id->c
c130: 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d ertificate_len =
c140: 20 61 70 70 5f 63 75 72 72 2d 3e 6c 65 6e 67 74 app_curr->lengt
c150: 68 3b 0a 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e h;.....curr_id->
c160: 63 65 72 74 69 66 69 63 61 74 65 20 3d 20 6d 61 certificate = ma
c170: 6c 6c 6f 63 28 63 75 72 72 5f 69 64 2d 3e 63 65 lloc(curr_id->ce
c180: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a rtificate_len);.
c190: 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 69 ...memcpy(curr_i
c1a0: 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20 d->certificate,
c1b0: 61 70 70 5f 63 75 72 72 2d 3e 76 61 6c 75 65 2c app_curr->value,
c1c0: 20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 curr_id->certif
c1d0: 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 icate_len);.....
c1e0: 69 66 20 28 6f 75 74 69 64 78 20 3e 3d 20 2a 63 if (outidx >= *c
c1f0: 6f 75 6e 74 29 20 7b 0a 09 09 09 09 69 66 20 28 ount) {.....if (
c200: 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 29 certs_resizable)
c210: 20 7b 0a 09 09 09 09 09 2a 63 6f 75 6e 74 20 2a {......*count *
c220: 3d 20 32 3b 0a 09 09 09 09 09 63 65 72 74 73 20 = 2;......certs
c230: 3d 20 72 65 61 6c 6c 6f 63 28 63 65 72 74 73 2c = realloc(certs,
c240: 20 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 sizeof(*certs)
c250: 2a 20 28 2a 63 6f 75 6e 74 29 29 3b 0a 09 09 09 * (*count));....
c260: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 62 .} else {......b
c270: 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 09 09 09 7d reak;.....}....}
c280: 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 66 ...}....cackey_f
c290: 72 65 65 5f 74 6c 76 28 61 70 70 5f 74 6c 76 29 ree_tlv(app_tlv)
c2a0: 3b 0a 0a 09 09 69 66 20 28 6f 75 74 69 64 78 20 ;....if (outidx
c2b0: 3e 3d 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 09 09 >= *count) {....
c2c0: 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 break;...}..}...
c2d0: 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 cackey_free_tlv(
c2e0: 63 63 63 5f 74 6c 76 29 3b 0a 0a 09 2a 63 6f 75 ccc_tlv);...*cou
c2f0: 6e 74 20 3d 20 6f 75 74 69 64 78 3b 0a 0a 09 69 nt = outidx;...i
c300: 66 20 28 63 65 72 74 73 5f 72 65 73 69 7a 61 62 f (certs_resizab
c310: 6c 65 29 20 7b 0a 09 09 63 65 72 74 73 20 3d 20 le) {...certs =
c320: 72 65 61 6c 6c 6f 63 28 63 65 72 74 73 2c 20 73 realloc(certs, s
c330: 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 izeof(*certs) *
c340: 28 2a 63 6f 75 6e 74 29 29 3b 0a 09 7d 0a 0a 09 (*count));..}...
c350: 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20 53 6d 61 /* Terminate Sma
c360: 72 74 43 61 72 64 20 54 72 61 6e 73 61 63 74 69 rtCard Transacti
c370: 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e on */..cackey_en
c380: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c d_transaction(sl
c390: 6f 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 63 65 ot);...return(ce
c3a0: 72 74 73 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 rts);.}../*. * S
c3b0: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e YNPOSIS. * .
c3c0: 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e ... *. * ARGUMEN
c3d0: 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a TS. * .... *
c3e0: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 . * RETURN VALUE
c3f0: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 . * .... *.
c400: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e * NOTES. * .
c410: 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 ... *. */.static
c420: 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f ssize_t cackey_
c430: 73 69 67 6e 64 65 63 72 79 70 74 28 73 74 72 75 signdecrypt(stru
c440: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a ct cackey_slot *
c450: 73 6c 6f 74 2c 20 73 74 72 75 63 74 20 63 61 63 slot, struct cac
c460: 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 key_identity *id
c470: 65 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 entity, unsigned
c480: 20 63 68 61 72 20 2a 62 75 66 2c 20 73 69 7a 65 char *buf, size
c490: 5f 74 20 62 75 66 6c 65 6e 2c 20 75 6e 73 69 67 _t buflen, unsig
c4a0: 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 62 75 66 ned char *outbuf
c4b0: 2c 20 73 69 7a 65 5f 74 20 6f 75 74 62 75 66 6c , size_t outbufl
c4c0: 65 6e 2c 20 69 6e 74 20 70 61 64 49 6e 70 75 74 en, int padInput
c4d0: 2c 20 69 6e 74 20 75 6e 70 61 64 4f 75 74 70 75 , int unpadOutpu
c4e0: 74 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 t) {..unsigned c
c4f0: 68 61 72 20 2a 74 6d 70 62 75 66 2c 20 2a 74 6d har *tmpbuf, *tm
c500: 70 62 75 66 5f 73 2c 20 2a 6f 75 74 62 75 66 5f pbuf_s, *outbuf_
c510: 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 s;..unsigned cha
c520: 72 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 2c r bytes_to_send,
c530: 20 70 31 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 p1;..unsigned c
c540: 68 61 72 20 62 6c 6f 63 6b 74 79 70 65 3b 0a 09 har blocktype;..
c550: 63 61 63 6b 65 79 5f 72 65 74 20 73 65 6e 64 5f cackey_ret send_
c560: 72 65 74 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 ret;..uint16_t r
c570: 65 73 70 63 6f 64 65 3b 0a 09 73 73 69 7a 65 5f espcode;..ssize_
c580: 74 20 72 65 74 76 61 6c 20 3d 20 30 2c 20 75 6e t retval = 0, un
c590: 70 61 64 6f 66 66 73 65 74 3b 0a 09 73 69 7a 65 padoffset;..size
c5a0: 5f 74 20 74 6d 70 62 75 66 6c 65 6e 2c 20 70 61 _t tmpbuflen, pa
c5b0: 64 6c 65 6e 2c 20 74 6d 70 6f 75 74 62 75 66 6c dlen, tmpoutbufl
c5c0: 65 6e 3b 0a 09 69 6e 74 20 66 72 65 65 5f 74 6d en;..int free_tm
c5d0: 70 62 75 66 20 3d 20 30 3b 0a 09 69 6e 74 20 6c pbuf = 0;..int l
c5e0: 65 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 e;...CACKEY_DEBU
c5f0: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 G_PRINTF("Called
c600: 2e 22 29 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 20 .");...if (slot
c610: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 == NULL) {...CAC
c620: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
c630: 28 22 45 72 72 6f 72 2e 20 20 73 6c 6f 74 20 69 ("Error. slot i
c640: 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 s NULL");....ret
c650: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 urn(-1);..}...if
c660: 20 28 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b (buf == NULL) {
c670: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
c680: 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
c690: 62 75 66 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a buf is NULL");..
c6a0: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d ..return(-1);..}
c6b0: 0a 0a 09 69 66 20 28 6f 75 74 62 75 66 20 3d 3d ...if (outbuf ==
c6c0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 NULL) {...CACKE
c6d0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
c6e0: 45 72 72 6f 72 2e 20 20 6f 75 74 62 75 66 20 69 Error. outbuf i
c6f0: 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 s NULL");....ret
c700: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 urn(-1);..}...if
c710: 20 28 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55 (identity == NU
c720: 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 LL) {...CACKEY_D
c730: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
c740: 6f 72 2e 20 20 69 64 65 6e 74 69 74 79 20 69 73 or. identity is
c750: 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 NULL");....retu
c760: 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 rn(-1);..}...if
c770: 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f (identity->pcsc_
c780: 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55 4c 4c identity == NULL
c790: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
c7a0: 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
c7b0: 2e 20 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 . identity->pcs
c7c0: 63 5f 69 64 65 6e 74 69 74 79 20 69 73 20 4e 55 c_identity is NU
c7d0: 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 LL");....return(
c7e0: 2d 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 -1);..}.../* Det
c7f0: 65 72 6d 69 6e 65 20 69 64 65 6e 74 69 74 79 20 ermine identity
c800: 4b 65 79 20 73 69 7a 65 20 2a 2f 0a 09 69 66 20 Key size */..if
c810: 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f (identity->pcsc_
c820: 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a identity->keysiz
c830: 65 20 3c 20 30 29 20 7b 0a 09 09 69 64 65 6e 74 e < 0) {...ident
c840: 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 ity->pcsc_identi
c850: 74 79 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 78 35 ty->keysize = x5
c860: 30 39 5f 74 6f 5f 6b 65 79 73 69 7a 65 28 69 64 09_to_keysize(id
c870: 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 entity->pcsc_ide
c880: 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 ntity->certifica
c890: 74 65 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 te, identity->pc
c8a0: 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 sc_identity->cer
c8b0: 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 tificate_len);..
c8c0: 7d 0a 0a 09 2f 2a 20 50 61 64 20 6d 65 73 73 61 }.../* Pad messa
c8d0: 67 65 20 74 6f 20 6b 65 79 20 73 69 7a 65 20 2a ge to key size *
c8e0: 2f 0a 09 69 66 20 28 70 61 64 49 6e 70 75 74 29 /..if (padInput)
c8f0: 20 7b 0a 09 09 69 66 20 28 69 64 65 6e 74 69 74 {...if (identit
c900: 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 y->pcsc_identity
c910: 2d 3e 6b 65 79 73 69 7a 65 20 3e 20 30 29 20 7b ->keysize > 0) {
c920: 0a 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20 21 ....if (buflen !
c930: 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 = identity->pcsc
c940: 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 _identity->keysi
c950: 7a 65 29 20 7b 0a 09 09 09 09 69 66 20 28 62 75 ze) {.....if (bu
c960: 66 6c 65 6e 20 3e 20 28 69 64 65 6e 74 69 74 79 flen > (identity
c970: 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d ->pcsc_identity-
c980: 3e 6b 65 79 73 69 7a 65 20 2b 20 33 29 29 20 7b >keysize + 3)) {
c990: 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 ......CACKEY_DEB
c9a0: 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
c9b0: 2e 20 20 4d 65 73 73 61 67 65 20 69 73 20 74 6f . Message is to
c9c0: 6f 20 6c 61 72 67 65 20 74 6f 20 73 69 67 6e 2f o large to sign/
c9d0: 64 65 63 72 79 70 74 22 29 3b 0a 0a 09 09 09 09 decrypt");......
c9e0: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 .return(-1);....
c9f0: 09 7d 0a 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 .}......tmpbufle
ca00: 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 n = identity->pc
ca10: 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 sc_identity->key
ca20: 73 69 7a 65 3b 0a 09 09 09 09 74 6d 70 62 75 66 size;.....tmpbuf
ca30: 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 66 = malloc(tmpbuf
ca40: 6c 65 6e 29 3b 0a 09 09 09 09 66 72 65 65 5f 74 len);.....free_t
ca50: 6d 70 62 75 66 20 3d 20 31 3b 0a 0a 09 09 09 09 mpbuf = 1;......
ca60: 70 61 64 6c 65 6e 20 3d 20 74 6d 70 62 75 66 6c padlen = tmpbufl
ca70: 65 6e 20 2d 20 62 75 66 6c 65 6e 20 2d 20 33 3b en - buflen - 3;
ca80: 0a 0a 09 09 09 09 2f 2a 20 52 53 41 20 50 4b 43 ....../* RSA PKC
ca90: 53 23 31 20 45 4d 53 41 2d 50 4b 43 53 31 2d 76 S#1 EMSA-PKCS1-v
caa0: 31 5f 35 20 50 61 64 64 69 6e 67 20 2a 2f 0a 09 1_5 Padding */..
cab0: 09 09 09 74 6d 70 62 75 66 5b 30 5d 20 3d 20 30 ...tmpbuf[0] = 0
cac0: 78 30 30 3b 0a 09 09 09 09 74 6d 70 62 75 66 5b x00;.....tmpbuf[
cad0: 31 5d 20 3d 20 30 78 30 31 3b 0a 09 09 09 09 6d 1] = 0x01;.....m
cae0: 65 6d 73 65 74 28 26 74 6d 70 62 75 66 5b 32 5d emset(&tmpbuf[2]
caf0: 2c 20 30 78 46 46 2c 20 70 61 64 6c 65 6e 29 3b , 0xFF, padlen);
cb00: 0a 09 09 09 09 74 6d 70 62 75 66 5b 70 61 64 6c .....tmpbuf[padl
cb10: 65 6e 20 2b 20 32 5d 3d 20 30 78 30 30 3b 0a 09 en + 2]= 0x00;..
cb20: 09 09 09 6d 65 6d 63 70 79 28 26 74 6d 70 62 75 ...memcpy(&tmpbu
cb30: 66 5b 70 61 64 6c 65 6e 20 2b 20 33 5d 2c 20 62 f[padlen + 3], b
cb40: 75 66 2c 20 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 uf, buflen);....
cb50: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
cb60: 52 49 4e 54 42 55 46 28 22 55 6e 70 61 64 64 65 RINTBUF("Unpadde
cb70: 64 3a 22 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e d:", buf, buflen
cb80: 29 3b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 );.....CACKEY_DE
cb90: 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 50 61 BUG_PRINTBUF("Pa
cba0: 64 64 65 64 3a 22 2c 20 74 6d 70 62 75 66 2c 20 dded:", tmpbuf,
cbb0: 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 09 09 09 7d tmpbuflen);....}
cbc0: 20 65 6c 73 65 20 7b 0a 09 09 09 09 74 6d 70 62 else {.....tmpb
cbd0: 75 66 20 3d 20 62 75 66 3b 0a 09 09 09 09 74 6d uf = buf;.....tm
cbe0: 70 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65 6e pbuflen = buflen
cbf0: 3b 0a 09 09 09 09 66 72 65 65 5f 74 6d 70 62 75 ;.....free_tmpbu
cc00: 66 20 3d 20 30 3b 0a 09 09 09 09 70 61 64 6c 65 f = 0;.....padle
cc10: 6e 20 3d 20 30 3b 0a 09 09 09 7d 0a 09 09 7d 20 n = 0;....}...}
cc20: 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 else {....CACKEY
cc30: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 _DEBUG_PRINTF("U
cc40: 6e 61 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 nable to determi
cc50: 6e 65 20 6b 65 79 20 73 69 7a 65 2c 20 68 6f 70 ne key size, hop
cc60: 69 6e 67 20 74 68 65 20 6d 65 73 73 61 67 65 20 ing the message
cc70: 69 73 20 70 72 6f 70 65 72 6c 79 20 70 61 64 64 is properly padd
cc80: 65 64 21 22 29 3b 0a 0a 09 09 09 74 6d 70 62 75 ed!");.....tmpbu
cc90: 66 20 3d 20 62 75 66 3b 0a 09 09 09 74 6d 70 62 f = buf;....tmpb
cca0: 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a uflen = buflen;.
ccb0: 09 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d ...free_tmpbuf =
ccc0: 20 30 3b 0a 09 09 09 70 61 64 6c 65 6e 20 3d 20 0;....padlen =
ccd0: 30 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0;...}..} else {
cce0: 0a 09 09 74 6d 70 62 75 66 20 3d 20 62 75 66 3b ...tmpbuf = buf;
ccf0: 0a 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 62 ...tmpbuflen = b
cd00: 75 66 6c 65 6e 3b 0a 09 09 66 72 65 65 5f 74 6d uflen;...free_tm
cd10: 70 62 75 66 20 3d 20 30 3b 0a 09 09 70 61 64 6c pbuf = 0;...padl
cd20: 65 6e 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 en = 0;..}.../*
cd30: 42 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f Begin transactio
cd40: 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 62 65 67 n */..cackey_beg
cd50: 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 in_transaction(s
cd60: 6c 6f 74 29 3b 0a 0a 09 2f 2a 20 53 65 6c 65 63 lot);.../* Selec
cd70: 74 20 63 6f 72 72 65 63 74 20 61 70 70 6c 65 74 t correct applet
cd80: 20 2a 2f 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 */..CACKEY_DEBU
cd90: 47 5f 50 52 49 4e 54 46 28 22 53 65 6c 65 63 74 G_PRINTF("Select
cda0: 69 6e 67 20 61 70 70 6c 65 74 20 66 6f 75 6e 64 ing applet found
cdb0: 20 61 74 20 25 70 20 2e 2e 2e 22 2c 20 69 64 65 at %p ...", ide
cdc0: 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e ntity->pcsc_iden
cdd0: 74 69 74 79 2d 3e 61 70 70 6c 65 74 29 3b 0a 09 tity->applet);..
cde0: 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 cackey_select_ap
cdf0: 70 6c 65 74 28 73 6c 6f 74 2c 20 69 64 65 6e 74 plet(slot, ident
ce00: 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 ity->pcsc_identi
ce10: 74 79 2d 3e 61 70 70 6c 65 74 2c 20 73 69 7a 65 ty->applet, size
ce20: 6f 66 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 of(identity->pcs
ce30: 63 5f 69 64 65 6e 74 69 74 79 2d 3e 61 70 70 6c c_identity->appl
ce40: 65 74 29 29 3b 0a 0a 09 2f 2a 20 53 65 6c 65 63 et));.../* Selec
ce50: 74 20 63 6f 72 72 65 63 74 20 66 69 6c 65 20 2a t correct file *
ce60: 2f 0a 09 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 /..cackey_select
ce70: 5f 66 69 6c 65 28 73 6c 6f 74 2c 20 69 64 65 6e _file(slot, iden
ce80: 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 tity->pcsc_ident
ce90: 69 74 79 2d 3e 66 69 6c 65 29 3b 0a 0a 09 74 6d ity->file);...tm
cea0: 70 62 75 66 5f 73 20 3d 20 74 6d 70 62 75 66 3b pbuf_s = tmpbuf;
ceb0: 0a 09 6f 75 74 62 75 66 5f 73 20 3d 20 6f 75 74 ..outbuf_s = out
cec0: 62 75 66 3b 0a 09 77 68 69 6c 65 20 28 74 6d 70 buf;..while (tmp
ced0: 62 75 66 6c 65 6e 29 20 7b 0a 09 09 69 66 20 28 buflen) {...if (
cee0: 74 6d 70 62 75 66 6c 65 6e 20 3e 20 32 34 35 29 tmpbuflen > 245)
cef0: 20 7b 0a 09 09 09 62 79 74 65 73 5f 74 6f 5f 73 {....bytes_to_s
cf00: 65 6e 64 20 3d 20 32 34 35 3b 0a 09 09 09 70 31 end = 245;....p1
cf10: 20 3d 20 30 78 38 30 3b 0a 09 09 09 6c 65 20 3d = 0x80;....le =
cf20: 20 30 78 30 30 3b 0a 09 09 7d 20 65 6c 73 65 20 0x00;...} else
cf30: 7b 0a 09 09 09 62 79 74 65 73 5f 74 6f 5f 73 65 {....bytes_to_se
cf40: 6e 64 20 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a nd = tmpbuflen;.
cf50: 09 09 09 70 31 20 3d 20 30 78 30 30 3b 0a 09 09 ...p1 = 0x00;...
cf60: 09 6c 65 20 3d 20 30 78 30 30 3b 0a 09 09 7d 0a .le = 0x00;...}.
cf70: 0a 09 09 74 6d 70 6f 75 74 62 75 66 6c 65 6e 20 ...tmpoutbuflen
cf80: 3d 20 6f 75 74 62 75 66 6c 65 6e 3b 0a 0a 09 09 = outbuflen;....
cf90: 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 send_ret = cacke
cfa0: 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 y_send_apdu(slot
cfb0: 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c , GSCIS_CLASS_GL
cfc0: 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 2c 20 47 OBAL_PLATFORM, G
cfd0: 53 43 49 53 5f 49 4e 53 54 52 5f 53 49 47 4e 44 SCIS_INSTR_SIGND
cfe0: 45 43 52 59 50 54 2c 20 70 31 2c 20 30 78 30 30 ECRYPT, p1, 0x00
cff0: 2c 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 2c , bytes_to_send,
d000: 20 74 6d 70 62 75 66 2c 20 6c 65 2c 20 26 72 65 tmpbuf, le, &re
d010: 73 70 63 6f 64 65 2c 20 6f 75 74 62 75 66 2c 20 spcode, outbuf,
d020: 26 74 6d 70 6f 75 74 62 75 66 6c 65 6e 29 3b 0a &tmpoutbuflen);.
d030: 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21 ..if (send_ret !
d040: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f = CACKEY_PCSC_S_
d050: 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f OK) {....CACKEY_
d060: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 44 DEBUG_PRINTF("AD
d070: 50 55 20 53 65 6e 64 69 6e 67 20 46 61 69 6c 65 PU Sending Faile
d080: 64 20 2d 2d 20 72 65 74 75 72 6e 69 6e 67 20 69 d -- returning i
d090: 6e 20 65 72 72 6f 72 2e 22 29 3b 0a 0a 09 09 09 n error.");.....
d0a0: 69 66 20 28 66 72 65 65 5f 74 6d 70 62 75 66 29 if (free_tmpbuf)
d0b0: 20 7b 0a 09 09 09 09 69 66 20 28 74 6d 70 62 75 {.....if (tmpbu
d0c0: 66 5f 73 29 20 7b 0a 09 09 09 09 09 66 72 65 65 f_s) {......free
d0d0: 28 74 6d 70 62 75 66 5f 73 29 3b 0a 09 09 09 09 (tmpbuf_s);.....
d0e0: 7d 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 45 6e }....}...../* En
d0f0: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f d transaction */
d100: 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 ....cackey_end_t
d110: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 ransaction(slot)
d120: 3b 0a 0a 09 09 09 69 66 20 28 72 65 73 70 63 6f ;.....if (respco
d130: 64 65 20 3d 3d 20 30 78 36 39 38 32 29 20 7b 0a de == 0x6982) {.
d140: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
d150: 5f 50 52 49 4e 54 46 28 22 53 65 63 75 72 69 74 _PRINTF("Securit
d160: 79 20 73 74 61 74 75 73 20 6e 6f 74 20 73 61 74 y status not sat
d170: 69 73 69 66 69 65 64 2e 20 20 52 65 74 75 72 6e isified. Return
d180: 69 6e 67 20 4e 45 45 44 4c 4f 47 49 4e 22 29 3b ing NEEDLOGIN");
d190: 0a 0a 09 09 09 09 73 6c 6f 74 2d 3e 73 6c 6f 74 ......slot->slot
d1a0: 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 09 09 09 _reset = 1;.....
d1b0: 73 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67 slot->token_flag
d1c0: 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 s = CKF_LOGIN_RE
d1d0: 51 55 49 52 45 44 3b 0a 0a 09 09 09 09 72 65 74 QUIRED;......ret
d1e0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f urn(CACKEY_PCSC_
d1f0: 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 3b 0a 09 09 E_NEEDLOGIN);...
d200: 09 7d 0a 0a 09 09 09 69 66 20 28 73 65 6e 64 5f .}.....if (send_
d210: 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 ret == CACKEY_PC
d220: 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 SC_E_TOKENABSENT
d230: 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 ) {.....CACKEY_D
d240: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 6f 6b EBUG_PRINTF("Tok
d250: 65 6e 20 61 62 73 65 6e 74 2e 20 20 52 65 74 75 en absent. Retu
d260: 72 6e 69 6e 67 20 54 4f 4b 45 4e 41 42 53 45 4e rning TOKENABSEN
d270: 54 22 29 3b 0a 0a 09 09 09 09 73 6c 6f 74 2d 3e T");......slot->
d280: 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a slot_reset = 1;.
d290: 09 09 09 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f ....slot->token_
d2a0: 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 flags = CKF_LOGI
d2b0: 4e 5f 52 45 51 55 49 52 45 44 3b 0a 0a 09 09 09 N_REQUIRED;.....
d2c0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 .return(CACKEY_P
d2d0: 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e CSC_E_TOKENABSEN
d2e0: 54 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 T);....}.....ret
d2f0: 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 urn(-1);...}....
d300: 74 6d 70 62 75 66 20 2b 3d 20 62 79 74 65 73 5f tmpbuf += bytes_
d310: 74 6f 5f 73 65 6e 64 3b 0a 09 09 74 6d 70 62 75 to_send;...tmpbu
d320: 66 6c 65 6e 20 2d 3d 20 62 79 74 65 73 5f 74 6f flen -= bytes_to
d330: 5f 73 65 6e 64 3b 0a 0a 09 09 6f 75 74 62 75 66 _send;....outbuf
d340: 20 2b 3d 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e += tmpoutbuflen
d350: 3b 0a 09 09 6f 75 74 62 75 66 6c 65 6e 20 2d 3d ;...outbuflen -=
d360: 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 tmpoutbuflen;..
d370: 09 72 65 74 76 61 6c 20 2b 3d 20 74 6d 70 6f 75 .retval += tmpou
d380: 74 62 75 66 6c 65 6e 3b 0a 09 7d 0a 0a 09 69 66 tbuflen;..}...if
d390: 20 28 66 72 65 65 5f 74 6d 70 62 75 66 29 20 7b (free_tmpbuf) {
d3a0: 0a 09 09 69 66 20 28 74 6d 70 62 75 66 5f 73 29 ...if (tmpbuf_s)
d3b0: 20 7b 0a 09 09 09 66 72 65 65 28 74 6d 70 62 75 {....free(tmpbu
d3c0: 66 5f 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6f f_s);...}..}...o
d3d0: 75 74 62 75 66 20 3d 20 6f 75 74 62 75 66 5f 73 utbuf = outbuf_s
d3e0: 3b 0a 0a 09 2f 2a 20 45 6e 64 20 74 72 61 6e 73 ;.../* End trans
d3f0: 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 action */..cacke
d400: 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f y_end_transactio
d410: 6e 28 73 6c 6f 74 29 3b 0a 0a 23 69 66 64 65 66 n(slot);..#ifdef
d420: 20 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44 CACKEY_PARANOID
d430: 0a 23 20 20 69 66 64 65 66 20 5f 50 4f 53 49 58 .# ifdef _POSIX
d440: 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28 _SSIZE_MAX..if (
d450: 6f 75 74 62 75 66 6c 65 6e 20 3e 20 5f 50 4f 53 outbuflen > _POS
d460: 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a IX_SSIZE_MAX) {.
d470: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
d480: 52 49 4e 54 46 28 22 4f 75 74 62 75 66 6c 65 6e RINTF("Outbuflen
d490: 20 65 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d exceeds maximum
d4a0: 20 76 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e value, returnin
d4b0: 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d g in failure. (m
d4c0: 61 78 20 3d 20 25 6c 69 2c 20 6f 75 74 62 75 66 ax = %li, outbuf
d4d0: 6c 65 6e 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f len = %lu)", (lo
d4e0: 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 ng) _POSIX_SSIZE
d4f0: 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65 64 20 _MAX, (unsigned
d500: 6c 6f 6e 67 29 20 6f 75 74 62 75 66 6c 65 6e 29 long) outbuflen)
d510: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b ;....return(-1);
d520: 0a 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e ..}.# endif.#en
d530: 64 69 66 0a 0a 09 2f 2a 20 55 6e 70 61 64 20 72 dif.../* Unpad r
d540: 65 70 6c 79 20 2a 2f 0a 09 69 66 20 28 75 6e 70 eply */..if (unp
d550: 61 64 4f 75 74 70 75 74 29 20 7b 0a 09 09 69 66 adOutput) {...if
d560: 20 28 72 65 74 76 61 6c 20 3c 20 33 29 20 7b 0a (retval < 3) {.
d570: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
d580: 50 52 49 4e 54 46 28 22 52 65 70 6c 79 20 69 73 PRINTF("Reply is
d590: 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 77 65 20 61 too small, we a
d5a0: 72 65 20 6e 6f 74 20 61 62 6c 65 20 74 6f 20 75 re not able to u
d5b0: 6e 70 61 64 20 2d 2d 20 70 61 73 73 69 6e 67 20 npad -- passing
d5c0: 62 61 63 6b 20 61 6e 64 20 68 6f 70 69 6e 67 20 back and hoping
d5d0: 66 6f 72 20 74 68 65 20 62 65 73 74 21 22 29 3b for the best!");
d5e0: 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
d5f0: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
d600: 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20 ing in success,
d610: 72 65 74 76 61 6c 20 3d 20 25 6c 69 20 28 62 79 retval = %li (by
d620: 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65 tes)", (long) re
d630: 74 76 61 6c 29 3b 0a 09 09 09 72 65 74 75 72 6e tval);....return
d640: 28 72 65 74 76 61 6c 29 3b 0a 09 09 7d 0a 0a 09 (retval);...}...
d650: 09 69 66 20 28 6f 75 74 62 75 66 5b 30 5d 20 21 .if (outbuf[0] !
d660: 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 43 41 43 = 0x00) {....CAC
d670: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
d680: 28 22 55 6e 72 65 63 6f 67 6e 69 7a 65 64 20 70 ("Unrecognized p
d690: 61 64 64 69 6e 67 20 73 63 68 65 6d 65 20 2d 2d adding scheme --
d6a0: 20 70 61 73 73 69 6e 67 20 62 61 63 6b 20 61 6e passing back an
d6b0: 64 20 68 6f 70 69 6e 67 20 66 6f 72 20 74 68 65 d hoping for the
d6c0: 20 62 65 73 74 21 22 29 3b 0a 0a 09 09 09 43 41 best!");.....CA
d6d0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
d6e0: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 F("Returning in
d6f0: 73 75 63 63 65 73 73 2c 20 72 65 74 76 61 6c 20 success, retval
d700: 3d 20 25 6c 69 20 28 62 79 74 65 73 29 22 2c 20 = %li (bytes)",
d710: 28 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a (long) retval);.
d720: 09 09 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c ...return(retval
d730: 29 3b 0a 09 09 7d 0a 0a 09 09 62 6c 6f 63 6b 74 );...}....blockt
d740: 79 70 65 20 3d 20 6f 75 74 62 75 66 5b 31 5d 3b ype = outbuf[1];
d750: 0a 09 09 75 6e 70 61 64 6f 66 66 73 65 74 20 3d ...unpadoffset =
d760: 20 30 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 62 0;....switch (b
d770: 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 09 09 09 63 locktype) {....c
d780: 61 73 65 20 30 78 30 30 3a 0a 09 09 09 09 2f 2a ase 0x00:...../*
d790: 20 50 61 64 64 69 6e 67 20 53 63 68 65 6d 65 20 Padding Scheme
d7a0: 31 2c 20 74 68 65 20 66 69 72 73 74 20 6e 6f 6e 1, the first non
d7b0: 2d 7a 65 72 6f 20 62 79 74 65 20 69 73 20 74 68 -zero byte is th
d7c0: 65 20 73 74 61 72 74 20 6f 66 20 64 61 74 61 20 e start of data
d7d0: 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75 6e 70 61 */.....for (unpa
d7e0: 64 6f 66 66 73 65 74 20 3d 20 32 3b 20 75 6e 70 doffset = 2; unp
d7f0: 61 64 6f 66 66 73 65 74 20 3c 20 72 65 74 76 61 adoffset < retva
d800: 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b l; unpadoffset++
d810: 29 20 7b 0a 09 09 09 09 09 69 66 20 28 6f 75 74 ) {......if (out
d820: 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d buf[unpadoffset]
d830: 20 21 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 09 != 0x00) {.....
d840: 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a ..break;......}.
d850: 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b ....}.....break;
d860: 0a 09 09 09 63 61 73 65 20 30 78 30 31 3a 0a 09 ....case 0x01:..
d870: 09 09 09 2f 2a 20 50 61 64 64 69 6e 67 20 53 63 .../* Padding Sc
d880: 68 65 6d 65 20 32 2c 20 70 61 64 20 62 79 74 65 heme 2, pad byte
d890: 73 20 61 72 65 20 30 78 46 46 20 66 6f 6c 6c 6f s are 0xFF follo
d8a0: 77 65 64 20 62 79 20 30 78 30 30 20 2a 2f 0a 09 wed by 0x00 */..
d8b0: 09 09 09 66 6f 72 20 28 75 6e 70 61 64 6f 66 66 ...for (unpadoff
d8c0: 73 65 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f 66 set = 2; unpadof
d8d0: 66 73 65 74 20 3c 20 72 65 74 76 61 6c 3b 20 75 fset < retval; u
d8e0: 6e 70 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a npadoffset++) {.
d8f0: 09 09 09 09 09 69 66 20 28 6f 75 74 62 75 66 5b .....if (outbuf[
d900: 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 21 3d 20 unpadoffset] !=
d910: 30 78 46 46 29 20 7b 0a 09 09 09 09 09 09 69 66 0xFF) {.......if
d920: 20 28 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 (outbuf[unpadof
d930: 66 73 65 74 5d 20 3d 3d 20 30 78 30 30 29 20 7b fset] == 0x00) {
d940: 0a 09 09 09 09 09 09 09 75 6e 70 61 64 6f 66 66 ........unpadoff
d950: 73 65 74 2b 2b 3b 0a 0a 09 09 09 09 09 09 09 62 set++;.........b
d960: 72 65 61 6b 3b 0a 09 09 09 09 09 09 7d 20 65 6c reak;.......} el
d970: 73 65 20 7b 0a 09 09 09 09 09 09 09 43 41 43 4b se {........CACK
d980: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
d990: 22 49 6e 76 61 6c 69 64 20 70 61 64 64 69 6e 67 "Invalid padding
d9a0: 20 64 61 74 61 20 66 6f 75 6e 64 2c 20 72 65 74 data found, ret
d9b0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 urning in failur
d9c0: 65 2c 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 e, should have b
d9d0: 65 65 6e 20 30 78 30 30 20 66 6f 75 6e 64 20 30 een 0x00 found 0
d9e0: 78 25 30 32 78 22 2c 20 28 75 6e 73 69 67 6e 65 x%02x", (unsigne
d9f0: 64 20 69 6e 74 29 20 6f 75 74 62 75 66 5b 75 6e d int) outbuf[un
da00: 70 61 64 6f 66 66 73 65 74 5d 29 3b 0a 0a 09 09 padoffset]);....
da10: 09 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b .....return(-1);
da20: 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 20 .......}......}
da30: 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 43 41 43 else {.......CAC
da40: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
da50: 28 22 49 6e 76 61 6c 69 64 20 70 61 64 64 69 6e ("Invalid paddin
da60: 67 20 64 61 74 61 20 66 6f 75 6e 64 2c 20 72 65 g data found, re
da70: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 turning in failu
da80: 72 65 2c 20 73 68 6f 75 6c 64 20 68 61 76 65 20 re, should have
da90: 62 65 65 6e 20 30 78 46 46 20 66 6f 75 6e 64 20 been 0xFF found
daa0: 30 78 25 30 32 78 22 2c 20 28 75 6e 73 69 67 6e 0x%02x", (unsign
dab0: 65 64 20 69 6e 74 29 20 6f 75 74 62 75 66 5b 75 ed int) outbuf[u
dac0: 6e 70 61 64 6f 66 66 73 65 74 5d 29 3b 0a 0a 09 npadoffset]);...
dad0: 09 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b .....return(-1);
dae0: 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 ......}.....}...
daf0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 ..break;....case
db00: 20 30 78 30 32 3a 0a 09 09 09 09 2f 2a 20 50 61 0x02:...../* Pa
db10: 64 64 69 6e 67 20 53 63 68 65 6d 65 20 33 2c 20 dding Scheme 3,
db20: 70 61 64 20 62 79 74 65 73 20 61 72 65 20 6e 6f pad bytes are no
db30: 6e 2d 7a 65 72 6f 20 66 69 72 73 74 20 7a 65 72 n-zero first zer
db40: 6f 20 62 79 74 65 20 66 6f 75 6e 64 20 69 73 20 o byte found is
db50: 74 68 65 20 73 65 70 65 72 61 74 6f 72 20 62 79 the seperator by
db60: 74 65 20 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75 te */.....for (u
db70: 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 32 3b 20 npadoffset = 2;
db80: 75 6e 70 61 64 6f 66 66 73 65 74 20 3c 20 72 65 unpadoffset < re
db90: 74 76 61 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65 tval; unpadoffse
dba0: 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66 20 28 t++) {......if (
dbb0: 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 outbuf[unpadoffs
dbc0: 65 74 5d 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 et] == 0x00) {..
dbd0: 09 09 09 09 09 75 6e 70 61 64 6f 66 66 73 65 74 .....unpadoffset
dbe0: 2b 2b 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b ++;........break
dbf0: 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 ;......}.....}..
dc00: 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 ...break;...}...
dc10: 09 69 66 20 28 75 6e 70 61 64 6f 66 66 73 65 74 .if (unpadoffset
dc20: 20 3e 20 72 65 74 76 61 6c 29 20 7b 0a 09 09 09 > retval) {....
dc30: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
dc40: 4e 54 46 28 22 4f 66 66 73 65 74 20 67 72 65 61 NTF("Offset grea
dc50: 74 65 72 20 74 68 61 6e 20 72 65 70 6c 79 20 73 ter than reply s
dc60: 69 7a 65 2c 20 61 62 6f 72 74 69 6e 67 2e 20 20 ize, aborting.
dc70: 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 25 (unpadoffset = %
dc80: 6c 75 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c 75 lu, retval = %lu
dc90: 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f )", (unsigned lo
dca0: 6e 67 29 20 75 6e 70 61 64 6f 66 66 73 65 74 2c ng) unpadoffset,
dcb0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
dcc0: 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 retval);.....re
dcd0: 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 turn(-1);...}...
dce0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
dcf0: 49 4e 54 42 55 46 28 22 50 61 64 64 65 64 3a 22 INTBUF("Padded:"
dd00: 2c 20 6f 75 74 62 75 66 2c 20 72 65 74 76 61 6c , outbuf, retval
dd10: 29 3b 0a 0a 09 09 72 65 74 76 61 6c 20 2d 3d 20 );....retval -=
dd20: 75 6e 70 61 64 6f 66 66 73 65 74 3b 0a 09 09 6d unpadoffset;...m
dd30: 65 6d 6d 6f 76 65 28 6f 75 74 62 75 66 2c 20 6f emmove(outbuf, o
dd40: 75 74 62 75 66 20 2b 20 75 6e 70 61 64 6f 66 66 utbuf + unpadoff
dd50: 73 65 74 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 set, retval);...
dd60: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
dd70: 49 4e 54 42 55 46 28 22 55 6e 70 61 64 64 65 64 INTBUF("Unpadded
dd80: 3a 22 2c 20 6f 75 74 62 75 66 2c 20 72 65 74 76 :", outbuf, retv
dd90: 61 6c 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b 45 al);..}....CACKE
dda0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
ddb0: 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 Returning in suc
ddc0: 63 65 73 73 2c 20 72 65 74 76 61 6c 20 3d 20 25 cess, retval = %
ddd0: 6c 69 20 28 62 79 74 65 73 29 22 2c 20 28 6c 6f li (bytes)", (lo
dde0: 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 ng) retval);...r
ddf0: 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d eturn(retval);.}
de00: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 ../*. * SYNPOSIS
de10: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 . * .... *.
de20: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 * ARGUMENTS. *
de30: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 .... *. * RET
de40: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 URN VALUE. *
de50: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 .... *. * NOTES
de60: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 . * .... *.
de70: 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 */.static cackey
de80: 5f 72 65 74 20 63 61 63 6b 65 79 5f 6c 6f 67 69 _ret cackey_logi
de90: 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f n(struct cackey_
dea0: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 slot *slot, unsi
deb0: 67 6e 65 64 20 63 68 61 72 20 2a 70 69 6e 2c 20 gned char *pin,
dec0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 70 69 unsigned long pi
ded0: 6e 5f 6c 65 6e 2c 20 69 6e 74 20 2a 74 72 69 65 n_len, int *trie
dee0: 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b s_remaining_p) {
def0: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 ..unsigned char
df00: 63 61 63 5f 70 69 6e 5b 38 5d 20 3d 20 7b 30 78 cac_pin[8] = {0x
df10: 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 FF, 0xFF, 0xFF,
df20: 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 0xFF, 0xFF, 0xFF
df30: 2c 20 30 78 46 46 2c 20 30 78 46 46 7d 3b 0a 09 , 0xFF, 0xFF};..
df40: 75 69 6e 74 31 36 5f 74 20 72 65 73 70 6f 6e 73 uint16_t respons
df50: 65 5f 63 6f 64 65 3b 0a 09 69 6e 74 20 74 72 69 e_code;..int tri
df60: 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 69 es_remaining;..i
df70: 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 2f nt send_ret;.../
df80: 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 * Indicate that
df90: 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 61 we do not know a
dfa0: 62 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 74 72 bout how many tr
dfb0: 69 65 73 20 61 72 65 20 72 65 6d 61 69 6e 69 6e ies are remainin
dfc0: 67 20 2a 2f 0a 09 69 66 20 28 74 72 69 65 73 5f g */..if (tries_
dfd0: 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 remaining_p) {..
dfe0: 09 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e .*tries_remainin
dff0: 67 5f 70 20 3d 20 2d 31 3b 0a 09 7d 0a 0a 09 2f g_p = -1;..}.../
e000: 2a 20 41 70 70 61 72 65 6e 74 6c 79 2c 20 43 41 * Apparently, CA
e010: 43 20 50 49 4e 73 20 61 72 65 20 2a 45 58 41 43 C PINs are *EXAC
e020: 54 4c 59 2a 20 38 20 62 79 74 65 73 20 6c 6f 6e TLY* 8 bytes lon
e030: 67 20 2d 2d 20 70 61 64 20 77 69 74 68 20 30 78 g -- pad with 0x
e040: 46 46 20 69 66 20 74 6f 6f 20 73 68 6f 72 74 20 FF if too short
e050: 2a 2f 0a 09 69 66 20 28 70 69 6e 5f 6c 65 6e 20 */..if (pin_len
e060: 3e 3d 20 38 29 20 7b 0a 09 09 6d 65 6d 63 70 79 >= 8) {...memcpy
e070: 28 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 38 (cac_pin, pin, 8
e080: 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d );..} else {...m
e090: 65 6d 63 70 79 28 63 61 63 5f 70 69 6e 2c 20 70 emcpy(cac_pin, p
e0a0: 69 6e 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a 09 7d in, pin_len);..}
e0b0: 0a 0a 09 2f 2a 20 49 73 73 75 65 20 50 49 4e 20 .../* Issue PIN
e0c0: 56 65 72 69 66 79 20 2a 2f 0a 09 73 65 6e 64 5f Verify */..send_
e0d0: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e ret = cackey_sen
e0e0: 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 d_apdu(slot, GSC
e0f0: 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 IS_CLASS_ISO7816
e100: 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 56 45 , GSCIS_INSTR_VE
e110: 52 49 46 59 2c 20 30 78 30 30 2c 20 30 78 30 30 RIFY, 0x00, 0x00
e120: 2c 20 73 69 7a 65 6f 66 28 63 61 63 5f 70 69 6e , sizeof(cac_pin
e130: 29 2c 20 63 61 63 5f 70 69 6e 2c 20 30 78 30 30 ), cac_pin, 0x00
e140: 2c 20 26 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 , &response_code
e150: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 , NULL, NULL);..
e160: 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 if (send_ret !=
e170: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b CACKEY_PCSC_S_OK
e180: 29 20 7b 0a 09 09 69 66 20 28 28 72 65 73 70 6f ) {...if ((respo
e190: 6e 73 65 5f 63 6f 64 65 20 26 20 30 78 36 33 43 nse_code & 0x63C
e1a0: 30 29 20 3d 3d 20 30 78 36 33 43 30 29 20 7b 0a 0) == 0x63C0) {.
e1b0: 09 09 09 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 ...tries_remaini
e1c0: 6e 67 20 3d 20 28 72 65 73 70 6f 6e 73 65 5f 63 ng = (response_c
e1d0: 6f 64 65 20 26 20 30 78 46 29 3b 0a 0a 09 09 09 ode & 0xF);.....
e1e0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
e1f0: 4e 54 46 28 22 50 49 4e 20 56 65 72 69 66 69 63 NTF("PIN Verific
e200: 61 74 69 6f 6e 20 66 61 69 6c 65 64 2c 20 25 69 ation failed, %i
e210: 20 74 72 69 65 73 20 72 65 6d 61 69 6e 69 6e 67 tries remaining
e220: 22 2c 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 ", tries_remaini
e230: 6e 67 29 3b 0a 0a 09 09 09 69 66 20 28 74 72 69 ng);.....if (tri
e240: 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 es_remaining_p)
e250: 7b 0a 09 09 09 09 2a 74 72 69 65 73 5f 72 65 6d {.....*tries_rem
e260: 61 69 6e 69 6e 67 5f 70 20 3d 20 74 72 69 65 73 aining_p = tries
e270: 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 09 09 7d _remaining;....}
e280: 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b .....return(CACK
e290: 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e EY_PCSC_E_BADPIN
e2a0: 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72 65 );...}....if (re
e2b0: 73 70 6f 6e 73 65 5f 63 6f 64 65 20 3d 3d 20 30 sponse_code == 0
e2c0: 78 36 39 38 33 29 20 7b 0a 09 09 09 43 41 43 4b x6983) {....CACK
e2d0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
e2e0: 22 50 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f "PIN Verificatio
e2f0: 6e 20 66 61 69 6c 65 64 2c 20 64 65 76 69 63 65 n failed, device
e300: 20 69 73 20 6c 6f 63 6b 65 64 22 29 3b 0a 0a 09 is locked");...
e310: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f ..return(CACKEY_
e320: 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 29 3b 0a PCSC_E_LOCKED);.
e330: 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 ..}....return(CA
e340: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 CKEY_PCSC_E_GENE
e350: 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 RIC);..}...CACKE
e360: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
e370: 50 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e PIN Verification
e380: 20 73 75 63 63 65 65 64 65 64 22 29 3b 0a 0a 09 succeeded");...
e390: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 return(CACKEY_PC
e3a0: 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a SC_S_OK);.}../*.
e3b0: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 * SYNPOSIS. *
e3c0: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 .... *. * ARG
e3d0: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e UMENTS. * ..
e3e0: 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 .. *. * RETURN V
e3f0: 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a ALUE. * ....
e400: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 *. * NOTES. *
e410: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 .... *. */.st
e420: 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 atic cackey_ret
e430: 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 cackey_token_pre
e440: 73 65 6e 74 28 73 74 72 75 63 74 20 63 61 63 6b sent(struct cack
e450: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b ey_slot *slot) {
e460: 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 70 63 73 ..cackey_ret pcs
e470: 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 c_connect_ret;..
e480: 44 57 4f 52 44 20 72 65 61 64 65 72 5f 6c 65 6e DWORD reader_len
e490: 2c 20 73 74 61 74 65 2c 20 70 72 6f 74 6f 63 6f , state, protoco
e4a0: 6c 2c 20 61 74 72 5f 6c 65 6e 3b 0a 09 42 59 54 l, atr_len;..BYT
e4b0: 45 20 61 74 72 5b 4d 41 58 5f 41 54 52 5f 53 49 E atr[MAX_ATR_SI
e4c0: 5a 45 5d 3b 0a 09 4c 4f 4e 47 20 73 74 61 74 75 ZE];..LONG statu
e4d0: 73 5f 72 65 74 2c 20 73 63 61 72 64 5f 72 65 63 s_ret, scard_rec
e4e0: 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 onn_ret;...CACKE
e4f0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
e500: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 70 63 73 Called.");...pcs
e510: 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 c_connect_ret =
e520: 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 cackey_connect_c
e530: 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28 ard(slot);..if (
e540: 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 pcsc_connect_ret
e550: 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f != CACKEY_PCSC_
e560: 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 S_OK) {...CACKEY
e570: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 _DEBUG_PRINTF("U
e580: 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 nable to connect
e590: 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72 6e to card, return
e5a0: 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 ing token absent
e5b0: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 ");....return(CA
e5c0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 CKEY_PCSC_E_TOKE
e5d0: 4e 41 42 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 61 NABSENT);..}...a
e5e0: 74 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 tr_len = sizeof(
e5f0: 61 74 72 29 3b 0a 09 73 74 61 74 75 73 5f 72 65 atr);..status_re
e600: 74 20 3d 20 53 43 61 72 64 53 74 61 74 75 73 28 t = SCardStatus(
e610: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c slot->pcsc_card,
e620: 20 4e 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f 6c NULL, &reader_l
e630: 65 6e 2c 20 26 73 74 61 74 65 2c 20 26 70 72 6f en, &state, &pro
e640: 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74 72 tocol, atr, &atr
e650: 5f 6c 65 6e 29 3b 0a 09 69 66 20 28 73 74 61 74 _len);..if (stat
e660: 75 73 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f us_ret != SCARD_
e670: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 73 S_SUCCESS) {...s
e680: 6c 6f 74 2d 3e 73 6c 6f 74 5f 72 65 73 65 74 20 lot->slot_reset
e690: 3d 20 31 3b 0a 09 09 73 6c 6f 74 2d 3e 74 6f 6b = 1;...slot->tok
e6a0: 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c en_flags = CKF_L
e6b0: 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 0a OGIN_REQUIRED;..
e6c0: 09 09 69 66 20 28 73 74 61 74 75 73 5f 72 65 74 ..if (status_ret
e6d0: 20 3d 3d 20 53 43 41 52 44 5f 57 5f 52 45 53 45 == SCARD_W_RESE
e6e0: 54 5f 43 41 52 44 29 20 7b 0a 09 09 09 43 41 43 T_CARD) {....CAC
e6f0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
e700: 28 22 52 65 73 65 74 20 72 65 71 75 69 72 65 64 ("Reset required
e710: 2c 20 70 6c 65 61 73 65 20 68 6f 6c 64 2e 2e 2e , please hold...
e720: 22 29 3b 0a 0a 09 09 09 73 63 61 72 64 5f 72 65 ");.....scard_re
e730: 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 conn_ret = SCard
e740: 52 65 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e Reconnect(slot->
e750: 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 pcsc_card, SCARD
e760: 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 _SHARE_SHARED, S
e770: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 CARD_PROTOCOL_T0
e780: 2c 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41 , SCARD_RESET_CA
e790: 52 44 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a RD, &protocol);.
e7a0: 09 09 09 69 66 20 28 73 63 61 72 64 5f 72 65 63 ...if (scard_rec
e7b0: 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 onn_ret == SCARD
e7c0: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 _S_SUCCESS) {...
e7d0: 09 09 2f 2a 20 52 65 2d 65 73 74 61 62 6c 69 73 ../* Re-establis
e7e0: 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 h transaction, i
e7f0: 66 20 69 74 20 77 61 73 20 70 72 65 73 65 6e 74 f it was present
e800: 20 2a 2f 0a 09 09 09 09 69 66 20 28 73 6c 6f 74 */.....if (slot
e810: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 ->transaction_de
e820: 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 pth > 0) {......
e830: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f slot->transactio
e840: 6e 5f 64 65 70 74 68 2d 2d 3b 0a 09 09 09 09 09 n_depth--;......
e850: 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 cackey_begin_tra
e860: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a nsaction(slot);.
e870: 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 ....}......CACKE
e880: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
e890: 52 65 73 65 74 20 73 75 63 63 65 73 73 66 75 6c Reset successful
e8a0: 2c 20 72 65 71 75 65 72 79 69 6e 67 22 29 3b 0a , requerying");.
e8b0: 09 09 09 09 73 74 61 74 75 73 5f 72 65 74 20 3d ....status_ret =
e8c0: 20 53 43 61 72 64 53 74 61 74 75 73 28 73 6c 6f SCardStatus(slo
e8d0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 4e 55 t->pcsc_card, NU
e8e0: 4c 4c 2c 20 26 72 65 61 64 65 72 5f 6c 65 6e 2c LL, &reader_len,
e8f0: 20 26 73 74 61 74 65 2c 20 26 70 72 6f 74 6f 63 &state, &protoc
e900: 6f 6c 2c 20 61 74 72 2c 20 26 61 74 72 5f 6c 65 ol, atr, &atr_le
e910: 6e 29 3b 0a 09 09 09 09 69 66 20 28 73 74 61 74 n);.....if (stat
e920: 75 73 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f us_ret != SCARD_
e930: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 S_SUCCESS) {....
e940: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
e950: 52 49 4e 54 46 28 22 53 74 69 6c 6c 20 75 6e 61 RINTF("Still una
e960: 62 6c 65 20 74 6f 20 71 75 65 72 79 20 63 61 72 ble to query car
e970: 64 20 73 74 61 74 75 73 2c 20 72 65 74 75 72 6e d status, return
e980: 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 ing token absent
e990: 2e 20 20 53 43 61 72 64 53 74 61 74 75 73 28 29 . SCardStatus()
e9a0: 20 3d 20 25 73 22 2c 20 43 41 43 4b 45 59 5f 44 = %s", CACKEY_D
e9b0: 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 EBUG_FUNC_SCARDE
e9c0: 52 52 5f 54 4f 5f 53 54 52 28 73 74 61 74 75 73 RR_TO_STR(status
e9d0: 5f 72 65 74 29 29 3b 0a 0a 09 09 09 09 09 72 65 _ret));.......re
e9e0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 turn(CACKEY_PCSC
e9f0: 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b _E_TOKENABSENT);
ea00: 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 .....}....} else
ea10: 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 {.....CACKEY_DE
ea20: 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 BUG_PRINTF("Unab
ea30: 6c 65 20 74 6f 20 72 65 63 6f 6e 6e 65 63 74 20 le to reconnect
ea40: 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69 to card, returni
ea50: 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 2e ng token absent.
ea60: 20 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 SCardReconnect
ea70: 28 29 20 3d 20 25 73 22 2c 20 43 41 43 4b 45 59 () = %s", CACKEY
ea80: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 _DEBUG_FUNC_SCAR
ea90: 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 DERR_TO_STR(scar
eaa0: 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 29 29 3b 0a d_reconn_ret));.
eab0: 0a 09 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b .....return(CACK
eac0: 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 EY_PCSC_E_TOKENA
ead0: 42 53 45 4e 54 29 3b 0a 09 09 09 7d 0a 09 09 7d BSENT);....}...}
eae0: 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 else {....CACKE
eaf0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
eb00: 55 6e 61 62 6c 65 20 74 6f 20 71 75 65 72 79 20 Unable to query
eb10: 63 61 72 64 20 73 74 61 74 75 73 2c 20 72 65 74 card status, ret
eb20: 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 urning token abs
eb30: 65 6e 74 2e 20 20 53 43 61 72 64 53 74 61 74 75 ent. SCardStatu
eb40: 73 28 29 20 3d 20 25 73 22 2c 20 43 41 43 4b 45 s() = %s", CACKE
eb50: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 Y_DEBUG_FUNC_SCA
eb60: 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 74 61 RDERR_TO_STR(sta
eb70: 74 75 73 5f 72 65 74 29 29 3b 0a 0a 09 09 09 72 tus_ret));.....r
eb80: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 eturn(CACKEY_PCS
eb90: 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 C_E_TOKENABSENT)
eba0: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 28 ;...}..}...if ((
ebb0: 73 74 61 74 65 20 26 20 53 43 41 52 44 5f 41 42 state & SCARD_AB
ebc0: 53 45 4e 54 29 20 3d 3d 20 53 43 41 52 44 5f 41 SENT) == SCARD_A
ebd0: 42 53 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45 BSENT) {...CACKE
ebe0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
ebf0: 43 61 72 64 20 69 73 20 61 62 73 65 6e 74 2c 20 Card is absent,
ec00: 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 returning token
ec10: 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09 72 65 74 absent");....ret
ec20: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f urn(CACKEY_PCSC_
ec30: 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a E_TOKENABSENT);.
ec40: 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 .}...CACKEY_DEBU
ec50: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
ec60: 69 6e 67 20 74 6f 6b 65 6e 20 70 72 65 73 65 6e ing token presen
ec70: 74 2e 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 t.");...return(C
ec80: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b ACKEY_PCSC_S_TOK
ec90: 45 4e 50 52 45 53 45 4e 54 29 3b 0a 7d 0a 0a 2f ENPRESENT);.}../
eca0: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a *. * SYNPOSIS. *
ecb0: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 .... *. * A
ecc0: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 RGUMENTS. *
ecd0: 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e .... *. * RETURN
ece0: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e VALUE. * ..
ecf0: 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a .. *. * NOTES. *
ed00: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a .... *. */.
ed10: 73 74 61 74 69 63 20 73 73 69 7a 65 5f 74 20 63 static ssize_t c
ed20: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 ackey_pcsc_ident
ed30: 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28 73 74 72 ity_to_label(str
ed40: 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f uct cackey_pcsc_
ed50: 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 identity *identi
ed60: 74 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 ty, unsigned cha
ed70: 72 20 2a 6c 61 62 65 6c 5f 62 75 66 2c 20 75 6e r *label_buf, un
ed80: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 61 62 65 signed long labe
ed90: 6c 5f 62 75 66 5f 6c 65 6e 29 20 7b 0a 09 75 6e l_buf_len) {..un
eda0: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 65 72 74 signed long cert
edb0: 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 63 68 ificate_len;..ch
edc0: 61 72 20 2a 6c 61 62 65 6c 5f 61 73 6e 31 3b 0a ar *label_asn1;.
edd0: 09 76 6f 69 64 20 2a 63 65 72 74 69 66 69 63 61 .void *certifica
ede0: 74 65 3b 0a 09 69 6e 74 20 78 35 30 39 5f 72 65 te;..int x509_re
edf0: 61 64 5f 72 65 74 3b 0a 0a 09 63 65 72 74 69 66 ad_ret;...certif
ee00: 69 63 61 74 65 20 3d 20 69 64 65 6e 74 69 74 79 icate = identity
ee10: 2d 3e 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 ->certificate;..
ee20: 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 certificate_len
ee30: 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 = identity->cert
ee40: 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09 69 ificate_len;...i
ee50: 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c f (certificate_l
ee60: 65 6e 20 3c 20 30 29 20 7b 0a 09 09 72 65 74 75 en < 0) {...retu
ee70: 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 78 35 30 rn(-1);..}...x50
ee80: 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 9_read_ret = x50
ee90: 39 5f 74 6f 5f 73 75 62 6a 65 63 74 28 63 65 72 9_to_subject(cer
eea0: 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 tificate, certif
eeb0: 69 63 61 74 65 5f 6c 65 6e 2c 20 28 76 6f 69 64 icate_len, (void
eec0: 20 2a 2a 29 20 26 6c 61 62 65 6c 5f 61 73 6e 31 **) &label_asn1
eed0: 29 3b 0a 09 69 66 20 28 78 35 30 39 5f 72 65 61 );..if (x509_rea
eee0: 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 72 d_ret < 0) {...r
eef0: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 eturn(-1);..}...
ef00: 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 x509_read_ret =
ef10: 78 35 30 39 5f 64 6e 5f 74 6f 5f 73 74 72 69 6e x509_dn_to_strin
ef20: 67 28 6c 61 62 65 6c 5f 61 73 6e 31 2c 20 78 35 g(label_asn1, x5
ef30: 30 39 5f 72 65 61 64 5f 72 65 74 2c 20 28 63 68 09_read_ret, (ch
ef40: 61 72 20 2a 29 20 6c 61 62 65 6c 5f 62 75 66 2c ar *) label_buf,
ef50: 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 2c 20 label_buf_len,
ef60: 22 43 4e 22 29 3b 0a 09 69 66 20 28 78 35 30 39 "CN");..if (x509
ef70: 5f 72 65 61 64 5f 72 65 74 20 3c 3d 20 30 29 20 _read_ret <= 0)
ef80: 7b 0a 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 {...x509_read_re
ef90: 74 20 3d 20 78 35 30 39 5f 64 6e 5f 74 6f 5f 73 t = x509_dn_to_s
efa0: 74 72 69 6e 67 28 6c 61 62 65 6c 5f 61 73 6e 31 tring(label_asn1
efb0: 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 2c , x509_read_ret,
efc0: 20 28 63 68 61 72 20 2a 29 20 6c 61 62 65 6c 5f (char *) label_
efd0: 62 75 66 2c 20 6c 61 62 65 6c 5f 62 75 66 5f 6c buf, label_buf_l
efe0: 65 6e 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 09 69 66 en, NULL);....if
eff0: 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 (x509_read_ret
f000: 3c 3d 20 30 29 20 7b 0a 09 09 09 72 65 74 75 72 <= 0) {....retur
f010: 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 n(-1);...}..}..#
f020: 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41 52 ifdef CACKEY_PAR
f030: 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20 5f ANOID.# ifdef _
f040: 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a POSIX_SSIZE_MAX.
f050: 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 .if (x509_read_r
f060: 65 74 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a et > _POSIX_SSIZ
f070: 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b 45 E_MAX) {...CACKE
f080: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
f090: 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 65 78 x509_read_ret ex
f0a0: 63 65 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 ceeds maximum va
f0b0: 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 lue, returning i
f0c0: 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 n failure. (max
f0d0: 3d 20 25 6c 69 2c 20 78 35 30 39 5f 72 65 61 64 = %li, x509_read
f0e0: 5f 72 65 74 20 3d 20 25 6c 75 29 22 2c 20 28 6c _ret = %lu)", (l
f0f0: 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a ong) _POSIX_SSIZ
f100: 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65 64 E_MAX, (unsigned
f110: 20 6c 6f 6e 67 29 20 78 35 30 39 5f 72 65 61 64 long) x509_read
f120: 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e _ret);....return
f130: 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69 (-1);..}.# endi
f140: 66 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 f.#endif...retur
f150: 6e 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 29 n(x509_read_ret)
f160: 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20 ;.}../* Returns
f170: 30 20 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 0 on success */.
f180: 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 static int cacke
f190: 79 5f 6d 75 74 65 78 5f 63 72 65 61 74 65 28 76 y_mutex_create(v
f1a0: 6f 69 64 20 2a 2a 6d 75 74 65 78 29 20 7b 0a 09 oid **mutex) {..
f1b0: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 pthread_mutex_t
f1c0: 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a *pthread_mutex;.
f1d0: 09 69 6e 74 20 70 74 68 72 65 61 64 5f 72 65 74 .int pthread_ret
f1e0: 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74 val;..CK_RV cust
f1f0: 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 om_retval;...CAC
f200: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
f210: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 ("Called.");...i
f220: 66 20 28 28 63 61 63 6b 65 79 5f 61 72 67 73 2e f ((cackey_args.
f230: 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c flags & CKF_OS_L
f240: 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b OCKING_OK) == CK
f250: 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 F_OS_LOCKING_OK)
f260: 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74 {...pthread_mut
f270: 65 78 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 ex = malloc(size
f280: 6f 66 28 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 of(*pthread_mute
f290: 78 29 29 3b 0a 09 09 69 66 20 28 21 70 74 68 72 x));...if (!pthr
f2a0: 65 61 64 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09 ead_mutex) {....
f2b0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
f2c0: 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 61 NTF("Failed to a
f2d0: 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 2e 22 llocate memory."
f2e0: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 );.....return(-1
f2f0: 29 3b 0a 09 09 7d 0a 0a 09 09 70 74 68 72 65 61 );...}....pthrea
f300: 64 5f 72 65 74 76 61 6c 20 3d 20 70 74 68 72 65 d_retval = pthre
f310: 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 70 74 ad_mutex_init(pt
f320: 68 72 65 61 64 5f 6d 75 74 65 78 2c 20 4e 55 4c hread_mutex, NUL
f330: 4c 29 3b 0a 09 09 69 66 20 28 70 74 68 72 65 61 L);...if (pthrea
f340: 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b d_retval != 0) {
f350: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
f360: 5f 50 52 49 4e 54 46 28 22 70 74 68 72 65 61 64 _PRINTF("pthread
f370: 5f 6d 75 74 65 78 5f 69 6e 69 74 28 29 20 72 65 _mutex_init() re
f380: 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 69 turned error (%i
f390: 29 2e 22 2c 20 70 74 68 72 65 61 64 5f 72 65 74 ).", pthread_ret
f3a0: 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e val);.....return
f3b0: 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 2a 6d 75 (-1);...}....*mu
f3c0: 74 65 78 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 tex = pthread_mu
f3d0: 74 65 78 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 tex;..} else {..
f3e0: 09 69 66 20 28 63 61 63 6b 65 79 5f 61 72 67 73 .if (cackey_args
f3f0: 2e 43 72 65 61 74 65 4d 75 74 65 78 29 20 7b 0a .CreateMutex) {.
f400: 09 09 09 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c ...custom_retval
f410: 20 3d 20 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 = cackey_args.C
f420: 72 65 61 74 65 4d 75 74 65 78 28 6d 75 74 65 78 reateMutex(mutex
f430: 29 3b 0a 0a 09 09 09 69 66 20 28 63 75 73 74 6f );.....if (custo
f440: 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f m_retval != CKR_
f450: 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 OK) {.....CACKEY
f460: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 _DEBUG_PRINTF("c
f470: 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74 ackey_args.Creat
f480: 65 4d 75 74 65 78 28 29 20 72 65 74 75 72 6e 65 eMutex() returne
f490: 64 20 65 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c d error (%li).",
f4a0: 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72 (long) custom_r
f4b0: 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74 etval);......ret
f4c0: 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 urn(-1);....}...
f4d0: 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 }..}...CACKEY_DE
f4e0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
f4f0: 72 6e 69 6e 67 20 73 75 63 65 73 73 66 75 6c 6c rning sucessfull
f500: 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 74 75 72 y (0)");...retur
f510: 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 n(0);.}../* Retu
f520: 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 73 73 rns 0 on success
f530: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 */.static int c
f540: 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b ackey_mutex_lock
f550: 28 76 6f 69 64 20 2a 6d 75 74 65 78 29 20 7b 0a (void *mutex) {.
f560: 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 .pthread_mutex_t
f570: 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b *pthread_mutex;
f580: 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f 72 65 ..int pthread_re
f590: 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73 tval;..CK_RV cus
f5a0: 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 tom_retval;...CA
f5b0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
f5c0: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
f5d0: 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72 67 73 if ((cackey_args
f5e0: 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f .flags & CKF_OS_
f5f0: 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 LOCKING_OK) == C
f600: 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b KF_OS_LOCKING_OK
f610: 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 ) {...pthread_mu
f620: 74 65 78 20 3d 20 6d 75 74 65 78 3b 0a 0a 09 09 tex = mutex;....
f630: 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 3d pthread_retval =
f640: 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c pthread_mutex_l
f650: 6f 63 6b 28 70 74 68 72 65 61 64 5f 6d 75 74 65 ock(pthread_mute
f660: 78 29 3b 0a 09 09 69 66 20 28 70 74 68 72 65 61 x);...if (pthrea
f670: 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b d_retval != 0) {
f680: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
f690: 5f 50 52 49 4e 54 46 28 22 70 74 68 72 65 61 64 _PRINTF("pthread
f6a0: 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 29 20 72 65 _mutex_lock() re
f6b0: 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 69 turned error (%i
f6c0: 29 2e 22 2c 20 70 74 68 72 65 61 64 5f 72 65 74 ).", pthread_ret
f6d0: 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e val);.....return
f6e0: 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 (-1);...}..} els
f6f0: 65 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 e {...if (cackey
f700: 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 29 _args.LockMutex)
f710: 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65 74 {....custom_ret
f720: 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72 67 val = cackey_arg
f730: 73 2e 4c 6f 63 6b 4d 75 74 65 78 28 6d 75 74 65 s.LockMutex(mute
f740: 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 75 73 74 x);.....if (cust
f750: 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b 52 om_retval != CKR
f760: 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 _OK) {.....CACKE
f770: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
f780: 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b cackey_args.Lock
f790: 4d 75 74 65 78 28 29 20 72 65 74 75 72 6e 65 64 Mutex() returned
f7a0: 20 65 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20 error (%li).",
f7b0: 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65 (long) custom_re
f7c0: 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75 tval);......retu
f7d0: 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d rn(-1);....}...}
f7e0: 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 ..}...CACKEY_DEB
f7f0: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
f800: 6e 69 6e 67 20 73 75 63 65 73 73 66 75 6c 6c 79 ning sucessfully
f810: 20 28 30 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e (0)");...return
f820: 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 (0);.}../* Retur
f830: 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20 ns 0 on success
f840: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 */.static int ca
f850: 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 ckey_mutex_unloc
f860: 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78 29 20 7b k(void *mutex) {
f870: 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f ..pthread_mutex_
f880: 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78 t *pthread_mutex
f890: 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f 72 ;..int pthread_r
f8a0: 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 etval;..CK_RV cu
f8b0: 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 stom_retval;...C
f8c0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
f8d0: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
f8e0: 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72 67 .if ((cackey_arg
f8f0: 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53 s.flags & CKF_OS
f900: 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 _LOCKING_OK) ==
f910: 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f CKF_OS_LOCKING_O
f920: 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d K) {...pthread_m
f930: 75 74 65 78 20 3d 20 6d 75 74 65 78 3b 0a 0a 09 utex = mutex;...
f940: 09 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 .pthread_retval
f950: 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f = pthread_mutex_
f960: 75 6e 6c 6f 63 6b 28 70 74 68 72 65 61 64 5f 6d unlock(pthread_m
f970: 75 74 65 78 29 3b 0a 09 09 69 66 20 28 70 74 68 utex);...if (pth
f980: 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 read_retval != 0
f990: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 ) {....CACKEY_DE
f9a0: 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72 BUG_PRINTF("pthr
f9b0: 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b ead_mutex_unlock
f9c0: 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f () returned erro
f9d0: 72 20 28 25 69 29 2e 22 2c 20 70 74 68 72 65 61 r (%i).", pthrea
f9e0: 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 d_retval);.....r
f9f0: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 eturn(-1);...}..
fa00: 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 63 } else {...if (c
fa10: 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 ackey_args.Unloc
fa20: 6b 4d 75 74 65 78 29 20 7b 0a 09 09 09 63 75 73 kMutex) {....cus
fa30: 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 tom_retval = cac
fa40: 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d key_args.UnlockM
fa50: 75 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09 utex(mutex);....
fa60: 09 69 66 20 28 63 75 73 74 6f 6d 5f 72 65 74 76 .if (custom_retv
fa70: 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a al != CKR_OK) {.
fa80: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
fa90: 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f _PRINTF("cackey_
faa0: 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 args.UnlockMutex
fab0: 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f () returned erro
fac0: 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 r (%li).", (long
fad0: 29 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29 ) custom_retval)
fae0: 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31 ;......return(-1
faf0: 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a );....}...}..}..
fb00: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
fb10: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
fb20: 73 75 63 65 73 73 66 75 6c 6c 79 20 28 30 29 22 sucessfully (0)"
fb30: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a );...return(0);.
fb40: 7d 0a 0a 73 74 61 74 69 63 20 43 4b 5f 41 54 54 }..static CK_ATT
fb50: 52 49 42 55 54 45 5f 50 54 52 20 63 61 63 6b 65 RIBUTE_PTR cacke
fb60: 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65 73 y_get_attributes
fb70: 28 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53 (CK_OBJECT_CLASS
fb80: 20 6f 62 6a 65 63 74 63 6c 61 73 73 2c 20 73 74 objectclass, st
fb90: 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 ruct cackey_pcsc
fba0: 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 _identity *ident
fbb0: 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f ity, unsigned lo
fbc0: 6e 67 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 2c ng identity_num,
fbd0: 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 CK_ULONG_PTR pu
fbe0: 6c 43 6f 75 6e 74 29 20 7b 0a 09 73 74 61 74 69 lCount) {..stati
fbf0: 63 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 74 72 c CK_BBOOL ck_tr
fc00: 75 65 20 3d 20 31 3b 0a 09 73 74 61 74 69 63 20 ue = 1;..static
fc10: 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 66 61 6c 73 CK_BBOOL ck_fals
fc20: 65 20 3d 20 30 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 e = 0;..CK_ULONG
fc30: 20 6e 75 6d 61 74 74 72 73 20 3d 20 30 2c 20 72 numattrs = 0, r
fc40: 65 74 76 61 6c 5f 63 6f 75 6e 74 3b 0a 09 43 4b etval_count;..CK
fc50: 5f 41 54 54 52 49 42 55 54 45 5f 54 59 50 45 20 _ATTRIBUTE_TYPE
fc60: 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 3b 0a curr_attr_type;.
fc70: 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20 63 75 .CK_ATTRIBUTE cu
fc80: 72 72 5f 61 74 74 72 2c 20 2a 72 65 74 76 61 6c rr_attr, *retval
fc90: 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 ;..CK_VOID_PTR p
fca0: 56 61 6c 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 Value;..CK_ULONG
fcb0: 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 43 4b ulValueLen;..CK
fcc0: 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 63 6b _OBJECT_CLASS ck
fcd0: 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 3b 0a 09 _object_class;..
fce0: 43 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 CK_CERTIFICATE_T
fcf0: 59 50 45 20 63 6b 5f 63 65 72 74 69 66 69 63 61 YPE ck_certifica
fd00: 74 65 5f 74 79 70 65 3b 0a 09 43 4b 5f 4b 45 59 te_type;..CK_KEY
fd10: 5f 54 59 50 45 20 63 6b 5f 6b 65 79 5f 74 79 70 _TYPE ck_key_typ
fd20: 65 3b 0a 09 43 4b 5f 55 54 46 38 43 48 41 52 20 e;..CK_UTF8CHAR
fd30: 75 63 54 6d 70 42 75 66 5b 31 30 32 34 5d 3b 0a ucTmpBuf[1024];.
fd40: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a .unsigned char *
fd50: 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 73 73 certificate;..ss
fd60: 69 7a 65 5f 74 20 63 65 72 74 69 66 69 63 61 74 ize_t certificat
fd70: 65 5f 6c 65 6e 20 3d 20 2d 31 2c 20 78 35 30 39 e_len = -1, x509
fd80: 5f 72 65 61 64 5f 72 65 74 3b 0a 09 69 6e 74 20 _read_ret;..int
fd90: 70 56 61 6c 75 65 5f 66 72 65 65 3b 0a 0a 09 43 pValue_free;...C
fda0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
fdb0: 54 46 28 22 43 61 6c 6c 65 64 20 28 6f 62 6a 65 TF("Called (obje
fdc0: 63 74 43 6c 61 73 73 20 3d 20 25 6c 75 2c 20 69 ctClass = %lu, i
fdd0: 64 65 6e 74 69 74 79 5f 6e 75 6d 20 3d 20 25 6c dentity_num = %l
fde0: 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 u).", (unsigned
fdf0: 6c 6f 6e 67 29 20 6f 62 6a 65 63 74 63 6c 61 73 long) objectclas
fe00: 73 2c 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 29 s, identity_num)
fe10: 3b 0a 0a 09 69 66 20 28 6f 62 6a 65 63 74 63 6c ;...if (objectcl
fe20: 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 ass != CKO_CERTI
fe30: 46 49 43 41 54 45 20 26 26 20 6f 62 6a 65 63 74 FICATE && object
fe40: 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 55 42 class != CKO_PUB
fe50: 4c 49 43 5f 4b 45 59 20 26 26 20 6f 62 6a 65 63 LIC_KEY && objec
fe60: 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 52 tclass != CKO_PR
fe70: 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 43 IVATE_KEY) {...C
fe80: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
fe90: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20 TF("Returning 0
fea0: 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20 objects (NULL),
feb0: 69 6e 76 61 6c 69 64 20 6f 62 6a 65 63 74 20 63 invalid object c
fec0: 6c 61 73 73 22 29 3b 0a 0a 09 09 72 65 74 75 72 lass");....retur
fed0: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a n(NULL);..}.../*
fee0: 20 47 65 74 20 43 65 72 74 20 2a 2f 0a 09 69 66 Get Cert */..if
fef0: 20 28 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55 (identity == NU
ff00: 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 LL) {...CACKEY_D
ff10: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
ff20: 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 urning 0 objects
ff30: 20 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69 64 (NULL), invalid
ff40: 20 69 64 65 6e 74 69 79 20 70 72 6f 76 69 64 65 identiy provide
ff50: 64 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e d");....return(N
ff60: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 63 65 72 74 69 ULL);..}...certi
ff70: 66 69 63 61 74 65 20 3d 20 69 64 65 6e 74 69 74 ficate = identit
ff80: 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 3b 0a y->certificate;.
ff90: 09 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e .certificate_len
ffa0: 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 = identity->cer
ffb0: 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09 tificate_len;...
ffc0: 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f if (certificate_
ffd0: 6c 65 6e 20 3d 3d 20 2d 31 20 7c 7c 20 63 65 72 len == -1 || cer
ffe0: 74 69 66 69 63 61 74 65 20 3d 3d 20 4e 55 4c 4c tificate == NULL
fff0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
10000 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
10010 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28 ning 0 objects (
10020 4e 55 4c 4c 29 2c 20 74 68 69 73 20 69 64 65 6e NULL), this iden
10030 74 69 74 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 tity does not ha
10040 76 65 20 61 6e 20 58 2e 35 30 39 20 63 65 72 74 ve an X.509 cert
10050 69 66 69 63 61 74 65 20 61 73 73 6f 63 69 61 74 ificate associat
10060 65 64 20 77 69 74 68 20 69 74 20 61 6e 64 20 77 ed with it and w
10070 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 22 29 3b 0a ill not work");.
10080 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b ...return(NULL);
10090 0a 09 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 79 20 ..}.../* Verify
100a0 74 68 61 74 20 63 65 72 74 69 66 69 63 61 74 65 that certificate
100b0 20 69 73 20 41 53 4e 2e 31 20 65 6e 63 6f 64 65 is ASN.1 encode
100c0 64 20 58 2e 35 30 39 20 63 65 72 74 69 66 69 63 d X.509 certific
100d0 61 74 65 20 2a 2f 0a 09 69 66 20 28 78 35 30 39 ate */..if (x509
100e0 5f 74 6f 5f 73 65 72 69 61 6c 28 63 65 72 74 69 _to_serial(certi
100f0 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 ficate, certific
10100 61 74 65 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 20 3c ate_len, NULL) <
10110 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 0) {...CACKEY_D
10120 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
10130 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 urning 0 objects
10140 20 28 4e 55 4c 4c 29 2c 20 74 68 65 20 58 2e 35 (NULL), the X.5
10150 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20 61 09 certificate a
10160 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 ssociated with t
10170 68 69 73 20 69 64 65 6e 74 69 74 79 20 69 73 20 his identity is
10180 6e 6f 74 20 76 61 6c 69 64 22 29 3b 0a 0a 09 09 not valid");....
10190 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d return(NULL);..}
101a0 0a 0a 09 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 ...retval_count
101b0 3d 20 31 36 3b 0a 09 72 65 74 76 61 6c 20 3d 20 = 16;..retval =
101c0 6d 61 6c 6c 6f 63 28 72 65 74 76 61 6c 5f 63 6f malloc(retval_co
101d0 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 unt * sizeof(*re
101e0 74 76 61 6c 29 29 3b 0a 0a 09 66 6f 72 20 28 63 tval));...for (c
101f0 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3d 20 urr_attr_type =
10200 30 3b 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 0; curr_attr_typ
10210 65 20 3c 20 30 78 63 65 35 33 36 33 35 66 3b 20 e < 0xce53635f;
10220 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 2b 2b curr_attr_type++
10230 29 20 7b 0a 09 09 69 66 20 28 63 75 72 72 5f 61 ) {...if (curr_a
10240 74 74 72 5f 74 79 70 65 20 3d 3d 20 30 78 38 30 ttr_type == 0x80
10250 30 29 20 7b 0a 09 09 09 63 75 72 72 5f 61 74 74 0) {....curr_att
10260 72 5f 74 79 70 65 20 3d 20 30 78 63 65 35 33 36 r_type = 0xce536
10270 33 30 30 3b 0a 09 09 7d 0a 0a 09 09 70 56 61 6c 300;...}....pVal
10280 75 65 5f 66 72 65 65 20 3d 20 30 3b 0a 09 09 70 ue_free = 0;...p
10290 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 Value = NULL;...
102a0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b ulValueLen = (CK
102b0 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 73 77 _LONG) -1;....sw
102c0 69 74 63 68 20 28 63 75 72 72 5f 61 74 74 72 5f itch (curr_attr_
102d0 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20 type) {....case
102e0 43 4b 41 5f 43 4c 41 53 53 3a 0a 09 09 09 09 43 CKA_CLASS:.....C
102f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
10300 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 TF("Requesting a
10310 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43 4c 41 ttribute CKA_CLA
10320 53 53 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e SS (0x%08lx) ...
10330 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e ", (unsigned lon
10340 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 g) curr_attr_typ
10350 65 29 3b 0a 0a 09 09 09 09 63 6b 5f 6f 62 6a 65 e);......ck_obje
10360 63 74 5f 63 6c 61 73 73 20 3d 20 6f 62 6a 65 63 ct_class = objec
10370 74 63 6c 61 73 73 3b 0a 0a 09 09 09 09 70 56 61 tclass;......pVa
10380 6c 75 65 20 3d 20 26 63 6b 5f 6f 62 6a 65 63 74 lue = &ck_object
10390 5f 63 6c 61 73 73 3b 0a 09 09 09 09 75 6c 56 61 _class;.....ulVa
103a0 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 lueLen = sizeof(
103b0 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 29 ck_object_class)
103c0 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 ;......CACKEY_DE
103d0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e BUG_PRINTF(" ...
103e0 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 returning %lu (
103f0 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 %p/%lu)", (unsig
10400 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f ned long) *((CK_
10410 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 2a 29 20 OBJECT_CLASS *)
10420 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c pValue), pValue,
10430 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
10440 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 ulValueLen);...
10450 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 ...break;....cas
10460 65 20 43 4b 41 5f 54 4f 4b 45 4e 3a 0a 09 09 09 e CKA_TOKEN:....
10470 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
10480 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 INTF("Requesting
10490 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 attribute CKA_T
104a0 4f 4b 45 4e 20 28 30 78 25 30 38 6c 78 29 20 2e OKEN (0x%08lx) .
104b0 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c ..", (unsigned l
104c0 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 ong) curr_attr_t
104d0 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 ype);......pValu
104e0 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 e = &ck_true;...
104f0 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 ..ulValueLen = s
10500 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a izeof(ck_true);.
10510 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
10520 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 G_PRINTF(" ... r
10530 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 eturning %lu (%p
10540 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 /%lu)", (unsigne
10550 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 d long) *((CK_BB
10560 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 OOL *) pValue),
10570 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 pValue, (unsigne
10580 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c d long) ulValueL
10590 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b en);......break;
105a0 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 ....case CKA_MOD
105b0 49 46 49 41 42 4c 45 3a 0a 09 09 09 09 43 41 43 IFIABLE:.....CAC
105c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
105d0 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 ("Requesting att
105e0 72 69 62 75 74 65 20 43 4b 41 5f 4d 4f 44 49 46 ribute CKA_MODIF
105f0 49 41 42 4c 45 20 28 30 78 25 30 38 6c 78 29 20 IABLE (0x%08lx)
10600 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 ...", (unsigned
10610 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f long) curr_attr_
10620 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c type);......pVal
10630 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a ue = &ck_false;.
10640 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d ....ulValueLen =
10650 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 sizeof(ck_false
10660 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 );......CACKEY_D
10670 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e EBUG_PRINTF(" ..
10680 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 . returning %lu
10690 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 (%p/%lu)", (unsi
106a0 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b gned long) *((CK
106b0 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 _BBOOL *) pValue
106c0 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 ), pValue, (unsi
106d0 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c gned long) ulVal
106e0 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 ueLen);......bre
106f0 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f ak;....case CKA_
10700 4c 41 42 45 4c 3a 0a 09 09 09 09 43 41 43 4b 45 LABEL:.....CACKE
10710 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
10720 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 Requesting attri
10730 62 75 74 65 20 43 4b 41 5f 4c 41 42 45 4c 20 28 bute CKA_LABEL (
10740 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 0x%08lx) ...", (
10750 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 unsigned long) c
10760 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a urr_attr_type);.
10770 0a 09 09 09 09 2f 2a 20 58 58 58 3a 20 44 65 74 ...../* XXX: Det
10780 65 72 6d 69 6e 65 20 6e 61 6d 65 20 2a 2f 0a 09 ermine name */..
10790 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 ...ulValueLen =
107a0 73 6e 70 72 69 6e 74 66 28 75 63 54 6d 70 42 75 snprintf(ucTmpBu
107b0 66 2c 20 73 69 7a 65 6f 66 28 75 63 54 6d 70 42 f, sizeof(ucTmpB
107c0 75 66 29 2c 20 22 49 64 65 6e 74 69 74 79 20 23 uf), "Identity #
107d0 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 %lu", (unsigned
107e0 6c 6f 6e 67 29 20 69 64 65 6e 74 69 74 79 5f 6e long) identity_n
107f0 75 6d 29 3b 0a 09 09 09 09 70 56 61 6c 75 65 20 um);.....pValue
10800 3d 20 75 63 54 6d 70 42 75 66 3b 0a 0a 09 09 09 = ucTmpBuf;.....
10810 09 69 66 20 28 75 6c 56 61 6c 75 65 4c 65 6e 20 .if (ulValueLen
10820 3e 3d 20 73 69 7a 65 6f 66 28 75 63 54 6d 70 42 >= sizeof(ucTmpB
10830 75 66 29 29 20 7b 0a 09 09 09 09 09 75 6c 56 61 uf)) {......ulVa
10840 6c 75 65 4c 65 6e 20 3d 20 30 3b 0a 09 09 09 09 lueLen = 0;.....
10850 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a .pValue = NULL;.
10860 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 ....}......CACKE
10870 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
10880 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 ... returning (
10890 25 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 %p/%lu)", pValue
108a0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
108b0 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a ) ulValueLen);..
108c0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 ....break;....ca
108d0 73 65 20 43 4b 41 5f 56 41 4c 55 45 3a 0a 09 09 se CKA_VALUE:...
108e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
108f0 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e RINTF("Requestin
10900 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f g attribute CKA_
10910 56 41 4c 55 45 20 28 30 78 25 30 38 6c 78 29 20 VALUE (0x%08lx)
10920 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 ...", (unsigned
10930 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f long) curr_attr_
10940 74 79 70 65 29 3b 0a 0a 09 09 09 09 73 77 69 74 type);......swit
10950 63 68 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 29 ch (objectclass)
10960 20 7b 0a 09 09 09 09 09 63 61 73 65 20 43 4b 4f {......case CKO
10970 5f 50 52 49 56 41 54 45 5f 4b 45 59 3a 0a 09 09 _PRIVATE_KEY:...
10980 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
10990 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 _PRINTF(" ... bu
109a0 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 t not getting it
109b0 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 because we are
109c0 61 20 70 72 69 76 61 74 65 20 6b 65 79 2e 22 29 a private key.")
109d0 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a ;........break;.
109e0 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 50 55 .....case CKO_PU
109f0 42 4c 49 43 5f 4b 45 59 3a 0a 09 09 09 09 09 09 BLIC_KEY:.......
10a00 2f 2a 20 58 58 58 3a 20 54 4f 44 4f 20 2a 2f 0a /* XXX: TODO */.
10a10 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 .......break;...
10a20 09 09 09 63 61 73 65 20 43 4b 4f 5f 43 45 52 54 ...case CKO_CERT
10a30 49 46 49 43 41 54 45 3a 0a 09 09 09 09 09 09 70 IFICATE:.......p
10a40 56 61 6c 75 65 20 3d 20 63 65 72 74 69 66 69 63 Value = certific
10a50 61 74 65 3b 0a 09 09 09 09 09 09 75 6c 56 61 6c ate;.......ulVal
10a60 75 65 4c 65 6e 20 3d 20 63 65 72 74 69 66 69 63 ueLen = certific
10a70 61 74 65 5f 6c 65 6e 3b 0a 0a 09 09 09 09 09 09 ate_len;........
10a80 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 break;.....}....
10a90 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
10aa0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 RINTF(" ... retu
10ab0 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 rning %p/%lu", p
10ac0 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 Value, (unsigned
10ad0 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 long) ulValueLe
10ae0 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a n);......break;.
10af0 09 09 09 63 61 73 65 20 43 4b 41 5f 49 53 53 55 ...case CKA_ISSU
10b00 45 52 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 ER:.....CACKEY_D
10b10 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 EBUG_PRINTF("Req
10b20 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 uesting attribut
10b30 65 20 43 4b 41 5f 49 53 53 55 45 52 20 28 30 78 e CKA_ISSUER (0x
10b40 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e %08lx) ...", (un
10b50 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 signed long) cur
10b60 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 r_attr_type);...
10b70 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 ...if (objectcla
10b80 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 ss != CKO_CERTIF
10b90 49 43 41 54 45 29 20 7b 0a 09 09 09 09 09 43 41 ICATE) {......CA
10ba0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
10bb0 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 F(" ... but not
10bc0 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 getting it becau
10bd0 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 se we are not a
10be0 63 65 72 74 69 66 69 63 61 74 65 2e 22 29 3b 0a certificate.");.
10bf0 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 ......break;....
10c00 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74 .}......if (cert
10c10 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 ificate_len >= 0
10c20 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65 ) {......x509_re
10c30 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f ad_ret = x509_to
10c40 5f 69 73 73 75 65 72 28 63 65 72 74 69 66 69 63 _issuer(certific
10c50 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 ate, certificate
10c60 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a _len, &pValue);.
10c70 09 09 09 09 09 69 66 20 28 78 35 30 39 5f 72 65 .....if (x509_re
10c80 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 ad_ret < 0) {...
10c90 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c ....pValue = NUL
10ca0 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b L;......} else {
10cb0 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 .......ulValueLe
10cc0 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65 n = x509_read_re
10cd0 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a t;......}.....}.
10ce0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
10cf0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 G_PRINTF(" ... r
10d00 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 eturning %p/%lu"
10d10 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 , pValue, (unsig
10d20 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 ned long) ulValu
10d30 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 eLen);......brea
10d40 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53 k;....case CKA_S
10d50 45 52 49 41 4c 5f 4e 55 4d 42 45 52 3a 0a 09 09 ERIAL_NUMBER:...
10d60 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
10d70 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e RINTF("Requestin
10d80 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f g attribute CKA_
10d90 53 45 52 49 41 4c 5f 4e 55 4d 42 45 52 20 28 30 SERIAL_NUMBER (0
10da0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 x%08lx) ...", (u
10db0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 nsigned long) cu
10dc0 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a rr_attr_type);..
10dd0 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c ....if (objectcl
10de0 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 ass != CKO_CERTI
10df0 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09 09 43 FICATE) {......C
10e00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
10e10 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 TF(" ... but not
10e20 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 getting it beca
10e30 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 use we are not a
10e40 20 63 65 72 74 69 66 69 63 61 74 65 2e 22 29 3b certificate.");
10e50 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 .......break;...
10e60 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72 ..}......if (cer
10e70 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 tificate_len >=
10e80 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 0) {......x509_r
10e90 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 ead_ret = x509_t
10ea0 6f 5f 73 65 72 69 61 6c 28 63 65 72 74 69 66 69 o_serial(certifi
10eb0 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 cate, certificat
10ec0 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b e_len, &pValue);
10ed0 0a 09 09 09 09 09 69 66 20 28 78 35 30 39 5f 72 ......if (x509_r
10ee0 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 ead_ret < 0) {..
10ef0 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 .....pValue = NU
10f00 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 LL;......} else
10f10 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c {.......ulValueL
10f20 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 en = x509_read_r
10f30 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d et;......}.....}
10f40 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 ......CACKEY_DEB
10f50 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 UG_PRINTF(" ...
10f60 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c returning (%p/%l
10f70 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e u)", pValue, (un
10f80 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 signed long) ulV
10f90 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 alueLen);......b
10fa0 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b reak;....case CK
10fb0 41 5f 53 55 42 4a 45 43 54 3a 0a 09 09 09 09 43 A_SUBJECT:.....C
10fc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
10fd0 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 TF("Requesting a
10fe0 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 55 42 ttribute CKA_SUB
10ff0 4a 45 43 54 20 28 30 78 25 30 38 6c 78 29 20 2e JECT (0x%08lx) .
11000 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c ..", (unsigned l
11010 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 ong) curr_attr_t
11020 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f ype);......if (o
11030 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b bjectclass != CK
11040 4f 5f 43 45 52 54 49 46 49 43 41 54 45 29 20 7b O_CERTIFICATE) {
11050 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 ......CACKEY_DEB
11060 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 UG_PRINTF(" ...
11070 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 but not getting
11080 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 it because we ar
11090 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63 e not a certific
110a0 61 74 65 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72 ate.");.......br
110b0 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 eak;.....}......
110c0 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f if (certificate_
110d0 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 len >= 0) {.....
110e0 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d .x509_read_ret =
110f0 20 78 35 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74 x509_to_subject
11100 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 (certificate, ce
11110 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 rtificate_len, &
11120 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 pValue);......if
11130 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 (x509_read_ret
11140 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61 < 0) {.......pVa
11150 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 lue = NULL;.....
11160 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 .} else {.......
11170 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 ulValueLen = x50
11180 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 9_read_ret;.....
11190 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 .}.....}......CA
111a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
111b0 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e F(" ... returnin
111c0 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 g %p/%lu", pValu
111d0 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e e, (unsigned lon
111e0 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a g) ulValueLen);.
111f0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 .....break;....c
11200 61 73 65 20 43 4b 41 5f 49 44 3a 0a 09 09 09 09 ase CKA_ID:.....
11210 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
11220 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 NTF("Requesting
11230 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 49 44 attribute CKA_ID
11240 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c (0x%08lx) ...",
11250 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
11260 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 curr_attr_type)
11270 3b 0a 0a 09 09 09 09 75 63 54 6d 70 42 75 66 5b ;......ucTmpBuf[
11280 30 5d 20 3d 20 28 28 69 64 65 6e 74 69 74 79 5f 0] = ((identity_
11290 6e 75 6d 20 2b 20 31 29 20 3e 3e 20 38 29 20 26 num + 1) >> 8) &
112a0 20 30 78 66 66 3b 0a 09 09 09 09 75 63 54 6d 70 0xff;.....ucTmp
112b0 42 75 66 5b 31 5d 20 3d 20 20 28 69 64 65 6e 74 Buf[1] = (ident
112c0 69 74 79 5f 6e 75 6d 20 2b 20 31 29 20 26 20 30 ity_num + 1) & 0
112d0 78 66 66 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 xff;......pValue
112e0 20 3d 20 26 75 63 54 6d 70 42 75 66 3b 0a 09 09 = &ucTmpBuf;...
112f0 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 32 ..ulValueLen = 2
11300 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 ;......CACKEY_DE
11310 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e BUG_PRINTF(" ...
11320 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c returning %p/%l
11330 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 u", pValue, (uns
11340 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 igned long) ulVa
11350 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 lueLen);......br
11360 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 eak;....case CKA
11370 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 _CERTIFICATE_TYP
11380 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 E:.....CACKEY_DE
11390 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 BUG_PRINTF("Requ
113a0 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 esting attribute
113b0 20 43 4b 41 5f 43 45 52 54 49 46 49 43 41 54 45 CKA_CERTIFICATE
113c0 5f 54 59 50 45 20 28 30 78 25 30 38 6c 78 29 20 _TYPE (0x%08lx)
113d0 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 ...", (unsigned
113e0 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f long) curr_attr_
113f0 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 type);......if (
11400 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 objectclass != C
11410 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 29 20 KO_CERTIFICATE)
11420 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 {......CACKEY_DE
11430 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e BUG_PRINTF(" ...
11440 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 but not getting
11450 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 it because we a
11460 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69 re not a certifi
11470 63 61 74 65 2e 22 29 3b 0a 0a 09 09 09 09 09 62 cate.");.......b
11480 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 reak;.....}.....
11490 09 2f 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 ./* We only supp
114a0 6f 72 74 20 6f 6e 65 20 63 65 72 74 69 66 69 63 ort one certific
114b0 61 74 65 20 74 79 70 65 20 2a 2f 0a 09 09 09 09 ate type */.....
114c0 63 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74 ck_certificate_t
114d0 79 70 65 20 3d 20 43 4b 43 5f 58 5f 35 30 39 3b ype = CKC_X_509;
114e0 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 ......pValue = &
114f0 63 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74 ck_certificate_t
11500 79 70 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 ype;.....ulValue
11510 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f Len = sizeof(ck_
11520 63 65 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 certificate_type
11530 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 );......CACKEY_D
11540 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e EBUG_PRINTF(" ..
11550 2e 20 72 65 74 75 72 6e 69 6e 67 20 43 4b 43 5f . returning CKC_
11560 58 5f 35 30 39 20 28 25 6c 75 29 20 28 25 70 2f X_509 (%lu) (%p/
11570 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 %lu)", (unsigned
11580 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 43 45 52 long) *((CK_CER
11590 54 49 46 49 43 41 54 45 5f 54 59 50 45 20 2a 29 TIFICATE_TYPE *)
115a0 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 pValue), pValue
115b0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
115c0 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a ) ulValueLen);..
115d0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 ....break;....ca
115e0 73 65 20 43 4b 41 5f 4b 45 59 5f 54 59 50 45 3a se CKA_KEY_TYPE:
115f0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
11600 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 G_PRINTF("Reques
11610 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 ting attribute C
11620 4b 41 5f 4b 45 59 5f 54 59 50 45 20 28 30 78 25 KA_KEY_TYPE (0x%
11630 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 08lx) ...", (uns
11640 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 igned long) curr
11650 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 _attr_type);....
11660 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 ..if (objectclas
11670 73 20 21 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 s != CKO_PRIVATE
11680 5f 4b 45 59 20 26 26 20 6f 62 6a 65 63 74 63 6c _KEY && objectcl
11690 61 73 73 20 21 3d 20 43 4b 4f 5f 50 55 42 4c 49 ass != CKO_PUBLI
116a0 43 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 43 41 C_KEY) {......CA
116b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
116c0 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 F(" ... but not
116d0 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 getting it becau
116e0 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 se we are not a
116f0 6b 65 79 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72 key.");.......br
11700 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 eak;.....}......
11710 2f 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f /* We only suppo
11720 72 74 20 6f 6e 65 20 6b 65 79 20 74 79 70 65 20 rt one key type
11730 2a 2f 0a 09 09 09 09 63 6b 5f 6b 65 79 5f 74 79 */.....ck_key_ty
11740 70 65 20 3d 20 43 4b 4b 5f 52 53 41 3b 0a 0a 09 pe = CKK_RSA;...
11750 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f ...pValue = &ck_
11760 6b 65 79 5f 74 79 70 65 3b 0a 09 09 09 09 75 6c key_type;.....ul
11770 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f ValueLen = sizeo
11780 66 28 63 6b 5f 6b 65 79 5f 74 79 70 65 29 3b 0a f(ck_key_type);.
11790 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
117a0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 G_PRINTF(" ... r
117b0 65 74 75 72 6e 69 6e 67 20 43 4b 4b 5f 52 53 41 eturning CKK_RSA
117c0 20 28 25 6c 75 29 20 28 25 70 2f 25 6c 75 29 22 (%lu) (%p/%lu)"
117d0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
117e0 29 20 2a 28 28 43 4b 5f 43 45 52 54 49 46 49 43 ) *((CK_CERTIFIC
117f0 41 54 45 5f 54 59 50 45 20 2a 29 20 70 56 61 6c ATE_TYPE *) pVal
11800 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e ue), pValue, (un
11810 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 signed long) ulV
11820 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 alueLen);......b
11830 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b reak;....case CK
11840 41 5f 53 49 47 4e 3a 0a 09 09 09 09 43 41 43 4b A_SIGN:.....CACK
11850 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
11860 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 "Requesting attr
11870 69 62 75 74 65 20 43 4b 41 5f 53 49 47 4e 20 28 ibute CKA_SIGN (
11880 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 0x%08lx) ...", (
11890 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 unsigned long) c
118a0 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a urr_attr_type);.
118b0 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 .....if (objectc
118c0 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 lass == CKO_PRIV
118d0 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 ATE_KEY) {......
118e0 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 pValue = &ck_tru
118f0 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c e;......ulValueL
11900 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 en = sizeof(ck_t
11910 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 rue);.....} else
11920 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d {......pValue =
11930 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 &ck_false;.....
11940 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 .ulValueLen = si
11950 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a zeof(ck_false);.
11960 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 ....}......CACKE
11970 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
11980 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 ... returning %
11990 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 lu (%p/%lu)", (u
119a0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 nsigned long) *(
119b0 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 (CK_BBOOL *) pVa
119c0 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 lue), pValue, (u
119d0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c nsigned long) ul
119e0 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 ValueLen);......
119f0 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 break;....case C
11a00 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56 45 52 3a KA_SIGN_RECOVER:
11a10 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
11a20 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 G_PRINTF("Reques
11a30 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 ting attribute C
11a40 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56 45 52 20 KA_SIGN_RECOVER
11a50 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 (0x%08lx) ...",
11a60 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
11a70 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b curr_attr_type);
11a80 0a 0a 09 09 09 09 2f 2a 20 57 65 20 63 75 72 72 ....../* We curr
11a90 65 6e 74 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f ently only suppo
11aa0 72 74 20 22 53 69 67 6e 20 77 69 74 68 20 41 70 rt "Sign with Ap
11ab0 70 65 6e 64 69 78 22 20 2a 2f 0a 09 09 09 09 70 pendix" */.....p
11ac0 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 Value = &ck_fals
11ad0 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 e;.....ulValueLe
11ae0 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 n = sizeof(ck_fa
11af0 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 lse);......CACKE
11b00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
11b10 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 ... returning %
11b20 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 lu (%p/%lu)", (u
11b30 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 nsigned long) *(
11b40 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 (CK_BBOOL *) pVa
11b50 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 lue), pValue, (u
11b60 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c nsigned long) ul
11b70 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 ValueLen);......
11b80 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 break;....case C
11b90 4b 41 5f 44 45 43 52 59 50 54 3a 0a 09 09 09 09 KA_DECRYPT:.....
11ba0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
11bb0 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 NTF("Requesting
11bc0 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 44 45 attribute CKA_DE
11bd0 43 52 59 50 54 20 28 30 78 25 30 38 6c 78 29 20 CRYPT (0x%08lx)
11be0 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 ...", (unsigned
11bf0 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f long) curr_attr_
11c00 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 type);......if (
11c10 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 objectclass == C
11c20 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 7c KO_PRIVATE_KEY |
11c30 7c 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d | objectclass ==
11c40 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 29 CKO_PUBLIC_KEY)
11c50 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d {......pValue =
11c60 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09 &ck_true;......
11c70 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a ulValueLen = siz
11c80 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09 eof(ck_true);...
11c90 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 ..} else {......
11ca0 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c pValue = &ck_fal
11cb0 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 se;......ulValue
11cc0 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f Len = sizeof(ck_
11cd0 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 false);.....}...
11ce0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
11cf0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 PRINTF(" ... ret
11d00 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 urning %lu (%p/%
11d10 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 lu)", (unsigned
11d20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f long) *((CK_BBOO
11d30 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 L *) pValue), pV
11d40 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 alue, (unsigned
11d50 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e long) ulValueLen
11d60 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 );......break;..
11d70 09 09 63 61 73 65 20 43 4b 41 5f 53 45 4e 53 49 ..case CKA_SENSI
11d80 54 49 56 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 TIVE:.....CACKEY
11d90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
11da0 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 equesting attrib
11db0 75 74 65 20 43 4b 41 5f 53 45 4e 53 49 54 49 56 ute CKA_SENSITIV
11dc0 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 E (0x%08lx) ..."
11dd0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
11de0 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 ) curr_attr_type
11df0 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 );......if (obje
11e00 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 ctclass == CKO_P
11e10 52 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 RIVATE_KEY) {...
11e20 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f ...pValue = &ck_
11e30 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c true;......ulVal
11e40 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 ueLen = sizeof(c
11e50 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 k_true);.....} e
11e60 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 lse {......pValu
11e70 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 e = &ck_false;..
11e80 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d ....ulValueLen =
11e90 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 sizeof(ck_false
11ea0 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 );.....}......CA
11eb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
11ec0 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e F(" ... returnin
11ed0 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c g %lu (%p/%lu)",
11ee0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
11ef0 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 *((CK_BBOOL *)
11f00 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c pValue), pValue,
11f10 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
11f20 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 ulValueLen);...
11f30 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 ...break;....cas
11f40 65 20 43 4b 41 5f 45 58 54 52 41 43 54 41 42 4c e CKA_EXTRACTABL
11f50 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 E:.....CACKEY_DE
11f60 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 BUG_PRINTF("Requ
11f70 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 esting attribute
11f80 20 43 4b 41 5f 45 58 54 52 41 43 54 41 42 4c 45 CKA_EXTRACTABLE
11f90 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c (0x%08lx) ...",
11fa0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
11fb0 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 curr_attr_type)
11fc0 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 ;......if (objec
11fd0 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 tclass == CKO_PR
11fe0 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09 IVATE_KEY) {....
11ff0 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 ..pValue = &ck_f
12000 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c alse;......ulVal
12010 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 ueLen = sizeof(c
12020 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 k_true);.....} e
12030 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 lse {......pValu
12040 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 e = &ck_true;...
12050 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 ...ulValueLen =
12060 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 sizeof(ck_false)
12070 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 ;.....}......CAC
12080 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
12090 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 (" ... returning
120a0 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 %lu (%p/%lu)",
120b0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
120c0 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 *((CK_BBOOL *) p
120d0 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 Value), pValue,
120e0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
120f0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 ulValueLen);....
12100 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 ..break;....case
12110 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09 09 CKA_MODULUS:...
12120 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
12130 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e RINTF("Requestin
12140 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f g attribute CKA_
12150 4d 4f 44 55 4c 55 53 20 28 30 78 25 30 38 6c 78 MODULUS (0x%08lx
12160 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 ) ...", (unsigne
12170 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 d long) curr_att
12180 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 r_type);......if
12190 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 (certificate_le
121a0 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 n >= 0) {......x
121b0 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 509_read_ret = x
121c0 35 30 39 5f 74 6f 5f 6d 6f 64 75 6c 75 73 28 63 509_to_modulus(c
121d0 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 ertificate, cert
121e0 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 ificate_len, &pV
121f0 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28 alue);......if (
12200 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 x509_read_ret <
12210 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 0) {.......pValu
12220 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d e = NULL;......}
12230 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c else {.......ul
12240 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f ValueLen = x509_
12250 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d read_ret;......}
12260 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b .....}......CACK
12270 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
12280 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 " ... returning
12290 28 25 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 (%p/%lu)", pValu
122a0 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e e, (unsigned lon
122b0 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a g) ulValueLen);.
122c0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 .....break;....c
122d0 61 73 65 20 43 4b 41 5f 50 55 42 4c 49 43 5f 45 ase CKA_PUBLIC_E
122e0 58 50 4f 4e 45 4e 54 3a 0a 09 09 09 09 43 41 43 XPONENT:.....CAC
122f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
12300 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 ("Requesting att
12310 72 69 62 75 74 65 20 43 4b 41 5f 50 55 42 4c 49 ribute CKA_PUBLI
12320 43 5f 45 58 50 4f 4e 45 4e 54 20 28 30 78 25 30 C_EXPONENT (0x%0
12330 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 8lx) ...", (unsi
12340 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f gned long) curr_
12350 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 attr_type);.....
12360 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65 .if (certificate
12370 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 _len >= 0) {....
12380 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 ..x509_read_ret
12390 3d 20 78 35 30 39 5f 74 6f 5f 65 78 70 6f 6e 65 = x509_to_expone
123a0 6e 74 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 nt(certificate,
123b0 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c certificate_len,
123c0 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 &pValue);......
123d0 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 if (x509_read_re
123e0 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 t < 0) {.......p
123f0 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 Value = NULL;...
12400 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 ...} else {.....
12410 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 ..ulValueLen = x
12420 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 509_read_ret;...
12430 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 ...}.....}......
12440 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
12450 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e NTF(" ... return
12460 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 ing (%p/%lu)", p
12470 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 Value, (unsigned
12480 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 long) ulValueLe
12490 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a n);......break;.
124a0 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 ...case CKA_TRUS
124b0 54 5f 53 45 52 56 45 52 5f 41 55 54 48 3a 0a 09 T_SERVER_AUTH:..
124c0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
124d0 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 PRINTF("Requesti
124e0 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 ng attribute CKA
124f0 5f 54 52 55 53 54 5f 53 45 52 56 45 52 5f 41 55 _TRUST_SERVER_AU
12500 54 48 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e TH (0x%08lx) ...
12510 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e ", (unsigned lon
12520 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 g) curr_attr_typ
12530 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 e);......pValue
12540 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 = &ck_true;.....
12550 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a ulValueLen = siz
12560 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 eof(ck_true);...
12570 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
12580 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 PRINTF(" ... ret
12590 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 urning %lu (%p/%
125a0 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 lu)", (unsigned
125b0 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f long) *((CK_BBOO
125c0 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 L *) pValue), pV
125d0 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 alue, (unsigned
125e0 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e long) ulValueLen
125f0 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 );......break;..
12600 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 ..case CKA_TRUST
12610 5f 43 4c 49 45 4e 54 5f 41 55 54 48 3a 0a 09 09 _CLIENT_AUTH:...
12620 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
12630 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e RINTF("Requestin
12640 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f g attribute CKA_
12650 54 52 55 53 54 5f 43 4c 49 45 4e 54 5f 41 55 54 TRUST_CLIENT_AUT
12660 48 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 H (0x%08lx) ..."
12670 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
12680 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 ) curr_attr_type
12690 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d );......pValue =
126a0 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75 &ck_true;.....u
126b0 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 lValueLen = size
126c0 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 of(ck_true);....
126d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
126e0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 RINTF(" ... retu
126f0 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c rning %lu (%p/%l
12700 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c u)", (unsigned l
12710 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c ong) *((CK_BBOOL
12720 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 *) pValue), pVa
12730 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c lue, (unsigned l
12740 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 ong) ulValueLen)
12750 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 ;......break;...
12760 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f .case CKA_TRUST_
12770 43 4f 44 45 5f 53 49 47 4e 49 4e 47 3a 0a 09 09 CODE_SIGNING:...
12780 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
12790 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e RINTF("Requestin
127a0 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f g attribute CKA_
127b0 54 52 55 53 54 5f 43 4f 44 45 5f 53 49 47 4e 49 TRUST_CODE_SIGNI
127c0 4e 47 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e NG (0x%08lx) ...
127d0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e ", (unsigned lon
127e0 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 g) curr_attr_typ
127f0 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 e);......pValue
12800 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 = &ck_true;.....
12810 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a ulValueLen = siz
12820 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 eof(ck_true);...
12830 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
12840 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 PRINTF(" ... ret
12850 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 urning %lu (%p/%
12860 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 lu)", (unsigned
12870 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f long) *((CK_BBOO
12880 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 L *) pValue), pV
12890 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 alue, (unsigned
128a0 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e long) ulValueLen
128b0 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 );......break;..
128c0 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 ..case CKA_TRUST
128d0 5f 45 4d 41 49 4c 5f 50 52 4f 54 45 43 54 49 4f _EMAIL_PROTECTIO
128e0 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 N:.....CACKEY_DE
128f0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 BUG_PRINTF("Requ
12900 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 esting attribute
12910 20 43 4b 41 5f 54 52 55 53 54 5f 45 4d 41 49 4c CKA_TRUST_EMAIL
12920 5f 50 52 4f 54 45 43 54 49 4f 4e 20 28 30 78 25 _PROTECTION (0x%
12930 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 08lx) ...", (uns
12940 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 igned long) curr
12950 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 _attr_type);....
12960 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 ..pValue = &ck_t
12970 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 rue;.....ulValue
12980 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f Len = sizeof(ck_
12990 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b true);......CACK
129a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
129b0 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 " ... returning
129c0 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 %lu (%p/%lu)", (
129d0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a unsigned long) *
129e0 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 ((CK_BBOOL *) pV
129f0 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 alue), pValue, (
12a00 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 unsigned long) u
12a10 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 lValueLen);.....
12a20 09 62 72 65 61 6b 3b 0a 09 09 09 64 65 66 61 75 .break;....defau
12a30 6c 74 3a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d lt:.....pValue =
12a40 20 4e 55 4c 4c 3b 0a 09 09 09 09 75 6c 56 61 6c NULL;.....ulVal
12a50 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 ueLen = (CK_LONG
12a60 29 20 2d 31 3b 0a 09 09 09 09 62 72 65 61 6b 3b ) -1;.....break;
12a70 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 28 43 4b ...}....if (((CK
12a80 5f 4c 4f 4e 47 29 20 75 6c 56 61 6c 75 65 4c 65 _LONG) ulValueLe
12a90 6e 29 20 21 3d 20 28 28 43 4b 5f 4c 4f 4e 47 29 n) != ((CK_LONG)
12aa0 20 2d 31 29 29 20 7b 0a 09 09 09 2f 2a 20 50 75 -1)) {..../* Pu
12ab0 73 68 20 63 75 72 72 5f 61 74 74 72 20 6f 6e 74 sh curr_attr ont
12ac0 6f 20 74 68 65 20 73 74 61 63 6b 20 2a 2f 0a 09 o the stack */..
12ad0 09 09 63 75 72 72 5f 61 74 74 72 2e 74 79 70 65 ..curr_attr.type
12ae0 20 3d 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 = curr_attr_typ
12af0 65 3b 0a 09 09 09 63 75 72 72 5f 61 74 74 72 2e e;....curr_attr.
12b00 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 75 6c 56 ulValueLen = ulV
12b10 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09 63 75 72 alueLen;.....cur
12b20 72 5f 61 74 74 72 2e 70 56 61 6c 75 65 20 3d 20 r_attr.pValue =
12b30 6d 61 6c 6c 6f 63 28 63 75 72 72 5f 61 74 74 72 malloc(curr_attr
12b40 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 .ulValueLen);...
12b50 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61 74 74 .memcpy(curr_att
12b60 72 2e 70 56 61 6c 75 65 2c 20 70 56 61 6c 75 65 r.pValue, pValue
12b70 2c 20 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 , curr_attr.ulVa
12b80 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 69 66 20 lueLen);.....if
12b90 28 70 56 61 6c 75 65 5f 66 72 65 65 20 26 26 20 (pValue_free &&
12ba0 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 09 66 72 pValue) {.....fr
12bb0 65 65 28 70 56 61 6c 75 65 29 3b 0a 09 09 09 7d ee(pValue);....}
12bc0 0a 0a 09 09 09 69 66 20 28 6e 75 6d 61 74 74 72 .....if (numattr
12bd0 73 20 3e 3d 20 72 65 74 76 61 6c 5f 63 6f 75 6e s >= retval_coun
12be0 74 29 20 7b 0a 09 09 09 09 72 65 74 76 61 6c 5f t) {.....retval_
12bf0 63 6f 75 6e 74 20 2a 3d 20 32 3b 0a 09 09 09 09 count *= 2;.....
12c00 72 65 74 76 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 retval = realloc
12c10 28 72 65 74 76 61 6c 2c 20 72 65 74 76 61 6c 5f (retval, retval_
12c20 63 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a count * sizeof(*
12c30 72 65 74 76 61 6c 29 29 3b 0a 09 09 09 7d 0a 0a retval));....}..
12c40 09 09 09 6d 65 6d 63 70 79 28 26 72 65 74 76 61 ...memcpy(&retva
12c50 6c 5b 6e 75 6d 61 74 74 72 73 5d 2c 20 26 63 75 l[numattrs], &cu
12c60 72 72 5f 61 74 74 72 2c 20 73 69 7a 65 6f 66 28 rr_attr, sizeof(
12c70 63 75 72 72 5f 61 74 74 72 29 29 3b 0a 09 09 09 curr_attr));....
12c80 6e 75 6d 61 74 74 72 73 2b 2b 3b 0a 09 09 7d 0a numattrs++;...}.
12c90 09 7d 0a 0a 09 69 66 20 28 6e 75 6d 61 74 74 72 .}...if (numattr
12ca0 73 20 21 3d 20 30 29 20 7b 0a 09 09 72 65 74 76 s != 0) {...retv
12cb0 61 6c 5f 63 6f 75 6e 74 20 3d 20 6e 75 6d 61 74 al_count = numat
12cc0 74 72 73 3b 0a 09 09 72 65 74 76 61 6c 20 3d 20 trs;...retval =
12cd0 72 65 61 6c 6c 6f 63 28 72 65 74 76 61 6c 2c 20 realloc(retval,
12ce0 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 retval_count * s
12cf0 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b izeof(*retval));
12d00 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 66 72 65 ..} else {...fre
12d10 65 28 72 65 74 76 61 6c 29 3b 0a 0a 09 09 72 65 e(retval);....re
12d20 74 76 61 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a tval = NULL;..}.
12d30 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 6e 75 ..*pulCount = nu
12d40 6d 61 74 74 72 73 3b 0a 0a 09 43 41 43 4b 45 59 mattrs;...CACKEY
12d50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
12d60 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 6f 62 6a eturning %lu obj
12d70 65 63 74 73 20 28 25 70 29 2e 22 2c 20 6e 75 6d ects (%p).", num
12d80 61 74 74 72 73 2c 20 72 65 74 76 61 6c 29 3b 0a attrs, retval);.
12d90 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 ..return(retval)
12da0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 ;.}..static void
12db0 20 63 61 63 6b 65 79 5f 66 72 65 65 5f 69 64 65 cackey_free_ide
12dc0 6e 74 69 74 69 65 73 28 73 74 72 75 63 74 20 63 ntities(struct c
12dd0 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a ackey_identity *
12de0 69 64 65 6e 74 69 74 69 65 73 2c 20 75 6e 73 69 identities, unsi
12df0 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 gned long identi
12e00 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 43 ties_count) {..C
12e10 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 63 75 72 K_ATTRIBUTE *cur
12e20 72 5f 61 74 74 72 3b 0a 09 75 6e 73 69 67 6e 65 r_attr;..unsigne
12e30 64 20 6c 6f 6e 67 20 69 64 5f 69 64 78 2c 20 61 d long id_idx, a
12e40 74 74 72 5f 69 64 78 3b 0a 0a 09 69 66 20 28 69 ttr_idx;...if (i
12e50 64 65 6e 74 69 74 69 65 73 20 3d 3d 20 4e 55 4c dentities == NUL
12e60 4c 20 7c 7c 20 69 64 65 6e 74 69 74 69 65 73 5f L || identities_
12e70 63 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 count == 0) {...
12e80 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 return;..}...for
12e90 20 28 69 64 5f 69 64 78 20 3d 20 30 3b 20 69 64 (id_idx = 0; id
12ea0 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74 69 65 _idx < identitie
12eb0 73 5f 63 6f 75 6e 74 3b 20 69 64 5f 69 64 78 2b s_count; id_idx+
12ec0 2b 29 20 7b 0a 09 09 69 66 20 28 69 64 65 6e 74 +) {...if (ident
12ed0 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 ities[id_idx].at
12ee0 74 72 69 62 75 74 65 73 29 20 7b 0a 09 09 09 66 tributes) {....f
12ef0 6f 72 20 28 61 74 74 72 5f 69 64 78 20 3d 20 30 or (attr_idx = 0
12f00 3b 20 61 74 74 72 5f 69 64 78 20 3c 20 69 64 65 ; attr_idx < ide
12f10 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e ntities[id_idx].
12f20 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 attributes_count
12f30 3b 20 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a ; attr_idx++) {.
12f40 09 09 09 09 63 75 72 72 5f 61 74 74 72 20 3d 20 ....curr_attr =
12f50 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 &identities[id_i
12f60 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5b 61 dx].attributes[a
12f70 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 09 09 69 ttr_idx];......i
12f80 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 f (curr_attr->pV
12f90 61 6c 75 65 29 20 7b 0a 09 09 09 09 09 66 72 65 alue) {......fre
12fa0 65 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 e(curr_attr->pVa
12fb0 6c 75 65 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d lue);.....}....}
12fc0 0a 0a 09 09 09 69 66 20 28 69 64 65 6e 74 69 74 .....if (identit
12fd0 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 ies[id_idx].attr
12fe0 69 62 75 74 65 73 29 20 7b 0a 09 09 09 09 66 72 ibutes) {.....fr
12ff0 65 65 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 ee(identities[id
13000 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 _idx].attributes
13010 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b );....}.....cack
13020 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 69 64 ey_free_certs(id
13030 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d entities[id_idx]
13040 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2c 20 .pcsc_identity,
13050 31 2c 20 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 1, 1);...}..}...
13060 66 72 65 65 28 69 64 65 6e 74 69 74 69 65 73 29 free(identities)
13070 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73 74 72 75 ;.}..static stru
13080 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 ct cackey_identi
13090 74 79 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f ty *cackey_read_
130a0 69 64 65 6e 74 69 74 69 65 73 28 73 74 72 75 63 identities(struc
130b0 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 t cackey_slot *s
130c0 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f lot, unsigned lo
130d0 6e 67 20 2a 69 64 73 5f 66 6f 75 6e 64 29 20 7b ng *ids_found) {
130e0 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f ..struct cackey_
130f0 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 pcsc_identity *p
13100 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a csc_identities;.
13110 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 .struct cackey_i
13120 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 dentity *identit
13130 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c ies;..unsigned l
13140 6f 6e 67 20 6e 75 6d 5f 69 64 73 2c 20 69 64 5f ong num_ids, id_
13150 69 64 78 2c 20 63 75 72 72 5f 69 64 5f 74 79 70 idx, curr_id_typ
13160 65 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e e;..unsigned lon
13170 67 20 6e 75 6d 5f 63 65 72 74 73 2c 20 63 65 72 g num_certs, cer
13180 74 5f 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f t_idx;...CACKEY_
13190 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
131a0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 69 lled.");...if (i
131b0 64 73 5f 66 6f 75 6e 64 20 3d 3d 20 4e 55 4c 4c ds_found == NULL
131c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
131d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
131e0 2e 20 20 69 64 73 5f 66 6f 75 6e 64 20 69 73 20 . ids_found is
131f0 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 NULL");....retur
13200 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 70 63 n(NULL);..}...pc
13210 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 3d 20 sc_identities =
13220 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 cackey_read_cert
13230 73 28 73 6c 6f 74 2c 20 4e 55 4c 4c 2c 20 26 6e s(slot, NULL, &n
13240 75 6d 5f 63 65 72 74 73 29 3b 0a 09 69 66 20 28 um_certs);..if (
13250 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 pcsc_identities
13260 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2f 2a 20 != NULL) {.../*
13270 43 6f 6e 76 65 72 74 20 6e 75 6d 62 65 72 20 6f Convert number o
13280 66 20 43 65 72 74 73 20 74 6f 20 6e 75 6d 62 65 f Certs to numbe
13290 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 2a 2f 0a r of objects */.
132a0 09 09 6e 75 6d 5f 69 64 73 20 3d 20 28 43 4b 4f ..num_ids = (CKO
132b0 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 2d 20 43 _PRIVATE_KEY - C
132c0 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 20 2b KO_CERTIFICATE +
132d0 20 31 29 20 2a 20 6e 75 6d 5f 63 65 72 74 73 3b 1) * num_certs;
132e0 0a 0a 09 09 69 64 65 6e 74 69 74 69 65 73 20 3d ....identities =
132f0 20 6d 61 6c 6c 6f 63 28 6e 75 6d 5f 69 64 73 20 malloc(num_ids
13300 2a 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 * sizeof(*identi
13310 74 69 65 73 29 29 3b 0a 0a 09 09 69 64 5f 69 64 ties));....id_id
13320 78 20 3d 20 30 3b 0a 09 09 66 6f 72 20 28 63 65 x = 0;...for (ce
13330 72 74 5f 69 64 78 20 3d 20 30 3b 20 63 65 72 74 rt_idx = 0; cert
13340 5f 69 64 78 20 3c 20 6e 75 6d 5f 63 65 72 74 73 _idx < num_certs
13350 3b 20 63 65 72 74 5f 69 64 78 2b 2b 29 20 7b 0a ; cert_idx++) {.
13360 09 09 09 66 6f 72 20 28 63 75 72 72 5f 69 64 5f ...for (curr_id_
13370 74 79 70 65 20 3d 20 43 4b 4f 5f 43 45 52 54 49 type = CKO_CERTI
13380 46 49 43 41 54 45 3b 20 63 75 72 72 5f 69 64 5f FICATE; curr_id_
13390 74 79 70 65 20 3c 3d 20 43 4b 4f 5f 50 52 49 56 type <= CKO_PRIV
133a0 41 54 45 5f 4b 45 59 3b 20 63 75 72 72 5f 69 64 ATE_KEY; curr_id
133b0 5f 74 79 70 65 2b 2b 29 20 7b 0a 09 09 09 09 69 _type++) {.....i
133c0 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 dentities[id_idx
133d0 5d 2e 61 74 74 72 69 62 75 74 65 73 20 3d 20 63 ].attributes = c
133e0 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62 ackey_get_attrib
133f0 75 74 65 73 28 63 75 72 72 5f 69 64 5f 74 79 70 utes(curr_id_typ
13400 65 2c 20 26 70 63 73 63 5f 69 64 65 6e 74 69 74 e, &pcsc_identit
13410 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 63 ies[cert_idx], c
13420 65 72 74 5f 69 64 78 2c 20 26 69 64 65 6e 74 69 ert_idx, &identi
13430 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 ties[id_idx].att
13440 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b 0a ributes_count);.
13450 0a 09 09 09 09 69 66 20 28 69 64 65 6e 74 69 74 .....if (identit
13460 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 ies[id_idx].attr
13470 69 62 75 74 65 73 20 3d 3d 20 4e 55 4c 4c 29 20 ibutes == NULL)
13480 7b 0a 09 09 09 09 09 69 64 65 6e 74 69 74 69 65 {......identitie
13490 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 s[id_idx].attrib
134a0 75 74 65 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a utes_count = 0;.
134b0 09 09 09 09 7d 0a 0a 09 09 09 09 69 64 65 6e 74 ....}......ident
134c0 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 ities[id_idx].pc
134d0 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 20 6d 61 sc_identity = ma
134e0 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 69 64 65 lloc(sizeof(*ide
134f0 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e ntities[id_idx].
13500 70 63 73 63 5f 69 64 65 6e 74 69 74 79 29 29 3b pcsc_identity));
13510 0a 09 09 09 09 6d 65 6d 63 70 79 28 69 64 65 6e .....memcpy(iden
13520 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 tities[id_idx].p
13530 63 73 63 5f 69 64 65 6e 74 69 74 79 2c 20 26 70 csc_identity, &p
13540 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 csc_identities[c
13550 65 72 74 5f 69 64 78 5d 2c 20 73 69 7a 65 6f 66 ert_idx], sizeof
13560 28 2a 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f (*identities[id_
13570 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 idx].pcsc_identi
13580 74 79 29 29 3b 0a 0a 09 09 09 09 69 64 65 6e 74 ty));......ident
13590 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 ities[id_idx].pc
135a0 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 sc_identity->cer
135b0 74 69 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f tificate = mallo
135c0 63 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 c(pcsc_identitie
135d0 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65 72 74 s[cert_idx].cert
135e0 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 ificate_len);...
135f0 09 09 6d 65 6d 63 70 79 28 69 64 65 6e 74 69 74 ..memcpy(identit
13600 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 ies[id_idx].pcsc
13610 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 _identity->certi
13620 66 69 63 61 74 65 2c 20 70 63 73 63 5f 69 64 65 ficate, pcsc_ide
13630 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78 ntities[cert_idx
13640 5d 2e 63 65 72 74 69 66 69 63 61 74 65 2c 20 70 ].certificate, p
13650 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 csc_identities[c
13660 65 72 74 5f 69 64 78 5d 2e 63 65 72 74 69 66 69 ert_idx].certifi
13670 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 cate_len);......
13680 69 64 5f 69 64 78 2b 2b 3b 0a 09 09 09 7d 0a 09 id_idx++;....}..
13690 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 .}....cackey_fre
136a0 65 5f 63 65 72 74 73 28 70 63 73 63 5f 69 64 65 e_certs(pcsc_ide
136b0 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63 65 72 ntities, num_cer
136c0 74 73 2c 20 31 29 3b 0a 0a 09 09 2a 69 64 73 5f ts, 1);....*ids_
136d0 66 6f 75 6e 64 20 3d 20 6e 75 6d 5f 69 64 73 3b found = num_ids;
136e0 0a 09 09 72 65 74 75 72 6e 28 69 64 65 6e 74 69 ...return(identi
136f0 74 69 65 73 29 3b 0a 09 7d 0a 0a 09 2a 69 64 73 ties);..}...*ids
13700 5f 66 6f 75 6e 64 20 3d 20 30 3b 0a 09 72 65 74 _found = 0;..ret
13710 75 72 6e 28 4e 55 4c 4c 29 3b 0a 7d 0a 0a 43 4b urn(NULL);.}..CK
13720 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e _DEFINE_FUNCTION
13730 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 69 61 (CK_RV, C_Initia
13740 6c 69 7a 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54 lize)(CK_VOID_PT
13750 52 20 70 49 6e 69 74 41 72 67 73 29 20 7b 0a 09 R pInitArgs) {..
13760 43 4b 5f 43 5f 49 4e 49 54 49 41 4c 49 5a 45 5f CK_C_INITIALIZE_
13770 41 52 47 53 20 43 4b 5f 50 54 52 20 61 72 67 73 ARGS CK_PTR args
13780 3b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78 3b ;..uint32_t idx;
13790 0a 09 69 6e 74 20 6d 75 74 65 78 5f 69 6e 69 74 ..int mutex_init
137a0 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 _ret;...CACKEY_D
137b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
137c0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 led.");...if (pI
137d0 6e 69 74 41 72 67 73 20 21 3d 20 4e 55 4c 4c 29 nitArgs != NULL)
137e0 20 7b 0a 09 09 61 72 67 73 20 3d 20 70 49 6e 69 {...args = pIni
137f0 74 41 72 67 73 3b 0a 09 09 6d 65 6d 63 70 79 28 tArgs;...memcpy(
13800 26 63 61 63 6b 65 79 5f 61 72 67 73 2c 20 61 72 &cackey_args, ar
13810 67 73 2c 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 gs, sizeof(cacke
13820 79 5f 61 72 67 73 29 29 3b 0a 0a 09 09 69 66 20 y_args));....if
13830 28 61 72 67 73 2d 3e 43 72 65 61 74 65 4d 75 74 (args->CreateMut
13840 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 ex == NULL || ar
13850 67 73 2d 3e 44 65 73 74 72 6f 79 4d 75 74 65 78 gs->DestroyMutex
13860 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 == NULL || args
13870 2d 3e 4c 6f 63 6b 4d 75 74 65 78 20 3d 3d 20 4e ->LockMutex == N
13880 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 55 6e 6c ULL || args->Unl
13890 6f 63 6b 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c ockMutex == NULL
138a0 29 20 7b 0a 09 09 09 69 66 20 28 61 72 67 73 2d ) {....if (args-
138b0 3e 43 72 65 61 74 65 4d 75 74 65 78 20 21 3d 20 >CreateMutex !=
138c0 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 44 65 NULL || args->De
138d0 73 74 72 6f 79 4d 75 74 65 78 20 21 3d 20 4e 55 stroyMutex != NU
138e0 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 4c 6f 63 6b LL || args->Lock
138f0 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c Mutex != NULL ||
13900 20 61 72 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 74 args->UnlockMut
13910 65 78 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 ex != NULL) {...
13920 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
13930 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 53 6f RINTF("Error. So
13940 6d 65 2c 20 62 75 74 20 6e 6f 74 20 41 6c 6c 20 me, but not All
13950 74 68 72 65 61 64 69 6e 67 20 70 72 69 6d 69 74 threading primit
13960 69 76 65 73 20 70 72 6f 76 69 64 65 64 2e 22 29 ives provided.")
13970 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b ;......return(CK
13980 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 R_ARGUMENTS_BAD)
13990 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 ;....}...}....if
139a0 20 28 61 72 67 73 2d 3e 70 52 65 73 65 72 76 65 (args->pReserve
139b0 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 d != NULL) {....
139c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
139d0 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 52 65 73 NTF("Error. pRes
139e0 65 72 76 65 64 20 69 73 20 6e 6f 74 20 4e 55 4c erved is not NUL
139f0 4c 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e L.");.....return
13a00 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 (CKR_ARGUMENTS_B
13a10 41 44 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 AD);...}..} else
13a20 20 7b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 {...cackey_args
13a30 2e 43 72 65 61 74 65 4d 75 74 65 78 20 3d 20 4e .CreateMutex = N
13a40 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 ULL;...cackey_ar
13a50 67 73 2e 44 65 73 74 72 6f 79 4d 75 74 65 78 20 gs.DestroyMutex
13a60 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 = NULL;...cackey
13a70 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 20 _args.LockMutex
13a80 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 = NULL;...cackey
13a90 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 _args.UnlockMute
13aa0 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b x = NULL;...cack
13ab0 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 3d 20 ey_args.flags =
13ac0 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 0;..}...if (cack
13ad0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 ey_initialized)
13ae0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
13af0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
13b00 20 41 6c 72 65 61 64 79 20 69 6e 69 74 69 61 6c Already initial
13b10 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 ized.");....retu
13b20 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f rn(CKR_CRYPTOKI_
13b30 41 4c 52 45 41 44 59 5f 49 4e 49 54 49 41 4c 49 ALREADY_INITIALI
13b40 5a 45 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 ZED);..}...for (
13b50 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 idx = 0; idx < (
13b60 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 sizeof(cackey_se
13b70 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 ssions) / sizeof
13b80 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 (cackey_sessions
13b90 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a [0])); idx++) {.
13ba0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e ..cackey_session
13bb0 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 20 3d 20 s[idx].active =
13bc0 30 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 0;..}...for (idx
13bd0 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a = 0; idx < (siz
13be0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 eof(cackey_slots
13bf0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 ) / sizeof(cacke
13c00 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69 64 y_slots[0])); id
13c10 78 2b 2b 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f x++) {...cackey_
13c20 73 6c 6f 74 73 5b 69 64 78 5d 2e 61 63 74 69 76 slots[idx].activ
13c30 65 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f e = 0;...cackey_
13c40 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f slots[idx].pcsc_
13c50 72 65 61 64 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 reader = NULL;..
13c60 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 .cackey_slots[id
13c70 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 x].transaction_d
13c80 65 70 74 68 20 3d 20 30 3b 0a 09 09 63 61 63 6b epth = 0;...cack
13c90 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 73 6c ey_slots[idx].sl
13ca0 6f 74 5f 72 65 73 65 74 20 3d 20 30 3b 0a 09 09 ot_reset = 0;...
13cb0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 cackey_slots[idx
13cc0 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 ].token_flags =
13cd0 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 0;...cackey_slot
13ce0 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 20 3d 20 4e s[idx].label = N
13cf0 55 4c 4c 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 ULL;..}...cackey
13d00 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 _initialized = 1
13d10 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f ;...if (!cackey_
13d20 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 29 20 7b 0a biglock_init) {.
13d30 09 09 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 ..mutex_init_ret
13d40 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f = cackey_mutex_
13d50 63 72 65 61 74 65 28 26 63 61 63 6b 65 79 5f 62 create(&cackey_b
13d60 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 69 66 20 28 iglock);....if (
13d70 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 20 21 mutex_init_ret !
13d80 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 = 0) {....CACKEY
13d90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
13da0 72 72 6f 72 2e 20 20 4d 75 74 65 78 20 69 6e 69 rror. Mutex ini
13db0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 61 69 6c tialization fail
13dc0 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 ed.");.....retur
13dd0 6e 28 43 4b 52 5f 43 41 4e 54 5f 4c 4f 43 4b 29 n(CKR_CANT_LOCK)
13de0 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f ;...}....cackey_
13df0 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d 20 31 biglock_init = 1
13e00 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ;..}...CACKEY_DE
13e10 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
13e20 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 rning CKR_OK (%i
13e30 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 )", CKR_OK);...r
13e40 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d eturn(CKR_OK);.}
13e50 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 ..CK_DEFINE_FUNC
13e60 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 TION(CK_RV, C_Fi
13e70 6e 61 6c 69 7a 65 29 28 43 4b 5f 56 4f 49 44 5f nalize)(CK_VOID_
13e80 50 54 52 20 70 52 65 73 65 72 76 65 64 29 20 7b PTR pReserved) {
13e90 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a ..uint32_t idx;.
13ea0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
13eb0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
13ec0 3b 0a 0a 09 69 66 20 28 70 52 65 73 65 72 76 65 ;...if (pReserve
13ed0 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 d != NULL) {...C
13ee0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
13ef0 54 46 28 22 45 72 72 6f 72 2e 20 70 52 65 73 65 TF("Error. pRese
13f00 72 76 65 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c rved is not NULL
13f10 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
13f20 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 KR_ARGUMENTS_BAD
13f30 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 );..}...if (!cac
13f40 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 key_initialized)
13f50 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
13f60 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
13f70 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 Not initialize
13f80 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
13f90 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 CKR_CRYPTOKI_NOT
13fa0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 _INITIALIZED);..
13fb0 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 }...for (idx = 0
13fc0 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 ; idx < (sizeof(
13fd0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 cackey_sessions)
13fe0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 / sizeof(cackey
13ff0 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 _sessions[0]));
14000 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 idx++) {...if (c
14010 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 ackey_sessions[i
14020 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 dx].active) {...
14030 09 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 28 .C_CloseSession(
14040 69 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 idx);...}..}...c
14050 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 ackey_slots_disc
14060 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 onnect_all();...
14070 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 for (idx = 0; id
14080 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b x < (sizeof(cack
14090 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 ey_slots) / size
140a0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b of(cackey_slots[
140b0 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 0])); idx++) {..
140c0 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 .if (cackey_slot
140d0 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 61 64 s[idx].pcsc_read
140e0 65 72 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 er) {....free(ca
140f0 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e ckey_slots[idx].
14100 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 09 pcsc_reader);...
14110 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 70 63 }..}...cackey_pc
14120 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 29 3b sc_disconnect();
14130 0a 0a 09 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 ...cackey_initia
14140 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 09 43 41 43 lized = 0;...CAC
14150 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
14160 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f ("Returning CKR_
14170 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b OK (%i)", CKR_OK
14180 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f );...return(CKR_
14190 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e OK);.}..CK_DEFIN
141a0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 E_FUNCTION(CK_RV
141b0 2c 20 43 5f 47 65 74 49 6e 66 6f 29 28 43 4b 5f , C_GetInfo)(CK_
141c0 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 INFO_PTR pInfo)
141d0 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 {..static CK_UTF
141e0 38 43 48 41 52 20 6d 61 6e 75 66 61 63 74 75 72 8CHAR manufactur
141f0 65 72 49 44 5b 5d 20 3d 20 22 55 2e 53 2e 20 47 erID[] = "U.S. G
14200 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 74 61 overnment";..sta
14210 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 tic CK_UTF8CHAR
14220 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69 libraryDescripti
14230 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b 65 79 22 3b on[] = "CACKey";
14240 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
14250 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
14260 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d );...if (pInfo =
14270 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b = NULL) {...CACK
14280 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
14290 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 "Error. pInfo is
142a0 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 NULL.");....ret
142b0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 urn(CKR_ARGUMENT
142c0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 S_BAD);..}...if
142d0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c (!cackey_initial
142e0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 ized) {...CACKEY
142f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
14300 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 rror. Not initi
14310 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 alized.");....re
14320 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b turn(CKR_CRYPTOK
14330 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 I_NOT_INITIALIZE
14340 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e D);..}...pInfo->
14350 63 72 79 70 74 6f 6b 69 56 65 72 73 69 6f 6e 2e cryptokiVersion.
14360 6d 61 6a 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 major = ((CACKEY
14370 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f _CRYPTOKI_VERSIO
14380 4e 5f 43 4f 44 45 29 20 3e 3e 20 31 36 29 20 26 N_CODE) >> 16) &
14390 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 63 0xff;..pInfo->c
143a0 72 79 70 74 6f 6b 69 56 65 72 73 69 6f 6e 2e 6d ryptokiVersion.m
143b0 69 6e 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f inor = ((CACKEY_
143c0 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e CRYPTOKI_VERSION
143d0 5f 43 4f 44 45 29 20 3e 3e 20 38 29 20 26 20 30 _CODE) >> 8) & 0
143e0 78 66 66 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 xff;...memset(pI
143f0 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 nfo->manufacture
14400 72 49 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 rID, ' ', sizeof
14410 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 (pInfo->manufact
14420 75 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63 70 urerID));..memcp
14430 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 y(pInfo->manufac
14440 74 75 72 65 72 49 44 2c 20 6d 61 6e 75 66 61 63 turerID, manufac
14450 74 75 72 65 72 49 44 2c 20 73 69 7a 65 6f 66 28 turerID, sizeof(
14460 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 20 manufacturerID)
14470 2d 20 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 - 1);...pInfo->f
14480 6c 61 67 73 20 3d 20 30 78 30 30 3b 0a 0a 09 6d lags = 0x00;...m
14490 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6c 69 62 emset(pInfo->lib
144a0 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c raryDescription,
144b0 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e ' ', sizeof(pIn
144c0 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73 63 72 fo->libraryDescr
144d0 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d 63 70 iption));..memcp
144e0 79 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 y(pInfo->library
144f0 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 6c 69 62 Description, lib
14500 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c raryDescription,
14510 20 73 69 7a 65 6f 66 28 6c 69 62 72 61 72 79 44 sizeof(libraryD
14520 65 73 63 72 69 70 74 69 6f 6e 29 20 2d 20 31 29 escription) - 1)
14530 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 ;...pInfo->libra
14540 72 79 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 ryVersion.major
14550 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 = (cackey_getver
14560 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 sion() >> 16) &
14570 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 6c 69 0xff;..pInfo->li
14580 62 72 61 72 79 56 65 72 73 69 6f 6e 2e 6d 69 6e braryVersion.min
14590 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 or = (cackey_get
145a0 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20 version() >> 8)
145b0 26 20 30 78 66 66 3b 0a 0a 09 43 41 43 4b 45 59 & 0xff;...CACKEY
145c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
145d0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 eturning CKR_OK
145e0 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a (%i)", CKR_OK);.
145f0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 ..return(CKR_OK)
14600 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 50 72 6f 63 65 ;.}../*. * Proce
14610 73 73 20 6c 69 73 74 20 6f 66 20 72 65 61 64 65 ss list of reade
14620 72 73 2c 20 61 6e 64 20 63 72 65 61 74 65 20 6d rs, and create m
14630 61 70 70 69 6e 67 20 62 65 74 77 65 65 6e 20 72 apping between r
14640 65 61 64 65 72 20 6e 61 6d 65 20 61 6e 64 20 73 eader name and s
14650 6c 6f 74 20 49 44 0a 20 2a 2f 0a 43 4b 5f 44 45 lot ID. */.CK_DE
14660 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b FINE_FUNCTION(CK
14670 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74 4c 69 _RV, C_GetSlotLi
14680 73 74 29 28 43 4b 5f 42 42 4f 4f 4c 20 74 6f 6b st)(CK_BBOOL tok
14690 65 6e 50 72 65 73 65 6e 74 2c 20 43 4b 5f 53 4c enPresent, CK_SL
146a0 4f 54 5f 49 44 5f 50 54 52 20 70 53 6c 6f 74 4c OT_ID_PTR pSlotL
146b0 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 ist, CK_ULONG_PT
146c0 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 69 R pulCount) {..i
146d0 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b nt mutex_retval;
146e0 0a 09 69 6e 74 20 70 63 73 63 5f 63 6f 6e 6e 65 ..int pcsc_conne
146f0 63 74 5f 72 65 74 3b 0a 09 43 4b 5f 55 4c 4f 4e ct_ret;..CK_ULON
14700 47 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63 6f G count, slot_co
14710 75 6e 74 20 3d 20 30 2c 20 63 75 72 72 73 6c 6f unt = 0, currslo
14720 74 3b 0a 09 63 68 61 72 20 2a 70 63 73 63 5f 72 t;..char *pcsc_r
14730 65 61 64 65 72 73 2c 20 2a 70 63 73 63 5f 72 65 eaders, *pcsc_re
14740 61 64 65 72 73 5f 73 2c 20 2a 70 63 73 63 5f 72 aders_s, *pcsc_r
14750 65 61 64 65 72 73 5f 65 3b 0a 09 44 57 4f 52 44 eaders_e;..DWORD
14760 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 pcsc_readers_le
14770 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 6c n;..LONG scard_l
14780 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 3b 0a istreaders_ret;.
14790 09 73 69 7a 65 5f 74 20 63 75 72 72 5f 72 65 61 .size_t curr_rea
147a0 64 65 72 5f 6c 65 6e 3b 0a 0a 09 43 41 43 4b 45 der_len;...CACKE
147b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
147c0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 Called.");...if
147d0 28 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c (pulCount == NUL
147e0 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 L) {...CACKEY_DE
147f0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
14800 72 2e 20 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e r. pulCount is N
14810 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 ULL.");....retur
14820 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f n(CKR_ARGUMENTS_
14830 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 BAD);..}...if (!
14840 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a cackey_initializ
14850 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...CACKEY_D
14860 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
14870 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c or. Not initial
14880 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 ized.");....retu
14890 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f rn(CKR_CRYPTOKI_
148a0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 NOT_INITIALIZED)
148b0 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 ;..}...mutex_ret
148c0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 val = cackey_mut
148d0 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 ex_lock(cackey_b
148e0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 iglock);..if (mu
148f0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 tex_retval != 0)
14900 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
14910 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
14920 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 Locking failed
14930 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
14940 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 KR_GENERAL_ERROR
14950 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6c 65 61 72 );..}.../* Clear
14960 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73 20 2a list of slots *
14970 2f 0a 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 /..if (pSlotList
14980 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
14990 55 47 5f 50 52 49 4e 54 46 28 22 50 75 72 67 69 UG_PRINTF("Purgi
149a0 6e 67 20 61 6c 6c 20 73 6c 6f 74 20 69 6e 66 6f ng all slot info
149b0 72 6d 61 74 69 6f 6e 2e 22 29 3b 0a 0a 09 09 2f rmation.");..../
149c0 2a 20 4f 6e 6c 79 20 75 70 64 61 74 65 20 74 68 * Only update th
149d0 65 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73 20 e list of slots
149e0 69 66 20 77 65 20 61 72 65 20 61 63 74 75 61 6c if we are actual
149f0 6c 79 20 62 65 69 6e 67 20 73 75 70 70 6c 79 20 ly being supply
14a00 74 68 65 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 the slot informa
14a10 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 tion */...cackey
14a20 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 _slots_disconnec
14a30 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 66 6f 72 20 t_all();....for
14a40 28 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63 (currslot = 0; c
14a50 75 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f urrslot < (sizeo
14a60 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 f(cackey_slots)
14a70 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f / sizeof(cackey_
14a80 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 slots[0])); curr
14a90 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 69 66 20 slot++) {....if
14aa0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 (cackey_slots[cu
14ab0 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 rrslot].pcsc_rea
14ac0 64 65 72 29 20 7b 0a 09 09 09 09 66 72 65 65 28 der) {.....free(
14ad0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 cackey_slots[cur
14ae0 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 rslot].pcsc_read
14af0 65 72 29 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79 er);......cackey
14b00 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d _slots[currslot]
14b10 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20 4e .pcsc_reader = N
14b20 55 4c 4c 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 ULL;....}.....if
14b30 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 (cackey_slots[c
14b40 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 29 20 urrslot].label)
14b50 7b 0a 09 09 09 09 66 72 65 65 28 63 61 63 6b 65 {.....free(cacke
14b60 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 y_slots[currslot
14b70 5d 2e 6c 61 62 65 6c 29 3b 0a 0a 09 09 09 09 63 ].label);......c
14b80 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 ackey_slots[curr
14b90 73 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 slot].label = NU
14ba0 4c 4c 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 LL;....}.....cac
14bb0 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c key_slots[currsl
14bc0 6f 74 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a ot].active = 0;.
14bd0 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 ..}..}.../* Dete
14be0 72 6d 69 6e 65 20 6c 69 73 74 20 6f 66 20 72 65 rmine list of re
14bf0 61 64 65 72 73 20 2a 2f 0a 09 70 63 73 63 5f 63 aders */..pcsc_c
14c00 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63 onnect_ret = cac
14c10 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 key_pcsc_connect
14c20 28 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f ();..if (pcsc_co
14c30 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 nnect_ret != CAC
14c40 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b KEY_PCSC_S_OK) {
14c50 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
14c60 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 PRINTF("Connecti
14c70 6f 6e 20 74 6f 20 50 43 2f 53 43 20 66 61 69 6c on to PC/SC fail
14c80 65 64 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 ed, assuming no
14c90 73 6c 6f 74 73 22 29 3b 0a 0a 09 09 73 6c 6f 74 slots");....slot
14ca0 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d 20 65 _count = 0;..} e
14cb0 6c 73 65 20 7b 0a 09 09 70 63 73 63 5f 72 65 61 lse {...pcsc_rea
14cc0 64 65 72 73 5f 6c 65 6e 20 3d 20 30 3b 0a 0a 09 ders_len = 0;...
14cd0 09 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 .scard_listreade
14ce0 72 73 5f 72 65 74 20 3d 20 53 43 61 72 64 4c 69 rs_ret = SCardLi
14cf0 73 74 52 65 61 64 65 72 73 28 2a 63 61 63 6b 65 stReaders(*cacke
14d00 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e y_pcsc_handle, N
14d10 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63 73 63 ULL, NULL, &pcsc
14d20 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 _readers_len);..
14d30 09 69 66 20 28 73 63 61 72 64 5f 6c 69 73 74 72 .if (scard_listr
14d40 65 61 64 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 eaders_ret == SC
14d50 41 52 44 5f 53 5f 53 55 43 43 45 53 53 20 26 26 ARD_S_SUCCESS &&
14d60 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 pcsc_readers_le
14d70 6e 20 21 3d 20 30 29 20 7b 0a 09 09 09 70 63 73 n != 0) {....pcs
14d80 63 5f 72 65 61 64 65 72 73 20 3d 20 6d 61 6c 6c c_readers = mall
14d90 6f 63 28 70 63 73 63 5f 72 65 61 64 65 72 73 5f oc(pcsc_readers_
14da0 6c 65 6e 29 3b 0a 09 09 09 70 63 73 63 5f 72 65 len);....pcsc_re
14db0 61 64 65 72 73 5f 73 20 3d 20 70 63 73 63 5f 72 aders_s = pcsc_r
14dc0 65 61 64 65 72 73 3b 0a 0a 09 09 09 73 63 61 72 eaders;.....scar
14dd0 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 d_listreaders_re
14de0 74 20 3d 20 53 43 61 72 64 4c 69 73 74 52 65 61 t = SCardListRea
14df0 64 65 72 73 28 2a 63 61 63 6b 65 79 5f 70 63 73 ders(*cackey_pcs
14e00 63 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 c_handle, NULL,
14e10 70 63 73 63 5f 72 65 61 64 65 72 73 2c 20 26 70 pcsc_readers, &p
14e20 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 csc_readers_len)
14e30 3b 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f 6c ;....if (scard_l
14e40 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d istreaders_ret =
14e50 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 = SCARD_S_SUCCES
14e60 53 29 20 7b 0a 09 09 09 09 70 63 73 63 5f 72 65 S) {.....pcsc_re
14e70 61 64 65 72 73 5f 65 20 3d 20 70 63 73 63 5f 72 aders_e = pcsc_r
14e80 65 61 64 65 72 73 20 2b 20 70 63 73 63 5f 72 65 eaders + pcsc_re
14e90 61 64 65 72 73 5f 6c 65 6e 3b 0a 0a 09 09 09 09 aders_len;......
14ea0 2f 2a 20 53 74 61 72 74 20 77 69 74 68 20 53 6c /* Start with Sl
14eb0 6f 74 20 49 44 20 31 2c 20 74 6f 20 61 76 6f 69 ot ID 1, to avoi
14ec0 64 20 61 20 62 75 67 20 69 6e 20 47 44 4d 20 6f d a bug in GDM o
14ed0 6e 20 52 48 45 4c 20 2a 2f 0a 09 09 09 09 2f 2a n RHEL */...../*
14ee0 20 42 75 67 20 35 39 34 39 31 31 3a 20 68 74 74 Bug 594911: htt
14ef0 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e 72 65 ps://bugzilla.re
14f00 64 68 61 74 2e 63 6f 6d 2f 73 68 6f 77 5f 62 75 dhat.com/show_bu
14f10 67 2e 63 67 69 3f 69 64 3d 35 39 34 39 31 31 20 g.cgi?id=594911
14f20 2a 2f 0a 09 09 09 09 63 75 72 72 73 6c 6f 74 20 */.....currslot
14f30 3d 20 31 3b 0a 09 09 09 09 77 68 69 6c 65 20 28 = 1;.....while (
14f40 70 63 73 63 5f 72 65 61 64 65 72 73 20 3c 20 70 pcsc_readers < p
14f50 63 73 63 5f 72 65 61 64 65 72 73 5f 65 29 20 7b csc_readers_e) {
14f60 0a 09 09 09 09 09 63 75 72 72 5f 72 65 61 64 65 ......curr_reade
14f70 72 5f 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 70 r_len = strlen(p
14f80 63 73 63 5f 72 65 61 64 65 72 73 29 3b 0a 0a 09 csc_readers);...
14f90 09 09 09 09 69 66 20 28 28 70 63 73 63 5f 72 65 ....if ((pcsc_re
14fa0 61 64 65 72 73 20 2b 20 63 75 72 72 5f 72 65 61 aders + curr_rea
14fb0 64 65 72 5f 6c 65 6e 29 20 3e 20 70 63 73 63 5f der_len) > pcsc_
14fc0 72 65 61 64 65 72 73 5f 65 29 20 7b 0a 09 09 09 readers_e) {....
14fd0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d ...break;......}
14fe0 0a 0a 09 09 09 09 09 69 66 20 28 63 75 72 72 5f .......if (curr_
14ff0 72 65 61 64 65 72 5f 6c 65 6e 20 3d 3d 20 30 29 reader_len == 0)
15000 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a {.......break;.
15010 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 .....}.......if
15020 28 63 75 72 72 73 6c 6f 74 20 3e 3d 20 28 73 69 (currslot >= (si
15030 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 zeof(cackey_slot
15040 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b s) / sizeof(cack
15050 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b ey_slots[0]))) {
15060 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 .......CACKEY_DE
15070 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e BUG_PRINTF("Foun
15080 64 20 6d 6f 72 65 20 72 65 61 64 65 72 73 20 74 d more readers t
15090 68 61 6e 20 73 6c 6f 74 73 20 61 72 65 20 61 76 han slots are av
150a0 61 69 6c 61 62 6c 65 21 22 29 3b 0a 0a 09 09 09 ailable!");.....
150b0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d ...break;......}
150c0 0a 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 .......CACKEY_DE
150d0 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e BUG_PRINTF("Foun
150e0 64 20 72 65 61 64 65 72 3a 20 25 73 22 2c 20 70 d reader: %s", p
150f0 63 73 63 5f 72 65 61 64 65 72 73 29 3b 0a 0a 09 csc_readers);...
15100 09 09 09 09 2f 2a 20 4f 6e 6c 79 20 75 70 64 61 ..../* Only upda
15110 74 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20 73 te the list of s
15120 6c 6f 74 73 20 69 66 20 77 65 20 61 72 65 20 61 lots if we are a
15130 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 61 73 ctually being as
15140 6b 65 64 20 73 75 70 70 6c 79 20 74 68 65 20 73 ked supply the s
15150 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 lot information
15160 2a 2f 0a 09 09 09 09 09 69 66 20 28 70 53 6c 6f */......if (pSlo
15170 74 4c 69 73 74 29 20 7b 0a 09 09 09 09 09 09 63 tList) {.......c
15180 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 ackey_slots[curr
15190 73 6c 6f 74 5d 2e 61 63 74 69 76 65 20 3d 20 31 slot].active = 1
151a0 3b 0a 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 ;.......cackey_s
151b0 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 lots[currslot].p
151c0 63 73 63 5f 72 65 61 64 65 72 20 3d 20 73 74 72 csc_reader = str
151d0 64 75 70 28 70 63 73 63 5f 72 65 61 64 65 72 73 dup(pcsc_readers
151e0 29 3b 0a 09 09 09 09 09 09 63 61 63 6b 65 79 5f );.......cackey_
151f0 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e slots[currslot].
15200 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 pcsc_card_connec
15210 74 65 64 20 3d 20 30 3b 0a 09 09 09 09 09 09 63 ted = 0;.......c
15220 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 ackey_slots[curr
15230 73 6c 6f 74 5d 2e 74 72 61 6e 73 61 63 74 69 6f slot].transactio
15240 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 09 09 n_depth = 0;....
15250 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b ...cackey_slots[
15260 63 75 72 72 73 6c 6f 74 5d 2e 73 6c 6f 74 5f 72 currslot].slot_r
15270 65 73 65 74 20 3d 20 31 3b 0a 09 09 09 09 09 09 eset = 1;.......
15280 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 cackey_slots[cur
15290 72 73 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 rslot].token_fla
152a0 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 gs = CKF_LOGIN_R
152b0 45 51 55 49 52 45 44 3b 0a 09 09 09 09 09 09 63 EQUIRED;.......c
152c0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 ackey_slots[curr
152d0 73 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 slot].label = NU
152e0 4c 4c 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 09 LL;......}......
152f0 63 75 72 72 73 6c 6f 74 2b 2b 3b 0a 0a 09 09 09 currslot++;.....
15300 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b ..pcsc_readers +
15310 3d 20 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 = curr_reader_le
15320 6e 20 2b 20 31 3b 0a 09 09 09 09 7d 0a 0a 09 09 n + 1;.....}....
15330 09 09 2f 2a 20 53 74 61 72 74 20 77 69 74 68 20 ../* Start with
15340 53 6c 6f 74 20 49 44 20 31 2c 20 74 6f 20 61 76 Slot ID 1, to av
15350 6f 69 64 20 61 20 62 75 67 20 69 6e 20 47 44 4d oid a bug in GDM
15360 20 6f 6e 20 52 48 45 4c 20 2a 2f 0a 09 09 09 09 on RHEL */.....
15370 2f 2a 20 42 75 67 20 35 39 34 39 31 31 3a 20 68 /* Bug 594911: h
15380 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e ttps://bugzilla.
15390 72 65 64 68 61 74 2e 63 6f 6d 2f 73 68 6f 77 5f redhat.com/show_
153a0 62 75 67 2e 63 67 69 3f 69 64 3d 35 39 34 39 31 bug.cgi?id=59491
153b0 31 20 2a 2f 0a 09 09 09 09 69 66 20 28 63 75 72 1 */.....if (cur
153c0 72 73 6c 6f 74 20 3e 20 31 29 20 7b 0a 09 09 09 rslot > 1) {....
153d0 09 09 2f 2a 20 53 74 61 72 74 20 77 69 74 68 20 ../* Start with
153e0 53 6c 6f 74 20 49 44 20 31 2c 20 74 6f 20 61 76 Slot ID 1, to av
153f0 6f 69 64 20 61 20 62 75 67 20 69 6e 20 47 44 4d oid a bug in GDM
15400 20 6f 6e 20 52 48 45 4c 20 2a 2f 0a 09 09 09 09 on RHEL */.....
15410 09 2f 2a 20 42 75 67 20 35 39 34 39 31 31 3a 20 ./* Bug 594911:
15420 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61 https://bugzilla
15430 2e 72 65 64 68 61 74 2e 63 6f 6d 2f 73 68 6f 77 .redhat.com/show
15440 5f 62 75 67 2e 63 67 69 3f 69 64 3d 35 39 34 39 _bug.cgi?id=5949
15450 31 31 20 2a 2f 0a 09 09 09 09 09 73 6c 6f 74 5f 11 */......slot_
15460 63 6f 75 6e 74 20 3d 20 63 75 72 72 73 6c 6f 74 count = currslot
15470 20 2d 20 31 3b 0a 09 09 09 09 7d 0a 09 09 09 7d - 1;.....}....}
15480 20 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b else {.....CACK
15490 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
154a0 22 53 65 63 6f 6e 64 20 63 61 6c 6c 20 74 6f 20 "Second call to
154b0 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 SCardListReaders
154c0 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 20 failed, return
154d0 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59 5f %s/%li", CACKEY_
154e0 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 DEBUG_FUNC_SCARD
154f0 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 ERR_TO_STR(scard
15500 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 _listreaders_ret
15510 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f ), (long) scard_
15520 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29 listreaders_ret)
15530 3b 0a 09 09 09 7d 0a 0a 09 09 09 66 72 65 65 28 ;....}.....free(
15540 70 63 73 63 5f 72 65 61 64 65 72 73 5f 73 29 3b pcsc_readers_s);
15550 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 ...} else {....C
15560 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
15570 54 46 28 22 46 69 72 73 74 20 63 61 6c 6c 20 74 TF("First call t
15580 6f 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 o SCardListReade
15590 72 73 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 rs failed, retur
155a0 6e 20 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45 n %s/%li", CACKE
155b0 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 Y_DEBUG_FUNC_SCA
155c0 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 RDERR_TO_STR(sca
155d0 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 rd_listreaders_r
155e0 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 et), (long) scar
155f0 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 d_listreaders_re
15600 74 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 t);...}..}...mut
15610 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b ex_retval = cack
15620 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 ey_mutex_unlock(
15630 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
15640 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 ..if (mutex_retv
15650 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 al != 0) {...CAC
15660 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
15670 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b ("Error. Unlock
15680 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a ing failed.");..
15690 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e ..return(CKR_GEN
156a0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a ERAL_ERROR);..}.
156b0 0a 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 20 ..if (pSlotList
156c0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 == NULL) {...*pu
156d0 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f lCount = slot_co
156e0 75 6e 74 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 unt;....CACKEY_D
156f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
15700 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 urning CKR_OK (%
15710 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 i)", CKR_OK);...
15720 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b .return(CKR_OK);
15730 0a 09 7d 0a 0a 09 63 6f 75 6e 74 20 3d 20 2a 70 ..}...count = *p
15740 75 6c 43 6f 75 6e 74 3b 0a 09 69 66 20 28 63 6f ulCount;..if (co
15750 75 6e 74 20 3c 20 73 6c 6f 74 5f 63 6f 75 6e 74 unt < slot_count
15760 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
15770 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
15780 2e 20 55 73 65 72 20 61 6c 6c 6f 63 61 74 65 64 . User allocated
15790 20 25 6c 75 20 65 6e 74 72 69 65 73 2c 20 62 75 %lu entries, bu
157a0 74 20 77 65 20 68 61 76 65 20 25 6c 75 20 65 6e t we have %lu en
157b0 74 72 69 65 73 2e 22 2c 20 63 6f 75 6e 74 2c 20 tries.", count,
157c0 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 slot_count);....
157d0 72 65 74 75 72 6e 28 43 4b 52 5f 42 55 46 46 45 return(CKR_BUFFE
157e0 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 09 0a 09 R_TOO_SMALL);...
157f0 7d 0a 0a 09 66 6f 72 20 28 63 75 72 72 73 6c 6f }...for (currslo
15800 74 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74 20 t = 0; currslot
15810 3c 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b 20 63 75 < slot_count; cu
15820 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 2f 2a rrslot++) {.../*
15830 20 53 74 61 72 74 20 77 69 74 68 20 53 6c 6f 74 Start with Slot
15840 20 49 44 20 31 2c 20 74 6f 20 61 76 6f 69 64 20 ID 1, to avoid
15850 61 20 62 75 67 20 69 6e 20 47 44 4d 20 6f 6e 20 a bug in GDM on
15860 52 48 45 4c 20 2a 2f 0a 09 09 2f 2a 20 42 75 67 RHEL */.../* Bug
15870 20 35 39 34 39 31 31 3a 20 68 74 74 70 73 3a 2f 594911: https:/
15880 2f 62 75 67 7a 69 6c 6c 61 2e 72 65 64 68 61 74 /bugzilla.redhat
15890 2e 63 6f 6d 2f 73 68 6f 77 5f 62 75 67 2e 63 67 .com/show_bug.cg
158a0 69 3f 69 64 3d 35 39 34 39 31 31 20 2a 2f 0a 09 i?id=594911 */..
158b0 09 70 53 6c 6f 74 4c 69 73 74 5b 63 75 72 72 73 .pSlotList[currs
158c0 6c 6f 74 5d 20 3d 20 63 75 72 72 73 6c 6f 74 20 lot] = currslot
158d0 2b 20 31 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 43 6f + 1;..}...*pulCo
158e0 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f 75 6e 74 unt = slot_count
158f0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ;...CACKEY_DEBUG
15900 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
15910 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 2e 20 ng CKR_OK (%i).
15920 20 46 6f 75 6e 64 20 25 6c 75 20 72 65 61 64 65 Found %lu reade
15930 72 73 2e 22 2c 20 43 4b 52 5f 4f 4b 2c 20 28 75 rs.", CKR_OK, (u
15940 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 6c nsigned long) sl
15950 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 72 65 74 ot_count);...ret
15960 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 74 urn(CKR_OK);...t
15970 6f 6b 65 6e 50 72 65 73 65 6e 74 20 3d 20 74 6f okenPresent = to
15980 6b 65 6e 50 72 65 73 65 6e 74 3b 20 2f 2a 20 53 kenPresent; /* S
15990 75 70 72 65 73 73 20 75 6e 75 73 65 64 20 76 61 upress unused va
159a0 72 69 61 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a riable warning *
159b0 2f 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 /.}..CK_DEFINE_F
159c0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 UNCTION(CK_RV, C
159d0 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 29 28 43 4b _GetSlotInfo)(CK
159e0 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c _SLOT_ID slotID,
159f0 20 43 4b 5f 53 4c 4f 54 5f 49 4e 46 4f 5f 50 54 CK_SLOT_INFO_PT
15a00 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74 R pInfo) {..stat
15a10 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 73 ic CK_UTF8CHAR s
15a20 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 5b 5d lotDescription[]
15a30 20 3d 20 22 43 41 43 4b 65 79 20 53 6c 6f 74 22 = "CACKey Slot"
15a40 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 ;..int mutex_ret
15a50 76 61 6c 3b 0a 09 69 6e 74 20 62 79 74 65 73 5f val;..int bytes_
15a60 74 6f 5f 63 6f 70 79 3b 0a 0a 09 43 41 43 4b 45 to_copy;...CACKE
15a70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
15a80 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 Called.");...if
15a90 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 (pInfo == NULL)
15aa0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
15ab0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
15ac0 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 pInfo is NULL.")
15ad0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
15ae0 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a ARGUMENTS_BAD);.
15af0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 .}...if (!cackey
15b00 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
15b10 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
15b20 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e RINTF("Error. N
15b30 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 ot initialized."
15b40 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
15b50 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e _CRYPTOKI_NOT_IN
15b60 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
15b70 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 .if (slotID < 0
15b80 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 || slotID >= (si
15b90 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 zeof(cackey_slot
15ba0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b s) / sizeof(cack
15bb0 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b ey_slots[0]))) {
15bc0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
15bd0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 PRINTF("Error. I
15be0 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 nvalid slot requ
15bf0 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 ested (%lu), out
15c00 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 side of valid ra
15c10 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a nge", slotID);..
15c20 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f ..return(CKR_SLO
15c30 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 T_ID_INVALID);..
15c40 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c }...mutex_retval
15c50 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f = cackey_mutex_
15c60 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
15c70 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 ock);..if (mutex
15c80 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a _retval != 0) {.
15c90 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
15ca0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c RINTF("Error. L
15cb0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 ocking failed.")
15cc0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
15cd0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a GENERAL_ERROR);.
15ce0 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f .}...if (cackey_
15cf0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 slots[slotID].ac
15d00 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 tive == 0) {...C
15d10 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
15d20 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c TF("Error. Inval
15d30 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 id slot requeste
15d40 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f d (%lu), slot no
15d50 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 t currently acti
15d60 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 ve", slotID);...
15d70 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e .cackey_mutex_un
15d80 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
15d90 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 ock);....return(
15da0 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 CKR_SLOT_ID_INVA
15db0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f LID);..}...pInfo
15dc0 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 52 45 ->flags = CKF_RE
15dd0 4d 4f 56 41 42 4c 45 5f 44 45 56 49 43 45 20 7c MOVABLE_DEVICE |
15de0 20 43 4b 46 5f 48 57 5f 53 4c 4f 54 3b 0a 0a 09 CKF_HW_SLOT;...
15df0 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e if (cackey_token
15e00 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79 _present(&cackey
15e10 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 _slots[slotID])
15e20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 == CACKEY_PCSC_S
15e30 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b _TOKENPRESENT) {
15e40 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 ...pInfo->flags
15e50 7c 3d 20 43 4b 46 5f 54 4f 4b 45 4e 5f 50 52 45 |= CKF_TOKEN_PRE
15e60 53 45 4e 54 3b 0a 09 7d 0a 0a 09 62 79 74 65 73 SENT;..}...bytes
15e70 5f 74 6f 5f 63 6f 70 79 20 3d 20 73 74 72 6c 65 _to_copy = strle
15e80 6e 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 n(cackey_slots[s
15e90 6c 6f 74 49 44 5d 2e 70 63 73 63 5f 72 65 61 64 lotID].pcsc_read
15ea0 65 72 29 3b 0a 09 69 66 20 28 73 69 7a 65 6f 66 er);..if (sizeof
15eb0 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 (pInfo->manufact
15ec0 75 72 65 72 49 44 29 20 3c 20 62 79 74 65 73 5f urerID) < bytes_
15ed0 74 6f 5f 63 6f 70 79 29 20 7b 0a 09 09 62 79 74 to_copy) {...byt
15ee0 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 73 69 7a es_to_copy = siz
15ef0 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 eof(pInfo->manuf
15f00 61 63 74 75 72 65 72 49 44 29 3b 0a 09 7d 0a 09 acturerID);..}..
15f10 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 memcpy(pInfo->ma
15f20 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 63 61 nufacturerID, ca
15f30 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 ckey_slots[slotI
15f40 44 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 2c 20 D].pcsc_reader,
15f50 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 3b 0a bytes_to_copy);.
15f60 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d ..mutex_retval =
15f70 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e cackey_mutex_un
15f80 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
15f90 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 ock);..if (mutex
15fa0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a _retval != 0) {.
15fb0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
15fc0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 RINTF("Error. U
15fd0 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e nlocking failed.
15fe0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
15ff0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 R_GENERAL_ERROR)
16000 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 49 ;..}...memset(pI
16010 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70 nfo->slotDescrip
16020 74 69 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65 6f tion, ' ', sizeo
16030 66 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 f(pInfo->slotDes
16040 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d cription));..mem
16050 63 70 79 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 cpy(pInfo->slotD
16060 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 6c 6f 74 escription, slot
16070 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 69 7a Description, siz
16080 65 6f 66 28 73 6c 6f 74 44 65 73 63 72 69 70 74 eof(slotDescript
16090 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d ion) - 1);...mem
160a0 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 set(pInfo->manuf
160b0 61 63 74 75 72 65 72 49 44 2c 20 27 20 27 2c 20 acturerID, ' ',
160c0 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 sizeof(pInfo->ma
160d0 6e 75 66 61 63 74 75 72 65 72 49 44 29 29 3b 0a nufacturerID));.
160e0 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 ..pInfo->hardwar
160f0 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d eVersion.major =
16100 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 (cackey_getvers
16110 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30 ion() >> 16) & 0
16120 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 xff;..pInfo->har
16130 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e dwareVersion.min
16140 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 or = (cackey_get
16150 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20 version() >> 8)
16160 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e 66 6f 2d & 0xff;...pInfo-
16170 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e >firmwareVersion
16180 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30 3b 0a 09 .major = 0x00;..
16190 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 pInfo->firmwareV
161a0 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 30 ersion.minor = 0
161b0 78 30 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 x00;...CACKEY_DE
161c0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
161d0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 rning CKR_OK (%i
161e0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 )", CKR_OK);...r
161f0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d eturn(CKR_OK);.}
16200 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 ..CK_DEFINE_FUNC
16210 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 TION(CK_RV, C_Ge
16220 74 54 6f 6b 65 6e 49 6e 66 6f 29 28 43 4b 5f 53 tTokenInfo)(CK_S
16230 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 LOT_ID slotID, C
16240 4b 5f 54 4f 4b 45 4e 5f 49 4e 46 4f 5f 50 54 52 K_TOKEN_INFO_PTR
16250 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74 69 pInfo) {..stati
16260 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6d 61 c CK_UTF8CHAR ma
16270 6e 75 66 61 63 74 75 72 65 72 49 44 5b 5d 20 3d nufacturerID[] =
16280 20 22 55 2e 53 2e 20 47 6f 76 65 72 6e 6d 65 6e "U.S. Governmen
16290 74 22 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 t";..static CK_U
162a0 54 46 38 43 48 41 52 20 64 65 66 61 75 6c 74 4c TF8CHAR defaultL
162b0 61 62 65 6c 5b 5d 20 3d 20 22 55 6e 6b 6e 6f 77 abel[] = "Unknow
162c0 6e 20 54 6f 6b 65 6e 22 3b 0a 09 73 74 61 74 69 n Token";..stati
162d0 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6d 6f c CK_UTF8CHAR mo
162e0 64 65 6c 5b 5d 20 3d 20 22 43 41 43 20 54 6f 6b del[] = "CAC Tok
162f0 65 6e 22 3b 0a 09 73 74 72 75 63 74 20 63 61 63 en";..struct cac
16300 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 key_pcsc_identit
16310 79 20 2a 70 63 73 63 5f 69 64 65 6e 74 69 74 69 y *pcsc_identiti
16320 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f es;..unsigned lo
16330 6e 67 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 09 73 ng num_certs;..s
16340 73 69 7a 65 5f 74 20 6c 61 62 65 6c 5f 72 65 74 size_t label_ret
16350 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 ;..int mutex_ret
16360 76 61 6c 3b 0a 09 69 6e 74 20 75 73 65 5f 64 65 val;..int use_de
16370 66 61 75 6c 74 5f 6c 61 62 65 6c 3b 0a 0a 09 43 fault_label;...C
16380 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
16390 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
163a0 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 .if (pInfo == NU
163b0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 LL) {...CACKEY_D
163c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
163d0 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c or. pInfo is NUL
163e0 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 L.");....return(
163f0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 CKR_ARGUMENTS_BA
16400 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 D);..}...if (!ca
16410 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 ckey_initialized
16420 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
16430 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
16440 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a . Not initializ
16450 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
16460 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f (CKR_CRYPTOKI_NO
16470 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a T_INITIALIZED);.
16480 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 .}...if (slotID
16490 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d < 0 || slotID >=
164a0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f (sizeof(cackey_
164b0 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 slots) / sizeof(
164c0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 cackey_slots[0])
164d0 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 )) {...CACKEY_DE
164e0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
164f0 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 r. Invalid slot
16500 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c requested (%lu),
16510 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 outside of vali
16520 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 d range", slotID
16530 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
16540 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 _SLOT_ID_INVALID
16550 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 );..}...mutex_re
16560 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 tval = cackey_mu
16570 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f tex_lock(cackey_
16580 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d biglock);..if (m
16590 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 utex_retval != 0
165a0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
165b0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
165c0 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 . Locking faile
165d0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
165e0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f CKR_GENERAL_ERRO
165f0 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 R);..}...if (cac
16600 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 key_slots[slotID
16610 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b ].active == 0) {
16620 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
16630 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 PRINTF("Error. I
16640 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 nvalid slot requ
16650 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f ested (%lu), slo
16660 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 t not currently
16670 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 active", slotID)
16680 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 ;....cackey_mute
16690 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
166a0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 biglock);....ret
166b0 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f urn(CKR_SLOT_ID_
166c0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 INVALID);..}...i
166d0 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f f (cackey_token_
166e0 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f present(&cackey_
166f0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 21 slots[slotID]) !
16700 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f = CACKEY_PCSC_S_
16710 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a TOKENPRESENT) {.
16720 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
16730 52 49 4e 54 46 28 22 4e 6f 20 74 6f 6b 65 6e 20 RINTF("No token
16740 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 73 6c is present in sl
16750 6f 74 49 44 20 3d 20 25 6c 75 22 2c 20 73 6c 6f otID = %lu", slo
16760 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f tID);....cackey_
16770 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 mutex_unlock(cac
16780 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 key_biglock);...
16790 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 .return(CKR_TOKE
167a0 4e 5f 4e 4f 54 5f 50 52 45 53 45 4e 54 29 3b 0a N_NOT_PRESENT);.
167b0 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 .}...mutex_retva
167c0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 l = cackey_mutex
167d0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 _unlock(cackey_b
167e0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 iglock);..if (mu
167f0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 tex_retval != 0)
16800 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
16810 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
16820 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c Unlocking fail
16830 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
16840 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 (CKR_GENERAL_ERR
16850 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 OR);..}.../* Det
16860 65 72 6d 69 6e 65 20 74 6f 6b 65 6e 20 6c 61 62 ermine token lab
16870 65 6c 20 66 72 6f 6d 20 63 65 72 74 69 66 69 63 el from certific
16880 61 74 65 73 20 2a 2f 0a 09 6d 65 6d 73 65 74 28 ates */..memset(
16890 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 27 20 pInfo->label, '
168a0 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d ', sizeof(pInfo-
168b0 3e 6c 61 62 65 6c 29 29 3b 0a 09 75 73 65 5f 64 >label));..use_d
168c0 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 31 efault_label = 1
168d0 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 ;...if (cackey_s
168e0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 lots[slotID].lab
168f0 65 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 el == NULL) {...
16900 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 pcsc_identities
16910 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 = cackey_read_ce
16920 72 74 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 rts(&cackey_slot
16930 73 5b 73 6c 6f 74 49 44 5d 2c 20 4e 55 4c 4c 2c s[slotID], NULL,
16940 20 26 6e 75 6d 5f 63 65 72 74 73 29 3b 0a 09 09 &num_certs);...
16950 69 66 20 28 70 63 73 63 5f 69 64 65 6e 74 69 74 if (pcsc_identit
16960 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ies != NULL) {..
16970 09 09 69 66 20 28 6e 75 6d 5f 63 65 72 74 73 20 ..if (num_certs
16980 3e 20 30 29 20 7b 0a 09 09 09 09 6c 61 62 65 6c > 0) {.....label
16990 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70 63 _ret = cackey_pc
169a0 73 63 5f 69 64 65 6e 74 69 74 79 5f 74 6f 5f 6c sc_identity_to_l
169b0 61 62 65 6c 28 70 63 73 63 5f 69 64 65 6e 74 69 abel(pcsc_identi
169c0 74 69 65 73 2c 20 70 49 6e 66 6f 2d 3e 6c 61 62 ties, pInfo->lab
169d0 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f el, sizeof(pInfo
169e0 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 09 09 09 69 ->label));.....i
169f0 66 20 28 6c 61 62 65 6c 5f 72 65 74 20 3e 20 30 f (label_ret > 0
16a00 29 20 7b 0a 09 09 09 09 09 75 73 65 5f 64 65 66 ) {......use_def
16a10 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 30 3b 0a ault_label = 0;.
16a20 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f ......cackey_slo
16a30 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c ts[slotID].label
16a40 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 = malloc(sizeof
16a50 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b (pInfo->label));
16a60 0a 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 63 61 .......memcpy(ca
16a70 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 ckey_slots[slotI
16a80 44 5d 2e 6c 61 62 65 6c 2c 20 70 49 6e 66 6f 2d D].label, pInfo-
16a90 3e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70 >label, sizeof(p
16aa0 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 Info->label));..
16ab0 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 63 61 ...}....}.....ca
16ac0 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 ckey_free_certs(
16ad0 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c pcsc_identities,
16ae0 20 6e 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b 0a num_certs, 1);.
16af0 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 ..}..} else {...
16b00 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 61 memcpy(pInfo->la
16b10 62 65 6c 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 bel, cackey_slot
16b20 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 2c s[slotID].label,
16b30 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c sizeof(pInfo->l
16b40 61 62 65 6c 29 29 3b 0a 0a 09 09 75 73 65 5f 64 abel));....use_d
16b50 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 30 efault_label = 0
16b60 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73 65 5f 64 ;..}...if (use_d
16b70 65 66 61 75 6c 74 5f 6c 61 62 65 6c 29 20 7b 0a efault_label) {.
16b80 09 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e ..memcpy(pInfo->
16b90 6c 61 62 65 6c 2c 20 64 65 66 61 75 6c 74 4c 61 label, defaultLa
16ba0 62 65 6c 2c 20 73 69 7a 65 6f 66 28 64 65 66 61 bel, sizeof(defa
16bb0 75 6c 74 4c 61 62 65 6c 29 20 2d 20 31 29 3b 0a ultLabel) - 1);.
16bc0 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 .}...memset(pInf
16bd0 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 o->manufacturerI
16be0 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 D, ' ', sizeof(p
16bf0 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 Info->manufactur
16c00 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63 70 79 28 erID));..memcpy(
16c10 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 pInfo->manufactu
16c20 72 65 72 49 44 2c 20 6d 61 6e 75 66 61 63 74 75 rerID, manufactu
16c30 72 65 72 49 44 2c 20 73 69 7a 65 6f 66 28 6d 61 rerID, sizeof(ma
16c40 6e 75 66 61 63 74 75 72 65 72 49 44 29 20 2d 20 nufacturerID) -
16c50 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 1);...memset(pIn
16c60 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 27 20 27 2c 20 fo->model, ' ',
16c70 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 6f sizeof(pInfo->mo
16c80 64 65 6c 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 del));..memcpy(p
16c90 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 6d 6f 64 Info->model, mod
16ca0 65 6c 2c 20 73 69 7a 65 6f 66 28 6d 6f 64 65 6c el, sizeof(model
16cb0 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 ) - 1);...memset
16cc0 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61 6c 4e 75 (pInfo->serialNu
16cd0 6d 62 65 72 2c 20 27 20 27 2c 20 73 69 7a 65 6f mber, ' ', sizeo
16ce0 66 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61 6c 4e f(pInfo->serialN
16cf0 75 6d 62 65 72 29 29 3b 0a 0a 09 6d 65 6d 73 65 umber));...memse
16d00 74 28 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d 65 t(pInfo->utcTime
16d10 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 , ' ', sizeof(pI
16d20 6e 66 6f 2d 3e 75 74 63 54 69 6d 65 29 29 3b 0a nfo->utcTime));.
16d30 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 ..pInfo->hardwar
16d40 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d eVersion.major =
16d50 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 (cackey_getvers
16d60 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30 ion() >> 16) & 0
16d70 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 xff;..pInfo->har
16d80 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e dwareVersion.min
16d90 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 or = (cackey_get
16da0 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20 version() >> 8)
16db0 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e 66 6f 2d & 0xff;...pInfo-
16dc0 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e >firmwareVersion
16dd0 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30 3b 0a 09 .major = 0x00;..
16de0 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 pInfo->firmwareV
16df0 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 30 ersion.minor = 0
16e00 78 30 30 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c x00;...pInfo->fl
16e10 61 67 73 20 3d 20 43 4b 46 5f 57 52 49 54 45 5f ags = CKF_WRITE_
16e20 50 52 4f 54 45 43 54 45 44 20 7c 20 43 4b 46 5f PROTECTED | CKF_
16e30 55 53 45 52 5f 50 49 4e 5f 49 4e 49 54 49 41 4c USER_PIN_INITIAL
16e40 49 5a 45 44 20 7c 20 43 4b 46 5f 54 4f 4b 45 4e IZED | CKF_TOKEN
16e50 5f 49 4e 49 54 49 41 4c 49 5a 45 44 20 7c 20 63 _INITIALIZED | c
16e60 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 ackey_slots[slot
16e70 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 3b ID].token_flags;
16e80 0a 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 53 ...pInfo->ulMaxS
16e90 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 28 73 essionCount = (s
16ea0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 izeof(cackey_ses
16eb0 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 sions) / sizeof(
16ec0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
16ed0 30 5d 29 29 20 2d 20 31 3b 0a 09 70 49 6e 66 6f 0])) - 1;..pInfo
16ee0 2d 3e 75 6c 53 65 73 73 69 6f 6e 43 6f 75 6e 74 ->ulSessionCount
16ef0 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c = CK_UNAVAILABL
16f00 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 E_INFORMATION;..
16f10 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 52 77 53 65 pInfo->ulMaxRwSe
16f20 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 30 3b 0a ssionCount = 0;.
16f30 09 70 49 6e 66 6f 2d 3e 75 6c 52 77 53 65 73 73 .pInfo->ulRwSess
16f40 69 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f 55 4e ionCount = CK_UN
16f50 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d AVAILABLE_INFORM
16f60 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 ATION;..pInfo->u
16f70 6c 4d 61 78 50 69 6e 4c 65 6e 20 3d 20 31 32 38 lMaxPinLen = 128
16f80 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 50 ;..pInfo->ulMinP
16f90 69 6e 4c 65 6e 20 3d 20 30 3b 0a 09 70 49 6e 66 inLen = 0;..pInf
16fa0 6f 2d 3e 75 6c 54 6f 74 61 6c 50 75 62 6c 69 63 o->ulTotalPublic
16fb0 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 Memory = CK_UNAV
16fc0 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 AILABLE_INFORMAT
16fd0 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 46 ION;..pInfo->ulF
16fe0 72 65 65 50 75 62 6c 69 63 4d 65 6d 6f 72 79 20 reePublicMemory
16ff0 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 = CK_UNAVAILABLE
17000 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 _INFORMATION;..p
17010 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61 6c 50 72 69 Info->ulTotalPri
17020 76 61 74 65 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f vateMemory = CK_
17030 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f UNAVAILABLE_INFO
17040 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d RMATION;..pInfo-
17050 3e 75 6c 46 72 65 65 50 72 69 76 61 74 65 4d 65 >ulFreePrivateMe
17060 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 mory = CK_UNAVAI
17070 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f LABLE_INFORMATIO
17080 4e 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 N;...CACKEY_DEBU
17090 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
170a0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 ing CKR_OK (%i)"
170b0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 , CKR_OK);...ret
170c0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a urn(CKR_OK);.}..
170d0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 CK_DEFINE_FUNCTI
170e0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 57 61 69 74 ON(CK_RV, C_Wait
170f0 46 6f 72 53 6c 6f 74 45 76 65 6e 74 29 28 43 4b ForSlotEvent)(CK
17100 5f 46 4c 41 47 53 20 66 6c 61 67 73 2c 20 43 4b _FLAGS flags, CK
17110 5f 53 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53 6c _SLOT_ID_PTR pSl
17120 6f 74 49 44 2c 20 43 4b 5f 56 4f 49 44 5f 50 54 otID, CK_VOID_PT
17130 52 20 70 52 65 73 65 72 76 65 64 29 20 7b 0a 09 R pReserved) {..
17140 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
17150 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a NTF("Called.");.
17160 0a 09 69 66 20 28 70 52 65 73 65 72 76 65 64 20 ..if (pReserved
17170 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 != NULL) {...CAC
17180 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
17190 28 22 45 72 72 6f 72 2e 20 70 52 65 73 65 72 76 ("Error. pReserv
171a0 65 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 ed is not NULL."
171b0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
171c0 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b _ARGUMENTS_BAD);
171d0 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ..}...if (!cacke
171e0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b y_initialized) {
171f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
17200 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
17210 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e Not initialized.
17220 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
17230 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 R_CRYPTOKI_NOT_I
17240 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
17250 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
17260 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
17270 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f CKR_FUNCTION_NO
17280 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 T_SUPPORTED (%i)
17290 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f ", CKR_FUNCTION_
172a0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
172b0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e ..return(CKR_FUN
172c0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
172d0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 TED);.}..CK_DEFI
172e0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 NE_FUNCTION(CK_R
172f0 56 2c 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 V, C_GetMechanis
17300 6d 4c 69 73 74 29 28 43 4b 5f 53 4c 4f 54 5f 49 mList)(CK_SLOT_I
17310 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45 43 D slotID, CK_MEC
17320 48 41 4e 49 53 4d 5f 54 59 50 45 5f 50 54 52 20 HANISM_TYPE_PTR
17330 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 2c 20 pMechanismList,
17340 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c CK_ULONG_PTR pul
17350 43 6f 75 6e 74 29 20 7b 0a 09 43 41 43 4b 45 59 Count) {..CACKEY
17360 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 _DEBUG_PRINTF("C
17370 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 alled.");...if (
17380 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 !cackey_initiali
17390 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f zed) {...CACKEY_
173a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
173b0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 ror. Not initia
173c0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 lized.");....ret
173d0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 urn(CKR_CRYPTOKI
173e0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 _NOT_INITIALIZED
173f0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 43 );..}...if (pulC
17400 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a ount == NULL) {.
17410 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
17420 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70 RINTF("Error. p
17430 75 6c 43 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2e ulCount is NULL.
17440 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
17450 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 R_ARGUMENTS_BAD)
17460 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 ;..}...if (pMech
17470 61 6e 69 73 6d 4c 69 73 74 20 3d 3d 20 4e 55 4c anismList == NUL
17480 4c 29 20 7b 0a 09 09 2a 70 75 6c 43 6f 75 6e 74 L) {...*pulCount
17490 20 3d 20 33 3b 0a 0a 09 09 43 41 43 4b 45 59 5f = 3;....CACKEY_
174a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
174b0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 turning CKR_OK (
174c0 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a %i)", CKR_OK);..
174d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 ..return(CKR_OK)
174e0 3b 0a 09 7d 0a 0a 09 69 66 20 28 2a 70 75 6c 43 ;..}...if (*pulC
174f0 6f 75 6e 74 20 3c 20 33 29 20 7b 0a 09 09 43 41 ount < 3) {...CA
17500 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
17510 46 28 22 45 72 72 6f 72 2e 20 20 42 75 66 66 65 F("Error. Buffe
17520 72 20 74 6f 6f 20 73 6d 61 6c 6c 2e 22 29 3b 0a r too small.");.
17530 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 42 55 ...return(CKR_BU
17540 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b FFER_TOO_SMALL);
17550 0a 09 7d 0a 0a 09 70 4d 65 63 68 61 6e 69 73 6d ..}...pMechanism
17560 4c 69 73 74 5b 30 5d 20 3d 20 43 4b 4d 5f 52 53 List[0] = CKM_RS
17570 41 5f 50 4b 43 53 3b 0a 09 70 4d 65 63 68 61 6e A_PKCS;..pMechan
17580 69 73 6d 4c 69 73 74 5b 31 5d 20 3d 20 43 4b 4d ismList[1] = CKM
17590 5f 53 48 41 31 5f 52 53 41 5f 50 4b 43 53 3b 0a _SHA1_RSA_PKCS;.
175a0 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 32 3b 0a .*pulCount = 2;.
175b0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
175c0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
175d0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 CKR_OK (%i)", C
175e0 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e KR_OK);...return
175f0 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f (CKR_OK);.}..CK_
17600 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 DEFINE_FUNCTION(
17610 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4d 65 63 68 CK_RV, C_GetMech
17620 61 6e 69 73 6d 49 6e 66 6f 29 28 43 4b 5f 53 4c anismInfo)(CK_SL
17630 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b OT_ID slotID, CK
17640 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 20 _MECHANISM_TYPE
17650 74 79 70 65 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 type, CK_MECHANI
17660 53 4d 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 SM_INFO_PTR pInf
17670 6f 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f o) {..int mutex_
17680 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 retval;...CACKEY
17690 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 _DEBUG_PRINTF("C
176a0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 alled.");...if (
176b0 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b pInfo == NULL) {
176c0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
176d0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 PRINTF("Error. p
176e0 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b Info is NULL.");
176f0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 ....return(CKR_A
17700 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 RGUMENTS_BAD);..
17710 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f }...if (!cackey_
17720 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 initialized) {..
17730 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
17740 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f INTF("Error. No
17750 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 t initialized.")
17760 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
17770 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 CRYPTOKI_NOT_INI
17780 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 TIALIZED);..}...
17790 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c if (slotID < 0 |
177a0 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a | slotID >= (siz
177b0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 eof(cackey_slots
177c0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 ) / sizeof(cacke
177d0 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a y_slots[0]))) {.
177e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
177f0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e RINTF("Error. In
17800 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 valid slot reque
17810 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 sted (%lu), outs
17820 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e ide of valid ran
17830 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 ge", slotID);...
17840 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 .return(CKR_SLOT
17850 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d _ID_INVALID);..}
17860 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 ...mutex_retval
17870 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c = cackey_mutex_l
17880 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
17890 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f ck);..if (mutex_
178a0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 retval != 0) {..
178b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
178c0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f INTF("Error. Lo
178d0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b cking failed.");
178e0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 ....return(CKR_G
178f0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 ENERAL_ERROR);..
17900 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 }...if (cackey_s
17910 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 lots[slotID].act
17920 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 ive == 0) {...CA
17930 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
17940 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 F("Error. Invali
17950 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 d slot requested
17960 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 (%lu), slot not
17970 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 currently activ
17980 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 e", slotID);....
17990 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c cackey_mutex_unl
179a0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
179b0 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 ck);....return(C
179c0 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c KR_SLOT_ID_INVAL
179d0 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f ID);..}...mutex_
179e0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f retval = cackey_
179f0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 mutex_unlock(cac
17a00 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 key_biglock);..i
17a10 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 f (mutex_retval
17a20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 != 0) {...CACKEY
17a30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
17a40 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 rror. Unlocking
17a50 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 failed.");....r
17a60 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 eturn(CKR_GENERA
17a70 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2f L_ERROR);..}.../
17a80 2a 20 58 58 58 3a 20 54 68 69 73 20 69 73 20 75 * XXX: This is u
17a90 6e 74 65 73 74 65 64 2c 20 61 6e 64 20 66 75 72 ntested, and fur
17aa0 74 68 65 72 20 49 27 6d 20 6e 6f 74 20 72 65 61 ther I'm not rea
17ab0 6c 6c 79 20 73 75 72 65 20 69 66 20 74 68 69 73 lly sure if this
17ac0 20 69 73 20 63 6f 72 72 65 63 74 2e 20 2a 2f 0a is correct. */.
17ad0 09 73 77 69 74 63 68 20 28 74 79 70 65 29 20 7b .switch (type) {
17ae0 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f ...case CKM_RSA_
17af0 50 4b 43 53 3a 0a 09 09 09 70 49 6e 66 6f 2d 3e PKCS:....pInfo->
17b00 75 6c 4d 69 6e 4b 65 79 53 69 7a 65 20 3d 20 35 ulMinKeySize = 5
17b10 31 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 12;....pInfo->ul
17b20 4d 61 78 4b 65 79 53 69 7a 65 20 3d 20 38 31 39 MaxKeySize = 819
17b30 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 2;....pInfo->fla
17b40 67 73 20 3d 20 43 4b 46 5f 48 57 20 7c 20 43 4b gs = CKF_HW | CK
17b50 46 5f 45 4e 43 52 59 50 54 20 7c 20 43 4b 46 5f F_ENCRYPT | CKF_
17b60 44 45 43 52 59 50 54 20 7c 20 43 4b 46 5f 53 49 DECRYPT | CKF_SI
17b70 47 4e 20 7c 20 43 4b 46 5f 56 45 52 49 46 59 3b GN | CKF_VERIFY;
17b80 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 ....break;...cas
17b90 65 20 43 4b 4d 5f 52 53 41 5f 58 5f 35 30 39 3a e CKM_RSA_X_509:
17ba0 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e ....pInfo->ulMin
17bb0 4b 65 79 53 69 7a 65 20 3d 20 35 31 32 3b 0a 09 KeySize = 512;..
17bc0 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 4b 65 ..pInfo->ulMaxKe
17bd0 79 53 69 7a 65 20 3d 20 38 31 39 32 3b 0a 09 09 ySize = 8192;...
17be0 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 .pInfo->flags =
17bf0 43 4b 46 5f 48 57 20 7c 20 43 4b 46 5f 45 4e 43 CKF_HW | CKF_ENC
17c00 52 59 50 54 20 7c 20 43 4b 46 5f 44 45 43 52 59 RYPT | CKF_DECRY
17c10 50 54 20 7c 20 43 4b 46 5f 53 49 47 4e 20 7c 20 PT | CKF_SIGN |
17c20 43 4b 46 5f 56 45 52 49 46 59 3b 0a 09 09 09 62 CKF_VERIFY;....b
17c30 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 43 4b 4d reak;...case CKM
17c40 5f 53 48 41 31 5f 52 53 41 5f 50 4b 43 53 3a 0a _SHA1_RSA_PKCS:.
17c50 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 4b ...pInfo->ulMinK
17c60 65 79 53 69 7a 65 20 3d 20 35 31 32 3b 0a 09 09 eySize = 512;...
17c70 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 4b 65 79 .pInfo->ulMaxKey
17c80 53 69 7a 65 20 3d 20 38 31 39 32 3b 0a 09 09 09 Size = 8192;....
17c90 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 pInfo->flags = C
17ca0 4b 46 5f 48 57 20 7c 20 43 4b 46 5f 53 49 47 4e KF_HW | CKF_SIGN
17cb0 20 7c 20 43 4b 46 5f 56 45 52 49 46 59 3b 0a 09 | CKF_VERIFY;..
17cc0 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 43 41 ..break;..}...CA
17cd0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
17ce0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 F("Returning CKR
17cf0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f _OK (%i)", CKR_O
17d00 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 K);...return(CKR
17d10 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 _OK);.}../* We d
17d20 6f 6e 27 74 20 73 75 70 70 6f 72 74 20 74 68 69 on't support thi
17d30 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f s method. */.CK_
17d40 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 DEFINE_FUNCTION(
17d50 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 54 6f 6b CK_RV, C_InitTok
17d60 65 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 en)(CK_SLOT_ID s
17d70 6c 6f 74 49 44 2c 20 43 4b 5f 55 54 46 38 43 48 lotID, CK_UTF8CH
17d80 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f AR_PTR pPin, CK_
17d90 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 2c 20 ULONG ulPinLen,
17da0 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 CK_UTF8CHAR_PTR
17db0 70 4c 61 62 65 6c 29 20 7b 0a 09 43 41 43 4b 45 pLabel) {..CACKE
17dc0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
17dd0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 Called.");...if
17de0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c (!cackey_initial
17df0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 ized) {...CACKEY
17e00 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
17e10 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 rror. Not initi
17e20 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 alized.");....re
17e30 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b turn(CKR_CRYPTOK
17e40 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 I_NOT_INITIALIZE
17e50 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f D);..}...CACKEY_
17e60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
17e70 74 75 72 6e 69 6e 67 20 43 4b 52 5f 54 4f 4b 45 turning CKR_TOKE
17e80 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 N_WRITE_PROTECTE
17e90 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 54 4f 4b D (%i)", CKR_TOK
17ea0 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 EN_WRITE_PROTECT
17eb0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b ED);...return(CK
17ec0 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 R_TOKEN_WRITE_PR
17ed0 4f 54 45 43 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 OTECTED);.}../*
17ee0 57 65 20 64 6f 6e 27 74 20 73 75 70 70 6f 72 74 We don't support
17ef0 20 74 68 69 73 20 6d 65 74 68 6f 64 2e 20 2a 2f this method. */
17f00 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 .CK_DEFINE_FUNCT
17f10 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 ION(CK_RV, C_Ini
17f20 74 50 49 4e 29 28 43 4b 5f 53 45 53 53 49 4f 4e tPIN)(CK_SESSION
17f30 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e _HANDLE hSession
17f40 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 , CK_UTF8CHAR_PT
17f50 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 R pPin, CK_ULONG
17f60 20 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09 43 41 ulPinLen) {..CA
17f70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
17f80 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
17f90 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 if (!cackey_init
17fa0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 ialized) {...CAC
17fb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
17fc0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e ("Error. Not in
17fd0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 itialized.");...
17fe0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 .return(CKR_CRYP
17ff0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c TOKI_NOT_INITIAL
18000 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b IZED);..}...CACK
18010 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
18020 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 54 "Returning CKR_T
18030 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 OKEN_WRITE_PROTE
18040 43 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f CTED (%i)", CKR_
18050 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 TOKEN_WRITE_PROT
18060 45 43 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e ECTED);...return
18070 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 (CKR_TOKEN_WRITE
18080 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 7d 0a 0a _PROTECTED);.}..
18090 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73 75 70 70 /* We don't supp
180a0 6f 72 74 20 74 68 69 73 20 6d 65 74 68 6f 64 2e ort this method.
180b0 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 */.CK_DEFINE_FU
180c0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f NCTION(CK_RV, C_
180d0 53 65 74 50 49 4e 29 28 43 4b 5f 53 45 53 53 49 SetPIN)(CK_SESSI
180e0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 ON_HANDLE hSessi
180f0 6f 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f on, CK_UTF8CHAR_
18100 50 54 52 20 70 4f 6c 64 50 69 6e 2c 20 43 4b 5f PTR pOldPin, CK_
18110 55 4c 4f 4e 47 20 75 6c 4f 6c 64 50 69 6e 4c 65 ULONG ulOldPinLe
18120 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 n, CK_UTF8CHAR_P
18130 54 52 20 70 4e 65 77 50 69 6e 2c 20 43 4b 5f 55 TR pNewPin, CK_U
18140 4c 4f 4e 47 20 75 6c 4e 65 77 50 69 6e 4c 65 6e LONG ulNewPinLen
18150 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 ) {..CACKEY_DEBU
18160 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 G_PRINTF("Called
18170 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b .");...if (!cack
18180 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 ey_initialized)
18190 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
181a0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
181b0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 Not initialized
181c0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
181d0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f KR_CRYPTOKI_NOT_
181e0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d INITIALIZED);..}
181f0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
18200 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e PRINTF("Returnin
18210 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e g CKR_FUNCTION_N
18220 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 OT_SUPPORTED (%i
18230 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e )", CKR_FUNCTION
18240 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
18250 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 ...return(CKR_FU
18260 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
18270 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 RTED);.}..CK_DEF
18280 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f INE_FUNCTION(CK_
18290 52 56 2c 20 43 5f 4f 70 65 6e 53 65 73 73 69 6f RV, C_OpenSessio
182a0 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c n)(CK_SLOT_ID sl
182b0 6f 74 49 44 2c 20 43 4b 5f 46 4c 41 47 53 20 66 otID, CK_FLAGS f
182c0 6c 61 67 73 2c 20 43 4b 5f 56 4f 49 44 5f 50 54 lags, CK_VOID_PT
182d0 52 20 70 41 70 70 6c 69 63 61 74 69 6f 6e 2c 20 R pApplication,
182e0 43 4b 5f 4e 4f 54 49 46 59 20 6e 6f 74 69 66 79 CK_NOTIFY notify
182f0 2c 20 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e , CK_SESSION_HAN
18300 44 4c 45 5f 50 54 52 20 70 68 53 65 73 73 69 6f DLE_PTR phSessio
18310 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c n) {..unsigned l
18320 6f 6e 67 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 ong idx;..int mu
18330 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 tex_retval;..int
18340 20 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 20 3d found_session =
18350 20 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 0;...CACKEY_DEB
18360 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
18370 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 66 6c 61 d.");...if ((fla
18380 67 73 20 26 20 43 4b 46 5f 53 45 52 49 41 4c 5f gs & CKF_SERIAL_
18390 53 45 53 53 49 4f 4e 29 20 21 3d 20 43 4b 46 5f SESSION) != CKF_
183a0 53 45 52 49 41 4c 5f 53 45 53 53 49 4f 4e 29 20 SERIAL_SESSION)
183b0 7b 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 {...return(CKR_S
183c0 45 53 53 49 4f 4e 5f 50 41 52 41 4c 4c 45 4c 5f ESSION_PARALLEL_
183d0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
183e0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 .}...if (!cackey
183f0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
18400 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
18410 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e RINTF("Error. N
18420 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 ot initialized."
18430 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
18440 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e _CRYPTOKI_NOT_IN
18450 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
18460 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 .if (slotID < 0
18470 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 || slotID >= (si
18480 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 zeof(cackey_slot
18490 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b s) / sizeof(cack
184a0 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b ey_slots[0]))) {
184b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
184c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 PRINTF("Error. I
184d0 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 nvalid slot requ
184e0 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 ested (%lu), out
184f0 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 side of valid ra
18500 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a nge", slotID);..
18510 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f ..return(CKR_SLO
18520 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 T_ID_INVALID);..
18530 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c }...mutex_retval
18540 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f = cackey_mutex_
18550 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
18560 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 ock);..if (mutex
18570 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a _retval != 0) {.
18580 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
18590 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c RINTF("Error. L
185a0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 ocking failed.")
185b0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
185c0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a GENERAL_ERROR);.
185d0 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f .}...if (cackey_
185e0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 slots[slotID].ac
185f0 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 tive == 0) {...C
18600 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
18610 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c TF("Error. Inval
18620 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 id slot requeste
18630 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f d (%lu), slot no
18640 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 t currently acti
18650 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 ve", slotID);...
18660 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e .cackey_mutex_un
18670 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
18680 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 ock);....return(
18690 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 CKR_SLOT_ID_INVA
186a0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 65 LID);..}.../* Ve
186b0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63 61 rify that the ca
186c0 72 64 20 69 73 20 61 63 74 75 61 6c 6c 79 20 69 rd is actually i
186d0 6e 20 74 68 65 20 73 6c 6f 74 2e 20 2a 2f 0a 09 n the slot. */..
186e0 2f 2a 20 58 58 58 3a 20 43 68 65 63 6b 20 74 6f /* XXX: Check to
186f0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 69 73 20 make sure this
18700 69 73 20 69 6e 20 74 68 65 20 50 4b 43 53 23 31 is in the PKCS#1
18710 31 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20 1 specification
18720 2a 2f 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 74 */..if (cackey_t
18730 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 oken_present(&ca
18740 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 ckey_slots[slotI
18750 44 5d 29 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 D]) != CACKEY_PC
18760 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e SC_S_TOKENPRESEN
18770 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 T) {...CACKEY_DE
18780 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
18790 72 2e 20 20 43 61 72 64 20 6e 6f 74 20 70 72 65 r. Card not pre
187a0 73 65 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e 67 sent. Returning
187b0 20 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f CKR_DEVICE_REMO
187c0 56 45 44 22 29 3b 0a 0a 09 09 63 61 63 6b 65 79 VED");....cackey
187d0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 _mutex_unlock(ca
187e0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a ckey_biglock);..
187f0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 44 45 56 ..return(CKR_DEV
18800 49 43 45 5f 52 45 4d 4f 56 45 44 29 3b 0a 09 7d ICE_REMOVED);..}
18810 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 31 3b ...for (idx = 1;
18820 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 idx < (sizeof(c
18830 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 ackey_sessions)
18840 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f / sizeof(cackey_
18850 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 sessions[0])); i
18860 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 21 63 dx++) {...if (!c
18870 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 ackey_sessions[i
18880 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 dx].active) {...
18890 09 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 20 3d .found_session =
188a0 20 31 3b 0a 0a 09 09 09 2a 70 68 53 65 73 73 69 1;.....*phSessi
188b0 6f 6e 20 3d 20 69 64 78 3b 0a 0a 09 09 09 63 61 on = idx;.....ca
188c0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 ckey_sessions[id
188d0 78 5d 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 x].active = 1;..
188e0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e ..cackey_session
188f0 73 5b 69 64 78 5d 2e 73 6c 6f 74 49 44 20 3d 20 s[idx].slotID =
18900 73 6c 6f 74 49 44 3b 0a 09 09 09 63 61 63 6b 65 slotID;....cacke
18910 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e y_sessions[idx].
18920 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 50 state = CKS_RO_P
18930 55 42 4c 49 43 5f 53 45 53 53 49 4f 4e 3b 0a 09 UBLIC_SESSION;..
18940 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e ..cackey_session
18950 73 5b 69 64 78 5d 2e 66 6c 61 67 73 20 3d 20 66 s[idx].flags = f
18960 6c 61 67 73 3b 0a 09 09 09 63 61 63 6b 65 79 5f lags;....cackey_
18970 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 75 6c sessions[idx].ul
18980 44 65 76 69 63 65 45 72 72 6f 72 20 3d 20 30 3b DeviceError = 0;
18990 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 ....cackey_sessi
189a0 6f 6e 73 5b 69 64 78 5d 2e 70 41 70 70 6c 69 63 ons[idx].pApplic
189b0 61 74 69 6f 6e 20 3d 20 70 41 70 70 6c 69 63 61 ation = pApplica
189c0 74 69 6f 6e 3b 0a 09 09 09 63 61 63 6b 65 79 5f tion;....cackey_
189d0 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 4e 6f sessions[idx].No
189e0 74 69 66 79 20 3d 20 6e 6f 74 69 66 79 3b 0a 0a tify = notify;..
189f0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f ...cackey_sessio
18a00 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 ns[idx].identiti
18a10 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63 61 es = NULL;....ca
18a20 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 ckey_sessions[id
18a30 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f x].identities_co
18a40 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 unt = 0;.....cac
18a50 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 key_sessions[idx
18a60 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 20 ].search_active
18a70 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f = 0;.....cackey_
18a80 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 69 sessions[idx].si
18a90 67 6e 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a gn_active = 0;..
18aa0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f ...cackey_sessio
18ab0 6e 73 5b 69 64 78 5d 2e 64 65 63 72 79 70 74 5f ns[idx].decrypt_
18ac0 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 active = 0;.....
18ad0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
18ae0 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 idx].identities
18af0 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 69 64 = cackey_read_id
18b00 65 6e 74 69 74 69 65 73 28 26 63 61 63 6b 65 79 entities(&cackey
18b10 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 _slots[slotID],
18b20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 &cackey_sessions
18b30 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 [idx].identities
18b40 5f 63 6f 75 6e 74 29 3b 0a 0a 0a 09 09 09 62 72 _count);......br
18b50 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 eak;...}..}...mu
18b60 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 tex_retval = cac
18b70 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b key_mutex_unlock
18b80 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 (cackey_biglock)
18b90 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 ;..if (mutex_ret
18ba0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 val != 0) {...CA
18bb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
18bc0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 F("Error. Unloc
18bd0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a king failed.");.
18be0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 ...return(CKR_GE
18bf0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d NERAL_ERROR);..}
18c00 0a 0a 09 69 66 20 28 21 66 6f 75 6e 64 5f 73 65 ...if (!found_se
18c10 73 73 69 6f 6e 29 20 7b 0a 09 09 43 41 43 4b 45 ssion) {...CACKE
18c20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
18c30 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 53 45 Returning CKR_SE
18c40 53 53 49 4f 4e 5f 43 4f 55 4e 54 20 28 25 69 29 SSION_COUNT (%i)
18c50 22 2c 20 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 ", CKR_SESSION_C
18c60 4f 55 4e 54 29 3b 0a 0a 09 09 72 65 74 75 72 6e OUNT);....return
18c70 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 (CKR_SESSION_COU
18c80 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 NT);..}...CACKEY
18c90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
18ca0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 eturning CKR_OK
18cb0 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a (%i)", CKR_OK);.
18cc0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 ..return(CKR_OK)
18cd0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 ;.}..CK_DEFINE_F
18ce0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 UNCTION(CK_RV, C
18cf0 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 29 28 43 _CloseSession)(C
18d00 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 K_SESSION_HANDLE
18d10 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 69 6e hSession) {..in
18d20 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a t mutex_retval;.
18d30 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
18d40 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
18d50 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f ;...if (!cackey_
18d60 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 initialized) {..
18d70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
18d80 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f INTF("Error. No
18d90 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 t initialized.")
18da0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
18db0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 CRYPTOKI_NOT_INI
18dc0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 TIALIZED);..}...
18dd0 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 if (hSession ==
18de0 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 0 || hSession >=
18df0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f (sizeof(cackey_
18e00 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 sessions) / size
18e10 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f of(cackey_sessio
18e20 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 ns[0]))) {...CAC
18e30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
18e40 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f ("Error. Sessio
18e50 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 n out of range."
18e60 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 );......return(C
18e70 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c KR_SESSION_HANDL
18e80 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a E_INVALID);..}..
18e90 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 .mutex_retval =
18ea0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 cackey_mutex_loc
18eb0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
18ec0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 );..if (mutex_re
18ed0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 tval != 0) {...C
18ee0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
18ef0 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b TF("Error. Lock
18f00 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a ing failed.");..
18f10 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e ..return(CKR_GEN
18f20 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a ERAL_ERROR);..}.
18f30 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 ..if (!cackey_se
18f40 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
18f50 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 .active) {...cac
18f60 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b key_mutex_unlock
18f70 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 (cackey_biglock)
18f80 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 ;....CACKEY_DEBU
18f90 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
18fa0 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 Session not ac
18fb0 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 tive.");......re
18fc0 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e turn(CKR_SESSION
18fd0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 _HANDLE_INVALID)
18fe0 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 ;..}...cackey_se
18ff0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
19000 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 63 61 .active = 0;..ca
19010 63 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e 74 69 ckey_free_identi
19020 74 69 65 73 28 63 61 63 6b 65 79 5f 73 65 73 73 ties(cackey_sess
19030 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 ions[hSession].i
19040 64 65 6e 74 69 74 69 65 73 2c 20 63 61 63 6b 65 dentities, cacke
19050 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
19060 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f ion].identities_
19070 63 6f 75 6e 74 29 3b 0a 0a 09 6d 75 74 65 78 5f count);...mutex_
19080 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f retval = cackey_
19090 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 mutex_unlock(cac
190a0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 key_biglock);..i
190b0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 f (mutex_retval
190c0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 != 0) {...CACKEY
190d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
190e0 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 rror. Unlocking
190f0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 failed.");....r
19100 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 eturn(CKR_GENERA
19110 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 L_ERROR);..}...C
19120 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
19130 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b TF("Returning CK
19140 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f R_OK (%i)", CKR_
19150 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b OK);...return(CK
19160 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 R_OK);.}..CK_DEF
19170 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f INE_FUNCTION(CK_
19180 52 56 2c 20 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 RV, C_CloseAllSe
19190 73 73 69 6f 6e 73 29 28 43 4b 5f 53 4c 4f 54 5f ssions)(CK_SLOT_
191a0 49 44 20 73 6c 6f 74 49 44 29 20 7b 0a 09 75 69 ID slotID) {..ui
191b0 6e 74 33 32 5f 74 20 69 64 78 3b 0a 09 69 6e 74 nt32_t idx;..int
191c0 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a mutex_retval;..
191d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
191e0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
191f0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 ...if (!cackey_i
19200 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 nitialized) {...
19210 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
19220 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 NTF("Error. Not
19230 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b initialized.");
19240 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 ....return(CKR_C
19250 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 RYPTOKI_NOT_INIT
19260 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 IALIZED);..}...i
19270 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c f (slotID < 0 ||
19280 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 slotID >= (size
19290 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 of(cackey_slots)
192a0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 / sizeof(cackey
192b0 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 _slots[0]))) {..
192c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
192d0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 INTF("Error. Inv
192e0 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 alid slot reques
192f0 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 ted (%lu), outsi
19300 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 de of valid rang
19310 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 e", slotID);....
19320 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f return(CKR_SLOT_
19330 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a ID_INVALID);..}.
19340 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d ..mutex_retval =
19350 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f cackey_mutex_lo
19360 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
19370 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 k);..if (mutex_r
19380 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 etval != 0) {...
19390 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
193a0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 NTF("Error. Loc
193b0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a king failed.");.
193c0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 ...return(CKR_GE
193d0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d NERAL_ERROR);..}
193e0 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c ...if (cackey_sl
193f0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 ots[slotID].acti
19400 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 ve == 0) {...CAC
19410 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
19420 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 ("Error. Invalid
19430 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 slot requested
19440 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 (%lu), slot not
19450 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 currently active
19460 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 ", slotID);....c
19470 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f ackey_mutex_unlo
19480 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
19490 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b k);....return(CK
194a0 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 R_SLOT_ID_INVALI
194b0 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 D);..}...for (id
194c0 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 x = 0; idx < (si
194d0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 zeof(cackey_sess
194e0 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 ions) / sizeof(c
194f0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 ackey_sessions[0
19500 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 ])); idx++) {...
19510 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 if (cackey_sessi
19520 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 ons[idx].active)
19530 20 7b 0a 09 09 09 69 66 20 28 63 61 63 6b 65 79 {....if (cackey
19540 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 _sessions[idx].s
19550 6c 6f 74 49 44 20 21 3d 20 73 6c 6f 74 49 44 29 lotID != slotID)
19560 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b {.....continue;
19570 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 ....}.....cackey
19580 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 _mutex_unlock(ca
19590 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 ckey_biglock);..
195a0 09 09 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e ..C_CloseSession
195b0 28 69 64 78 29 3b 0a 09 09 09 63 61 63 6b 65 79 (idx);....cackey
195c0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b _mutex_lock(cack
195d0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d ey_biglock);...}
195e0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 ..}...mutex_retv
195f0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 al = cackey_mute
19600 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
19610 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d biglock);..if (m
19620 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 utex_retval != 0
19630 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
19640 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
19650 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 . Unlocking fai
19660 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 led.");....retur
19670 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 n(CKR_GENERAL_ER
19680 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 ROR);..}...CACKE
19690 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
196a0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b Returning CKR_OK
196b0 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b (%i)", CKR_OK);
196c0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b ...return(CKR_OK
196d0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f );.}..CK_DEFINE_
196e0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 FUNCTION(CK_RV,
196f0 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f C_GetSessionInfo
19700 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e )(CK_SESSION_HAN
19710 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b DLE hSession, CK
19720 5f 53 45 53 53 49 4f 4e 5f 49 4e 46 4f 5f 50 54 _SESSION_INFO_PT
19730 52 20 70 49 6e 66 6f 29 20 7b 0a 09 69 6e 74 20 R pInfo) {..int
19740 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 mutex_retval;...
19750 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
19760 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a NTF("Called.");.
19770 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e ..if (pInfo == N
19780 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f ULL) {...CACKEY_
19790 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
197a0 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 ror. pInfo is NU
197b0 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e LL.");....return
197c0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 (CKR_ARGUMENTS_B
197d0 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 AD);..}...if (!c
197e0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 ackey_initialize
197f0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 d) {...CACKEY_DE
19800 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
19810 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 r. Not initiali
19820 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 zed.");....retur
19830 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e n(CKR_CRYPTOKI_N
19840 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b OT_INITIALIZED);
19850 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 ..}...if (hSessi
19860 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 on == 0 || hSess
19870 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 ion >= (sizeof(c
19880 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 ackey_sessions)
19890 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f / sizeof(cackey_
198a0 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b sessions[0]))) {
198b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
198c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
198d0 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 Session out of r
198e0 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 ange.");......re
198f0 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e turn(CKR_SESSION
19900 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 _HANDLE_INVALID)
19910 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 ;..}...mutex_ret
19920 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 val = cackey_mut
19930 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 ex_lock(cackey_b
19940 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 iglock);..if (mu
19950 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 tex_retval != 0)
19960 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
19970 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
19980 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 Locking failed
19990 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
199a0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 KR_GENERAL_ERROR
199b0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 );..}...if (!cac
199c0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
199d0 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b ssion].active) {
199e0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f ...cackey_mutex_
199f0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 unlock(cackey_bi
19a00 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 glock);....CACKE
19a10 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
19a20 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 Error. Session
19a30 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 not active.");..
19a40 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 ....return(CKR_S
19a50 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e ESSION_HANDLE_IN
19a60 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e VALID);..}...pIn
19a70 66 6f 2d 3e 73 6c 6f 74 49 44 20 3d 20 63 61 63 fo->slotID = cac
19a80 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
19a90 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 09 ssion].slotID;..
19aa0 70 49 6e 66 6f 2d 3e 73 74 61 74 65 20 3d 20 63 pInfo->state = c
19ab0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
19ac0 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65 3b 0a Session].state;.
19ad0 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 .pInfo->flags =
19ae0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
19af0 68 53 65 73 73 69 6f 6e 5d 2e 66 6c 61 67 73 3b hSession].flags;
19b00 0a 09 70 49 6e 66 6f 2d 3e 75 6c 44 65 76 69 63 ..pInfo->ulDevic
19b10 65 45 72 72 6f 72 20 3d 20 63 61 63 6b 65 79 5f eError = cackey_
19b20 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
19b30 6e 5d 2e 75 6c 44 65 76 69 63 65 45 72 72 6f 72 n].ulDeviceError
19b40 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c ;...mutex_retval
19b50 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f = cackey_mutex_
19b60 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 unlock(cackey_bi
19b70 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 glock);..if (mut
19b80 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 ex_retval != 0)
19b90 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
19ba0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
19bb0 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 Unlocking faile
19bc0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
19bd0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f CKR_GENERAL_ERRO
19be0 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f R);..}...CACKEY_
19bf0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
19c00 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 turning CKR_OK (
19c10 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a %i)", CKR_OK);..
19c20 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b .return(CKR_OK);
19c30 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 .}..CK_DEFINE_FU
19c40 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f NCTION(CK_RV, C_
19c50 47 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 GetOperationStat
19c60 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 e)(CK_SESSION_HA
19c70 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 NDLE hSession, C
19c80 4b 5f 42 59 54 45 5f 50 54 52 20 70 4f 70 65 72 K_BYTE_PTR pOper
19c90 61 74 69 6f 6e 53 74 61 74 65 2c 20 43 4b 5f 55 ationState, CK_U
19ca0 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4f 70 65 72 LONG_PTR pulOper
19cb0 61 74 69 6f 6e 53 74 61 74 65 4c 65 6e 29 20 7b ationStateLen) {
19cc0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
19cd0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
19ce0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f ;...if (!cackey_
19cf0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 initialized) {..
19d00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
19d10 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f INTF("Error. No
19d20 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 t initialized.")
19d30 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
19d40 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 CRYPTOKI_NOT_INI
19d50 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 TIALIZED);..}...
19d60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
19d70 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 NTF("Returning C
19d80 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
19d90 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c SUPPORTED (%i)",
19da0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f CKR_FUNCTION_NO
19db0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 T_SUPPORTED);...
19dc0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 return(CKR_FUNCT
19dd0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
19de0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 D);.}..CK_DEFINE
19df0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c _FUNCTION(CK_RV,
19e00 20 43 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e 53 C_SetOperationS
19e10 74 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e tate)(CK_SESSION
19e20 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e _HANDLE hSession
19e30 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4f , CK_BYTE_PTR pO
19e40 70 65 72 61 74 69 6f 6e 53 74 61 74 65 2c 20 43 perationState, C
19e50 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 70 65 72 61 74 K_ULONG ulOperat
19e60 69 6f 6e 53 74 61 74 65 4c 65 6e 2c 20 43 4b 5f ionStateLen, CK_
19e70 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 45 OBJECT_HANDLE hE
19e80 6e 63 72 79 70 74 69 6f 6e 4b 65 79 2c 20 43 4b ncryptionKey, CK
19e90 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 _OBJECT_HANDLE h
19ea0 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 4b 65 AuthenticationKe
19eb0 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 y) {..CACKEY_DEB
19ec0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
19ed0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 d.");...if (!cac
19ee0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 key_initialized)
19ef0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
19f00 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
19f10 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 Not initialize
19f20 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
19f30 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 CKR_CRYPTOKI_NOT
19f40 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 _INITIALIZED);..
19f50 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 }...CACKEY_DEBUG
19f60 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
19f70 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f ng CKR_FUNCTION_
19f80 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 NOT_SUPPORTED (%
19f90 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f i)", CKR_FUNCTIO
19fa0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 N_NOT_SUPPORTED)
19fb0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 ;...return(CKR_F
19fc0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
19fd0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 ORTED);.}..CK_DE
19fe0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b FINE_FUNCTION(CK
19ff0 5f 52 56 2c 20 43 5f 4c 6f 67 69 6e 29 28 43 4b _RV, C_Login)(CK
1a000 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 _SESSION_HANDLE
1a010 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 53 45 hSession, CK_USE
1a020 52 5f 54 59 50 45 20 75 73 65 72 54 79 70 65 2c R_TYPE userType,
1a030 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 CK_UTF8CHAR_PTR
1a040 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 pPin, CK_ULONG
1a050 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09 43 4b 5f ulPinLen) {..CK_
1a060 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a SLOT_ID slotID;.
1a070 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 .int mutex_retva
1a080 6c 3b 0a 09 69 6e 74 20 74 72 69 65 73 5f 72 65 l;..int tries_re
1a090 6d 61 69 6e 69 6e 67 3b 0a 09 69 6e 74 20 6c 6f maining;..int lo
1a0a0 67 69 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 gin_ret;...CACKE
1a0b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1a0c0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 Called.");...if
1a0d0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c (!cackey_initial
1a0e0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 ized) {...CACKEY
1a0f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
1a100 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 rror. Not initi
1a110 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 alized.");....re
1a120 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b turn(CKR_CRYPTOK
1a130 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 I_NOT_INITIALIZE
1a140 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 D);..}...if (hSe
1a150 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 ssion == 0 || hS
1a160 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f ession >= (sizeo
1a170 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e f(cackey_session
1a180 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b s) / sizeof(cack
1a190 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 ey_sessions[0]))
1a1a0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
1a1b0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
1a1c0 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f . Session out o
1a1d0 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 f range.");.....
1a1e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 .return(CKR_SESS
1a1f0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c ION_HANDLE_INVAL
1a200 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73 ID);..}...if (us
1a210 65 72 54 79 70 65 20 21 3d 20 43 4b 55 5f 55 53 erType != CKU_US
1a220 45 52 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ER) {...CACKEY_D
1a230 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
1a240 6f 72 2e 20 20 57 65 20 6f 6e 6c 79 20 73 75 70 or. We only sup
1a250 70 6f 72 74 20 55 53 45 52 20 6d 6f 64 65 2c 20 port USER mode,
1a260 61 73 6b 65 64 20 66 6f 72 20 25 6c 75 20 6d 6f asked for %lu mo
1a270 64 65 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 de.", (unsigned
1a280 6c 6f 6e 67 29 20 75 73 65 72 54 79 70 65 29 0a long) userType).
1a290 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 55 53 ...return(CKR_US
1a2a0 45 52 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 29 ER_TYPE_INVALID)
1a2b0 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 ;..}...mutex_ret
1a2c0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 val = cackey_mut
1a2d0 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 ex_lock(cackey_b
1a2e0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 iglock);..if (mu
1a2f0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 tex_retval != 0)
1a300 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
1a310 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
1a320 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 Locking failed
1a330 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
1a340 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 KR_GENERAL_ERROR
1a350 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 );..}...if (!cac
1a360 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
1a370 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b ssion].active) {
1a380 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f ...cackey_mutex_
1a390 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 unlock(cackey_bi
1a3a0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 glock);....CACKE
1a3b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1a3c0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 Error. Session
1a3d0 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 not active.");..
1a3e0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 ....return(CKR_S
1a3f0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e ESSION_HANDLE_IN
1a400 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f VALID);..}...slo
1a410 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 tID = cackey_ses
1a420 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
1a430 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c slotID;...if (sl
1a440 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 otID < 0 || slot
1a450 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 ID >= (sizeof(ca
1a460 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 ckey_slots) / si
1a470 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 zeof(cackey_slot
1a480 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b s[0]))) {...CACK
1a490 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1a4a0 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 "Error. Invalid
1a4b0 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 slot requested (
1a4c0 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 %lu), outside of
1a4d0 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 valid range", s
1a4e0 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 lotID);....retur
1a4f0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 n(CKR_GENERAL_ER
1a500 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 ROR);..}...if (c
1a510 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 ackey_slots[slot
1a520 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 ID].active == 0)
1a530 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
1a540 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
1a550 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 Invalid slot re
1a560 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 quested (%lu), s
1a570 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c lot not currentl
1a580 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 y active", slotI
1a590 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 D);....cackey_mu
1a5a0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 tex_unlock(cacke
1a5b0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 y_biglock);....r
1a5c0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 eturn(CKR_GENERA
1a5d0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 6c L_ERROR);..}...l
1a5e0 6f 67 69 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 ogin_ret = cacke
1a5f0 79 5f 6c 6f 67 69 6e 28 26 63 61 63 6b 65 79 5f y_login(&cackey_
1a600 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 70 slots[slotID], p
1a610 50 69 6e 2c 20 75 6c 50 69 6e 4c 65 6e 2c 20 26 Pin, ulPinLen, &
1a620 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 29 tries_remaining)
1a630 3b 0a 09 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74 ;..if (login_ret
1a640 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f != CACKEY_PCSC_
1a650 53 5f 4f 4b 29 20 7b 0a 09 09 63 61 63 6b 65 79 S_OK) {...cackey
1a660 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 _mutex_unlock(ca
1a670 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a ckey_biglock);..
1a680 09 09 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20 ..if (login_ret
1a690 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 == CACKEY_PCSC_E
1a6a0 5f 4c 4f 43 4b 45 44 29 20 7b 0a 09 09 09 43 41 _LOCKED) {....CA
1a6b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
1a6c0 46 28 22 45 72 72 6f 72 2e 20 20 54 6f 6b 65 6e F("Error. Token
1a6d0 20 69 73 20 6c 6f 63 6b 65 64 2e 22 29 3b 0a 0a is locked.");..
1a6e0 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b ...cackey_slots[
1a6f0 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c slotID].token_fl
1a700 61 67 73 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f ags |= CKF_USER_
1a710 50 49 4e 5f 4c 4f 43 4b 45 44 3b 0a 0a 09 09 09 PIN_LOCKED;.....
1a720 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 4c return(CKR_PIN_L
1a730 4f 43 4b 45 44 29 3b 0a 09 09 7d 20 65 6c 73 65 OCKED);...} else
1a740 20 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20 3d if (login_ret =
1a750 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f = CACKEY_PCSC_E_
1a760 42 41 44 50 49 4e 29 20 7b 0a 09 09 09 43 41 43 BADPIN) {....CAC
1a770 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1a780 28 22 45 72 72 6f 72 2e 20 20 49 6e 76 61 6c 69 ("Error. Invali
1a790 64 20 50 49 4e 2e 22 29 3b 0a 0a 09 09 09 63 61 d PIN.");.....ca
1a7a0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 ckey_slots[slotI
1a7b0 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c D].token_flags |
1a7c0 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 43 = CKF_USER_PIN_C
1a7d0 4f 55 4e 54 5f 4c 4f 57 3b 0a 0a 09 09 09 69 66 OUNT_LOW;.....if
1a7e0 20 28 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e (tries_remainin
1a7f0 67 20 3d 3d 20 31 29 20 7b 0a 09 09 09 09 63 61 g == 1) {.....ca
1a800 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 ckey_slots[slotI
1a810 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c D].token_flags |
1a820 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 46 = CKF_USER_PIN_F
1a830 49 4e 41 4c 5f 54 52 59 3b 0a 09 09 09 7d 0a 0a INAL_TRY;....}..
1a840 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 ...return(CKR_PI
1a850 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a 09 09 N_INCORRECT);...
1a860 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 }....CACKEY_DEBU
1a870 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
1a880 20 20 55 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 20 Unknown error
1a890 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 63 61 returned from ca
1a8a0 63 6b 65 79 5f 6c 6f 67 69 6e 28 29 20 28 25 69 ckey_login() (%i
1a8b0 29 22 2c 20 6c 6f 67 69 6e 5f 72 65 74 29 3b 0a )", login_ret);.
1a8c0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 ...return(CKR_GE
1a8d0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d NERAL_ERROR);..}
1a8e0 0a 0a 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b ...cackey_slots[
1a8f0 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c slotID].token_fl
1a900 61 67 73 20 26 3d 20 7e 28 43 4b 46 5f 55 53 45 ags &= ~(CKF_USE
1a910 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 20 7c 20 43 R_PIN_LOCKED | C
1a920 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 43 4f 55 4e KF_USER_PIN_COUN
1a930 54 5f 4c 4f 57 20 7c 20 43 4b 46 5f 4c 4f 47 49 T_LOW | CKF_LOGI
1a940 4e 5f 52 45 51 55 49 52 45 44 20 7c 20 43 4b 46 N_REQUIRED | CKF
1a950 5f 55 53 45 52 5f 50 49 4e 5f 46 49 4e 41 4c 5f _USER_PIN_FINAL_
1a960 54 52 59 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 TRY);...cackey_s
1a970 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
1a980 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f ].state = CKS_RO
1a990 5f 55 53 45 52 5f 46 55 4e 43 54 49 4f 4e 53 3b _USER_FUNCTIONS;
1a9a0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 ...mutex_retval
1a9b0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 = cackey_mutex_u
1a9c0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 nlock(cackey_big
1a9d0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 lock);..if (mute
1a9e0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b x_retval != 0) {
1a9f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1aa00 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
1aa10 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 Unlocking failed
1aa20 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
1aa30 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 KR_GENERAL_ERROR
1aa40 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 );..}...CACKEY_D
1aa50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
1aa60 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 urning CKR_OK (%
1aa70 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 i)", CKR_OK);...
1aa80 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a return(CKR_OK);.
1aa90 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e }..CK_DEFINE_FUN
1aaa0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c CTION(CK_RV, C_L
1aab0 6f 67 6f 75 74 29 28 43 4b 5f 53 45 53 53 49 4f ogout)(CK_SESSIO
1aac0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f N_HANDLE hSessio
1aad0 6e 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 n) {..CK_SLOT_ID
1aae0 20 73 6c 6f 74 49 44 3b 0a 09 69 6e 74 20 6d 75 slotID;..int mu
1aaf0 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 tex_retval;...CA
1ab00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
1ab10 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
1ab20 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 if (!cackey_init
1ab30 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 ialized) {...CAC
1ab40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1ab50 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e ("Error. Not in
1ab60 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 itialized.");...
1ab70 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 .return(CKR_CRYP
1ab80 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c TOKI_NOT_INITIAL
1ab90 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 IZED);..}...if (
1aba0 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c hSession == 0 ||
1abb0 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 hSession >= (si
1abc0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 zeof(cackey_sess
1abd0 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 ions) / sizeof(c
1abe0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 ackey_sessions[0
1abf0 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f ]))) {...CACKEY_
1ac00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
1ac10 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 ror. Session ou
1ac20 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 t of range.");..
1ac30 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 ....return(CKR_S
1ac40 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e ESSION_HANDLE_IN
1ac50 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 VALID);..}...mut
1ac60 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b ex_retval = cack
1ac70 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 ey_mutex_lock(ca
1ac80 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 ckey_biglock);..
1ac90 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c if (mutex_retval
1aca0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 != 0) {...CACKE
1acb0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1acc0 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 Error. Locking
1acd0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 failed.");....re
1ace0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c turn(CKR_GENERAL
1acf0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 _ERROR);..}...if
1ad00 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f (!cackey_sessio
1ad10 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 ns[hSession].act
1ad20 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f ive) {...cackey_
1ad30 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 mutex_unlock(cac
1ad40 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 key_biglock);...
1ad50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1ad60 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 INTF("Error. Se
1ad70 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 ssion not active
1ad80 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e .");......return
1ad90 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e (CKR_SESSION_HAN
1ada0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d DLE_INVALID);..}
1adb0 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b ...slotID = cack
1adc0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
1add0 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 sion].slotID;...
1ade0 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c if (slotID < 0 |
1adf0 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a | slotID >= (siz
1ae00 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 eof(cackey_slots
1ae10 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 ) / sizeof(cacke
1ae20 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a y_slots[0]))) {.
1ae30 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1ae40 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e RINTF("Error. In
1ae50 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 valid slot reque
1ae60 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 sted (%lu), outs
1ae70 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e ide of valid ran
1ae80 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 ge", slotID);...
1ae90 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 .return(CKR_GENE
1aea0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a RAL_ERROR);..}..
1aeb0 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 .if (cackey_slot
1aec0 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 s[slotID].active
1aed0 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 == 0) {...CACKE
1aee0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1aef0 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 Error. Invalid s
1af00 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 lot requested (%
1af10 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 lu), slot not cu
1af20 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c rrently active",
1af30 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 slotID);....cac
1af40 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b key_mutex_unlock
1af50 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 (cackey_biglock)
1af60 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
1af70 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a GENERAL_ERROR);.
1af80 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 .}...cackey_sess
1af90 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 ions[hSession].s
1afa0 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 50 55 tate = CKS_RO_PU
1afb0 42 4c 49 43 5f 53 45 53 53 49 4f 4e 3b 0a 09 63 BLIC_SESSION;..c
1afc0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 ackey_slots[slot
1afd0 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 ID].token_flags
1afe0 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 = CKF_LOGIN_REQU
1aff0 49 52 45 44 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 IRED;...mutex_re
1b000 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 tval = cackey_mu
1b010 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 tex_unlock(cacke
1b020 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 y_biglock);..if
1b030 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d (mutex_retval !=
1b040 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 0) {...CACKEY_D
1b050 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
1b060 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 or. Unlocking f
1b070 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 ailed.");....ret
1b080 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f urn(CKR_GENERAL_
1b090 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 ERROR);..}...CAC
1b0a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1b0b0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f ("Returning CKR_
1b0c0 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b OK (%i)", CKR_OK
1b0d0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f );...return(CKR_
1b0e0 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e OK);.}..CK_DEFIN
1b0f0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 E_FUNCTION(CK_RV
1b100 2c 20 43 5f 43 72 65 61 74 65 4f 62 6a 65 63 74 , C_CreateObject
1b110 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e )(CK_SESSION_HAN
1b120 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b DLE hSession, CK
1b130 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 _ATTRIBUTE_PTR p
1b140 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f Template, CK_ULO
1b150 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f NG ulCount, CK_O
1b160 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 BJECT_HANDLE_PTR
1b170 20 70 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 phObject) {..CA
1b180 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
1b190 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
1b1a0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 if (!cackey_init
1b1b0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 ialized) {...CAC
1b1c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1b1d0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e ("Error. Not in
1b1e0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 itialized.");...
1b1f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 .return(CKR_CRYP
1b200 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c TOKI_NOT_INITIAL
1b210 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b IZED);..}...CACK
1b220 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1b230 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 "Returning CKR_F
1b240 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
1b250 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 ORTED (%i)", CKR
1b260 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
1b270 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 PPORTED);...retu
1b280 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f rn(CKR_FUNCTION_
1b290 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
1b2a0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e }..CK_DEFINE_FUN
1b2b0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 CTION(CK_RV, C_C
1b2c0 6f 70 79 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45 opyObject)(CK_SE
1b2d0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 SSION_HANDLE hSe
1b2e0 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 ssion, CK_OBJECT
1b2f0 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c _HANDLE hObject,
1b300 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 CK_ATTRIBUTE_PT
1b310 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f R pTemplate, CK_
1b320 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43 ULONG ulCount, C
1b330 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f K_OBJECT_HANDLE_
1b340 50 54 52 20 70 68 4e 65 77 4f 62 6a 65 63 74 29 PTR phNewObject)
1b350 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {..CACKEY_DEBUG
1b360 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
1b370 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ");...if (!cacke
1b380 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b y_initialized) {
1b390 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1b3a0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
1b3b0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e Not initialized.
1b3c0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
1b3d0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 R_CRYPTOKI_NOT_I
1b3e0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
1b3f0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1b400 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
1b410 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f CKR_FUNCTION_NO
1b420 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 T_SUPPORTED (%i)
1b430 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f ", CKR_FUNCTION_
1b440 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
1b450 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e ..return(CKR_FUN
1b460 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
1b470 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 TED);.}..CK_DEFI
1b480 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 NE_FUNCTION(CK_R
1b490 56 2c 20 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65 V, C_DestroyObje
1b4a0 63 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 ct)(CK_SESSION_H
1b4b0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 ANDLE hSession,
1b4c0 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 CK_OBJECT_HANDLE
1b4d0 20 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43 hObject) {..CAC
1b4e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1b4f0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 ("Called.");...i
1b500 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 f (!cackey_initi
1b510 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b alized) {...CACK
1b520 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1b530 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 "Error. Not ini
1b540 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 tialized.");....
1b550 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 return(CKR_CRYPT
1b560 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 OKI_NOT_INITIALI
1b570 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 ZED);..}...CACKE
1b580 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1b590 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 Returning CKR_FU
1b5a0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
1b5b0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f RTED (%i)", CKR_
1b5c0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
1b5d0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 PORTED);...retur
1b5e0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e n(CKR_FUNCTION_N
1b5f0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d OT_SUPPORTED);.}
1b600 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 ..CK_DEFINE_FUNC
1b610 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 TION(CK_RV, C_Ge
1b620 74 4f 62 6a 65 63 74 53 69 7a 65 29 28 43 4b 5f tObjectSize)(CK_
1b630 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 SESSION_HANDLE h
1b640 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 Session, CK_OBJE
1b650 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 CT_HANDLE hObjec
1b660 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 t, CK_ULONG_PTR
1b670 70 75 6c 53 69 7a 65 29 20 7b 0a 09 43 41 43 4b pulSize) {..CACK
1b680 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1b690 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 "Called.");...if
1b6a0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 (!cackey_initia
1b6b0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 lized) {...CACKE
1b6c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1b6d0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 Error. Not init
1b6e0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 ialized.");....r
1b6f0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f eturn(CKR_CRYPTO
1b700 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a KI_NOT_INITIALIZ
1b710 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 ED);..}...CACKEY
1b720 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
1b730 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e eturning CKR_FUN
1b740 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
1b750 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 TED (%i)", CKR_F
1b760 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
1b770 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e ORTED);...return
1b780 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f (CKR_FUNCTION_NO
1b790 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a T_SUPPORTED);.}.
1b7a0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 .CK_DEFINE_FUNCT
1b7b0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 ION(CK_RV, C_Get
1b7c0 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 29 28 AttributeValue)(
1b7d0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c CK_SESSION_HANDL
1b7e0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f E hSession, CK_O
1b7f0 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 BJECT_HANDLE hOb
1b800 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 ject, CK_ATTRIBU
1b810 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 TE_PTR pTemplate
1b820 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 , CK_ULONG ulCou
1b830 6e 74 29 20 7b 0a 09 43 4b 5f 41 54 54 52 49 42 nt) {..CK_ATTRIB
1b840 55 54 45 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a UTE *curr_attr;.
1b850 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 .struct cackey_i
1b860 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 dentity *identit
1b870 79 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e y;..unsigned lon
1b880 67 20 69 64 65 6e 74 69 74 79 5f 69 64 78 2c 20 g identity_idx,
1b890 61 74 74 72 5f 69 64 78 2c 20 73 65 73 73 5f 61 attr_idx, sess_a
1b8a0 74 74 72 5f 69 64 78 2c 20 6e 75 6d 5f 69 64 73 ttr_idx, num_ids
1b8b0 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 ;..int mutex_ret
1b8c0 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 val;..CK_RV retv
1b8d0 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 43 4b al = CKR_OK;..CK
1b8e0 5f 56 4f 49 44 5f 50 54 52 20 70 56 61 6c 75 65 _VOID_PTR pValue
1b8f0 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 ;..CK_ULONG ulVa
1b900 6c 75 65 4c 65 6e 3b 0a 0a 09 43 41 43 4b 45 59 lueLen;...CACKEY
1b910 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 _DEBUG_PRINTF("C
1b920 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 alled.");...if (
1b930 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 !cackey_initiali
1b940 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f zed) {...CACKEY_
1b950 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
1b960 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 ror. Not initia
1b970 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 lized.");....ret
1b980 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 urn(CKR_CRYPTOKI
1b990 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 _NOT_INITIALIZED
1b9a0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 );..}...if (hSes
1b9b0 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 sion == 0 || hSe
1b9c0 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 ssion >= (sizeof
1b9d0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 (cackey_sessions
1b9e0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 ) / sizeof(cacke
1b9f0 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 y_sessions[0])))
1ba00 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
1ba10 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
1ba20 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 Session out of
1ba30 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 range.");......
1ba40 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 return(CKR_SESSI
1ba50 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 ON_HANDLE_INVALI
1ba60 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4f 62 D);..}...if (hOb
1ba70 6a 65 63 74 20 3d 3d 20 30 29 20 7b 0a 09 09 43 ject == 0) {...C
1ba80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1ba90 54 46 28 22 45 72 72 6f 72 2e 20 20 4f 62 6a 65 TF("Error. Obje
1baa0 63 74 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 ct handle out of
1bab0 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 range.");......
1bac0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 return(CKR_OBJEC
1bad0 54 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 T_HANDLE_INVALID
1bae0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 43 6f );..}...if (ulCo
1baf0 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a unt == 0) {.../*
1bb00 20 53 68 6f 72 74 20 63 69 72 63 75 69 74 2c 20 Short circuit,
1bb10 69 66 20 7a 65 72 6f 20 6f 62 6a 65 63 74 73 20 if zero objects
1bb20 77 65 72 65 20 73 70 65 63 69 66 69 65 64 20 72 were specified r
1bb30 65 74 75 72 6e 20 7a 65 72 6f 20 69 74 65 6d 73 eturn zero items
1bb40 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a immediately */.
1bb50 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1bb60 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
1bb70 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 CKR_OK (%i) (sh
1bb80 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 ort circuit)", C
1bb90 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 KR_OK);....retur
1bba0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 n(CKR_OK);..}...
1bbb0 69 66 20 28 70 54 65 6d 70 6c 61 74 65 20 3d 3d if (pTemplate ==
1bbc0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 NULL) {...CACKE
1bbd0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1bbe0 45 72 72 6f 72 2e 20 20 70 54 65 6d 70 6c 61 74 Error. pTemplat
1bbf0 65 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 e is NULL.");...
1bc00 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 .return(CKR_ARGU
1bc10 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a MENTS_BAD);..}..
1bc20 09 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3d 20 .identity_idx =
1bc30 68 4f 62 6a 65 63 74 20 2d 20 31 3b 0a 0a 09 6d hObject - 1;...m
1bc40 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 utex_retval = ca
1bc50 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 ckey_mutex_lock(
1bc60 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
1bc70 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 ..if (mutex_retv
1bc80 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 al != 0) {...CAC
1bc90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1bca0 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e ("Error. Lockin
1bcb0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 g failed.");....
1bcc0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 return(CKR_GENER
1bcd0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 AL_ERROR);..}...
1bce0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 if (!cackey_sess
1bcf0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 ions[hSession].a
1bd00 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 ctive) {...cacke
1bd10 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
1bd20 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
1bd30 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1bd40 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
1bd50 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 Session not acti
1bd60 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 ve.");......retu
1bd70 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 rn(CKR_SESSION_H
1bd80 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a ANDLE_INVALID);.
1bd90 09 7d 0a 0a 09 6e 75 6d 5f 69 64 73 20 3d 20 63 .}...num_ids = c
1bda0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
1bdb0 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 Session].identit
1bdc0 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69 66 20 ies_count;...if
1bdd0 28 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3e 3d (identity_idx >=
1bde0 20 6e 75 6d 5f 69 64 73 29 20 7b 0a 09 09 63 61 num_ids) {...ca
1bdf0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 ckey_mutex_unloc
1be00 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
1be10 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 );....CACKEY_DEB
1be20 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
1be30 2e 20 20 4f 62 6a 65 63 74 20 68 61 6e 64 6c 65 . Object handle
1be40 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 out of range.
1be50 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3d 20 25 identity_idx = %
1be60 6c 75 2c 20 6e 75 6d 5f 69 64 73 20 3d 20 25 6c lu, num_ids = %l
1be70 75 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c u.", (unsigned l
1be80 6f 6e 67 29 20 69 64 65 6e 74 69 74 79 5f 69 64 ong) identity_id
1be90 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e x, (unsigned lon
1bea0 67 29 20 6e 75 6d 5f 69 64 73 29 3b 0a 0a 09 09 g) num_ids);....
1beb0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 return(CKR_OBJEC
1bec0 54 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 T_HANDLE_INVALID
1bed0 29 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74 69 74 79 );..}...identity
1bee0 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 = &cackey_sessi
1bef0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 ons[hSession].id
1bf00 65 6e 74 69 74 69 65 73 5b 69 64 65 6e 74 69 74 entities[identit
1bf10 79 5f 69 64 78 5d 3b 0a 0a 09 66 6f 72 20 28 61 y_idx];...for (a
1bf20 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 61 74 74 ttr_idx = 0; att
1bf30 72 5f 69 64 78 20 3c 20 75 6c 43 6f 75 6e 74 3b r_idx < ulCount;
1bf40 20 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 attr_idx++) {..
1bf50 09 63 75 72 72 5f 61 74 74 72 20 3d 20 26 70 54 .curr_attr = &pT
1bf60 65 6d 70 6c 61 74 65 5b 61 74 74 72 5f 69 64 78 emplate[attr_idx
1bf70 5d 3b 0a 0a 09 09 70 56 61 6c 75 65 20 3d 20 4e ];....pValue = N
1bf80 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65 4c 65 ULL;...ulValueLe
1bf90 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 n = (CK_LONG) -1
1bfa0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 ;....CACKEY_DEBU
1bfb0 47 5f 50 52 49 4e 54 46 28 22 4c 6f 6f 6b 69 6e G_PRINTF("Lookin
1bfc0 67 20 66 6f 72 20 61 74 74 72 69 62 75 74 65 20 g for attribute
1bfd0 30 78 25 30 38 6c 78 20 28 69 64 65 6e 74 69 74 0x%08lx (identit
1bfe0 79 3a 25 6c 75 29 20 2e 2e 2e 22 2c 20 28 75 6e y:%lu) ...", (un
1bff0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 signed long) cur
1c000 72 5f 61 74 74 72 2d 3e 74 79 70 65 2c 20 28 75 r_attr->type, (u
1c010 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 nsigned long) id
1c020 65 6e 74 69 74 79 5f 69 64 78 29 3b 0a 0a 09 09 entity_idx);....
1c030 66 6f 72 20 28 73 65 73 73 5f 61 74 74 72 5f 69 for (sess_attr_i
1c040 64 78 20 3d 20 30 3b 20 73 65 73 73 5f 61 74 74 dx = 0; sess_att
1c050 72 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74 79 r_idx < identity
1c060 2d 3e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 ->attributes_cou
1c070 6e 74 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64 nt; sess_attr_id
1c080 78 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28 69 64 x++) {....if (id
1c090 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 entity->attribut
1c0a0 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 es[sess_attr_idx
1c0b0 5d 2e 74 79 70 65 20 3d 3d 20 63 75 72 72 5f 61 ].type == curr_a
1c0c0 74 74 72 2d 3e 74 79 70 65 29 20 7b 0a 09 09 09 ttr->type) {....
1c0d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1c0e0 49 4e 54 46 28 22 20 2e 2e 2e 20 66 6f 75 6e 64 INTF(" ... found
1c0f0 20 69 74 2c 20 70 56 61 6c 75 65 20 3d 20 25 70 it, pValue = %p
1c100 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 25 , ulValueLen = %
1c110 6c 75 22 2c 20 69 64 65 6e 74 69 74 79 2d 3e 61 lu", identity->a
1c120 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 ttributes[sess_a
1c130 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 2c ttr_idx].pValue,
1c140 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 identity->attri
1c150 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f butes[sess_attr_
1c160 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 idx].ulValueLen)
1c170 3b 0a 09 09 09 09 0a 09 09 09 09 70 56 61 6c 75 ;..........pValu
1c180 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 e = identity->at
1c190 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 tributes[sess_at
1c1a0 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 3b 0a tr_idx].pValue;.
1c1b0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d ....ulValueLen =
1c1c0 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 identity->attri
1c1d0 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f butes[sess_attr_
1c1e0 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 3b idx].ulValueLen;
1c1f0 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 ....}...}....if
1c200 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c (curr_attr->pVal
1c210 75 65 20 26 26 20 70 56 61 6c 75 65 29 20 7b 0a ue && pValue) {.
1c220 09 09 09 69 66 20 28 63 75 72 72 5f 61 74 74 72 ...if (curr_attr
1c230 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d 20 ->ulValueLen >=
1c240 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09 ulValueLen) {...
1c250 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61 74 ..memcpy(curr_at
1c260 74 72 2d 3e 70 56 61 6c 75 65 2c 20 70 56 61 6c tr->pValue, pVal
1c270 75 65 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b ue, ulValueLen);
1c280 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 ....} else {....
1c290 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 .ulValueLen = (C
1c2a0 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 09 K_LONG) -1;.....
1c2b0 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 .retval = CKR_BU
1c2c0 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a FFER_TOO_SMALL;.
1c2d0 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 75 72 72 ...}...}....curr
1c2e0 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 _attr->ulValueLe
1c2f0 6e 20 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a n = ulValueLen;.
1c300 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 .}...mutex_retva
1c310 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 l = cackey_mutex
1c320 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 _unlock(cackey_b
1c330 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 iglock);..if (mu
1c340 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 tex_retval != 0)
1c350 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
1c360 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
1c370 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c Unlocking fail
1c380 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
1c390 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 (CKR_GENERAL_ERR
1c3a0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65 OR);..}...if (re
1c3b0 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 41 54 54 52 tval == CKR_ATTR
1c3c0 49 42 55 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c IBUTE_TYPE_INVAL
1c3d0 49 44 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ID) {...CACKEY_D
1c3e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
1c3f0 75 72 6e 69 6e 67 20 43 4b 52 5f 41 54 54 52 49 urning CKR_ATTRI
1c400 42 55 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49 BUTE_TYPE_INVALI
1c410 44 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20 72 D (%i)", (int) r
1c420 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 etval);..} else
1c430 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b if (retval == CK
1c440 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 R_BUFFER_TOO_SMA
1c450 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 LL) {...CACKEY_D
1c460 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
1c470 75 72 6e 69 6e 67 20 43 4b 52 5f 42 55 46 46 45 urning CKR_BUFFE
1c480 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28 25 69 29 R_TOO_SMALL (%i)
1c490 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 ", (int) retval)
1c4a0 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 72 65 ;..} else if (re
1c4b0 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20 tval == CKR_OK)
1c4c0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
1c4d0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
1c4e0 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c ng CKR_OK (%i)",
1c4f0 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a (int) retval);.
1c500 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b .} else {...CACK
1c510 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1c520 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 "Returning %i",
1c530 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 (int) retval);..
1c540 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 }...return(retva
1c550 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 l);.}..CK_DEFINE
1c560 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c _FUNCTION(CK_RV,
1c570 20 43 5f 53 65 74 41 74 74 72 69 62 75 74 65 56 C_SetAttributeV
1c580 61 6c 75 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e alue)(CK_SESSION
1c590 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e _HANDLE hSession
1c5a0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 , CK_OBJECT_HAND
1c5b0 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 LE hObject, CK_A
1c5c0 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 TTRIBUTE_PTR pTe
1c5d0 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 mplate, CK_ULONG
1c5e0 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41 43 ulCount) {..CAC
1c5f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1c600 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 ("Called.");...i
1c610 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 f (!cackey_initi
1c620 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b alized) {...CACK
1c630 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1c640 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 "Error. Not ini
1c650 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 tialized.");....
1c660 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 return(CKR_CRYPT
1c670 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 OKI_NOT_INITIALI
1c680 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 ZED);..}...CACKE
1c690 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1c6a0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 Returning CKR_FU
1c6b0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
1c6c0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f RTED (%i)", CKR_
1c6d0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
1c6e0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 PORTED);...retur
1c6f0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e n(CKR_FUNCTION_N
1c700 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d OT_SUPPORTED);.}
1c710 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 ..CK_DEFINE_FUNC
1c720 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 TION(CK_RV, C_Fi
1c730 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 29 28 43 ndObjectsInit)(C
1c740 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 K_SESSION_HANDLE
1c750 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 41 54 hSession, CK_AT
1c760 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d TRIBUTE_PTR pTem
1c770 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 plate, CK_ULONG
1c780 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 53 ulCount) {..CK_S
1c790 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 LOT_ID slotID;..
1c7a0 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c int mutex_retval
1c7b0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ;...CACKEY_DEBUG
1c7c0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
1c7d0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ");...if (!cacke
1c7e0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b y_initialized) {
1c7f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1c800 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
1c810 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e Not initialized.
1c820 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
1c830 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 R_CRYPTOKI_NOT_I
1c840 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
1c850 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d ..if (hSession =
1c860 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 = 0 || hSession
1c870 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 >= (sizeof(cacke
1c880 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 y_sessions) / si
1c890 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 zeof(cackey_sess
1c8a0 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 ions[0]))) {...C
1c8b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1c8c0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 TF("Error. Sess
1c8d0 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 ion out of range
1c8e0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e .");......return
1c8f0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e (CKR_SESSION_HAN
1c900 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d DLE_INVALID);..}
1c910 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 ...mutex_retval
1c920 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c = cackey_mutex_l
1c930 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
1c940 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f ck);..if (mutex_
1c950 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 retval != 0) {..
1c960 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1c970 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f INTF("Error. Lo
1c980 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b cking failed.");
1c990 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 ....return(CKR_G
1c9a0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 ENERAL_ERROR);..
1c9b0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f }...if (!cackey_
1c9c0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
1c9d0 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 n].active) {...c
1c9e0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f ackey_mutex_unlo
1c9f0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
1ca00 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 k);....CACKEY_DE
1ca10 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
1ca20 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 r. Session not
1ca30 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 active.");......
1ca40 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 return(CKR_SESSI
1ca50 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 ON_HANDLE_INVALI
1ca60 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 D);..}...if (cac
1ca70 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
1ca80 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 ssion].search_ac
1ca90 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 tive) {...cackey
1caa0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 _mutex_unlock(ca
1cab0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a ckey_biglock);..
1cac0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1cad0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 RINTF("Error. S
1cae0 65 61 72 63 68 20 61 6c 72 65 61 64 79 20 61 63 earch already ac
1caf0 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 tive.");......re
1cb00 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 turn(CKR_OPERATI
1cb10 4f 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a ON_ACTIVE);..}..
1cb20 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 .slotID = cackey
1cb30 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
1cb40 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 on].slotID;...if
1cb50 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 (slotID < 0 ||
1cb60 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f slotID >= (sizeo
1cb70 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 f(cackey_slots)
1cb80 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f / sizeof(cackey_
1cb90 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 slots[0]))) {...
1cba0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1cbb0 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 NTF("Error. Inva
1cbc0 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 lid slot request
1cbd0 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 ed (%lu), outsid
1cbe0 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 e of valid range
1cbf0 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 ", slotID);....r
1cc00 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 eturn(CKR_GENERA
1cc10 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 L_ERROR);..}...i
1cc20 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b f (cackey_slots[
1cc30 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d slotID].active =
1cc40 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f = 0) {...CACKEY_
1cc50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
1cc60 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f ror. Invalid slo
1cc70 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 t requested (%lu
1cc80 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 ), slot not curr
1cc90 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 ently active", s
1cca0 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 lotID);....cacke
1ccb0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
1ccc0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
1ccd0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 ...return(CKR_GE
1cce0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d NERAL_ERROR);..}
1ccf0 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c ...if (cackey_sl
1cd00 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c 6f 74 ots[slotID].slot
1cd10 5f 72 65 73 65 74 29 20 7b 0a 09 09 43 41 43 4b _reset) {...CACK
1cd20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1cd30 22 54 68 65 20 73 6c 6f 74 20 68 61 73 20 62 65 "The slot has be
1cd40 65 6e 20 72 65 73 65 74 20 73 69 6e 63 65 20 77 en reset since w
1cd50 65 20 6c 61 73 74 20 6c 6f 6f 6b 65 64 20 66 6f e last looked fo
1cd60 72 20 69 64 65 6e 74 69 74 69 65 73 20 2d 2d 20 r identities --
1cd70 72 65 73 63 61 6e 6e 69 6e 67 22 29 3b 0a 0a 09 rescanning");...
1cd80 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 .if (cackey_sess
1cd90 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 ions[hSession].i
1cda0 64 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c dentities != NUL
1cdb0 4c 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 66 L) {....cackey_f
1cdc0 72 65 65 5f 69 64 65 6e 74 69 74 69 65 73 28 63 ree_identities(c
1cdd0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
1cde0 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 Session].identit
1cdf0 69 65 73 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 ies, cackey_sess
1ce00 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 ions[hSession].i
1ce10 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 dentities_count)
1ce20 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 ;.....cackey_ses
1ce30 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
1ce40 69 64 65 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c identities = NUL
1ce50 4c 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 L;....cackey_ses
1ce60 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
1ce70 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 identities_count
1ce80 20 3d 20 30 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 = 0;...}....if
1ce90 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c (cackey_slots[sl
1cea0 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 21 3d 20 4e otID].label != N
1ceb0 55 4c 4c 29 20 7b 0a 09 09 09 66 72 65 65 28 63 ULL) {....free(c
1cec0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 ackey_slots[slot
1ced0 49 44 5d 2e 6c 61 62 65 6c 29 3b 0a 09 09 09 63 ID].label);....c
1cee0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 ackey_slots[slot
1cef0 49 44 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c ID].label = NULL
1cf00 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f ;...}....cackey_
1cf10 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c slots[slotID].sl
1cf20 6f 74 5f 72 65 73 65 74 20 3d 20 30 3b 0a 09 09 ot_reset = 0;...
1cf30 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f cackey_slots[slo
1cf40 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 tID].token_flags
1cf50 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 = CKF_LOGIN_REQ
1cf60 55 49 52 45 44 3b 0a 09 7d 0a 0a 09 69 66 20 28 UIRED;..}...if (
1cf70 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
1cf80 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 hSession].identi
1cf90 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a ties == NULL) {.
1cfa0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e ..cackey_session
1cfb0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e s[hSession].iden
1cfc0 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f tities = cackey_
1cfd0 72 65 61 64 5f 69 64 65 6e 74 69 74 69 65 73 28 read_identities(
1cfe0 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c &cackey_slots[sl
1cff0 6f 74 49 44 5d 2c 20 26 63 61 63 6b 65 79 5f 73 otID], &cackey_s
1d000 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
1d010 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 ].identities_cou
1d020 6e 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 54 nt);..}...if (pT
1d030 65 6d 70 6c 61 74 65 20 21 3d 20 4e 55 4c 4c 29 emplate != NULL)
1d040 20 7b 0a 09 09 69 66 20 28 75 6c 43 6f 75 6e 74 {...if (ulCount
1d050 20 21 3d 20 30 29 20 7b 0a 09 09 09 63 61 63 6b != 0) {....cack
1d060 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
1d070 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 sion].search_que
1d080 72 79 5f 63 6f 75 6e 74 20 3d 20 75 6c 43 6f 75 ry_count = ulCou
1d090 6e 74 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 nt;....cackey_se
1d0a0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
1d0b0 2e 73 65 61 72 63 68 5f 71 75 65 72 79 20 3d 20 .search_query =
1d0c0 6d 61 6c 6c 6f 63 28 75 6c 43 6f 75 6e 74 20 2a malloc(ulCount *
1d0d0 20 73 69 7a 65 6f 66 28 2a 70 54 65 6d 70 6c 61 sizeof(*pTempla
1d0e0 74 65 29 29 3b 0a 0a 09 09 09 6d 65 6d 63 70 79 te));.....memcpy
1d0f0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 (cackey_sessions
1d100 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 [hSession].searc
1d110 68 5f 71 75 65 72 79 2c 20 70 54 65 6d 70 6c 61 h_query, pTempla
1d120 74 65 2c 20 75 6c 43 6f 75 6e 74 20 2a 20 73 69 te, ulCount * si
1d130 7a 65 6f 66 28 2a 70 54 65 6d 70 6c 61 74 65 29 zeof(*pTemplate)
1d140 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 );...} else {...
1d150 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 .cackey_sessions
1d160 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 [hSession].searc
1d170 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20 h_query_count =
1d180 30 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 0;....cackey_ses
1d190 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
1d1a0 73 65 61 72 63 68 5f 71 75 65 72 79 20 3d 20 4e search_query = N
1d1b0 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 ULL;...}..} else
1d1c0 20 7b 0a 09 09 69 66 20 28 75 6c 43 6f 75 6e 74 {...if (ulCount
1d1d0 20 21 3d 20 30 29 20 7b 0a 09 09 09 63 61 63 6b != 0) {....cack
1d1e0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 ey_mutex_unlock(
1d1f0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
1d200 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
1d210 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
1d220 20 20 53 65 61 72 63 68 20 71 75 65 72 79 20 73 Search query s
1d230 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c pecified as NULL
1d240 2c 20 62 75 74 20 6e 75 6d 62 65 72 20 6f 66 20 , but number of
1d250 71 75 65 72 79 20 74 65 72 6d 73 20 6e 6f 74 20 query terms not
1d260 73 70 65 63 69 66 69 65 64 20 61 73 20 30 2e 22 specified as 0."
1d270 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b );.....return(CK
1d280 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 R_ARGUMENTS_BAD)
1d290 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f ;...}....cackey_
1d2a0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
1d2b0 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f n].search_query_
1d2c0 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 63 61 63 count = 0;...cac
1d2d0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
1d2e0 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 ssion].search_qu
1d2f0 65 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a ery = NULL;..}..
1d300 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 .cackey_sessions
1d310 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 [hSession].searc
1d320 68 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 63 h_active = 1;..c
1d330 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
1d340 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f Session].search_
1d350 63 75 72 72 5f 69 64 20 3d 20 30 3b 0a 0a 09 6d curr_id = 0;...m
1d360 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 utex_retval = ca
1d370 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 ckey_mutex_unloc
1d380 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
1d390 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 );..if (mutex_re
1d3a0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 tval != 0) {...C
1d3b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1d3c0 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f TF("Error. Unlo
1d3d0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b cking failed.");
1d3e0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 ....return(CKR_G
1d3f0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 ENERAL_ERROR);..
1d400 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 }...CACKEY_DEBUG
1d410 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
1d420 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c ng CKR_OK (%i)",
1d430 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 CKR_OK);...retu
1d440 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 rn(CKR_OK);.}..C
1d450 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f K_DEFINE_FUNCTIO
1d460 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f N(CK_RV, C_FindO
1d470 62 6a 65 63 74 73 29 28 43 4b 5f 53 45 53 53 49 bjects)(CK_SESSI
1d480 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 ON_HANDLE hSessi
1d490 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 on, CK_OBJECT_HA
1d4a0 4e 44 4c 45 5f 50 54 52 20 70 68 4f 62 6a 65 63 NDLE_PTR phObjec
1d4b0 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4d 61 t, CK_ULONG ulMa
1d4c0 78 4f 62 6a 65 63 74 43 6f 75 6e 74 2c 20 43 4b xObjectCount, CK
1d4d0 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4f 62 _ULONG_PTR pulOb
1d4e0 6a 65 63 74 43 6f 75 6e 74 29 20 7b 0a 09 73 74 jectCount) {..st
1d4f0 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e ruct cackey_iden
1d500 74 69 74 79 20 2a 63 75 72 72 5f 69 64 3b 0a 09 tity *curr_id;..
1d510 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 63 75 CK_ATTRIBUTE *cu
1d520 72 72 5f 61 74 74 72 3b 0a 09 43 4b 5f 55 4c 4f rr_attr;..CK_ULO
1d530 4e 47 20 63 75 72 72 5f 69 64 5f 69 64 78 2c 20 NG curr_id_idx,
1d540 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 2c curr_out_id_idx,
1d550 20 63 75 72 72 5f 61 74 74 72 5f 69 64 78 2c 20 curr_attr_idx,
1d560 73 65 73 73 5f 61 74 74 72 5f 69 64 78 3b 0a 09 sess_attr_idx;..
1d570 43 4b 5f 55 4c 4f 4e 47 20 6d 61 74 63 68 65 64 CK_ULONG matched
1d580 5f 63 6f 75 6e 74 2c 20 70 72 65 76 5f 6d 61 74 _count, prev_mat
1d590 63 68 65 64 5f 63 6f 75 6e 74 3b 0a 09 69 6e 74 ched_count;..int
1d5a0 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a mutex_retval;..
1d5b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1d5c0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
1d5d0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 ...if (!cackey_i
1d5e0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 nitialized) {...
1d5f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1d600 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 NTF("Error. Not
1d610 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b initialized.");
1d620 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 ....return(CKR_C
1d630 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 RYPTOKI_NOT_INIT
1d640 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 IALIZED);..}...i
1d650 66 20 28 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e f (pulObjectCoun
1d660 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 t == NULL) {...C
1d670 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1d680 54 46 28 22 45 72 72 6f 72 2e 20 20 70 75 6c 4f TF("Error. pulO
1d690 62 6a 65 63 74 43 6f 75 6e 74 20 69 73 20 4e 55 bjectCount is NU
1d6a0 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e LL.");....return
1d6b0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 (CKR_ARGUMENTS_B
1d6c0 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 68 AD);..}...if (ph
1d6d0 4f 62 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c 20 26 Object == NULL &
1d6e0 26 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 & ulMaxObjectCou
1d6f0 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 nt == 0) {.../*
1d700 53 68 6f 72 74 20 63 69 72 63 75 69 74 2c 20 69 Short circuit, i
1d710 66 20 7a 65 72 6f 20 6f 62 6a 65 63 74 73 20 77 f zero objects w
1d720 65 72 65 20 73 70 65 63 69 66 69 65 64 20 72 65 ere specified re
1d730 74 75 72 6e 20 7a 65 72 6f 20 69 74 65 6d 73 20 turn zero items
1d740 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a 09 immediately */..
1d750 09 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 .*pulObjectCount
1d760 20 3d 20 30 3b 0a 0a 09 09 43 41 43 4b 45 59 5f = 0;....CACKEY_
1d770 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
1d780 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 turning CKR_OK (
1d790 25 69 29 20 28 73 68 6f 72 74 20 63 69 72 63 75 %i) (short circu
1d7a0 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a it)", CKR_OK);..
1d7b0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 ..return(CKR_OK)
1d7c0 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 68 4f 62 6a ;..}...if (phObj
1d7d0 65 63 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ect == NULL) {..
1d7e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1d7f0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70 68 INTF("Error. ph
1d800 4f 62 6a 65 63 74 20 69 73 20 4e 55 4c 4c 2e 22 Object is NULL."
1d810 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
1d820 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b _ARGUMENTS_BAD);
1d830 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 4d 61 78 4f ..}...if (ulMaxO
1d840 62 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20 30 29 bjectCount == 0)
1d850 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
1d860 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
1d870 20 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 Maximum number
1d880 20 6f 66 20 6f 62 6a 65 63 74 73 20 73 70 65 63 of objects spec
1d890 69 66 69 65 64 20 61 73 20 7a 65 72 6f 2e 22 29 ified as zero.")
1d8a0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
1d8b0 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a ARGUMENTS_BAD);.
1d8c0 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f .}...if (hSessio
1d8d0 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 n == 0 || hSessi
1d8e0 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 on >= (sizeof(ca
1d8f0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f ckey_sessions) /
1d900 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 sizeof(cackey_s
1d910 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a essions[0]))) {.
1d920 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1d930 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 RINTF("Error. S
1d940 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 ession out of ra
1d950 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 nge.");......ret
1d960 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f urn(CKR_SESSION_
1d970 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b HANDLE_INVALID);
1d980 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 ..}...mutex_retv
1d990 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 al = cackey_mute
1d9a0 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 x_lock(cackey_bi
1d9b0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 glock);..if (mut
1d9c0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 ex_retval != 0)
1d9d0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
1d9e0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
1d9f0 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e Locking failed.
1da00 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
1da10 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 R_GENERAL_ERROR)
1da20 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b ;..}...if (!cack
1da30 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
1da40 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a sion].active) {.
1da50 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 ..cackey_mutex_u
1da60 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 nlock(cackey_big
1da70 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 lock);....CACKEY
1da80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
1da90 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e rror. Session n
1daa0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 ot active.");...
1dab0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 ...return(CKR_SE
1dac0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 SSION_HANDLE_INV
1dad0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 ALID);..}...if (
1dae0 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 !cackey_sessions
1daf0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 [hSession].searc
1db00 68 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 h_active) {...ca
1db10 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 ckey_mutex_unloc
1db20 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
1db30 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 );....CACKEY_DEB
1db40 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
1db50 2e 20 20 53 65 61 72 63 68 20 6e 6f 74 20 61 63 . Search not ac
1db60 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 tive.");......re
1db70 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 turn(CKR_OPERATI
1db80 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a ON_NOT_INITIALIZ
1db90 45 44 29 3b 0a 09 7d 0a 0a 09 63 75 72 72 5f 6f ED);..}...curr_o
1dba0 75 74 5f 69 64 5f 69 64 78 20 3d 20 30 3b 0a 09 ut_id_idx = 0;..
1dbb0 66 6f 72 20 28 63 75 72 72 5f 69 64 5f 69 64 78 for (curr_id_idx
1dbc0 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f = cackey_sessio
1dbd0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 ns[hSession].sea
1dbe0 72 63 68 5f 63 75 72 72 5f 69 64 3b 20 63 75 72 rch_curr_id; cur
1dbf0 72 5f 69 64 5f 69 64 78 20 3c 20 63 61 63 6b 65 r_id_idx < cacke
1dc00 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
1dc10 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f ion].identities_
1dc20 63 6f 75 6e 74 20 26 26 20 75 6c 4d 61 78 4f 62 count && ulMaxOb
1dc30 6a 65 63 74 43 6f 75 6e 74 3b 20 63 75 72 72 5f jectCount; curr_
1dc40 69 64 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 63 75 id_idx++) {...cu
1dc50 72 72 5f 69 64 20 3d 20 26 63 61 63 6b 65 79 5f rr_id = &cackey_
1dc60 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
1dc70 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 63 75 n].identities[cu
1dc80 72 72 5f 69 64 5f 69 64 78 5d 3b 0a 0a 09 09 43 rr_id_idx];....C
1dc90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1dca0 54 46 28 22 50 72 6f 63 65 73 73 69 6e 67 20 69 TF("Processing i
1dcb0 64 65 6e 74 69 74 79 3a 25 6c 75 22 2c 20 28 75 dentity:%lu", (u
1dcc0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 nsigned long) cu
1dcd0 72 72 5f 69 64 5f 69 64 78 29 3b 0a 0a 09 09 6d rr_id_idx);....m
1dce0 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 20 30 atched_count = 0
1dcf0 3b 0a 0a 09 09 66 6f 72 20 28 63 75 72 72 5f 61 ;....for (curr_a
1dd00 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 63 75 72 ttr_idx = 0; cur
1dd10 72 5f 61 74 74 72 5f 69 64 78 20 3c 20 63 61 63 r_attr_idx < cac
1dd20 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
1dd30 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 ssion].search_qu
1dd40 65 72 79 5f 63 6f 75 6e 74 3b 20 63 75 72 72 5f ery_count; curr_
1dd50 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 attr_idx++) {...
1dd60 09 70 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f .prev_matched_co
1dd70 75 6e 74 20 3d 20 6d 61 74 63 68 65 64 5f 63 6f unt = matched_co
1dd80 75 6e 74 3b 0a 0a 09 09 09 63 75 72 72 5f 61 74 unt;.....curr_at
1dd90 74 72 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 tr = &cackey_ses
1dda0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
1ddb0 73 65 61 72 63 68 5f 71 75 65 72 79 5b 63 75 72 search_query[cur
1ddc0 72 5f 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 r_attr_idx];....
1ddd0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1dde0 49 4e 54 46 28 22 20 20 43 68 65 63 6b 69 6e 67 INTF(" Checking
1ddf0 20 66 6f 72 20 61 74 74 72 69 62 75 74 65 20 30 for attribute 0
1de00 78 25 30 38 6c 78 20 69 6e 20 69 64 65 6e 74 69 x%08lx in identi
1de10 74 79 3a 25 69 2e 2e 2e 22 2c 20 28 75 6e 73 69 ty:%i...", (unsi
1de20 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f gned long) curr_
1de30 61 74 74 72 2d 3e 74 79 70 65 2c 20 28 69 6e 74 attr->type, (int
1de40 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a ) curr_id_idx);.
1de50 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1de60 50 52 49 4e 54 42 55 46 28 22 20 20 20 20 56 61 PRINTBUF(" Va
1de70 6c 75 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 3a lue looking for:
1de80 22 2c 20 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 ", curr_attr->pV
1de90 61 6c 75 65 2c 20 63 75 72 72 5f 61 74 74 72 2d alue, curr_attr-
1dea0 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 >ulValueLen);...
1deb0 09 09 66 6f 72 20 28 73 65 73 73 5f 61 74 74 72 ..for (sess_attr
1dec0 5f 69 64 78 20 3d 20 30 3b 20 73 65 73 73 5f 61 _idx = 0; sess_a
1ded0 74 74 72 5f 69 64 78 20 3c 20 63 75 72 72 5f 69 ttr_idx < curr_i
1dee0 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5f 63 6f d->attributes_co
1def0 75 6e 74 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 unt; sess_attr_i
1df00 64 78 2b 2b 29 20 7b 0a 09 09 09 09 69 66 20 28 dx++) {.....if (
1df10 63 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 curr_id->attribu
1df20 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 tes[sess_attr_id
1df30 78 5d 2e 74 79 70 65 20 3d 3d 20 63 75 72 72 5f x].type == curr_
1df40 61 74 74 72 2d 3e 74 79 70 65 29 20 7b 0a 09 09 attr->type) {...
1df50 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1df60 50 52 49 4e 54 46 28 22 20 20 20 20 2e 2e 2e 20 PRINTF(" ...
1df70 66 6f 75 6e 64 20 6d 61 74 63 68 69 6e 67 20 74 found matching t
1df80 79 70 65 20 2e 2e 2e 22 29 3b 0a 09 09 09 09 09 ype ...");......
1df90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1dfa0 4e 54 42 55 46 28 22 20 20 20 20 2e 2e 2e 20 6f NTBUF(" ... o
1dfb0 75 72 20 76 61 6c 75 65 3a 22 2c 20 63 75 72 72 ur value:", curr
1dfc0 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5b _id->attributes[
1dfd0 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 70 sess_attr_idx].p
1dfe0 56 61 6c 75 65 2c 20 63 75 72 72 5f 69 64 2d 3e Value, curr_id->
1dff0 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f attributes[sess_
1e000 61 74 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 attr_idx].ulValu
1e010 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 09 69 66 20 eLen);.......if
1e020 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c (curr_attr->pVal
1e030 75 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 ue == NULL) {...
1e040 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
1e050 5f 50 52 49 4e 54 46 28 22 20 20 20 20 20 20 20 _PRINTF("
1e060 2e 2e 2e 20 66 6f 75 6e 64 20 77 69 6c 64 63 61 ... found wildca
1e070 72 64 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09 09 rd match");.....
1e080 09 09 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 ...matched_count
1e090 2b 2b 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b ++;........break
1e0a0 3b 0a 09 09 09 09 09 7d 0a 0a 20 09 09 09 09 09 ;......}.. .....
1e0b0 69 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 75 if (curr_attr->u
1e0c0 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d 20 63 75 72 lValueLen == cur
1e0d0 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73 r_id->attributes
1e0e0 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e [sess_attr_idx].
1e0f0 75 6c 56 61 6c 75 65 4c 65 6e 20 26 26 20 6d 65 ulValueLen && me
1e100 6d 63 6d 70 28 63 75 72 72 5f 61 74 74 72 2d 3e mcmp(curr_attr->
1e110 70 56 61 6c 75 65 2c 20 63 75 72 72 5f 69 64 2d pValue, curr_id-
1e120 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 >attributes[sess
1e130 5f 61 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 _attr_idx].pValu
1e140 65 2c 20 63 75 72 72 5f 69 64 2d 3e 61 74 74 72 e, curr_id->attr
1e150 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 ibutes[sess_attr
1e160 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e _idx].ulValueLen
1e170 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 09 09 ) == 0) {.......
1e180 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1e190 4e 54 46 28 22 20 20 20 20 20 20 20 2e 2e 2e 20 NTF(" ...
1e1a0 66 6f 75 6e 64 20 65 78 61 63 74 20 6d 61 74 63 found exact matc
1e1b0 68 22 29 3b 0a 0a 09 09 09 09 09 09 6d 61 74 63 h");........matc
1e1c0 68 65 64 5f 63 6f 75 6e 74 2b 2b 3b 0a 0a 09 09 hed_count++;....
1e1d0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 ....break;......
1e1e0 7d 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 }.....}....}....
1e1f0 09 2f 2a 20 49 66 20 74 68 65 20 61 74 74 72 69 ./* If the attri
1e200 62 75 74 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 bute could not b
1e210 65 20 6d 61 74 63 68 65 64 2c 20 64 6f 20 6e 6f e matched, do no
1e220 74 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20 61 t try to match a
1e230 64 64 69 74 69 6f 6e 61 6c 20 61 74 74 72 69 62 dditional attrib
1e240 75 74 65 73 20 2a 2f 0a 09 09 09 69 66 20 28 70 utes */....if (p
1e250 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e rev_matched_coun
1e260 74 20 3d 3d 20 6d 61 74 63 68 65 64 5f 63 6f 75 t == matched_cou
1e270 6e 74 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b nt) {.....break;
1e280 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 ....}...}....if
1e290 28 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d (matched_count =
1e2a0 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e = cackey_session
1e2b0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 s[hSession].sear
1e2c0 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 29 20 ch_query_count)
1e2d0 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {....CACKEY_DEBU
1e2e0 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 G_PRINTF(" ...
1e2f0 41 6c 6c 20 25 69 20 61 74 74 72 69 62 75 74 65 All %i attribute
1e300 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 66 6f s checked for fo
1e310 75 6e 64 2c 20 61 64 64 69 6e 67 20 69 64 65 6e und, adding iden
1e320 74 69 74 79 3a 25 69 20 74 6f 20 72 65 74 75 72 tity:%i to retur
1e330 6e 65 64 20 6c 69 73 74 22 2c 20 28 69 6e 74 29 ned list", (int)
1e340 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 cackey_sessions
1e350 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 [hSession].searc
1e360 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 2c 20 28 h_query_count, (
1e370 69 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64 78 int) curr_id_idx
1e380 29 3b 0a 0a 09 09 09 70 68 4f 62 6a 65 63 74 5b );.....phObject[
1e390 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 5d curr_out_id_idx]
1e3a0 20 3d 20 63 75 72 72 5f 69 64 5f 69 64 78 20 2b = curr_id_idx +
1e3b0 20 31 3b 0a 0a 09 09 09 75 6c 4d 61 78 4f 62 6a 1;.....ulMaxObj
1e3c0 65 63 74 43 6f 75 6e 74 2d 2d 3b 0a 0a 09 09 09 ectCount--;.....
1e3d0 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 2b curr_out_id_idx+
1e3e0 2b 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 +;...} else {...
1e3f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1e400 49 4e 54 46 28 22 20 20 2e 2e 2e 20 4e 6f 74 20 INTF(" ... Not
1e410 61 6c 6c 20 25 69 20 28 6f 6e 6c 79 20 66 6f 75 all %i (only fou
1e420 6e 64 20 25 69 29 20 61 74 74 72 69 62 75 74 65 nd %i) attribute
1e430 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 66 6f s checked for fo
1e440 75 6e 64 2c 20 6e 6f 74 20 61 64 64 69 6e 67 20 und, not adding
1e450 69 64 65 6e 74 69 74 79 3a 25 69 22 2c 20 28 69 identity:%i", (i
1e460 6e 74 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69 nt) cackey_sessi
1e470 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 ons[hSession].se
1e480 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 arch_query_count
1e490 2c 20 28 69 6e 74 29 20 6d 61 74 63 68 65 64 5f , (int) matched_
1e4a0 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63 75 72 count, (int) cur
1e4b0 72 5f 69 64 5f 69 64 78 29 3b 0a 09 09 7d 0a 09 r_id_idx);...}..
1e4c0 7d 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f }..cackey_sessio
1e4d0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 ns[hSession].sea
1e4e0 72 63 68 5f 63 75 72 72 5f 69 64 20 3d 20 63 75 rch_curr_id = cu
1e4f0 72 72 5f 69 64 5f 69 64 78 3b 0a 09 2a 70 75 6c rr_id_idx;..*pul
1e500 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 20 63 75 ObjectCount = cu
1e510 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 3b 0a 0a rr_out_id_idx;..
1e520 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 .mutex_retval =
1e530 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c cackey_mutex_unl
1e540 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
1e550 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f ck);..if (mutex_
1e560 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 retval != 0) {..
1e570 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1e580 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e INTF("Error. Un
1e590 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 locking failed."
1e5a0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
1e5b0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b _GENERAL_ERROR);
1e5c0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 ..}...CACKEY_DEB
1e5d0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
1e5e0 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 ning CKR_OK (%i)
1e5f0 2c 20 6e 75 6d 20 6f 62 6a 65 63 74 73 20 3d 20 , num objects =
1e600 25 6c 75 22 2c 20 43 4b 52 5f 4f 4b 2c 20 2a 70 %lu", CKR_OK, *p
1e610 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 29 3b 0a ulObjectCount);.
1e620 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 ..return(CKR_OK)
1e630 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 ;.}..CK_DEFINE_F
1e640 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 UNCTION(CK_RV, C
1e650 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46 69 6e 61 _FindObjectsFina
1e660 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 l)(CK_SESSION_HA
1e670 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b NDLE hSession) {
1e680 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 ..int mutex_retv
1e690 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 al;...CACKEY_DEB
1e6a0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
1e6b0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 d.");...if (!cac
1e6c0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 key_initialized)
1e6d0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
1e6e0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
1e6f0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 Not initialize
1e700 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
1e710 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 CKR_CRYPTOKI_NOT
1e720 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 _INITIALIZED);..
1e730 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e }...if (hSession
1e740 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f == 0 || hSessio
1e750 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 n >= (sizeof(cac
1e760 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 key_sessions) /
1e770 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 sizeof(cackey_se
1e780 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 ssions[0]))) {..
1e790 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1e7a0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 INTF("Error. Se
1e7b0 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e ssion out of ran
1e7c0 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 ge.");......retu
1e7d0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 rn(CKR_SESSION_H
1e7e0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a ANDLE_INVALID);.
1e7f0 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 .}...mutex_retva
1e800 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 l = cackey_mutex
1e810 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 _lock(cackey_big
1e820 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 lock);..if (mute
1e830 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b x_retval != 0) {
1e840 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1e850 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
1e860 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 Locking failed."
1e870 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
1e880 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b _GENERAL_ERROR);
1e890 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ..}...if (!cacke
1e8a0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
1e8b0 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 ion].active) {..
1e8c0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e .cackey_mutex_un
1e8d0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
1e8e0 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f ock);....CACKEY_
1e8f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
1e900 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f ror. Session no
1e910 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a t active.");....
1e920 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 ..return(CKR_SES
1e930 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 SION_HANDLE_INVA
1e940 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 LID);..}...if (!
1e950 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
1e960 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 hSession].search
1e970 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 _active) {...cac
1e980 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b key_mutex_unlock
1e990 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 (cackey_biglock)
1e9a0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 ;....CACKEY_DEBU
1e9b0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
1e9c0 20 20 53 65 61 72 63 68 20 6e 6f 74 20 61 63 74 Search not act
1e9d0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 ive.");......ret
1e9e0 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f urn(CKR_OPERATIO
1e9f0 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 N_NOT_INITIALIZE
1ea00 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f D);..}...cackey_
1ea10 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
1ea20 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 n].search_active
1ea30 20 3d 20 30 3b 0a 09 69 66 20 28 63 61 63 6b 65 = 0;..if (cacke
1ea40 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
1ea50 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 ion].search_quer
1ea60 79 29 20 7b 0a 09 09 66 72 65 65 28 63 61 63 6b y) {...free(cack
1ea70 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
1ea80 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 sion].search_que
1ea90 72 79 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f ry);..}...mutex_
1eaa0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f retval = cackey_
1eab0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 mutex_unlock(cac
1eac0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 key_biglock);..i
1ead0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 f (mutex_retval
1eae0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 != 0) {...CACKEY
1eaf0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
1eb00 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 rror. Unlocking
1eb10 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 failed.");....r
1eb20 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 eturn(CKR_GENERA
1eb30 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 L_ERROR);..}...C
1eb40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1eb50 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b TF("Returning CK
1eb60 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f R_OK (%i)", CKR_
1eb70 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b OK);...return(CK
1eb80 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 R_OK);.}..CK_DEF
1eb90 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f INE_FUNCTION(CK_
1eba0 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 49 6e 69 RV, C_EncryptIni
1ebb0 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 t)(CK_SESSION_HA
1ebc0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 NDLE hSession, C
1ebd0 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 K_MECHANISM_PTR
1ebe0 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f pMechanism, CK_O
1ebf0 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 BJECT_HANDLE hKe
1ec00 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 y) {..CACKEY_DEB
1ec10 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
1ec20 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 d.");...if (!cac
1ec30 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 key_initialized)
1ec40 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
1ec50 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
1ec60 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 Not initialize
1ec70 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
1ec80 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 CKR_CRYPTOKI_NOT
1ec90 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 _INITIALIZED);..
1eca0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 }...CACKEY_DEBUG
1ecb0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
1ecc0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f ng CKR_FUNCTION_
1ecd0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 NOT_SUPPORTED (%
1ece0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f i)", CKR_FUNCTIO
1ecf0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 N_NOT_SUPPORTED)
1ed00 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 ;...return(CKR_F
1ed10 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
1ed20 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 ORTED);.}..CK_DE
1ed30 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b FINE_FUNCTION(CK
1ed40 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 29 28 _RV, C_Encrypt)(
1ed50 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c CK_SESSION_HANDL
1ed60 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 E hSession, CK_B
1ed70 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 YTE_PTR pData, C
1ed80 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 K_ULONG ulDataLe
1ed90 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 n, CK_BYTE_PTR p
1eda0 45 6e 63 72 79 70 74 65 64 44 61 74 61 2c 20 43 EncryptedData, C
1edb0 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 K_ULONG_PTR pulE
1edc0 6e 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e 29 ncryptedDataLen)
1edd0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {..CACKEY_DEBUG
1ede0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
1edf0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ");...if (!cacke
1ee00 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b y_initialized) {
1ee10 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1ee20 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
1ee30 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e Not initialized.
1ee40 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
1ee50 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 R_CRYPTOKI_NOT_I
1ee60 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
1ee70 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1ee80 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
1ee90 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f CKR_FUNCTION_NO
1eea0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 T_SUPPORTED (%i)
1eeb0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f ", CKR_FUNCTION_
1eec0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
1eed0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e ..return(CKR_FUN
1eee0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
1eef0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 TED);.}..CK_DEFI
1ef00 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 NE_FUNCTION(CK_R
1ef10 56 2c 20 43 5f 45 6e 63 72 79 70 74 55 70 64 61 V, C_EncryptUpda
1ef20 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 te)(CK_SESSION_H
1ef30 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 ANDLE hSession,
1ef40 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 CK_BYTE_PTR pPar
1ef50 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 t, CK_ULONG ulPa
1ef60 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 rtLen, CK_BYTE_P
1ef70 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 TR pEncryptedPar
1ef80 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 t, CK_ULONG_PTR
1ef90 70 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 pulEncryptedPart
1efa0 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 Len) {..CACKEY_D
1efb0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
1efc0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 led.");...if (!c
1efd0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 ackey_initialize
1efe0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 d) {...CACKEY_DE
1eff0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
1f000 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 r. Not initiali
1f010 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 zed.");....retur
1f020 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e n(CKR_CRYPTOKI_N
1f030 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b OT_INITIALIZED);
1f040 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 ..}...CACKEY_DEB
1f050 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
1f060 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f ning CKR_FUNCTIO
1f070 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 N_NOT_SUPPORTED
1f080 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 (%i)", CKR_FUNCT
1f090 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
1f0a0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 D);...return(CKR
1f0b0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
1f0c0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f PPORTED);.}..CK_
1f0d0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 DEFINE_FUNCTION(
1f0e0 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 CK_RV, C_Encrypt
1f0f0 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f Final)(CK_SESSIO
1f100 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f N_HANDLE hSessio
1f110 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 n, CK_BYTE_PTR p
1f120 4c 61 73 74 45 6e 63 72 79 70 74 65 64 50 61 72 LastEncryptedPar
1f130 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 t, CK_ULONG_PTR
1f140 70 75 6c 4c 61 73 74 45 6e 63 72 79 70 74 65 64 pulLastEncrypted
1f150 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b PartLen) {..CACK
1f160 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1f170 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 "Called.");...if
1f180 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 (!cackey_initia
1f190 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 lized) {...CACKE
1f1a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1f1b0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 Error. Not init
1f1c0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 ialized.");....r
1f1d0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f eturn(CKR_CRYPTO
1f1e0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a KI_NOT_INITIALIZ
1f1f0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 ED);..}...CACKEY
1f200 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
1f210 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e eturning CKR_FUN
1f220 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
1f230 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 TED (%i)", CKR_F
1f240 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
1f250 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e ORTED);...return
1f260 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f (CKR_FUNCTION_NO
1f270 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a T_SUPPORTED);.}.
1f280 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 .CK_DEFINE_FUNCT
1f290 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 ION(CK_RV, C_Dec
1f2a0 72 79 70 74 49 6e 69 74 29 28 43 4b 5f 53 45 53 ryptInit)(CK_SES
1f2b0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 SION_HANDLE hSes
1f2c0 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 sion, CK_MECHANI
1f2d0 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 SM_PTR pMechanis
1f2e0 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e m, CK_OBJECT_HAN
1f2f0 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 69 6e 74 DLE hKey) {..int
1f300 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a mutex_retval;..
1f310 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43 4b 45 .hKey--;...CACKE
1f320 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1f330 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 Called.");...if
1f340 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c (!cackey_initial
1f350 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 ized) {...CACKEY
1f360 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
1f370 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 rror. Not initi
1f380 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 alized.");....re
1f390 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b turn(CKR_CRYPTOK
1f3a0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 I_NOT_INITIALIZE
1f3b0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 D);..}...if (pMe
1f3c0 63 68 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c 4c 29 chanism == NULL)
1f3d0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
1f3e0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
1f3f0 20 70 4d 65 63 68 61 6e 69 73 6d 20 69 73 20 4e pMechanism is N
1f400 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 ULL.");....retur
1f410 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f n(CKR_ARGUMENTS_
1f420 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 BAD);..}...if (p
1f430 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 Mechanism->mecha
1f440 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f 52 53 41 5f nism != CKM_RSA_
1f450 50 4b 43 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 PKCS) {...CACKEY
1f460 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
1f470 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d rror. pMechanism
1f480 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 6e 6f 74 20 ->mechanism not
1f490 73 70 65 63 69 66 69 65 64 20 61 73 20 43 4b 4d specified as CKM
1f4a0 5f 52 53 41 5f 50 4b 43 53 22 29 3b 0a 0a 09 09 _RSA_PKCS");....
1f4b0 72 65 74 75 72 6e 28 43 4b 52 5f 4d 45 43 48 41 return(CKR_MECHA
1f4c0 4e 49 53 4d 5f 50 41 52 41 4d 5f 49 4e 56 41 4c NISM_PARAM_INVAL
1f4d0 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 ID);..}...if (hS
1f4e0 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 ession == 0 || h
1f4f0 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 Session >= (size
1f500 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f of(cackey_sessio
1f510 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 ns) / sizeof(cac
1f520 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 key_sessions[0])
1f530 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 )) {...CACKEY_DE
1f540 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
1f550 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 r. Session out
1f560 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a of range.");....
1f570 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 ..return(CKR_SES
1f580 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 SION_HANDLE_INVA
1f590 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 LID);..}...mutex
1f5a0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 _retval = cackey
1f5b0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b _mutex_lock(cack
1f5c0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 ey_biglock);..if
1f5d0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 (mutex_retval !
1f5e0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f = 0) {...CACKEY_
1f5f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
1f600 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 ror. Locking fa
1f610 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 iled.");....retu
1f620 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 rn(CKR_GENERAL_E
1f630 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 RROR);..}...if (
1f640 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 !cackey_sessions
1f650 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 [hSession].activ
1f660 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 e) {...cackey_mu
1f670 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 tex_unlock(cacke
1f680 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 y_biglock);....C
1f690 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1f6a0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 TF("Error. Sess
1f6b0 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 ion not active."
1f6c0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 );......return(C
1f6d0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c KR_SESSION_HANDL
1f6e0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a E_INVALID);..}..
1f6f0 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 .if (cackey_sess
1f700 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 ions[hSession].d
1f710 65 63 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b ecrypt_active) {
1f720 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f ...cackey_mutex_
1f730 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 unlock(cackey_bi
1f740 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 glock);....CACKE
1f750 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1f760 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 20 Error. Decrypt
1f770 61 6c 72 65 61 64 79 20 69 6e 20 70 72 6f 67 72 already in progr
1f780 65 73 73 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 ess.");......ret
1f790 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f urn(CKR_OPERATIO
1f7a0 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 N_ACTIVE);..}...
1f7b0 69 66 20 28 68 4b 65 79 20 3e 3d 20 63 61 63 6b if (hKey >= cack
1f7c0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
1f7d0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 sion].identities
1f7e0 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 63 61 63 6b _count) {...cack
1f7f0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 ey_mutex_unlock(
1f800 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
1f810 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
1f820 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
1f830 20 4b 65 79 20 68 61 6e 64 6c 65 20 6f 75 74 20 Key handle out
1f840 6f 66 20 72 61 6e 67 65 20 28 72 65 71 75 65 73 of range (reques
1f850 74 65 64 20 6b 65 79 20 25 6c 75 2c 20 6f 6e 6c ted key %lu, onl
1f860 79 20 25 6c 75 20 69 64 65 6e 74 69 74 69 65 73 y %lu identities
1f870 20 61 76 61 69 6c 61 62 6c 65 29 2e 22 2c 20 28 available).", (
1f880 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 unsigned long) h
1f890 4b 65 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c Key, (unsigned l
1f8a0 6f 6e 67 29 20 63 61 63 6b 65 79 5f 73 65 73 73 ong) cackey_sess
1f8b0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 ions[hSession].i
1f8c0 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 dentities_count)
1f8d0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
1f8e0 4b 45 59 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c KEY_HANDLE_INVAL
1f8f0 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 ID);..}...cackey
1f900 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
1f910 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 on].decrypt_acti
1f920 76 65 20 3d 20 31 3b 0a 0a 09 63 61 63 6b 65 79 ve = 1;...cackey
1f930 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
1f940 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 on].decrypt_mech
1f950 61 6e 69 73 6d 20 3d 20 70 4d 65 63 68 61 6e 69 anism = pMechani
1f960 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b 0a 09 sm->mechanism;..
1f970 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
1f980 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 hSession].decryp
1f990 74 5f 6d 65 63 68 5f 70 61 72 6d 20 3d 20 70 4d t_mech_parm = pM
1f9a0 65 63 68 61 6e 69 73 6d 2d 3e 70 50 61 72 61 6d echanism->pParam
1f9b0 65 74 65 72 3b 0a 09 63 61 63 6b 65 79 5f 73 65 eter;..cackey_se
1f9c0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
1f9d0 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61 .decrypt_mech_pa
1f9e0 72 6d 6c 65 6e 20 3d 20 70 4d 65 63 68 61 6e 69 rmlen = pMechani
1f9f0 73 6d 2d 3e 75 6c 50 61 72 61 6d 65 74 65 72 4c sm->ulParameterL
1fa00 65 6e 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 en;..cackey_sess
1fa10 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 ions[hSession].d
1fa20 65 63 72 79 70 74 5f 69 64 65 6e 74 69 74 79 20 ecrypt_identity
1fa30 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f = &cackey_sessio
1fa40 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 ns[hSession].ide
1fa50 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d 3b 0a 0a ntities[hKey];..
1fa60 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 .mutex_retval =
1fa70 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c cackey_mutex_unl
1fa80 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
1fa90 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f ck);..if (mutex_
1faa0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 retval != 0) {..
1fab0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1fac0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e INTF("Error. Un
1fad0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 locking failed."
1fae0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
1faf0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b _GENERAL_ERROR);
1fb00 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 ..}...CACKEY_DEB
1fb10 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
1fb20 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 ning CKR_OK (%i)
1fb30 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 ", CKR_OK);...re
1fb40 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a turn(CKR_OK);.}.
1fb50 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 .CK_DEFINE_FUNCT
1fb60 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 ION(CK_RV, C_Dec
1fb70 72 79 70 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e rypt)(CK_SESSION
1fb80 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e _HANDLE hSession
1fb90 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 , CK_BYTE_PTR pE
1fba0 6e 63 72 79 70 74 65 64 44 61 74 61 2c 20 43 4b ncryptedData, CK
1fbb0 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 _ULONG ulEncrypt
1fbc0 65 64 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 edDataLen, CK_BY
1fbd0 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b TE_PTR pData, CK
1fbe0 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 61 _ULONG_PTR pulDa
1fbf0 74 61 4c 65 6e 29 20 7b 0a 09 43 4b 5f 55 4c 4f taLen) {..CK_ULO
1fc00 4e 47 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 NG datalen_updat
1fc10 65 2c 20 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c e, datalen_final
1fc20 3b 0a 09 43 4b 5f 52 56 20 64 65 63 72 79 70 74 ;..CK_RV decrypt
1fc30 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 _ret;...CACKEY_D
1fc40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
1fc50 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 led.");...if (!c
1fc60 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 ackey_initialize
1fc70 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 d) {...CACKEY_DE
1fc80 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
1fc90 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 r. Not initiali
1fca0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 zed.");....retur
1fcb0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e n(CKR_CRYPTOKI_N
1fcc0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b OT_INITIALIZED);
1fcd0 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 44 61 74 ..}...if (pulDat
1fce0 61 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a aLen == NULL) {.
1fcf0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1fd00 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 RINTF("Error. pu
1fd10 6c 44 61 74 61 4c 65 6e 20 69 73 20 4e 55 4c 4c lDataLen is NULL
1fd20 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
1fd30 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 KR_ARGUMENTS_BAD
1fd40 29 3b 0a 09 7d 0a 0a 09 64 61 74 61 6c 65 6e 5f );..}...datalen_
1fd50 75 70 64 61 74 65 20 3d 20 2a 70 75 6c 44 61 74 update = *pulDat
1fd60 61 4c 65 6e 3b 0a 0a 09 64 65 63 72 79 70 74 5f aLen;...decrypt_
1fd70 72 65 74 20 3d 20 43 5f 44 65 63 72 79 70 74 55 ret = C_DecryptU
1fd80 70 64 61 74 65 28 68 53 65 73 73 69 6f 6e 2c 20 pdate(hSession,
1fd90 70 45 6e 63 72 79 70 74 65 64 44 61 74 61 2c 20 pEncryptedData,
1fda0 75 6c 45 6e 63 72 79 70 74 65 64 44 61 74 61 4c ulEncryptedDataL
1fdb0 65 6e 2c 20 70 44 61 74 61 2c 20 26 64 61 74 61 en, pData, &data
1fdc0 6c 65 6e 5f 75 70 64 61 74 65 29 3b 0a 09 69 66 len_update);..if
1fdd0 20 28 64 65 63 72 79 70 74 5f 72 65 74 20 21 3d (decrypt_ret !=
1fde0 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 CKR_OK) {...CAC
1fdf0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1fe00 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 ("Error. Decryp
1fe10 74 55 70 64 61 74 65 28 29 20 72 65 74 75 72 6e tUpdate() return
1fe20 65 64 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d ed failure (rv =
1fe30 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e %lu).", (unsign
1fe40 65 64 20 6c 6f 6e 67 29 20 64 65 63 72 79 70 74 ed long) decrypt
1fe50 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e _ret);....return
1fe60 28 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 09 (decrypt_ret);..
1fe70 7d 0a 0a 09 69 66 20 28 70 44 61 74 61 29 20 7b }...if (pData) {
1fe80 0a 09 09 70 44 61 74 61 20 2b 3d 20 64 61 74 61 ...pData += data
1fe90 6c 65 6e 5f 75 70 64 61 74 65 3b 0a 09 7d 0a 09 len_update;..}..
1fea0 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 20 3d 20 datalen_final =
1feb0 2a 70 75 6c 44 61 74 61 4c 65 6e 20 2d 20 64 61 *pulDataLen - da
1fec0 74 61 6c 65 6e 5f 75 70 64 61 74 65 3b 0a 0a 09 talen_update;...
1fed0 64 65 63 72 79 70 74 5f 72 65 74 20 3d 20 43 5f decrypt_ret = C_
1fee0 44 65 63 72 79 70 74 46 69 6e 61 6c 28 68 53 65 DecryptFinal(hSe
1fef0 73 73 69 6f 6e 2c 20 70 44 61 74 61 2c 20 26 64 ssion, pData, &d
1ff00 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 29 3b 0a 09 atalen_final);..
1ff10 69 66 20 28 64 65 63 72 79 70 74 5f 72 65 74 20 if (decrypt_ret
1ff20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 != CKR_OK) {...C
1ff30 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1ff40 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72 TF("Error. Decr
1ff50 79 70 74 46 69 6e 61 6c 28 29 20 72 65 74 75 72 yptFinal() retur
1ff60 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72 76 20 ned failure (rv
1ff70 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 = %lu).", (unsig
1ff80 6e 65 64 20 6c 6f 6e 67 29 20 64 65 63 72 79 70 ned long) decryp
1ff90 74 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 t_ret);....retur
1ffa0 6e 28 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a n(decrypt_ret);.
1ffb0 09 7d 0a 0a 09 2a 70 75 6c 44 61 74 61 4c 65 6e .}...*pulDataLen
1ffc0 20 3d 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 = datalen_updat
1ffd0 65 20 2b 20 64 61 74 61 6c 65 6e 5f 66 69 6e 61 e + datalen_fina
1ffe0 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 l;...CACKEY_DEBU
1fff0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
20000 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 ing CKR_OK (%i)"
20010 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 , CKR_OK);...ret
20020 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a urn(CKR_OK);.}..
20030 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 CK_DEFINE_FUNCTI
20040 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 ON(CK_RV, C_Decr
20050 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 yptUpdate)(CK_SE
20060 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 SSION_HANDLE hSe
20070 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 ssion, CK_BYTE_P
20080 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 TR pEncryptedPar
20090 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e t, CK_ULONG ulEn
200a0 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 cryptedPartLen,
200b0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 CK_BYTE_PTR pPar
200c0 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 t, CK_ULONG_PTR
200d0 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 73 pulPartLen) {..s
200e0 74 61 74 69 63 20 43 4b 5f 42 59 54 45 20 62 75 tatic CK_BYTE bu
200f0 66 5b 31 36 33 38 34 5d 3b 0a 09 73 73 69 7a 65 f[16384];..ssize
20100 5f 74 20 62 75 66 6c 65 6e 3b 0a 09 43 4b 5f 53 _t buflen;..CK_S
20110 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 LOT_ID slotID;..
20120 43 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d 20 43 CK_RV retval = C
20130 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 KR_GENERAL_ERROR
20140 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 ;..int mutex_ret
20150 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 val;...CACKEY_DE
20160 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
20170 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 ed.");...if (!ca
20180 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 ckey_initialized
20190 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
201a0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
201b0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a . Not initializ
201c0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
201d0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f (CKR_CRYPTOKI_NO
201e0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a T_INITIALIZED);.
201f0 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f .}...if (hSessio
20200 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 n == 0 || hSessi
20210 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 on >= (sizeof(ca
20220 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f ckey_sessions) /
20230 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 sizeof(cackey_s
20240 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a essions[0]))) {.
20250 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
20260 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 RINTF("Error. S
20270 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 ession out of ra
20280 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 nge.");......ret
20290 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f urn(CKR_SESSION_
202a0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b HANDLE_INVALID);
202b0 0a 09 7d 0a 0a 09 69 66 20 28 70 45 6e 63 72 79 ..}...if (pEncry
202c0 70 74 65 64 50 61 72 74 20 3d 3d 20 4e 55 4c 4c ptedPart == NULL
202d0 20 26 26 20 75 6c 45 6e 63 72 79 70 74 65 64 50 && ulEncryptedP
202e0 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 artLen == 0) {..
202f0 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69 ./* Short circui
20300 74 20 69 66 20 77 65 20 61 72 65 20 61 73 6b 65 t if we are aske
20310 64 20 74 6f 20 64 65 63 72 79 70 74 20 6e 6f 74 d to decrypt not
20320 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 43 41 43 hing... */...CAC
20330 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
20340 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f ("Returning CKR_
20350 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20 63 OK (%i) (short c
20360 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b ircuit)", CKR_OK
20370 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
20380 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 _OK);..}...if (p
20390 45 6e 63 72 79 70 74 65 64 50 61 72 74 20 3d 3d EncryptedPart ==
203a0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 NULL) {...CACKE
203b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
203c0 45 72 72 6f 72 2e 20 70 45 6e 63 72 79 70 74 65 Error. pEncrypte
203d0 64 50 61 72 74 20 69 73 20 4e 55 4c 4c 2c 20 62 dPart is NULL, b
203e0 75 74 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 ut ulEncryptedPa
203f0 72 74 4c 65 6e 20 69 73 20 6e 6f 74 20 30 2e 22 rtLen is not 0."
20400 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
20410 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b _ARGUMENTS_BAD);
20420 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 45 6e 63 72 ..}...if (ulEncr
20430 79 70 74 65 64 50 61 72 74 4c 65 6e 20 3d 3d 20 yptedPartLen ==
20440 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 0) {...CACKEY_DE
20450 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
20460 72 2e 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 r. ulEncryptedPa
20470 72 74 4c 65 6e 20 69 73 20 30 2c 20 62 75 74 20 rtLen is 0, but
20480 70 50 61 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c pPart is not NUL
20490 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 L.");....return(
204a0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 CKR_ARGUMENTS_BA
204b0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c D);..}...if (pul
204c0 50 61 72 74 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 PartLen == NULL)
204d0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
204e0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
204f0 20 70 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 4e pulPartLen is N
20500 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 ULL.");....retur
20510 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f n(CKR_ARGUMENTS_
20520 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 BAD);..}...mutex
20530 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 _retval = cackey
20540 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b _mutex_lock(cack
20550 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 ey_biglock);..if
20560 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 (mutex_retval !
20570 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f = 0) {...CACKEY_
20580 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
20590 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 ror. Locking fa
205a0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 iled.");....retu
205b0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 rn(CKR_GENERAL_E
205c0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 RROR);..}...if (
205d0 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 !cackey_sessions
205e0 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 [hSession].activ
205f0 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 e) {...cackey_mu
20600 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 tex_unlock(cacke
20610 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 y_biglock);....C
20620 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
20630 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 TF("Error. Sess
20640 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 ion not active."
20650 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 );......return(C
20660 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c KR_SESSION_HANDL
20670 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a E_INVALID);..}..
20680 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 .if (!cackey_ses
20690 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
206a0 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 29 20 decrypt_active)
206b0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 {...cackey_mutex
206c0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 _unlock(cackey_b
206d0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b iglock);....CACK
206e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
206f0 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 "Error. Decrypt
20700 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a not active.");.
20710 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f .....return(CKR_
20720 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e OPERATION_NOT_IN
20730 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
20740 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 .slotID = cackey
20750 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
20760 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 on].slotID;...if
20770 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 (slotID < 0 ||
20780 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f slotID >= (sizeo
20790 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 f(cackey_slots)
207a0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f / sizeof(cackey_
207b0 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 slots[0]))) {...
207c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
207d0 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 NTF("Error. Inva
207e0 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 lid slot request
207f0 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 ed (%lu), outsid
20800 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 e of valid range
20810 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 ", slotID);....r
20820 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 eturn(CKR_GENERA
20830 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 L_ERROR);..}...i
20840 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b f (cackey_slots[
20850 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d slotID].active =
20860 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f = 0) {...CACKEY_
20870 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
20880 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f ror. Invalid slo
20890 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 t requested (%lu
208a0 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 ), slot not curr
208b0 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 ently active", s
208c0 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 lotID);....cacke
208d0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
208e0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
208f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 ...return(CKR_GE
20900 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d NERAL_ERROR);..}
20910 0a 0a 09 73 77 69 74 63 68 20 28 63 61 63 6b 65 ...switch (cacke
20920 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
20930 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 ion].decrypt_mec
20940 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61 73 65 hanism) {...case
20950 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 CKM_RSA_PKCS:..
20960 09 09 2f 2a 20 41 73 6b 20 63 61 72 64 20 74 6f ../* Ask card to
20970 20 64 65 63 72 79 70 74 20 2a 2f 0a 09 09 09 62 decrypt */....b
20980 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65 79 5f 73 uflen = cackey_s
20990 69 67 6e 64 65 63 72 79 70 74 28 26 63 61 63 6b igndecrypt(&cack
209a0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d ey_slots[slotID]
209b0 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e , cackey_session
209c0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 s[hSession].decr
209d0 79 70 74 5f 69 64 65 6e 74 69 74 79 2c 20 70 45 ypt_identity, pE
209e0 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 75 6c ncryptedPart, ul
209f0 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e EncryptedPartLen
20a00 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 , buf, sizeof(bu
20a10 66 29 2c 20 30 2c 20 31 29 3b 0a 0a 09 09 09 69 f), 0, 1);.....i
20a20 66 20 28 62 75 66 6c 65 6e 20 3c 20 30 29 20 7b f (buflen < 0) {
20a30 0a 09 09 09 09 2f 2a 20 44 65 63 72 79 70 74 69 ...../* Decrypti
20a40 6f 6e 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 09 09 on failed. */...
20a50 09 09 69 66 20 28 62 75 66 6c 65 6e 20 3d 3d 20 ..if (buflen ==
20a60 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45 CACKEY_PCSC_E_NE
20a70 45 44 4c 4f 47 49 4e 29 20 7b 0a 09 09 09 09 09 EDLOGIN) {......
20a80 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 55 53 45 retval = CKR_USE
20a90 52 5f 4e 4f 54 5f 4c 4f 47 47 45 44 5f 49 4e 3b R_NOT_LOGGED_IN;
20aa0 0a 09 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28 .....} else if (
20ab0 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 buflen == CACKEY
20ac0 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 _PCSC_E_TOKENABS
20ad0 45 4e 54 29 20 7b 0a 09 09 09 09 09 72 65 74 76 ENT) {......retv
20ae0 61 6c 20 3d 20 43 4b 52 5f 44 45 56 49 43 45 5f al = CKR_DEVICE_
20af0 52 45 4d 4f 56 45 44 3b 0a 09 09 09 09 7d 20 65 REMOVED;.....} e
20b00 6c 73 65 20 7b 0a 09 09 09 09 09 72 65 74 76 61 lse {......retva
20b10 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f l = CKR_GENERAL_
20b20 45 52 52 4f 52 3b 0a 09 09 09 09 7d 0a 09 09 09 ERROR;.....}....
20b30 7d 20 65 6c 73 65 20 69 66 20 28 28 28 75 6e 73 } else if (((uns
20b40 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62 75 66 6c igned long) bufl
20b50 65 6e 29 20 3e 20 2a 70 75 6c 50 61 72 74 4c 65 en) > *pulPartLe
20b60 6e 20 26 26 20 70 50 61 72 74 29 20 7b 0a 09 09 n && pPart) {...
20b70 09 09 2f 2a 20 44 65 63 72 79 70 74 65 64 20 64 ../* Decrypted d
20b80 61 74 61 20 74 6f 6f 20 6c 61 72 67 65 20 2a 2f ata too large */
20b90 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b .....retval = CK
20ba0 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 R_BUFFER_TOO_SMA
20bb0 4c 4c 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a LL;....} else {.
20bc0 09 09 09 09 69 66 20 28 70 50 61 72 74 29 20 7b ....if (pPart) {
20bd0 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 70 50 61 ......memcpy(pPa
20be0 72 74 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e 29 rt, buf, buflen)
20bf0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2a 70 75 ;.....}......*pu
20c00 6c 50 61 72 74 4c 65 6e 20 3d 20 62 75 66 6c 65 lPartLen = bufle
20c10 6e 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 3d n;......retval =
20c20 20 43 4b 52 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a 09 CKR_OK;....}...
20c30 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 6d 75 ..break;..}...mu
20c40 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 tex_retval = cac
20c50 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b key_mutex_unlock
20c60 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 (cackey_biglock)
20c70 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 ;..if (mutex_ret
20c80 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 val != 0) {...CA
20c90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
20ca0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 F("Error. Unloc
20cb0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a king failed.");.
20cc0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 ...return(CKR_GE
20cd0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d NERAL_ERROR);..}
20ce0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
20cf0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e PRINTF("Returnin
20d00 67 20 25 69 22 2c 20 28 69 6e 74 29 20 72 65 74 g %i", (int) ret
20d10 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 val);...return(r
20d20 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 etval);.}..CK_DE
20d30 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b FINE_FUNCTION(CK
20d40 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 46 69 _RV, C_DecryptFi
20d50 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f nal)(CK_SESSION_
20d60 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c HANDLE hSession,
20d70 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4c 61 CK_BYTE_PTR pLa
20d80 73 74 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 stPart, CK_ULONG
20d90 5f 50 54 52 20 70 75 6c 4c 61 73 74 50 61 72 74 _PTR pulLastPart
20da0 4c 65 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 Len) {..int mute
20db0 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 74 x_retval;..int t
20dc0 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79 70 74 erminate_decrypt
20dd0 20 3d 20 31 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 = 1;...CACKEY_D
20de0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
20df0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 led.");...if (!c
20e00 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 ackey_initialize
20e10 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 d) {...CACKEY_DE
20e20 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
20e30 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 r. Not initiali
20e40 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 zed.");....retur
20e50 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e n(CKR_CRYPTOKI_N
20e60 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b OT_INITIALIZED);
20e70 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 ..}...if (hSessi
20e80 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 on == 0 || hSess
20e90 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 ion >= (sizeof(c
20ea0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 ackey_sessions)
20eb0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f / sizeof(cackey_
20ec0 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b sessions[0]))) {
20ed0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
20ee0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
20ef0 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 Session out of r
20f00 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 ange.");......re
20f10 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e turn(CKR_SESSION
20f20 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 _HANDLE_INVALID)
20f30 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 4c 61 ;..}...if (pulLa
20f40 73 74 50 61 72 74 4c 65 6e 20 3d 3d 20 4e 55 4c stPartLen == NUL
20f50 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 L) {...CACKEY_DE
20f60 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
20f70 72 2e 20 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 r. pulLastPartLe
20f80 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 n is NULL.");...
20f90 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 .return(CKR_ARGU
20fa0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a MENTS_BAD);..}..
20fb0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 .mutex_retval =
20fc0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 cackey_mutex_loc
20fd0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
20fe0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 );..if (mutex_re
20ff0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 tval != 0) {...C
21000 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
21010 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b TF("Error. Lock
21020 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a ing failed.");..
21030 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e ..return(CKR_GEN
21040 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a ERAL_ERROR);..}.
21050 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 ..if (!cackey_se
21060 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
21070 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 .active) {...cac
21080 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b key_mutex_unlock
21090 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 (cackey_biglock)
210a0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 ;....CACKEY_DEBU
210b0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
210c0 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 Session not ac
210d0 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 tive.");......re
210e0 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e turn(CKR_SESSION
210f0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 _HANDLE_INVALID)
21100 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b ;..}...if (!cack
21110 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
21120 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 sion].decrypt_ac
21130 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 tive) {...cackey
21140 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 _mutex_unlock(ca
21150 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a ckey_biglock);..
21160 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
21170 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 RINTF("Error. D
21180 65 63 72 79 70 74 20 6e 6f 74 20 61 63 74 69 76 ecrypt not activ
21190 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 e.");......retur
211a0 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f n(CKR_OPERATION_
211b0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 NOT_INITIALIZED)
211c0 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 4c 61 73 74 50 ;..}...*pulLastP
211d0 61 72 74 4c 65 6e 20 3d 20 30 3b 0a 0a 09 69 66 artLen = 0;...if
211e0 20 28 70 4c 61 73 74 50 61 72 74 20 3d 3d 20 4e (pLastPart == N
211f0 55 4c 4c 29 20 7b 0a 09 09 74 65 72 6d 69 6e 61 ULL) {...termina
21200 74 65 5f 64 65 63 72 79 70 74 20 3d 20 30 3b 0a te_decrypt = 0;.
21210 09 7d 0a 0a 09 69 66 20 28 74 65 72 6d 69 6e 61 .}...if (termina
21220 74 65 5f 64 65 63 72 79 70 74 29 20 7b 0a 09 09 te_decrypt) {...
21230 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
21240 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 hSession].decryp
21250 74 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d t_active = 0;..}
21260 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 ...mutex_retval
21270 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 = cackey_mutex_u
21280 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 nlock(cackey_big
21290 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 lock);..if (mute
212a0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b x_retval != 0) {
212b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
212c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
212d0 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 Unlocking failed
212e0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
212f0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 KR_GENERAL_ERROR
21300 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 );..}...CACKEY_D
21310 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
21320 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 urning CKR_OK (%
21330 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 i)", CKR_OK);...
21340 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a return(CKR_OK);.
21350 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e }..CK_DEFINE_FUN
21360 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 CTION(CK_RV, C_D
21370 69 67 65 73 74 49 6e 69 74 29 28 43 4b 5f 53 45 igestInit)(CK_SE
21380 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 SSION_HANDLE hSe
21390 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e ssion, CK_MECHAN
213a0 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 ISM_PTR pMechani
213b0 73 6d 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 sm) {..CACKEY_DE
213c0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
213d0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 ed.");...if (!ca
213e0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 ckey_initialized
213f0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
21400 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
21410 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a . Not initializ
21420 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
21430 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f (CKR_CRYPTOKI_NO
21440 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a T_INITIALIZED);.
21450 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 .}...CACKEY_DEBU
21460 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
21470 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e ing CKR_FUNCTION
21480 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 _NOT_SUPPORTED (
21490 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 %i)", CKR_FUNCTI
214a0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
214b0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f );...return(CKR_
214c0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
214d0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 PORTED);.}..CK_D
214e0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 EFINE_FUNCTION(C
214f0 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 29 28 K_RV, C_Digest)(
21500 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c CK_SESSION_HANDL
21510 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 E hSession, CK_B
21520 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 YTE_PTR pData, C
21530 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 K_ULONG ulDataLe
21540 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 n, CK_BYTE_PTR p
21550 44 69 67 65 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 Digest, CK_ULONG
21560 5f 50 54 52 20 70 75 6c 44 69 67 65 73 74 4c 65 _PTR pulDigestLe
21570 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 n) {..CACKEY_DEB
21580 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
21590 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 d.");...if (!cac
215a0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 key_initialized)
215b0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
215c0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
215d0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 Not initialize
215e0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
215f0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 CKR_CRYPTOKI_NOT
21600 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 _INITIALIZED);..
21610 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 }...CACKEY_DEBUG
21620 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
21630 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f ng CKR_FUNCTION_
21640 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 NOT_SUPPORTED (%
21650 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f i)", CKR_FUNCTIO
21660 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 N_NOT_SUPPORTED)
21670 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 ;...return(CKR_F
21680 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
21690 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 ORTED);.}..CK_DE
216a0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b FINE_FUNCTION(CK
216b0 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 55 70 64 _RV, C_DigestUpd
216c0 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f ate)(CK_SESSION_
216d0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c HANDLE hSession,
216e0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 CK_BYTE_PTR pPa
216f0 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 rt, CK_ULONG ulP
21700 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 artLen) {..CACKE
21710 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
21720 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 Called.");...if
21730 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c (!cackey_initial
21740 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 ized) {...CACKEY
21750 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
21760 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 rror. Not initi
21770 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 alized.");....re
21780 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b turn(CKR_CRYPTOK
21790 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 I_NOT_INITIALIZE
217a0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f D);..}...CACKEY_
217b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
217c0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 turning CKR_FUNC
217d0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
217e0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 ED (%i)", CKR_FU
217f0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
21800 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 RTED);...return(
21810 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
21820 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a _SUPPORTED);.}..
21830 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 CK_DEFINE_FUNCTI
21840 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 ON(CK_RV, C_Dige
21850 73 74 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f stKey)(CK_SESSIO
21860 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f N_HANDLE hSessio
21870 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e n, CK_OBJECT_HAN
21880 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 DLE hKey) {..CAC
21890 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
218a0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 ("Called.");...i
218b0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 f (!cackey_initi
218c0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b alized) {...CACK
218d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
218e0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 "Error. Not ini
218f0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 tialized.");....
21900 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 return(CKR_CRYPT
21910 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 OKI_NOT_INITIALI
21920 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 ZED);..}...CACKE
21930 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
21940 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 Returning CKR_FU
21950 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
21960 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f RTED (%i)", CKR_
21970 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
21980 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 PORTED);...retur
21990 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e n(CKR_FUNCTION_N
219a0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d OT_SUPPORTED);.}
219b0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 ..CK_DEFINE_FUNC
219c0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 TION(CK_RV, C_Di
219d0 67 65 73 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45 gestFinal)(CK_SE
219e0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 SSION_HANDLE hSe
219f0 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 ssion, CK_BYTE_P
21a00 54 52 20 70 44 69 67 65 73 74 2c 20 43 4b 5f 55 TR pDigest, CK_U
21a10 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 69 67 65 LONG_PTR pulDige
21a20 73 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 stLen) {..CACKEY
21a30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 _DEBUG_PRINTF("C
21a40 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 alled.");...if (
21a50 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 !cackey_initiali
21a60 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f zed) {...CACKEY_
21a70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
21a80 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 ror. Not initia
21a90 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 lized.");....ret
21aa0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 urn(CKR_CRYPTOKI
21ab0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 _NOT_INITIALIZED
21ac0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 );..}...CACKEY_D
21ad0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
21ae0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 urning CKR_FUNCT
21af0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
21b00 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e D (%i)", CKR_FUN
21b10 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
21b20 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 TED);...return(C
21b30 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
21b40 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 SUPPORTED);.}..C
21b50 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f K_DEFINE_FUNCTIO
21b60 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 49 N(CK_RV, C_SignI
21b70 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f nit)(CK_SESSION_
21b80 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c HANDLE hSession,
21b90 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 CK_MECHANISM_PT
21ba0 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b R pMechanism, CK
21bb0 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 _OBJECT_HANDLE h
21bc0 4b 65 79 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 Key) {..int mute
21bd0 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 68 4b 65 79 x_retval;...hKey
21be0 2d 2d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 --;...CACKEY_DEB
21bf0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
21c00 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 d.");...if (!cac
21c10 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 key_initialized)
21c20 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
21c30 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
21c40 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 Not initialize
21c50 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
21c60 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 CKR_CRYPTOKI_NOT
21c70 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 _INITIALIZED);..
21c80 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69 }...if (pMechani
21c90 73 6d 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 sm == NULL) {...
21ca0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
21cb0 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 NTF("Error. pMec
21cc0 68 61 6e 69 73 6d 20 69 73 20 4e 55 4c 4c 2e 22 hanism is NULL."
21cd0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
21ce0 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b _ARGUMENTS_BAD);
21cf0 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 ..}...if (pMecha
21d00 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 nism->mechanism
21d10 21 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 20 != CKM_RSA_PKCS
21d20 26 26 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d && pMechanism->m
21d30 65 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f echanism != CKM_
21d40 53 48 41 31 5f 52 53 41 5f 50 4b 43 53 29 20 7b SHA1_RSA_PKCS) {
21d50 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
21d60 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 PRINTF("Error. p
21d70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 Mechanism->mecha
21d80 6e 69 73 6d 20 6e 6f 74 20 73 70 65 63 69 66 69 nism not specifi
21d90 65 64 20 61 73 20 43 4b 4d 5f 52 53 41 5f 50 4b ed as CKM_RSA_PK
21da0 43 53 20 6f 72 20 43 4b 4d 5f 53 48 41 31 5f 52 CS or CKM_SHA1_R
21db0 53 41 5f 50 4b 43 53 22 29 3b 0a 0a 09 09 72 65 SA_PKCS");....re
21dc0 74 75 72 6e 28 43 4b 52 5f 4d 45 43 48 41 4e 49 turn(CKR_MECHANI
21dd0 53 4d 5f 50 41 52 41 4d 5f 49 4e 56 41 4c 49 44 SM_PARAM_INVALID
21de0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 );..}...if (hSes
21df0 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 sion == 0 || hSe
21e00 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 ssion >= (sizeof
21e10 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 (cackey_sessions
21e20 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 ) / sizeof(cacke
21e30 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 y_sessions[0])))
21e40 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
21e50 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
21e60 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 Session out of
21e70 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 range.");......
21e80 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 return(CKR_SESSI
21e90 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 ON_HANDLE_INVALI
21ea0 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 D);..}...mutex_r
21eb0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d etval = cackey_m
21ec0 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 utex_lock(cackey
21ed0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 _biglock);..if (
21ee0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 mutex_retval !=
21ef0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 0) {...CACKEY_DE
21f00 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
21f10 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c r. Locking fail
21f20 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
21f30 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 (CKR_GENERAL_ERR
21f40 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 OR);..}...if (!c
21f50 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
21f60 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 Session].active)
21f70 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 {...cackey_mute
21f80 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
21f90 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 biglock);....CAC
21fa0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
21fb0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f ("Error. Sessio
21fc0 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b n not active.");
21fd0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 ......return(CKR
21fe0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f _SESSION_HANDLE_
21ff0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 INVALID);..}...i
22000 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f f (cackey_sessio
22010 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 ns[hSession].sig
22020 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 n_active) {...ca
22030 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 ckey_mutex_unloc
22040 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
22050 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 );....CACKEY_DEB
22060 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
22070 2e 20 20 53 69 67 6e 20 61 6c 72 65 61 64 79 20 . Sign already
22080 69 6e 20 70 72 6f 67 72 65 73 73 2e 22 29 3b 0a in progress.");.
22090 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f .....return(CKR_
220a0 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 45 OPERATION_ACTIVE
220b0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65 79 );..}...if (hKey
220c0 20 3e 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 >= cackey_sessi
220d0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 ons[hSession].id
220e0 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 20 entities_count)
220f0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 {...cackey_mutex
22100 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 _unlock(cackey_b
22110 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b iglock);....CACK
22120 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
22130 22 45 72 72 6f 72 2e 20 20 4b 65 79 20 68 61 6e "Error. Key han
22140 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 dle out of range
22150 20 28 72 65 71 75 65 73 74 65 64 20 6b 65 79 20 (requested key
22160 25 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75 20 69 64 %lu, only %lu id
22170 65 6e 74 69 74 69 65 73 20 61 76 61 69 6c 61 62 entities availab
22180 6c 65 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 le).", (unsigned
22190 20 6c 6f 6e 67 29 20 68 4b 65 79 2c 20 28 75 6e long) hKey, (un
221a0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63 signed long) cac
221b0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
221c0 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 ssion].identitie
221d0 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 s_count);....ret
221e0 75 72 6e 28 43 4b 52 5f 4b 45 59 5f 48 41 4e 44 urn(CKR_KEY_HAND
221f0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a LE_INVALID);..}.
22200 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e ..cackey_session
22210 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e s[hSession].sign
22220 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a 09 63 _active = 1;...c
22230 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
22240 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 Session].sign_me
22250 63 68 61 6e 69 73 6d 20 3d 20 70 4d 65 63 68 61 chanism = pMecha
22260 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b nism->mechanism;
22270 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f ...cackey_sessio
22280 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 ns[hSession].sig
22290 6e 5f 62 75 66 6c 65 6e 20 3d 20 31 32 38 3b 0a n_buflen = 128;.
222a0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 .cackey_sessions
222b0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f [hSession].sign_
222c0 62 75 66 75 73 65 64 20 3d 20 30 3b 0a 09 63 61 bufused = 0;..ca
222d0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
222e0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 ession].sign_buf
222f0 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 = malloc(sizeof
22300 28 2a 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e (*cackey_session
22310 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e s[hSession].sign
22320 5f 62 75 66 29 20 2a 20 63 61 63 6b 65 79 5f 73 _buf) * cackey_s
22330 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
22340 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29 3b 0a ].sign_buflen);.
22350 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
22360 52 49 4e 54 46 28 22 53 65 73 73 69 6f 6e 20 25 RINTF("Session %
22370 6c 75 20 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 lu sign_identity
22380 20 69 73 20 25 70 20 28 69 64 65 6e 74 69 74 79 is %p (identity
22390 20 23 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e #%lu)", (unsign
223a0 65 64 20 6c 6f 6e 67 29 20 68 53 65 73 73 69 6f ed long) hSessio
223b0 6e 2c 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 n, &cackey_sessi
223c0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 ons[hSession].id
223d0 65 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d 2c 20 entities[hKey],
223e0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
223f0 68 4b 65 79 29 3b 0a 09 63 61 63 6b 65 79 5f 73 hKey);..cackey_s
22400 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
22410 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 20 ].sign_identity
22420 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f = &cackey_sessio
22430 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 ns[hSession].ide
22440 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d 3b 0a 0a ntities[hKey];..
22450 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 .mutex_retval =
22460 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c cackey_mutex_unl
22470 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
22480 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f ck);..if (mutex_
22490 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 retval != 0) {..
224a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
224b0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e INTF("Error. Un
224c0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 locking failed."
224d0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
224e0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b _GENERAL_ERROR);
224f0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 ..}...CACKEY_DEB
22500 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
22510 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 ning CKR_OK (%i)
22520 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 ", CKR_OK);...re
22530 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a turn(CKR_OK);.}.
22540 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 .CK_DEFINE_FUNCT
22550 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 ION(CK_RV, C_Sig
22560 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 n)(CK_SESSION_HA
22570 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 NDLE hSession, C
22580 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 K_BYTE_PTR pData
22590 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 , CK_ULONG ulDat
225a0 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 aLen, CK_BYTE_PT
225b0 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b R pSignature, CK
225c0 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 _ULONG_PTR pulSi
225d0 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 75 gnatureLen) {..u
225e0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 74 61 nsigned long sta
225f0 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 3b rt_sign_bufused;
22600 0a 09 43 4b 5f 52 56 20 73 69 67 6e 5f 72 65 74 ..CK_RV sign_ret
22610 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ;...CACKEY_DEBUG
22620 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
22630 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ");...if (!cacke
22640 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b y_initialized) {
22650 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
22660 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
22670 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e Not initialized.
22680 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
22690 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 R_CRYPTOKI_NOT_I
226a0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
226b0 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d ..if (hSession =
226c0 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 = 0 || hSession
226d0 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 >= (sizeof(cacke
226e0 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 y_sessions) / si
226f0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 zeof(cackey_sess
22700 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 ions[0]))) {...C
22710 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
22720 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 TF("Error. Sess
22730 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 ion out of range
22740 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e .");......return
22750 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e (CKR_SESSION_HAN
22760 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d DLE_INVALID);..}
22770 0a 0a 09 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 ...start_sign_bu
22780 66 75 73 65 64 20 3d 20 63 61 63 6b 65 79 5f 73 fused = cackey_s
22790 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
227a0 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a ].sign_bufused;.
227b0 0a 09 73 69 67 6e 5f 72 65 74 20 3d 20 43 5f 53 ..sign_ret = C_S
227c0 69 67 6e 55 70 64 61 74 65 28 68 53 65 73 73 69 ignUpdate(hSessi
227d0 6f 6e 2c 20 70 44 61 74 61 2c 20 75 6c 44 61 74 on, pData, ulDat
227e0 61 4c 65 6e 29 3b 0a 09 69 66 20 28 73 69 67 6e aLen);..if (sign
227f0 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 _ret != CKR_OK)
22800 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
22810 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
22820 20 53 69 67 6e 55 70 64 61 74 65 28 29 20 72 65 SignUpdate() re
22830 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28 turned failure (
22840 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e rv = %lu).", (un
22850 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 signed long) sig
22860 6e 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 n_ret);....retur
22870 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a n(sign_ret);..}.
22880 0a 09 73 69 67 6e 5f 72 65 74 20 3d 20 43 5f 53 ..sign_ret = C_S
22890 69 67 6e 46 69 6e 61 6c 28 68 53 65 73 73 69 6f ignFinal(hSessio
228a0 6e 2c 20 70 53 69 67 6e 61 74 75 72 65 2c 20 70 n, pSignature, p
228b0 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 3b ulSignatureLen);
228c0 0a 09 69 66 20 28 73 69 67 6e 5f 72 65 74 20 21 ..if (sign_ret !
228d0 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 69 66 = CKR_OK) {...if
228e0 20 28 73 69 67 6e 5f 72 65 74 20 3d 3d 20 43 4b (sign_ret == CK
228f0 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 R_BUFFER_TOO_SMA
22900 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f LL) {....CACKEY_
22910 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 69 DEBUG_PRINTF("Si
22920 67 6e 46 69 6e 61 6c 28 29 20 72 65 74 75 72 6e gnFinal() return
22930 65 64 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f ed CKR_BUFFER_TO
22940 4f 5f 53 4d 41 4c 4c 20 28 72 76 20 3d 20 25 6c O_SMALL (rv = %l
22950 75 29 2c 20 75 6e 64 6f 69 6e 67 20 43 5f 53 69 u), undoing C_Si
22960 67 6e 55 70 64 61 74 65 28 29 22 2c 20 28 75 6e gnUpdate()", (un
22970 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 signed long) sig
22980 6e 5f 72 65 74 29 3b 0a 0a 09 09 09 63 61 63 6b n_ret);.....cack
22990 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
229a0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 sion].sign_bufus
229b0 65 64 20 3d 20 73 74 61 72 74 5f 73 69 67 6e 5f ed = start_sign_
229c0 62 75 66 75 73 65 64 3b 0a 0a 09 09 09 72 65 74 bufused;.....ret
229d0 75 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 urn(sign_ret);..
229e0 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 .}....CACKEY_DEB
229f0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
22a00 2e 20 20 53 69 67 6e 46 69 6e 61 6c 28 29 20 72 . SignFinal() r
22a10 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20 eturned failure
22a20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 (rv = %lu).", (u
22a30 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 nsigned long) si
22a40 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 gn_ret);....retu
22a50 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 7d rn(sign_ret);..}
22a60 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
22a70 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e PRINTF("Returnin
22a80 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 g CKR_OK (%i)",
22a90 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 CKR_OK);...retur
22aa0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b n(CKR_OK);.}..CK
22ab0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e _DEFINE_FUNCTION
22ac0 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 55 70 (CK_RV, C_SignUp
22ad0 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e date)(CK_SESSION
22ae0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e _HANDLE hSession
22af0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 , CK_BYTE_PTR pP
22b00 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c art, CK_ULONG ul
22b10 50 61 72 74 4c 65 6e 29 20 7b 0a 09 69 6e 74 20 PartLen) {..int
22b20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 mutex_retval;...
22b30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
22b40 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a NTF("Called.");.
22b50 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e ..if (!cackey_in
22b60 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 itialized) {...C
22b70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
22b80 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 TF("Error. Not
22b90 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a initialized.");.
22ba0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 ...return(CKR_CR
22bb0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 YPTOKI_NOT_INITI
22bc0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 ALIZED);..}...if
22bd0 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 (hSession == 0
22be0 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 || hSession >= (
22bf0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 sizeof(cackey_se
22c00 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 ssions) / sizeof
22c10 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 (cackey_sessions
22c20 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 [0]))) {...CACKE
22c30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
22c40 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 Error. Session
22c50 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b out of range.");
22c60 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 ......return(CKR
22c70 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f _SESSION_HANDLE_
22c80 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 INVALID);..}...i
22c90 66 20 28 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c f (pPart == NULL
22ca0 20 26 26 20 75 6c 50 61 72 74 4c 65 6e 20 3d 3d && ulPartLen ==
22cb0 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 0) {.../* Short
22cc0 20 63 69 72 63 75 69 74 20 69 66 20 77 65 20 61 circuit if we a
22cd0 72 65 20 61 73 6b 65 64 20 74 6f 20 73 69 67 6e re asked to sign
22ce0 20 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 nothing... */..
22cf0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
22d00 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
22d10 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f CKR_OK (%i) (sho
22d20 72 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b rt circuit)", CK
22d30 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e R_OK);....return
22d40 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 (CKR_OK);..}...i
22d50 66 20 28 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c f (pPart == NULL
22d60 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
22d70 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
22d80 2e 20 70 50 61 72 74 20 69 73 20 4e 55 4c 4c 2c . pPart is NULL,
22d90 20 62 75 74 20 75 6c 50 61 72 74 4c 65 6e 20 69 but ulPartLen i
22da0 73 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09 09 72 s not 0.");....r
22db0 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 eturn(CKR_ARGUME
22dc0 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 NTS_BAD);..}...i
22dd0 66 20 28 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 f (ulPartLen ==
22de0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 0) {...CACKEY_DE
22df0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
22e00 72 2e 20 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 r. ulPartLen is
22e10 30 2c 20 62 75 74 20 70 50 61 72 74 20 69 73 20 0, but pPart is
22e20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 not NULL.");....
22e30 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d return(CKR_ARGUM
22e40 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 ENTS_BAD);..}...
22e50 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 mutex_retval = c
22e60 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b ackey_mutex_lock
22e70 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 (cackey_biglock)
22e80 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 ;..if (mutex_ret
22e90 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 val != 0) {...CA
22ea0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
22eb0 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 F("Error. Locki
22ec0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 ng failed.");...
22ed0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 .return(CKR_GENE
22ee0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a RAL_ERROR);..}..
22ef0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 .if (!cackey_ses
22f00 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
22f10 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b active) {...cack
22f20 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 ey_mutex_unlock(
22f30 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
22f40 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
22f50 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
22f60 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 Session not act
22f70 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 ive.");......ret
22f80 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f urn(CKR_SESSION_
22f90 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b HANDLE_INVALID);
22fa0 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ..}...if (!cacke
22fb0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
22fc0 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 ion].sign_active
22fd0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 ) {...cackey_mut
22fe0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 ex_unlock(cackey
22ff0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 _biglock);....CA
23000 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
23010 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 F("Error. Sign
23020 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 not active.");..
23030 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f ....return(CKR_O
23040 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 PERATION_NOT_INI
23050 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 TIALIZED);..}...
23060 73 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73 switch (cackey_s
23070 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
23080 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d ].sign_mechanism
23090 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 ) {...case CKM_R
230a0 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 SA_PKCS:..../* A
230b0 63 63 75 6d 75 6c 61 74 65 20 64 69 72 65 63 74 ccumulate direct
230c0 6c 79 20 2a 2f 0a 09 09 09 69 66 20 28 28 63 61 ly */....if ((ca
230d0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
230e0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 ession].sign_buf
230f0 75 73 65 64 20 2b 20 75 6c 50 61 72 74 4c 65 6e used + ulPartLen
23100 29 20 3e 20 63 61 63 6b 65 79 5f 73 65 73 73 69 ) > cackey_sessi
23110 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 ons[hSession].si
23120 67 6e 5f 62 75 66 6c 65 6e 29 20 7b 0a 09 09 09 gn_buflen) {....
23130 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 .cackey_sessions
23140 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f [hSession].sign_
23150 62 75 66 6c 65 6e 20 2a 3d 20 32 3b 0a 0a 09 09 buflen *= 2;....
23160 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e ..cackey_session
23170 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e s[hSession].sign
23180 5f 62 75 66 20 3d 20 72 65 61 6c 6c 6f 63 28 63 _buf = realloc(c
23190 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
231a0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 Session].sign_bu
231b0 66 2c 20 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 f, sizeof(*cacke
231c0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
231d0 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20 2a ion].sign_buf) *
231e0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 cackey_sessions
231f0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f [hSession].sign_
23200 62 75 66 6c 65 6e 29 3b 0a 09 09 09 7d 0a 0a 09 buflen);....}...
23210 09 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f ..memcpy(cackey_
23220 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
23230 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 2b 20 63 61 n].sign_buf + ca
23240 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
23250 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 ession].sign_buf
23260 75 73 65 64 2c 20 70 50 61 72 74 2c 20 75 6c 50 used, pPart, ulP
23270 61 72 74 4c 65 6e 29 3b 0a 0a 09 09 09 63 61 63 artLen);.....cac
23280 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
23290 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 ssion].sign_bufu
232a0 73 65 64 20 2b 3d 20 75 6c 50 61 72 74 4c 65 6e sed += ulPartLen
232b0 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 ;.....break;...c
232c0 61 73 65 20 43 4b 4d 5f 53 48 41 31 5f 52 53 41 ase CKM_SHA1_RSA
232d0 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 58 58 58 _PKCS:..../* XXX
232e0 3a 20 41 63 63 75 6d 75 6c 61 74 65 20 69 6e 74 : Accumulate int
232f0 6f 20 61 20 53 48 41 31 20 68 61 73 68 20 2a 2f o a SHA1 hash */
23300 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 ....cackey_mutex
23310 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 _unlock(cackey_b
23320 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43 41 43 iglock);.....CAC
23330 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
23340 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f ("Returning CKR_
23350 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
23360 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b PORTED (%i)", CK
23370 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
23380 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 09 09 72 UPPORTED);.....r
23390 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 eturn(CKR_FUNCTI
233a0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
233b0 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a );....break;..}.
233c0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d ..mutex_retval =
233d0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e cackey_mutex_un
233e0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
233f0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 ock);..if (mutex
23400 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a _retval != 0) {.
23410 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
23420 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 RINTF("Error. U
23430 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e nlocking failed.
23440 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
23450 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 R_GENERAL_ERROR)
23460 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ;..}...CACKEY_DE
23470 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
23480 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 rning CKR_OK (%i
23490 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 )", CKR_OK);...r
234a0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d eturn(CKR_OK);.}
234b0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 ..CK_DEFINE_FUNC
234c0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 TION(CK_RV, C_Si
234d0 67 6e 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 gnFinal)(CK_SESS
234e0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 ION_HANDLE hSess
234f0 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 ion, CK_BYTE_PTR
23500 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f pSignature, CK_
23510 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 67 ULONG_PTR pulSig
23520 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 73 74 natureLen) {..st
23530 61 74 69 63 20 43 4b 5f 42 59 54 45 20 73 69 67 atic CK_BYTE sig
23540 62 75 66 5b 31 30 32 34 5d 3b 0a 09 73 73 69 7a buf[1024];..ssiz
23550 65 5f 74 20 73 69 67 62 75 66 6c 65 6e 3b 0a 09 e_t sigbuflen;..
23560 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 CK_SLOT_ID slotI
23570 44 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c D;..CK_RV retval
23580 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 = CKR_GENERAL_E
23590 52 52 4f 52 3b 0a 09 69 6e 74 20 74 65 72 6d 69 RROR;..int termi
235a0 6e 61 74 65 5f 73 69 67 6e 20 3d 20 31 3b 0a 09 nate_sign = 1;..
235b0 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c int mutex_retval
235c0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ;...CACKEY_DEBUG
235d0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
235e0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ");...if (!cacke
235f0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b y_initialized) {
23600 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
23610 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
23620 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e Not initialized.
23630 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
23640 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 R_CRYPTOKI_NOT_I
23650 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
23660 0a 09 69 66 20 28 70 75 6c 53 69 67 6e 61 74 75 ..if (pulSignatu
23670 72 65 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b reLen == NULL) {
23680 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
23690 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 PRINTF("Error. p
236a0 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 69 ulSignatureLen i
236b0 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 s NULL.");....re
236c0 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e turn(CKR_ARGUMEN
236d0 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 TS_BAD);..}...if
236e0 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 (hSession == 0
236f0 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 || hSession >= (
23700 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 sizeof(cackey_se
23710 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 ssions) / sizeof
23720 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 (cackey_sessions
23730 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 [0]))) {...CACKE
23740 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
23750 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 Error. Session
23760 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b out of range.");
23770 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 ......return(CKR
23780 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f _SESSION_HANDLE_
23790 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d INVALID);..}...m
237a0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 utex_retval = ca
237b0 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 ckey_mutex_lock(
237c0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
237d0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 ..if (mutex_retv
237e0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 al != 0) {...CAC
237f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
23800 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e ("Error. Lockin
23810 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 g failed.");....
23820 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 return(CKR_GENER
23830 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 AL_ERROR);..}...
23840 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 if (!cackey_sess
23850 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 ions[hSession].a
23860 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 ctive) {...cacke
23870 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
23880 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
23890 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
238a0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
238b0 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 Session not acti
238c0 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 ve.");......retu
238d0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 rn(CKR_SESSION_H
238e0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a ANDLE_INVALID);.
238f0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 .}...if (!cackey
23900 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
23910 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 on].sign_active)
23920 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 {...cackey_mute
23930 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
23940 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 biglock);....CAC
23950 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
23960 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e ("Error. Sign n
23970 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 ot active.");...
23980 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 ...return(CKR_OP
23990 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 ERATION_NOT_INIT
239a0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 IALIZED);..}...s
239b0 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 lotID = cackey_s
239c0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
239d0 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 ].slotID;...if (
239e0 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c slotID < 0 || sl
239f0 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 otID >= (sizeof(
23a00 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 cackey_slots) /
23a10 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c sizeof(cackey_sl
23a20 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 ots[0]))) {...CA
23a30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
23a40 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 F("Error. Invali
23a50 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 d slot requested
23a60 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 (%lu), outside
23a70 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c of valid range",
23a80 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 slotID);....ret
23a90 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f urn(CKR_GENERAL_
23aa0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 ERROR);..}...if
23ab0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c (cackey_slots[sl
23ac0 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 otID].active ==
23ad0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 0) {...CACKEY_DE
23ae0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
23af0 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 r. Invalid slot
23b00 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c requested (%lu),
23b10 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e slot not curren
23b20 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f tly active", slo
23b30 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f tID);....cackey_
23b40 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 mutex_unlock(cac
23b50 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 key_biglock);...
23b60 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 .return(CKR_GENE
23b70 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a RAL_ERROR);..}..
23b80 09 73 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f .switch (cackey_
23b90 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
23ba0 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 n].sign_mechanis
23bb0 6d 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f m) {...case CKM_
23bc0 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 RSA_PKCS:..../*
23bd0 41 73 6b 20 63 61 72 64 20 74 6f 20 73 69 67 6e Ask card to sign
23be0 20 2a 2f 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 */....CACKEY_DE
23bf0 42 55 47 5f 50 52 49 4e 54 46 28 22 41 73 6b 69 BUG_PRINTF("Aski
23c00 6e 67 20 74 6f 20 73 69 67 6e 20 66 72 6f 6d 20 ng to sign from
23c10 69 64 65 6e 74 69 74 79 20 25 70 20 69 6e 20 73 identity %p in s
23c20 65 73 73 69 6f 6e 20 25 6c 75 22 2c 20 63 61 63 ession %lu", cac
23c30 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
23c40 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e ssion].sign_iden
23c50 74 69 74 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 tity, (unsigned
23c60 6c 6f 6e 67 29 20 68 53 65 73 73 69 6f 6e 29 3b long) hSession);
23c70 0a 09 09 09 73 69 67 62 75 66 6c 65 6e 20 3d 20 ....sigbuflen =
23c80 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 cackey_signdecry
23c90 70 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 pt(&cackey_slots
23ca0 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65 79 [slotID], cackey
23cb0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
23cc0 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69 74 on].sign_identit
23cd0 79 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f y, cackey_sessio
23ce0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 ns[hSession].sig
23cf0 6e 5f 62 75 66 2c 20 63 61 63 6b 65 79 5f 73 65 n_buf, cackey_se
23d00 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
23d10 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 2c 20 73 .sign_bufused, s
23d20 69 67 62 75 66 2c 20 73 69 7a 65 6f 66 28 73 69 igbuf, sizeof(si
23d30 67 62 75 66 29 2c 20 31 2c 20 30 29 3b 0a 0a 09 gbuf), 1, 0);...
23d40 09 09 69 66 20 28 73 69 67 62 75 66 6c 65 6e 20 ..if (sigbuflen
23d50 3c 20 30 29 20 7b 0a 09 09 09 09 2f 2a 20 53 69 < 0) {...../* Si
23d60 67 6e 69 6e 67 20 66 61 69 6c 65 64 2e 20 2a 2f gning failed. */
23d70 0a 09 09 09 09 69 66 20 28 73 69 67 62 75 66 6c .....if (sigbufl
23d80 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 en == CACKEY_PCS
23d90 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 20 7b C_E_NEEDLOGIN) {
23da0 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 ......retval = C
23db0 4b 52 5f 55 53 45 52 5f 4e 4f 54 5f 4c 4f 47 47 KR_USER_NOT_LOGG
23dc0 45 44 5f 49 4e 3b 0a 09 09 09 09 7d 20 65 6c 73 ED_IN;.....} els
23dd0 65 20 69 66 20 28 73 69 67 62 75 66 6c 65 6e 20 e if (sigbuflen
23de0 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 == CACKEY_PCSC_E
23df0 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b 0a _TOKENABSENT) {.
23e00 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b .....retval = CK
23e10 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 R_DEVICE_REMOVED
23e20 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 ;.....} else {..
23e30 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 ....retval = CKR
23e40 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a _GENERAL_ERROR;.
23e50 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 ....}....} else
23e60 69 66 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c if (((unsigned l
23e70 6f 6e 67 29 20 73 69 67 62 75 66 6c 65 6e 29 20 ong) sigbuflen)
23e80 3e 20 2a 70 75 6c 53 69 67 6e 61 74 75 72 65 4c > *pulSignatureL
23e90 65 6e 20 26 26 20 70 53 69 67 6e 61 74 75 72 65 en && pSignature
23ea0 29 20 7b 0a 09 09 09 09 2f 2a 20 53 69 67 6e 65 ) {...../* Signe
23eb0 64 20 64 61 74 61 20 74 6f 6f 20 6c 61 72 67 65 d data too large
23ec0 20 2a 2f 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 */.....CACKEY_D
23ed0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 72 65 74 EBUG_PRINTF("ret
23ee0 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 val = CKR_BUFFER
23ef0 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 20 20 73 69 67 _TOO_SMALL; sig
23f00 62 75 66 6c 65 6e 20 3d 20 25 6c 75 2c 20 70 75 buflen = %lu, pu
23f10 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d 20 lSignatureLen =
23f20 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 %lu", (unsigned
23f30 6c 6f 6e 67 29 20 73 69 67 62 75 66 6c 65 6e 2c long) sigbuflen,
23f40 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
23f50 20 2a 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 *pulSignatureLe
23f60 6e 29 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 n);......retval
23f70 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f = CKR_BUFFER_TOO
23f80 5f 53 4d 41 4c 4c 3b 0a 0a 09 09 09 09 74 65 72 _SMALL;......ter
23f90 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 30 3b minate_sign = 0;
23fa0 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 ....} else {....
23fb0 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 .terminate_sign
23fc0 3d 20 30 3b 0a 0a 09 09 09 09 69 66 20 28 70 53 = 0;......if (pS
23fd0 69 67 6e 61 74 75 72 65 29 20 7b 0a 09 09 09 09 ignature) {.....
23fe0 09 6d 65 6d 63 70 79 28 70 53 69 67 6e 61 74 75 .memcpy(pSignatu
23ff0 72 65 2c 20 73 69 67 62 75 66 2c 20 73 69 67 62 re, sigbuf, sigb
24000 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 09 74 65 uflen);.......te
24010 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 31 rminate_sign = 1
24020 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2a 70 75 ;.....}......*pu
24030 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d 20 lSignatureLen =
24040 73 69 67 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09 sigbuflen;......
24050 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b retval = CKR_OK;
24060 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b ....}.....break;
24070 0a 09 09 63 61 73 65 20 43 4b 4d 5f 53 48 41 31 ...case CKM_SHA1
24080 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a _RSA_PKCS:..../*
24090 20 58 58 58 3a 20 41 63 63 75 6d 75 6c 61 74 65 XXX: Accumulate
240a0 20 69 6e 74 6f 20 61 20 53 48 41 31 20 68 61 73 into a SHA1 has
240b0 68 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 6d h */....cackey_m
240c0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b utex_unlock(cack
240d0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 ey_biglock);....
240e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
240f0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
24100 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
24110 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 _SUPPORTED (%i)"
24120 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e , CKR_FUNCTION_N
24130 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a OT_SUPPORTED);..
24140 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 ...return(CKR_FU
24150 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
24160 52 54 45 44 29 3b 0a 09 09 09 62 72 65 61 6b 3b RTED);....break;
24170 0a 09 7d 0a 0a 09 69 66 20 28 74 65 72 6d 69 6e ..}...if (termin
24180 61 74 65 5f 73 69 67 6e 29 20 7b 0a 09 09 69 66 ate_sign) {...if
24190 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e (cackey_session
241a0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e s[hSession].sign
241b0 5f 62 75 66 29 20 7b 0a 09 09 09 66 72 65 65 28 _buf) {....free(
241c0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
241d0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 hSession].sign_b
241e0 75 66 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b uf);...}....cack
241f0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
24200 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 sion].sign_activ
24210 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 e = 0;..}...mute
24220 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 x_retval = cacke
24230 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
24240 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
24250 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 .if (mutex_retva
24260 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b l != 0) {...CACK
24270 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
24280 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 "Error. Unlocki
24290 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 ng failed.");...
242a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 .return(CKR_GENE
242b0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a RAL_ERROR);..}..
242c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
242d0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
242e0 25 69 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 %i", (int) retva
242f0 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 l);...return(ret
24300 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 val);.}..CK_DEFI
24310 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 NE_FUNCTION(CK_R
24320 56 2c 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 V, C_SignRecover
24330 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e Init)(CK_SESSION
24340 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e _HANDLE hSession
24350 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 , CK_MECHANISM_P
24360 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 TR pMechanism, C
24370 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 K_OBJECT_HANDLE
24380 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f hKey) {..CACKEY_
24390 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
243a0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 lled.");...if (!
243b0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a cackey_initializ
243c0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...CACKEY_D
243d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
243e0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c or. Not initial
243f0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 ized.");....retu
24400 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f rn(CKR_CRYPTOKI_
24410 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 NOT_INITIALIZED)
24420 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ;..}...CACKEY_DE
24430 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
24440 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 rning CKR_FUNCTI
24450 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
24460 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 (%i)", CKR_FUNC
24470 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
24480 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b ED);...return(CK
24490 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
244a0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b UPPORTED);.}..CK
244b0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e _DEFINE_FUNCTION
244c0 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 52 65 (CK_RV, C_SignRe
244d0 63 6f 76 65 72 29 28 43 4b 5f 53 45 53 53 49 4f cover)(CK_SESSIO
244e0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f N_HANDLE hSessio
244f0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 n, CK_BYTE_PTR p
24500 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 Data, CK_ULONG u
24510 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 lDataLen, CK_BYT
24520 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 E_PTR pSignature
24530 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 , CK_ULONG_PTR p
24540 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 ulSignatureLen)
24550 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f {..CACKEY_DEBUG_
24560 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
24570 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 );...if (!cackey
24580 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
24590 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
245a0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e RINTF("Error. N
245b0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 ot initialized."
245c0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
245d0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e _CRYPTOKI_NOT_IN
245e0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
245f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
24600 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
24610 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
24620 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 _SUPPORTED (%i)"
24630 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e , CKR_FUNCTION_N
24640 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a OT_SUPPORTED);..
24650 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 .return(CKR_FUNC
24660 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
24670 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e ED);.}..CK_DEFIN
24680 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 E_FUNCTION(CK_RV
24690 2c 20 43 5f 56 65 72 69 66 79 49 6e 69 74 29 28 , C_VerifyInit)(
246a0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c CK_SESSION_HANDL
246b0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d E hSession, CK_M
246c0 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 ECHANISM_PTR pMe
246d0 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 chanism, CK_OBJE
246e0 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 CT_HANDLE hKey)
246f0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f {..CACKEY_DEBUG_
24700 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
24710 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 );...if (!cackey
24720 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
24730 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
24740 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e RINTF("Error. N
24750 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 ot initialized."
24760 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
24770 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e _CRYPTOKI_NOT_IN
24780 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
24790 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
247a0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
247b0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
247c0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 _SUPPORTED (%i)"
247d0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e , CKR_FUNCTION_N
247e0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a OT_SUPPORTED);..
247f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 .return(CKR_FUNC
24800 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
24810 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e ED);.}..CK_DEFIN
24820 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 E_FUNCTION(CK_RV
24830 2c 20 43 5f 56 65 72 69 66 79 29 28 43 4b 5f 53 , C_Verify)(CK_S
24840 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 ESSION_HANDLE hS
24850 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f ession, CK_BYTE_
24860 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c PTR pData, CK_UL
24870 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 ONG ulDataLen, C
24880 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e K_BYTE_PTR pSign
24890 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 ature, CK_ULONG
248a0 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 ulSignatureLen)
248b0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f {..CACKEY_DEBUG_
248c0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
248d0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 );...if (!cackey
248e0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
248f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
24900 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e RINTF("Error. N
24910 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 ot initialized."
24920 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
24930 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e _CRYPTOKI_NOT_IN
24940 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
24950 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
24960 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
24970 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
24980 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 _SUPPORTED (%i)"
24990 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e , CKR_FUNCTION_N
249a0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a OT_SUPPORTED);..
249b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 .return(CKR_FUNC
249c0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
249d0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e ED);.}..CK_DEFIN
249e0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 E_FUNCTION(CK_RV
249f0 2c 20 43 5f 56 65 72 69 66 79 55 70 64 61 74 65 , C_VerifyUpdate
24a00 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e )(CK_SESSION_HAN
24a10 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b DLE hSession, CK
24a20 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c _BYTE_PTR pPart,
24a30 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 CK_ULONG ulPart
24a40 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 Len) {..CACKEY_D
24a50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
24a60 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 led.");...if (!c
24a70 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 ackey_initialize
24a80 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 d) {...CACKEY_DE
24a90 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
24aa0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 r. Not initiali
24ab0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 zed.");....retur
24ac0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e n(CKR_CRYPTOKI_N
24ad0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b OT_INITIALIZED);
24ae0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 ..}...CACKEY_DEB
24af0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
24b00 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f ning CKR_FUNCTIO
24b10 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 N_NOT_SUPPORTED
24b20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 (%i)", CKR_FUNCT
24b30 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
24b40 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 D);...return(CKR
24b50 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
24b60 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f PPORTED);.}..CK_
24b70 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 DEFINE_FUNCTION(
24b80 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 46 CK_RV, C_VerifyF
24b90 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e inal)(CK_SESSION
24ba0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e _HANDLE hSession
24bb0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 , CK_BYTE_PTR pS
24bc0 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f ignature, CK_ULO
24bd0 4e 47 20 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 NG ulSignatureLe
24be0 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 n) {..CACKEY_DEB
24bf0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
24c00 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 d.");...if (!cac
24c10 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 key_initialized)
24c20 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
24c30 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
24c40 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 Not initialize
24c50 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
24c60 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 CKR_CRYPTOKI_NOT
24c70 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 _INITIALIZED);..
24c80 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 }...CACKEY_DEBUG
24c90 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
24ca0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f ng CKR_FUNCTION_
24cb0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 NOT_SUPPORTED (%
24cc0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f i)", CKR_FUNCTIO
24cd0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 N_NOT_SUPPORTED)
24ce0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 ;...return(CKR_F
24cf0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
24d00 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 ORTED);.}..CK_DE
24d10 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b FINE_FUNCTION(CK
24d20 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 52 65 63 _RV, C_VerifyRec
24d30 6f 76 65 72 49 6e 69 74 29 28 43 4b 5f 53 45 53 overInit)(CK_SES
24d40 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 SION_HANDLE hSes
24d50 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 sion, CK_MECHANI
24d60 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 SM_PTR pMechanis
24d70 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e m, CK_OBJECT_HAN
24d80 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 DLE hKey) {..CAC
24d90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
24da0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 ("Called.");...i
24db0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 f (!cackey_initi
24dc0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b alized) {...CACK
24dd0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
24de0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 "Error. Not ini
24df0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 tialized.");....
24e00 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 return(CKR_CRYPT
24e10 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 OKI_NOT_INITIALI
24e20 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 ZED);..}...CACKE
24e30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
24e40 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 Returning CKR_FU
24e50 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
24e60 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f RTED (%i)", CKR_
24e70 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
24e80 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 PORTED);...retur
24e90 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e n(CKR_FUNCTION_N
24ea0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d OT_SUPPORTED);.}
24eb0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 ..CK_DEFINE_FUNC
24ec0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 TION(CK_RV, C_Ve
24ed0 72 69 66 79 52 65 63 6f 76 65 72 29 28 43 4b 5f rifyRecover)(CK_
24ee0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 SESSION_HANDLE h
24ef0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 Session, CK_BYTE
24f00 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c _PTR pSignature,
24f10 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e CK_ULONG ulSign
24f20 61 74 75 72 65 4c 65 6e 2c 20 43 4b 5f 42 59 54 atureLen, CK_BYT
24f30 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f E_PTR pData, CK_
24f40 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 61 74 ULONG_PTR pulDat
24f50 61 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f aLen) {..CACKEY_
24f60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
24f70 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 lled.");...if (!
24f80 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a cackey_initializ
24f90 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...CACKEY_D
24fa0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
24fb0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c or. Not initial
24fc0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 ized.");....retu
24fd0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f rn(CKR_CRYPTOKI_
24fe0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 NOT_INITIALIZED)
24ff0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ;..}...CACKEY_DE
25000 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
25010 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 rning CKR_FUNCTI
25020 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
25030 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 (%i)", CKR_FUNC
25040 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
25050 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b ED);...return(CK
25060 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
25070 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b UPPORTED);.}..CK
25080 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e _DEFINE_FUNCTION
25090 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 (CK_RV, C_Digest
250a0 45 6e 63 72 79 70 74 55 70 64 61 74 65 29 28 43 EncryptUpdate)(C
250b0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 K_SESSION_HANDLE
250c0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 hSession, CK_BY
250d0 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b TE_PTR pPart, CK
250e0 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e _ULONG ulPartLen
250f0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 , CK_BYTE_PTR pE
25100 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b ncryptedPart, CK
25110 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e _ULONG_PTR pulEn
25120 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20 cryptedPartLen)
25130 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f {..CACKEY_DEBUG_
25140 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
25150 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 );...if (!cackey
25160 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
25170 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
25180 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e RINTF("Error. N
25190 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 ot initialized."
251a0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
251b0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e _CRYPTOKI_NOT_IN
251c0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
251d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
251e0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
251f0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
25200 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 _SUPPORTED (%i)"
25210 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e , CKR_FUNCTION_N
25220 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a OT_SUPPORTED);..
25230 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 .return(CKR_FUNC
25240 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
25250 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e ED);.}..CK_DEFIN
25260 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 E_FUNCTION(CK_RV
25270 2c 20 43 5f 44 65 63 72 79 70 74 44 69 67 65 73 , C_DecryptDiges
25280 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 tUpdate)(CK_SESS
25290 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 ION_HANDLE hSess
252a0 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 ion, CK_BYTE_PTR
252b0 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c pEncryptedPart,
252c0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 CK_ULONG ulEncr
252d0 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b yptedPartLen, CK
252e0 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c _BYTE_PTR pPart,
252f0 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 CK_ULONG_PTR pu
25300 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 lPartLen) {..CAC
25310 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
25320 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 ("Called.");...i
25330 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 f (!cackey_initi
25340 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b alized) {...CACK
25350 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
25360 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 "Error. Not ini
25370 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 tialized.");....
25380 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 return(CKR_CRYPT
25390 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 OKI_NOT_INITIALI
253a0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 ZED);..}...CACKE
253b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
253c0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 Returning CKR_FU
253d0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
253e0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f RTED (%i)", CKR_
253f0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
25400 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 PORTED);...retur
25410 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e n(CKR_FUNCTION_N
25420 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d OT_SUPPORTED);.}
25430 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 ..CK_DEFINE_FUNC
25440 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 TION(CK_RV, C_Si
25450 67 6e 45 6e 63 72 79 70 74 55 70 64 61 74 65 29 gnEncryptUpdate)
25460 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 (CK_SESSION_HAND
25470 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f LE hSession, CK_
25480 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 BYTE_PTR pPart,
25490 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c CK_ULONG ulPartL
254a0 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 en, CK_BYTE_PTR
254b0 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 pEncryptedPart,
254c0 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c CK_ULONG_PTR pul
254d0 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e EncryptedPartLen
254e0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 ) {..CACKEY_DEBU
254f0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 G_PRINTF("Called
25500 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b .");...if (!cack
25510 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 ey_initialized)
25520 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
25530 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
25540 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 Not initialized
25550 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
25560 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f KR_CRYPTOKI_NOT_
25570 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d INITIALIZED);..}
25580 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
25590 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e PRINTF("Returnin
255a0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e g CKR_FUNCTION_N
255b0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 OT_SUPPORTED (%i
255c0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e )", CKR_FUNCTION
255d0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
255e0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 ...return(CKR_FU
255f0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
25600 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 RTED);.}..CK_DEF
25610 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f INE_FUNCTION(CK_
25620 52 56 2c 20 43 5f 44 65 63 72 79 70 74 56 65 72 RV, C_DecryptVer
25630 69 66 79 55 70 64 61 74 65 29 28 43 4b 5f 53 45 ifyUpdate)(CK_SE
25640 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 SSION_HANDLE hSe
25650 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 ssion, CK_BYTE_P
25660 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 TR pEncryptedPar
25670 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e t, CK_ULONG ulEn
25680 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 cryptedPartLen,
25690 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 CK_BYTE_PTR pPar
256a0 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 t, CK_ULONG_PTR
256b0 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 pulPartLen) {..C
256c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
256d0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
256e0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 .if (!cackey_ini
256f0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 tialized) {...CA
25700 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
25710 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 F("Error. Not i
25720 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a nitialized.");..
25730 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 ..return(CKR_CRY
25740 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 PTOKI_NOT_INITIA
25750 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 LIZED);..}...CAC
25760 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
25770 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f ("Returning CKR_
25780 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
25790 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b PORTED (%i)", CK
257a0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
257b0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 UPPORTED);...ret
257c0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e urn(CKR_FUNCTION
257d0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
257e0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 .}..CK_DEFINE_FU
257f0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f NCTION(CK_RV, C_
25800 47 65 6e 65 72 61 74 65 4b 65 79 29 28 43 4b 5f GenerateKey)(CK_
25810 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 SESSION_HANDLE h
25820 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 Session, CK_MECH
25830 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 ANISM_PTR pMecha
25840 6e 69 73 6d 2c 20 43 4b 5f 41 54 54 52 49 42 55 nism, CK_ATTRIBU
25850 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 TE_PTR pTemplate
25860 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 , CK_ULONG ulCou
25870 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 nt, CK_OBJECT_HA
25880 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65 79 29 20 NDLE_PTR phKey)
25890 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f {..CACKEY_DEBUG_
258a0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
258b0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 );...if (!cackey
258c0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
258d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
258e0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e RINTF("Error. N
258f0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 ot initialized."
25900 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
25910 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e _CRYPTOKI_NOT_IN
25920 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
25930 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
25940 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
25950 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
25960 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 _SUPPORTED (%i)"
25970 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e , CKR_FUNCTION_N
25980 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a OT_SUPPORTED);..
25990 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 .return(CKR_FUNC
259a0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
259b0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e ED);.}..CK_DEFIN
259c0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 E_FUNCTION(CK_RV
259d0 2c 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 50 , C_GenerateKeyP
259e0 61 69 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f air)(CK_SESSION_
259f0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c HANDLE hSession,
25a00 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 CK_MECHANISM_PT
25a10 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b R pMechanism, CK
25a20 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 _ATTRIBUTE_PTR p
25a30 50 75 62 6c 69 63 4b 65 79 54 65 6d 70 6c 61 74 PublicKeyTemplat
25a40 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 75 e, CK_ULONG ulPu
25a50 62 6c 69 63 4b 65 79 41 74 74 72 69 62 75 74 65 blicKeyAttribute
25a60 43 6f 75 6e 74 2c 20 43 4b 5f 41 54 54 52 49 42 Count, CK_ATTRIB
25a70 55 54 45 5f 50 54 52 20 70 50 72 69 76 61 74 65 UTE_PTR pPrivate
25a80 4b 65 79 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f KeyTemplate, CK_
25a90 55 4c 4f 4e 47 20 75 6c 50 72 69 76 61 74 65 4b ULONG ulPrivateK
25aa0 65 79 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74 eyAttributeCount
25ab0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 , CK_OBJECT_HAND
25ac0 4c 45 5f 50 54 52 20 70 68 50 75 62 6c 69 63 4b LE_PTR phPublicK
25ad0 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 ey, CK_OBJECT_HA
25ae0 4e 44 4c 45 5f 50 54 52 20 70 68 50 72 69 76 61 NDLE_PTR phPriva
25af0 74 65 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 teKey) {..CACKEY
25b00 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 _DEBUG_PRINTF("C
25b10 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 alled.");...if (
25b20 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 !cackey_initiali
25b30 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f zed) {...CACKEY_
25b40 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
25b50 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 ror. Not initia
25b60 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 lized.");....ret
25b70 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 urn(CKR_CRYPTOKI
25b80 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 _NOT_INITIALIZED
25b90 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 );..}...CACKEY_D
25ba0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
25bb0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 urning CKR_FUNCT
25bc0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
25bd0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e D (%i)", CKR_FUN
25be0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
25bf0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 TED);...return(C
25c00 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
25c10 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 SUPPORTED);.}..C
25c20 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f K_DEFINE_FUNCTIO
25c30 4e 28 43 4b 5f 52 56 2c 20 43 5f 57 72 61 70 4b N(CK_RV, C_WrapK
25c40 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 ey)(CK_SESSION_H
25c50 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 ANDLE hSession,
25c60 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 CK_MECHANISM_PTR
25c70 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f pMechanism, CK_
25c80 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 57 OBJECT_HANDLE hW
25c90 72 61 70 70 69 6e 67 4b 65 79 2c 20 43 4b 5f 4f rappingKey, CK_O
25ca0 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 BJECT_HANDLE hKe
25cb0 79 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 y, CK_BYTE_PTR p
25cc0 57 72 61 70 70 65 64 4b 65 79 2c 20 43 4b 5f 55 WrappedKey, CK_U
25cd0 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 57 72 61 70 LONG_PTR pulWrap
25ce0 70 65 64 4b 65 79 4c 65 6e 29 20 7b 0a 09 43 41 pedKeyLen) {..CA
25cf0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
25d00 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
25d10 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 if (!cackey_init
25d20 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 ialized) {...CAC
25d30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
25d40 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e ("Error. Not in
25d50 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 itialized.");...
25d60 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 .return(CKR_CRYP
25d70 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c TOKI_NOT_INITIAL
25d80 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b IZED);..}...CACK
25d90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
25da0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 "Returning CKR_F
25db0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
25dc0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 ORTED (%i)", CKR
25dd0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
25de0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 PPORTED);...retu
25df0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f rn(CKR_FUNCTION_
25e00 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
25e10 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e }..CK_DEFINE_FUN
25e20 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 55 CTION(CK_RV, C_U
25e30 6e 77 72 61 70 4b 65 79 29 28 43 4b 5f 53 45 53 nwrapKey)(CK_SES
25e40 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 SION_HANDLE hSes
25e50 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 sion, CK_MECHANI
25e60 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 SM_PTR pMechanis
25e70 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e m, CK_OBJECT_HAN
25e80 44 4c 45 20 68 55 6e 77 72 61 70 70 69 6e 67 4b DLE hUnwrappingK
25e90 65 79 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 ey, CK_BYTE_PTR
25ea0 70 57 72 61 70 70 65 64 4b 65 79 2c 20 43 4b 5f pWrappedKey, CK_
25eb0 55 4c 4f 4e 47 20 75 6c 57 72 61 70 70 65 64 4b ULONG ulWrappedK
25ec0 65 79 4c 65 6e 2c 20 43 4b 5f 41 54 54 52 49 42 eyLen, CK_ATTRIB
25ed0 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 UTE_PTR pTemplat
25ee0 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 41 74 e, CK_ULONG ulAt
25ef0 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b tributeCount, CK
25f00 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 _OBJECT_HANDLE_P
25f10 54 52 20 70 68 4b 65 79 29 20 7b 0a 09 43 41 43 TR phKey) {..CAC
25f20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
25f30 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 ("Called.");...i
25f40 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 f (!cackey_initi
25f50 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b alized) {...CACK
25f60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
25f70 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 "Error. Not ini
25f80 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 tialized.");....
25f90 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 return(CKR_CRYPT
25fa0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 OKI_NOT_INITIALI
25fb0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 ZED);..}...CACKE
25fc0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
25fd0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 Returning CKR_FU
25fe0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
25ff0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f RTED (%i)", CKR_
26000 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
26010 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 PORTED);...retur
26020 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e n(CKR_FUNCTION_N
26030 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d OT_SUPPORTED);.}
26040 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 ..CK_DEFINE_FUNC
26050 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 TION(CK_RV, C_De
26060 72 69 76 65 4b 65 79 29 28 43 4b 5f 53 45 53 53 riveKey)(CK_SESS
26070 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 ION_HANDLE hSess
26080 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 ion, CK_MECHANIS
26090 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d M_PTR pMechanism
260a0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 , CK_OBJECT_HAND
260b0 4c 45 20 68 42 61 73 65 4b 65 79 2c 20 43 4b 5f LE hBaseKey, CK_
260c0 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 ATTRIBUTE_PTR pT
260d0 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e emplate, CK_ULON
260e0 47 20 75 6c 41 74 74 72 69 62 75 74 65 43 6f 75 G ulAttributeCou
260f0 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 nt, CK_OBJECT_HA
26100 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65 79 29 20 NDLE_PTR phKey)
26110 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f {..CACKEY_DEBUG_
26120 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
26130 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 );...if (!cackey
26140 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
26150 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
26160 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e RINTF("Error. N
26170 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 ot initialized."
26180 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
26190 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e _CRYPTOKI_NOT_IN
261a0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
261b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
261c0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
261d0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
261e0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 _SUPPORTED (%i)"
261f0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e , CKR_FUNCTION_N
26200 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a OT_SUPPORTED);..
26210 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 .return(CKR_FUNC
26220 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
26230 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e ED);.}..CK_DEFIN
26240 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 E_FUNCTION(CK_RV
26250 2c 20 43 5f 53 65 65 64 52 61 6e 64 6f 6d 29 28 , C_SeedRandom)(
26260 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c CK_SESSION_HANDL
26270 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 E hSession, CK_B
26280 59 54 45 5f 50 54 52 20 70 53 65 65 64 2c 20 43 YTE_PTR pSeed, C
26290 4b 5f 55 4c 4f 4e 47 20 75 6c 53 65 65 64 4c 65 K_ULONG ulSeedLe
262a0 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 n) {..CACKEY_DEB
262b0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
262c0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 d.");...if (!cac
262d0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 key_initialized)
262e0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
262f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
26300 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 Not initialize
26310 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
26320 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 CKR_CRYPTOKI_NOT
26330 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 _INITIALIZED);..
26340 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 }...CACKEY_DEBUG
26350 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
26360 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f ng CKR_FUNCTION_
26370 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 NOT_SUPPORTED (%
26380 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f i)", CKR_FUNCTIO
26390 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 N_NOT_SUPPORTED)
263a0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 ;...return(CKR_F
263b0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
263c0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 ORTED);.}..CK_DE
263d0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b FINE_FUNCTION(CK
263e0 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61 74 65 52 _RV, C_GenerateR
263f0 61 6e 64 6f 6d 29 28 43 4b 5f 53 45 53 53 49 4f andom)(CK_SESSIO
26400 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f N_HANDLE hSessio
26410 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 n, CK_BYTE_PTR p
26420 52 61 6e 64 6f 6d 44 61 74 61 2c 20 43 4b 5f 55 RandomData, CK_U
26430 4c 4f 4e 47 20 75 6c 52 61 6e 64 6f 6d 4c 65 6e LONG ulRandomLen
26440 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 ) {..CACKEY_DEBU
26450 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 G_PRINTF("Called
26460 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b .");...if (!cack
26470 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 ey_initialized)
26480 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
26490 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
264a0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 Not initialized
264b0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
264c0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f KR_CRYPTOKI_NOT_
264d0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d INITIALIZED);..}
264e0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
264f0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e PRINTF("Returnin
26500 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e g CKR_FUNCTION_N
26510 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 OT_SUPPORTED (%i
26520 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e )", CKR_FUNCTION
26530 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
26540 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 ...return(CKR_FU
26550 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
26560 52 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 44 65 70 RTED);.}../* Dep
26570 72 65 63 61 74 65 64 20 46 75 6e 63 74 69 6f 6e recated Function
26580 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 */.CK_DEFINE_FU
26590 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f NCTION(CK_RV, C_
265a0 47 65 74 46 75 6e 63 74 69 6f 6e 53 74 61 74 75 GetFunctionStatu
265b0 73 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 s)(CK_SESSION_HA
265c0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b NDLE hSession) {
265d0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
265e0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
265f0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ;...CACKEY_DEBUG
26600 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
26610 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f ng CKR_FUNCTION_
26620 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 20 28 25 69 NOT_PARALLEL (%i
26630 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e )", CKR_FUNCTION
26640 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a _NOT_PARALLEL);.
26650 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e ..return(CKR_FUN
26660 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c CTION_NOT_PARALL
26670 45 4c 29 3b 0a 0a 09 68 53 65 73 73 69 6f 6e 20 EL);...hSession
26680 3d 20 68 53 65 73 73 69 6f 6e 3b 20 2f 2a 20 53 = hSession; /* S
26690 75 70 72 65 73 73 20 75 6e 75 73 65 64 20 76 61 upress unused va
266a0 72 69 61 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a riable warning *
266b0 2f 0a 7d 0a 0a 2f 2a 20 44 65 70 72 65 63 61 74 /.}../* Deprecat
266c0 65 64 20 46 75 6e 63 74 69 6f 6e 20 2a 2f 0a 43 ed Function */.C
266d0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f K_DEFINE_FUNCTIO
266e0 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 61 6e 63 65 N(CK_RV, C_Cance
266f0 6c 46 75 6e 63 74 69 6f 6e 29 28 43 4b 5f 53 45 lFunction)(CK_SE
26700 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 SSION_HANDLE hSe
26710 73 73 69 6f 6e 29 20 7b 0a 09 43 41 43 4b 45 59 ssion) {..CACKEY
26720 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 _DEBUG_PRINTF("C
26730 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b alled.");...CACK
26740 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
26750 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 "Returning CKR_F
26760 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 UNCTION_NOT_PARA
26770 4c 4c 45 4c 20 28 25 69 29 22 2c 20 43 4b 52 5f LLEL (%i)", CKR_
26780 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 FUNCTION_NOT_PAR
26790 41 4c 4c 45 4c 29 3b 0a 0a 09 72 65 74 75 72 6e ALLEL);...return
267a0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f (CKR_FUNCTION_NO
267b0 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 68 T_PARALLEL);...h
267c0 53 65 73 73 69 6f 6e 20 3d 20 68 53 65 73 73 69 Session = hSessi
267d0 6f 6e 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75 on; /* Supress u
267e0 6e 75 73 65 64 20 76 61 72 69 61 62 6c 65 20 77 nused variable w
267f0 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f arning */.}..CK_
26800 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 DEFINE_FUNCTION(
26810 43 4b 5f 52 56 2c 20 43 5f 47 65 74 46 75 6e 63 CK_RV, C_GetFunc
26820 74 69 6f 6e 4c 69 73 74 29 28 43 4b 5f 46 55 4e tionList)(CK_FUN
26830 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 5f 50 CTION_LIST_PTR_P
26840 54 52 20 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 TR ppFunctionLis
26850 74 29 20 7b 0a 09 43 4b 5f 46 55 4e 43 54 49 4f t) {..CK_FUNCTIO
26860 4e 5f 4c 49 53 54 5f 50 54 52 20 70 46 75 6e 63 N_LIST_PTR pFunc
26870 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 43 41 43 4b tionList;...CACK
26880 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
26890 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 "Called.");...if
268a0 20 28 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 (ppFunctionList
268b0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 == NULL) {...CA
268c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
268d0 46 28 22 45 72 72 6f 72 2e 20 70 70 46 75 6e 63 F("Error. ppFunc
268e0 74 69 6f 6e 4c 69 73 74 20 69 73 20 4e 55 4c 4c tionList is NULL
268f0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
26900 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 KR_ARGUMENTS_BAD
26910 29 3b 0a 09 7d 0a 0a 09 70 46 75 6e 63 74 69 6f );..}...pFunctio
26920 6e 4c 69 73 74 20 3d 20 6d 61 6c 6c 6f 63 28 73 nList = malloc(s
26930 69 7a 65 6f 66 28 2a 70 46 75 6e 63 74 69 6f 6e izeof(*pFunction
26940 4c 69 73 74 29 29 3b 0a 0a 09 70 46 75 6e 63 74 List));...pFunct
26950 69 6f 6e 4c 69 73 74 2d 3e 76 65 72 73 69 6f 6e ionList->version
26960 2e 6d 61 6a 6f 72 20 3d 20 28 28 43 41 43 4b 45 .major = ((CACKE
26970 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 Y_CRYPTOKI_VERSI
26980 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 31 36 29 20 ON_CODE) >> 16)
26990 26 20 30 78 66 66 3b 0a 09 70 46 75 6e 63 74 69 & 0xff;..pFuncti
269a0 6f 6e 4c 69 73 74 2d 3e 76 65 72 73 69 6f 6e 2e onList->version.
269b0 6d 69 6e 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 minor = ((CACKEY
269c0 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f _CRYPTOKI_VERSIO
269d0 4e 5f 43 4f 44 45 29 20 3e 3e 20 38 29 20 26 20 N_CODE) >> 8) &
269e0 30 78 66 66 3b 0a 0a 09 70 46 75 6e 63 74 69 6f 0xff;...pFunctio
269f0 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 69 61 6c nList->C_Initial
26a00 69 7a 65 20 3d 20 43 5f 49 6e 69 74 69 61 6c 69 ize = C_Initiali
26a10 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 ze;..pFunctionLi
26a20 73 74 2d 3e 43 5f 46 69 6e 61 6c 69 7a 65 20 3d st->C_Finalize =
26a30 20 43 5f 46 69 6e 61 6c 69 7a 65 3b 0a 09 70 46 C_Finalize;..pF
26a40 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 unctionList->C_G
26a50 65 74 49 6e 66 6f 20 3d 20 43 5f 47 65 74 49 6e etInfo = C_GetIn
26a60 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 fo;..pFunctionLi
26a70 73 74 2d 3e 43 5f 47 65 74 53 6c 6f 74 4c 69 73 st->C_GetSlotLis
26a80 74 20 3d 20 43 5f 47 65 74 53 6c 6f 74 4c 69 73 t = C_GetSlotLis
26a90 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 t;..pFunctionLis
26aa0 74 2d 3e 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f t->C_GetSlotInfo
26ab0 20 3d 20 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f = C_GetSlotInfo
26ac0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 ;..pFunctionList
26ad0 2d 3e 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f ->C_GetTokenInfo
26ae0 20 3d 20 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 = C_GetTokenInf
26af0 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 o;..pFunctionLis
26b00 74 2d 3e 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74 t->C_WaitForSlot
26b10 45 76 65 6e 74 20 3d 20 43 5f 57 61 69 74 46 6f Event = C_WaitFo
26b20 72 53 6c 6f 74 45 76 65 6e 74 3b 0a 09 70 46 75 rSlotEvent;..pFu
26b30 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 nctionList->C_Ge
26b40 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 20 3d tMechanismList =
26b50 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c C_GetMechanismL
26b60 69 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c ist;..pFunctionL
26b70 69 73 74 2d 3e 43 5f 47 65 74 4d 65 63 68 61 6e ist->C_GetMechan
26b80 69 73 6d 49 6e 66 6f 20 3d 20 43 5f 47 65 74 4d ismInfo = C_GetM
26b90 65 63 68 61 6e 69 73 6d 49 6e 66 6f 3b 0a 09 70 echanismInfo;..p
26ba0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f FunctionList->C_
26bb0 49 6e 69 74 54 6f 6b 65 6e 20 3d 20 43 5f 49 6e InitToken = C_In
26bc0 69 74 54 6f 6b 65 6e 3b 0a 09 70 46 75 6e 63 74 itToken;..pFunct
26bd0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 50 ionList->C_InitP
26be0 49 4e 20 3d 20 43 5f 49 6e 69 74 50 49 4e 3b 0a IN = C_InitPIN;.
26bf0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e .pFunctionList->
26c00 43 5f 53 65 74 50 49 4e 20 3d 20 43 5f 53 65 74 C_SetPIN = C_Set
26c10 50 49 4e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c PIN;..pFunctionL
26c20 69 73 74 2d 3e 43 5f 4f 70 65 6e 53 65 73 73 69 ist->C_OpenSessi
26c30 6f 6e 20 3d 20 43 5f 4f 70 65 6e 53 65 73 73 69 on = C_OpenSessi
26c40 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 on;..pFunctionLi
26c50 73 74 2d 3e 43 5f 43 6c 6f 73 65 53 65 73 73 69 st->C_CloseSessi
26c60 6f 6e 20 3d 20 43 5f 43 6c 6f 73 65 53 65 73 73 on = C_CloseSess
26c70 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c ion;..pFunctionL
26c80 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 41 6c 6c 53 ist->C_CloseAllS
26c90 65 73 73 69 6f 6e 73 20 3d 20 43 5f 43 6c 6f 73 essions = C_Clos
26ca0 65 41 6c 6c 53 65 73 73 69 6f 6e 73 3b 0a 09 70 eAllSessions;..p
26cb0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f FunctionList->C_
26cc0 47 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f 20 3d GetSessionInfo =
26cd0 20 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e 66 C_GetSessionInf
26ce0 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 o;..pFunctionLis
26cf0 74 2d 3e 43 5f 47 65 74 4f 70 65 72 61 74 69 6f t->C_GetOperatio
26d00 6e 53 74 61 74 65 20 3d 20 43 5f 47 65 74 4f 70 nState = C_GetOp
26d10 65 72 61 74 69 6f 6e 53 74 61 74 65 3b 0a 09 70 erationState;..p
26d20 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f FunctionList->C_
26d30 53 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 SetOperationStat
26d40 65 20 3d 20 43 5f 53 65 74 4f 70 65 72 61 74 69 e = C_SetOperati
26d50 6f 6e 53 74 61 74 65 3b 0a 09 70 46 75 6e 63 74 onState;..pFunct
26d60 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4c 6f 67 69 6e ionList->C_Login
26d70 20 3d 20 43 5f 4c 6f 67 69 6e 3b 0a 09 70 46 75 = C_Login;..pFu
26d80 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4c 6f nctionList->C_Lo
26d90 67 6f 75 74 20 3d 20 43 5f 4c 6f 67 6f 75 74 3b gout = C_Logout;
26da0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d ..pFunctionList-
26db0 3e 43 5f 43 72 65 61 74 65 4f 62 6a 65 63 74 20 >C_CreateObject
26dc0 3d 20 43 5f 43 72 65 61 74 65 4f 62 6a 65 63 74 = C_CreateObject
26dd0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 ;..pFunctionList
26de0 2d 3e 43 5f 43 6f 70 79 4f 62 6a 65 63 74 20 3d ->C_CopyObject =
26df0 20 43 5f 43 6f 70 79 4f 62 6a 65 63 74 3b 0a 09 C_CopyObject;..
26e00 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 pFunctionList->C
26e10 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63 74 20 3d _DestroyObject =
26e20 20 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63 74 C_DestroyObject
26e30 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 ;..pFunctionList
26e40 2d 3e 43 5f 47 65 74 4f 62 6a 65 63 74 53 69 7a ->C_GetObjectSiz
26e50 65 20 3d 20 43 5f 47 65 74 4f 62 6a 65 63 74 53 e = C_GetObjectS
26e60 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c ize;..pFunctionL
26e70 69 73 74 2d 3e 43 5f 47 65 74 41 74 74 72 69 62 ist->C_GetAttrib
26e80 75 74 65 56 61 6c 75 65 20 3d 20 43 5f 47 65 74 uteValue = C_Get
26e90 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 3b 0a AttributeValue;.
26ea0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e .pFunctionList->
26eb0 43 5f 53 65 74 41 74 74 72 69 62 75 74 65 56 61 C_SetAttributeVa
26ec0 6c 75 65 20 3d 20 43 5f 53 65 74 41 74 74 72 69 lue = C_SetAttri
26ed0 62 75 74 65 56 61 6c 75 65 3b 0a 09 70 46 75 6e buteValue;..pFun
26ee0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e ctionList->C_Fin
26ef0 64 4f 62 6a 65 63 74 73 49 6e 69 74 20 3d 20 43 dObjectsInit = C
26f00 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 _FindObjectsInit
26f10 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 ;..pFunctionList
26f20 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 20 ->C_FindObjects
26f30 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 3b = C_FindObjects;
26f40 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d ..pFunctionList-
26f50 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46 69 >C_FindObjectsFi
26f60 6e 61 6c 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 nal = C_FindObje
26f70 63 74 73 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 ctsFinal;..pFunc
26f80 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 tionList->C_Encr
26f90 79 70 74 49 6e 69 74 20 3d 20 43 5f 45 6e 63 72 yptInit = C_Encr
26fa0 79 70 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 yptInit;..pFunct
26fb0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 ionList->C_Encry
26fc0 70 74 20 3d 20 43 5f 45 6e 63 72 79 70 74 3b 0a pt = C_Encrypt;.
26fd0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e .pFunctionList->
26fe0 43 5f 45 6e 63 72 79 70 74 55 70 64 61 74 65 20 C_EncryptUpdate
26ff0 3d 20 43 5f 45 6e 63 72 79 70 74 55 70 64 61 74 = C_EncryptUpdat
27000 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 e;..pFunctionLis
27010 74 2d 3e 43 5f 45 6e 63 72 79 70 74 46 69 6e 61 t->C_EncryptFina
27020 6c 20 3d 20 43 5f 45 6e 63 72 79 70 74 46 69 6e l = C_EncryptFin
27030 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 al;..pFunctionLi
27040 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 49 6e 69 st->C_DecryptIni
27050 74 20 3d 20 43 5f 44 65 63 72 79 70 74 49 6e 69 t = C_DecryptIni
27060 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 t;..pFunctionLis
27070 74 2d 3e 43 5f 44 65 63 72 79 70 74 20 3d 20 43 t->C_Decrypt = C
27080 5f 44 65 63 72 79 70 74 3b 0a 09 70 46 75 6e 63 _Decrypt;..pFunc
27090 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 tionList->C_Decr
270a0 79 70 74 55 70 64 61 74 65 20 3d 20 43 5f 44 65 yptUpdate = C_De
270b0 63 72 79 70 74 55 70 64 61 74 65 3b 0a 09 70 46 cryptUpdate;..pF
270c0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 unctionList->C_D
270d0 65 63 72 79 70 74 46 69 6e 61 6c 20 3d 20 43 5f ecryptFinal = C_
270e0 44 65 63 72 79 70 74 46 69 6e 61 6c 3b 0a 09 70 DecryptFinal;..p
270f0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f FunctionList->C_
27100 44 69 67 65 73 74 49 6e 69 74 20 3d 20 43 5f 44 DigestInit = C_D
27110 69 67 65 73 74 49 6e 69 74 3b 0a 09 70 46 75 6e igestInit;..pFun
27120 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 ctionList->C_Dig
27130 65 73 74 20 3d 20 43 5f 44 69 67 65 73 74 3b 0a est = C_Digest;.
27140 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e .pFunctionList->
27150 43 5f 44 69 67 65 73 74 55 70 64 61 74 65 20 3d C_DigestUpdate =
27160 20 43 5f 44 69 67 65 73 74 55 70 64 61 74 65 3b C_DigestUpdate;
27170 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d ..pFunctionList-
27180 3e 43 5f 44 69 67 65 73 74 4b 65 79 20 3d 20 43 >C_DigestKey = C
27190 5f 44 69 67 65 73 74 4b 65 79 3b 0a 09 70 46 75 _DigestKey;..pFu
271a0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 nctionList->C_Di
271b0 67 65 73 74 46 69 6e 61 6c 20 3d 20 43 5f 44 69 gestFinal = C_Di
271c0 67 65 73 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e gestFinal;..pFun
271d0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 ctionList->C_Sig
271e0 6e 49 6e 69 74 20 3d 20 43 5f 53 69 67 6e 49 6e nInit = C_SignIn
271f0 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 it;..pFunctionLi
27200 73 74 2d 3e 43 5f 53 69 67 6e 20 3d 20 43 5f 53 st->C_Sign = C_S
27210 69 67 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c ign;..pFunctionL
27220 69 73 74 2d 3e 43 5f 53 69 67 6e 55 70 64 61 74 ist->C_SignUpdat
27230 65 20 3d 20 43 5f 53 69 67 6e 55 70 64 61 74 65 e = C_SignUpdate
27240 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 ;..pFunctionList
27250 2d 3e 43 5f 53 69 67 6e 46 69 6e 61 6c 20 3d 20 ->C_SignFinal =
27260 43 5f 53 69 67 6e 46 69 6e 61 6c 3b 0a 09 70 46 C_SignFinal;..pF
27270 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 unctionList->C_S
27280 69 67 6e 52 65 63 6f 76 65 72 49 6e 69 74 20 3d ignRecoverInit =
27290 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 49 6e C_SignRecoverIn
272a0 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 it;..pFunctionLi
272b0 73 74 2d 3e 43 5f 53 69 67 6e 52 65 63 6f 76 65 st->C_SignRecove
272c0 72 20 3d 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 r = C_SignRecove
272d0 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 r;..pFunctionLis
272e0 74 2d 3e 43 5f 56 65 72 69 66 79 49 6e 69 74 20 t->C_VerifyInit
272f0 3d 20 43 5f 56 65 72 69 66 79 49 6e 69 74 3b 0a = C_VerifyInit;.
27300 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e .pFunctionList->
27310 43 5f 56 65 72 69 66 79 20 3d 20 43 5f 56 65 72 C_Verify = C_Ver
27320 69 66 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c ify;..pFunctionL
27330 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 55 70 64 ist->C_VerifyUpd
27340 61 74 65 20 3d 20 43 5f 56 65 72 69 66 79 55 70 ate = C_VerifyUp
27350 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e date;..pFunction
27360 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 46 69 List->C_VerifyFi
27370 6e 61 6c 20 3d 20 43 5f 56 65 72 69 66 79 46 69 nal = C_VerifyFi
27380 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c nal;..pFunctionL
27390 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 52 65 63 ist->C_VerifyRec
273a0 6f 76 65 72 49 6e 69 74 20 3d 20 43 5f 56 65 72 overInit = C_Ver
273b0 69 66 79 52 65 63 6f 76 65 72 49 6e 69 74 3b 0a ifyRecoverInit;.
273c0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e .pFunctionList->
273d0 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 20 C_VerifyRecover
273e0 3d 20 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 = C_VerifyRecove
273f0 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 r;..pFunctionLis
27400 74 2d 3e 43 5f 44 69 67 65 73 74 45 6e 63 72 79 t->C_DigestEncry
27410 70 74 55 70 64 61 74 65 20 3d 20 43 5f 44 69 67 ptUpdate = C_Dig
27420 65 73 74 45 6e 63 72 79 70 74 55 70 64 61 74 65 estEncryptUpdate
27430 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 ;..pFunctionList
27440 2d 3e 43 5f 44 65 63 72 79 70 74 44 69 67 65 73 ->C_DecryptDiges
27450 74 55 70 64 61 74 65 20 3d 20 43 5f 44 65 63 72 tUpdate = C_Decr
27460 79 70 74 44 69 67 65 73 74 55 70 64 61 74 65 3b yptDigestUpdate;
27470 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d ..pFunctionList-
27480 3e 43 5f 53 69 67 6e 45 6e 63 72 79 70 74 55 70 >C_SignEncryptUp
27490 64 61 74 65 20 3d 20 43 5f 53 69 67 6e 45 6e 63 date = C_SignEnc
274a0 72 79 70 74 55 70 64 61 74 65 3b 0a 09 70 46 75 ryptUpdate;..pFu
274b0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 nctionList->C_De
274c0 63 72 79 70 74 56 65 72 69 66 79 55 70 64 61 74 cryptVerifyUpdat
274d0 65 20 3d 20 43 5f 44 65 63 72 79 70 74 56 65 72 e = C_DecryptVer
274e0 69 66 79 55 70 64 61 74 65 3b 0a 09 70 46 75 6e ifyUpdate;..pFun
274f0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e ctionList->C_Gen
27500 65 72 61 74 65 4b 65 79 20 3d 20 43 5f 47 65 6e erateKey = C_Gen
27510 65 72 61 74 65 4b 65 79 3b 0a 09 70 46 75 6e 63 erateKey;..pFunc
27520 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e 65 tionList->C_Gene
27530 72 61 74 65 4b 65 79 50 61 69 72 20 3d 20 43 5f rateKeyPair = C_
27540 47 65 6e 65 72 61 74 65 4b 65 79 50 61 69 72 3b GenerateKeyPair;
27550 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d ..pFunctionList-
27560 3e 43 5f 57 72 61 70 4b 65 79 20 3d 20 43 5f 57 >C_WrapKey = C_W
27570 72 61 70 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 rapKey;..pFuncti
27580 6f 6e 4c 69 73 74 2d 3e 43 5f 55 6e 77 72 61 70 onList->C_Unwrap
27590 4b 65 79 20 3d 20 43 5f 55 6e 77 72 61 70 4b 65 Key = C_UnwrapKe
275a0 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 y;..pFunctionLis
275b0 74 2d 3e 43 5f 44 65 72 69 76 65 4b 65 79 20 3d t->C_DeriveKey =
275c0 20 43 5f 44 65 72 69 76 65 4b 65 79 3b 0a 09 70 C_DeriveKey;..p
275d0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f FunctionList->C_
275e0 53 65 65 64 52 61 6e 64 6f 6d 20 3d 20 43 5f 53 SeedRandom = C_S
275f0 65 65 64 52 61 6e 64 6f 6d 3b 0a 09 70 46 75 6e eedRandom;..pFun
27600 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e ctionList->C_Gen
27610 65 72 61 74 65 52 61 6e 64 6f 6d 20 3d 20 43 5f erateRandom = C_
27620 47 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d 3b 0a GenerateRandom;.
27630 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e .pFunctionList->
27640 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53 74 61 C_GetFunctionSta
27650 74 75 73 20 3d 20 43 5f 47 65 74 46 75 6e 63 74 tus = C_GetFunct
27660 69 6f 6e 53 74 61 74 75 73 3b 0a 09 70 46 75 6e ionStatus;..pFun
27670 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 61 6e ctionList->C_Can
27680 63 65 6c 46 75 6e 63 74 69 6f 6e 20 3d 20 43 5f celFunction = C_
27690 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 3b 0a CancelFunction;.
276a0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e .pFunctionList->
276b0 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73 C_GetFunctionLis
276c0 74 20 3d 20 43 5f 47 65 74 46 75 6e 63 74 69 6f t = C_GetFunctio
276d0 6e 4c 69 73 74 3b 0a 0a 09 2a 70 70 46 75 6e 63 nList;...*ppFunc
276e0 74 69 6f 6e 4c 69 73 74 20 3d 20 70 46 75 6e 63 tionList = pFunc
276f0 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 43 41 43 4b tionList;...CACK
27700 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
27710 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f "Returning CKR_O
27720 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 K (%i)", CKR_OK)
27730 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f ;...return(CKR_O
27740 4b 29 3b 0a 7d 0a 0a K);.}..