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: 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a return(retval);.
1810: 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a }..static char *
1820: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e CACKEY_DEBUG_FUN
1830: 43 5f 53 54 52 44 55 50 28 63 6f 6e 73 74 20 63 C_STRDUP(const c
1840: 68 61 72 20 2a 70 74 72 2c 20 63 6f 6e 73 74 20 har *ptr, const
1850: 63 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20 char *func, int
1860: 6c 69 6e 65 29 20 7b 0a 09 63 68 61 72 20 2a 72 line) {..char *r
1870: 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 etval;...retval
1880: 3d 20 73 74 72 64 75 70 28 70 74 72 29 3b 0a 0a = strdup(ptr);..
1890: 09 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c .fprintf(stderr,
18a0: 20 22 25 73 28 29 3a 25 69 3a 20 22 2c 20 66 75 "%s():%i: ", fu
18b0: 6e 63 2c 20 6c 69 6e 65 29 3b 0a 09 66 70 72 69 nc, line);..fpri
18c0: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 54 52 ntf(stderr, "STR
18d0: 44 55 50 5f 4d 41 4c 4c 4f 43 28 29 20 3d 20 25 DUP_MALLOC() = %
18e0: 70 22 2c 20 72 65 74 76 61 6c 29 3b 0a 09 66 70 p", retval);..fp
18f0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 5c rintf(stderr, "\
1900: 6e 22 29 3b 0a 09 66 66 6c 75 73 68 28 73 74 64 n");..fflush(std
1910: 65 72 72 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 err);...return(r
1920: 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 etval);.}..stati
1930: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 c const char *CA
1940: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f CKEY_DEBUG_FUNC_
1950: 54 41 47 5f 54 4f 5f 53 54 52 28 75 6e 73 69 67 TAG_TO_STR(unsig
1960: 6e 65 64 20 63 68 61 72 20 74 61 67 29 20 7b 0a ned char tag) {.
1970: 09 73 77 69 74 63 68 20 28 74 61 67 29 20 7b 0a .switch (tag) {.
1980: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 ..case GSCIS_TAG
1990: 5f 43 41 52 44 49 44 3a 0a 09 09 09 72 65 74 75 _CARDID:....retu
19a0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41 rn("GSCIS_TAG_CA
19b0: 52 44 49 44 22 29 3b 0a 09 09 63 61 73 65 20 47 RDID");...case G
19c0: 53 43 49 53 5f 54 41 47 5f 43 43 43 5f 56 45 52 SCIS_TAG_CCC_VER
19d0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 :....return("GSC
19e0: 49 53 5f 54 41 47 5f 43 43 43 5f 56 45 52 22 29 IS_TAG_CCC_VER")
19f0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 ;...case GSCIS_T
1a00: 41 47 5f 43 43 47 5f 56 45 52 3a 0a 09 09 09 72 AG_CCG_VER:....r
1a10: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 eturn("GSCIS_TAG
1a20: 5f 43 43 47 5f 56 45 52 22 29 3b 0a 09 09 63 61 _CCG_VER");...ca
1a30: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 se GSCIS_TAG_CAR
1a40: 44 55 52 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 DURL:....return(
1a50: 22 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55 "GSCIS_TAG_CARDU
1a60: 52 4c 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 RL");...case GSC
1a70: 49 53 5f 54 41 47 5f 50 4b 43 53 31 35 3a 0a 09 IS_TAG_PKCS15:..
1a80: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f ..return("GSCIS_
1a90: 54 41 47 5f 50 4b 43 53 31 35 22 29 3b 0a 09 09 TAG_PKCS15");...
1aa0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 52 case GSCIS_TAG_R
1ab0: 45 47 5f 44 41 54 41 5f 4d 4f 44 45 4c 3a 0a 09 EG_DATA_MODEL:..
1ac0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f ..return("GSCIS_
1ad0: 54 41 47 5f 52 45 47 5f 44 41 54 41 5f 4d 4f 44 TAG_REG_DATA_MOD
1ae0: 45 4c 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 EL");...case GSC
1af0: 49 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45 IS_TAG_ACR_TABLE
1b00: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 :....return("GSC
1b10: 49 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45 IS_TAG_ACR_TABLE
1b20: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 ");...case GSCIS
1b30: 5f 54 41 47 5f 43 41 52 44 5f 41 50 44 55 3a 0a _TAG_CARD_APDU:.
1b40: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 ...return("GSCIS
1b50: 5f 54 41 47 5f 43 41 52 44 5f 41 50 44 55 22 29 _TAG_CARD_APDU")
1b60: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 ;...case GSCIS_T
1b70: 41 47 5f 52 45 44 49 52 45 43 54 49 4f 4e 3a 0a AG_REDIRECTION:.
1b80: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 ...return("GSCIS
1b90: 5f 54 41 47 5f 52 45 44 49 52 45 43 54 49 4f 4e _TAG_REDIRECTION
1ba0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 ");...case GSCIS
1bb0: 5f 54 41 47 5f 43 54 3a 0a 09 09 09 72 65 74 75 _TAG_CT:....retu
1bc0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 54 rn("GSCIS_TAG_CT
1bd0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 ");...case GSCIS
1be0: 5f 54 41 47 5f 53 54 3a 0a 09 09 09 72 65 74 75 _TAG_ST:....retu
1bf0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53 54 rn("GSCIS_TAG_ST
1c00: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 ");...case GSCIS
1c10: 5f 54 41 47 5f 4e 45 58 54 43 43 43 3a 0a 09 09 _TAG_NEXTCCC:...
1c20: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 .return("GSCIS_T
1c30: 41 47 5f 4e 45 58 54 43 43 43 22 29 3b 0a 09 09 AG_NEXTCCC");...
1c40: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 46 case GSCIS_TAG_F
1c50: 4e 41 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 NAME:....return(
1c60: 22 47 53 43 49 53 5f 54 41 47 5f 46 4e 41 4d 45 "GSCIS_TAG_FNAME
1c70: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 ");...case GSCIS
1c80: 5f 54 41 47 5f 4d 4e 41 4d 45 3a 0a 09 09 09 72 _TAG_MNAME:....r
1c90: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 eturn("GSCIS_TAG
1ca0: 5f 4d 4e 41 4d 45 22 29 3b 0a 09 09 63 61 73 65 _MNAME");...case
1cb0: 20 47 53 43 49 53 5f 54 41 47 5f 4c 4e 41 4d 45 GSCIS_TAG_LNAME
1cc0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 :....return("GSC
1cd0: 49 53 5f 54 41 47 5f 4c 4e 41 4d 45 22 29 3b 0a IS_TAG_LNAME");.
1ce0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 ..case GSCIS_TAG
1cf0: 5f 53 55 46 46 49 58 3a 0a 09 09 09 72 65 74 75 _SUFFIX:....retu
1d00: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53 55 rn("GSCIS_TAG_SU
1d10: 46 46 49 58 22 29 3b 0a 09 09 63 61 73 65 20 47 FFIX");...case G
1d20: 53 43 49 53 5f 54 41 47 5f 47 4f 56 54 5f 41 47 SCIS_TAG_GOVT_AG
1d30: 45 4e 43 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 ENCY:....return(
1d40: 22 47 53 43 49 53 5f 54 41 47 5f 47 4f 56 54 5f "GSCIS_TAG_GOVT_
1d50: 41 47 45 4e 43 59 22 29 3b 0a 09 09 63 61 73 65 AGENCY");...case
1d60: 20 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41 GSCIS_TAG_BUREA
1d70: 55 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 U:....return("GS
1d80: 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 22 29 CIS_TAG_BUREAU")
1d90: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 ;...case GSCIS_T
1da0: 41 47 5f 42 55 52 45 41 55 5f 43 4f 44 45 3a 0a AG_BUREAU_CODE:.
1db0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 ...return("GSCIS
1dc0: 5f 54 41 47 5f 42 55 52 45 41 55 5f 43 4f 44 45 _TAG_BUREAU_CODE
1dd0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 ");...case GSCIS
1de0: 5f 54 41 47 5f 44 45 50 54 5f 43 4f 44 45 3a 0a _TAG_DEPT_CODE:.
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 44 45 50 54 5f 43 4f 44 45 22 29 _TAG_DEPT_CODE")
1e10: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 ;...case GSCIS_T
1e20: 41 47 5f 54 49 54 4c 45 3a 0a 09 09 09 72 65 74 AG_TITLE:....ret
1e30: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 54 urn("GSCIS_TAG_T
1e40: 49 54 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 47 ITLE");...case G
1e50: 53 43 49 53 5f 54 41 47 5f 42 55 49 4c 44 49 4e SCIS_TAG_BUILDIN
1e60: 47 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 G:....return("GS
1e70: 43 49 53 5f 54 41 47 5f 42 55 49 4c 44 49 4e 47 CIS_TAG_BUILDING
1e80: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 ");...case GSCIS
1e90: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 _TAG_OFFICE_ADDR
1ea0: 31 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 1:....return("GS
1eb0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41 CIS_TAG_OFFICE_A
1ec0: 44 44 52 31 22 29 3b 0a 09 09 63 61 73 65 20 47 DDR1");...case G
1ed0: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f SCIS_TAG_OFFICE_
1ee0: 41 44 44 52 32 3a 0a 09 09 09 72 65 74 75 72 6e ADDR2:....return
1ef0: 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 ("GSCIS_TAG_OFFI
1f00: 43 45 5f 41 44 44 52 32 22 29 3b 0a 09 09 63 61 CE_ADDR2");...ca
1f10: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 se GSCIS_TAG_OFF
1f20: 49 43 45 5f 43 49 54 59 3a 0a 09 09 09 72 65 74 ICE_CITY:....ret
1f30: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f urn("GSCIS_TAG_O
1f40: 46 46 49 43 45 5f 43 49 54 59 22 29 3b 0a 09 09 FFICE_CITY");...
1f50: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f case GSCIS_TAG_O
1f60: 46 46 49 43 45 5f 53 54 41 54 45 3a 0a 09 09 09 FFICE_STATE:....
1f70: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 return("GSCIS_TA
1f80: 47 5f 4f 46 46 49 43 45 5f 53 54 41 54 45 22 29 G_OFFICE_STATE")
1f90: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 ;...case GSCIS_T
1fa0: 41 47 5f 4f 46 46 49 43 45 5f 5a 49 50 3a 0a 09 AG_OFFICE_ZIP:..
1fb0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f ..return("GSCIS_
1fc0: 54 41 47 5f 4f 46 46 49 43 45 5f 5a 49 50 22 29 TAG_OFFICE_ZIP")
1fd0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 ;...case GSCIS_T
1fe0: 41 47 5f 4f 46 46 49 43 45 5f 43 4f 55 4e 54 52 AG_OFFICE_COUNTR
1ff0: 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 Y:....return("GS
2000: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 CIS_TAG_OFFICE_C
2010: 4f 55 4e 54 52 59 22 29 3b 0a 09 09 63 61 73 65 OUNTRY");...case
2020: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 GSCIS_TAG_OFFIC
2030: 45 5f 50 48 4f 4e 45 3a 0a 09 09 09 72 65 74 75 E_PHONE:....retu
2040: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 rn("GSCIS_TAG_OF
2050: 46 49 43 45 5f 50 48 4f 4e 45 22 29 3b 0a 09 09 FICE_PHONE");...
2060: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f case GSCIS_TAG_O
2070: 46 46 49 43 45 5f 50 48 4f 4e 45 5f 45 58 54 3a FFICE_PHONE_EXT:
2080: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 ....return("GSCI
2090: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f S_TAG_OFFICE_PHO
20a0: 4e 45 5f 45 58 54 22 29 3b 0a 09 09 63 61 73 65 NE_EXT");...case
20b0: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 GSCIS_TAG_OFFIC
20c0: 45 5f 46 41 58 3a 0a 09 09 09 72 65 74 75 72 6e E_FAX:....return
20d0: 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 ("GSCIS_TAG_OFFI
20e0: 43 45 5f 46 41 58 22 29 3b 0a 09 09 63 61 73 65 CE_FAX");...case
20f0: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 GSCIS_TAG_OFFIC
2100: 45 5f 45 4d 41 49 4c 3a 0a 09 09 09 72 65 74 75 E_EMAIL:....retu
2110: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 rn("GSCIS_TAG_OF
2120: 46 49 43 45 5f 45 4d 41 49 4c 22 29 3b 0a 09 09 FICE_EMAIL");...
2130: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f case GSCIS_TAG_O
2140: 46 46 49 43 45 5f 52 4f 4f 4d 3a 0a 09 09 09 72 FFICE_ROOM:....r
2150: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 eturn("GSCIS_TAG
2160: 5f 4f 46 46 49 43 45 5f 52 4f 4f 4d 22 29 3b 0a _OFFICE_ROOM");.
2170: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 ..case GSCIS_TAG
2180: 5f 4e 4f 4e 47 4f 56 5f 41 47 45 4e 43 59 3a 0a _NONGOV_AGENCY:.
2190: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 ...return("GSCIS
21a0: 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f 41 47 45 4e _TAG_NONGOV_AGEN
21b0: 43 59 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 CY");...case GSC
21c0: 49 53 5f 54 41 47 5f 53 53 4e 5f 44 45 53 49 47 IS_TAG_SSN_DESIG
21d0: 4e 41 54 4f 52 3a 0a 09 09 09 72 65 74 75 72 6e NATOR:....return
21e0: 28 22 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 5f ("GSCIS_TAG_SSN_
21f0: 44 45 53 49 47 4e 41 54 4f 52 22 29 3b 0a 09 09 DESIGNATOR");...
2200: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53 case GSCIS_TAG_S
2210: 53 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 SN:....return("G
2220: 53 43 49 53 5f 54 41 47 5f 53 53 4e 22 29 3b 0a SCIS_TAG_SSN");.
2230: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 ..case GSCIS_TAG
2240: 5f 44 4f 42 3a 0a 09 09 09 72 65 74 75 72 6e 28 _DOB:....return(
2250: 22 47 53 43 49 53 5f 54 41 47 5f 44 4f 42 22 29 "GSCIS_TAG_DOB")
2260: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 ;...case GSCIS_T
2270: 41 47 5f 47 45 4e 44 45 52 3a 0a 09 09 09 72 65 AG_GENDER:....re
2280: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f turn("GSCIS_TAG_
2290: 47 45 4e 44 45 52 22 29 3b 0a 09 09 63 61 73 65 GENDER");...case
22a0: 20 47 53 43 49 53 5f 54 41 47 5f 55 53 45 52 49 GSCIS_TAG_USERI
22b0: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 D:....return("GS
22c0: 43 49 53 5f 54 41 47 5f 55 53 45 52 49 44 22 29 CIS_TAG_USERID")
22d0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 ;...case GSCIS_T
22e0: 41 47 5f 44 4f 4d 41 49 4e 3a 0a 09 09 09 72 65 AG_DOMAIN:....re
22f0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f turn("GSCIS_TAG_
2300: 44 4f 4d 41 49 4e 22 29 3b 0a 09 09 63 61 73 65 DOMAIN");...case
2310: 20 47 53 43 49 53 5f 54 41 47 5f 50 41 53 53 57 GSCIS_TAG_PASSW
2320: 4f 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 ORD:....return("
2330: 47 53 43 49 53 5f 54 41 47 5f 50 41 53 53 57 4f GSCIS_TAG_PASSWO
2340: 52 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 RD");...case GSC
2350: 49 53 5f 54 41 47 5f 49 53 53 55 45 52 49 44 3a IS_TAG_ISSUERID:
2360: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 ....return("GSCI
2370: 53 5f 54 41 47 5f 49 53 53 55 45 52 49 44 22 29 S_TAG_ISSUERID")
2380: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 ;...case GSCIS_T
2390: 41 47 5f 53 45 52 4e 4f 3a 0a 09 09 09 72 65 74 AG_SERNO:....ret
23a0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53 urn("GSCIS_TAG_S
23b0: 45 52 4e 4f 22 29 3b 0a 09 09 63 61 73 65 20 47 ERNO");...case G
23c0: 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45 5f 44 SCIS_TAG_ISSUE_D
23d0: 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 ATE:....return("
23e0: 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45 5f GSCIS_TAG_ISSUE_
23f0: 44 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47 DATE");...case G
2400: 53 43 49 53 5f 54 41 47 5f 45 58 50 49 52 45 5f SCIS_TAG_EXPIRE_
2410: 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 DATE:....return(
2420: 22 47 53 43 49 53 5f 54 41 47 5f 45 58 50 49 52 "GSCIS_TAG_EXPIR
2430: 45 5f 44 41 54 45 22 29 3b 0a 09 09 63 61 73 65 E_DATE");...case
2440: 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 5f GSCIS_TAG_CARD_
2450: 54 59 50 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 TYPE:....return(
2460: 22 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 5f "GSCIS_TAG_CARD_
2470: 54 59 50 45 22 29 3b 0a 09 09 63 61 73 65 20 47 TYPE");...case G
2480: 53 43 49 53 5f 54 41 47 5f 53 45 43 55 52 49 54 SCIS_TAG_SECURIT
2490: 59 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75 72 Y_CODE:....retur
24a0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53 45 43 n("GSCIS_TAG_SEC
24b0: 55 52 49 54 59 5f 43 4f 44 45 22 29 3b 0a 09 09 URITY_CODE");...
24c0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 case GSCIS_TAG_C
24d0: 41 52 44 49 44 5f 41 49 44 3a 0a 09 09 09 72 65 ARDID_AID:....re
24e0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f turn("GSCIS_TAG_
24f0: 43 41 52 44 49 44 5f 41 49 44 22 29 3b 0a 09 09 CARDID_AID");...
2500: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 case GSCIS_TAG_C
2510: 45 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09 72 ERTIFICATE:....r
2520: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 eturn("GSCIS_TAG
2530: 5f 43 45 52 54 49 46 49 43 41 54 45 22 29 3b 0a _CERTIFICATE");.
2540: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 ..case GSCIS_TAG
2550: 5f 43 45 52 54 5f 49 53 53 55 45 5f 44 41 54 45 _CERT_ISSUE_DATE
2560: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 :....return("GSC
2570: 49 53 5f 54 41 47 5f 43 45 52 54 5f 49 53 53 55 IS_TAG_CERT_ISSU
2580: 45 5f 44 41 54 45 22 29 3b 0a 09 09 63 61 73 65 E_DATE");...case
2590: 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f GSCIS_TAG_CERT_
25a0: 45 58 50 49 52 45 5f 44 41 54 45 3a 0a 09 09 09 EXPIRE_DATE:....
25b0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 return("GSCIS_TA
25c0: 47 5f 43 45 52 54 5f 45 58 50 49 52 45 5f 44 41 G_CERT_EXPIRE_DA
25d0: 54 45 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 TE");..}...retur
25e0: 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a n("UNKNOWN");.}.
25f0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 .static const ch
2600: 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 ar *CACKEY_DEBUG
2610: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 _FUNC_SCARDERR_T
2620: 4f 5f 53 54 52 28 4c 4f 4e 47 20 72 65 74 63 6f O_STR(LONG retco
2630: 64 65 29 20 7b 0a 09 73 77 69 74 63 68 20 28 72 de) {..switch (r
2640: 65 74 63 6f 64 65 29 20 7b 0a 09 09 63 61 73 65 etcode) {...case
2650: 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 SCARD_S_SUCCESS
2660: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 :....return("SCA
2670: 52 44 5f 53 5f 53 55 43 43 45 53 53 22 29 3b 0a RD_S_SUCCESS");.
2680: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 43 ..case SCARD_E_C
2690: 41 4e 43 45 4c 4c 45 44 3a 0a 09 09 09 72 65 74 ANCELLED:....ret
26a0: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 43 41 4e urn("SCARD_E_CAN
26b0: 43 45 4c 4c 45 44 22 29 3b 0a 09 09 63 61 73 65 CELLED");...case
26c0: 20 53 43 41 52 44 5f 45 5f 43 41 4e 54 5f 44 49 SCARD_E_CANT_DI
26d0: 53 50 4f 53 45 3a 0a 09 09 09 72 65 74 75 72 6e SPOSE:....return
26e0: 28 22 53 43 41 52 44 5f 45 5f 43 41 4e 54 5f 44 ("SCARD_E_CANT_D
26f0: 49 53 50 4f 53 45 22 29 3b 0a 09 09 63 61 73 65 ISPOSE");...case
2700: 20 53 43 41 52 44 5f 45 5f 49 4e 53 55 46 46 49 SCARD_E_INSUFFI
2710: 43 49 45 4e 54 5f 42 55 46 46 45 52 3a 0a 09 09 CIENT_BUFFER:...
2720: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 .return("SCARD_E
2730: 5f 49 4e 53 55 46 46 49 43 49 45 4e 54 5f 42 55 _INSUFFICIENT_BU
2740: 46 46 45 52 22 29 3b 0a 09 09 63 61 73 65 20 53 FFER");...case S
2750: 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 41 CARD_E_INVALID_A
2760: 54 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 TR:....return("S
2770: 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 41 CARD_E_INVALID_A
2780: 54 52 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 TR");...case SCA
2790: 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e RD_E_INVALID_HAN
27a0: 44 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 DLE:....return("
27b0: 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f SCARD_E_INVALID_
27c0: 48 41 4e 44 4c 45 22 29 3b 0a 09 09 63 61 73 65 HANDLE");...case
27d0: 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 SCARD_E_INVALID
27e0: 5f 50 41 52 41 4d 45 54 45 52 3a 0a 09 09 09 72 _PARAMETER:....r
27f0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 eturn("SCARD_E_I
2800: 4e 56 41 4c 49 44 5f 50 41 52 41 4d 45 54 45 52 NVALID_PARAMETER
2810: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 ");...case SCARD
2820: 5f 45 5f 49 4e 56 41 4c 49 44 5f 54 41 52 47 45 _E_INVALID_TARGE
2830: 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 T:....return("SC
2840: 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 54 41 ARD_E_INVALID_TA
2850: 52 47 45 54 22 29 3b 0a 09 09 63 61 73 65 20 53 RGET");...case S
2860: 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 56 CARD_E_INVALID_V
2870: 41 4c 55 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 ALUE:....return(
2880: 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 "SCARD_E_INVALID
2890: 5f 56 41 4c 55 45 22 29 3b 0a 09 09 63 61 73 65 _VALUE");...case
28a0: 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 4d 45 4d 4f SCARD_E_NO_MEMO
28b0: 52 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 RY:....return("S
28c0: 43 41 52 44 5f 45 5f 4e 4f 5f 4d 45 4d 4f 52 59 CARD_E_NO_MEMORY
28d0: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 ");...case SCARD
28e0: 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 52 45 41 44 45 _E_UNKNOWN_READE
28f0: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 R:....return("SC
2900: 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 52 45 ARD_E_UNKNOWN_RE
2910: 41 44 45 52 22 29 3b 0a 09 09 63 61 73 65 20 53 ADER");...case S
2920: 43 41 52 44 5f 45 5f 54 49 4d 45 4f 55 54 3a 0a CARD_E_TIMEOUT:.
2930: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 ...return("SCARD
2940: 5f 45 5f 54 49 4d 45 4f 55 54 22 29 3b 0a 09 09 _E_TIMEOUT");...
2950: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 53 48 41 case SCARD_E_SHA
2960: 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 3a 0a RING_VIOLATION:.
2970: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 ...return("SCARD
2980: 5f 45 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41 _E_SHARING_VIOLA
2990: 54 49 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 53 TION");...case S
29a0: 43 41 52 44 5f 45 5f 4e 4f 5f 53 4d 41 52 54 43 CARD_E_NO_SMARTC
29b0: 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 ARD:....return("
29c0: 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 4d 41 52 54 SCARD_E_NO_SMART
29d0: 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 CARD");...case S
29e0: 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 43 CARD_E_UNKNOWN_C
29f0: 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 ARD:....return("
2a00: 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f SCARD_E_UNKNOWN_
2a10: 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 CARD");...case S
2a20: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 CARD_E_PROTO_MIS
2a30: 4d 41 54 43 48 3a 0a 09 09 09 72 65 74 75 72 6e MATCH:....return
2a40: 28 22 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f ("SCARD_E_PROTO_
2a50: 4d 49 53 4d 41 54 43 48 22 29 3b 0a 09 09 63 61 MISMATCH");...ca
2a60: 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 52 se SCARD_E_NOT_R
2a70: 45 41 44 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 EADY:....return(
2a80: 22 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 52 45 41 "SCARD_E_NOT_REA
2a90: 44 59 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 DY");...case SCA
2aa0: 52 44 5f 45 5f 53 59 53 54 45 4d 5f 43 41 4e 43 RD_E_SYSTEM_CANC
2ab0: 45 4c 4c 45 44 3a 0a 09 09 09 72 65 74 75 72 6e ELLED:....return
2ac0: 28 22 53 43 41 52 44 5f 45 5f 53 59 53 54 45 4d ("SCARD_E_SYSTEM
2ad0: 5f 43 41 4e 43 45 4c 4c 45 44 22 29 3b 0a 09 09 _CANCELLED");...
2ae0: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 54 case SCARD_E_NOT
2af0: 5f 54 52 41 4e 53 41 43 54 45 44 3a 0a 09 09 09 _TRANSACTED:....
2b00: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f return("SCARD_E_
2b10: 4e 4f 54 5f 54 52 41 4e 53 41 43 54 45 44 22 29 NOT_TRANSACTED")
2b20: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 ;...case SCARD_E
2b30: 5f 52 45 41 44 45 52 5f 55 4e 41 56 41 49 4c 41 _READER_UNAVAILA
2b40: 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 BLE:....return("
2b50: 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55 SCARD_E_READER_U
2b60: 4e 41 56 41 49 4c 41 42 4c 45 22 29 3b 0a 09 09 NAVAILABLE");...
2b70: 63 61 73 65 20 53 43 41 52 44 5f 57 5f 55 4e 53 case SCARD_W_UNS
2b80: 55 50 50 4f 52 54 45 44 5f 43 41 52 44 3a 0a 09 UPPORTED_CARD:..
2b90: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f ..return("SCARD_
2ba0: 57 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f 43 41 W_UNSUPPORTED_CA
2bb0: 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 RD");...case SCA
2bc0: 52 44 5f 57 5f 55 4e 52 45 53 50 4f 4e 53 49 56 RD_W_UNRESPONSIV
2bd0: 45 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 E_CARD:....retur
2be0: 6e 28 22 53 43 41 52 44 5f 57 5f 55 4e 52 45 53 n("SCARD_W_UNRES
2bf0: 50 4f 4e 53 49 56 45 5f 43 41 52 44 22 29 3b 0a PONSIVE_CARD");.
2c00: 09 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f 55 ..case SCARD_W_U
2c10: 4e 50 4f 57 45 52 45 44 5f 43 41 52 44 3a 0a 09 NPOWERED_CARD:..
2c20: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f ..return("SCARD_
2c30: 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41 52 44 W_UNPOWERED_CARD
2c40: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 ");...case SCARD
2c50: 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 3a 0a 09 _W_RESET_CARD:..
2c60: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f ..return("SCARD_
2c70: 57 5f 52 45 53 45 54 5f 43 41 52 44 22 29 3b 0a W_RESET_CARD");.
2c80: 09 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f 52 ..case SCARD_W_R
2c90: 45 4d 4f 56 45 44 5f 43 41 52 44 3a 0a 09 09 09 EMOVED_CARD:....
2ca0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f return("SCARD_W_
2cb0: 52 45 4d 4f 56 45 44 5f 43 41 52 44 22 29 3b 0a REMOVED_CARD");.
2cc0: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 50 ..case SCARD_E_P
2cd0: 43 49 5f 54 4f 4f 5f 53 4d 41 4c 4c 3a 0a 09 09 CI_TOO_SMALL:...
2ce0: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 .return("SCARD_E
2cf0: 5f 50 43 49 5f 54 4f 4f 5f 53 4d 41 4c 4c 22 29 _PCI_TOO_SMALL")
2d00: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 ;...case SCARD_E
2d10: 5f 52 45 41 44 45 52 5f 55 4e 53 55 50 50 4f 52 _READER_UNSUPPOR
2d20: 54 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 TED:....return("
2d30: 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55 SCARD_E_READER_U
2d40: 4e 53 55 50 50 4f 52 54 45 44 22 29 3b 0a 09 09 NSUPPORTED");...
2d50: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 44 55 50 case SCARD_E_DUP
2d60: 4c 49 43 41 54 45 5f 52 45 41 44 45 52 3a 0a 09 LICATE_READER:..
2d70: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f ..return("SCARD_
2d80: 45 5f 44 55 50 4c 49 43 41 54 45 5f 52 45 41 44 E_DUPLICATE_READ
2d90: 45 52 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 ER");...case SCA
2da0: 52 44 5f 45 5f 43 41 52 44 5f 55 4e 53 55 50 50 RD_E_CARD_UNSUPP
2db0: 4f 52 54 45 44 3a 0a 09 09 09 72 65 74 75 72 6e ORTED:....return
2dc0: 28 22 53 43 41 52 44 5f 45 5f 43 41 52 44 5f 55 ("SCARD_E_CARD_U
2dd0: 4e 53 55 50 50 4f 52 54 45 44 22 29 3b 0a 09 09 NSUPPORTED");...
2de0: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f case SCARD_E_NO_
2df0: 53 45 52 56 49 43 45 3a 0a 09 09 09 72 65 74 75 SERVICE:....retu
2e00: 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 rn("SCARD_E_NO_S
2e10: 45 52 56 49 43 45 22 29 3b 0a 09 09 63 61 73 65 ERVICE");...case
2e20: 20 53 43 41 52 44 5f 45 5f 53 45 52 56 49 43 45 SCARD_E_SERVICE
2e30: 5f 53 54 4f 50 50 45 44 3a 0a 09 09 09 72 65 74 _STOPPED:....ret
2e40: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 53 45 52 urn("SCARD_E_SER
2e50: 56 49 43 45 5f 53 54 4f 50 50 45 44 22 29 3b 0a VICE_STOPPED");.
2e60: 09 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f 49 ..case SCARD_W_I
2e70: 4e 53 45 52 54 45 44 5f 43 41 52 44 3a 0a 09 09 NSERTED_CARD:...
2e80: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57 .return("SCARD_W
2e90: 5f 49 4e 53 45 52 54 45 44 5f 43 41 52 44 22 29 _INSERTED_CARD")
2ea0: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 ;...case SCARD_E
2eb0: 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f 46 45 41 _UNSUPPORTED_FEA
2ec0: 54 55 52 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 TURE:....return(
2ed0: 22 53 43 41 52 44 5f 45 5f 55 4e 53 55 50 50 4f "SCARD_E_UNSUPPO
2ee0: 52 54 45 44 5f 46 45 41 54 55 52 45 22 29 3b 0a RTED_FEATURE");.
2ef0: 23 69 66 64 65 66 20 53 43 41 52 44 5f 45 5f 4e #ifdef SCARD_E_N
2f00: 4f 5f 52 45 41 44 45 52 53 5f 41 56 41 49 4c 41 O_READERS_AVAILA
2f10: 42 4c 45 0a 09 09 63 61 73 65 20 53 43 41 52 44 BLE...case SCARD
2f20: 5f 45 5f 4e 4f 5f 52 45 41 44 45 52 53 5f 41 56 _E_NO_READERS_AV
2f30: 41 49 4c 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 AILABLE:....retu
2f40: 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 52 rn("SCARD_E_NO_R
2f50: 45 41 44 45 52 53 5f 41 56 41 49 4c 41 42 4c 45 EADERS_AVAILABLE
2f60: 22 29 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 0a 09 ");.#endif..}...
2f70: 72 65 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 return("UNKNOWN"
2f80: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e );.}..static con
2f90: 73 74 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f st char *CACKEY_
2fa0: 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 DEBUG_FUNC_OBJID
2fb0: 5f 54 4f 5f 53 54 52 28 75 69 6e 74 31 36 5f 74 _TO_STR(uint16_t
2fc0: 20 6f 62 6a 69 64 29 20 7b 0a 09 73 77 69 74 63 objid) {..switc
2fd0: 68 20 28 6f 62 6a 69 64 29 20 7b 0a 09 09 63 61 h (objid) {...ca
2fe0: 73 65 20 30 78 32 30 30 30 3a 0a 09 09 09 72 65 se 0x2000:....re
2ff0: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 turn("CACKEY_TLV
3000: 5f 4f 42 4a 49 44 5f 47 45 4e 45 52 41 4c 49 4e _OBJID_GENERALIN
3010: 46 4f 22 29 3b 0a 09 09 63 61 73 65 20 30 78 32 FO");...case 0x2
3020: 31 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 100:....return("
3030: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 CACKEY_TLV_OBJID
3040: 5f 50 52 4f 50 45 52 53 4f 4e 41 4c 49 4e 46 4f _PROPERSONALINFO
3050: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 33 30 30 ");...case 0x300
3060: 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 0:....return("CA
3070: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 41 CKEY_TLV_OBJID_A
3080: 43 43 45 53 53 43 4f 4e 54 52 4f 4c 22 29 3b 0a CCESSCONTROL");.
3090: 09 09 63 61 73 65 20 30 78 34 30 30 30 3a 0a 09 ..case 0x4000:..
30a0: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 ..return("CACKEY
30b0: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 4c 4f 47 49 4e _TLV_OBJID_LOGIN
30c0: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 35 30 30 ");...case 0x500
30d0: 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 0:....return("CA
30e0: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 CKEY_TLV_OBJID_C
30f0: 41 52 44 49 4e 46 4f 22 29 3b 0a 09 09 63 61 73 ARDINFO");...cas
3100: 65 20 30 78 36 30 30 30 3a 0a 09 09 09 72 65 74 e 0x6000:....ret
3110: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f urn("CACKEY_TLV_
3120: 4f 42 4a 49 44 5f 42 49 4f 4d 45 54 52 49 43 53 OBJID_BIOMETRICS
3130: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 37 30 30 ");...case 0x700
3140: 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 0:....return("CA
3150: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 44 CKEY_TLV_OBJID_D
3160: 49 47 49 54 41 4c 53 49 47 43 45 52 54 22 29 3b IGITALSIGCERT");
3170: 0a 09 09 63 61 73 65 20 30 78 30 32 30 30 3a 0a ...case 0x0200:.
3180: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 ...return("CACKE
3190: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f Y_TLV_OBJID_CAC_
31a0: 50 45 52 53 4f 4e 22 29 3b 0a 09 09 63 61 73 65 PERSON");...case
31b0: 20 30 78 30 32 30 32 3a 0a 09 09 09 72 65 74 75 0x0202:....retu
31c0: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f rn("CACKEY_TLV_O
31d0: 42 4a 49 44 5f 43 41 43 5f 42 45 4e 45 46 49 54 BJID_CAC_BENEFIT
31e0: 53 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32 S");...case 0x02
31f0: 30 33 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 03:....return("C
3200: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f ACKEY_TLV_OBJID_
3210: 43 41 43 5f 4f 54 48 45 52 42 45 4e 45 46 49 54 CAC_OTHERBENEFIT
3220: 53 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32 S");...case 0x02
3230: 30 31 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 01:....return("C
3240: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f ACKEY_TLV_OBJID_
3250: 43 41 43 5f 50 45 52 53 4f 4e 4e 45 4c 22 29 3b CAC_PERSONNEL");
3260: 0a 09 09 63 61 73 65 20 30 78 30 32 46 45 3a 0a ...case 0x02FE:.
3270: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 ...return("CACKE
3280: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f Y_TLV_OBJID_CAC_
3290: 50 4b 49 43 45 52 54 22 29 3b 0a 09 7d 0a 09 0a PKICERT");..}...
32a0: 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e .return("UNKNOWN
32b0: 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f ");.}..static co
32c0: 6e 73 74 20 63 68 61 72 20 2a 43 41 43 4b 45 59 nst char *CACKEY
32d0: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 50 50 54 _DEBUG_FUNC_APPT
32e0: 59 50 45 5f 54 4f 5f 53 54 52 28 75 69 6e 74 38 YPE_TO_STR(uint8
32f0: 5f 74 20 61 70 70 74 79 70 65 29 20 7b 0a 09 73 _t apptype) {..s
3300: 77 69 74 63 68 20 28 61 70 70 74 79 70 65 29 20 witch (apptype)
3310: 7b 0a 09 09 63 61 73 65 20 30 78 30 30 3a 0a 09 {...case 0x00:..
3320: 09 09 72 65 74 75 72 6e 28 22 4e 4f 4e 45 22 29 ..return("NONE")
3330: 3b 0a 09 09 63 61 73 65 20 30 78 30 31 3a 0a 09 ;...case 0x01:..
3340: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 ..return("CACKEY
3350: 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 _TLV_APP_GENERIC
3360: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32 3a ");...case 0x02:
3370: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b ....return("CACK
3380: 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 22 29 EY_TLV_APP_SKI")
3390: 3b 0a 09 09 63 61 73 65 20 30 78 30 33 3a 0a 09 ;...case 0x03:..
33a0: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 ..return("CACKEY
33b0: 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 _TLV_APP_GENERIC
33c0: 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 | CACKEY_TLV_AP
33d0: 50 5f 53 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 P_SKI");...case
33e0: 30 78 30 34 3a 0a 09 09 09 72 65 74 75 72 6e 28 0x04:....return(
33f0: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f "CACKEY_TLV_APP_
3400: 50 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78 PKI");...case 0x
3410: 30 35 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 05:....return("C
3420: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45 ACKEY_TLV_APP_GE
3430: 4e 45 52 49 43 20 7c 20 43 41 43 4b 45 59 5f 54 NERIC | CACKEY_T
3440: 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09 09 LV_APP_PKI");...
3450: 63 61 73 65 20 30 78 30 36 3a 0a 09 09 09 72 65 case 0x06:....re
3460: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 turn("CACKEY_TLV
3470: 5f 41 50 50 5f 53 4b 49 20 7c 20 43 41 43 4b 45 _APP_SKI | CACKE
3480: 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b Y_TLV_APP_PKI");
3490: 0a 09 09 63 61 73 65 20 30 78 30 37 3a 0a 09 09 ...case 0x07:...
34a0: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f .return("CACKEY_
34b0: 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 TLV_APP_GENERIC
34c0: 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 | CACKEY_TLV_APP
34d0: 5f 53 4b 49 20 7c 20 43 41 43 4b 45 59 5f 54 4c _SKI | CACKEY_TL
34e0: 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09 7d 0a V_APP_PKI");..}.
34f0: 0a 09 72 65 74 75 72 6e 28 22 49 4e 56 41 4c 49 ..return("INVALI
3500: 44 22 29 3b 0a 7d 0a 0a 23 20 20 64 65 66 69 6e D");.}..# defin
3510: 65 20 6d 61 6c 6c 6f 63 28 78 29 20 43 41 43 4b e malloc(x) CACK
3520: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4d 41 EY_DEBUG_FUNC_MA
3530: 4c 4c 4f 43 28 78 2c 20 5f 5f 66 75 6e 63 5f 5f LLOC(x, __func__
3540: 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 20 20 64 , __LINE__).# d
3550: 65 66 69 6e 65 20 72 65 61 6c 6c 6f 63 28 78 2c efine realloc(x,
3560: 20 79 29 20 43 41 43 4b 45 59 5f 44 45 42 55 47 y) CACKEY_DEBUG
3570: 5f 46 55 4e 43 5f 52 45 41 4c 4c 4f 43 28 78 2c _FUNC_REALLOC(x,
3580: 20 79 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f y, __func__, __
3590: 4c 49 4e 45 5f 5f 29 0a 23 20 20 69 66 64 65 66 LINE__).# ifdef
35a0: 20 73 74 72 64 75 70 0a 23 20 20 20 20 75 6e 64 strdup.# und
35b0: 65 66 20 73 74 72 64 75 70 0a 23 20 20 65 6e 64 ef strdup.# end
35c0: 69 66 0a 23 20 20 64 65 66 69 6e 65 20 73 74 72 if.# define str
35d0: 64 75 70 28 78 29 20 43 41 43 4b 45 59 5f 44 45 dup(x) CACKEY_DE
35e0: 42 55 47 5f 46 55 4e 43 5f 53 54 52 44 55 50 28 BUG_FUNC_STRDUP(
35f0: 78 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c x, __func__, __L
3600: 49 4e 45 5f 5f 29 0a 23 65 6c 73 65 0a 23 20 20 INE__).#else.#
3610: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 define CACKEY_DE
3620: 42 55 47 5f 50 52 49 4e 54 46 28 78 2e 2e 2e 29 BUG_PRINTF(x...)
3630: 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 69 6e 65 20 /**/.# define
3640: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
3650: 4e 54 42 55 46 28 66 2c 20 78 2c 20 79 29 20 2f NTBUF(f, x, y) /
3660: 2a 2a 2f 0a 23 20 20 64 65 66 69 6e 65 20 43 41 **/.# define CA
3670: 43 4b 45 59 5f 44 45 42 55 47 5f 50 45 52 52 4f CKEY_DEBUG_PERRO
3680: 52 28 78 29 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 R(x) /**/.# def
3690: 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 ine CACKEY_DEBUG
36a0: 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 _FUNC_TAG_TO_STR
36b0: 28 78 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 (x) "DEBUG_DISAB
36c0: 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43 LED".# define C
36d0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 ACKEY_DEBUG_FUNC
36e0: 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 _SCARDERR_TO_STR
36f0: 28 78 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 (x) "DEBUG_DISAB
3700: 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43 LED".# define C
3710: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 ACKEY_DEBUG_FUNC
3720: 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28 78 29 _OBJID_TO_STR(x)
3730: 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c 45 44 "DEBUG_DISABLED
3740: 22 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b ".# define CACK
3750: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 50 EY_DEBUG_FUNC_AP
3760: 50 54 59 50 45 5f 54 4f 5f 53 54 52 28 78 29 20 PTYPE_TO_STR(x)
3770: 22 44 45 42 55 47 5f 44 49 53 41 42 4c 45 44 22 "DEBUG_DISABLED"
3780: 0a 23 65 6e 64 69 66 0a 0a 73 74 72 75 63 74 20 .#endif..struct
3790: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e cackey_pcsc_iden
37a0: 74 69 74 79 20 7b 0a 09 75 6e 73 69 67 6e 65 64 tity {..unsigned
37b0: 20 63 68 61 72 20 61 70 70 6c 65 74 5b 37 5d 3b char applet[7];
37c0: 0a 09 75 69 6e 74 31 36 5f 74 20 66 69 6c 65 3b ..uint16_t file;
37d0: 0a 0a 09 73 69 7a 65 5f 74 20 63 65 72 74 69 66 ...size_t certif
37e0: 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 75 6e 73 69 icate_len;..unsi
37f0: 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 69 gned char *certi
3800: 66 69 63 61 74 65 3b 0a 0a 09 73 73 69 7a 65 5f ficate;...ssize_
3810: 74 20 6b 65 79 73 69 7a 65 3b 0a 7d 3b 0a 0a 73 t keysize;.};..s
3820: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 truct cackey_ide
3830: 6e 74 69 74 79 20 7b 0a 09 73 74 72 75 63 74 20 ntity {..struct
3840: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e cackey_pcsc_iden
3850: 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e 74 tity *pcsc_ident
3860: 69 74 79 3b 0a 0a 09 43 4b 5f 41 54 54 52 49 42 ity;...CK_ATTRIB
3870: 55 54 45 20 2a 61 74 74 72 69 62 75 74 65 73 3b UTE *attributes;
3880: 0a 09 43 4b 5f 55 4c 4f 4e 47 20 61 74 74 72 69 ..CK_ULONG attri
3890: 62 75 74 65 73 5f 63 6f 75 6e 74 3b 0a 7d 3b 0a butes_count;.};.
38a0: 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 .struct cackey_s
38b0: 65 73 73 69 6f 6e 20 7b 0a 09 69 6e 74 20 61 63 ession {..int ac
38c0: 74 69 76 65 3b 0a 0a 09 43 4b 5f 53 4c 4f 54 5f tive;...CK_SLOT_
38d0: 49 44 20 73 6c 6f 74 49 44 3b 0a 0a 09 43 4b 5f ID slotID;...CK_
38e0: 53 54 41 54 45 20 73 74 61 74 65 3b 0a 09 43 4b STATE state;..CK
38f0: 5f 46 4c 41 47 53 20 66 6c 61 67 73 3b 0a 09 43 _FLAGS flags;..C
3900: 4b 5f 55 4c 4f 4e 47 20 75 6c 44 65 76 69 63 65 K_ULONG ulDevice
3910: 45 72 72 6f 72 3b 0a 09 43 4b 5f 56 4f 49 44 5f Error;..CK_VOID_
3920: 50 54 52 20 70 41 70 70 6c 69 63 61 74 69 6f 6e PTR pApplication
3930: 3b 0a 09 43 4b 5f 4e 4f 54 49 46 59 20 4e 6f 74 ;..CK_NOTIFY Not
3940: 69 66 79 3b 0a 0a 09 73 74 72 75 63 74 20 63 61 ify;...struct ca
3950: 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 ckey_identity *i
3960: 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73 69 dentities;..unsi
3970: 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 gned long identi
3980: 74 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69 6e ties_count;...in
3990: 74 20 73 65 61 72 63 68 5f 61 63 74 69 76 65 3b t search_active;
39a0: 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 ..CK_ATTRIBUTE_P
39b0: 54 52 20 73 65 61 72 63 68 5f 71 75 65 72 79 3b TR search_query;
39c0: 0a 09 43 4b 5f 55 4c 4f 4e 47 20 73 65 61 72 63 ..CK_ULONG searc
39d0: 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b 0a 09 h_query_count;..
39e0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 65 unsigned long se
39f0: 61 72 63 68 5f 63 75 72 72 5f 69 64 3b 0a 0a 09 arch_curr_id;...
3a00: 69 6e 74 20 73 69 67 6e 5f 61 63 74 69 76 65 3b int sign_active;
3a10: 0a 09 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 ..CK_MECHANISM_T
3a20: 59 50 45 20 73 69 67 6e 5f 6d 65 63 68 61 6e 69 YPE sign_mechani
3a30: 73 6d 3b 0a 09 43 4b 5f 42 59 54 45 5f 50 54 52 sm;..CK_BYTE_PTR
3a40: 20 73 69 67 6e 5f 62 75 66 3b 0a 09 75 6e 73 69 sign_buf;..unsi
3a50: 67 6e 65 64 20 6c 6f 6e 67 20 73 69 67 6e 5f 62 gned long sign_b
3a60: 75 66 6c 65 6e 3b 0a 09 75 6e 73 69 67 6e 65 64 uflen;..unsigned
3a70: 20 6c 6f 6e 67 20 73 69 67 6e 5f 62 75 66 75 73 long sign_bufus
3a80: 65 64 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b ed;..struct cack
3a90: 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 73 69 67 ey_identity *sig
3aa0: 6e 5f 69 64 65 6e 74 69 74 79 3b 0a 0a 09 69 6e n_identity;...in
3ab0: 74 20 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 t decrypt_active
3ac0: 3b 0a 09 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f ;..CK_MECHANISM_
3ad0: 54 59 50 45 20 64 65 63 72 79 70 74 5f 6d 65 63 TYPE decrypt_mec
3ae0: 68 61 6e 69 73 6d 3b 0a 09 43 4b 5f 56 4f 49 44 hanism;..CK_VOID
3af0: 5f 50 54 52 20 64 65 63 72 79 70 74 5f 6d 65 63 _PTR decrypt_mec
3b00: 68 5f 70 61 72 6d 3b 0a 09 43 4b 5f 55 4c 4f 4e h_parm;..CK_ULON
3b10: 47 20 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 G decrypt_mech_p
3b20: 61 72 6d 6c 65 6e 3b 0a 09 73 74 72 75 63 74 20 armlen;..struct
3b30: 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 cackey_identity
3b40: 2a 64 65 63 72 79 70 74 5f 69 64 65 6e 74 69 74 *decrypt_identit
3b50: 79 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 y;.};..struct ca
3b60: 63 6b 65 79 5f 73 6c 6f 74 20 7b 0a 09 69 6e 74 ckey_slot {..int
3b70: 20 61 63 74 69 76 65 3b 0a 0a 09 63 68 61 72 20 active;...char
3b80: 2a 70 63 73 63 5f 72 65 61 64 65 72 3b 0a 0a 09 *pcsc_reader;...
3b90: 69 6e 74 20 70 63 73 63 5f 63 61 72 64 5f 63 6f int pcsc_card_co
3ba0: 6e 6e 65 63 74 65 64 3b 0a 09 53 43 41 52 44 48 nnected;..SCARDH
3bb0: 41 4e 44 4c 45 20 70 63 73 63 5f 63 61 72 64 3b ANDLE pcsc_card;
3bc0: 0a 0a 09 69 6e 74 20 74 72 61 6e 73 61 63 74 69 ...int transacti
3bd0: 6f 6e 5f 64 65 70 74 68 3b 0a 0a 09 69 6e 74 20 on_depth;...int
3be0: 73 6c 6f 74 5f 72 65 73 65 74 3b 0a 0a 09 43 4b slot_reset;...CK
3bf0: 5f 46 4c 41 47 53 20 74 6f 6b 65 6e 5f 66 6c 61 _FLAGS token_fla
3c00: 67 73 3b 0a 0a 09 75 6e 73 69 67 6e 65 64 20 63 gs;...unsigned c
3c10: 68 61 72 20 2a 6c 61 62 65 6c 3b 0a 7d 3b 0a 0a har *label;.};..
3c20: 74 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09 typedef enum {..
3c30: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47 CACKEY_TLV_APP_G
3c40: 45 4e 45 52 49 43 20 3d 20 30 78 30 31 2c 0a 09 ENERIC = 0x01,..
3c50: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 CACKEY_TLV_APP_S
3c60: 4b 49 20 20 20 20 20 3d 20 30 78 30 32 2c 0a 09 KI = 0x02,..
3c70: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 CACKEY_TLV_APP_P
3c80: 4b 49 20 20 20 20 20 3d 20 30 78 30 34 0a 7d 20 KI = 0x04.}
3c90: 63 61 63 6b 65 79 5f 74 6c 76 5f 61 70 70 74 79 cackey_tlv_appty
3ca0: 70 65 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 pe;..typedef enu
3cb0: 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f m {..CACKEY_TLV_
3cc0: 4f 42 4a 49 44 5f 47 45 4e 45 52 41 4c 49 4e 46 OBJID_GENERALINF
3cd0: 4f 20 20 20 20 20 20 20 3d 20 30 78 32 30 30 30 O = 0x2000
3ce0: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 ,..CACKEY_TLV_OB
3cf0: 4a 49 44 5f 50 52 4f 50 45 52 53 4f 4e 41 4c 49 JID_PROPERSONALI
3d00: 4e 46 4f 20 20 20 3d 20 30 78 32 31 30 30 2c 0a NFO = 0x2100,.
3d10: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 .CACKEY_TLV_OBJI
3d20: 44 5f 41 43 43 45 53 53 43 4f 4e 54 52 4f 4c 20 D_ACCESSCONTROL
3d30: 20 20 20 20 3d 20 30 78 33 30 30 30 2c 0a 09 43 = 0x3000,..C
3d40: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f ACKEY_TLV_OBJID_
3d50: 4c 4f 47 49 4e 20 20 20 20 20 20 20 20 20 20 20 LOGIN
3d60: 20 20 3d 20 30 78 34 30 30 30 2c 0a 09 43 41 43 = 0x4000,..CAC
3d70: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 KEY_TLV_OBJID_CA
3d80: 52 44 49 4e 46 4f 20 20 20 20 20 20 20 20 20 20 RDINFO
3d90: 3d 20 30 78 35 30 30 30 2c 0a 09 43 41 43 4b 45 = 0x5000,..CACKE
3da0: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 42 49 4f 4d Y_TLV_OBJID_BIOM
3db0: 45 54 52 49 43 53 20 20 20 20 20 20 20 20 3d 20 ETRICS =
3dc0: 30 78 36 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 0x6000,..CACKEY_
3dd0: 54 4c 56 5f 4f 42 4a 49 44 5f 44 49 47 49 54 41 TLV_OBJID_DIGITA
3de0: 4c 53 49 47 43 45 52 54 20 20 20 20 3d 20 30 78 LSIGCERT = 0x
3df0: 37 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 7000,..CACKEY_TL
3e00: 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 V_OBJID_CAC_PERS
3e10: 4f 4e 20 20 20 20 20 20 20 20 3d 20 30 78 30 32 ON = 0x02
3e20: 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 00,..CACKEY_TLV_
3e30: 4f 42 4a 49 44 5f 43 41 43 5f 42 45 4e 45 46 49 OBJID_CAC_BENEFI
3e40: 54 53 20 20 20 20 20 20 3d 20 30 78 30 32 30 32 TS = 0x0202
3e50: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 ,..CACKEY_TLV_OB
3e60: 4a 49 44 5f 43 41 43 5f 4f 54 48 45 52 42 45 4e JID_CAC_OTHERBEN
3e70: 45 46 49 54 53 20 3d 20 30 78 30 32 30 33 2c 0a EFITS = 0x0203,.
3e80: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 .CACKEY_TLV_OBJI
3e90: 44 5f 43 41 43 5f 50 45 52 53 4f 4e 4e 45 4c 20 D_CAC_PERSONNEL
3ea0: 20 20 20 20 3d 20 30 78 30 32 30 31 2c 0a 09 43 = 0x0201,..C
3eb0: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f ACKEY_TLV_OBJID_
3ec0: 43 41 43 5f 50 4b 49 43 45 52 54 20 20 20 20 20 CAC_PKICERT
3ed0: 20 20 3d 20 30 78 30 32 46 45 0a 7d 20 63 61 63 = 0x02FE.} cac
3ee0: 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74 69 64 key_tlv_objectid
3ef0: 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20 ;..typedef enum
3f00: 7b 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 {..CACKEY_PCSC_S
3f10: 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 20 20 20 _TOKENPRESENT
3f20: 20 3d 20 31 2c 0a 09 43 41 43 4b 45 59 5f 50 43 = 1,..CACKEY_PC
3f30: 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 SC_S_OK
3f40: 20 20 20 20 20 3d 20 30 2c 0a 09 43 41 43 4b 45 = 0,..CACKE
3f50: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 Y_PCSC_E_GENERIC
3f60: 20 20 20 20 20 20 20 20 20 3d 20 2d 31 2c 0a 09 = -1,..
3f70: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 CACKEY_PCSC_E_BA
3f80: 44 50 49 4e 20 20 20 20 20 20 20 20 20 20 3d 20 DPIN =
3f90: 2d 32 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 -2,..CACKEY_PCSC
3fa0: 5f 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 _E_LOCKED
3fb0: 20 20 20 3d 20 2d 33 2c 0a 09 43 41 43 4b 45 59 = -3,..CACKEY
3fc0: 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 _PCSC_E_NEEDLOGI
3fd0: 4e 20 20 20 20 20 20 20 3d 20 2d 34 2c 0a 09 43 N = -4,..C
3fe0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b ACKEY_PCSC_E_TOK
3ff0: 45 4e 41 42 53 45 4e 54 20 20 20 20 20 3d 20 2d ENABSENT = -
4000: 36 2c 0a 7d 20 63 61 63 6b 65 79 5f 72 65 74 3b 6,.} cackey_ret;
4010: 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f ..struct cackey_
4020: 74 6c 76 5f 63 61 72 64 75 72 6c 20 7b 0a 09 75 tlv_cardurl {..u
4030: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 20 20 20 nsigned char
4040: 20 20 20 20 72 69 64 5b 35 5d 3b 0a 09 63 61 63 rid[5];..cac
4050: 6b 65 79 5f 74 6c 76 5f 61 70 70 74 79 70 65 20 key_tlv_apptype
4060: 20 20 61 70 70 74 79 70 65 3b 0a 09 63 61 63 6b apptype;..cack
4070: 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74 69 64 20 ey_tlv_objectid
4080: 20 6f 62 6a 65 63 74 69 64 3b 0a 09 63 61 63 6b objectid;..cack
4090: 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74 69 64 20 ey_tlv_objectid
40a0: 20 61 70 70 69 64 3b 0a 09 75 6e 73 69 67 6e 65 appid;..unsigne
40b0: 64 20 63 68 61 72 20 20 20 20 20 20 20 20 70 69 d char pi
40c0: 6e 69 64 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 nid;.};..struct
40d0: 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 cackey_tlv_entit
40e0: 79 3b 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 y;.struct cackey
40f0: 5f 74 6c 76 5f 65 6e 74 69 74 79 20 7b 0a 09 75 _tlv_entity {..u
4100: 69 6e 74 38 5f 74 20 74 61 67 3b 0a 09 73 69 7a int8_t tag;..siz
4110: 65 5f 74 20 6c 65 6e 67 74 68 3b 0a 0a 09 75 6e e_t length;...un
4120: 69 6f 6e 20 7b 0a 09 09 76 6f 69 64 20 2a 76 61 ion {...void *va
4130: 6c 75 65 3b 0a 09 09 73 74 72 75 63 74 20 63 61 lue;...struct ca
4140: 63 6b 65 79 5f 74 6c 76 5f 63 61 72 64 75 72 6c ckey_tlv_cardurl
4150: 20 2a 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 3b *value_cardurl;
4160: 0a 09 09 75 69 6e 74 38 5f 74 20 76 61 6c 75 65 ...uint8_t value
4170: 5f 62 79 74 65 3b 0a 09 7d 3b 0a 0a 09 73 74 72 _byte;..};...str
4180: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 uct cackey_tlv_e
4190: 6e 74 69 74 79 20 2a 5f 6e 65 78 74 3b 0a 7d 3b ntity *_next;.};
41a0: 0a 0a 2f 2a 20 43 41 43 4b 45 59 20 47 6c 6f 62 ../* CACKEY Glob
41b0: 61 6c 20 48 61 6e 64 6c 65 73 20 2a 2f 0a 73 74 al Handles */.st
41c0: 61 74 69 63 20 76 6f 69 64 20 2a 63 61 63 6b 65 atic void *cacke
41d0: 79 5f 62 69 67 6c 6f 63 6b 20 3d 20 4e 55 4c 4c y_biglock = NULL
41e0: 3b 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 ;.static struct
41f0: 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 20 63 cackey_session c
4200: 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 31 ackey_sessions[1
4210: 32 38 5d 3b 0a 73 74 61 74 69 63 20 73 74 72 75 28];.static stru
4220: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 63 ct cackey_slot c
4230: 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 31 32 38 5d ackey_slots[128]
4240: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 ;.static int cac
4250: 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20 key_initialized
4260: 3d 20 30 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 = 0;.static int
4270: 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f 69 cackey_biglock_i
4280: 6e 69 74 20 3d 20 30 3b 0a 43 4b 5f 43 5f 49 4e nit = 0;.CK_C_IN
4290: 49 54 49 41 4c 49 5a 45 5f 41 52 47 53 20 63 61 ITIALIZE_ARGS ca
42a0: 63 6b 65 79 5f 61 72 67 73 3b 0a 0a 2f 2a 20 50 ckey_args;../* P
42b0: 43 53 43 20 47 6c 6f 62 61 6c 20 48 61 6e 64 6c CSC Global Handl
42c0: 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 4c 50 53 es */.static LPS
42d0: 43 41 52 44 43 4f 4e 54 45 58 54 20 63 61 63 6b CARDCONTEXT cack
42e0: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d ey_pcsc_handle =
42f0: 20 4e 55 4c 4c 3b 0a 0a 73 74 61 74 69 63 20 75 NULL;..static u
4300: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 61 63 nsigned long cac
4310: 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 76 key_getversion(v
4320: 6f 69 64 29 20 7b 0a 09 73 74 61 74 69 63 20 75 oid) {..static u
4330: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 72 65 74 nsigned long ret
4340: 76 61 6c 20 3d 20 32 35 35 3b 0a 09 75 6e 73 69 val = 255;..unsi
4350: 67 6e 65 64 20 6c 6f 6e 67 20 6d 61 6a 6f 72 20 gned long major
4360: 3d 20 30 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c = 0;..unsigned l
4370: 6f 6e 67 20 6d 69 6e 6f 72 20 3d 20 30 3b 0a 09 ong minor = 0;..
4380: 63 68 61 72 20 2a 6d 61 6a 6f 72 5f 73 74 72 20 char *major_str
4390: 3d 20 4e 55 4c 4c 3b 0a 09 63 68 61 72 20 2a 6d = NULL;..char *m
43a0: 69 6e 6f 72 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b inor_str = NULL;
43b0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
43c0: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
43d0: 29 3b 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20 );...if (retval
43e0: 21 3d 20 32 35 35 29 20 7b 0a 09 09 43 41 43 4b != 255) {...CACK
43f0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
4400: 22 52 65 74 75 72 6e 69 6e 67 20 30 78 25 6c 78 "Returning 0x%lx
4410: 20 28 63 61 63 68 65 64 29 2e 22 2c 20 72 65 74 (cached).", ret
4420: 76 61 6c 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 val);....return(
4430: 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65 retval);..}...re
4440: 74 76 61 6c 20 3d 20 30 3b 0a 0a 23 69 66 64 65 tval = 0;..#ifde
4450: 66 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f f PACKAGE_VERSIO
4460: 4e 0a 20 20 20 20 20 20 20 20 6d 61 6a 6f 72 5f N. major_
4470: 73 74 72 20 3d 20 50 41 43 4b 41 47 45 5f 56 45 str = PACKAGE_VE
4480: 52 53 49 4f 4e 3b 0a 09 69 66 20 28 6d 61 6a 6f RSION;..if (majo
4490: 72 5f 73 74 72 29 20 7b 0a 09 20 20 20 20 20 20 r_str) {..
44a0: 20 20 6d 61 6a 6f 72 20 3d 20 73 74 72 74 6f 75 major = strtou
44b0: 6c 28 6d 61 6a 6f 72 5f 73 74 72 2c 20 26 6d 69 l(major_str, &mi
44c0: 6e 6f 72 5f 73 74 72 2c 20 31 30 29 3b 0a 0a 09 nor_str, 10);...
44d0: 09 69 66 20 28 6d 69 6e 6f 72 5f 73 74 72 29 20 .if (minor_str)
44e0: 7b 0a 09 09 09 6d 69 6e 6f 72 20 3d 20 73 74 72 {....minor = str
44f0: 74 6f 75 6c 28 6d 69 6e 6f 72 5f 73 74 72 20 2b toul(minor_str +
4500: 20 31 2c 20 4e 55 4c 4c 2c 20 31 30 29 3b 0a 09 1, NULL, 10);..
4510: 09 7d 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d .}..}...retval =
4520: 20 28 6d 61 6a 6f 72 20 3c 3c 20 31 36 29 20 7c (major << 16) |
4530: 20 28 6d 69 6e 6f 72 20 3c 3c 20 38 29 3b 0a 23 (minor << 8);.#
4540: 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 endif...CACKEY_D
4550: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
4560: 75 72 6e 69 6e 67 20 30 78 25 6c 78 22 2c 20 72 urning 0x%lx", r
4570: 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e etval);...return
4580: 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 20 (retval);.}../*
4590: 50 43 2f 53 43 20 52 65 6c 61 74 65 64 20 46 75 PC/SC Related Fu
45a0: 6e 63 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a nctions */./*. *
45b0: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 SYNPOSIS. *
45c0: 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 73 6c 6f void cackey_slo
45d0: 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c ts_disconnect_al
45e0: 6c 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 l(void);. *. * A
45f0: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 RGUMENTS. *
4600: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 None. *. * RETUR
4610: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e N VALUE. * N
4620: 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a one. *. * NOTES.
4630: 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 * This func
4640: 74 69 6f 6e 20 64 69 73 63 6f 6e 6e 65 63 74 73 tion disconnects
4650: 20 66 72 6f 6d 20 61 6c 6c 20 63 61 72 64 73 2e from all cards.
4660: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 . *. */.static v
4670: 6f 69 64 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 oid cackey_slots
4680: 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 _disconnect_all(
4690: 76 6f 69 64 29 20 7b 0a 09 75 69 6e 74 33 32 5f void) {..uint32_
46a0: 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f t idx;...CACKEY_
46b0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
46c0: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 66 6f 72 20 28 lled.");...for (
46d0: 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 idx = 0; idx < (
46e0: 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c sizeof(cackey_sl
46f0: 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 ots) / sizeof(ca
4700: 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b ckey_slots[0]));
4710: 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 idx++) {...if (
4720: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 cackey_slots[idx
4730: 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e ].pcsc_card_conn
4740: 65 63 74 65 64 29 20 7b 0a 09 09 09 43 41 43 4b ected) {....CACK
4750: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
4760: 22 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 "SCardDisconnect
4770: 28 25 6c 75 29 20 63 61 6c 6c 65 64 22 2c 20 28 (%lu) called", (
4780: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 unsigned long) i
4790: 64 78 29 3b 0a 0a 09 09 09 53 43 61 72 64 44 69 dx);.....SCardDi
47a0: 73 63 6f 6e 6e 65 63 74 28 63 61 63 6b 65 79 5f sconnect(cackey_
47b0: 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f slots[idx].pcsc_
47c0: 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 card, SCARD_LEAV
47d0: 45 5f 43 41 52 44 29 3b 0a 09 09 7d 0a 0a 09 09 E_CARD);...}....
47e0: 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 if (cackey_slots
47f0: 5b 69 64 78 5d 2e 6c 61 62 65 6c 29 20 7b 0a 09 [idx].label) {..
4800: 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c ..free(cackey_sl
4810: 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 29 3b ots[idx].label);
4820: 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 .....cackey_slot
4830: 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 20 3d 20 4e s[idx].label = N
4840: 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b ULL;...}....cack
4850: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 ey_slots[idx].pc
4860: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 sc_card_connecte
4870: 64 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f d = 0;...cackey_
4880: 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73 slots[idx].trans
4890: 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30 action_depth = 0
48a0: 3b 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f ;....if (cackey_
48b0: 73 6c 6f 74 73 5b 69 64 78 5d 2e 61 63 74 69 76 slots[idx].activ
48c0: 65 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 e) {....CACKEY_D
48d0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 61 72 EBUG_PRINTF("Mar
48e0: 6b 69 6e 67 20 61 63 74 69 76 65 20 73 6c 6f 74 king active slot
48f0: 20 25 6c 75 20 61 73 20 62 65 69 6e 67 20 72 65 %lu as being re
4900: 73 65 74 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 set", (unsigned
4910: 6c 6f 6e 67 29 20 69 64 78 29 3b 0a 09 09 7d 0a long) idx);...}.
4920: 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b ...cackey_slots[
4930: 69 64 78 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 20 idx].slot_reset
4940: 3d 20 31 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 = 1;..}...CACKEY
4950: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
4960: 65 74 75 72 6e 69 6e 67 22 29 3b 0a 0a 09 72 65 eturning");...re
4970: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 turn;.}../*. * S
4980: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 YNPOSIS. * c
4990: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 ackey_ret cackey
49a0: 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 76 6f _pcsc_connect(vo
49b0: 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d id);. *. * ARGUM
49c0: 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 ENTS. * None
49d0: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 . *. * RETURN VA
49e0: 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 LUE. * CACKE
49f0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 Y_PCSC_S_OK
4a00: 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 On success.
4a10: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 * CACKEY_PCS
4a20: 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f C_E_GENERIC O
4a30: 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f n error. *. * NO
4a40: 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 TES. * This
4a50: 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 6e 65 63 74 function connect
4a60: 73 20 74 6f 20 74 68 65 20 50 43 2f 53 43 20 43 s to the PC/SC C
4a70: 6f 6e 6e 65 63 74 69 6f 6e 20 4d 61 6e 61 67 65 onnection Manage
4a80: 72 20 61 6e 64 20 75 70 64 61 74 65 73 20 74 68 r and updates th
4a90: 65 0a 20 2a 20 20 20 20 20 67 6c 6f 62 61 6c 20 e. * global
4aa0: 68 61 6e 64 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a 73 handle.. *. */.s
4ab0: 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 tatic cackey_ret
4ac0: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e cackey_pcsc_con
4ad0: 6e 65 63 74 28 76 6f 69 64 29 20 7b 0a 09 4c 4f nect(void) {..LO
4ae0: 4e 47 20 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e NG scard_est_con
4af0: 74 65 78 74 5f 72 65 74 3b 0a 23 69 66 64 65 66 text_ret;.#ifdef
4b00: 20 48 41 56 45 5f 53 43 41 52 44 49 53 56 41 4c HAVE_SCARDISVAL
4b10: 49 44 43 4f 4e 54 45 58 54 0a 09 4c 4f 4e 47 20 IDCONTEXT..LONG
4b20: 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 scard_isvalid_re
4b30: 74 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b t;.#endif...CACK
4b40: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
4b50: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 "Called.");...if
4b60: 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 (cackey_pcsc_ha
4b70: 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a ndle == NULL) {.
4b80: 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 ..cackey_pcsc_ha
4b90: 6e 64 6c 65 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 ndle = malloc(si
4ba0: 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f 70 63 73 zeof(*cackey_pcs
4bb0: 63 5f 68 61 6e 64 6c 65 29 29 3b 0a 09 09 69 66 c_handle));...if
4bc0: 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 (cackey_pcsc_ha
4bd0: 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a ndle == NULL) {.
4be0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
4bf0: 50 52 49 4e 54 46 28 22 43 61 6c 6c 20 74 6f 20 PRINTF("Call to
4c00: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 2c malloc() failed,
4c10: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 returning in fa
4c20: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 63 61 63 ilure");.....cac
4c30: 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e key_slots_discon
4c40: 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 nect_all();.....
4c50: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 return(CACKEY_PC
4c60: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 SC_E_GENERIC);..
4c70: 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 .}....CACKEY_DEB
4c80: 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 UG_PRINTF("SCard
4c90: 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 EstablishContext
4ca0: 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09 09 73 () called");...s
4cb0: 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 card_est_context
4cc0: 5f 72 65 74 20 3d 20 53 43 61 72 64 45 73 74 61 _ret = SCardEsta
4cd0: 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 53 43 41 blishContext(SCA
4ce0: 52 44 5f 53 43 4f 50 45 5f 53 59 53 54 45 4d 2c RD_SCOPE_SYSTEM,
4cf0: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 63 61 63 NULL, NULL, cac
4d00: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 key_pcsc_handle)
4d10: 3b 0a 09 09 69 66 20 28 73 63 61 72 64 5f 65 73 ;...if (scard_es
4d20: 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 21 3d t_context_ret !=
4d30: 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 SCARD_S_SUCCESS
4d40: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 ) {....CACKEY_DE
4d50: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
4d60: 20 74 6f 20 53 43 61 72 64 45 73 74 61 62 6c 69 to SCardEstabli
4d70: 73 68 43 6f 6e 74 65 78 74 20 66 61 69 6c 65 64 shContext failed
4d80: 20 28 72 65 74 75 72 6e 65 64 20 25 73 2f 25 6c (returned %s/%l
4d90: 69 29 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e i), returning in
4da0: 20 66 61 69 6c 75 72 65 22 2c 20 43 41 43 4b 45 failure", CACKE
4db0: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 Y_DEBUG_FUNC_SCA
4dc0: 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 RDERR_TO_STR(sca
4dd0: 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 rd_est_context_r
4de0: 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 et), (long) scar
4df0: 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 d_est_context_re
4e00: 74 29 3b 0a 0a 09 09 09 66 72 65 65 28 63 61 63 t);.....free(cac
4e10: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 key_pcsc_handle)
4e20: 3b 0a 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63 ;....cackey_pcsc
4e30: 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a _handle = NULL;.
4e40: 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 ....cackey_slots
4e50: 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 _disconnect_all(
4e60: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 );.....return(CA
4e70: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 CKEY_PCSC_E_GENE
4e80: 52 49 43 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 RIC);...}..}..#i
4e90: 66 64 65 66 20 48 41 56 45 5f 53 43 41 52 44 49 fdef HAVE_SCARDI
4ea0: 53 56 41 4c 49 44 43 4f 4e 54 45 58 54 0a 09 43 SVALIDCONTEXT..C
4eb0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
4ec0: 54 46 28 22 53 43 61 72 64 49 73 56 61 6c 69 64 TF("SCardIsValid
4ed0: 43 6f 6e 74 65 78 74 28 29 20 63 61 6c 6c 65 64 Context() called
4ee0: 22 29 3b 0a 09 73 63 61 72 64 5f 69 73 76 61 6c ");..scard_isval
4ef0: 69 64 5f 72 65 74 20 3d 20 53 43 61 72 64 49 73 id_ret = SCardIs
4f00: 56 61 6c 69 64 43 6f 6e 74 65 78 74 28 2a 63 61 ValidContext(*ca
4f10: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 ckey_pcsc_handle
4f20: 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 69 73 );..if (scard_is
4f30: 76 61 6c 69 64 5f 72 65 74 20 21 3d 20 53 43 41 valid_ret != SCA
4f40: 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a RD_S_SUCCESS) {.
4f50: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
4f60: 52 49 4e 54 46 28 22 48 61 6e 64 6c 65 20 68 61 RINTF("Handle ha
4f70: 73 20 62 65 63 6f 6d 65 20 69 6e 76 61 6c 69 64 s become invalid
4f80: 20 28 53 43 61 72 64 49 73 56 61 6c 69 64 43 6f (SCardIsValidCo
4f90: 6e 74 65 78 74 20 3d 20 25 73 2f 25 6c 69 29 2c ntext = %s/%li),
4fa0: 20 74 72 79 69 6e 67 20 74 6f 20 72 65 2d 65 73 trying to re-es
4fb0: 74 61 62 6c 69 73 68 2e 2e 2e 22 2c 20 43 41 43 tablish...", CAC
4fc0: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 KEY_DEBUG_FUNC_S
4fd0: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 CARDERR_TO_STR(s
4fe0: 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 card_isvalid_ret
4ff0: 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f ), (long) scard_
5000: 69 73 76 61 6c 69 64 5f 72 65 74 29 3b 0a 0a 09 isvalid_ret);...
5010: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
5020: 49 4e 54 46 28 22 53 43 61 72 64 45 73 74 61 62 INTF("SCardEstab
5030: 6c 69 73 68 43 6f 6e 74 65 78 74 28 29 20 63 61 lishContext() ca
5040: 6c 6c 65 64 22 29 3b 0a 09 09 73 63 61 72 64 5f lled");...scard_
5050: 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 est_context_ret
5060: 3d 20 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 = SCardEstablish
5070: 43 6f 6e 74 65 78 74 28 53 43 41 52 44 5f 53 43 Context(SCARD_SC
5080: 4f 50 45 5f 53 59 53 54 45 4d 2c 20 4e 55 4c 4c OPE_SYSTEM, NULL
5090: 2c 20 4e 55 4c 4c 2c 20 63 61 63 6b 65 79 5f 70 , NULL, cackey_p
50a0: 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 69 csc_handle);...i
50b0: 66 20 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e f (scard_est_con
50c0: 74 65 78 74 5f 72 65 74 20 21 3d 20 53 43 41 52 text_ret != SCAR
50d0: 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 D_S_SUCCESS) {..
50e0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
50f0: 52 49 4e 54 46 28 22 43 61 6c 6c 20 74 6f 20 53 RINTF("Call to S
5100: 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e CardEstablishCon
5110: 74 65 78 74 20 66 61 69 6c 65 64 20 28 72 65 74 text failed (ret
5120: 75 72 6e 65 64 20 25 73 2f 25 6c 69 29 2c 20 72 urned %s/%li), r
5130: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c eturning in fail
5140: 75 72 65 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 ure", CACKEY_DEB
5150: 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 UG_FUNC_SCARDERR
5160: 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 65 73 _TO_STR(scard_es
5170: 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 2c 20 t_context_ret),
5180: 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 65 73 74 (long) scard_est
5190: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 3b 0a 0a _context_ret);..
51a0: 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 70 ...free(cackey_p
51b0: 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 09 csc_handle);....
51c0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 cackey_pcsc_hand
51d0: 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 63 le = NULL;.....c
51e0: 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 ackey_slots_disc
51f0: 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 onnect_all();...
5200: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f ..return(CACKEY_
5210: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b PCSC_E_GENERIC);
5220: 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 ...}....CACKEY_D
5230: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 48 61 6e EBUG_PRINTF("Han
5240: 64 6c 65 20 68 61 73 20 62 65 65 6e 20 72 65 2d dle has been re-
5250: 65 73 74 61 62 6c 69 73 68 65 64 22 29 3b 0a 09 established");..
5260: 7d 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 }.#endif...CACKE
5270: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
5280: 53 75 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e 6e Sucessfully conn
5290: 65 63 74 65 64 20 74 6f 20 50 43 2f 53 43 2c 20 ected to PC/SC,
52a0: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 returning in suc
52b0: 63 65 73 73 22 29 3b 0a 0a 09 72 65 74 75 72 6e cess");...return
52c0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f (CACKEY_PCSC_S_O
52d0: 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e K);.}../*. * SYN
52e0: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 POSIS. * cac
52f0: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 70 key_ret cackey_p
5300: 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 76 csc_disconnect(v
5310: 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 oid);. *. * ARGU
5320: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e MENTS. * Non
5330: 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 e. *. * RETURN V
5340: 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b ALUE. * CACK
5350: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 EY_PCSC_S_OK
5360: 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a On success.
5370: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 * CACKEY_PC
5380: 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 SC_E_GENERIC
5390: 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e On error. *. * N
53a0: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 OTES. * This
53b0: 20 66 75 6e 63 74 69 6f 6e 20 64 69 73 63 6f 6e function discon
53c0: 6e 65 63 74 73 20 66 72 6f 6d 20 74 68 65 20 50 nects from the P
53d0: 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 C/SC Connection
53e0: 6d 61 6e 61 67 65 72 20 61 6e 64 20 75 70 64 61 manager and upda
53f0: 74 65 73 0a 20 2a 20 20 20 20 20 74 68 65 20 67 tes. * the g
5400: 6c 6f 62 61 6c 20 68 61 6e 64 6c 65 2e 0a 20 2a lobal handle.. *
5410: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b . */.static cack
5420: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 70 63 ey_ret cackey_pc
5430: 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 76 6f sc_disconnect(vo
5440: 69 64 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 id) {..LONG scar
5450: 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72 65 d_rel_context_re
5460: 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 t;...CACKEY_DEBU
5470: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 G_PRINTF("Called
5480: 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 .");...if (cacke
5490: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 3d y_pcsc_handle ==
54a0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 NULL) {...retur
54b0: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f n(CACKEY_PCSC_S_
54c0: 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 63 61 72 64 5f OK);..}...scard_
54d0: 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 rel_context_ret
54e0: 3d 20 53 43 61 72 64 52 65 6c 65 61 73 65 43 6f = SCardReleaseCo
54f0: 6e 74 65 78 74 28 2a 63 61 63 6b 65 79 5f 70 63 ntext(*cackey_pc
5500: 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 0a 09 69 66 sc_handle);...if
5510: 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 (cackey_pcsc_ha
5520: 6e 64 6c 65 29 20 7b 0a 09 09 66 72 65 65 28 63 ndle) {...free(c
5530: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c ackey_pcsc_handl
5540: 65 29 3b 0a 09 0a 09 09 63 61 63 6b 65 79 5f 70 e);.....cackey_p
5550: 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c csc_handle = NUL
5560: 4c 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 63 61 72 L;..}...if (scar
5570: 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72 65 d_rel_context_re
5580: 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 t != SCARD_S_SUC
5590: 43 45 53 53 29 20 7b 0a 09 09 72 65 74 75 72 6e CESS) {...return
55a0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 (CACKEY_PCSC_E_G
55b0: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 72 65 ENERIC);..}...re
55c0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 turn(CACKEY_PCSC
55d0: 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a _S_OK);.}../*. *
55e0: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 SYNPOSIS. *
55f0: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b cackey_ret cack
5600: 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 ey_connect_card(
5610: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c struct cackey_sl
5620: 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a ot *slot);. *. *
5630: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 ARGUMENTS. *
5640: 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 cackey_slot *s
5650: 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 lot. * S
5660: 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d lot to send comm
5670: 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45 ands to. *. * RE
5680: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 TURN VALUE. *
5690: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f CACKEY_PCSC_S_
56a0: 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 OK On su
56b0: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 ccess. * CAC
56c0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 KEY_PCSC_E_GENER
56d0: 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 IC On error.
56e0: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 *. * NOTES. *
56f0: 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 None. *. */.st
5700: 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 atic cackey_ret
5710: 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 cackey_connect_c
5720: 61 72 64 28 73 74 72 75 63 74 20 63 61 63 6b 65 ard(struct cacke
5730: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a y_slot *slot) {.
5740: 09 63 61 63 6b 65 79 5f 72 65 74 20 70 63 73 63 .cackey_ret pcsc
5750: 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 44 _connect_ret;..D
5760: 57 4f 52 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 WORD protocol;..
5770: 4c 4f 4e 47 20 73 63 61 72 64 5f 63 6f 6e 6e 5f LONG scard_conn_
5780: 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ret;...CACKEY_DE
5790: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
57a0: 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c ed.");...if (!sl
57b0: 6f 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ot) {...CACKEY_D
57c0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 EBUG_PRINTF("Inv
57d0: 61 6c 69 64 20 73 6c 6f 74 20 73 70 65 63 69 66 alid slot specif
57e0: 69 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 ied, returning i
57f0: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 n failure");....
5800: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 return(CACKEY_PC
5810: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 SC_E_GENERIC);..
5820: 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 }...pcsc_connect
5830: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70 63 _ret = cackey_pc
5840: 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 69 sc_connect();..i
5850: 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f f (pcsc_connect_
5860: 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 ret != CACKEY_PC
5870: 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 SC_S_OK) {...CAC
5880: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
5890: 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 ("Connection to
58a0: 50 43 2f 53 43 20 66 61 69 6c 65 64 2c 20 72 65 PC/SC failed, re
58b0: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 turning in failu
58c0: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 re");....return(
58d0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 CACKEY_PCSC_E_GE
58e0: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 NERIC);..}.../*
58f0: 43 6f 6e 6e 65 63 74 20 74 6f 20 72 65 61 64 65 Connect to reade
5900: 72 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a r, if needed */.
5910: 09 69 66 20 28 21 73 6c 6f 74 2d 3e 70 63 73 63 .if (!slot->pcsc
5920: 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 _card_connected)
5930: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
5940: 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 43 G_PRINTF("SCardC
5950: 6f 6e 6e 65 63 74 28 25 73 29 20 63 61 6c 6c 65 onnect(%s) calle
5960: 64 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 d", slot->pcsc_r
5970: 65 61 64 65 72 29 3b 0a 09 09 73 63 61 72 64 5f eader);...scard_
5980: 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 conn_ret = SCard
5990: 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f Connect(*cackey_
59a0: 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f pcsc_handle, slo
59b0: 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c 20 t->pcsc_reader,
59c0: 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 SCARD_SHARE_SHAR
59d0: 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 ED, SCARD_PROTOC
59e0: 4f 4c 5f 54 30 2c 20 26 73 6c 6f 74 2d 3e 70 63 OL_T0, &slot->pc
59f0: 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 sc_card, &protoc
5a00: 6f 6c 29 3b 0a 0a 09 09 69 66 20 28 73 63 61 72 ol);....if (scar
5a10: 64 5f 63 6f 6e 6e 5f 72 65 74 20 21 3d 20 53 43 d_conn_ret != SC
5a20: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b ARD_S_SUCCESS) {
5a30: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
5a40: 5f 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 _PRINTF("Connect
5a50: 69 6f 6e 20 74 6f 20 63 61 72 64 20 66 61 69 6c ion to card fail
5a60: 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e ed, returning in
5a70: 20 66 61 69 6c 75 72 65 20 28 53 43 61 72 64 43 failure (SCardC
5a80: 6f 6e 6e 65 63 74 28 29 20 3d 20 25 73 2f 25 6c onnect() = %s/%l
5a90: 69 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 i)", CACKEY_DEBU
5aa0: 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f G_FUNC_SCARDERR_
5ab0: 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 63 6f 6e TO_STR(scard_con
5ac0: 6e 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 n_ret), (long) s
5ad0: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 29 3b 0a card_conn_ret);.
5ae0: 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 ....return(CACKE
5af0: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 Y_PCSC_E_GENERIC
5b00: 29 3b 0a 09 09 7d 0a 0a 09 09 73 6c 6f 74 2d 3e );...}....slot->
5b10: 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 pcsc_card_connec
5b20: 74 65 64 20 3d 20 31 3b 0a 09 09 73 6c 6f 74 2d ted = 1;...slot-
5b30: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 >transaction_dep
5b40: 74 68 20 3d 20 30 3b 0a 09 7d 0a 0a 09 72 65 74 th = 0;..}...ret
5b50: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f urn(CACKEY_PCSC_
5b60: 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 S_OK);.}../*. *
5b70: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 SYNPOSIS. *
5b80: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 cackey_ret cacke
5b90: 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 y_begin_transact
5ba0: 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65 ion(struct cacke
5bb0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 y_slot *slot);.
5bc0: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 *. * ARGUMENTS.
5bd0: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f * cackey_slo
5be0: 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 t *slot. *
5bf0: 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 Slot to send
5c00: 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 commands to. *.
5c10: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 * RETURN VALUE.
5c20: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 * CACKEY_PCS
5c30: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f C_S_OK O
5c40: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 n success. *
5c50: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 CACKEY_PCSC_E_G
5c60: 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 ENERIC On err
5c70: 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 or. *. * NOTES.
5c80: 2a 20 20 20 20 20 54 68 65 20 74 72 61 6e 73 61 * The transa
5c90: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 ction should be
5ca0: 74 65 72 6d 69 6e 61 74 65 64 20 75 73 69 6e 67 terminated using
5cb0: 20 22 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 "cackey_end_tra
5cc0: 6e 73 61 63 74 69 6f 6e 22 0a 20 2a 0a 20 2a 2f nsaction". *. */
5cd0: 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 .static cackey_r
5ce0: 65 74 20 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f et cackey_begin_
5cf0: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75 transaction(stru
5d00: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a ct cackey_slot *
5d10: 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f slot) {..cackey_
5d20: 72 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f ret cackey_conn_
5d30: 72 65 74 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 ret;..LONG scard
5d40: 5f 74 72 61 6e 73 5f 72 65 74 3b 0a 0a 09 43 41 _trans_ret;...CA
5d50: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
5d60: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
5d70: 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74 20 cackey_conn_ret
5d80: 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 = cackey_connect
5d90: 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69 66 _card(slot);..if
5da0: 20 28 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65 (cackey_conn_re
5db0: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 t != CACKEY_PCSC
5dc0: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 _S_OK) {...CACKE
5dd0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
5de0: 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 Unable to connec
5df0: 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72 t to card, retur
5e00: 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29 3b ning in error");
5e10: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 ....return(CACKE
5e20: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 Y_PCSC_E_GENERIC
5e30: 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 );..}...slot->tr
5e40: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2b ansaction_depth+
5e50: 2b 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 +;...if (slot->t
5e60: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 ransaction_depth
5e70: 20 3e 20 31 29 20 7b 0a 09 09 43 41 43 4b 45 59 > 1) {...CACKEY
5e80: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 _DEBUG_PRINTF("A
5e90: 6c 72 65 61 64 79 20 69 6e 20 61 20 74 72 61 6e lready in a tran
5ea0: 73 61 63 74 69 6f 6e 2c 20 70 65 72 66 6f 72 6d saction, perform
5eb0: 69 6e 67 20 6e 6f 20 61 63 74 69 6f 6e 20 28 6e ing no action (n
5ec0: 65 77 20 64 65 70 74 68 20 3d 20 25 69 29 22 2c ew depth = %i)",
5ed0: 20 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 slot->transacti
5ee0: 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a 09 09 72 65 on_depth);....re
5ef0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 turn(CACKEY_PCSC
5f00: 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 63 61 _S_OK);..}...sca
5f10: 72 64 5f 74 72 61 6e 73 5f 72 65 74 20 3d 20 53 rd_trans_ret = S
5f20: 43 61 72 64 42 65 67 69 6e 54 72 61 6e 73 61 63 CardBeginTransac
5f30: 74 69 6f 6e 28 73 6c 6f 74 2d 3e 70 63 73 63 5f tion(slot->pcsc_
5f40: 63 61 72 64 29 3b 0a 09 69 66 20 28 73 63 61 72 card);..if (scar
5f50: 64 5f 74 72 61 6e 73 5f 72 65 74 20 21 3d 20 53 d_trans_ret != S
5f60: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 CARD_S_SUCCESS)
5f70: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
5f80: 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 _PRINTF("Unable
5f90: 74 6f 20 62 65 67 69 6e 20 74 72 61 6e 73 61 63 to begin transac
5fa0: 74 69 6f 6e 2c 20 72 65 74 75 72 6e 69 6e 67 20 tion, returning
5fb0: 69 6e 20 65 72 72 6f 72 22 29 3b 0a 0a 09 09 72 in error");....r
5fc0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 eturn(CACKEY_PCS
5fd0: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d C_E_GENERIC);..}
5fe0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
5ff0: 50 52 49 4e 54 46 28 22 53 75 63 65 73 73 66 75 PRINTF("Sucessfu
6000: 6c 6c 79 20 62 65 67 61 6e 20 74 72 61 6e 73 61 lly began transa
6010: 63 74 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28 25 ction on slot (%
6020: 73 29 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f s)", slot->pcsc_
6030: 72 65 61 64 65 72 29 3b 0a 0a 09 72 65 74 75 72 reader);...retur
6040: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f n(CACKEY_PCSC_S_
6050: 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 OK);.}../*. * SY
6060: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 NPOSIS. * ca
6070: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f ckey_ret cackey_
6080: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 end_transaction(
6090: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c struct cackey_sl
60a0: 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a ot *slot);. *. *
60b0: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 ARGUMENTS. *
60c0: 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 cackey_slot *s
60d0: 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 lot. * S
60e0: 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d lot to send comm
60f0: 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45 ands to. *. * RE
6100: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 TURN VALUE. *
6110: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f CACKEY_PCSC_S_
6120: 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 OK On su
6130: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 ccess. * CAC
6140: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 KEY_PCSC_E_GENER
6150: 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 IC On error.
6160: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 *. * NOTES. *
6170: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 This function
6180: 72 65 71 75 69 72 65 73 20 22 63 61 63 6b 65 79 requires "cackey
6190: 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 _begin_transacti
61a0: 6f 6e 22 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 on" to be called
61b0: 20 66 69 72 73 74 0a 20 2a 0a 20 2a 2f 0a 73 74 first. *. */.st
61c0: 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 atic cackey_ret
61d0: 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 cackey_end_trans
61e0: 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20 63 61 action(struct ca
61f0: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 ckey_slot *slot)
6200: 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 74 {..LONG scard_t
6210: 72 61 6e 73 5f 72 65 74 3b 0a 0a 09 43 41 43 4b rans_ret;...CACK
6220: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
6230: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 "Called.");...if
6240: 20 28 21 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 (!slot->pcsc_ca
6250: 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a rd_connected) {.
6260: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
6270: 52 49 4e 54 46 28 22 43 61 72 64 20 69 73 20 6e RINTF("Card is n
6280: 6f 74 20 63 6f 6e 6e 65 63 74 65 64 2c 20 75 6e ot connected, un
6290: 61 62 6c 65 20 74 6f 20 65 6e 64 20 74 72 61 6e able to end tran
62a0: 73 61 63 74 69 6f 6e 22 29 3b 0a 0a 09 09 72 65 saction");....re
62b0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 turn(CACKEY_PCSC
62c0: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a _E_GENERIC);..}.
62d0: 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e ..if (slot->tran
62e0: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 3d saction_depth ==
62f0: 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 0) {...CACKEY_D
6300: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 65 72 EBUG_PRINTF("Ter
6310: 6d 69 6e 61 74 69 6e 67 20 61 20 74 72 61 6e 73 minating a trans
6320: 61 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 action that has
6330: 6e 6f 74 20 62 65 67 75 6e 21 22 29 3b 0a 0a 09 not begun!");...
6340: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 .return(CACKEY_P
6350: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a CSC_E_GENERIC);.
6360: 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 .}...slot->trans
6370: 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a action_depth--;.
6380: 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e ..if (slot->tran
6390: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 saction_depth >
63a0: 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 0) {...CACKEY_DE
63b0: 42 55 47 5f 50 52 49 4e 54 46 28 22 54 72 61 6e BUG_PRINTF("Tran
63c0: 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 69 sactions still i
63d0: 6e 20 70 72 6f 67 72 65 73 73 2c 20 6e 6f 74 20 n progress, not
63e0: 74 65 72 6d 69 6e 61 74 69 6e 67 20 6f 6e 2d 63 terminating on-c
63f0: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 ard Transaction
6400: 28 63 75 72 72 65 6e 74 20 64 65 70 74 68 20 3d (current depth =
6410: 20 25 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72 61 %i)", slot->tra
6420: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 29 3b nsaction_depth);
6430: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 ....return(CACKE
6440: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 Y_PCSC_E_GENERIC
6450: 29 3b 0a 09 7d 0a 0a 09 73 63 61 72 64 5f 74 72 );..}...scard_tr
6460: 61 6e 73 5f 72 65 74 20 3d 20 53 43 61 72 64 45 ans_ret = SCardE
6470: 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c ndTransaction(sl
6480: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 ot->pcsc_card, S
6490: 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 CARD_LEAVE_CARD)
64a0: 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 74 72 61 ;..if (scard_tra
64b0: 6e 73 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f ns_ret != SCARD_
64c0: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43 S_SUCCESS) {...C
64d0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
64e0: 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 65 6e TF("Unable to en
64f0: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72 d transaction, r
6500: 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f eturning in erro
6510: 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 r");....return(C
6520: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e ACKEY_PCSC_E_GEN
6530: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b ERIC);..}...CACK
6540: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
6550: 22 53 75 63 65 73 73 66 75 6c 6c 79 20 74 65 72 "Sucessfully ter
6560: 6d 69 6e 61 74 65 64 20 74 72 61 6e 73 61 63 74 minated transact
6570: 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28 25 73 29 ion on slot (%s)
6580: 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 ", slot->pcsc_re
6590: 61 64 65 72 29 3b 0a 0a 09 72 65 74 75 72 6e 28 ader);...return(
65a0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b CACKEY_PCSC_S_OK
65b0: 29 3b 0a 7d 0a 0a 2f 2a 20 41 50 44 55 20 52 65 );.}../* APDU Re
65c0: 6c 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 73 20 lated Functions
65d0: 2a 2f 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 */./*. * SYNPOSI
65e0: 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f S. * cackey_
65f0: 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f ret cackey_send_
6600: 61 70 64 75 28 73 74 72 75 63 74 20 63 61 63 6b apdu(struct cack
6610: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 ey_slot *slot, u
6620: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6c 61 nsigned char cla
6630: 73 73 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 ss, unsigned cha
6640: 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 75 r instruction, u
6650: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 31 2c nsigned char p1,
6660: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 unsigned char p
6670: 32 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2, unsigned char
6680: 20 6c 63 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 lc, unsigned ch
6690: 61 72 20 2a 64 61 74 61 2c 20 75 6e 73 69 67 6e ar *data, unsign
66a0: 65 64 20 63 68 61 72 20 6c 65 2c 20 75 69 6e 74 ed char le, uint
66b0: 31 36 5f 74 20 2a 72 65 73 70 63 6f 64 65 2c 20 16_t *respcode,
66c0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 72 unsigned char *r
66d0: 65 73 70 64 61 74 61 2c 20 73 69 7a 65 5f 74 20 espdata, size_t
66e0: 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a *respdata_len);.
66f0: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a *. * ARGUMENTS.
6700: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c * cackey_sl
6710: 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 ot *slot. *
6720: 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 Slot to send
6730: 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a commands to. *.
6740: 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 * unsigned
6750: 63 68 61 72 20 63 6c 61 73 73 0a 20 2a 20 20 20 char class. *
6760: 20 20 20 20 20 20 41 50 44 55 20 43 6c 61 73 73 APDU Class
6770: 20 28 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 (GSCIS_CLASS_IS
6780: 4f 37 38 31 36 20 6f 72 20 47 53 43 49 53 5f 43 O7816 or GSCIS_C
6790: 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 LASS_GLOBAL_PLAT
67a0: 46 4f 52 4d 0a 20 2a 20 20 20 20 20 20 20 20 20 FORM. *
67b0: 75 73 75 61 6c 6c 79 29 2c 20 28 43 4c 41 29 0a usually), (CLA).
67c0: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e *. * unsign
67d0: 65 64 20 63 68 61 72 20 69 6e 73 74 72 75 63 74 ed char instruct
67e0: 69 6f 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 41 ion. * A
67f0: 50 44 55 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 PDU Instruction
6800: 28 49 4e 53 29 0a 20 2a 0a 20 2a 20 20 20 20 20 (INS). *. *
6810: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 31 unsigned char p1
6820: 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 . * APDU
6830: 20 50 61 72 61 6d 65 74 65 72 20 31 20 28 50 31 Parameter 1 (P1
6840: 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 ). *. * unsi
6850: 67 6e 65 64 20 63 68 61 72 20 70 32 0a 20 2a 20 gned char p2. *
6860: 20 20 20 20 20 20 20 20 41 50 44 55 20 50 61 72 APDU Par
6870: 61 6d 65 74 65 72 20 32 20 28 50 32 29 0a 20 2a ameter 2 (P2). *
6880: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 . * unsigned
6890: 20 63 68 61 72 20 6c 63 0a 20 2a 20 20 20 20 20 char lc. *
68a0: 20 20 20 20 41 50 44 55 20 4c 65 6e 67 74 68 20 APDU Length
68b0: 6f 66 20 43 6f 6e 74 65 6e 74 20 28 4c 63 29 20 of Content (Lc)
68c0: 2d 2d 20 74 68 69 73 20 69 73 20 74 68 65 20 6c -- this is the l
68d0: 65 6e 67 74 68 20 6f 66 20 22 64 61 74 61 22 0a ength of "data".
68e0: 20 2a 20 20 20 20 20 20 20 20 20 70 61 72 61 6d * param
68f0: 65 74 65 72 2e 20 20 49 66 20 22 64 61 74 61 22 eter. If "data"
6900: 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73 is specified as
6910: 20 4e 55 4c 4c 2c 20 74 68 69 73 20 70 61 72 61 NULL, this para
6920: 6d 65 74 65 72 20 77 69 6c 6c 0a 20 2a 20 20 20 meter will. *
6930: 20 20 20 20 20 20 62 65 20 69 67 6e 6f 72 65 64 be ignored
6940: 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 .. *. * unsi
6950: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 0a gned char *data.
6960: 20 2a 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74 * Point
6970: 65 72 20 74 6f 20 62 75 66 66 65 72 20 74 6f 20 er to buffer to
6980: 73 65 6e 64 2e 20 20 49 74 20 73 68 6f 75 6c 64 send. It should
6990: 20 62 65 20 22 4c 63 22 20 62 79 74 65 73 20 6c be "Lc" bytes l
69a0: 6f 6e 67 2e 20 20 49 66 0a 20 2a 20 20 20 20 20 ong. If. *
69b0: 20 20 20 20 73 70 65 63 69 66 69 65 64 20 61 73 specified as
69c0: 20 4e 55 4c 4c 2c 20 22 4c 63 22 20 77 69 6c 6c NULL, "Lc" will
69d0: 20 6e 6f 74 20 62 65 20 73 65 6e 74 2c 20 61 6e not be sent, an
69e0: 64 20 74 68 69 73 20 62 75 66 66 65 72 20 77 69 d this buffer wi
69f0: 6c 6c 20 62 65 0a 20 2a 20 20 20 20 20 20 20 20 ll be. *
6a00: 20 69 67 6e 6f 72 65 64 2e 0a 20 2a 0a 20 2a 20 ignored.. *. *
6a10: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 unsigned cha
6a20: 72 20 6c 65 0a 20 2a 20 20 20 20 20 20 20 20 20 r le. *
6a30: 41 50 44 55 20 4c 65 6e 67 74 68 20 6f 66 20 45 APDU Length of E
6a40: 78 70 65 63 74 61 74 69 6f 6e 20 28 4c 65 29 20 xpectation (Le)
6a50: 2d 2d 20 74 68 69 73 20 69 73 20 74 68 65 20 6c -- this is the l
6a60: 65 6e 67 74 68 20 6f 66 20 74 68 65 0a 20 2a 20 ength of the. *
6a70: 20 20 20 20 20 20 20 20 65 78 70 65 63 74 65 64 expected
6a80: 20 72 65 70 6c 79 2e 20 20 49 66 20 74 68 69 73 reply. If this
6a90: 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73 is specified as
6aa0: 20 30 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 0 then it will
6ab0: 6e 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 62 not. * b
6ac0: 65 20 73 65 6e 74 2e 0a 20 2a 0a 20 2a 20 20 20 e sent.. *. *
6ad0: 20 20 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 70 uint16_t *resp
6ae0: 63 6f 64 65 0a 20 2a 20 20 20 20 20 20 20 20 20 code. *
6af0: 5b 4f 55 54 5d 20 50 6f 69 6e 74 65 72 20 74 6f [OUT] Pointer to
6b00: 20 73 74 6f 72 61 67 65 20 6f 66 20 41 50 44 55 storage of APDU
6b10: 20 72 65 73 70 6f 6e 73 65 20 63 6f 64 65 2e 20 response code.
6b20: 20 49 66 20 74 68 69 73 20 69 73 0a 20 2a 20 20 If this is. *
6b30: 20 20 20 20 20 20 20 73 70 65 63 69 66 69 65 64 specified
6b40: 20 61 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 as NULL, the re
6b50: 73 70 6f 6e 73 65 20 63 6f 64 65 20 77 69 6c 6c sponse code will
6b60: 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20 be discarded..
6b70: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 *. * unsigne
6b80: 64 20 63 68 61 72 20 2a 72 65 73 70 64 61 74 61 d char *respdata
6b90: 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54 . * [OUT
6ba0: 5d 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74 6f ] Pointer to sto
6bb0: 72 61 67 65 20 6f 66 20 41 50 44 55 20 72 65 73 rage of APDU res
6bc0: 70 6f 6e 73 65 20 64 61 74 61 2e 20 20 49 66 20 ponse data. If
6bd0: 74 68 69 73 20 69 73 0a 20 2a 20 20 20 20 20 20 this is. *
6be0: 20 20 20 73 70 65 63 69 66 69 65 64 20 61 73 20 specified as
6bf0: 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 70 6f 6e NULL, the respon
6c00: 73 65 20 64 61 74 61 20 77 69 6c 6c 20 62 65 20 se data will be
6c10: 64 69 73 63 61 72 64 65 64 2e 20 20 49 66 0a 20 discarded. If.
6c20: 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 22 72 * the "r
6c30: 65 73 70 64 61 74 61 5f 6c 65 6e 22 20 70 61 72 espdata_len" par
6c40: 61 6d 65 74 65 72 20 69 73 20 73 70 65 63 69 66 ameter is specif
6c50: 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68 69 ied as NULL, thi
6c60: 73 20 62 75 66 66 65 72 0a 20 2a 20 20 20 20 20 s buffer. *
6c70: 20 20 20 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 will not be
6c80: 75 70 64 61 74 65 64 2e 0a 20 2a 0a 20 2a 20 20 updated.. *. *
6c90: 20 20 20 73 69 7a 65 5f 74 20 2a 72 65 73 70 64 size_t *respd
6ca0: 61 74 61 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20 ata_len. *
6cb0: 20 20 20 5b 49 4e 2c 20 4f 55 54 5d 20 50 6f 69 [IN, OUT] Poi
6cc0: 6e 74 65 72 20 69 6e 69 74 69 61 6c 69 6e 67 20 nter initialing
6cd0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 containing the s
6ce0: 69 7a 65 20 6f 66 20 74 68 65 20 22 72 65 73 70 ize of the "resp
6cf0: 64 61 74 61 22 0a 20 2a 20 20 20 20 20 20 20 20 data". *
6d00: 20 62 75 66 66 65 72 2e 20 20 42 65 66 6f 72 65 buffer. Before
6d10: 20 72 65 74 75 72 6e 69 6e 67 2c 20 74 68 65 20 returning, the
6d20: 70 6f 69 6e 74 65 64 20 74 6f 20 76 61 6c 75 65 pointed to value
6d30: 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 74 is updated to t
6d40: 68 65 0a 20 2a 20 20 20 20 20 20 20 20 20 6e 75 he. * nu
6d50: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 mber of bytes wr
6d60: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 62 75 66 itten to the buf
6d70: 66 65 72 2e 20 20 49 66 20 74 68 69 73 20 69 73 fer. If this is
6d80: 20 73 70 65 63 69 66 69 65 64 20 61 73 0a 20 2a specified as. *
6d90: 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 69 NULL, i
6da0: 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 t will not be up
6db0: 64 61 74 65 64 2c 20 61 6e 64 20 22 72 65 73 70 dated, and "resp
6dc0: 64 61 74 61 22 20 77 69 6c 6c 20 62 65 20 69 67 data" will be ig
6dd0: 6e 6f 72 65 64 20 63 61 75 73 69 6e 67 0a 20 2a nored causing. *
6de0: 20 20 20 20 20 20 20 20 20 74 68 65 20 72 65 73 the res
6df0: 70 6f 6e 73 65 20 64 61 74 61 20 74 6f 20 62 65 ponse data to be
6e00: 20 64 69 73 63 61 72 64 65 64 2e 0a 20 2a 0a 20 discarded.. *.
6e10: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 * RETURN VALUE.
6e20: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 * CACKEY_PCS
6e30: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f C_S_OK O
6e40: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 n success. *
6e50: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 CACKEY_PCSC_E_G
6e60: 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 ENERIC On err
6e70: 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 or. *. * NOTES.
6e80: 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 * This funct
6e90: 69 6f 6e 20 77 69 6c 6c 20 63 6f 6e 6e 65 63 74 ion will connect
6ea0: 20 74 6f 20 74 68 65 20 50 43 2f 53 43 20 43 6f to the PC/SC Co
6eb0: 6e 6e 65 63 74 69 6f 6e 20 4d 61 6e 61 67 65 72 nnection Manager
6ec0: 20 76 69 61 0a 20 2a 20 20 20 20 20 63 61 63 6b via. * cack
6ed0: 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 ey_pcsc_connect(
6ee0: 29 20 69 66 20 6e 65 65 64 65 64 2e 0a 20 2a 0a ) if needed.. *.
6ef0: 20 2a 20 20 20 20 20 49 74 20 77 69 6c 6c 20 63 * It will c
6f00: 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20 63 61 onnect to the ca
6f10: 72 64 20 69 6e 20 74 68 65 20 72 65 61 64 65 72 rd in the reader
6f20: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 attached to the
6f30: 20 73 6c 6f 74 0a 20 2a 20 20 20 20 20 73 70 65 slot. * spe
6f40: 63 69 66 69 65 64 2e 20 20 49 74 20 77 69 6c 6c cified. It will
6f50: 20 72 65 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68 reconnect to th
6f60: 65 20 63 61 72 64 20 69 66 20 74 68 65 20 63 6f e card if the co
6f70: 6e 6e 65 63 74 69 6f 6e 0a 20 2a 20 20 20 20 20 nnection. *
6f80: 67 6f 65 73 20 61 77 61 79 2e 0a 20 2a 0a 20 2a goes away.. *. *
6f90: 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f /.static cackey_
6fa0: 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f ret cackey_send_
6fb0: 61 70 64 75 28 73 74 72 75 63 74 20 63 61 63 6b apdu(struct cack
6fc0: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 ey_slot *slot, u
6fd0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6c 61 nsigned char cla
6fe0: 73 73 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 ss, unsigned cha
6ff0: 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 75 r instruction, u
7000: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 31 2c nsigned char p1,
7010: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 unsigned char p
7020: 32 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2, unsigned char
7030: 20 6c 63 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 lc, unsigned ch
7040: 61 72 20 2a 64 61 74 61 2c 20 75 6e 73 69 67 6e ar *data, unsign
7050: 65 64 20 63 68 61 72 20 6c 65 2c 20 75 69 6e 74 ed char le, uint
7060: 31 36 5f 74 20 2a 72 65 73 70 63 6f 64 65 2c 20 16_t *respcode,
7070: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 72 unsigned char *r
7080: 65 73 70 64 61 74 61 2c 20 73 69 7a 65 5f 74 20 espdata, size_t
7090: 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 20 7b *respdata_len) {
70a0: 0a 09 75 69 6e 74 38 5f 74 20 6d 61 6a 6f 72 5f ..uint8_t major_
70b0: 72 63 2c 20 6d 69 6e 6f 72 5f 72 63 3b 0a 09 73 rc, minor_rc;..s
70c0: 69 7a 65 5f 74 20 62 79 74 65 73 5f 74 6f 5f 63 ize_t bytes_to_c
70d0: 6f 70 79 2c 20 74 6d 70 5f 72 65 73 70 64 61 74 opy, tmp_respdat
70e0: 61 5f 6c 65 6e 3b 0a 09 44 57 4f 52 44 20 70 72 a_len;..DWORD pr
70f0: 6f 74 6f 63 6f 6c 3b 0a 09 44 57 4f 52 44 20 78 otocol;..DWORD x
7100: 6d 69 74 5f 6c 65 6e 2c 20 72 65 63 76 5f 6c 65 mit_len, recv_le
7110: 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 78 n;..LONG scard_x
7120: 6d 69 74 5f 72 65 74 2c 20 73 63 61 72 64 5f 72 mit_ret, scard_r
7130: 65 63 6f 6e 6e 5f 72 65 74 3b 0a 09 42 59 54 45 econn_ret;..BYTE
7140: 20 78 6d 69 74 5f 62 75 66 5b 31 30 32 34 5d 2c xmit_buf[1024],
7150: 20 72 65 63 76 5f 62 75 66 5b 31 30 32 34 5d 3b recv_buf[1024];
7160: 0a 09 69 6e 74 20 70 63 73 63 5f 63 6f 6e 6e 65 ..int pcsc_conne
7170: 63 74 5f 72 65 74 2c 20 70 63 73 63 5f 67 65 74 ct_ret, pcsc_get
7180: 72 65 73 70 5f 72 65 74 3b 0a 09 69 6e 74 20 69 resp_ret;..int i
7190: 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 dx;...CACKEY_DEB
71a0: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
71b0: 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c 6f d.");...if (!slo
71c0: 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 t) {...CACKEY_DE
71d0: 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 BUG_PRINTF("Inva
71e0: 6c 69 64 20 73 6c 6f 74 20 73 70 65 63 69 66 69 lid slot specifi
71f0: 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
7200: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 (CACKEY_PCSC_E_G
7210: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 70 63 ENERIC);..}...pc
7220: 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d sc_connect_ret =
7230: 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f cackey_connect_
7240: 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69 66 20 card(slot);..if
7250: 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 (pcsc_connect_re
7260: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 t != CACKEY_PCSC
7270: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 _S_OK) {...CACKE
7280: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
7290: 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 Unable to connec
72a0: 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72 t to card, retur
72b0: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 ning in failure"
72c0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 );....return(CAC
72d0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 KEY_PCSC_E_GENER
72e0: 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 72 61 IC);..}.../* Tra
72f0: 6e 73 6d 69 74 20 2a 2f 0a 09 78 6d 69 74 5f 6c nsmit */..xmit_l
7300: 65 6e 20 3d 20 30 3b 0a 09 78 6d 69 74 5f 62 75 en = 0;..xmit_bu
7310: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 f[xmit_len++] =
7320: 63 6c 61 73 73 3b 0a 09 78 6d 69 74 5f 62 75 66 class;..xmit_buf
7330: 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 69 [xmit_len++] = i
7340: 6e 73 74 72 75 63 74 69 6f 6e 3b 0a 09 78 6d 69 nstruction;..xmi
7350: 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b t_buf[xmit_len++
7360: 5d 20 3d 20 70 31 3b 0a 09 78 6d 69 74 5f 62 75 ] = p1;..xmit_bu
7370: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 f[xmit_len++] =
7380: 70 32 3b 0a 09 69 66 20 28 64 61 74 61 29 20 7b p2;..if (data) {
7390: 0a 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 ...xmit_buf[xmit
73a0: 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 63 3b 0a 09 09 _len++] = lc;...
73b0: 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 for (idx = 0; id
73c0: 78 20 3c 20 6c 63 3b 20 69 64 78 2b 2b 29 20 7b x < lc; idx++) {
73d0: 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 ....xmit_buf[xmi
73e0: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 64 61 74 61 5b t_len++] = data[
73f0: 69 64 78 5d 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 idx];...}..}...i
7400: 66 20 28 6c 65 20 21 3d 20 30 78 30 30 29 20 7b f (le != 0x00) {
7410: 0a 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 ...xmit_buf[xmit
7420: 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 65 3b 0a 09 7d _len++] = le;..}
7430: 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 53 6d 61 72 .../* Begin Smar
7440: 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f tcard Transactio
7450: 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 62 65 67 n */..cackey_beg
7460: 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 in_transaction(s
7470: 6c 6f 74 29 3b 0a 0a 09 69 66 20 28 63 6c 61 73 lot);...if (clas
7480: 73 20 3d 3d 20 47 53 43 49 53 5f 43 4c 41 53 53 s == GSCIS_CLASS
7490: 5f 49 53 4f 37 38 31 36 20 26 26 20 69 6e 73 74 _ISO7816 && inst
74a0: 72 75 63 74 69 6f 6e 20 3d 3d 20 47 53 43 49 53 ruction == GSCIS
74b0: 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 20 26 26 _INSTR_VERIFY &&
74c0: 20 70 31 20 3d 3d 20 30 78 30 30 20 26 26 20 70 p1 == 0x00 && p
74d0: 32 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 43 2 == 0x00) {...C
74e0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
74f0: 54 46 28 22 53 65 6e 64 69 6e 67 20 41 50 44 55 TF("Sending APDU
7500: 3a 20 3c 3c 63 65 6e 73 6f 72 65 64 3e 3e 22 29 : <<censored>>")
7510: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 ;..} else {...CA
7520: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
7530: 42 55 46 28 22 53 65 6e 64 69 6e 67 20 41 50 44 BUF("Sending APD
7540: 55 3a 22 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78 U:", xmit_buf, x
7550: 6d 69 74 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 72 mit_len);..}...r
7560: 65 63 76 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 ecv_len = sizeof
7570: 28 72 65 63 76 5f 62 75 66 29 3b 0a 09 73 63 61 (recv_buf);..sca
7580: 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 20 53 43 rd_xmit_ret = SC
7590: 61 72 64 54 72 61 6e 73 6d 69 74 28 73 6c 6f 74 ardTransmit(slot
75a0: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 ->pcsc_card, SCA
75b0: 52 44 5f 50 43 49 5f 54 30 2c 20 78 6d 69 74 5f RD_PCI_T0, xmit_
75c0: 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20 53 buf, xmit_len, S
75d0: 43 41 52 44 5f 50 43 49 5f 54 31 2c 20 72 65 63 CARD_PCI_T1, rec
75e0: 76 5f 62 75 66 2c 20 26 72 65 63 76 5f 6c 65 6e v_buf, &recv_len
75f0: 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 78 6d );..if (scard_xm
7600: 69 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f it_ret != SCARD_
7610: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43 S_SUCCESS) {...C
7620: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
7630: 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65 TF("Failed to se
7640: 6e 64 20 41 50 44 55 20 74 6f 20 63 61 72 64 20 nd APDU to card
7650: 28 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28 29 (SCardTransmit()
7660: 20 3d 20 25 73 2f 25 6c 78 29 22 2c 20 43 41 43 = %s/%lx)", CAC
7670: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 KEY_DEBUG_FUNC_S
7680: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 CARDERR_TO_STR(s
7690: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20 card_xmit_ret),
76a0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
76b0: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b scard_xmit_ret);
76c0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
76d0: 50 52 49 4e 54 46 28 22 4d 61 72 6b 69 6e 67 20 PRINTF("Marking
76e0: 73 6c 6f 74 20 61 73 20 68 61 76 69 6e 67 20 62 slot as having b
76f0: 65 65 6e 20 72 65 73 65 74 22 29 3b 0a 0a 09 09 een reset");....
7700: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f slot->transactio
7710: 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 09 73 n_depth = 0;...s
7720: 6c 6f 74 2d 3e 73 6c 6f 74 5f 72 65 73 65 74 20 lot->slot_reset
7730: 3d 20 31 3b 0a 0a 09 09 69 66 20 28 73 63 61 72 = 1;....if (scar
7740: 64 5f 78 6d 69 74 5f 72 65 74 20 3d 3d 20 53 43 d_xmit_ret == SC
7750: 41 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 ARD_W_RESET_CARD
7760: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 ) {....CACKEY_DE
7770: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65 BUG_PRINTF("Rese
7780: 74 20 72 65 71 75 69 72 65 64 2c 20 70 6c 65 61 t required, plea
7790: 73 65 20 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 se hold...");...
77a0: 09 09 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 ..scard_reconn_r
77b0: 65 74 20 3d 20 53 43 61 72 64 52 65 63 6f 6e 6e et = SCardReconn
77c0: 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 ect(slot->pcsc_c
77d0: 61 72 64 2c 20 53 43 41 52 44 5f 53 48 41 52 45 ard, SCARD_SHARE
77e0: 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 _SHARED, SCARD_P
77f0: 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20 53 43 41 52 ROTOCOL_T0, SCAR
7800: 44 5f 52 45 53 45 54 5f 43 41 52 44 2c 20 26 70 D_RESET_CARD, &p
7810: 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09 69 66 20 rotocol);....if
7820: 28 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 (scard_reconn_re
7830: 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 t == SCARD_S_SUC
7840: 43 45 53 53 29 20 7b 0a 09 09 09 09 2f 2a 20 52 CESS) {...../* R
7850: 65 2d 65 73 74 61 62 6c 69 73 68 20 74 72 61 6e e-establish tran
7860: 73 61 63 74 69 6f 6e 2c 20 69 66 20 69 74 20 77 saction, if it w
7870: 61 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 09 09 as present */...
7880: 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e ..if (slot->tran
7890: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 saction_depth >
78a0: 30 29 20 7b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 0) {......slot->
78b0: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 transaction_dept
78c0: 68 2d 2d 3b 0a 09 09 09 09 09 63 61 63 6b 65 79 h--;......cackey
78d0: 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 _begin_transacti
78e0: 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09 09 09 7d 0a on(slot);.....}.
78f0: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
7900: 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 G_PRINTF("Reset
7910: 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 72 successful, retr
7920: 61 6e 73 6d 69 74 74 69 6e 67 22 29 3b 0a 0a 09 ansmitting");...
7930: 09 09 09 72 65 63 76 5f 6c 65 6e 20 3d 20 73 69 ...recv_len = si
7940: 7a 65 6f 66 28 72 65 63 76 5f 62 75 66 29 3b 0a zeof(recv_buf);.
7950: 09 09 09 09 73 63 61 72 64 5f 78 6d 69 74 5f 72 ....scard_xmit_r
7960: 65 74 20 3d 20 53 43 61 72 64 54 72 61 6e 73 6d et = SCardTransm
7970: 69 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 it(slot->pcsc_ca
7980: 72 64 2c 20 53 43 41 52 44 5f 50 43 49 5f 54 30 rd, SCARD_PCI_T0
7990: 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69 74 , xmit_buf, xmit
79a0: 5f 6c 65 6e 2c 20 53 43 41 52 44 5f 50 43 49 5f _len, SCARD_PCI_
79b0: 54 30 2c 20 72 65 63 76 5f 62 75 66 2c 20 26 72 T0, recv_buf, &r
79c0: 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 69 ecv_len);......i
79d0: 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 f (scard_xmit_re
79e0: 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 t != SCARD_S_SUC
79f0: 43 45 53 53 29 20 7b 0a 09 09 09 09 09 43 41 43 CESS) {......CAC
7a00: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
7a10: 28 22 52 65 74 72 61 6e 73 6d 69 74 20 66 61 69 ("Retransmit fai
7a20: 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 led, returning i
7a30: 6e 20 66 61 69 6c 75 72 65 20 61 66 74 65 72 20 n failure after
7a40: 64 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20 74 68 disconnecting th
7a50: 65 20 63 61 72 64 20 28 53 43 61 72 64 54 72 61 e card (SCardTra
7a60: 6e 73 6d 69 74 20 3d 20 25 73 2f 25 6c 69 29 22 nsmit = %s/%li)"
7a70: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 , CACKEY_DEBUG_F
7a80: 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f UNC_SCARDERR_TO_
7a90: 53 54 52 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 STR(scard_xmit_r
7aa0: 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 et), (long) scar
7ab0: 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a 09 09 d_xmit_ret);....
7ac0: 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 ...SCardDisconne
7ad0: 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 ct(slot->pcsc_ca
7ae0: 72 64 2c 20 53 43 41 52 44 5f 52 45 53 45 54 5f rd, SCARD_RESET_
7af0: 43 41 52 44 29 3b 0a 09 09 09 09 09 73 6c 6f 74 CARD);......slot
7b00: 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e ->pcsc_card_conn
7b10: 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09 09 ected = 0;......
7b20: 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 ./* End Smartcar
7b30: 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f d Transaction */
7b40: 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e ......slot->tran
7b50: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 saction_depth =
7b60: 31 3b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 65 1;......cackey_e
7b70: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 nd_transaction(s
7b80: 6c 6f 74 29 3b 0a 0a 09 09 09 09 09 72 65 74 75 lot);.......retu
7b90: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 rn(CACKEY_PCSC_E
7ba0: 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 _TOKENABSENT);..
7bb0: 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 7b ...}....} else {
7bc0: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
7bd0: 47 5f 50 52 49 4e 54 46 28 22 44 69 73 63 6f 6e G_PRINTF("Discon
7be0: 6e 65 63 74 69 6e 67 20 63 61 72 64 22 29 3b 0a necting card");.
7bf0: 0a 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 73 6c 6f T_CARD);.....slo
7c30: 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e t->pcsc_card_con
7c40: 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09 nected = 0;.....
7c50: 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 ./* End Smartcar
7c60: 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f d Transaction */
7c70: 0a 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 .....slot->trans
7c80: 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31 action_depth = 1
7c90: 3b 0a 09 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 ;.....cackey_end
7ca0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f _transaction(slo
7cb0: 74 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f t);......CACKEY_
7cc0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
7cd0: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 turning in failu
7ce0: 72 65 22 29 3b 0a 09 09 09 09 72 65 74 75 72 6e re");.....return
7cf0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 (CACKEY_PCSC_E_T
7d00: 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 OKENABSENT);....
7d10: 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 }...} else {....
7d20: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
7d30: 4e 54 46 28 22 44 69 73 63 6f 6e 6e 65 63 74 69 NTF("Disconnecti
7d40: 6e 67 20 63 61 72 64 22 29 3b 0a 0a 09 09 09 53 ng card");.....S
7d50: 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 73 CardDisconnect(s
7d60: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 lot->pcsc_card,
7d70: 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52 44 SCARD_RESET_CARD
7d80: 29 3b 0a 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63 );....slot->pcsc
7d90: 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 _card_connected
7da0: 3d 20 30 3b 0a 0a 09 09 09 2f 2a 20 45 6e 64 20 = 0;...../* End
7db0: 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 Smartcard Transa
7dc0: 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 73 6c 6f 74 ction */....slot
7dd0: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 ->transaction_de
7de0: 70 74 68 20 3d 20 31 3b 0a 09 09 09 63 61 63 6b pth = 1;....cack
7df0: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 ey_end_transacti
7e00: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 43 41 on(slot);.....CA
7e10: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
7e20: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 F("Returning in
7e30: 66 61 69 6c 75 72 65 22 29 3b 0a 09 09 09 72 65 failure");....re
7e40: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 turn(CACKEY_PCSC
7e50: 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b _E_TOKENABSENT);
7e60: 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 ...}..}...CACKEY
7e70: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 _DEBUG_PRINTBUF(
7e80: 22 52 65 74 75 72 6e 65 64 20 56 61 6c 75 65 3a "Returned Value:
7e90: 22 2c 20 72 65 63 76 5f 62 75 66 2c 20 72 65 63 ", recv_buf, rec
7ea0: 76 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 72 65 v_len);...if (re
7eb0: 63 76 5f 6c 65 6e 20 3c 20 32 29 20 7b 0a 09 09 cv_len < 2) {...
7ec0: 2f 2a 20 4d 69 6e 69 6d 61 6c 20 72 65 73 70 6f /* Minimal respo
7ed0: 6e 73 65 20 6c 65 6e 67 74 68 20 69 73 20 32 20 nse length is 2
7ee0: 62 79 74 65 73 2c 20 72 65 74 75 72 6e 69 6e 67 bytes, returning
7ef0: 20 69 6e 20 66 61 69 6c 75 72 65 20 2a 2f 0a 09 in failure */..
7f00: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
7f10: 49 4e 54 46 28 22 52 65 73 70 6f 6e 73 65 20 74 INTF("Response t
7f20: 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65 74 75 72 6e oo small, return
7f30: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20 28 ing in failure (
7f40: 72 65 63 76 5f 6c 65 6e 20 3d 20 25 6c 75 29 22 recv_len = %lu)"
7f50: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
7f60: 29 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 09 ) recv_len);....
7f70: 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 /* End Smartcard
7f80: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a Transaction */.
7f90: 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 ..cackey_end_tra
7fa0: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a nsaction(slot);.
7fb0: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 ...return(CACKEY
7fc0: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 _PCSC_E_GENERIC)
7fd0: 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d ;..}.../* Determ
7fe0: 69 6e 65 20 72 65 73 75 6c 74 20 63 6f 64 65 20 ine result code
7ff0: 2a 2f 0a 09 6d 61 6a 6f 72 5f 72 63 20 3d 20 72 */..major_rc = r
8000: 65 63 76 5f 62 75 66 5b 72 65 63 76 5f 6c 65 6e ecv_buf[recv_len
8010: 20 2d 20 32 5d 3b 0a 09 6d 69 6e 6f 72 5f 72 63 - 2];..minor_rc
8020: 20 3d 20 72 65 63 76 5f 62 75 66 5b 72 65 63 76 = recv_buf[recv
8030: 5f 6c 65 6e 20 2d 20 31 5d 3b 0a 09 69 66 20 28 _len - 1];..if (
8040: 72 65 73 70 63 6f 64 65 29 20 7b 0a 09 09 2a 72 respcode) {...*r
8050: 65 73 70 63 6f 64 65 20 3d 20 28 6d 61 6a 6f 72 espcode = (major
8060: 5f 72 63 20 3c 3c 20 38 29 20 7c 20 6d 69 6e 6f _rc << 8) | mino
8070: 72 5f 72 63 3b 0a 09 7d 0a 0a 09 2f 2a 20 41 64 r_rc;..}.../* Ad
8080: 6a 75 73 74 20 6d 65 73 73 61 67 65 20 62 75 66 just message buf
8090: 66 65 72 20 2a 2f 0a 09 72 65 63 76 5f 6c 65 6e fer */..recv_len
80a0: 20 2d 3d 20 32 3b 0a 0a 09 2f 2a 20 41 64 64 20 -= 2;.../* Add
80b0: 62 79 74 65 73 20 74 6f 20 72 65 74 75 72 6e 20 bytes to return
80c0: 76 61 6c 75 65 20 2a 2f 0a 09 74 6d 70 5f 72 65 value */..tmp_re
80d0: 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20 30 3b 0a spdata_len = 0;.
80e0: 09 69 66 20 28 72 65 73 70 64 61 74 61 20 26 26 .if (respdata &&
80f0: 20 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 20 7b respdata_len) {
8100: 0a 09 09 74 6d 70 5f 72 65 73 70 64 61 74 61 5f ...tmp_respdata_
8110: 6c 65 6e 20 3d 20 2a 72 65 73 70 64 61 74 61 5f len = *respdata_
8120: 6c 65 6e 3b 0a 0a 09 09 62 79 74 65 73 5f 74 6f len;....bytes_to
8130: 5f 63 6f 70 79 20 3d 20 2a 72 65 73 70 64 61 74 _copy = *respdat
8140: 61 5f 6c 65 6e 3b 0a 0a 09 09 69 66 20 28 72 65 a_len;....if (re
8150: 63 76 5f 6c 65 6e 20 3c 20 62 79 74 65 73 5f 74 cv_len < bytes_t
8160: 6f 5f 63 6f 70 79 29 20 7b 0a 09 09 09 62 79 74 o_copy) {....byt
8170: 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 72 65 63 es_to_copy = rec
8180: 76 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09 43 41 v_len;...}....CA
8190: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
81a0: 46 28 22 43 6f 70 79 69 6e 67 20 25 6c 75 20 62 F("Copying %lu b
81b0: 79 74 65 73 20 74 6f 20 74 68 65 20 62 75 66 66 ytes to the buff
81c0: 65 72 20 28 72 65 63 76 27 64 20 25 6c 75 20 62 er (recv'd %lu b
81d0: 79 74 65 73 2c 20 62 75 74 20 6f 6e 6c 79 20 25 ytes, but only %
81e0: 6c 75 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e lu bytes left in
81f0: 20 6f 75 72 20 62 75 66 66 65 72 29 22 2c 20 28 our buffer)", (
8200: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62 unsigned long) b
8210: 79 74 65 73 5f 74 6f 5f 63 6f 70 79 2c 20 28 75 ytes_to_copy, (u
8220: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65 nsigned long) re
8230: 63 76 5f 6c 65 6e 2c 20 28 75 6e 73 69 67 6e 65 cv_len, (unsigne
8240: 64 20 6c 6f 6e 67 29 20 2a 72 65 73 70 64 61 74 d long) *respdat
8250: 61 5f 6c 65 6e 29 3b 0a 0a 09 09 6d 65 6d 63 70 a_len);....memcp
8260: 79 28 72 65 73 70 64 61 74 61 2c 20 72 65 63 76 y(respdata, recv
8270: 5f 62 75 66 2c 20 62 79 74 65 73 5f 74 6f 5f 63 _buf, bytes_to_c
8280: 6f 70 79 29 3b 0a 09 09 72 65 73 70 64 61 74 61 opy);...respdata
8290: 20 2b 3d 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 += bytes_to_cop
82a0: 79 3b 0a 0a 09 09 2a 72 65 73 70 64 61 74 61 5f y;....*respdata_
82b0: 6c 65 6e 20 3d 20 62 79 74 65 73 5f 74 6f 5f 63 len = bytes_to_c
82c0: 6f 70 79 3b 0a 09 09 74 6d 70 5f 72 65 73 70 64 opy;...tmp_respd
82d0: 61 74 61 5f 6c 65 6e 20 2d 3d 20 62 79 74 65 73 ata_len -= bytes
82e0: 5f 74 6f 5f 63 6f 70 79 3b 0a 09 7d 20 65 6c 73 _to_copy;..} els
82f0: 65 20 7b 0a 09 09 69 66 20 28 72 65 63 76 5f 6c e {...if (recv_l
8300: 65 6e 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 en != 0) {....CA
8310: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
8320: 46 28 22 54 68 72 6f 77 69 6e 67 20 61 77 61 79 F("Throwing away
8330: 20 25 6c 75 20 62 79 74 65 73 2c 20 6e 6f 77 68 %lu bytes, nowh
8340: 65 72 65 20 74 6f 20 70 75 74 20 74 68 65 6d 21 ere to put them!
8350: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e ", (unsigned lon
8360: 67 29 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 09 09 g) recv_len);...
8370: 7d 0a 09 7d 0a 0a 09 69 66 20 28 6d 61 6a 6f 72 }..}...if (major
8380: 5f 72 63 20 3d 3d 20 30 78 36 31 29 20 7b 0a 09 _rc == 0x61) {..
8390: 09 2f 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 52 ./* We need to R
83a0: 45 41 44 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f EAD */...CACKEY_
83b0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 42 75 DEBUG_PRINTF("Bu
83c0: 66 66 65 72 20 72 65 61 64 20 72 65 71 75 69 72 ffer read requir
83d0: 65 64 22 29 3b 0a 0a 09 09 69 66 20 28 6d 69 6e ed");....if (min
83e0: 6f 72 5f 72 63 20 3d 3d 20 30 78 30 30 29 20 7b or_rc == 0x00) {
83f0: 0a 09 09 09 6d 69 6e 6f 72 5f 72 63 20 3d 20 43 ....minor_rc = C
8400: 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 3b 0a ACKEY_APDU_MTU;.
8410: 09 09 7d 0a 0a 09 09 70 63 73 63 5f 67 65 74 72 ..}....pcsc_getr
8420: 65 73 70 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 esp_ret = cackey
8430: 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c _send_apdu(slot,
8440: 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f GSCIS_CLASS_ISO
8450: 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 54 7816, GSCIS_INST
8460: 52 5f 47 45 54 5f 52 45 53 50 4f 4e 53 45 2c 20 R_GET_RESPONSE,
8470: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 2c 20 4e 0x00, 0x00, 0, N
8480: 55 4c 4c 2c 20 6d 69 6e 6f 72 5f 72 63 2c 20 72 ULL, minor_rc, r
8490: 65 73 70 63 6f 64 65 2c 20 72 65 73 70 64 61 74 espcode, respdat
84a0: 61 2c 20 26 74 6d 70 5f 72 65 73 70 64 61 74 61 a, &tmp_respdata
84b0: 5f 6c 65 6e 29 3b 0a 09 09 69 66 20 28 70 63 73 _len);...if (pcs
84c0: 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20 21 3d c_getresp_ret !=
84d0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f CACKEY_PCSC_S_O
84e0: 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 K) {....CACKEY_D
84f0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 42 75 66 EBUG_PRINTF("Buf
8500: 66 65 72 20 72 65 61 64 20 66 61 69 6c 65 64 21 fer read failed!
8510: 20 20 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 Returning in f
8520: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 2f 2a ailure");...../*
8530: 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 End Smartcard T
8540: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 ransaction */...
8550: 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e .cackey_end_tran
8560: 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a saction(slot);..
8570: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 ...return(CACKEY
8580: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 _PCSC_E_GENERIC)
8590: 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72 65 73 ;...}....if (res
85a0: 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 09 09 pdata_len) {....
85b0: 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 2b 3d *respdata_len +=
85c0: 20 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 tmp_respdata_le
85d0: 6e 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 45 6e 64 n;...}..../* End
85e0: 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 Smartcard Trans
85f0: 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b action */...cack
8600: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 ey_end_transacti
8610: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 43 41 43 on(slot);....CAC
8620: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
8630: 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 ("Returning in s
8640: 75 63 63 65 73 73 20 28 62 75 66 66 65 72 20 72 uccess (buffer r
8650: 65 61 64 20 63 6f 6d 70 6c 65 74 65 29 22 29 3b ead complete)");
8660: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 ...return(CACKEY
8670: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a _PCSC_S_OK);..}.
8680: 0a 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 ../* End Smartca
8690: 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a rd Transaction *
86a0: 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 /..cackey_end_tr
86b0: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b ansaction(slot);
86c0: 0a 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 72 63 20 ...if (major_rc
86d0: 3d 3d 20 30 78 39 30 29 20 7b 0a 09 09 2f 2a 20 == 0x90) {.../*
86e0: 53 75 63 63 65 73 73 20 2a 2f 0a 09 09 43 41 43 Success */...CAC
86f0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
8700: 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 ("Returning in s
8710: 75 63 63 65 73 73 20 28 6d 61 6a 6f 72 5f 72 63 uccess (major_rc
8720: 20 3d 20 30 78 39 30 29 22 29 3b 0a 0a 09 09 72 = 0x90)");....r
8730: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 eturn(CACKEY_PCS
8740: 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 0a 09 43 C_S_OK);..}....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 41 50 44 55 20 52 65 74 75 72 6e 65 TF("APDU Returne
8770: 64 20 61 6e 20 65 72 72 6f 72 2c 20 72 65 74 75 d an error, retu
8780: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 rning in failure
8790: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 ");...return(CAC
87a0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 KEY_PCSC_E_GENER
87b0: 49 43 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 IC);.}../*. * SY
87c0: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 73 73 NPOSIS. * ss
87d0: 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 72 65 61 ize_t cackey_rea
87e0: 64 5f 62 75 66 66 65 72 28 73 74 72 75 63 74 20 d_buffer(struct
87f0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f cackey_slot *slo
8800: 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 t, unsigned char
8810: 20 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 *buffer, size_t
8820: 20 63 6f 75 6e 74 2c 20 75 6e 73 69 67 6e 65 64 count, unsigned
8830: 20 63 68 61 72 20 74 5f 6f 72 5f 76 2c 20 73 69 char t_or_v, si
8840: 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66 ze_t initial_off
8850: 73 65 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 set);. *. * ARGU
8860: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72 MENTS. * str
8870: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 uct cackey_slot
8880: 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 *slot. *
8890: 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f Slot to send co
88a0: 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 mmands to. *. *
88b0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 unsigned cha
88c0: 72 20 2a 62 75 66 66 65 72 0a 20 2a 20 20 20 20 r *buffer. *
88d0: 20 20 20 20 20 5b 4f 55 54 5d 20 42 75 66 66 65 [OUT] Buffe
88e0: 72 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 r. *. * size
88f0: 5f 74 20 63 6f 75 6e 74 0a 20 2a 20 20 20 20 20 _t count. *
8900: 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 Number of by
8910: 74 65 73 20 74 6f 20 61 74 74 65 6d 70 74 20 74 tes to attempt t
8920: 6f 20 72 65 61 64 0a 20 2a 0a 20 2a 20 20 20 20 o read. *. *
8930: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 unsigned char t
8940: 5f 6f 72 5f 76 0a 20 2a 20 20 20 20 20 20 20 20 _or_v. *
8950: 20 53 65 6c 65 63 74 20 74 68 65 20 54 2d 62 75 Select the T-bu
8960: 66 66 65 72 20 28 30 31 29 20 6f 72 20 56 2d 62 ffer (01) or V-b
8970: 75 66 66 65 72 20 28 30 32 29 20 74 6f 20 72 65 uffer (02) to re
8980: 61 64 20 66 72 6f 6d 2e 20 20 0a 20 2a 0a 20 2a ad from. . *. *
8990: 20 20 20 20 20 73 69 7a 65 5f 74 20 69 6e 69 74 size_t init
89a0: 69 61 6c 5f 6f 66 66 73 65 74 0a 20 2a 20 20 20 ial_offset. *
89b0: 20 20 20 20 20 20 53 70 65 63 69 66 79 20 74 68 Specify th
89c0: 65 20 6f 66 66 73 65 74 20 74 6f 20 62 65 67 69 e offset to begi
89d0: 6e 20 74 68 65 20 72 65 61 64 20 66 72 6f 6d 0a n the read from.
89e0: 20 2a 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 *. *. * RETURN
89f0: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 54 68 69 VALUE. * Thi
8a00: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 s function retur
8a10: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 ns the number of
8a20: 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 bytes actually
8a30: 72 65 61 64 2c 20 6f 72 20 2d 31 20 6f 6e 20 65 read, or -1 on e
8a40: 72 72 6f 72 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 rror.. *. * NOTE
8a50: 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a S. * None. *
8a60: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a . */.static ssiz
8a70: 65 5f 74 20 63 61 63 6b 65 79 5f 72 65 61 64 5f e_t cackey_read_
8a80: 62 75 66 66 65 72 28 73 74 72 75 63 74 20 63 61 buffer(struct ca
8a90: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c ckey_slot *slot,
8aa0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
8ab0: 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 63 buffer, size_t c
8ac0: 6f 75 6e 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 ount, unsigned c
8ad0: 68 61 72 20 74 5f 6f 72 5f 76 2c 20 73 69 7a 65 har t_or_v, size
8ae0: 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 _t initial_offse
8af0: 74 29 20 7b 0a 09 73 69 7a 65 5f 74 20 6f 66 66 t) {..size_t off
8b00: 73 65 74 20 3d 20 30 2c 20 6d 61 78 5f 6f 66 66 set = 0, max_off
8b10: 73 65 74 2c 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a set, max_count;.
8b20: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 .unsigned char c
8b30: 6d 64 5b 32 5d 3b 0a 09 75 69 6e 74 31 36 5f 74 md[2];..uint16_t
8b40: 20 72 65 73 70 63 6f 64 65 3b 0a 09 69 6e 74 20 respcode;..int
8b50: 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b send_ret;...CACK
8b60: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
8b70: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 6d 61 "Called.");...ma
8b80: 78 5f 6f 66 66 73 65 74 20 3d 20 63 6f 75 6e 74 x_offset = count
8b90: 3b 0a 09 6d 61 78 5f 63 6f 75 6e 74 20 3d 20 43 ;..max_count = C
8ba0: 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 3b 0a ACKEY_APDU_MTU;.
8bb0: 0a 09 69 66 20 28 74 5f 6f 72 5f 76 20 21 3d 20 ..if (t_or_v !=
8bc0: 31 20 26 26 20 74 5f 6f 72 5f 76 20 21 3d 20 32 1 && t_or_v != 2
8bd0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
8be0: 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c UG_PRINTF("Inval
8bf0: 69 64 20 54 20 6f 72 20 56 20 70 61 72 61 6d 65 id T or V parame
8c00: 74 65 72 20 73 70 65 63 69 66 69 65 64 2c 20 72 ter specified, r
8c10: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c eturning in fail
8c20: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ure");....return
8c30: 28 2d 31 29 3b 0a 09 7d 0a 0a 09 63 6d 64 5b 30 (-1);..}...cmd[0
8c40: 5d 20 3d 20 74 5f 6f 72 5f 76 3b 0a 0a 09 77 68 ] = t_or_v;...wh
8c50: 69 6c 65 20 28 31 29 20 7b 0a 09 09 69 66 20 28 ile (1) {...if (
8c60: 6f 66 66 73 65 74 20 3e 3d 20 6d 61 78 5f 6f 66 offset >= max_of
8c70: 66 73 65 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 fset) {....CACKE
8c80: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
8c90: 42 75 66 66 65 72 20 74 6f 6f 20 73 6d 61 6c 6c Buffer too small
8ca0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 77 68 61 74 , returning what
8cb0: 20 77 65 20 67 6f 74 2e 2e 2e 22 29 3b 0a 0a 09 we got...");...
8cc0: 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 ..break;...}....
8cd0: 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 6f 66 66 73 count = max_offs
8ce0: 65 74 20 2d 20 6f 66 66 73 65 74 3b 0a 09 09 69 et - offset;...i
8cf0: 66 20 28 63 6f 75 6e 74 20 3e 20 6d 61 78 5f 63 f (count > max_c
8d00: 6f 75 6e 74 29 20 7b 0a 09 09 09 63 6f 75 6e 74 ount) {....count
8d10: 20 3d 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09 09 = max_count;...
8d20: 7d 0a 0a 09 09 63 6d 64 5b 31 5d 20 3d 20 63 6f }....cmd[1] = co
8d30: 75 6e 74 3b 0a 0a 09 09 73 65 6e 64 5f 72 65 74 unt;....send_ret
8d40: 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 = cackey_send_a
8d50: 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f pdu(slot, GSCIS_
8d60: 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 CLASS_GLOBAL_PLA
8d70: 54 46 4f 52 4d 2c 20 47 53 43 49 53 5f 49 4e 53 TFORM, GSCIS_INS
8d80: 54 52 5f 52 45 41 44 5f 42 55 46 46 45 52 2c 20 TR_READ_BUFFER,
8d90: 28 28 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 ((initial_offset
8da0: 20 2b 20 6f 66 66 73 65 74 29 20 3e 3e 20 38 29 + offset) >> 8)
8db0: 20 26 20 30 78 66 66 2c 20 28 69 6e 69 74 69 61 & 0xff, (initia
8dc0: 6c 5f 6f 66 66 73 65 74 20 2b 20 6f 66 66 73 65 l_offset + offse
8dd0: 74 29 20 26 20 30 78 66 66 2c 20 73 69 7a 65 6f t) & 0xff, sizeo
8de0: 66 28 63 6d 64 29 2c 20 63 6d 64 2c 20 30 78 30 f(cmd), cmd, 0x0
8df0: 30 2c 20 26 72 65 73 70 63 6f 64 65 2c 20 62 75 0, &respcode, bu
8e00: 66 66 65 72 20 2b 20 6f 66 66 73 65 74 2c 20 26 ffer + offset, &
8e10: 63 6f 75 6e 74 29 3b 0a 09 09 69 66 20 28 73 65 count);...if (se
8e20: 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 nd_ret != CACKEY
8e30: 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 _PCSC_S_OK) {...
8e40: 09 69 66 20 28 72 65 73 70 63 6f 64 65 20 3d 3d .if (respcode ==
8e50: 20 30 78 36 41 38 36 29 20 7b 0a 09 09 09 09 69 0x6A86) {.....i
8e60: 66 20 28 6d 61 78 5f 63 6f 75 6e 74 20 3d 3d 20 f (max_count ==
8e70: 31 29 20 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b 1) {......break;
8e80: 0a 09 09 09 09 7d 0a 0a 09 09 09 09 6d 61 78 5f .....}......max_
8e90: 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 63 6f 75 6e count = max_coun
8ea0: 74 20 2f 20 32 3b 0a 0a 09 09 09 09 63 6f 6e 74 t / 2;......cont
8eb0: 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 inue;....}.....C
8ec0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
8ed0: 54 46 28 22 63 61 63 6b 65 79 5f 73 65 6e 64 5f TF("cackey_send_
8ee0: 61 70 64 75 28 29 20 66 61 69 6c 65 64 2c 20 72 apdu() failed, r
8ef0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c eturning in fail
8f00: 75 72 65 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 ure");.....retur
8f10: 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 6f 66 n(-1);...}....of
8f20: 66 73 65 74 20 2b 3d 20 63 6f 75 6e 74 3b 0a 0a fset += count;..
8f30: 09 09 69 66 20 28 63 6f 75 6e 74 20 3c 20 6d 61 ..if (count < ma
8f40: 78 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41 x_count) {....CA
8f50: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
8f60: 46 28 22 53 68 6f 72 74 20 72 65 61 64 20 2d 2d F("Short read --
8f70: 20 63 6f 75 6e 74 20 3d 20 25 69 2c 20 63 6d 64 count = %i, cmd
8f80: 5b 31 5d 20 3d 20 25 69 22 2c 20 28 69 6e 74 29 [1] = %i", (int)
8f90: 20 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63 6d count, (int) cm
8fa0: 64 5b 31 5d 29 3b 0a 0a 09 09 09 62 72 65 61 6b d[1]);.....break
8fb0: 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 ;...}..}..#ifdef
8fc0: 20 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44 CACKEY_PARANOID
8fd0: 0a 23 20 20 69 66 64 65 66 20 5f 50 4f 53 49 58 .# ifdef _POSIX
8fe0: 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28 _SSIZE_MAX..if (
8ff0: 6f 66 66 73 65 74 20 3e 20 5f 50 4f 53 49 58 5f offset > _POSIX_
9000: 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43 SSIZE_MAX) {...C
9010: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
9020: 54 46 28 22 4f 66 66 73 65 74 20 65 78 63 65 65 TF("Offset excee
9030: 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 ds maximum value
9040: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 , returning in f
9050: 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20 25 ailure. (max = %
9060: 6c 69 2c 20 6f 66 66 73 65 74 20 3d 20 25 6c 75 li, offset = %lu
9070: 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 )", (long) _POSI
9080: 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e X_SSIZE_MAX, (un
9090: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 66 66 signed long) off
90a0: 73 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 set);....return(
90b0: 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69 66 -1);..}.# endif
90c0: 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 .#endif...CACKEY
90d0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
90e0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 eturning in succ
90f0: 65 73 73 2c 20 72 65 61 64 20 25 6c 75 20 62 79 ess, read %lu by
9100: 74 65 73 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 tes", (unsigned
9110: 6c 6f 6e 67 29 20 6f 66 66 73 65 74 29 3b 0a 0a long) offset);..
9120: 09 72 65 74 75 72 6e 28 6f 66 66 73 65 74 29 3b .return(offset);
9130: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 .}../*. * SYNPOS
9140: 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 IS. * cackey
9150: 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 _ret cackey_sele
9160: 63 74 5f 61 70 70 6c 65 74 28 73 74 72 75 63 74 ct_applet(struct
9170: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c cackey_slot *sl
9180: 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 ot, unsigned cha
9190: 72 20 2a 61 69 64 2c 20 73 69 7a 65 5f 74 20 61 r *aid, size_t a
91a0: 69 64 5f 6c 65 6e 29 3b 0a 20 2a 0a 20 2a 20 41 id_len);. *. * A
91b0: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 RGUMENTS. *
91c0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c struct cackey_sl
91d0: 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 ot *slot. *
91e0: 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 Slot to send
91f0: 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a commands to. *.
9200: 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 * unsigned
9210: 63 68 61 72 20 2a 61 69 64 0a 20 2a 20 20 20 20 char *aid. *
9220: 20 20 20 20 20 42 75 66 66 65 72 20 63 6f 6e 74 Buffer cont
9230: 61 69 6e 69 6e 67 20 41 70 70 6c 65 74 20 49 44 aining Applet ID
9240: 20 74 6f 20 73 65 6c 65 63 74 0a 20 2a 0a 20 2a to select. *. *
9250: 20 20 20 20 20 73 69 7a 65 5f 74 20 61 69 64 5f size_t aid_
9260: 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 4e len. * N
9270: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 umber of bytes i
9280: 6e 20 74 68 65 20 22 61 69 64 22 20 28 41 70 70 n the "aid" (App
9290: 6c 65 74 20 49 44 29 20 70 61 72 61 6d 65 74 65 let ID) paramete
92a0: 72 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 r. *. * RETURN V
92b0: 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b ALUE. * CACK
92c0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 EY_PCSC_S_OK
92d0: 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a On success.
92e0: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 * CACKEY_PC
92f0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 SC_E_GENERIC
9300: 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e On error. *. * N
9310: 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 OTES. * None
9320: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 . *. */.static c
9330: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 ackey_ret cackey
9340: 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 _select_applet(s
9350: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f truct cackey_slo
9360: 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 t *slot, unsigne
9370: 64 20 63 68 61 72 20 2a 61 69 64 2c 20 73 69 7a d char *aid, siz
9380: 65 5f 74 20 61 69 64 5f 6c 65 6e 29 20 7b 0a 09 e_t aid_len) {..
9390: 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 int send_ret;...
93a0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
93b0: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a NTF("Called.");.
93c0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
93d0: 52 49 4e 54 42 55 46 28 22 53 65 6c 65 63 74 69 RINTBUF("Selecti
93e0: 6e 67 20 61 70 70 6c 65 74 3a 22 2c 20 61 69 64 ng applet:", aid
93f0: 2c 20 61 69 64 5f 6c 65 6e 29 3b 0a 0a 09 73 65 , aid_len);...se
9400: 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f nd_ret = cackey_
9410: 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 send_apdu(slot,
9420: 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 GSCIS_CLASS_ISO7
9430: 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 816, GSCIS_INSTR
9440: 5f 53 45 4c 45 43 54 2c 20 47 53 43 49 53 5f 50 _SELECT, GSCIS_P
9450: 41 52 41 4d 5f 53 45 4c 45 43 54 5f 41 50 50 4c ARAM_SELECT_APPL
9460: 45 54 2c 20 30 78 30 43 2c 20 61 69 64 5f 6c 65 ET, 0x0C, aid_le
9470: 6e 2c 20 61 69 64 2c 20 30 78 30 30 2c 20 4e 55 n, aid, 0x00, NU
9480: 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b LL, NULL, NULL);
9490: 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21 ..if (send_ret !
94a0: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f = CACKEY_PCSC_S_
94b0: 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 OK) {...CACKEY_D
94c0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69 EBUG_PRINTF("Fai
94d0: 6c 65 64 20 74 6f 20 6f 70 65 6e 20 61 70 70 6c led to open appl
94e0: 65 74 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e et, returning in
94f0: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 failure");....r
9500: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 eturn(CACKEY_PCS
9510: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d C_E_GENERIC);..}
9520: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
9530: 50 52 49 4e 54 46 28 22 53 75 63 63 65 73 73 66 PRINTF("Successf
9540: 75 6c 6c 79 20 73 65 6c 65 63 74 65 64 20 66 69 ully selected fi
9550: 6c 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 le");...return(C
9560: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 ACKEY_PCSC_S_OK)
9570: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f ;.}../*. * SYNPO
9580: 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 SIS. * cacke
9590: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6c y_ret cackey_sel
95a0: 65 63 74 5f 66 69 6c 65 28 73 74 72 75 63 74 20 ect_file(struct
95b0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f cackey_slot *slo
95c0: 74 2c 20 75 69 6e 74 31 36 5f 74 20 65 66 29 3b t, uint16_t ef);
95d0: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 . *. * ARGUMENTS
95e0: 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74 20 63 . * struct c
95f0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 ackey_slot *slot
9600: 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 . * Slot
9610: 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 to send command
9620: 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 s to. *. * u
9630: 69 6e 74 31 36 5f 74 20 65 66 0a 20 2a 20 20 20 int16_t ef. *
9640: 20 20 20 20 20 20 45 6c 65 6d 65 6e 74 61 6c 20 Elemental
9650: 46 69 6c 65 20 74 6f 20 73 65 6c 65 63 74 0a 20 File to select.
9660: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 *. * RETURN VALU
9670: 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f E. * CACKEY_
9680: 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 PCSC_S_OK
9690: 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 On success. *
96a0: 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f CACKEY_PCSC_
96b0: 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 E_GENERIC On
96c0: 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 error. *. * NOTE
96d0: 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 73 65 S. * This se
96e0: 6c 65 63 74 73 20 61 6e 20 45 6c 65 6d 65 6e 74 lects an Element
96f0: 61 72 79 20 46 69 6c 65 20 28 45 46 29 20 75 6e ary File (EF) un
9700: 64 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 6c der the currentl
9710: 79 20 73 65 6c 65 63 74 65 64 0a 20 2a 20 20 20 y selected. *
9720: 20 20 44 65 64 69 63 61 74 65 64 20 46 69 6c 65 Dedicated File
9730: 20 28 44 46 29 0a 20 2a 0a 20 2a 20 20 20 20 20 (DF). *. *
9740: 54 79 70 69 63 61 6c 6c 79 20 74 68 69 73 20 69 Typically this i
9750: 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 73 s called after s
9760: 65 6c 65 63 74 69 6e 67 20 74 68 65 20 63 6f 72 electing the cor
9770: 72 65 63 74 20 41 70 70 6c 65 74 20 28 75 73 69 rect Applet (usi
9780: 6e 67 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 ng. * cackey
9790: 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 29 20 _select_applet)
97a0: 66 6f 72 20 56 4d 20 63 61 72 64 73 0a 20 2a 0a for VM cards. *.
97b0: 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 */.static cacke
97c0: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6c y_ret cackey_sel
97d0: 65 63 74 5f 66 69 6c 65 28 73 74 72 75 63 74 20 ect_file(struct
97e0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f cackey_slot *slo
97f0: 74 2c 20 75 69 6e 74 31 36 5f 74 20 65 66 29 20 t, uint16_t ef)
9800: 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 {..unsigned char
9810: 20 66 69 64 5f 62 75 66 5b 32 5d 3b 0a 09 69 6e fid_buf[2];..in
9820: 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 t send_ret;...CA
9830: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
9840: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
9850: 2f 2a 20 4f 70 65 6e 20 74 68 65 20 65 6c 65 6d /* Open the elem
9860: 65 6e 74 61 72 79 20 66 69 6c 65 20 2a 2f 0a 09 entary file */..
9870: 66 69 64 5f 62 75 66 5b 30 5d 20 3d 20 28 65 66 fid_buf[0] = (ef
9880: 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 09 >> 8) & 0xff;..
9890: 66 69 64 5f 62 75 66 5b 31 5d 20 3d 20 65 66 20 fid_buf[1] = ef
98a0: 26 20 30 78 66 66 3b 0a 0a 09 43 41 43 4b 45 59 & 0xff;...CACKEY
98b0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 _DEBUG_PRINTF("S
98c0: 65 6c 65 63 74 69 6e 67 20 66 69 6c 65 3a 20 25 electing file: %
98d0: 30 34 6c 78 22 2c 20 28 75 6e 73 69 67 6e 65 64 04lx", (unsigned
98e0: 20 6c 6f 6e 67 29 20 65 66 29 3b 0a 0a 09 73 65 long) ef);...se
98f0: 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f nd_ret = cackey_
9900: 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 send_apdu(slot,
9910: 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 GSCIS_CLASS_ISO7
9920: 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 816, GSCIS_INSTR
9930: 5f 53 45 4c 45 43 54 2c 20 30 78 30 32 2c 20 30 _SELECT, 0x02, 0
9940: 78 30 43 2c 20 73 69 7a 65 6f 66 28 66 69 64 5f x0C, sizeof(fid_
9950: 62 75 66 29 2c 20 66 69 64 5f 62 75 66 2c 20 30 buf), fid_buf, 0
9960: 78 30 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c x00, NULL, NULL,
9970: 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 73 65 6e NULL);..if (sen
9980: 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f d_ret != CACKEY_
9990: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 PCSC_S_OK) {...C
99a0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
99b0: 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 6f 70 TF("Failed to op
99c0: 65 6e 20 66 69 6c 65 2c 20 72 65 74 75 72 6e 69 en file, returni
99d0: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b ng in failure");
99e0: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 ....return(CACKE
99f0: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 Y_PCSC_E_GENERIC
9a00: 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 );..}...CACKEY_D
9a10: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63 EBUG_PRINTF("Suc
9a20: 63 65 73 73 66 75 6c 6c 79 20 73 65 6c 65 63 74 cessfully select
9a30: 65 64 20 66 69 6c 65 22 29 3b 0a 0a 09 72 65 74 ed file");...ret
9a40: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f urn(CACKEY_PCSC_
9a50: 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 S_OK);.}../*. *
9a60: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 SYNPOSIS. *
9a70: 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72 65 65 void cackey_free
9a80: 5f 74 6c 76 28 73 74 72 75 63 74 20 63 61 63 6b _tlv(struct cack
9a90: 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 72 ey_tlv_entity *r
9aa0: 6f 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 oot);. *. * ARGU
9ab0: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72 MENTS. * str
9ac0: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 uct cackey_tlv_e
9ad0: 6e 74 69 74 79 20 2a 72 6f 6f 74 0a 20 2a 20 20 ntity *root. *
9ae0: 20 20 20 20 20 20 20 52 6f 6f 74 20 6f 66 20 74 Root of t
9af0: 68 65 20 54 4c 56 20 6c 69 73 74 20 74 6f 20 73 he TLV list to s
9b00: 74 61 72 74 20 66 72 65 65 69 6e 67 0a 20 2a 0a tart freeing. *.
9b10: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a * RETURN VALUE.
9b20: 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 * None. *.
9b30: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 * NOTES. * T
9b40: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 72 65 his function fre
9b50: 65 73 20 74 68 65 20 54 4c 56 20 6c 69 6e 6b 65 es the TLV linke
9b60: 64 20 6c 69 73 74 65 64 20 72 65 74 75 72 6e 65 d listed returne
9b70: 64 20 66 72 6f 6d 0a 20 2a 20 20 20 20 20 22 63 d from. * "c
9b80: 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76 22 0a ackey_read_tlv".
9b90: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f *. */.static vo
9ba0: 69 64 20 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 id cackey_free_t
9bb0: 6c 76 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 lv(struct cackey
9bc0: 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 72 6f 6f _tlv_entity *roo
9bd0: 74 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 t) {..struct cac
9be0: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a key_tlv_entity *
9bf0: 63 75 72 72 2c 20 2a 6e 65 78 74 3b 0a 0a 09 69 curr, *next;...i
9c00: 66 20 28 72 6f 6f 74 20 3d 3d 20 4e 55 4c 4c 29 f (root == NULL)
9c10: 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a {...return;..}.
9c20: 0a 09 66 6f 72 20 28 63 75 72 72 20 3d 20 72 6f ..for (curr = ro
9c30: 6f 74 3b 20 63 75 72 72 3b 20 63 75 72 72 20 3d ot; curr; curr =
9c40: 20 6e 65 78 74 29 20 7b 0a 09 09 6e 65 78 74 20 next) {...next
9c50: 3d 20 63 75 72 72 2d 3e 5f 6e 65 78 74 3b 0a 0a = curr->_next;..
9c60: 09 09 73 77 69 74 63 68 20 28 63 75 72 72 2d 3e ..switch (curr->
9c70: 74 61 67 29 20 7b 0a 09 09 09 63 61 73 65 20 47 tag) {....case G
9c80: 53 43 49 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 SCIS_TAG_ACR_TAB
9c90: 4c 45 3a 0a 09 09 09 63 61 73 65 20 47 53 43 49 LE:....case GSCI
9ca0: 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 S_TAG_CERTIFICAT
9cb0: 45 3a 0a 09 09 09 09 69 66 20 28 63 75 72 72 2d E:.....if (curr-
9cc0: 3e 76 61 6c 75 65 29 20 7b 0a 09 09 09 09 09 66 >value) {......f
9cd0: 72 65 65 28 63 75 72 72 2d 3e 76 61 6c 75 65 29 ree(curr->value)
9ce0: 3b 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61 ;.....}.....brea
9cf0: 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 k;....case GSCIS
9d00: 5f 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09 _TAG_CARDURL:...
9d10: 09 09 69 66 20 28 63 75 72 72 2d 3e 76 61 6c 75 ..if (curr->valu
9d20: 65 5f 63 61 72 64 75 72 6c 29 20 7b 0a 09 09 09 e_cardurl) {....
9d30: 09 09 66 72 65 65 28 63 75 72 72 2d 3e 76 61 6c ..free(curr->val
9d40: 75 65 5f 63 61 72 64 75 72 6c 29 3b 0a 09 09 09 ue_cardurl);....
9d50: 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 .}.....break;...
9d60: 7d 0a 0a 09 09 66 72 65 65 28 63 75 72 72 29 3b }....free(curr);
9d70: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a ..}...return;.}.
9d80: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a ./*. * SYNPOSIS.
9d90: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a * .... *. *
9da0: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 ARGUMENTS. *
9db0: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 .... *. * RETU
9dc0: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 RN VALUE. *
9dd0: 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a .... *. * NOTES.
9de0: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a * .... *. *
9df0: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 /.static struct
9e00: 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 cackey_tlv_entit
9e10: 79 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f 74 y *cackey_read_t
9e20: 6c 76 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 lv(struct cackey
9e30: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 _slot *slot) {..
9e40: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c struct cackey_tl
9e50: 76 5f 65 6e 74 69 74 79 20 2a 63 75 72 72 5f 65 v_entity *curr_e
9e60: 6e 74 69 74 79 2c 20 2a 72 6f 6f 74 20 3d 20 4e ntity, *root = N
9e70: 55 4c 4c 2c 20 2a 6c 61 73 74 20 3d 20 4e 55 4c ULL, *last = NUL
9e80: 4c 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 L;..unsigned cha
9e90: 72 20 74 6c 65 6e 5f 62 75 66 5b 32 5d 2c 20 74 r tlen_buf[2], t
9ea0: 76 61 6c 5f 62 75 66 5b 31 30 32 34 5d 2c 20 2a val_buf[1024], *
9eb0: 74 76 61 6c 3b 0a 09 75 6e 73 69 67 6e 65 64 20 tval;..unsigned
9ec0: 63 68 61 72 20 76 6c 65 6e 5f 62 75 66 5b 32 5d char vlen_buf[2]
9ed0: 2c 20 76 76 61 6c 5f 62 75 66 5b 38 31 39 32 5d , vval_buf[8192]
9ee0: 2c 20 2a 76 76 61 6c 3b 0a 09 75 6e 73 69 67 6e , *vval;..unsign
9ef0: 65 64 20 63 68 61 72 20 2a 74 6d 70 62 75 66 3b ed char *tmpbuf;
9f00: 0a 09 73 73 69 7a 65 5f 74 20 74 6c 65 6e 2c 20 ..ssize_t tlen,
9f10: 76 6c 65 6e 3b 0a 09 73 73 69 7a 65 5f 74 20 72 vlen;..ssize_t r
9f20: 65 61 64 5f 72 65 74 3b 0a 09 73 69 7a 65 5f 74 ead_ret;..size_t
9f30: 20 6f 66 66 73 65 74 5f 74 20 3d 20 30 2c 20 6f offset_t = 0, o
9f40: 66 66 73 65 74 5f 76 20 3d 20 30 3b 0a 09 75 6e ffset_v = 0;..un
9f50: 73 69 67 6e 65 64 20 63 68 61 72 20 74 61 67 3b signed char tag;
9f60: 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 67 74 68 3b ..size_t length;
9f70: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 4c 49 42 .#ifdef HAVE_LIB
9f80: 5a 0a 09 75 4c 6f 6e 67 66 20 74 6d 70 62 75 66 Z..uLongf tmpbuf
9f90: 6c 65 6e 3b 0a 09 69 6e 74 20 75 6e 63 6f 6d 70 len;..int uncomp
9fa0: 72 65 73 73 5f 72 65 74 3b 0a 23 65 6e 64 69 66 ress_ret;.#endif
9fb0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
9fc0: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
9fd0: 29 3b 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20 );...read_ret =
9fe0: 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 cackey_read_buff
9ff0: 65 72 28 73 6c 6f 74 2c 20 74 6c 65 6e 5f 62 75 er(slot, tlen_bu
a000: 66 2c 20 73 69 7a 65 6f 66 28 74 6c 65 6e 5f 62 f, sizeof(tlen_b
a010: 75 66 29 2c 20 31 2c 20 6f 66 66 73 65 74 5f 74 uf), 1, offset_t
a020: 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74 );..if (read_ret
a030: 20 21 3d 20 73 69 7a 65 6f 66 28 74 6c 65 6e 5f != sizeof(tlen_
a040: 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 buf)) {...CACKEY
a050: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
a060: 65 61 64 20 66 61 69 6c 65 64 2c 20 72 65 74 75 ead failed, retu
a070: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 rning in failure
a080: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 ");....return(NU
a090: 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 6c 65 6e 20 3d LL);..}...tlen =
a0a0: 20 28 74 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c (tlen_buf[1] <<
a0b0: 20 38 29 20 7c 20 74 6c 65 6e 5f 62 75 66 5b 30 8) | tlen_buf[0
a0c0: 5d 3b 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20 ];...read_ret =
a0d0: 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 cackey_read_buff
a0e0: 65 72 28 73 6c 6f 74 2c 20 76 6c 65 6e 5f 62 75 er(slot, vlen_bu
a0f0: 66 2c 20 73 69 7a 65 6f 66 28 76 6c 65 6e 5f 62 f, sizeof(vlen_b
a100: 75 66 29 2c 20 32 2c 20 6f 66 66 73 65 74 5f 76 uf), 2, offset_v
a110: 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74 );..if (read_ret
a120: 20 21 3d 20 73 69 7a 65 6f 66 28 76 6c 65 6e 5f != sizeof(vlen_
a130: 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 buf)) {...CACKEY
a140: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
a150: 65 61 64 20 66 61 69 6c 65 64 2c 20 72 65 74 75 ead failed, retu
a160: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 rning in failure
a170: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 ");....return(NU
a180: 4c 4c 29 3b 0a 09 7d 0a 0a 09 76 6c 65 6e 20 3d LL);..}...vlen =
a190: 20 28 76 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c (vlen_buf[1] <<
a1a0: 20 38 29 20 7c 20 76 6c 65 6e 5f 62 75 66 5b 30 8) | vlen_buf[0
a1b0: 5d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 ];...CACKEY_DEBU
a1c0: 47 5f 50 52 49 4e 54 46 28 22 54 61 67 20 4c 65 G_PRINTF("Tag Le
a1d0: 6e 67 74 68 20 3d 20 25 69 2c 20 56 61 6c 75 65 ngth = %i, Value
a1e0: 20 4c 65 6e 67 74 68 20 3d 20 25 69 22 2c 20 74 Length = %i", t
a1f0: 6c 65 6e 2c 20 76 6c 65 6e 29 3b 0a 0a 09 6f 66 len, vlen);...of
a200: 66 73 65 74 5f 74 20 2b 3d 20 32 3b 0a 09 6f 66 fset_t += 2;..of
a210: 66 73 65 74 5f 76 20 2b 3d 20 32 3b 0a 0a 09 69 fset_v += 2;...i
a220: 66 20 28 74 6c 65 6e 20 3e 20 73 69 7a 65 6f 66 f (tlen > sizeof
a230: 28 74 76 61 6c 5f 62 75 66 29 29 20 7b 0a 09 09 (tval_buf)) {...
a240: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
a250: 4e 54 46 28 22 54 61 67 20 6c 65 6e 67 74 68 20 NTF("Tag length
a260: 69 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20 72 65 is too large, re
a270: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 turning in failu
a280: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 re");....return(
a290: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 NULL);..}...if (
a2a0: 76 6c 65 6e 20 3e 20 73 69 7a 65 6f 66 28 76 76 vlen > sizeof(vv
a2b0: 61 6c 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43 al_buf)) {...CAC
a2c0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
a2d0: 28 22 56 61 6c 75 65 20 6c 65 6e 67 74 68 20 69 ("Value length i
a2e0: 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20 72 65 74 s too large, ret
a2f0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 urning in failur
a300: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e e");....return(N
a310: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f ULL);..}...read_
a320: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 ret = cackey_rea
a330: 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 74 d_buffer(slot, t
a340: 76 61 6c 5f 62 75 66 2c 20 74 6c 65 6e 2c 20 31 val_buf, tlen, 1
a350: 2c 20 6f 66 66 73 65 74 5f 74 29 3b 0a 09 69 66 , offset_t);..if
a360: 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20 74 6c (read_ret != tl
a370: 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 en) {...CACKEY_D
a380: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 EBUG_PRINTF("Una
a390: 62 6c 65 20 74 6f 20 72 65 61 64 20 65 6e 74 69 ble to read enti
a3a0: 72 65 20 54 2d 62 75 66 66 65 72 2c 20 72 65 74 re T-buffer, ret
a3b0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 urning in failur
a3c0: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e e");....return(N
a3d0: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f ULL);..}...read_
a3e0: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 ret = cackey_rea
a3f0: 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 76 d_buffer(slot, v
a400: 76 61 6c 5f 62 75 66 2c 20 76 6c 65 6e 2c 20 32 val_buf, vlen, 2
a410: 2c 20 6f 66 66 73 65 74 5f 76 29 3b 0a 09 69 66 , offset_v);..if
a420: 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20 76 6c (read_ret != vl
a430: 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 en) {...CACKEY_D
a440: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 EBUG_PRINTF("Una
a450: 62 6c 65 20 74 6f 20 72 65 61 64 20 65 6e 74 69 ble to read enti
a460: 72 65 20 56 2d 62 75 66 66 65 72 2c 20 72 65 74 re V-buffer, ret
a470: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 urning in failur
a480: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e e");....return(N
a490: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 76 61 6c 20 ULL);..}...tval
a4a0: 3d 20 74 76 61 6c 5f 62 75 66 3b 0a 09 76 76 61 = tval_buf;..vva
a4b0: 6c 20 3d 20 76 76 61 6c 5f 62 75 66 3b 0a 09 77 l = vval_buf;..w
a4c0: 68 69 6c 65 20 28 74 6c 65 6e 20 3e 20 30 20 26 hile (tlen > 0 &
a4d0: 26 20 76 6c 65 6e 20 3e 20 30 29 20 7b 0a 09 09 & vlen > 0) {...
a4e0: 74 61 67 20 3d 20 2a 74 76 61 6c 3b 0a 09 09 74 tag = *tval;...t
a4f0: 76 61 6c 2b 2b 3b 0a 09 09 74 6c 65 6e 2d 2d 3b val++;...tlen--;
a500: 0a 0a 09 09 69 66 20 28 2a 74 76 61 6c 20 3d 3d ....if (*tval ==
a510: 20 30 78 66 66 29 20 7b 0a 09 09 09 6c 65 6e 67 0xff) {....leng
a520: 74 68 20 3d 20 28 74 76 61 6c 5b 32 5d 20 3c 3c th = (tval[2] <<
a530: 20 38 29 20 7c 20 74 76 61 6c 5b 31 5d 3b 0a 09 8) | tval[1];..
a540: 09 09 74 76 61 6c 20 2b 3d 20 33 3b 0a 09 09 09 ..tval += 3;....
a550: 74 6c 65 6e 20 2d 3d 20 33 3b 0a 09 09 7d 20 65 tlen -= 3;...} e
a560: 6c 73 65 20 7b 0a 09 09 09 6c 65 6e 67 74 68 20 lse {....length
a570: 3d 20 2a 74 76 61 6c 3b 0a 09 09 09 74 76 61 6c = *tval;....tval
a580: 2b 2b 3b 0a 09 09 09 74 6c 65 6e 2d 2d 3b 0a 09 ++;....tlen--;..
a590: 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 .}....CACKEY_DEB
a5a0: 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67 3a 20 UG_PRINTF("Tag:
a5b0: 25 73 20 28 25 30 32 78 29 22 2c 20 43 41 43 4b %s (%02x)", CACK
a5c0: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 EY_DEBUG_FUNC_TA
a5d0: 47 5f 54 4f 5f 53 54 52 28 74 61 67 29 2c 20 28 G_TO_STR(tag), (
a5e0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 74 61 unsigned int) ta
a5f0: 67 29 3b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 g);...CACKEY_DEB
a600: 55 47 5f 50 52 49 4e 54 42 55 46 28 22 56 61 6c UG_PRINTBUF("Val
a610: 75 65 3a 22 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 ue:", vval, leng
a620: 74 68 29 3b 0a 0a 09 09 63 75 72 72 5f 65 6e 74 th);....curr_ent
a630: 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 73 77 ity = NULL;...sw
a640: 69 74 63 68 20 28 74 61 67 29 20 7b 0a 09 09 09 itch (tag) {....
a650: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 case GSCIS_TAG_C
a660: 41 52 44 55 52 4c 3a 0a 09 09 09 09 63 75 72 72 ARDURL:.....curr
a670: 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 _entity = malloc
a680: 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e (sizeof(*curr_en
a690: 74 69 74 79 29 29 3b 0a 09 09 09 09 63 75 72 72 tity));.....curr
a6a0: 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 _entity->value_c
a6b0: 61 72 64 75 72 6c 20 3d 20 6d 61 6c 6c 6f 63 28 ardurl = malloc(
a6c0: 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 sizeof(*curr_ent
a6d0: 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 ity->value_cardu
a6e0: 72 6c 29 29 3b 0a 0a 09 09 09 09 6d 65 6d 63 70 rl));......memcp
a6f0: 79 28 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 y(curr_entity->v
a700: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 alue_cardurl->ri
a710: 64 2c 20 76 76 61 6c 2c 20 35 29 3b 0a 09 09 09 d, vval, 5);....
a720: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 .curr_entity->va
a730: 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 lue_cardurl->app
a740: 74 79 70 65 20 3d 20 76 76 61 6c 5b 35 5d 3b 0a type = vval[5];.
a750: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d ....curr_entity-
a760: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e >value_cardurl->
a770: 6f 62 6a 65 63 74 69 64 20 3d 20 28 76 76 61 6c objectid = (vval
a780: 5b 36 5d 20 3c 3c 20 38 29 20 7c 20 76 76 61 6c [6] << 8) | vval
a790: 5b 37 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e [7];.....curr_en
a7a0: 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 tity->value_card
a7b0: 75 72 6c 2d 3e 61 70 70 69 64 20 3d 20 28 76 76 url->appid = (vv
a7c0: 61 6c 5b 38 5d 20 3c 3c 20 38 29 20 7c 20 76 76 al[8] << 8) | vv
a7d0: 61 6c 5b 39 5d 3b 0a 0a 09 09 09 09 63 75 72 72 al[9];......curr
a7e0: 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 _entity->tag = t
a7f0: 61 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 ag;.....curr_ent
a800: 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c ity->_next = NUL
a810: 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 L;......break;..
a820: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 ..case GSCIS_TAG
a830: 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 09 _ACR_TABLE:.....
a840: 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 curr_entity = ma
a850: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 lloc(sizeof(*cur
a860: 72 5f 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 r_entity));.....
a870: 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 tmpbuf = malloc(
a880: 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 09 09 6d 65 length);......me
a890: 6d 63 70 79 28 74 6d 70 62 75 66 2c 20 76 76 61 mcpy(tmpbuf, vva
a8a0: 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 09 l, length);.....
a8b0: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 .curr_entity->ta
a8c0: 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72 g = tag;.....cur
a8d0: 72 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e 67 74 68 r_entity->length
a8e0: 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09 63 = length;.....c
a8f0: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 urr_entity->valu
a900: 65 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09 09 e = tmpbuf;.....
a910: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 curr_entity->_ne
a920: 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 xt = NULL;......
a930: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 break;....case G
a940: 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 SCIS_TAG_CERTIFI
a950: 43 41 54 45 3a 0a 09 09 09 09 63 75 72 72 5f 65 CATE:.....curr_e
a960: 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 ntity = malloc(s
a970: 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 izeof(*curr_enti
a980: 74 79 29 29 3b 0a 0a 09 09 09 09 74 6d 70 62 75 ty));......tmpbu
a990: 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 20 2a 20 flen = length *
a9a0: 32 3b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20 2;.....tmpbuf =
a9b0: 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 66 6c 65 6e malloc(tmpbuflen
a9c0: 29 3b 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f );..#ifdef HAVE_
a9d0: 4c 49 42 5a 0a 09 09 09 09 75 6e 63 6f 6d 70 72 LIBZ.....uncompr
a9e0: 65 73 73 5f 72 65 74 20 3d 20 75 6e 63 6f 6d 70 ess_ret = uncomp
a9f0: 72 65 73 73 28 74 6d 70 62 75 66 2c 20 26 74 6d ress(tmpbuf, &tm
aa00: 70 62 75 66 6c 65 6e 2c 20 76 76 61 6c 2c 20 6c pbuflen, vval, l
aa10: 65 6e 67 74 68 29 3b 0a 09 09 09 09 69 66 20 28 ength);.....if (
aa20: 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 21 uncompress_ret !
aa30: 3d 20 5a 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 43 = Z_OK) {......C
aa40: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
aa50: 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 64 65 TF("Failed to de
aa60: 63 6f 6d 70 72 65 73 73 2c 20 75 6e 63 6f 6d 70 compress, uncomp
aa70: 72 65 73 73 28 29 20 72 65 74 75 72 6e 65 64 20 ress() returned
aa80: 25 69 20 2d 2d 20 72 65 73 6f 72 74 69 6e 67 20 %i -- resorting
aa90: 74 6f 20 64 69 72 65 63 74 20 63 6f 70 79 22 2c to direct copy",
aaa0: 20 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 29 uncompress_ret)
aab0: 3b 0a 0a 09 09 09 09 09 74 6d 70 62 75 66 6c 65 ;.......tmpbufle
aac0: 6e 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09 n = length;.....
aad0: 09 6d 65 6d 63 70 79 28 74 6d 70 62 75 66 2c 20 .memcpy(tmpbuf,
aae0: 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 09 vval, length);..
aaf0: 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 ...}......CACKEY
ab00: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 _DEBUG_PRINTBUF(
ab10: 22 44 65 63 6f 6d 70 72 65 73 73 65 64 20 74 6f "Decompressed to
ab20: 3a 22 2c 20 74 6d 70 62 75 66 2c 20 74 6d 70 62 :", tmpbuf, tmpb
ab30: 75 66 6c 65 6e 29 3b 0a 23 65 6c 73 65 0a 09 09 uflen);.#else...
ab40: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
ab50: 52 49 4e 54 46 28 22 4d 69 73 73 69 6e 67 20 5a RINTF("Missing Z
ab60: 4c 49 42 20 53 75 70 70 6f 72 74 2c 20 74 68 69 LIB Support, thi
ab70: 73 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 s certificate is
ab80: 20 6c 69 6b 65 6c 79 20 75 73 65 6c 65 73 73 2e likely useless.
ab90: 2e 2e 22 29 3b 0a 0a 09 09 09 09 74 6d 70 62 75 ..");......tmpbu
aba0: 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 flen = length;..
abb0: 09 09 09 6d 65 6d 63 70 79 28 74 6d 70 62 75 66 ...memcpy(tmpbuf
abc0: 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b , vval, length);
abd0: 0a 23 65 6e 64 69 66 0a 0a 09 09 09 09 63 75 72 .#endif......cur
abe0: 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 r_entity->tag =
abf0: 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e tag;.....curr_en
ac00: 74 69 74 79 2d 3e 6c 65 6e 67 74 68 20 3d 20 74 tity->length = t
ac10: 6d 70 62 75 66 6c 65 6e 3b 0a 09 09 09 09 63 75 mpbuflen;.....cu
ac20: 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 rr_entity->value
ac30: 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09 09 63 = tmpbuf;.....c
ac40: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 urr_entity->_nex
ac50: 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 t = NULL;......b
ac60: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 reak;....case GS
ac70: 43 49 53 5f 54 41 47 5f 50 4b 43 53 31 35 3a 0a CIS_TAG_PKCS15:.
ac80: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 ....curr_entity
ac90: 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 = malloc(sizeof(
aca0: 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a *curr_entity));.
acb0: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 .....curr_entity
acc0: 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 ->tag = tag;....
acd0: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 .curr_entity->va
ace0: 6c 75 65 5f 62 79 74 65 20 3d 20 76 76 61 6c 5b lue_byte = vval[
acf0: 30 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 0];.....curr_ent
ad00: 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c ity->_next = NUL
ad10: 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 L;......break;..
ad20: 09 7d 0a 0a 09 09 76 76 61 6c 20 2b 3d 20 6c 65 .}....vval += le
ad30: 6e 67 74 68 3b 0a 09 09 76 6c 65 6e 20 2d 3d 20 ngth;...vlen -=
ad40: 6c 65 6e 67 74 68 3b 0a 0a 09 09 69 66 20 28 63 length;....if (c
ad50: 75 72 72 5f 65 6e 74 69 74 79 20 21 3d 20 4e 55 urr_entity != NU
ad60: 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28 72 6f 6f LL) {....if (roo
ad70: 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 t == NULL) {....
ad80: 09 72 6f 6f 74 20 3d 20 63 75 72 72 5f 65 6e 74 .root = curr_ent
ad90: 69 74 79 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 ity;....}.....if
ada0: 20 28 6c 61 73 74 20 21 3d 20 4e 55 4c 4c 29 20 (last != NULL)
adb0: 7b 0a 09 09 09 09 6c 61 73 74 2d 3e 5f 6e 65 78 {.....last->_nex
adc0: 74 20 3d 20 63 75 72 72 5f 65 6e 74 69 74 79 3b t = curr_entity;
add0: 0a 09 09 09 7d 0a 0a 09 09 09 6c 61 73 74 20 3d ....}.....last =
ade0: 20 63 75 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09 curr_entity;...
adf0: 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 6f }..}...return(ro
ae00: 6f 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 ot);.}../*. * SY
ae10: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e NPOSIS. * ..
ae20: 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 .. *. * ARGUMENT
ae30: 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a S. * .... *.
ae40: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a * RETURN VALUE.
ae50: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a * .... *. *
ae60: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e NOTES. * ..
ae70: 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 .. *. */.static
ae80: 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72 65 65 void cackey_free
ae90: 5f 63 65 72 74 73 28 73 74 72 75 63 74 20 63 61 _certs(struct ca
aea0: 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 ckey_pcsc_identi
aeb0: 74 79 20 2a 73 74 61 72 74 2c 20 73 69 7a 65 5f ty *start, size_
aec0: 74 20 63 6f 75 6e 74 2c 20 69 6e 74 20 66 72 65 t count, int fre
aed0: 65 5f 73 74 61 72 74 29 20 7b 0a 09 73 69 7a 65 e_start) {..size
aee0: 5f 74 20 69 64 78 3b 0a 0a 09 66 6f 72 20 28 69 _t idx;...for (i
aef0: 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 63 6f dx = 0; idx < co
af00: 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 unt; idx++) {...
af10: 69 66 20 28 73 74 61 72 74 5b 69 64 78 5d 2e 63 if (start[idx].c
af20: 65 72 74 69 66 69 63 61 74 65 29 20 7b 0a 09 09 ertificate) {...
af30: 09 66 72 65 65 28 73 74 61 72 74 5b 69 64 78 5d .free(start[idx]
af40: 2e 63 65 72 74 69 66 69 63 61 74 65 29 3b 0a 09 .certificate);..
af50: 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 66 72 65 65 .}..}...if (free
af60: 5f 73 74 61 72 74 29 20 7b 0a 09 09 66 72 65 65 _start) {...free
af70: 28 73 74 61 72 74 29 3b 0a 09 7d 0a 0a 09 72 65 (start);..}...re
af80: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 turn;.}../*. * S
af90: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e YNPOSIS. * .
afa0: 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e ... *. * ARGUMEN
afb0: 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a TS. * .... *
afc0: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 . * RETURN VALUE
afd0: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 . * .... *.
afe0: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e * NOTES. * .
aff0: 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 ... *. */.static
b000: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 struct cackey_p
b010: 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 61 csc_identity *ca
b020: 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 73 28 ckey_read_certs(
b030: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c struct cackey_sl
b040: 6f 74 20 2a 73 6c 6f 74 2c 20 73 74 72 75 63 74 ot *slot, struct
b050: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 cackey_pcsc_ide
b060: 6e 74 69 74 79 20 2a 63 65 72 74 73 2c 20 75 6e ntity *certs, un
b070: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 63 6f 75 signed long *cou
b080: 6e 74 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61 nt) {..struct ca
b090: 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 ckey_pcsc_identi
b0a0: 74 79 20 2a 63 75 72 72 5f 69 64 3b 0a 09 73 74 ty *curr_id;..st
b0b0: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f ruct cackey_tlv_
b0c0: 65 6e 74 69 74 79 20 2a 63 63 63 5f 74 6c 76 2c entity *ccc_tlv,
b0d0: 20 2a 63 63 63 5f 63 75 72 72 2c 20 2a 61 70 70 *ccc_curr, *app
b0e0: 5f 74 6c 76 2c 20 2a 61 70 70 5f 63 75 72 72 3b _tlv, *app_curr;
b0f0: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 ..unsigned char
b100: 63 63 63 5f 61 69 64 5b 5d 20 3d 20 7b 47 53 43 ccc_aid[] = {GSC
b110: 49 53 5f 41 49 44 5f 43 43 43 7d 3b 0a 09 75 6e IS_AID_CCC};..un
b120: 73 69 67 6e 65 64 20 63 68 61 72 20 63 75 72 72 signed char curr
b130: 5f 61 69 64 5b 37 5d 3b 0a 09 75 6e 73 69 67 6e _aid[7];..unsign
b140: 65 64 20 6c 6f 6e 67 20 6f 75 74 69 64 78 20 3d ed long outidx =
b150: 20 30 3b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 0;..cackey_ret
b160: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74 3b transaction_ret;
b170: 0a 09 69 6e 74 20 63 65 72 74 73 5f 72 65 73 69 ..int certs_resi
b180: 7a 61 62 6c 65 3b 0a 09 69 6e 74 20 73 65 6e 64 zable;..int send
b190: 5f 72 65 74 2c 20 73 65 6c 65 63 74 5f 72 65 74 _ret, select_ret
b1a0: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ;...CACKEY_DEBUG
b1b0: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
b1c0: 22 29 3b 0a 0a 09 69 66 20 28 63 6f 75 6e 74 20 ");...if (count
b1d0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 == NULL) {...CAC
b1e0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
b1f0: 28 22 63 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2c ("count is NULL,
b200: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 returning in fa
b210: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 ilure");....retu
b220: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 rn(NULL);..}...i
b230: 66 20 28 63 65 72 74 73 20 21 3d 20 4e 55 4c 4c f (certs != NULL
b240: 29 20 7b 0a 09 09 69 66 20 28 2a 63 6f 75 6e 74 ) {...if (*count
b250: 20 3d 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b == 0) {....CACK
b260: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
b270: 22 52 65 71 75 65 73 74 65 64 20 77 65 20 72 65 "Requested we re
b280: 74 75 72 6e 20 30 20 6f 62 6a 65 63 74 73 2c 20 turn 0 objects,
b290: 73 68 6f 72 74 2d 63 69 72 63 75 69 74 22 29 3b short-circuit");
b2a0: 0a 0a 09 09 09 72 65 74 75 72 6e 28 63 65 72 74 .....return(cert
b2b0: 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 s);...}..}.../*
b2c0: 42 65 67 69 6e 20 61 20 53 6d 61 72 74 43 61 72 Begin a SmartCar
b2d0: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f d transaction */
b2e0: 0a 09 74 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65 ..transaction_re
b2f0: 74 20 3d 20 63 61 63 6b 65 79 5f 62 65 67 69 6e t = cackey_begin
b300: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f _transaction(slo
b310: 74 29 3b 0a 09 69 66 20 28 74 72 61 6e 73 61 63 t);..if (transac
b320: 74 69 6f 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b tion_ret != CACK
b330: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a EY_PCSC_S_OK) {.
b340: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
b350: 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 62 65 RINTF("Unable be
b360: 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c gin transaction,
b370: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 returning in fa
b380: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 ilure");....retu
b390: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 rn(NULL);..}...i
b3a0: 66 20 28 63 65 72 74 73 20 3d 3d 20 4e 55 4c 4c f (certs == NULL
b3b0: 29 20 7b 0a 09 09 63 65 72 74 73 20 3d 20 6d 61 ) {...certs = ma
b3c0: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 65 72 lloc(sizeof(*cer
b3d0: 74 73 29 20 2a 20 35 29 3b 0a 09 09 2a 63 6f 75 ts) * 5);...*cou
b3e0: 6e 74 20 3d 20 35 3b 0a 09 09 63 65 72 74 73 5f nt = 5;...certs_
b3f0: 72 65 73 69 7a 61 62 6c 65 20 3d 20 31 3b 0a 09 resizable = 1;..
b400: 7d 20 65 6c 73 65 20 7b 0a 09 09 63 65 72 74 73 } else {...certs
b410: 5f 72 65 73 69 7a 61 62 6c 65 20 3d 20 30 3b 0a _resizable = 0;.
b420: 09 7d 0a 0a 09 2f 2a 20 53 65 6c 65 63 74 20 74 .}.../* Select t
b430: 68 65 20 43 43 43 20 41 70 70 6c 65 74 20 2a 2f he CCC Applet */
b440: 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 ..send_ret = cac
b450: 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 key_select_apple
b460: 74 28 73 6c 6f 74 2c 20 63 63 63 5f 61 69 64 2c t(slot, ccc_aid,
b470: 20 73 69 7a 65 6f 66 28 63 63 63 5f 61 69 64 29 sizeof(ccc_aid)
b480: 29 3b 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 );..if (send_ret
b490: 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f != CACKEY_PCSC_
b4a0: 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 S_OK) {...CACKEY
b4b0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 _DEBUG_PRINTF("U
b4c0: 6e 61 62 6c 65 20 74 6f 20 73 65 6c 65 63 74 20 nable to select
b4d0: 43 43 43 20 41 70 70 6c 65 74 2c 20 72 65 74 75 CCC Applet, retu
b4e0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 rning in failure
b4f0: 22 29 3b 0a 0a 09 09 2f 2a 20 54 65 72 6d 69 6e ");..../* Termin
b500: 61 74 65 20 53 6d 61 72 74 43 61 72 64 20 54 72 ate SmartCard Tr
b510: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 ansaction */...c
b520: 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 ackey_end_transa
b530: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 ction(slot);....
b540: 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d return(NULL);..}
b550: 0a 0a 09 2f 2a 20 52 65 61 64 20 61 6c 6c 20 74 .../* Read all t
b560: 68 65 20 61 70 70 6c 65 74 73 20 66 72 6f 6d 20 he applets from
b570: 74 68 65 20 43 43 43 27 73 20 54 4c 56 20 2a 2f the CCC's TLV */
b580: 0a 09 63 63 63 5f 74 6c 76 20 3d 20 63 61 63 6b ..ccc_tlv = cack
b590: 65 79 5f 72 65 61 64 5f 74 6c 76 28 73 6c 6f 74 ey_read_tlv(slot
b5a0: 29 3b 0a 0a 09 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 );.../* Look for
b5b0: 20 43 41 52 44 55 52 4c 73 20 74 68 61 74 20 63 CARDURLs that c
b5c0: 6f 6f 72 65 73 70 6f 6e 64 20 74 6f 20 50 4b 49 oorespond to PKI
b5d0: 20 61 70 70 6c 65 74 73 20 2a 2f 0a 09 66 6f 72 applets */..for
b5e0: 20 28 63 63 63 5f 63 75 72 72 20 3d 20 63 63 63 (ccc_curr = ccc
b5f0: 5f 74 6c 76 3b 20 63 63 63 5f 63 75 72 72 3b 20 _tlv; ccc_curr;
b600: 63 63 63 5f 63 75 72 72 20 3d 20 63 63 63 5f 63 ccc_curr = ccc_c
b610: 75 72 72 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 urr->_next) {...
b620: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
b630: 4e 54 46 28 22 46 6f 75 6e 64 20 74 61 67 3a 20 NTF("Found tag:
b640: 25 73 20 2e 2e 2e 20 22 2c 20 43 41 43 4b 45 59 %s ... ", CACKEY
b650: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f _DEBUG_FUNC_TAG_
b660: 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d TO_STR(ccc_curr-
b670: 3e 74 61 67 29 29 3b 0a 0a 09 09 69 66 20 28 63 >tag));....if (c
b680: 63 63 5f 63 75 72 72 2d 3e 74 61 67 20 21 3d 20 cc_curr->tag !=
b690: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52 GSCIS_TAG_CARDUR
b6a0: 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 L) {....CACKEY_D
b6b0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e EBUG_PRINTF(" .
b6c0: 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69 74 20 28 .. skipping it (
b6d0: 77 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f we only care abo
b6e0: 75 74 20 43 41 52 44 55 52 4c 73 29 22 29 3b 0a ut CARDURLs)");.
b6f0: 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 ....continue;...
b700: 7d 0a 0a 09 09 69 66 20 28 28 63 63 63 5f 63 75 }....if ((ccc_cu
b710: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 rr->value_cardur
b720: 6c 2d 3e 61 70 70 74 79 70 65 20 26 20 43 41 43 l->apptype & CAC
b730: 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 29 KEY_TLV_APP_PKI)
b740: 20 21 3d 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 != CACKEY_TLV_A
b750: 50 50 5f 50 4b 49 29 20 7b 0a 09 09 09 43 41 43 PP_PKI) {....CAC
b760: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
b770: 28 22 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 (" ... skipping
b780: 20 69 74 20 28 77 65 20 6f 6e 6c 79 20 63 61 72 it (we only car
b790: 65 20 61 62 6f 75 74 20 50 4b 49 20 61 70 70 6c e about PKI appl
b7a0: 65 74 73 2c 20 74 68 69 73 20 61 70 70 6c 65 74 ets, this applet
b7b0: 20 73 75 70 70 6f 72 74 73 3a 20 25 73 2f 25 30 supports: %s/%0
b7c0: 32 78 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 2x)", CACKEY_DEB
b7d0: 55 47 5f 46 55 4e 43 5f 41 50 50 54 59 50 45 5f UG_FUNC_APPTYPE_
b7e0: 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d TO_STR(ccc_curr-
b7f0: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e >value_cardurl->
b800: 61 70 70 74 79 70 65 29 2c 20 28 75 6e 73 69 67 apptype), (unsig
b810: 6e 65 64 20 69 6e 74 29 20 63 63 63 5f 63 75 72 ned int) ccc_cur
b820: 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c r->value_cardurl
b830: 2d 3e 61 70 70 74 79 70 65 29 3b 0a 0a 09 09 09 ->apptype);.....
b840: 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 continue;...}...
b850: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
b860: 49 4e 54 42 55 46 28 22 52 49 44 3a 22 2c 20 63 INTBUF("RID:", c
b870: 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 cc_curr->value_c
b880: 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20 73 69 7a ardurl->rid, siz
b890: 65 6f 66 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 eof(ccc_curr->va
b8a0: 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 lue_cardurl->rid
b8b0: 29 29 3b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ));...CACKEY_DEB
b8c0: 55 47 5f 50 52 49 4e 54 46 28 22 41 70 70 49 44 UG_PRINTF("AppID
b8d0: 20 3d 20 25 73 2f 25 30 34 6c 78 22 2c 20 43 41 = %s/%04lx", CA
b8e0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f CKEY_DEBUG_FUNC_
b8f0: 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28 63 63 63 OBJID_TO_STR(ccc
b900: 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 _curr->value_car
b910: 64 75 72 6c 2d 3e 61 70 70 69 64 29 2c 20 28 75 durl->appid), (u
b920: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 63 nsigned long) cc
b930: 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 c_curr->value_ca
b940: 72 64 75 72 6c 2d 3e 61 70 70 69 64 29 3b 0a 09 rdurl->appid);..
b950: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
b960: 49 4e 54 46 28 22 4f 62 6a 65 63 74 49 44 20 3d INTF("ObjectID =
b970: 20 25 73 2f 25 30 34 6c 78 22 2c 20 43 41 43 4b %s/%04lx", CACK
b980: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42 EY_DEBUG_FUNC_OB
b990: 4a 49 44 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 JID_TO_STR(ccc_c
b9a0: 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 urr->value_cardu
b9b0: 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 2c 20 28 rl->objectid), (
b9c0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 unsigned long) c
b9d0: 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 cc_curr->value_c
b9e0: 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 ardurl->objectid
b9f0: 29 3b 0a 0a 09 09 6d 65 6d 63 70 79 28 63 75 72 );....memcpy(cur
ba00: 72 5f 61 69 64 2c 20 63 63 63 5f 63 75 72 72 2d r_aid, ccc_curr-
ba10: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e >value_cardurl->
ba20: 72 69 64 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f rid, sizeof(ccc_
ba30: 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 curr->value_card
ba40: 75 72 6c 2d 3e 72 69 64 29 29 3b 0a 09 09 63 75 url->rid));...cu
ba50: 72 72 5f 61 69 64 5b 73 69 7a 65 6f 66 28 63 75 rr_aid[sizeof(cu
ba60: 72 72 5f 61 69 64 29 20 2d 20 32 5d 20 3d 20 28 rr_aid) - 2] = (
ba70: 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f ccc_curr->value_
ba80: 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 3e cardurl->appid >
ba90: 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 09 09 63 > 8) & 0xff;...c
baa0: 75 72 72 5f 61 69 64 5b 73 69 7a 65 6f 66 28 63 urr_aid[sizeof(c
bab0: 75 72 72 5f 61 69 64 29 20 2d 20 31 5d 20 3d 20 urr_aid) - 1] =
bac0: 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f ccc_curr->value_
bad0: 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 26 cardurl->appid &
bae0: 20 30 78 66 66 3b 0a 0a 09 09 2f 2a 20 53 65 6c 0xff;..../* Sel
baf0: 65 63 74 20 66 6f 75 6e 64 20 61 70 70 6c 65 74 ect found applet
bb00: 20 2e 2e 2e 20 2a 2f 0a 09 09 73 65 6c 65 63 74 ... */...select
bb10: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 _ret = cackey_se
bb20: 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 lect_applet(slot
bb30: 2c 20 63 75 72 72 5f 61 69 64 2c 20 73 69 7a 65 , curr_aid, size
bb40: 6f 66 28 63 75 72 72 5f 61 69 64 29 29 3b 0a 09 of(curr_aid));..
bb50: 09 69 66 20 28 73 65 6c 65 63 74 5f 72 65 74 20 .if (select_ret
bb60: 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 != CACKEY_PCSC_S
bb70: 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 _OK) {....CACKEY
bb80: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 _DEBUG_PRINTF("F
bb90: 61 69 6c 65 64 20 74 6f 20 73 65 6c 65 63 74 20 ailed to select
bba0: 61 70 70 6c 65 74 2c 20 73 6b 69 70 70 69 6e 67 applet, skipping
bbb0: 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 processing of t
bbc0: 68 69 73 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 his object");...
bbd0: 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a ..continue;...}.
bbe0: 0a 09 09 2f 2a 20 2e 2e 2e 20 61 6e 64 20 6f 62 .../* ... and ob
bbf0: 6a 65 63 74 20 28 66 69 6c 65 29 20 2a 2f 0a 09 ject (file) */..
bc00: 09 73 65 6c 65 63 74 5f 72 65 74 20 3d 20 63 61 .select_ret = ca
bc10: 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 ckey_select_file
bc20: 28 73 6c 6f 74 2c 20 63 63 63 5f 63 75 72 72 2d (slot, ccc_curr-
bc30: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e >value_cardurl->
bc40: 6f 62 6a 65 63 74 69 64 29 3b 0a 09 09 69 66 20 objectid);...if
bc50: 28 73 65 6c 65 63 74 5f 72 65 74 20 21 3d 20 43 (select_ret != C
bc60: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 ACKEY_PCSC_S_OK)
bc70: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 {....CACKEY_DEB
bc80: 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 UG_PRINTF("Faile
bc90: 64 20 74 6f 20 73 65 6c 65 63 74 20 66 69 6c 65 d to select file
bca0: 2c 20 73 6b 69 70 70 69 6e 67 20 70 72 6f 63 65 , skipping proce
bcb0: 73 73 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 62 ssing of this ob
bcc0: 6a 65 63 74 22 29 3b 0a 0a 09 09 09 63 6f 6e 74 ject");.....cont
bcd0: 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 inue;...}..../*
bce0: 50 72 6f 63 65 73 73 20 74 68 69 73 20 66 69 6c Process this fil
bcf0: 65 27 73 20 54 4c 56 20 6c 6f 6f 6b 69 6e 67 20 e's TLV looking
bd00: 66 6f 72 20 63 65 72 74 69 66 69 63 61 74 65 73 for certificates
bd10: 20 2a 2f 0a 09 09 61 70 70 5f 74 6c 76 20 3d 20 */...app_tlv =
bd20: 63 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28 cackey_read_tlv(
bd30: 73 6c 6f 74 29 3b 0a 0a 09 09 66 6f 72 20 28 61 slot);....for (a
bd40: 70 70 5f 63 75 72 72 20 3d 20 61 70 70 5f 74 6c pp_curr = app_tl
bd50: 76 3b 20 61 70 70 5f 63 75 72 72 3b 20 61 70 70 v; app_curr; app
bd60: 5f 63 75 72 72 20 3d 20 61 70 70 5f 63 75 72 72 _curr = app_curr
bd70: 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 09 43 41 ->_next) {....CA
bd80: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
bd90: 46 28 22 46 6f 75 6e 64 20 74 61 67 3a 20 25 73 F("Found tag: %s
bda0: 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ", CACKEY_DEBUG_
bdb0: 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 FUNC_TAG_TO_STR(
bdc0: 61 70 70 5f 63 75 72 72 2d 3e 74 61 67 29 29 3b app_curr->tag));
bdd0: 0a 09 09 09 69 66 20 28 61 70 70 5f 63 75 72 72 ....if (app_curr
bde0: 2d 3e 74 61 67 20 21 3d 20 47 53 43 49 53 5f 54 ->tag != GSCIS_T
bdf0: 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 29 20 AG_CERTIFICATE)
be00: 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 {.....CACKEY_DEB
be10: 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e UG_PRINTF(" ...
be20: 20 73 6b 69 70 70 69 6e 67 20 69 74 20 28 77 65 skipping it (we
be30: 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 only care about
be40: 20 43 45 52 54 49 46 49 43 41 54 45 73 29 22 29 CERTIFICATEs)")
be50: 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b ;......continue;
be60: 0a 09 09 09 7d 0a 0a 09 09 09 63 75 72 72 5f 69 ....}.....curr_i
be70: 64 20 3d 20 26 63 65 72 74 73 5b 6f 75 74 69 64 d = &certs[outid
be80: 78 5d 3b 0a 09 09 09 6f 75 74 69 64 78 2b 2b 3b x];....outidx++;
be90: 0a 0a 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 .....memcpy(curr
bea0: 5f 69 64 2d 3e 61 70 70 6c 65 74 2c 20 63 75 72 _id->applet, cur
beb0: 72 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 63 75 r_aid, sizeof(cu
bec0: 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 29 29 3b rr_id->applet));
bed0: 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 66 69 6c ....curr_id->fil
bee0: 65 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 e = ccc_curr->va
bef0: 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a lue_cardurl->obj
bf00: 65 63 74 69 64 3b 0a 09 09 09 63 75 72 72 5f 69 ectid;....curr_i
bf10: 64 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 2d 31 3b d->keysize = -1;
bf20: 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
bf30: 47 5f 50 52 49 4e 54 46 28 22 46 69 6c 6c 69 6e G_PRINTF("Fillin
bf40: 67 20 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 g curr_id->apple
bf50: 74 20 28 25 70 29 20 77 69 74 68 20 25 6c 75 20 t (%p) with %lu
bf60: 62 79 74 65 73 3a 22 2c 20 63 75 72 72 5f 69 64 bytes:", curr_id
bf70: 2d 3e 61 70 70 6c 65 74 2c 20 28 75 6e 73 69 67 ->applet, (unsig
bf80: 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65 6f 66 ned long) sizeof
bf90: 28 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 (curr_id->applet
bfa0: 29 29 3b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 ));....CACKEY_DE
bfb0: 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 56 41 BUG_PRINTBUF("VA
bfc0: 4c 3a 22 2c 20 63 75 72 72 5f 69 64 2d 3e 61 70 L:", curr_id->ap
bfd0: 70 6c 65 74 2c 20 73 69 7a 65 6f 66 28 63 75 72 plet, sizeof(cur
bfe0: 72 5f 69 64 2d 3e 61 70 70 6c 65 74 29 29 3b 0a r_id->applet));.
bff0: 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 ....curr_id->cer
c000: 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 61 tificate_len = a
c010: 70 70 5f 63 75 72 72 2d 3e 6c 65 6e 67 74 68 3b pp_curr->length;
c020: 0a 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 .....curr_id->ce
c030: 72 74 69 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c rtificate = mall
c040: 6f 63 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 oc(curr_id->cert
c050: 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 ificate_len);...
c060: 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 69 64 2d .memcpy(curr_id-
c070: 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20 61 70 >certificate, ap
c080: 70 5f 63 75 72 72 2d 3e 76 61 6c 75 65 2c 20 63 p_curr->value, c
c090: 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 urr_id->certific
c0a0: 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 69 66 ate_len);.....if
c0b0: 20 28 6f 75 74 69 64 78 20 3e 3d 20 2a 63 6f 75 (outidx >= *cou
c0c0: 6e 74 29 20 7b 0a 09 09 09 09 69 66 20 28 63 65 nt) {.....if (ce
c0d0: 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 29 20 7b rts_resizable) {
c0e0: 0a 09 09 09 09 09 2a 63 6f 75 6e 74 20 2a 3d 20 ......*count *=
c0f0: 32 3b 0a 09 09 09 09 09 63 65 72 74 73 20 3d 20 2;......certs =
c100: 72 65 61 6c 6c 6f 63 28 63 65 72 74 73 2c 20 73 realloc(certs, s
c110: 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 izeof(*certs) *
c120: 28 2a 63 6f 75 6e 74 29 29 3b 0a 09 09 09 09 7d (*count));.....}
c130: 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 62 72 65 else {......bre
c140: 61 6b 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 09 ak;.....}....}..
c150: 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 .}....cackey_fre
c160: 65 5f 74 6c 76 28 61 70 70 5f 74 6c 76 29 3b 0a e_tlv(app_tlv);.
c170: 0a 09 09 69 66 20 28 6f 75 74 69 64 78 20 3e 3d ...if (outidx >=
c180: 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 09 09 62 72 *count) {....br
c190: 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 eak;...}..}...ca
c1a0: 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 63 63 ckey_free_tlv(cc
c1b0: 63 5f 74 6c 76 29 3b 0a 0a 09 2a 63 6f 75 6e 74 c_tlv);...*count
c1c0: 20 3d 20 6f 75 74 69 64 78 3b 0a 0a 09 69 66 20 = outidx;...if
c1d0: 28 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 (certs_resizable
c1e0: 29 20 7b 0a 09 09 63 65 72 74 73 20 3d 20 72 65 ) {...certs = re
c1f0: 61 6c 6c 6f 63 28 63 65 72 74 73 2c 20 73 69 7a alloc(certs, siz
c200: 65 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 28 2a eof(*certs) * (*
c210: 63 6f 75 6e 74 29 29 3b 0a 09 7d 0a 0a 09 2f 2a count));..}.../*
c220: 20 54 65 72 6d 69 6e 61 74 65 20 53 6d 61 72 74 Terminate Smart
c230: 43 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e Card Transaction
c240: 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f */..cackey_end_
c250: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 transaction(slot
c260: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 63 65 72 74 );...return(cert
c270: 73 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e s);.}../*. * SYN
c280: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e POSIS. * ...
c290: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 . *. * ARGUMENTS
c2a0: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 . * .... *.
c2b0: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 * RETURN VALUE.
c2c0: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 * .... *. *
c2d0: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e NOTES. * ...
c2e0: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 . *. */.static s
c2f0: 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 73 69 size_t cackey_si
c300: 67 6e 64 65 63 72 79 70 74 28 73 74 72 75 63 74 gndecrypt(struct
c310: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c cackey_slot *sl
c320: 6f 74 2c 20 73 74 72 75 63 74 20 63 61 63 6b 65 ot, struct cacke
c330: 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e y_identity *iden
c340: 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 tity, unsigned c
c350: 68 61 72 20 2a 62 75 66 2c 20 73 69 7a 65 5f 74 har *buf, size_t
c360: 20 62 75 66 6c 65 6e 2c 20 75 6e 73 69 67 6e 65 buflen, unsigne
c370: 64 20 63 68 61 72 20 2a 6f 75 74 62 75 66 2c 20 d char *outbuf,
c380: 73 69 7a 65 5f 74 20 6f 75 74 62 75 66 6c 65 6e size_t outbuflen
c390: 2c 20 69 6e 74 20 70 61 64 49 6e 70 75 74 2c 20 , int padInput,
c3a0: 69 6e 74 20 75 6e 70 61 64 4f 75 74 70 75 74 29 int unpadOutput)
c3b0: 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 {..unsigned cha
c3c0: 72 20 2a 74 6d 70 62 75 66 2c 20 2a 74 6d 70 62 r *tmpbuf, *tmpb
c3d0: 75 66 5f 73 2c 20 2a 6f 75 74 62 75 66 5f 73 3b uf_s, *outbuf_s;
c3e0: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 ..unsigned char
c3f0: 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 2c 20 70 bytes_to_send, p
c400: 31 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 1;..unsigned cha
c410: 72 20 62 6c 6f 63 6b 74 79 70 65 3b 0a 09 63 61 r blocktype;..ca
c420: 63 6b 65 79 5f 72 65 74 20 73 65 6e 64 5f 72 65 ckey_ret send_re
c430: 74 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73 t;..uint16_t res
c440: 70 63 6f 64 65 3b 0a 09 73 73 69 7a 65 5f 74 20 pcode;..ssize_t
c450: 72 65 74 76 61 6c 20 3d 20 30 2c 20 75 6e 70 61 retval = 0, unpa
c460: 64 6f 66 66 73 65 74 3b 0a 09 73 69 7a 65 5f 74 doffset;..size_t
c470: 20 74 6d 70 62 75 66 6c 65 6e 2c 20 70 61 64 6c tmpbuflen, padl
c480: 65 6e 2c 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e en, tmpoutbuflen
c490: 3b 0a 09 69 6e 74 20 66 72 65 65 5f 74 6d 70 62 ;..int free_tmpb
c4a0: 75 66 20 3d 20 30 3b 0a 09 69 6e 74 20 6c 65 3b uf = 0;..int le;
c4b0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
c4c0: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
c4d0: 29 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 20 3d 3d );...if (slot ==
c4e0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 NULL) {...CACKE
c4f0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
c500: 45 72 72 6f 72 2e 20 20 73 6c 6f 74 20 69 73 20 Error. slot is
c510: 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 NULL");....retur
c520: 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 n(-1);..}...if (
c530: 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 buf == NULL) {..
c540: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
c550: 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 62 75 INTF("Error. bu
c560: 66 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 f is NULL");....
c570: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a return(-1);..}..
c580: 09 69 66 20 28 6f 75 74 62 75 66 20 3d 3d 20 4e .if (outbuf == N
c590: 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f ULL) {...CACKEY_
c5a0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
c5b0: 72 6f 72 2e 20 20 6f 75 74 62 75 66 20 69 73 20 ror. outbuf is
c5c0: 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 NULL");....retur
c5d0: 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 n(-1);..}...if (
c5e0: 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55 4c 4c identity == NULL
c5f0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
c600: 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
c610: 2e 20 20 69 64 65 6e 74 69 74 79 20 69 73 20 4e . identity is N
c620: 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ULL");....return
c630: 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 69 (-1);..}...if (i
c640: 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 dentity->pcsc_id
c650: 65 6e 74 69 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 entity == NULL)
c660: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
c670: 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
c680: 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f identity->pcsc_
c690: 69 64 65 6e 74 69 74 79 20 69 73 20 4e 55 4c 4c identity is NULL
c6a0: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 ");....return(-1
c6b0: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 );..}.../* Deter
c6c0: 6d 69 6e 65 20 69 64 65 6e 74 69 74 79 20 4b 65 mine identity Ke
c6d0: 79 20 73 69 7a 65 20 2a 2f 0a 09 69 66 20 28 69 y size */..if (i
c6e0: 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 dentity->pcsc_id
c6f0: 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 entity->keysize
c700: 3c 20 30 29 20 7b 0a 09 09 69 64 65 6e 74 69 74 < 0) {...identit
c710: 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 y->pcsc_identity
c720: 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 78 35 30 39 ->keysize = x509
c730: 5f 74 6f 5f 6b 65 79 73 69 7a 65 28 69 64 65 6e _to_keysize(iden
c740: 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 tity->pcsc_ident
c750: 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 ity->certificate
c760: 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 , identity->pcsc
c770: 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 _identity->certi
c780: 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 7d 0a ficate_len);..}.
c790: 0a 09 2f 2a 20 50 61 64 20 6d 65 73 73 61 67 65 ../* Pad message
c7a0: 20 74 6f 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a to key size */.
c7b0: 09 69 66 20 28 70 61 64 49 6e 70 75 74 29 20 7b .if (padInput) {
c7c0: 0a 09 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d ...if (identity-
c7d0: 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e >pcsc_identity->
c7e0: 6b 65 79 73 69 7a 65 20 3e 20 30 29 20 7b 0a 09 keysize > 0) {..
c7f0: 09 09 69 66 20 28 62 75 66 6c 65 6e 20 21 3d 20 ..if (buflen !=
c800: 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 identity->pcsc_i
c810: 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 dentity->keysize
c820: 29 20 7b 0a 09 09 09 09 69 66 20 28 62 75 66 6c ) {.....if (bufl
c830: 65 6e 20 3e 20 28 69 64 65 6e 74 69 74 79 2d 3e en > (identity->
c840: 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b pcsc_identity->k
c850: 65 79 73 69 7a 65 20 2b 20 33 29 29 20 7b 0a 09 eysize + 3)) {..
c860: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
c870: 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
c880: 20 4d 65 73 73 61 67 65 20 69 73 20 74 6f 6f 20 Message is too
c890: 6c 61 72 67 65 20 74 6f 20 73 69 67 6e 2f 64 65 large to sign/de
c8a0: 63 72 79 70 74 22 29 3b 0a 0a 09 09 09 09 09 72 crypt");.......r
c8b0: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 09 7d eturn(-1);.....}
c8c0: 0a 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 ......tmpbuflen
c8d0: 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 = identity->pcsc
c8e0: 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 _identity->keysi
c8f0: 7a 65 3b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d ze;.....tmpbuf =
c900: 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 66 6c 65 malloc(tmpbufle
c910: 6e 29 3b 0a 09 09 09 09 66 72 65 65 5f 74 6d 70 n);.....free_tmp
c920: 62 75 66 20 3d 20 31 3b 0a 0a 09 09 09 09 70 61 buf = 1;......pa
c930: 64 6c 65 6e 20 3d 20 74 6d 70 62 75 66 6c 65 6e dlen = tmpbuflen
c940: 20 2d 20 62 75 66 6c 65 6e 20 2d 20 33 3b 0a 0a - buflen - 3;..
c950: 09 09 09 09 2f 2a 20 52 53 41 20 50 4b 43 53 23 ..../* RSA PKCS#
c960: 31 20 45 4d 53 41 2d 50 4b 43 53 31 2d 76 31 5f 1 EMSA-PKCS1-v1_
c970: 35 20 50 61 64 64 69 6e 67 20 2a 2f 0a 09 09 09 5 Padding */....
c980: 09 74 6d 70 62 75 66 5b 30 5d 20 3d 20 30 78 30 .tmpbuf[0] = 0x0
c990: 30 3b 0a 09 09 09 09 74 6d 70 62 75 66 5b 31 5d 0;.....tmpbuf[1]
c9a0: 20 3d 20 30 78 30 31 3b 0a 09 09 09 09 6d 65 6d = 0x01;.....mem
c9b0: 73 65 74 28 26 74 6d 70 62 75 66 5b 32 5d 2c 20 set(&tmpbuf[2],
c9c0: 30 78 46 46 2c 20 70 61 64 6c 65 6e 29 3b 0a 09 0xFF, padlen);..
c9d0: 09 09 09 74 6d 70 62 75 66 5b 70 61 64 6c 65 6e ...tmpbuf[padlen
c9e0: 20 2b 20 32 5d 3d 20 30 78 30 30 3b 0a 09 09 09 + 2]= 0x00;....
c9f0: 09 6d 65 6d 63 70 79 28 26 74 6d 70 62 75 66 5b .memcpy(&tmpbuf[
ca00: 70 61 64 6c 65 6e 20 2b 20 33 5d 2c 20 62 75 66 padlen + 3], buf
ca10: 2c 20 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 , buflen);......
ca20: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
ca30: 4e 54 42 55 46 28 22 55 6e 70 61 64 64 65 64 3a NTBUF("Unpadded:
ca40: 22 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b ", buf, buflen);
ca50: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
ca60: 47 5f 50 52 49 4e 54 42 55 46 28 22 50 61 64 64 G_PRINTBUF("Padd
ca70: 65 64 3a 22 2c 20 74 6d 70 62 75 66 2c 20 74 6d ed:", tmpbuf, tm
ca80: 70 62 75 66 6c 65 6e 29 3b 0a 09 09 09 7d 20 65 pbuflen);....} e
ca90: 6c 73 65 20 7b 0a 09 09 09 09 74 6d 70 62 75 66 lse {.....tmpbuf
caa0: 20 3d 20 62 75 66 3b 0a 09 09 09 09 74 6d 70 62 = buf;.....tmpb
cab0: 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a uflen = buflen;.
cac0: 09 09 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20 ....free_tmpbuf
cad0: 3d 20 30 3b 0a 09 09 09 09 70 61 64 6c 65 6e 20 = 0;.....padlen
cae0: 3d 20 30 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c = 0;....}...} el
caf0: 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 se {....CACKEY_D
cb00: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 EBUG_PRINTF("Una
cb10: 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 ble to determine
cb20: 20 6b 65 79 20 73 69 7a 65 2c 20 68 6f 70 69 6e key size, hopin
cb30: 67 20 74 68 65 20 6d 65 73 73 61 67 65 20 69 73 g the message is
cb40: 20 70 72 6f 70 65 72 6c 79 20 70 61 64 64 65 64 properly padded
cb50: 21 22 29 3b 0a 0a 09 09 09 74 6d 70 62 75 66 20 !");.....tmpbuf
cb60: 3d 20 62 75 66 3b 0a 09 09 09 74 6d 70 62 75 66 = buf;....tmpbuf
cb70: 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 09 09 len = buflen;...
cb80: 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 .free_tmpbuf = 0
cb90: 3b 0a 09 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b ;....padlen = 0;
cba0: 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 ...}..} else {..
cbb0: 09 74 6d 70 62 75 66 20 3d 20 62 75 66 3b 0a 09 .tmpbuf = buf;..
cbc0: 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 62 75 66 .tmpbuflen = buf
cbd0: 6c 65 6e 3b 0a 09 09 66 72 65 65 5f 74 6d 70 62 len;...free_tmpb
cbe0: 75 66 20 3d 20 30 3b 0a 09 09 70 61 64 6c 65 6e uf = 0;...padlen
cbf0: 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 65 = 0;..}.../* Be
cc00: 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 gin transaction
cc10: 2a 2f 0a 09 63 61 63 6b 65 79 5f 62 65 67 69 6e */..cackey_begin
cc20: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f _transaction(slo
cc30: 74 29 3b 0a 0a 09 2f 2a 20 53 65 6c 65 63 74 20 t);.../* Select
cc40: 63 6f 72 72 65 63 74 20 61 70 70 6c 65 74 20 2a correct applet *
cc50: 2f 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f /..CACKEY_DEBUG_
cc60: 50 52 49 4e 54 46 28 22 53 65 6c 65 63 74 69 6e PRINTF("Selectin
cc70: 67 20 61 70 70 6c 65 74 20 66 6f 75 6e 64 20 61 g applet found a
cc80: 74 20 25 70 20 2e 2e 2e 22 2c 20 69 64 65 6e 74 t %p ...", ident
cc90: 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 ity->pcsc_identi
cca0: 74 79 2d 3e 61 70 70 6c 65 74 29 3b 0a 09 63 61 ty->applet);..ca
ccb0: 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c ckey_select_appl
ccc0: 65 74 28 73 6c 6f 74 2c 20 69 64 65 6e 74 69 74 et(slot, identit
ccd0: 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 y->pcsc_identity
cce0: 2d 3e 61 70 70 6c 65 74 2c 20 73 69 7a 65 6f 66 ->applet, sizeof
ccf0: 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f (identity->pcsc_
cd00: 69 64 65 6e 74 69 74 79 2d 3e 61 70 70 6c 65 74 identity->applet
cd10: 29 29 3b 0a 0a 09 2f 2a 20 53 65 6c 65 63 74 20 ));.../* Select
cd20: 63 6f 72 72 65 63 74 20 66 69 6c 65 20 2a 2f 0a correct file */.
cd30: 09 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 .cackey_select_f
cd40: 69 6c 65 28 73 6c 6f 74 2c 20 69 64 65 6e 74 69 ile(slot, identi
cd50: 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 ty->pcsc_identit
cd60: 79 2d 3e 66 69 6c 65 29 3b 0a 0a 09 74 6d 70 62 y->file);...tmpb
cd70: 75 66 5f 73 20 3d 20 74 6d 70 62 75 66 3b 0a 09 uf_s = tmpbuf;..
cd80: 6f 75 74 62 75 66 5f 73 20 3d 20 6f 75 74 62 75 outbuf_s = outbu
cd90: 66 3b 0a 09 77 68 69 6c 65 20 28 74 6d 70 62 75 f;..while (tmpbu
cda0: 66 6c 65 6e 29 20 7b 0a 09 09 69 66 20 28 74 6d flen) {...if (tm
cdb0: 70 62 75 66 6c 65 6e 20 3e 20 32 34 35 29 20 7b pbuflen > 245) {
cdc0: 0a 09 09 09 62 79 74 65 73 5f 74 6f 5f 73 65 6e ....bytes_to_sen
cdd0: 64 20 3d 20 32 34 35 3b 0a 09 09 09 70 31 20 3d d = 245;....p1 =
cde0: 20 30 78 38 30 3b 0a 09 09 09 6c 65 20 3d 20 30 0x80;....le = 0
cdf0: 78 30 30 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a x00;...} else {.
ce00: 09 09 09 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 ...bytes_to_send
ce10: 20 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 09 = tmpbuflen;...
ce20: 09 70 31 20 3d 20 30 78 30 30 3b 0a 09 09 09 6c .p1 = 0x00;....l
ce30: 65 20 3d 20 30 78 30 30 3b 0a 09 09 7d 0a 0a 09 e = 0x00;...}...
ce40: 09 74 6d 70 6f 75 74 62 75 66 6c 65 6e 20 3d 20 .tmpoutbuflen =
ce50: 6f 75 74 62 75 66 6c 65 6e 3b 0a 0a 09 09 73 65 outbuflen;....se
ce60: 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f nd_ret = cackey_
ce70: 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 send_apdu(slot,
ce80: 47 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 GSCIS_CLASS_GLOB
ce90: 41 4c 5f 50 4c 41 54 46 4f 52 4d 2c 20 47 53 43 AL_PLATFORM, GSC
cea0: 49 53 5f 49 4e 53 54 52 5f 53 49 47 4e 44 45 43 IS_INSTR_SIGNDEC
ceb0: 52 59 50 54 2c 20 70 31 2c 20 30 78 30 30 2c 20 RYPT, p1, 0x00,
cec0: 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 2c 20 74 bytes_to_send, t
ced0: 6d 70 62 75 66 2c 20 6c 65 2c 20 26 72 65 73 70 mpbuf, le, &resp
cee0: 63 6f 64 65 2c 20 6f 75 74 62 75 66 2c 20 26 74 code, outbuf, &t
cef0: 6d 70 6f 75 74 62 75 66 6c 65 6e 29 3b 0a 09 09 mpoutbuflen);...
cf00: 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 if (send_ret !=
cf10: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b CACKEY_PCSC_S_OK
cf20: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 ) {....CACKEY_DE
cf30: 42 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55 BUG_PRINTF("ADPU
cf40: 20 53 65 6e 64 69 6e 67 20 46 61 69 6c 65 64 20 Sending Failed
cf50: 2d 2d 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 -- returning in
cf60: 65 72 72 6f 72 2e 22 29 3b 0a 0a 09 09 09 69 66 error.");.....if
cf70: 20 28 66 72 65 65 5f 74 6d 70 62 75 66 29 20 7b (free_tmpbuf) {
cf80: 0a 09 09 09 09 69 66 20 28 74 6d 70 62 75 66 5f .....if (tmpbuf_
cf90: 73 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28 74 s) {......free(t
cfa0: 6d 70 62 75 66 5f 73 29 3b 0a 09 09 09 09 7d 0a mpbuf_s);.....}.
cfb0: 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 45 6e 64 20 ...}...../* End
cfc0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 transaction */..
cfd0: 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 ..cackey_end_tra
cfe0: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a nsaction(slot);.
cff0: 0a 09 09 09 69 66 20 28 72 65 73 70 63 6f 64 65 ....if (respcode
d000: 20 3d 3d 20 30 78 36 39 38 32 29 20 7b 0a 09 09 == 0x6982) {...
d010: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
d020: 52 49 4e 54 46 28 22 53 65 63 75 72 69 74 79 20 RINTF("Security
d030: 73 74 61 74 75 73 20 6e 6f 74 20 73 61 74 69 73 status not satis
d040: 69 66 69 65 64 2e 20 20 52 65 74 75 72 6e 69 6e ified. Returnin
d050: 67 20 4e 45 45 44 4c 4f 47 49 4e 22 29 3b 0a 0a g NEEDLOGIN");..
d060: 09 09 09 09 73 6c 6f 74 2d 3e 73 6c 6f 74 5f 72 ....slot->slot_r
d070: 65 73 65 74 20 3d 20 31 3b 0a 09 09 09 09 73 6c eset = 1;.....sl
d080: 6f 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 ot->token_flags
d090: 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 = CKF_LOGIN_REQU
d0a0: 49 52 45 44 3b 0a 0a 09 09 09 09 72 65 74 75 72 IRED;......retur
d0b0: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f n(CACKEY_PCSC_E_
d0c0: 4e 45 45 44 4c 4f 47 49 4e 29 3b 0a 09 09 09 7d NEEDLOGIN);....}
d0d0: 0a 0a 09 09 09 69 66 20 28 73 65 6e 64 5f 72 65 .....if (send_re
d0e0: 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 t == CACKEY_PCSC
d0f0: 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20 _E_TOKENABSENT)
d100: 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 {.....CACKEY_DEB
d110: 55 47 5f 50 52 49 4e 54 46 28 22 54 6f 6b 65 6e UG_PRINTF("Token
d120: 20 61 62 73 65 6e 74 2e 20 20 52 65 74 75 72 6e absent. Return
d130: 69 6e 67 20 54 4f 4b 45 4e 41 42 53 45 4e 54 22 ing TOKENABSENT"
d140: 29 3b 0a 0a 09 09 09 09 73 6c 6f 74 2d 3e 73 6c );......slot->sl
d150: 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 09 ot_reset = 1;...
d160: 09 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f 66 6c ..slot->token_fl
d170: 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f ags = CKF_LOGIN_
d180: 52 45 51 55 49 52 45 44 3b 0a 0a 09 09 09 09 72 REQUIRED;......r
d190: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 eturn(CACKEY_PCS
d1a0: 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 C_E_TOKENABSENT)
d1b0: 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 75 72 ;....}.....retur
d1c0: 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 74 6d n(-1);...}....tm
d1d0: 70 62 75 66 20 2b 3d 20 62 79 74 65 73 5f 74 6f pbuf += bytes_to
d1e0: 5f 73 65 6e 64 3b 0a 09 09 74 6d 70 62 75 66 6c _send;...tmpbufl
d1f0: 65 6e 20 2d 3d 20 62 79 74 65 73 5f 74 6f 5f 73 en -= bytes_to_s
d200: 65 6e 64 3b 0a 0a 09 09 6f 75 74 62 75 66 20 2b end;....outbuf +
d210: 3d 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a = tmpoutbuflen;.
d220: 09 09 6f 75 74 62 75 66 6c 65 6e 20 2d 3d 20 74 ..outbuflen -= t
d230: 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 09 72 mpoutbuflen;...r
d240: 65 74 76 61 6c 20 2b 3d 20 74 6d 70 6f 75 74 62 etval += tmpoutb
d250: 75 66 6c 65 6e 3b 0a 09 7d 0a 0a 09 69 66 20 28 uflen;..}...if (
d260: 66 72 65 65 5f 74 6d 70 62 75 66 29 20 7b 0a 09 free_tmpbuf) {..
d270: 09 69 66 20 28 74 6d 70 62 75 66 5f 73 29 20 7b .if (tmpbuf_s) {
d280: 0a 09 09 09 66 72 65 65 28 74 6d 70 62 75 66 5f ....free(tmpbuf_
d290: 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6f 75 74 s);...}..}...out
d2a0: 62 75 66 20 3d 20 6f 75 74 62 75 66 5f 73 3b 0a buf = outbuf_s;.
d2b0: 0a 09 2f 2a 20 45 6e 64 20 74 72 61 6e 73 61 63 ../* End transac
d2c0: 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f tion */..cackey_
d2d0: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 end_transaction(
d2e0: 73 6c 6f 74 29 3b 0a 0a 23 69 66 64 65 66 20 43 slot);..#ifdef C
d2f0: 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23 ACKEY_PARANOID.#
d300: 20 20 69 66 64 65 66 20 5f 50 4f 53 49 58 5f 53 ifdef _POSIX_S
d310: 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28 6f 75 SIZE_MAX..if (ou
d320: 74 62 75 66 6c 65 6e 20 3e 20 5f 50 4f 53 49 58 tbuflen > _POSIX
d330: 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 _SSIZE_MAX) {...
d340: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
d350: 4e 54 46 28 22 4f 75 74 62 75 66 6c 65 6e 20 65 NTF("Outbuflen e
d360: 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 xceeds maximum v
d370: 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 alue, returning
d380: 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 in failure. (max
d390: 20 3d 20 25 6c 69 2c 20 6f 75 74 62 75 66 6c 65 = %li, outbufle
d3a0: 6e 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 n = %lu)", (long
d3b0: 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d ) _POSIX_SSIZE_M
d3c0: 41 58 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f AX, (unsigned lo
d3d0: 6e 67 29 20 6f 75 74 62 75 66 6c 65 6e 29 3b 0a ng) outbuflen);.
d3e0: 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 ...return(-1);..
d3f0: 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 }.# endif.#endi
d400: 66 0a 0a 09 2f 2a 20 55 6e 70 61 64 20 72 65 70 f.../* Unpad rep
d410: 6c 79 20 2a 2f 0a 09 69 66 20 28 75 6e 70 61 64 ly */..if (unpad
d420: 4f 75 74 70 75 74 29 20 7b 0a 09 09 69 66 20 28 Output) {...if (
d430: 72 65 74 76 61 6c 20 3c 20 33 29 20 7b 0a 09 09 retval < 3) {...
d440: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
d450: 49 4e 54 46 28 22 52 65 70 6c 79 20 69 73 20 74 INTF("Reply is t
d460: 6f 6f 20 73 6d 61 6c 6c 2c 20 77 65 20 61 72 65 oo small, we are
d470: 20 6e 6f 74 20 61 62 6c 65 20 74 6f 20 75 6e 70 not able to unp
d480: 61 64 20 2d 2d 20 70 61 73 73 69 6e 67 20 62 61 ad -- passing ba
d490: 63 6b 20 61 6e 64 20 68 6f 70 69 6e 67 20 66 6f ck and hoping fo
d4a0: 72 20 74 68 65 20 62 65 73 74 21 22 29 3b 0a 0a r the best!");..
d4b0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
d4c0: 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e PRINTF("Returnin
d4d0: 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72 65 g in success, re
d4e0: 74 76 61 6c 20 3d 20 25 6c 69 20 28 62 79 74 65 tval = %li (byte
d4f0: 73 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65 74 76 s)", (long) retv
d500: 61 6c 29 3b 0a 09 09 09 72 65 74 75 72 6e 28 72 al);....return(r
d510: 65 74 76 61 6c 29 3b 0a 09 09 7d 0a 0a 09 09 69 etval);...}....i
d520: 66 20 28 6f 75 74 62 75 66 5b 30 5d 20 21 3d 20 f (outbuf[0] !=
d530: 30 78 30 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 0x00) {....CACKE
d540: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
d550: 55 6e 72 65 63 6f 67 6e 69 7a 65 64 20 70 61 64 Unrecognized pad
d560: 64 69 6e 67 20 73 63 68 65 6d 65 20 2d 2d 20 70 ding scheme -- p
d570: 61 73 73 69 6e 67 20 62 61 63 6b 20 61 6e 64 20 assing back and
d580: 68 6f 70 69 6e 67 20 66 6f 72 20 74 68 65 20 62 hoping for the b
d590: 65 73 74 21 22 29 3b 0a 0a 09 09 09 43 41 43 4b est!");.....CACK
d5a0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
d5b0: 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 "Returning in su
d5c0: 63 63 65 73 73 2c 20 72 65 74 76 61 6c 20 3d 20 ccess, retval =
d5d0: 25 6c 69 20 28 62 79 74 65 73 29 22 2c 20 28 6c %li (bytes)", (l
d5e0: 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a 09 09 ong) retval);...
d5f0: 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b .return(retval);
d600: 0a 09 09 7d 0a 0a 09 09 62 6c 6f 63 6b 74 79 70 ...}....blocktyp
d610: 65 20 3d 20 6f 75 74 62 75 66 5b 31 5d 3b 0a 09 e = outbuf[1];..
d620: 09 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 30 .unpadoffset = 0
d630: 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 62 6c 6f ;....switch (blo
d640: 63 6b 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73 cktype) {....cas
d650: 65 20 30 78 30 30 3a 0a 09 09 09 09 2f 2a 20 50 e 0x00:...../* P
d660: 61 64 64 69 6e 67 20 53 63 68 65 6d 65 20 31 2c adding Scheme 1,
d670: 20 74 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d 7a the first non-z
d680: 65 72 6f 20 62 79 74 65 20 69 73 20 74 68 65 20 ero byte is the
d690: 73 74 61 72 74 20 6f 66 20 64 61 74 61 20 2a 2f start of data */
d6a0: 0a 09 09 09 09 66 6f 72 20 28 75 6e 70 61 64 6f .....for (unpado
d6b0: 66 66 73 65 74 20 3d 20 32 3b 20 75 6e 70 61 64 ffset = 2; unpad
d6c0: 6f 66 66 73 65 74 20 3c 20 72 65 74 76 61 6c 3b offset < retval;
d6d0: 20 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 29 20 unpadoffset++)
d6e0: 7b 0a 09 09 09 09 09 69 66 20 28 6f 75 74 62 75 {......if (outbu
d6f0: 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 21 f[unpadoffset] !
d700: 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 09 09 09 = 0x00) {.......
d710: 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 break;......}...
d720: 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 ..}.....break;..
d730: 09 09 63 61 73 65 20 30 78 30 31 3a 0a 09 09 09 ..case 0x01:....
d740: 09 2f 2a 20 50 61 64 64 69 6e 67 20 53 63 68 65 ./* Padding Sche
d750: 6d 65 20 32 2c 20 70 61 64 20 62 79 74 65 73 20 me 2, pad bytes
d760: 61 72 65 20 30 78 46 46 20 66 6f 6c 6c 6f 77 65 are 0xFF followe
d770: 64 20 62 79 20 30 78 30 30 20 2a 2f 0a 09 09 09 d by 0x00 */....
d780: 09 66 6f 72 20 28 75 6e 70 61 64 6f 66 66 73 65 .for (unpadoffse
d790: 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f 66 66 73 t = 2; unpadoffs
d7a0: 65 74 20 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70 et < retval; unp
d7b0: 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09 adoffset++) {...
d7c0: 09 09 09 69 66 20 28 6f 75 74 62 75 66 5b 75 6e ...if (outbuf[un
d7d0: 70 61 64 6f 66 66 73 65 74 5d 20 21 3d 20 30 78 padoffset] != 0x
d7e0: 46 46 29 20 7b 0a 09 09 09 09 09 09 69 66 20 28 FF) {.......if (
d7f0: 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 outbuf[unpadoffs
d800: 65 74 5d 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 et] == 0x00) {..
d810: 09 09 09 09 09 09 75 6e 70 61 64 6f 66 66 73 65 ......unpadoffse
d820: 74 2b 2b 3b 0a 0a 09 09 09 09 09 09 09 62 72 65 t++;.........bre
d830: 61 6b 3b 0a 09 09 09 09 09 09 7d 20 65 6c 73 65 ak;.......} else
d840: 20 7b 0a 09 09 09 09 09 09 09 43 41 43 4b 45 59 {........CACKEY
d850: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 _DEBUG_PRINTF("I
d860: 6e 76 61 6c 69 64 20 70 61 64 64 69 6e 67 20 64 nvalid padding d
d870: 61 74 61 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 ata found, retur
d880: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2c ning in failure,
d890: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 should have bee
d8a0: 6e 20 30 78 30 30 20 66 6f 75 6e 64 20 30 78 25 n 0x00 found 0x%
d8b0: 30 32 78 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 02x", (unsigned
d8c0: 69 6e 74 29 20 6f 75 74 62 75 66 5b 75 6e 70 61 int) outbuf[unpa
d8d0: 64 6f 66 66 73 65 74 5d 29 3b 0a 0a 09 09 09 09 doffset]);......
d8e0: 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 ...return(-1);..
d8f0: 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 20 65 6c .....}......} el
d900: 73 65 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 se {.......CACKE
d910: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
d920: 49 6e 76 61 6c 69 64 20 70 61 64 64 69 6e 67 20 Invalid padding
d930: 64 61 74 61 20 66 6f 75 6e 64 2c 20 72 65 74 75 data found, retu
d940: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 rning in failure
d950: 2c 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 , should have be
d960: 65 6e 20 30 78 46 46 20 66 6f 75 6e 64 20 30 78 en 0xFF found 0x
d970: 25 30 32 78 22 2c 20 28 75 6e 73 69 67 6e 65 64 %02x", (unsigned
d980: 20 69 6e 74 29 20 6f 75 74 62 75 66 5b 75 6e 70 int) outbuf[unp
d990: 61 64 6f 66 66 73 65 74 5d 29 3b 0a 0a 09 09 09 adoffset]);.....
d9a0: 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 ...return(-1);..
d9b0: 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 09 ....}.....}.....
d9c0: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 break;....case 0
d9d0: 78 30 32 3a 0a 09 09 09 09 2f 2a 20 50 61 64 64 x02:...../* Padd
d9e0: 69 6e 67 20 53 63 68 65 6d 65 20 33 2c 20 70 61 ing Scheme 3, pa
d9f0: 64 20 62 79 74 65 73 20 61 72 65 20 6e 6f 6e 2d d bytes are non-
da00: 7a 65 72 6f 20 66 69 72 73 74 20 7a 65 72 6f 20 zero first zero
da10: 62 79 74 65 20 66 6f 75 6e 64 20 69 73 20 74 68 byte found is th
da20: 65 20 73 65 70 65 72 61 74 6f 72 20 62 79 74 65 e seperator byte
da30: 20 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75 6e 70 */.....for (unp
da40: 61 64 6f 66 66 73 65 74 20 3d 20 32 3b 20 75 6e adoffset = 2; un
da50: 70 61 64 6f 66 66 73 65 74 20 3c 20 72 65 74 76 padoffset < retv
da60: 61 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 2b al; unpadoffset+
da70: 2b 29 20 7b 0a 09 09 09 09 09 69 66 20 28 6f 75 +) {......if (ou
da80: 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 tbuf[unpadoffset
da90: 5d 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 ] == 0x00) {....
daa0: 09 09 09 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b ...unpadoffset++
dab0: 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a ;........break;.
dac0: 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 .....}.....}....
dad0: 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 .break;...}....i
dae0: 66 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3e f (unpadoffset >
daf0: 20 72 65 74 76 61 6c 29 20 7b 0a 09 09 09 43 41 retval) {....CA
db00: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
db10: 46 28 22 4f 66 66 73 65 74 20 67 72 65 61 74 65 F("Offset greate
db20: 72 20 74 68 61 6e 20 72 65 70 6c 79 20 73 69 7a r than reply siz
db30: 65 2c 20 61 62 6f 72 74 69 6e 67 2e 20 20 28 75 e, aborting. (u
db40: 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 25 6c 75 npadoffset = %lu
db50: 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c 75 29 22 , retval = %lu)"
db60: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
db70: 29 20 75 6e 70 61 64 6f 66 66 73 65 74 2c 20 28 ) unpadoffset, (
db80: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72 unsigned long) r
db90: 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 etval);.....retu
dba0: 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 43 rn(-1);...}....C
dbb0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
dbc0: 54 42 55 46 28 22 50 61 64 64 65 64 3a 22 2c 20 TBUF("Padded:",
dbd0: 6f 75 74 62 75 66 2c 20 72 65 74 76 61 6c 29 3b outbuf, retval);
dbe0: 0a 0a 09 09 72 65 74 76 61 6c 20 2d 3d 20 75 6e ....retval -= un
dbf0: 70 61 64 6f 66 66 73 65 74 3b 0a 09 09 6d 65 6d padoffset;...mem
dc00: 6d 6f 76 65 28 6f 75 74 62 75 66 2c 20 6f 75 74 move(outbuf, out
dc10: 62 75 66 20 2b 20 75 6e 70 61 64 6f 66 66 73 65 buf + unpadoffse
dc20: 74 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 43 t, retval);....C
dc30: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
dc40: 54 42 55 46 28 22 55 6e 70 61 64 64 65 64 3a 22 TBUF("Unpadded:"
dc50: 2c 20 6f 75 74 62 75 66 2c 20 72 65 74 76 61 6c , outbuf, retval
dc60: 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b 45 59 5f );..}....CACKEY_
dc70: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
dc80: 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 turning in succe
dc90: 73 73 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c 69 ss, retval = %li
dca0: 20 28 62 79 74 65 73 29 22 2c 20 28 6c 6f 6e 67 (bytes)", (long
dcb0: 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 ) retval);...ret
dcc0: 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a urn(retval);.}..
dcd0: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 /*. * SYNPOSIS.
dce0: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 * .... *. *
dcf0: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 ARGUMENTS. *
dd00: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 .... *. * RETUR
dd10: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e N VALUE. * .
dd20: 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 ... *. * NOTES.
dd30: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f * .... *. */
dd40: 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 .static cackey_r
dd50: 65 74 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 et cackey_login(
dd60: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c struct cackey_sl
dd70: 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e ot *slot, unsign
dd80: 65 64 20 63 68 61 72 20 2a 70 69 6e 2c 20 75 6e ed char *pin, un
dd90: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 70 69 6e 5f signed long pin_
dda0: 6c 65 6e 2c 20 69 6e 74 20 2a 74 72 69 65 73 5f len, int *tries_
ddb0: 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 remaining_p) {..
ddc0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 61 unsigned char ca
ddd0: 63 5f 70 69 6e 5b 38 5d 20 3d 20 7b 30 78 46 46 c_pin[8] = {0xFF
dde0: 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 , 0xFF, 0xFF, 0x
ddf0: 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 FF, 0xFF, 0xFF,
de00: 30 78 46 46 2c 20 30 78 46 46 7d 3b 0a 09 75 69 0xFF, 0xFF};..ui
de10: 6e 74 31 36 5f 74 20 72 65 73 70 6f 6e 73 65 5f nt16_t response_
de20: 63 6f 64 65 3b 0a 09 69 6e 74 20 74 72 69 65 73 code;..int tries
de30: 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 69 6e 74 _remaining;..int
de40: 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 2f 2a 20 send_ret;.../*
de50: 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 77 65 Indicate that we
de60: 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 61 62 6f do not know abo
de70: 75 74 20 68 6f 77 20 6d 61 6e 79 20 74 72 69 65 ut how many trie
de80: 73 20 61 72 65 20 72 65 6d 61 69 6e 69 6e 67 20 s are remaining
de90: 2a 2f 0a 09 69 66 20 28 74 72 69 65 73 5f 72 65 */..if (tries_re
dea0: 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 09 2a maining_p) {...*
deb0: 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f tries_remaining_
dec0: 70 20 3d 20 2d 31 3b 0a 09 7d 0a 0a 09 2f 2a 20 p = -1;..}.../*
ded0: 41 70 70 61 72 65 6e 74 6c 79 2c 20 43 41 43 20 Apparently, CAC
dee0: 50 49 4e 73 20 61 72 65 20 2a 45 58 41 43 54 4c PINs are *EXACTL
def0: 59 2a 20 38 20 62 79 74 65 73 20 6c 6f 6e 67 20 Y* 8 bytes long
df00: 2d 2d 20 70 61 64 20 77 69 74 68 20 30 78 46 46 -- pad with 0xFF
df10: 20 69 66 20 74 6f 6f 20 73 68 6f 72 74 20 2a 2f if too short */
df20: 0a 09 69 66 20 28 70 69 6e 5f 6c 65 6e 20 3e 3d ..if (pin_len >=
df30: 20 38 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28 63 8) {...memcpy(c
df40: 61 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 38 29 3b ac_pin, pin, 8);
df50: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d 65 6d ..} else {...mem
df60: 63 70 79 28 63 61 63 5f 70 69 6e 2c 20 70 69 6e cpy(cac_pin, pin
df70: 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a , pin_len);..}..
df80: 09 2f 2a 20 49 73 73 75 65 20 50 49 4e 20 56 65 ./* Issue PIN Ve
df90: 72 69 66 79 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 rify */..send_re
dfa0: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f t = cackey_send_
dfb0: 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 apdu(slot, GSCIS
dfc0: 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 _CLASS_ISO7816,
dfd0: 47 53 43 49 53 5f 49 4e 53 54 52 5f 56 45 52 49 GSCIS_INSTR_VERI
dfe0: 46 59 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 FY, 0x00, 0x00,
dff0: 73 69 7a 65 6f 66 28 63 61 63 5f 70 69 6e 29 2c sizeof(cac_pin),
e000: 20 63 61 63 5f 70 69 6e 2c 20 30 78 30 30 2c 20 cac_pin, 0x00,
e010: 26 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 2c 20 &response_code,
e020: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 NULL, NULL);..if
e030: 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 (send_ret != CA
e040: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 CKEY_PCSC_S_OK)
e050: 7b 0a 09 09 69 66 20 28 28 72 65 73 70 6f 6e 73 {...if ((respons
e060: 65 5f 63 6f 64 65 20 26 20 30 78 36 33 43 30 29 e_code & 0x63C0)
e070: 20 3d 3d 20 30 78 36 33 43 30 29 20 7b 0a 09 09 == 0x63C0) {...
e080: 09 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 .tries_remaining
e090: 20 3d 20 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 = (response_cod
e0a0: 65 20 26 20 30 78 46 29 3b 0a 0a 09 09 09 43 41 e & 0xF);.....CA
e0b0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
e0c0: 46 28 22 50 49 4e 20 56 65 72 69 66 69 63 61 74 F("PIN Verificat
e0d0: 69 6f 6e 20 66 61 69 6c 65 64 2c 20 25 69 20 74 ion failed, %i t
e0e0: 72 69 65 73 20 72 65 6d 61 69 6e 69 6e 67 22 2c ries remaining",
e0f0: 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 tries_remaining
e100: 29 3b 0a 0a 09 09 09 69 66 20 28 74 72 69 65 73 );.....if (tries
e110: 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a _remaining_p) {.
e120: 09 09 09 09 2a 74 72 69 65 73 5f 72 65 6d 61 69 ....*tries_remai
e130: 6e 69 6e 67 5f 70 20 3d 20 74 72 69 65 73 5f 72 ning_p = tries_r
e140: 65 6d 61 69 6e 69 6e 67 3b 0a 09 09 09 7d 0a 0a emaining;....}..
e150: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 ...return(CACKEY
e160: 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b _PCSC_E_BADPIN);
e170: 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72 65 73 70 ...}....if (resp
e180: 6f 6e 73 65 5f 63 6f 64 65 20 3d 3d 20 30 78 36 onse_code == 0x6
e190: 39 38 33 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 983) {....CACKEY
e1a0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 _DEBUG_PRINTF("P
e1b0: 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20 IN Verification
e1c0: 66 61 69 6c 65 64 2c 20 64 65 76 69 63 65 20 69 failed, device i
e1d0: 73 20 6c 6f 63 6b 65 64 22 29 3b 0a 0a 09 09 09 s locked");.....
e1e0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 return(CACKEY_PC
e1f0: 53 43 5f 45 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09 SC_E_LOCKED);...
e200: 7d 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b }....return(CACK
e210: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 EY_PCSC_E_GENERI
e220: 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f C);..}...CACKEY_
e230: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49 DEBUG_PRINTF("PI
e240: 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20 73 N Verification s
e250: 75 63 63 65 65 64 65 64 22 29 3b 0a 0a 09 72 65 ucceeded");...re
e260: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 turn(CACKEY_PCSC
e270: 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a _S_OK);.}../*. *
e280: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 SYNPOSIS. *
e290: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d .... *. * ARGUM
e2a0: 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a ENTS. * ....
e2b0: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c *. * RETURN VAL
e2c0: 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a UE. * .... *
e2d0: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 . * NOTES. *
e2e0: 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 .... *. */.stat
e2f0: 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 ic cackey_ret ca
e300: 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 ckey_token_prese
e310: 6e 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 nt(struct cackey
e320: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 _slot *slot) {..
e330: 63 61 63 6b 65 79 5f 72 65 74 20 70 63 73 63 5f cackey_ret pcsc_
e340: 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 44 57 connect_ret;..DW
e350: 4f 52 44 20 72 65 61 64 65 72 5f 6c 65 6e 2c 20 ORD reader_len,
e360: 73 74 61 74 65 2c 20 70 72 6f 74 6f 63 6f 6c 2c state, protocol,
e370: 20 61 74 72 5f 6c 65 6e 3b 0a 09 42 59 54 45 20 atr_len;..BYTE
e380: 61 74 72 5b 4d 41 58 5f 41 54 52 5f 53 49 5a 45 atr[MAX_ATR_SIZE
e390: 5d 3b 0a 09 4c 4f 4e 47 20 73 74 61 74 75 73 5f ];..LONG status_
e3a0: 72 65 74 2c 20 73 63 61 72 64 5f 72 65 63 6f 6e ret, scard_recon
e3b0: 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f n_ret;...CACKEY_
e3c0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
e3d0: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 70 63 73 63 5f lled.");...pcsc_
e3e0: 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 connect_ret = ca
e3f0: 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 ckey_connect_car
e400: 64 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28 70 63 d(slot);..if (pc
e410: 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 sc_connect_ret !
e420: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f = CACKEY_PCSC_S_
e430: 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 OK) {...CACKEY_D
e440: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 EBUG_PRINTF("Una
e450: 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74 ble to connect t
e460: 6f 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e o card, returnin
e470: 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 22 29 g token absent")
e480: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b ;....return(CACK
e490: 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 EY_PCSC_E_TOKENA
e4a0: 42 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 61 74 72 BSENT);..}...atr
e4b0: 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 61 74 _len = sizeof(at
e4c0: 72 29 3b 0a 09 73 74 61 74 75 73 5f 72 65 74 20 r);..status_ret
e4d0: 3d 20 53 43 61 72 64 53 74 61 74 75 73 28 73 6c = SCardStatus(sl
e4e0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 4e ot->pcsc_card, N
e4f0: 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f 6c 65 6e ULL, &reader_len
e500: 2c 20 26 73 74 61 74 65 2c 20 26 70 72 6f 74 6f , &state, &proto
e510: 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74 72 5f 6c col, atr, &atr_l
e520: 65 6e 29 3b 0a 09 69 66 20 28 73 74 61 74 75 73 en);..if (status
e530: 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f _ret != SCARD_S_
e540: 53 55 43 43 45 53 53 29 20 7b 0a 09 09 73 6c 6f SUCCESS) {...slo
e550: 74 2d 3e 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 t->slot_reset =
e560: 31 3b 0a 09 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e 1;...slot->token
e570: 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 _flags = CKF_LOG
e580: 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 0a 09 09 IN_REQUIRED;....
e590: 69 66 20 28 73 74 61 74 75 73 5f 72 65 74 20 3d if (status_ret =
e5a0: 3d 20 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f = SCARD_W_RESET_
e5b0: 43 41 52 44 29 20 7b 0a 09 09 09 43 41 43 4b 45 CARD) {....CACKE
e5c0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
e5d0: 52 65 73 65 74 20 72 65 71 75 69 72 65 64 2c 20 Reset required,
e5e0: 70 6c 65 61 73 65 20 68 6f 6c 64 2e 2e 2e 22 29 please hold...")
e5f0: 3b 0a 0a 09 09 09 73 63 61 72 64 5f 72 65 63 6f ;.....scard_reco
e600: 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 52 65 nn_ret = SCardRe
e610: 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 connect(slot->pc
e620: 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 53 sc_card, SCARD_S
e630: 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41 HARE_SHARED, SCA
e640: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20 RD_PROTOCOL_T0,
e650: 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52 44 SCARD_RESET_CARD
e660: 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 , &protocol);...
e670: 09 69 66 20 28 73 63 61 72 64 5f 72 65 63 6f 6e .if (scard_recon
e680: 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 n_ret == SCARD_S
e690: 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09 _SUCCESS) {.....
e6a0: 2f 2a 20 52 65 2d 65 73 74 61 62 6c 69 73 68 20 /* Re-establish
e6b0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 transaction, if
e6c0: 69 74 20 77 61 73 20 70 72 65 73 65 6e 74 20 2a it was present *
e6d0: 2f 0a 09 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e /.....if (slot->
e6e0: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 transaction_dept
e6f0: 68 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 73 6c h > 0) {......sl
e700: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f ot->transaction_
e710: 64 65 70 74 68 2d 2d 3b 0a 09 09 09 09 09 63 61 depth--;......ca
e720: 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 ckey_begin_trans
e730: 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09 action(slot);...
e740: 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f ..}......CACKEY_
e750: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
e760: 73 65 74 20 73 75 63 63 65 73 73 66 75 6c 2c 20 set successful,
e770: 72 65 71 75 65 72 79 69 6e 67 22 29 3b 0a 09 09 requerying");...
e780: 09 09 73 74 61 74 75 73 5f 72 65 74 20 3d 20 53 ..status_ret = S
e790: 43 61 72 64 53 74 61 74 75 73 28 73 6c 6f 74 2d CardStatus(slot-
e7a0: 3e 70 63 73 63 5f 63 61 72 64 2c 20 4e 55 4c 4c >pcsc_card, NULL
e7b0: 2c 20 26 72 65 61 64 65 72 5f 6c 65 6e 2c 20 26 , &reader_len, &
e7c0: 73 74 61 74 65 2c 20 26 70 72 6f 74 6f 63 6f 6c state, &protocol
e7d0: 2c 20 61 74 72 2c 20 26 61 74 72 5f 6c 65 6e 29 , atr, &atr_len)
e7e0: 3b 0a 09 09 09 09 69 66 20 28 73 74 61 74 75 73 ;.....if (status
e7f0: 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f _ret != SCARD_S_
e800: 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09 09 SUCCESS) {......
e810: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
e820: 4e 54 46 28 22 53 74 69 6c 6c 20 75 6e 61 62 6c NTF("Still unabl
e830: 65 20 74 6f 20 71 75 65 72 79 20 63 61 72 64 20 e to query card
e840: 73 74 61 74 75 73 2c 20 72 65 74 75 72 6e 69 6e status, returnin
e850: 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20 g token absent.
e860: 20 53 43 61 72 64 53 74 61 74 75 73 28 29 20 3d SCardStatus() =
e870: 20 25 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 %s", CACKEY_DEB
e880: 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 UG_FUNC_SCARDERR
e890: 5f 54 4f 5f 53 54 52 28 73 74 61 74 75 73 5f 72 _TO_STR(status_r
e8a0: 65 74 29 29 3b 0a 0a 09 09 09 09 09 72 65 74 75 et));.......retu
e8b0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 rn(CACKEY_PCSC_E
e8c0: 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 _TOKENABSENT);..
e8d0: 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 7b ...}....} else {
e8e0: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
e8f0: 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 G_PRINTF("Unable
e900: 20 74 6f 20 72 65 63 6f 6e 6e 65 63 74 20 74 6f to reconnect to
e910: 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 card, returning
e920: 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 token absent.
e930: 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 SCardReconnect()
e940: 20 3d 20 25 73 22 2c 20 43 41 43 4b 45 59 5f 44 = %s", CACKEY_D
e950: 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 EBUG_FUNC_SCARDE
e960: 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f RR_TO_STR(scard_
e970: 72 65 63 6f 6e 6e 5f 72 65 74 29 29 3b 0a 0a 09 reconn_ret));...
e980: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 ...return(CACKEY
e990: 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 _PCSC_E_TOKENABS
e9a0: 45 4e 54 29 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 ENT);....}...} e
e9b0: 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f lse {....CACKEY_
e9c0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e DEBUG_PRINTF("Un
e9d0: 61 62 6c 65 20 74 6f 20 71 75 65 72 79 20 63 61 able to query ca
e9e0: 72 64 20 73 74 61 74 75 73 2c 20 72 65 74 75 72 rd status, retur
e9f0: 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e ning token absen
ea00: 74 2e 20 20 53 43 61 72 64 53 74 61 74 75 73 28 t. SCardStatus(
ea10: 29 20 3d 20 25 73 22 2c 20 43 41 43 4b 45 59 5f ) = %s", CACKEY_
ea20: 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 DEBUG_FUNC_SCARD
ea30: 45 52 52 5f 54 4f 5f 53 54 52 28 73 74 61 74 75 ERR_TO_STR(statu
ea40: 73 5f 72 65 74 29 29 3b 0a 0a 09 09 09 72 65 74 s_ret));.....ret
ea50: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f urn(CACKEY_PCSC_
ea60: 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a E_TOKENABSENT);.
ea70: 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 28 73 74 ..}..}...if ((st
ea80: 61 74 65 20 26 20 53 43 41 52 44 5f 41 42 53 45 ate & SCARD_ABSE
ea90: 4e 54 29 20 3d 3d 20 53 43 41 52 44 5f 41 42 53 NT) == SCARD_ABS
eaa0: 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f ENT) {...CACKEY_
eab0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
eac0: 72 64 20 69 73 20 61 62 73 65 6e 74 2c 20 72 65 rd is absent, re
ead0: 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 turning token ab
eae0: 73 65 6e 74 22 29 3b 0a 0a 09 09 72 65 74 75 72 sent");....retur
eaf0: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f n(CACKEY_PCSC_E_
eb00: 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 7d TOKENABSENT);..}
eb10: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
eb20: 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e PRINTF("Returnin
eb30: 67 20 74 6f 6b 65 6e 20 70 72 65 73 65 6e 74 2e g token present.
eb40: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 ");...return(CAC
eb50: 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e KEY_PCSC_S_TOKEN
eb60: 50 52 45 53 45 4e 54 29 3b 0a 7d 0a 0a 2f 2a 0a PRESENT);.}../*.
eb70: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 * SYNPOSIS. *
eb80: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 .... *. * ARG
eb90: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e UMENTS. * ..
eba0: 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 .. *. * RETURN V
ebb0: 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a ALUE. * ....
ebc0: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 *. * NOTES. *
ebd0: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 .... *. */.st
ebe0: 61 74 69 63 20 73 73 69 7a 65 5f 74 20 63 61 63 atic ssize_t cac
ebf0: 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 key_pcsc_identit
ec00: 79 5f 74 6f 5f 6c 61 62 65 6c 28 73 74 72 75 63 y_to_label(struc
ec10: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 t cackey_pcsc_id
ec20: 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79 entity *identity
ec30: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 , unsigned char
ec40: 2a 6c 61 62 65 6c 5f 62 75 66 2c 20 75 6e 73 69 *label_buf, unsi
ec50: 67 6e 65 64 20 6c 6f 6e 67 20 6c 61 62 65 6c 5f gned long label_
ec60: 62 75 66 5f 6c 65 6e 29 20 7b 0a 09 75 6e 73 69 buf_len) {..unsi
ec70: 67 6e 65 64 20 6c 6f 6e 67 20 63 65 72 74 69 66 gned long certif
ec80: 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 63 68 61 72 icate_len;..char
ec90: 20 2a 6c 61 62 65 6c 5f 61 73 6e 31 3b 0a 09 76 *label_asn1;..v
eca0: 6f 69 64 20 2a 63 65 72 74 69 66 69 63 61 74 65 oid *certificate
ecb0: 3b 0a 09 69 6e 74 20 78 35 30 39 5f 72 65 61 64 ;..int x509_read
ecc0: 5f 72 65 74 3b 0a 0a 09 63 65 72 74 69 66 69 63 _ret;...certific
ecd0: 61 74 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e ate = identity->
ece0: 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 63 65 certificate;..ce
ecf0: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 rtificate_len =
ed00: 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 identity->certif
ed10: 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09 69 66 20 icate_len;...if
ed20: 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e (certificate_len
ed30: 20 3c 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e < 0) {...return
ed40: 28 2d 31 29 3b 0a 09 7d 0a 0a 09 78 35 30 39 5f (-1);..}...x509_
ed50: 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f read_ret = x509_
ed60: 74 6f 5f 73 75 62 6a 65 63 74 28 63 65 72 74 69 to_subject(certi
ed70: 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 ficate, certific
ed80: 61 74 65 5f 6c 65 6e 2c 20 28 76 6f 69 64 20 2a ate_len, (void *
ed90: 2a 29 20 26 6c 61 62 65 6c 5f 61 73 6e 31 29 3b *) &label_asn1);
eda0: 0a 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f ..if (x509_read_
edb0: 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 72 65 74 ret < 0) {...ret
edc0: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 78 35 urn(-1);..}...x5
edd0: 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 09_read_ret = x5
ede0: 30 39 5f 64 6e 5f 74 6f 5f 73 74 72 69 6e 67 28 09_dn_to_string(
edf0: 6c 61 62 65 6c 5f 61 73 6e 31 2c 20 78 35 30 39 label_asn1, x509
ee00: 5f 72 65 61 64 5f 72 65 74 2c 20 28 63 68 61 72 _read_ret, (char
ee10: 20 2a 29 20 6c 61 62 65 6c 5f 62 75 66 2c 20 6c *) label_buf, l
ee20: 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 2c 20 22 43 abel_buf_len, "C
ee30: 4e 22 29 3b 0a 09 69 66 20 28 78 35 30 39 5f 72 N");..if (x509_r
ee40: 65 61 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a ead_ret <= 0) {.
ee50: 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 ..x509_read_ret
ee60: 3d 20 78 35 30 39 5f 64 6e 5f 74 6f 5f 73 74 72 = x509_dn_to_str
ee70: 69 6e 67 28 6c 61 62 65 6c 5f 61 73 6e 31 2c 20 ing(label_asn1,
ee80: 78 35 30 39 5f 72 65 61 64 5f 72 65 74 2c 20 28 x509_read_ret, (
ee90: 63 68 61 72 20 2a 29 20 6c 61 62 65 6c 5f 62 75 char *) label_bu
eea0: 66 2c 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e f, label_buf_len
eeb0: 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 09 69 66 20 28 , NULL);....if (
eec0: 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 3d x509_read_ret <=
eed0: 20 30 29 20 7b 0a 09 09 09 72 65 74 75 72 6e 28 0) {....return(
eee0: 2d 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 -1);...}..}..#if
eef0: 64 65 66 20 43 41 43 4b 45 59 5f 50 41 52 41 4e def CACKEY_PARAN
ef00: 4f 49 44 0a 23 20 20 69 66 64 65 66 20 5f 50 4f OID.# ifdef _PO
ef10: 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69 SIX_SSIZE_MAX..i
ef20: 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 f (x509_read_ret
ef30: 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f > _POSIX_SSIZE_
ef40: 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f MAX) {...CACKEY_
ef50: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 78 35 DEBUG_PRINTF("x5
ef60: 30 39 5f 72 65 61 64 5f 72 65 74 20 65 78 63 65 09_read_ret exce
ef70: 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 eds maximum valu
ef80: 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 e, returning in
ef90: 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20 failure. (max =
efa0: 25 6c 69 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 %li, x509_read_r
efb0: 65 74 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e et = %lu)", (lon
efc0: 67 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f g) _POSIX_SSIZE_
efd0: 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c MAX, (unsigned l
efe0: 6f 6e 67 29 20 78 35 30 39 5f 72 65 61 64 5f 72 ong) x509_read_r
eff0: 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d et);....return(-
f000: 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69 66 0a 1);..}.# endif.
f010: 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e 28 #endif...return(
f020: 78 35 30 39 5f 72 65 61 64 5f 72 65 74 29 3b 0a x509_read_ret);.
f030: 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30 20 }../* Returns 0
f040: 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 73 74 on success */.st
f050: 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f atic int cackey_
f060: 6d 75 74 65 78 5f 63 72 65 61 74 65 28 76 6f 69 mutex_create(voi
f070: 64 20 2a 2a 6d 75 74 65 78 29 20 7b 0a 09 70 74 d **mutex) {..pt
f080: 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70 hread_mutex_t *p
f090: 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69 thread_mutex;..i
f0a0: 6e 74 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 nt pthread_retva
f0b0: 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74 6f 6d l;..CK_RV custom
f0c0: 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 _retval;...CACKE
f0d0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
f0e0: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 Called.");...if
f0f0: 28 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c ((cackey_args.fl
f100: 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 ags & CKF_OS_LOC
f110: 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f KING_OK) == CKF_
f120: 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b OS_LOCKING_OK) {
f130: 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 ...pthread_mutex
f140: 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 = malloc(sizeof
f150: 28 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29 (*pthread_mutex)
f160: 29 3b 0a 09 09 69 66 20 28 21 70 74 68 72 65 61 );...if (!pthrea
f170: 64 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09 43 41 d_mutex) {....CA
f180: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
f190: 46 28 22 46 61 69 6c 65 64 20 74 6f 20 61 6c 6c F("Failed to all
f1a0: 6f 63 61 74 65 20 6d 65 6d 6f 72 79 2e 22 29 3b ocate memory.");
f1b0: 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b .....return(-1);
f1c0: 0a 09 09 7d 0a 0a 09 09 70 74 68 72 65 61 64 5f ...}....pthread_
f1d0: 72 65 74 76 61 6c 20 3d 20 70 74 68 72 65 61 64 retval = pthread
f1e0: 5f 6d 75 74 65 78 5f 69 6e 69 74 28 70 74 68 72 _mutex_init(pthr
f1f0: 65 61 64 5f 6d 75 74 65 78 2c 20 4e 55 4c 4c 29 ead_mutex, NULL)
f200: 3b 0a 09 09 69 66 20 28 70 74 68 72 65 61 64 5f ;...if (pthread_
f210: 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 retval != 0) {..
f220: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
f230: 52 49 4e 54 46 28 22 70 74 68 72 65 61 64 5f 6d RINTF("pthread_m
f240: 75 74 65 78 5f 69 6e 69 74 28 29 20 72 65 74 75 utex_init() retu
f250: 72 6e 65 64 20 65 72 72 6f 72 20 28 25 69 29 2e rned error (%i).
f260: 22 2c 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 ", pthread_retva
f270: 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d l);.....return(-
f280: 31 29 3b 0a 09 09 7d 0a 0a 09 09 2a 6d 75 74 65 1);...}....*mute
f290: 78 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65 x = pthread_mute
f2a0: 78 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 x;..} else {...i
f2b0: 66 20 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 f (cackey_args.C
f2c0: 72 65 61 74 65 4d 75 74 65 78 29 20 7b 0a 09 09 reateMutex) {...
f2d0: 09 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d .custom_retval =
f2e0: 20 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 cackey_args.Cre
f2f0: 61 74 65 4d 75 74 65 78 28 6d 75 74 65 78 29 3b ateMutex(mutex);
f300: 0a 0a 09 09 09 69 66 20 28 63 75 73 74 6f 6d 5f .....if (custom_
f310: 72 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b retval != CKR_OK
f320: 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 ) {.....CACKEY_D
f330: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63 EBUG_PRINTF("cac
f340: 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d key_args.CreateM
f350: 75 74 65 78 28 29 20 72 65 74 75 72 6e 65 64 20 utex() returned
f360: 65 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28 error (%li).", (
f370: 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65 74 long) custom_ret
f380: 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 val);......retur
f390: 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a n(-1);....}...}.
f3a0: 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 .}...CACKEY_DEBU
f3b0: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
f3c0: 69 6e 67 20 73 75 63 65 73 73 66 75 6c 6c 79 20 ing sucessfully
f3d0: 28 30 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 (0)");...return(
f3e0: 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 0);.}../* Return
f3f0: 73 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20 2a s 0 on success *
f400: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 /.static int cac
f410: 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 76 key_mutex_lock(v
f420: 6f 69 64 20 2a 6d 75 74 65 78 29 20 7b 0a 09 70 oid *mutex) {..p
f430: 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a thread_mutex_t *
f440: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 pthread_mutex;..
f450: 69 6e 74 20 70 74 68 72 65 61 64 5f 72 65 74 76 int pthread_retv
f460: 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74 6f al;..CK_RV custo
f470: 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b m_retval;...CACK
f480: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
f490: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 "Called.");...if
f4a0: 20 28 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 ((cackey_args.f
f4b0: 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f lags & CKF_OS_LO
f4c0: 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 CKING_OK) == CKF
f4d0: 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 _OS_LOCKING_OK)
f4e0: 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65 {...pthread_mute
f4f0: 78 20 3d 20 6d 75 74 65 78 3b 0a 0a 09 09 70 74 x = mutex;....pt
f500: 68 72 65 61 64 5f 72 65 74 76 61 6c 20 3d 20 70 hread_retval = p
f510: 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 thread_mutex_loc
f520: 6b 28 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29 k(pthread_mutex)
f530: 3b 0a 09 09 69 66 20 28 70 74 68 72 65 61 64 5f ;...if (pthread_
f540: 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 retval != 0) {..
f550: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
f560: 52 49 4e 54 46 28 22 70 74 68 72 65 61 64 5f 6d RINTF("pthread_m
f570: 75 74 65 78 5f 6c 6f 63 6b 28 29 20 72 65 74 75 utex_lock() retu
f580: 72 6e 65 64 20 65 72 72 6f 72 20 28 25 69 29 2e rned error (%i).
f590: 22 2c 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 ", pthread_retva
f5a0: 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d l);.....return(-
f5b0: 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 1);...}..} else
f5c0: 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 61 {...if (cackey_a
f5d0: 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 29 20 7b rgs.LockMutex) {
f5e0: 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65 74 76 61 ....custom_retva
f5f0: 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72 67 73 2e l = cackey_args.
f600: 4c 6f 63 6b 4d 75 74 65 78 28 6d 75 74 65 78 29 LockMutex(mutex)
f610: 3b 0a 0a 09 09 09 69 66 20 28 63 75 73 74 6f 6d ;.....if (custom
f620: 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f _retval != CKR_O
f630: 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f K) {.....CACKEY_
f640: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61 DEBUG_PRINTF("ca
f650: 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 ckey_args.LockMu
f660: 74 65 78 28 29 20 72 65 74 75 72 6e 65 64 20 65 tex() returned e
f670: 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c rror (%li).", (l
f680: 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65 74 76 ong) custom_retv
f690: 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e al);......return
f6a0: 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 (-1);....}...}..
f6b0: 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 }...CACKEY_DEBUG
f6c0: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
f6d0: 6e 67 20 73 75 63 65 73 73 66 75 6c 6c 79 20 28 ng sucessfully (
f6e0: 30 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 0)");...return(0
f6f0: 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 );.}../* Returns
f700: 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f 0 on success */
f710: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b .static int cack
f720: 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 ey_mutex_unlock(
f730: 76 6f 69 64 20 2a 6d 75 74 65 78 29 20 7b 0a 09 void *mutex) {..
f740: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 pthread_mutex_t
f750: 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a *pthread_mutex;.
f760: 09 69 6e 74 20 70 74 68 72 65 61 64 5f 72 65 74 .int pthread_ret
f770: 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74 val;..CK_RV cust
f780: 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 om_retval;...CAC
f790: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
f7a0: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 ("Called.");...i
f7b0: 66 20 28 28 63 61 63 6b 65 79 5f 61 72 67 73 2e f ((cackey_args.
f7c0: 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c flags & CKF_OS_L
f7d0: 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b OCKING_OK) == CK
f7e0: 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 F_OS_LOCKING_OK)
f7f0: 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74 {...pthread_mut
f800: 65 78 20 3d 20 6d 75 74 65 78 3b 0a 0a 09 09 70 ex = mutex;....p
f810: 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 3d 20 thread_retval =
f820: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e pthread_mutex_un
f830: 6c 6f 63 6b 28 70 74 68 72 65 61 64 5f 6d 75 74 lock(pthread_mut
f840: 65 78 29 3b 0a 09 09 69 66 20 28 70 74 68 72 65 ex);...if (pthre
f850: 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 ad_retval != 0)
f860: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {....CACKEY_DEBU
f870: 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72 65 61 G_PRINTF("pthrea
f880: 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 29 d_mutex_unlock()
f890: 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 returned error
f8a0: 28 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f (%i).", pthread_
f8b0: 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 retval);.....ret
f8c0: 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 20 urn(-1);...}..}
f8d0: 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 63 61 63 else {...if (cac
f8e0: 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d key_args.UnlockM
f8f0: 75 74 65 78 29 20 7b 0a 09 09 09 63 75 73 74 6f utex) {....custo
f900: 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 m_retval = cacke
f910: 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 y_args.UnlockMut
f920: 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09 09 69 ex(mutex);.....i
f930: 66 20 28 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c f (custom_retval
f940: 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 != CKR_OK) {...
f950: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
f960: 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 61 72 RINTF("cackey_ar
f970: 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 28 29 gs.UnlockMutex()
f980: 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 returned error
f990: 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 (%li).", (long)
f9a0: 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a custom_retval);.
f9b0: 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b .....return(-1);
f9c0: 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 ....}...}..}...C
f9d0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
f9e0: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 73 75 TF("Returning su
f9f0: 63 65 73 73 66 75 6c 6c 79 20 28 30 29 22 29 3b cessfully (0)");
fa00: 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a ...return(0);.}.
fa10: 0a 73 74 61 74 69 63 20 43 4b 5f 41 54 54 52 49 .static CK_ATTRI
fa20: 42 55 54 45 5f 50 54 52 20 63 61 63 6b 65 79 5f BUTE_PTR cackey_
fa30: 67 65 74 5f 61 74 74 72 69 62 75 74 65 73 28 43 get_attributes(C
fa40: 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 6f K_OBJECT_CLASS o
fa50: 62 6a 65 63 74 63 6c 61 73 73 2c 20 73 74 72 75 bjectclass, stru
fa60: 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 ct cackey_pcsc_i
fa70: 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 dentity *identit
fa80: 79 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 y, unsigned long
fa90: 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 2c 20 43 identity_num, C
faa0: 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 43 K_ULONG_PTR pulC
fab0: 6f 75 6e 74 29 20 7b 0a 09 73 74 61 74 69 63 20 ount) {..static
fac0: 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 74 72 75 65 CK_BBOOL ck_true
fad0: 20 3d 20 31 3b 0a 09 73 74 61 74 69 63 20 43 4b = 1;..static CK
fae0: 5f 42 42 4f 4f 4c 20 63 6b 5f 66 61 6c 73 65 20 _BBOOL ck_false
faf0: 3d 20 30 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 6e = 0;..CK_ULONG n
fb00: 75 6d 61 74 74 72 73 20 3d 20 30 2c 20 72 65 74 umattrs = 0, ret
fb10: 76 61 6c 5f 63 6f 75 6e 74 3b 0a 09 43 4b 5f 41 val_count;..CK_A
fb20: 54 54 52 49 42 55 54 45 5f 54 59 50 45 20 63 75 TTRIBUTE_TYPE cu
fb30: 72 72 5f 61 74 74 72 5f 74 79 70 65 3b 0a 09 43 rr_attr_type;..C
fb40: 4b 5f 41 54 54 52 49 42 55 54 45 20 63 75 72 72 K_ATTRIBUTE curr
fb50: 5f 61 74 74 72 2c 20 2a 72 65 74 76 61 6c 3b 0a _attr, *retval;.
fb60: 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 56 61 .CK_VOID_PTR pVa
fb70: 6c 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 lue;..CK_ULONG u
fb80: 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 43 4b 5f 4f lValueLen;..CK_O
fb90: 42 4a 45 43 54 5f 43 4c 41 53 53 20 63 6b 5f 6f BJECT_CLASS ck_o
fba0: 62 6a 65 63 74 5f 63 6c 61 73 73 3b 0a 09 43 4b bject_class;..CK
fbb0: 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 _CERTIFICATE_TYP
fbc0: 45 20 63 6b 5f 63 65 72 74 69 66 69 63 61 74 65 E ck_certificate
fbd0: 5f 74 79 70 65 3b 0a 09 43 4b 5f 4b 45 59 5f 54 _type;..CK_KEY_T
fbe0: 59 50 45 20 63 6b 5f 6b 65 79 5f 74 79 70 65 3b YPE ck_key_type;
fbf0: 0a 09 43 4b 5f 55 54 46 38 43 48 41 52 20 75 63 ..CK_UTF8CHAR uc
fc00: 54 6d 70 42 75 66 5b 31 30 32 34 5d 3b 0a 09 75 TmpBuf[1024];..u
fc10: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 nsigned char *ce
fc20: 72 74 69 66 69 63 61 74 65 3b 0a 09 73 73 69 7a rtificate;..ssiz
fc30: 65 5f 74 20 63 65 72 74 69 66 69 63 61 74 65 5f e_t certificate_
fc40: 6c 65 6e 20 3d 20 2d 31 2c 20 78 35 30 39 5f 72 len = -1, x509_r
fc50: 65 61 64 5f 72 65 74 3b 0a 09 69 6e 74 20 70 56 ead_ret;..int pV
fc60: 61 6c 75 65 5f 66 72 65 65 3b 0a 0a 09 43 41 43 alue_free;...CAC
fc70: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
fc80: 28 22 43 61 6c 6c 65 64 20 28 6f 62 6a 65 63 74 ("Called (object
fc90: 43 6c 61 73 73 20 3d 20 25 6c 75 2c 20 69 64 65 Class = %lu, ide
fca0: 6e 74 69 74 79 5f 6e 75 6d 20 3d 20 25 6c 75 29 ntity_num = %lu)
fcb0: 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f .", (unsigned lo
fcc0: 6e 67 29 20 6f 62 6a 65 63 74 63 6c 61 73 73 2c ng) objectclass,
fcd0: 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 29 3b 0a identity_num);.
fce0: 0a 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 ..if (objectclas
fcf0: 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 s != CKO_CERTIFI
fd00: 43 41 54 45 20 26 26 20 6f 62 6a 65 63 74 63 6c CATE && objectcl
fd10: 61 73 73 20 21 3d 20 43 4b 4f 5f 50 55 42 4c 49 ass != CKO_PUBLI
fd20: 43 5f 4b 45 59 20 26 26 20 6f 62 6a 65 63 74 63 C_KEY && objectc
fd30: 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 52 49 56 lass != CKO_PRIV
fd40: 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 43 41 43 ATE_KEY) {...CAC
fd50: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
fd60: 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20 6f 62 ("Returning 0 ob
fd70: 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20 69 6e jects (NULL), in
fd80: 76 61 6c 69 64 20 6f 62 6a 65 63 74 20 63 6c 61 valid object cla
fd90: 73 73 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 ss");....return(
fda0: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 47 NULL);..}.../* G
fdb0: 65 74 20 43 65 72 74 20 2a 2f 0a 09 69 66 20 28 et Cert */..if (
fdc0: 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55 4c 4c identity == NULL
fdd0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
fde0: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
fdf0: 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28 ning 0 objects (
fe00: 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69 64 20 69 NULL), invalid i
fe10: 64 65 6e 74 69 79 20 70 72 6f 76 69 64 65 64 22 dentiy provided"
fe20: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c );....return(NUL
fe30: 4c 29 3b 0a 09 7d 0a 0a 09 63 65 72 74 69 66 69 L);..}...certifi
fe40: 63 61 74 65 20 3d 20 69 64 65 6e 74 69 74 79 2d cate = identity-
fe50: 3e 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 63 >certificate;..c
fe60: 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d ertificate_len =
fe70: 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 identity->certi
fe80: 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09 69 66 ficate_len;...if
fe90: 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 (certificate_le
fea0: 6e 20 3d 3d 20 2d 31 20 7c 7c 20 63 65 72 74 69 n == -1 || certi
feb0: 66 69 63 61 74 65 20 3d 3d 20 4e 55 4c 4c 29 20 ficate == NULL)
fec0: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
fed0: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
fee0: 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 ng 0 objects (NU
fef0: 4c 4c 29 2c 20 74 68 69 73 20 69 64 65 6e 74 69 LL), this identi
ff00: 74 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 ty does not have
ff10: 20 61 6e 20 58 2e 35 30 39 20 63 65 72 74 69 66 an X.509 certif
ff20: 69 63 61 74 65 20 61 73 73 6f 63 69 61 74 65 64 icate associated
ff30: 20 77 69 74 68 20 69 74 20 61 6e 64 20 77 69 6c with it and wil
ff40: 6c 20 6e 6f 74 20 77 6f 72 6b 22 29 3b 0a 0a 09 l not work");...
ff50: 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 .return(NULL);..
ff60: 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 79 20 74 68 }.../* Verify th
ff70: 61 74 20 63 65 72 74 69 66 69 63 61 74 65 20 69 at certificate i
ff80: 73 20 41 53 4e 2e 31 20 65 6e 63 6f 64 65 64 20 s ASN.1 encoded
ff90: 58 2e 35 30 39 20 63 65 72 74 69 66 69 63 61 74 X.509 certificat
ffa0: 65 20 2a 2f 0a 09 69 66 20 28 78 35 30 39 5f 74 e */..if (x509_t
ffb0: 6f 5f 73 65 72 69 61 6c 28 63 65 72 74 69 66 69 o_serial(certifi
ffc0: 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 cate, certificat
ffd0: 65 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 20 3c 20 30 e_len, NULL) < 0
ffe0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
fff0: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
10000 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28 ning 0 objects (
10010 4e 55 4c 4c 29 2c 20 74 68 65 20 58 2e 35 30 39 NULL), the X.509
10020 20 63 65 72 74 69 66 69 63 61 74 65 20 61 73 73 certificate ass
10030 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 ociated with thi
10040 73 20 69 64 65 6e 74 69 74 79 20 69 73 20 6e 6f s identity is no
10050 74 20 76 61 6c 69 64 22 29 3b 0a 0a 09 09 72 65 t valid");....re
10060 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a turn(NULL);..}..
10070 09 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 3d 20 .retval_count =
10080 31 36 3b 0a 09 72 65 74 76 61 6c 20 3d 20 6d 61 16;..retval = ma
10090 6c 6c 6f 63 28 72 65 74 76 61 6c 5f 63 6f 75 6e lloc(retval_coun
100a0 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74 76 t * sizeof(*retv
100b0 61 6c 29 29 3b 0a 0a 09 66 6f 72 20 28 63 75 72 al));...for (cur
100c0 72 5f 61 74 74 72 5f 74 79 70 65 20 3d 20 30 3b r_attr_type = 0;
100d0 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20 curr_attr_type
100e0 3c 20 30 78 63 65 35 33 36 33 35 66 3b 20 63 75 < 0xce53635f; cu
100f0 72 72 5f 61 74 74 72 5f 74 79 70 65 2b 2b 29 20 rr_attr_type++)
10100 7b 0a 09 09 69 66 20 28 63 75 72 72 5f 61 74 74 {...if (curr_att
10110 72 5f 74 79 70 65 20 3d 3d 20 30 78 38 30 30 29 r_type == 0x800)
10120 20 7b 0a 09 09 09 63 75 72 72 5f 61 74 74 72 5f {....curr_attr_
10130 74 79 70 65 20 3d 20 30 78 63 65 35 33 36 33 30 type = 0xce53630
10140 30 3b 0a 09 09 7d 0a 0a 09 09 70 56 61 6c 75 65 0;...}....pValue
10150 5f 66 72 65 65 20 3d 20 30 3b 0a 09 09 70 56 61 _free = 0;...pVa
10160 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 75 6c lue = NULL;...ul
10170 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c ValueLen = (CK_L
10180 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 73 77 69 74 ONG) -1;....swit
10190 63 68 20 28 63 75 72 72 5f 61 74 74 72 5f 74 79 ch (curr_attr_ty
101a0 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20 43 4b pe) {....case CK
101b0 41 5f 43 4c 41 53 53 3a 0a 09 09 09 09 43 41 43 A_CLASS:.....CAC
101c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
101d0 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 ("Requesting att
101e0 72 69 62 75 74 65 20 43 4b 41 5f 43 4c 41 53 53 ribute CKA_CLASS
101f0 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c (0x%08lx) ...",
10200 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
10210 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 curr_attr_type)
10220 3b 0a 0a 09 09 09 09 63 6b 5f 6f 62 6a 65 63 74 ;......ck_object
10230 5f 63 6c 61 73 73 20 3d 20 6f 62 6a 65 63 74 63 _class = objectc
10240 6c 61 73 73 3b 0a 0a 09 09 09 09 70 56 61 6c 75 lass;......pValu
10250 65 20 3d 20 26 63 6b 5f 6f 62 6a 65 63 74 5f 63 e = &ck_object_c
10260 6c 61 73 73 3b 0a 09 09 09 09 75 6c 56 61 6c 75 lass;.....ulValu
10270 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b eLen = sizeof(ck
10280 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 29 3b 0a _object_class);.
10290 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
102a0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 G_PRINTF(" ... r
102b0 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 eturning %lu (%p
102c0 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 /%lu)", (unsigne
102d0 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 4f 42 d long) *((CK_OB
102e0 4a 45 43 54 5f 43 4c 41 53 53 20 2a 29 20 70 56 JECT_CLASS *) pV
102f0 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 alue), pValue, (
10300 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 unsigned long) u
10310 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 lValueLen);.....
10320 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 .break;....case
10330 43 4b 41 5f 54 4f 4b 45 4e 3a 0a 09 09 09 09 43 CKA_TOKEN:.....C
10340 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
10350 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 TF("Requesting a
10360 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 4f 4b ttribute CKA_TOK
10370 45 4e 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e EN (0x%08lx) ...
10380 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e ", (unsigned lon
10390 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 g) curr_attr_typ
103a0 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 e);......pValue
103b0 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 = &ck_true;.....
103c0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a ulValueLen = siz
103d0 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 eof(ck_true);...
103e0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
103f0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 PRINTF(" ... ret
10400 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 urning %lu (%p/%
10410 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 lu)", (unsigned
10420 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f long) *((CK_BBOO
10430 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 L *) pValue), pV
10440 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 alue, (unsigned
10450 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e long) ulValueLen
10460 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 );......break;..
10470 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 49 46 ..case CKA_MODIF
10480 49 41 42 4c 45 3a 0a 09 09 09 09 43 41 43 4b 45 IABLE:.....CACKE
10490 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
104a0 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 Requesting attri
104b0 62 75 74 65 20 43 4b 41 5f 4d 4f 44 49 46 49 41 bute CKA_MODIFIA
104c0 42 4c 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e BLE (0x%08lx) ..
104d0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f .", (unsigned lo
104e0 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 ng) curr_attr_ty
104f0 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 pe);......pValue
10500 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 = &ck_false;...
10510 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 ..ulValueLen = s
10520 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b izeof(ck_false);
10530 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 ......CACKEY_DEB
10540 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 UG_PRINTF(" ...
10550 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 returning %lu (%
10560 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e p/%lu)", (unsign
10570 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 ed long) *((CK_B
10580 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c BOOL *) pValue),
10590 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e pValue, (unsign
105a0 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 ed long) ulValue
105b0 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b Len);......break
105c0 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4c 41 ;....case CKA_LA
105d0 42 45 4c 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f BEL:.....CACKEY_
105e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
105f0 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 questing attribu
10600 74 65 20 43 4b 41 5f 4c 41 42 45 4c 20 28 30 78 te CKA_LABEL (0x
10610 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e %08lx) ...", (un
10620 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 signed long) cur
10630 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 r_attr_type);...
10640 09 09 09 2f 2a 20 58 58 58 3a 20 44 65 74 65 72 .../* XXX: Deter
10650 6d 69 6e 65 20 6e 61 6d 65 20 2a 2f 0a 09 09 09 mine name */....
10660 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 6e .ulValueLen = sn
10670 70 72 69 6e 74 66 28 75 63 54 6d 70 42 75 66 2c printf(ucTmpBuf,
10680 20 73 69 7a 65 6f 66 28 75 63 54 6d 70 42 75 66 sizeof(ucTmpBuf
10690 29 2c 20 22 49 64 65 6e 74 69 74 79 20 23 25 6c ), "Identity #%l
106a0 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f u", (unsigned lo
106b0 6e 67 29 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d ng) identity_num
106c0 29 3b 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 );.....pValue =
106d0 75 63 54 6d 70 42 75 66 3b 0a 0a 09 09 09 09 69 ucTmpBuf;......i
106e0 66 20 28 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d f (ulValueLen >=
106f0 20 73 69 7a 65 6f 66 28 75 63 54 6d 70 42 75 66 sizeof(ucTmpBuf
10700 29 29 20 7b 0a 09 09 09 09 09 75 6c 56 61 6c 75 )) {......ulValu
10710 65 4c 65 6e 20 3d 20 30 3b 0a 09 09 09 09 09 70 eLen = 0;......p
10720 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 Value = NULL;...
10730 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f ..}......CACKEY_
10740 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e DEBUG_PRINTF(" .
10750 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70 .. returning (%p
10760 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 /%lu)", pValue,
10770 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
10780 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 ulValueLen);....
10790 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 ..break;....case
107a0 20 43 4b 41 5f 56 41 4c 55 45 3a 0a 09 09 09 09 CKA_VALUE:.....
107b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
107c0 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 NTF("Requesting
107d0 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 56 41 attribute CKA_VA
107e0 4c 55 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e LUE (0x%08lx) ..
107f0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f .", (unsigned lo
10800 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 ng) curr_attr_ty
10810 70 65 29 3b 0a 0a 09 09 09 09 73 77 69 74 63 68 pe);......switch
10820 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 29 20 7b (objectclass) {
10830 0a 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 50 ......case CKO_P
10840 52 49 56 41 54 45 5f 4b 45 59 3a 0a 09 09 09 09 RIVATE_KEY:.....
10850 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
10860 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 RINTF(" ... but
10870 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 not getting it b
10880 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20 ecause we are a
10890 70 72 69 76 61 74 65 20 6b 65 79 2e 22 29 3b 0a private key.");.
108a0 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 .......break;...
108b0 09 09 09 63 61 73 65 20 43 4b 4f 5f 50 55 42 4c ...case CKO_PUBL
108c0 49 43 5f 4b 45 59 3a 0a 09 09 09 09 09 09 2f 2a IC_KEY:......./*
108d0 20 58 58 58 3a 20 54 4f 44 4f 20 2a 2f 0a 0a 09 XXX: TODO */...
108e0 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 .....break;.....
108f0 09 63 61 73 65 20 43 4b 4f 5f 43 45 52 54 49 46 .case CKO_CERTIF
10900 49 43 41 54 45 3a 0a 09 09 09 09 09 09 70 56 61 ICATE:.......pVa
10910 6c 75 65 20 3d 20 63 65 72 74 69 66 69 63 61 74 lue = certificat
10920 65 3b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 e;.......ulValue
10930 4c 65 6e 20 3d 20 63 65 72 74 69 66 69 63 61 74 Len = certificat
10940 65 5f 6c 65 6e 3b 0a 0a 09 09 09 09 09 09 62 72 e_len;........br
10950 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 eak;.....}......
10960 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
10970 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e NTF(" ... return
10980 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 ing %p/%lu", pVa
10990 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c lue, (unsigned l
109a0 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 ong) ulValueLen)
109b0 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 ;......break;...
109c0 09 63 61 73 65 20 43 4b 41 5f 49 53 53 55 45 52 .case CKA_ISSUER
109d0 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 :.....CACKEY_DEB
109e0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 UG_PRINTF("Reque
109f0 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 sting attribute
10a00 43 4b 41 5f 49 53 53 55 45 52 20 28 30 78 25 30 CKA_ISSUER (0x%0
10a10 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 8lx) ...", (unsi
10a20 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f gned long) curr_
10a30 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 attr_type);.....
10a40 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 .if (objectclass
10a50 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 != CKO_CERTIFIC
10a60 41 54 45 29 20 7b 0a 09 09 09 09 09 43 41 43 4b ATE) {......CACK
10a70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
10a80 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 " ... but not ge
10a90 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 tting it because
10aa0 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65 we are not a ce
10ab0 72 74 69 66 69 63 61 74 65 2e 22 29 3b 0a 0a 09 rtificate.");...
10ac0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d ....break;.....}
10ad0 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74 69 66 ......if (certif
10ae0 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 icate_len >= 0)
10af0 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65 61 64 {......x509_read
10b00 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 69 _ret = x509_to_i
10b10 73 73 75 65 72 28 63 65 72 74 69 66 69 63 61 74 ssuer(certificat
10b20 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c e, certificate_l
10b30 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 en, &pValue);...
10b40 09 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 ...if (x509_read
10b50 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 _ret < 0) {.....
10b60 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b ..pValue = NULL;
10b70 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 ......} else {..
10b80 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 .....ulValueLen
10b90 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b = x509_read_ret;
10ba0 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 ......}.....}...
10bb0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
10bc0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 PRINTF(" ... ret
10bd0 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 urning %p/%lu",
10be0 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 pValue, (unsigne
10bf0 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c d long) ulValueL
10c00 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b en);......break;
10c10 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53 45 52 ....case CKA_SER
10c20 49 41 4c 5f 4e 55 4d 42 45 52 3a 0a 09 09 09 09 IAL_NUMBER:.....
10c30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
10c40 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 NTF("Requesting
10c50 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 45 attribute CKA_SE
10c60 52 49 41 4c 5f 4e 55 4d 42 45 52 20 28 30 78 25 RIAL_NUMBER (0x%
10c70 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 08lx) ...", (uns
10c80 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 igned long) curr
10c90 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 _attr_type);....
10ca0 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 ..if (objectclas
10cb0 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 s != CKO_CERTIFI
10cc0 43 41 54 45 29 20 7b 0a 09 09 09 09 09 43 41 43 CATE) {......CAC
10cd0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
10ce0 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 (" ... but not g
10cf0 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 etting it becaus
10d00 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 63 e we are not a c
10d10 65 72 74 69 66 69 63 61 74 65 2e 22 29 3b 0a 0a ertificate.");..
10d20 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 .....break;.....
10d30 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74 69 }......if (certi
10d40 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 ficate_len >= 0)
10d50 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65 61 {......x509_rea
10d60 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f d_ret = x509_to_
10d70 73 65 72 69 61 6c 28 63 65 72 74 69 66 69 63 61 serial(certifica
10d80 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f te, certificate_
10d90 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 len, &pValue);..
10da0 09 09 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 ....if (x509_rea
10db0 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 d_ret < 0) {....
10dc0 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c ...pValue = NULL
10dd0 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a ;......} else {.
10de0 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e ......ulValueLen
10df0 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 = x509_read_ret
10e00 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a ;......}.....}..
10e10 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
10e20 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 _PRINTF(" ... re
10e30 74 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 turning (%p/%lu)
10e40 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 ", pValue, (unsi
10e50 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c gned long) ulVal
10e60 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 ueLen);......bre
10e70 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f ak;....case CKA_
10e80 53 55 42 4a 45 43 54 3a 0a 09 09 09 09 43 41 43 SUBJECT:.....CAC
10e90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
10ea0 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 ("Requesting att
10eb0 72 69 62 75 74 65 20 43 4b 41 5f 53 55 42 4a 45 ribute CKA_SUBJE
10ec0 43 54 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e CT (0x%08lx) ...
10ed0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e ", (unsigned lon
10ee0 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 g) curr_attr_typ
10ef0 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a e);......if (obj
10f00 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f ectclass != CKO_
10f10 43 45 52 54 49 46 49 43 41 54 45 29 20 7b 0a 09 CERTIFICATE) {..
10f20 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
10f30 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 _PRINTF(" ... bu
10f40 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 t not getting it
10f50 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 because we are
10f60 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63 61 74 not a certificat
10f70 65 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 e.");.......brea
10f80 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 k;.....}......if
10f90 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 (certificate_le
10fa0 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 n >= 0) {......x
10fb0 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 509_read_ret = x
10fc0 35 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74 28 63 509_to_subject(c
10fd0 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 ertificate, cert
10fe0 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 ificate_len, &pV
10ff0 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28 alue);......if (
11000 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 x509_read_ret <
11010 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 0) {.......pValu
11020 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d e = NULL;......}
11030 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c else {.......ul
11040 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f ValueLen = x509_
11050 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d read_ret;......}
11060 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b .....}......CACK
11070 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
11080 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 " ... returning
11090 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c %p/%lu", pValue,
110a0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
110b0 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 ulValueLen);...
110c0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 ...break;....cas
110d0 65 20 43 4b 41 5f 49 44 3a 0a 09 09 09 09 43 41 e CKA_ID:.....CA
110e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
110f0 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 F("Requesting at
11100 74 72 69 62 75 74 65 20 43 4b 41 5f 49 44 20 28 tribute CKA_ID (
11110 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 0x%08lx) ...", (
11120 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 unsigned long) c
11130 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a urr_attr_type);.
11140 0a 09 09 09 09 75 63 54 6d 70 42 75 66 5b 30 5d .....ucTmpBuf[0]
11150 20 3d 20 28 28 69 64 65 6e 74 69 74 79 5f 6e 75 = ((identity_nu
11160 6d 20 2b 20 31 29 20 3e 3e 20 38 29 20 26 20 30 m + 1) >> 8) & 0
11170 78 66 66 3b 0a 09 09 09 09 75 63 54 6d 70 42 75 xff;.....ucTmpBu
11180 66 5b 31 5d 20 3d 20 20 28 69 64 65 6e 74 69 74 f[1] = (identit
11190 79 5f 6e 75 6d 20 2b 20 31 29 20 26 20 30 78 66 y_num + 1) & 0xf
111a0 66 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d f;......pValue =
111b0 20 26 75 63 54 6d 70 42 75 66 3b 0a 09 09 09 09 &ucTmpBuf;.....
111c0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 32 3b 0a ulValueLen = 2;.
111d0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
111e0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 G_PRINTF(" ... r
111f0 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 eturning %p/%lu"
11200 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 , pValue, (unsig
11210 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 ned long) ulValu
11220 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 eLen);......brea
11230 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43 k;....case CKA_C
11240 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 3a ERTIFICATE_TYPE:
11250 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
11260 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 G_PRINTF("Reques
11270 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 ting attribute C
11280 4b 41 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 KA_CERTIFICATE_T
11290 59 50 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e YPE (0x%08lx) ..
112a0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f .", (unsigned lo
112b0 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 ng) curr_attr_ty
112c0 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 pe);......if (ob
112d0 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f jectclass != CKO
112e0 5f 43 45 52 54 49 46 49 43 41 54 45 29 20 7b 0a _CERTIFICATE) {.
112f0 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
11300 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 G_PRINTF(" ... b
11310 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 ut not getting i
11320 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 t because we are
11330 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63 61 not a certifica
11340 74 65 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 te.");.......bre
11350 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f ak;.....}....../
11360 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 * We only suppor
11370 74 20 6f 6e 65 20 63 65 72 74 69 66 69 63 61 74 t one certificat
11380 65 20 74 79 70 65 20 2a 2f 0a 09 09 09 09 63 6b e type */.....ck
11390 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74 79 70 _certificate_typ
113a0 65 20 3d 20 43 4b 43 5f 58 5f 35 30 39 3b 0a 0a e = CKC_X_509;..
113b0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b ....pValue = &ck
113c0 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74 79 70 _certificate_typ
113d0 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 e;.....ulValueLe
113e0 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 63 65 n = sizeof(ck_ce
113f0 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 29 3b rtificate_type);
11400 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 ......CACKEY_DEB
11410 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 UG_PRINTF(" ...
11420 72 65 74 75 72 6e 69 6e 67 20 43 4b 43 5f 58 5f returning CKC_X_
11430 35 30 39 20 28 25 6c 75 29 20 28 25 70 2f 25 6c 509 (%lu) (%p/%l
11440 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c u)", (unsigned l
11450 6f 6e 67 29 20 2a 28 28 43 4b 5f 43 45 52 54 49 ong) *((CK_CERTI
11460 46 49 43 41 54 45 5f 54 59 50 45 20 2a 29 20 70 FICATE_TYPE *) p
11470 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 Value), pValue,
11480 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
11490 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 ulValueLen);....
114a0 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 ..break;....case
114b0 20 43 4b 41 5f 4b 45 59 5f 54 59 50 45 3a 0a 09 CKA_KEY_TYPE:..
114c0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
114d0 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 PRINTF("Requesti
114e0 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 ng attribute CKA
114f0 5f 4b 45 59 5f 54 59 50 45 20 28 30 78 25 30 38 _KEY_TYPE (0x%08
11500 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 lx) ...", (unsig
11510 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 ned long) curr_a
11520 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 ttr_type);......
11530 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 if (objectclass
11540 21 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b != CKO_PRIVATE_K
11550 45 59 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 EY && objectclas
11560 73 20 21 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f s != CKO_PUBLIC_
11570 4b 45 59 29 20 7b 0a 09 09 09 09 09 43 41 43 4b KEY) {......CACK
11580 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
11590 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 " ... but not ge
115a0 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 tting it because
115b0 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 6b 65 we are not a ke
115c0 79 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 y.");.......brea
115d0 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a k;.....}....../*
115e0 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 We only support
115f0 20 6f 6e 65 20 6b 65 79 20 74 79 70 65 20 2a 2f one key type */
11600 0a 09 09 09 09 63 6b 5f 6b 65 79 5f 74 79 70 65 .....ck_key_type
11610 20 3d 20 43 4b 4b 5f 52 53 41 3b 0a 0a 09 09 09 = CKK_RSA;.....
11620 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 6b 65 .pValue = &ck_ke
11630 79 5f 74 79 70 65 3b 0a 09 09 09 09 75 6c 56 61 y_type;.....ulVa
11640 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 lueLen = sizeof(
11650 63 6b 5f 6b 65 79 5f 74 79 70 65 29 3b 0a 0a 09 ck_key_type);...
11660 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
11670 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 PRINTF(" ... ret
11680 75 72 6e 69 6e 67 20 43 4b 4b 5f 52 53 41 20 28 urning CKK_RSA (
11690 25 6c 75 29 20 28 25 70 2f 25 6c 75 29 22 2c 20 %lu) (%p/%lu)",
116a0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
116b0 2a 28 28 43 4b 5f 43 45 52 54 49 46 49 43 41 54 *((CK_CERTIFICAT
116c0 45 5f 54 59 50 45 20 2a 29 20 70 56 61 6c 75 65 E_TYPE *) pValue
116d0 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 ), pValue, (unsi
116e0 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c gned long) ulVal
116f0 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 ueLen);......bre
11700 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f ak;....case CKA_
11710 53 49 47 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59 SIGN:.....CACKEY
11720 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
11730 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 equesting attrib
11740 75 74 65 20 43 4b 41 5f 53 49 47 4e 20 28 30 78 ute CKA_SIGN (0x
11750 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e %08lx) ...", (un
11760 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 signed long) cur
11770 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 r_attr_type);...
11780 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 ...if (objectcla
11790 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 ss == CKO_PRIVAT
117a0 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56 E_KEY) {......pV
117b0 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b alue = &ck_true;
117c0 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e ......ulValueLen
117d0 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 = sizeof(ck_tru
117e0 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b e);.....} else {
117f0 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 ......pValue = &
11800 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 ck_false;......u
11810 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 lValueLen = size
11820 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 of(ck_false);...
11830 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f ..}......CACKEY_
11840 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e DEBUG_PRINTF(" .
11850 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 .. returning %lu
11860 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 (%p/%lu)", (uns
11870 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 igned long) *((C
11880 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 K_BBOOL *) pValu
11890 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 e), pValue, (uns
118a0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 igned long) ulVa
118b0 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 lueLen);......br
118c0 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 eak;....case CKA
118d0 5f 53 49 47 4e 5f 52 45 43 4f 56 45 52 3a 0a 09 _SIGN_RECOVER:..
118e0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
118f0 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 PRINTF("Requesti
11900 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 ng attribute CKA
11910 5f 53 49 47 4e 5f 52 45 43 4f 56 45 52 20 28 30 _SIGN_RECOVER (0
11920 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 x%08lx) ...", (u
11930 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 nsigned long) cu
11940 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a rr_attr_type);..
11950 09 09 09 09 2f 2a 20 57 65 20 63 75 72 72 65 6e ..../* We curren
11960 74 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 tly only support
11970 20 22 53 69 67 6e 20 77 69 74 68 20 41 70 70 65 "Sign with Appe
11980 6e 64 69 78 22 20 2a 2f 0a 09 09 09 09 70 56 61 ndix" */.....pVa
11990 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b lue = &ck_false;
119a0 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 .....ulValueLen
119b0 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 = sizeof(ck_fals
119c0 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f e);......CACKEY_
119d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e DEBUG_PRINTF(" .
119e0 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 .. returning %lu
119f0 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 (%p/%lu)", (uns
11a00 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 igned long) *((C
11a10 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 K_BBOOL *) pValu
11a20 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 e), pValue, (uns
11a30 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 igned long) ulVa
11a40 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 lueLen);......br
11a50 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 eak;....case CKA
11a60 5f 44 45 43 52 59 50 54 3a 0a 09 09 09 09 43 41 _DECRYPT:.....CA
11a70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
11a80 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 F("Requesting at
11a90 74 72 69 62 75 74 65 20 43 4b 41 5f 44 45 43 52 tribute CKA_DECR
11aa0 59 50 54 20 28 30 78 25 30 38 6c 78 29 20 2e 2e YPT (0x%08lx) ..
11ab0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f .", (unsigned lo
11ac0 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 ng) curr_attr_ty
11ad0 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 pe);......if (ob
11ae0 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f jectclass == CKO
11af0 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 7c 7c 20 _PRIVATE_KEY ||
11b00 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 objectclass == C
11b10 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 29 20 7b KO_PUBLIC_KEY) {
11b20 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 ......pValue = &
11b30 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c ck_true;......ul
11b40 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f ValueLen = sizeo
11b50 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 f(ck_true);.....
11b60 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 } else {......pV
11b70 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 alue = &ck_false
11b80 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 ;......ulValueLe
11b90 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 n = sizeof(ck_fa
11ba0 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 lse);.....}.....
11bb0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
11bc0 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 INTF(" ... retur
11bd0 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 ning %lu (%p/%lu
11be0 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f )", (unsigned lo
11bf0 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 ng) *((CK_BBOOL
11c00 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c *) pValue), pVal
11c10 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f ue, (unsigned lo
11c20 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b ng) ulValueLen);
11c30 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 ......break;....
11c40 63 61 73 65 20 43 4b 41 5f 53 45 4e 53 49 54 49 case CKA_SENSITI
11c50 56 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 VE:.....CACKEY_D
11c60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 EBUG_PRINTF("Req
11c70 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 uesting attribut
11c80 65 20 43 4b 41 5f 53 45 4e 53 49 54 49 56 45 20 e CKA_SENSITIVE
11c90 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 (0x%08lx) ...",
11ca0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
11cb0 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b curr_attr_type);
11cc0 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 ......if (object
11cd0 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 class == CKO_PRI
11ce0 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09 VATE_KEY) {.....
11cf0 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 .pValue = &ck_tr
11d00 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 ue;......ulValue
11d10 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f Len = sizeof(ck_
11d20 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 true);.....} els
11d30 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 e {......pValue
11d40 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 = &ck_false;....
11d50 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 ..ulValueLen = s
11d60 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b izeof(ck_false);
11d70 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b .....}......CACK
11d80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
11d90 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 " ... returning
11da0 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 %lu (%p/%lu)", (
11db0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a unsigned long) *
11dc0 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 ((CK_BBOOL *) pV
11dd0 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 alue), pValue, (
11de0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 unsigned long) u
11df0 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 lValueLen);.....
11e00 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 .break;....case
11e10 43 4b 41 5f 45 58 54 52 41 43 54 41 42 4c 45 3a CKA_EXTRACTABLE:
11e20 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
11e30 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 G_PRINTF("Reques
11e40 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 ting attribute C
11e50 4b 41 5f 45 58 54 52 41 43 54 41 42 4c 45 20 28 KA_EXTRACTABLE (
11e60 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 0x%08lx) ...", (
11e70 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 unsigned long) c
11e80 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a urr_attr_type);.
11e90 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 .....if (objectc
11ea0 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 lass == CKO_PRIV
11eb0 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 ATE_KEY) {......
11ec0 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c pValue = &ck_fal
11ed0 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 se;......ulValue
11ee0 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f Len = sizeof(ck_
11ef0 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 true);.....} els
11f00 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 e {......pValue
11f10 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 = &ck_true;.....
11f20 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 .ulValueLen = si
11f30 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a zeof(ck_false);.
11f40 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 ....}......CACKE
11f50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
11f60 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 ... returning %
11f70 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 lu (%p/%lu)", (u
11f80 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 nsigned long) *(
11f90 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 (CK_BBOOL *) pVa
11fa0 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 lue), pValue, (u
11fb0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c nsigned long) ul
11fc0 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 ValueLen);......
11fd0 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 break;....case C
11fe0 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09 09 09 09 KA_MODULUS:.....
11ff0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
12000 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 NTF("Requesting
12010 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4d 4f attribute CKA_MO
12020 44 55 4c 55 53 20 28 30 78 25 30 38 6c 78 29 20 DULUS (0x%08lx)
12030 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 ...", (unsigned
12040 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f long) curr_attr_
12050 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 type);......if (
12060 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 certificate_len
12070 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 >= 0) {......x50
12080 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 9_read_ret = x50
12090 39 5f 74 6f 5f 6d 6f 64 75 6c 75 73 28 63 65 72 9_to_modulus(cer
120a0 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 tificate, certif
120b0 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c icate_len, &pVal
120c0 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 ue);......if (x5
120d0 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 09_read_ret < 0)
120e0 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 {.......pValue
120f0 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 = NULL;......} e
12100 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 lse {.......ulVa
12110 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 lueLen = x509_re
12120 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 ad_ret;......}..
12130 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 ...}......CACKEY
12140 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 _DEBUG_PRINTF("
12150 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25 ... returning (%
12160 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c p/%lu)", pValue,
12170 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
12180 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 ulValueLen);...
12190 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 ...break;....cas
121a0 65 20 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 e CKA_PUBLIC_EXP
121b0 4f 4e 45 4e 54 3a 0a 09 09 09 09 43 41 43 4b 45 ONENT:.....CACKE
121c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
121d0 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 Requesting attri
121e0 62 75 74 65 20 43 4b 41 5f 50 55 42 4c 49 43 5f bute CKA_PUBLIC_
121f0 45 58 50 4f 4e 45 4e 54 20 28 30 78 25 30 38 6c EXPONENT (0x%08l
12200 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e x) ...", (unsign
12210 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 ed long) curr_at
12220 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 tr_type);......i
12230 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c f (certificate_l
12240 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 en >= 0) {......
12250 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 x509_read_ret =
12260 78 35 30 39 5f 74 6f 5f 65 78 70 6f 6e 65 6e 74 x509_to_exponent
12270 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 (certificate, ce
12280 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 rtificate_len, &
12290 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 pValue);......if
122a0 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 (x509_read_ret
122b0 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61 < 0) {.......pVa
122c0 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 lue = NULL;.....
122d0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 .} else {.......
122e0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 ulValueLen = x50
122f0 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 9_read_ret;.....
12300 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 .}.....}......CA
12310 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
12320 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e F(" ... returnin
12330 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 56 61 g (%p/%lu)", pVa
12340 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c lue, (unsigned l
12350 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 ong) ulValueLen)
12360 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 ;......break;...
12370 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f .case CKA_TRUST_
12380 53 45 52 56 45 52 5f 41 55 54 48 3a 0a 09 09 09 SERVER_AUTH:....
12390 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
123a0 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 INTF("Requesting
123b0 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 attribute CKA_T
123c0 52 55 53 54 5f 53 45 52 56 45 52 5f 41 55 54 48 RUST_SERVER_AUTH
123d0 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c (0x%08lx) ...",
123e0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
123f0 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 curr_attr_type)
12400 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 ;......pValue =
12410 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c &ck_true;.....ul
12420 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f ValueLen = sizeo
12430 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09 f(ck_true);.....
12440 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
12450 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 INTF(" ... retur
12460 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 ning %lu (%p/%lu
12470 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f )", (unsigned lo
12480 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 ng) *((CK_BBOOL
12490 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c *) pValue), pVal
124a0 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f ue, (unsigned lo
124b0 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b ng) ulValueLen);
124c0 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 ......break;....
124d0 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 case CKA_TRUST_C
124e0 4c 49 45 4e 54 5f 41 55 54 48 3a 0a 09 09 09 09 LIENT_AUTH:.....
124f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
12500 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 NTF("Requesting
12510 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52 attribute CKA_TR
12520 55 53 54 5f 43 4c 49 45 4e 54 5f 41 55 54 48 20 UST_CLIENT_AUTH
12530 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 (0x%08lx) ...",
12540 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
12550 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b curr_attr_type);
12560 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 ......pValue = &
12570 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 ck_true;.....ulV
12580 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 alueLen = sizeof
12590 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 (ck_true);......
125a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
125b0 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e NTF(" ... return
125c0 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 ing %lu (%p/%lu)
125d0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e ", (unsigned lon
125e0 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a g) *((CK_BBOOL *
125f0 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 ) pValue), pValu
12600 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e e, (unsigned lon
12610 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a g) ulValueLen);.
12620 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 .....break;....c
12630 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 4f ase CKA_TRUST_CO
12640 44 45 5f 53 49 47 4e 49 4e 47 3a 0a 09 09 09 09 DE_SIGNING:.....
12650 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
12660 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 NTF("Requesting
12670 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52 attribute CKA_TR
12680 55 53 54 5f 43 4f 44 45 5f 53 49 47 4e 49 4e 47 UST_CODE_SIGNING
12690 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c (0x%08lx) ...",
126a0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
126b0 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 curr_attr_type)
126c0 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 ;......pValue =
126d0 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c &ck_true;.....ul
126e0 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f ValueLen = sizeo
126f0 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09 f(ck_true);.....
12700 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
12710 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 INTF(" ... retur
12720 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 ning %lu (%p/%lu
12730 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f )", (unsigned lo
12740 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 ng) *((CK_BBOOL
12750 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c *) pValue), pVal
12760 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f ue, (unsigned lo
12770 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b ng) ulValueLen);
12780 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 ......break;....
12790 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 45 case CKA_TRUST_E
127a0 4d 41 49 4c 5f 50 52 4f 54 45 43 54 49 4f 4e 3a MAIL_PROTECTION:
127b0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
127c0 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 G_PRINTF("Reques
127d0 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 ting attribute C
127e0 4b 41 5f 54 52 55 53 54 5f 45 4d 41 49 4c 5f 50 KA_TRUST_EMAIL_P
127f0 52 4f 54 45 43 54 49 4f 4e 20 28 30 78 25 30 38 ROTECTION (0x%08
12800 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 lx) ...", (unsig
12810 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 ned long) curr_a
12820 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 ttr_type);......
12830 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 pValue = &ck_tru
12840 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 e;.....ulValueLe
12850 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 n = sizeof(ck_tr
12860 75 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 ue);......CACKEY
12870 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 _DEBUG_PRINTF("
12880 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c ... returning %l
12890 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e u (%p/%lu)", (un
128a0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 signed long) *((
128b0 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c CK_BBOOL *) pVal
128c0 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e ue), pValue, (un
128d0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 signed long) ulV
128e0 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 alueLen);......b
128f0 72 65 61 6b 3b 0a 09 09 09 64 65 66 61 75 6c 74 reak;....default
12900 3a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e :.....pValue = N
12910 55 4c 4c 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 ULL;.....ulValue
12920 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 Len = (CK_LONG)
12930 2d 31 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 -1;.....break;..
12940 09 7d 0a 0a 09 09 69 66 20 28 28 28 43 4b 5f 4c .}....if (((CK_L
12950 4f 4e 47 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 ONG) ulValueLen)
12960 20 21 3d 20 28 28 43 4b 5f 4c 4f 4e 47 29 20 2d != ((CK_LONG) -
12970 31 29 29 20 7b 0a 09 09 09 2f 2a 20 50 75 73 68 1)) {..../* Push
12980 20 63 75 72 72 5f 61 74 74 72 20 6f 6e 74 6f 20 curr_attr onto
12990 74 68 65 20 73 74 61 63 6b 20 2a 2f 0a 09 09 09 the stack */....
129a0 63 75 72 72 5f 61 74 74 72 2e 74 79 70 65 20 3d curr_attr.type =
129b0 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 3b curr_attr_type;
129c0 0a 09 09 09 63 75 72 72 5f 61 74 74 72 2e 75 6c ....curr_attr.ul
129d0 56 61 6c 75 65 4c 65 6e 20 3d 20 75 6c 56 61 6c ValueLen = ulVal
129e0 75 65 4c 65 6e 3b 0a 0a 09 09 09 63 75 72 72 5f ueLen;.....curr_
129f0 61 74 74 72 2e 70 56 61 6c 75 65 20 3d 20 6d 61 attr.pValue = ma
12a00 6c 6c 6f 63 28 63 75 72 72 5f 61 74 74 72 2e 75 lloc(curr_attr.u
12a10 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 6d lValueLen);....m
12a20 65 6d 63 70 79 28 63 75 72 72 5f 61 74 74 72 2e emcpy(curr_attr.
12a30 70 56 61 6c 75 65 2c 20 70 56 61 6c 75 65 2c 20 pValue, pValue,
12a40 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75 curr_attr.ulValu
12a50 65 4c 65 6e 29 3b 0a 0a 09 09 09 69 66 20 28 70 eLen);.....if (p
12a60 56 61 6c 75 65 5f 66 72 65 65 20 26 26 20 70 56 Value_free && pV
12a70 61 6c 75 65 29 20 7b 0a 09 09 09 09 66 72 65 65 alue) {.....free
12a80 28 70 56 61 6c 75 65 29 3b 0a 09 09 09 7d 0a 0a (pValue);....}..
12a90 09 09 09 69 66 20 28 6e 75 6d 61 74 74 72 73 20 ...if (numattrs
12aa0 3e 3d 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74 29 >= retval_count)
12ab0 20 7b 0a 09 09 09 09 72 65 74 76 61 6c 5f 63 6f {.....retval_co
12ac0 75 6e 74 20 2a 3d 20 32 3b 0a 09 09 09 09 72 65 unt *= 2;.....re
12ad0 74 76 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 72 tval = realloc(r
12ae0 65 74 76 61 6c 2c 20 72 65 74 76 61 6c 5f 63 6f etval, retval_co
12af0 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 unt * sizeof(*re
12b00 74 76 61 6c 29 29 3b 0a 09 09 09 7d 0a 0a 09 09 tval));....}....
12b10 09 6d 65 6d 63 70 79 28 26 72 65 74 76 61 6c 5b .memcpy(&retval[
12b20 6e 75 6d 61 74 74 72 73 5d 2c 20 26 63 75 72 72 numattrs], &curr
12b30 5f 61 74 74 72 2c 20 73 69 7a 65 6f 66 28 63 75 _attr, sizeof(cu
12b40 72 72 5f 61 74 74 72 29 29 3b 0a 09 09 09 6e 75 rr_attr));....nu
12b50 6d 61 74 74 72 73 2b 2b 3b 0a 09 09 7d 0a 09 7d mattrs++;...}..}
12b60 0a 0a 09 69 66 20 28 6e 75 6d 61 74 74 72 73 20 ...if (numattrs
12b70 21 3d 20 30 29 20 7b 0a 09 09 72 65 74 76 61 6c != 0) {...retval
12b80 5f 63 6f 75 6e 74 20 3d 20 6e 75 6d 61 74 74 72 _count = numattr
12b90 73 3b 0a 09 09 72 65 74 76 61 6c 20 3d 20 72 65 s;...retval = re
12ba0 61 6c 6c 6f 63 28 72 65 74 76 61 6c 2c 20 72 65 alloc(retval, re
12bb0 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a tval_count * siz
12bc0 65 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a 09 eof(*retval));..
12bd0 7d 20 65 6c 73 65 20 7b 0a 09 09 66 72 65 65 28 } else {...free(
12be0 72 65 74 76 61 6c 29 3b 0a 0a 09 09 72 65 74 76 retval);....retv
12bf0 61 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 al = NULL;..}...
12c00 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 6e 75 6d 61 *pulCount = numa
12c10 74 74 72 73 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 ttrs;...CACKEY_D
12c20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
12c30 75 72 6e 69 6e 67 20 25 6c 75 20 6f 62 6a 65 63 urning %lu objec
12c40 74 73 20 28 25 70 29 2e 22 2c 20 6e 75 6d 61 74 ts (%p).", numat
12c50 74 72 73 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 trs, retval);...
12c60 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a return(retval);.
12c70 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 }..static void c
12c80 61 63 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e 74 ackey_free_ident
12c90 69 74 69 65 73 28 73 74 72 75 63 74 20 63 61 63 ities(struct cac
12ca0 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 key_identity *id
12cb0 65 6e 74 69 74 69 65 73 2c 20 75 6e 73 69 67 6e entities, unsign
12cc0 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 69 ed long identiti
12cd0 65 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f es_count) {..CK_
12ce0 41 54 54 52 49 42 55 54 45 20 2a 63 75 72 72 5f ATTRIBUTE *curr_
12cf0 61 74 74 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20 attr;..unsigned
12d00 6c 6f 6e 67 20 69 64 5f 69 64 78 2c 20 61 74 74 long id_idx, att
12d10 72 5f 69 64 78 3b 0a 0a 09 69 66 20 28 69 64 65 r_idx;...if (ide
12d20 6e 74 69 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 20 ntities == NULL
12d30 7c 7c 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f || identities_co
12d40 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 72 65 unt == 0) {...re
12d50 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 turn;..}...for (
12d60 69 64 5f 69 64 78 20 3d 20 30 3b 20 69 64 5f 69 id_idx = 0; id_i
12d70 64 78 20 3c 20 69 64 65 6e 74 69 74 69 65 73 5f dx < identities_
12d80 63 6f 75 6e 74 3b 20 69 64 5f 69 64 78 2b 2b 29 count; id_idx++)
12d90 20 7b 0a 09 09 69 66 20 28 69 64 65 6e 74 69 74 {...if (identit
12da0 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 ies[id_idx].attr
12db0 69 62 75 74 65 73 29 20 7b 0a 09 09 09 66 6f 72 ibutes) {....for
12dc0 20 28 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 (attr_idx = 0;
12dd0 61 74 74 72 5f 69 64 78 20 3c 20 69 64 65 6e 74 attr_idx < ident
12de0 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 ities[id_idx].at
12df0 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 tributes_count;
12e00 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 attr_idx++) {...
12e10 09 09 63 75 72 72 5f 61 74 74 72 20 3d 20 26 69 ..curr_attr = &i
12e20 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 dentities[id_idx
12e30 5d 2e 61 74 74 72 69 62 75 74 65 73 5b 61 74 74 ].attributes[att
12e40 72 5f 69 64 78 5d 3b 0a 0a 09 09 09 09 69 66 20 r_idx];......if
12e50 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c (curr_attr->pVal
12e60 75 65 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28 ue) {......free(
12e70 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 curr_attr->pValu
12e80 65 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a e);.....}....}..
12e90 09 09 09 69 66 20 28 69 64 65 6e 74 69 74 69 65 ...if (identitie
12ea0 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 s[id_idx].attrib
12eb0 75 74 65 73 29 20 7b 0a 09 09 09 09 66 72 65 65 utes) {.....free
12ec0 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 (identities[id_i
12ed0 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 29 3b dx].attributes);
12ee0 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 ....}.....cackey
12ef0 5f 66 72 65 65 5f 63 65 72 74 73 28 69 64 65 6e _free_certs(iden
12f00 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 tities[id_idx].p
12f10 63 73 63 5f 69 64 65 6e 74 69 74 79 2c 20 31 2c csc_identity, 1,
12f20 20 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 66 72 1);...}..}...fr
12f30 65 65 28 69 64 65 6e 74 69 74 69 65 73 29 3b 0a ee(identities);.
12f40 7d 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 }..static struct
12f50 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 cackey_identity
12f60 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f 69 64 *cackey_read_id
12f70 65 6e 74 69 74 69 65 73 28 73 74 72 75 63 74 20 entities(struct
12f80 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f cackey_slot *slo
12f90 74 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 t, unsigned long
12fa0 20 2a 69 64 73 5f 66 6f 75 6e 64 29 20 7b 0a 09 *ids_found) {..
12fb0 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 struct cackey_pc
12fc0 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73 sc_identity *pcs
12fd0 63 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 73 c_identities;..s
12fe0 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 truct cackey_ide
12ff0 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65 ntity *identitie
13000 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e s;..unsigned lon
13010 67 20 6e 75 6d 5f 69 64 73 2c 20 69 64 5f 69 64 g num_ids, id_id
13020 78 2c 20 63 75 72 72 5f 69 64 5f 74 79 70 65 3b x, curr_id_type;
13030 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 ..unsigned long
13040 6e 75 6d 5f 63 65 72 74 73 2c 20 63 65 72 74 5f num_certs, cert_
13050 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 idx;...CACKEY_DE
13060 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
13070 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 69 64 73 ed.");...if (ids
13080 5f 66 6f 75 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20 _found == NULL)
13090 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
130a0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
130b0 20 69 64 73 5f 66 6f 75 6e 64 20 69 73 20 4e 55 ids_found is NU
130c0 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 LL");....return(
130d0 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 NULL);..}...pcsc
130e0 5f 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61 _identities = ca
130f0 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 73 28 ckey_read_certs(
13100 73 6c 6f 74 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d slot, NULL, &num
13110 5f 63 65 72 74 73 29 3b 0a 09 69 66 20 28 70 63 _certs);..if (pc
13120 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 21 3d sc_identities !=
13130 20 4e 55 4c 4c 29 20 7b 0a 09 09 2f 2a 20 43 6f NULL) {.../* Co
13140 6e 76 65 72 74 20 6e 75 6d 62 65 72 20 6f 66 20 nvert number of
13150 43 65 72 74 73 20 74 6f 20 6e 75 6d 62 65 72 20 Certs to number
13160 6f 66 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 09 09 of objects */...
13170 6e 75 6d 5f 69 64 73 20 3d 20 28 43 4b 4f 5f 50 num_ids = (CKO_P
13180 52 49 56 41 54 45 5f 4b 45 59 20 2d 20 43 4b 4f RIVATE_KEY - CKO
13190 5f 43 45 52 54 49 46 49 43 41 54 45 20 2b 20 31 _CERTIFICATE + 1
131a0 29 20 2a 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 0a ) * num_certs;..
131b0 09 09 69 64 65 6e 74 69 74 69 65 73 20 3d 20 6d ..identities = m
131c0 61 6c 6c 6f 63 28 6e 75 6d 5f 69 64 73 20 2a 20 alloc(num_ids *
131d0 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69 sizeof(*identiti
131e0 65 73 29 29 3b 0a 0a 09 09 69 64 5f 69 64 78 20 es));....id_idx
131f0 3d 20 30 3b 0a 09 09 66 6f 72 20 28 63 65 72 74 = 0;...for (cert
13200 5f 69 64 78 20 3d 20 30 3b 20 63 65 72 74 5f 69 _idx = 0; cert_i
13210 64 78 20 3c 20 6e 75 6d 5f 63 65 72 74 73 3b 20 dx < num_certs;
13220 63 65 72 74 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 cert_idx++) {...
13230 09 66 6f 72 20 28 63 75 72 72 5f 69 64 5f 74 79 .for (curr_id_ty
13240 70 65 20 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 pe = CKO_CERTIFI
13250 43 41 54 45 3b 20 63 75 72 72 5f 69 64 5f 74 79 CATE; curr_id_ty
13260 70 65 20 3c 3d 20 43 4b 4f 5f 50 52 49 56 41 54 pe <= CKO_PRIVAT
13270 45 5f 4b 45 59 3b 20 63 75 72 72 5f 69 64 5f 74 E_KEY; curr_id_t
13280 79 70 65 2b 2b 29 20 7b 0a 09 09 09 09 69 64 65 ype++) {.....ide
13290 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e ntities[id_idx].
132a0 61 74 74 72 69 62 75 74 65 73 20 3d 20 63 61 63 attributes = cac
132b0 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74 key_get_attribut
132c0 65 73 28 63 75 72 72 5f 69 64 5f 74 79 70 65 2c es(curr_id_type,
132d0 20 26 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 &pcsc_identitie
132e0 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 63 65 72 s[cert_idx], cer
132f0 74 5f 69 64 78 2c 20 26 69 64 65 6e 74 69 74 69 t_idx, &identiti
13300 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 es[id_idx].attri
13310 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 butes_count);...
13320 09 09 09 69 66 20 28 69 64 65 6e 74 69 74 69 65 ...if (identitie
13330 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 s[id_idx].attrib
13340 75 74 65 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a utes == NULL) {.
13350 09 09 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b .....identities[
13360 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 id_idx].attribut
13370 65 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 es_count = 0;...
13380 09 09 7d 0a 0a 09 09 09 09 69 64 65 6e 74 69 74 ..}......identit
13390 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 ies[id_idx].pcsc
133a0 5f 69 64 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c _identity = mall
133b0 6f 63 28 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 oc(sizeof(*ident
133c0 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 ities[id_idx].pc
133d0 73 63 5f 69 64 65 6e 74 69 74 79 29 29 3b 0a 09 sc_identity));..
133e0 09 09 09 6d 65 6d 63 70 79 28 69 64 65 6e 74 69 ...memcpy(identi
133f0 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 ties[id_idx].pcs
13400 63 5f 69 64 65 6e 74 69 74 79 2c 20 26 70 63 73 c_identity, &pcs
13410 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 c_identities[cer
13420 74 5f 69 64 78 5d 2c 20 73 69 7a 65 6f 66 28 2a t_idx], sizeof(*
13430 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 identities[id_id
13440 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 x].pcsc_identity
13450 29 29 3b 0a 0a 09 09 09 09 69 64 65 6e 74 69 74 ));......identit
13460 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 ies[id_idx].pcsc
13470 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 _identity->certi
13480 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 ficate = malloc(
13490 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b pcsc_identities[
134a0 63 65 72 74 5f 69 64 78 5d 2e 63 65 72 74 69 66 cert_idx].certif
134b0 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 icate_len);.....
134c0 6d 65 6d 63 70 79 28 69 64 65 6e 74 69 74 69 65 memcpy(identitie
134d0 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 s[id_idx].pcsc_i
134e0 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 dentity->certifi
134f0 63 61 74 65 2c 20 70 63 73 63 5f 69 64 65 6e 74 cate, pcsc_ident
13500 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e ities[cert_idx].
13510 63 65 72 74 69 66 69 63 61 74 65 2c 20 70 63 73 certificate, pcs
13520 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 c_identities[cer
13530 74 5f 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 t_idx].certifica
13540 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 69 64 te_len);......id
13550 5f 69 64 78 2b 2b 3b 0a 09 09 09 7d 0a 09 09 7d _idx++;....}...}
13560 0a 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f ....cackey_free_
13570 63 65 72 74 73 28 70 63 73 63 5f 69 64 65 6e 74 certs(pcsc_ident
13580 69 74 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73 ities, num_certs
13590 2c 20 31 29 3b 0a 0a 09 09 2a 69 64 73 5f 66 6f , 1);....*ids_fo
135a0 75 6e 64 20 3d 20 6e 75 6d 5f 69 64 73 3b 0a 09 und = num_ids;..
135b0 09 72 65 74 75 72 6e 28 69 64 65 6e 74 69 74 69 .return(identiti
135c0 65 73 29 3b 0a 09 7d 0a 0a 09 2a 69 64 73 5f 66 es);..}...*ids_f
135d0 6f 75 6e 64 20 3d 20 30 3b 0a 09 72 65 74 75 72 ound = 0;..retur
135e0 6e 28 4e 55 4c 4c 29 3b 0a 7d 0a 0a 43 4b 5f 44 n(NULL);.}..CK_D
135f0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 EFINE_FUNCTION(C
13600 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 69 61 6c 69 K_RV, C_Initiali
13610 7a 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54 52 20 ze)(CK_VOID_PTR
13620 70 49 6e 69 74 41 72 67 73 29 20 7b 0a 09 43 4b pInitArgs) {..CK
13630 5f 43 5f 49 4e 49 54 49 41 4c 49 5a 45 5f 41 52 _C_INITIALIZE_AR
13640 47 53 20 43 4b 5f 50 54 52 20 61 72 67 73 3b 0a GS CK_PTR args;.
13650 09 75 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 09 .uint32_t idx;..
13660 69 6e 74 20 6d 75 74 65 78 5f 69 6e 69 74 5f 72 int mutex_init_r
13670 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 et;...CACKEY_DEB
13680 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
13690 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 69 d.");...if (pIni
136a0 74 41 72 67 73 20 21 3d 20 4e 55 4c 4c 29 20 7b tArgs != NULL) {
136b0 0a 09 09 61 72 67 73 20 3d 20 70 49 6e 69 74 41 ...args = pInitA
136c0 72 67 73 3b 0a 09 09 6d 65 6d 63 70 79 28 26 63 rgs;...memcpy(&c
136d0 61 63 6b 65 79 5f 61 72 67 73 2c 20 61 72 67 73 ackey_args, args
136e0 2c 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f , sizeof(cackey_
136f0 61 72 67 73 29 29 3b 0a 0a 09 09 69 66 20 28 61 args));....if (a
13700 72 67 73 2d 3e 43 72 65 61 74 65 4d 75 74 65 78 rgs->CreateMutex
13710 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 == NULL || args
13720 2d 3e 44 65 73 74 72 6f 79 4d 75 74 65 78 20 3d ->DestroyMutex =
13730 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e = NULL || args->
13740 4c 6f 63 6b 4d 75 74 65 78 20 3d 3d 20 4e 55 4c LockMutex == NUL
13750 4c 20 7c 7c 20 61 72 67 73 2d 3e 55 6e 6c 6f 63 L || args->Unloc
13760 6b 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 29 20 kMutex == NULL)
13770 7b 0a 09 09 09 69 66 20 28 61 72 67 73 2d 3e 43 {....if (args->C
13780 72 65 61 74 65 4d 75 74 65 78 20 21 3d 20 4e 55 reateMutex != NU
13790 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 44 65 73 74 LL || args->Dest
137a0 72 6f 79 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c royMutex != NULL
137b0 20 7c 7c 20 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75 || args->LockMu
137c0 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 tex != NULL || a
137d0 72 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78 rgs->UnlockMutex
137e0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 != NULL) {.....
137f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
13800 4e 54 46 28 22 45 72 72 6f 72 2e 20 53 6f 6d 65 NTF("Error. Some
13810 2c 20 62 75 74 20 6e 6f 74 20 41 6c 6c 20 74 68 , but not All th
13820 72 65 61 64 69 6e 67 20 70 72 69 6d 69 74 69 76 reading primitiv
13830 65 73 20 70 72 6f 76 69 64 65 64 2e 22 29 3b 0a es provided.");.
13840 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f .....return(CKR_
13850 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a ARGUMENTS_BAD);.
13860 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 ...}...}....if (
13870 61 72 67 73 2d 3e 70 52 65 73 65 72 76 65 64 20 args->pReserved
13880 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 43 41 != NULL) {....CA
13890 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
138a0 46 28 22 45 72 72 6f 72 2e 20 70 52 65 73 65 72 F("Error. pReser
138b0 76 65 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e ved is not NULL.
138c0 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 ");.....return(C
138d0 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 KR_ARGUMENTS_BAD
138e0 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b );...}..} else {
138f0 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 ...cackey_args.C
13900 72 65 61 74 65 4d 75 74 65 78 20 3d 20 4e 55 4c reateMutex = NUL
13910 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 L;...cackey_args
13920 2e 44 65 73 74 72 6f 79 4d 75 74 65 78 20 3d 20 .DestroyMutex =
13930 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 NULL;...cackey_a
13940 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 20 3d 20 rgs.LockMutex =
13950 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 NULL;...cackey_a
13960 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 rgs.UnlockMutex
13970 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 = NULL;...cackey
13980 5f 61 72 67 73 2e 66 6c 61 67 73 20 3d 20 30 3b _args.flags = 0;
13990 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 ..}...if (cackey
139a0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
139b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
139c0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 41 RINTF("Error. A
139d0 6c 72 65 61 64 79 20 69 6e 69 74 69 61 6c 69 7a lready initializ
139e0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
139f0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 41 4c (CKR_CRYPTOKI_AL
13a00 52 45 41 44 59 5f 49 4e 49 54 49 41 4c 49 5a 45 READY_INITIALIZE
13a10 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 D);..}...for (id
13a20 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 x = 0; idx < (si
13a30 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 zeof(cackey_sess
13a40 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 ions) / sizeof(c
13a50 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 ackey_sessions[0
13a60 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 ])); idx++) {...
13a70 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
13a80 69 64 78 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b idx].active = 0;
13a90 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d ..}...for (idx =
13aa0 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 0; idx < (sizeo
13ab0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 f(cackey_slots)
13ac0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f / sizeof(cackey_
13ad0 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69 64 78 2b slots[0])); idx+
13ae0 2b 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 6c +) {...cackey_sl
13af0 6f 74 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 20 ots[idx].active
13b00 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c = 0;...cackey_sl
13b10 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 ots[idx].pcsc_re
13b20 61 64 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 ader = NULL;...c
13b30 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d ackey_slots[idx]
13b40 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 .transaction_dep
13b50 74 68 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 th = 0;...cackey
13b60 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 73 6c 6f 74 _slots[idx].slot
13b70 5f 72 65 73 65 74 20 3d 20 30 3b 0a 09 09 63 61 _reset = 0;...ca
13b80 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e ckey_slots[idx].
13b90 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b token_flags = 0;
13ba0 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b ...cackey_slots[
13bb0 69 64 78 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c idx].label = NUL
13bc0 4c 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 69 L;..}...cackey_i
13bd0 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a nitialized = 1;.
13be0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 62 69 ..if (!cackey_bi
13bf0 67 6c 6f 63 6b 5f 69 6e 69 74 29 20 7b 0a 09 09 glock_init) {...
13c00 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 20 3d mutex_init_ret =
13c10 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 63 72 cackey_mutex_cr
13c20 65 61 74 65 28 26 63 61 63 6b 65 79 5f 62 69 67 eate(&cackey_big
13c30 6c 6f 63 6b 29 3b 0a 0a 09 09 69 66 20 28 6d 75 lock);....if (mu
13c40 74 65 78 5f 69 6e 69 74 5f 72 65 74 20 21 3d 20 tex_init_ret !=
13c50 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 0) {....CACKEY_D
13c60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
13c70 6f 72 2e 20 20 4d 75 74 65 78 20 69 6e 69 74 69 or. Mutex initi
13c80 61 6c 69 7a 61 74 69 6f 6e 20 66 61 69 6c 65 64 alization failed
13c90 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 .");.....return(
13ca0 43 4b 52 5f 43 41 4e 54 5f 4c 4f 43 4b 29 3b 0a CKR_CANT_LOCK);.
13cb0 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 62 69 ..}....cackey_bi
13cc0 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d 20 31 3b 0a glock_init = 1;.
13cd0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 .}...CACKEY_DEBU
13ce0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
13cf0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 ing CKR_OK (%i)"
13d00 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 , CKR_OK);...ret
13d10 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a urn(CKR_OK);.}..
13d20 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 CK_DEFINE_FUNCTI
13d30 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 61 ON(CK_RV, C_Fina
13d40 6c 69 7a 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54 lize)(CK_VOID_PT
13d50 52 20 70 52 65 73 65 72 76 65 64 29 20 7b 0a 09 R pReserved) {..
13d60 75 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 0a 09 uint32_t idx;...
13d70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
13d80 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a NTF("Called.");.
13d90 0a 09 69 66 20 28 70 52 65 73 65 72 76 65 64 20 ..if (pReserved
13da0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 != NULL) {...CAC
13db0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
13dc0 28 22 45 72 72 6f 72 2e 20 70 52 65 73 65 72 76 ("Error. pReserv
13dd0 65 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 ed is not NULL."
13de0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
13df0 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b _ARGUMENTS_BAD);
13e00 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ..}...if (!cacke
13e10 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b y_initialized) {
13e20 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
13e30 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
13e40 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e Not initialized.
13e50 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
13e60 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 R_CRYPTOKI_NOT_I
13e70 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
13e80 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 ..for (idx = 0;
13e90 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 idx < (sizeof(ca
13ea0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f ckey_sessions) /
13eb0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 sizeof(cackey_s
13ec0 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 essions[0])); id
13ed0 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63 x++) {...if (cac
13ee0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 key_sessions[idx
13ef0 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 43 ].active) {....C
13f00 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 28 69 64 _CloseSession(id
13f10 78 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 x);...}..}...cac
13f20 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e key_slots_discon
13f30 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 66 6f nect_all();...fo
13f40 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 r (idx = 0; idx
13f50 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 < (sizeof(cackey
13f60 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 _slots) / sizeof
13f70 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d (cackey_slots[0]
13f80 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 )); idx++) {...i
13f90 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b f (cackey_slots[
13fa0 69 64 78 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 idx].pcsc_reader
13fb0 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b ) {....free(cack
13fc0 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 ey_slots[idx].pc
13fd0 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 09 7d 0a sc_reader);...}.
13fe0 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 70 63 73 63 .}...cackey_pcsc
13ff0 5f 64 69 73 63 6f 6e 6e 65 63 74 28 29 3b 0a 0a _disconnect();..
14000 09 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 .cackey_initiali
14010 7a 65 64 20 3d 20 30 3b 0a 0a 09 43 41 43 4b 45 zed = 0;...CACKE
14020 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
14030 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b Returning CKR_OK
14040 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b (%i)", CKR_OK);
14050 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b ...return(CKR_OK
14060 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f );.}..CK_DEFINE_
14070 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 FUNCTION(CK_RV,
14080 43 5f 47 65 74 49 6e 66 6f 29 28 43 4b 5f 49 4e C_GetInfo)(CK_IN
14090 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a FO_PTR pInfo) {.
140a0 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 .static CK_UTF8C
140b0 48 41 52 20 6d 61 6e 75 66 61 63 74 75 72 65 72 HAR manufacturer
140c0 49 44 5b 5d 20 3d 20 22 55 2e 53 2e 20 47 6f 76 ID[] = "U.S. Gov
140d0 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 74 61 74 69 ernment";..stati
140e0 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6c 69 c CK_UTF8CHAR li
140f0 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e braryDescription
14100 5b 5d 20 3d 20 22 43 41 43 4b 65 79 22 3b 0a 0a [] = "CACKey";..
14110 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
14120 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
14130 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 ...if (pInfo ==
14140 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 NULL) {...CACKEY
14150 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
14160 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e rror. pInfo is N
14170 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 ULL.");....retur
14180 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f n(CKR_ARGUMENTS_
14190 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 BAD);..}...if (!
141a0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a cackey_initializ
141b0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...CACKEY_D
141c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
141d0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c or. Not initial
141e0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 ized.");....retu
141f0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f rn(CKR_CRYPTOKI_
14200 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 NOT_INITIALIZED)
14210 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 63 72 ;..}...pInfo->cr
14220 79 70 74 6f 6b 69 56 65 72 73 69 6f 6e 2e 6d 61 yptokiVersion.ma
14230 6a 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 jor = ((CACKEY_C
14240 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f RYPTOKI_VERSION_
14250 43 4f 44 45 29 20 3e 3e 20 31 36 29 20 26 20 30 CODE) >> 16) & 0
14260 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 63 72 79 xff;..pInfo->cry
14270 70 74 6f 6b 69 56 65 72 73 69 6f 6e 2e 6d 69 6e ptokiVersion.min
14280 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 52 or = ((CACKEY_CR
14290 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 YPTOKI_VERSION_C
142a0 4f 44 45 29 20 3e 3e 20 38 29 20 26 20 30 78 66 ODE) >> 8) & 0xf
142b0 66 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 f;...memset(pInf
142c0 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 o->manufacturerI
142d0 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 D, ' ', sizeof(p
142e0 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 Info->manufactur
142f0 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63 70 79 28 erID));..memcpy(
14300 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 pInfo->manufactu
14310 72 65 72 49 44 2c 20 6d 61 6e 75 66 61 63 74 75 rerID, manufactu
14320 72 65 72 49 44 2c 20 73 69 7a 65 6f 66 28 6d 61 rerID, sizeof(ma
14330 6e 75 66 61 63 74 75 72 65 72 49 44 29 20 2d 20 nufacturerID) -
14340 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 1);...pInfo->fla
14350 67 73 20 3d 20 30 78 30 30 3b 0a 0a 09 6d 65 6d gs = 0x00;...mem
14360 73 65 74 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 set(pInfo->libra
14370 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 27 ryDescription, '
14380 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f ', sizeof(pInfo
14390 2d 3e 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 ->libraryDescrip
143a0 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d 63 70 79 28 tion));..memcpy(
143b0 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65 pInfo->libraryDe
143c0 73 63 72 69 70 74 69 6f 6e 2c 20 6c 69 62 72 61 scription, libra
143d0 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 ryDescription, s
143e0 69 7a 65 6f 66 28 6c 69 62 72 61 72 79 44 65 73 izeof(libraryDes
143f0 63 72 69 70 74 69 6f 6e 29 20 2d 20 31 29 3b 0a cription) - 1);.
14400 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 ..pInfo->library
14410 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 Version.major =
14420 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 (cackey_getversi
14430 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30 78 on() >> 16) & 0x
14440 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62 72 ff;..pInfo->libr
14450 61 72 79 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 aryVersion.minor
14460 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 = (cackey_getve
14470 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26 20 rsion() >> 8) &
14480 30 78 66 66 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 0xff;...CACKEY_D
14490 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
144a0 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 urning CKR_OK (%
144b0 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 i)", CKR_OK);...
144c0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a return(CKR_OK);.
144d0 7d 0a 0a 2f 2a 0a 20 2a 20 50 72 6f 63 65 73 73 }../*. * Process
144e0 20 6c 69 73 74 20 6f 66 20 72 65 61 64 65 72 73 list of readers
144f0 2c 20 61 6e 64 20 63 72 65 61 74 65 20 6d 61 70 , and create map
14500 70 69 6e 67 20 62 65 74 77 65 65 6e 20 72 65 61 ping between rea
14510 64 65 72 20 6e 61 6d 65 20 61 6e 64 20 73 6c 6f der name and slo
14520 74 20 49 44 0a 20 2a 2f 0a 43 4b 5f 44 45 46 49 t ID. */.CK_DEFI
14530 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 NE_FUNCTION(CK_R
14540 56 2c 20 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74 V, C_GetSlotList
14550 29 28 43 4b 5f 42 42 4f 4f 4c 20 74 6f 6b 65 6e )(CK_BBOOL token
14560 50 72 65 73 65 6e 74 2c 20 43 4b 5f 53 4c 4f 54 Present, CK_SLOT
14570 5f 49 44 5f 50 54 52 20 70 53 6c 6f 74 4c 69 73 _ID_PTR pSlotLis
14580 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 t, CK_ULONG_PTR
14590 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 69 6e 74 pulCount) {..int
145a0 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 mutex_retval;..
145b0 69 6e 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 int pcsc_connect
145c0 5f 72 65 74 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 _ret;..CK_ULONG
145d0 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63 6f 75 6e count, slot_coun
145e0 74 20 3d 20 30 2c 20 63 75 72 72 73 6c 6f 74 3b t = 0, currslot;
145f0 0a 09 63 68 61 72 20 2a 70 63 73 63 5f 72 65 61 ..char *pcsc_rea
14600 64 65 72 73 2c 20 2a 70 63 73 63 5f 72 65 61 64 ders, *pcsc_read
14610 65 72 73 5f 73 2c 20 2a 70 63 73 63 5f 72 65 61 ers_s, *pcsc_rea
14620 64 65 72 73 5f 65 3b 0a 09 44 57 4f 52 44 20 70 ders_e;..DWORD p
14630 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 3b csc_readers_len;
14640 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 6c 69 73 ..LONG scard_lis
14650 74 72 65 61 64 65 72 73 5f 72 65 74 3b 0a 09 73 treaders_ret;..s
14660 69 7a 65 5f 74 20 63 75 72 72 5f 72 65 61 64 65 ize_t curr_reade
14670 72 5f 6c 65 6e 3b 0a 0a 09 43 41 43 4b 45 59 5f r_len;...CACKEY_
14680 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
14690 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 lled.");...if (p
146a0 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 ulCount == NULL)
146b0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
146c0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
146d0 20 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e 55 4c pulCount is NUL
146e0 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 L.");....return(
146f0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 CKR_ARGUMENTS_BA
14700 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 D);..}...if (!ca
14710 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 ckey_initialized
14720 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
14730 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
14740 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a . Not initializ
14750 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
14760 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f (CKR_CRYPTOKI_NO
14770 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a T_INITIALIZED);.
14780 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 .}...mutex_retva
14790 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 l = cackey_mutex
147a0 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 _lock(cackey_big
147b0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 lock);..if (mute
147c0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b x_retval != 0) {
147d0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
147e0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
147f0 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 Locking failed."
14800 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
14810 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b _GENERAL_ERROR);
14820 0a 09 7d 0a 0a 09 2f 2a 20 43 6c 65 61 72 20 6c ..}.../* Clear l
14830 69 73 74 20 6f 66 20 73 6c 6f 74 73 20 2a 2f 0a ist of slots */.
14840 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 29 20 .if (pSlotList)
14850 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
14860 5f 50 52 49 4e 54 46 28 22 50 75 72 67 69 6e 67 _PRINTF("Purging
14870 20 61 6c 6c 20 73 6c 6f 74 20 69 6e 66 6f 72 6d all slot inform
14880 61 74 69 6f 6e 2e 22 29 3b 0a 0a 09 09 2f 2a 20 ation.");..../*
14890 4f 6e 6c 79 20 75 70 64 61 74 65 20 74 68 65 20 Only update the
148a0 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73 20 69 66 list of slots if
148b0 20 77 65 20 61 72 65 20 61 63 74 75 61 6c 6c 79 we are actually
148c0 20 62 65 69 6e 67 20 73 75 70 70 6c 79 20 74 68 being supply th
148d0 65 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69 e slot informati
148e0 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 73 on */...cackey_s
148f0 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f lots_disconnect_
14900 61 6c 6c 28 29 3b 0a 0a 09 09 66 6f 72 20 28 63 all();....for (c
14910 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75 72 urrslot = 0; cur
14920 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 rslot < (sizeof(
14930 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 cackey_slots) /
14940 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c sizeof(cackey_sl
14950 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c ots[0])); currsl
14960 6f 74 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28 63 ot++) {....if (c
14970 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 ackey_slots[curr
14980 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 slot].pcsc_reade
14990 72 29 20 7b 0a 09 09 09 09 66 72 65 65 28 63 61 r) {.....free(ca
149a0 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 ckey_slots[currs
149b0 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 lot].pcsc_reader
149c0 29 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 );......cackey_s
149d0 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 lots[currslot].p
149e0 63 73 63 5f 72 65 61 64 65 72 20 3d 20 4e 55 4c csc_reader = NUL
149f0 4c 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 L;....}.....if (
14a00 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 cackey_slots[cur
14a10 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 29 20 7b 0a rslot].label) {.
14a20 09 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f ....free(cackey_
14a30 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e slots[currslot].
14a40 6c 61 62 65 6c 29 3b 0a 0a 09 09 09 09 63 61 63 label);......cac
14a50 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c key_slots[currsl
14a60 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c ot].label = NULL
14a70 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 ;....}.....cacke
14a80 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 y_slots[currslot
14a90 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 09 ].active = 0;...
14aa0 7d 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d }..}.../* Determ
14ab0 69 6e 65 20 6c 69 73 74 20 6f 66 20 72 65 61 64 ine list of read
14ac0 65 72 73 20 2a 2f 0a 09 70 63 73 63 5f 63 6f 6e ers */..pcsc_con
14ad0 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 nect_ret = cacke
14ae0 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 y_pcsc_connect()
14af0 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e ;..if (pcsc_conn
14b00 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 ect_ret != CACKE
14b10 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 Y_PCSC_S_OK) {..
14b20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
14b30 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e INTF("Connection
14b40 20 74 6f 20 50 43 2f 53 43 20 66 61 69 6c 65 64 to PC/SC failed
14b50 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 73 6c , assuming no sl
14b60 6f 74 73 22 29 3b 0a 0a 09 09 73 6c 6f 74 5f 63 ots");....slot_c
14b70 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 ount = 0;..} els
14b80 65 20 7b 0a 09 09 70 63 73 63 5f 72 65 61 64 65 e {...pcsc_reade
14b90 72 73 5f 6c 65 6e 20 3d 20 30 3b 0a 0a 09 09 73 rs_len = 0;....s
14ba0 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 card_listreaders
14bb0 5f 72 65 74 20 3d 20 53 43 61 72 64 4c 69 73 74 _ret = SCardList
14bc0 52 65 61 64 65 72 73 28 2a 63 61 63 6b 65 79 5f Readers(*cackey_
14bd0 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c pcsc_handle, NUL
14be0 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63 73 63 5f 72 L, NULL, &pcsc_r
14bf0 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 69 eaders_len);...i
14c00 66 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 f (scard_listrea
14c10 64 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 ders_ret == SCAR
14c20 44 5f 53 5f 53 55 43 43 45 53 53 20 26 26 20 70 D_S_SUCCESS && p
14c30 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 20 csc_readers_len
14c40 21 3d 20 30 29 20 7b 0a 09 09 09 70 63 73 63 5f != 0) {....pcsc_
14c50 72 65 61 64 65 72 73 20 3d 20 6d 61 6c 6c 6f 63 readers = malloc
14c60 28 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 (pcsc_readers_le
14c70 6e 29 3b 0a 09 09 09 70 63 73 63 5f 72 65 61 64 n);....pcsc_read
14c80 65 72 73 5f 73 20 3d 20 70 63 73 63 5f 72 65 61 ers_s = pcsc_rea
14c90 64 65 72 73 3b 0a 0a 09 09 09 73 63 61 72 64 5f ders;.....scard_
14ca0 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 listreaders_ret
14cb0 3d 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 = SCardListReade
14cc0 72 73 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f rs(*cackey_pcsc_
14cd0 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 70 63 handle, NULL, pc
14ce0 73 63 5f 72 65 61 64 65 72 73 2c 20 26 70 63 73 sc_readers, &pcs
14cf0 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a c_readers_len);.
14d00 09 09 09 69 66 20 28 73 63 61 72 64 5f 6c 69 73 ...if (scard_lis
14d10 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d 3d 20 treaders_ret ==
14d20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 SCARD_S_SUCCESS)
14d30 20 7b 0a 09 09 09 09 70 63 73 63 5f 72 65 61 64 {.....pcsc_read
14d40 65 72 73 5f 65 20 3d 20 70 63 73 63 5f 72 65 61 ers_e = pcsc_rea
14d50 64 65 72 73 20 2b 20 70 63 73 63 5f 72 65 61 64 ders + pcsc_read
14d60 65 72 73 5f 6c 65 6e 3b 0a 0a 09 09 09 09 2f 2a ers_len;....../*
14d70 20 53 74 61 72 74 20 77 69 74 68 20 53 6c 6f 74 Start with Slot
14d80 20 49 44 20 31 2c 20 74 6f 20 61 76 6f 69 64 20 ID 1, to avoid
14d90 61 20 62 75 67 20 69 6e 20 47 44 4d 20 6f 6e 20 a bug in GDM on
14da0 52 48 45 4c 20 2a 2f 0a 09 09 09 09 2f 2a 20 42 RHEL */...../* B
14db0 75 67 20 35 39 34 39 31 31 3a 20 68 74 74 70 73 ug 594911: https
14dc0 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e 72 65 64 68 ://bugzilla.redh
14dd0 61 74 2e 63 6f 6d 2f 73 68 6f 77 5f 62 75 67 2e at.com/show_bug.
14de0 63 67 69 3f 69 64 3d 35 39 34 39 31 31 20 2a 2f cgi?id=594911 */
14df0 0a 09 09 09 09 63 75 72 72 73 6c 6f 74 20 3d 20 .....currslot =
14e00 31 3b 0a 09 09 09 09 77 68 69 6c 65 20 28 70 63 1;.....while (pc
14e10 73 63 5f 72 65 61 64 65 72 73 20 3c 20 70 63 73 sc_readers < pcs
14e20 63 5f 72 65 61 64 65 72 73 5f 65 29 20 7b 0a 09 c_readers_e) {..
14e30 09 09 09 09 63 75 72 72 5f 72 65 61 64 65 72 5f ....curr_reader_
14e40 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 70 63 73 len = strlen(pcs
14e50 63 5f 72 65 61 64 65 72 73 29 3b 0a 0a 09 09 09 c_readers);.....
14e60 09 09 69 66 20 28 28 70 63 73 63 5f 72 65 61 64 ..if ((pcsc_read
14e70 65 72 73 20 2b 20 63 75 72 72 5f 72 65 61 64 65 ers + curr_reade
14e80 72 5f 6c 65 6e 29 20 3e 20 70 63 73 63 5f 72 65 r_len) > pcsc_re
14e90 61 64 65 72 73 5f 65 29 20 7b 0a 09 09 09 09 09 aders_e) {......
14ea0 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a .break;......}..
14eb0 09 09 09 09 09 69 66 20 28 63 75 72 72 5f 72 65 .....if (curr_re
14ec0 61 64 65 72 5f 6c 65 6e 20 3d 3d 20 30 29 20 7b ader_len == 0) {
14ed0 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 .......break;...
14ee0 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 63 ...}.......if (c
14ef0 75 72 72 73 6c 6f 74 20 3e 3d 20 28 73 69 7a 65 urrslot >= (size
14f00 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 of(cackey_slots)
14f10 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 / sizeof(cackey
14f20 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 _slots[0]))) {..
14f30 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
14f40 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 G_PRINTF("Found
14f50 6d 6f 72 65 20 72 65 61 64 65 72 73 20 74 68 61 more readers tha
14f60 6e 20 73 6c 6f 74 73 20 61 72 65 20 61 76 61 69 n slots are avai
14f70 6c 61 62 6c 65 21 22 29 3b 0a 0a 09 09 09 09 09 lable!");.......
14f80 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a .break;......}..
14f90 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
14fa0 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 G_PRINTF("Found
14fb0 72 65 61 64 65 72 3a 20 25 73 22 2c 20 70 63 73 reader: %s", pcs
14fc0 63 5f 72 65 61 64 65 72 73 29 3b 0a 0a 09 09 09 c_readers);.....
14fd0 09 09 2f 2a 20 4f 6e 6c 79 20 75 70 64 61 74 65 ../* Only update
14fe0 20 74 68 65 20 6c 69 73 74 20 6f 66 20 73 6c 6f the list of slo
14ff0 74 73 20 69 66 20 77 65 20 61 72 65 20 61 63 74 ts if we are act
15000 75 61 6c 6c 79 20 62 65 69 6e 67 20 61 73 6b 65 ually being aske
15010 64 20 73 75 70 70 6c 79 20 74 68 65 20 73 6c 6f d supply the slo
15020 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f t information */
15030 0a 09 09 09 09 09 69 66 20 28 70 53 6c 6f 74 4c ......if (pSlotL
15040 69 73 74 29 20 7b 0a 09 09 09 09 09 09 63 61 63 ist) {.......cac
15050 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c key_slots[currsl
15060 6f 74 5d 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a ot].active = 1;.
15070 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f ......cackey_slo
15080 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 ts[currslot].pcs
15090 63 5f 72 65 61 64 65 72 20 3d 20 73 74 72 64 75 c_reader = strdu
150a0 70 28 70 63 73 63 5f 72 65 61 64 65 72 73 29 3b p(pcsc_readers);
150b0 0a 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c .......cackey_sl
150c0 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 ots[currslot].pc
150d0 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 sc_card_connecte
150e0 64 20 3d 20 30 3b 0a 09 09 09 09 09 09 63 61 63 d = 0;.......cac
150f0 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c key_slots[currsl
15100 6f 74 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f ot].transaction_
15110 64 65 70 74 68 20 3d 20 30 3b 0a 09 09 09 09 09 depth = 0;......
15120 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 .cackey_slots[cu
15130 72 72 73 6c 6f 74 5d 2e 73 6c 6f 74 5f 72 65 73 rrslot].slot_res
15140 65 74 20 3d 20 31 3b 0a 09 09 09 09 09 09 63 61 et = 1;.......ca
15150 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 ckey_slots[currs
15160 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 lot].token_flags
15170 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 = CKF_LOGIN_REQ
15180 55 49 52 45 44 3b 0a 09 09 09 09 09 09 63 61 63 UIRED;.......cac
15190 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c key_slots[currsl
151a0 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c ot].label = NULL
151b0 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 09 63 75 ;......}......cu
151c0 72 72 73 6c 6f 74 2b 2b 3b 0a 0a 09 09 09 09 09 rrslot++;.......
151d0 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b 3d 20 pcsc_readers +=
151e0 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 curr_reader_len
151f0 2b 20 31 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 + 1;.....}......
15200 2f 2a 20 53 74 61 72 74 20 77 69 74 68 20 53 6c /* Start with Sl
15210 6f 74 20 49 44 20 31 2c 20 74 6f 20 61 76 6f 69 ot ID 1, to avoi
15220 64 20 61 20 62 75 67 20 69 6e 20 47 44 4d 20 6f d a bug in GDM o
15230 6e 20 52 48 45 4c 20 2a 2f 0a 09 09 09 09 2f 2a n RHEL */...../*
15240 20 42 75 67 20 35 39 34 39 31 31 3a 20 68 74 74 Bug 594911: htt
15250 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e 72 65 ps://bugzilla.re
15260 64 68 61 74 2e 63 6f 6d 2f 73 68 6f 77 5f 62 75 dhat.com/show_bu
15270 67 2e 63 67 69 3f 69 64 3d 35 39 34 39 31 31 20 g.cgi?id=594911
15280 2a 2f 0a 09 09 09 09 69 66 20 28 63 75 72 72 73 */.....if (currs
15290 6c 6f 74 20 3e 20 31 29 20 7b 0a 09 09 09 09 09 lot > 1) {......
152a0 2f 2a 20 53 74 61 72 74 20 77 69 74 68 20 53 6c /* Start with Sl
152b0 6f 74 20 49 44 20 31 2c 20 74 6f 20 61 76 6f 69 ot ID 1, to avoi
152c0 64 20 61 20 62 75 67 20 69 6e 20 47 44 4d 20 6f d a bug in GDM o
152d0 6e 20 52 48 45 4c 20 2a 2f 0a 09 09 09 09 09 2f n RHEL */....../
152e0 2a 20 42 75 67 20 35 39 34 39 31 31 3a 20 68 74 * Bug 594911: ht
152f0 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e 72 tps://bugzilla.r
15300 65 64 68 61 74 2e 63 6f 6d 2f 73 68 6f 77 5f 62 edhat.com/show_b
15310 75 67 2e 63 67 69 3f 69 64 3d 35 39 34 39 31 31 ug.cgi?id=594911
15320 20 2a 2f 0a 09 09 09 09 09 73 6c 6f 74 5f 63 6f */......slot_co
15330 75 6e 74 20 3d 20 63 75 72 72 73 6c 6f 74 20 2d unt = currslot -
15340 20 31 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 1;.....}....} e
15350 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 lse {.....CACKEY
15360 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 _DEBUG_PRINTF("S
15370 65 63 6f 6e 64 20 63 61 6c 6c 20 74 6f 20 53 43 econd call to SC
15380 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 20 66 ardListReaders f
15390 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 20 25 73 ailed, return %s
153a0 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59 5f 44 45 /%li", CACKEY_DE
153b0 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 BUG_FUNC_SCARDER
153c0 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 6c R_TO_STR(scard_l
153d0 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29 2c istreaders_ret),
153e0 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 6c 69 (long) scard_li
153f0 73 74 72 65 61 64 65 72 73 5f 72 65 74 29 3b 0a streaders_ret);.
15400 09 09 09 7d 0a 0a 09 09 09 66 72 65 65 28 70 63 ...}.....free(pc
15410 73 63 5f 72 65 61 64 65 72 73 5f 73 29 3b 0a 09 sc_readers_s);..
15420 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 .} else {....CAC
15430 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
15440 28 22 46 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 ("First call to
15450 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 SCardListReaders
15460 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 20 failed, return
15470 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59 5f %s/%li", CACKEY_
15480 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 DEBUG_FUNC_SCARD
15490 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 ERR_TO_STR(scard
154a0 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 _listreaders_ret
154b0 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f ), (long) scard_
154c0 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29 listreaders_ret)
154d0 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 ;...}..}...mutex
154e0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 _retval = cackey
154f0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 _mutex_unlock(ca
15500 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 ckey_biglock);..
15510 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c if (mutex_retval
15520 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 != 0) {...CACKE
15530 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
15540 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e Error. Unlockin
15550 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 g failed.");....
15560 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 return(CKR_GENER
15570 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 AL_ERROR);..}...
15580 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 20 3d 3d if (pSlotList ==
15590 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c 43 NULL) {...*pulC
155a0 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f 75 6e ount = slot_coun
155b0 74 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 t;....CACKEY_DEB
155c0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
155d0 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 ning CKR_OK (%i)
155e0 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 ", CKR_OK);....r
155f0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 eturn(CKR_OK);..
15600 7d 0a 0a 09 63 6f 75 6e 74 20 3d 20 2a 70 75 6c }...count = *pul
15610 43 6f 75 6e 74 3b 0a 09 69 66 20 28 63 6f 75 6e Count;..if (coun
15620 74 20 3c 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 20 t < slot_count)
15630 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
15640 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
15650 55 73 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 25 User allocated %
15660 6c 75 20 65 6e 74 72 69 65 73 2c 20 62 75 74 20 lu entries, but
15670 77 65 20 68 61 76 65 20 25 6c 75 20 65 6e 74 72 we have %lu entr
15680 69 65 73 2e 22 2c 20 63 6f 75 6e 74 2c 20 73 6c ies.", count, sl
15690 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 ot_count);....re
156a0 74 75 72 6e 28 43 4b 52 5f 42 55 46 46 45 52 5f turn(CKR_BUFFER_
156b0 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 09 0a 09 7d 0a TOO_SMALL);...}.
156c0 0a 09 66 6f 72 20 28 63 75 72 72 73 6c 6f 74 20 ..for (currslot
156d0 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20 = 0; currslot <
156e0 73 6c 6f 74 5f 63 6f 75 6e 74 3b 20 63 75 72 72 slot_count; curr
156f0 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 2f 2a 20 53 slot++) {.../* S
15700 74 61 72 74 20 77 69 74 68 20 53 6c 6f 74 20 49 tart with Slot I
15710 44 20 31 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 D 1, to avoid a
15720 62 75 67 20 69 6e 20 47 44 4d 20 6f 6e 20 52 48 bug in GDM on RH
15730 45 4c 20 2a 2f 0a 09 09 2f 2a 20 42 75 67 20 35 EL */.../* Bug 5
15740 39 34 39 31 31 3a 20 68 74 74 70 73 3a 2f 2f 62 94911: https://b
15750 75 67 7a 69 6c 6c 61 2e 72 65 64 68 61 74 2e 63 ugzilla.redhat.c
15760 6f 6d 2f 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f om/show_bug.cgi?
15770 69 64 3d 35 39 34 39 31 31 20 2a 2f 0a 09 09 70 id=594911 */...p
15780 53 6c 6f 74 4c 69 73 74 5b 63 75 72 72 73 6c 6f SlotList[currslo
15790 74 5d 20 3d 20 63 75 72 72 73 6c 6f 74 20 2b 20 t] = currslot +
157a0 31 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 43 6f 75 6e 1;..}...*pulCoun
157b0 74 20 3d 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b 0a t = slot_count;.
157c0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
157d0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
157e0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 2e 20 20 46 CKR_OK (%i). F
157f0 6f 75 6e 64 20 25 6c 75 20 72 65 61 64 65 72 73 ound %lu readers
15800 2e 22 2c 20 43 4b 52 5f 4f 4b 2c 20 28 75 6e 73 .", CKR_OK, (uns
15810 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 6c 6f 74 igned long) slot
15820 5f 63 6f 75 6e 74 29 3b 0a 0a 09 72 65 74 75 72 _count);...retur
15830 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 74 6f 6b n(CKR_OK);...tok
15840 65 6e 50 72 65 73 65 6e 74 20 3d 20 74 6f 6b 65 enPresent = toke
15850 6e 50 72 65 73 65 6e 74 3b 20 2f 2a 20 53 75 70 nPresent; /* Sup
15860 72 65 73 73 20 75 6e 75 73 65 64 20 76 61 72 69 ress unused vari
15870 61 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a able warning */.
15880 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e }..CK_DEFINE_FUN
15890 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 CTION(CK_RV, C_G
158a0 65 74 53 6c 6f 74 49 6e 66 6f 29 28 43 4b 5f 53 etSlotInfo)(CK_S
158b0 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 LOT_ID slotID, C
158c0 4b 5f 53 4c 4f 54 5f 49 4e 46 4f 5f 50 54 52 20 K_SLOT_INFO_PTR
158d0 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74 69 63 pInfo) {..static
158e0 20 43 4b 5f 55 54 46 38 43 48 41 52 20 73 6c 6f CK_UTF8CHAR slo
158f0 74 44 65 73 63 72 69 70 74 69 6f 6e 5b 5d 20 3d tDescription[] =
15900 20 22 43 41 43 4b 65 79 20 53 6c 6f 74 22 3b 0a "CACKey Slot";.
15910 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 .int mutex_retva
15920 6c 3b 0a 09 69 6e 74 20 62 79 74 65 73 5f 74 6f l;..int bytes_to
15930 5f 63 6f 70 79 3b 0a 0a 09 43 41 43 4b 45 59 5f _copy;...CACKEY_
15940 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
15950 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 lled.");...if (p
15960 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a Info == NULL) {.
15970 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
15980 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49 RINTF("Error. pI
15990 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a nfo is NULL.");.
159a0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 ...return(CKR_AR
159b0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d GUMENTS_BAD);..}
159c0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 ...if (!cackey_i
159d0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 nitialized) {...
159e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
159f0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 NTF("Error. Not
15a00 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b initialized.");
15a10 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 ....return(CKR_C
15a20 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 RYPTOKI_NOT_INIT
15a30 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 IALIZED);..}...i
15a40 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c f (slotID < 0 ||
15a50 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 slotID >= (size
15a60 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 of(cackey_slots)
15a70 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 / sizeof(cackey
15a80 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 _slots[0]))) {..
15a90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
15aa0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 INTF("Error. Inv
15ab0 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 alid slot reques
15ac0 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 ted (%lu), outsi
15ad0 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 de of valid rang
15ae0 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 e", slotID);....
15af0 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f return(CKR_SLOT_
15b00 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a ID_INVALID);..}.
15b10 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d ..mutex_retval =
15b20 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f cackey_mutex_lo
15b30 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
15b40 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 k);..if (mutex_r
15b50 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 etval != 0) {...
15b60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
15b70 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 NTF("Error. Loc
15b80 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a king failed.");.
15b90 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 ...return(CKR_GE
15ba0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d NERAL_ERROR);..}
15bb0 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c ...if (cackey_sl
15bc0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 ots[slotID].acti
15bd0 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 ve == 0) {...CAC
15be0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
15bf0 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 ("Error. Invalid
15c00 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 slot requested
15c10 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 (%lu), slot not
15c20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 currently active
15c30 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 ", slotID);....c
15c40 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f ackey_mutex_unlo
15c50 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
15c60 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b k);....return(CK
15c70 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 R_SLOT_ID_INVALI
15c80 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e D);..}...pInfo->
15c90 66 6c 61 67 73 20 3d 20 43 4b 46 5f 52 45 4d 4f flags = CKF_REMO
15ca0 56 41 42 4c 45 5f 44 45 56 49 43 45 20 7c 20 43 VABLE_DEVICE | C
15cb0 4b 46 5f 48 57 5f 53 4c 4f 54 3b 0a 0a 09 69 66 KF_HW_SLOT;...if
15cc0 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 (cackey_token_p
15cd0 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f 73 resent(&cackey_s
15ce0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 3d 3d lots[slotID]) ==
15cf0 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 CACKEY_PCSC_S_T
15d00 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09 OKENPRESENT) {..
15d10 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 7c 3d .pInfo->flags |=
15d20 20 43 4b 46 5f 54 4f 4b 45 4e 5f 50 52 45 53 45 CKF_TOKEN_PRESE
15d30 4e 54 3b 0a 09 7d 0a 0a 09 62 79 74 65 73 5f 74 NT;..}...bytes_t
15d40 6f 5f 63 6f 70 79 20 3d 20 73 74 72 6c 65 6e 28 o_copy = strlen(
15d50 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f cackey_slots[slo
15d60 74 49 44 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 tID].pcsc_reader
15d70 29 3b 0a 09 69 66 20 28 73 69 7a 65 6f 66 28 70 );..if (sizeof(p
15d80 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 Info->manufactur
15d90 65 72 49 44 29 20 3c 20 62 79 74 65 73 5f 74 6f erID) < bytes_to
15da0 5f 63 6f 70 79 29 20 7b 0a 09 09 62 79 74 65 73 _copy) {...bytes
15db0 5f 74 6f 5f 63 6f 70 79 20 3d 20 73 69 7a 65 6f _to_copy = sizeo
15dc0 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 f(pInfo->manufac
15dd0 74 75 72 65 72 49 44 29 3b 0a 09 7d 0a 09 6d 65 turerID);..}..me
15de0 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 mcpy(pInfo->manu
15df0 66 61 63 74 75 72 65 72 49 44 2c 20 63 61 63 6b facturerID, cack
15e00 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d ey_slots[slotID]
15e10 2e 70 63 73 63 5f 72 65 61 64 65 72 2c 20 62 79 .pcsc_reader, by
15e20 74 65 73 5f 74 6f 5f 63 6f 70 79 29 3b 0a 0a 09 tes_to_copy);...
15e30 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 mutex_retval = c
15e40 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f ackey_mutex_unlo
15e50 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
15e60 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 k);..if (mutex_r
15e70 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 etval != 0) {...
15e80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
15e90 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c NTF("Error. Unl
15ea0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 ocking failed.")
15eb0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
15ec0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a GENERAL_ERROR);.
15ed0 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 .}...memset(pInf
15ee0 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70 74 69 o->slotDescripti
15ef0 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 on, ' ', sizeof(
15f00 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 pInfo->slotDescr
15f10 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d 63 70 iption));..memcp
15f20 79 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 y(pInfo->slotDes
15f30 63 72 69 70 74 69 6f 6e 2c 20 73 6c 6f 74 44 65 cription, slotDe
15f40 73 63 72 69 70 74 69 6f 6e 2c 20 73 69 7a 65 6f scription, sizeo
15f50 66 28 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f f(slotDescriptio
15f60 6e 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 n) - 1);...memse
15f70 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 t(pInfo->manufac
15f80 74 75 72 65 72 49 44 2c 20 27 20 27 2c 20 73 69 turerID, ' ', si
15f90 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 zeof(pInfo->manu
15fa0 66 61 63 74 75 72 65 72 49 44 29 29 3b 0a 0a 09 facturerID));...
15fb0 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 pInfo->hardwareV
15fc0 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 ersion.major = (
15fd0 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f cackey_getversio
15fe0 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66 n() >> 16) & 0xf
15ff0 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 f;..pInfo->hardw
16000 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 areVersion.minor
16010 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 = (cackey_getve
16020 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26 20 rsion() >> 8) &
16030 30 78 66 66 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 0xff;...pInfo->f
16040 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d irmwareVersion.m
16050 61 6a 6f 72 20 3d 20 30 78 30 30 3b 0a 09 70 49 ajor = 0x00;..pI
16060 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 nfo->firmwareVer
16070 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 30 78 30 sion.minor = 0x0
16080 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 0;...CACKEY_DEBU
16090 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
160a0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 ing CKR_OK (%i)"
160b0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 , CKR_OK);...ret
160c0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a urn(CKR_OK);.}..
160d0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 CK_DEFINE_FUNCTI
160e0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 54 ON(CK_RV, C_GetT
160f0 6f 6b 65 6e 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f okenInfo)(CK_SLO
16100 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f T_ID slotID, CK_
16110 54 4f 4b 45 4e 5f 49 4e 46 4f 5f 50 54 52 20 70 TOKEN_INFO_PTR p
16120 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74 69 63 20 Info) {..static
16130 43 4b 5f 55 54 46 38 43 48 41 52 20 6d 61 6e 75 CK_UTF8CHAR manu
16140 66 61 63 74 75 72 65 72 49 44 5b 5d 20 3d 20 22 facturerID[] = "
16150 55 2e 53 2e 20 47 6f 76 65 72 6e 6d 65 6e 74 22 U.S. Government"
16160 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 ;..static CK_UTF
16170 38 43 48 41 52 20 64 65 66 61 75 6c 74 4c 61 62 8CHAR defaultLab
16180 65 6c 5b 5d 20 3d 20 22 55 6e 6b 6e 6f 77 6e 20 el[] = "Unknown
16190 54 6f 6b 65 6e 22 3b 0a 09 73 74 61 74 69 63 20 Token";..static
161a0 43 4b 5f 55 54 46 38 43 48 41 52 20 6d 6f 64 65 CK_UTF8CHAR mode
161b0 6c 5b 5d 20 3d 20 22 43 41 43 20 54 6f 6b 65 6e l[] = "CAC Token
161c0 22 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 ";..struct cacke
161d0 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 y_pcsc_identity
161e0 2a 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 *pcsc_identities
161f0 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 ;..unsigned long
16200 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 09 73 73 69 num_certs;..ssi
16210 7a 65 5f 74 20 6c 61 62 65 6c 5f 72 65 74 3b 0a ze_t label_ret;.
16220 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 .int mutex_retva
16230 6c 3b 0a 09 69 6e 74 20 75 73 65 5f 64 65 66 61 l;..int use_defa
16240 75 6c 74 5f 6c 61 62 65 6c 3b 0a 0a 09 43 41 43 ult_label;...CAC
16250 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
16260 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 ("Called.");...i
16270 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c f (pInfo == NULL
16280 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
16290 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
162a0 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e . pInfo is NULL.
162b0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
162c0 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 R_ARGUMENTS_BAD)
162d0 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b ;..}...if (!cack
162e0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 ey_initialized)
162f0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
16300 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
16310 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 Not initialized
16320 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
16330 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f KR_CRYPTOKI_NOT_
16340 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d INITIALIZED);..}
16350 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 ...if (slotID <
16360 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 0 || slotID >= (
16370 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c sizeof(cackey_sl
16380 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 ots) / sizeof(ca
16390 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 ckey_slots[0])))
163a0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
163b0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
163c0 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 Invalid slot re
163d0 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f quested (%lu), o
163e0 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 utside of valid
163f0 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b range", slotID);
16400 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 ....return(CKR_S
16410 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b LOT_ID_INVALID);
16420 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 ..}...mutex_retv
16430 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 al = cackey_mute
16440 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 x_lock(cackey_bi
16450 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 glock);..if (mut
16460 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 ex_retval != 0)
16470 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
16480 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
16490 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e Locking failed.
164a0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
164b0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 R_GENERAL_ERROR)
164c0 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 ;..}...if (cacke
164d0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e y_slots[slotID].
164e0 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 active == 0) {..
164f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
16500 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 INTF("Error. Inv
16510 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 alid slot reques
16520 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 ted (%lu), slot
16530 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 not currently ac
16540 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a tive", slotID);.
16550 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f ...cackey_mutex_
16560 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 unlock(cackey_bi
16570 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 glock);....retur
16580 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e n(CKR_SLOT_ID_IN
16590 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 VALID);..}...if
165a0 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 (cackey_token_pr
165b0 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f 73 6c esent(&cackey_sl
165c0 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 21 3d 20 ots[slotID]) !=
165d0 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f CACKEY_PCSC_S_TO
165e0 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09 09 KENPRESENT) {...
165f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
16600 4e 54 46 28 22 4e 6f 20 74 6f 6b 65 6e 20 69 73 NTF("No token is
16610 20 70 72 65 73 65 6e 74 20 69 6e 20 73 6c 6f 74 present in slot
16620 49 44 20 3d 20 25 6c 75 22 2c 20 73 6c 6f 74 49 ID = %lu", slotI
16630 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 D);....cackey_mu
16640 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 tex_unlock(cacke
16650 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 y_biglock);....r
16660 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f eturn(CKR_TOKEN_
16670 4e 4f 54 5f 50 52 45 53 45 4e 54 29 3b 0a 09 7d NOT_PRESENT);..}
16680 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 ...mutex_retval
16690 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 = cackey_mutex_u
166a0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 nlock(cackey_big
166b0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 lock);..if (mute
166c0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b x_retval != 0) {
166d0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
166e0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
166f0 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 Unlocking failed
16700 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
16710 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 KR_GENERAL_ERROR
16720 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 );..}.../* Deter
16730 6d 69 6e 65 20 74 6f 6b 65 6e 20 6c 61 62 65 6c mine token label
16740 20 66 72 6f 6d 20 63 65 72 74 69 66 69 63 61 74 from certificat
16750 65 73 20 2a 2f 0a 09 6d 65 6d 73 65 74 28 70 49 es */..memset(pI
16760 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 27 20 27 2c nfo->label, ' ',
16770 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c sizeof(pInfo->l
16780 61 62 65 6c 29 29 3b 0a 09 75 73 65 5f 64 65 66 abel));..use_def
16790 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 31 3b 0a ault_label = 1;.
167a0 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f ..if (cackey_slo
167b0 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c ts[slotID].label
167c0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 70 63 == NULL) {...pc
167d0 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 3d 20 sc_identities =
167e0 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 cackey_read_cert
167f0 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b s(&cackey_slots[
16800 73 6c 6f 74 49 44 5d 2c 20 4e 55 4c 4c 2c 20 26 slotID], NULL, &
16810 6e 75 6d 5f 63 65 72 74 73 29 3b 0a 09 09 69 66 num_certs);...if
16820 20 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 (pcsc_identitie
16830 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 s != NULL) {....
16840 69 66 20 28 6e 75 6d 5f 63 65 72 74 73 20 3e 20 if (num_certs >
16850 30 29 20 7b 0a 09 09 09 09 6c 61 62 65 6c 5f 72 0) {.....label_r
16860 65 74 20 3d 20 63 61 63 6b 65 79 5f 70 63 73 63 et = cackey_pcsc
16870 5f 69 64 65 6e 74 69 74 79 5f 74 6f 5f 6c 61 62 _identity_to_lab
16880 65 6c 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 el(pcsc_identiti
16890 65 73 2c 20 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c es, pInfo->label
168a0 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e , sizeof(pInfo->
168b0 6c 61 62 65 6c 29 29 3b 0a 09 09 09 09 69 66 20 label));.....if
168c0 28 6c 61 62 65 6c 5f 72 65 74 20 3e 20 30 29 20 (label_ret > 0)
168d0 7b 0a 09 09 09 09 09 75 73 65 5f 64 65 66 61 75 {......use_defau
168e0 6c 74 5f 6c 61 62 65 6c 20 3d 20 30 3b 0a 0a 09 lt_label = 0;...
168f0 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 ....cackey_slots
16900 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 3d [slotID].label =
16910 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 70 malloc(sizeof(p
16920 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 0a Info->label));..
16930 09 09 09 09 09 6d 65 6d 63 70 79 28 63 61 63 6b .....memcpy(cack
16940 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d ey_slots[slotID]
16950 2e 6c 61 62 65 6c 2c 20 70 49 6e 66 6f 2d 3e 6c .label, pInfo->l
16960 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e abel, sizeof(pIn
16970 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 09 09 fo->label));....
16980 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b .}....}.....cack
16990 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 70 63 ey_free_certs(pc
169a0 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 6e sc_identities, n
169b0 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b 0a 09 09 um_certs, 1);...
169c0 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d 65 }..} else {...me
169d0 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 mcpy(pInfo->labe
169e0 6c 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b l, cackey_slots[
169f0 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 2c 20 73 slotID].label, s
16a00 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 izeof(pInfo->lab
16a10 65 6c 29 29 3b 0a 0a 09 09 75 73 65 5f 64 65 66 el));....use_def
16a20 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 30 3b 0a ault_label = 0;.
16a30 09 7d 0a 0a 09 69 66 20 28 75 73 65 5f 64 65 66 .}...if (use_def
16a40 61 75 6c 74 5f 6c 61 62 65 6c 29 20 7b 0a 09 09 ault_label) {...
16a50 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 61 memcpy(pInfo->la
16a60 62 65 6c 2c 20 64 65 66 61 75 6c 74 4c 61 62 65 bel, defaultLabe
16a70 6c 2c 20 73 69 7a 65 6f 66 28 64 65 66 61 75 6c l, sizeof(defaul
16a80 74 4c 61 62 65 6c 29 20 2d 20 31 29 3b 0a 09 7d tLabel) - 1);..}
16a90 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d ...memset(pInfo-
16aa0 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c >manufacturerID,
16ab0 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e ' ', sizeof(pIn
16ac0 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 fo->manufacturer
16ad0 49 44 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 ID));..memcpy(pI
16ae0 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 nfo->manufacture
16af0 72 49 44 2c 20 6d 61 6e 75 66 61 63 74 75 72 65 rID, manufacture
16b00 72 49 44 2c 20 73 69 7a 65 6f 66 28 6d 61 6e 75 rID, sizeof(manu
16b10 66 61 63 74 75 72 65 72 49 44 29 20 2d 20 31 29 facturerID) - 1)
16b20 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f ;...memset(pInfo
16b30 2d 3e 6d 6f 64 65 6c 2c 20 27 20 27 2c 20 73 69 ->model, ' ', si
16b40 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 zeof(pInfo->mode
16b50 6c 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e l));..memcpy(pIn
16b60 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 6d 6f 64 65 6c fo->model, model
16b70 2c 20 73 69 7a 65 6f 66 28 6d 6f 64 65 6c 29 20 , sizeof(model)
16b80 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 - 1);...memset(p
16b90 49 6e 66 6f 2d 3e 73 65 72 69 61 6c 4e 75 6d 62 Info->serialNumb
16ba0 65 72 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 er, ' ', sizeof(
16bb0 70 49 6e 66 6f 2d 3e 73 65 72 69 61 6c 4e 75 6d pInfo->serialNum
16bc0 62 65 72 29 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 ber));...memset(
16bd0 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d 65 2c 20 pInfo->utcTime,
16be0 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 ' ', sizeof(pInf
16bf0 6f 2d 3e 75 74 63 54 69 6d 65 29 29 3b 0a 0a 09 o->utcTime));...
16c00 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 pInfo->hardwareV
16c10 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 ersion.major = (
16c20 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f cackey_getversio
16c30 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66 n() >> 16) & 0xf
16c40 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 f;..pInfo->hardw
16c50 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 areVersion.minor
16c60 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 = (cackey_getve
16c70 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26 20 rsion() >> 8) &
16c80 30 78 66 66 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 0xff;...pInfo->f
16c90 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d irmwareVersion.m
16ca0 61 6a 6f 72 20 3d 20 30 78 30 30 3b 0a 09 70 49 ajor = 0x00;..pI
16cb0 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 nfo->firmwareVer
16cc0 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 30 78 30 sion.minor = 0x0
16cd0 30 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 0;...pInfo->flag
16ce0 73 20 3d 20 43 4b 46 5f 57 52 49 54 45 5f 50 52 s = CKF_WRITE_PR
16cf0 4f 54 45 43 54 45 44 20 7c 20 43 4b 46 5f 55 53 OTECTED | CKF_US
16d00 45 52 5f 50 49 4e 5f 49 4e 49 54 49 41 4c 49 5a ER_PIN_INITIALIZ
16d10 45 44 20 7c 20 43 4b 46 5f 54 4f 4b 45 4e 5f 49 ED | CKF_TOKEN_I
16d20 4e 49 54 49 41 4c 49 5a 45 44 20 7c 20 63 61 63 NITIALIZED | cac
16d30 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 key_slots[slotID
16d40 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 3b 0a 0a ].token_flags;..
16d50 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 53 65 73 .pInfo->ulMaxSes
16d60 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 28 73 69 7a sionCount = (siz
16d70 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 eof(cackey_sessi
16d80 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 ons) / sizeof(ca
16d90 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d ckey_sessions[0]
16da0 29 29 20 2d 20 31 3b 0a 09 70 49 6e 66 6f 2d 3e )) - 1;..pInfo->
16db0 75 6c 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d ulSessionCount =
16dc0 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f CK_UNAVAILABLE_
16dd0 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 INFORMATION;..pI
16de0 6e 66 6f 2d 3e 75 6c 4d 61 78 52 77 53 65 73 73 nfo->ulMaxRwSess
16df0 69 6f 6e 43 6f 75 6e 74 20 3d 20 30 3b 0a 09 70 ionCount = 0;..p
16e00 49 6e 66 6f 2d 3e 75 6c 52 77 53 65 73 73 69 6f Info->ulRwSessio
16e10 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f 55 4e 41 56 nCount = CK_UNAV
16e20 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 AILABLE_INFORMAT
16e30 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d ION;..pInfo->ulM
16e40 61 78 50 69 6e 4c 65 6e 20 3d 20 31 32 38 3b 0a axPinLen = 128;.
16e50 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 50 69 6e .pInfo->ulMinPin
16e60 4c 65 6e 20 3d 20 30 3b 0a 09 70 49 6e 66 6f 2d Len = 0;..pInfo-
16e70 3e 75 6c 54 6f 74 61 6c 50 75 62 6c 69 63 4d 65 >ulTotalPublicMe
16e80 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 mory = CK_UNAVAI
16e90 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f LABLE_INFORMATIO
16ea0 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 46 72 65 N;..pInfo->ulFre
16eb0 65 50 75 62 6c 69 63 4d 65 6d 6f 72 79 20 3d 20 ePublicMemory =
16ec0 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 CK_UNAVAILABLE_I
16ed0 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e NFORMATION;..pIn
16ee0 66 6f 2d 3e 75 6c 54 6f 74 61 6c 50 72 69 76 61 fo->ulTotalPriva
16ef0 74 65 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e teMemory = CK_UN
16f00 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d AVAILABLE_INFORM
16f10 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 ATION;..pInfo->u
16f20 6c 46 72 65 65 50 72 69 76 61 74 65 4d 65 6d 6f lFreePrivateMemo
16f30 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 ry = CK_UNAVAILA
16f40 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b BLE_INFORMATION;
16f50 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
16f60 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e PRINTF("Returnin
16f70 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 g CKR_OK (%i)",
16f80 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 CKR_OK);...retur
16f90 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b n(CKR_OK);.}..CK
16fa0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e _DEFINE_FUNCTION
16fb0 28 43 4b 5f 52 56 2c 20 43 5f 57 61 69 74 46 6f (CK_RV, C_WaitFo
16fc0 72 53 6c 6f 74 45 76 65 6e 74 29 28 43 4b 5f 46 rSlotEvent)(CK_F
16fd0 4c 41 47 53 20 66 6c 61 67 73 2c 20 43 4b 5f 53 LAGS flags, CK_S
16fe0 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53 6c 6f 74 LOT_ID_PTR pSlot
16ff0 49 44 2c 20 43 4b 5f 56 4f 49 44 5f 50 54 52 20 ID, CK_VOID_PTR
17000 70 52 65 73 65 72 76 65 64 29 20 7b 0a 09 43 41 pReserved) {..CA
17010 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
17020 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
17030 69 66 20 28 70 52 65 73 65 72 76 65 64 20 21 3d if (pReserved !=
17040 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 NULL) {...CACKE
17050 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
17060 45 72 72 6f 72 2e 20 70 52 65 73 65 72 76 65 64 Error. pReserved
17070 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b is not NULL.");
17080 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 ....return(CKR_A
17090 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 RGUMENTS_BAD);..
170a0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f }...if (!cackey_
170b0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 initialized) {..
170c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
170d0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f INTF("Error. No
170e0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 t initialized.")
170f0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
17100 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 CRYPTOKI_NOT_INI
17110 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 TIALIZED);..}...
17120 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
17130 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 NTF("Returning C
17140 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
17150 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c SUPPORTED (%i)",
17160 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f CKR_FUNCTION_NO
17170 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 T_SUPPORTED);...
17180 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 return(CKR_FUNCT
17190 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
171a0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 D);.}..CK_DEFINE
171b0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c _FUNCTION(CK_RV,
171c0 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c C_GetMechanismL
171d0 69 73 74 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 ist)(CK_SLOT_ID
171e0 73 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45 43 48 41 slotID, CK_MECHA
171f0 4e 49 53 4d 5f 54 59 50 45 5f 50 54 52 20 70 4d NISM_TYPE_PTR pM
17200 65 63 68 61 6e 69 73 6d 4c 69 73 74 2c 20 43 4b echanismList, CK
17210 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f _ULONG_PTR pulCo
17220 75 6e 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 unt) {..CACKEY_D
17230 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
17240 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 led.");...if (!c
17250 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 ackey_initialize
17260 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 d) {...CACKEY_DE
17270 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
17280 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 r. Not initiali
17290 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 zed.");....retur
172a0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e n(CKR_CRYPTOKI_N
172b0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b OT_INITIALIZED);
172c0 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 43 6f 75 ..}...if (pulCou
172d0 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 nt == NULL) {...
172e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
172f0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70 75 6c NTF("Error. pul
17300 43 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2e 22 29 Count is NULL.")
17310 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
17320 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a ARGUMENTS_BAD);.
17330 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e .}...if (pMechan
17340 69 73 6d 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 ismList == NULL)
17350 20 7b 0a 09 09 2a 70 75 6c 43 6f 75 6e 74 20 3d {...*pulCount =
17360 20 33 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 3;....CACKEY_DE
17370 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
17380 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 rning CKR_OK (%i
17390 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 )", CKR_OK);....
173a0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a return(CKR_OK);.
173b0 09 7d 0a 0a 09 69 66 20 28 2a 70 75 6c 43 6f 75 .}...if (*pulCou
173c0 6e 74 20 3c 20 33 29 20 7b 0a 09 09 43 41 43 4b nt < 3) {...CACK
173d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
173e0 22 45 72 72 6f 72 2e 20 20 42 75 66 66 65 72 20 "Error. Buffer
173f0 74 6f 6f 20 73 6d 61 6c 6c 2e 22 29 3b 0a 0a 09 too small.");...
17400 09 72 65 74 75 72 6e 28 43 4b 52 5f 42 55 46 46 .return(CKR_BUFF
17410 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 0a 09 ER_TOO_SMALL);..
17420 7d 0a 0a 09 70 4d 65 63 68 61 6e 69 73 6d 4c 69 }...pMechanismLi
17430 73 74 5b 30 5d 20 3d 20 43 4b 4d 5f 52 53 41 5f st[0] = CKM_RSA_
17440 50 4b 43 53 3b 0a 09 70 4d 65 63 68 61 6e 69 73 PKCS;..pMechanis
17450 6d 4c 69 73 74 5b 31 5d 20 3d 20 43 4b 4d 5f 53 mList[1] = CKM_S
17460 48 41 31 5f 52 53 41 5f 50 4b 43 53 3b 0a 09 2a HA1_RSA_PKCS;..*
17470 70 75 6c 43 6f 75 6e 74 20 3d 20 32 3b 0a 0a 09 pulCount = 2;...
17480 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
17490 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 NTF("Returning C
174a0 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 KR_OK (%i)", CKR
174b0 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 _OK);...return(C
174c0 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 KR_OK);.}..CK_DE
174d0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b FINE_FUNCTION(CK
174e0 5f 52 56 2c 20 43 5f 47 65 74 4d 65 63 68 61 6e _RV, C_GetMechan
174f0 69 73 6d 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 ismInfo)(CK_SLOT
17500 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 4d _ID slotID, CK_M
17510 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 20 74 79 ECHANISM_TYPE ty
17520 70 65 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d pe, CK_MECHANISM
17530 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 _INFO_PTR pInfo)
17540 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 {..int mutex_re
17550 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 tval;...CACKEY_D
17560 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
17570 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 led.");...if (pI
17580 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 nfo == NULL) {..
17590 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
175a0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e INTF("Error. pIn
175b0 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a fo is NULL.");..
175c0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 ..return(CKR_ARG
175d0 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a UMENTS_BAD);..}.
175e0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e ..if (!cackey_in
175f0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 itialized) {...C
17600 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
17610 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 TF("Error. Not
17620 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a initialized.");.
17630 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 ...return(CKR_CR
17640 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 YPTOKI_NOT_INITI
17650 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 ALIZED);..}...if
17660 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 (slotID < 0 ||
17670 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f slotID >= (sizeo
17680 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 f(cackey_slots)
17690 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f / sizeof(cackey_
176a0 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 slots[0]))) {...
176b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
176c0 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 NTF("Error. Inva
176d0 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 lid slot request
176e0 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 ed (%lu), outsid
176f0 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 e of valid range
17700 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 ", slotID);....r
17710 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 eturn(CKR_SLOT_I
17720 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a D_INVALID);..}..
17730 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 .mutex_retval =
17740 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 cackey_mutex_loc
17750 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
17760 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 );..if (mutex_re
17770 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 tval != 0) {...C
17780 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
17790 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b TF("Error. Lock
177a0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a ing failed.");..
177b0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e ..return(CKR_GEN
177c0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a ERAL_ERROR);..}.
177d0 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f ..if (cackey_slo
177e0 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 ts[slotID].activ
177f0 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b e == 0) {...CACK
17800 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
17810 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 "Error. Invalid
17820 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 slot requested (
17830 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 %lu), slot not c
17840 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 urrently active"
17850 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 , slotID);....ca
17860 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 ckey_mutex_unloc
17870 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
17880 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
17890 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 _SLOT_ID_INVALID
178a0 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 );..}...mutex_re
178b0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 tval = cackey_mu
178c0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 tex_unlock(cacke
178d0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 y_biglock);..if
178e0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d (mutex_retval !=
178f0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 0) {...CACKEY_D
17900 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
17910 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 or. Unlocking f
17920 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 ailed.");....ret
17930 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f urn(CKR_GENERAL_
17940 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 ERROR);..}.../*
17950 58 58 58 3a 20 54 68 69 73 20 69 73 20 75 6e 74 XXX: This is unt
17960 65 73 74 65 64 2c 20 61 6e 64 20 66 75 72 74 68 ested, and furth
17970 65 72 20 49 27 6d 20 6e 6f 74 20 72 65 61 6c 6c er I'm not reall
17980 79 20 73 75 72 65 20 69 66 20 74 68 69 73 20 69 y sure if this i
17990 73 20 63 6f 72 72 65 63 74 2e 20 2a 2f 0a 09 73 s correct. */..s
179a0 77 69 74 63 68 20 28 74 79 70 65 29 20 7b 0a 09 witch (type) {..
179b0 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b .case CKM_RSA_PK
179c0 43 53 3a 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c CS:....pInfo->ul
179d0 4d 69 6e 4b 65 79 53 69 7a 65 20 3d 20 35 31 32 MinKeySize = 512
179e0 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 ;....pInfo->ulMa
179f0 78 4b 65 79 53 69 7a 65 20 3d 20 38 31 39 32 3b xKeySize = 8192;
17a00 0a 09 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 ....pInfo->flags
17a10 20 3d 20 43 4b 46 5f 48 57 20 7c 20 43 4b 46 5f = CKF_HW | CKF_
17a20 45 4e 43 52 59 50 54 20 7c 20 43 4b 46 5f 44 45 ENCRYPT | CKF_DE
17a30 43 52 59 50 54 20 7c 20 43 4b 46 5f 53 49 47 4e CRYPT | CKF_SIGN
17a40 20 7c 20 43 4b 46 5f 56 45 52 49 46 59 3b 0a 09 | CKF_VERIFY;..
17a50 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 ..break;...case
17a60 43 4b 4d 5f 52 53 41 5f 58 5f 35 30 39 3a 0a 09 CKM_RSA_X_509:..
17a70 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 4b 65 ..pInfo->ulMinKe
17a80 79 53 69 7a 65 20 3d 20 35 31 32 3b 0a 09 09 09 ySize = 512;....
17a90 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 4b 65 79 53 pInfo->ulMaxKeyS
17aa0 69 7a 65 20 3d 20 38 31 39 32 3b 0a 09 09 09 70 ize = 8192;....p
17ab0 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b Info->flags = CK
17ac0 46 5f 48 57 20 7c 20 43 4b 46 5f 45 4e 43 52 59 F_HW | CKF_ENCRY
17ad0 50 54 20 7c 20 43 4b 46 5f 44 45 43 52 59 50 54 PT | CKF_DECRYPT
17ae0 20 7c 20 43 4b 46 5f 53 49 47 4e 20 7c 20 43 4b | CKF_SIGN | CK
17af0 46 5f 56 45 52 49 46 59 3b 0a 09 09 09 62 72 65 F_VERIFY;....bre
17b00 61 6b 3b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 53 ak;...case CKM_S
17b10 48 41 31 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 HA1_RSA_PKCS:...
17b20 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 4b 65 79 .pInfo->ulMinKey
17b30 53 69 7a 65 20 3d 20 35 31 32 3b 0a 09 09 09 70 Size = 512;....p
17b40 49 6e 66 6f 2d 3e 75 6c 4d 61 78 4b 65 79 53 69 Info->ulMaxKeySi
17b50 7a 65 20 3d 20 38 31 39 32 3b 0a 09 09 09 70 49 ze = 8192;....pI
17b60 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46 nfo->flags = CKF
17b70 5f 48 57 20 7c 20 43 4b 46 5f 53 49 47 4e 20 7c _HW | CKF_SIGN |
17b80 20 43 4b 46 5f 56 45 52 49 46 59 3b 0a 09 09 09 CKF_VERIFY;....
17b90 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 43 41 43 4b break;..}...CACK
17ba0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
17bb0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f "Returning CKR_O
17bc0 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 K (%i)", CKR_OK)
17bd0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f ;...return(CKR_O
17be0 4b 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e K);.}../* We don
17bf0 27 74 20 73 75 70 70 6f 72 74 20 74 68 69 73 20 't support this
17c00 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 method. */.CK_DE
17c10 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b FINE_FUNCTION(CK
17c20 5f 52 56 2c 20 43 5f 49 6e 69 74 54 6f 6b 65 6e _RV, C_InitToken
17c30 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f )(CK_SLOT_ID slo
17c40 74 49 44 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 tID, CK_UTF8CHAR
17c50 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c _PTR pPin, CK_UL
17c60 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 2c 20 43 4b ONG ulPinLen, CK
17c70 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 4c _UTF8CHAR_PTR pL
17c80 61 62 65 6c 29 20 7b 0a 09 43 41 43 4b 45 59 5f abel) {..CACKEY_
17c90 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
17ca0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 lled.");...if (!
17cb0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a cackey_initializ
17cc0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...CACKEY_D
17cd0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
17ce0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c or. Not initial
17cf0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 ized.");....retu
17d00 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f rn(CKR_CRYPTOKI_
17d10 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 NOT_INITIALIZED)
17d20 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ;..}...CACKEY_DE
17d30 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
17d40 72 6e 69 6e 67 20 43 4b 52 5f 54 4f 4b 45 4e 5f rning CKR_TOKEN_
17d50 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 20 WRITE_PROTECTED
17d60 28 25 69 29 22 2c 20 43 4b 52 5f 54 4f 4b 45 4e (%i)", CKR_TOKEN
17d70 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 _WRITE_PROTECTED
17d80 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f );...return(CKR_
17d90 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 TOKEN_WRITE_PROT
17da0 45 43 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 ECTED);.}../* We
17db0 20 64 6f 6e 27 74 20 73 75 70 70 6f 72 74 20 74 don't support t
17dc0 68 69 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 his method. */.C
17dd0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f K_DEFINE_FUNCTIO
17de0 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 50 N(CK_RV, C_InitP
17df0 49 4e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 IN)(CK_SESSION_H
17e00 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 ANDLE hSession,
17e10 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 CK_UTF8CHAR_PTR
17e20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 pPin, CK_ULONG u
17e30 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09 43 41 43 4b lPinLen) {..CACK
17e40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
17e50 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 "Called.");...if
17e60 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 (!cackey_initia
17e70 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 lized) {...CACKE
17e80 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
17e90 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 Error. Not init
17ea0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 ialized.");....r
17eb0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f eturn(CKR_CRYPTO
17ec0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a KI_NOT_INITIALIZ
17ed0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 ED);..}...CACKEY
17ee0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
17ef0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 54 4f 4b eturning CKR_TOK
17f00 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 EN_WRITE_PROTECT
17f10 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 54 4f ED (%i)", CKR_TO
17f20 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 KEN_WRITE_PROTEC
17f30 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 TED);...return(C
17f40 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 KR_TOKEN_WRITE_P
17f50 52 4f 54 45 43 54 45 44 29 3b 0a 7d 0a 0a 2f 2a ROTECTED);.}../*
17f60 20 57 65 20 64 6f 6e 27 74 20 73 75 70 70 6f 72 We don't suppor
17f70 74 20 74 68 69 73 20 6d 65 74 68 6f 64 2e 20 2a t this method. *
17f80 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 /.CK_DEFINE_FUNC
17f90 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 TION(CK_RV, C_Se
17fa0 74 50 49 4e 29 28 43 4b 5f 53 45 53 53 49 4f 4e tPIN)(CK_SESSION
17fb0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e _HANDLE hSession
17fc0 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 , CK_UTF8CHAR_PT
17fd0 52 20 70 4f 6c 64 50 69 6e 2c 20 43 4b 5f 55 4c R pOldPin, CK_UL
17fe0 4f 4e 47 20 75 6c 4f 6c 64 50 69 6e 4c 65 6e 2c ONG ulOldPinLen,
17ff0 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 CK_UTF8CHAR_PTR
18000 20 70 4e 65 77 50 69 6e 2c 20 43 4b 5f 55 4c 4f pNewPin, CK_ULO
18010 4e 47 20 75 6c 4e 65 77 50 69 6e 4c 65 6e 29 20 NG ulNewPinLen)
18020 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f {..CACKEY_DEBUG_
18030 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
18040 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 );...if (!cackey
18050 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
18060 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
18070 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e RINTF("Error. N
18080 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 ot initialized."
18090 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
180a0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e _CRYPTOKI_NOT_IN
180b0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
180c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
180d0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
180e0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
180f0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 _SUPPORTED (%i)"
18100 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e , CKR_FUNCTION_N
18110 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a OT_SUPPORTED);..
18120 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 .return(CKR_FUNC
18130 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
18140 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e ED);.}..CK_DEFIN
18150 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 E_FUNCTION(CK_RV
18160 2c 20 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 29 , C_OpenSession)
18170 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 (CK_SLOT_ID slot
18180 49 44 2c 20 43 4b 5f 46 4c 41 47 53 20 66 6c 61 ID, CK_FLAGS fla
18190 67 73 2c 20 43 4b 5f 56 4f 49 44 5f 50 54 52 20 gs, CK_VOID_PTR
181a0 70 41 70 70 6c 69 63 61 74 69 6f 6e 2c 20 43 4b pApplication, CK
181b0 5f 4e 4f 54 49 46 59 20 6e 6f 74 69 66 79 2c 20 _NOTIFY notify,
181c0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c CK_SESSION_HANDL
181d0 45 5f 50 54 52 20 70 68 53 65 73 73 69 6f 6e 29 E_PTR phSession)
181e0 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e {..unsigned lon
181f0 67 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 g idx;..int mute
18200 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 66 x_retval;..int f
18210 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 20 3d 20 30 ound_session = 0
18220 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ;...CACKEY_DEBUG
18230 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
18240 22 29 3b 0a 0a 09 69 66 20 28 28 66 6c 61 67 73 ");...if ((flags
18250 20 26 20 43 4b 46 5f 53 45 52 49 41 4c 5f 53 45 & CKF_SERIAL_SE
18260 53 53 49 4f 4e 29 20 21 3d 20 43 4b 46 5f 53 45 SSION) != CKF_SE
18270 52 49 41 4c 5f 53 45 53 53 49 4f 4e 29 20 7b 0a RIAL_SESSION) {.
18280 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 ..return(CKR_SES
18290 53 49 4f 4e 5f 50 41 52 41 4c 4c 45 4c 5f 4e 4f SION_PARALLEL_NO
182a0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 09 7d T_SUPPORTED);..}
182b0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 ...if (!cackey_i
182c0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 nitialized) {...
182d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
182e0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 NTF("Error. Not
182f0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b initialized.");
18300 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 ....return(CKR_C
18310 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 RYPTOKI_NOT_INIT
18320 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 IALIZED);..}...i
18330 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c f (slotID < 0 ||
18340 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 slotID >= (size
18350 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 of(cackey_slots)
18360 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 / sizeof(cackey
18370 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 _slots[0]))) {..
18380 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
18390 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 INTF("Error. Inv
183a0 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 alid slot reques
183b0 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 ted (%lu), outsi
183c0 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 de of valid rang
183d0 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 e", slotID);....
183e0 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f return(CKR_SLOT_
183f0 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a ID_INVALID);..}.
18400 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d ..mutex_retval =
18410 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f cackey_mutex_lo
18420 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
18430 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 k);..if (mutex_r
18440 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 etval != 0) {...
18450 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
18460 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 NTF("Error. Loc
18470 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a king failed.");.
18480 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 ...return(CKR_GE
18490 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d NERAL_ERROR);..}
184a0 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c ...if (cackey_sl
184b0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 ots[slotID].acti
184c0 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 ve == 0) {...CAC
184d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
184e0 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 ("Error. Invalid
184f0 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 slot requested
18500 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 (%lu), slot not
18510 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 currently active
18520 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 ", slotID);....c
18530 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f ackey_mutex_unlo
18540 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
18550 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b k);....return(CK
18560 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 R_SLOT_ID_INVALI
18570 44 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 65 72 69 D);..}.../* Veri
18580 66 79 20 74 68 61 74 20 74 68 65 20 63 61 72 64 fy that the card
18590 20 69 73 20 61 63 74 75 61 6c 6c 79 20 69 6e 20 is actually in
185a0 74 68 65 20 73 6c 6f 74 2e 20 2a 2f 0a 09 2f 2a the slot. */../*
185b0 20 58 58 58 3a 20 43 68 65 63 6b 20 74 6f 20 6d XXX: Check to m
185c0 61 6b 65 20 73 75 72 65 20 74 68 69 73 20 69 73 ake sure this is
185d0 20 69 6e 20 74 68 65 20 50 4b 43 53 23 31 31 20 in the PKCS#11
185e0 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20 2a 2f specification */
185f0 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b ..if (cackey_tok
18600 65 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b en_present(&cack
18610 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d ey_slots[slotID]
18620 29 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 ) != CACKEY_PCSC
18630 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 _S_TOKENPRESENT)
18640 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
18650 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
18660 20 20 43 61 72 64 20 6e 6f 74 20 70 72 65 73 65 Card not prese
18670 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 43 nt. Returning C
18680 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 KR_DEVICE_REMOVE
18690 44 22 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d D");....cackey_m
186a0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b utex_unlock(cack
186b0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 ey_biglock);....
186c0 72 65 74 75 72 6e 28 43 4b 52 5f 44 45 56 49 43 return(CKR_DEVIC
186d0 45 5f 52 45 4d 4f 56 45 44 29 3b 0a 09 7d 0a 0a E_REMOVED);..}..
186e0 09 66 6f 72 20 28 69 64 78 20 3d 20 31 3b 20 69 .for (idx = 1; i
186f0 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 dx < (sizeof(cac
18700 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 key_sessions) /
18710 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 sizeof(cackey_se
18720 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 ssions[0])); idx
18730 2b 2b 29 20 7b 0a 09 09 69 66 20 28 21 63 61 63 ++) {...if (!cac
18740 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 key_sessions[idx
18750 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 66 ].active) {....f
18760 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 20 3d 20 31 ound_session = 1
18770 3b 0a 0a 09 09 09 2a 70 68 53 65 73 73 69 6f 6e ;.....*phSession
18780 20 3d 20 69 64 78 3b 0a 0a 09 09 09 63 61 63 6b = idx;.....cack
18790 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d ey_sessions[idx]
187a0 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 09 09 .active = 1;....
187b0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
187c0 69 64 78 5d 2e 73 6c 6f 74 49 44 20 3d 20 73 6c idx].slotID = sl
187d0 6f 74 49 44 3b 0a 09 09 09 63 61 63 6b 65 79 5f otID;....cackey_
187e0 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 74 sessions[idx].st
187f0 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 50 55 42 ate = CKS_RO_PUB
18800 4c 49 43 5f 53 45 53 53 49 4f 4e 3b 0a 09 09 09 LIC_SESSION;....
18810 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
18820 69 64 78 5d 2e 66 6c 61 67 73 20 3d 20 66 6c 61 idx].flags = fla
18830 67 73 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 gs;....cackey_se
18840 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 75 6c 44 65 ssions[idx].ulDe
18850 76 69 63 65 45 72 72 6f 72 20 3d 20 30 3b 0a 09 viceError = 0;..
18860 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e ..cackey_session
18870 73 5b 69 64 78 5d 2e 70 41 70 70 6c 69 63 61 74 s[idx].pApplicat
18880 69 6f 6e 20 3d 20 70 41 70 70 6c 69 63 61 74 69 ion = pApplicati
18890 6f 6e 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 on;....cackey_se
188a0 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 4e 6f 74 69 ssions[idx].Noti
188b0 66 79 20 3d 20 6e 6f 74 69 66 79 3b 0a 0a 09 09 fy = notify;....
188c0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 .cackey_sessions
188d0 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 [idx].identities
188e0 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63 61 63 6b = NULL;....cack
188f0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d ey_sessions[idx]
18900 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e .identities_coun
18910 74 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 t = 0;.....cacke
18920 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e y_sessions[idx].
18930 73 65 61 72 63 68 5f 61 63 74 69 76 65 20 3d 20 search_active =
18940 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 0;.....cackey_se
18950 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 69 67 6e ssions[idx].sign
18960 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 _active = 0;....
18970 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 .cackey_sessions
18980 5b 69 64 78 5d 2e 64 65 63 72 79 70 74 5f 61 63 [idx].decrypt_ac
18990 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61 tive = 0;.....ca
189a0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 ckey_sessions[id
189b0 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20 x].identities =
189c0 63 61 63 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e cackey_read_iden
189d0 74 69 74 69 65 73 28 26 63 61 63 6b 65 79 5f 73 tities(&cackey_s
189e0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 26 63 lots[slotID], &c
189f0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 ackey_sessions[i
18a00 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 dx].identities_c
18a10 6f 75 6e 74 29 3b 0a 0a 0a 09 09 09 62 72 65 61 ount);......brea
18a20 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 k;...}..}...mute
18a30 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 x_retval = cacke
18a40 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
18a50 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
18a60 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 .if (mutex_retva
18a70 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b l != 0) {...CACK
18a80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
18a90 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 "Error. Unlocki
18aa0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 ng failed.");...
18ab0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 .return(CKR_GENE
18ac0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a RAL_ERROR);..}..
18ad0 09 69 66 20 28 21 66 6f 75 6e 64 5f 73 65 73 73 .if (!found_sess
18ae0 69 6f 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f ion) {...CACKEY_
18af0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
18b00 74 75 72 6e 69 6e 67 20 43 4b 52 5f 53 45 53 53 turning CKR_SESS
18b10 49 4f 4e 5f 43 4f 55 4e 54 20 28 25 69 29 22 2c ION_COUNT (%i)",
18b20 20 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 CKR_SESSION_COU
18b30 4e 54 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 NT);....return(C
18b40 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 KR_SESSION_COUNT
18b50 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 );..}...CACKEY_D
18b60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
18b70 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 urning CKR_OK (%
18b80 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 i)", CKR_OK);...
18b90 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a return(CKR_OK);.
18ba0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e }..CK_DEFINE_FUN
18bb0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 CTION(CK_RV, C_C
18bc0 6c 6f 73 65 53 65 73 73 69 6f 6e 29 28 43 4b 5f loseSession)(CK_
18bd0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 SESSION_HANDLE h
18be0 53 65 73 73 69 6f 6e 29 20 7b 0a 09 69 6e 74 20 Session) {..int
18bf0 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 mutex_retval;...
18c00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
18c10 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a NTF("Called.");.
18c20 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e ..if (!cackey_in
18c30 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 itialized) {...C
18c40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
18c50 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 TF("Error. Not
18c60 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a initialized.");.
18c70 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 ...return(CKR_CR
18c80 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 YPTOKI_NOT_INITI
18c90 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 ALIZED);..}...if
18ca0 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 (hSession == 0
18cb0 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 || hSession >= (
18cc0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 sizeof(cackey_se
18cd0 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 ssions) / sizeof
18ce0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 (cackey_sessions
18cf0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 [0]))) {...CACKE
18d00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
18d10 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 Error. Session
18d20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b out of range.");
18d30 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 ......return(CKR
18d40 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f _SESSION_HANDLE_
18d50 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d INVALID);..}...m
18d60 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 utex_retval = ca
18d70 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 ckey_mutex_lock(
18d80 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
18d90 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 ..if (mutex_retv
18da0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 al != 0) {...CAC
18db0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
18dc0 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e ("Error. Lockin
18dd0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 g failed.");....
18de0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 return(CKR_GENER
18df0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 AL_ERROR);..}...
18e00 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 if (!cackey_sess
18e10 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 ions[hSession].a
18e20 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 ctive) {...cacke
18e30 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
18e40 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
18e50 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
18e60 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
18e70 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 Session not acti
18e80 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 ve.");......retu
18e90 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 rn(CKR_SESSION_H
18ea0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a ANDLE_INVALID);.
18eb0 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 .}...cackey_sess
18ec0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 ions[hSession].a
18ed0 63 74 69 76 65 20 3d 20 30 3b 0a 09 63 61 63 6b ctive = 0;..cack
18ee0 65 79 5f 66 72 65 65 5f 69 64 65 6e 74 69 74 69 ey_free_identiti
18ef0 65 73 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f es(cackey_sessio
18f00 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 ns[hSession].ide
18f10 6e 74 69 74 69 65 73 2c 20 63 61 63 6b 65 79 5f ntities, cackey_
18f20 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
18f30 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f n].identities_co
18f40 75 6e 74 29 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 unt);...mutex_re
18f50 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 tval = cackey_mu
18f60 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 tex_unlock(cacke
18f70 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 y_biglock);..if
18f80 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d (mutex_retval !=
18f90 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 0) {...CACKEY_D
18fa0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
18fb0 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 or. Unlocking f
18fc0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 ailed.");....ret
18fd0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f urn(CKR_GENERAL_
18fe0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 ERROR);..}...CAC
18ff0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
19000 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f ("Returning CKR_
19010 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b OK (%i)", CKR_OK
19020 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f );...return(CKR_
19030 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e OK);.}..CK_DEFIN
19040 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 E_FUNCTION(CK_RV
19050 2c 20 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73 , C_CloseAllSess
19060 69 6f 6e 73 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 ions)(CK_SLOT_ID
19070 20 73 6c 6f 74 49 44 29 20 7b 0a 09 75 69 6e 74 slotID) {..uint
19080 33 32 5f 74 20 69 64 78 3b 0a 09 69 6e 74 20 6d 32_t idx;..int m
19090 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 utex_retval;...C
190a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
190b0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
190c0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 .if (!cackey_ini
190d0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 tialized) {...CA
190e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
190f0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 F("Error. Not i
19100 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a nitialized.");..
19110 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 ..return(CKR_CRY
19120 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 PTOKI_NOT_INITIA
19130 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 LIZED);..}...if
19140 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 (slotID < 0 || s
19150 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 lotID >= (sizeof
19160 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f (cackey_slots) /
19170 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 sizeof(cackey_s
19180 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 lots[0]))) {...C
19190 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
191a0 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c TF("Error. Inval
191b0 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 id slot requeste
191c0 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 d (%lu), outside
191d0 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 of valid range"
191e0 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 , slotID);....re
191f0 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 turn(CKR_SLOT_ID
19200 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 _INVALID);..}...
19210 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 mutex_retval = c
19220 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b ackey_mutex_lock
19230 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 (cackey_biglock)
19240 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 ;..if (mutex_ret
19250 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 val != 0) {...CA
19260 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
19270 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 F("Error. Locki
19280 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 ng failed.");...
19290 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 .return(CKR_GENE
192a0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a RAL_ERROR);..}..
192b0 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 .if (cackey_slot
192c0 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 s[slotID].active
192d0 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 == 0) {...CACKE
192e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
192f0 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 Error. Invalid s
19300 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 lot requested (%
19310 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 lu), slot not cu
19320 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c rrently active",
19330 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 slotID);....cac
19340 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b key_mutex_unlock
19350 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 (cackey_biglock)
19360 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
19370 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 SLOT_ID_INVALID)
19380 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 ;..}...for (idx
19390 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 = 0; idx < (size
193a0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f of(cackey_sessio
193b0 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 ns) / sizeof(cac
193c0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 key_sessions[0])
193d0 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 ); idx++) {...if
193e0 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e (cackey_session
193f0 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b s[idx].active) {
19400 0a 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 ....if (cackey_s
19410 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 6c 6f essions[idx].slo
19420 74 49 44 20 21 3d 20 73 6c 6f 74 49 44 29 20 7b tID != slotID) {
19430 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 .....continue;..
19440 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 6d ..}.....cackey_m
19450 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b utex_unlock(cack
19460 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 ey_biglock);....
19470 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 28 69 C_CloseSession(i
19480 64 78 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 6d dx);....cackey_m
19490 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 utex_lock(cackey
194a0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 09 _biglock);...}..
194b0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c }...mutex_retval
194c0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f = cackey_mutex_
194d0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 unlock(cackey_bi
194e0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 glock);..if (mut
194f0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 ex_retval != 0)
19500 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
19510 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
19520 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 Unlocking faile
19530 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
19540 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f CKR_GENERAL_ERRO
19550 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f R);..}...CACKEY_
19560 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
19570 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 turning CKR_OK (
19580 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a %i)", CKR_OK);..
19590 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b .return(CKR_OK);
195a0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 .}..CK_DEFINE_FU
195b0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f NCTION(CK_RV, C_
195c0 47 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f 29 28 GetSessionInfo)(
195d0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c CK_SESSION_HANDL
195e0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 53 E hSession, CK_S
195f0 45 53 53 49 4f 4e 5f 49 4e 46 4f 5f 50 54 52 20 ESSION_INFO_PTR
19600 70 49 6e 66 6f 29 20 7b 0a 09 69 6e 74 20 6d 75 pInfo) {..int mu
19610 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 tex_retval;...CA
19620 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
19630 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
19640 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c if (pInfo == NUL
19650 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 L) {...CACKEY_DE
19660 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
19670 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c r. pInfo is NULL
19680 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
19690 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 KR_ARGUMENTS_BAD
196a0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 );..}...if (!cac
196b0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 key_initialized)
196c0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
196d0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
196e0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 Not initialize
196f0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
19700 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 CKR_CRYPTOKI_NOT
19710 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 _INITIALIZED);..
19720 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e }...if (hSession
19730 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f == 0 || hSessio
19740 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 n >= (sizeof(cac
19750 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 key_sessions) /
19760 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 sizeof(cackey_se
19770 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 ssions[0]))) {..
19780 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
19790 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 INTF("Error. Se
197a0 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e ssion out of ran
197b0 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 ge.");......retu
197c0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 rn(CKR_SESSION_H
197d0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a ANDLE_INVALID);.
197e0 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 .}...mutex_retva
197f0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 l = cackey_mutex
19800 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 _lock(cackey_big
19810 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 lock);..if (mute
19820 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b x_retval != 0) {
19830 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
19840 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
19850 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 Locking failed."
19860 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
19870 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b _GENERAL_ERROR);
19880 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ..}...if (!cacke
19890 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
198a0 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 ion].active) {..
198b0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e .cackey_mutex_un
198c0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
198d0 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f ock);....CACKEY_
198e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
198f0 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f ror. Session no
19900 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a t active.");....
19910 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 ..return(CKR_SES
19920 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 SION_HANDLE_INVA
19930 4c 49 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f LID);..}...pInfo
19940 2d 3e 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 ->slotID = cacke
19950 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
19960 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 09 70 49 ion].slotID;..pI
19970 6e 66 6f 2d 3e 73 74 61 74 65 20 3d 20 63 61 63 nfo->state = cac
19980 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
19990 73 73 69 6f 6e 5d 2e 73 74 61 74 65 3b 0a 09 70 ssion].state;..p
199a0 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 63 61 Info->flags = ca
199b0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
199c0 65 73 73 69 6f 6e 5d 2e 66 6c 61 67 73 3b 0a 09 ession].flags;..
199d0 70 49 6e 66 6f 2d 3e 75 6c 44 65 76 69 63 65 45 pInfo->ulDeviceE
199e0 72 72 6f 72 20 3d 20 63 61 63 6b 65 79 5f 73 65 rror = cackey_se
199f0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
19a00 2e 75 6c 44 65 76 69 63 65 45 72 72 6f 72 3b 0a .ulDeviceError;.
19a10 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d ..mutex_retval =
19a20 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e cackey_mutex_un
19a30 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
19a40 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 ock);..if (mutex
19a50 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a _retval != 0) {.
19a60 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
19a70 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 RINTF("Error. U
19a80 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e nlocking failed.
19a90 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
19aa0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 R_GENERAL_ERROR)
19ab0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ;..}...CACKEY_DE
19ac0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
19ad0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 rning CKR_OK (%i
19ae0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 )", CKR_OK);...r
19af0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d eturn(CKR_OK);.}
19b00 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 ..CK_DEFINE_FUNC
19b10 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 TION(CK_RV, C_Ge
19b20 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 29 tOperationState)
19b30 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 (CK_SESSION_HAND
19b40 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f LE hSession, CK_
19b50 42 59 54 45 5f 50 54 52 20 70 4f 70 65 72 61 74 BYTE_PTR pOperat
19b60 69 6f 6e 53 74 61 74 65 2c 20 43 4b 5f 55 4c 4f ionState, CK_ULO
19b70 4e 47 5f 50 54 52 20 70 75 6c 4f 70 65 72 61 74 NG_PTR pulOperat
19b80 69 6f 6e 53 74 61 74 65 4c 65 6e 29 20 7b 0a 09 ionStateLen) {..
19b90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
19ba0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a NTF("Called.");.
19bb0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e ..if (!cackey_in
19bc0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 itialized) {...C
19bd0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
19be0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 TF("Error. Not
19bf0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a initialized.");.
19c00 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 ...return(CKR_CR
19c10 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 YPTOKI_NOT_INITI
19c20 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 ALIZED);..}...CA
19c30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
19c40 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 F("Returning CKR
19c50 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
19c60 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 PPORTED (%i)", C
19c70 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
19c80 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 SUPPORTED);...re
19c90 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f turn(CKR_FUNCTIO
19ca0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 N_NOT_SUPPORTED)
19cb0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 ;.}..CK_DEFINE_F
19cc0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 UNCTION(CK_RV, C
19cd0 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 _SetOperationSta
19ce0 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 te)(CK_SESSION_H
19cf0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 ANDLE hSession,
19d00 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4f 70 65 CK_BYTE_PTR pOpe
19d10 72 61 74 69 6f 6e 53 74 61 74 65 2c 20 43 4b 5f rationState, CK_
19d20 55 4c 4f 4e 47 20 75 6c 4f 70 65 72 61 74 69 6f ULONG ulOperatio
19d30 6e 53 74 61 74 65 4c 65 6e 2c 20 43 4b 5f 4f 42 nStateLen, CK_OB
19d40 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 45 6e 63 JECT_HANDLE hEnc
19d50 72 79 70 74 69 6f 6e 4b 65 79 2c 20 43 4b 5f 4f ryptionKey, CK_O
19d60 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 41 75 BJECT_HANDLE hAu
19d70 74 68 65 6e 74 69 63 61 74 69 6f 6e 4b 65 79 29 thenticationKey)
19d80 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {..CACKEY_DEBUG
19d90 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
19da0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ");...if (!cacke
19db0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b y_initialized) {
19dc0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
19dd0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
19de0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e Not initialized.
19df0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
19e00 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 R_CRYPTOKI_NOT_I
19e10 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
19e20 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
19e30 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
19e40 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f CKR_FUNCTION_NO
19e50 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 T_SUPPORTED (%i)
19e60 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f ", CKR_FUNCTION_
19e70 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
19e80 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e ..return(CKR_FUN
19e90 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
19ea0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 TED);.}..CK_DEFI
19eb0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 NE_FUNCTION(CK_R
19ec0 56 2c 20 43 5f 4c 6f 67 69 6e 29 28 43 4b 5f 53 V, C_Login)(CK_S
19ed0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 ESSION_HANDLE hS
19ee0 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 53 45 52 5f ession, CK_USER_
19ef0 54 59 50 45 20 75 73 65 72 54 79 70 65 2c 20 43 TYPE userType, C
19f00 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 K_UTF8CHAR_PTR p
19f10 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c Pin, CK_ULONG ul
19f20 50 69 6e 4c 65 6e 29 20 7b 0a 09 43 4b 5f 53 4c PinLen) {..CK_SL
19f30 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 69 OT_ID slotID;..i
19f40 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b nt mutex_retval;
19f50 0a 09 69 6e 74 20 74 72 69 65 73 5f 72 65 6d 61 ..int tries_rema
19f60 69 6e 69 6e 67 3b 0a 09 69 6e 74 20 6c 6f 67 69 ining;..int logi
19f70 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f n_ret;...CACKEY_
19f80 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
19f90 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 lled.");...if (!
19fa0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a cackey_initializ
19fb0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...CACKEY_D
19fc0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
19fd0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c or. Not initial
19fe0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 ized.");....retu
19ff0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f rn(CKR_CRYPTOKI_
1a000 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 NOT_INITIALIZED)
1a010 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 ;..}...if (hSess
1a020 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 ion == 0 || hSes
1a030 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 sion >= (sizeof(
1a040 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 cackey_sessions)
1a050 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 / sizeof(cackey
1a060 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 _sessions[0])))
1a070 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
1a080 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
1a090 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 Session out of
1a0a0 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 range.");......r
1a0b0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f eturn(CKR_SESSIO
1a0c0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 N_HANDLE_INVALID
1a0d0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73 65 72 );..}...if (user
1a0e0 54 79 70 65 20 21 3d 20 43 4b 55 5f 55 53 45 52 Type != CKU_USER
1a0f0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
1a100 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
1a110 2e 20 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f . We only suppo
1a120 72 74 20 55 53 45 52 20 6d 6f 64 65 2c 20 61 73 rt USER mode, as
1a130 6b 65 64 20 66 6f 72 20 25 6c 75 20 6d 6f 64 65 ked for %lu mode
1a140 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f .", (unsigned lo
1a150 6e 67 29 20 75 73 65 72 54 79 70 65 29 0a 0a 09 ng) userType)...
1a160 09 72 65 74 75 72 6e 28 43 4b 52 5f 55 53 45 52 .return(CKR_USER
1a170 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 29 3b 0a _TYPE_INVALID);.
1a180 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 .}...mutex_retva
1a190 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 l = cackey_mutex
1a1a0 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 _lock(cackey_big
1a1b0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 lock);..if (mute
1a1c0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b x_retval != 0) {
1a1d0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1a1e0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
1a1f0 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 Locking failed."
1a200 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
1a210 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b _GENERAL_ERROR);
1a220 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ..}...if (!cacke
1a230 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
1a240 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 ion].active) {..
1a250 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e .cackey_mutex_un
1a260 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
1a270 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f ock);....CACKEY_
1a280 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
1a290 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f ror. Session no
1a2a0 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a t active.");....
1a2b0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 ..return(CKR_SES
1a2c0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 SION_HANDLE_INVA
1a2d0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 LID);..}...slotI
1a2e0 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 D = cackey_sessi
1a2f0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c ons[hSession].sl
1a300 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 otID;...if (slot
1a310 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 ID < 0 || slotID
1a320 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b >= (sizeof(cack
1a330 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 ey_slots) / size
1a340 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b of(cackey_slots[
1a350 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 0]))) {...CACKEY
1a360 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
1a370 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c rror. Invalid sl
1a380 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c ot requested (%l
1a390 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 u), outside of v
1a3a0 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f alid range", slo
1a3b0 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 tID);....return(
1a3c0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f CKR_GENERAL_ERRO
1a3d0 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 R);..}...if (cac
1a3e0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 key_slots[slotID
1a3f0 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b ].active == 0) {
1a400 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1a410 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 PRINTF("Error. I
1a420 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 nvalid slot requ
1a430 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f ested (%lu), slo
1a440 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 t not currently
1a450 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 active", slotID)
1a460 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 ;....cackey_mute
1a470 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
1a480 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 biglock);....ret
1a490 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f urn(CKR_GENERAL_
1a4a0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 6c 6f 67 ERROR);..}...log
1a4b0 69 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f in_ret = cackey_
1a4c0 6c 6f 67 69 6e 28 26 63 61 63 6b 65 79 5f 73 6c login(&cackey_sl
1a4d0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 70 50 69 ots[slotID], pPi
1a4e0 6e 2c 20 75 6c 50 69 6e 4c 65 6e 2c 20 26 74 72 n, ulPinLen, &tr
1a4f0 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 29 3b 0a ies_remaining);.
1a500 09 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20 21 .if (login_ret !
1a510 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f = CACKEY_PCSC_S_
1a520 4f 4b 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d OK) {...cackey_m
1a530 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b utex_unlock(cack
1a540 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 ey_biglock);....
1a550 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d if (login_ret ==
1a560 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c CACKEY_PCSC_E_L
1a570 4f 43 4b 45 44 29 20 7b 0a 09 09 09 43 41 43 4b OCKED) {....CACK
1a580 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1a590 22 45 72 72 6f 72 2e 20 20 54 6f 6b 65 6e 20 69 "Error. Token i
1a5a0 73 20 6c 6f 63 6b 65 64 2e 22 29 3b 0a 0a 09 09 s locked.");....
1a5b0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c .cackey_slots[sl
1a5c0 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 otID].token_flag
1a5d0 73 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49 s |= CKF_USER_PI
1a5e0 4e 5f 4c 4f 43 4b 45 44 3b 0a 0a 09 09 09 72 65 N_LOCKED;.....re
1a5f0 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 4c 4f 43 turn(CKR_PIN_LOC
1a600 4b 45 44 29 3b 0a 09 09 7d 20 65 6c 73 65 20 69 KED);...} else i
1a610 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d 20 f (login_ret ==
1a620 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 CACKEY_PCSC_E_BA
1a630 44 50 49 4e 29 20 7b 0a 09 09 09 43 41 43 4b 45 DPIN) {....CACKE
1a640 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1a650 45 72 72 6f 72 2e 20 20 49 6e 76 61 6c 69 64 20 Error. Invalid
1a660 50 49 4e 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b PIN.");.....cack
1a670 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d ey_slots[slotID]
1a680 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 .token_flags |=
1a690 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 43 4f 55 CKF_USER_PIN_COU
1a6a0 4e 54 5f 4c 4f 57 3b 0a 0a 09 09 09 69 66 20 28 NT_LOW;.....if (
1a6b0 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20 tries_remaining
1a6c0 3d 3d 20 31 29 20 7b 0a 09 09 09 09 63 61 63 6b == 1) {.....cack
1a6d0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d ey_slots[slotID]
1a6e0 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 .token_flags |=
1a6f0 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 46 49 4e CKF_USER_PIN_FIN
1a700 41 4c 5f 54 52 59 3b 0a 09 09 09 7d 0a 0a 09 09 AL_TRY;....}....
1a710 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f .return(CKR_PIN_
1a720 49 4e 43 4f 52 52 45 43 54 29 3b 0a 09 09 7d 0a INCORRECT);...}.
1a730 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1a740 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
1a750 55 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 20 72 65 Unknown error re
1a760 74 75 72 6e 65 64 20 66 72 6f 6d 20 63 61 63 6b turned from cack
1a770 65 79 5f 6c 6f 67 69 6e 28 29 20 28 25 69 29 22 ey_login() (%i)"
1a780 2c 20 6c 6f 67 69 6e 5f 72 65 74 29 3b 0a 0a 09 , login_ret);...
1a790 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 .return(CKR_GENE
1a7a0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a RAL_ERROR);..}..
1a7b0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c .cackey_slots[sl
1a7c0 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 otID].token_flag
1a7d0 73 20 26 3d 20 7e 28 43 4b 46 5f 55 53 45 52 5f s &= ~(CKF_USER_
1a7e0 50 49 4e 5f 4c 4f 43 4b 45 44 20 7c 20 43 4b 46 PIN_LOCKED | CKF
1a7f0 5f 55 53 45 52 5f 50 49 4e 5f 43 4f 55 4e 54 5f _USER_PIN_COUNT_
1a800 4c 4f 57 20 7c 20 43 4b 46 5f 4c 4f 47 49 4e 5f LOW | CKF_LOGIN_
1a810 52 45 51 55 49 52 45 44 20 7c 20 43 4b 46 5f 55 REQUIRED | CKF_U
1a820 53 45 52 5f 50 49 4e 5f 46 49 4e 41 4c 5f 54 52 SER_PIN_FINAL_TR
1a830 59 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 Y);...cackey_ses
1a840 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
1a850 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 55 state = CKS_RO_U
1a860 53 45 52 5f 46 55 4e 43 54 49 4f 4e 53 3b 0a 0a SER_FUNCTIONS;..
1a870 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 .mutex_retval =
1a880 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c cackey_mutex_unl
1a890 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
1a8a0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f ck);..if (mutex_
1a8b0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 retval != 0) {..
1a8c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1a8d0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e INTF("Error. Un
1a8e0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 locking failed."
1a8f0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
1a900 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b _GENERAL_ERROR);
1a910 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 ..}...CACKEY_DEB
1a920 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
1a930 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 ning CKR_OK (%i)
1a940 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 ", CKR_OK);...re
1a950 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a turn(CKR_OK);.}.
1a960 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 .CK_DEFINE_FUNCT
1a970 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67 ION(CK_RV, C_Log
1a980 6f 75 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f out)(CK_SESSION_
1a990 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 HANDLE hSession)
1a9a0 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 {..CK_SLOT_ID s
1a9b0 6c 6f 74 49 44 3b 0a 09 69 6e 74 20 6d 75 74 65 lotID;..int mute
1a9c0 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b x_retval;...CACK
1a9d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1a9e0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 "Called.");...if
1a9f0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 (!cackey_initia
1aa00 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 lized) {...CACKE
1aa10 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1aa20 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 Error. Not init
1aa30 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 ialized.");....r
1aa40 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f eturn(CKR_CRYPTO
1aa50 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a KI_NOT_INITIALIZ
1aa60 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 ED);..}...if (hS
1aa70 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 ession == 0 || h
1aa80 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 Session >= (size
1aa90 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f of(cackey_sessio
1aaa0 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 ns) / sizeof(cac
1aab0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 key_sessions[0])
1aac0 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 )) {...CACKEY_DE
1aad0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
1aae0 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 r. Session out
1aaf0 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a of range.");....
1ab00 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 ..return(CKR_SES
1ab10 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 SION_HANDLE_INVA
1ab20 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 LID);..}...mutex
1ab30 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 _retval = cackey
1ab40 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b _mutex_lock(cack
1ab50 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 ey_biglock);..if
1ab60 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 (mutex_retval !
1ab70 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f = 0) {...CACKEY_
1ab80 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
1ab90 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 ror. Locking fa
1aba0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 iled.");....retu
1abb0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 rn(CKR_GENERAL_E
1abc0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 RROR);..}...if (
1abd0 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 !cackey_sessions
1abe0 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 [hSession].activ
1abf0 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 e) {...cackey_mu
1ac00 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 tex_unlock(cacke
1ac10 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 y_biglock);....C
1ac20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1ac30 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 TF("Error. Sess
1ac40 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 ion not active."
1ac50 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 );......return(C
1ac60 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c KR_SESSION_HANDL
1ac70 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a E_INVALID);..}..
1ac80 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 .slotID = cackey
1ac90 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
1aca0 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 on].slotID;...if
1acb0 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 (slotID < 0 ||
1acc0 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f slotID >= (sizeo
1acd0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 f(cackey_slots)
1ace0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f / sizeof(cackey_
1acf0 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 slots[0]))) {...
1ad00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1ad10 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 NTF("Error. Inva
1ad20 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 lid slot request
1ad30 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 ed (%lu), outsid
1ad40 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 e of valid range
1ad50 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 ", slotID);....r
1ad60 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 eturn(CKR_GENERA
1ad70 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 L_ERROR);..}...i
1ad80 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b f (cackey_slots[
1ad90 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d slotID].active =
1ada0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f = 0) {...CACKEY_
1adb0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
1adc0 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f ror. Invalid slo
1add0 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 t requested (%lu
1ade0 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 ), slot not curr
1adf0 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 ently active", s
1ae00 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 lotID);....cacke
1ae10 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
1ae20 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
1ae30 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 ...return(CKR_GE
1ae40 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d NERAL_ERROR);..}
1ae50 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f ...cackey_sessio
1ae60 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61 ns[hSession].sta
1ae70 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 50 55 42 4c te = CKS_RO_PUBL
1ae80 49 43 5f 53 45 53 53 49 4f 4e 3b 0a 09 63 61 63 IC_SESSION;..cac
1ae90 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 key_slots[slotID
1aea0 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 ].token_flags =
1aeb0 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 CKF_LOGIN_REQUIR
1aec0 45 44 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 ED;...mutex_retv
1aed0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 al = cackey_mute
1aee0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
1aef0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d biglock);..if (m
1af00 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 utex_retval != 0
1af10 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
1af20 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
1af30 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 . Unlocking fai
1af40 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 led.");....retur
1af50 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 n(CKR_GENERAL_ER
1af60 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 ROR);..}...CACKE
1af70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1af80 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b Returning CKR_OK
1af90 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b (%i)", CKR_OK);
1afa0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b ...return(CKR_OK
1afb0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f );.}..CK_DEFINE_
1afc0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 FUNCTION(CK_RV,
1afd0 43 5f 43 72 65 61 74 65 4f 62 6a 65 63 74 29 28 C_CreateObject)(
1afe0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c CK_SESSION_HANDL
1aff0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 41 E hSession, CK_A
1b000 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 TTRIBUTE_PTR pTe
1b010 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 mplate, CK_ULONG
1b020 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a ulCount, CK_OBJ
1b030 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 ECT_HANDLE_PTR p
1b040 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b hObject) {..CACK
1b050 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1b060 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 "Called.");...if
1b070 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 (!cackey_initia
1b080 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 lized) {...CACKE
1b090 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1b0a0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 Error. Not init
1b0b0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 ialized.");....r
1b0c0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f eturn(CKR_CRYPTO
1b0d0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a KI_NOT_INITIALIZ
1b0e0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 ED);..}...CACKEY
1b0f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
1b100 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e eturning CKR_FUN
1b110 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
1b120 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 TED (%i)", CKR_F
1b130 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
1b140 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e ORTED);...return
1b150 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f (CKR_FUNCTION_NO
1b160 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a T_SUPPORTED);.}.
1b170 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 .CK_DEFINE_FUNCT
1b180 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6f 70 ION(CK_RV, C_Cop
1b190 79 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45 53 53 yObject)(CK_SESS
1b1a0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 ION_HANDLE hSess
1b1b0 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 ion, CK_OBJECT_H
1b1c0 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 ANDLE hObject, C
1b1d0 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 K_ATTRIBUTE_PTR
1b1e0 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c pTemplate, CK_UL
1b1f0 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f ONG ulCount, CK_
1b200 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 OBJECT_HANDLE_PT
1b210 52 20 70 68 4e 65 77 4f 62 6a 65 63 74 29 20 7b R phNewObject) {
1b220 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1b230 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
1b240 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f ;...if (!cackey_
1b250 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 initialized) {..
1b260 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1b270 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f INTF("Error. No
1b280 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 t initialized.")
1b290 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
1b2a0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 CRYPTOKI_NOT_INI
1b2b0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 TIALIZED);..}...
1b2c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1b2d0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 NTF("Returning C
1b2e0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
1b2f0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c SUPPORTED (%i)",
1b300 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f CKR_FUNCTION_NO
1b310 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 T_SUPPORTED);...
1b320 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 return(CKR_FUNCT
1b330 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
1b340 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 D);.}..CK_DEFINE
1b350 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c _FUNCTION(CK_RV,
1b360 20 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63 74 C_DestroyObject
1b370 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e )(CK_SESSION_HAN
1b380 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b DLE hSession, CK
1b390 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 _OBJECT_HANDLE h
1b3a0 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b 45 Object) {..CACKE
1b3b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1b3c0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 Called.");...if
1b3d0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c (!cackey_initial
1b3e0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 ized) {...CACKEY
1b3f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
1b400 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 rror. Not initi
1b410 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 alized.");....re
1b420 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b turn(CKR_CRYPTOK
1b430 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 I_NOT_INITIALIZE
1b440 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f D);..}...CACKEY_
1b450 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
1b460 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 turning CKR_FUNC
1b470 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
1b480 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 ED (%i)", CKR_FU
1b490 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
1b4a0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 RTED);...return(
1b4b0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
1b4c0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a _SUPPORTED);.}..
1b4d0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 CK_DEFINE_FUNCTI
1b4e0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4f ON(CK_RV, C_GetO
1b4f0 62 6a 65 63 74 53 69 7a 65 29 28 43 4b 5f 53 45 bjectSize)(CK_SE
1b500 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 SSION_HANDLE hSe
1b510 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 ssion, CK_OBJECT
1b520 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c _HANDLE hObject,
1b530 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 CK_ULONG_PTR pu
1b540 6c 53 69 7a 65 29 20 7b 0a 09 43 41 43 4b 45 59 lSize) {..CACKEY
1b550 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 _DEBUG_PRINTF("C
1b560 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 alled.");...if (
1b570 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 !cackey_initiali
1b580 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f zed) {...CACKEY_
1b590 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
1b5a0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 ror. Not initia
1b5b0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 lized.");....ret
1b5c0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 urn(CKR_CRYPTOKI
1b5d0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 _NOT_INITIALIZED
1b5e0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 );..}...CACKEY_D
1b5f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
1b600 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 urning CKR_FUNCT
1b610 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
1b620 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e D (%i)", CKR_FUN
1b630 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
1b640 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 TED);...return(C
1b650 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
1b660 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 SUPPORTED);.}..C
1b670 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f K_DEFINE_FUNCTIO
1b680 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 41 74 N(CK_RV, C_GetAt
1b690 74 72 69 62 75 74 65 56 61 6c 75 65 29 28 43 4b tributeValue)(CK
1b6a0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 _SESSION_HANDLE
1b6b0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a hSession, CK_OBJ
1b6c0 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 ECT_HANDLE hObje
1b6d0 63 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 ct, CK_ATTRIBUTE
1b6e0 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 _PTR pTemplate,
1b6f0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 CK_ULONG ulCount
1b700 29 20 7b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 ) {..CK_ATTRIBUT
1b710 45 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09 73 E *curr_attr;..s
1b720 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 truct cackey_ide
1b730 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79 3b ntity *identity;
1b740 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 ..unsigned long
1b750 69 64 65 6e 74 69 74 79 5f 69 64 78 2c 20 61 74 identity_idx, at
1b760 74 72 5f 69 64 78 2c 20 73 65 73 73 5f 61 74 74 tr_idx, sess_att
1b770 72 5f 69 64 78 2c 20 6e 75 6d 5f 69 64 73 3b 0a r_idx, num_ids;.
1b780 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 .int mutex_retva
1b790 6c 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c l;..CK_RV retval
1b7a0 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 43 4b 5f 56 = CKR_OK;..CK_V
1b7b0 4f 49 44 5f 50 54 52 20 70 56 61 6c 75 65 3b 0a OID_PTR pValue;.
1b7c0 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c 75 .CK_ULONG ulValu
1b7d0 65 4c 65 6e 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 eLen;...CACKEY_D
1b7e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
1b7f0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 led.");...if (!c
1b800 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 ackey_initialize
1b810 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 d) {...CACKEY_DE
1b820 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
1b830 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 r. Not initiali
1b840 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 zed.");....retur
1b850 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e n(CKR_CRYPTOKI_N
1b860 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b OT_INITIALIZED);
1b870 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 ..}...if (hSessi
1b880 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 on == 0 || hSess
1b890 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 ion >= (sizeof(c
1b8a0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 ackey_sessions)
1b8b0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f / sizeof(cackey_
1b8c0 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b sessions[0]))) {
1b8d0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1b8e0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
1b8f0 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 Session out of r
1b900 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 ange.");......re
1b910 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e turn(CKR_SESSION
1b920 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 _HANDLE_INVALID)
1b930 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4f 62 6a 65 ;..}...if (hObje
1b940 63 74 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 ct == 0) {...CAC
1b950 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1b960 28 22 45 72 72 6f 72 2e 20 20 4f 62 6a 65 63 74 ("Error. Object
1b970 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 handle out of r
1b980 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 ange.");......re
1b990 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 54 5f turn(CKR_OBJECT_
1b9a0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b HANDLE_INVALID);
1b9b0 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 43 6f 75 6e ..}...if (ulCoun
1b9c0 74 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 t == 0) {.../* S
1b9d0 68 6f 72 74 20 63 69 72 63 75 69 74 2c 20 69 66 hort circuit, if
1b9e0 20 7a 65 72 6f 20 6f 62 6a 65 63 74 73 20 77 65 zero objects we
1b9f0 72 65 20 73 70 65 63 69 66 69 65 64 20 72 65 74 re specified ret
1ba00 75 72 6e 20 7a 65 72 6f 20 69 74 65 6d 73 20 69 urn zero items i
1ba10 6d 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a 09 09 mmediately */...
1ba20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1ba30 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 NTF("Returning C
1ba40 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 KR_OK (%i) (shor
1ba50 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 t circuit)", CKR
1ba60 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 _OK);....return(
1ba70 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 CKR_OK);..}...if
1ba80 20 28 70 54 65 6d 70 6c 61 74 65 20 3d 3d 20 4e (pTemplate == N
1ba90 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f ULL) {...CACKEY_
1baa0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
1bab0 72 6f 72 2e 20 20 70 54 65 6d 70 6c 61 74 65 20 ror. pTemplate
1bac0 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 is NULL.");....r
1bad0 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 eturn(CKR_ARGUME
1bae0 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 NTS_BAD);..}...i
1baf0 64 65 6e 74 69 74 79 5f 69 64 78 20 3d 20 68 4f dentity_idx = hO
1bb00 62 6a 65 63 74 20 2d 20 31 3b 0a 0a 09 6d 75 74 bject - 1;...mut
1bb10 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b ex_retval = cack
1bb20 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 ey_mutex_lock(ca
1bb30 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 ckey_biglock);..
1bb40 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c if (mutex_retval
1bb50 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 != 0) {...CACKE
1bb60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1bb70 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 Error. Locking
1bb80 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 failed.");....re
1bb90 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c turn(CKR_GENERAL
1bba0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 _ERROR);..}...if
1bbb0 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f (!cackey_sessio
1bbc0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 ns[hSession].act
1bbd0 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f ive) {...cackey_
1bbe0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 mutex_unlock(cac
1bbf0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 key_biglock);...
1bc00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1bc10 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 INTF("Error. Se
1bc20 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 ssion not active
1bc30 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e .");......return
1bc40 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e (CKR_SESSION_HAN
1bc50 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d DLE_INVALID);..}
1bc60 0a 0a 09 6e 75 6d 5f 69 64 73 20 3d 20 63 61 63 ...num_ids = cac
1bc70 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
1bc80 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 ssion].identitie
1bc90 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69 66 20 28 69 s_count;...if (i
1bca0 64 65 6e 74 69 74 79 5f 69 64 78 20 3e 3d 20 6e dentity_idx >= n
1bcb0 75 6d 5f 69 64 73 29 20 7b 0a 09 09 63 61 63 6b um_ids) {...cack
1bcc0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 ey_mutex_unlock(
1bcd0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
1bce0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
1bcf0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
1bd00 20 4f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 6f Object handle o
1bd10 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 69 64 ut of range. id
1bd20 65 6e 74 69 74 79 5f 69 64 78 20 3d 20 25 6c 75 entity_idx = %lu
1bd30 2c 20 6e 75 6d 5f 69 64 73 20 3d 20 25 6c 75 2e , num_ids = %lu.
1bd40 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e ", (unsigned lon
1bd50 67 29 20 69 64 65 6e 74 69 74 79 5f 69 64 78 2c g) identity_idx,
1bd60 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
1bd70 20 6e 75 6d 5f 69 64 73 29 3b 0a 0a 09 09 72 65 num_ids);....re
1bd80 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 54 5f turn(CKR_OBJECT_
1bd90 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b HANDLE_INVALID);
1bda0 0a 09 7d 0a 0a 09 69 64 65 6e 74 69 74 79 20 3d ..}...identity =
1bdb0 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e &cackey_session
1bdc0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e s[hSession].iden
1bdd0 74 69 74 69 65 73 5b 69 64 65 6e 74 69 74 79 5f tities[identity_
1bde0 69 64 78 5d 3b 0a 0a 09 66 6f 72 20 28 61 74 74 idx];...for (att
1bdf0 72 5f 69 64 78 20 3d 20 30 3b 20 61 74 74 72 5f r_idx = 0; attr_
1be00 69 64 78 20 3c 20 75 6c 43 6f 75 6e 74 3b 20 61 idx < ulCount; a
1be10 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 63 ttr_idx++) {...c
1be20 75 72 72 5f 61 74 74 72 20 3d 20 26 70 54 65 6d urr_attr = &pTem
1be30 70 6c 61 74 65 5b 61 74 74 72 5f 69 64 78 5d 3b plate[attr_idx];
1be40 0a 0a 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c ....pValue = NUL
1be50 4c 3b 0a 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 L;...ulValueLen
1be60 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a = (CK_LONG) -1;.
1be70 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1be80 50 52 49 4e 54 46 28 22 4c 6f 6f 6b 69 6e 67 20 PRINTF("Looking
1be90 66 6f 72 20 61 74 74 72 69 62 75 74 65 20 30 78 for attribute 0x
1bea0 25 30 38 6c 78 20 28 69 64 65 6e 74 69 74 79 3a %08lx (identity:
1beb0 25 6c 75 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 %lu) ...", (unsi
1bec0 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f gned long) curr_
1bed0 61 74 74 72 2d 3e 74 79 70 65 2c 20 28 75 6e 73 attr->type, (uns
1bee0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65 6e igned long) iden
1bef0 74 69 74 79 5f 69 64 78 29 3b 0a 0a 09 09 66 6f tity_idx);....fo
1bf00 72 20 28 73 65 73 73 5f 61 74 74 72 5f 69 64 78 r (sess_attr_idx
1bf10 20 3d 20 30 3b 20 73 65 73 73 5f 61 74 74 72 5f = 0; sess_attr_
1bf20 69 64 78 20 3c 20 69 64 65 6e 74 69 74 79 2d 3e idx < identity->
1bf30 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 attributes_count
1bf40 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 2b ; sess_attr_idx+
1bf50 2b 29 20 7b 0a 09 09 09 69 66 20 28 69 64 65 6e +) {....if (iden
1bf60 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 tity->attributes
1bf70 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e [sess_attr_idx].
1bf80 74 79 70 65 20 3d 3d 20 63 75 72 72 5f 61 74 74 type == curr_att
1bf90 72 2d 3e 74 79 70 65 29 20 7b 0a 09 09 09 09 43 r->type) {.....C
1bfa0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1bfb0 54 46 28 22 20 2e 2e 2e 20 66 6f 75 6e 64 20 69 TF(" ... found i
1bfc0 74 2c 20 70 56 61 6c 75 65 20 3d 20 25 70 2c 20 t, pValue = %p,
1bfd0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 25 6c 75 ulValueLen = %lu
1bfe0 22 2c 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 ", identity->att
1bff0 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 ributes[sess_att
1c000 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 69 r_idx].pValue, i
1c010 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 dentity->attribu
1c020 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 tes[sess_attr_id
1c030 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a x].ulValueLen);.
1c040 09 09 09 09 0a 09 09 09 09 70 56 61 6c 75 65 20 .........pValue
1c050 3d 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 = identity->attr
1c060 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 ibutes[sess_attr
1c070 5f 69 64 78 5d 2e 70 56 61 6c 75 65 3b 0a 09 09 _idx].pValue;...
1c080 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 69 ..ulValueLen = i
1c090 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 dentity->attribu
1c0a0 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 tes[sess_attr_id
1c0b0 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 x].ulValueLen;..
1c0c0 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 ..}...}....if (c
1c0d0 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 urr_attr->pValue
1c0e0 20 26 26 20 70 56 61 6c 75 65 29 20 7b 0a 09 09 && pValue) {...
1c0f0 09 69 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e .if (curr_attr->
1c100 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d 20 75 6c ulValueLen >= ul
1c110 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09 09 09 ValueLen) {.....
1c120 6d 65 6d 63 70 79 28 63 75 72 72 5f 61 74 74 72 memcpy(curr_attr
1c130 2d 3e 70 56 61 6c 75 65 2c 20 70 56 61 6c 75 65 ->pValue, pValue
1c140 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 , ulValueLen);..
1c150 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 75 ..} else {.....u
1c160 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f lValueLen = (CK_
1c170 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 09 09 72 LONG) -1;......r
1c180 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 etval = CKR_BUFF
1c190 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 ER_TOO_SMALL;...
1c1a0 09 7d 0a 09 09 7d 0a 0a 09 09 63 75 72 72 5f 61 .}...}....curr_a
1c1b0 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 ttr->ulValueLen
1c1c0 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 7d = ulValueLen;..}
1c1d0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 ...mutex_retval
1c1e0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 = cackey_mutex_u
1c1f0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 nlock(cackey_big
1c200 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 lock);..if (mute
1c210 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b x_retval != 0) {
1c220 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1c230 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
1c240 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 Unlocking failed
1c250 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
1c260 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 KR_GENERAL_ERROR
1c270 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65 74 76 );..}...if (retv
1c280 61 6c 20 3d 3d 20 43 4b 52 5f 41 54 54 52 49 42 al == CKR_ATTRIB
1c290 55 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 UTE_TYPE_INVALID
1c2a0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
1c2b0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
1c2c0 6e 69 6e 67 20 43 4b 52 5f 41 54 54 52 49 42 55 ning CKR_ATTRIBU
1c2d0 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 20 TE_TYPE_INVALID
1c2e0 28 25 69 29 22 2c 20 28 69 6e 74 29 20 72 65 74 (%i)", (int) ret
1c2f0 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66 val);..} else if
1c300 20 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f (retval == CKR_
1c310 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c BUFFER_TOO_SMALL
1c320 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
1c330 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
1c340 6e 69 6e 67 20 43 4b 52 5f 42 55 46 46 45 52 5f ning CKR_BUFFER_
1c350 54 4f 4f 5f 53 4d 41 4c 4c 20 28 25 69 29 22 2c TOO_SMALL (%i)",
1c360 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a (int) retval);.
1c370 09 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74 76 .} else if (retv
1c380 61 6c 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a al == CKR_OK) {.
1c390 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1c3a0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
1c3b0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 28 CKR_OK (%i)", (
1c3c0 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d int) retval);..}
1c3d0 20 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b 45 59 else {...CACKEY
1c3e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
1c3f0 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 28 69 eturning %i", (i
1c400 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 0a nt) retval);..}.
1c410 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 ..return(retval)
1c420 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 ;.}..CK_DEFINE_F
1c430 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 UNCTION(CK_RV, C
1c440 5f 53 65 74 41 74 74 72 69 62 75 74 65 56 61 6c _SetAttributeVal
1c450 75 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 ue)(CK_SESSION_H
1c460 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 ANDLE hSession,
1c470 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 CK_OBJECT_HANDLE
1c480 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54 hObject, CK_ATT
1c490 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 RIBUTE_PTR pTemp
1c4a0 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 late, CK_ULONG u
1c4b0 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41 43 4b 45 lCount) {..CACKE
1c4c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1c4d0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 Called.");...if
1c4e0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c (!cackey_initial
1c4f0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 ized) {...CACKEY
1c500 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
1c510 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 rror. Not initi
1c520 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 alized.");....re
1c530 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b turn(CKR_CRYPTOK
1c540 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 I_NOT_INITIALIZE
1c550 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f D);..}...CACKEY_
1c560 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
1c570 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 turning CKR_FUNC
1c580 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
1c590 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 ED (%i)", CKR_FU
1c5a0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
1c5b0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 RTED);...return(
1c5c0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
1c5d0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a _SUPPORTED);.}..
1c5e0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 CK_DEFINE_FUNCTI
1c5f0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 ON(CK_RV, C_Find
1c600 4f 62 6a 65 63 74 73 49 6e 69 74 29 28 43 4b 5f ObjectsInit)(CK_
1c610 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 SESSION_HANDLE h
1c620 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 41 54 54 52 Session, CK_ATTR
1c630 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c IBUTE_PTR pTempl
1c640 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c ate, CK_ULONG ul
1c650 43 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 53 4c 4f Count) {..CK_SLO
1c660 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 69 6e T_ID slotID;..in
1c670 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a t mutex_retval;.
1c680 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1c690 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
1c6a0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f ;...if (!cackey_
1c6b0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 initialized) {..
1c6c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1c6d0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f INTF("Error. No
1c6e0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 t initialized.")
1c6f0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
1c700 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 CRYPTOKI_NOT_INI
1c710 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 TIALIZED);..}...
1c720 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 if (hSession ==
1c730 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 0 || hSession >=
1c740 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f (sizeof(cackey_
1c750 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 sessions) / size
1c760 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f of(cackey_sessio
1c770 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 ns[0]))) {...CAC
1c780 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1c790 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f ("Error. Sessio
1c7a0 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 n out of range."
1c7b0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 );......return(C
1c7c0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c KR_SESSION_HANDL
1c7d0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a E_INVALID);..}..
1c7e0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 .mutex_retval =
1c7f0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 cackey_mutex_loc
1c800 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
1c810 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 );..if (mutex_re
1c820 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 tval != 0) {...C
1c830 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1c840 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b TF("Error. Lock
1c850 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a ing failed.");..
1c860 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e ..return(CKR_GEN
1c870 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a ERAL_ERROR);..}.
1c880 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 ..if (!cackey_se
1c890 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
1c8a0 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 .active) {...cac
1c8b0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b key_mutex_unlock
1c8c0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 (cackey_biglock)
1c8d0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 ;....CACKEY_DEBU
1c8e0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
1c8f0 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 Session not ac
1c900 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 tive.");......re
1c910 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e turn(CKR_SESSION
1c920 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 _HANDLE_INVALID)
1c930 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 ;..}...if (cacke
1c940 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
1c950 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 ion].search_acti
1c960 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d ve) {...cackey_m
1c970 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b utex_unlock(cack
1c980 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 ey_biglock);....
1c990 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1c9a0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 NTF("Error. Sea
1c9b0 72 63 68 20 61 6c 72 65 61 64 79 20 61 63 74 69 rch already acti
1c9c0 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 ve.");......retu
1c9d0 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e rn(CKR_OPERATION
1c9e0 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 73 _ACTIVE);..}...s
1c9f0 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 lotID = cackey_s
1ca00 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
1ca10 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 ].slotID;...if (
1ca20 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c slotID < 0 || sl
1ca30 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 otID >= (sizeof(
1ca40 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 cackey_slots) /
1ca50 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c sizeof(cackey_sl
1ca60 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 ots[0]))) {...CA
1ca70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
1ca80 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 F("Error. Invali
1ca90 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 d slot requested
1caa0 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 (%lu), outside
1cab0 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c of valid range",
1cac0 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 slotID);....ret
1cad0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f urn(CKR_GENERAL_
1cae0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 ERROR);..}...if
1caf0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c (cackey_slots[sl
1cb00 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 otID].active ==
1cb10 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 0) {...CACKEY_DE
1cb20 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
1cb30 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 r. Invalid slot
1cb40 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c requested (%lu),
1cb50 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e slot not curren
1cb60 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f tly active", slo
1cb70 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f tID);....cackey_
1cb80 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 mutex_unlock(cac
1cb90 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 key_biglock);...
1cba0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 .return(CKR_GENE
1cbb0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a RAL_ERROR);..}..
1cbc0 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 .if (cackey_slot
1cbd0 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72 s[slotID].slot_r
1cbe0 65 73 65 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 eset) {...CACKEY
1cbf0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 _DEBUG_PRINTF("T
1cc00 68 65 20 73 6c 6f 74 20 68 61 73 20 62 65 65 6e he slot has been
1cc10 20 72 65 73 65 74 20 73 69 6e 63 65 20 77 65 20 reset since we
1cc20 6c 61 73 74 20 6c 6f 6f 6b 65 64 20 66 6f 72 20 last looked for
1cc30 69 64 65 6e 74 69 74 69 65 73 20 2d 2d 20 72 65 identities -- re
1cc40 73 63 61 6e 6e 69 6e 67 22 29 3b 0a 0a 09 09 69 scanning");....i
1cc50 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f f (cackey_sessio
1cc60 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 ns[hSession].ide
1cc70 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 ntities != NULL)
1cc80 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65 {....cackey_fre
1cc90 65 5f 69 64 65 6e 74 69 74 69 65 73 28 63 61 63 e_identities(cac
1cca0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
1ccb0 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 ssion].identitie
1ccc0 73 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f s, cackey_sessio
1ccd0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 ns[hSession].ide
1cce0 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a ntities_count);.
1ccf0 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 ....cackey_sessi
1cd00 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 ons[hSession].id
1cd10 65 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c 4c 3b entities = NULL;
1cd20 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 ....cackey_sessi
1cd30 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 ons[hSession].id
1cd40 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d entities_count =
1cd50 20 30 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 0;...}....if (c
1cd60 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 ackey_slots[slot
1cd70 49 44 5d 2e 6c 61 62 65 6c 20 21 3d 20 4e 55 4c ID].label != NUL
1cd80 4c 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63 L) {....free(cac
1cd90 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 key_slots[slotID
1cda0 5d 2e 6c 61 62 65 6c 29 3b 0a 09 09 09 63 61 63 ].label);....cac
1cdb0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 key_slots[slotID
1cdc0 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a ].label = NULL;.
1cdd0 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c ..}....cackey_sl
1cde0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c 6f 74 ots[slotID].slot
1cdf0 5f 72 65 73 65 74 20 3d 20 30 3b 0a 09 09 63 61 _reset = 0;...ca
1ce00 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 ckey_slots[slotI
1ce10 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d D].token_flags =
1ce20 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 CKF_LOGIN_REQUI
1ce30 52 45 44 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 RED;..}...if (ca
1ce40 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
1ce50 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 ession].identiti
1ce60 65 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 es == NULL) {...
1ce70 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
1ce80 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 hSession].identi
1ce90 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 ties = cackey_re
1cea0 61 64 5f 69 64 65 6e 74 69 74 69 65 73 28 26 63 ad_identities(&c
1ceb0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 ackey_slots[slot
1cec0 49 44 5d 2c 20 26 63 61 63 6b 65 79 5f 73 65 73 ID], &cackey_ses
1ced0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
1cee0 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 identities_count
1cef0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 54 65 6d );..}...if (pTem
1cf00 70 6c 61 74 65 20 21 3d 20 4e 55 4c 4c 29 20 7b plate != NULL) {
1cf10 0a 09 09 69 66 20 28 75 6c 43 6f 75 6e 74 20 21 ...if (ulCount !
1cf20 3d 20 30 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 = 0) {....cackey
1cf30 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
1cf40 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 on].search_query
1cf50 5f 63 6f 75 6e 74 20 3d 20 75 6c 43 6f 75 6e 74 _count = ulCount
1cf60 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 ;....cackey_sess
1cf70 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 ions[hSession].s
1cf80 65 61 72 63 68 5f 71 75 65 72 79 20 3d 20 6d 61 earch_query = ma
1cf90 6c 6c 6f 63 28 75 6c 43 6f 75 6e 74 20 2a 20 73 lloc(ulCount * s
1cfa0 69 7a 65 6f 66 28 2a 70 54 65 6d 70 6c 61 74 65 izeof(*pTemplate
1cfb0 29 29 3b 0a 0a 09 09 09 6d 65 6d 63 70 79 28 63 ));.....memcpy(c
1cfc0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
1cfd0 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f Session].search_
1cfe0 71 75 65 72 79 2c 20 70 54 65 6d 70 6c 61 74 65 query, pTemplate
1cff0 2c 20 75 6c 43 6f 75 6e 74 20 2a 20 73 69 7a 65 , ulCount * size
1d000 6f 66 28 2a 70 54 65 6d 70 6c 61 74 65 29 29 3b of(*pTemplate));
1d010 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 63 ...} else {....c
1d020 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
1d030 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f Session].search_
1d040 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20 30 3b query_count = 0;
1d050 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 ....cackey_sessi
1d060 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 ons[hSession].se
1d070 61 72 63 68 5f 71 75 65 72 79 20 3d 20 4e 55 4c arch_query = NUL
1d080 4c 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b L;...}..} else {
1d090 0a 09 09 69 66 20 28 75 6c 43 6f 75 6e 74 20 21 ...if (ulCount !
1d0a0 3d 20 30 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 = 0) {....cackey
1d0b0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 _mutex_unlock(ca
1d0c0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a ckey_biglock);..
1d0d0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1d0e0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
1d0f0 53 65 61 72 63 68 20 71 75 65 72 79 20 73 70 65 Search query spe
1d100 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 cified as NULL,
1d110 62 75 74 20 6e 75 6d 62 65 72 20 6f 66 20 71 75 but number of qu
1d120 65 72 79 20 74 65 72 6d 73 20 6e 6f 74 20 73 70 ery terms not sp
1d130 65 63 69 66 69 65 64 20 61 73 20 30 2e 22 29 3b ecified as 0.");
1d140 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f .....return(CKR_
1d150 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a ARGUMENTS_BAD);.
1d160 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 65 ..}....cackey_se
1d170 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
1d180 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f .search_query_co
1d190 75 6e 74 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 unt = 0;...cacke
1d1a0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
1d1b0 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 ion].search_quer
1d1c0 79 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 63 y = NULL;..}...c
1d1d0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
1d1e0 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f Session].search_
1d1f0 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 63 61 63 active = 1;..cac
1d200 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
1d210 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75 ssion].search_cu
1d220 72 72 5f 69 64 20 3d 20 30 3b 0a 0a 09 6d 75 74 rr_id = 0;...mut
1d230 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b ex_retval = cack
1d240 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 ey_mutex_unlock(
1d250 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
1d260 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 ..if (mutex_retv
1d270 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 al != 0) {...CAC
1d280 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1d290 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b ("Error. Unlock
1d2a0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a ing failed.");..
1d2b0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e ..return(CKR_GEN
1d2c0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a ERAL_ERROR);..}.
1d2d0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1d2e0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
1d2f0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 CKR_OK (%i)", C
1d300 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e KR_OK);...return
1d310 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f (CKR_OK);.}..CK_
1d320 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 DEFINE_FUNCTION(
1d330 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a CK_RV, C_FindObj
1d340 65 63 74 73 29 28 43 4b 5f 53 45 53 53 49 4f 4e ects)(CK_SESSION
1d350 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e _HANDLE hSession
1d360 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 , CK_OBJECT_HAND
1d370 4c 45 5f 50 54 52 20 70 68 4f 62 6a 65 63 74 2c LE_PTR phObject,
1d380 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4d 61 78 4f CK_ULONG ulMaxO
1d390 62 6a 65 63 74 43 6f 75 6e 74 2c 20 43 4b 5f 55 bjectCount, CK_U
1d3a0 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4f 62 6a 65 LONG_PTR pulObje
1d3b0 63 74 43 6f 75 6e 74 29 20 7b 0a 09 73 74 72 75 ctCount) {..stru
1d3c0 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 ct cackey_identi
1d3d0 74 79 20 2a 63 75 72 72 5f 69 64 3b 0a 09 43 4b ty *curr_id;..CK
1d3e0 5f 41 54 54 52 49 42 55 54 45 20 2a 63 75 72 72 _ATTRIBUTE *curr
1d3f0 5f 61 74 74 72 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 _attr;..CK_ULONG
1d400 20 63 75 72 72 5f 69 64 5f 69 64 78 2c 20 63 75 curr_id_idx, cu
1d410 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 2c 20 63 rr_out_id_idx, c
1d420 75 72 72 5f 61 74 74 72 5f 69 64 78 2c 20 73 65 urr_attr_idx, se
1d430 73 73 5f 61 74 74 72 5f 69 64 78 3b 0a 09 43 4b ss_attr_idx;..CK
1d440 5f 55 4c 4f 4e 47 20 6d 61 74 63 68 65 64 5f 63 _ULONG matched_c
1d450 6f 75 6e 74 2c 20 70 72 65 76 5f 6d 61 74 63 68 ount, prev_match
1d460 65 64 5f 63 6f 75 6e 74 3b 0a 09 69 6e 74 20 6d ed_count;..int m
1d470 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 utex_retval;...C
1d480 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1d490 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
1d4a0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 .if (!cackey_ini
1d4b0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 tialized) {...CA
1d4c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
1d4d0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 F("Error. Not i
1d4e0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a nitialized.");..
1d4f0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 ..return(CKR_CRY
1d500 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 PTOKI_NOT_INITIA
1d510 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 LIZED);..}...if
1d520 28 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 (pulObjectCount
1d530 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 == NULL) {...CAC
1d540 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1d550 28 22 45 72 72 6f 72 2e 20 20 70 75 6c 4f 62 6a ("Error. pulObj
1d560 65 63 74 43 6f 75 6e 74 20 69 73 20 4e 55 4c 4c ectCount is NULL
1d570 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
1d580 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 KR_ARGUMENTS_BAD
1d590 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 68 4f 62 );..}...if (phOb
1d5a0 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 ject == NULL &&
1d5b0 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 ulMaxObjectCount
1d5c0 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 == 0) {.../* Sh
1d5d0 6f 72 74 20 63 69 72 63 75 69 74 2c 20 69 66 20 ort circuit, if
1d5e0 7a 65 72 6f 20 6f 62 6a 65 63 74 73 20 77 65 72 zero objects wer
1d5f0 65 20 73 70 65 63 69 66 69 65 64 20 72 65 74 75 e specified retu
1d600 72 6e 20 7a 65 72 6f 20 69 74 65 6d 73 20 69 6d rn zero items im
1d610 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a 09 09 2a mediately */...*
1d620 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d pulObjectCount =
1d630 20 30 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 0;....CACKEY_DE
1d640 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
1d650 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 rning CKR_OK (%i
1d660 29 20 28 73 68 6f 72 74 20 63 69 72 63 75 69 74 ) (short circuit
1d670 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 )", CKR_OK);....
1d680 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a return(CKR_OK);.
1d690 09 7d 0a 0a 09 69 66 20 28 70 68 4f 62 6a 65 63 .}...if (phObjec
1d6a0 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 t == NULL) {...C
1d6b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1d6c0 54 46 28 22 45 72 72 6f 72 2e 20 20 70 68 4f 62 TF("Error. phOb
1d6d0 6a 65 63 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b ject is NULL.");
1d6e0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 ....return(CKR_A
1d6f0 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 RGUMENTS_BAD);..
1d700 7d 0a 0a 09 69 66 20 28 75 6c 4d 61 78 4f 62 6a }...if (ulMaxObj
1d710 65 63 74 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b ectCount == 0) {
1d720 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1d730 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
1d740 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f Maximum number o
1d750 66 20 6f 62 6a 65 63 74 73 20 73 70 65 63 69 66 f objects specif
1d760 69 65 64 20 61 73 20 7a 65 72 6f 2e 22 29 3b 0a ied as zero.");.
1d770 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 ...return(CKR_AR
1d780 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d GUMENTS_BAD);..}
1d790 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 ...if (hSession
1d7a0 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e == 0 || hSession
1d7b0 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b >= (sizeof(cack
1d7c0 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 ey_sessions) / s
1d7d0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 izeof(cackey_ses
1d7e0 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 sions[0]))) {...
1d7f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1d800 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 NTF("Error. Ses
1d810 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 sion out of rang
1d820 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 e.");......retur
1d830 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 n(CKR_SESSION_HA
1d840 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 NDLE_INVALID);..
1d850 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c }...mutex_retval
1d860 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f = cackey_mutex_
1d870 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
1d880 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 ock);..if (mutex
1d890 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a _retval != 0) {.
1d8a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1d8b0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c RINTF("Error. L
1d8c0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 ocking failed.")
1d8d0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
1d8e0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a GENERAL_ERROR);.
1d8f0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 .}...if (!cackey
1d900 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
1d910 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 on].active) {...
1d920 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c cackey_mutex_unl
1d930 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
1d940 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 ck);....CACKEY_D
1d950 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
1d960 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 or. Session not
1d970 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 active.");.....
1d980 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 .return(CKR_SESS
1d990 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c ION_HANDLE_INVAL
1d9a0 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 ID);..}...if (!c
1d9b0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
1d9c0 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f Session].search_
1d9d0 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b active) {...cack
1d9e0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 ey_mutex_unlock(
1d9f0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
1da00 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
1da10 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
1da20 20 53 65 61 72 63 68 20 6e 6f 74 20 61 63 74 69 Search not acti
1da30 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 ve.");......retu
1da40 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e rn(CKR_OPERATION
1da50 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 _NOT_INITIALIZED
1da60 29 3b 0a 09 7d 0a 0a 09 63 75 72 72 5f 6f 75 74 );..}...curr_out
1da70 5f 69 64 5f 69 64 78 20 3d 20 30 3b 0a 09 66 6f _id_idx = 0;..fo
1da80 72 20 28 63 75 72 72 5f 69 64 5f 69 64 78 20 3d r (curr_id_idx =
1da90 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 cackey_sessions
1daa0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 [hSession].searc
1dab0 68 5f 63 75 72 72 5f 69 64 3b 20 63 75 72 72 5f h_curr_id; curr_
1dac0 69 64 5f 69 64 78 20 3c 20 63 61 63 6b 65 79 5f id_idx < cackey_
1dad0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
1dae0 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f n].identities_co
1daf0 75 6e 74 20 26 26 20 75 6c 4d 61 78 4f 62 6a 65 unt && ulMaxObje
1db00 63 74 43 6f 75 6e 74 3b 20 63 75 72 72 5f 69 64 ctCount; curr_id
1db10 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 63 75 72 72 _idx++) {...curr
1db20 5f 69 64 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 _id = &cackey_se
1db30 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
1db40 2e 69 64 65 6e 74 69 74 69 65 73 5b 63 75 72 72 .identities[curr
1db50 5f 69 64 5f 69 64 78 5d 3b 0a 0a 09 09 43 41 43 _id_idx];....CAC
1db60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1db70 28 22 50 72 6f 63 65 73 73 69 6e 67 20 69 64 65 ("Processing ide
1db80 6e 74 69 74 79 3a 25 6c 75 22 2c 20 28 75 6e 73 ntity:%lu", (uns
1db90 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 igned long) curr
1dba0 5f 69 64 5f 69 64 78 29 3b 0a 0a 09 09 6d 61 74 _id_idx);....mat
1dbb0 63 68 65 64 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a ched_count = 0;.
1dbc0 0a 09 09 66 6f 72 20 28 63 75 72 72 5f 61 74 74 ...for (curr_att
1dbd0 72 5f 69 64 78 20 3d 20 30 3b 20 63 75 72 72 5f r_idx = 0; curr_
1dbe0 61 74 74 72 5f 69 64 78 20 3c 20 63 61 63 6b 65 attr_idx < cacke
1dbf0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
1dc00 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 ion].search_quer
1dc10 79 5f 63 6f 75 6e 74 3b 20 63 75 72 72 5f 61 74 y_count; curr_at
1dc20 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 70 tr_idx++) {....p
1dc30 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e rev_matched_coun
1dc40 74 20 3d 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e t = matched_coun
1dc50 74 3b 0a 0a 09 09 09 63 75 72 72 5f 61 74 74 72 t;.....curr_attr
1dc60 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 = &cackey_sessi
1dc70 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 ons[hSession].se
1dc80 61 72 63 68 5f 71 75 65 72 79 5b 63 75 72 72 5f arch_query[curr_
1dc90 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 09 43 attr_idx];.....C
1dca0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1dcb0 54 46 28 22 20 20 43 68 65 63 6b 69 6e 67 20 66 TF(" Checking f
1dcc0 6f 72 20 61 74 74 72 69 62 75 74 65 20 30 78 25 or attribute 0x%
1dcd0 30 38 6c 78 20 69 6e 20 69 64 65 6e 74 69 74 79 08lx in identity
1dce0 3a 25 69 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e :%i...", (unsign
1dcf0 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 ed long) curr_at
1dd00 74 72 2d 3e 74 79 70 65 2c 20 28 69 6e 74 29 20 tr->type, (int)
1dd10 63 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a 09 09 curr_id_idx);...
1dd20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1dd30 49 4e 54 42 55 46 28 22 20 20 20 20 56 61 6c 75 INTBUF(" Valu
1dd40 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 3a 22 2c e looking for:",
1dd50 20 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c curr_attr->pVal
1dd60 75 65 2c 20 63 75 72 72 5f 61 74 74 72 2d 3e 75 ue, curr_attr->u
1dd70 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 lValueLen);.....
1dd80 66 6f 72 20 28 73 65 73 73 5f 61 74 74 72 5f 69 for (sess_attr_i
1dd90 64 78 20 3d 20 30 3b 20 73 65 73 73 5f 61 74 74 dx = 0; sess_att
1dda0 72 5f 69 64 78 20 3c 20 63 75 72 72 5f 69 64 2d r_idx < curr_id-
1ddb0 3e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e >attributes_coun
1ddc0 74 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 t; sess_attr_idx
1ddd0 2b 2b 29 20 7b 0a 09 09 09 09 69 66 20 28 63 75 ++) {.....if (cu
1dde0 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65 rr_id->attribute
1ddf0 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d s[sess_attr_idx]
1de00 2e 74 79 70 65 20 3d 3d 20 63 75 72 72 5f 61 74 .type == curr_at
1de10 74 72 2d 3e 74 79 70 65 29 20 7b 0a 09 09 09 09 tr->type) {.....
1de20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1de30 49 4e 54 46 28 22 20 20 20 20 2e 2e 2e 20 66 6f INTF(" ... fo
1de40 75 6e 64 20 6d 61 74 63 68 69 6e 67 20 74 79 70 und matching typ
1de50 65 20 2e 2e 2e 22 29 3b 0a 09 09 09 09 09 43 41 e ...");......CA
1de60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
1de70 42 55 46 28 22 20 20 20 20 2e 2e 2e 20 6f 75 72 BUF(" ... our
1de80 20 76 61 6c 75 65 3a 22 2c 20 63 75 72 72 5f 69 value:", curr_i
1de90 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 d->attributes[se
1dea0 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 70 56 61 ss_attr_idx].pVa
1deb0 6c 75 65 2c 20 63 75 72 72 5f 69 64 2d 3e 61 74 lue, curr_id->at
1dec0 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 tributes[sess_at
1ded0 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c tr_idx].ulValueL
1dee0 65 6e 29 3b 0a 0a 09 09 09 09 09 69 66 20 28 63 en);.......if (c
1def0 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 urr_attr->pValue
1df00 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 == NULL) {.....
1df10 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1df20 52 49 4e 54 46 28 22 20 20 20 20 20 20 20 2e 2e RINTF(" ..
1df30 2e 20 66 6f 75 6e 64 20 77 69 6c 64 63 61 72 64 . found wildcard
1df40 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09 09 09 09 match");.......
1df50 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2b 2b .matched_count++
1df60 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a ;........break;.
1df70 09 09 09 09 09 7d 0a 0a 20 09 09 09 09 09 69 66 .....}.. .....if
1df80 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56 (curr_attr->ulV
1df90 61 6c 75 65 4c 65 6e 20 3d 3d 20 63 75 72 72 5f alueLen == curr_
1dfa0 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 id->attributes[s
1dfb0 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c ess_attr_idx].ul
1dfc0 56 61 6c 75 65 4c 65 6e 20 26 26 20 6d 65 6d 63 ValueLen && memc
1dfd0 6d 70 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 mp(curr_attr->pV
1dfe0 61 6c 75 65 2c 20 63 75 72 72 5f 69 64 2d 3e 61 alue, curr_id->a
1dff0 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 ttributes[sess_a
1e000 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 2c ttr_idx].pValue,
1e010 20 63 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 curr_id->attrib
1e020 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 utes[sess_attr_i
1e030 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 20 dx].ulValueLen)
1e040 3d 3d 20 30 29 20 7b 0a 09 09 09 09 09 09 43 41 == 0) {.......CA
1e050 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
1e060 46 28 22 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f F(" ... fo
1e070 75 6e 64 20 65 78 61 63 74 20 6d 61 74 63 68 22 und exact match"
1e080 29 3b 0a 0a 09 09 09 09 09 09 6d 61 74 63 68 65 );........matche
1e090 64 5f 63 6f 75 6e 74 2b 2b 3b 0a 0a 09 09 09 09 d_count++;......
1e0a0 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a ..break;......}.
1e0b0 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 2f ....}....}...../
1e0c0 2a 20 49 66 20 74 68 65 20 61 74 74 72 69 62 75 * If the attribu
1e0d0 74 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 te could not be
1e0e0 6d 61 74 63 68 65 64 2c 20 64 6f 20 6e 6f 74 20 matched, do not
1e0f0 74 72 79 20 74 6f 20 6d 61 74 63 68 20 61 64 64 try to match add
1e100 69 74 69 6f 6e 61 6c 20 61 74 74 72 69 62 75 74 itional attribut
1e110 65 73 20 2a 2f 0a 09 09 09 69 66 20 28 70 72 65 es */....if (pre
1e120 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 v_matched_count
1e130 3d 3d 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 == matched_count
1e140 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 ) {.....break;..
1e150 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 6d ..}...}....if (m
1e160 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 3d 20 atched_count ==
1e170 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
1e180 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 hSession].search
1e190 5f 71 75 65 72 79 5f 63 6f 75 6e 74 29 20 7b 0a _query_count) {.
1e1a0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1e1b0 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 41 6c PRINTF(" ... Al
1e1c0 6c 20 25 69 20 61 74 74 72 69 62 75 74 65 73 20 l %i attributes
1e1d0 63 68 65 63 6b 65 64 20 66 6f 72 20 66 6f 75 6e checked for foun
1e1e0 64 2c 20 61 64 64 69 6e 67 20 69 64 65 6e 74 69 d, adding identi
1e1f0 74 79 3a 25 69 20 74 6f 20 72 65 74 75 72 6e 65 ty:%i to returne
1e200 64 20 6c 69 73 74 22 2c 20 28 69 6e 74 29 20 63 d list", (int) c
1e210 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
1e220 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f Session].search_
1e230 71 75 65 72 79 5f 63 6f 75 6e 74 2c 20 28 69 6e query_count, (in
1e240 74 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b t) curr_id_idx);
1e250 0a 0a 09 09 09 70 68 4f 62 6a 65 63 74 5b 63 75 .....phObject[cu
1e260 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 5d 20 3d rr_out_id_idx] =
1e270 20 63 75 72 72 5f 69 64 5f 69 64 78 20 2b 20 31 curr_id_idx + 1
1e280 3b 0a 0a 09 09 09 75 6c 4d 61 78 4f 62 6a 65 63 ;.....ulMaxObjec
1e290 74 43 6f 75 6e 74 2d 2d 3b 0a 0a 09 09 09 63 75 tCount--;.....cu
1e2a0 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 2b 2b 3b rr_out_id_idx++;
1e2b0 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 ...} else {....C
1e2c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1e2d0 54 46 28 22 20 20 2e 2e 2e 20 4e 6f 74 20 61 6c TF(" ... Not al
1e2e0 6c 20 25 69 20 28 6f 6e 6c 79 20 66 6f 75 6e 64 l %i (only found
1e2f0 20 25 69 29 20 61 74 74 72 69 62 75 74 65 73 20 %i) attributes
1e300 63 68 65 63 6b 65 64 20 66 6f 72 20 66 6f 75 6e checked for foun
1e310 64 2c 20 6e 6f 74 20 61 64 64 69 6e 67 20 69 64 d, not adding id
1e320 65 6e 74 69 74 79 3a 25 69 22 2c 20 28 69 6e 74 entity:%i", (int
1e330 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e ) cackey_session
1e340 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 s[hSession].sear
1e350 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 2c 20 ch_query_count,
1e360 28 69 6e 74 29 20 6d 61 74 63 68 65 64 5f 63 6f (int) matched_co
1e370 75 6e 74 2c 20 28 69 6e 74 29 20 63 75 72 72 5f unt, (int) curr_
1e380 69 64 5f 69 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a id_idx);...}..}.
1e390 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 .cackey_sessions
1e3a0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 [hSession].searc
1e3b0 68 5f 63 75 72 72 5f 69 64 20 3d 20 63 75 72 72 h_curr_id = curr
1e3c0 5f 69 64 5f 69 64 78 3b 0a 09 2a 70 75 6c 4f 62 _id_idx;..*pulOb
1e3d0 6a 65 63 74 43 6f 75 6e 74 20 3d 20 63 75 72 72 jectCount = curr
1e3e0 5f 6f 75 74 5f 69 64 5f 69 64 78 3b 0a 0a 09 6d _out_id_idx;...m
1e3f0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 utex_retval = ca
1e400 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 ckey_mutex_unloc
1e410 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
1e420 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 );..if (mutex_re
1e430 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 tval != 0) {...C
1e440 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1e450 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f TF("Error. Unlo
1e460 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b cking failed.");
1e470 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 ....return(CKR_G
1e480 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 ENERAL_ERROR);..
1e490 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 }...CACKEY_DEBUG
1e4a0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
1e4b0 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 2c 20 ng CKR_OK (%i),
1e4c0 6e 75 6d 20 6f 62 6a 65 63 74 73 20 3d 20 25 6c num objects = %l
1e4d0 75 22 2c 20 43 4b 52 5f 4f 4b 2c 20 2a 70 75 6c u", CKR_OK, *pul
1e4e0 4f 62 6a 65 63 74 43 6f 75 6e 74 29 3b 0a 0a 09 ObjectCount);...
1e4f0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a return(CKR_OK);.
1e500 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e }..CK_DEFINE_FUN
1e510 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 CTION(CK_RV, C_F
1e520 69 6e 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c 29 indObjectsFinal)
1e530 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 (CK_SESSION_HAND
1e540 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 LE hSession) {..
1e550 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c int mutex_retval
1e560 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ;...CACKEY_DEBUG
1e570 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
1e580 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ");...if (!cacke
1e590 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b y_initialized) {
1e5a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1e5b0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
1e5c0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e Not initialized.
1e5d0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
1e5e0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 R_CRYPTOKI_NOT_I
1e5f0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
1e600 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d ..if (hSession =
1e610 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 = 0 || hSession
1e620 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 >= (sizeof(cacke
1e630 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 y_sessions) / si
1e640 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 zeof(cackey_sess
1e650 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 ions[0]))) {...C
1e660 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1e670 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 TF("Error. Sess
1e680 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 ion out of range
1e690 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e .");......return
1e6a0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e (CKR_SESSION_HAN
1e6b0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d DLE_INVALID);..}
1e6c0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 ...mutex_retval
1e6d0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c = cackey_mutex_l
1e6e0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
1e6f0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f ck);..if (mutex_
1e700 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 retval != 0) {..
1e710 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1e720 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f INTF("Error. Lo
1e730 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b cking failed.");
1e740 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 ....return(CKR_G
1e750 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 ENERAL_ERROR);..
1e760 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f }...if (!cackey_
1e770 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
1e780 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 n].active) {...c
1e790 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f ackey_mutex_unlo
1e7a0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
1e7b0 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 k);....CACKEY_DE
1e7c0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
1e7d0 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 r. Session not
1e7e0 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 active.");......
1e7f0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 return(CKR_SESSI
1e800 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 ON_HANDLE_INVALI
1e810 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 D);..}...if (!ca
1e820 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
1e830 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 ession].search_a
1e840 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 ctive) {...cacke
1e850 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
1e860 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
1e870 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1e880 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
1e890 53 65 61 72 63 68 20 6e 6f 74 20 61 63 74 69 76 Search not activ
1e8a0 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 e.");......retur
1e8b0 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f n(CKR_OPERATION_
1e8c0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 NOT_INITIALIZED)
1e8d0 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 ;..}...cackey_se
1e8e0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
1e8f0 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 20 3d .search_active =
1e900 20 30 3b 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 0;..if (cackey_
1e910 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
1e920 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 29 n].search_query)
1e930 20 7b 0a 09 09 66 72 65 65 28 63 61 63 6b 65 79 {...free(cackey
1e940 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
1e950 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 on].search_query
1e960 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 );..}...mutex_re
1e970 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 tval = cackey_mu
1e980 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 tex_unlock(cacke
1e990 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 y_biglock);..if
1e9a0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d (mutex_retval !=
1e9b0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 0) {...CACKEY_D
1e9c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
1e9d0 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 or. Unlocking f
1e9e0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 ailed.");....ret
1e9f0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f urn(CKR_GENERAL_
1ea00 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 ERROR);..}...CAC
1ea10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1ea20 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f ("Returning CKR_
1ea30 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b OK (%i)", CKR_OK
1ea40 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f );...return(CKR_
1ea50 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e OK);.}..CK_DEFIN
1ea60 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 E_FUNCTION(CK_RV
1ea70 2c 20 43 5f 45 6e 63 72 79 70 74 49 6e 69 74 29 , C_EncryptInit)
1ea80 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 (CK_SESSION_HAND
1ea90 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f LE hSession, CK_
1eaa0 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d MECHANISM_PTR pM
1eab0 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a echanism, CK_OBJ
1eac0 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 ECT_HANDLE hKey)
1ead0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {..CACKEY_DEBUG
1eae0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
1eaf0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ");...if (!cacke
1eb00 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b y_initialized) {
1eb10 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1eb20 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
1eb30 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e Not initialized.
1eb40 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
1eb50 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 R_CRYPTOKI_NOT_I
1eb60 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
1eb70 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1eb80 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
1eb90 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f CKR_FUNCTION_NO
1eba0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 T_SUPPORTED (%i)
1ebb0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f ", CKR_FUNCTION_
1ebc0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
1ebd0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e ..return(CKR_FUN
1ebe0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
1ebf0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 TED);.}..CK_DEFI
1ec00 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 NE_FUNCTION(CK_R
1ec10 56 2c 20 43 5f 45 6e 63 72 79 70 74 29 28 43 4b V, C_Encrypt)(CK
1ec20 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 _SESSION_HANDLE
1ec30 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 hSession, CK_BYT
1ec40 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f E_PTR pData, CK_
1ec50 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c ULONG ulDataLen,
1ec60 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e CK_BYTE_PTR pEn
1ec70 63 72 79 70 74 65 64 44 61 74 61 2c 20 43 4b 5f cryptedData, CK_
1ec80 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 ULONG_PTR pulEnc
1ec90 72 79 70 74 65 64 44 61 74 61 4c 65 6e 29 20 7b ryptedDataLen) {
1eca0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1ecb0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
1ecc0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f ;...if (!cackey_
1ecd0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 initialized) {..
1ece0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1ecf0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f INTF("Error. No
1ed00 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 t initialized.")
1ed10 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
1ed20 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 CRYPTOKI_NOT_INI
1ed30 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 TIALIZED);..}...
1ed40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1ed50 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 NTF("Returning C
1ed60 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
1ed70 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c SUPPORTED (%i)",
1ed80 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f CKR_FUNCTION_NO
1ed90 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 T_SUPPORTED);...
1eda0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 return(CKR_FUNCT
1edb0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
1edc0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 D);.}..CK_DEFINE
1edd0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c _FUNCTION(CK_RV,
1ede0 20 43 5f 45 6e 63 72 79 70 74 55 70 64 61 74 65 C_EncryptUpdate
1edf0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e )(CK_SESSION_HAN
1ee00 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b DLE hSession, CK
1ee10 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c _BYTE_PTR pPart,
1ee20 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 CK_ULONG ulPart
1ee30 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 Len, CK_BYTE_PTR
1ee40 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c pEncryptedPart,
1ee50 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 CK_ULONG_PTR pu
1ee60 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 lEncryptedPartLe
1ee70 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 n) {..CACKEY_DEB
1ee80 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
1ee90 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 d.");...if (!cac
1eea0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 key_initialized)
1eeb0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
1eec0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
1eed0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 Not initialize
1eee0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
1eef0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 CKR_CRYPTOKI_NOT
1ef00 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 _INITIALIZED);..
1ef10 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 }...CACKEY_DEBUG
1ef20 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
1ef30 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f ng CKR_FUNCTION_
1ef40 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 NOT_SUPPORTED (%
1ef50 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f i)", CKR_FUNCTIO
1ef60 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 N_NOT_SUPPORTED)
1ef70 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 ;...return(CKR_F
1ef80 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
1ef90 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 ORTED);.}..CK_DE
1efa0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b FINE_FUNCTION(CK
1efb0 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 46 69 _RV, C_EncryptFi
1efc0 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f nal)(CK_SESSION_
1efd0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c HANDLE hSession,
1efe0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4c 61 CK_BYTE_PTR pLa
1eff0 73 74 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c stEncryptedPart,
1f000 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 CK_ULONG_PTR pu
1f010 6c 4c 61 73 74 45 6e 63 72 79 70 74 65 64 50 61 lLastEncryptedPa
1f020 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 rtLen) {..CACKEY
1f030 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 _DEBUG_PRINTF("C
1f040 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 alled.");...if (
1f050 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 !cackey_initiali
1f060 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f zed) {...CACKEY_
1f070 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
1f080 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 ror. Not initia
1f090 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 lized.");....ret
1f0a0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 urn(CKR_CRYPTOKI
1f0b0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 _NOT_INITIALIZED
1f0c0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 );..}...CACKEY_D
1f0d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
1f0e0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 urning CKR_FUNCT
1f0f0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
1f100 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e D (%i)", CKR_FUN
1f110 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
1f120 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 TED);...return(C
1f130 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
1f140 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 SUPPORTED);.}..C
1f150 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f K_DEFINE_FUNCTIO
1f160 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 N(CK_RV, C_Decry
1f170 70 74 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 ptInit)(CK_SESSI
1f180 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 ON_HANDLE hSessi
1f190 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d on, CK_MECHANISM
1f1a0 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c _PTR pMechanism,
1f1b0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c CK_OBJECT_HANDL
1f1c0 45 20 68 4b 65 79 29 20 7b 0a 09 69 6e 74 20 6d E hKey) {..int m
1f1d0 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 68 utex_retval;...h
1f1e0 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43 4b 45 59 5f Key--;...CACKEY_
1f1f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
1f200 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 lled.");...if (!
1f210 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a cackey_initializ
1f220 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...CACKEY_D
1f230 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
1f240 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c or. Not initial
1f250 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 ized.");....retu
1f260 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f rn(CKR_CRYPTOKI_
1f270 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 NOT_INITIALIZED)
1f280 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 ;..}...if (pMech
1f290 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c 4c 29 20 7b anism == NULL) {
1f2a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1f2b0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 PRINTF("Error. p
1f2c0 4d 65 63 68 61 6e 69 73 6d 20 69 73 20 4e 55 4c Mechanism is NUL
1f2d0 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 L.");....return(
1f2e0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 CKR_ARGUMENTS_BA
1f2f0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 D);..}...if (pMe
1f300 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 chanism->mechani
1f310 73 6d 20 21 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b sm != CKM_RSA_PK
1f320 43 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 CS) {...CACKEY_D
1f330 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
1f340 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e or. pMechanism->
1f350 6d 65 63 68 61 6e 69 73 6d 20 6e 6f 74 20 73 70 mechanism not sp
1f360 65 63 69 66 69 65 64 20 61 73 20 43 4b 4d 5f 52 ecified as CKM_R
1f370 53 41 5f 50 4b 43 53 22 29 3b 0a 0a 09 09 72 65 SA_PKCS");....re
1f380 74 75 72 6e 28 43 4b 52 5f 4d 45 43 48 41 4e 49 turn(CKR_MECHANI
1f390 53 4d 5f 50 41 52 41 4d 5f 49 4e 56 41 4c 49 44 SM_PARAM_INVALID
1f3a0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 );..}...if (hSes
1f3b0 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 sion == 0 || hSe
1f3c0 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 ssion >= (sizeof
1f3d0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 (cackey_sessions
1f3e0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 ) / sizeof(cacke
1f3f0 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 y_sessions[0])))
1f400 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
1f410 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
1f420 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 Session out of
1f430 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 range.");......
1f440 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 return(CKR_SESSI
1f450 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 ON_HANDLE_INVALI
1f460 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 D);..}...mutex_r
1f470 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d etval = cackey_m
1f480 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 utex_lock(cackey
1f490 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 _biglock);..if (
1f4a0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 mutex_retval !=
1f4b0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 0) {...CACKEY_DE
1f4c0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
1f4d0 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c r. Locking fail
1f4e0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
1f4f0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 (CKR_GENERAL_ERR
1f500 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 OR);..}...if (!c
1f510 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
1f520 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 Session].active)
1f530 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 {...cackey_mute
1f540 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
1f550 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 biglock);....CAC
1f560 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1f570 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f ("Error. Sessio
1f580 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b n not active.");
1f590 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 ......return(CKR
1f5a0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f _SESSION_HANDLE_
1f5b0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 INVALID);..}...i
1f5c0 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f f (cackey_sessio
1f5d0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 ns[hSession].dec
1f5e0 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b 0a 09 rypt_active) {..
1f5f0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e .cackey_mutex_un
1f600 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
1f610 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f ock);....CACKEY_
1f620 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
1f630 72 6f 72 2e 20 20 44 65 63 72 79 70 74 20 61 6c ror. Decrypt al
1f640 72 65 61 64 79 20 69 6e 20 70 72 6f 67 72 65 73 ready in progres
1f650 73 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 s.");......retur
1f660 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f n(CKR_OPERATION_
1f670 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 69 66 ACTIVE);..}...if
1f680 20 28 68 4b 65 79 20 3e 3d 20 63 61 63 6b 65 79 (hKey >= cackey
1f690 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
1f6a0 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 on].identities_c
1f6b0 6f 75 6e 74 29 20 7b 0a 09 09 63 61 63 6b 65 79 ount) {...cackey
1f6c0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 _mutex_unlock(ca
1f6d0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a ckey_biglock);..
1f6e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1f6f0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4b RINTF("Error. K
1f700 65 79 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 ey handle out of
1f710 20 72 61 6e 67 65 20 28 72 65 71 75 65 73 74 65 range (requeste
1f720 64 20 6b 65 79 20 25 6c 75 2c 20 6f 6e 6c 79 20 d key %lu, only
1f730 25 6c 75 20 69 64 65 6e 74 69 74 69 65 73 20 61 %lu identities a
1f740 76 61 69 6c 61 62 6c 65 29 2e 22 2c 20 28 75 6e vailable).", (un
1f750 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b 65 signed long) hKe
1f760 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e y, (unsigned lon
1f770 67 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f g) cackey_sessio
1f780 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 ns[hSession].ide
1f790 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a ntities_count);.
1f7a0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4b 45 ...return(CKR_KE
1f7b0 59 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 Y_HANDLE_INVALID
1f7c0 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 );..}...cackey_s
1f7d0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
1f7e0 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 ].decrypt_active
1f7f0 20 3d 20 31 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 = 1;...cackey_s
1f800 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
1f810 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 61 6e ].decrypt_mechan
1f820 69 73 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d ism = pMechanism
1f830 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b 0a 09 63 61 ->mechanism;..ca
1f840 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
1f850 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f ession].decrypt_
1f860 6d 65 63 68 5f 70 61 72 6d 20 3d 20 70 4d 65 63 mech_parm = pMec
1f870 68 61 6e 69 73 6d 2d 3e 70 50 61 72 61 6d 65 74 hanism->pParamet
1f880 65 72 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 er;..cackey_sess
1f890 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 ions[hSession].d
1f8a0 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d ecrypt_mech_parm
1f8b0 6c 65 6e 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d len = pMechanism
1f8c0 2d 3e 75 6c 50 61 72 61 6d 65 74 65 72 4c 65 6e ->ulParameterLen
1f8d0 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f ;..cackey_sessio
1f8e0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 ns[hSession].dec
1f8f0 72 79 70 74 5f 69 64 65 6e 74 69 74 79 20 3d 20 rypt_identity =
1f900 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 &cackey_sessions
1f910 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 [hSession].ident
1f920 69 74 69 65 73 5b 68 4b 65 79 5d 3b 0a 0a 09 6d ities[hKey];...m
1f930 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 utex_retval = ca
1f940 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 ckey_mutex_unloc
1f950 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
1f960 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 );..if (mutex_re
1f970 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 tval != 0) {...C
1f980 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1f990 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f TF("Error. Unlo
1f9a0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b cking failed.");
1f9b0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 ....return(CKR_G
1f9c0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 ENERAL_ERROR);..
1f9d0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 }...CACKEY_DEBUG
1f9e0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
1f9f0 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c ng CKR_OK (%i)",
1fa00 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 CKR_OK);...retu
1fa10 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 rn(CKR_OK);.}..C
1fa20 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f K_DEFINE_FUNCTIO
1fa30 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 N(CK_RV, C_Decry
1fa40 70 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 pt)(CK_SESSION_H
1fa50 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 ANDLE hSession,
1fa60 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 CK_BYTE_PTR pEnc
1fa70 72 79 70 74 65 64 44 61 74 61 2c 20 43 4b 5f 55 ryptedData, CK_U
1fa80 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64 LONG ulEncrypted
1fa90 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 DataLen, CK_BYTE
1faa0 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 _PTR pData, CK_U
1fab0 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 61 74 61 LONG_PTR pulData
1fac0 4c 65 6e 29 20 7b 0a 09 43 4b 5f 55 4c 4f 4e 47 Len) {..CK_ULONG
1fad0 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 2c datalen_update,
1fae0 20 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 3b 0a datalen_final;.
1faf0 09 43 4b 5f 52 56 20 64 65 63 72 79 70 74 5f 72 .CK_RV decrypt_r
1fb00 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 et;...CACKEY_DEB
1fb10 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
1fb20 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 d.");...if (!cac
1fb30 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 key_initialized)
1fb40 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
1fb50 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
1fb60 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 Not initialize
1fb70 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
1fb80 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 CKR_CRYPTOKI_NOT
1fb90 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 _INITIALIZED);..
1fba0 7d 0a 0a 09 69 66 20 28 70 75 6c 44 61 74 61 4c }...if (pulDataL
1fbb0 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 en == NULL) {...
1fbc0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1fbd0 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 44 NTF("Error. pulD
1fbe0 61 74 61 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 ataLen is NULL."
1fbf0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
1fc00 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b _ARGUMENTS_BAD);
1fc10 0a 09 7d 0a 0a 09 64 61 74 61 6c 65 6e 5f 75 70 ..}...datalen_up
1fc20 64 61 74 65 20 3d 20 2a 70 75 6c 44 61 74 61 4c date = *pulDataL
1fc30 65 6e 3b 0a 0a 09 64 65 63 72 79 70 74 5f 72 65 en;...decrypt_re
1fc40 74 20 3d 20 43 5f 44 65 63 72 79 70 74 55 70 64 t = C_DecryptUpd
1fc50 61 74 65 28 68 53 65 73 73 69 6f 6e 2c 20 70 45 ate(hSession, pE
1fc60 6e 63 72 79 70 74 65 64 44 61 74 61 2c 20 75 6c ncryptedData, ul
1fc70 45 6e 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e EncryptedDataLen
1fc80 2c 20 70 44 61 74 61 2c 20 26 64 61 74 61 6c 65 , pData, &datale
1fc90 6e 5f 75 70 64 61 74 65 29 3b 0a 09 69 66 20 28 n_update);..if (
1fca0 64 65 63 72 79 70 74 5f 72 65 74 20 21 3d 20 43 decrypt_ret != C
1fcb0 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 KR_OK) {...CACKE
1fcc0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1fcd0 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 55 Error. DecryptU
1fce0 70 64 61 74 65 28 29 20 72 65 74 75 72 6e 65 64 pdate() returned
1fcf0 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25 failure (rv = %
1fd00 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 lu).", (unsigned
1fd10 20 6c 6f 6e 67 29 20 64 65 63 72 79 70 74 5f 72 long) decrypt_r
1fd20 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 64 et);....return(d
1fd30 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 09 7d 0a ecrypt_ret);..}.
1fd40 0a 09 69 66 20 28 70 44 61 74 61 29 20 7b 0a 09 ..if (pData) {..
1fd50 09 70 44 61 74 61 20 2b 3d 20 64 61 74 61 6c 65 .pData += datale
1fd60 6e 5f 75 70 64 61 74 65 3b 0a 09 7d 0a 09 64 61 n_update;..}..da
1fd70 74 61 6c 65 6e 5f 66 69 6e 61 6c 20 3d 20 2a 70 talen_final = *p
1fd80 75 6c 44 61 74 61 4c 65 6e 20 2d 20 64 61 74 61 ulDataLen - data
1fd90 6c 65 6e 5f 75 70 64 61 74 65 3b 0a 0a 09 64 65 len_update;...de
1fda0 63 72 79 70 74 5f 72 65 74 20 3d 20 43 5f 44 65 crypt_ret = C_De
1fdb0 63 72 79 70 74 46 69 6e 61 6c 28 68 53 65 73 73 cryptFinal(hSess
1fdc0 69 6f 6e 2c 20 70 44 61 74 61 2c 20 26 64 61 74 ion, pData, &dat
1fdd0 61 6c 65 6e 5f 66 69 6e 61 6c 29 3b 0a 09 69 66 alen_final);..if
1fde0 20 28 64 65 63 72 79 70 74 5f 72 65 74 20 21 3d (decrypt_ret !=
1fdf0 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 CKR_OK) {...CAC
1fe00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1fe10 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 ("Error. Decryp
1fe20 74 46 69 6e 61 6c 28 29 20 72 65 74 75 72 6e 65 tFinal() returne
1fe30 64 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20 d failure (rv =
1fe40 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 %lu).", (unsigne
1fe50 64 20 6c 6f 6e 67 29 20 64 65 63 72 79 70 74 5f d long) decrypt_
1fe60 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 ret);....return(
1fe70 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 09 7d decrypt_ret);..}
1fe80 0a 0a 09 2a 70 75 6c 44 61 74 61 4c 65 6e 20 3d ...*pulDataLen =
1fe90 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 20 datalen_update
1fea0 2b 20 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 3b + datalen_final;
1feb0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1fec0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e PRINTF("Returnin
1fed0 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 g CKR_OK (%i)",
1fee0 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 CKR_OK);...retur
1fef0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b n(CKR_OK);.}..CK
1ff00 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e _DEFINE_FUNCTION
1ff10 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 (CK_RV, C_Decryp
1ff20 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 tUpdate)(CK_SESS
1ff30 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 ION_HANDLE hSess
1ff40 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 ion, CK_BYTE_PTR
1ff50 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c pEncryptedPart,
1ff60 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 CK_ULONG ulEncr
1ff70 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b yptedPartLen, CK
1ff80 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c _BYTE_PTR pPart,
1ff90 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 CK_ULONG_PTR pu
1ffa0 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 73 74 61 lPartLen) {..sta
1ffb0 74 69 63 20 43 4b 5f 42 59 54 45 20 62 75 66 5b tic CK_BYTE buf[
1ffc0 31 36 33 38 34 5d 3b 0a 09 73 73 69 7a 65 5f 74 16384];..ssize_t
1ffd0 20 62 75 66 6c 65 6e 3b 0a 09 43 4b 5f 53 4c 4f buflen;..CK_SLO
1ffe0 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 43 4b T_ID slotID;..CK
1fff0 5f 52 56 20 72 65 74 76 61 6c 20 3d 20 43 4b 52 _RV retval = CKR
20000 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a _GENERAL_ERROR;.
20010 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 .int mutex_retva
20020 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 l;...CACKEY_DEBU
20030 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 G_PRINTF("Called
20040 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b .");...if (!cack
20050 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 ey_initialized)
20060 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
20070 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
20080 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 Not initialized
20090 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
200a0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f KR_CRYPTOKI_NOT_
200b0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d INITIALIZED);..}
200c0 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 ...if (hSession
200d0 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e == 0 || hSession
200e0 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b >= (sizeof(cack
200f0 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 ey_sessions) / s
20100 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 izeof(cackey_ses
20110 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 sions[0]))) {...
20120 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
20130 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 NTF("Error. Ses
20140 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 sion out of rang
20150 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 e.");......retur
20160 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 n(CKR_SESSION_HA
20170 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 NDLE_INVALID);..
20180 7d 0a 0a 09 69 66 20 28 70 45 6e 63 72 79 70 74 }...if (pEncrypt
20190 65 64 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 20 26 edPart == NULL &
201a0 26 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 & ulEncryptedPar
201b0 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 2f tLen == 0) {.../
201c0 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69 74 20 * Short circuit
201d0 69 66 20 77 65 20 61 72 65 20 61 73 6b 65 64 20 if we are asked
201e0 74 6f 20 64 65 63 72 79 70 74 20 6e 6f 74 68 69 to decrypt nothi
201f0 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 43 41 43 4b 45 ng... */...CACKE
20200 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
20210 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b Returning CKR_OK
20220 20 28 25 69 29 20 28 73 68 6f 72 74 20 63 69 72 (%i) (short cir
20230 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b cuit)", CKR_OK);
20240 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f ....return(CKR_O
20250 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 45 6e K);..}...if (pEn
20260 63 72 79 70 74 65 64 50 61 72 74 20 3d 3d 20 4e cryptedPart == N
20270 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f ULL) {...CACKEY_
20280 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
20290 72 6f 72 2e 20 70 45 6e 63 72 79 70 74 65 64 50 ror. pEncryptedP
202a0 61 72 74 20 69 73 20 4e 55 4c 4c 2c 20 62 75 74 art is NULL, but
202b0 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 ulEncryptedPart
202c0 4c 65 6e 20 69 73 20 6e 6f 74 20 30 2e 22 29 3b Len is not 0.");
202d0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 ....return(CKR_A
202e0 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 RGUMENTS_BAD);..
202f0 7d 0a 0a 09 69 66 20 28 75 6c 45 6e 63 72 79 70 }...if (ulEncryp
20300 74 65 64 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 tedPartLen == 0)
20310 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
20320 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
20330 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 ulEncryptedPart
20340 4c 65 6e 20 69 73 20 30 2c 20 62 75 74 20 70 50 Len is 0, but pP
20350 61 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e art is not NULL.
20360 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
20370 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 R_ARGUMENTS_BAD)
20380 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 50 61 ;..}...if (pulPa
20390 72 74 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b rtLen == NULL) {
203a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
203b0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 PRINTF("Error. p
203c0 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 4e 55 4c ulPartLen is NUL
203d0 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 L.");....return(
203e0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 CKR_ARGUMENTS_BA
203f0 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 D);..}...mutex_r
20400 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d etval = cackey_m
20410 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 utex_lock(cackey
20420 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 _biglock);..if (
20430 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 mutex_retval !=
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 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c r. Locking fail
20470 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
20480 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 (CKR_GENERAL_ERR
20490 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 OR);..}...if (!c
204a0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
204b0 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 Session].active)
204c0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 {...cackey_mute
204d0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
204e0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 biglock);....CAC
204f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
20500 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f ("Error. Sessio
20510 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b n not active.");
20520 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 ......return(CKR
20530 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f _SESSION_HANDLE_
20540 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 INVALID);..}...i
20550 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 f (!cackey_sessi
20560 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 ons[hSession].de
20570 63 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b 0a crypt_active) {.
20580 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 ..cackey_mutex_u
20590 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 nlock(cackey_big
205a0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 lock);....CACKEY
205b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
205c0 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 20 6e rror. Decrypt n
205d0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 ot active.");...
205e0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 ...return(CKR_OP
205f0 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 ERATION_NOT_INIT
20600 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 IALIZED);..}...s
20610 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 lotID = cackey_s
20620 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
20630 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 ].slotID;...if (
20640 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c slotID < 0 || sl
20650 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 otID >= (sizeof(
20660 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 cackey_slots) /
20670 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c sizeof(cackey_sl
20680 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 ots[0]))) {...CA
20690 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
206a0 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 F("Error. Invali
206b0 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 d slot requested
206c0 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 (%lu), outside
206d0 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c of valid range",
206e0 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 slotID);....ret
206f0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f urn(CKR_GENERAL_
20700 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 ERROR);..}...if
20710 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c (cackey_slots[sl
20720 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 otID].active ==
20730 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 0) {...CACKEY_DE
20740 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
20750 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 r. Invalid slot
20760 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c requested (%lu),
20770 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e slot not curren
20780 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f tly active", slo
20790 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f tID);....cackey_
207a0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 mutex_unlock(cac
207b0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 key_biglock);...
207c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 .return(CKR_GENE
207d0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a RAL_ERROR);..}..
207e0 09 73 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f .switch (cackey_
207f0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
20800 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 61 n].decrypt_mecha
20810 6e 69 73 6d 29 20 7b 0a 09 09 63 61 73 65 20 43 nism) {...case C
20820 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 KM_RSA_PKCS:....
20830 2f 2a 20 41 73 6b 20 63 61 72 64 20 74 6f 20 64 /* Ask card to d
20840 65 63 72 79 70 74 20 2a 2f 0a 09 09 09 62 75 66 ecrypt */....buf
20850 6c 65 6e 20 3d 20 63 61 63 6b 65 79 5f 73 69 67 len = cackey_sig
20860 6e 64 65 63 72 79 70 74 28 26 63 61 63 6b 65 79 ndecrypt(&cackey
20870 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 _slots[slotID],
20880 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
20890 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 hSession].decryp
208a0 74 5f 69 64 65 6e 74 69 74 79 2c 20 70 45 6e 63 t_identity, pEnc
208b0 72 79 70 74 65 64 50 61 72 74 2c 20 75 6c 45 6e ryptedPart, ulEn
208c0 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 cryptedPartLen,
208d0 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 buf, sizeof(buf)
208e0 2c 20 30 2c 20 31 29 3b 0a 0a 09 09 09 69 66 20 , 0, 1);.....if
208f0 28 62 75 66 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 (buflen < 0) {..
20900 09 09 09 2f 2a 20 44 65 63 72 79 70 74 69 6f 6e .../* Decryption
20910 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 09 09 09 09 failed. */.....
20920 69 66 20 28 62 75 66 6c 65 6e 20 3d 3d 20 43 41 if (buflen == CA
20930 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 CKEY_PCSC_E_NEED
20940 4c 4f 47 49 4e 29 20 7b 0a 09 09 09 09 09 72 65 LOGIN) {......re
20950 74 76 61 6c 20 3d 20 43 4b 52 5f 55 53 45 52 5f tval = CKR_USER_
20960 4e 4f 54 5f 4c 4f 47 47 45 44 5f 49 4e 3b 0a 09 NOT_LOGGED_IN;..
20970 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28 62 75 ...} else if (bu
20980 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 flen == CACKEY_P
20990 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e CSC_E_TOKENABSEN
209a0 54 29 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c T) {......retval
209b0 20 3d 20 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 = CKR_DEVICE_RE
209c0 4d 4f 56 45 44 3b 0a 09 09 09 09 7d 20 65 6c 73 MOVED;.....} els
209d0 65 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 e {......retval
209e0 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 = CKR_GENERAL_ER
209f0 52 4f 52 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 ROR;.....}....}
20a00 65 6c 73 65 20 69 66 20 28 28 28 75 6e 73 69 67 else if (((unsig
20a10 6e 65 64 20 6c 6f 6e 67 29 20 62 75 66 6c 65 6e ned long) buflen
20a20 29 20 3e 20 2a 70 75 6c 50 61 72 74 4c 65 6e 20 ) > *pulPartLen
20a30 26 26 20 70 50 61 72 74 29 20 7b 0a 09 09 09 09 && pPart) {.....
20a40 2f 2a 20 44 65 63 72 79 70 74 65 64 20 64 61 74 /* Decrypted dat
20a50 61 20 74 6f 6f 20 6c 61 72 67 65 20 2a 2f 0a 09 a too large */..
20a60 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f ...retval = CKR_
20a70 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c BUFFER_TOO_SMALL
20a80 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 ;....} else {...
20a90 09 09 69 66 20 28 70 50 61 72 74 29 20 7b 0a 09 ..if (pPart) {..
20aa0 09 09 09 09 6d 65 6d 63 70 79 28 70 50 61 72 74 ....memcpy(pPart
20ab0 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b 0a , buf, buflen);.
20ac0 09 09 09 09 7d 0a 0a 09 09 09 09 2a 70 75 6c 50 ....}......*pulP
20ad0 61 72 74 4c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b artLen = buflen;
20ae0 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 ......retval = C
20af0 4b 52 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09 KR_OK;....}.....
20b00 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 break;..}...mute
20b10 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 x_retval = cacke
20b20 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
20b30 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
20b40 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 .if (mutex_retva
20b50 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b l != 0) {...CACK
20b60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
20b70 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 "Error. Unlocki
20b80 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 ng failed.");...
20b90 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 .return(CKR_GENE
20ba0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a RAL_ERROR);..}..
20bb0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
20bc0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
20bd0 25 69 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 %i", (int) retva
20be0 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 l);...return(ret
20bf0 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 val);.}..CK_DEFI
20c00 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 NE_FUNCTION(CK_R
20c10 56 2c 20 43 5f 44 65 63 72 79 70 74 46 69 6e 61 V, C_DecryptFina
20c20 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 l)(CK_SESSION_HA
20c30 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 NDLE hSession, C
20c40 4b 5f 42 59 54 45 5f 50 54 52 20 70 4c 61 73 74 K_BYTE_PTR pLast
20c50 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 Part, CK_ULONG_P
20c60 54 52 20 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 TR pulLastPartLe
20c70 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f n) {..int mutex_
20c80 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 74 65 72 retval;..int ter
20c90 6d 69 6e 61 74 65 5f 64 65 63 72 79 70 74 20 3d minate_decrypt =
20ca0 20 31 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 1;...CACKEY_DEB
20cb0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
20cc0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 d.");...if (!cac
20cd0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 key_initialized)
20ce0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
20cf0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
20d00 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 Not initialize
20d10 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
20d20 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 CKR_CRYPTOKI_NOT
20d30 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 _INITIALIZED);..
20d40 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e }...if (hSession
20d50 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f == 0 || hSessio
20d60 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 n >= (sizeof(cac
20d70 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 key_sessions) /
20d80 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 sizeof(cackey_se
20d90 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 ssions[0]))) {..
20da0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
20db0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 INTF("Error. Se
20dc0 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e ssion out of ran
20dd0 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 ge.");......retu
20de0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 rn(CKR_SESSION_H
20df0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a ANDLE_INVALID);.
20e00 09 7d 0a 0a 09 69 66 20 28 70 75 6c 4c 61 73 74 .}...if (pulLast
20e10 50 61 72 74 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 PartLen == NULL)
20e20 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
20e30 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
20e40 20 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20 pulLastPartLen
20e50 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 is NULL.");....r
20e60 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 eturn(CKR_ARGUME
20e70 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d NTS_BAD);..}...m
20e80 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 utex_retval = ca
20e90 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 ckey_mutex_lock(
20ea0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
20eb0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 ..if (mutex_retv
20ec0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 al != 0) {...CAC
20ed0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
20ee0 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e ("Error. Lockin
20ef0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 g failed.");....
20f00 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 return(CKR_GENER
20f10 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 AL_ERROR);..}...
20f20 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 if (!cackey_sess
20f30 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 ions[hSession].a
20f40 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 ctive) {...cacke
20f50 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
20f60 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
20f70 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
20f80 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
20f90 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 Session not acti
20fa0 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 ve.");......retu
20fb0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 rn(CKR_SESSION_H
20fc0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a ANDLE_INVALID);.
20fd0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 .}...if (!cackey
20fe0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
20ff0 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 on].decrypt_acti
21000 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d ve) {...cackey_m
21010 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b utex_unlock(cack
21020 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 ey_biglock);....
21030 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
21040 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 NTF("Error. Dec
21050 72 79 70 74 20 6e 6f 74 20 61 63 74 69 76 65 2e rypt not active.
21060 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 ");......return(
21070 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f CKR_OPERATION_NO
21080 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a T_INITIALIZED);.
21090 09 7d 0a 0a 09 2a 70 75 6c 4c 61 73 74 50 61 72 .}...*pulLastPar
210a0 74 4c 65 6e 20 3d 20 30 3b 0a 0a 09 69 66 20 28 tLen = 0;...if (
210b0 70 4c 61 73 74 50 61 72 74 20 3d 3d 20 4e 55 4c pLastPart == NUL
210c0 4c 29 20 7b 0a 09 09 74 65 72 6d 69 6e 61 74 65 L) {...terminate
210d0 5f 64 65 63 72 79 70 74 20 3d 20 30 3b 0a 09 7d _decrypt = 0;..}
210e0 0a 0a 09 69 66 20 28 74 65 72 6d 69 6e 61 74 65 ...if (terminate
210f0 5f 64 65 63 72 79 70 74 29 20 7b 0a 09 09 63 61 _decrypt) {...ca
21100 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
21110 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f ession].decrypt_
21120 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a active = 0;..}..
21130 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 .mutex_retval =
21140 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c cackey_mutex_unl
21150 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
21160 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f ck);..if (mutex_
21170 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 retval != 0) {..
21180 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
21190 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e INTF("Error. Un
211a0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 locking failed."
211b0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
211c0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b _GENERAL_ERROR);
211d0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 ..}...CACKEY_DEB
211e0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
211f0 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 ning CKR_OK (%i)
21200 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 ", CKR_OK);...re
21210 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a turn(CKR_OK);.}.
21220 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 .CK_DEFINE_FUNCT
21230 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 ION(CK_RV, C_Dig
21240 65 73 74 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 estInit)(CK_SESS
21250 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 ION_HANDLE hSess
21260 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 ion, CK_MECHANIS
21270 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d M_PTR pMechanism
21280 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 ) {..CACKEY_DEBU
21290 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 G_PRINTF("Called
212a0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b .");...if (!cack
212b0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 ey_initialized)
212c0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
212d0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
212e0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 Not initialized
212f0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
21300 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f KR_CRYPTOKI_NOT_
21310 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d INITIALIZED);..}
21320 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
21330 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e PRINTF("Returnin
21340 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e g CKR_FUNCTION_N
21350 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 OT_SUPPORTED (%i
21360 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e )", CKR_FUNCTION
21370 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
21380 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 ...return(CKR_FU
21390 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
213a0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 RTED);.}..CK_DEF
213b0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f INE_FUNCTION(CK_
213c0 52 56 2c 20 43 5f 44 69 67 65 73 74 29 28 43 4b RV, C_Digest)(CK
213d0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 _SESSION_HANDLE
213e0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 hSession, CK_BYT
213f0 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f E_PTR pData, CK_
21400 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c ULONG ulDataLen,
21410 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 69 CK_BYTE_PTR pDi
21420 67 65 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 gest, CK_ULONG_P
21430 54 52 20 70 75 6c 44 69 67 65 73 74 4c 65 6e 29 TR pulDigestLen)
21440 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {..CACKEY_DEBUG
21450 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
21460 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ");...if (!cacke
21470 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b y_initialized) {
21480 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
21490 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
214a0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e Not initialized.
214b0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
214c0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 R_CRYPTOKI_NOT_I
214d0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
214e0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
214f0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
21500 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f CKR_FUNCTION_NO
21510 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 T_SUPPORTED (%i)
21520 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f ", CKR_FUNCTION_
21530 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
21540 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e ..return(CKR_FUN
21550 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
21560 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 TED);.}..CK_DEFI
21570 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 NE_FUNCTION(CK_R
21580 56 2c 20 43 5f 44 69 67 65 73 74 55 70 64 61 74 V, C_DigestUpdat
21590 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 e)(CK_SESSION_HA
215a0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 NDLE hSession, C
215b0 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 K_BYTE_PTR pPart
215c0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 , CK_ULONG ulPar
215d0 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f tLen) {..CACKEY_
215e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
215f0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 lled.");...if (!
21600 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a cackey_initializ
21610 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...CACKEY_D
21620 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
21630 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c or. Not initial
21640 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 ized.");....retu
21650 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f rn(CKR_CRYPTOKI_
21660 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 NOT_INITIALIZED)
21670 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ;..}...CACKEY_DE
21680 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
21690 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 rning CKR_FUNCTI
216a0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
216b0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 (%i)", CKR_FUNC
216c0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
216d0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b ED);...return(CK
216e0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
216f0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b UPPORTED);.}..CK
21700 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e _DEFINE_FUNCTION
21710 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 (CK_RV, C_Digest
21720 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f Key)(CK_SESSION_
21730 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c HANDLE hSession,
21740 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c CK_OBJECT_HANDL
21750 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 E hKey) {..CACKE
21760 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
21770 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 Called.");...if
21780 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c (!cackey_initial
21790 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 ized) {...CACKEY
217a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
217b0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 rror. Not initi
217c0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 alized.");....re
217d0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b turn(CKR_CRYPTOK
217e0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 I_NOT_INITIALIZE
217f0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f D);..}...CACKEY_
21800 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
21810 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 turning CKR_FUNC
21820 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
21830 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 ED (%i)", CKR_FU
21840 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
21850 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 RTED);...return(
21860 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
21870 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a _SUPPORTED);.}..
21880 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 CK_DEFINE_FUNCTI
21890 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 ON(CK_RV, C_Dige
218a0 73 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 stFinal)(CK_SESS
218b0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 ION_HANDLE hSess
218c0 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 ion, CK_BYTE_PTR
218d0 20 70 44 69 67 65 73 74 2c 20 43 4b 5f 55 4c 4f pDigest, CK_ULO
218e0 4e 47 5f 50 54 52 20 70 75 6c 44 69 67 65 73 74 NG_PTR pulDigest
218f0 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 Len) {..CACKEY_D
21900 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
21910 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 led.");...if (!c
21920 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 ackey_initialize
21930 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 d) {...CACKEY_DE
21940 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
21950 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 r. Not initiali
21960 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 zed.");....retur
21970 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e n(CKR_CRYPTOKI_N
21980 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b OT_INITIALIZED);
21990 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 ..}...CACKEY_DEB
219a0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
219b0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f ning CKR_FUNCTIO
219c0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 N_NOT_SUPPORTED
219d0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 (%i)", CKR_FUNCT
219e0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
219f0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 D);...return(CKR
21a00 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
21a10 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f PPORTED);.}..CK_
21a20 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 DEFINE_FUNCTION(
21a30 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 49 6e 69 CK_RV, C_SignIni
21a40 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 t)(CK_SESSION_HA
21a50 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 NDLE hSession, C
21a60 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 K_MECHANISM_PTR
21a70 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f pMechanism, CK_O
21a80 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 BJECT_HANDLE hKe
21a90 79 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f y) {..int mutex_
21aa0 72 65 74 76 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d retval;...hKey--
21ab0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ;...CACKEY_DEBUG
21ac0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
21ad0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ");...if (!cacke
21ae0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b y_initialized) {
21af0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
21b00 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
21b10 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e Not initialized.
21b20 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
21b30 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 R_CRYPTOKI_NOT_I
21b40 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
21b50 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d ..if (pMechanism
21b60 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 == NULL) {...CA
21b70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
21b80 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 F("Error. pMecha
21b90 6e 69 73 6d 20 69 73 20 4e 55 4c 4c 2e 22 29 3b nism is NULL.");
21ba0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 ....return(CKR_A
21bb0 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 RGUMENTS_BAD);..
21bc0 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69 }...if (pMechani
21bd0 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 21 3d sm->mechanism !=
21be0 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 20 26 26 CKM_RSA_PKCS &&
21bf0 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 pMechanism->mec
21c00 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f 53 48 hanism != CKM_SH
21c10 41 31 5f 52 53 41 5f 50 4b 43 53 29 20 7b 0a 09 A1_RSA_PKCS) {..
21c20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
21c30 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 INTF("Error. pMe
21c40 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 chanism->mechani
21c50 73 6d 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 sm not specified
21c60 20 61 73 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 as CKM_RSA_PKCS
21c70 20 6f 72 20 43 4b 4d 5f 53 48 41 31 5f 52 53 41 or CKM_SHA1_RSA
21c80 5f 50 4b 43 53 22 29 3b 0a 0a 09 09 72 65 74 75 _PKCS");....retu
21c90 72 6e 28 43 4b 52 5f 4d 45 43 48 41 4e 49 53 4d rn(CKR_MECHANISM
21ca0 5f 50 41 52 41 4d 5f 49 4e 56 41 4c 49 44 29 3b _PARAM_INVALID);
21cb0 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 ..}...if (hSessi
21cc0 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 on == 0 || hSess
21cd0 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 ion >= (sizeof(c
21ce0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 ackey_sessions)
21cf0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f / sizeof(cackey_
21d00 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b sessions[0]))) {
21d10 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
21d20 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
21d30 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 Session out of r
21d40 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 ange.");......re
21d50 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e turn(CKR_SESSION
21d60 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 _HANDLE_INVALID)
21d70 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 ;..}...mutex_ret
21d80 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 val = cackey_mut
21d90 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 ex_lock(cackey_b
21da0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 iglock);..if (mu
21db0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 tex_retval != 0)
21dc0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
21dd0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
21de0 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 Locking failed
21df0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
21e00 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 KR_GENERAL_ERROR
21e10 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 );..}...if (!cac
21e20 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
21e30 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b ssion].active) {
21e40 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f ...cackey_mutex_
21e50 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 unlock(cackey_bi
21e60 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 glock);....CACKE
21e70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
21e80 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 Error. Session
21e90 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 not active.");..
21ea0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 ....return(CKR_S
21eb0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e ESSION_HANDLE_IN
21ec0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 VALID);..}...if
21ed0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 (cackey_sessions
21ee0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f [hSession].sign_
21ef0 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b active) {...cack
21f00 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 ey_mutex_unlock(
21f10 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
21f20 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
21f30 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
21f40 20 53 69 67 6e 20 61 6c 72 65 61 64 79 20 69 6e Sign already in
21f50 20 70 72 6f 67 72 65 73 73 2e 22 29 3b 0a 09 09 progress.");...
21f60 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 ...return(CKR_OP
21f70 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 45 29 3b ERATION_ACTIVE);
21f80 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65 79 20 3e ..}...if (hKey >
21f90 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e = cackey_session
21fa0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e s[hSession].iden
21fb0 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b 0a tities_count) {.
21fc0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 ..cackey_mutex_u
21fd0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 nlock(cackey_big
21fe0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 lock);....CACKEY
21ff0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
22000 72 72 6f 72 2e 20 20 4b 65 79 20 68 61 6e 64 6c rror. Key handl
22010 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 28 e out of range (
22020 72 65 71 75 65 73 74 65 64 20 6b 65 79 20 25 6c requested key %l
22030 75 2c 20 6f 6e 6c 79 20 25 6c 75 20 69 64 65 6e u, only %lu iden
22040 74 69 74 69 65 73 20 61 76 61 69 6c 61 62 6c 65 tities available
22050 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c ).", (unsigned l
22060 6f 6e 67 29 20 68 4b 65 79 2c 20 28 75 6e 73 69 ong) hKey, (unsi
22070 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63 6b 65 gned long) cacke
22080 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
22090 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f ion].identities_
220a0 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72 count);....retur
220b0 6e 28 43 4b 52 5f 4b 45 59 5f 48 41 4e 44 4c 45 n(CKR_KEY_HANDLE
220c0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 _INVALID);..}...
220d0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
220e0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 hSession].sign_a
220f0 63 74 69 76 65 20 3d 20 31 3b 0a 0a 09 63 61 63 ctive = 1;...cac
22100 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
22110 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68 ssion].sign_mech
22120 61 6e 69 73 6d 20 3d 20 70 4d 65 63 68 61 6e 69 anism = pMechani
22130 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b 0a 0a sm->mechanism;..
22140 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 .cackey_sessions
22150 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f [hSession].sign_
22160 62 75 66 6c 65 6e 20 3d 20 31 32 38 3b 0a 09 63 buflen = 128;..c
22170 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
22180 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 Session].sign_bu
22190 66 75 73 65 64 20 3d 20 30 3b 0a 09 63 61 63 6b fused = 0;..cack
221a0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
221b0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 3d sion].sign_buf =
221c0 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a malloc(sizeof(*
221d0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
221e0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 hSession].sign_b
221f0 75 66 29 20 2a 20 63 61 63 6b 65 79 5f 73 65 73 uf) * cackey_ses
22200 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
22210 73 69 67 6e 5f 62 75 66 6c 65 6e 29 3b 0a 0a 09 sign_buflen);...
22220 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
22230 4e 54 46 28 22 53 65 73 73 69 6f 6e 20 25 6c 75 NTF("Session %lu
22240 20 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 20 69 sign_identity i
22250 73 20 25 70 20 28 69 64 65 6e 74 69 74 79 20 23 s %p (identity #
22260 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 %lu)", (unsigned
22270 20 6c 6f 6e 67 29 20 68 53 65 73 73 69 6f 6e 2c long) hSession,
22280 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e &cackey_session
22290 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e s[hSession].iden
222a0 74 69 74 69 65 73 5b 68 4b 65 79 5d 2c 20 28 75 tities[hKey], (u
222b0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b nsigned long) hK
222c0 65 79 29 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 ey);..cackey_ses
222d0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
222e0 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 20 3d 20 sign_identity =
222f0 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 &cackey_sessions
22300 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 [hSession].ident
22310 69 74 69 65 73 5b 68 4b 65 79 5d 3b 0a 0a 09 6d ities[hKey];...m
22320 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 utex_retval = ca
22330 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 ckey_mutex_unloc
22340 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
22350 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 );..if (mutex_re
22360 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 tval != 0) {...C
22370 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
22380 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f TF("Error. Unlo
22390 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b cking failed.");
223a0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 ....return(CKR_G
223b0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 ENERAL_ERROR);..
223c0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 }...CACKEY_DEBUG
223d0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
223e0 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c ng CKR_OK (%i)",
223f0 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 CKR_OK);...retu
22400 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 rn(CKR_OK);.}..C
22410 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f K_DEFINE_FUNCTIO
22420 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 29 N(CK_RV, C_Sign)
22430 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 (CK_SESSION_HAND
22440 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f LE hSession, CK_
22450 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 BYTE_PTR pData,
22460 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c CK_ULONG ulDataL
22470 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 en, CK_BYTE_PTR
22480 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 pSignature, CK_U
22490 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 67 6e LONG_PTR pulSign
224a0 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 75 6e 73 atureLen) {..uns
224b0 69 67 6e 65 64 20 6c 6f 6e 67 20 73 74 61 72 74 igned long start
224c0 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 09 _sign_bufused;..
224d0 43 4b 5f 52 56 20 73 69 67 6e 5f 72 65 74 3b 0a CK_RV sign_ret;.
224e0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
224f0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
22500 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f ;...if (!cackey_
22510 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 initialized) {..
22520 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
22530 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f INTF("Error. No
22540 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 t initialized.")
22550 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
22560 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 CRYPTOKI_NOT_INI
22570 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 TIALIZED);..}...
22580 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 if (hSession ==
22590 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 0 || hSession >=
225a0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f (sizeof(cackey_
225b0 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 sessions) / size
225c0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f of(cackey_sessio
225d0 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 ns[0]))) {...CAC
225e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
225f0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f ("Error. Sessio
22600 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 n out of range."
22610 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 );......return(C
22620 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c KR_SESSION_HANDL
22630 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a E_INVALID);..}..
22640 09 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 66 75 .start_sign_bufu
22650 73 65 64 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 sed = cackey_ses
22660 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
22670 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 0a 09 sign_bufused;...
22680 73 69 67 6e 5f 72 65 74 20 3d 20 43 5f 53 69 67 sign_ret = C_Sig
22690 6e 55 70 64 61 74 65 28 68 53 65 73 73 69 6f 6e nUpdate(hSession
226a0 2c 20 70 44 61 74 61 2c 20 75 6c 44 61 74 61 4c , pData, ulDataL
226b0 65 6e 29 3b 0a 09 69 66 20 28 73 69 67 6e 5f 72 en);..if (sign_r
226c0 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a et != CKR_OK) {.
226d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
226e0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 RINTF("Error. S
226f0 69 67 6e 55 70 64 61 74 65 28 29 20 72 65 74 75 ignUpdate() retu
22700 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72 76 rned failure (rv
22710 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 = %lu).", (unsi
22720 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f gned long) sign_
22730 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 ret);....return(
22740 73 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 sign_ret);..}...
22750 73 69 67 6e 5f 72 65 74 20 3d 20 43 5f 53 69 67 sign_ret = C_Sig
22760 6e 46 69 6e 61 6c 28 68 53 65 73 73 69 6f 6e 2c nFinal(hSession,
22770 20 70 53 69 67 6e 61 74 75 72 65 2c 20 70 75 6c pSignature, pul
22780 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 3b 0a 09 SignatureLen);..
22790 69 66 20 28 73 69 67 6e 5f 72 65 74 20 21 3d 20 if (sign_ret !=
227a0 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28 CKR_OK) {...if (
227b0 73 69 67 6e 5f 72 65 74 20 3d 3d 20 43 4b 52 5f sign_ret == CKR_
227c0 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c BUFFER_TOO_SMALL
227d0 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 ) {....CACKEY_DE
227e0 42 55 47 5f 50 52 49 4e 54 46 28 22 53 69 67 6e BUG_PRINTF("Sign
227f0 46 69 6e 61 6c 28 29 20 72 65 74 75 72 6e 65 64 Final() returned
22800 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f CKR_BUFFER_TOO_
22810 53 4d 41 4c 4c 20 28 72 76 20 3d 20 25 6c 75 29 SMALL (rv = %lu)
22820 2c 20 75 6e 64 6f 69 6e 67 20 43 5f 53 69 67 6e , undoing C_Sign
22830 55 70 64 61 74 65 28 29 22 2c 20 28 75 6e 73 69 Update()", (unsi
22840 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f gned long) sign_
22850 72 65 74 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 ret);.....cackey
22860 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
22870 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 on].sign_bufused
22880 20 3d 20 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 = start_sign_bu
22890 66 75 73 65 64 3b 0a 0a 09 09 09 72 65 74 75 72 fused;.....retur
228a0 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 09 7d n(sign_ret);...}
228b0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
228c0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
228d0 20 53 69 67 6e 46 69 6e 61 6c 28 29 20 72 65 74 SignFinal() ret
228e0 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72 urned failure (r
228f0 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 v = %lu).", (uns
22900 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e igned long) sign
22910 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e _ret);....return
22920 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a (sign_ret);..}..
22930 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
22940 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
22950 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b CKR_OK (%i)", CK
22960 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 R_OK);...return(
22970 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 CKR_OK);.}..CK_D
22980 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 EFINE_FUNCTION(C
22990 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 55 70 64 61 K_RV, C_SignUpda
229a0 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 te)(CK_SESSION_H
229b0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 ANDLE hSession,
229c0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 CK_BYTE_PTR pPar
229d0 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 t, CK_ULONG ulPa
229e0 72 74 4c 65 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 rtLen) {..int mu
229f0 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 tex_retval;...CA
22a00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
22a10 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
22a20 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 if (!cackey_init
22a30 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 ialized) {...CAC
22a40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
22a50 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e ("Error. Not in
22a60 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 itialized.");...
22a70 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 .return(CKR_CRYP
22a80 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c TOKI_NOT_INITIAL
22a90 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 IZED);..}...if (
22aa0 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c hSession == 0 ||
22ab0 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 hSession >= (si
22ac0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 zeof(cackey_sess
22ad0 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 ions) / sizeof(c
22ae0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 ackey_sessions[0
22af0 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f ]))) {...CACKEY_
22b00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
22b10 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 ror. Session ou
22b20 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 t of range.");..
22b30 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 ....return(CKR_S
22b40 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e ESSION_HANDLE_IN
22b50 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 VALID);..}...if
22b60 28 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 20 26 (pPart == NULL &
22b70 26 20 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 30 & ulPartLen == 0
22b80 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 ) {.../* Short c
22b90 69 72 63 75 69 74 20 69 66 20 77 65 20 61 72 65 ircuit if we are
22ba0 20 61 73 6b 65 64 20 74 6f 20 73 69 67 6e 20 6e asked to sign n
22bb0 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 43 othing... */...C
22bc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
22bd0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b TF("Returning CK
22be0 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74 R_OK (%i) (short
22bf0 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f circuit)", CKR_
22c00 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 OK);....return(C
22c10 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 KR_OK);..}...if
22c20 28 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 (pPart == NULL)
22c30 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
22c40 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
22c50 70 50 61 72 74 20 69 73 20 4e 55 4c 4c 2c 20 62 pPart is NULL, b
22c60 75 74 20 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 ut ulPartLen is
22c70 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09 09 72 65 74 not 0.");....ret
22c80 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 urn(CKR_ARGUMENT
22c90 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 S_BAD);..}...if
22ca0 28 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 (ulPartLen == 0)
22cb0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
22cc0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
22cd0 20 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 30 2c ulPartLen is 0,
22ce0 20 62 75 74 20 70 50 61 72 74 20 69 73 20 6e 6f but pPart is no
22cf0 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 t NULL.");....re
22d00 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e turn(CKR_ARGUMEN
22d10 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 TS_BAD);..}...mu
22d20 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 tex_retval = cac
22d30 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 key_mutex_lock(c
22d40 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
22d50 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 .if (mutex_retva
22d60 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b l != 0) {...CACK
22d70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
22d80 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 "Error. Locking
22d90 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 failed.");....r
22da0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 eturn(CKR_GENERA
22db0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 L_ERROR);..}...i
22dc0 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 f (!cackey_sessi
22dd0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 ons[hSession].ac
22de0 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 tive) {...cackey
22df0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 _mutex_unlock(ca
22e00 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a ckey_biglock);..
22e10 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
22e20 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 RINTF("Error. S
22e30 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 ession not activ
22e40 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 e.");......retur
22e50 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 n(CKR_SESSION_HA
22e60 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 NDLE_INVALID);..
22e70 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f }...if (!cackey_
22e80 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
22e90 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20 n].sign_active)
22ea0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 {...cackey_mutex
22eb0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 _unlock(cackey_b
22ec0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b iglock);....CACK
22ed0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
22ee0 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f "Error. Sign no
22ef0 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a t active.");....
22f00 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 ..return(CKR_OPE
22f10 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 RATION_NOT_INITI
22f20 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 77 ALIZED);..}...sw
22f30 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73 65 73 itch (cackey_ses
22f40 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
22f50 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 29 20 sign_mechanism)
22f60 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 {...case CKM_RSA
22f70 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 63 63 _PKCS:..../* Acc
22f80 75 6d 75 6c 61 74 65 20 64 69 72 65 63 74 6c 79 umulate directly
22f90 20 2a 2f 0a 09 09 09 69 66 20 28 28 63 61 63 6b */....if ((cack
22fa0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
22fb0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 sion].sign_bufus
22fc0 65 64 20 2b 20 75 6c 50 61 72 74 4c 65 6e 29 20 ed + ulPartLen)
22fd0 3e 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e > cackey_session
22fe0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e s[hSession].sign
22ff0 5f 62 75 66 6c 65 6e 29 20 7b 0a 09 09 09 09 63 _buflen) {.....c
23000 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
23010 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 Session].sign_bu
23020 66 6c 65 6e 20 2a 3d 20 32 3b 0a 0a 09 09 09 09 flen *= 2;......
23030 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
23040 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 hSession].sign_b
23050 75 66 20 3d 20 72 65 61 6c 6c 6f 63 28 63 61 63 uf = realloc(cac
23060 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
23070 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c ssion].sign_buf,
23080 20 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f sizeof(*cackey_
23090 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
230a0 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20 2a 20 63 n].sign_buf) * c
230b0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
230c0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 Session].sign_bu
230d0 66 6c 65 6e 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 flen);....}.....
230e0 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 65 memcpy(cackey_se
230f0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
23100 2e 73 69 67 6e 5f 62 75 66 20 2b 20 63 61 63 6b .sign_buf + cack
23110 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
23120 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 sion].sign_bufus
23130 65 64 2c 20 70 50 61 72 74 2c 20 75 6c 50 61 72 ed, pPart, ulPar
23140 74 4c 65 6e 29 3b 0a 0a 09 09 09 63 61 63 6b 65 tLen);.....cacke
23150 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
23160 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 ion].sign_bufuse
23170 64 20 2b 3d 20 75 6c 50 61 72 74 4c 65 6e 3b 0a d += ulPartLen;.
23180 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 ....break;...cas
23190 65 20 43 4b 4d 5f 53 48 41 31 5f 52 53 41 5f 50 e CKM_SHA1_RSA_P
231a0 4b 43 53 3a 0a 09 09 09 2f 2a 20 58 58 58 3a 20 KCS:..../* XXX:
231b0 41 63 63 75 6d 75 6c 61 74 65 20 69 6e 74 6f 20 Accumulate into
231c0 61 20 53 48 41 31 20 68 61 73 68 20 2a 2f 0a 09 a SHA1 hash */..
231d0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 ..cackey_mutex_u
231e0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 nlock(cackey_big
231f0 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43 41 43 4b 45 lock);.....CACKE
23200 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
23210 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 Returning CKR_FU
23220 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
23230 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f RTED (%i)", CKR_
23240 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
23250 50 4f 52 54 45 44 29 3b 0a 0a 09 09 09 72 65 74 PORTED);.....ret
23260 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e urn(CKR_FUNCTION
23270 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
23280 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 ....break;..}...
23290 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 mutex_retval = c
232a0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f ackey_mutex_unlo
232b0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
232c0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 k);..if (mutex_r
232d0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 etval != 0) {...
232e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
232f0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c NTF("Error. Unl
23300 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 ocking failed.")
23310 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
23320 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a GENERAL_ERROR);.
23330 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 .}...CACKEY_DEBU
23340 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
23350 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 ing CKR_OK (%i)"
23360 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 , CKR_OK);...ret
23370 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a urn(CKR_OK);.}..
23380 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 CK_DEFINE_FUNCTI
23390 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e ON(CK_RV, C_Sign
233a0 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f Final)(CK_SESSIO
233b0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f N_HANDLE hSessio
233c0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 n, CK_BYTE_PTR p
233d0 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c Signature, CK_UL
233e0 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 67 6e 61 ONG_PTR pulSigna
233f0 74 75 72 65 4c 65 6e 29 20 7b 0a 09 73 74 61 74 tureLen) {..stat
23400 69 63 20 43 4b 5f 42 59 54 45 20 73 69 67 62 75 ic CK_BYTE sigbu
23410 66 5b 31 30 32 34 5d 3b 0a 09 73 73 69 7a 65 5f f[1024];..ssize_
23420 74 20 73 69 67 62 75 66 6c 65 6e 3b 0a 09 43 4b t sigbuflen;..CK
23430 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b _SLOT_ID slotID;
23440 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d ..CK_RV retval =
23450 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 CKR_GENERAL_ERR
23460 4f 52 3b 0a 09 69 6e 74 20 74 65 72 6d 69 6e 61 OR;..int termina
23470 74 65 5f 73 69 67 6e 20 3d 20 31 3b 0a 09 69 6e te_sign = 1;..in
23480 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a t mutex_retval;.
23490 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
234a0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
234b0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f ;...if (!cackey_
234c0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 initialized) {..
234d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
234e0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f INTF("Error. No
234f0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 t initialized.")
23500 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
23510 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 CRYPTOKI_NOT_INI
23520 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 TIALIZED);..}...
23530 69 66 20 28 70 75 6c 53 69 67 6e 61 74 75 72 65 if (pulSignature
23540 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 Len == NULL) {..
23550 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
23560 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c INTF("Error. pul
23570 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 69 73 20 SignatureLen is
23580 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 NULL.");....retu
23590 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 rn(CKR_ARGUMENTS
235a0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 _BAD);..}...if (
235b0 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c hSession == 0 ||
235c0 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 hSession >= (si
235d0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 zeof(cackey_sess
235e0 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 ions) / sizeof(c
235f0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 ackey_sessions[0
23600 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f ]))) {...CACKEY_
23610 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
23620 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 ror. Session ou
23630 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 t of range.");..
23640 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 ....return(CKR_S
23650 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e ESSION_HANDLE_IN
23660 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 VALID);..}...mut
23670 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b ex_retval = cack
23680 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 ey_mutex_lock(ca
23690 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 ckey_biglock);..
236a0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c if (mutex_retval
236b0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 != 0) {...CACKE
236c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
236d0 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 Error. Locking
236e0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 failed.");....re
236f0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c turn(CKR_GENERAL
23700 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 _ERROR);..}...if
23710 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f (!cackey_sessio
23720 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 ns[hSession].act
23730 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f ive) {...cackey_
23740 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 mutex_unlock(cac
23750 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 key_biglock);...
23760 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
23770 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 INTF("Error. Se
23780 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 ssion not active
23790 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e .");......return
237a0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e (CKR_SESSION_HAN
237b0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d DLE_INVALID);..}
237c0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 ...if (!cackey_s
237d0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
237e0 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b ].sign_active) {
237f0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f ...cackey_mutex_
23800 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 unlock(cackey_bi
23810 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 glock);....CACKE
23820 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
23830 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74 Error. Sign not
23840 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 active.");.....
23850 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 .return(CKR_OPER
23860 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 ATION_NOT_INITIA
23870 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f LIZED);..}...slo
23880 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 tID = cackey_ses
23890 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
238a0 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c slotID;...if (sl
238b0 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 otID < 0 || slot
238c0 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 ID >= (sizeof(ca
238d0 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 ckey_slots) / si
238e0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 zeof(cackey_slot
238f0 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b s[0]))) {...CACK
23900 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
23910 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 "Error. Invalid
23920 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 slot requested (
23930 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 %lu), outside of
23940 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 valid range", s
23950 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 lotID);....retur
23960 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 n(CKR_GENERAL_ER
23970 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 ROR);..}...if (c
23980 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 ackey_slots[slot
23990 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 ID].active == 0)
239a0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
239b0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
239c0 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 Invalid slot re
239d0 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 quested (%lu), s
239e0 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c lot not currentl
239f0 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 y active", slotI
23a00 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 D);....cackey_mu
23a10 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 tex_unlock(cacke
23a20 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 y_biglock);....r
23a30 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 eturn(CKR_GENERA
23a40 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 L_ERROR);..}...s
23a50 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73 65 witch (cackey_se
23a60 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
23a70 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 29 .sign_mechanism)
23a80 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 {...case CKM_RS
23a90 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 73 A_PKCS:..../* As
23aa0 6b 20 63 61 72 64 20 74 6f 20 73 69 67 6e 20 2a k card to sign *
23ab0 2f 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 /....CACKEY_DEBU
23ac0 47 5f 50 52 49 4e 54 46 28 22 41 73 6b 69 6e 67 G_PRINTF("Asking
23ad0 20 74 6f 20 73 69 67 6e 20 66 72 6f 6d 20 69 64 to sign from id
23ae0 65 6e 74 69 74 79 20 25 70 20 69 6e 20 73 65 73 entity %p in ses
23af0 73 69 6f 6e 20 25 6c 75 22 2c 20 63 61 63 6b 65 sion %lu", cacke
23b00 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
23b10 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69 ion].sign_identi
23b20 74 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f ty, (unsigned lo
23b30 6e 67 29 20 68 53 65 73 73 69 6f 6e 29 3b 0a 09 ng) hSession);..
23b40 09 09 73 69 67 62 75 66 6c 65 6e 20 3d 20 63 61 ..sigbuflen = ca
23b50 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 70 74 ckey_signdecrypt
23b60 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 (&cackey_slots[s
23b70 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65 79 5f 73 lotID], cackey_s
23b80 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
23b90 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 2c ].sign_identity,
23ba0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 cackey_sessions
23bb0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f [hSession].sign_
23bc0 62 75 66 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 buf, cackey_sess
23bd0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 ions[hSession].s
23be0 69 67 6e 5f 62 75 66 75 73 65 64 2c 20 73 69 67 ign_bufused, sig
23bf0 62 75 66 2c 20 73 69 7a 65 6f 66 28 73 69 67 62 buf, sizeof(sigb
23c00 75 66 29 2c 20 31 2c 20 30 29 3b 0a 0a 09 09 09 uf), 1, 0);.....
23c10 69 66 20 28 73 69 67 62 75 66 6c 65 6e 20 3c 20 if (sigbuflen <
23c20 30 29 20 7b 0a 09 09 09 09 2f 2a 20 53 69 67 6e 0) {...../* Sign
23c30 69 6e 67 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 09 ing failed. */..
23c40 09 09 09 69 66 20 28 73 69 67 62 75 66 6c 65 6e ...if (sigbuflen
23c50 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f == CACKEY_PCSC_
23c60 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 20 7b 0a 09 E_NEEDLOGIN) {..
23c70 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 ....retval = CKR
23c80 5f 55 53 45 52 5f 4e 4f 54 5f 4c 4f 47 47 45 44 _USER_NOT_LOGGED
23c90 5f 49 4e 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 _IN;.....} else
23ca0 69 66 20 28 73 69 67 62 75 66 6c 65 6e 20 3d 3d if (sigbuflen ==
23cb0 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 CACKEY_PCSC_E_T
23cc0 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b 0a 09 09 OKENABSENT) {...
23cd0 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f ...retval = CKR_
23ce0 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 3b 0a DEVICE_REMOVED;.
23cf0 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 ....} else {....
23d00 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 ..retval = CKR_G
23d10 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 09 ENERAL_ERROR;...
23d20 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 69 66 ..}....} else if
23d30 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e (((unsigned lon
23d40 67 29 20 73 69 67 62 75 66 6c 65 6e 29 20 3e 20 g) sigbuflen) >
23d50 2a 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e *pulSignatureLen
23d60 20 26 26 20 70 53 69 67 6e 61 74 75 72 65 29 20 && pSignature)
23d70 7b 0a 09 09 09 09 2f 2a 20 53 69 67 6e 65 64 20 {...../* Signed
23d80 64 61 74 61 20 74 6f 6f 20 6c 61 72 67 65 20 2a data too large *
23d90 2f 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 /.....CACKEY_DEB
23da0 55 47 5f 50 52 49 4e 54 46 28 22 72 65 74 76 61 UG_PRINTF("retva
23db0 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 l = CKR_BUFFER_T
23dc0 4f 4f 5f 53 4d 41 4c 4c 3b 20 20 73 69 67 62 75 OO_SMALL; sigbu
23dd0 66 6c 65 6e 20 3d 20 25 6c 75 2c 20 70 75 6c 53 flen = %lu, pulS
23de0 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d 20 25 6c ignatureLen = %l
23df0 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f u", (unsigned lo
23e00 6e 67 29 20 73 69 67 62 75 66 6c 65 6e 2c 20 28 ng) sigbuflen, (
23e10 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a unsigned long) *
23e20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 pulSignatureLen)
23e30 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 ;......retval =
23e40 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 CKR_BUFFER_TOO_S
23e50 4d 41 4c 4c 3b 0a 0a 09 09 09 09 74 65 72 6d 69 MALL;......termi
23e60 6e 61 74 65 5f 73 69 67 6e 20 3d 20 30 3b 0a 09 nate_sign = 0;..
23e70 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 74 ..} else {.....t
23e80 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 erminate_sign =
23e90 30 3b 0a 0a 09 09 09 09 69 66 20 28 70 53 69 67 0;......if (pSig
23ea0 6e 61 74 75 72 65 29 20 7b 0a 09 09 09 09 09 6d nature) {......m
23eb0 65 6d 63 70 79 28 70 53 69 67 6e 61 74 75 72 65 emcpy(pSignature
23ec0 2c 20 73 69 67 62 75 66 2c 20 73 69 67 62 75 66 , sigbuf, sigbuf
23ed0 6c 65 6e 29 3b 0a 0a 09 09 09 09 09 74 65 72 6d len);.......term
23ee0 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 31 3b 0a inate_sign = 1;.
23ef0 09 09 09 09 7d 0a 0a 09 09 09 09 2a 70 75 6c 53 ....}......*pulS
23f00 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d 20 73 69 ignatureLen = si
23f10 67 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09 72 65 gbuflen;......re
23f20 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 tval = CKR_OK;..
23f30 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 ..}.....break;..
23f40 09 63 61 73 65 20 43 4b 4d 5f 53 48 41 31 5f 52 .case CKM_SHA1_R
23f50 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 58 SA_PKCS:..../* X
23f60 58 58 3a 20 41 63 63 75 6d 75 6c 61 74 65 20 69 XX: Accumulate i
23f70 6e 74 6f 20 61 20 53 48 41 31 20 68 61 73 68 20 nto a SHA1 hash
23f80 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 */....cackey_mut
23f90 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 ex_unlock(cackey
23fa0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43 _biglock);.....C
23fb0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
23fc0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b TF("Returning CK
23fd0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
23fe0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 UPPORTED (%i)",
23ff0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
24000 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 09 _SUPPORTED);....
24010 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 .return(CKR_FUNC
24020 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
24030 45 44 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 ED);....break;..
24040 7d 0a 0a 09 69 66 20 28 74 65 72 6d 69 6e 61 74 }...if (terminat
24050 65 5f 73 69 67 6e 29 20 7b 0a 09 09 69 66 20 28 e_sign) {...if (
24060 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
24070 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 hSession].sign_b
24080 75 66 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 uf) {....free(ca
24090 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
240a0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 ession].sign_buf
240b0 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 );...}....cackey
240c0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
240d0 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 on].sign_active
240e0 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f = 0;..}...mutex_
240f0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f retval = cackey_
24100 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 mutex_unlock(cac
24110 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 key_biglock);..i
24120 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 f (mutex_retval
24130 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 != 0) {...CACKEY
24140 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
24150 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 rror. Unlocking
24160 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 failed.");....r
24170 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 eturn(CKR_GENERA
24180 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 L_ERROR);..}...C
24190 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
241a0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 25 69 TF("Returning %i
241b0 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 ", (int) retval)
241c0 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 ;...return(retva
241d0 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 l);.}..CK_DEFINE
241e0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c _FUNCTION(CK_RV,
241f0 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 49 6e C_SignRecoverIn
24200 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 it)(CK_SESSION_H
24210 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 ANDLE hSession,
24220 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 CK_MECHANISM_PTR
24230 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f pMechanism, CK_
24240 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b OBJECT_HANDLE hK
24250 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 ey) {..CACKEY_DE
24260 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
24270 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 ed.");...if (!ca
24280 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 ckey_initialized
24290 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
242a0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
242b0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a . Not initializ
242c0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
242d0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f (CKR_CRYPTOKI_NO
242e0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a T_INITIALIZED);.
242f0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 .}...CACKEY_DEBU
24300 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
24310 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e ing CKR_FUNCTION
24320 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 _NOT_SUPPORTED (
24330 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 %i)", CKR_FUNCTI
24340 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
24350 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f );...return(CKR_
24360 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
24370 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 PORTED);.}..CK_D
24380 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 EFINE_FUNCTION(C
24390 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 52 65 63 6f K_RV, C_SignReco
243a0 76 65 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f ver)(CK_SESSION_
243b0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c HANDLE hSession,
243c0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 CK_BYTE_PTR pDa
243d0 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 ta, CK_ULONG ulD
243e0 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f ataLen, CK_BYTE_
243f0 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 PTR pSignature,
24400 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c CK_ULONG_PTR pul
24410 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a SignatureLen) {.
24420 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
24430 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
24440 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 ...if (!cackey_i
24450 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 nitialized) {...
24460 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
24470 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 NTF("Error. Not
24480 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b initialized.");
24490 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 ....return(CKR_C
244a0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 RYPTOKI_NOT_INIT
244b0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 IALIZED);..}...C
244c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
244d0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b TF("Returning CK
244e0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
244f0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 UPPORTED (%i)",
24500 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
24510 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 _SUPPORTED);...r
24520 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 eturn(CKR_FUNCTI
24530 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
24540 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f );.}..CK_DEFINE_
24550 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 FUNCTION(CK_RV,
24560 43 5f 56 65 72 69 66 79 49 6e 69 74 29 28 43 4b C_VerifyInit)(CK
24570 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 _SESSION_HANDLE
24580 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 hSession, CK_MEC
24590 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 HANISM_PTR pMech
245a0 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 anism, CK_OBJECT
245b0 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a _HANDLE hKey) {.
245c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
245d0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
245e0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 ...if (!cackey_i
245f0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 nitialized) {...
24600 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
24610 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 NTF("Error. Not
24620 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b initialized.");
24630 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 ....return(CKR_C
24640 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 RYPTOKI_NOT_INIT
24650 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 IALIZED);..}...C
24660 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
24670 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b TF("Returning CK
24680 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
24690 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 UPPORTED (%i)",
246a0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
246b0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 _SUPPORTED);...r
246c0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 eturn(CKR_FUNCTI
246d0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
246e0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f );.}..CK_DEFINE_
246f0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 FUNCTION(CK_RV,
24700 43 5f 56 65 72 69 66 79 29 28 43 4b 5f 53 45 53 C_Verify)(CK_SES
24710 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 SION_HANDLE hSes
24720 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 sion, CK_BYTE_PT
24730 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e R pData, CK_ULON
24740 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f G ulDataLen, CK_
24750 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 BYTE_PTR pSignat
24760 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c ure, CK_ULONG ul
24770 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a SignatureLen) {.
24780 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
24790 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
247a0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 ...if (!cackey_i
247b0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 nitialized) {...
247c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
247d0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 NTF("Error. Not
247e0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b initialized.");
247f0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 ....return(CKR_C
24800 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 RYPTOKI_NOT_INIT
24810 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 IALIZED);..}...C
24820 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
24830 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b TF("Returning CK
24840 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
24850 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 UPPORTED (%i)",
24860 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
24870 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 _SUPPORTED);...r
24880 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 eturn(CKR_FUNCTI
24890 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
248a0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f );.}..CK_DEFINE_
248b0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 FUNCTION(CK_RV,
248c0 43 5f 56 65 72 69 66 79 55 70 64 61 74 65 29 28 C_VerifyUpdate)(
248d0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c CK_SESSION_HANDL
248e0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 E hSession, CK_B
248f0 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 YTE_PTR pPart, C
24900 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 K_ULONG ulPartLe
24910 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 n) {..CACKEY_DEB
24920 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
24930 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 d.");...if (!cac
24940 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 key_initialized)
24950 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
24960 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
24970 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 Not initialize
24980 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
24990 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 CKR_CRYPTOKI_NOT
249a0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 _INITIALIZED);..
249b0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 }...CACKEY_DEBUG
249c0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
249d0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f ng CKR_FUNCTION_
249e0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 NOT_SUPPORTED (%
249f0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f i)", CKR_FUNCTIO
24a00 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 N_NOT_SUPPORTED)
24a10 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 ;...return(CKR_F
24a20 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
24a30 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 ORTED);.}..CK_DE
24a40 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b FINE_FUNCTION(CK
24a50 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 46 69 6e _RV, C_VerifyFin
24a60 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 al)(CK_SESSION_H
24a70 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 ANDLE hSession,
24a80 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 CK_BYTE_PTR pSig
24a90 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 nature, CK_ULONG
24aa0 20 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 ulSignatureLen)
24ab0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {..CACKEY_DEBUG
24ac0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
24ad0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ");...if (!cacke
24ae0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b y_initialized) {
24af0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
24b00 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
24b10 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e Not initialized.
24b20 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
24b30 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 R_CRYPTOKI_NOT_I
24b40 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
24b50 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
24b60 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
24b70 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f CKR_FUNCTION_NO
24b80 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 T_SUPPORTED (%i)
24b90 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f ", CKR_FUNCTION_
24ba0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
24bb0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e ..return(CKR_FUN
24bc0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
24bd0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 TED);.}..CK_DEFI
24be0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 NE_FUNCTION(CK_R
24bf0 56 2c 20 43 5f 56 65 72 69 66 79 52 65 63 6f 76 V, C_VerifyRecov
24c00 65 72 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 erInit)(CK_SESSI
24c10 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 ON_HANDLE hSessi
24c20 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d on, CK_MECHANISM
24c30 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c _PTR pMechanism,
24c40 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c CK_OBJECT_HANDL
24c50 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 E hKey) {..CACKE
24c60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
24c70 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 Called.");...if
24c80 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c (!cackey_initial
24c90 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 ized) {...CACKEY
24ca0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
24cb0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 rror. Not initi
24cc0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 alized.");....re
24cd0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b turn(CKR_CRYPTOK
24ce0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 I_NOT_INITIALIZE
24cf0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f D);..}...CACKEY_
24d00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
24d10 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 turning CKR_FUNC
24d20 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
24d30 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 ED (%i)", CKR_FU
24d40 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
24d50 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 RTED);...return(
24d60 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
24d70 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a _SUPPORTED);.}..
24d80 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 CK_DEFINE_FUNCTI
24d90 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 ON(CK_RV, C_Veri
24da0 66 79 52 65 63 6f 76 65 72 29 28 43 4b 5f 53 45 fyRecover)(CK_SE
24db0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 SSION_HANDLE hSe
24dc0 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 ssion, CK_BYTE_P
24dd0 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 TR pSignature, C
24de0 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 K_ULONG ulSignat
24df0 75 72 65 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f ureLen, CK_BYTE_
24e00 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c PTR pData, CK_UL
24e10 4f 4e 47 5f 50 54 52 20 70 75 6c 44 61 74 61 4c ONG_PTR pulDataL
24e20 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 en) {..CACKEY_DE
24e30 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
24e40 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 ed.");...if (!ca
24e50 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 ckey_initialized
24e60 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
24e70 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
24e80 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a . Not initializ
24e90 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
24ea0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f (CKR_CRYPTOKI_NO
24eb0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a T_INITIALIZED);.
24ec0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 .}...CACKEY_DEBU
24ed0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
24ee0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e ing CKR_FUNCTION
24ef0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 _NOT_SUPPORTED (
24f00 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 %i)", CKR_FUNCTI
24f10 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
24f20 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f );...return(CKR_
24f30 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
24f40 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 PORTED);.}..CK_D
24f50 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 EFINE_FUNCTION(C
24f60 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 45 6e K_RV, C_DigestEn
24f70 63 72 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f cryptUpdate)(CK_
24f80 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 SESSION_HANDLE h
24f90 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 Session, CK_BYTE
24fa0 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 _PTR pPart, CK_U
24fb0 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 LONG ulPartLen,
24fc0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 CK_BYTE_PTR pEnc
24fd0 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 ryptedPart, CK_U
24fe0 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 LONG_PTR pulEncr
24ff0 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a yptedPartLen) {.
25000 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
25010 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
25020 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 ...if (!cackey_i
25030 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 nitialized) {...
25040 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
25050 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 NTF("Error. Not
25060 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b initialized.");
25070 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 ....return(CKR_C
25080 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 RYPTOKI_NOT_INIT
25090 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 IALIZED);..}...C
250a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
250b0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b TF("Returning CK
250c0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
250d0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 UPPORTED (%i)",
250e0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
250f0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 _SUPPORTED);...r
25100 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 eturn(CKR_FUNCTI
25110 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
25120 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f );.}..CK_DEFINE_
25130 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 FUNCTION(CK_RV,
25140 43 5f 44 65 63 72 79 70 74 44 69 67 65 73 74 55 C_DecryptDigestU
25150 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f pdate)(CK_SESSIO
25160 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f N_HANDLE hSessio
25170 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 n, CK_BYTE_PTR p
25180 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 EncryptedPart, C
25190 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 K_ULONG ulEncryp
251a0 74 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 tedPartLen, CK_B
251b0 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 YTE_PTR pPart, C
251c0 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50 K_ULONG_PTR pulP
251d0 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 artLen) {..CACKE
251e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
251f0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 Called.");...if
25200 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c (!cackey_initial
25210 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 ized) {...CACKEY
25220 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
25230 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 rror. Not initi
25240 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 alized.");....re
25250 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b turn(CKR_CRYPTOK
25260 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 I_NOT_INITIALIZE
25270 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f D);..}...CACKEY_
25280 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
25290 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 turning CKR_FUNC
252a0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
252b0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 ED (%i)", CKR_FU
252c0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
252d0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 RTED);...return(
252e0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
252f0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a _SUPPORTED);.}..
25300 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 CK_DEFINE_FUNCTI
25310 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e ON(CK_RV, C_Sign
25320 45 6e 63 72 79 70 74 55 70 64 61 74 65 29 28 43 EncryptUpdate)(C
25330 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 K_SESSION_HANDLE
25340 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 hSession, CK_BY
25350 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b TE_PTR pPart, CK
25360 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e _ULONG ulPartLen
25370 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 , CK_BYTE_PTR pE
25380 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b ncryptedPart, CK
25390 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e _ULONG_PTR pulEn
253a0 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20 cryptedPartLen)
253b0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f {..CACKEY_DEBUG_
253c0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
253d0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 );...if (!cackey
253e0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
253f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
25400 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e RINTF("Error. N
25410 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 ot initialized."
25420 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
25430 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e _CRYPTOKI_NOT_IN
25440 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
25450 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
25460 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
25470 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
25480 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 _SUPPORTED (%i)"
25490 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e , CKR_FUNCTION_N
254a0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a OT_SUPPORTED);..
254b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 .return(CKR_FUNC
254c0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
254d0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e ED);.}..CK_DEFIN
254e0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 E_FUNCTION(CK_RV
254f0 2c 20 43 5f 44 65 63 72 79 70 74 56 65 72 69 66 , C_DecryptVerif
25500 79 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 yUpdate)(CK_SESS
25510 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 ION_HANDLE hSess
25520 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 ion, CK_BYTE_PTR
25530 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c pEncryptedPart,
25540 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 CK_ULONG ulEncr
25550 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b yptedPartLen, CK
25560 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c _BYTE_PTR pPart,
25570 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 CK_ULONG_PTR pu
25580 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 lPartLen) {..CAC
25590 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
255a0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 ("Called.");...i
255b0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 f (!cackey_initi
255c0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b alized) {...CACK
255d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
255e0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 "Error. Not ini
255f0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 tialized.");....
25600 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 return(CKR_CRYPT
25610 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 OKI_NOT_INITIALI
25620 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 ZED);..}...CACKE
25630 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
25640 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 Returning CKR_FU
25650 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
25660 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f RTED (%i)", CKR_
25670 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
25680 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 PORTED);...retur
25690 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e n(CKR_FUNCTION_N
256a0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d OT_SUPPORTED);.}
256b0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 ..CK_DEFINE_FUNC
256c0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 TION(CK_RV, C_Ge
256d0 6e 65 72 61 74 65 4b 65 79 29 28 43 4b 5f 53 45 nerateKey)(CK_SE
256e0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 SSION_HANDLE hSe
256f0 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e ssion, CK_MECHAN
25700 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 ISM_PTR pMechani
25710 73 6d 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 sm, CK_ATTRIBUTE
25720 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 _PTR pTemplate,
25730 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 CK_ULONG ulCount
25740 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 , CK_OBJECT_HAND
25750 4c 45 5f 50 54 52 20 70 68 4b 65 79 29 20 7b 0a LE_PTR phKey) {.
25760 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
25770 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
25780 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 ...if (!cackey_i
25790 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 nitialized) {...
257a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
257b0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 NTF("Error. Not
257c0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b initialized.");
257d0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 ....return(CKR_C
257e0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 RYPTOKI_NOT_INIT
257f0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 IALIZED);..}...C
25800 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
25810 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b TF("Returning CK
25820 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
25830 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 UPPORTED (%i)",
25840 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
25850 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 _SUPPORTED);...r
25860 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 eturn(CKR_FUNCTI
25870 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
25880 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f );.}..CK_DEFINE_
25890 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 FUNCTION(CK_RV,
258a0 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 50 61 69 C_GenerateKeyPai
258b0 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 r)(CK_SESSION_HA
258c0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 NDLE hSession, C
258d0 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 K_MECHANISM_PTR
258e0 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 41 pMechanism, CK_A
258f0 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 50 75 TTRIBUTE_PTR pPu
25900 62 6c 69 63 4b 65 79 54 65 6d 70 6c 61 74 65 2c blicKeyTemplate,
25910 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 75 62 6c CK_ULONG ulPubl
25920 69 63 4b 65 79 41 74 74 72 69 62 75 74 65 43 6f icKeyAttributeCo
25930 75 6e 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 unt, CK_ATTRIBUT
25940 45 5f 50 54 52 20 70 50 72 69 76 61 74 65 4b 65 E_PTR pPrivateKe
25950 79 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c yTemplate, CK_UL
25960 4f 4e 47 20 75 6c 50 72 69 76 61 74 65 4b 65 79 ONG ulPrivateKey
25970 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 AttributeCount,
25980 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 CK_OBJECT_HANDLE
25990 5f 50 54 52 20 70 68 50 75 62 6c 69 63 4b 65 79 _PTR phPublicKey
259a0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 , CK_OBJECT_HAND
259b0 4c 45 5f 50 54 52 20 70 68 50 72 69 76 61 74 65 LE_PTR phPrivate
259c0 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 Key) {..CACKEY_D
259d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
259e0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 led.");...if (!c
259f0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 ackey_initialize
25a00 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 d) {...CACKEY_DE
25a10 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
25a20 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 r. Not initiali
25a30 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 zed.");....retur
25a40 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e n(CKR_CRYPTOKI_N
25a50 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b OT_INITIALIZED);
25a60 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 ..}...CACKEY_DEB
25a70 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
25a80 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f ning CKR_FUNCTIO
25a90 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 N_NOT_SUPPORTED
25aa0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 (%i)", CKR_FUNCT
25ab0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
25ac0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 D);...return(CKR
25ad0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
25ae0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f PPORTED);.}..CK_
25af0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 DEFINE_FUNCTION(
25b00 43 4b 5f 52 56 2c 20 43 5f 57 72 61 70 4b 65 79 CK_RV, C_WrapKey
25b10 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e )(CK_SESSION_HAN
25b20 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b DLE hSession, CK
25b30 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 _MECHANISM_PTR p
25b40 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 Mechanism, CK_OB
25b50 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 57 72 61 JECT_HANDLE hWra
25b60 70 70 69 6e 67 4b 65 79 2c 20 43 4b 5f 4f 42 4a ppingKey, CK_OBJ
25b70 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 2c ECT_HANDLE hKey,
25b80 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 57 72 CK_BYTE_PTR pWr
25b90 61 70 70 65 64 4b 65 79 2c 20 43 4b 5f 55 4c 4f appedKey, CK_ULO
25ba0 4e 47 5f 50 54 52 20 70 75 6c 57 72 61 70 70 65 NG_PTR pulWrappe
25bb0 64 4b 65 79 4c 65 6e 29 20 7b 0a 09 43 41 43 4b dKeyLen) {..CACK
25bc0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
25bd0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 "Called.");...if
25be0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 (!cackey_initia
25bf0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 lized) {...CACKE
25c00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
25c10 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 Error. Not init
25c20 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 ialized.");....r
25c30 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f eturn(CKR_CRYPTO
25c40 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a KI_NOT_INITIALIZ
25c50 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 ED);..}...CACKEY
25c60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
25c70 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e eturning CKR_FUN
25c80 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
25c90 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 TED (%i)", CKR_F
25ca0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
25cb0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e ORTED);...return
25cc0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f (CKR_FUNCTION_NO
25cd0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a T_SUPPORTED);.}.
25ce0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 .CK_DEFINE_FUNCT
25cf0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 55 6e 77 ION(CK_RV, C_Unw
25d00 72 61 70 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 rapKey)(CK_SESSI
25d10 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 ON_HANDLE hSessi
25d20 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d on, CK_MECHANISM
25d30 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c _PTR pMechanism,
25d40 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c CK_OBJECT_HANDL
25d50 45 20 68 55 6e 77 72 61 70 70 69 6e 67 4b 65 79 E hUnwrappingKey
25d60 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 57 , CK_BYTE_PTR pW
25d70 72 61 70 70 65 64 4b 65 79 2c 20 43 4b 5f 55 4c rappedKey, CK_UL
25d80 4f 4e 47 20 75 6c 57 72 61 70 70 65 64 4b 65 79 ONG ulWrappedKey
25d90 4c 65 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 Len, CK_ATTRIBUT
25da0 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c E_PTR pTemplate,
25db0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 41 74 74 72 CK_ULONG ulAttr
25dc0 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f ibuteCount, CK_O
25dd0 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 BJECT_HANDLE_PTR
25de0 20 70 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 phKey) {..CACKE
25df0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
25e00 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 Called.");...if
25e10 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c (!cackey_initial
25e20 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 ized) {...CACKEY
25e30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
25e40 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 rror. Not initi
25e50 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 alized.");....re
25e60 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b turn(CKR_CRYPTOK
25e70 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 I_NOT_INITIALIZE
25e80 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f D);..}...CACKEY_
25e90 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
25ea0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 turning CKR_FUNC
25eb0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
25ec0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 ED (%i)", CKR_FU
25ed0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
25ee0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 RTED);...return(
25ef0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
25f00 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a _SUPPORTED);.}..
25f10 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 CK_DEFINE_FUNCTI
25f20 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 72 69 ON(CK_RV, C_Deri
25f30 76 65 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f veKey)(CK_SESSIO
25f40 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f N_HANDLE hSessio
25f50 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f n, CK_MECHANISM_
25f60 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 PTR pMechanism,
25f70 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 CK_OBJECT_HANDLE
25f80 20 68 42 61 73 65 4b 65 79 2c 20 43 4b 5f 41 54 hBaseKey, CK_AT
25f90 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d TRIBUTE_PTR pTem
25fa0 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 plate, CK_ULONG
25fb0 75 6c 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74 ulAttributeCount
25fc0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 , CK_OBJECT_HAND
25fd0 4c 45 5f 50 54 52 20 70 68 4b 65 79 29 20 7b 0a LE_PTR phKey) {.
25fe0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
25ff0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
26000 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 ...if (!cackey_i
26010 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 nitialized) {...
26020 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
26030 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 NTF("Error. Not
26040 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b initialized.");
26050 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 ....return(CKR_C
26060 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 RYPTOKI_NOT_INIT
26070 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 IALIZED);..}...C
26080 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
26090 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b TF("Returning CK
260a0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
260b0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 UPPORTED (%i)",
260c0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
260d0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 _SUPPORTED);...r
260e0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 eturn(CKR_FUNCTI
260f0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
26100 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f );.}..CK_DEFINE_
26110 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 FUNCTION(CK_RV,
26120 43 5f 53 65 65 64 52 61 6e 64 6f 6d 29 28 43 4b C_SeedRandom)(CK
26130 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 _SESSION_HANDLE
26140 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 hSession, CK_BYT
26150 45 5f 50 54 52 20 70 53 65 65 64 2c 20 43 4b 5f E_PTR pSeed, CK_
26160 55 4c 4f 4e 47 20 75 6c 53 65 65 64 4c 65 6e 29 ULONG ulSeedLen)
26170 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {..CACKEY_DEBUG
26180 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
26190 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ");...if (!cacke
261a0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b y_initialized) {
261b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
261c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
261d0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e Not initialized.
261e0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
261f0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 R_CRYPTOKI_NOT_I
26200 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
26210 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
26220 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
26230 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f CKR_FUNCTION_NO
26240 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 T_SUPPORTED (%i)
26250 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f ", CKR_FUNCTION_
26260 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
26270 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e ..return(CKR_FUN
26280 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
26290 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 TED);.}..CK_DEFI
262a0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 NE_FUNCTION(CK_R
262b0 56 2c 20 43 5f 47 65 6e 65 72 61 74 65 52 61 6e V, C_GenerateRan
262c0 64 6f 6d 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f dom)(CK_SESSION_
262d0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c HANDLE hSession,
262e0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 52 61 CK_BYTE_PTR pRa
262f0 6e 64 6f 6d 44 61 74 61 2c 20 43 4b 5f 55 4c 4f ndomData, CK_ULO
26300 4e 47 20 75 6c 52 61 6e 64 6f 6d 4c 65 6e 29 20 NG ulRandomLen)
26310 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f {..CACKEY_DEBUG_
26320 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
26330 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 );...if (!cackey
26340 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
26350 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
26360 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e RINTF("Error. N
26370 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 ot initialized."
26380 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
26390 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e _CRYPTOKI_NOT_IN
263a0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
263b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
263c0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
263d0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
263e0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 _SUPPORTED (%i)"
263f0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e , CKR_FUNCTION_N
26400 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a OT_SUPPORTED);..
26410 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 .return(CKR_FUNC
26420 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
26430 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 44 65 70 72 65 ED);.}../* Depre
26440 63 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 20 2a cated Function *
26450 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 /.CK_DEFINE_FUNC
26460 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 TION(CK_RV, C_Ge
26470 74 46 75 6e 63 74 69 6f 6e 53 74 61 74 75 73 29 tFunctionStatus)
26480 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 (CK_SESSION_HAND
26490 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 LE hSession) {..
264a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
264b0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a NTF("Called.");.
264c0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
264d0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
264e0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f CKR_FUNCTION_NO
264f0 54 5f 50 41 52 41 4c 4c 45 4c 20 28 25 69 29 22 T_PARALLEL (%i)"
26500 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e , CKR_FUNCTION_N
26510 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 OT_PARALLEL);...
26520 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 return(CKR_FUNCT
26530 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c ION_NOT_PARALLEL
26540 29 3b 0a 0a 09 68 53 65 73 73 69 6f 6e 20 3d 20 );...hSession =
26550 68 53 65 73 73 69 6f 6e 3b 20 2f 2a 20 53 75 70 hSession; /* Sup
26560 72 65 73 73 20 75 6e 75 73 65 64 20 76 61 72 69 ress unused vari
26570 61 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a able warning */.
26580 7d 0a 0a 2f 2a 20 44 65 70 72 65 63 61 74 65 64 }../* Deprecated
26590 20 46 75 6e 63 74 69 6f 6e 20 2a 2f 0a 43 4b 5f Function */.CK_
265a0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 DEFINE_FUNCTION(
265b0 43 4b 5f 52 56 2c 20 43 5f 43 61 6e 63 65 6c 46 CK_RV, C_CancelF
265c0 75 6e 63 74 69 6f 6e 29 28 43 4b 5f 53 45 53 53 unction)(CK_SESS
265d0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 ION_HANDLE hSess
265e0 69 6f 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 ion) {..CACKEY_D
265f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
26600 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 led.");...CACKEY
26610 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
26620 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e eturning CKR_FUN
26630 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c CTION_NOT_PARALL
26640 45 4c 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 EL (%i)", CKR_FU
26650 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c NCTION_NOT_PARAL
26660 4c 45 4c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 LEL);...return(C
26670 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
26680 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65 PARALLEL);...hSe
26690 73 73 69 6f 6e 20 3d 20 68 53 65 73 73 69 6f 6e ssion = hSession
266a0 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75 6e 75 ; /* Supress unu
266b0 73 65 64 20 76 61 72 69 61 62 6c 65 20 77 61 72 sed variable war
266c0 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45 ning */.}..CK_DE
266d0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b FINE_FUNCTION(CK
266e0 5f 52 56 2c 20 43 5f 47 65 74 46 75 6e 63 74 69 _RV, C_GetFuncti
266f0 6f 6e 4c 69 73 74 29 28 43 4b 5f 46 55 4e 43 54 onList)(CK_FUNCT
26700 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 5f 50 54 52 ION_LIST_PTR_PTR
26710 20 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 ppFunctionList)
26720 20 7b 0a 09 43 4b 5f 46 55 4e 43 54 49 4f 4e 5f {..CK_FUNCTION_
26730 4c 49 53 54 5f 50 54 52 20 70 46 75 6e 63 74 69 LIST_PTR pFuncti
26740 6f 6e 4c 69 73 74 3b 0a 0a 09 43 41 43 4b 45 59 onList;...CACKEY
26750 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 _DEBUG_PRINTF("C
26760 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 alled.");...if (
26770 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d ppFunctionList =
26780 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b = NULL) {...CACK
26790 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
267a0 22 45 72 72 6f 72 2e 20 70 70 46 75 6e 63 74 69 "Error. ppFuncti
267b0 6f 6e 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2e 22 onList is NULL."
267c0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
267d0 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b _ARGUMENTS_BAD);
267e0 0a 09 7d 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c ..}...pFunctionL
267f0 69 73 74 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a ist = malloc(siz
26800 65 6f 66 28 2a 70 46 75 6e 63 74 69 6f 6e 4c 69 eof(*pFunctionLi
26810 73 74 29 29 3b 0a 0a 09 70 46 75 6e 63 74 69 6f st));...pFunctio
26820 6e 4c 69 73 74 2d 3e 76 65 72 73 69 6f 6e 2e 6d nList->version.m
26830 61 6a 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f ajor = ((CACKEY_
26840 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e CRYPTOKI_VERSION
26850 5f 43 4f 44 45 29 20 3e 3e 20 31 36 29 20 26 20 _CODE) >> 16) &
26860 30 78 66 66 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 0xff;..pFunction
26870 4c 69 73 74 2d 3e 76 65 72 73 69 6f 6e 2e 6d 69 List->version.mi
26880 6e 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 nor = ((CACKEY_C
26890 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f RYPTOKI_VERSION_
268a0 43 4f 44 45 29 20 3e 3e 20 38 29 20 26 20 30 78 CODE) >> 8) & 0x
268b0 66 66 3b 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c ff;...pFunctionL
268c0 69 73 74 2d 3e 43 5f 49 6e 69 74 69 61 6c 69 7a ist->C_Initializ
268d0 65 20 3d 20 43 5f 49 6e 69 74 69 61 6c 69 7a 65 e = C_Initialize
268e0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 ;..pFunctionList
268f0 2d 3e 43 5f 46 69 6e 61 6c 69 7a 65 20 3d 20 43 ->C_Finalize = C
26900 5f 46 69 6e 61 6c 69 7a 65 3b 0a 09 70 46 75 6e _Finalize;..pFun
26910 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 ctionList->C_Get
26920 49 6e 66 6f 20 3d 20 43 5f 47 65 74 49 6e 66 6f Info = C_GetInfo
26930 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 ;..pFunctionList
26940 2d 3e 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74 20 ->C_GetSlotList
26950 3d 20 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74 3b = C_GetSlotList;
26960 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d ..pFunctionList-
26970 3e 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 20 3d >C_GetSlotInfo =
26980 20 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 3b 0a C_GetSlotInfo;.
26990 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e .pFunctionList->
269a0 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 20 3d C_GetTokenInfo =
269b0 20 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 3b C_GetTokenInfo;
269c0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d ..pFunctionList-
269d0 3e 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74 45 76 >C_WaitForSlotEv
269e0 65 6e 74 20 3d 20 43 5f 57 61 69 74 46 6f 72 53 ent = C_WaitForS
269f0 6c 6f 74 45 76 65 6e 74 3b 0a 09 70 46 75 6e 63 lotEvent;..pFunc
26a00 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4d tionList->C_GetM
26a10 65 63 68 61 6e 69 73 6d 4c 69 73 74 20 3d 20 43 echanismList = C
26a20 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73 _GetMechanismLis
26a30 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 t;..pFunctionLis
26a40 74 2d 3e 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 t->C_GetMechanis
26a50 6d 49 6e 66 6f 20 3d 20 43 5f 47 65 74 4d 65 63 mInfo = C_GetMec
26a60 68 61 6e 69 73 6d 49 6e 66 6f 3b 0a 09 70 46 75 hanismInfo;..pFu
26a70 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e nctionList->C_In
26a80 69 74 54 6f 6b 65 6e 20 3d 20 43 5f 49 6e 69 74 itToken = C_Init
26a90 54 6f 6b 65 6e 3b 0a 09 70 46 75 6e 63 74 69 6f Token;..pFunctio
26aa0 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 50 49 4e nList->C_InitPIN
26ab0 20 3d 20 43 5f 49 6e 69 74 50 49 4e 3b 0a 09 70 = C_InitPIN;..p
26ac0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f FunctionList->C_
26ad0 53 65 74 50 49 4e 20 3d 20 43 5f 53 65 74 50 49 SetPIN = C_SetPI
26ae0 4e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 N;..pFunctionLis
26af0 74 2d 3e 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e t->C_OpenSession
26b00 20 3d 20 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e = C_OpenSession
26b10 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 ;..pFunctionList
26b20 2d 3e 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e ->C_CloseSession
26b30 20 3d 20 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f = C_CloseSessio
26b40 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 n;..pFunctionLis
26b50 74 2d 3e 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 t->C_CloseAllSes
26b60 73 69 6f 6e 73 20 3d 20 43 5f 43 6c 6f 73 65 41 sions = C_CloseA
26b70 6c 6c 53 65 73 73 69 6f 6e 73 3b 0a 09 70 46 75 llSessions;..pFu
26b80 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 nctionList->C_Ge
26b90 74 53 65 73 73 69 6f 6e 49 6e 66 6f 20 3d 20 43 tSessionInfo = C
26ba0 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f 3b _GetSessionInfo;
26bb0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d ..pFunctionList-
26bc0 3e 43 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e 53 >C_GetOperationS
26bd0 74 61 74 65 20 3d 20 43 5f 47 65 74 4f 70 65 72 tate = C_GetOper
26be0 61 74 69 6f 6e 53 74 61 74 65 3b 0a 09 70 46 75 ationState;..pFu
26bf0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 nctionList->C_Se
26c00 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 20 tOperationState
26c10 3d 20 43 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e = C_SetOperation
26c20 53 74 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f State;..pFunctio
26c30 6e 4c 69 73 74 2d 3e 43 5f 4c 6f 67 69 6e 20 3d nList->C_Login =
26c40 20 43 5f 4c 6f 67 69 6e 3b 0a 09 70 46 75 6e 63 C_Login;..pFunc
26c50 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4c 6f 67 6f tionList->C_Logo
26c60 75 74 20 3d 20 43 5f 4c 6f 67 6f 75 74 3b 0a 09 ut = C_Logout;..
26c70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 pFunctionList->C
26c80 5f 43 72 65 61 74 65 4f 62 6a 65 63 74 20 3d 20 _CreateObject =
26c90 43 5f 43 72 65 61 74 65 4f 62 6a 65 63 74 3b 0a C_CreateObject;.
26ca0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e .pFunctionList->
26cb0 43 5f 43 6f 70 79 4f 62 6a 65 63 74 20 3d 20 43 C_CopyObject = C
26cc0 5f 43 6f 70 79 4f 62 6a 65 63 74 3b 0a 09 70 46 _CopyObject;..pF
26cd0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 unctionList->C_D
26ce0 65 73 74 72 6f 79 4f 62 6a 65 63 74 20 3d 20 43 estroyObject = C
26cf0 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63 74 3b 0a _DestroyObject;.
26d00 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e .pFunctionList->
26d10 43 5f 47 65 74 4f 62 6a 65 63 74 53 69 7a 65 20 C_GetObjectSize
26d20 3d 20 43 5f 47 65 74 4f 62 6a 65 63 74 53 69 7a = C_GetObjectSiz
26d30 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 e;..pFunctionLis
26d40 74 2d 3e 43 5f 47 65 74 41 74 74 72 69 62 75 74 t->C_GetAttribut
26d50 65 56 61 6c 75 65 20 3d 20 43 5f 47 65 74 41 74 eValue = C_GetAt
26d60 74 72 69 62 75 74 65 56 61 6c 75 65 3b 0a 09 70 tributeValue;..p
26d70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f FunctionList->C_
26d80 53 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 SetAttributeValu
26d90 65 20 3d 20 43 5f 53 65 74 41 74 74 72 69 62 75 e = C_SetAttribu
26da0 74 65 56 61 6c 75 65 3b 0a 09 70 46 75 6e 63 74 teValue;..pFunct
26db0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f ionList->C_FindO
26dc0 62 6a 65 63 74 73 49 6e 69 74 20 3d 20 43 5f 46 bjectsInit = C_F
26dd0 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 3b 0a indObjectsInit;.
26de0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e .pFunctionList->
26df0 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 20 3d 20 C_FindObjects =
26e00 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 3b 0a 09 C_FindObjects;..
26e10 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 pFunctionList->C
26e20 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46 69 6e 61 _FindObjectsFina
26e30 6c 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 l = C_FindObject
26e40 73 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 sFinal;..pFuncti
26e50 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 onList->C_Encryp
26e60 74 49 6e 69 74 20 3d 20 43 5f 45 6e 63 72 79 70 tInit = C_Encryp
26e70 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f tInit;..pFunctio
26e80 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 nList->C_Encrypt
26e90 20 3d 20 43 5f 45 6e 63 72 79 70 74 3b 0a 09 70 = C_Encrypt;..p
26ea0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f FunctionList->C_
26eb0 45 6e 63 72 79 70 74 55 70 64 61 74 65 20 3d 20 EncryptUpdate =
26ec0 43 5f 45 6e 63 72 79 70 74 55 70 64 61 74 65 3b C_EncryptUpdate;
26ed0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d ..pFunctionList-
26ee0 3e 43 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c 20 >C_EncryptFinal
26ef0 3d 20 43 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c = C_EncryptFinal
26f00 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 ;..pFunctionList
26f10 2d 3e 43 5f 44 65 63 72 79 70 74 49 6e 69 74 20 ->C_DecryptInit
26f20 3d 20 43 5f 44 65 63 72 79 70 74 49 6e 69 74 3b = C_DecryptInit;
26f30 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d ..pFunctionList-
26f40 3e 43 5f 44 65 63 72 79 70 74 20 3d 20 43 5f 44 >C_Decrypt = C_D
26f50 65 63 72 79 70 74 3b 0a 09 70 46 75 6e 63 74 69 ecrypt;..pFuncti
26f60 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 onList->C_Decryp
26f70 74 55 70 64 61 74 65 20 3d 20 43 5f 44 65 63 72 tUpdate = C_Decr
26f80 79 70 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e yptUpdate;..pFun
26f90 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 ctionList->C_Dec
26fa0 72 79 70 74 46 69 6e 61 6c 20 3d 20 43 5f 44 65 ryptFinal = C_De
26fb0 63 72 79 70 74 46 69 6e 61 6c 3b 0a 09 70 46 75 cryptFinal;..pFu
26fc0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 nctionList->C_Di
26fd0 67 65 73 74 49 6e 69 74 20 3d 20 43 5f 44 69 67 gestInit = C_Dig
26fe0 65 73 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 estInit;..pFunct
26ff0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 ionList->C_Diges
27000 74 20 3d 20 43 5f 44 69 67 65 73 74 3b 0a 09 70 t = C_Digest;..p
27010 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f FunctionList->C_
27020 44 69 67 65 73 74 55 70 64 61 74 65 20 3d 20 43 DigestUpdate = C
27030 5f 44 69 67 65 73 74 55 70 64 61 74 65 3b 0a 09 _DigestUpdate;..
27040 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 pFunctionList->C
27050 5f 44 69 67 65 73 74 4b 65 79 20 3d 20 43 5f 44 _DigestKey = C_D
27060 69 67 65 73 74 4b 65 79 3b 0a 09 70 46 75 6e 63 igestKey;..pFunc
27070 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 tionList->C_Dige
27080 73 74 46 69 6e 61 6c 20 3d 20 43 5f 44 69 67 65 stFinal = C_Dige
27090 73 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 stFinal;..pFunct
270a0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 49 ionList->C_SignI
270b0 6e 69 74 20 3d 20 43 5f 53 69 67 6e 49 6e 69 74 nit = C_SignInit
270c0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 ;..pFunctionList
270d0 2d 3e 43 5f 53 69 67 6e 20 3d 20 43 5f 53 69 67 ->C_Sign = C_Sig
270e0 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 n;..pFunctionLis
270f0 74 2d 3e 43 5f 53 69 67 6e 55 70 64 61 74 65 20 t->C_SignUpdate
27100 3d 20 43 5f 53 69 67 6e 55 70 64 61 74 65 3b 0a = C_SignUpdate;.
27110 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e .pFunctionList->
27120 43 5f 53 69 67 6e 46 69 6e 61 6c 20 3d 20 43 5f C_SignFinal = C_
27130 53 69 67 6e 46 69 6e 61 6c 3b 0a 09 70 46 75 6e SignFinal;..pFun
27140 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 ctionList->C_Sig
27150 6e 52 65 63 6f 76 65 72 49 6e 69 74 20 3d 20 43 nRecoverInit = C
27160 5f 53 69 67 6e 52 65 63 6f 76 65 72 49 6e 69 74 _SignRecoverInit
27170 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 ;..pFunctionList
27180 2d 3e 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 20 ->C_SignRecover
27190 3d 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 3b = C_SignRecover;
271a0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d ..pFunctionList-
271b0 3e 43 5f 56 65 72 69 66 79 49 6e 69 74 20 3d 20 >C_VerifyInit =
271c0 43 5f 56 65 72 69 66 79 49 6e 69 74 3b 0a 09 70 C_VerifyInit;..p
271d0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f FunctionList->C_
271e0 56 65 72 69 66 79 20 3d 20 43 5f 56 65 72 69 66 Verify = C_Verif
271f0 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 y;..pFunctionLis
27200 74 2d 3e 43 5f 56 65 72 69 66 79 55 70 64 61 74 t->C_VerifyUpdat
27210 65 20 3d 20 43 5f 56 65 72 69 66 79 55 70 64 61 e = C_VerifyUpda
27220 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 te;..pFunctionLi
27230 73 74 2d 3e 43 5f 56 65 72 69 66 79 46 69 6e 61 st->C_VerifyFina
27240 6c 20 3d 20 43 5f 56 65 72 69 66 79 46 69 6e 61 l = C_VerifyFina
27250 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 l;..pFunctionLis
27260 74 2d 3e 43 5f 56 65 72 69 66 79 52 65 63 6f 76 t->C_VerifyRecov
27270 65 72 49 6e 69 74 20 3d 20 43 5f 56 65 72 69 66 erInit = C_Verif
27280 79 52 65 63 6f 76 65 72 49 6e 69 74 3b 0a 09 70 yRecoverInit;..p
27290 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f FunctionList->C_
272a0 56 65 72 69 66 79 52 65 63 6f 76 65 72 20 3d 20 VerifyRecover =
272b0 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 3b C_VerifyRecover;
272c0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d ..pFunctionList-
272d0 3e 43 5f 44 69 67 65 73 74 45 6e 63 72 79 70 74 >C_DigestEncrypt
272e0 55 70 64 61 74 65 20 3d 20 43 5f 44 69 67 65 73 Update = C_Diges
272f0 74 45 6e 63 72 79 70 74 55 70 64 61 74 65 3b 0a tEncryptUpdate;.
27300 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e .pFunctionList->
27310 43 5f 44 65 63 72 79 70 74 44 69 67 65 73 74 55 C_DecryptDigestU
27320 70 64 61 74 65 20 3d 20 43 5f 44 65 63 72 79 70 pdate = C_Decryp
27330 74 44 69 67 65 73 74 55 70 64 61 74 65 3b 0a 09 tDigestUpdate;..
27340 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 pFunctionList->C
27350 5f 53 69 67 6e 45 6e 63 72 79 70 74 55 70 64 61 _SignEncryptUpda
27360 74 65 20 3d 20 43 5f 53 69 67 6e 45 6e 63 72 79 te = C_SignEncry
27370 70 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 ptUpdate;..pFunc
27380 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 tionList->C_Decr
27390 79 70 74 56 65 72 69 66 79 55 70 64 61 74 65 20 yptVerifyUpdate
273a0 3d 20 43 5f 44 65 63 72 79 70 74 56 65 72 69 66 = C_DecryptVerif
273b0 79 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 yUpdate;..pFunct
273c0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e 65 72 ionList->C_Gener
273d0 61 74 65 4b 65 79 20 3d 20 43 5f 47 65 6e 65 72 ateKey = C_Gener
273e0 61 74 65 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 ateKey;..pFuncti
273f0 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e 65 72 61 onList->C_Genera
27400 74 65 4b 65 79 50 61 69 72 20 3d 20 43 5f 47 65 teKeyPair = C_Ge
27410 6e 65 72 61 74 65 4b 65 79 50 61 69 72 3b 0a 09 nerateKeyPair;..
27420 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 pFunctionList->C
27430 5f 57 72 61 70 4b 65 79 20 3d 20 43 5f 57 72 61 _WrapKey = C_Wra
27440 70 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e pKey;..pFunction
27450 4c 69 73 74 2d 3e 43 5f 55 6e 77 72 61 70 4b 65 List->C_UnwrapKe
27460 79 20 3d 20 43 5f 55 6e 77 72 61 70 4b 65 79 3b y = C_UnwrapKey;
27470 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d ..pFunctionList-
27480 3e 43 5f 44 65 72 69 76 65 4b 65 79 20 3d 20 43 >C_DeriveKey = C
27490 5f 44 65 72 69 76 65 4b 65 79 3b 0a 09 70 46 75 _DeriveKey;..pFu
274a0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 nctionList->C_Se
274b0 65 64 52 61 6e 64 6f 6d 20 3d 20 43 5f 53 65 65 edRandom = C_See
274c0 64 52 61 6e 64 6f 6d 3b 0a 09 70 46 75 6e 63 74 dRandom;..pFunct
274d0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e 65 72 ionList->C_Gener
274e0 61 74 65 52 61 6e 64 6f 6d 20 3d 20 43 5f 47 65 ateRandom = C_Ge
274f0 6e 65 72 61 74 65 52 61 6e 64 6f 6d 3b 0a 09 70 nerateRandom;..p
27500 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f FunctionList->C_
27510 47 65 74 46 75 6e 63 74 69 6f 6e 53 74 61 74 75 GetFunctionStatu
27520 73 20 3d 20 43 5f 47 65 74 46 75 6e 63 74 69 6f s = C_GetFunctio
27530 6e 53 74 61 74 75 73 3b 0a 09 70 46 75 6e 63 74 nStatus;..pFunct
27540 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 61 6e 63 65 ionList->C_Cance
27550 6c 46 75 6e 63 74 69 6f 6e 20 3d 20 43 5f 43 61 lFunction = C_Ca
27560 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 3b 0a 09 70 ncelFunction;..p
27570 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f FunctionList->C_
27580 47 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 GetFunctionList
27590 3d 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 4c = C_GetFunctionL
275a0 69 73 74 3b 0a 0a 09 2a 70 70 46 75 6e 63 74 69 ist;...*ppFuncti
275b0 6f 6e 4c 69 73 74 20 3d 20 70 46 75 6e 63 74 69 onList = pFuncti
275c0 6f 6e 4c 69 73 74 3b 0a 0a 09 43 41 43 4b 45 59 onList;...CACKEY
275d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
275e0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 eturning CKR_OK
275f0 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a (%i)", CKR_OK);.
27600 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 ..return(CKR_OK)
27610 3b 0a 7d 0a 0a ;.}..