0000: 23 69 66 64 65 66 20 48 41 56 45 5f 43 4f 4e 46 #ifdef HAVE_CONF
0010: 49 47 5f 48 0a 23 69 6e 63 6c 75 64 65 20 22 63 IG_H.#include "c
0020: 6f 6e 66 69 67 2e 68 22 0a 23 65 6e 64 69 66 0a onfig.h".#endif.
0030: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 57 49 4e .#ifdef HAVE_WIN
0040: 54 59 50 45 53 5f 48 0a 23 20 20 69 6e 63 6c 75 TYPES_H.# inclu
0050: 64 65 20 3c 77 69 6e 74 79 70 65 73 2e 68 3e 0a de <wintypes.h>.
0060: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 #endif.#ifdef HA
0070: 56 45 5f 50 43 53 43 4c 49 54 45 5f 48 0a 23 20 VE_PCSCLITE_H.#
0080: 20 69 6e 63 6c 75 64 65 20 3c 70 63 73 63 6c 69 include <pcscli
0090: 74 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 te.h>.#endif.#if
00a0: 64 65 66 20 48 41 56 45 5f 57 49 4e 53 43 41 52 def HAVE_WINSCAR
00b0: 44 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c D_H.# include <
00c0: 77 69 6e 73 63 61 72 64 2e 68 3e 0a 23 65 6e 64 winscard.h>.#end
00d0: 69 66 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 if.#ifdef HAVE_S
00e0: 54 44 49 4e 54 5f 48 0a 23 20 20 69 6e 63 6c 75 TDINT_H.# inclu
00f0: 64 65 20 3c 73 74 64 69 6e 74 2e 68 3e 0a 23 65 de <stdint.h>.#e
0100: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45 ndif.#ifdef HAVE
0110: 5f 49 4e 54 54 59 50 45 53 5f 48 0a 23 20 20 69 _INTTYPES_H.# i
0120: 6e 63 6c 75 64 65 20 3c 69 6e 74 74 79 70 65 73 nclude <inttypes
0130: 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 .h>.#endif.#ifde
0140: 66 20 48 41 56 45 5f 53 54 44 4c 49 42 5f 48 0a f HAVE_STDLIB_H.
0150: 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c # include <stdl
0160: 69 62 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 ib.h>.#endif.#if
0170: 64 65 66 20 48 41 56 45 5f 55 4e 49 53 54 44 5f def HAVE_UNISTD_
0180: 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 75 6e H.# include <un
0190: 69 73 74 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 istd.h>.#endif.#
01a0: 69 66 64 65 66 20 48 41 56 45 5f 53 54 52 49 4e ifdef HAVE_STRIN
01b0: 47 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c G_H.# include <
01c0: 73 74 72 69 6e 67 2e 68 3e 0a 23 65 6e 64 69 66 string.h>.#endif
01d0: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 50 54 48 .#ifdef HAVE_PTH
01e0: 52 45 41 44 5f 48 0a 23 20 20 69 6e 63 6c 75 64 READ_H.# includ
01f0: 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 65 e <pthread.h>.#e
0200: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45 ndif.#ifdef HAVE
0210: 5f 4c 49 4d 49 54 53 5f 48 0a 23 20 20 69 6e 63 _LIMITS_H.# inc
0220: 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a lude <limits.h>.
0230: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 #endif.#ifdef HA
0240: 56 45 5f 53 54 44 49 4f 5f 48 0a 23 20 20 69 6e VE_STDIO_H.# in
0250: 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a clude <stdio.h>.
0260: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 #endif.#ifdef HA
0270: 56 45 5f 5a 4c 49 42 5f 48 0a 23 20 20 69 66 64 VE_ZLIB_H.# ifd
0280: 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 23 20 20 ef HAVE_LIBZ.#
0290: 20 20 69 6e 63 6c 75 64 65 20 3c 7a 6c 69 62 2e include <zlib.
02a0: 68 3e 0a 23 20 20 65 6e 64 69 66 0a 23 65 6c 73 h>.# endif.#els
02b0: 65 0a 23 20 20 69 66 64 65 66 20 48 41 56 45 5f e.# ifdef HAVE_
02c0: 4c 49 42 5a 0a 23 20 20 20 20 75 6e 64 65 66 20 LIBZ.# undef
02d0: 48 41 56 45 5f 4c 49 42 5a 0a 23 20 20 65 6e 64 HAVE_LIBZ.# end
02e0: 69 66 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 if.#endif..#defi
02f0: 6e 65 20 43 4b 5f 50 54 52 20 2a 0a 23 64 65 66 ne CK_PTR *.#def
0300: 69 6e 65 20 43 4b 5f 44 45 46 49 4e 45 5f 46 55 ine CK_DEFINE_FU
0310: 4e 43 54 49 4f 4e 28 72 65 74 75 72 6e 54 79 70 NCTION(returnTyp
0320: 65 2c 20 6e 61 6d 65 29 20 72 65 74 75 72 6e 54 e, name) returnT
0330: 79 70 65 20 6e 61 6d 65 0a 23 64 65 66 69 6e 65 ype name.#define
0340: 20 43 4b 5f 44 45 43 4c 41 52 45 5f 46 55 4e 43 CK_DECLARE_FUNC
0350: 54 49 4f 4e 28 72 65 74 75 72 6e 54 79 70 65 2c TION(returnType,
0360: 20 6e 61 6d 65 29 20 72 65 74 75 72 6e 54 79 70 name) returnTyp
0370: 65 20 6e 61 6d 65 0a 23 64 65 66 69 6e 65 20 43 e name.#define C
0380: 4b 5f 44 45 43 4c 41 52 45 5f 46 55 4e 43 54 49 K_DECLARE_FUNCTI
0390: 4f 4e 5f 50 4f 49 4e 54 45 52 28 72 65 74 75 72 ON_POINTER(retur
03a0: 6e 54 79 70 65 2c 20 6e 61 6d 65 29 20 72 65 74 nType, name) ret
03b0: 75 72 6e 54 79 70 65 20 28 2a 20 6e 61 6d 65 29 urnType (* name)
03c0: 0a 23 64 65 66 69 6e 65 20 43 4b 5f 43 41 4c 4c .#define CK_CALL
03d0: 42 41 43 4b 5f 46 55 4e 43 54 49 4f 4e 28 72 65 BACK_FUNCTION(re
03e0: 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d 65 29 20 turnType, name)
03f0: 72 65 74 75 72 6e 54 79 70 65 20 28 2a 20 6e 61 returnType (* na
0400: 6d 65 29 0a 23 69 66 6e 64 65 66 20 4e 55 4c 4c me).#ifndef NULL
0410: 5f 50 54 52 0a 23 20 20 64 65 66 69 6e 65 20 4e _PTR.# define N
0420: 55 4c 4c 5f 50 54 52 20 30 0a 23 65 6e 64 69 66 ULL_PTR 0.#endif
0430: 0a 0a 23 69 6e 63 6c 75 64 65 20 22 70 6b 63 73 ..#include "pkcs
0440: 31 31 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 11.h".#include "
0450: 61 73 6e 31 2d 78 35 30 39 2e 68 22 0a 0a 23 69 asn1-x509.h"..#i
0460: 66 6e 64 65 66 20 43 41 43 4b 45 59 5f 43 52 59 fndef CACKEY_CRY
0470: 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f PTOKI_VERSION_CO
0480: 44 45 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 DE.# define CAC
0490: 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 KEY_CRYPTOKI_VER
04a0: 53 49 4f 4e 5f 43 4f 44 45 20 30 78 30 32 31 65 SION_CODE 0x021e
04b0: 30 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 00.#endif..#ifnd
04c0: 65 66 20 43 4b 41 5f 54 52 55 53 54 5f 53 45 52 ef CKA_TRUST_SER
04d0: 56 45 52 5f 41 55 54 48 0a 23 20 20 64 65 66 69 VER_AUTH.# defi
04e0: 6e 65 20 43 4b 41 5f 54 52 55 53 54 5f 53 45 52 ne CKA_TRUST_SER
04f0: 56 45 52 5f 41 55 54 48 20 30 78 63 65 35 33 36 VER_AUTH 0xce536
0500: 33 35 38 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 358.#endif.#ifnd
0510: 65 66 20 43 4b 41 5f 54 52 55 53 54 5f 43 4c 49 ef CKA_TRUST_CLI
0520: 45 4e 54 5f 41 55 54 48 0a 23 20 20 64 65 66 69 ENT_AUTH.# defi
0530: 6e 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 4c 49 ne CKA_TRUST_CLI
0540: 45 4e 54 5f 41 55 54 48 20 30 78 63 65 35 33 36 ENT_AUTH 0xce536
0550: 33 35 39 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 359.#endif.#ifnd
0560: 65 66 20 43 4b 41 5f 54 52 55 53 54 5f 43 4f 44 ef CKA_TRUST_COD
0570: 45 5f 53 49 47 4e 49 4e 47 0a 23 20 20 64 65 66 E_SIGNING.# def
0580: 69 6e 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 4f ine CKA_TRUST_CO
0590: 44 45 5f 53 49 47 4e 49 4e 47 20 30 78 63 65 35 DE_SIGNING 0xce5
05a0: 33 36 33 35 61 0a 23 65 6e 64 69 66 0a 23 69 66 3635a.#endif.#if
05b0: 6e 64 65 66 20 43 4b 41 5f 54 52 55 53 54 5f 45 ndef CKA_TRUST_E
05c0: 4d 41 49 4c 5f 50 52 4f 54 45 43 54 49 4f 4e 0a MAIL_PROTECTION.
05d0: 23 20 20 64 65 66 69 6e 65 20 43 4b 41 5f 54 52 # define CKA_TR
05e0: 55 53 54 5f 45 4d 41 49 4c 5f 50 52 4f 54 45 43 UST_EMAIL_PROTEC
05f0: 54 49 4f 4e 20 30 78 63 65 35 33 36 33 35 62 0a TION 0xce53635b.
0600: 23 65 6e 64 69 66 0a 0a 2f 2a 20 47 53 43 2d 49 #endif../* GSC-I
0610: 53 20 76 32 2e 31 20 44 65 66 69 6e 69 74 69 6f S v2.1 Definitio
0620: 6e 73 20 2a 2f 0a 2f 2a 2a 20 43 6c 61 73 73 65 ns */./** Classe
0630: 73 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 s **/.#define GS
0640: 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 CIS_CLASS_ISO781
0650: 36 20 20 20 20 20 20 20 20 20 20 20 30 78 30 30 6 0x00
0660: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 43 .#define GSCIS_C
0670: 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 LASS_GLOBAL_PLAT
0680: 46 4f 52 4d 20 20 20 30 78 38 30 0a 0a 2f 2a 2a FORM 0x80../**
0690: 20 49 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2a Instructions **
06a0: 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f /.#define GSCIS_
06b0: 49 4e 53 54 52 5f 47 45 54 5f 52 45 53 50 4f 4e INSTR_GET_RESPON
06c0: 53 45 20 20 20 20 20 20 30 78 43 30 0a 23 64 65 SE 0xC0.#de
06d0: 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 fine GSCIS_INSTR
06e0: 5f 52 45 41 44 5f 42 49 4e 41 52 59 20 20 20 20 _READ_BINARY
06f0: 20 20 20 30 78 42 30 0a 23 64 65 66 69 6e 65 20 0xB0.#define
0700: 47 53 43 49 53 5f 49 4e 53 54 52 5f 55 50 44 41 GSCIS_INSTR_UPDA
0710: 54 45 5f 42 49 4e 41 52 59 20 20 20 20 20 30 78 TE_BINARY 0x
0720: 44 36 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 D6.#define GSCIS
0730: 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54 20 20 20 _INSTR_SELECT
0740: 20 20 20 20 20 20 20 20 20 30 78 41 34 0a 23 64 0xA4.#d
0750: 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 efine GSCIS_INST
0760: 52 5f 45 58 54 45 52 4e 41 4c 5f 41 55 54 48 20 R_EXTERNAL_AUTH
0770: 20 20 20 20 30 78 38 32 0a 23 64 65 66 69 6e 65 0x82.#define
0780: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 GSCIS_INSTR_GET
0790: 5f 43 48 41 4c 4c 45 4e 47 45 20 20 20 20 20 30 _CHALLENGE 0
07a0: 78 38 34 0a 23 64 65 66 69 6e 65 20 47 53 43 49 x84.#define GSCI
07b0: 53 5f 49 4e 53 54 52 5f 49 4e 54 45 52 4e 41 4c S_INSTR_INTERNAL
07c0: 5f 41 55 54 48 20 20 20 20 20 30 78 38 38 0a 23 _AUTH 0x88.#
07d0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 define GSCIS_INS
07e0: 54 52 5f 56 45 52 49 46 59 20 20 20 20 20 20 20 TR_VERIFY
07f0: 20 20 20 20 20 30 78 32 30 0a 23 64 65 66 69 6e 0x20.#defin
0800: 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 49 e GSCIS_INSTR_SI
0810: 47 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 GN
0820: 30 78 32 41 0a 23 64 65 66 69 6e 65 20 47 53 43 0x2A.#define GSC
0830: 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 50 52 4f IS_INSTR_GET_PRO
0840: 50 20 20 20 20 20 20 20 20 20 20 30 78 35 36 0a P 0x56.
0850: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e #define GSCIS_IN
0860: 53 54 52 5f 47 45 54 5f 41 43 52 20 20 20 20 20 STR_GET_ACR
0870: 20 20 20 20 20 20 30 78 34 43 0a 23 64 65 66 69 0x4C.#defi
0880: 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 52 ne GSCIS_INSTR_R
0890: 45 41 44 5f 42 55 46 46 45 52 20 20 20 20 20 20 EAD_BUFFER
08a0: 20 30 78 35 32 0a 23 64 65 66 69 6e 65 20 47 53 0x52.#define GS
08b0: 43 49 53 5f 49 4e 53 54 52 5f 53 49 47 4e 44 45 CIS_INSTR_SIGNDE
08c0: 43 52 59 50 54 20 20 20 20 20 20 20 30 78 34 32 CRYPT 0x42
08d0: 0a 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f ..#define GSCIS_
08e0: 50 41 52 41 4d 5f 53 45 4c 45 43 54 5f 41 50 50 PARAM_SELECT_APP
08f0: 4c 45 54 20 20 20 20 20 30 78 30 34 0a 0a 2f 2a LET 0x04../*
0900: 2a 20 54 61 67 73 20 2a 2a 2f 0a 2f 2a 2a 2a 20 * Tags **/./***
0910: 43 43 43 20 54 61 67 73 20 2a 2a 2a 2f 0a 23 64 CCC Tags ***/.#d
0920: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f efine GSCIS_TAG_
0930: 43 41 52 44 49 44 20 20 20 20 20 20 20 20 20 20 CARDID
0940: 20 20 20 20 30 78 46 30 0a 23 64 65 66 69 6e 65 0xF0.#define
0950: 20 47 53 43 49 53 5f 54 41 47 5f 43 43 43 5f 56 GSCIS_TAG_CCC_V
0960: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 30 ER 0
0970: 78 46 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49 xF1.#define GSCI
0980: 53 5f 54 41 47 5f 43 43 47 5f 56 45 52 20 20 20 S_TAG_CCG_VER
0990: 20 20 20 20 20 20 20 20 20 20 30 78 46 32 0a 23 0xF2.#
09a0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 define GSCIS_TAG
09b0: 5f 43 41 52 44 55 52 4c 20 20 20 20 20 20 20 20 _CARDURL
09c0: 20 20 20 20 20 30 78 46 33 0a 23 64 65 66 69 6e 0xF3.#defin
09d0: 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 53 e GSCIS_TAG_PKCS
09e0: 31 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20 15
09f0: 30 78 46 34 0a 23 64 65 66 69 6e 65 20 47 53 43 0xF4.#define GSC
0a00: 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 41 5f IS_TAG_REG_DATA_
0a10: 4d 4f 44 45 4c 20 20 20 20 20 20 30 78 46 35 0a MODEL 0xF5.
0a20: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 #define GSCIS_TA
0a30: 47 5f 41 43 52 5f 54 41 42 4c 45 20 20 20 20 20 G_ACR_TABLE
0a40: 20 20 20 20 20 20 30 78 46 36 0a 23 64 65 66 69 0xF6.#defi
0a50: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 ne GSCIS_TAG_CAR
0a60: 44 5f 41 50 44 55 20 20 20 20 20 20 20 20 20 20 D_APDU
0a70: 20 30 78 46 37 0a 23 64 65 66 69 6e 65 20 47 53 0xF7.#define GS
0a80: 43 49 53 5f 54 41 47 5f 52 45 44 49 52 45 43 54 CIS_TAG_REDIRECT
0a90: 49 4f 4e 20 20 20 20 20 20 20 20 20 30 78 46 41 ION 0xFA
0aa0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 .#define GSCIS_T
0ab0: 41 47 5f 43 54 20 20 20 20 20 20 20 20 20 20 20 AG_CT
0ac0: 20 20 20 20 20 20 20 30 78 46 42 0a 23 64 65 66 0xFB.#def
0ad0: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53 54 ine GSCIS_TAG_ST
0ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0af0: 20 20 30 78 46 43 0a 23 64 65 66 69 6e 65 20 47 0xFC.#define G
0b00: 53 43 49 53 5f 54 41 47 5f 4e 45 58 54 43 43 43 SCIS_TAG_NEXTCCC
0b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 46 0xF
0b20: 44 0a 0a 2f 2a 2a 2a 20 47 65 6e 65 72 61 6c 20 D../*** General
0b30: 2d 20 45 46 20 32 32 30 30 20 2a 2a 2a 2f 0a 23 - EF 2200 ***/.#
0b40: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 define GSCIS_TAG
0b50: 5f 46 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20 _FNAME
0b60: 20 20 20 20 20 30 78 30 31 0a 23 64 65 66 69 6e 0x01.#defin
0b70: 65 20 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41 4d e GSCIS_TAG_MNAM
0b80: 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 E
0b90: 30 78 30 32 0a 23 64 65 66 69 6e 65 20 47 53 43 0x02.#define GSC
0ba0: 49 53 5f 54 41 47 5f 4c 4e 41 4d 45 20 20 20 20 IS_TAG_LNAME
0bb0: 20 20 20 20 20 20 20 20 20 20 20 30 78 30 33 0a 0x03.
0bc0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 #define GSCIS_TA
0bd0: 47 5f 53 55 46 46 49 58 20 20 20 20 20 20 20 20 G_SUFFIX
0be0: 20 20 20 20 20 20 30 78 30 34 0a 23 64 65 66 69 0x04.#defi
0bf0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 47 4f 56 ne GSCIS_TAG_GOV
0c00: 54 5f 41 47 45 4e 43 59 20 20 20 20 20 20 20 20 T_AGENCY
0c10: 20 30 78 30 35 0a 23 64 65 66 69 6e 65 20 47 53 0x05.#define GS
0c20: 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 20 20 CIS_TAG_BUREAU
0c30: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30 36 0x06
0c40: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 .#define GSCIS_T
0c50: 41 47 5f 42 55 52 45 41 55 5f 43 4f 44 45 20 20 AG_BUREAU_CODE
0c60: 20 20 20 20 20 20 20 30 78 30 37 0a 23 64 65 66 0x07.#def
0c70: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 44 45 ine GSCIS_TAG_DE
0c80: 50 54 5f 43 4f 44 45 20 20 20 20 20 20 20 20 20 PT_CODE
0c90: 20 20 30 78 30 38 0a 23 64 65 66 69 6e 65 20 47 0x08.#define G
0ca0: 53 43 49 53 5f 54 41 47 5f 54 49 54 4c 45 20 20 SCIS_TAG_TITLE
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30 0x0
0cc0: 39 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 9.#define GSCIS_
0cd0: 54 41 47 5f 42 55 49 4c 44 49 4e 47 20 20 20 20 TAG_BUILDING
0ce0: 20 20 20 20 20 20 20 20 30 78 31 30 0a 23 64 65 0x10.#de
0cf0: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f fine GSCIS_TAG_O
0d00: 46 46 49 43 45 5f 41 44 44 52 31 20 20 20 20 20 FFICE_ADDR1
0d10: 20 20 20 30 78 31 31 0a 23 64 65 66 69 6e 65 20 0x11.#define
0d20: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 GSCIS_TAG_OFFICE
0d30: 5f 41 44 44 52 32 20 20 20 20 20 20 20 20 30 78 _ADDR2 0x
0d40: 31 32 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 12.#define GSCIS
0d50: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54 59 _TAG_OFFICE_CITY
0d60: 20 20 20 20 20 20 20 20 20 30 78 31 33 0a 23 64 0x13.#d
0d70: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f efine GSCIS_TAG_
0d80: 4f 46 46 49 43 45 5f 53 54 41 54 45 20 20 20 20 OFFICE_STATE
0d90: 20 20 20 20 30 78 31 34 0a 23 64 65 66 69 6e 65 0x14.#define
0da0: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 GSCIS_TAG_OFFIC
0db0: 45 5f 5a 49 50 20 20 20 20 20 20 20 20 20 20 30 E_ZIP 0
0dc0: 78 31 35 0a 23 64 65 66 69 6e 65 20 47 53 43 49 x15.#define GSCI
0dd0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 4f 55 S_TAG_OFFICE_COU
0de0: 4e 54 52 59 20 20 20 20 20 20 30 78 31 36 0a 23 NTRY 0x16.#
0df0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 define GSCIS_TAG
0e00: 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 20 20 20 _OFFICE_PHONE
0e10: 20 20 20 20 20 30 78 31 37 0a 23 64 65 66 69 6e 0x17.#defin
0e20: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 e GSCIS_TAG_OFFI
0e30: 43 45 5f 50 48 4f 4e 45 5f 45 58 54 20 20 20 20 CE_PHONE_EXT
0e40: 30 78 31 38 0a 23 64 65 66 69 6e 65 20 47 53 43 0x18.#define GSC
0e50: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 46 41 IS_TAG_OFFICE_FA
0e60: 58 20 20 20 20 20 20 20 20 20 20 30 78 31 39 0a X 0x19.
0e70: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 #define GSCIS_TA
0e80: 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c 20 20 G_OFFICE_EMAIL
0e90: 20 20 20 20 20 20 30 78 31 41 0a 23 64 65 66 69 0x1A.#defi
0ea0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 ne GSCIS_TAG_OFF
0eb0: 49 43 45 5f 52 4f 4f 4d 20 20 20 20 20 20 20 20 ICE_ROOM
0ec0: 20 30 78 31 42 0a 23 64 65 66 69 6e 65 20 47 53 0x1B.#define GS
0ed0: 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f 41 CIS_TAG_NONGOV_A
0ee0: 47 45 4e 43 59 20 20 20 20 20 20 20 30 78 31 43 GENCY 0x1C
0ef0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 .#define GSCIS_T
0f00: 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41 54 4f AG_SSN_DESIGNATO
0f10: 52 20 20 20 20 20 20 30 78 31 44 0a 0a 2f 2a 2a R 0x1D../**
0f20: 2a 20 50 49 49 20 2d 20 45 46 20 32 31 30 30 20 * PII - EF 2100
0f30: 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 ***/.#define GSC
0f40: 49 53 5f 54 41 47 5f 53 53 4e 20 20 20 20 20 20 IS_TAG_SSN
0f50: 20 20 20 20 20 20 20 20 20 20 20 30 78 32 30 0a 0x20.
0f60: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 #define GSCIS_TA
0f70: 47 5f 44 4f 42 20 20 20 20 20 20 20 20 20 20 20 G_DOB
0f80: 20 20 20 20 20 20 30 78 32 31 0a 23 64 65 66 69 0x21.#defi
0f90: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 47 45 4e ne GSCIS_TAG_GEN
0fa0: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 DER
0fb0: 20 30 78 32 32 0a 0a 2f 2a 2a 2a 20 4c 6f 67 69 0x22../*** Logi
0fc0: 6e 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 n Information -
0fd0: 45 46 20 34 30 30 30 20 2a 2a 2a 2f 0a 23 64 65 EF 4000 ***/.#de
0fe0: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 55 fine GSCIS_TAG_U
0ff0: 53 45 52 49 44 20 20 20 20 20 20 20 20 20 20 20 SERID
1000: 20 20 20 30 78 34 30 0a 23 64 65 66 69 6e 65 20 0x40.#define
1010: 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49 4e GSCIS_TAG_DOMAIN
1020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 0x
1030: 34 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 41.#define GSCIS
1040: 5f 54 41 47 5f 50 41 53 53 57 4f 52 44 20 20 20 _TAG_PASSWORD
1050: 20 20 20 20 20 20 20 20 20 30 78 34 32 0a 0a 2f 0x42../
1060: 2a 2a 2a 20 43 61 72 64 20 49 6e 66 6f 72 6d 61 *** Card Informa
1070: 74 69 6f 6e 20 2d 20 45 46 20 35 30 30 30 20 2a tion - EF 5000 *
1080: 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49 **/.#define GSCI
1090: 53 5f 54 41 47 5f 49 53 53 55 45 52 49 44 20 20 S_TAG_ISSUERID
10a0: 20 20 20 20 20 20 20 20 20 20 30 78 35 30 0a 23 0x50.#
10b0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 define GSCIS_TAG
10c0: 5f 53 45 52 4e 4f 20 20 20 20 20 20 20 20 20 20 _SERNO
10d0: 20 20 20 20 20 30 78 35 31 0a 23 64 65 66 69 6e 0x51.#defin
10e0: 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55 e GSCIS_TAG_ISSU
10f0: 45 5f 44 41 54 45 20 20 20 20 20 20 20 20 20 20 E_DATE
1100: 30 78 35 32 0a 23 64 65 66 69 6e 65 20 47 53 43 0x52.#define GSC
1110: 49 53 5f 54 41 47 5f 45 58 50 49 52 45 5f 44 41 IS_TAG_EXPIRE_DA
1120: 54 45 20 20 20 20 20 20 20 20 20 30 78 35 33 0a TE 0x53.
1130: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 #define GSCIS_TA
1140: 47 5f 43 41 52 44 5f 54 59 50 45 20 20 20 20 20 G_CARD_TYPE
1150: 20 20 20 20 20 20 30 78 35 34 0a 23 64 65 66 69 0x54.#defi
1160: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53 45 43 ne GSCIS_TAG_SEC
1170: 55 52 49 54 59 5f 43 4f 44 45 20 20 20 20 20 20 URITY_CODE
1180: 20 30 78 35 37 0a 23 64 65 66 69 6e 65 20 47 53 0x57.#define GS
1190: 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f 41 CIS_TAG_CARDID_A
11a0: 49 44 20 20 20 20 20 20 20 20 20 20 30 78 35 38 ID 0x58
11b0: 0a 0a 2f 2a 2a 2a 20 50 4b 49 20 49 6e 66 6f 72 ../*** PKI Infor
11c0: 6d 61 74 69 6f 6e 20 2d 20 45 46 20 37 30 30 30 mation - EF 7000
11d0: 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 ***/.#define GS
11e0: 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 CIS_TAG_CERTIFIC
11f0: 41 54 45 20 20 20 20 20 20 20 20 20 30 78 37 30 ATE 0x70
1200: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 .#define GSCIS_T
1210: 41 47 5f 43 45 52 54 5f 49 53 53 55 45 5f 44 41 AG_CERT_ISSUE_DA
1220: 54 45 20 20 20 20 20 30 78 37 31 0a 23 64 65 66 TE 0x71.#def
1230: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45 ine GSCIS_TAG_CE
1240: 52 54 5f 45 58 50 49 52 45 5f 44 41 54 45 20 20 RT_EXPIRE_DATE
1250: 20 20 30 78 37 32 0a 0a 2f 2a 2a 20 41 70 70 6c 0x72../** Appl
1260: 65 74 20 49 44 73 20 2a 2a 2f 0a 23 64 65 66 69 et IDs **/.#defi
1270: 6e 65 20 47 53 43 49 53 5f 41 49 44 5f 43 43 43 ne GSCIS_AID_CCC
1280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1290: 20 30 78 41 30 2c 20 30 78 30 30 2c 20 30 78 30 0xA0, 0x00, 0x0
12a0: 30 2c 20 30 78 30 31 2c 20 30 78 31 36 2c 20 30 0, 0x01, 0x16, 0
12b0: 78 44 42 2c 20 30 78 30 30 0a 0a 2f 2a 20 4d 61 xDB, 0x00../* Ma
12c0: 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 64 61 ximum size of da
12d0: 74 61 20 70 6f 72 74 69 6f 6e 20 6f 66 20 41 50 ta portion of AP
12e0: 44 55 73 20 2a 2f 0a 2f 2a 2a 20 44 6f 20 6e 6f DUs */./** Do no
12f0: 74 20 73 65 74 20 74 68 69 73 20 61 62 6f 76 65 t set this above
1300: 20 32 35 30 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 250 **/.#define
1310: 20 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 CACKEY_APDU_MTU
1320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 2
1330: 35 30 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 50..#ifdef CACKE
1340: 59 5f 44 45 42 55 47 0a 23 20 20 69 66 64 65 66 Y_DEBUG.# ifdef
1350: 20 48 41 56 45 5f 54 49 4d 45 5f 48 0a 23 20 20 HAVE_TIME_H.#
1360: 20 20 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e include <time.
1370: 68 3e 0a 73 74 61 74 69 63 20 74 69 6d 65 5f 74 h>.static time_t
1380: 20 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 73 74 cackey_debug_st
1390: 61 72 74 5f 74 69 6d 65 20 3d 20 30 3b 0a 23 20 art_time = 0;.#
13a0: 20 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 define CACKEY
13b0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 54 49 4d 45 _DEBUG_PRINTTIME
13c0: 20 7b 20 69 66 20 28 63 61 63 6b 65 79 5f 64 65 { if (cackey_de
13d0: 62 75 67 5f 73 74 61 72 74 5f 74 69 6d 65 20 3d bug_start_time =
13e0: 3d 20 30 29 20 7b 20 63 61 63 6b 65 79 5f 64 65 = 0) { cackey_de
13f0: 62 75 67 5f 73 74 61 72 74 5f 74 69 6d 65 20 3d bug_start_time =
1400: 20 74 69 6d 65 28 4e 55 4c 4c 29 3b 20 7d 3b 20 time(NULL); };
1410: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 fprintf(stderr,
1420: 22 5b 25 6c 75 5d 3a 20 22 2c 20 28 75 6e 73 69 "[%lu]: ", (unsi
1430: 67 6e 65 64 20 6c 6f 6e 67 29 20 28 74 69 6d 65 gned long) (time
1440: 28 4e 55 4c 4c 29 20 2d 20 63 61 63 6b 65 79 5f (NULL) - cackey_
1450: 64 65 62 75 67 5f 73 74 61 72 74 5f 74 69 6d 65 debug_start_time
1460: 29 29 3b 20 7d 0a 23 20 20 65 6c 73 65 0a 23 20 )); }.# else.#
1470: 20 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 define CACKEY
1480: 5f 44 45 42 55 47 5f 50 52 49 4e 54 54 49 4d 45 _DEBUG_PRINTTIME
1490: 20 2f 2a 2a 2f 0a 23 20 20 65 6e 64 69 66 0a 0a /**/.# endif..
14a0: 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 # define CACKEY
14b0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 78 2e _DEBUG_PRINTF(x.
14c0: 2e 2e 29 20 7b 20 43 41 43 4b 45 59 5f 44 45 42 ..) { CACKEY_DEB
14d0: 55 47 5f 50 52 49 4e 54 54 49 4d 45 3b 20 66 70 UG_PRINTTIME; fp
14e0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 rintf(stderr, "%
14f0: 73 28 29 3a 25 69 3a 20 22 2c 20 5f 5f 66 75 6e s():%i: ", __fun
1500: 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 c__, __LINE__);
1510: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 fprintf(stderr,
1520: 78 29 3b 20 66 70 72 69 6e 74 66 28 73 74 64 65 x); fprintf(stde
1530: 72 72 2c 20 22 5c 6e 22 29 3b 20 66 66 6c 75 73 rr, "\n"); fflus
1540: 68 28 73 74 64 65 72 72 29 3b 20 7d 0a 23 20 20 h(stderr); }.#
1550: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 define CACKEY_DE
1560: 42 55 47 5f 50 52 49 4e 54 42 55 46 28 66 2c 20 BUG_PRINTBUF(f,
1570: 78 2c 20 79 29 20 7b 20 75 6e 73 69 67 6e 65 64 x, y) { unsigned
1580: 20 63 68 61 72 20 2a 54 4d 50 42 55 46 3b 20 75 char *TMPBUF; u
1590: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 78 nsigned long idx
15a0: 3b 20 54 4d 50 42 55 46 20 3d 20 28 75 6e 73 69 ; TMPBUF = (unsi
15b0: 67 6e 65 64 20 63 68 61 72 20 2a 29 20 28 78 29 gned char *) (x)
15c0: 3b 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ; CACKEY_DEBUG_P
15d0: 52 49 4e 54 54 49 4d 45 3b 20 66 70 72 69 6e 74 RINTTIME; fprint
15e0: 66 28 73 74 64 65 72 72 2c 20 22 25 73 28 29 3a f(stderr, "%s():
15f0: 25 69 3a 20 25 73 20 20 28 25 73 2f 25 6c 75 20 %i: %s (%s/%lu
1600: 3d 20 7b 25 30 32 78 22 2c 20 5f 5f 66 75 6e 63 = {%02x", __func
1610: 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 2c 20 66 2c __, __LINE__, f,
1620: 20 23 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c #x, (unsigned l
1630: 6f 6e 67 29 20 28 79 29 2c 20 54 4d 50 42 55 46 ong) (y), TMPBUF
1640: 5b 30 5d 29 3b 20 66 6f 72 20 28 69 64 78 20 3d [0]); for (idx =
1650: 20 31 3b 20 69 64 78 20 3c 20 28 79 29 3b 20 69 1; idx < (y); i
1660: 64 78 2b 2b 29 20 7b 20 66 70 72 69 6e 74 66 28 dx++) { fprintf(
1670: 73 74 64 65 72 72 2c 20 22 2c 20 25 30 32 78 22 stderr, ", %02x"
1680: 2c 20 54 4d 50 42 55 46 5b 69 64 78 5d 29 3b 20 , TMPBUF[idx]);
1690: 7d 3b 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 }; fprintf(stder
16a0: 72 2c 20 22 7d 29 5c 6e 22 29 3b 20 66 66 6c 75 r, "})\n"); fflu
16b0: 73 68 28 73 74 64 65 72 72 29 3b 20 7d 0a 23 20 sh(stderr); }.#
16c0: 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 define CACKEY_D
16d0: 45 42 55 47 5f 50 45 52 52 4f 52 28 78 29 20 7b EBUG_PERROR(x) {
16e0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c fprintf(stderr,
16f0: 20 22 25 73 28 29 3a 25 69 3a 20 22 2c 20 5f 5f "%s():%i: ", __
1700: 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f func__, __LINE__
1710: 29 3b 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ); CACKEY_DEBUG_
1720: 50 52 49 4e 54 54 49 4d 45 3b 20 70 65 72 72 6f PRINTTIME; perro
1730: 72 28 78 29 3b 20 66 66 6c 75 73 68 28 73 74 64 r(x); fflush(std
1740: 65 72 72 29 3b 20 7d 0a 23 20 20 64 65 66 69 6e err); }.# defin
1750: 65 20 66 72 65 65 28 78 29 20 7b 20 43 41 43 4b e free(x) { CACK
1760: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1770: 22 46 52 45 45 28 25 70 29 20 28 25 73 29 22 2c "FREE(%p) (%s)",
1780: 20 78 2c 20 23 78 29 3b 20 66 72 65 65 28 78 29 x, #x); free(x)
1790: 3b 20 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 ; }..static void
17a0: 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 *CACKEY_DEBUG_F
17b0: 55 4e 43 5f 4d 41 4c 4c 4f 43 28 73 69 7a 65 5f UNC_MALLOC(size_
17c0: 74 20 73 69 7a 65 2c 20 63 6f 6e 73 74 20 63 68 t size, const ch
17d0: 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20 6c 69 ar *func, int li
17e0: 6e 65 29 20 7b 0a 09 76 6f 69 64 20 2a 72 65 74 ne) {..void *ret
17f0: 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20 val;...retval =
1800: 6d 61 6c 6c 6f 63 28 73 69 7a 65 29 3b 0a 0a 09 malloc(size);...
1810: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1820: 4e 54 54 49 4d 45 3b 0a 09 66 70 72 69 6e 74 66 NTTIME;..fprintf
1830: 28 73 74 64 65 72 72 2c 20 22 25 73 28 29 3a 25 (stderr, "%s():%
1840: 69 3a 20 22 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 i: ", func, line
1850: 29 3b 0a 09 66 70 72 69 6e 74 66 28 73 74 64 65 );..fprintf(stde
1860: 72 72 2c 20 22 4d 41 4c 4c 4f 43 28 29 20 3d 20 rr, "MALLOC() =
1870: 25 70 22 2c 20 72 65 74 76 61 6c 29 3b 0a 09 66 %p", retval);..f
1880: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 printf(stderr, "
1890: 5c 6e 22 29 3b 0a 09 66 66 6c 75 73 68 28 73 74 \n");..fflush(st
18a0: 64 65 72 72 29 3b 0a 0a 09 72 65 74 75 72 6e 28 derr);...return(
18b0: 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 retval);.}..stat
18c0: 69 63 20 76 6f 69 64 20 2a 43 41 43 4b 45 59 5f ic void *CACKEY_
18d0: 44 45 42 55 47 5f 46 55 4e 43 5f 52 45 41 4c 4c DEBUG_FUNC_REALL
18e0: 4f 43 28 76 6f 69 64 20 2a 70 74 72 2c 20 73 69 OC(void *ptr, si
18f0: 7a 65 5f 74 20 73 69 7a 65 2c 20 63 6f 6e 73 74 ze_t size, const
1900: 20 63 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 char *func, int
1910: 20 6c 69 6e 65 29 20 7b 0a 09 76 6f 69 64 20 2a line) {..void *
1920: 72 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c retval;...retval
1930: 20 3d 20 72 65 61 6c 6c 6f 63 28 70 74 72 2c 20 = realloc(ptr,
1940: 73 69 7a 65 29 3b 0a 0a 09 69 66 20 28 72 65 74 size);...if (ret
1950: 76 61 6c 20 21 3d 20 70 74 72 29 20 7b 0a 09 09 val != ptr) {...
1960: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1970: 4e 54 54 49 4d 45 3b 0a 09 09 66 70 72 69 6e 74 NTTIME;...fprint
1980: 66 28 73 74 64 65 72 72 2c 20 22 25 73 28 29 3a f(stderr, "%s():
1990: 25 69 3a 20 22 2c 20 66 75 6e 63 2c 20 6c 69 6e %i: ", func, lin
19a0: 65 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 73 74 e);...fprintf(st
19b0: 64 65 72 72 2c 20 22 52 45 41 4c 4c 4f 43 28 25 derr, "REALLOC(%
19c0: 70 29 20 3d 20 25 70 22 2c 20 70 74 72 2c 20 72 p) = %p", ptr, r
19d0: 65 74 76 61 6c 29 3b 0a 09 09 66 70 72 69 6e 74 etval);...fprint
19e0: 66 28 73 74 64 65 72 72 2c 20 22 5c 6e 22 29 3b f(stderr, "\n");
19f0: 0a 09 09 66 66 6c 75 73 68 28 73 74 64 65 72 72 ...fflush(stderr
1a00: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65 74 76 );..}...if (retv
1a10: 61 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 al == NULL) {...
1a20: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1a30: 4e 54 46 28 22 20 2a 2a 2a 20 45 52 52 4f 52 20 NTF(" *** ERROR
1a40: 2a 2a 2a 20 72 65 61 6c 6c 6f 63 20 72 65 74 75 *** realloc retu
1a50: 72 6e 65 64 20 4e 55 4c 4c 20 28 73 69 7a 65 20 rned NULL (size
1a60: 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e = %lu)", (unsign
1a70: 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65 29 3b 0a ed long) size);.
1a80: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 .}...return(retv
1a90: 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 al);.}..static c
1aa0: 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 har *CACKEY_DEBU
1ab0: 47 5f 46 55 4e 43 5f 53 54 52 44 55 50 28 63 6f G_FUNC_STRDUP(co
1ac0: 6e 73 74 20 63 68 61 72 20 2a 70 74 72 2c 20 63 nst char *ptr, c
1ad0: 6f 6e 73 74 20 63 68 61 72 20 2a 66 75 6e 63 2c onst char *func,
1ae0: 20 69 6e 74 20 6c 69 6e 65 29 20 7b 0a 09 63 68 int line) {..ch
1af0: 61 72 20 2a 72 65 74 76 61 6c 3b 0a 0a 09 72 65 ar *retval;...re
1b00: 74 76 61 6c 20 3d 20 73 74 72 64 75 70 28 70 74 tval = strdup(pt
1b10: 72 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 r);...CACKEY_DEB
1b20: 55 47 5f 50 52 49 4e 54 54 49 4d 45 3b 0a 09 66 UG_PRINTTIME;..f
1b30: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 printf(stderr, "
1b40: 25 73 28 29 3a 25 69 3a 20 22 2c 20 66 75 6e 63 %s():%i: ", func
1b50: 2c 20 6c 69 6e 65 29 3b 0a 09 66 70 72 69 6e 74 , line);..fprint
1b60: 66 28 73 74 64 65 72 72 2c 20 22 53 54 52 44 55 f(stderr, "STRDU
1b70: 50 5f 4d 41 4c 4c 4f 43 28 29 20 3d 20 25 70 22 P_MALLOC() = %p"
1b80: 2c 20 72 65 74 76 61 6c 29 3b 0a 09 66 70 72 69 , retval);..fpri
1b90: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 5c 6e 22 ntf(stderr, "\n"
1ba0: 29 3b 0a 09 66 66 6c 75 73 68 28 73 74 64 65 72 );..fflush(stder
1bb0: 72 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 r);...return(ret
1bc0: 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 val);.}..static
1bd0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43 4b const char *CACK
1be0: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 EY_DEBUG_FUNC_TA
1bf0: 47 5f 54 4f 5f 53 54 52 28 75 6e 73 69 67 6e 65 G_TO_STR(unsigne
1c00: 64 20 63 68 61 72 20 74 61 67 29 20 7b 0a 09 73 d char tag) {..s
1c10: 77 69 74 63 68 20 28 74 61 67 29 20 7b 0a 09 09 witch (tag) {...
1c20: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 case GSCIS_TAG_C
1c30: 41 52 44 49 44 3a 0a 09 09 09 72 65 74 75 72 6e ARDID:....return
1c40: 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 ("GSCIS_TAG_CARD
1c50: 49 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 ID");...case GSC
1c60: 49 53 5f 54 41 47 5f 43 43 43 5f 56 45 52 3a 0a IS_TAG_CCC_VER:.
1c70: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 ...return("GSCIS
1c80: 5f 54 41 47 5f 43 43 43 5f 56 45 52 22 29 3b 0a _TAG_CCC_VER");.
1c90: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 ..case GSCIS_TAG
1ca0: 5f 43 43 47 5f 56 45 52 3a 0a 09 09 09 72 65 74 _CCG_VER:....ret
1cb0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 urn("GSCIS_TAG_C
1cc0: 43 47 5f 56 45 52 22 29 3b 0a 09 09 63 61 73 65 CG_VER");...case
1cd0: 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55 GSCIS_TAG_CARDU
1ce0: 52 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 RL:....return("G
1cf0: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c SCIS_TAG_CARDURL
1d00: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 ");...case GSCIS
1d10: 5f 54 41 47 5f 50 4b 43 53 31 35 3a 0a 09 09 09 _TAG_PKCS15:....
1d20: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 return("GSCIS_TA
1d30: 47 5f 50 4b 43 53 31 35 22 29 3b 0a 09 09 63 61 G_PKCS15");...ca
1d40: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 52 45 47 se GSCIS_TAG_REG
1d50: 5f 44 41 54 41 5f 4d 4f 44 45 4c 3a 0a 09 09 09 _DATA_MODEL:....
1d60: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 return("GSCIS_TA
1d70: 47 5f 52 45 47 5f 44 41 54 41 5f 4d 4f 44 45 4c G_REG_DATA_MODEL
1d80: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 ");...case GSCIS
1d90: 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a _TAG_ACR_TABLE:.
1da0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 ...return("GSCIS
1db0: 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45 22 29 _TAG_ACR_TABLE")
1dc0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 ;...case GSCIS_T
1dd0: 41 47 5f 43 41 52 44 5f 41 50 44 55 3a 0a 09 09 AG_CARD_APDU:...
1de0: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 .return("GSCIS_T
1df0: 41 47 5f 43 41 52 44 5f 41 50 44 55 22 29 3b 0a AG_CARD_APDU");.
1e00: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 ..case GSCIS_TAG
1e10: 5f 52 45 44 49 52 45 43 54 49 4f 4e 3a 0a 09 09 _REDIRECTION:...
1e20: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 .return("GSCIS_T
1e30: 41 47 5f 52 45 44 49 52 45 43 54 49 4f 4e 22 29 AG_REDIRECTION")
1e40: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 ;...case GSCIS_T
1e50: 41 47 5f 43 54 3a 0a 09 09 09 72 65 74 75 72 6e AG_CT:....return
1e60: 28 22 47 53 43 49 53 5f 54 41 47 5f 43 54 22 29 ("GSCIS_TAG_CT")
1e70: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 ;...case GSCIS_T
1e80: 41 47 5f 53 54 3a 0a 09 09 09 72 65 74 75 72 6e AG_ST:....return
1e90: 28 22 47 53 43 49 53 5f 54 41 47 5f 53 54 22 29 ("GSCIS_TAG_ST")
1ea0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 ;...case GSCIS_T
1eb0: 41 47 5f 4e 45 58 54 43 43 43 3a 0a 09 09 09 72 AG_NEXTCCC:....r
1ec0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 eturn("GSCIS_TAG
1ed0: 5f 4e 45 58 54 43 43 43 22 29 3b 0a 09 09 63 61 _NEXTCCC");...ca
1ee0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 46 4e 41 se GSCIS_TAG_FNA
1ef0: 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 ME:....return("G
1f00: 53 43 49 53 5f 54 41 47 5f 46 4e 41 4d 45 22 29 SCIS_TAG_FNAME")
1f10: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 ;...case GSCIS_T
1f20: 41 47 5f 4d 4e 41 4d 45 3a 0a 09 09 09 72 65 74 AG_MNAME:....ret
1f30: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4d urn("GSCIS_TAG_M
1f40: 4e 41 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 47 NAME");...case G
1f50: 53 43 49 53 5f 54 41 47 5f 4c 4e 41 4d 45 3a 0a SCIS_TAG_LNAME:.
1f60: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 ...return("GSCIS
1f70: 5f 54 41 47 5f 4c 4e 41 4d 45 22 29 3b 0a 09 09 _TAG_LNAME");...
1f80: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53 case GSCIS_TAG_S
1f90: 55 46 46 49 58 3a 0a 09 09 09 72 65 74 75 72 6e UFFIX:....return
1fa0: 28 22 47 53 43 49 53 5f 54 41 47 5f 53 55 46 46 ("GSCIS_TAG_SUFF
1fb0: 49 58 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 IX");...case GSC
1fc0: 49 53 5f 54 41 47 5f 47 4f 56 54 5f 41 47 45 4e IS_TAG_GOVT_AGEN
1fd0: 43 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 CY:....return("G
1fe0: 53 43 49 53 5f 54 41 47 5f 47 4f 56 54 5f 41 47 SCIS_TAG_GOVT_AG
1ff0: 45 4e 43 59 22 29 3b 0a 09 09 63 61 73 65 20 47 ENCY");...case G
2000: 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 3a SCIS_TAG_BUREAU:
2010: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 ....return("GSCI
2020: 53 5f 54 41 47 5f 42 55 52 45 41 55 22 29 3b 0a S_TAG_BUREAU");.
2030: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 ..case GSCIS_TAG
2040: 5f 42 55 52 45 41 55 5f 43 4f 44 45 3a 0a 09 09 _BUREAU_CODE:...
2050: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 .return("GSCIS_T
2060: 41 47 5f 42 55 52 45 41 55 5f 43 4f 44 45 22 29 AG_BUREAU_CODE")
2070: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 ;...case GSCIS_T
2080: 41 47 5f 44 45 50 54 5f 43 4f 44 45 3a 0a 09 09 AG_DEPT_CODE:...
2090: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 .return("GSCIS_T
20a0: 41 47 5f 44 45 50 54 5f 43 4f 44 45 22 29 3b 0a AG_DEPT_CODE");.
20b0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 ..case GSCIS_TAG
20c0: 5f 54 49 54 4c 45 3a 0a 09 09 09 72 65 74 75 72 _TITLE:....retur
20d0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 54 49 54 n("GSCIS_TAG_TIT
20e0: 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 LE");...case GSC
20f0: 49 53 5f 54 41 47 5f 42 55 49 4c 44 49 4e 47 3a IS_TAG_BUILDING:
2100: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 ....return("GSCI
2110: 53 5f 54 41 47 5f 42 55 49 4c 44 49 4e 47 22 29 S_TAG_BUILDING")
2120: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 ;...case GSCIS_T
2130: 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 31 3a AG_OFFICE_ADDR1:
2140: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 ....return("GSCI
2150: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 S_TAG_OFFICE_ADD
2160: 52 31 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 R1");...case GSC
2170: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 IS_TAG_OFFICE_AD
2180: 44 52 32 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 DR2:....return("
2190: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 GSCIS_TAG_OFFICE
21a0: 5f 41 44 44 52 32 22 29 3b 0a 09 09 63 61 73 65 _ADDR2");...case
21b0: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 GSCIS_TAG_OFFIC
21c0: 45 5f 43 49 54 59 3a 0a 09 09 09 72 65 74 75 72 E_CITY:....retur
21d0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 n("GSCIS_TAG_OFF
21e0: 49 43 45 5f 43 49 54 59 22 29 3b 0a 09 09 63 61 ICE_CITY");...ca
21f0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 se GSCIS_TAG_OFF
2200: 49 43 45 5f 53 54 41 54 45 3a 0a 09 09 09 72 65 ICE_STATE:....re
2210: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f turn("GSCIS_TAG_
2220: 4f 46 46 49 43 45 5f 53 54 41 54 45 22 29 3b 0a OFFICE_STATE");.
2230: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 ..case GSCIS_TAG
2240: 5f 4f 46 46 49 43 45 5f 5a 49 50 3a 0a 09 09 09 _OFFICE_ZIP:....
2250: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 return("GSCIS_TA
2260: 47 5f 4f 46 46 49 43 45 5f 5a 49 50 22 29 3b 0a G_OFFICE_ZIP");.
2270: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 ..case GSCIS_TAG
2280: 5f 4f 46 46 49 43 45 5f 43 4f 55 4e 54 52 59 3a _OFFICE_COUNTRY:
2290: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 ....return("GSCI
22a0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 4f 55 S_TAG_OFFICE_COU
22b0: 4e 54 52 59 22 29 3b 0a 09 09 63 61 73 65 20 47 NTRY");...case G
22c0: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f SCIS_TAG_OFFICE_
22d0: 50 48 4f 4e 45 3a 0a 09 09 09 72 65 74 75 72 6e PHONE:....return
22e0: 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 ("GSCIS_TAG_OFFI
22f0: 43 45 5f 50 48 4f 4e 45 22 29 3b 0a 09 09 63 61 CE_PHONE");...ca
2300: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 se GSCIS_TAG_OFF
2310: 49 43 45 5f 50 48 4f 4e 45 5f 45 58 54 3a 0a 09 ICE_PHONE_EXT:..
2320: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f ..return("GSCIS_
2330: 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 TAG_OFFICE_PHONE
2340: 5f 45 58 54 22 29 3b 0a 09 09 63 61 73 65 20 47 _EXT");...case G
2350: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f SCIS_TAG_OFFICE_
2360: 46 41 58 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 FAX:....return("
2370: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 GSCIS_TAG_OFFICE
2380: 5f 46 41 58 22 29 3b 0a 09 09 63 61 73 65 20 47 _FAX");...case G
2390: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f SCIS_TAG_OFFICE_
23a0: 45 4d 41 49 4c 3a 0a 09 09 09 72 65 74 75 72 6e EMAIL:....return
23b0: 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 ("GSCIS_TAG_OFFI
23c0: 43 45 5f 45 4d 41 49 4c 22 29 3b 0a 09 09 63 61 CE_EMAIL");...ca
23d0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 se GSCIS_TAG_OFF
23e0: 49 43 45 5f 52 4f 4f 4d 3a 0a 09 09 09 72 65 74 ICE_ROOM:....ret
23f0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f urn("GSCIS_TAG_O
2400: 46 46 49 43 45 5f 52 4f 4f 4d 22 29 3b 0a 09 09 FFICE_ROOM");...
2410: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4e case GSCIS_TAG_N
2420: 4f 4e 47 4f 56 5f 41 47 45 4e 43 59 3a 0a 09 09 ONGOV_AGENCY:...
2430: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 .return("GSCIS_T
2440: 41 47 5f 4e 4f 4e 47 4f 56 5f 41 47 45 4e 43 59 AG_NONGOV_AGENCY
2450: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 ");...case GSCIS
2460: 5f 54 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41 _TAG_SSN_DESIGNA
2470: 54 4f 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 TOR:....return("
2480: 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 5f 44 45 GSCIS_TAG_SSN_DE
2490: 53 49 47 4e 41 54 4f 52 22 29 3b 0a 09 09 63 61 SIGNATOR");...ca
24a0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53 53 4e se GSCIS_TAG_SSN
24b0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 :....return("GSC
24c0: 49 53 5f 54 41 47 5f 53 53 4e 22 29 3b 0a 09 09 IS_TAG_SSN");...
24d0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 44 case GSCIS_TAG_D
24e0: 4f 42 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 OB:....return("G
24f0: 53 43 49 53 5f 54 41 47 5f 44 4f 42 22 29 3b 0a SCIS_TAG_DOB");.
2500: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 ..case GSCIS_TAG
2510: 5f 47 45 4e 44 45 52 3a 0a 09 09 09 72 65 74 75 _GENDER:....retu
2520: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 47 45 rn("GSCIS_TAG_GE
2530: 4e 44 45 52 22 29 3b 0a 09 09 63 61 73 65 20 47 NDER");...case G
2540: 53 43 49 53 5f 54 41 47 5f 55 53 45 52 49 44 3a SCIS_TAG_USERID:
2550: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 ....return("GSCI
2560: 53 5f 54 41 47 5f 55 53 45 52 49 44 22 29 3b 0a S_TAG_USERID");.
2570: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 ..case GSCIS_TAG
2580: 5f 44 4f 4d 41 49 4e 3a 0a 09 09 09 72 65 74 75 _DOMAIN:....retu
2590: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 44 4f rn("GSCIS_TAG_DO
25a0: 4d 41 49 4e 22 29 3b 0a 09 09 63 61 73 65 20 47 MAIN");...case G
25b0: 53 43 49 53 5f 54 41 47 5f 50 41 53 53 57 4f 52 SCIS_TAG_PASSWOR
25c0: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 D:....return("GS
25d0: 43 49 53 5f 54 41 47 5f 50 41 53 53 57 4f 52 44 CIS_TAG_PASSWORD
25e0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 ");...case GSCIS
25f0: 5f 54 41 47 5f 49 53 53 55 45 52 49 44 3a 0a 09 _TAG_ISSUERID:..
2600: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f ..return("GSCIS_
2610: 54 41 47 5f 49 53 53 55 45 52 49 44 22 29 3b 0a TAG_ISSUERID");.
2620: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 ..case GSCIS_TAG
2630: 5f 53 45 52 4e 4f 3a 0a 09 09 09 72 65 74 75 72 _SERNO:....retur
2640: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53 45 52 n("GSCIS_TAG_SER
2650: 4e 4f 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 NO");...case GSC
2660: 49 53 5f 54 41 47 5f 49 53 53 55 45 5f 44 41 54 IS_TAG_ISSUE_DAT
2670: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 E:....return("GS
2680: 43 49 53 5f 54 41 47 5f 49 53 53 55 45 5f 44 41 CIS_TAG_ISSUE_DA
2690: 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 TE");...case GSC
26a0: 49 53 5f 54 41 47 5f 45 58 50 49 52 45 5f 44 41 IS_TAG_EXPIRE_DA
26b0: 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 TE:....return("G
26c0: 53 43 49 53 5f 54 41 47 5f 45 58 50 49 52 45 5f SCIS_TAG_EXPIRE_
26d0: 44 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47 DATE");...case G
26e0: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 54 59 SCIS_TAG_CARD_TY
26f0: 50 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 PE:....return("G
2700: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 54 59 SCIS_TAG_CARD_TY
2710: 50 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 PE");...case GSC
2720: 49 53 5f 54 41 47 5f 53 45 43 55 52 49 54 59 5f IS_TAG_SECURITY_
2730: 43 4f 44 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 CODE:....return(
2740: 22 47 53 43 49 53 5f 54 41 47 5f 53 45 43 55 52 "GSCIS_TAG_SECUR
2750: 49 54 59 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61 ITY_CODE");...ca
2760: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 se GSCIS_TAG_CAR
2770: 44 49 44 5f 41 49 44 3a 0a 09 09 09 72 65 74 75 DID_AID:....retu
2780: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41 rn("GSCIS_TAG_CA
2790: 52 44 49 44 5f 41 49 44 22 29 3b 0a 09 09 63 61 RDID_AID");...ca
27a0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 se GSCIS_TAG_CER
27b0: 54 49 46 49 43 41 54 45 3a 0a 09 09 09 72 65 74 TIFICATE:....ret
27c0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 urn("GSCIS_TAG_C
27d0: 45 52 54 49 46 49 43 41 54 45 22 29 3b 0a 09 09 ERTIFICATE");...
27e0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 case GSCIS_TAG_C
27f0: 45 52 54 5f 49 53 53 55 45 5f 44 41 54 45 3a 0a ERT_ISSUE_DATE:.
2800: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 ...return("GSCIS
2810: 5f 54 41 47 5f 43 45 52 54 5f 49 53 53 55 45 5f _TAG_CERT_ISSUE_
2820: 44 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47 DATE");...case G
2830: 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 45 58 SCIS_TAG_CERT_EX
2840: 50 49 52 45 5f 44 41 54 45 3a 0a 09 09 09 72 65 PIRE_DATE:....re
2850: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f turn("GSCIS_TAG_
2860: 43 45 52 54 5f 45 58 50 49 52 45 5f 44 41 54 45 CERT_EXPIRE_DATE
2870: 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 ");..}...return(
2880: 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 "UNKNOWN");.}..s
2890: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 tatic const char
28a0: 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 *CACKEY_DEBUG_F
28b0: 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f UNC_SCARDERR_TO_
28c0: 53 54 52 28 4c 4f 4e 47 20 72 65 74 63 6f 64 65 STR(LONG retcode
28d0: 29 20 7b 0a 09 73 77 69 74 63 68 20 28 72 65 74 ) {..switch (ret
28e0: 63 6f 64 65 29 20 7b 0a 09 09 63 61 73 65 20 53 code) {...case S
28f0: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 3a 0a CARD_S_SUCCESS:.
2900: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 ...return("SCARD
2910: 5f 53 5f 53 55 43 43 45 53 53 22 29 3b 0a 09 09 _S_SUCCESS");...
2920: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 43 41 4e case SCARD_E_CAN
2930: 43 45 4c 4c 45 44 3a 0a 09 09 09 72 65 74 75 72 CELLED:....retur
2940: 6e 28 22 53 43 41 52 44 5f 45 5f 43 41 4e 43 45 n("SCARD_E_CANCE
2950: 4c 4c 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 LLED");...case S
2960: 43 41 52 44 5f 45 5f 43 41 4e 54 5f 44 49 53 50 CARD_E_CANT_DISP
2970: 4f 53 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 OSE:....return("
2980: 53 43 41 52 44 5f 45 5f 43 41 4e 54 5f 44 49 53 SCARD_E_CANT_DIS
2990: 50 4f 53 45 22 29 3b 0a 09 09 63 61 73 65 20 53 POSE");...case S
29a0: 43 41 52 44 5f 45 5f 49 4e 53 55 46 46 49 43 49 CARD_E_INSUFFICI
29b0: 45 4e 54 5f 42 55 46 46 45 52 3a 0a 09 09 09 72 ENT_BUFFER:....r
29c0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 eturn("SCARD_E_I
29d0: 4e 53 55 46 46 49 43 49 45 4e 54 5f 42 55 46 46 NSUFFICIENT_BUFF
29e0: 45 52 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 ER");...case SCA
29f0: 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 41 54 52 RD_E_INVALID_ATR
2a00: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 :....return("SCA
2a10: 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 41 54 52 RD_E_INVALID_ATR
2a20: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 ");...case SCARD
2a30: 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c _E_INVALID_HANDL
2a40: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 E:....return("SC
2a50: 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41 ARD_E_INVALID_HA
2a60: 4e 44 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 53 NDLE");...case S
2a70: 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 50 CARD_E_INVALID_P
2a80: 41 52 41 4d 45 54 45 52 3a 0a 09 09 09 72 65 74 ARAMETER:....ret
2a90: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 urn("SCARD_E_INV
2aa0: 41 4c 49 44 5f 50 41 52 41 4d 45 54 45 52 22 29 ALID_PARAMETER")
2ab0: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 ;...case SCARD_E
2ac0: 5f 49 4e 56 41 4c 49 44 5f 54 41 52 47 45 54 3a _INVALID_TARGET:
2ad0: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 ....return("SCAR
2ae0: 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 54 41 52 47 D_E_INVALID_TARG
2af0: 45 54 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 ET");...case SCA
2b00: 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 56 41 4c RD_E_INVALID_VAL
2b10: 55 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 UE:....return("S
2b20: 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 56 CARD_E_INVALID_V
2b30: 41 4c 55 45 22 29 3b 0a 09 09 63 61 73 65 20 53 ALUE");...case S
2b40: 43 41 52 44 5f 45 5f 4e 4f 5f 4d 45 4d 4f 52 59 CARD_E_NO_MEMORY
2b50: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 :....return("SCA
2b60: 52 44 5f 45 5f 4e 4f 5f 4d 45 4d 4f 52 59 22 29 RD_E_NO_MEMORY")
2b70: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 ;...case SCARD_E
2b80: 5f 55 4e 4b 4e 4f 57 4e 5f 52 45 41 44 45 52 3a _UNKNOWN_READER:
2b90: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 ....return("SCAR
2ba0: 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 52 45 41 44 D_E_UNKNOWN_READ
2bb0: 45 52 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 ER");...case SCA
2bc0: 52 44 5f 45 5f 54 49 4d 45 4f 55 54 3a 0a 09 09 RD_E_TIMEOUT:...
2bd0: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 .return("SCARD_E
2be0: 5f 54 49 4d 45 4f 55 54 22 29 3b 0a 09 09 63 61 _TIMEOUT");...ca
2bf0: 73 65 20 53 43 41 52 44 5f 45 5f 53 48 41 52 49 se SCARD_E_SHARI
2c00: 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 3a 0a 09 09 NG_VIOLATION:...
2c10: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 .return("SCARD_E
2c20: 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 _SHARING_VIOLATI
2c30: 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 ON");...case SCA
2c40: 52 44 5f 45 5f 4e 4f 5f 53 4d 41 52 54 43 41 52 RD_E_NO_SMARTCAR
2c50: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 D:....return("SC
2c60: 41 52 44 5f 45 5f 4e 4f 5f 53 4d 41 52 54 43 41 ARD_E_NO_SMARTCA
2c70: 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 RD");...case SCA
2c80: 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 43 41 52 RD_E_UNKNOWN_CAR
2c90: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 D:....return("SC
2ca0: 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 43 41 ARD_E_UNKNOWN_CA
2cb0: 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 RD");...case SCA
2cc0: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 RD_E_PROTO_MISMA
2cd0: 54 43 48 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 TCH:....return("
2ce0: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 SCARD_E_PROTO_MI
2cf0: 53 4d 41 54 43 48 22 29 3b 0a 09 09 63 61 73 65 SMATCH");...case
2d00: 20 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 52 45 41 SCARD_E_NOT_REA
2d10: 44 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 DY:....return("S
2d20: 43 41 52 44 5f 45 5f 4e 4f 54 5f 52 45 41 44 59 CARD_E_NOT_READY
2d30: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 ");...case SCARD
2d40: 5f 45 5f 53 59 53 54 45 4d 5f 43 41 4e 43 45 4c _E_SYSTEM_CANCEL
2d50: 4c 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 LED:....return("
2d60: 53 43 41 52 44 5f 45 5f 53 59 53 54 45 4d 5f 43 SCARD_E_SYSTEM_C
2d70: 41 4e 43 45 4c 4c 45 44 22 29 3b 0a 09 09 63 61 ANCELLED");...ca
2d80: 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 54 se SCARD_E_NOT_T
2d90: 52 41 4e 53 41 43 54 45 44 3a 0a 09 09 09 72 65 RANSACTED:....re
2da0: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f turn("SCARD_E_NO
2db0: 54 5f 54 52 41 4e 53 41 43 54 45 44 22 29 3b 0a T_TRANSACTED");.
2dc0: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 52 ..case SCARD_E_R
2dd0: 45 41 44 45 52 5f 55 4e 41 56 41 49 4c 41 42 4c EADER_UNAVAILABL
2de0: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 E:....return("SC
2df0: 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 41 ARD_E_READER_UNA
2e00: 56 41 49 4c 41 42 4c 45 22 29 3b 0a 09 09 63 61 VAILABLE");...ca
2e10: 73 65 20 53 43 41 52 44 5f 57 5f 55 4e 53 55 50 se SCARD_W_UNSUP
2e20: 50 4f 52 54 45 44 5f 43 41 52 44 3a 0a 09 09 09 PORTED_CARD:....
2e30: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f return("SCARD_W_
2e40: 55 4e 53 55 50 50 4f 52 54 45 44 5f 43 41 52 44 UNSUPPORTED_CARD
2e50: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 ");...case SCARD
2e60: 5f 57 5f 55 4e 52 45 53 50 4f 4e 53 49 56 45 5f _W_UNRESPONSIVE_
2e70: 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 CARD:....return(
2e80: 22 53 43 41 52 44 5f 57 5f 55 4e 52 45 53 50 4f "SCARD_W_UNRESPO
2e90: 4e 53 49 56 45 5f 43 41 52 44 22 29 3b 0a 09 09 NSIVE_CARD");...
2ea0: 63 61 73 65 20 53 43 41 52 44 5f 57 5f 55 4e 50 case SCARD_W_UNP
2eb0: 4f 57 45 52 45 44 5f 43 41 52 44 3a 0a 09 09 09 OWERED_CARD:....
2ec0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f return("SCARD_W_
2ed0: 55 4e 50 4f 57 45 52 45 44 5f 43 41 52 44 22 29 UNPOWERED_CARD")
2ee0: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 57 ;...case SCARD_W
2ef0: 5f 52 45 53 45 54 5f 43 41 52 44 3a 0a 09 09 09 _RESET_CARD:....
2f00: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f return("SCARD_W_
2f10: 52 45 53 45 54 5f 43 41 52 44 22 29 3b 0a 09 09 RESET_CARD");...
2f20: 63 61 73 65 20 53 43 41 52 44 5f 57 5f 52 45 4d case SCARD_W_REM
2f30: 4f 56 45 44 5f 43 41 52 44 3a 0a 09 09 09 72 65 OVED_CARD:....re
2f40: 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 52 45 turn("SCARD_W_RE
2f50: 4d 4f 56 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 MOVED_CARD");...
2f60: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 50 43 49 case SCARD_E_PCI
2f70: 5f 54 4f 4f 5f 53 4d 41 4c 4c 3a 0a 09 09 09 72 _TOO_SMALL:....r
2f80: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 50 eturn("SCARD_E_P
2f90: 43 49 5f 54 4f 4f 5f 53 4d 41 4c 4c 22 29 3b 0a CI_TOO_SMALL");.
2fa0: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 52 ..case SCARD_E_R
2fb0: 45 41 44 45 52 5f 55 4e 53 55 50 50 4f 52 54 45 EADER_UNSUPPORTE
2fc0: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 D:....return("SC
2fd0: 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 53 ARD_E_READER_UNS
2fe0: 55 50 50 4f 52 54 45 44 22 29 3b 0a 09 09 63 61 UPPORTED");...ca
2ff0: 73 65 20 53 43 41 52 44 5f 45 5f 44 55 50 4c 49 se SCARD_E_DUPLI
3000: 43 41 54 45 5f 52 45 41 44 45 52 3a 0a 09 09 09 CATE_READER:....
3010: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f return("SCARD_E_
3020: 44 55 50 4c 49 43 41 54 45 5f 52 45 41 44 45 52 DUPLICATE_READER
3030: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 ");...case SCARD
3040: 5f 45 5f 43 41 52 44 5f 55 4e 53 55 50 50 4f 52 _E_CARD_UNSUPPOR
3050: 54 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 TED:....return("
3060: 53 43 41 52 44 5f 45 5f 43 41 52 44 5f 55 4e 53 SCARD_E_CARD_UNS
3070: 55 50 50 4f 52 54 45 44 22 29 3b 0a 09 09 63 61 UPPORTED");...ca
3080: 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 45 se SCARD_E_NO_SE
3090: 52 56 49 43 45 3a 0a 09 09 09 72 65 74 75 72 6e RVICE:....return
30a0: 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 45 52 ("SCARD_E_NO_SER
30b0: 56 49 43 45 22 29 3b 0a 09 09 63 61 73 65 20 53 VICE");...case S
30c0: 43 41 52 44 5f 45 5f 53 45 52 56 49 43 45 5f 53 CARD_E_SERVICE_S
30d0: 54 4f 50 50 45 44 3a 0a 09 09 09 72 65 74 75 72 TOPPED:....retur
30e0: 6e 28 22 53 43 41 52 44 5f 45 5f 53 45 52 56 49 n("SCARD_E_SERVI
30f0: 43 45 5f 53 54 4f 50 50 45 44 22 29 3b 0a 09 09 CE_STOPPED");...
3100: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 55 4e 53 case SCARD_E_UNS
3110: 55 50 50 4f 52 54 45 44 5f 46 45 41 54 55 52 45 UPPORTED_FEATURE
3120: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 :....return("SCA
3130: 52 44 5f 45 5f 55 4e 53 55 50 50 4f 52 54 45 44 RD_E_UNSUPPORTED
3140: 5f 46 45 41 54 55 52 45 22 29 3b 0a 23 69 66 64 _FEATURE");.#ifd
3150: 65 66 20 53 43 41 52 44 5f 57 5f 49 4e 53 45 52 ef SCARD_W_INSER
3160: 54 45 44 5f 43 41 52 44 0a 09 09 63 61 73 65 20 TED_CARD...case
3170: 53 43 41 52 44 5f 57 5f 49 4e 53 45 52 54 45 44 SCARD_W_INSERTED
3180: 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e _CARD:....return
3190: 28 22 53 43 41 52 44 5f 57 5f 49 4e 53 45 52 54 ("SCARD_W_INSERT
31a0: 45 44 5f 43 41 52 44 22 29 3b 0a 23 65 6e 64 69 ED_CARD");.#endi
31b0: 66 0a 23 69 66 64 65 66 20 53 43 41 52 44 5f 45 f.#ifdef SCARD_E
31c0: 5f 4e 4f 5f 52 45 41 44 45 52 53 5f 41 56 41 49 _NO_READERS_AVAI
31d0: 4c 41 42 4c 45 0a 09 09 63 61 73 65 20 53 43 41 LABLE...case SCA
31e0: 52 44 5f 45 5f 4e 4f 5f 52 45 41 44 45 52 53 5f RD_E_NO_READERS_
31f0: 41 56 41 49 4c 41 42 4c 45 3a 0a 09 09 09 72 65 AVAILABLE:....re
3200: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f turn("SCARD_E_NO
3210: 5f 52 45 41 44 45 52 53 5f 41 56 41 49 4c 41 42 _READERS_AVAILAB
3220: 4c 45 22 29 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a LE");.#endif..}.
3230: 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 ..return("UNKNOW
3240: 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 N");.}..static c
3250: 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43 4b 45 onst char *CACKE
3260: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a Y_DEBUG_FUNC_OBJ
3270: 49 44 5f 54 4f 5f 53 54 52 28 75 69 6e 74 31 36 ID_TO_STR(uint16
3280: 5f 74 20 6f 62 6a 69 64 29 20 7b 0a 09 73 77 69 _t objid) {..swi
3290: 74 63 68 20 28 6f 62 6a 69 64 29 20 7b 0a 09 09 tch (objid) {...
32a0: 63 61 73 65 20 30 78 32 30 30 30 3a 0a 09 09 09 case 0x2000:....
32b0: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 return("CACKEY_T
32c0: 4c 56 5f 4f 42 4a 49 44 5f 47 45 4e 45 52 41 4c LV_OBJID_GENERAL
32d0: 49 4e 46 4f 22 29 3b 0a 09 09 63 61 73 65 20 30 INFO");...case 0
32e0: 78 32 31 30 30 3a 0a 09 09 09 72 65 74 75 72 6e x2100:....return
32f0: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a ("CACKEY_TLV_OBJ
3300: 49 44 5f 50 52 4f 50 45 52 53 4f 4e 41 4c 49 4e ID_PROPERSONALIN
3310: 46 4f 22 29 3b 0a 09 09 63 61 73 65 20 30 78 33 FO");...case 0x3
3320: 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 000:....return("
3330: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 CACKEY_TLV_OBJID
3340: 5f 41 43 43 45 53 53 43 4f 4e 54 52 4f 4c 22 29 _ACCESSCONTROL")
3350: 3b 0a 09 09 63 61 73 65 20 30 78 34 30 30 30 3a ;...case 0x4000:
3360: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b ....return("CACK
3370: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 4c 4f 47 EY_TLV_OBJID_LOG
3380: 49 4e 22 29 3b 0a 09 09 63 61 73 65 20 30 78 35 IN");...case 0x5
3390: 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 000:....return("
33a0: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 CACKEY_TLV_OBJID
33b0: 5f 43 41 52 44 49 4e 46 4f 22 29 3b 0a 09 09 63 _CARDINFO");...c
33c0: 61 73 65 20 30 78 36 30 30 30 3a 0a 09 09 09 72 ase 0x6000:....r
33d0: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c eturn("CACKEY_TL
33e0: 56 5f 4f 42 4a 49 44 5f 42 49 4f 4d 45 54 52 49 V_OBJID_BIOMETRI
33f0: 43 53 22 29 3b 0a 09 09 63 61 73 65 20 30 78 37 CS");...case 0x7
3400: 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 000:....return("
3410: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 CACKEY_TLV_OBJID
3420: 5f 44 49 47 49 54 41 4c 53 49 47 43 45 52 54 22 _DIGITALSIGCERT"
3430: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32 30 30 );...case 0x0200
3440: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 :....return("CAC
3450: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 KEY_TLV_OBJID_CA
3460: 43 5f 50 45 52 53 4f 4e 22 29 3b 0a 09 09 63 61 C_PERSON");...ca
3470: 73 65 20 30 78 30 32 30 32 3a 0a 09 09 09 72 65 se 0x0202:....re
3480: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 turn("CACKEY_TLV
3490: 5f 4f 42 4a 49 44 5f 43 41 43 5f 42 45 4e 45 46 _OBJID_CAC_BENEF
34a0: 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20 30 78 ITS");...case 0x
34b0: 30 32 30 33 3a 0a 09 09 09 72 65 74 75 72 6e 28 0203:....return(
34c0: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 "CACKEY_TLV_OBJI
34d0: 44 5f 43 41 43 5f 4f 54 48 45 52 42 45 4e 45 46 D_CAC_OTHERBENEF
34e0: 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20 30 78 ITS");...case 0x
34f0: 30 32 30 31 3a 0a 09 09 09 72 65 74 75 72 6e 28 0201:....return(
3500: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 "CACKEY_TLV_OBJI
3510: 44 5f 43 41 43 5f 50 45 52 53 4f 4e 4e 45 4c 22 D_CAC_PERSONNEL"
3520: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32 46 45 );...case 0x02FE
3530: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 :....return("CAC
3540: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 KEY_TLV_OBJID_CA
3550: 43 5f 50 4b 49 43 45 52 54 22 29 3b 0a 09 7d 0a C_PKICERT");..}.
3560: 09 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e 4f ...return("UNKNO
3570: 57 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 WN");.}..static
3580: 63 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43 4b const char *CACK
3590: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 50 EY_DEBUG_FUNC_AP
35a0: 50 54 59 50 45 5f 54 4f 5f 53 54 52 28 75 69 6e PTYPE_TO_STR(uin
35b0: 74 38 5f 74 20 61 70 70 74 79 70 65 29 20 7b 0a t8_t apptype) {.
35c0: 09 73 77 69 74 63 68 20 28 61 70 70 74 79 70 65 .switch (apptype
35d0: 29 20 7b 0a 09 09 63 61 73 65 20 30 78 30 30 3a ) {...case 0x00:
35e0: 0a 09 09 09 72 65 74 75 72 6e 28 22 4e 4f 4e 45 ....return("NONE
35f0: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 31 3a ");...case 0x01:
3600: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b ....return("CACK
3610: 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52 EY_TLV_APP_GENER
3620: 49 43 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 IC");...case 0x0
3630: 32 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 2:....return("CA
3640: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 CKEY_TLV_APP_SKI
3650: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 33 3a ");...case 0x03:
3660: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b ....return("CACK
3670: 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52 EY_TLV_APP_GENER
3680: 49 43 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f IC | CACKEY_TLV_
3690: 41 50 50 5f 53 4b 49 22 29 3b 0a 09 09 63 61 73 APP_SKI");...cas
36a0: 65 20 30 78 30 34 3a 0a 09 09 09 72 65 74 75 72 e 0x04:....retur
36b0: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 n("CACKEY_TLV_AP
36c0: 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 P_PKI");...case
36d0: 30 78 30 35 3a 0a 09 09 09 72 65 74 75 72 6e 28 0x05:....return(
36e0: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f "CACKEY_TLV_APP_
36f0: 47 45 4e 45 52 49 43 20 7c 20 43 41 43 4b 45 59 GENERIC | CACKEY
3700: 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a _TLV_APP_PKI");.
3710: 09 09 63 61 73 65 20 30 78 30 36 3a 0a 09 09 09 ..case 0x06:....
3720: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 return("CACKEY_T
3730: 4c 56 5f 41 50 50 5f 53 4b 49 20 7c 20 43 41 43 LV_APP_SKI | CAC
3740: 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22 KEY_TLV_APP_PKI"
3750: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 37 3a 0a );...case 0x07:.
3760: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 ...return("CACKE
3770: 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 Y_TLV_APP_GENERI
3780: 43 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 C | CACKEY_TLV_A
3790: 50 50 5f 53 4b 49 20 7c 20 43 41 43 4b 45 59 5f PP_SKI | CACKEY_
37a0: 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09 TLV_APP_PKI");..
37b0: 7d 0a 0a 09 72 65 74 75 72 6e 28 22 49 4e 56 41 }...return("INVA
37c0: 4c 49 44 22 29 3b 0a 7d 0a 0a 23 20 20 64 65 66 LID");.}..# def
37d0: 69 6e 65 20 6d 61 6c 6c 6f 63 28 78 29 20 43 41 ine malloc(x) CA
37e0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f CKEY_DEBUG_FUNC_
37f0: 4d 41 4c 4c 4f 43 28 78 2c 20 5f 5f 66 75 6e 63 MALLOC(x, __func
3800: 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 20 __, __LINE__).#
3810: 20 64 65 66 69 6e 65 20 72 65 61 6c 6c 6f 63 28 define realloc(
3820: 78 2c 20 79 29 20 43 41 43 4b 45 59 5f 44 45 42 x, y) CACKEY_DEB
3830: 55 47 5f 46 55 4e 43 5f 52 45 41 4c 4c 4f 43 28 UG_FUNC_REALLOC(
3840: 78 2c 20 79 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 x, y, __func__,
3850: 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 20 20 69 66 64 __LINE__).# ifd
3860: 65 66 20 73 74 72 64 75 70 0a 23 20 20 20 20 75 ef strdup.# u
3870: 6e 64 65 66 20 73 74 72 64 75 70 0a 23 20 20 65 ndef strdup.# e
3880: 6e 64 69 66 0a 23 20 20 64 65 66 69 6e 65 20 73 ndif.# define s
3890: 74 72 64 75 70 28 78 29 20 43 41 43 4b 45 59 5f trdup(x) CACKEY_
38a0: 44 45 42 55 47 5f 46 55 4e 43 5f 53 54 52 44 55 DEBUG_FUNC_STRDU
38b0: 50 28 78 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f P(x, __func__, _
38c0: 5f 4c 49 4e 45 5f 5f 29 0a 23 65 6c 73 65 0a 23 _LINE__).#else.#
38d0: 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f define CACKEY_
38e0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 78 2e 2e DEBUG_PRINTF(x..
38f0: 2e 29 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 69 6e .) /**/.# defin
3900: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 e CACKEY_DEBUG_P
3910: 52 49 4e 54 42 55 46 28 66 2c 20 78 2c 20 79 29 RINTBUF(f, x, y)
3920: 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 69 6e 65 20 /**/.# define
3930: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 45 52 CACKEY_DEBUG_PER
3940: 52 4f 52 28 78 29 20 2f 2a 2a 2f 0a 23 20 20 64 ROR(x) /**/.# d
3950: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 efine CACKEY_DEB
3960: 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 UG_FUNC_TAG_TO_S
3970: 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53 TR(x) "DEBUG_DIS
3980: 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65 ABLED".# define
3990: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 CACKEY_DEBUG_FU
39a0: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 NC_SCARDERR_TO_S
39b0: 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53 TR(x) "DEBUG_DIS
39c0: 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65 ABLED".# define
39d0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 CACKEY_DEBUG_FU
39e0: 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28 NC_OBJID_TO_STR(
39f0: 78 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c x) "DEBUG_DISABL
3a00: 45 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43 41 ED".# define CA
3a10: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f CKEY_DEBUG_FUNC_
3a20: 41 50 50 54 59 50 45 5f 54 4f 5f 53 54 52 28 78 APPTYPE_TO_STR(x
3a30: 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c 45 ) "DEBUG_DISABLE
3a40: 44 22 0a 23 65 6e 64 69 66 0a 0a 73 74 72 75 63 D".#endif..struc
3a50: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 t cackey_pcsc_id
3a60: 65 6e 74 69 74 79 20 7b 0a 09 75 6e 73 69 67 6e entity {..unsign
3a70: 65 64 20 63 68 61 72 20 61 70 70 6c 65 74 5b 37 ed char applet[7
3a80: 5d 3b 0a 09 75 69 6e 74 31 36 5f 74 20 66 69 6c ];..uint16_t fil
3a90: 65 3b 0a 0a 09 73 69 7a 65 5f 74 20 63 65 72 74 e;...size_t cert
3aa0: 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 75 6e ificate_len;..un
3ab0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 signed char *cer
3ac0: 74 69 66 69 63 61 74 65 3b 0a 0a 09 73 73 69 7a tificate;...ssiz
3ad0: 65 5f 74 20 6b 65 79 73 69 7a 65 3b 0a 7d 3b 0a e_t keysize;.};.
3ae0: 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 .struct cackey_i
3af0: 64 65 6e 74 69 74 79 20 7b 0a 09 73 74 72 75 63 dentity {..struc
3b00: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 t cackey_pcsc_id
3b10: 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65 entity *pcsc_ide
3b20: 6e 74 69 74 79 3b 0a 0a 09 43 4b 5f 41 54 54 52 ntity;...CK_ATTR
3b30: 49 42 55 54 45 20 2a 61 74 74 72 69 62 75 74 65 IBUTE *attribute
3b40: 73 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 61 74 74 s;..CK_ULONG att
3b50: 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 0a 7d ributes_count;.}
3b60: 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 ;..struct cackey
3b70: 5f 73 65 73 73 69 6f 6e 20 7b 0a 09 69 6e 74 20 _session {..int
3b80: 61 63 74 69 76 65 3b 0a 0a 09 43 4b 5f 53 4c 4f active;...CK_SLO
3b90: 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 0a 09 43 T_ID slotID;...C
3ba0: 4b 5f 53 54 41 54 45 20 73 74 61 74 65 3b 0a 09 K_STATE state;..
3bb0: 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73 3b 0a CK_FLAGS flags;.
3bc0: 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 65 76 69 .CK_ULONG ulDevi
3bd0: 63 65 45 72 72 6f 72 3b 0a 09 43 4b 5f 56 4f 49 ceError;..CK_VOI
3be0: 44 5f 50 54 52 20 70 41 70 70 6c 69 63 61 74 69 D_PTR pApplicati
3bf0: 6f 6e 3b 0a 09 43 4b 5f 4e 4f 54 49 46 59 20 4e on;..CK_NOTIFY N
3c00: 6f 74 69 66 79 3b 0a 0a 09 73 74 72 75 63 74 20 otify;...struct
3c10: 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 cackey_identity
3c20: 2a 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e *identities;..un
3c30: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e signed long iden
3c40: 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09 tities_count;...
3c50: 69 6e 74 20 73 65 61 72 63 68 5f 61 63 74 69 76 int search_activ
3c60: 65 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 e;..CK_ATTRIBUTE
3c70: 5f 50 54 52 20 73 65 61 72 63 68 5f 71 75 65 72 _PTR search_quer
3c80: 79 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 73 65 61 y;..CK_ULONG sea
3c90: 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b rch_query_count;
3ca0: 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 ..unsigned long
3cb0: 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64 3b 0a search_curr_id;.
3cc0: 0a 09 69 6e 74 20 73 69 67 6e 5f 61 63 74 69 76 ..int sign_activ
3cd0: 65 3b 0a 09 43 4b 5f 4d 45 43 48 41 4e 49 53 4d e;..CK_MECHANISM
3ce0: 5f 54 59 50 45 20 73 69 67 6e 5f 6d 65 63 68 61 _TYPE sign_mecha
3cf0: 6e 69 73 6d 3b 0a 09 43 4b 5f 42 59 54 45 5f 50 nism;..CK_BYTE_P
3d00: 54 52 20 73 69 67 6e 5f 62 75 66 3b 0a 09 75 6e TR sign_buf;..un
3d10: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69 67 6e signed long sign
3d20: 5f 62 75 66 6c 65 6e 3b 0a 09 75 6e 73 69 67 6e _buflen;..unsign
3d30: 65 64 20 6c 6f 6e 67 20 73 69 67 6e 5f 62 75 66 ed long sign_buf
3d40: 75 73 65 64 3b 0a 09 73 74 72 75 63 74 20 63 61 used;..struct ca
3d50: 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 73 ckey_identity *s
3d60: 69 67 6e 5f 69 64 65 6e 74 69 74 79 3b 0a 0a 09 ign_identity;...
3d70: 69 6e 74 20 64 65 63 72 79 70 74 5f 61 63 74 69 int decrypt_acti
3d80: 76 65 3b 0a 09 43 4b 5f 4d 45 43 48 41 4e 49 53 ve;..CK_MECHANIS
3d90: 4d 5f 54 59 50 45 20 64 65 63 72 79 70 74 5f 6d M_TYPE decrypt_m
3da0: 65 63 68 61 6e 69 73 6d 3b 0a 09 43 4b 5f 56 4f echanism;..CK_VO
3db0: 49 44 5f 50 54 52 20 64 65 63 72 79 70 74 5f 6d ID_PTR decrypt_m
3dc0: 65 63 68 5f 70 61 72 6d 3b 0a 09 43 4b 5f 55 4c ech_parm;..CK_UL
3dd0: 4f 4e 47 20 64 65 63 72 79 70 74 5f 6d 65 63 68 ONG decrypt_mech
3de0: 5f 70 61 72 6d 6c 65 6e 3b 0a 09 73 74 72 75 63 _parmlen;..struc
3df0: 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 t cackey_identit
3e00: 79 20 2a 64 65 63 72 79 70 74 5f 69 64 65 6e 74 y *decrypt_ident
3e10: 69 74 79 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 ity;.};..struct
3e20: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 7b 0a 09 69 cackey_slot {..i
3e30: 6e 74 20 61 63 74 69 76 65 3b 0a 0a 09 63 68 61 nt active;...cha
3e40: 72 20 2a 70 63 73 63 5f 72 65 61 64 65 72 3b 0a r *pcsc_reader;.
3e50: 0a 09 69 6e 74 20 70 63 73 63 5f 63 61 72 64 5f ..int pcsc_card_
3e60: 63 6f 6e 6e 65 63 74 65 64 3b 0a 09 53 43 41 52 connected;..SCAR
3e70: 44 48 41 4e 44 4c 45 20 70 63 73 63 5f 63 61 72 DHANDLE pcsc_car
3e80: 64 3b 0a 0a 09 69 6e 74 20 74 72 61 6e 73 61 63 d;...int transac
3e90: 74 69 6f 6e 5f 64 65 70 74 68 3b 0a 09 69 6e 74 tion_depth;..int
3ea0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 transaction_nee
3eb0: 64 5f 68 77 5f 6c 6f 63 6b 3b 0a 0a 09 69 6e 74 d_hw_lock;...int
3ec0: 20 73 6c 6f 74 5f 72 65 73 65 74 3b 0a 0a 09 43 slot_reset;...C
3ed0: 4b 5f 46 4c 41 47 53 20 74 6f 6b 65 6e 5f 66 6c K_FLAGS token_fl
3ee0: 61 67 73 3b 0a 0a 09 75 6e 73 69 67 6e 65 64 20 ags;...unsigned
3ef0: 63 68 61 72 20 2a 6c 61 62 65 6c 3b 0a 0a 09 44 char *label;...D
3f00: 57 4f 52 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a 7d WORD protocol;.}
3f10: 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20 ;..typedef enum
3f20: 7b 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 {..CACKEY_TLV_AP
3f30: 50 5f 47 45 4e 45 52 49 43 20 3d 20 30 78 30 31 P_GENERIC = 0x01
3f40: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 ,..CACKEY_TLV_AP
3f50: 50 5f 53 4b 49 20 20 20 20 20 3d 20 30 78 30 32 P_SKI = 0x02
3f60: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 ,..CACKEY_TLV_AP
3f70: 50 5f 50 4b 49 20 20 20 20 20 3d 20 30 78 30 34 P_PKI = 0x04
3f80: 0a 7d 20 63 61 63 6b 65 79 5f 74 6c 76 5f 61 70 .} cackey_tlv_ap
3f90: 70 74 79 70 65 3b 0a 0a 74 79 70 65 64 65 66 20 ptype;..typedef
3fa0: 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 54 enum {..CACKEY_T
3fb0: 4c 56 5f 4f 42 4a 49 44 5f 47 45 4e 45 52 41 4c LV_OBJID_GENERAL
3fc0: 49 4e 46 4f 20 20 20 20 20 20 20 3d 20 30 78 32 INFO = 0x2
3fd0: 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 000,..CACKEY_TLV
3fe0: 5f 4f 42 4a 49 44 5f 50 52 4f 50 45 52 53 4f 4e _OBJID_PROPERSON
3ff0: 41 4c 49 4e 46 4f 20 20 20 3d 20 30 78 32 31 30 ALINFO = 0x210
4000: 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 0,..CACKEY_TLV_O
4010: 42 4a 49 44 5f 41 43 43 45 53 53 43 4f 4e 54 52 BJID_ACCESSCONTR
4020: 4f 4c 20 20 20 20 20 3d 20 30 78 33 30 30 30 2c OL = 0x3000,
4030: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a ..CACKEY_TLV_OBJ
4040: 49 44 5f 4c 4f 47 49 4e 20 20 20 20 20 20 20 20 ID_LOGIN
4050: 20 20 20 20 20 3d 20 30 78 34 30 30 30 2c 0a 09 = 0x4000,..
4060: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 CACKEY_TLV_OBJID
4070: 5f 43 41 52 44 49 4e 46 4f 20 20 20 20 20 20 20 _CARDINFO
4080: 20 20 20 3d 20 30 78 35 30 30 30 2c 0a 09 43 41 = 0x5000,..CA
4090: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 42 CKEY_TLV_OBJID_B
40a0: 49 4f 4d 45 54 52 49 43 53 20 20 20 20 20 20 20 IOMETRICS
40b0: 20 3d 20 30 78 36 30 30 30 2c 0a 09 43 41 43 4b = 0x6000,..CACK
40c0: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 44 49 47 EY_TLV_OBJID_DIG
40d0: 49 54 41 4c 53 49 47 43 45 52 54 20 20 20 20 3d ITALSIGCERT =
40e0: 20 30 78 37 30 30 30 2c 0a 09 43 41 43 4b 45 59 0x7000,..CACKEY
40f0: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 _TLV_OBJID_CAC_P
4100: 45 52 53 4f 4e 20 20 20 20 20 20 20 20 3d 20 30 ERSON = 0
4110: 78 30 32 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 x0200,..CACKEY_T
4120: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 42 45 4e LV_OBJID_CAC_BEN
4130: 45 46 49 54 53 20 20 20 20 20 20 3d 20 30 78 30 EFITS = 0x0
4140: 32 30 32 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 202,..CACKEY_TLV
4150: 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f 54 48 45 52 _OBJID_CAC_OTHER
4160: 42 45 4e 45 46 49 54 53 20 3d 20 30 78 30 32 30 BENEFITS = 0x020
4170: 33 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 3,..CACKEY_TLV_O
4180: 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e 4e BJID_CAC_PERSONN
4190: 45 4c 20 20 20 20 20 3d 20 30 78 30 32 30 31 2c EL = 0x0201,
41a0: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a ..CACKEY_TLV_OBJ
41b0: 49 44 5f 43 41 43 5f 50 4b 49 43 45 52 54 20 20 ID_CAC_PKICERT
41c0: 20 20 20 20 20 3d 20 30 78 30 32 46 45 0a 7d 20 = 0x02FE.}
41d0: 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 cackey_tlv_objec
41e0: 74 69 64 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e tid;..typedef en
41f0: 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 50 43 53 um {..CACKEY_PCS
4200: 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 C_S_TOKENPRESENT
4210: 20 20 20 20 3d 20 31 2c 0a 09 43 41 43 4b 45 59 = 1,..CACKEY
4220: 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 _PCSC_S_OK
4230: 20 20 20 20 20 20 20 20 3d 20 30 2c 0a 09 43 41 = 0,..CA
4240: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 CKEY_PCSC_E_GENE
4250: 52 49 43 20 20 20 20 20 20 20 20 20 3d 20 2d 31 RIC = -1
4260: 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 ,..CACKEY_PCSC_E
4270: 5f 42 41 44 50 49 4e 20 20 20 20 20 20 20 20 20 _BADPIN
4280: 20 3d 20 2d 32 2c 0a 09 43 41 43 4b 45 59 5f 50 = -2,..CACKEY_P
4290: 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 20 20 20 20 CSC_E_LOCKED
42a0: 20 20 20 20 20 20 3d 20 2d 33 2c 0a 09 43 41 43 = -3,..CAC
42b0: 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c KEY_PCSC_E_NEEDL
42c0: 4f 47 49 4e 20 20 20 20 20 20 20 3d 20 2d 34 2c OGIN = -4,
42d0: 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f ..CACKEY_PCSC_E_
42e0: 54 4f 4b 45 4e 41 42 53 45 4e 54 20 20 20 20 20 TOKENABSENT
42f0: 3d 20 2d 36 2c 0a 09 43 41 43 4b 45 59 5f 50 43 = -6,..CACKEY_PC
4300: 53 43 5f 45 5f 52 45 54 52 59 20 20 20 20 20 20 SC_E_RETRY
4310: 20 20 20 20 20 3d 20 2d 37 0a 7d 20 63 61 63 6b = -7.} cack
4320: 65 79 5f 72 65 74 3b 0a 0a 73 74 72 75 63 74 20 ey_ret;..struct
4330: 63 61 63 6b 65 79 5f 74 6c 76 5f 63 61 72 64 75 cackey_tlv_cardu
4340: 72 6c 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 rl {..unsigned c
4350: 68 61 72 20 20 20 20 20 20 20 20 72 69 64 5b 35 har rid[5
4360: 5d 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76 5f 61 ];..cackey_tlv_a
4370: 70 70 74 79 70 65 20 20 20 61 70 70 74 79 70 65 pptype apptype
4380: 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 ;..cackey_tlv_ob
4390: 6a 65 63 74 69 64 20 20 6f 62 6a 65 63 74 69 64 jectid objectid
43a0: 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 ;..cackey_tlv_ob
43b0: 6a 65 63 74 69 64 20 20 61 70 70 69 64 3b 0a 09 jectid appid;..
43c0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 20 20 unsigned char
43d0: 20 20 20 20 20 70 69 6e 69 64 3b 0a 7d 3b 0a 0a pinid;.};..
43e0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c struct cackey_tl
43f0: 76 5f 65 6e 74 69 74 79 3b 0a 73 74 72 75 63 74 v_entity;.struct
4400: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 cackey_tlv_enti
4410: 74 79 20 7b 0a 09 75 69 6e 74 38 5f 74 20 74 61 ty {..uint8_t ta
4420: 67 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 67 74 g;..size_t lengt
4430: 68 3b 0a 0a 09 75 6e 69 6f 6e 20 7b 0a 09 09 76 h;...union {...v
4440: 6f 69 64 20 2a 76 61 6c 75 65 3b 0a 09 09 73 74 oid *value;...st
4450: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f ruct cackey_tlv_
4460: 63 61 72 64 75 72 6c 20 2a 76 61 6c 75 65 5f 63 cardurl *value_c
4470: 61 72 64 75 72 6c 3b 0a 09 09 75 69 6e 74 38 5f ardurl;...uint8_
4480: 74 20 76 61 6c 75 65 5f 62 79 74 65 3b 0a 09 7d t value_byte;..}
4490: 3b 0a 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 ;...struct cacke
44a0: 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 5f 6e y_tlv_entity *_n
44b0: 65 78 74 3b 0a 7d 3b 0a 0a 2f 2a 20 43 41 43 4b ext;.};../* CACK
44c0: 45 59 20 47 6c 6f 62 61 6c 20 48 61 6e 64 6c 65 EY Global Handle
44d0: 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 s */.static void
44e0: 20 2a 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b *cackey_biglock
44f0: 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20 = NULL;.static
4500: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 65 struct cackey_se
4510: 73 73 69 6f 6e 20 63 61 63 6b 65 79 5f 73 65 73 ssion cackey_ses
4520: 73 69 6f 6e 73 5b 31 32 38 5d 3b 0a 73 74 61 74 sions[128];.stat
4530: 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 ic struct cackey
4540: 5f 73 6c 6f 74 20 63 61 63 6b 65 79 5f 73 6c 6f _slot cackey_slo
4550: 74 73 5b 31 32 38 5d 3b 0a 73 74 61 74 69 63 20 ts[128];.static
4560: 69 6e 74 20 63 61 63 6b 65 79 5f 69 6e 69 74 69 int cackey_initi
4570: 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 73 74 61 74 alized = 0;.stat
4580: 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 62 69 ic int cackey_bi
4590: 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d 20 30 3b 0a glock_init = 0;.
45a0: 43 4b 5f 43 5f 49 4e 49 54 49 41 4c 49 5a 45 5f CK_C_INITIALIZE_
45b0: 41 52 47 53 20 63 61 63 6b 65 79 5f 61 72 67 73 ARGS cackey_args
45c0: 3b 0a 0a 2f 2a 20 50 43 53 43 20 47 6c 6f 62 61 ;../* PCSC Globa
45d0: 6c 20 48 61 6e 64 6c 65 73 20 2a 2f 0a 73 74 61 l Handles */.sta
45e0: 74 69 63 20 4c 50 53 43 41 52 44 43 4f 4e 54 45 tic LPSCARDCONTE
45f0: 58 54 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 XT cackey_pcsc_h
4600: 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 73 andle = NULL;..s
4610: 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 6c tatic unsigned l
4620: 6f 6e 67 20 63 61 63 6b 65 79 5f 67 65 74 76 65 ong cackey_getve
4630: 72 73 69 6f 6e 28 76 6f 69 64 29 20 7b 0a 09 73 rsion(void) {..s
4640: 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 6c tatic unsigned l
4650: 6f 6e 67 20 72 65 74 76 61 6c 20 3d 20 32 35 35 ong retval = 255
4660: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 ;..unsigned long
4670: 20 6d 61 6a 6f 72 20 3d 20 30 3b 0a 09 75 6e 73 major = 0;..uns
4680: 69 67 6e 65 64 20 6c 6f 6e 67 20 6d 69 6e 6f 72 igned long minor
4690: 20 3d 20 30 3b 0a 09 63 68 61 72 20 2a 6d 61 6a = 0;..char *maj
46a0: 6f 72 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b 0a 09 or_str = NULL;..
46b0: 63 68 61 72 20 2a 6d 69 6e 6f 72 5f 73 74 72 20 char *minor_str
46c0: 3d 20 4e 55 4c 4c 3b 0a 0a 09 43 41 43 4b 45 59 = NULL;...CACKEY
46d0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 _DEBUG_PRINTF("C
46e0: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 alled.");...if (
46f0: 72 65 74 76 61 6c 20 21 3d 20 32 35 35 29 20 7b retval != 255) {
4700: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
4710: 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e PRINTF("Returnin
4720: 67 20 30 78 25 6c 78 20 28 63 61 63 68 65 64 29 g 0x%lx (cached)
4730: 2e 22 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 .", retval);....
4740: 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a return(retval);.
4750: 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20 30 3b .}...retval = 0;
4760: 0a 0a 23 69 66 64 65 66 20 50 41 43 4b 41 47 45 ..#ifdef PACKAGE
4770: 5f 56 45 52 53 49 4f 4e 0a 20 20 20 20 20 20 20 _VERSION.
4780: 20 6d 61 6a 6f 72 5f 73 74 72 20 3d 20 50 41 43 major_str = PAC
4790: 4b 41 47 45 5f 56 45 52 53 49 4f 4e 3b 0a 09 69 KAGE_VERSION;..i
47a0: 66 20 28 6d 61 6a 6f 72 5f 73 74 72 29 20 7b 0a f (major_str) {.
47b0: 09 20 20 20 20 20 20 20 20 6d 61 6a 6f 72 20 3d . major =
47c0: 20 73 74 72 74 6f 75 6c 28 6d 61 6a 6f 72 5f 73 strtoul(major_s
47d0: 74 72 2c 20 26 6d 69 6e 6f 72 5f 73 74 72 2c 20 tr, &minor_str,
47e0: 31 30 29 3b 0a 0a 09 09 69 66 20 28 6d 69 6e 6f 10);....if (mino
47f0: 72 5f 73 74 72 29 20 7b 0a 09 09 09 6d 69 6e 6f r_str) {....mino
4800: 72 20 3d 20 73 74 72 74 6f 75 6c 28 6d 69 6e 6f r = strtoul(mino
4810: 72 5f 73 74 72 20 2b 20 31 2c 20 4e 55 4c 4c 2c r_str + 1, NULL,
4820: 20 31 30 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 10);...}..}...r
4830: 65 74 76 61 6c 20 3d 20 28 6d 61 6a 6f 72 20 3c etval = (major <
4840: 3c 20 31 36 29 20 7c 20 28 6d 69 6e 6f 72 20 3c < 16) | (minor <
4850: 3c 20 38 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 < 8);.#endif...C
4860: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
4870: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 78 TF("Returning 0x
4880: 25 6c 78 22 2c 20 72 65 74 76 61 6c 29 3b 0a 0a %lx", retval);..
4890: 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b .return(retval);
48a0: 0a 7d 0a 0a 2f 2a 20 50 43 2f 53 43 20 52 65 6c .}../* PC/SC Rel
48b0: 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 73 20 2a ated Functions *
48c0: 2f 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 /./*. * SYNPOSIS
48d0: 0a 20 2a 20 20 20 20 20 76 6f 69 64 20 63 61 63 . * void cac
48e0: 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e key_slots_discon
48f0: 6e 65 63 74 5f 61 6c 6c 28 76 6f 69 64 29 3b 0a nect_all(void);.
4900: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a *. * ARGUMENTS.
4910: 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 * None. *.
4920: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 * RETURN VALUE.
4930: 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a * None. *. *
4940: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 NOTES. * Th
4950: 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 69 73 63 is function disc
4960: 6f 6e 6e 65 63 74 73 20 66 72 6f 6d 20 61 6c 6c onnects from all
4970: 20 63 61 72 64 73 2e 0a 20 2a 0a 20 2a 2f 0a 73 cards.. *. */.s
4980: 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 tatic void cacke
4990: 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 y_slots_disconne
49a0: 63 74 5f 61 6c 6c 28 76 6f 69 64 29 20 7b 0a 09 ct_all(void) {..
49b0: 75 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 0a 09 uint32_t idx;...
49c0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
49d0: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a NTF("Called.");.
49e0: 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 ..for (idx = 0;
49f0: 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 idx < (sizeof(ca
4a00: 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 ckey_slots) / si
4a10: 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 zeof(cackey_slot
4a20: 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b s[0])); idx++) {
4a30: 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c ...if (cackey_sl
4a40: 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 63 61 ots[idx].pcsc_ca
4a50: 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a rd_connected) {.
4a60: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
4a70: 50 52 49 4e 54 46 28 22 53 43 61 72 64 44 69 73 PRINTF("SCardDis
4a80: 63 6f 6e 6e 65 63 74 28 25 6c 75 29 20 63 61 6c connect(%lu) cal
4a90: 6c 65 64 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 led", (unsigned
4aa0: 6c 6f 6e 67 29 20 69 64 78 29 3b 0a 0a 09 09 09 long) idx);.....
4ab0: 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 SCardDisconnect(
4ac0: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 cackey_slots[idx
4ad0: 5d 2e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 ].pcsc_card, SCA
4ae0: 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a RD_LEAVE_CARD);.
4af0: 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 ..}....if (cacke
4b00: 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 y_slots[idx].lab
4b10: 65 6c 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 el) {....free(ca
4b20: 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e ckey_slots[idx].
4b30: 6c 61 62 65 6c 29 3b 0a 0a 09 09 09 63 61 63 6b label);.....cack
4b40: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 ey_slots[idx].la
4b50: 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a bel = NULL;...}.
4b60: 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b ...cackey_slots[
4b70: 69 64 78 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 idx].pcsc_card_c
4b80: 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09 09 onnected = 0;...
4b90: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 cackey_slots[idx
4ba0: 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 ].transaction_de
4bb0: 70 74 68 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 pth = 0;...cacke
4bc0: 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 y_slots[idx].tra
4bd0: 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 nsaction_need_hw
4be0: 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 0a 09 09 69 66 _lock = 0;....if
4bf0: 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 (cackey_slots[i
4c00: 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 dx].active) {...
4c10: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
4c20: 49 4e 54 46 28 22 4d 61 72 6b 69 6e 67 20 61 63 INTF("Marking ac
4c30: 74 69 76 65 20 73 6c 6f 74 20 25 6c 75 20 61 73 tive slot %lu as
4c40: 20 62 65 69 6e 67 20 72 65 73 65 74 22 2c 20 28 being reset", (
4c50: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 unsigned long) i
4c60: 64 78 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b dx);...}....cack
4c70: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 73 6c ey_slots[idx].sl
4c80: 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 7d ot_reset = 1;..}
4c90: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
4ca0: 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e PRINTF("Returnin
4cb0: 67 22 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d g");...return;.}
4cc0: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 ../*. * SYNPOSIS
4cd0: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 . * cackey_r
4ce0: 65 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 et cackey_pcsc_c
4cf0: 6f 6e 6e 65 63 74 28 76 6f 69 64 29 3b 0a 20 2a onnect(void);. *
4d00: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a . * ARGUMENTS. *
4d10: 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 None. *. *
4d20: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 RETURN VALUE. *
4d30: 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f CACKEY_PCSC_
4d40: 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 S_OK On
4d50: 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 success. * C
4d60: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e ACKEY_PCSC_E_GEN
4d70: 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 ERIC On error
4d80: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 . *. * NOTES. *
4d90: 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f This functio
4da0: 6e 20 63 6f 6e 6e 65 63 74 73 20 74 6f 20 74 68 n connects to th
4db0: 65 20 50 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69 e PC/SC Connecti
4dc0: 6f 6e 20 4d 61 6e 61 67 65 72 20 61 6e 64 20 75 on Manager and u
4dd0: 70 64 61 74 65 73 20 74 68 65 0a 20 2a 20 20 20 pdates the. *
4de0: 20 20 67 6c 6f 62 61 6c 20 68 61 6e 64 6c 65 2e global handle.
4df0: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 . *. */.static c
4e00: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 ackey_ret cackey
4e10: 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 76 6f _pcsc_connect(vo
4e20: 69 64 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 id) {..LONG scar
4e30: 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 d_est_context_re
4e40: 74 3b 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 t;.#ifdef HAVE_S
4e50: 43 41 52 44 49 53 56 41 4c 49 44 43 4f 4e 54 45 CARDISVALIDCONTE
4e60: 58 54 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 69 XT..LONG scard_i
4e70: 73 76 61 6c 69 64 5f 72 65 74 3b 0a 23 65 6e 64 svalid_ret;.#end
4e80: 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 if...CACKEY_DEBU
4e90: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 G_PRINTF("Called
4ea0: 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 .");...if (cacke
4eb0: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 3d y_pcsc_handle ==
4ec0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 NULL) {...cacke
4ed0: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 y_pcsc_handle =
4ee0: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 malloc(sizeof(*c
4ef0: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c ackey_pcsc_handl
4f00: 65 29 29 3b 0a 09 09 69 66 20 28 63 61 63 6b 65 e));...if (cacke
4f10: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 3d y_pcsc_handle ==
4f20: 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b NULL) {....CACK
4f30: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
4f40: 22 43 61 6c 6c 20 74 6f 20 6d 61 6c 6c 6f 63 28 "Call to malloc(
4f50: 29 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e ) failed, return
4f60: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 ing in failure")
4f70: 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f ;.....cackey_slo
4f80: 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c ts_disconnect_al
4f90: 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 l();.....return(
4fa0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 CACKEY_PCSC_E_GE
4fb0: 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 43 NERIC);...}....C
4fc0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
4fd0: 54 46 28 22 53 43 61 72 64 45 73 74 61 62 6c 69 TF("SCardEstabli
4fe0: 73 68 43 6f 6e 74 65 78 74 28 29 20 63 61 6c 6c shContext() call
4ff0: 65 64 22 29 3b 0a 09 09 73 63 61 72 64 5f 65 73 ed");...scard_es
5000: 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 3d 20 t_context_ret =
5010: 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f SCardEstablishCo
5020: 6e 74 65 78 74 28 53 43 41 52 44 5f 53 43 4f 50 ntext(SCARD_SCOP
5030: 45 5f 53 59 53 54 45 4d 2c 20 4e 55 4c 4c 2c 20 E_SYSTEM, NULL,
5040: 4e 55 4c 4c 2c 20 63 61 63 6b 65 79 5f 70 63 73 NULL, cackey_pcs
5050: 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 69 66 20 c_handle);...if
5060: 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 (scard_est_conte
5070: 78 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f xt_ret != SCARD_
5080: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 S_SUCCESS) {....
5090: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
50a0: 4e 54 46 28 22 43 61 6c 6c 20 74 6f 20 53 43 61 NTF("Call to SCa
50b0: 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 rdEstablishConte
50c0: 78 74 20 66 61 69 6c 65 64 20 28 72 65 74 75 72 xt failed (retur
50d0: 6e 65 64 20 25 73 2f 25 6c 69 29 2c 20 72 65 74 ned %s/%li), ret
50e0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 urning in failur
50f0: 65 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 e", CACKEY_DEBUG
5100: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 _FUNC_SCARDERR_T
5110: 4f 5f 53 54 52 28 73 63 61 72 64 5f 65 73 74 5f O_STR(scard_est_
5120: 63 6f 6e 74 65 78 74 5f 72 65 74 29 2c 20 28 6c context_ret), (l
5130: 6f 6e 67 29 20 73 63 61 72 64 5f 65 73 74 5f 63 ong) scard_est_c
5140: 6f 6e 74 65 78 74 5f 72 65 74 29 3b 0a 0a 09 09 ontext_ret);....
5150: 09 66 72 65 65 28 63 61 63 6b 65 79 5f 70 63 73 .free(cackey_pcs
5160: 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 09 63 61 c_handle);....ca
5170: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 ckey_pcsc_handle
5180: 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 63 61 63 = NULL;.....cac
5190: 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e key_slots_discon
51a0: 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 nect_all();.....
51b0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 return(CACKEY_PC
51c0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 SC_E_GENERIC);..
51d0: 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20 48 41 .}..}..#ifdef HA
51e0: 56 45 5f 53 43 41 52 44 49 53 56 41 4c 49 44 43 VE_SCARDISVALIDC
51f0: 4f 4e 54 45 58 54 0a 09 43 41 43 4b 45 59 5f 44 ONTEXT..CACKEY_D
5200: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 EBUG_PRINTF("SCa
5210: 72 64 49 73 56 61 6c 69 64 43 6f 6e 74 65 78 74 rdIsValidContext
5220: 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09 73 63 () called");..sc
5230: 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 20 ard_isvalid_ret
5240: 3d 20 53 43 61 72 64 49 73 56 61 6c 69 64 43 6f = SCardIsValidCo
5250: 6e 74 65 78 74 28 2a 63 61 63 6b 65 79 5f 70 63 ntext(*cackey_pc
5260: 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 69 66 20 sc_handle);..if
5270: 28 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 (scard_isvalid_r
5280: 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 et != SCARD_S_SU
5290: 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43 4b 45 CCESS) {...CACKE
52a0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
52b0: 48 61 6e 64 6c 65 20 68 61 73 20 62 65 63 6f 6d Handle has becom
52c0: 65 20 69 6e 76 61 6c 69 64 20 28 53 43 61 72 64 e invalid (SCard
52d0: 49 73 56 61 6c 69 64 43 6f 6e 74 65 78 74 20 3d IsValidContext =
52e0: 20 25 73 2f 25 6c 69 29 2c 20 74 72 79 69 6e 67 %s/%li), trying
52f0: 20 74 6f 20 72 65 2d 65 73 74 61 62 6c 69 73 68 to re-establish
5300: 2e 2e 2e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 ...", CACKEY_DEB
5310: 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 UG_FUNC_SCARDERR
5320: 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 69 73 _TO_STR(scard_is
5330: 76 61 6c 69 64 5f 72 65 74 29 2c 20 28 6c 6f 6e valid_ret), (lon
5340: 67 29 20 73 63 61 72 64 5f 69 73 76 61 6c 69 64 g) scard_isvalid
5350: 5f 72 65 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 _ret);....CACKEY
5360: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 _DEBUG_PRINTF("S
5370: 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e CardEstablishCon
5380: 74 65 78 74 28 29 20 63 61 6c 6c 65 64 22 29 3b text() called");
5390: 0a 09 09 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e ...scard_est_con
53a0: 74 65 78 74 5f 72 65 74 20 3d 20 53 43 61 72 64 text_ret = SCard
53b0: 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 EstablishContext
53c0: 28 53 43 41 52 44 5f 53 43 4f 50 45 5f 53 59 53 (SCARD_SCOPE_SYS
53d0: 54 45 4d 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c TEM, NULL, NULL,
53e0: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e cackey_pcsc_han
53f0: 64 6c 65 29 3b 0a 09 09 69 66 20 28 73 63 61 72 dle);...if (scar
5400: 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 d_est_context_re
5410: 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 t != SCARD_S_SUC
5420: 43 45 53 53 29 20 7b 0a 09 09 09 43 41 43 4b 45 CESS) {....CACKE
5430: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
5440: 43 61 6c 6c 20 74 6f 20 53 43 61 72 64 45 73 74 Call to SCardEst
5450: 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 20 66 61 ablishContext fa
5460: 69 6c 65 64 20 28 72 65 74 75 72 6e 65 64 20 25 iled (returned %
5470: 73 2f 25 6c 69 29 2c 20 72 65 74 75 72 6e 69 6e s/%li), returnin
5480: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 2c 20 43 g in failure", C
5490: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 ACKEY_DEBUG_FUNC
54a0: 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 _SCARDERR_TO_STR
54b0: 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 (scard_est_conte
54c0: 78 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 xt_ret), (long)
54d0: 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 scard_est_contex
54e0: 74 5f 72 65 74 29 3b 0a 0a 09 09 09 66 72 65 65 t_ret);.....free
54f0: 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e (cackey_pcsc_han
5500: 64 6c 65 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f dle);....cackey_
5510: 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 pcsc_handle = NU
5520: 4c 4c 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 LL;.....cackey_s
5530: 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f lots_disconnect_
5540: 61 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75 72 all();.....retur
5550: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f n(CACKEY_PCSC_E_
5560: 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 GENERIC);...}...
5570: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
5580: 49 4e 54 46 28 22 48 61 6e 64 6c 65 20 68 61 73 INTF("Handle has
5590: 20 62 65 65 6e 20 72 65 2d 65 73 74 61 62 6c 69 been re-establi
55a0: 73 68 65 64 22 29 3b 0a 09 7d 0a 23 65 6e 64 69 shed");..}.#endi
55b0: 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 f...CACKEY_DEBUG
55c0: 5f 50 52 49 4e 54 46 28 22 53 75 63 65 73 73 66 _PRINTF("Sucessf
55d0: 75 6c 6c 79 20 63 6f 6e 6e 65 63 74 65 64 20 74 ully connected t
55e0: 6f 20 50 43 2f 53 43 2c 20 72 65 74 75 72 6e 69 o PC/SC, returni
55f0: 6e 67 20 69 6e 20 73 75 63 63 65 73 73 22 29 3b ng in success");
5600: 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 ...return(CACKEY
5610: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a _PCSC_S_OK);.}..
5620: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 /*. * SYNPOSIS.
5630: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 * cackey_ret
5640: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 cackey_pcsc_dis
5650: 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 3b 0a 20 connect(void);.
5660: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 *. * ARGUMENTS.
5670: 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a * None. *. *
5680: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a RETURN VALUE. *
5690: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 CACKEY_PCSC
56a0: 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e _S_OK On
56b0: 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 success. *
56c0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 CACKEY_PCSC_E_GE
56d0: 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f NERIC On erro
56e0: 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a r. *. * NOTES. *
56f0: 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 This functi
5700: 6f 6e 20 64 69 73 63 6f 6e 6e 65 63 74 73 20 66 on disconnects f
5710: 72 6f 6d 20 74 68 65 20 50 43 2f 53 43 20 43 6f rom the PC/SC Co
5720: 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65 72 nnection manager
5730: 20 61 6e 64 20 75 70 64 61 74 65 73 0a 20 2a 20 and updates. *
5740: 20 20 20 20 74 68 65 20 67 6c 6f 62 61 6c 20 68 the global h
5750: 61 6e 64 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 andle.. *. */.st
5760: 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 atic cackey_ret
5770: 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 cackey_pcsc_disc
5780: 6f 6e 6e 65 63 74 28 76 6f 69 64 29 20 7b 0a 09 onnect(void) {..
5790: 4c 4f 4e 47 20 73 63 61 72 64 5f 72 65 6c 5f 63 LONG scard_rel_c
57a0: 6f 6e 74 65 78 74 5f 72 65 74 3b 0a 0a 09 43 41 ontext_ret;...CA
57b0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
57c0: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
57d0: 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f if (cackey_pcsc_
57e0: 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 handle == NULL)
57f0: 7b 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 {...return(CACKE
5800: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d Y_PCSC_S_OK);..}
5810: 0a 0a 09 73 63 61 72 64 5f 72 65 6c 5f 63 6f 6e ...scard_rel_con
5820: 74 65 78 74 5f 72 65 74 20 3d 20 53 43 61 72 64 text_ret = SCard
5830: 52 65 6c 65 61 73 65 43 6f 6e 74 65 78 74 28 2a ReleaseContext(*
5840: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 cackey_pcsc_hand
5850: 6c 65 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 le);...if (cacke
5860: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 20 7b y_pcsc_handle) {
5870: 0a 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 70 ...free(cackey_p
5880: 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 0a 09 csc_handle);....
5890: 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e .cackey_pcsc_han
58a0: 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a dle = NULL;..}..
58b0: 09 69 66 20 28 73 63 61 72 64 5f 72 65 6c 5f 63 .if (scard_rel_c
58c0: 6f 6e 74 65 78 74 5f 72 65 74 20 21 3d 20 53 43 ontext_ret != SC
58d0: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b ARD_S_SUCCESS) {
58e0: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 ...return(CACKEY
58f0: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 _PCSC_E_GENERIC)
5900: 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 43 41 ;..}...return(CA
5910: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b CKEY_PCSC_S_OK);
5920: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 .}../*. * SYNPOS
5930: 49 53 0a 20 2a 20 20 20 20 20 76 6f 69 64 20 63 IS. * void c
5940: 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f ackey_mark_slot_
5950: 72 65 73 65 74 28 73 74 72 75 63 74 20 63 61 63 reset(struct cac
5960: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b key_slot *slot);
5970: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 . *. * ARGUMENTS
5980: 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a . * None. *.
5990: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a * RETURN VALUE.
59a0: 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 * None. *.
59b0: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 * NOTES. * T
59c0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 72 his function mar
59d0: 6b 73 20 61 20 73 6c 6f 74 20 68 61 73 20 68 61 ks a slot has ha
59e0: 76 69 6e 67 20 62 65 65 6e 20 72 65 73 65 74 2c ving been reset,
59f0: 20 74 6f 20 6c 61 74 65 72 20 62 65 20 63 6c 65 to later be cle
5a00: 61 6e 65 64 20 75 70 2e 0a 20 2a 20 20 20 20 20 aned up.. *
5a10: 43 6c 65 61 6e 75 70 20 6f 6e 6c 79 20 68 61 70 Cleanup only hap
5a20: 70 65 6e 73 20 77 68 65 6e 20 61 20 50 4b 43 53 pens when a PKCS
5a30: 23 31 31 20 63 6c 69 65 6e 74 20 63 61 6c 6c 73 #11 client calls
5a40: 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e C_FindObjectsIn
5a50: 69 74 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 it.. *. */.stati
5a60: 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 6d 61 c void cackey_ma
5a70: 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 74 rk_slot_reset(st
5a80: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 ruct cackey_slot
5a90: 20 2a 73 6c 6f 74 29 20 7b 0a 09 69 66 20 28 73 *slot) {..if (s
5aa0: 6c 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 lot == NULL) {..
5ab0: 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 43 41 .return;..}...CA
5ac0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
5ad0: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
5ae0: 69 66 20 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 if (slot->pcsc_c
5af0: 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b ard_connected) {
5b00: 0a 09 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 ...SCardDisconne
5b10: 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 ct(slot->pcsc_ca
5b20: 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f rd, SCARD_LEAVE_
5b30: 43 41 52 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 CARD);..}...slot
5b40: 2d 3e 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 ->slot_reset = 1
5b50: 3b 0a 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 ;..slot->pcsc_ca
5b60: 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 rd_connected = 0
5b70: 3b 0a 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f 66 ;..slot->token_f
5b80: 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e lags = CKF_LOGIN
5b90: 5f 52 45 51 55 49 52 45 44 3b 0a 0a 09 43 41 43 _REQUIRED;...CAC
5ba0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
5bb0: 28 22 52 65 74 75 72 6e 69 6e 67 2e 22 29 3b 0a ("Returning.");.
5bc0: 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a ..return;.}../*.
5bd0: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 * SYNPOSIS. *
5be0: 20 20 20 4c 4f 4e 47 20 63 61 63 6b 65 79 5f 72 LONG cackey_r
5bf0: 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 74 econnect_card(st
5c00: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 ruct cackey_slot
5c10: 20 2a 73 6c 6f 74 2c 20 44 57 4f 52 44 20 64 65 *slot, DWORD de
5c20: 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 2c 20 fault_protocol,
5c30: 4c 50 44 57 4f 52 44 20 73 65 6c 65 63 74 65 64 LPDWORD selected
5c40: 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 20 2a 0a 20 _protocol);. *.
5c50: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 * ARGUMENTS. *
5c60: 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a cackey_slot *
5c70: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 slot. *
5c80: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d Slot to send com
5c90: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 mands to. *. *
5ca0: 20 20 20 44 57 4f 52 44 20 64 65 66 61 75 6c 74 DWORD default
5cb0: 5f 70 72 6f 74 6f 63 6f 6c 0a 20 2a 20 20 20 20 _protocol. *
5cc0: 20 20 20 20 20 50 72 6f 74 6f 63 6f 6c 20 74 6f Protocol to
5cd0: 20 61 74 74 65 6d 70 74 20 66 69 72 73 74 0a 20 attempt first.
5ce0: 2a 0a 20 2a 20 20 20 20 20 4c 50 44 57 4f 52 44 *. * LPDWORD
5cf0: 20 73 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 selected_protoc
5d00: 6f 6c 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f ol. * [O
5d10: 55 54 5d 20 50 72 6f 74 6f 63 6f 6c 20 73 65 6c UT] Protocol sel
5d20: 65 63 74 65 64 0a 20 2a 0a 20 2a 20 52 45 54 55 ected. *. * RETU
5d30: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 RN VALUE. *
5d40: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 The return value
5d50: 20 66 72 6f 6d 20 53 43 61 72 64 52 65 63 6f 6e from SCardRecon
5d60: 6e 65 63 74 28 29 0a 20 2a 0a 20 2a 20 4e 4f 54 nect(). *. * NOT
5d70: 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 ES. * This f
5d80: 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61 unction is a wra
5d90: 70 70 65 72 20 61 72 6f 75 6e 64 20 53 43 61 72 pper around SCar
5da0: 64 52 65 63 6f 6e 6e 65 63 74 28 29 0a 20 2a 0a dReconnect(). *.
5db0: 20 2a 20 20 20 20 20 54 68 65 20 53 43 61 72 64 * The SCard
5dc0: 52 65 63 6f 6e 6e 65 63 74 28 29 20 66 75 6e 63 Reconnect() func
5dd0: 74 69 6f 6e 20 63 61 6c 6c 20 77 69 6c 6c 20 62 tion call will b
5de0: 65 20 63 61 6c 6c 65 64 20 66 69 72 73 74 20 77 e called first w
5df0: 69 74 68 20 74 68 65 0a 20 2a 20 20 20 20 20 64 ith the. * d
5e00: 77 50 72 65 66 65 72 72 65 64 50 72 6f 74 6f 63 wPreferredProtoc
5e10: 6f 6c 73 20 6f 66 20 22 64 65 66 61 75 6c 74 5f ols of "default_
5e20: 70 72 6f 74 6f 63 6f 6c 22 2e 20 20 49 66 20 74 protocol". If t
5e30: 68 61 74 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 hat call returns
5e40: 0a 20 2a 20 20 20 20 20 53 43 41 52 44 5f 45 5f . * SCARD_E_
5e50: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 20 74 PROTO_MISMATCH t
5e60: 72 79 20 61 67 61 69 6e 20 77 69 74 68 20 61 20 ry again with a
5e70: 70 72 6f 74 6f 63 6f 6c 20 6f 66 20 54 3d 30 2c protocol of T=0,
5e80: 20 61 6e 64 20 66 61 69 6c 69 6e 67 0a 20 2a 20 and failing. *
5e90: 20 20 20 20 74 68 61 74 20 54 3d 31 2e 0a 20 2a that T=1.. *
5ea0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 4c 4f 4e 47 . */.static LONG
5eb0: 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 cackey_reconnec
5ec0: 74 5f 63 61 72 64 28 73 74 72 75 63 74 20 63 61 t_card(struct ca
5ed0: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c ckey_slot *slot,
5ee0: 20 44 57 4f 52 44 20 64 65 66 61 75 6c 74 5f 70 DWORD default_p
5ef0: 72 6f 74 6f 63 6f 6c 2c 20 4c 50 44 57 4f 52 44 rotocol, LPDWORD
5f00: 20 73 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 selected_protoc
5f10: 6f 6c 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 ol) {..LONG scar
5f20: 64 5f 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 73 63 d_conn_ret;...sc
5f30: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 ard_conn_ret = S
5f40: 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 73 6c CardReconnect(sl
5f50: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 ot->pcsc_card, S
5f60: 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 CARD_SHARE_SHARE
5f70: 44 2c 20 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f D, default_proto
5f80: 63 6f 6c 2c 20 53 43 41 52 44 5f 52 45 53 45 54 col, SCARD_RESET
5f90: 5f 43 41 52 44 2c 20 73 65 6c 65 63 74 65 64 5f _CARD, selected_
5fa0: 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 69 66 20 protocol);...if
5fb0: 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 (scard_conn_ret
5fc0: 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f == SCARD_E_PROTO
5fd0: 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 43 _MISMATCH) {...C
5fe0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
5ff0: 54 46 28 22 53 43 61 72 64 52 65 63 6f 6e 6e 65 TF("SCardReconne
6000: 63 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 ct() returned SC
6010: 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d ARD_E_PROTO_MISM
6020: 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74 ATCH, trying wit
6030: 68 20 6a 75 73 74 20 54 3d 30 22 29 0a 09 09 73 h just T=0")...s
6040: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 card_conn_ret =
6050: 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 73 SCardReconnect(s
6060: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 lot->pcsc_card,
6070: 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 SCARD_SHARE_SHAR
6080: 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 ED, SCARD_PROTOC
6090: 4f 4c 5f 54 30 2c 20 53 43 41 52 44 5f 52 45 53 OL_T0, SCARD_RES
60a0: 45 54 5f 43 41 52 44 2c 20 73 65 6c 65 63 74 65 ET_CARD, selecte
60b0: 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 d_protocol);....
60c0: 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 if (scard_conn_r
60d0: 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 et == SCARD_E_PR
60e0: 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a OTO_MISMATCH) {.
60f0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
6100: 50 52 49 4e 54 46 28 22 53 43 61 72 64 52 65 63 PRINTF("SCardRec
6110: 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 onnect() returne
6120: 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f d SCARD_E_PROTO_
6130: 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 MISMATCH, trying
6140: 20 77 69 74 68 20 6a 75 73 74 20 54 3d 31 22 29 with just T=1")
6150: 0a 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 ....scard_conn_r
6160: 65 74 20 3d 20 53 43 61 72 64 52 65 63 6f 6e 6e et = SCardReconn
6170: 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 ect(slot->pcsc_c
6180: 61 72 64 2c 20 53 43 41 52 44 5f 53 48 41 52 45 ard, SCARD_SHARE
6190: 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 _SHARED, SCARD_P
61a0: 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 53 43 41 52 ROTOCOL_T1, SCAR
61b0: 44 5f 52 45 53 45 54 5f 43 41 52 44 2c 20 73 65 D_RESET_CARD, se
61c0: 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 29 lected_protocol)
61d0: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 ;...}..}...retur
61e0: 6e 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 n(scard_conn_ret
61f0: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 );.}../*. * SYNP
6200: 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b OSIS. * cack
6210: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 63 6f ey_ret cackey_co
6220: 6e 6e 65 63 74 5f 63 61 72 64 28 73 74 72 75 63 nnect_card(struc
6230: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 t cackey_slot *s
6240: 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 lot);. *. * ARGU
6250: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63 MENTS. * cac
6260: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 key_slot *slot.
6270: 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 * Slot t
6280: 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 o send commands
6290: 74 6f 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 to. *. * RETURN
62a0: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 VALUE. * CAC
62b0: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 KEY_PCSC_S_OK
62c0: 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 On success
62d0: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 . * CACKEY_P
62e0: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 CSC_E_GENERIC
62f0: 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 On error. *. *
6300: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e NOTES. * Non
6310: 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 e. *. */.static
6320: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 cackey_ret cacke
6330: 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 y_connect_card(s
6340: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f truct cackey_slo
6350: 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b t *slot) {..cack
6360: 65 79 5f 72 65 74 20 70 63 73 63 5f 63 6f 6e 6e ey_ret pcsc_conn
6370: 65 63 74 5f 72 65 74 3b 0a 09 44 57 4f 52 44 20 ect_ret;..DWORD
6380: 70 72 6f 74 6f 63 6f 6c 3b 0a 09 4c 4f 4e 47 20 protocol;..LONG
6390: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 3b 0a scard_conn_ret;.
63a0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
63b0: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
63c0: 3b 0a 0a 09 69 66 20 28 21 73 6c 6f 74 29 20 7b ;...if (!slot) {
63d0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
63e0: 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 PRINTF("Invalid
63f0: 73 6c 6f 74 20 73 70 65 63 69 66 69 65 64 2c 20 slot specified,
6400: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 returning in fai
6410: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 lure");....retur
6420: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f n(CACKEY_PCSC_E_
6430: 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 70 GENERIC);..}...p
6440: 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 csc_connect_ret
6450: 3d 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f = cackey_pcsc_co
6460: 6e 6e 65 63 74 28 29 3b 0a 09 69 66 20 28 70 63 nnect();..if (pc
6470: 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 sc_connect_ret !
6480: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f = CACKEY_PCSC_S_
6490: 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 OK) {...CACKEY_D
64a0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e EBUG_PRINTF("Con
64b0: 6e 65 63 74 69 6f 6e 20 74 6f 20 50 43 2f 53 43 nection to PC/SC
64c0: 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 failed, returni
64d0: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b ng in failure");
64e0: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 ....return(CACKE
64f0: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 Y_PCSC_E_GENERIC
6500: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6f 6e 6e 65 );..}.../* Conne
6510: 63 74 20 74 6f 20 72 65 61 64 65 72 2c 20 69 66 ct to reader, if
6520: 20 6e 65 65 64 65 64 20 2a 2f 0a 09 69 66 20 28 needed */..if (
6530: 21 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 !slot->pcsc_card
6540: 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09 _connected) {...
6550: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
6560: 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 NTF("SCardConnec
6570: 74 28 25 73 29 20 63 61 6c 6c 65 64 22 2c 20 73 t(%s) called", s
6580: 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 lot->pcsc_reader
6590: 29 3b 0a 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f );...scard_conn_
65a0: 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 ret = SCardConne
65b0: 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f ct(*cackey_pcsc_
65c0: 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 handle, slot->pc
65d0: 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44 sc_reader, SCARD
65e0: 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 _SHARE_SHARED, S
65f0: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 CARD_PROTOCOL_T0
6600: 20 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f | SCARD_PROTOCO
6610: 4c 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 L_T1, &slot->pcs
6620: 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f c_card, &protoco
6630: 6c 29 3b 0a 0a 09 09 69 66 20 28 73 63 61 72 64 l);....if (scard
6640: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 _conn_ret == SCA
6650: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 RD_E_PROTO_MISMA
6660: 54 43 48 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 TCH) {....CACKEY
6670: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 _DEBUG_PRINTF("S
6680: 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 72 65 CardConnect() re
6690: 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 50 turned SCARD_E_P
66a0: 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74 ROTO_MISMATCH, t
66b0: 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73 74 20 rying with just
66c0: 54 3d 30 22 29 0a 09 09 09 73 63 61 72 64 5f 63 T=0")....scard_c
66d0: 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43 onn_ret = SCardC
66e0: 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 onnect(*cackey_p
66f0: 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 csc_handle, slot
6700: 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53 ->pcsc_reader, S
6710: 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 CARD_SHARE_SHARE
6720: 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f D, SCARD_PROTOCO
6730: 4c 5f 54 30 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 L_T0, &slot->pcs
6740: 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f c_card, &protoco
6750: 6c 29 3b 0a 0a 09 09 09 69 66 20 28 73 63 61 72 l);.....if (scar
6760: 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 d_conn_ret == SC
6770: 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d ARD_E_PROTO_MISM
6780: 41 54 43 48 29 20 7b 0a 09 09 09 09 43 41 43 4b ATCH) {.....CACK
6790: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
67a0: 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 "SCardConnect()
67b0: 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45 returned SCARD_E
67c0: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c _PROTO_MISMATCH,
67d0: 20 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73 trying with jus
67e0: 74 20 54 3d 31 22 29 0a 09 09 09 09 73 63 61 72 t T=1").....scar
67f0: 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 d_conn_ret = SCa
6800: 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 rdConnect(*cacke
6810: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 y_pcsc_handle, s
6820: 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 lot->pcsc_reader
6830: 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 , SCARD_SHARE_SH
6840: 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 ARED, SCARD_PROT
6850: 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e OCOL_T1, &slot->
6860: 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 pcsc_card, &prot
6870: 6f 63 6f 6c 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a ocol);....}...}.
6880: 0a 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e ...if (scard_con
6890: 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 57 n_ret == SCARD_W
68a0: 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41 52 44 29 _UNPOWERED_CARD)
68b0: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 {....CACKEY_DEB
68c0: 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 UG_PRINTF("SCard
68d0: 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e Connect() return
68e0: 65 64 20 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57 ed SCARD_W_UNPOW
68f0: 45 52 45 44 5f 43 41 52 44 2c 20 74 72 79 69 6e ERED_CARD, tryin
6900: 67 20 74 6f 20 72 65 2d 63 6f 6e 6e 65 63 74 2e g to re-connect.
6910: 2e 2e 22 29 3b 0a 0a 09 09 09 73 63 61 72 64 5f ..");.....scard_
6920: 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 conn_ret = SCard
6930: 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f Connect(*cackey_
6940: 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f pcsc_handle, slo
6950: 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c 20 t->pcsc_reader,
6960: 53 43 41 52 44 5f 53 48 41 52 45 5f 44 49 52 45 SCARD_SHARE_DIRE
6970: 43 54 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 CT, SCARD_PROTOC
6980: 4f 4c 5f 54 30 20 7c 20 53 43 41 52 44 5f 50 52 OL_T0 | SCARD_PR
6990: 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74 OTOCOL_T1, &slot
69a0: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72 ->pcsc_card, &pr
69b0: 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 09 69 66 20 otocol);.....if
69c0: 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 (scard_conn_ret
69d0: 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f == SCARD_E_PROTO
69e0: 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 09 _MISMATCH) {....
69f0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
6a00: 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 INTF("SCardConne
6a10: 63 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 ct() returned SC
6a20: 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d ARD_E_PROTO_MISM
6a30: 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74 ATCH, trying wit
6a40: 68 20 6a 75 73 74 20 54 3d 30 22 29 0a 09 09 09 h just T=0")....
6a50: 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 .scard_conn_ret
6a60: 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a = SCardConnect(*
6a70: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 cackey_pcsc_hand
6a80: 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 le, slot->pcsc_r
6a90: 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41 eader, SCARD_SHA
6aa0: 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 RE_SHARED, SCARD
6ab0: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20 26 73 _PROTOCOL_T0, &s
6ac0: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 lot->pcsc_card,
6ad0: 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 09 &protocol);.....
6ae0: 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f .if (scard_conn_
6af0: 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 ret == SCARD_E_P
6b00: 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b ROTO_MISMATCH) {
6b10: 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 ......CACKEY_DEB
6b20: 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 UG_PRINTF("SCard
6b30: 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e Connect() return
6b40: 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f ed SCARD_E_PROTO
6b50: 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e _MISMATCH, tryin
6b60: 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d 31 22 g with just T=1"
6b70: 29 0a 09 09 09 09 09 73 63 61 72 64 5f 63 6f 6e )......scard_con
6b80: 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e n_ret = SCardCon
6b90: 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 nect(*cackey_pcs
6ba0: 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e c_handle, slot->
6bb0: 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41 pcsc_reader, SCA
6bc0: 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c RD_SHARE_SHARED,
6bd0: 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f SCARD_PROTOCOL_
6be0: 54 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f T1, &slot->pcsc_
6bf0: 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 card, &protocol)
6c00: 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 ;.....}....}....
6c10: 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 .scard_conn_ret
6c20: 3d 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 = cackey_reconne
6c30: 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20 70 72 ct_card(slot, pr
6c40: 6f 74 6f 63 6f 6c 2c 20 26 70 72 6f 74 6f 63 6f otocol, &protoco
6c50: 6c 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 l);...}....if (s
6c60: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 21 3d card_conn_ret !=
6c70: 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 SCARD_S_SUCCESS
6c80: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 ) {....CACKEY_DE
6c90: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e 6e BUG_PRINTF("Conn
6ca0: 65 63 74 69 6f 6e 20 74 6f 20 63 61 72 64 20 66 ection to card f
6cb0: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 ailed, returning
6cc0: 20 69 6e 20 66 61 69 6c 75 72 65 20 28 53 43 61 in failure (SCa
6cd0: 72 64 43 6f 6e 6e 65 63 74 28 29 20 3d 20 25 73 rdConnect() = %s
6ce0: 2f 25 6c 69 29 22 2c 20 43 41 43 4b 45 59 5f 44 /%li)", CACKEY_D
6cf0: 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 EBUG_FUNC_SCARDE
6d00: 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f RR_TO_STR(scard_
6d10: 63 6f 6e 6e 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 conn_ret), (long
6d20: 29 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 ) scard_conn_ret
6d30: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 );.....return(CA
6d40: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 CKEY_PCSC_E_GENE
6d50: 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 73 6c 6f RIC);...}....slo
6d60: 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e t->pcsc_card_con
6d70: 6e 65 63 74 65 64 20 3d 20 31 3b 0a 09 09 73 6c nected = 1;...sl
6d80: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f ot->transaction_
6d90: 64 65 70 74 68 20 3d 20 30 3b 0a 09 09 73 6c 6f depth = 0;...slo
6da0: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e t->transaction_n
6db0: 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b eed_hw_lock = 0;
6dc0: 0a 09 09 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f ...slot->protoco
6dd0: 6c 20 3d 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 7d l = protocol;..}
6de0: 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 ...return(CACKEY
6df0: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a _PCSC_S_OK);.}..
6e00: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 /*. * SYNPOSIS.
6e10: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 * cackey_ret
6e20: 20 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 cackey_begin_tr
6e30: 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74 ansaction(struct
6e40: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c cackey_slot *sl
6e50: 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d ot);. *. * ARGUM
6e60: 45 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b ENTS. * cack
6e70: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a ey_slot *slot. *
6e80: 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f Slot to
6e90: 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 send commands t
6ea0: 6f 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 o. *. * RETURN V
6eb0: 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b ALUE. * CACK
6ec0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 EY_PCSC_S_OK
6ed0: 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a On success.
6ee0: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 * CACKEY_PC
6ef0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 SC_E_GENERIC
6f00: 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e On error. *. * N
6f10: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 65 20 OTES. * The
6f20: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 68 6f 75 transaction shou
6f30: 6c 64 20 62 65 20 74 65 72 6d 69 6e 61 74 65 64 ld be terminated
6f40: 20 75 73 69 6e 67 20 22 63 61 63 6b 65 79 5f 65 using "cackey_e
6f50: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 0a nd_transaction".
6f60: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 *. */.static ca
6f70: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f ckey_ret cackey_
6f80: 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f begin_transactio
6f90: 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f n(struct cackey_
6fa0: 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 slot *slot) {..c
6fb0: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 ackey_ret cackey
6fc0: 5f 63 6f 6e 6e 5f 72 65 74 3b 0a 09 4c 4f 4e 47 _conn_ret;..LONG
6fd0: 20 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 scard_trans_ret
6fe0: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ;...CACKEY_DEBUG
6ff0: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
7000: 22 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 63 6f 6e ");...cackey_con
7010: 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 n_ret = cackey_c
7020: 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 onnect_card(slot
7030: 29 3b 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 63 );..if (cackey_c
7040: 6f 6e 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 onn_ret != CACKE
7050: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 Y_PCSC_S_OK) {..
7060: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
7070: 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 INTF("Unable to
7080: 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c connect to card,
7090: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 returning in er
70a0: 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ror");....return
70b0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 (CACKEY_PCSC_E_G
70c0: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 73 6c ENERIC);..}...sl
70d0: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f ot->transaction_
70e0: 64 65 70 74 68 2b 2b 3b 0a 0a 09 69 66 20 28 73 depth++;...if (s
70f0: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e lot->transaction
7100: 5f 64 65 70 74 68 20 3e 20 31 20 26 26 20 21 73 _depth > 1 && !s
7110: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e lot->transaction
7120: 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 29 20 7b _need_hw_lock) {
7130: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
7140: 50 52 49 4e 54 46 28 22 41 6c 72 65 61 64 79 20 PRINTF("Already
7150: 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e in a transaction
7160: 2c 20 70 65 72 66 6f 72 6d 69 6e 67 20 6e 6f 20 , performing no
7170: 61 63 74 69 6f 6e 20 28 6e 65 77 20 64 65 70 74 action (new dept
7180: 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d 3e h = %i)", slot->
7190: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 transaction_dept
71a0: 68 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 h);....return(CA
71b0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b CKEY_PCSC_S_OK);
71c0: 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e ..}...slot->tran
71d0: 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f saction_need_hw_
71e0: 6c 6f 63 6b 20 3d 20 30 3b 0a 0a 09 73 63 61 72 lock = 0;...scar
71f0: 64 5f 74 72 61 6e 73 5f 72 65 74 20 3d 20 53 43 d_trans_ret = SC
7200: 61 72 64 42 65 67 69 6e 54 72 61 6e 73 61 63 74 ardBeginTransact
7210: 69 6f 6e 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 ion(slot->pcsc_c
7220: 61 72 64 29 3b 0a 09 69 66 20 28 73 63 61 72 64 ard);..if (scard
7230: 5f 74 72 61 6e 73 5f 72 65 74 20 21 3d 20 53 43 _trans_ret != SC
7240: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b ARD_S_SUCCESS) {
7250: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
7260: 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 PRINTF("Unable t
7270: 6f 20 62 65 67 69 6e 20 74 72 61 6e 73 61 63 74 o begin transact
7280: 69 6f 6e 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 ion, returning i
7290: 6e 20 65 72 72 6f 72 22 29 3b 0a 0a 09 09 72 65 n error");....re
72a0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 turn(CACKEY_PCSC
72b0: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a _E_GENERIC);..}.
72c0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
72d0: 52 49 4e 54 46 28 22 53 75 63 65 73 73 66 75 6c RINTF("Sucessful
72e0: 6c 79 20 62 65 67 61 6e 20 74 72 61 6e 73 61 63 ly began transac
72f0: 74 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28 25 73 tion on slot (%s
7300: 29 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 )", slot->pcsc_r
7310: 65 61 64 65 72 29 3b 0a 0a 09 72 65 74 75 72 6e eader);...return
7320: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f (CACKEY_PCSC_S_O
7330: 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e K);.}../*. * SYN
7340: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 POSIS. * cac
7350: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 65 key_ret cackey_e
7360: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 nd_transaction(s
7370: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f truct cackey_slo
7380: 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20 t *slot);. *. *
7390: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 ARGUMENTS. *
73a0: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c cackey_slot *sl
73b0: 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c ot. * Sl
73c0: 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 ot to send comma
73d0: 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45 54 nds to. *. * RET
73e0: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 URN VALUE. *
73f0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f CACKEY_PCSC_S_O
7400: 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 K On suc
7410: 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b cess. * CACK
7420: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 EY_PCSC_E_GENERI
7430: 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a C On error. *
7440: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 . * NOTES. *
7450: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 This function r
7460: 65 71 75 69 72 65 73 20 22 63 61 63 6b 65 79 5f equires "cackey_
7470: 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f begin_transactio
7480: 6e 22 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 n" to be called
7490: 66 69 72 73 74 0a 20 2a 0a 20 2a 2f 0a 73 74 61 first. *. */.sta
74a0: 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 tic cackey_ret c
74b0: 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 ackey_end_transa
74c0: 63 74 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63 ction(struct cac
74d0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 key_slot *slot)
74e0: 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 74 72 {..LONG scard_tr
74f0: 61 6e 73 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 ans_ret;...CACKE
7500: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
7510: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 Called.");...if
7520: 28 21 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 (!slot->pcsc_car
7530: 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09 d_connected) {..
7540: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
7550: 49 4e 54 46 28 22 43 61 72 64 20 69 73 20 6e 6f INTF("Card is no
7560: 74 20 63 6f 6e 6e 65 63 74 65 64 2c 20 75 6e 61 t connected, una
7570: 62 6c 65 20 74 6f 20 65 6e 64 20 74 72 61 6e 73 ble to end trans
7580: 61 63 74 69 6f 6e 20 6f 6e 20 63 61 72 64 22 29 action on card")
7590: 3b 0a 0a 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74 ;....if (slot->t
75a0: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 ransaction_depth
75b0: 20 3e 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 > 0) {....CACKE
75c0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
75d0: 44 65 63 72 65 61 73 69 6e 67 20 74 72 61 6e 73 Decreasing trans
75e0: 61 63 74 69 6f 6e 20 64 65 70 74 68 20 61 6e 64 action depth and
75f0: 20 61 73 6b 69 6e 67 20 66 6f 72 20 61 20 68 61 asking for a ha
7600: 72 64 77 61 72 65 20 6c 6f 63 6b 20 6f 6e 20 74 rdware lock on t
7610: 68 65 20 6e 65 78 74 20 62 65 67 69 6e 20 74 72 he next begin tr
7620: 61 6e 73 61 63 74 69 6f 6e 20 28 63 75 72 72 65 ansaction (curre
7630: 6e 74 20 64 65 70 74 68 20 3d 20 25 69 29 22 2c nt depth = %i)",
7640: 20 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 slot->transacti
7650: 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a 09 09 09 73 on_depth);.....s
7660: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e lot->transaction
7670: 5f 64 65 70 74 68 2d 2d 3b 0a 0a 09 09 09 69 66 _depth--;.....if
7680: 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 (slot->transact
7690: 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29 20 7b ion_depth > 0) {
76a0: 0a 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 .....slot->trans
76b0: 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c action_need_hw_l
76c0: 6f 63 6b 20 3d 20 31 3b 0a 09 09 09 7d 0a 09 09 ock = 1;....}...
76d0: 7d 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b }....return(CACK
76e0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 EY_PCSC_E_GENERI
76f0: 43 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f C);..}...if (slo
7700: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 t->transaction_d
7710: 65 70 74 68 20 3d 3d 20 30 29 20 7b 0a 09 09 43 epth == 0) {...C
7720: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
7730: 54 46 28 22 54 65 72 6d 69 6e 61 74 69 6e 67 20 TF("Terminating
7740: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 a transaction th
7750: 61 74 20 68 61 73 20 6e 6f 74 20 62 65 67 75 6e at has not begun
7760: 21 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 !");....return(C
7770: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e ACKEY_PCSC_E_GEN
7780: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 ERIC);..}...slot
7790: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 ->transaction_de
77a0: 70 74 68 2d 2d 3b 0a 0a 09 69 66 20 28 73 6c 6f pth--;...if (slo
77b0: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 t->transaction_d
77c0: 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 43 41 epth > 0) {...CA
77d0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
77e0: 46 28 22 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 F("Transactions
77f0: 73 74 69 6c 6c 20 69 6e 20 70 72 6f 67 72 65 73 still in progres
7800: 73 2c 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 69 s, not terminati
7810: 6e 67 20 6f 6e 2d 63 61 72 64 20 54 72 61 6e 73 ng on-card Trans
7820: 61 63 74 69 6f 6e 20 28 63 75 72 72 65 6e 74 20 action (current
7830: 64 65 70 74 68 20 3d 20 25 69 29 22 2c 20 73 6c depth = %i)", sl
7840: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f ot->transaction_
7850: 64 65 70 74 68 29 3b 0a 0a 09 09 72 65 74 75 72 depth);....retur
7860: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f n(CACKEY_PCSC_S_
7870: 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 63 61 72 64 5f OK);..}...scard_
7880: 74 72 61 6e 73 5f 72 65 74 20 3d 20 53 43 61 72 trans_ret = SCar
7890: 64 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 dEndTransaction(
78a0: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c slot->pcsc_card,
78b0: 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 SCARD_LEAVE_CAR
78c0: 44 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 74 D);..if (scard_t
78d0: 72 61 6e 73 5f 72 65 74 20 21 3d 20 53 43 41 52 rans_ret != SCAR
78e0: 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 D_S_SUCCESS) {..
78f0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
7900: 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 INTF("Unable to
7910: 65 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c end transaction,
7920: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 returning in er
7930: 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ror");....return
7940: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 (CACKEY_PCSC_E_G
7950: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 ENERIC);..}...CA
7960: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
7970: 46 28 22 53 75 63 65 73 73 66 75 6c 6c 79 20 74 F("Sucessfully t
7980: 65 72 6d 69 6e 61 74 65 64 20 74 72 61 6e 73 61 erminated transa
7990: 63 74 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28 25 ction on slot (%
79a0: 73 29 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f s)", slot->pcsc_
79b0: 72 65 61 64 65 72 29 3b 0a 0a 09 72 65 74 75 72 reader);...retur
79c0: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f n(CACKEY_PCSC_S_
79d0: 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20 41 50 44 55 20 OK);.}../* APDU
79e0: 52 65 6c 61 74 65 64 20 46 75 6e 63 74 69 6f 6e Related Function
79f0: 73 20 2a 2f 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f s */./*. * SYNPO
7a00: 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 SIS. * cacke
7a10: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6e y_ret cackey_sen
7a20: 64 5f 61 70 64 75 28 73 74 72 75 63 74 20 63 61 d_apdu(struct ca
7a30: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c ckey_slot *slot,
7a40: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 unsigned char c
7a50: 6c 61 73 73 2c 20 75 6e 73 69 67 6e 65 64 20 63 lass, unsigned c
7a60: 68 61 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c har instruction,
7a70: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 unsigned char p
7a80: 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 1, unsigned char
7a90: 20 70 32 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 p2, unsigned ch
7aa0: 61 72 20 6c 63 2c 20 75 6e 73 69 67 6e 65 64 20 ar lc, unsigned
7ab0: 63 68 61 72 20 2a 64 61 74 61 2c 20 75 6e 73 69 char *data, unsi
7ac0: 67 6e 65 64 20 63 68 61 72 20 6c 65 2c 20 75 69 gned char le, ui
7ad0: 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f 64 65 nt16_t *respcode
7ae0: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 , unsigned char
7af0: 2a 72 65 73 70 64 61 74 61 2c 20 73 69 7a 65 5f *respdata, size_
7b00: 74 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 t *respdata_len)
7b10: 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 ;. *. * ARGUMENT
7b20: 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f S. * cackey_
7b30: 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 slot *slot. *
7b40: 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 Slot to se
7b50: 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 nd commands to.
7b60: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 *. * unsigne
7b70: 64 20 63 68 61 72 20 63 6c 61 73 73 0a 20 2a 20 d char class. *
7b80: 20 20 20 20 20 20 20 20 41 50 44 55 20 43 6c 61 APDU Cla
7b90: 73 73 20 28 47 53 43 49 53 5f 43 4c 41 53 53 5f ss (GSCIS_CLASS_
7ba0: 49 53 4f 37 38 31 36 20 6f 72 20 47 53 43 49 53 ISO7816 or GSCIS
7bb0: 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c _CLASS_GLOBAL_PL
7bc0: 41 54 46 4f 52 4d 0a 20 2a 20 20 20 20 20 20 20 ATFORM. *
7bd0: 20 20 75 73 75 61 6c 6c 79 29 2c 20 28 43 4c 41 usually), (CLA
7be0: 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 ). *. * unsi
7bf0: 67 6e 65 64 20 63 68 61 72 20 69 6e 73 74 72 75 gned char instru
7c00: 63 74 69 6f 6e 0a 20 2a 20 20 20 20 20 20 20 20 ction. *
7c10: 20 41 50 44 55 20 49 6e 73 74 72 75 63 74 69 6f APDU Instructio
7c20: 6e 20 28 49 4e 53 29 0a 20 2a 0a 20 2a 20 20 20 n (INS). *. *
7c30: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 unsigned char
7c40: 70 31 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 p1. * AP
7c50: 44 55 20 50 61 72 61 6d 65 74 65 72 20 31 20 28 DU Parameter 1 (
7c60: 50 31 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e P1). *. * un
7c70: 73 69 67 6e 65 64 20 63 68 61 72 20 70 32 0a 20 signed char p2.
7c80: 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 20 50 * APDU P
7c90: 61 72 61 6d 65 74 65 72 20 32 20 28 50 32 29 0a arameter 2 (P2).
7ca0: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e *. * unsign
7cb0: 65 64 20 63 68 61 72 20 6c 63 0a 20 2a 20 20 20 ed char lc. *
7cc0: 20 20 20 20 20 20 41 50 44 55 20 4c 65 6e 67 74 APDU Lengt
7cd0: 68 20 6f 66 20 43 6f 6e 74 65 6e 74 20 28 4c 63 h of Content (Lc
7ce0: 29 20 2d 2d 20 74 68 69 73 20 69 73 20 74 68 65 ) -- this is the
7cf0: 20 6c 65 6e 67 74 68 20 6f 66 20 22 64 61 74 61 length of "data
7d00: 22 0a 20 2a 20 20 20 20 20 20 20 20 20 70 61 72 ". * par
7d10: 61 6d 65 74 65 72 2e 20 20 49 66 20 22 64 61 74 ameter. If "dat
7d20: 61 22 20 69 73 20 73 70 65 63 69 66 69 65 64 20 a" is specified
7d30: 61 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20 70 61 as NULL, this pa
7d40: 72 61 6d 65 74 65 72 20 77 69 6c 6c 0a 20 2a 20 rameter will. *
7d50: 20 20 20 20 20 20 20 20 62 65 20 69 67 6e 6f 72 be ignor
7d60: 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e ed.. *. * un
7d70: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 signed char *dat
7d80: 61 0a 20 2a 20 20 20 20 20 20 20 20 20 50 6f 69 a. * Poi
7d90: 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 74 nter to buffer t
7da0: 6f 20 73 65 6e 64 2e 20 20 49 74 20 73 68 6f 75 o send. It shou
7db0: 6c 64 20 62 65 20 22 4c 63 22 20 62 79 74 65 73 ld be "Lc" bytes
7dc0: 20 6c 6f 6e 67 2e 20 20 49 66 0a 20 2a 20 20 20 long. If. *
7dd0: 20 20 20 20 20 20 73 70 65 63 69 66 69 65 64 20 specified
7de0: 61 73 20 4e 55 4c 4c 2c 20 22 4c 63 22 20 77 69 as NULL, "Lc" wi
7df0: 6c 6c 20 6e 6f 74 20 62 65 20 73 65 6e 74 2c 20 ll not be sent,
7e00: 61 6e 64 20 74 68 69 73 20 62 75 66 66 65 72 20 and this buffer
7e10: 77 69 6c 6c 20 62 65 0a 20 2a 20 20 20 20 20 20 will be. *
7e20: 20 20 20 69 67 6e 6f 72 65 64 2e 0a 20 2a 0a 20 ignored.. *.
7e30: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 * unsigned c
7e40: 68 61 72 20 6c 65 0a 20 2a 20 20 20 20 20 20 20 har le. *
7e50: 20 20 41 50 44 55 20 4c 65 6e 67 74 68 20 6f 66 APDU Length of
7e60: 20 45 78 70 65 63 74 61 74 69 6f 6e 20 28 4c 65 Expectation (Le
7e70: 29 20 2d 2d 20 74 68 69 73 20 69 73 20 74 68 65 ) -- this is the
7e80: 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 0a 20 length of the.
7e90: 2a 20 20 20 20 20 20 20 20 20 65 78 70 65 63 74 * expect
7ea0: 65 64 20 72 65 70 6c 79 2e 20 20 49 66 20 74 68 ed reply. If th
7eb0: 69 73 20 69 73 20 73 70 65 63 69 66 69 65 64 20 is is specified
7ec0: 61 73 20 30 20 74 68 65 6e 20 69 74 20 77 69 6c as 0 then it wil
7ed0: 6c 20 6e 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 l not. *
7ee0: 20 62 65 20 73 65 6e 74 2e 0a 20 2a 0a 20 2a 20 be sent.. *. *
7ef0: 20 20 20 20 75 69 6e 74 31 36 5f 74 20 2a 72 65 uint16_t *re
7f00: 73 70 63 6f 64 65 0a 20 2a 20 20 20 20 20 20 20 spcode. *
7f10: 20 20 5b 4f 55 54 5d 20 50 6f 69 6e 74 65 72 20 [OUT] Pointer
7f20: 74 6f 20 73 74 6f 72 61 67 65 20 6f 66 20 41 50 to storage of AP
7f30: 44 55 20 72 65 73 70 6f 6e 73 65 20 63 6f 64 65 DU response code
7f40: 2e 20 20 49 66 20 74 68 69 73 20 69 73 0a 20 2a . If this is. *
7f50: 20 20 20 20 20 20 20 20 20 73 70 65 63 69 66 69 specifi
7f60: 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68 65 20 ed as NULL, the
7f70: 72 65 73 70 6f 6e 73 65 20 63 6f 64 65 20 77 69 response code wi
7f80: 6c 6c 20 62 65 20 64 69 73 63 61 72 64 65 64 2e ll be discarded.
7f90: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 . *. * unsig
7fa0: 6e 65 64 20 63 68 61 72 20 2a 72 65 73 70 64 61 ned char *respda
7fb0: 74 61 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f ta. * [O
7fc0: 55 54 5d 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 UT] Pointer to s
7fd0: 74 6f 72 61 67 65 20 6f 66 20 41 50 44 55 20 72 torage of APDU r
7fe0: 65 73 70 6f 6e 73 65 20 64 61 74 61 2e 20 20 49 esponse data. I
7ff0: 66 20 74 68 69 73 20 69 73 0a 20 2a 20 20 20 20 f this is. *
8000: 20 20 20 20 20 73 70 65 63 69 66 69 65 64 20 61 specified a
8010: 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 70 s NULL, the resp
8020: 6f 6e 73 65 20 64 61 74 61 20 77 69 6c 6c 20 62 onse data will b
8030: 65 20 64 69 73 63 61 72 64 65 64 2e 20 20 49 66 e discarded. If
8040: 0a 20 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 . * the
8050: 22 72 65 73 70 64 61 74 61 5f 6c 65 6e 22 20 70 "respdata_len" p
8060: 61 72 61 6d 65 74 65 72 20 69 73 20 73 70 65 63 arameter is spec
8070: 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74 ified as NULL, t
8080: 68 69 73 20 62 75 66 66 65 72 0a 20 2a 20 20 20 his buffer. *
8090: 20 20 20 20 20 20 77 69 6c 6c 20 6e 6f 74 20 62 will not b
80a0: 65 20 75 70 64 61 74 65 64 2e 0a 20 2a 0a 20 2a e updated.. *. *
80b0: 20 20 20 20 20 73 69 7a 65 5f 74 20 2a 72 65 73 size_t *res
80c0: 70 64 61 74 61 5f 6c 65 6e 0a 20 2a 20 20 20 20 pdata_len. *
80d0: 20 20 20 20 20 5b 49 4e 2c 20 4f 55 54 5d 20 50 [IN, OUT] P
80e0: 6f 69 6e 74 65 72 20 69 6e 69 74 69 61 6c 69 6e ointer initialin
80f0: 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 g containing the
8100: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 22 72 65 size of the "re
8110: 73 70 64 61 74 61 22 0a 20 2a 20 20 20 20 20 20 spdata". *
8120: 20 20 20 62 75 66 66 65 72 2e 20 20 42 65 66 6f buffer. Befo
8130: 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 74 68 re returning, th
8140: 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 76 61 6c e pointed to val
8150: 75 65 20 69 73 20 75 70 64 61 74 65 64 20 74 6f ue is updated to
8160: 20 74 68 65 0a 20 2a 20 20 20 20 20 20 20 20 20 the. *
8170: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 number of bytes
8180: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 62 written to the b
8190: 75 66 66 65 72 2e 20 20 49 66 20 74 68 69 73 20 uffer. If this
81a0: 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73 0a is specified as.
81b0: 20 2a 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c * NULL,
81c0: 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 it will not be
81d0: 75 70 64 61 74 65 64 2c 20 61 6e 64 20 22 72 65 updated, and "re
81e0: 73 70 64 61 74 61 22 20 77 69 6c 6c 20 62 65 20 spdata" will be
81f0: 69 67 6e 6f 72 65 64 20 63 61 75 73 69 6e 67 0a ignored causing.
8200: 20 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 72 * the r
8210: 65 73 70 6f 6e 73 65 20 64 61 74 61 20 74 6f 20 esponse data to
8220: 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20 2a be discarded.. *
8230: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 . * RETURN VALUE
8240: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 . * CACKEY_P
8250: 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 CSC_S_OK
8260: 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a On success. *
8270: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 CACKEY_PCSC
8280: 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 20 20 _E_GENERIC
8290: 4f 6e 20 65 72 72 6f 72 0a 20 2a 20 20 20 20 20 On error. *
82a0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f CACKEY_PCSC_E_TO
82b0: 4b 45 4e 41 42 53 45 4e 54 20 20 49 66 20 74 68 KENABSENT If th
82c0: 65 20 73 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 e sending failed
82d0: 20 62 65 63 61 75 73 65 20 74 68 65 20 74 6f 6b because the tok
82e0: 65 6e 20 69 73 0a 20 2a 20 20 20 20 20 20 20 20 en is. *
82f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8300: 20 20 20 20 20 20 20 20 61 62 73 65 6e 74 0a 20 absent.
8310: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 *. * NOTES. *
8320: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 This function
8330: 77 69 6c 6c 20 63 6f 6e 6e 65 63 74 20 74 6f 20 will connect to
8340: 74 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e 65 63 the PC/SC Connec
8350: 74 69 6f 6e 20 4d 61 6e 61 67 65 72 20 76 69 61 tion Manager via
8360: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 70 . * cackey_p
8370: 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 20 69 66 csc_connect() if
8380: 20 6e 65 65 64 65 64 2e 0a 20 2a 0a 20 2a 20 20 needed.. *. *
8390: 20 20 20 49 74 20 77 69 6c 6c 20 63 6f 6e 6e 65 It will conne
83a0: 63 74 20 74 6f 20 74 68 65 20 63 61 72 64 20 69 ct to the card i
83b0: 6e 20 74 68 65 20 72 65 61 64 65 72 20 61 74 74 n the reader att
83c0: 61 63 68 65 64 20 74 6f 20 74 68 65 20 73 6c 6f ached to the slo
83d0: 74 0a 20 2a 20 20 20 20 20 73 70 65 63 69 66 69 t. * specifi
83e0: 65 64 2e 20 20 49 74 20 77 69 6c 6c 20 72 65 63 ed. It will rec
83f0: 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20 63 61 onnect to the ca
8400: 72 64 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 rd if the connec
8410: 74 69 6f 6e 0a 20 2a 20 20 20 20 20 67 6f 65 73 tion. * goes
8420: 20 61 77 61 79 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 away.. *. */.st
8430: 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 atic cackey_ret
8440: 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 cackey_send_apdu
8450: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 (struct cackey_s
8460: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 lot *slot, unsig
8470: 6e 65 64 20 63 68 61 72 20 63 6c 61 73 73 2c 20 ned char class,
8480: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e unsigned char in
8490: 73 74 72 75 63 74 69 6f 6e 2c 20 75 6e 73 69 67 struction, unsig
84a0: 6e 65 64 20 63 68 61 72 20 70 31 2c 20 75 6e 73 ned char p1, uns
84b0: 69 67 6e 65 64 20 63 68 61 72 20 70 32 2c 20 75 igned char p2, u
84c0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c 63 2c nsigned char lc,
84d0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
84e0: 64 61 74 61 2c 20 75 6e 73 69 67 6e 65 64 20 63 data, unsigned c
84f0: 68 61 72 20 6c 65 2c 20 75 69 6e 74 31 36 5f 74 har le, uint16_t
8500: 20 2a 72 65 73 70 63 6f 64 65 2c 20 75 6e 73 69 *respcode, unsi
8510: 67 6e 65 64 20 63 68 61 72 20 2a 72 65 73 70 64 gned char *respd
8520: 61 74 61 2c 20 73 69 7a 65 5f 74 20 2a 72 65 73 ata, size_t *res
8530: 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 75 69 pdata_len) {..ui
8540: 6e 74 38 5f 74 20 6d 61 6a 6f 72 5f 72 63 2c 20 nt8_t major_rc,
8550: 6d 69 6e 6f 72 5f 72 63 3b 0a 09 73 69 7a 65 5f minor_rc;..size_
8560: 74 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 2c t bytes_to_copy,
8570: 20 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 tmp_respdata_le
8580: 6e 3b 0a 09 4c 50 43 53 43 41 52 44 5f 49 4f 5f n;..LPCSCARD_IO_
8590: 52 45 51 55 45 53 54 20 70 69 6f 53 65 6e 64 50 REQUEST pioSendP
85a0: 63 69 3b 0a 09 44 57 4f 52 44 20 70 72 6f 74 6f ci;..DWORD proto
85b0: 63 6f 6c 3b 0a 09 44 57 4f 52 44 20 78 6d 69 74 col;..DWORD xmit
85c0: 5f 6c 65 6e 2c 20 72 65 63 76 5f 6c 65 6e 3b 0a _len, recv_len;.
85d0: 09 4c 4f 4e 47 20 73 63 61 72 64 5f 78 6d 69 74 .LONG scard_xmit
85e0: 5f 72 65 74 2c 20 73 63 61 72 64 5f 72 65 63 6f _ret, scard_reco
85f0: 6e 6e 5f 72 65 74 3b 0a 09 42 59 54 45 20 78 6d nn_ret;..BYTE xm
8600: 69 74 5f 62 75 66 5b 31 30 32 34 5d 2c 20 72 65 it_buf[1024], re
8610: 63 76 5f 62 75 66 5b 31 30 32 34 5d 3b 0a 09 69 cv_buf[1024];..i
8620: 6e 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f nt pcsc_connect_
8630: 72 65 74 2c 20 70 63 73 63 5f 67 65 74 72 65 73 ret, pcsc_getres
8640: 70 5f 72 65 74 3b 0a 09 69 6e 74 20 69 64 78 3b p_ret;..int idx;
8650: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
8660: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
8670: 29 3b 0a 0a 09 69 66 20 28 21 73 6c 6f 74 29 20 );...if (!slot)
8680: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
8690: 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 _PRINTF("Invalid
86a0: 20 73 6c 6f 74 20 73 70 65 63 69 66 69 65 64 2e slot specified.
86b0: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 ");....return(CA
86c0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 CKEY_PCSC_E_GENE
86d0: 52 49 43 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f RIC);..}...pcsc_
86e0: 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 connect_ret = ca
86f0: 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 ckey_connect_car
8700: 64 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28 70 63 d(slot);..if (pc
8710: 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 sc_connect_ret !
8720: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f = CACKEY_PCSC_S_
8730: 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 OK) {...CACKEY_D
8740: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 EBUG_PRINTF("Una
8750: 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74 ble to connect t
8760: 6f 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e o card, returnin
8770: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a g in failure");.
8780: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 ...return(CACKEY
8790: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 _PCSC_E_GENERIC)
87a0: 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d ;..}.../* Determ
87b0: 69 6e 65 20 77 68 69 63 68 20 70 72 6f 74 6f 63 ine which protoc
87c0: 6f 6c 20 74 6f 20 73 65 6e 64 20 75 73 69 6e 67 ol to send using
87d0: 20 2a 2f 0a 09 73 77 69 74 63 68 20 28 73 6c 6f */..switch (slo
87e0: 74 2d 3e 70 72 6f 74 6f 63 6f 6c 29 20 7b 0a 09 t->protocol) {..
87f0: 09 63 61 73 65 20 53 43 41 52 44 5f 50 52 4f 54 .case SCARD_PROT
8800: 4f 43 4f 4c 5f 54 30 3a 0a 09 09 09 70 69 6f 53 OCOL_T0:....pioS
8810: 65 6e 64 50 63 69 20 3d 20 53 43 41 52 44 5f 50 endPci = SCARD_P
8820: 43 49 5f 54 30 3b 0a 0a 09 09 09 62 72 65 61 6b CI_T0;.....break
8830: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 50 ;...case SCARD_P
8840: 52 4f 54 4f 43 4f 4c 5f 54 31 3a 0a 09 09 09 70 ROTOCOL_T1:....p
8850: 69 6f 53 65 6e 64 50 63 69 20 3d 20 53 43 41 52 ioSendPci = SCAR
8860: 44 5f 50 43 49 5f 54 31 3b 0a 0a 09 09 09 62 72 D_PCI_T1;.....br
8870: 65 61 6b 3b 0a 09 09 64 65 66 61 75 6c 74 3a 0a eak;...default:.
8880: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
8890: 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 PRINTF("Invalid
88a0: 70 72 6f 74 6f 63 6f 6c 20 66 6f 75 6e 64 2c 20 protocol found,
88b0: 61 62 6f 72 74 69 6e 67 2e 22 29 3b 0a 0a 09 09 aborting.");....
88c0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 .return(CACKEY_P
88d0: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a CSC_E_GENERIC);.
88e0: 09 7d 0a 0a 09 2f 2a 20 54 72 61 6e 73 6d 69 74 .}.../* Transmit
88f0: 20 2a 2f 0a 09 78 6d 69 74 5f 6c 65 6e 20 3d 20 */..xmit_len =
8900: 30 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 0;..xmit_buf[xmi
8910: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 63 6c 61 73 73 t_len++] = class
8920: 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 ;..xmit_buf[xmit
8930: 5f 6c 65 6e 2b 2b 5d 20 3d 20 69 6e 73 74 72 75 _len++] = instru
8940: 63 74 69 6f 6e 3b 0a 09 78 6d 69 74 5f 62 75 66 ction;..xmit_buf
8950: 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 70 [xmit_len++] = p
8960: 31 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 1;..xmit_buf[xmi
8970: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 70 32 3b 0a 09 t_len++] = p2;..
8980: 69 66 20 28 64 61 74 61 29 20 7b 0a 09 09 78 6d if (data) {...xm
8990: 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b it_buf[xmit_len+
89a0: 2b 5d 20 3d 20 6c 63 3b 0a 09 09 66 6f 72 20 28 +] = lc;...for (
89b0: 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 6c idx = 0; idx < l
89c0: 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 09 78 c; idx++) {....x
89d0: 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e mit_buf[xmit_len
89e0: 2b 2b 5d 20 3d 20 64 61 74 61 5b 69 64 78 5d 3b ++] = data[idx];
89f0: 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6c 65 ...}..}...if (le
8a00: 20 21 3d 20 30 78 30 30 29 20 7b 0a 09 09 78 6d != 0x00) {...xm
8a10: 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b it_buf[xmit_len+
8a20: 2b 5d 20 3d 20 6c 65 3b 0a 09 7d 0a 0a 09 2f 2a +] = le;..}.../*
8a30: 20 42 65 67 69 6e 20 53 6d 61 72 74 63 61 72 64 Begin Smartcard
8a40: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a Transaction */.
8a50: 09 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 .cackey_begin_tr
8a60: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b ansaction(slot);
8a70: 0a 0a 09 69 66 20 28 63 6c 61 73 73 20 3d 3d 20 ...if (class ==
8a80: 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 GSCIS_CLASS_ISO7
8a90: 38 31 36 20 26 26 20 69 6e 73 74 72 75 63 74 69 816 && instructi
8aa0: 6f 6e 20 3d 3d 20 47 53 43 49 53 5f 49 4e 53 54 on == GSCIS_INST
8ab0: 52 5f 56 45 52 49 46 59 20 26 26 20 70 31 20 3d R_VERIFY && p1 =
8ac0: 3d 20 30 78 30 30 20 26 26 20 70 32 20 3d 3d 20 = 0x00 && p2 ==
8ad0: 30 78 30 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 0x00) {...CACKEY
8ae0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 _DEBUG_PRINTF("S
8af0: 65 6e 64 69 6e 67 20 41 50 44 55 3a 20 3c 3c 63 ending APDU: <<c
8b00: 65 6e 73 6f 72 65 64 3e 3e 22 29 3b 0a 09 7d 20 ensored>>");..}
8b10: 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b 45 59 5f else {...CACKEY_
8b20: 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 DEBUG_PRINTBUF("
8b30: 53 65 6e 64 69 6e 67 20 41 50 44 55 3a 22 2c 20 Sending APDU:",
8b40: 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69 74 5f 6c xmit_buf, xmit_l
8b50: 65 6e 29 3b 0a 09 7d 0a 0a 09 72 65 63 76 5f 6c en);..}...recv_l
8b60: 65 6e 20 3d 20 73 69 7a 65 6f 66 28 72 65 63 76 en = sizeof(recv
8b70: 5f 62 75 66 29 3b 0a 09 73 63 61 72 64 5f 78 6d _buf);..scard_xm
8b80: 69 74 5f 72 65 74 20 3d 20 53 43 61 72 64 54 72 it_ret = SCardTr
8b90: 61 6e 73 6d 69 74 28 73 6c 6f 74 2d 3e 70 63 73 ansmit(slot->pcs
8ba0: 63 5f 63 61 72 64 2c 20 70 69 6f 53 65 6e 64 50 c_card, pioSendP
8bb0: 63 69 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d ci, xmit_buf, xm
8bc0: 69 74 5f 6c 65 6e 2c 20 4e 55 4c 4c 2c 20 72 65 it_len, NULL, re
8bd0: 63 76 5f 62 75 66 2c 20 26 72 65 63 76 5f 6c 65 cv_buf, &recv_le
8be0: 6e 29 3b 0a 0a 09 69 66 20 28 73 63 61 72 64 5f n);...if (scard_
8bf0: 78 6d 69 74 5f 72 65 74 20 3d 3d 20 53 43 41 52 xmit_ret == SCAR
8c00: 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41 43 54 D_E_NOT_TRANSACT
8c10: 45 44 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ED) {...CACKEY_D
8c20: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69 EBUG_PRINTF("Fai
8c30: 6c 65 64 20 74 6f 20 73 65 6e 64 20 41 50 44 55 led to send APDU
8c40: 20 74 6f 20 63 61 72 64 20 28 53 43 61 72 64 54 to card (SCardT
8c50: 72 61 6e 73 6d 69 74 28 29 20 3d 20 25 73 2f 25 ransmit() = %s/%
8c60: 6c 78 29 2c 20 77 69 6c 6c 20 61 73 6b 20 63 61 lx), will ask ca
8c70: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 74 lling function t
8c80: 6f 20 72 65 74 72 79 20 28 6e 6f 74 20 72 65 73 o retry (not res
8c90: 65 74 74 69 6e 67 20 63 61 72 64 29 2e 2e 2e 22 etting card)..."
8ca0: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 , CACKEY_DEBUG_F
8cb0: 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f UNC_SCARDERR_TO_
8cc0: 53 54 52 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 STR(scard_xmit_r
8cd0: 65 74 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c et), (unsigned l
8ce0: 6f 6e 67 29 20 73 63 61 72 64 5f 78 6d 69 74 5f ong) scard_xmit_
8cf0: 72 65 74 29 3b 0a 0a 09 09 2f 2a 20 42 65 67 69 ret);..../* Begi
8d00: 6e 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e n Smartcard Tran
8d10: 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 saction */...cac
8d20: 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 key_end_transact
8d30: 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 72 65 ion(slot);....re
8d40: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 turn(CACKEY_PCSC
8d50: 5f 45 5f 52 45 54 52 59 29 3b 0a 09 7d 0a 0a 09 _E_RETRY);..}...
8d60: 69 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 if (scard_xmit_r
8d70: 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 et != SCARD_S_SU
8d80: 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43 4b 45 CCESS) {...CACKE
8d90: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
8da0: 46 61 69 6c 65 64 20 74 6f 20 73 65 6e 64 20 41 Failed to send A
8db0: 50 44 55 20 74 6f 20 63 61 72 64 20 28 53 43 61 PDU to card (SCa
8dc0: 72 64 54 72 61 6e 73 6d 69 74 28 29 20 3d 20 25 rdTransmit() = %
8dd0: 73 2f 25 6c 78 29 22 2c 20 43 41 43 4b 45 59 5f s/%lx)", CACKEY_
8de0: 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 DEBUG_FUNC_SCARD
8df0: 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 ERR_TO_STR(scard
8e00: 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28 75 6e 73 _xmit_ret), (uns
8e10: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 63 61 72 igned long) scar
8e20: 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a 09 09 d_xmit_ret);....
8e30: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
8e40: 4e 54 46 28 22 4d 61 72 6b 69 6e 67 20 73 6c 6f NTF("Marking slo
8e50: 74 20 61 73 20 68 61 76 69 6e 67 20 62 65 65 6e t as having been
8e60: 20 72 65 73 65 74 22 29 3b 0a 09 09 63 61 63 6b reset");...cack
8e70: 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 ey_mark_slot_res
8e80: 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 69 66 20 et(slot);....if
8e90: 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 (scard_xmit_ret
8ea0: 3d 3d 20 53 43 41 52 44 5f 57 5f 52 45 53 45 54 == SCARD_W_RESET
8eb0: 5f 43 41 52 44 29 20 7b 0a 09 09 09 43 41 43 4b _CARD) {....CACK
8ec0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
8ed0: 22 52 65 73 65 74 20 72 65 71 75 69 72 65 64 2c "Reset required,
8ee0: 20 70 6c 65 61 73 65 20 68 6f 6c 64 2e 2e 2e 22 please hold..."
8ef0: 29 3b 0a 0a 09 09 09 73 63 61 72 64 5f 72 65 63 );.....scard_rec
8f00: 6f 6e 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 onn_ret = cackey
8f10: 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 _reconnect_card(
8f20: 73 6c 6f 74 2c 20 53 43 41 52 44 5f 50 52 4f 54 slot, SCARD_PROT
8f30: 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 41 52 44 5f OCOL_T0 | SCARD_
8f40: 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 70 72 PROTOCOL_T1, &pr
8f50: 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 09 69 66 20 otocol);.....if
8f60: 28 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 (scard_reconn_re
8f70: 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 t == SCARD_S_SUC
8f80: 43 45 53 53 29 20 7b 0a 09 09 09 09 2f 2a 20 55 CESS) {...../* U
8f90: 70 64 61 74 65 20 70 72 6f 74 6f 63 6f 6c 20 2a pdate protocol *
8fa0: 2f 0a 09 09 09 09 73 6c 6f 74 2d 3e 70 72 6f 74 /.....slot->prot
8fb0: 6f 63 6f 6c 20 3d 20 70 72 6f 74 6f 63 6f 6c 3b ocol = protocol;
8fc0: 0a 09 09 09 09 73 77 69 74 63 68 20 28 73 6c 6f .....switch (slo
8fd0: 74 2d 3e 70 72 6f 74 6f 63 6f 6c 29 20 7b 0a 09 t->protocol) {..
8fe0: 09 09 09 09 63 61 73 65 20 53 43 41 52 44 5f 50 ....case SCARD_P
8ff0: 52 4f 54 4f 43 4f 4c 5f 54 30 3a 0a 09 09 09 09 ROTOCOL_T0:.....
9000: 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53 ..pioSendPci = S
9010: 43 41 52 44 5f 50 43 49 5f 54 30 3b 0a 0a 09 09 CARD_PCI_T0;....
9020: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 ....break;......
9030: 63 61 73 65 20 53 43 41 52 44 5f 50 52 4f 54 4f case SCARD_PROTO
9040: 43 4f 4c 5f 54 31 3a 0a 09 09 09 09 09 09 70 69 COL_T1:.......pi
9050: 6f 53 65 6e 64 50 63 69 20 3d 20 53 43 41 52 44 oSendPci = SCARD
9060: 5f 50 43 49 5f 54 31 3b 0a 0a 09 09 09 09 09 09 _PCI_T1;........
9070: 62 72 65 61 6b 3b 0a 09 09 09 09 09 64 65 66 61 break;......defa
9080: 75 6c 74 3a 0a 09 09 09 09 09 09 43 41 43 4b 45 ult:.......CACKE
9090: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
90a0: 49 6e 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c Invalid protocol
90b0: 20 66 6f 75 6e 64 2c 20 62 75 74 20 74 6f 6f 20 found, but too
90c0: 6c 61 74 65 20 74 6f 20 64 6f 20 61 6e 79 74 68 late to do anyth
90d0: 69 6e 67 20 61 62 6f 75 74 20 69 74 20 6e 6f 77 ing about it now
90e0: 20 2d 2d 20 74 72 79 69 6e 67 20 61 6e 79 77 61 -- trying anywa
90f0: 79 2e 22 29 3b 0a 0a 09 09 09 09 09 09 62 72 65 y.");........bre
9100: 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f ak;.....}....../
9110: 2a 20 52 65 2d 65 73 74 61 62 6c 69 73 68 20 74 * Re-establish t
9120: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 69 ransaction, if i
9130: 74 20 77 61 73 20 70 72 65 73 65 6e 74 20 2a 2f t was present */
9140: 0a 09 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74 .....if (slot->t
9150: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 ransaction_depth
9160: 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 73 6c 6f > 0) {......slo
9170: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 t->transaction_d
9180: 65 70 74 68 2d 2d 3b 0a 09 09 09 09 09 73 6c 6f epth--;......slo
9190: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e t->transaction_n
91a0: 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 31 3b eed_hw_lock = 1;
91b0: 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 62 65 67 ......cackey_beg
91c0: 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 in_transaction(s
91d0: 6c 6f 74 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 lot);.....}.....
91e0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
91f0: 49 4e 54 46 28 22 52 65 73 65 74 20 73 75 63 63 INTF("Reset succ
9200: 65 73 73 66 75 6c 2c 20 72 65 74 72 61 6e 73 6d essful, retransm
9210: 69 74 74 69 6e 67 22 29 3b 0a 0a 09 09 09 09 72 itting");......r
9220: 65 63 76 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 ecv_len = sizeof
9230: 28 72 65 63 76 5f 62 75 66 29 3b 0a 09 09 09 09 (recv_buf);.....
9240: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d scard_xmit_ret =
9250: 20 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28 73 SCardTransmit(s
9260: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 lot->pcsc_card,
9270: 70 69 6f 53 65 6e 64 50 63 69 2c 20 78 6d 69 74 pioSendPci, xmit
9280: 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20 _buf, xmit_len,
9290: 4e 55 4c 4c 2c 20 72 65 63 76 5f 62 75 66 2c 20 NULL, recv_buf,
92a0: 26 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 09 09 &recv_len);.....
92b0: 09 69 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f .if (scard_xmit_
92c0: 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 ret != SCARD_S_S
92d0: 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09 09 43 UCCESS) {......C
92e0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
92f0: 54 46 28 22 52 65 74 72 61 6e 73 6d 69 74 20 66 TF("Retransmit f
9300: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 ailed, returning
9310: 20 69 6e 20 66 61 69 6c 75 72 65 20 61 66 74 65 in failure afte
9320: 72 20 64 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20 r disconnecting
9330: 74 68 65 20 63 61 72 64 20 28 53 43 61 72 64 54 the card (SCardT
9340: 72 61 6e 73 6d 69 74 20 3d 20 25 73 2f 25 6c 69 ransmit = %s/%li
9350: 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 )", CACKEY_DEBUG
9360: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 _FUNC_SCARDERR_T
9370: 4f 5f 53 54 52 28 73 63 61 72 64 5f 78 6d 69 74 O_STR(scard_xmit
9380: 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 _ret), (long) sc
9390: 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a ard_xmit_ret);..
93a0: 09 09 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e .....SCardDiscon
93b0: 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f nect(slot->pcsc_
93c0: 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 card, SCARD_LEAV
93d0: 45 5f 43 41 52 44 29 3b 0a 09 09 09 09 09 73 6c E_CARD);......sl
93e0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f ot->pcsc_card_co
93f0: 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 nnected = 0;....
9400: 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 .../* End Smartc
9410: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 ard Transaction
9420: 2a 2f 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72 */......slot->tr
9430: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 ansaction_depth
9440: 3d 20 31 3b 0a 09 09 09 09 09 63 61 63 6b 65 79 = 1;......cackey
9450: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e _end_transaction
9460: 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 09 72 65 (slot);.......re
9470: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 turn(CACKEY_PCSC
9480: 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b _E_TOKENABSENT);
9490: 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 .....}....} else
94a0: 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 {.....CACKEY_DE
94b0: 42 55 47 5f 50 52 49 4e 54 46 28 22 44 69 73 63 BUG_PRINTF("Disc
94c0: 6f 6e 6e 65 63 74 69 6e 67 20 63 61 72 64 22 29 onnecting card")
94d0: 3b 0a 0a 09 09 09 09 53 43 61 72 64 44 69 73 63 ;......SCardDisc
94e0: 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 onnect(slot->pcs
94f0: 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 c_card, SCARD_LE
9500: 41 56 45 5f 43 41 52 44 29 3b 0a 09 09 09 09 73 AVE_CARD);.....s
9510: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 lot->pcsc_card_c
9520: 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 onnected = 0;...
9530: 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 .../* End Smartc
9540: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 ard Transaction
9550: 2a 2f 0a 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 */.....slot->tra
9560: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d nsaction_depth =
9570: 20 31 3b 0a 09 09 09 09 63 61 63 6b 65 79 5f 65 1;.....cackey_e
9580: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 nd_transaction(s
9590: 6c 6f 74 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 lot);......CACKE
95a0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
95b0: 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 Returning in fai
95c0: 6c 75 72 65 22 29 3b 0a 09 09 09 09 72 65 74 75 lure");.....retu
95d0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 rn(CACKEY_PCSC_E
95e0: 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 _TOKENABSENT);..
95f0: 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 ..}...} else {..
9600: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
9610: 52 49 4e 54 46 28 22 44 69 73 63 6f 6e 6e 65 63 RINTF("Disconnec
9620: 74 69 6e 67 20 63 61 72 64 22 29 3b 0a 0a 09 09 ting card");....
9630: 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 .SCardDisconnect
9640: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 (slot->pcsc_card
9650: 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 , SCARD_LEAVE_CA
9660: 52 44 29 3b 0a 09 09 09 73 6c 6f 74 2d 3e 70 63 RD);....slot->pc
9670: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 sc_card_connecte
9680: 64 20 3d 20 30 3b 0a 0a 09 09 09 2f 2a 20 45 6e d = 0;...../* En
9690: 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e d Smartcard Tran
96a0: 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 73 6c saction */....sl
96b0: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f ot->transaction_
96c0: 64 65 70 74 68 20 3d 20 31 3b 0a 09 09 09 63 61 depth = 1;....ca
96d0: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 ckey_end_transac
96e0: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 tion(slot);.....
96f0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
9700: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 NTF("Returning i
9710: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 09 09 09 n failure");....
9720: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 return(CACKEY_PC
9730: 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 SC_E_TOKENABSENT
9740: 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b );...}..}...CACK
9750: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 EY_DEBUG_PRINTBU
9760: 46 28 22 52 65 74 75 72 6e 65 64 20 56 61 6c 75 F("Returned Valu
9770: 65 3a 22 2c 20 72 65 63 76 5f 62 75 66 2c 20 72 e:", recv_buf, r
9780: 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 ecv_len);...if (
9790: 72 65 63 76 5f 6c 65 6e 20 3c 20 32 29 20 7b 0a recv_len < 2) {.
97a0: 09 09 2f 2a 20 4d 69 6e 69 6d 61 6c 20 72 65 73 ../* Minimal res
97b0: 70 6f 6e 73 65 20 6c 65 6e 67 74 68 20 69 73 20 ponse length is
97c0: 32 20 62 79 74 65 73 2c 20 72 65 74 75 72 6e 69 2 bytes, returni
97d0: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20 2a 2f ng in failure */
97e0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
97f0: 50 52 49 4e 54 46 28 22 52 65 73 70 6f 6e 73 65 PRINTF("Response
9800: 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65 74 75 too small, retu
9810: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 rning in failure
9820: 20 28 72 65 63 76 5f 6c 65 6e 20 3d 20 25 6c 75 (recv_len = %lu
9830: 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f )", (unsigned lo
9840: 6e 67 29 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a ng) recv_len);..
9850: 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 ../* End Smartca
9860: 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a rd Transaction *
9870: 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 /...cackey_end_t
9880: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 ransaction(slot)
9890: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b ;....return(CACK
98a0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 EY_PCSC_E_GENERI
98b0: 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 C);..}.../* Dete
98c0: 72 6d 69 6e 65 20 72 65 73 75 6c 74 20 63 6f 64 rmine result cod
98d0: 65 20 2a 2f 0a 09 6d 61 6a 6f 72 5f 72 63 20 3d e */..major_rc =
98e0: 20 72 65 63 76 5f 62 75 66 5b 72 65 63 76 5f 6c recv_buf[recv_l
98f0: 65 6e 20 2d 20 32 5d 3b 0a 09 6d 69 6e 6f 72 5f en - 2];..minor_
9900: 72 63 20 3d 20 72 65 63 76 5f 62 75 66 5b 72 65 rc = recv_buf[re
9910: 63 76 5f 6c 65 6e 20 2d 20 31 5d 3b 0a 09 69 66 cv_len - 1];..if
9920: 20 28 72 65 73 70 63 6f 64 65 29 20 7b 0a 09 09 (respcode) {...
9930: 2a 72 65 73 70 63 6f 64 65 20 3d 20 28 6d 61 6a *respcode = (maj
9940: 6f 72 5f 72 63 20 3c 3c 20 38 29 20 7c 20 6d 69 or_rc << 8) | mi
9950: 6e 6f 72 5f 72 63 3b 0a 09 7d 0a 0a 09 2f 2a 20 nor_rc;..}.../*
9960: 41 64 6a 75 73 74 20 6d 65 73 73 61 67 65 20 62 Adjust message b
9970: 75 66 66 65 72 20 2a 2f 0a 09 72 65 63 76 5f 6c uffer */..recv_l
9980: 65 6e 20 2d 3d 20 32 3b 0a 0a 09 2f 2a 20 41 64 en -= 2;.../* Ad
9990: 64 20 62 79 74 65 73 20 74 6f 20 72 65 74 75 72 d bytes to retur
99a0: 6e 20 76 61 6c 75 65 20 2a 2f 0a 09 74 6d 70 5f n value */..tmp_
99b0: 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20 30 respdata_len = 0
99c0: 3b 0a 09 69 66 20 28 72 65 73 70 64 61 74 61 20 ;..if (respdata
99d0: 26 26 20 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 && respdata_len)
99e0: 20 7b 0a 09 09 74 6d 70 5f 72 65 73 70 64 61 74 {...tmp_respdat
99f0: 61 5f 6c 65 6e 20 3d 20 2a 72 65 73 70 64 61 74 a_len = *respdat
9a00: 61 5f 6c 65 6e 3b 0a 0a 09 09 62 79 74 65 73 5f a_len;....bytes_
9a10: 74 6f 5f 63 6f 70 79 20 3d 20 2a 72 65 73 70 64 to_copy = *respd
9a20: 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 69 66 20 28 ata_len;....if (
9a30: 72 65 63 76 5f 6c 65 6e 20 3c 20 62 79 74 65 73 recv_len < bytes
9a40: 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a 09 09 09 62 _to_copy) {....b
9a50: 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 72 ytes_to_copy = r
9a60: 65 63 76 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09 ecv_len;...}....
9a70: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
9a80: 4e 54 46 28 22 43 6f 70 79 69 6e 67 20 25 6c 75 NTF("Copying %lu
9a90: 20 62 79 74 65 73 20 74 6f 20 74 68 65 20 62 75 bytes to the bu
9aa0: 66 66 65 72 20 28 72 65 63 76 27 64 20 25 6c 75 ffer (recv'd %lu
9ab0: 20 62 79 74 65 73 2c 20 62 75 74 20 6f 6e 6c 79 bytes, but only
9ac0: 20 25 6c 75 20 62 79 74 65 73 20 6c 65 66 74 20 %lu bytes left
9ad0: 69 6e 20 6f 75 72 20 62 75 66 66 65 72 29 22 2c in our buffer)",
9ae0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
9af0: 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 2c 20 bytes_to_copy,
9b00: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
9b10: 72 65 63 76 5f 6c 65 6e 2c 20 28 75 6e 73 69 67 recv_len, (unsig
9b20: 6e 65 64 20 6c 6f 6e 67 29 20 2a 72 65 73 70 64 ned long) *respd
9b30: 61 74 61 5f 6c 65 6e 29 3b 0a 0a 09 09 6d 65 6d ata_len);....mem
9b40: 63 70 79 28 72 65 73 70 64 61 74 61 2c 20 72 65 cpy(respdata, re
9b50: 63 76 5f 62 75 66 2c 20 62 79 74 65 73 5f 74 6f cv_buf, bytes_to
9b60: 5f 63 6f 70 79 29 3b 0a 09 09 72 65 73 70 64 61 _copy);...respda
9b70: 74 61 20 2b 3d 20 62 79 74 65 73 5f 74 6f 5f 63 ta += bytes_to_c
9b80: 6f 70 79 3b 0a 0a 09 09 2a 72 65 73 70 64 61 74 opy;....*respdat
9b90: 61 5f 6c 65 6e 20 3d 20 62 79 74 65 73 5f 74 6f a_len = bytes_to
9ba0: 5f 63 6f 70 79 3b 0a 09 09 74 6d 70 5f 72 65 73 _copy;...tmp_res
9bb0: 70 64 61 74 61 5f 6c 65 6e 20 2d 3d 20 62 79 74 pdata_len -= byt
9bc0: 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 09 7d 20 65 es_to_copy;..} e
9bd0: 6c 73 65 20 7b 0a 09 09 69 66 20 28 72 65 63 76 lse {...if (recv
9be0: 5f 6c 65 6e 20 21 3d 20 30 29 20 7b 0a 09 09 09 _len != 0) {....
9bf0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
9c00: 4e 54 46 28 22 54 68 72 6f 77 69 6e 67 20 61 77 NTF("Throwing aw
9c10: 61 79 20 25 6c 75 20 62 79 74 65 73 2c 20 6e 6f ay %lu bytes, no
9c20: 77 68 65 72 65 20 74 6f 20 70 75 74 20 74 68 65 where to put the
9c30: 6d 21 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c m!", (unsigned l
9c40: 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e 29 3b 0a ong) recv_len);.
9c50: 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6d 61 6a ..}..}...if (maj
9c60: 6f 72 5f 72 63 20 3d 3d 20 30 78 36 31 29 20 7b or_rc == 0x61) {
9c70: 0a 09 09 2f 2a 20 57 65 20 6e 65 65 64 20 74 6f .../* We need to
9c80: 20 52 45 41 44 20 2a 2f 0a 09 09 43 41 43 4b 45 READ */...CACKE
9c90: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
9ca0: 42 75 66 66 65 72 20 72 65 61 64 20 72 65 71 75 Buffer read requ
9cb0: 69 72 65 64 22 29 3b 0a 0a 09 09 69 66 20 28 6d ired");....if (m
9cc0: 69 6e 6f 72 5f 72 63 20 3d 3d 20 30 78 30 30 29 inor_rc == 0x00)
9cd0: 20 7b 0a 09 09 09 6d 69 6e 6f 72 5f 72 63 20 3d {....minor_rc =
9ce0: 20 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 CACKEY_APDU_MTU
9cf0: 3b 0a 09 09 7d 0a 0a 09 09 70 63 73 63 5f 67 65 ;...}....pcsc_ge
9d00: 74 72 65 73 70 5f 72 65 74 20 3d 20 63 61 63 6b tresp_ret = cack
9d10: 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f ey_send_apdu(slo
9d20: 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 t, GSCIS_CLASS_I
9d30: 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e SO7816, GSCIS_IN
9d40: 53 54 52 5f 47 45 54 5f 52 45 53 50 4f 4e 53 45 STR_GET_RESPONSE
9d50: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 2c , 0x00, 0x00, 0,
9d60: 20 4e 55 4c 4c 2c 20 6d 69 6e 6f 72 5f 72 63 2c NULL, minor_rc,
9d70: 20 72 65 73 70 63 6f 64 65 2c 20 72 65 73 70 64 respcode, respd
9d80: 61 74 61 2c 20 26 74 6d 70 5f 72 65 73 70 64 61 ata, &tmp_respda
9d90: 74 61 5f 6c 65 6e 29 3b 0a 0a 09 09 69 66 20 28 ta_len);....if (
9da0: 70 63 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 pcsc_getresp_ret
9db0: 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f != CACKEY_PCSC_
9dc0: 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 S_OK) {....CACKE
9dd0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
9de0: 42 75 66 66 65 72 20 72 65 61 64 20 66 61 69 6c Buffer read fail
9df0: 65 64 21 20 20 52 65 74 75 72 6e 69 6e 67 20 69 ed! Returning i
9e00: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 n failure");....
9e10: 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 ./* End Smartcar
9e20: 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f d Transaction */
9e30: 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 ....cackey_end_t
9e40: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 ransaction(slot)
9e50: 3b 0a 0a 09 09 09 69 66 20 28 70 63 73 63 5f 67 ;.....if (pcsc_g
9e60: 65 74 72 65 73 70 5f 72 65 74 20 3d 3d 20 43 41 etresp_ret == CA
9e70: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 CKEY_PCSC_E_RETR
9e80: 59 29 20 7b 0a 09 09 09 09 72 65 74 75 72 6e 28 Y) {.....return(
9e90: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 CACKEY_PCSC_E_RE
9ea0: 54 52 59 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 TRY);....}.....r
9eb0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 eturn(CACKEY_PCS
9ec0: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 C_E_GENERIC);...
9ed0: 7d 0a 0a 09 09 69 66 20 28 72 65 73 70 64 61 74 }....if (respdat
9ee0: 61 5f 6c 65 6e 29 20 7b 0a 09 09 09 2a 72 65 73 a_len) {....*res
9ef0: 70 64 61 74 61 5f 6c 65 6e 20 2b 3d 20 74 6d 70 pdata_len += tmp
9f00: 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 09 _respdata_len;..
9f10: 09 7d 0a 0a 09 09 2f 2a 20 45 6e 64 20 53 6d 61 .}..../* End Sma
9f20: 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 rtcard Transacti
9f30: 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 on */...cackey_e
9f40: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 nd_transaction(s
9f50: 6c 6f 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f lot);....CACKEY_
9f60: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
9f70: 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 turning in succe
9f80: 73 73 20 28 62 75 66 66 65 72 20 72 65 61 64 20 ss (buffer read
9f90: 63 6f 6d 70 6c 65 74 65 29 22 29 3b 0a 09 09 72 complete)");...r
9fa0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 eturn(CACKEY_PCS
9fb0: 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 2f 2a C_S_OK);..}.../*
9fc0: 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 End Smartcard T
9fd0: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 ransaction */..c
9fe0: 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 ackey_end_transa
9ff0: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 69 ction(slot);...i
a000: 66 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d 20 30 f (major_rc == 0
a010: 78 39 30 29 20 7b 0a 09 09 2f 2a 20 53 75 63 63 x90) {.../* Succ
a020: 65 73 73 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f ess */...CACKEY_
a030: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
a040: 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 turning in succe
a050: 73 73 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 20 30 ss (major_rc = 0
a060: 78 39 30 29 22 29 3b 0a 0a 09 09 72 65 74 75 72 x90)");....retur
a070: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f n(CACKEY_PCSC_S_
a080: 4f 4b 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b 45 OK);..}....CACKE
a090: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
a0a0: 41 50 44 55 20 52 65 74 75 72 6e 65 64 20 61 6e APDU Returned an
a0b0: 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 69 6e error, returnin
a0c0: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a g in failure");.
a0d0: 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f ..return(CACKEY_
a0e0: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b PCSC_E_GENERIC);
a0f0: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 .}../*. * SYNPOS
a100: 49 53 0a 20 2a 20 20 20 20 20 73 73 69 7a 65 5f IS. * ssize_
a110: 74 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 t cackey_read_bu
a120: 66 66 65 72 28 73 74 72 75 63 74 20 63 61 63 6b ffer(struct cack
a130: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 ey_slot *slot, u
a140: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 nsigned char *bu
a150: 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 63 6f 75 ffer, size_t cou
a160: 6e 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nt, unsigned cha
a170: 72 20 74 5f 6f 72 5f 76 2c 20 73 69 7a 65 5f 74 r t_or_v, size_t
a180: 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 29 initial_offset)
a190: 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 ;. *. * ARGUMENT
a1a0: 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74 20 S. * struct
a1b0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f cackey_slot *slo
a1c0: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f t. * Slo
a1d0: 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e t to send comman
a1e0: 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 ds to. *. *
a1f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 unsigned char *b
a200: 75 66 66 65 72 0a 20 2a 20 20 20 20 20 20 20 20 uffer. *
a210: 20 5b 4f 55 54 5d 20 42 75 66 66 65 72 0a 20 2a [OUT] Buffer. *
a220: 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 63 . * size_t c
a230: 6f 75 6e 74 0a 20 2a 20 20 20 20 20 20 20 20 20 ount. *
a240: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 Number of bytes
a250: 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 to attempt to re
a260: 61 64 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 ad. *. * uns
a270: 69 67 6e 65 64 20 63 68 61 72 20 74 5f 6f 72 5f igned char t_or_
a280: 76 0a 20 2a 20 20 20 20 20 20 20 20 20 53 65 6c v. * Sel
a290: 65 63 74 20 74 68 65 20 54 2d 62 75 66 66 65 72 ect the T-buffer
a2a0: 20 28 30 31 29 20 6f 72 20 56 2d 62 75 66 66 65 (01) or V-buffe
a2b0: 72 20 28 30 32 29 20 74 6f 20 72 65 61 64 20 66 r (02) to read f
a2c0: 72 6f 6d 2e 20 20 0a 20 2a 0a 20 2a 20 20 20 20 rom. . *. *
a2d0: 20 73 69 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f size_t initial_
a2e0: 6f 66 66 73 65 74 0a 20 2a 20 20 20 20 20 20 20 offset. *
a2f0: 20 20 53 70 65 63 69 66 79 20 74 68 65 20 6f 66 Specify the of
a300: 66 73 65 74 20 74 6f 20 62 65 67 69 6e 20 74 68 fset to begin th
a310: 65 20 72 65 61 64 20 66 72 6f 6d 0a 20 2a 0a 20 e read from. *.
a320: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 *. * RETURN VALU
a330: 45 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 E. * This fu
a340: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 nction returns t
a350: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 he number of byt
a360: 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 es actually read
a370: 2c 20 6f 72 20 2d 31 20 6f 6e 20 65 72 72 6f 72 , or -1 on error
a380: 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a .. *. * NOTES. *
a390: 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f None. *. */
a3a0: 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f 74 20 .static ssize_t
a3b0: 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 cackey_read_buff
a3c0: 65 72 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 er(struct cackey
a3d0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 _slot *slot, uns
a3e0: 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 igned char *buff
a3f0: 65 72 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 er, size_t count
a400: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 , unsigned char
a410: 74 5f 6f 72 5f 76 2c 20 73 69 7a 65 5f 74 20 69 t_or_v, size_t i
a420: 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 29 20 7b nitial_offset) {
a430: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 ..unsigned char
a440: 2a 69 6e 69 74 5f 62 75 66 66 65 72 3b 0a 09 73 *init_buffer;..s
a450: 69 7a 65 5f 74 20 69 6e 69 74 5f 63 6f 75 6e 74 ize_t init_count
a460: 3b 0a 09 73 69 7a 65 5f 74 20 69 6e 69 74 5f 69 ;..size_t init_i
a470: 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 3b 0a 0a nitial_offset;..
a480: 09 73 69 7a 65 5f 74 20 6f 66 66 73 65 74 20 3d .size_t offset =
a490: 20 30 2c 20 6d 61 78 5f 6f 66 66 73 65 74 2c 20 0, max_offset,
a4a0: 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09 75 6e 73 69 max_count;..unsi
a4b0: 67 6e 65 64 20 63 68 61 72 20 63 6d 64 5b 32 5d gned char cmd[2]
a4c0: 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70 ;..uint16_t resp
a4d0: 63 6f 64 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f code;..int send_
a4e0: 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ret;...CACKEY_DE
a4f0: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
a500: 65 64 2e 22 29 3b 0a 0a 09 69 6e 69 74 5f 62 75 ed.");...init_bu
a510: 66 66 65 72 20 3d 20 62 75 66 66 65 72 3b 0a 09 ffer = buffer;..
a520: 69 6e 69 74 5f 63 6f 75 6e 74 20 3d 20 63 6f 75 init_count = cou
a530: 6e 74 3b 0a 09 69 6e 69 74 5f 69 6e 69 74 69 61 nt;..init_initia
a540: 6c 5f 6f 66 66 73 65 74 20 3d 20 69 6e 69 74 69 l_offset = initi
a550: 61 6c 5f 6f 66 66 73 65 74 3b 0a 0a 09 6d 61 78 al_offset;...max
a560: 5f 6f 66 66 73 65 74 20 3d 20 63 6f 75 6e 74 3b _offset = count;
a570: 0a 09 6d 61 78 5f 63 6f 75 6e 74 20 3d 20 43 41 ..max_count = CA
a580: 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 3b 0a 0a CKEY_APDU_MTU;..
a590: 09 69 66 20 28 74 5f 6f 72 5f 76 20 21 3d 20 31 .if (t_or_v != 1
a5a0: 20 26 26 20 74 5f 6f 72 5f 76 20 21 3d 20 32 29 && t_or_v != 2)
a5b0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
a5c0: 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 G_PRINTF("Invali
a5d0: 64 20 54 20 6f 72 20 56 20 70 61 72 61 6d 65 74 d T or V paramet
a5e0: 65 72 20 73 70 65 63 69 66 69 65 64 2c 20 72 65 er specified, re
a5f0: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 turning in failu
a600: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 re");....return(
a610: 2d 31 29 3b 0a 09 7d 0a 0a 09 63 6d 64 5b 30 5d -1);..}...cmd[0]
a620: 20 3d 20 74 5f 6f 72 5f 76 3b 0a 0a 09 77 68 69 = t_or_v;...whi
a630: 6c 65 20 28 31 29 20 7b 0a 09 09 69 66 20 28 6f le (1) {...if (o
a640: 66 66 73 65 74 20 3e 3d 20 6d 61 78 5f 6f 66 66 ffset >= max_off
a650: 73 65 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 set) {....CACKEY
a660: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 42 _DEBUG_PRINTF("B
a670: 75 66 66 65 72 20 74 6f 6f 20 73 6d 61 6c 6c 2c uffer too small,
a680: 20 72 65 74 75 72 6e 69 6e 67 20 77 68 61 74 20 returning what
a690: 77 65 20 67 6f 74 2e 2e 2e 22 29 3b 0a 0a 09 09 we got...");....
a6a0: 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 63 .break;...}....c
a6b0: 6f 75 6e 74 20 3d 20 6d 61 78 5f 6f 66 66 73 65 ount = max_offse
a6c0: 74 20 2d 20 6f 66 66 73 65 74 3b 0a 09 09 69 66 t - offset;...if
a6d0: 20 28 63 6f 75 6e 74 20 3e 20 6d 61 78 5f 63 6f (count > max_co
a6e0: 75 6e 74 29 20 7b 0a 09 09 09 63 6f 75 6e 74 20 unt) {....count
a6f0: 3d 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09 09 7d = max_count;...}
a700: 0a 0a 09 09 63 6d 64 5b 31 5d 20 3d 20 63 6f 75 ....cmd[1] = cou
a710: 6e 74 3b 0a 0a 09 09 73 65 6e 64 5f 72 65 74 20 nt;....send_ret
a720: 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 = cackey_send_ap
a730: 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 du(slot, GSCIS_C
a740: 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 LASS_GLOBAL_PLAT
a750: 46 4f 52 4d 2c 20 47 53 43 49 53 5f 49 4e 53 54 FORM, GSCIS_INST
a760: 52 5f 52 45 41 44 5f 42 55 46 46 45 52 2c 20 28 R_READ_BUFFER, (
a770: 28 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 20 (initial_offset
a780: 2b 20 6f 66 66 73 65 74 29 20 3e 3e 20 38 29 20 + offset) >> 8)
a790: 26 20 30 78 66 66 2c 20 28 69 6e 69 74 69 61 6c & 0xff, (initial
a7a0: 5f 6f 66 66 73 65 74 20 2b 20 6f 66 66 73 65 74 _offset + offset
a7b0: 29 20 26 20 30 78 66 66 2c 20 73 69 7a 65 6f 66 ) & 0xff, sizeof
a7c0: 28 63 6d 64 29 2c 20 63 6d 64 2c 20 30 78 30 30 (cmd), cmd, 0x00
a7d0: 2c 20 26 72 65 73 70 63 6f 64 65 2c 20 62 75 66 , &respcode, buf
a7e0: 66 65 72 20 2b 20 6f 66 66 73 65 74 2c 20 26 63 fer + offset, &c
a7f0: 6f 75 6e 74 29 3b 0a 0a 09 09 69 66 20 28 73 65 ount);....if (se
a800: 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 nd_ret == CACKEY
a810: 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29 20 7b _PCSC_E_RETRY) {
a820: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
a830: 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20 53 65 _PRINTF("ADPU Se
a840: 6e 64 69 6e 67 20 66 61 69 6c 65 64 2c 20 72 65 nding failed, re
a850: 74 72 79 69 6e 67 20 72 65 61 64 20 62 75 66 66 trying read buff
a860: 65 72 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e er");.....return
a870: 28 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 (cackey_read_buf
a880: 66 65 72 28 73 6c 6f 74 2c 20 69 6e 69 74 5f 62 fer(slot, init_b
a890: 75 66 66 65 72 2c 20 69 6e 69 74 5f 63 6f 75 6e uffer, init_coun
a8a0: 74 2c 20 74 5f 6f 72 5f 76 2c 20 69 6e 69 74 5f t, t_or_v, init_
a8b0: 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 29 29 initial_offset))
a8c0: 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 65 6e ;...}....if (sen
a8d0: 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f d_ret != CACKEY_
a8e0: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 PCSC_S_OK) {....
a8f0: 69 66 20 28 72 65 73 70 63 6f 64 65 20 3d 3d 20 if (respcode ==
a900: 30 78 36 41 38 36 29 20 7b 0a 09 09 09 09 69 66 0x6A86) {.....if
a910: 20 28 6d 61 78 5f 63 6f 75 6e 74 20 3d 3d 20 31 (max_count == 1
a920: 29 20 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a ) {......break;.
a930: 09 09 09 09 7d 0a 0a 09 09 09 09 6d 61 78 5f 63 ....}......max_c
a940: 6f 75 6e 74 20 3d 20 6d 61 78 5f 63 6f 75 6e 74 ount = max_count
a950: 20 2f 20 32 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 / 2;......conti
a960: 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41 nue;....}.....CA
a970: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
a980: 46 28 22 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 F("cackey_send_a
a990: 70 64 75 28 29 20 66 61 69 6c 65 64 2c 20 72 65 pdu() failed, re
a9a0: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 turning in failu
a9b0: 72 65 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e re");.....return
a9c0: 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 6f 66 66 (-1);...}....off
a9d0: 73 65 74 20 2b 3d 20 63 6f 75 6e 74 3b 0a 0a 09 set += count;...
a9e0: 09 69 66 20 28 63 6f 75 6e 74 20 3c 20 6d 61 78 .if (count < max
a9f0: 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41 43 _count) {....CAC
aa00: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
aa10: 28 22 53 68 6f 72 74 20 72 65 61 64 20 2d 2d 20 ("Short read --
aa20: 63 6f 75 6e 74 20 3d 20 25 69 2c 20 63 6d 64 5b count = %i, cmd[
aa30: 31 5d 20 3d 20 25 69 22 2c 20 28 69 6e 74 29 20 1] = %i", (int)
aa40: 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63 6d 64 count, (int) cmd
aa50: 5b 31 5d 29 3b 0a 0a 09 09 09 62 72 65 61 6b 3b [1]);.....break;
aa60: 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20 ...}..}..#ifdef
aa70: 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a CACKEY_PARANOID.
aa80: 23 20 20 69 66 64 65 66 20 5f 50 4f 53 49 58 5f # ifdef _POSIX_
aa90: 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28 6f SSIZE_MAX..if (o
aaa0: 66 66 73 65 74 20 3e 20 5f 50 4f 53 49 58 5f 53 ffset > _POSIX_S
aab0: 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 SIZE_MAX) {...CA
aac0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
aad0: 46 28 22 4f 66 66 73 65 74 20 65 78 63 65 65 64 F("Offset exceed
aae0: 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 2c s maximum value,
aaf0: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 returning in fa
ab00: 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20 25 6c ilure. (max = %l
ab10: 69 2c 20 6f 66 66 73 65 74 20 3d 20 25 6c 75 29 i, offset = %lu)
ab20: 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 ", (long) _POSIX
ab30: 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 _SSIZE_MAX, (uns
ab40: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 66 66 73 igned long) offs
ab50: 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d et);....return(-
ab60: 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69 66 0a 1);..}.# endif.
ab70: 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f #endif...CACKEY_
ab80: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
ab90: 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 turning in succe
aba0: 73 73 2c 20 72 65 61 64 20 25 6c 75 20 62 79 74 ss, read %lu byt
abb0: 65 73 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c es", (unsigned l
abc0: 6f 6e 67 29 20 6f 66 66 73 65 74 29 3b 0a 0a 09 ong) offset);...
abd0: 72 65 74 75 72 6e 28 6f 66 66 73 65 74 29 3b 0a return(offset);.
abe0: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 }../*. * SYNPOSI
abf0: 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f S. * cackey_
ac00: 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 ret cackey_selec
ac10: 74 5f 61 70 70 6c 65 74 28 73 74 72 75 63 74 20 t_applet(struct
ac20: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f cackey_slot *slo
ac30: 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 t, unsigned char
ac40: 20 2a 61 69 64 2c 20 73 69 7a 65 5f 74 20 61 69 *aid, size_t ai
ac50: 64 5f 6c 65 6e 29 3b 0a 20 2a 0a 20 2a 20 41 52 d_len);. *. * AR
ac60: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 GUMENTS. * s
ac70: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f truct cackey_slo
ac80: 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 t *slot. *
ac90: 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 Slot to send
aca0: 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 commands to. *.
acb0: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 * unsigned c
acc0: 68 61 72 20 2a 61 69 64 0a 20 2a 20 20 20 20 20 har *aid. *
acd0: 20 20 20 20 42 75 66 66 65 72 20 63 6f 6e 74 61 Buffer conta
ace0: 69 6e 69 6e 67 20 41 70 70 6c 65 74 20 49 44 20 ining Applet ID
acf0: 74 6f 20 73 65 6c 65 63 74 0a 20 2a 0a 20 2a 20 to select. *. *
ad00: 20 20 20 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c size_t aid_l
ad10: 65 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 4e 75 en. * Nu
ad20: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e mber of bytes in
ad30: 20 74 68 65 20 22 61 69 64 22 20 28 41 70 70 6c the "aid" (Appl
ad40: 65 74 20 49 44 29 20 70 61 72 61 6d 65 74 65 72 et ID) parameter
ad50: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 . *. * RETURN VA
ad60: 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 LUE. * CACKE
ad70: 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 Y_PCSC_S_OK
ad80: 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 On success.
ad90: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 * CACKEY_PCS
ada0: 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f C_E_GENERIC O
adb0: 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f n error. *. * NO
adc0: 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a TES. * None.
add0: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 *. */.static ca
ade0: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f ckey_ret cackey_
adf0: 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 74 select_applet(st
ae00: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 ruct cackey_slot
ae10: 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 *slot, unsigned
ae20: 20 63 68 61 72 20 2a 61 69 64 2c 20 73 69 7a 65 char *aid, size
ae30: 5f 74 20 61 69 64 5f 6c 65 6e 29 20 7b 0a 09 69 _t aid_len) {..i
ae40: 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 nt send_ret;...C
ae50: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
ae60: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
ae70: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
ae80: 49 4e 54 42 55 46 28 22 53 65 6c 65 63 74 69 6e INTBUF("Selectin
ae90: 67 20 61 70 70 6c 65 74 3a 22 2c 20 61 69 64 2c g applet:", aid,
aea0: 20 61 69 64 5f 6c 65 6e 29 3b 0a 0a 09 73 65 6e aid_len);...sen
aeb0: 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 d_ret = cackey_s
aec0: 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 end_apdu(slot, G
aed0: 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 SCIS_CLASS_ISO78
aee0: 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 16, GSCIS_INSTR_
aef0: 53 45 4c 45 43 54 2c 20 47 53 43 49 53 5f 50 41 SELECT, GSCIS_PA
af00: 52 41 4d 5f 53 45 4c 45 43 54 5f 41 50 50 4c 45 RAM_SELECT_APPLE
af10: 54 2c 20 30 78 30 30 2c 20 61 69 64 5f 6c 65 6e T, 0x00, aid_len
af20: 2c 20 61 69 64 2c 20 30 78 30 30 2c 20 4e 55 4c , aid, 0x00, NUL
af30: 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a L, NULL, NULL);.
af40: 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 3d ..if (send_ret =
af50: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f = CACKEY_PCSC_E_
af60: 52 45 54 52 59 29 20 7b 0a 09 09 43 41 43 4b 45 RETRY) {...CACKE
af70: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
af80: 41 44 50 55 20 53 65 6e 64 69 6e 67 20 66 61 69 ADPU Sending fai
af90: 6c 65 64 2c 20 72 65 74 72 79 69 6e 67 20 73 65 led, retrying se
afa0: 6c 65 63 74 20 61 70 70 6c 65 74 22 29 3b 0a 0a lect applet");..
afb0: 09 09 72 65 74 75 72 6e 28 63 61 63 6b 65 79 5f ..return(cackey_
afc0: 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c select_applet(sl
afd0: 6f 74 2c 20 61 69 64 2c 20 61 69 64 5f 6c 65 6e ot, aid, aid_len
afe0: 29 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 65 6e ));..}...if (sen
aff0: 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f d_ret != CACKEY_
b000: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 PCSC_S_OK) {...C
b010: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
b020: 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 6f 70 TF("Failed to op
b030: 65 6e 20 61 70 70 6c 65 74 2c 20 72 65 74 75 72 en applet, retur
b040: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 ning in failure"
b050: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 );....return(CAC
b060: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 KEY_PCSC_E_GENER
b070: 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 IC);..}...CACKEY
b080: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 _DEBUG_PRINTF("S
b090: 75 63 63 65 73 73 66 75 6c 6c 79 20 73 65 6c 65 uccessfully sele
b0a0: 63 74 65 64 20 66 69 6c 65 22 29 3b 0a 0a 09 72 cted file");...r
b0b0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 eturn(CACKEY_PCS
b0c0: 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 C_S_OK);.}../*.
b0d0: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 * SYNPOSIS. *
b0e0: 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 cackey_ret cac
b0f0: 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 key_select_file(
b100: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c struct cackey_sl
b110: 6f 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74 31 36 ot *slot, uint16
b120: 5f 74 20 65 66 29 3b 0a 20 2a 0a 20 2a 20 41 52 _t ef);. *. * AR
b130: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 GUMENTS. * s
b140: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f truct cackey_slo
b150: 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 t *slot. *
b160: 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 Slot to send
b170: 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 commands to. *.
b180: 2a 20 20 20 20 20 75 69 6e 74 31 36 5f 74 20 65 * uint16_t e
b190: 66 0a 20 2a 20 20 20 20 20 20 20 20 20 45 6c 65 f. * Ele
b1a0: 6d 65 6e 74 61 6c 20 46 69 6c 65 20 74 6f 20 73 mental File to s
b1b0: 65 6c 65 63 74 0a 20 2a 0a 20 2a 20 52 45 54 55 elect. *. * RETU
b1c0: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 RN VALUE. *
b1d0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b CACKEY_PCSC_S_OK
b1e0: 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 On succ
b1f0: 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 ess. * CACKE
b200: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 Y_PCSC_E_GENERIC
b210: 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a On error. *.
b220: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 * NOTES. *
b230: 54 68 69 73 20 73 65 6c 65 63 74 73 20 61 6e 20 This selects an
b240: 45 6c 65 6d 65 6e 74 61 72 79 20 46 69 6c 65 20 Elementary File
b250: 28 45 46 29 20 75 6e 64 65 72 20 74 68 65 20 63 (EF) under the c
b260: 75 72 72 65 6e 74 6c 79 20 73 65 6c 65 63 74 65 urrently selecte
b270: 64 0a 20 2a 20 20 20 20 20 44 65 64 69 63 61 74 d. * Dedicat
b280: 65 64 20 46 69 6c 65 20 28 44 46 29 0a 20 2a 0a ed File (DF). *.
b290: 20 2a 20 20 20 20 20 54 79 70 69 63 61 6c 6c 79 * Typically
b2a0: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 this is called
b2b0: 61 66 74 65 72 20 73 65 6c 65 63 74 69 6e 67 20 after selecting
b2c0: 74 68 65 20 63 6f 72 72 65 63 74 20 41 70 70 6c the correct Appl
b2d0: 65 74 20 28 75 73 69 6e 67 0a 20 2a 20 20 20 20 et (using. *
b2e0: 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 cackey_select_a
b2f0: 70 70 6c 65 74 29 20 66 6f 72 20 56 4d 20 63 61 pplet) for VM ca
b300: 72 64 73 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 rds. *. */.stati
b310: 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 c cackey_ret cac
b320: 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 key_select_file(
b330: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c struct cackey_sl
b340: 6f 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74 31 36 ot *slot, uint16
b350: 5f 74 20 65 66 29 20 7b 0a 09 75 6e 73 69 67 6e _t ef) {..unsign
b360: 65 64 20 63 68 61 72 20 66 69 64 5f 62 75 66 5b ed char fid_buf[
b370: 32 5d 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 2];..int send_re
b380: 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 t;...CACKEY_DEBU
b390: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 G_PRINTF("Called
b3a0: 2e 22 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 20 74 .");.../* Open t
b3b0: 68 65 20 65 6c 65 6d 65 6e 74 61 72 79 20 66 69 he elementary fi
b3c0: 6c 65 20 2a 2f 0a 09 66 69 64 5f 62 75 66 5b 30 le */..fid_buf[0
b3d0: 5d 20 3d 20 28 65 66 20 3e 3e 20 38 29 20 26 20 ] = (ef >> 8) &
b3e0: 30 78 66 66 3b 0a 09 66 69 64 5f 62 75 66 5b 31 0xff;..fid_buf[1
b3f0: 5d 20 3d 20 65 66 20 26 20 30 78 66 66 3b 0a 0a ] = ef & 0xff;..
b400: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
b410: 49 4e 54 46 28 22 53 65 6c 65 63 74 69 6e 67 20 INTF("Selecting
b420: 66 69 6c 65 3a 20 25 30 34 6c 78 22 2c 20 28 75 file: %04lx", (u
b430: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 65 66 nsigned long) ef
b440: 29 3b 0a 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 );...send_ret =
b450: 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 cackey_send_apdu
b460: 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 (slot, GSCIS_CLA
b470: 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49 SS_ISO7816, GSCI
b480: 53 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54 2c 20 S_INSTR_SELECT,
b490: 30 78 30 32 2c 20 30 78 30 43 2c 20 73 69 7a 65 0x02, 0x0C, size
b4a0: 6f 66 28 66 69 64 5f 62 75 66 29 2c 20 66 69 64 of(fid_buf), fid
b4b0: 5f 62 75 66 2c 20 30 78 30 30 2c 20 4e 55 4c 4c _buf, 0x00, NULL
b4c0: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 , NULL, NULL);..
b4d0: 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 if (send_ret !=
b4e0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b CACKEY_PCSC_S_OK
b4f0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
b500: 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 UG_PRINTF("Faile
b510: 64 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 2c 20 d to open file,
b520: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 returning in fai
b530: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 lure");....retur
b540: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f n(CACKEY_PCSC_E_
b550: 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 GENERIC);..}...C
b560: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
b570: 54 46 28 22 53 75 63 63 65 73 73 66 75 6c 6c 79 TF("Successfully
b580: 20 73 65 6c 65 63 74 65 64 20 66 69 6c 65 22 29 selected file")
b590: 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 ;...return(CACKE
b5a0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a Y_PCSC_S_OK);.}.
b5b0: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a ./*. * SYNPOSIS.
b5c0: 20 2a 20 20 20 20 20 76 6f 69 64 20 63 61 63 6b * void cack
b5d0: 65 79 5f 66 72 65 65 5f 74 6c 76 28 73 74 72 75 ey_free_tlv(stru
b5e0: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e ct cackey_tlv_en
b5f0: 74 69 74 79 20 2a 72 6f 6f 74 29 3b 0a 20 2a 0a tity *root);. *.
b600: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 * ARGUMENTS. *
b610: 20 20 20 20 73 74 72 75 63 74 20 63 61 63 6b 65 struct cacke
b620: 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 72 6f y_tlv_entity *ro
b630: 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 52 6f ot. * Ro
b640: 6f 74 20 6f 66 20 74 68 65 20 54 4c 56 20 6c 69 ot of the TLV li
b650: 73 74 20 74 6f 20 73 74 61 72 74 20 66 72 65 65 st to start free
b660: 69 6e 67 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e ing. *. * RETURN
b670: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f VALUE. * No
b680: 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 ne. *. * NOTES.
b690: 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 * This funct
b6a0: 69 6f 6e 20 66 72 65 65 73 20 74 68 65 20 54 4c ion frees the TL
b6b0: 56 20 6c 69 6e 6b 65 64 20 6c 69 73 74 65 64 20 V linked listed
b6c0: 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 0a 20 2a returned from. *
b6d0: 20 20 20 20 20 22 63 61 63 6b 65 79 5f 72 65 61 "cackey_rea
b6e0: 64 5f 74 6c 76 22 0a 20 2a 0a 20 2a 2f 0a 73 74 d_tlv". *. */.st
b6f0: 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 atic void cackey
b700: 5f 66 72 65 65 5f 74 6c 76 28 73 74 72 75 63 74 _free_tlv(struct
b710: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 cackey_tlv_enti
b720: 74 79 20 2a 72 6f 6f 74 29 20 7b 0a 09 73 74 72 ty *root) {..str
b730: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 uct cackey_tlv_e
b740: 6e 74 69 74 79 20 2a 63 75 72 72 2c 20 2a 6e 65 ntity *curr, *ne
b750: 78 74 3b 0a 0a 09 69 66 20 28 72 6f 6f 74 20 3d xt;...if (root =
b760: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 = NULL) {...retu
b770: 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 63 75 rn;..}...for (cu
b780: 72 72 20 3d 20 72 6f 6f 74 3b 20 63 75 72 72 3b rr = root; curr;
b790: 20 63 75 72 72 20 3d 20 6e 65 78 74 29 20 7b 0a curr = next) {.
b7a0: 09 09 6e 65 78 74 20 3d 20 63 75 72 72 2d 3e 5f ..next = curr->_
b7b0: 6e 65 78 74 3b 0a 0a 09 09 73 77 69 74 63 68 20 next;....switch
b7c0: 28 63 75 72 72 2d 3e 74 61 67 29 20 7b 0a 09 09 (curr->tag) {...
b7d0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f .case GSCIS_TAG_
b7e0: 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 63 61 ACR_TABLE:....ca
b7f0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 se GSCIS_TAG_CER
b800: 54 49 46 49 43 41 54 45 3a 0a 09 09 09 09 69 66 TIFICATE:.....if
b810: 20 28 63 75 72 72 2d 3e 76 61 6c 75 65 29 20 7b (curr->value) {
b820: 0a 09 09 09 09 09 66 72 65 65 28 63 75 72 72 2d ......free(curr-
b830: 3e 76 61 6c 75 65 29 3b 0a 09 09 09 09 7d 0a 09 >value);.....}..
b840: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 ...break;....cas
b850: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 e GSCIS_TAG_CARD
b860: 55 52 4c 3a 0a 09 09 09 09 69 66 20 28 63 75 72 URL:.....if (cur
b870: 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c r->value_cardurl
b880: 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75 ) {......free(cu
b890: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 rr->value_cardur
b8a0: 6c 29 3b 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 l);.....}.....br
b8b0: 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 66 72 65 65 eak;...}....free
b8c0: 28 63 75 72 72 29 3b 0a 09 7d 0a 0a 09 72 65 74 (curr);..}...ret
b8d0: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 urn;.}../*. * SY
b8e0: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e NPOSIS. * ..
b8f0: 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 .. *. * ARGUMENT
b900: 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a S. * .... *.
b910: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a * RETURN VALUE.
b920: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a * .... *. *
b930: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e NOTES. * ..
b940: 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 .. *. */.static
b950: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c struct cackey_tl
b960: 76 5f 65 6e 74 69 74 79 20 2a 63 61 63 6b 65 79 v_entity *cackey
b970: 5f 72 65 61 64 5f 74 6c 76 28 73 74 72 75 63 74 _read_tlv(struct
b980: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c cackey_slot *sl
b990: 6f 74 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61 ot) {..struct ca
b9a0: 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 ckey_tlv_entity
b9b0: 2a 63 75 72 72 5f 65 6e 74 69 74 79 2c 20 2a 72 *curr_entity, *r
b9c0: 6f 6f 74 20 3d 20 4e 55 4c 4c 2c 20 2a 6c 61 73 oot = NULL, *las
b9d0: 74 20 3d 20 4e 55 4c 4c 3b 0a 09 75 6e 73 69 67 t = NULL;..unsig
b9e0: 6e 65 64 20 63 68 61 72 20 74 6c 65 6e 5f 62 75 ned char tlen_bu
b9f0: 66 5b 32 5d 2c 20 74 76 61 6c 5f 62 75 66 5b 31 f[2], tval_buf[1
ba00: 30 32 34 5d 2c 20 2a 74 76 61 6c 3b 0a 09 75 6e 024], *tval;..un
ba10: 73 69 67 6e 65 64 20 63 68 61 72 20 76 6c 65 6e signed char vlen
ba20: 5f 62 75 66 5b 32 5d 2c 20 76 76 61 6c 5f 62 75 _buf[2], vval_bu
ba30: 66 5b 38 31 39 32 5d 2c 20 2a 76 76 61 6c 3b 0a f[8192], *vval;.
ba40: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a .unsigned char *
ba50: 74 6d 70 62 75 66 3b 0a 09 75 6e 73 69 67 6e 65 tmpbuf;..unsigne
ba60: 64 20 6c 6f 6e 67 20 74 6d 70 62 75 66 6c 65 6e d long tmpbuflen
ba70: 3b 0a 09 73 73 69 7a 65 5f 74 20 74 6c 65 6e 2c ;..ssize_t tlen,
ba80: 20 76 6c 65 6e 3b 0a 09 73 73 69 7a 65 5f 74 20 vlen;..ssize_t
ba90: 72 65 61 64 5f 72 65 74 3b 0a 09 73 69 7a 65 5f read_ret;..size_
baa0: 74 20 6f 66 66 73 65 74 5f 74 20 3d 20 30 2c 20 t offset_t = 0,
bab0: 6f 66 66 73 65 74 5f 76 20 3d 20 30 3b 0a 09 75 offset_v = 0;..u
bac0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 61 67 nsigned char tag
bad0: 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 67 74 68 ;..size_t length
bae0: 3b 0a 23 69 66 64 65 66 20 48 41 56 45 5f 4c 49 ;.#ifdef HAVE_LI
baf0: 42 5a 0a 09 69 6e 74 20 75 6e 63 6f 6d 70 72 65 BZ..int uncompre
bb00: 73 73 5f 72 65 74 3b 0a 23 65 6e 64 69 66 0a 0a ss_ret;.#endif..
bb10: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
bb20: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
bb30: 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61 ...read_ret = ca
bb40: 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 ckey_read_buffer
bb50: 28 73 6c 6f 74 2c 20 74 6c 65 6e 5f 62 75 66 2c (slot, tlen_buf,
bb60: 20 73 69 7a 65 6f 66 28 74 6c 65 6e 5f 62 75 66 sizeof(tlen_buf
bb70: 29 2c 20 31 2c 20 6f 66 66 73 65 74 5f 74 29 3b ), 1, offset_t);
bb80: 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 ..if (read_ret !
bb90: 3d 20 73 69 7a 65 6f 66 28 74 6c 65 6e 5f 62 75 = sizeof(tlen_bu
bba0: 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 f)) {...CACKEY_D
bbb0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 61 EBUG_PRINTF("Rea
bbc0: 64 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e d failed, return
bbd0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 ing in failure")
bbe0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c ;....return(NULL
bbf0: 29 3b 0a 09 7d 0a 0a 09 74 6c 65 6e 20 3d 20 28 );..}...tlen = (
bc00: 74 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c 20 38 tlen_buf[1] << 8
bc10: 29 20 7c 20 74 6c 65 6e 5f 62 75 66 5b 30 5d 3b ) | tlen_buf[0];
bc20: 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61 ...read_ret = ca
bc30: 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 ckey_read_buffer
bc40: 28 73 6c 6f 74 2c 20 76 6c 65 6e 5f 62 75 66 2c (slot, vlen_buf,
bc50: 20 73 69 7a 65 6f 66 28 76 6c 65 6e 5f 62 75 66 sizeof(vlen_buf
bc60: 29 2c 20 32 2c 20 6f 66 66 73 65 74 5f 76 29 3b ), 2, offset_v);
bc70: 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 ..if (read_ret !
bc80: 3d 20 73 69 7a 65 6f 66 28 76 6c 65 6e 5f 62 75 = sizeof(vlen_bu
bc90: 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 f)) {...CACKEY_D
bca0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 61 EBUG_PRINTF("Rea
bcb0: 64 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e d failed, return
bcc0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 ing in failure")
bcd0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c ;....return(NULL
bce0: 29 3b 0a 09 7d 0a 0a 09 76 6c 65 6e 20 3d 20 28 );..}...vlen = (
bcf0: 76 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c 20 38 vlen_buf[1] << 8
bd00: 29 20 7c 20 76 6c 65 6e 5f 62 75 66 5b 30 5d 3b ) | vlen_buf[0];
bd10: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
bd20: 50 52 49 4e 54 46 28 22 54 61 67 20 4c 65 6e 67 PRINTF("Tag Leng
bd30: 74 68 20 3d 20 25 69 2c 20 56 61 6c 75 65 20 4c th = %i, Value L
bd40: 65 6e 67 74 68 20 3d 20 25 69 22 2c 20 74 6c 65 ength = %i", tle
bd50: 6e 2c 20 76 6c 65 6e 29 3b 0a 0a 09 6f 66 66 73 n, vlen);...offs
bd60: 65 74 5f 74 20 2b 3d 20 32 3b 0a 09 6f 66 66 73 et_t += 2;..offs
bd70: 65 74 5f 76 20 2b 3d 20 32 3b 0a 0a 09 69 66 20 et_v += 2;...if
bd80: 28 74 6c 65 6e 20 3e 20 73 69 7a 65 6f 66 28 74 (tlen > sizeof(t
bd90: 76 61 6c 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 val_buf)) {...CA
bda0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
bdb0: 46 28 22 54 61 67 20 6c 65 6e 67 74 68 20 69 73 F("Tag length is
bdc0: 20 74 6f 6f 20 6c 61 72 67 65 2c 20 72 65 74 75 too large, retu
bdd0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 rning in failure
bde0: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 ");....return(NU
bdf0: 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 76 6c LL);..}...if (vl
be00: 65 6e 20 3e 20 73 69 7a 65 6f 66 28 76 76 61 6c en > sizeof(vval
be10: 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 _buf)) {...CACKE
be20: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
be30: 56 61 6c 75 65 20 6c 65 6e 67 74 68 20 69 73 20 Value length is
be40: 74 6f 6f 20 6c 61 72 67 65 2c 20 72 65 74 75 72 too large, retur
be50: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 ning in failure"
be60: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c );....return(NUL
be70: 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f 72 65 L);..}...read_re
be80: 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f t = cackey_read_
be90: 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 74 76 61 buffer(slot, tva
bea0: 6c 5f 62 75 66 2c 20 74 6c 65 6e 2c 20 31 2c 20 l_buf, tlen, 1,
beb0: 6f 66 66 73 65 74 5f 74 29 3b 0a 09 69 66 20 28 offset_t);..if (
bec0: 72 65 61 64 5f 72 65 74 20 21 3d 20 74 6c 65 6e read_ret != tlen
bed0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
bee0: 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c UG_PRINTF("Unabl
bef0: 65 20 74 6f 20 72 65 61 64 20 65 6e 74 69 72 65 e to read entire
bf00: 20 54 2d 62 75 66 66 65 72 2c 20 72 65 74 75 72 T-buffer, retur
bf10: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 ning in failure"
bf20: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c );....return(NUL
bf30: 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f 72 65 L);..}...read_re
bf40: 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f t = cackey_read_
bf50: 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 76 76 61 buffer(slot, vva
bf60: 6c 5f 62 75 66 2c 20 76 6c 65 6e 2c 20 32 2c 20 l_buf, vlen, 2,
bf70: 6f 66 66 73 65 74 5f 76 29 3b 0a 09 69 66 20 28 offset_v);..if (
bf80: 72 65 61 64 5f 72 65 74 20 21 3d 20 76 6c 65 6e read_ret != vlen
bf90: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
bfa0: 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c UG_PRINTF("Unabl
bfb0: 65 20 74 6f 20 72 65 61 64 20 65 6e 74 69 72 65 e to read entire
bfc0: 20 56 2d 62 75 66 66 65 72 2c 20 72 65 74 75 72 V-buffer, retur
bfd0: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 ning in failure"
bfe0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c );....return(NUL
bff0: 4c 29 3b 0a 09 7d 0a 0a 09 74 76 61 6c 20 3d 20 L);..}...tval =
c000: 74 76 61 6c 5f 62 75 66 3b 0a 09 76 76 61 6c 20 tval_buf;..vval
c010: 3d 20 76 76 61 6c 5f 62 75 66 3b 0a 09 77 68 69 = vval_buf;..whi
c020: 6c 65 20 28 74 6c 65 6e 20 3e 20 30 20 26 26 20 le (tlen > 0 &&
c030: 76 6c 65 6e 20 3e 20 30 29 20 7b 0a 09 09 74 61 vlen > 0) {...ta
c040: 67 20 3d 20 2a 74 76 61 6c 3b 0a 09 09 74 76 61 g = *tval;...tva
c050: 6c 2b 2b 3b 0a 09 09 74 6c 65 6e 2d 2d 3b 0a 0a l++;...tlen--;..
c060: 09 09 69 66 20 28 2a 74 76 61 6c 20 3d 3d 20 30 ..if (*tval == 0
c070: 78 66 66 29 20 7b 0a 09 09 09 6c 65 6e 67 74 68 xff) {....length
c080: 20 3d 20 28 74 76 61 6c 5b 32 5d 20 3c 3c 20 38 = (tval[2] << 8
c090: 29 20 7c 20 74 76 61 6c 5b 31 5d 3b 0a 09 09 09 ) | tval[1];....
c0a0: 74 76 61 6c 20 2b 3d 20 33 3b 0a 09 09 09 74 6c tval += 3;....tl
c0b0: 65 6e 20 2d 3d 20 33 3b 0a 09 09 7d 20 65 6c 73 en -= 3;...} els
c0c0: 65 20 7b 0a 09 09 09 6c 65 6e 67 74 68 20 3d 20 e {....length =
c0d0: 2a 74 76 61 6c 3b 0a 09 09 09 74 76 61 6c 2b 2b *tval;....tval++
c0e0: 3b 0a 09 09 09 74 6c 65 6e 2d 2d 3b 0a 09 09 7d ;....tlen--;...}
c0f0: 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
c100: 5f 50 52 49 4e 54 46 28 22 54 61 67 3a 20 25 73 _PRINTF("Tag: %s
c110: 20 28 25 30 32 78 29 22 2c 20 43 41 43 4b 45 59 (%02x)", CACKEY
c120: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f _DEBUG_FUNC_TAG_
c130: 54 4f 5f 53 54 52 28 74 61 67 29 2c 20 28 75 6e TO_STR(tag), (un
c140: 73 69 67 6e 65 64 20 69 6e 74 29 20 74 61 67 29 signed int) tag)
c150: 3b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ;...CACKEY_DEBUG
c160: 5f 50 52 49 4e 54 42 55 46 28 22 56 61 6c 75 65 _PRINTBUF("Value
c170: 3a 22 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 :", vval, length
c180: 29 3b 0a 0a 09 09 63 75 72 72 5f 65 6e 74 69 74 );....curr_entit
c190: 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 73 77 69 74 y = NULL;...swit
c1a0: 63 68 20 28 74 61 67 29 20 7b 0a 09 09 09 63 61 ch (tag) {....ca
c1b0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 se GSCIS_TAG_CAR
c1c0: 44 55 52 4c 3a 0a 09 09 09 09 63 75 72 72 5f 65 DURL:.....curr_e
c1d0: 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 ntity = malloc(s
c1e0: 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 izeof(*curr_enti
c1f0: 74 79 29 29 3b 0a 09 09 09 09 63 75 72 72 5f 65 ty));.....curr_e
c200: 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 ntity->value_car
c210: 64 75 72 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 durl = malloc(si
c220: 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 zeof(*curr_entit
c230: 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c y->value_cardurl
c240: 29 29 3b 0a 0a 09 09 09 09 6d 65 6d 63 70 79 28 ));......memcpy(
c250: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c curr_entity->val
c260: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c ue_cardurl->rid,
c270: 20 76 76 61 6c 2c 20 35 29 3b 0a 09 09 09 09 63 vval, 5);.....c
c280: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 urr_entity->valu
c290: 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 e_cardurl->appty
c2a0: 70 65 20 3d 20 76 76 61 6c 5b 35 5d 3b 0a 09 09 pe = vval[5];...
c2b0: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 ..curr_entity->v
c2c0: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 alue_cardurl->ob
c2d0: 6a 65 63 74 69 64 20 3d 20 28 76 76 61 6c 5b 36 jectid = (vval[6
c2e0: 5d 20 3c 3c 20 38 29 20 7c 20 76 76 61 6c 5b 37 ] << 8) | vval[7
c2f0: 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 ];.....curr_enti
c300: 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 ty->value_cardur
c310: 6c 2d 3e 61 70 70 69 64 20 3d 20 28 76 76 61 6c l->appid = (vval
c320: 5b 38 5d 20 3c 3c 20 38 29 20 7c 20 76 76 61 6c [8] << 8) | vval
c330: 5b 39 5d 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65 [9];......curr_e
c340: 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 ntity->tag = tag
c350: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 ;.....curr_entit
c360: 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b y->_next = NULL;
c370: 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 ......break;....
c380: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 41 case GSCIS_TAG_A
c390: 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 09 63 75 CR_TABLE:.....cu
c3a0: 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c rr_entity = mall
c3b0: 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f oc(sizeof(*curr_
c3c0: 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 74 6d entity));.....tm
c3d0: 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 6c 65 pbuf = malloc(le
c3e0: 6e 67 74 68 29 3b 0a 0a 09 09 09 09 6d 65 6d 63 ngth);......memc
c3f0: 70 79 28 74 6d 70 62 75 66 2c 20 76 76 61 6c 2c py(tmpbuf, vval,
c400: 20 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 09 09 63 length);......c
c410: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20 urr_entity->tag
c420: 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f = tag;.....curr_
c430: 65 6e 74 69 74 79 2d 3e 6c 65 6e 67 74 68 20 3d entity->length =
c440: 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09 63 75 72 length;.....cur
c450: 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 20 r_entity->value
c460: 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09 09 63 75 = tmpbuf;.....cu
c470: 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 rr_entity->_next
c480: 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 = NULL;......br
c490: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43 eak;....case GSC
c4a0: 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41 IS_TAG_CERTIFICA
c4b0: 54 45 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 TE:.....curr_ent
c4c0: 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a ity = malloc(siz
c4d0: 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 eof(*curr_entity
c4e0: 29 29 3b 0a 0a 23 69 66 64 65 66 20 48 41 56 45 ));..#ifdef HAVE
c4f0: 5f 4c 49 42 5a 0a 09 09 09 09 74 6d 70 62 75 66 _LIBZ.....tmpbuf
c500: 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 20 2a 20 32 len = length * 2
c510: 3b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20 6d ;.....tmpbuf = m
c520: 61 6c 6c 6f 63 28 74 6d 70 62 75 66 6c 65 6e 29 alloc(tmpbuflen)
c530: 3b 0a 0a 09 09 09 09 75 6e 63 6f 6d 70 72 65 73 ;......uncompres
c540: 73 5f 72 65 74 20 3d 20 75 6e 63 6f 6d 70 72 65 s_ret = uncompre
c550: 73 73 28 74 6d 70 62 75 66 2c 20 26 74 6d 70 62 ss(tmpbuf, &tmpb
c560: 75 66 6c 65 6e 2c 20 76 76 61 6c 2c 20 6c 65 6e uflen, vval, len
c570: 67 74 68 29 3b 0a 09 09 09 09 69 66 20 28 75 6e gth);.....if (un
c580: 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 21 3d 20 compress_ret !=
c590: 5a 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 43 41 43 Z_OK) {......CAC
c5a0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
c5b0: 28 22 46 61 69 6c 65 64 20 74 6f 20 64 65 63 6f ("Failed to deco
c5c0: 6d 70 72 65 73 73 2c 20 75 6e 63 6f 6d 70 72 65 mpress, uncompre
c5d0: 73 73 28 29 20 72 65 74 75 72 6e 65 64 20 25 69 ss() returned %i
c5e0: 20 2d 2d 20 72 65 73 6f 72 74 69 6e 67 20 74 6f -- resorting to
c5f0: 20 64 69 72 65 63 74 20 63 6f 70 79 22 2c 20 75 direct copy", u
c600: 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 29 3b 0a ncompress_ret);.
c610: 0a 09 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 ......tmpbuflen
c620: 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09 09 6d = length;......m
c630: 65 6d 63 70 79 28 74 6d 70 62 75 66 2c 20 76 76 emcpy(tmpbuf, vv
c640: 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 09 09 09 al, length);....
c650: 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 .}......CACKEY_D
c660: 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 44 EBUG_PRINTBUF("D
c670: 65 63 6f 6d 70 72 65 73 73 65 64 20 74 6f 3a 22 ecompressed to:"
c680: 2c 20 74 6d 70 62 75 66 2c 20 74 6d 70 62 75 66 , tmpbuf, tmpbuf
c690: 6c 65 6e 29 3b 0a 23 65 6c 73 65 0a 09 09 09 09 len);.#else.....
c6a0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
c6b0: 4e 54 46 28 22 4d 69 73 73 69 6e 67 20 5a 4c 49 NTF("Missing ZLI
c6c0: 42 20 53 75 70 70 6f 72 74 2c 20 74 68 69 73 20 B Support, this
c6d0: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 6c certificate is l
c6e0: 69 6b 65 6c 79 20 75 73 65 6c 65 73 73 2e 2e 2e ikely useless...
c6f0: 22 29 3b 0a 0a 09 09 09 09 74 6d 70 62 75 66 6c ");......tmpbufl
c700: 65 6e 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09 en = length;....
c710: 09 6d 65 6d 63 70 79 28 74 6d 70 62 75 66 2c 20 .memcpy(tmpbuf,
c720: 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 23 vval, length);.#
c730: 65 6e 64 69 66 0a 0a 09 09 09 09 63 75 72 72 5f endif......curr_
c740: 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61 entity->tag = ta
c750: 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 g;.....curr_enti
c760: 74 79 2d 3e 6c 65 6e 67 74 68 20 3d 20 74 6d 70 ty->length = tmp
c770: 62 75 66 6c 65 6e 3b 0a 09 09 09 09 63 75 72 72 buflen;.....curr
c780: 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 20 3d _entity->value =
c790: 20 74 6d 70 62 75 66 3b 0a 09 09 09 09 63 75 72 tmpbuf;.....cur
c7a0: 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 r_entity->_next
c7b0: 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 = NULL;......bre
c7c0: 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43 49 ak;....case GSCI
c7d0: 53 5f 54 41 47 5f 50 4b 43 53 31 35 3a 0a 09 09 S_TAG_PKCS15:...
c7e0: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 ..curr_entity =
c7f0: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 malloc(sizeof(*c
c800: 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 0a 09 urr_entity));...
c810: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e ...curr_entity->
c820: 74 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 tag = tag;.....c
c830: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 urr_entity->valu
c840: 65 5f 62 79 74 65 20 3d 20 76 76 61 6c 5b 30 5d e_byte = vval[0]
c850: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 ;.....curr_entit
c860: 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b y->_next = NULL;
c870: 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d ......break;...}
c880: 0a 0a 09 09 76 76 61 6c 20 2b 3d 20 6c 65 6e 67 ....vval += leng
c890: 74 68 3b 0a 09 09 76 6c 65 6e 20 2d 3d 20 6c 65 th;...vlen -= le
c8a0: 6e 67 74 68 3b 0a 0a 09 09 69 66 20 28 63 75 72 ngth;....if (cur
c8b0: 72 5f 65 6e 74 69 74 79 20 21 3d 20 4e 55 4c 4c r_entity != NULL
c8c0: 29 20 7b 0a 09 09 09 69 66 20 28 72 6f 6f 74 20 ) {....if (root
c8d0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 72 == NULL) {.....r
c8e0: 6f 6f 74 20 3d 20 63 75 72 72 5f 65 6e 74 69 74 oot = curr_entit
c8f0: 79 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 y;....}.....if (
c900: 6c 61 73 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a last != NULL) {.
c910: 09 09 09 09 6c 61 73 74 2d 3e 5f 6e 65 78 74 20 ....last->_next
c920: 3d 20 63 75 72 72 5f 65 6e 74 69 74 79 3b 0a 09 = curr_entity;..
c930: 09 09 7d 0a 0a 09 09 09 6c 61 73 74 20 3d 20 63 ..}.....last = c
c940: 75 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09 7d 0a urr_entity;...}.
c950: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 6f 6f 74 .}...return(root
c960: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 );.}../*. * SYNP
c970: 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a OSIS. * ....
c980: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a *. * ARGUMENTS.
c990: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a * .... *. *
c9a0: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a RETURN VALUE. *
c9b0: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e .... *. * N
c9c0: 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a OTES. * ....
c9d0: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f *. */.static vo
c9e0: 69 64 20 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 id cackey_free_c
c9f0: 65 72 74 73 28 73 74 72 75 63 74 20 63 61 63 6b erts(struct cack
ca00: 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 ey_pcsc_identity
ca10: 20 2a 73 74 61 72 74 2c 20 73 69 7a 65 5f 74 20 *start, size_t
ca20: 63 6f 75 6e 74 2c 20 69 6e 74 20 66 72 65 65 5f count, int free_
ca30: 73 74 61 72 74 29 20 7b 0a 09 73 69 7a 65 5f 74 start) {..size_t
ca40: 20 69 64 78 3b 0a 0a 09 66 6f 72 20 28 69 64 78 idx;...for (idx
ca50: 20 3d 20 30 3b 20 69 64 78 20 3c 20 63 6f 75 6e = 0; idx < coun
ca60: 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 t; idx++) {...if
ca70: 20 28 73 74 61 72 74 5b 69 64 78 5d 2e 63 65 72 (start[idx].cer
ca80: 74 69 66 69 63 61 74 65 29 20 7b 0a 09 09 09 66 tificate) {....f
ca90: 72 65 65 28 73 74 61 72 74 5b 69 64 78 5d 2e 63 ree(start[idx].c
caa0: 65 72 74 69 66 69 63 61 74 65 29 3b 0a 09 09 7d ertificate);...}
cab0: 0a 09 7d 0a 0a 09 69 66 20 28 66 72 65 65 5f 73 ..}...if (free_s
cac0: 74 61 72 74 29 20 7b 0a 09 09 66 72 65 65 28 73 tart) {...free(s
cad0: 74 61 72 74 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 tart);..}...retu
cae0: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e rn;.}../*. * SYN
caf0: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e POSIS. * ...
cb00: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 . *. * ARGUMENTS
cb10: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 . * .... *.
cb20: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 * RETURN VALUE.
cb30: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 * .... *. *
cb40: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e NOTES. * ...
cb50: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 . *. */.static s
cb60: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 truct cackey_pcs
cb70: 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 61 63 6b c_identity *cack
cb80: 65 79 5f 72 65 61 64 5f 63 65 72 74 73 28 73 74 ey_read_certs(st
cb90: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 ruct cackey_slot
cba0: 20 2a 73 6c 6f 74 2c 20 73 74 72 75 63 74 20 63 *slot, struct c
cbb0: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 ackey_pcsc_ident
cbc0: 69 74 79 20 2a 63 65 72 74 73 2c 20 75 6e 73 69 ity *certs, unsi
cbd0: 67 6e 65 64 20 6c 6f 6e 67 20 2a 63 6f 75 6e 74 gned long *count
cbe0: 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b ) {..struct cack
cbf0: 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 ey_pcsc_identity
cc00: 20 2a 63 75 72 72 5f 69 64 3b 0a 09 73 74 72 75 *curr_id;..stru
cc10: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e ct cackey_tlv_en
cc20: 74 69 74 79 20 2a 63 63 63 5f 74 6c 76 2c 20 2a tity *ccc_tlv, *
cc30: 63 63 63 5f 63 75 72 72 2c 20 2a 61 70 70 5f 74 ccc_curr, *app_t
cc40: 6c 76 2c 20 2a 61 70 70 5f 63 75 72 72 3b 0a 09 lv, *app_curr;..
cc50: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 63 unsigned char cc
cc60: 63 5f 61 69 64 5b 5d 20 3d 20 7b 47 53 43 49 53 c_aid[] = {GSCIS
cc70: 5f 41 49 44 5f 43 43 43 7d 3b 0a 09 75 6e 73 69 _AID_CCC};..unsi
cc80: 67 6e 65 64 20 63 68 61 72 20 63 75 72 72 5f 61 gned char curr_a
cc90: 69 64 5b 37 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 id[7];..unsigned
cca0: 20 6c 6f 6e 67 20 6f 75 74 69 64 78 20 3d 20 30 long outidx = 0
ccb0: 3b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 74 72 ;..cackey_ret tr
ccc0: 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74 3b 0a 09 ansaction_ret;..
ccd0: 69 6e 74 20 63 65 72 74 73 5f 72 65 73 69 7a 61 int certs_resiza
cce0: 62 6c 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 ble;..int send_r
ccf0: 65 74 2c 20 73 65 6c 65 63 74 5f 72 65 74 3b 0a et, select_ret;.
cd00: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
cd10: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
cd20: 3b 0a 0a 09 69 66 20 28 63 6f 75 6e 74 20 3d 3d ;...if (count ==
cd30: 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 NULL) {...CACKE
cd40: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
cd50: 63 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 72 count is NULL, r
cd60: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c eturning in fail
cd70: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ure");....return
cd80: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 (NULL);..}...if
cd90: 28 63 65 72 74 73 20 21 3d 20 4e 55 4c 4c 29 20 (certs != NULL)
cda0: 7b 0a 09 09 69 66 20 28 2a 63 6f 75 6e 74 20 3d {...if (*count =
cdb0: 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 = 0) {....CACKEY
cdc0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
cdd0: 65 71 75 65 73 74 65 64 20 77 65 20 72 65 74 75 equested we retu
cde0: 72 6e 20 30 20 6f 62 6a 65 63 74 73 2c 20 73 68 rn 0 objects, sh
cdf0: 6f 72 74 2d 63 69 72 63 75 69 74 22 29 3b 0a 0a ort-circuit");..
ce00: 09 09 09 72 65 74 75 72 6e 28 63 65 72 74 73 29 ...return(certs)
ce10: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 42 65 ;...}..}.../* Be
ce20: 67 69 6e 20 61 20 53 6d 61 72 74 43 61 72 64 20 gin a SmartCard
ce30: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 transaction */..
ce40: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74 20 transaction_ret
ce50: 3d 20 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 = cackey_begin_t
ce60: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 ransaction(slot)
ce70: 3b 0a 09 69 66 20 28 74 72 61 6e 73 61 63 74 69 ;..if (transacti
ce80: 6f 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 on_ret != CACKEY
ce90: 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 _PCSC_S_OK) {...
cea0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
ceb0: 4e 54 46 28 22 55 6e 61 62 6c 65 20 62 65 67 69 NTF("Unable begi
cec0: 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72 n transaction, r
ced0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c eturning in fail
cee0: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ure");....return
cef0: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 (NULL);..}...if
cf00: 28 63 65 72 74 73 20 3d 3d 20 4e 55 4c 4c 29 20 (certs == NULL)
cf10: 7b 0a 09 09 63 65 72 74 73 20 3d 20 6d 61 6c 6c {...certs = mall
cf20: 6f 63 28 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 oc(sizeof(*certs
cf30: 29 20 2a 20 35 29 3b 0a 09 09 2a 63 6f 75 6e 74 ) * 5);...*count
cf40: 20 3d 20 35 3b 0a 09 09 63 65 72 74 73 5f 72 65 = 5;...certs_re
cf50: 73 69 7a 61 62 6c 65 20 3d 20 31 3b 0a 09 7d 20 sizable = 1;..}
cf60: 65 6c 73 65 20 7b 0a 09 09 63 65 72 74 73 5f 72 else {...certs_r
cf70: 65 73 69 7a 61 62 6c 65 20 3d 20 30 3b 0a 09 7d esizable = 0;..}
cf80: 0a 0a 09 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 .../* Select the
cf90: 20 43 43 43 20 41 70 70 6c 65 74 20 2a 2f 0a 09 CCC Applet */..
cfa0: 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 send_ret = cacke
cfb0: 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 y_select_applet(
cfc0: 73 6c 6f 74 2c 20 63 63 63 5f 61 69 64 2c 20 73 slot, ccc_aid, s
cfd0: 69 7a 65 6f 66 28 63 63 63 5f 61 69 64 29 29 3b izeof(ccc_aid));
cfe0: 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21 ..if (send_ret !
cff0: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f = CACKEY_PCSC_S_
d000: 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 OK) {...CACKEY_D
d010: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 EBUG_PRINTF("Una
d020: 62 6c 65 20 74 6f 20 73 65 6c 65 63 74 20 43 43 ble to select CC
d030: 43 20 41 70 70 6c 65 74 2c 20 72 65 74 75 72 6e C Applet, return
d040: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 ing in failure")
d050: 3b 0a 0a 09 09 2f 2a 20 54 65 72 6d 69 6e 61 74 ;..../* Terminat
d060: 65 20 53 6d 61 72 74 43 61 72 64 20 54 72 61 6e e SmartCard Tran
d070: 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 saction */...cac
d080: 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 key_end_transact
d090: 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 72 65 ion(slot);....re
d0a0: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a turn(NULL);..}..
d0b0: 09 2f 2a 20 52 65 61 64 20 61 6c 6c 20 74 68 65 ./* Read all the
d0c0: 20 61 70 70 6c 65 74 73 20 66 72 6f 6d 20 74 68 applets from th
d0d0: 65 20 43 43 43 27 73 20 54 4c 56 20 2a 2f 0a 09 e CCC's TLV */..
d0e0: 63 63 63 5f 74 6c 76 20 3d 20 63 61 63 6b 65 79 ccc_tlv = cackey
d0f0: 5f 72 65 61 64 5f 74 6c 76 28 73 6c 6f 74 29 3b _read_tlv(slot);
d100: 0a 0a 09 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 43 .../* Look for C
d110: 41 52 44 55 52 4c 73 20 74 68 61 74 20 63 6f 6f ARDURLs that coo
d120: 72 65 73 70 6f 6e 64 20 74 6f 20 50 4b 49 20 61 respond to PKI a
d130: 70 70 6c 65 74 73 20 2a 2f 0a 09 66 6f 72 20 28 pplets */..for (
d140: 63 63 63 5f 63 75 72 72 20 3d 20 63 63 63 5f 74 ccc_curr = ccc_t
d150: 6c 76 3b 20 63 63 63 5f 63 75 72 72 3b 20 63 63 lv; ccc_curr; cc
d160: 63 5f 63 75 72 72 20 3d 20 63 63 63 5f 63 75 72 c_curr = ccc_cur
d170: 72 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 43 41 r->_next) {...CA
d180: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
d190: 46 28 22 46 6f 75 6e 64 20 74 61 67 3a 20 25 73 F("Found tag: %s
d1a0: 20 2e 2e 2e 20 22 2c 20 43 41 43 4b 45 59 5f 44 ... ", CACKEY_D
d1b0: 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f EBUG_FUNC_TAG_TO
d1c0: 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 74 _STR(ccc_curr->t
d1d0: 61 67 29 29 3b 0a 0a 09 09 69 66 20 28 63 63 63 ag));....if (ccc
d1e0: 5f 63 75 72 72 2d 3e 74 61 67 20 21 3d 20 47 53 _curr->tag != GS
d1f0: 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 29 CIS_TAG_CARDURL)
d200: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 {....CACKEY_DEB
d210: 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e UG_PRINTF(" ...
d220: 20 73 6b 69 70 70 69 6e 67 20 69 74 20 28 77 65 skipping it (we
d230: 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 only care about
d240: 20 43 41 52 44 55 52 4c 73 29 22 29 3b 0a 0a 09 CARDURLs)");...
d250: 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a ..continue;...}.
d260: 0a 09 09 69 66 20 28 28 63 63 63 5f 63 75 72 72 ...if ((ccc_curr
d270: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d ->value_cardurl-
d280: 3e 61 70 70 74 79 70 65 20 26 20 43 41 43 4b 45 >apptype & CACKE
d290: 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 29 20 21 Y_TLV_APP_PKI) !
d2a0: 3d 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 = CACKEY_TLV_APP
d2b0: 5f 50 4b 49 29 20 7b 0a 09 09 09 43 41 43 4b 45 _PKI) {....CACKE
d2c0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
d2d0: 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69 ... skipping i
d2e0: 74 20 28 77 65 20 6f 6e 6c 79 20 63 61 72 65 20 t (we only care
d2f0: 61 62 6f 75 74 20 50 4b 49 20 61 70 70 6c 65 74 about PKI applet
d300: 73 2c 20 74 68 69 73 20 61 70 70 6c 65 74 20 73 s, this applet s
d310: 75 70 70 6f 72 74 73 3a 20 25 73 2f 25 30 32 78 upports: %s/%02x
d320: 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 )", CACKEY_DEBUG
d330: 5f 46 55 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f _FUNC_APPTYPE_TO
d340: 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 76 _STR(ccc_curr->v
d350: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 alue_cardurl->ap
d360: 70 74 79 70 65 29 2c 20 28 75 6e 73 69 67 6e 65 ptype), (unsigne
d370: 64 20 69 6e 74 29 20 63 63 63 5f 63 75 72 72 2d d int) ccc_curr-
d380: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e >value_cardurl->
d390: 61 70 70 74 79 70 65 29 3b 0a 0a 09 09 09 63 6f apptype);.....co
d3a0: 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 43 ntinue;...}....C
d3b0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
d3c0: 54 42 55 46 28 22 52 49 44 3a 22 2c 20 63 63 63 TBUF("RID:", ccc
d3d0: 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 _curr->value_car
d3e0: 64 75 72 6c 2d 3e 72 69 64 2c 20 73 69 7a 65 6f durl->rid, sizeo
d3f0: 66 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 f(ccc_curr->valu
d400: 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 29 29 e_cardurl->rid))
d410: 3b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ;...CACKEY_DEBUG
d420: 5f 50 52 49 4e 54 46 28 22 41 70 70 49 44 20 3d _PRINTF("AppID =
d430: 20 25 73 2f 25 30 34 6c 78 22 2c 20 43 41 43 4b %s/%04lx", CACK
d440: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42 EY_DEBUG_FUNC_OB
d450: 4a 49 44 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 JID_TO_STR(ccc_c
d460: 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 urr->value_cardu
d470: 72 6c 2d 3e 61 70 70 69 64 29 2c 20 28 75 6e 73 rl->appid), (uns
d480: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 63 63 5f igned long) ccc_
d490: 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 curr->value_card
d4a0: 75 72 6c 2d 3e 61 70 70 69 64 29 3b 0a 09 09 43 url->appid);...C
d4b0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
d4c0: 54 46 28 22 4f 62 6a 65 63 74 49 44 20 3d 20 25 TF("ObjectID = %
d4d0: 73 2f 25 30 34 6c 78 22 2c 20 43 41 43 4b 45 59 s/%04lx", CACKEY
d4e0: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 _DEBUG_FUNC_OBJI
d4f0: 44 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 D_TO_STR(ccc_cur
d500: 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c r->value_cardurl
d510: 2d 3e 6f 62 6a 65 63 74 69 64 29 2c 20 28 75 6e ->objectid), (un
d520: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 63 63 signed long) ccc
d530: 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 _curr->value_car
d540: 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 3b durl->objectid);
d550: 0a 0a 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f ....memcpy(curr_
d560: 61 69 64 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76 aid, ccc_curr->v
d570: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 alue_cardurl->ri
d580: 64 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 63 75 d, sizeof(ccc_cu
d590: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 rr->value_cardur
d5a0: 6c 2d 3e 72 69 64 29 29 3b 0a 09 09 63 75 72 72 l->rid));...curr
d5b0: 5f 61 69 64 5b 73 69 7a 65 6f 66 28 63 75 72 72 _aid[sizeof(curr
d5c0: 5f 61 69 64 29 20 2d 20 32 5d 20 3d 20 28 63 63 _aid) - 2] = (cc
d5d0: 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 c_curr->value_ca
d5e0: 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 3e 3e 20 rdurl->appid >>
d5f0: 38 29 20 26 20 30 78 66 66 3b 0a 09 09 63 75 72 8) & 0xff;...cur
d600: 72 5f 61 69 64 5b 73 69 7a 65 6f 66 28 63 75 72 r_aid[sizeof(cur
d610: 72 5f 61 69 64 29 20 2d 20 31 5d 20 3d 20 63 63 r_aid) - 1] = cc
d620: 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 c_curr->value_ca
d630: 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 26 20 30 rdurl->appid & 0
d640: 78 66 66 3b 0a 0a 09 09 2f 2a 20 53 65 6c 65 63 xff;..../* Selec
d650: 74 20 66 6f 75 6e 64 20 61 70 70 6c 65 74 20 2e t found applet .
d660: 2e 2e 20 2a 2f 0a 09 09 73 65 6c 65 63 74 5f 72 .. */...select_r
d670: 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 et = cackey_sele
d680: 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 ct_applet(slot,
d690: 63 75 72 72 5f 61 69 64 2c 20 73 69 7a 65 6f 66 curr_aid, sizeof
d6a0: 28 63 75 72 72 5f 61 69 64 29 29 3b 0a 09 09 69 (curr_aid));...i
d6b0: 66 20 28 73 65 6c 65 63 74 5f 72 65 74 20 21 3d f (select_ret !=
d6c0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f CACKEY_PCSC_S_O
d6d0: 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 K) {....CACKEY_D
d6e0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69 EBUG_PRINTF("Fai
d6f0: 6c 65 64 20 74 6f 20 73 65 6c 65 63 74 20 61 70 led to select ap
d700: 70 6c 65 74 2c 20 73 6b 69 70 70 69 6e 67 20 70 plet, skipping p
d710: 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68 69 rocessing of thi
d720: 73 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 s object");.....
d730: 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 continue;...}...
d740: 09 2f 2a 20 2e 2e 2e 20 61 6e 64 20 6f 62 6a 65 ./* ... and obje
d750: 63 74 20 28 66 69 6c 65 29 20 2a 2f 0a 09 09 73 ct (file) */...s
d760: 65 6c 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b elect_ret = cack
d770: 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 ey_select_file(s
d780: 6c 6f 74 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76 lot, ccc_curr->v
d790: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 alue_cardurl->ob
d7a0: 6a 65 63 74 69 64 29 3b 0a 09 09 69 66 20 28 73 jectid);...if (s
d7b0: 65 6c 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 elect_ret != CAC
d7c0: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b KEY_PCSC_S_OK) {
d7d0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
d7e0: 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 _PRINTF("Failed
d7f0: 74 6f 20 73 65 6c 65 63 74 20 66 69 6c 65 2c 20 to select file,
d800: 73 6b 69 70 70 69 6e 67 20 70 72 6f 63 65 73 73 skipping process
d810: 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 ing of this obje
d820: 63 74 22 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e ct");.....contin
d830: 75 65 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 50 72 ue;...}..../* Pr
d840: 6f 63 65 73 73 20 74 68 69 73 20 66 69 6c 65 27 ocess this file'
d850: 73 20 54 4c 56 20 6c 6f 6f 6b 69 6e 67 20 66 6f s TLV looking fo
d860: 72 20 63 65 72 74 69 66 69 63 61 74 65 73 20 2a r certificates *
d870: 2f 0a 09 09 61 70 70 5f 74 6c 76 20 3d 20 63 61 /...app_tlv = ca
d880: 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28 73 6c ckey_read_tlv(sl
d890: 6f 74 29 3b 0a 0a 09 09 66 6f 72 20 28 61 70 70 ot);....for (app
d8a0: 5f 63 75 72 72 20 3d 20 61 70 70 5f 74 6c 76 3b _curr = app_tlv;
d8b0: 20 61 70 70 5f 63 75 72 72 3b 20 61 70 70 5f 63 app_curr; app_c
d8c0: 75 72 72 20 3d 20 61 70 70 5f 63 75 72 72 2d 3e urr = app_curr->
d8d0: 5f 6e 65 78 74 29 20 7b 0a 09 09 09 43 41 43 4b _next) {....CACK
d8e0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
d8f0: 22 46 6f 75 6e 64 20 74 61 67 3a 20 25 73 22 2c "Found tag: %s",
d900: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 CACKEY_DEBUG_FU
d910: 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 61 70 NC_TAG_TO_STR(ap
d920: 70 5f 63 75 72 72 2d 3e 74 61 67 29 29 3b 0a 09 p_curr->tag));..
d930: 09 09 69 66 20 28 61 70 70 5f 63 75 72 72 2d 3e ..if (app_curr->
d940: 74 61 67 20 21 3d 20 47 53 43 49 53 5f 54 41 47 tag != GSCIS_TAG
d950: 5f 43 45 52 54 49 46 49 43 41 54 45 29 20 7b 0a _CERTIFICATE) {.
d960: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
d970: 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73 _PRINTF(" ... s
d980: 6b 69 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f kipping it (we o
d990: 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 43 nly care about C
d9a0: 45 52 54 49 46 49 43 41 54 45 73 29 22 29 3b 0a ERTIFICATEs)");.
d9b0: 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 .....continue;..
d9c0: 09 09 7d 0a 0a 09 09 09 63 75 72 72 5f 69 64 20 ..}.....curr_id
d9d0: 3d 20 26 63 65 72 74 73 5b 6f 75 74 69 64 78 5d = &certs[outidx]
d9e0: 3b 0a 09 09 09 6f 75 74 69 64 78 2b 2b 3b 0a 0a ;....outidx++;..
d9f0: 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 69 ...memcpy(curr_i
da00: 64 2d 3e 61 70 70 6c 65 74 2c 20 63 75 72 72 5f d->applet, curr_
da10: 61 69 64 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 aid, sizeof(curr
da20: 5f 69 64 2d 3e 61 70 70 6c 65 74 29 29 3b 0a 09 _id->applet));..
da30: 09 09 63 75 72 72 5f 69 64 2d 3e 66 69 6c 65 20 ..curr_id->file
da40: 3d 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 = ccc_curr->valu
da50: 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 e_cardurl->objec
da60: 74 69 64 3b 0a 09 09 09 63 75 72 72 5f 69 64 2d tid;....curr_id-
da70: 3e 6b 65 79 73 69 7a 65 20 3d 20 2d 31 3b 0a 0a >keysize = -1;..
da80: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
da90: 50 52 49 4e 54 46 28 22 46 69 6c 6c 69 6e 67 20 PRINTF("Filling
daa0: 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 20 curr_id->applet
dab0: 28 25 70 29 20 77 69 74 68 20 25 6c 75 20 62 79 (%p) with %lu by
dac0: 74 65 73 3a 22 2c 20 63 75 72 72 5f 69 64 2d 3e tes:", curr_id->
dad0: 61 70 70 6c 65 74 2c 20 28 75 6e 73 69 67 6e 65 applet, (unsigne
dae0: 64 20 6c 6f 6e 67 29 20 73 69 7a 65 6f 66 28 63 d long) sizeof(c
daf0: 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 29 29 urr_id->applet))
db00: 3b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 ;....CACKEY_DEBU
db10: 47 5f 50 52 49 4e 54 42 55 46 28 22 56 41 4c 3a G_PRINTBUF("VAL:
db20: 22 2c 20 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c ", curr_id->appl
db30: 65 74 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f et, sizeof(curr_
db40: 69 64 2d 3e 61 70 70 6c 65 74 29 29 3b 0a 0a 09 id->applet));...
db50: 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 ..curr_id->certi
db60: 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 61 70 70 ficate_len = app
db70: 5f 63 75 72 72 2d 3e 6c 65 6e 67 74 68 3b 0a 0a _curr->length;..
db80: 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 ...curr_id->cert
db90: 69 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 ificate = malloc
dba0: 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 (curr_id->certif
dbb0: 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 6d icate_len);....m
dbc0: 65 6d 63 70 79 28 63 75 72 72 5f 69 64 2d 3e 63 emcpy(curr_id->c
dbd0: 65 72 74 69 66 69 63 61 74 65 2c 20 61 70 70 5f ertificate, app_
dbe0: 63 75 72 72 2d 3e 76 61 6c 75 65 2c 20 63 75 72 curr->value, cur
dbf0: 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 r_id->certificat
dc00: 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 69 66 20 28 e_len);.....if (
dc10: 6f 75 74 69 64 78 20 3e 3d 20 2a 63 6f 75 6e 74 outidx >= *count
dc20: 29 20 7b 0a 09 09 09 09 69 66 20 28 63 65 72 74 ) {.....if (cert
dc30: 73 5f 72 65 73 69 7a 61 62 6c 65 29 20 7b 0a 09 s_resizable) {..
dc40: 09 09 09 09 2a 63 6f 75 6e 74 20 2a 3d 20 32 3b ....*count *= 2;
dc50: 0a 09 09 09 09 09 63 65 72 74 73 20 3d 20 72 65 ......certs = re
dc60: 61 6c 6c 6f 63 28 63 65 72 74 73 2c 20 73 69 7a alloc(certs, siz
dc70: 65 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 28 2a eof(*certs) * (*
dc80: 63 6f 75 6e 74 29 29 3b 0a 09 09 09 09 7d 20 65 count));.....} e
dc90: 6c 73 65 20 7b 0a 09 09 09 09 09 62 72 65 61 6b lse {......break
dca0: 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 09 09 7d ;.....}....}...}
dcb0: 0a 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f ....cackey_free_
dcc0: 74 6c 76 28 61 70 70 5f 74 6c 76 29 3b 0a 0a 09 tlv(app_tlv);...
dcd0: 09 69 66 20 28 6f 75 74 69 64 78 20 3e 3d 20 2a .if (outidx >= *
dce0: 63 6f 75 6e 74 29 20 7b 0a 09 09 09 62 72 65 61 count) {....brea
dcf0: 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b k;...}..}...cack
dd00: 65 79 5f 66 72 65 65 5f 74 6c 76 28 63 63 63 5f ey_free_tlv(ccc_
dd10: 74 6c 76 29 3b 0a 0a 09 2a 63 6f 75 6e 74 20 3d tlv);...*count =
dd20: 20 6f 75 74 69 64 78 3b 0a 0a 09 69 66 20 28 63 outidx;...if (c
dd30: 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 29 20 erts_resizable)
dd40: 7b 0a 09 09 63 65 72 74 73 20 3d 20 72 65 61 6c {...certs = real
dd50: 6c 6f 63 28 63 65 72 74 73 2c 20 73 69 7a 65 6f loc(certs, sizeo
dd60: 66 28 2a 63 65 72 74 73 29 20 2a 20 28 2a 63 6f f(*certs) * (*co
dd70: 75 6e 74 29 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 unt));..}.../* T
dd80: 65 72 6d 69 6e 61 74 65 20 53 6d 61 72 74 43 61 erminate SmartCa
dd90: 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a rd Transaction *
dda0: 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 /..cackey_end_tr
ddb0: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b ansaction(slot);
ddc0: 0a 0a 09 72 65 74 75 72 6e 28 63 65 72 74 73 29 ...return(certs)
ddd0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f ;.}../*. * SYNPO
dde0: 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 SIS. * ....
ddf0: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 *. * ARGUMENTS.
de00: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 * .... *. *
de10: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 RETURN VALUE. *
de20: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f .... *. * NO
de30: 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 TES. * ....
de40: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 *. */.static ssi
de50: 7a 65 5f 74 20 63 61 63 6b 65 79 5f 73 69 67 6e ze_t cackey_sign
de60: 64 65 63 72 79 70 74 28 73 74 72 75 63 74 20 63 decrypt(struct c
de70: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 ackey_slot *slot
de80: 2c 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f , struct cackey_
de90: 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 identity *identi
dea0: 74 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 ty, unsigned cha
deb0: 72 20 2a 62 75 66 2c 20 73 69 7a 65 5f 74 20 62 r *buf, size_t b
dec0: 75 66 6c 65 6e 2c 20 75 6e 73 69 67 6e 65 64 20 uflen, unsigned
ded0: 63 68 61 72 20 2a 6f 75 74 62 75 66 2c 20 73 69 char *outbuf, si
dee0: 7a 65 5f 74 20 6f 75 74 62 75 66 6c 65 6e 2c 20 ze_t outbuflen,
def0: 69 6e 74 20 70 61 64 49 6e 70 75 74 2c 20 69 6e int padInput, in
df00: 74 20 75 6e 70 61 64 4f 75 74 70 75 74 29 20 7b t unpadOutput) {
df10: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 ..unsigned char
df20: 2a 74 6d 70 62 75 66 2c 20 2a 74 6d 70 62 75 66 *tmpbuf, *tmpbuf
df30: 5f 73 2c 20 2a 6f 75 74 62 75 66 5f 73 3b 0a 09 _s, *outbuf_s;..
df40: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62 79 unsigned char by
df50: 74 65 73 5f 74 6f 5f 73 65 6e 64 2c 20 70 31 3b tes_to_send, p1;
df60: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 ..unsigned char
df70: 62 6c 6f 63 6b 74 79 70 65 3b 0a 09 63 61 63 6b blocktype;..cack
df80: 65 79 5f 72 65 74 20 73 65 6e 64 5f 72 65 74 3b ey_ret send_ret;
df90: 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70 63 ..uint16_t respc
dfa0: 6f 64 65 3b 0a 09 73 73 69 7a 65 5f 74 20 72 65 ode;..ssize_t re
dfb0: 74 76 61 6c 20 3d 20 30 2c 20 75 6e 70 61 64 6f tval = 0, unpado
dfc0: 66 66 73 65 74 3b 0a 09 73 69 7a 65 5f 74 20 74 ffset;..size_t t
dfd0: 6d 70 62 75 66 6c 65 6e 2c 20 70 61 64 6c 65 6e mpbuflen, padlen
dfe0: 2c 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a , tmpoutbuflen;.
dff0: 09 69 6e 74 20 66 72 65 65 5f 74 6d 70 62 75 66 .int free_tmpbuf
e000: 20 3d 20 30 3b 0a 09 69 6e 74 20 6c 65 3b 0a 0a = 0;..int le;..
e010: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
e020: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
e030: 0a 0a 09 69 66 20 28 73 6c 6f 74 20 3d 3d 20 4e ...if (slot == N
e040: 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f ULL) {...CACKEY_
e050: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
e060: 72 6f 72 2e 20 20 73 6c 6f 74 20 69 73 20 4e 55 ror. slot is NU
e070: 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 LL");....return(
e080: 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 62 75 -1);..}...if (bu
e090: 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 f == NULL) {...C
e0a0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
e0b0: 54 46 28 22 45 72 72 6f 72 2e 20 20 62 75 66 20 TF("Error. buf
e0c0: 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 is NULL");....re
e0d0: 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 turn(-1);..}...i
e0e0: 66 20 28 6f 75 74 62 75 66 20 3d 3d 20 4e 55 4c f (outbuf == NUL
e0f0: 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 L) {...CACKEY_DE
e100: 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
e110: 72 2e 20 20 6f 75 74 62 75 66 20 69 73 20 4e 55 r. outbuf is NU
e120: 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 LL");....return(
e130: 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 69 64 -1);..}...if (id
e140: 65 6e 74 69 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 entity == NULL)
e150: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
e160: 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
e170: 20 69 64 65 6e 74 69 74 79 20 69 73 20 4e 55 4c identity is NUL
e180: 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d L");....return(-
e190: 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 69 64 65 1);..}...if (ide
e1a0: 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e ntity->pcsc_iden
e1b0: 74 69 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a tity == NULL) {.
e1c0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
e1d0: 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 69 RINTF("Error. i
e1e0: 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 dentity->pcsc_id
e1f0: 65 6e 74 69 74 79 20 69 73 20 4e 55 4c 4c 22 29 entity is NULL")
e200: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b ;....return(-1);
e210: 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 ..}.../* Determi
e220: 6e 65 20 69 64 65 6e 74 69 74 79 20 4b 65 79 20 ne identity Key
e230: 73 69 7a 65 20 2a 2f 0a 09 69 66 20 28 69 64 65 size */..if (ide
e240: 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e ntity->pcsc_iden
e250: 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 3c 20 tity->keysize <
e260: 30 29 20 7b 0a 09 09 69 64 65 6e 74 69 74 79 2d 0) {...identity-
e270: 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e >pcsc_identity->
e280: 6b 65 79 73 69 7a 65 20 3d 20 78 35 30 39 5f 74 keysize = x509_t
e290: 6f 5f 6b 65 79 73 69 7a 65 28 69 64 65 6e 74 69 o_keysize(identi
e2a0: 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 ty->pcsc_identit
e2b0: 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20 y->certificate,
e2c0: 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 identity->pcsc_i
e2d0: 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 dentity->certifi
e2e0: 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 cate_len);..}...
e2f0: 2f 2a 20 50 61 64 20 6d 65 73 73 61 67 65 20 74 /* Pad message t
e300: 6f 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a 09 69 o key size */..i
e310: 66 20 28 70 61 64 49 6e 70 75 74 29 20 7b 0a 09 f (padInput) {..
e320: 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 .if (identity->p
e330: 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 csc_identity->ke
e340: 79 73 69 7a 65 20 3e 20 30 29 20 7b 0a 09 09 09 ysize > 0) {....
e350: 69 66 20 28 62 75 66 6c 65 6e 20 21 3d 20 69 64 if (buflen != id
e360: 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 entity->pcsc_ide
e370: 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 29 20 ntity->keysize)
e380: 7b 0a 09 09 09 09 69 66 20 28 62 75 66 6c 65 6e {.....if (buflen
e390: 20 3e 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 > (identity->pc
e3a0: 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 sc_identity->key
e3b0: 73 69 7a 65 20 2b 20 33 29 29 20 7b 0a 09 09 09 size + 3)) {....
e3c0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
e3d0: 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4d RINTF("Error. M
e3e0: 65 73 73 61 67 65 20 69 73 20 74 6f 6f 20 6c 61 essage is too la
e3f0: 72 67 65 20 74 6f 20 73 69 67 6e 2f 64 65 63 72 rge to sign/decr
e400: 79 70 74 22 29 3b 0a 0a 09 09 09 09 09 72 65 74 ypt");.......ret
e410: 75 72 6e 28 2d 31 29 3b 0a 09 09 09 09 7d 0a 0a urn(-1);.....}..
e420: 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 ....tmpbuflen =
e430: 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 identity->pcsc_i
e440: 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 dentity->keysize
e450: 3b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20 6d ;.....tmpbuf = m
e460: 61 6c 6c 6f 63 28 74 6d 70 62 75 66 6c 65 6e 29 alloc(tmpbuflen)
e470: 3b 0a 09 09 09 09 66 72 65 65 5f 74 6d 70 62 75 ;.....free_tmpbu
e480: 66 20 3d 20 31 3b 0a 0a 09 09 09 09 70 61 64 6c f = 1;......padl
e490: 65 6e 20 3d 20 74 6d 70 62 75 66 6c 65 6e 20 2d en = tmpbuflen -
e4a0: 20 62 75 66 6c 65 6e 20 2d 20 33 3b 0a 0a 09 09 buflen - 3;....
e4b0: 09 09 2f 2a 20 52 53 41 20 50 4b 43 53 23 31 20 ../* RSA PKCS#1
e4c0: 45 4d 53 41 2d 50 4b 43 53 31 2d 76 31 5f 35 20 EMSA-PKCS1-v1_5
e4d0: 50 61 64 64 69 6e 67 20 2a 2f 0a 09 09 09 09 74 Padding */.....t
e4e0: 6d 70 62 75 66 5b 30 5d 20 3d 20 30 78 30 30 3b mpbuf[0] = 0x00;
e4f0: 0a 09 09 09 09 74 6d 70 62 75 66 5b 31 5d 20 3d .....tmpbuf[1] =
e500: 20 30 78 30 31 3b 0a 09 09 09 09 6d 65 6d 73 65 0x01;.....memse
e510: 74 28 26 74 6d 70 62 75 66 5b 32 5d 2c 20 30 78 t(&tmpbuf[2], 0x
e520: 46 46 2c 20 70 61 64 6c 65 6e 29 3b 0a 09 09 09 FF, padlen);....
e530: 09 74 6d 70 62 75 66 5b 70 61 64 6c 65 6e 20 2b .tmpbuf[padlen +
e540: 20 32 5d 3d 20 30 78 30 30 3b 0a 09 09 09 09 6d 2]= 0x00;.....m
e550: 65 6d 63 70 79 28 26 74 6d 70 62 75 66 5b 70 61 emcpy(&tmpbuf[pa
e560: 64 6c 65 6e 20 2b 20 33 5d 2c 20 62 75 66 2c 20 dlen + 3], buf,
e570: 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 43 41 buflen);......CA
e580: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
e590: 42 55 46 28 22 55 6e 70 61 64 64 65 64 3a 22 2c BUF("Unpadded:",
e5a0: 20 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b 0a 09 buf, buflen);..
e5b0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
e5c0: 50 52 49 4e 54 42 55 46 28 22 50 61 64 64 65 64 PRINTBUF("Padded
e5d0: 3a 22 2c 20 74 6d 70 62 75 66 2c 20 74 6d 70 62 :", tmpbuf, tmpb
e5e0: 75 66 6c 65 6e 29 3b 0a 09 09 09 7d 20 65 6c 73 uflen);....} els
e5f0: 65 20 7b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d e {.....tmpbuf =
e600: 20 62 75 66 3b 0a 09 09 09 09 74 6d 70 62 75 66 buf;.....tmpbuf
e610: 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 09 09 len = buflen;...
e620: 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 ..free_tmpbuf =
e630: 30 3b 0a 09 09 09 09 70 61 64 6c 65 6e 20 3d 20 0;.....padlen =
e640: 30 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 0;....}...} else
e650: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 {....CACKEY_DEB
e660: 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c UG_PRINTF("Unabl
e670: 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 6b e to determine k
e680: 65 79 20 73 69 7a 65 2c 20 68 6f 70 69 6e 67 20 ey size, hoping
e690: 74 68 65 20 6d 65 73 73 61 67 65 20 69 73 20 70 the message is p
e6a0: 72 6f 70 65 72 6c 79 20 70 61 64 64 65 64 21 22 roperly padded!"
e6b0: 29 3b 0a 0a 09 09 09 74 6d 70 62 75 66 20 3d 20 );.....tmpbuf =
e6c0: 62 75 66 3b 0a 09 09 09 74 6d 70 62 75 66 6c 65 buf;....tmpbufle
e6d0: 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 09 09 09 66 n = buflen;....f
e6e0: 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a ree_tmpbuf = 0;.
e6f0: 09 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b 0a 09 ...padlen = 0;..
e700: 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 74 .}..} else {...t
e710: 6d 70 62 75 66 20 3d 20 62 75 66 3b 0a 09 09 74 mpbuf = buf;...t
e720: 6d 70 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65 mpbuflen = bufle
e730: 6e 3b 0a 09 09 66 72 65 65 5f 74 6d 70 62 75 66 n;...free_tmpbuf
e740: 20 3d 20 30 3b 0a 09 09 70 61 64 6c 65 6e 20 3d = 0;...padlen =
e750: 20 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 0;..}.../* Begi
e760: 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f n transaction */
e770: 0a 09 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 ..cackey_begin_t
e780: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 ransaction(slot)
e790: 3b 0a 0a 09 2f 2a 20 53 65 6c 65 63 74 20 63 6f ;.../* Select co
e7a0: 72 72 65 63 74 20 61 70 70 6c 65 74 20 2a 2f 0a rrect applet */.
e7b0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
e7c0: 49 4e 54 46 28 22 53 65 6c 65 63 74 69 6e 67 20 INTF("Selecting
e7d0: 61 70 70 6c 65 74 20 66 6f 75 6e 64 20 61 74 20 applet found at
e7e0: 25 70 20 2e 2e 2e 22 2c 20 69 64 65 6e 74 69 74 %p ...", identit
e7f0: 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 y->pcsc_identity
e800: 2d 3e 61 70 70 6c 65 74 29 3b 0a 09 63 61 63 6b ->applet);..cack
e810: 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 ey_select_applet
e820: 28 73 6c 6f 74 2c 20 69 64 65 6e 74 69 74 79 2d (slot, identity-
e830: 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e >pcsc_identity->
e840: 61 70 70 6c 65 74 2c 20 73 69 7a 65 6f 66 28 69 applet, sizeof(i
e850: 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 dentity->pcsc_id
e860: 65 6e 74 69 74 79 2d 3e 61 70 70 6c 65 74 29 29 entity->applet))
e870: 3b 0a 0a 09 2f 2a 20 53 65 6c 65 63 74 20 63 6f ;.../* Select co
e880: 72 72 65 63 74 20 66 69 6c 65 20 2a 2f 0a 09 63 rrect file */..c
e890: 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c ackey_select_fil
e8a0: 65 28 73 6c 6f 74 2c 20 69 64 65 6e 74 69 74 79 e(slot, identity
e8b0: 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d ->pcsc_identity-
e8c0: 3e 66 69 6c 65 29 3b 0a 0a 09 74 6d 70 62 75 66 >file);...tmpbuf
e8d0: 5f 73 20 3d 20 74 6d 70 62 75 66 3b 0a 09 6f 75 _s = tmpbuf;..ou
e8e0: 74 62 75 66 5f 73 20 3d 20 6f 75 74 62 75 66 3b tbuf_s = outbuf;
e8f0: 0a 09 77 68 69 6c 65 20 28 74 6d 70 62 75 66 6c ..while (tmpbufl
e900: 65 6e 29 20 7b 0a 09 09 69 66 20 28 74 6d 70 62 en) {...if (tmpb
e910: 75 66 6c 65 6e 20 3e 20 32 34 35 29 20 7b 0a 09 uflen > 245) {..
e920: 09 09 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 20 ..bytes_to_send
e930: 3d 20 32 34 35 3b 0a 09 09 09 70 31 20 3d 20 30 = 245;....p1 = 0
e940: 78 38 30 3b 0a 09 09 09 6c 65 20 3d 20 30 78 30 x80;....le = 0x0
e950: 30 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 0;...} else {...
e960: 09 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 20 3d .bytes_to_send =
e970: 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 09 09 70 tmpbuflen;....p
e980: 31 20 3d 20 30 78 30 30 3b 0a 09 09 09 6c 65 20 1 = 0x00;....le
e990: 3d 20 30 78 30 30 3b 0a 09 09 7d 0a 0a 09 09 74 = 0x00;...}....t
e9a0: 6d 70 6f 75 74 62 75 66 6c 65 6e 20 3d 20 6f 75 mpoutbuflen = ou
e9b0: 74 62 75 66 6c 65 6e 3b 0a 0a 09 09 73 65 6e 64 tbuflen;....send
e9c0: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 _ret = cackey_se
e9d0: 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 nd_apdu(slot, GS
e9e0: 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c CIS_CLASS_GLOBAL
e9f0: 5f 50 4c 41 54 46 4f 52 4d 2c 20 47 53 43 49 53 _PLATFORM, GSCIS
ea00: 5f 49 4e 53 54 52 5f 53 49 47 4e 44 45 43 52 59 _INSTR_SIGNDECRY
ea10: 50 54 2c 20 70 31 2c 20 30 78 30 30 2c 20 62 79 PT, p1, 0x00, by
ea20: 74 65 73 5f 74 6f 5f 73 65 6e 64 2c 20 74 6d 70 tes_to_send, tmp
ea30: 62 75 66 2c 20 6c 65 2c 20 26 72 65 73 70 63 6f buf, le, &respco
ea40: 64 65 2c 20 6f 75 74 62 75 66 2c 20 26 74 6d 70 de, outbuf, &tmp
ea50: 6f 75 74 62 75 66 6c 65 6e 29 3b 0a 09 09 69 66 outbuflen);...if
ea60: 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 (send_ret != CA
ea70: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 CKEY_PCSC_S_OK)
ea80: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {....CACKEY_DEBU
ea90: 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20 53 G_PRINTF("ADPU S
eaa0: 65 6e 64 69 6e 67 20 46 61 69 6c 65 64 20 2d 2d ending Failed --
eab0: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 returning in er
eac0: 72 6f 72 2e 22 29 3b 0a 0a 09 09 09 69 66 20 28 ror.");.....if (
ead0: 66 72 65 65 5f 74 6d 70 62 75 66 29 20 7b 0a 09 free_tmpbuf) {..
eae0: 09 09 09 69 66 20 28 74 6d 70 62 75 66 5f 73 29 ...if (tmpbuf_s)
eaf0: 20 7b 0a 09 09 09 09 09 66 72 65 65 28 74 6d 70 {......free(tmp
eb00: 62 75 66 5f 73 29 3b 0a 09 09 09 09 7d 0a 09 09 buf_s);.....}...
eb10: 09 7d 0a 0a 09 09 09 2f 2a 20 45 6e 64 20 74 72 .}...../* End tr
eb20: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 ansaction */....
eb30: 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 cackey_end_trans
eb40: 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 action(slot);...
eb50: 09 09 69 66 20 28 72 65 73 70 63 6f 64 65 20 3d ..if (respcode =
eb60: 3d 20 30 78 36 39 38 32 29 20 7b 0a 09 09 09 09 = 0x6982) {.....
eb70: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
eb80: 4e 54 46 28 22 53 65 63 75 72 69 74 79 20 73 74 NTF("Security st
eb90: 61 74 75 73 20 6e 6f 74 20 73 61 74 69 73 69 66 atus not satisif
eba0: 69 65 64 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 ied. Returning
ebb0: 4e 45 45 44 4c 4f 47 49 4e 22 29 3b 0a 0a 09 09 NEEDLOGIN");....
ebc0: 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c ..cackey_mark_sl
ebd0: 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a ot_reset(slot);.
ebe0: 09 09 09 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f ....slot->token_
ebf0: 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 flags = CKF_LOGI
ec00: 4e 5f 52 45 51 55 49 52 45 44 3b 0a 0a 09 09 09 N_REQUIRED;.....
ec10: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 .return(CACKEY_P
ec20: 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 CSC_E_NEEDLOGIN)
ec30: 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 73 ;....}.....if (s
ec40: 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 end_ret == CACKE
ec50: 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 Y_PCSC_E_TOKENAB
ec60: 53 45 4e 54 29 20 7b 0a 09 09 09 09 43 41 43 4b SENT) {.....CACK
ec70: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
ec80: 22 54 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 "Token absent.
ec90: 52 65 74 75 72 6e 69 6e 67 20 54 4f 4b 45 4e 41 Returning TOKENA
eca0: 42 53 45 4e 54 22 29 3b 0a 0a 09 09 09 09 63 61 BSENT");......ca
ecb0: 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 ckey_mark_slot_r
ecc0: 65 73 65 74 28 73 6c 6f 74 29 3b 0a 09 09 09 09 eset(slot);.....
ecd0: 73 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67 slot->token_flag
ece0: 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 s = CKF_LOGIN_RE
ecf0: 51 55 49 52 45 44 3b 0a 0a 09 09 09 09 72 65 74 QUIRED;......ret
ed00: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f urn(CACKEY_PCSC_
ed10: 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a E_TOKENABSENT);.
ed20: 09 09 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28 ...}.....return(
ed30: 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 74 6d 70 62 -1);...}....tmpb
ed40: 75 66 20 2b 3d 20 62 79 74 65 73 5f 74 6f 5f 73 uf += bytes_to_s
ed50: 65 6e 64 3b 0a 09 09 74 6d 70 62 75 66 6c 65 6e end;...tmpbuflen
ed60: 20 2d 3d 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e -= bytes_to_sen
ed70: 64 3b 0a 0a 09 09 6f 75 74 62 75 66 20 2b 3d 20 d;....outbuf +=
ed80: 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 09 tmpoutbuflen;...
ed90: 6f 75 74 62 75 66 6c 65 6e 20 2d 3d 20 74 6d 70 outbuflen -= tmp
eda0: 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 09 72 65 74 outbuflen;...ret
edb0: 76 61 6c 20 2b 3d 20 74 6d 70 6f 75 74 62 75 66 val += tmpoutbuf
edc0: 6c 65 6e 3b 0a 09 7d 0a 0a 09 69 66 20 28 66 72 len;..}...if (fr
edd0: 65 65 5f 74 6d 70 62 75 66 29 20 7b 0a 09 09 69 ee_tmpbuf) {...i
ede0: 66 20 28 74 6d 70 62 75 66 5f 73 29 20 7b 0a 09 f (tmpbuf_s) {..
edf0: 09 09 66 72 65 65 28 74 6d 70 62 75 66 5f 73 29 ..free(tmpbuf_s)
ee00: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6f 75 74 62 75 ;...}..}...outbu
ee10: 66 20 3d 20 6f 75 74 62 75 66 5f 73 3b 0a 0a 09 f = outbuf_s;...
ee20: 2f 2a 20 45 6e 64 20 74 72 61 6e 73 61 63 74 69 /* End transacti
ee30: 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e on */..cackey_en
ee40: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c d_transaction(sl
ee50: 6f 74 29 3b 0a 0a 23 69 66 64 65 66 20 43 41 43 ot);..#ifdef CAC
ee60: 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 KEY_PARANOID.#
ee70: 69 66 64 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 ifdef _POSIX_SSI
ee80: 5a 45 5f 4d 41 58 0a 09 69 66 20 28 6f 75 74 62 ZE_MAX..if (outb
ee90: 75 66 6c 65 6e 20 3e 20 5f 50 4f 53 49 58 5f 53 uflen > _POSIX_S
eea0: 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 SIZE_MAX) {...CA
eeb0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
eec0: 46 28 22 4f 75 74 62 75 66 6c 65 6e 20 65 78 63 F("Outbuflen exc
eed0: 65 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c eeds maximum val
eee0: 75 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e ue, returning in
eef0: 20 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d failure. (max =
ef00: 20 25 6c 69 2c 20 6f 75 74 62 75 66 6c 65 6e 20 %li, outbuflen
ef10: 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20 = %lu)", (long)
ef20: 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 _POSIX_SSIZE_MAX
ef30: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
ef40: 29 20 6f 75 74 62 75 66 6c 65 6e 29 3b 0a 0a 09 ) outbuflen);...
ef50: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a .return(-1);..}.
ef60: 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a # endif.#endif.
ef70: 0a 09 2f 2a 20 55 6e 70 61 64 20 72 65 70 6c 79 ../* Unpad reply
ef80: 20 2a 2f 0a 09 69 66 20 28 75 6e 70 61 64 4f 75 */..if (unpadOu
ef90: 74 70 75 74 29 20 7b 0a 09 09 69 66 20 28 72 65 tput) {...if (re
efa0: 74 76 61 6c 20 3c 20 33 29 20 7b 0a 09 09 09 43 tval < 3) {....C
efb0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
efc0: 54 46 28 22 52 65 70 6c 79 20 69 73 20 74 6f 6f TF("Reply is too
efd0: 20 73 6d 61 6c 6c 2c 20 77 65 20 61 72 65 20 6e small, we are n
efe0: 6f 74 20 61 62 6c 65 20 74 6f 20 75 6e 70 61 64 ot able to unpad
eff0: 20 2d 2d 20 70 61 73 73 69 6e 67 20 62 61 63 6b -- passing back
f000: 20 61 6e 64 20 68 6f 70 69 6e 67 20 66 6f 72 20 and hoping for
f010: 74 68 65 20 62 65 73 74 21 22 29 3b 0a 0a 09 09 the best!");....
f020: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
f030: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
f040: 69 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74 76 in success, retv
f050: 61 6c 20 3d 20 25 6c 69 20 28 62 79 74 65 73 29 al = %li (bytes)
f060: 22 2c 20 28 6c 6f 6e 67 29 20 72 65 74 76 61 6c ", (long) retval
f070: 29 3b 0a 09 09 09 72 65 74 75 72 6e 28 72 65 74 );....return(ret
f080: 76 61 6c 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 val);...}....if
f090: 28 6f 75 74 62 75 66 5b 30 5d 20 21 3d 20 30 78 (outbuf[0] != 0x
f0a0: 30 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 00) {....CACKEY_
f0b0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e DEBUG_PRINTF("Un
f0c0: 72 65 63 6f 67 6e 69 7a 65 64 20 70 61 64 64 69 recognized paddi
f0d0: 6e 67 20 73 63 68 65 6d 65 20 2d 2d 20 70 61 73 ng scheme -- pas
f0e0: 73 69 6e 67 20 62 61 63 6b 20 61 6e 64 20 68 6f sing back and ho
f0f0: 70 69 6e 67 20 66 6f 72 20 74 68 65 20 62 65 73 ping for the bes
f100: 74 21 22 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 t!");.....CACKEY
f110: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
f120: 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 eturning in succ
f130: 65 73 73 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c ess, retval = %l
f140: 69 20 28 62 79 74 65 73 29 22 2c 20 28 6c 6f 6e i (bytes)", (lon
f150: 67 29 20 72 65 74 76 61 6c 29 3b 0a 09 09 09 72 g) retval);....r
f160: 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 09 eturn(retval);..
f170: 09 7d 0a 0a 09 09 62 6c 6f 63 6b 74 79 70 65 20 .}....blocktype
f180: 3d 20 6f 75 74 62 75 66 5b 31 5d 3b 0a 09 09 75 = outbuf[1];...u
f190: 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 30 3b 0a npadoffset = 0;.
f1a0: 0a 09 09 73 77 69 74 63 68 20 28 62 6c 6f 63 6b ...switch (block
f1b0: 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20 type) {....case
f1c0: 30 78 30 30 3a 0a 09 09 09 09 2f 2a 20 50 61 64 0x00:...../* Pad
f1d0: 64 69 6e 67 20 53 63 68 65 6d 65 20 31 2c 20 74 ding Scheme 1, t
f1e0: 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d 7a 65 72 he first non-zer
f1f0: 6f 20 62 79 74 65 20 69 73 20 74 68 65 20 73 74 o byte is the st
f200: 61 72 74 20 6f 66 20 64 61 74 61 20 2a 2f 0a 09 art of data */..
f210: 09 09 09 66 6f 72 20 28 75 6e 70 61 64 6f 66 66 ...for (unpadoff
f220: 73 65 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f 66 set = 2; unpadof
f230: 66 73 65 74 20 3c 20 72 65 74 76 61 6c 3b 20 75 fset < retval; u
f240: 6e 70 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a npadoffset++) {.
f250: 09 09 09 09 09 69 66 20 28 6f 75 74 62 75 66 5b .....if (outbuf[
f260: 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 21 3d 20 unpadoffset] !=
f270: 30 78 30 30 29 20 7b 0a 09 09 09 09 09 09 62 72 0x00) {.......br
f280: 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 eak;......}.....
f290: 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 }.....break;....
f2a0: 63 61 73 65 20 30 78 30 31 3a 0a 09 09 09 09 2f case 0x01:...../
f2b0: 2a 20 50 61 64 64 69 6e 67 20 53 63 68 65 6d 65 * Padding Scheme
f2c0: 20 32 2c 20 70 61 64 20 62 79 74 65 73 20 61 72 2, pad bytes ar
f2d0: 65 20 30 78 46 46 20 66 6f 6c 6c 6f 77 65 64 20 e 0xFF followed
f2e0: 62 79 20 30 78 30 30 20 2a 2f 0a 09 09 09 09 66 by 0x00 */.....f
f2f0: 6f 72 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20 or (unpadoffset
f300: 3d 20 32 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 = 2; unpadoffset
f310: 20 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70 61 64 < retval; unpad
f320: 6f 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09 09 09 offset++) {.....
f330: 09 69 66 20 28 6f 75 74 62 75 66 5b 75 6e 70 61 .if (outbuf[unpa
f340: 64 6f 66 66 73 65 74 5d 20 21 3d 20 30 78 46 46 doffset] != 0xFF
f350: 29 20 7b 0a 09 09 09 09 09 09 69 66 20 28 6f 75 ) {.......if (ou
f360: 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 tbuf[unpadoffset
f370: 5d 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 ] == 0x00) {....
f380: 09 09 09 09 75 6e 70 61 64 6f 66 66 73 65 74 2b ....unpadoffset+
f390: 2b 3b 0a 0a 09 09 09 09 09 09 09 62 72 65 61 6b +;.........break
f3a0: 3b 0a 09 09 09 09 09 09 7d 20 65 6c 73 65 20 7b ;.......} else {
f3b0: 0a 09 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 ........CACKEY_D
f3c0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 EBUG_PRINTF("Inv
f3d0: 61 6c 69 64 20 70 61 64 64 69 6e 67 20 64 61 74 alid padding dat
f3e0: 61 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 69 a found, returni
f3f0: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2c 20 73 ng in failure, s
f400: 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 hould have been
f410: 30 78 30 30 20 66 6f 75 6e 64 20 30 78 25 30 32 0x00 found 0x%02
f420: 78 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e x", (unsigned in
f430: 74 29 20 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f t) outbuf[unpado
f440: 66 66 73 65 74 5d 29 3b 0a 0a 09 09 09 09 09 09 ffset]);........
f450: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 .return(-1);....
f460: 09 09 09 7d 0a 09 09 09 09 09 7d 20 65 6c 73 65 ...}......} else
f470: 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f {.......CACKEY_
f480: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e DEBUG_PRINTF("In
f490: 76 61 6c 69 64 20 70 61 64 64 69 6e 67 20 64 61 valid padding da
f4a0: 74 61 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e ta found, return
f4b0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2c 20 ing in failure,
f4c0: 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e should have been
f4d0: 20 30 78 46 46 20 66 6f 75 6e 64 20 30 78 25 30 0xFF found 0x%0
f4e0: 32 78 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 2x", (unsigned i
f4f0: 6e 74 29 20 6f 75 74 62 75 66 5b 75 6e 70 61 64 nt) outbuf[unpad
f500: 6f 66 66 73 65 74 5d 29 3b 0a 0a 09 09 09 09 09 offset]);.......
f510: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 .return(-1);....
f520: 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 ..}.....}.....br
f530: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 30 eak;....case 0x0
f540: 32 3a 0a 09 09 09 09 2f 2a 20 50 61 64 64 69 6e 2:...../* Paddin
f550: 67 20 53 63 68 65 6d 65 20 33 2c 20 70 61 64 20 g Scheme 3, pad
f560: 62 79 74 65 73 20 61 72 65 20 6e 6f 6e 2d 7a 65 bytes are non-ze
f570: 72 6f 20 66 69 72 73 74 20 7a 65 72 6f 20 62 79 ro first zero by
f580: 74 65 20 66 6f 75 6e 64 20 69 73 20 74 68 65 20 te found is the
f590: 73 65 70 65 72 61 74 6f 72 20 62 79 74 65 20 2a seperator byte *
f5a0: 2f 0a 09 09 09 09 66 6f 72 20 28 75 6e 70 61 64 /.....for (unpad
f5b0: 6f 66 66 73 65 74 20 3d 20 32 3b 20 75 6e 70 61 offset = 2; unpa
f5c0: 64 6f 66 66 73 65 74 20 3c 20 72 65 74 76 61 6c doffset < retval
f5d0: 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 29 ; unpadoffset++)
f5e0: 20 7b 0a 09 09 09 09 09 69 66 20 28 6f 75 74 62 {......if (outb
f5f0: 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 uf[unpadoffset]
f600: 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 09 09 == 0x00) {......
f610: 09 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 3b 0a .unpadoffset++;.
f620: 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 .......break;...
f630: 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 09 62 ...}.....}.....b
f640: 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 reak;...}....if
f650: 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3e 20 72 (unpadoffset > r
f660: 65 74 76 61 6c 29 20 7b 0a 09 09 09 43 41 43 4b etval) {....CACK
f670: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
f680: 22 4f 66 66 73 65 74 20 67 72 65 61 74 65 72 20 "Offset greater
f690: 74 68 61 6e 20 72 65 70 6c 79 20 73 69 7a 65 2c than reply size,
f6a0: 20 61 62 6f 72 74 69 6e 67 2e 20 20 28 75 6e 70 aborting. (unp
f6b0: 61 64 6f 66 66 73 65 74 20 3d 20 25 6c 75 2c 20 adoffset = %lu,
f6c0: 72 65 74 76 61 6c 20 3d 20 25 6c 75 29 22 2c 20 retval = %lu)",
f6d0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
f6e0: 75 6e 70 61 64 6f 66 66 73 65 74 2c 20 28 75 6e unpadoffset, (un
f6f0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65 74 signed long) ret
f700: 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e val);.....return
f710: 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 (-1);...}....CAC
f720: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 KEY_DEBUG_PRINTB
f730: 55 46 28 22 50 61 64 64 65 64 3a 22 2c 20 6f 75 UF("Padded:", ou
f740: 74 62 75 66 2c 20 72 65 74 76 61 6c 29 3b 0a 0a tbuf, retval);..
f750: 09 09 72 65 74 76 61 6c 20 2d 3d 20 75 6e 70 61 ..retval -= unpa
f760: 64 6f 66 66 73 65 74 3b 0a 09 09 6d 65 6d 6d 6f doffset;...memmo
f770: 76 65 28 6f 75 74 62 75 66 2c 20 6f 75 74 62 75 ve(outbuf, outbu
f780: 66 20 2b 20 75 6e 70 61 64 6f 66 66 73 65 74 2c f + unpadoffset,
f790: 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 43 41 43 retval);....CAC
f7a0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 KEY_DEBUG_PRINTB
f7b0: 55 46 28 22 55 6e 70 61 64 64 65 64 3a 22 2c 20 UF("Unpadded:",
f7c0: 6f 75 74 62 75 66 2c 20 72 65 74 76 61 6c 29 3b outbuf, retval);
f7d0: 0a 09 7d 0a 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ..}....CACKEY_DE
f7e0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
f7f0: 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 rning in success
f800: 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c 69 20 28 , retval = %li (
f810: 62 79 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29 20 bytes)", (long)
f820: 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 retval);...retur
f830: 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a n(retval);.}../*
f840: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 . * SYNPOSIS. *
f850: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 .... *. * AR
f860: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e GUMENTS. * .
f870: 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 ... *. * RETURN
f880: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e VALUE. * ...
f890: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 . *. * NOTES. *
f8a0: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 .... *. */.s
f8b0: 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 tatic cackey_ret
f8c0: 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 73 74 cackey_login(st
f8d0: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 ruct cackey_slot
f8e0: 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 *slot, unsigned
f8f0: 20 63 68 61 72 20 2a 70 69 6e 2c 20 75 6e 73 69 char *pin, unsi
f900: 67 6e 65 64 20 6c 6f 6e 67 20 70 69 6e 5f 6c 65 gned long pin_le
f910: 6e 2c 20 69 6e 74 20 2a 74 72 69 65 73 5f 72 65 n, int *tries_re
f920: 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 75 6e maining_p) {..un
f930: 73 69 67 6e 65 64 20 63 68 61 72 20 63 61 63 5f signed char cac_
f940: 70 69 6e 5b 38 5d 20 3d 20 7b 30 78 46 46 2c 20 pin[8] = {0xFF,
f950: 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 0xFF, 0xFF, 0xFF
f960: 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 , 0xFF, 0xFF, 0x
f970: 46 46 2c 20 30 78 46 46 7d 3b 0a 09 75 69 6e 74 FF, 0xFF};..uint
f980: 31 36 5f 74 20 72 65 73 70 6f 6e 73 65 5f 63 6f 16_t response_co
f990: 64 65 3b 0a 09 69 6e 74 20 74 72 69 65 73 5f 72 de;..int tries_r
f9a0: 65 6d 61 69 6e 69 6e 67 3b 0a 09 69 6e 74 20 73 emaining;..int s
f9b0: 65 6e 64 5f 72 65 74 3b 0a 0a 09 2f 2a 20 49 6e end_ret;.../* In
f9c0: 64 69 63 61 74 65 20 74 68 61 74 20 77 65 20 64 dicate that we d
f9d0: 6f 20 6e 6f 74 20 6b 6e 6f 77 20 61 62 6f 75 74 o not know about
f9e0: 20 68 6f 77 20 6d 61 6e 79 20 74 72 69 65 73 20 how many tries
f9f0: 61 72 65 20 72 65 6d 61 69 6e 69 6e 67 20 2a 2f are remaining */
fa00: 0a 09 69 66 20 28 74 72 69 65 73 5f 72 65 6d 61 ..if (tries_rema
fa10: 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 09 2a 74 72 ining_p) {...*tr
fa20: 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 20 ies_remaining_p
fa30: 3d 20 2d 31 3b 0a 09 7d 0a 0a 09 2f 2a 20 41 70 = -1;..}.../* Ap
fa40: 70 61 72 65 6e 74 6c 79 2c 20 43 41 43 20 50 49 parently, CAC PI
fa50: 4e 73 20 61 72 65 20 2a 45 58 41 43 54 4c 59 2a Ns are *EXACTLY*
fa60: 20 38 20 62 79 74 65 73 20 6c 6f 6e 67 20 2d 2d 8 bytes long --
fa70: 20 70 61 64 20 77 69 74 68 20 30 78 46 46 20 69 pad with 0xFF i
fa80: 66 20 74 6f 6f 20 73 68 6f 72 74 20 2a 2f 0a 09 f too short */..
fa90: 69 66 20 28 70 69 6e 5f 6c 65 6e 20 3e 3d 20 38 if (pin_len >= 8
faa0: 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28 63 61 63 ) {...memcpy(cac
fab0: 5f 70 69 6e 2c 20 70 69 6e 2c 20 38 29 3b 0a 09 _pin, pin, 8);..
fac0: 7d 20 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 63 70 } else {...memcp
fad0: 79 28 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 y(cac_pin, pin,
fae0: 70 69 6e 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 2f pin_len);..}.../
faf0: 2a 20 49 73 73 75 65 20 50 49 4e 20 56 65 72 69 * Issue PIN Veri
fb00: 66 79 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74 20 fy */..send_ret
fb10: 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 = cackey_send_ap
fb20: 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 du(slot, GSCIS_C
fb30: 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 LASS_ISO7816, GS
fb40: 43 49 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 CIS_INSTR_VERIFY
fb50: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 73 69 , 0x00, 0x00, si
fb60: 7a 65 6f 66 28 63 61 63 5f 70 69 6e 29 2c 20 63 zeof(cac_pin), c
fb70: 61 63 5f 70 69 6e 2c 20 30 78 30 30 2c 20 26 72 ac_pin, 0x00, &r
fb80: 65 73 70 6f 6e 73 65 5f 63 6f 64 65 2c 20 4e 55 esponse_code, NU
fb90: 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 LL, NULL);..if (
fba0: 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b send_ret != CACK
fbb0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a EY_PCSC_S_OK) {.
fbc0: 09 09 69 66 20 28 28 72 65 73 70 6f 6e 73 65 5f ..if ((response_
fbd0: 63 6f 64 65 20 26 20 30 78 36 33 43 30 29 20 3d code & 0x63C0) =
fbe0: 3d 20 30 78 36 33 43 30 29 20 7b 0a 09 09 09 74 = 0x63C0) {....t
fbf0: 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d ries_remaining =
fc00: 20 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 (response_code
fc10: 26 20 30 78 46 29 3b 0a 0a 09 09 09 43 41 43 4b & 0xF);.....CACK
fc20: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
fc30: 22 50 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f "PIN Verificatio
fc40: 6e 20 66 61 69 6c 65 64 2c 20 25 69 20 74 72 69 n failed, %i tri
fc50: 65 73 20 72 65 6d 61 69 6e 69 6e 67 22 2c 20 74 es remaining", t
fc60: 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 29 3b ries_remaining);
fc70: 0a 0a 09 09 09 69 66 20 28 74 72 69 65 73 5f 72 .....if (tries_r
fc80: 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 09 emaining_p) {...
fc90: 09 09 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 ..*tries_remaini
fca0: 6e 67 5f 70 20 3d 20 74 72 69 65 73 5f 72 65 6d ng_p = tries_rem
fcb0: 61 69 6e 69 6e 67 3b 0a 09 09 09 7d 0a 0a 09 09 aining;....}....
fcc0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 .return(CACKEY_P
fcd0: 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09 CSC_E_BADPIN);..
fce0: 09 7d 0a 0a 09 09 69 66 20 28 72 65 73 70 6f 6e .}....if (respon
fcf0: 73 65 5f 63 6f 64 65 20 3d 3d 20 30 78 36 39 38 se_code == 0x698
fd00: 33 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 3) {....CACKEY_D
fd10: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e EBUG_PRINTF("PIN
fd20: 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20 66 61 Verification fa
fd30: 69 6c 65 64 2c 20 64 65 76 69 63 65 20 69 73 20 iled, device is
fd40: 6c 6f 63 6b 65 64 22 29 3b 0a 0a 09 09 09 72 65 locked");.....re
fd50: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 turn(CACKEY_PCSC
fd60: 5f 45 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d 0a _E_LOCKED);...}.
fd70: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 ...return(CACKEY
fd80: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 _PCSC_E_GENERIC)
fd90: 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ;..}...CACKEY_DE
fda0: 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 BUG_PRINTF("PIN
fdb0: 56 65 72 69 66 69 63 61 74 69 6f 6e 20 73 75 63 Verification suc
fdc0: 63 65 65 64 65 64 22 29 3b 0a 0a 09 72 65 74 75 ceeded");...retu
fdd0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 rn(CACKEY_PCSC_S
fde0: 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 _OK);.}../*. * S
fdf0: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e YNPOSIS. * .
fe00: 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e ... *. * ARGUMEN
fe10: 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a TS. * .... *
fe20: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 . * RETURN VALUE
fe30: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 . * .... *.
fe40: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e * NOTES. * .
fe50: 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 ... *. */.static
fe60: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b cackey_ret cack
fe70: 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 ey_token_present
fe80: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 (struct cackey_s
fe90: 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 lot *slot) {..ca
fea0: 63 6b 65 79 5f 72 65 74 20 70 63 73 63 5f 63 6f ckey_ret pcsc_co
feb0: 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 44 57 4f 52 nnect_ret;..DWOR
fec0: 44 20 72 65 61 64 65 72 5f 6c 65 6e 2c 20 73 74 D reader_len, st
fed0: 61 74 65 2c 20 70 72 6f 74 6f 63 6f 6c 2c 20 61 ate, protocol, a
fee0: 74 72 5f 6c 65 6e 3b 0a 09 42 59 54 45 20 61 74 tr_len;..BYTE at
fef0: 72 5b 4d 41 58 5f 41 54 52 5f 53 49 5a 45 5d 3b r[MAX_ATR_SIZE];
ff00: 0a 09 4c 4f 4e 47 20 73 74 61 74 75 73 5f 72 65 ..LONG status_re
ff10: 74 2c 20 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f t, scard_reconn_
ff20: 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ret;...CACKEY_DE
ff30: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
ff40: 65 64 2e 22 29 3b 0a 0a 09 70 63 73 63 5f 63 6f ed.");...pcsc_co
ff50: 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b nnect_ret = cack
ff60: 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 ey_connect_card(
ff70: 73 6c 6f 74 29 3b 0a 09 69 66 20 28 70 63 73 63 slot);..if (pcsc
ff80: 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 _connect_ret !=
ff90: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b CACKEY_PCSC_S_OK
ffa0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
ffb0: 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c UG_PRINTF("Unabl
ffc0: 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f 20 e to connect to
ffd0: 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 card, returning
ffe0: 74 6f 6b 65 6e 20 61 62 73 65 6e 74 22 29 3b 0a token absent");.
fff0: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 ...return(CACKEY
10000 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 _PCSC_E_TOKENABS
10010 45 4e 54 29 3b 0a 09 7d 0a 0a 09 61 74 72 5f 6c ENT);..}...atr_l
10020 65 6e 20 3d 20 73 69 7a 65 6f 66 28 61 74 72 29 en = sizeof(atr)
10030 3b 0a 09 73 74 61 74 75 73 5f 72 65 74 20 3d 20 ;..status_ret =
10040 53 43 61 72 64 53 74 61 74 75 73 28 73 6c 6f 74 SCardStatus(slot
10050 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 4e 55 4c ->pcsc_card, NUL
10060 4c 2c 20 26 72 65 61 64 65 72 5f 6c 65 6e 2c 20 L, &reader_len,
10070 26 73 74 61 74 65 2c 20 26 70 72 6f 74 6f 63 6f &state, &protoco
10080 6c 2c 20 61 74 72 2c 20 26 61 74 72 5f 6c 65 6e l, atr, &atr_len
10090 29 3b 0a 0a 09 69 66 20 28 73 74 61 74 75 73 5f );...if (status_
100a0 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 49 ret == SCARD_E_I
100b0 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 29 20 7b NVALID_HANDLE) {
100c0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
100d0 50 52 49 4e 54 46 28 22 53 43 61 72 64 53 74 61 PRINTF("SCardSta
100e0 74 75 73 28 29 20 72 65 74 75 72 6e 65 64 20 53 tus() returned S
100f0 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 CARD_E_INVALID_H
10100 41 4e 44 4c 45 2c 20 6d 61 72 6b 69 6e 67 20 69 ANDLE, marking i
10110 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 63 6f s not already co
10120 6e 6e 65 63 74 65 64 20 61 6e 64 20 74 72 79 69 nnected and tryi
10130 6e 67 20 61 67 61 69 6e 22 29 3b 0a 09 09 63 61 ng again");...ca
10140 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 ckey_mark_slot_r
10150 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 70 eset(slot);....p
10160 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 csc_connect_ret
10170 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 = cackey_connect
10180 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 09 69 _card(slot);...i
10190 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f f (pcsc_connect_
101a0 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 ret != CACKEY_PC
101b0 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 SC_S_OK) {....CA
101c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
101d0 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e F("Unable to con
101e0 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65 nect to card, re
101f0 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 turning token ab
10200 73 65 6e 74 22 29 3b 0a 0a 09 09 09 72 65 74 75 sent");.....retu
10210 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 rn(CACKEY_PCSC_E
10220 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 _TOKENABSENT);..
10230 09 7d 0a 0a 09 09 61 74 72 5f 6c 65 6e 20 3d 20 .}....atr_len =
10240 73 69 7a 65 6f 66 28 61 74 72 29 3b 0a 09 09 73 sizeof(atr);...s
10250 74 61 74 75 73 5f 72 65 74 20 3d 20 53 43 61 72 tatus_ret = SCar
10260 64 53 74 61 74 75 73 28 73 6c 6f 74 2d 3e 70 63 dStatus(slot->pc
10270 73 63 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c 20 26 sc_card, NULL, &
10280 72 65 61 64 65 72 5f 6c 65 6e 2c 20 26 73 74 61 reader_len, &sta
10290 74 65 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 61 te, &protocol, a
102a0 74 72 2c 20 26 61 74 72 5f 6c 65 6e 29 3b 0a 09 tr, &atr_len);..
102b0 7d 0a 0a 09 69 66 20 28 73 74 61 74 75 73 5f 72 }...if (status_r
102c0 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 et != SCARD_S_SU
102d0 43 43 45 53 53 29 20 7b 0a 09 09 63 61 63 6b 65 CCESS) {...cacke
102e0 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 y_mark_slot_rese
102f0 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 69 66 20 28 t(slot);....if (
10300 73 74 61 74 75 73 5f 72 65 74 20 3d 3d 20 53 43 status_ret == SC
10310 41 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 ARD_W_RESET_CARD
10320 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 ) {....CACKEY_DE
10330 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65 BUG_PRINTF("Rese
10340 74 20 72 65 71 75 69 72 65 64 2c 20 70 6c 65 61 t required, plea
10350 73 65 20 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 se hold...");...
10360 09 09 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 ..scard_reconn_r
10370 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 63 6f et = cackey_reco
10380 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c nnect_card(slot,
10390 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f SCARD_PROTOCOL_
103a0 54 30 20 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f T0 | SCARD_PROTO
103b0 43 4f 4c 5f 54 31 2c 20 26 70 72 6f 74 6f 63 6f COL_T1, &protoco
103c0 6c 29 3b 0a 09 09 09 69 66 20 28 73 63 61 72 64 l);....if (scard
103d0 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 _reconn_ret == S
103e0 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 CARD_S_SUCCESS)
103f0 7b 0a 09 09 09 09 2f 2a 20 55 70 64 61 74 65 20 {...../* Update
10400 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 09 09 09 protocol */.....
10410 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d slot->protocol =
10420 20 70 72 6f 74 6f 63 6f 6c 3b 0a 0a 09 09 09 09 protocol;......
10430 2f 2a 20 52 65 2d 65 73 74 61 62 6c 69 73 68 20 /* Re-establish
10440 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 transaction, if
10450 69 74 20 77 61 73 20 70 72 65 73 65 6e 74 20 2a it was present *
10460 2f 0a 09 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e /.....if (slot->
10470 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 transaction_dept
10480 68 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 73 6c h > 0) {......sl
10490 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f ot->transaction_
104a0 64 65 70 74 68 2d 2d 3b 0a 09 09 09 09 09 73 6c depth--;......sl
104b0 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f ot->transaction_
104c0 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 31 need_hw_lock = 1
104d0 3b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 62 65 ;......cackey_be
104e0 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 gin_transaction(
104f0 73 6c 6f 74 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 slot);.....}....
10500 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
10510 52 49 4e 54 46 28 22 52 65 73 65 74 20 73 75 63 RINTF("Reset suc
10520 63 65 73 73 66 75 6c 2c 20 72 65 71 75 65 72 79 cessful, requery
10530 69 6e 67 22 29 3b 0a 09 09 09 09 73 74 61 74 75 ing");.....statu
10540 73 5f 72 65 74 20 3d 20 53 43 61 72 64 53 74 61 s_ret = SCardSta
10550 74 75 73 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 tus(slot->pcsc_c
10560 61 72 64 2c 20 4e 55 4c 4c 2c 20 26 72 65 61 64 ard, NULL, &read
10570 65 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65 2c 20 er_len, &state,
10580 26 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 &protocol, atr,
10590 26 61 74 72 5f 6c 65 6e 29 3b 0a 09 09 09 09 69 &atr_len);.....i
105a0 66 20 28 73 74 61 74 75 73 5f 72 65 74 20 21 3d f (status_ret !=
105b0 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 SCARD_S_SUCCESS
105c0 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f ) {......CACKEY_
105d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 74 DEBUG_PRINTF("St
105e0 69 6c 6c 20 75 6e 61 62 6c 65 20 74 6f 20 71 75 ill unable to qu
105f0 65 72 79 20 63 61 72 64 20 73 74 61 74 75 73 2c ery card status,
10600 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e returning token
10610 20 61 62 73 65 6e 74 2e 20 20 53 43 61 72 64 53 absent. SCardS
10620 74 61 74 75 73 28 29 20 3d 20 25 73 22 2c 20 43 tatus() = %s", C
10630 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 ACKEY_DEBUG_FUNC
10640 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 _SCARDERR_TO_STR
10650 28 73 74 61 74 75 73 5f 72 65 74 29 29 3b 0a 0a (status_ret));..
10660 09 09 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b .....return(CACK
10670 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 EY_PCSC_E_TOKENA
10680 42 53 45 4e 54 29 3b 0a 09 09 09 09 7d 0a 09 09 BSENT);.....}...
10690 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 .} else {.....CA
106a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
106b0 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 72 65 63 F("Unable to rec
106c0 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20 onnect to card,
106d0 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 returning token
106e0 61 62 73 65 6e 74 2e 20 20 53 43 61 72 64 52 65 absent. SCardRe
106f0 63 6f 6e 6e 65 63 74 28 29 20 3d 20 25 73 22 2c connect() = %s",
10700 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 CACKEY_DEBUG_FU
10710 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 NC_SCARDERR_TO_S
10720 54 52 28 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f TR(scard_reconn_
10730 72 65 74 29 29 3b 0a 0a 09 09 09 09 72 65 74 75 ret));......retu
10740 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 rn(CACKEY_PCSC_E
10750 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 _TOKENABSENT);..
10760 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 ..}...} else {..
10770 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
10780 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f RINTF("Unable to
10790 20 71 75 65 72 79 20 63 61 72 64 20 73 74 61 74 query card stat
107a0 75 73 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f us, returning to
107b0 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 53 43 61 ken absent. SCa
107c0 72 64 53 74 61 74 75 73 28 29 20 3d 20 25 73 22 rdStatus() = %s"
107d0 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 , CACKEY_DEBUG_F
107e0 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f UNC_SCARDERR_TO_
107f0 53 54 52 28 73 74 61 74 75 73 5f 72 65 74 29 29 STR(status_ret))
10800 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 ;.....return(CAC
10810 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e KEY_PCSC_E_TOKEN
10820 41 42 53 45 4e 54 29 3b 0a 09 09 7d 0a 09 7d 0a ABSENT);...}..}.
10830 0a 09 69 66 20 28 28 73 74 61 74 65 20 26 20 53 ..if ((state & S
10840 43 41 52 44 5f 41 42 53 45 4e 54 29 20 3d 3d 20 CARD_ABSENT) ==
10850 53 43 41 52 44 5f 41 42 53 45 4e 54 29 20 7b 0a SCARD_ABSENT) {.
10860 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
10870 52 49 4e 54 46 28 22 43 61 72 64 20 69 73 20 61 RINTF("Card is a
10880 62 73 65 6e 74 2c 20 72 65 74 75 72 6e 69 6e 67 bsent, returning
10890 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 22 29 3b token absent");
108a0 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 ....return(CACKE
108b0 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 Y_PCSC_E_TOKENAB
108c0 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b SENT);..}...CACK
108d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
108e0 22 52 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e "Returning token
108f0 20 70 72 65 73 65 6e 74 2e 22 29 3b 0a 0a 09 72 present.");...r
10900 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 eturn(CACKEY_PCS
10910 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 C_S_TOKENPRESENT
10920 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 );.}../*. * SYNP
10930 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a OSIS. * ....
10940 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a *. * ARGUMENTS.
10950 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a * .... *. *
10960 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a RETURN VALUE. *
10970 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e .... *. * N
10980 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a OTES. * ....
10990 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73 *. */.static ss
109a0 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 70 63 73 ize_t cackey_pcs
109b0 63 5f 69 64 65 6e 74 69 74 79 5f 74 6f 5f 6c 61 c_identity_to_la
109c0 62 65 6c 28 73 74 72 75 63 74 20 63 61 63 6b 65 bel(struct cacke
109d0 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 y_pcsc_identity
109e0 2a 69 64 65 6e 74 69 74 79 2c 20 75 6e 73 69 67 *identity, unsig
109f0 6e 65 64 20 63 68 61 72 20 2a 6c 61 62 65 6c 5f ned char *label_
10a00 62 75 66 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f buf, unsigned lo
10a10 6e 67 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e ng label_buf_len
10a20 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f ) {..unsigned lo
10a30 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c ng certificate_l
10a40 65 6e 3b 0a 09 63 68 61 72 20 2a 6c 61 62 65 6c en;..char *label
10a50 5f 61 73 6e 31 3b 0a 09 76 6f 69 64 20 2a 63 65 _asn1;..void *ce
10a60 72 74 69 66 69 63 61 74 65 3b 0a 09 69 6e 74 20 rtificate;..int
10a70 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 0a x509_read_ret;..
10a80 09 63 65 72 74 69 66 69 63 61 74 65 20 3d 20 69 .certificate = i
10a90 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 dentity->certifi
10aa0 63 61 74 65 3b 0a 09 63 65 72 74 69 66 69 63 61 cate;..certifica
10ab0 74 65 5f 6c 65 6e 20 3d 20 69 64 65 6e 74 69 74 te_len = identit
10ac0 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c y->certificate_l
10ad0 65 6e 3b 0a 0a 09 69 66 20 28 63 65 72 74 69 66 en;...if (certif
10ae0 69 63 61 74 65 5f 6c 65 6e 20 3c 20 30 29 20 7b icate_len < 0) {
10af0 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 ...return(-1);..
10b00 7d 0a 0a 09 78 35 30 39 5f 72 65 61 64 5f 72 65 }...x509_read_re
10b10 74 20 3d 20 78 35 30 39 5f 74 6f 5f 73 75 62 6a t = x509_to_subj
10b20 65 63 74 28 63 65 72 74 69 66 69 63 61 74 65 2c ect(certificate,
10b30 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e certificate_len
10b40 2c 20 28 76 6f 69 64 20 2a 2a 29 20 26 6c 61 62 , (void **) &lab
10b50 65 6c 5f 61 73 6e 31 29 3b 0a 09 69 66 20 28 78 el_asn1);..if (x
10b60 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 509_read_ret < 0
10b70 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 ) {...return(-1)
10b80 3b 0a 09 7d 0a 0a 09 78 35 30 39 5f 72 65 61 64 ;..}...x509_read
10b90 5f 72 65 74 20 3d 20 78 35 30 39 5f 64 6e 5f 74 _ret = x509_dn_t
10ba0 6f 5f 73 74 72 69 6e 67 28 6c 61 62 65 6c 5f 61 o_string(label_a
10bb0 73 6e 31 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 sn1, x509_read_r
10bc0 65 74 2c 20 28 63 68 61 72 20 2a 29 20 6c 61 62 et, (char *) lab
10bd0 65 6c 5f 62 75 66 2c 20 6c 61 62 65 6c 5f 62 75 el_buf, label_bu
10be0 66 5f 6c 65 6e 2c 20 22 43 4e 22 29 3b 0a 09 69 f_len, "CN");..i
10bf0 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 f (x509_read_ret
10c00 20 3c 3d 20 30 29 20 7b 0a 09 09 78 35 30 39 5f <= 0) {...x509_
10c10 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f read_ret = x509_
10c20 64 6e 5f 74 6f 5f 73 74 72 69 6e 67 28 6c 61 62 dn_to_string(lab
10c30 65 6c 5f 61 73 6e 31 2c 20 78 35 30 39 5f 72 65 el_asn1, x509_re
10c40 61 64 5f 72 65 74 2c 20 28 63 68 61 72 20 2a 29 ad_ret, (char *)
10c50 20 6c 61 62 65 6c 5f 62 75 66 2c 20 6c 61 62 65 label_buf, labe
10c60 6c 5f 62 75 66 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 l_buf_len, NULL)
10c70 3b 0a 0a 09 09 69 66 20 28 78 35 30 39 5f 72 65 ;....if (x509_re
10c80 61 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09 ad_ret <= 0) {..
10c90 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 ..return(-1);...
10ca0 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 }..}..#ifdef CAC
10cb0 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 KEY_PARANOID.#
10cc0 69 66 64 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 ifdef _POSIX_SSI
10cd0 5a 45 5f 4d 41 58 0a 09 69 66 20 28 78 35 30 39 ZE_MAX..if (x509
10ce0 5f 72 65 61 64 5f 72 65 74 20 3e 20 5f 50 4f 53 _read_ret > _POS
10cf0 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a IX_SSIZE_MAX) {.
10d00 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
10d10 52 49 4e 54 46 28 22 78 35 30 39 5f 72 65 61 64 RINTF("x509_read
10d20 5f 72 65 74 20 65 78 63 65 65 64 73 20 6d 61 78 _ret exceeds max
10d30 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74 75 imum value, retu
10d40 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 rning in failure
10d50 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 78 35 . (max = %li, x5
10d60 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 25 6c 09_read_ret = %l
10d70 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 u)", (long) _POS
10d80 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75 IX_SSIZE_MAX, (u
10d90 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 78 35 nsigned long) x5
10da0 30 39 5f 72 65 61 64 5f 72 65 74 29 3b 0a 0a 09 09_read_ret);...
10db0 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a .return(-1);..}.
10dc0 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a # endif.#endif.
10dd0 0a 09 72 65 74 75 72 6e 28 78 35 30 39 5f 72 65 ..return(x509_re
10de0 61 64 5f 72 65 74 29 3b 0a 7d 0a 0a 2f 2a 20 52 ad_ret);.}../* R
10df0 65 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 eturns 0 on succ
10e00 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e ess */.static in
10e10 74 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 63 t cackey_mutex_c
10e20 72 65 61 74 65 28 76 6f 69 64 20 2a 2a 6d 75 74 reate(void **mut
10e30 65 78 29 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d ex) {..pthread_m
10e40 75 74 65 78 5f 74 20 2a 70 74 68 72 65 61 64 5f utex_t *pthread_
10e50 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 mutex;..int pthr
10e60 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f ead_retval;..CK_
10e70 52 56 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c RV custom_retval
10e80 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ;...CACKEY_DEBUG
10e90 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
10ea0 22 29 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 ");...if ((cacke
10eb0 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 26 20 43 y_args.flags & C
10ec0 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b KF_OS_LOCKING_OK
10ed0 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b ) == CKF_OS_LOCK
10ee0 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 ING_OK) {...pthr
10ef0 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d 61 6c 6c ead_mutex = mall
10f00 6f 63 28 73 69 7a 65 6f 66 28 2a 70 74 68 72 65 oc(sizeof(*pthre
10f10 61 64 5f 6d 75 74 65 78 29 29 3b 0a 09 09 69 66 ad_mutex));...if
10f20 20 28 21 70 74 68 72 65 61 64 5f 6d 75 74 65 78 (!pthread_mutex
10f30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 ) {....CACKEY_DE
10f40 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c BUG_PRINTF("Fail
10f50 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d ed to allocate m
10f60 65 6d 6f 72 79 2e 22 29 3b 0a 0a 09 09 09 72 65 emory.");.....re
10f70 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 turn(-1);...}...
10f80 09 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 .pthread_retval
10f90 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f = pthread_mutex_
10fa0 69 6e 69 74 28 70 74 68 72 65 61 64 5f 6d 75 74 init(pthread_mut
10fb0 65 78 2c 20 4e 55 4c 4c 29 3b 0a 09 09 69 66 20 ex, NULL);...if
10fc0 28 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 (pthread_retval
10fd0 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 != 0) {....CACKE
10fe0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
10ff0 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e pthread_mutex_in
11000 69 74 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 it() returned er
11010 72 6f 72 20 28 25 69 29 2e 22 2c 20 70 74 68 72 ror (%i).", pthr
11020 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 ead_retval);....
11030 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d .return(-1);...}
11040 0a 0a 09 09 2a 6d 75 74 65 78 20 3d 20 70 74 68 ....*mutex = pth
11050 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 7d 20 65 read_mutex;..} e
11060 6c 73 65 20 7b 0a 09 09 69 66 20 28 63 61 63 6b lse {...if (cack
11070 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75 ey_args.CreateMu
11080 74 65 78 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d tex) {....custom
11090 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 _retval = cackey
110a0 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65 _args.CreateMute
110b0 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09 09 69 66 x(mutex);.....if
110c0 20 28 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 (custom_retval
110d0 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 != CKR_OK) {....
110e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
110f0 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 61 72 67 INTF("cackey_arg
11100 73 2e 43 72 65 61 74 65 4d 75 74 65 78 28 29 20 s.CreateMutex()
11110 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 returned error (
11120 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 %li).", (long) c
11130 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a ustom_retval);..
11140 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a ....return(-1);.
11150 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 ...}...}..}...CA
11160 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
11170 46 28 22 52 65 74 75 72 6e 69 6e 67 20 73 75 63 F("Returning suc
11180 65 73 73 66 75 6c 6c 79 20 28 30 29 22 29 3b 0a essfully (0)");.
11190 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a ..return(0);.}..
111a0 2f 2a 20 52 65 74 75 72 6e 73 20 30 20 6f 6e 20 /* Returns 0 on
111b0 73 75 63 63 65 73 73 20 2a 2f 0a 73 74 61 74 69 success */.stati
111c0 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d 75 74 c int cackey_mut
111d0 65 78 5f 6c 6f 63 6b 28 76 6f 69 64 20 2a 6d 75 ex_lock(void *mu
111e0 74 65 78 29 20 7b 0a 09 70 74 68 72 65 61 64 5f tex) {..pthread_
111f0 6d 75 74 65 78 5f 74 20 2a 70 74 68 72 65 61 64 mutex_t *pthread
11200 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70 74 68 _mutex;..int pth
11210 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b read_retval;..CK
11220 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 _RV custom_retva
11230 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 l;...CACKEY_DEBU
11240 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 G_PRINTF("Called
11250 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b .");...if ((cack
11260 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 26 20 ey_args.flags &
11270 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f CKF_OS_LOCKING_O
11280 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 K) == CKF_OS_LOC
11290 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 KING_OK) {...pth
112a0 72 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d 75 74 read_mutex = mut
112b0 65 78 3b 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 ex;....pthread_r
112c0 65 74 76 61 6c 20 3d 20 70 74 68 72 65 61 64 5f etval = pthread_
112d0 6d 75 74 65 78 5f 6c 6f 63 6b 28 70 74 68 72 65 mutex_lock(pthre
112e0 61 64 5f 6d 75 74 65 78 29 3b 0a 09 09 69 66 20 ad_mutex);...if
112f0 28 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 (pthread_retval
11300 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 != 0) {....CACKE
11310 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
11320 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f pthread_mutex_lo
11330 63 6b 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 ck() returned er
11340 72 6f 72 20 28 25 69 29 2e 22 2c 20 70 74 68 72 ror (%i).", pthr
11350 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 ead_retval);....
11360 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d .return(-1);...}
11370 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 ..} else {...if
11380 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 (cackey_args.Loc
11390 6b 4d 75 74 65 78 29 20 7b 0a 09 09 09 63 75 73 kMutex) {....cus
113a0 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 tom_retval = cac
113b0 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 key_args.LockMut
113c0 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09 09 69 ex(mutex);.....i
113d0 66 20 28 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c f (custom_retval
113e0 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 != CKR_OK) {...
113f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
11400 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 61 72 RINTF("cackey_ar
11410 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 28 29 20 72 gs.LockMutex() r
11420 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 eturned error (%
11430 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75 li).", (long) cu
11440 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 stom_retval);...
11450 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 ...return(-1);..
11460 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 ..}...}..}...CAC
11470 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
11480 28 22 52 65 74 75 72 6e 69 6e 67 20 73 75 63 65 ("Returning suce
11490 73 73 66 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a ssfully (0)");..
114a0 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f .return(0);.}../
114b0 2a 20 52 65 74 75 72 6e 73 20 30 20 6f 6e 20 73 * Returns 0 on s
114c0 75 63 63 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 uccess */.static
114d0 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d 75 74 65 int cackey_mute
114e0 78 5f 75 6e 6c 6f 63 6b 28 76 6f 69 64 20 2a 6d x_unlock(void *m
114f0 75 74 65 78 29 20 7b 0a 09 70 74 68 72 65 61 64 utex) {..pthread
11500 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68 72 65 61 _mutex_t *pthrea
11510 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70 74 d_mutex;..int pt
11520 68 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43 hread_retval;..C
11530 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65 74 76 K_RV custom_retv
11540 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 al;...CACKEY_DEB
11550 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
11560 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63 61 63 d.");...if ((cac
11570 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 26 key_args.flags &
11580 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f CKF_OS_LOCKING_
11590 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f OK) == CKF_OS_LO
115a0 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 CKING_OK) {...pt
115b0 68 72 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d 75 hread_mutex = mu
115c0 74 65 78 3b 0a 0a 09 09 70 74 68 72 65 61 64 5f tex;....pthread_
115d0 72 65 74 76 61 6c 20 3d 20 70 74 68 72 65 61 64 retval = pthread
115e0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 70 74 _mutex_unlock(pt
115f0 68 72 65 61 64 5f 6d 75 74 65 78 29 3b 0a 09 09 hread_mutex);...
11600 69 66 20 28 70 74 68 72 65 61 64 5f 72 65 74 76 if (pthread_retv
11610 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 al != 0) {....CA
11620 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
11630 46 28 22 70 74 68 72 65 61 64 5f 6d 75 74 65 78 F("pthread_mutex
11640 5f 75 6e 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e _unlock() return
11650 65 64 20 65 72 72 6f 72 20 28 25 69 29 2e 22 2c ed error (%i).",
11660 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 29 pthread_retval)
11670 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 ;.....return(-1)
11680 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a ;...}..} else {.
11690 09 09 69 66 20 28 63 61 63 6b 65 79 5f 61 72 67 ..if (cackey_arg
116a0 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 29 20 7b s.UnlockMutex) {
116b0 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65 74 76 61 ....custom_retva
116c0 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72 67 73 2e l = cackey_args.
116d0 55 6e 6c 6f 63 6b 4d 75 74 65 78 28 6d 75 74 65 UnlockMutex(mute
116e0 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 75 73 74 x);.....if (cust
116f0 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b 52 om_retval != CKR
11700 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 _OK) {.....CACKE
11710 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
11720 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f cackey_args.Unlo
11730 63 6b 4d 75 74 65 78 28 29 20 72 65 74 75 72 6e ckMutex() return
11740 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29 2e 22 ed error (%li)."
11750 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f , (long) custom_
11760 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65 retval);......re
11770 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 turn(-1);....}..
11780 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 .}..}...CACKEY_D
11790 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
117a0 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66 75 6c urning sucessful
117b0 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 74 75 ly (0)");...retu
117c0 72 6e 28 30 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 rn(0);.}..static
117d0 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 CK_ATTRIBUTE_PT
117e0 52 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 R cackey_get_att
117f0 72 69 62 75 74 65 73 28 43 4b 5f 4f 42 4a 45 43 ributes(CK_OBJEC
11800 54 5f 43 4c 41 53 53 20 6f 62 6a 65 63 74 63 6c T_CLASS objectcl
11810 61 73 73 2c 20 73 74 72 75 63 74 20 63 61 63 6b ass, struct cack
11820 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 ey_pcsc_identity
11830 20 2a 69 64 65 6e 74 69 74 79 2c 20 75 6e 73 69 *identity, unsi
11840 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 gned long identi
11850 74 79 5f 6e 75 6d 2c 20 43 4b 5f 55 4c 4f 4e 47 ty_num, CK_ULONG
11860 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b _PTR pulCount) {
11870 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 42 4f 4f ..static CK_BBOO
11880 4c 20 63 6b 5f 74 72 75 65 20 3d 20 31 3b 0a 09 L ck_true = 1;..
11890 73 74 61 74 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 static CK_BBOOL
118a0 63 6b 5f 66 61 6c 73 65 20 3d 20 30 3b 0a 09 43 ck_false = 0;..C
118b0 4b 5f 55 4c 4f 4e 47 20 6e 75 6d 61 74 74 72 73 K_ULONG numattrs
118c0 20 3d 20 30 2c 20 72 65 74 76 61 6c 5f 63 6f 75 = 0, retval_cou
118d0 6e 74 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 nt;..CK_ATTRIBUT
118e0 45 5f 54 59 50 45 20 63 75 72 72 5f 61 74 74 72 E_TYPE curr_attr
118f0 5f 74 79 70 65 3b 0a 09 43 4b 5f 41 54 54 52 49 _type;..CK_ATTRI
11900 42 55 54 45 20 63 75 72 72 5f 61 74 74 72 2c 20 BUTE curr_attr,
11910 2a 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 56 4f 49 *retval;..CK_VOI
11920 44 5f 50 54 52 20 70 56 61 6c 75 65 3b 0a 09 43 D_PTR pValue;..C
11930 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c 75 65 4c K_ULONG ulValueL
11940 65 6e 3b 0a 09 43 4b 5f 4f 42 4a 45 43 54 5f 43 en;..CK_OBJECT_C
11950 4c 41 53 53 20 63 6b 5f 6f 62 6a 65 63 74 5f 63 LASS ck_object_c
11960 6c 61 73 73 3b 0a 09 43 4b 5f 43 45 52 54 49 46 lass;..CK_CERTIF
11970 49 43 41 54 45 5f 54 59 50 45 20 63 6b 5f 63 65 ICATE_TYPE ck_ce
11980 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 3b 0a rtificate_type;.
11990 09 43 4b 5f 4b 45 59 5f 54 59 50 45 20 63 6b 5f .CK_KEY_TYPE ck_
119a0 6b 65 79 5f 74 79 70 65 3b 0a 09 43 4b 5f 55 54 key_type;..CK_UT
119b0 46 38 43 48 41 52 20 75 63 54 6d 70 42 75 66 5b F8CHAR ucTmpBuf[
119c0 31 30 32 34 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 1024];..unsigned
119d0 20 63 68 61 72 20 2a 63 65 72 74 69 66 69 63 61 char *certifica
119e0 74 65 3b 0a 09 73 73 69 7a 65 5f 74 20 63 65 72 te;..ssize_t cer
119f0 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 2d tificate_len = -
11a00 31 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 1, x509_read_ret
11a10 3b 0a 09 69 6e 74 20 70 56 61 6c 75 65 5f 66 72 ;..int pValue_fr
11a20 65 65 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 ee;...CACKEY_DEB
11a30 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
11a40 64 20 28 6f 62 6a 65 63 74 43 6c 61 73 73 20 3d d (objectClass =
11a50 20 25 6c 75 2c 20 69 64 65 6e 74 69 74 79 5f 6e %lu, identity_n
11a60 75 6d 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e um = %lu).", (un
11a70 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 62 6a signed long) obj
11a80 65 63 74 63 6c 61 73 73 2c 20 69 64 65 6e 74 69 ectclass, identi
11a90 74 79 5f 6e 75 6d 29 3b 0a 0a 09 69 66 20 28 6f ty_num);...if (o
11aa0 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b bjectclass != CK
11ab0 4f 5f 43 45 52 54 49 46 49 43 41 54 45 20 26 26 O_CERTIFICATE &&
11ac0 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 objectclass !=
11ad0 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 20 26 CKO_PUBLIC_KEY &
11ae0 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d & objectclass !=
11af0 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 CKO_PRIVATE_KEY
11b00 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
11b10 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
11b20 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28 ning 0 objects (
11b30 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69 64 20 6f NULL), invalid o
11b40 62 6a 65 63 74 20 63 6c 61 73 73 22 29 3b 0a 0a bject class");..
11b50 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a ..return(NULL);.
11b60 09 7d 0a 0a 09 2f 2a 20 47 65 74 20 43 65 72 74 .}.../* Get Cert
11b70 20 2a 2f 0a 09 69 66 20 28 69 64 65 6e 74 69 74 */..if (identit
11b80 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 y == NULL) {...C
11b90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
11ba0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20 TF("Returning 0
11bb0 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20 objects (NULL),
11bc0 69 6e 76 61 6c 69 64 20 69 64 65 6e 74 69 79 20 invalid identiy
11bd0 70 72 6f 76 69 64 65 64 22 29 3b 0a 0a 09 09 72 provided");....r
11be0 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a eturn(NULL);..}.
11bf0 0a 09 63 65 72 74 69 66 69 63 61 74 65 20 3d 20 ..certificate =
11c00 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 identity->certif
11c10 69 63 61 74 65 3b 0a 09 63 65 72 74 69 66 69 63 icate;..certific
11c20 61 74 65 5f 6c 65 6e 20 3d 20 69 64 65 6e 74 69 ate_len = identi
11c30 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f ty->certificate_
11c40 6c 65 6e 3b 0a 0a 09 69 66 20 28 63 65 72 74 69 len;...if (certi
11c50 66 69 63 61 74 65 5f 6c 65 6e 20 3d 3d 20 2d 31 ficate_len == -1
11c60 20 7c 7c 20 63 65 72 74 69 66 69 63 61 74 65 20 || certificate
11c70 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 == NULL) {...CAC
11c80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
11c90 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20 6f 62 ("Returning 0 ob
11ca0 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20 74 68 jects (NULL), th
11cb0 69 73 20 69 64 65 6e 74 69 74 79 20 64 6f 65 73 is identity does
11cc0 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 58 2e 35 not have an X.5
11cd0 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20 61 09 certificate a
11ce0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 69 ssociated with i
11cf0 74 20 61 6e 64 20 77 69 6c 6c 20 6e 6f 74 20 77 t and will not w
11d00 6f 72 6b 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ork");....return
11d10 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 (NULL);..}.../*
11d20 56 65 72 69 66 79 20 74 68 61 74 20 63 65 72 74 Verify that cert
11d30 69 66 69 63 61 74 65 20 69 73 20 41 53 4e 2e 31 ificate is ASN.1
11d40 20 65 6e 63 6f 64 65 64 20 58 2e 35 30 39 20 63 encoded X.509 c
11d50 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 69 ertificate */..i
11d60 66 20 28 78 35 30 39 5f 74 6f 5f 73 65 72 69 61 f (x509_to_seria
11d70 6c 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 l(certificate, c
11d80 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 ertificate_len,
11d90 4e 55 4c 4c 29 20 3c 20 30 29 20 7b 0a 09 09 43 NULL) < 0) {...C
11da0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
11db0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20 TF("Returning 0
11dc0 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20 objects (NULL),
11dd0 74 68 65 20 58 2e 35 30 39 20 63 65 72 74 69 66 the X.509 certif
11de0 69 63 61 74 65 20 61 73 73 6f 63 69 61 74 65 64 icate associated
11df0 20 77 69 74 68 20 74 68 69 73 20 69 64 65 6e 74 with this ident
11e00 69 74 79 20 69 73 20 6e 6f 74 20 76 61 6c 69 64 ity is not valid
11e10 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 ");....return(NU
11e20 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 74 76 61 6c LL);..}...retval
11e30 5f 63 6f 75 6e 74 20 3d 20 31 36 3b 0a 09 72 65 _count = 16;..re
11e40 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f 63 28 72 65 tval = malloc(re
11e50 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a tval_count * siz
11e60 65 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a 0a eof(*retval));..
11e70 09 66 6f 72 20 28 63 75 72 72 5f 61 74 74 72 5f .for (curr_attr_
11e80 74 79 70 65 20 3d 20 30 3b 20 63 75 72 72 5f 61 type = 0; curr_a
11e90 74 74 72 5f 74 79 70 65 20 3c 20 30 78 63 65 35 ttr_type < 0xce5
11ea0 33 36 33 35 66 3b 20 63 75 72 72 5f 61 74 74 72 3635f; curr_attr
11eb0 5f 74 79 70 65 2b 2b 29 20 7b 0a 09 09 69 66 20 _type++) {...if
11ec0 28 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20 (curr_attr_type
11ed0 3d 3d 20 30 78 38 30 30 29 20 7b 0a 09 09 09 63 == 0x800) {....c
11ee0 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3d 20 urr_attr_type =
11ef0 30 78 63 65 35 33 36 33 30 30 3b 0a 09 09 7d 0a 0xce536300;...}.
11f00 0a 09 09 70 56 61 6c 75 65 5f 66 72 65 65 20 3d ...pValue_free =
11f10 20 30 3b 0a 09 09 70 56 61 6c 75 65 20 3d 20 4e 0;...pValue = N
11f20 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65 4c 65 ULL;...ulValueLe
11f30 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 n = (CK_LONG) -1
11f40 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 63 75 72 ;....switch (cur
11f50 72 5f 61 74 74 72 5f 74 79 70 65 29 20 7b 0a 09 r_attr_type) {..
11f60 09 09 63 61 73 65 20 43 4b 41 5f 43 4c 41 53 53 ..case CKA_CLASS
11f70 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 :.....CACKEY_DEB
11f80 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 UG_PRINTF("Reque
11f90 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 sting attribute
11fa0 43 4b 41 5f 43 4c 41 53 53 20 28 30 78 25 30 38 CKA_CLASS (0x%08
11fb0 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 lx) ...", (unsig
11fc0 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 ned long) curr_a
11fd0 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 ttr_type);......
11fe0 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 20 ck_object_class
11ff0 3d 20 6f 62 6a 65 63 74 63 6c 61 73 73 3b 0a 0a = objectclass;..
12000 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b ....pValue = &ck
12010 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 3b 0a 09 _object_class;..
12020 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 ...ulValueLen =
12030 73 69 7a 65 6f 66 28 63 6b 5f 6f 62 6a 65 63 74 sizeof(ck_object
12040 5f 63 6c 61 73 73 29 3b 0a 0a 09 09 09 09 43 41 _class);......CA
12050 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
12060 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e F(" ... returnin
12070 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c g %lu (%p/%lu)",
12080 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
12090 20 2a 28 28 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c *((CK_OBJECT_CL
120a0 41 53 53 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 ASS *) pValue),
120b0 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 pValue, (unsigne
120c0 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c d long) ulValueL
120d0 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b en);......break;
120e0 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 4f 4b ....case CKA_TOK
120f0 45 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 EN:.....CACKEY_D
12100 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 EBUG_PRINTF("Req
12110 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 uesting attribut
12120 65 20 43 4b 41 5f 54 4f 4b 45 4e 20 28 30 78 25 e CKA_TOKEN (0x%
12130 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 08lx) ...", (uns
12140 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 igned long) curr
12150 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 _attr_type);....
12160 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 ..pValue = &ck_t
12170 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 rue;.....ulValue
12180 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f Len = sizeof(ck_
12190 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b true);......CACK
121a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
121b0 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 " ... returning
121c0 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 %lu (%p/%lu)", (
121d0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a unsigned long) *
121e0 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 ((CK_BBOOL *) pV
121f0 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 alue), pValue, (
12200 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 unsigned long) u
12210 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 lValueLen);.....
12220 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 .break;....case
12230 43 4b 41 5f 54 52 55 53 54 45 44 3a 0a 09 09 09 CKA_TRUSTED:....
12240 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
12250 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 INTF("Requesting
12260 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 attribute CKA_T
12270 52 55 53 54 45 44 20 28 30 78 25 30 38 6c 78 29 RUSTED (0x%08lx)
12280 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 ...", (unsigned
12290 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 long) curr_attr
122a0 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 _type);......pVa
122b0 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a lue = &ck_true;.
122c0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d ....ulValueLen =
122d0 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 sizeof(ck_true)
122e0 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 ;......CACKEY_DE
122f0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e BUG_PRINTF(" ...
12300 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 returning %lu (
12310 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 %p/%lu)", (unsig
12320 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f ned long) *((CK_
12330 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 BBOOL *) pValue)
12340 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 , pValue, (unsig
12350 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 ned long) ulValu
12360 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 eLen);......brea
12370 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4d k;....case CKA_M
12380 4f 44 49 46 49 41 42 4c 45 3a 0a 09 09 09 09 43 ODIFIABLE:.....C
12390 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
123a0 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 TF("Requesting a
123b0 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4d 4f 44 ttribute CKA_MOD
123c0 49 46 49 41 42 4c 45 20 28 30 78 25 30 38 6c 78 IFIABLE (0x%08lx
123d0 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 ) ...", (unsigne
123e0 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 d long) curr_att
123f0 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 r_type);......pV
12400 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 alue = &ck_false
12410 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e ;.....ulValueLen
12420 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c = sizeof(ck_fal
12430 73 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 se);......CACKEY
12440 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 _DEBUG_PRINTF("
12450 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c ... returning %l
12460 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e u (%p/%lu)", (un
12470 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 signed long) *((
12480 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c CK_BBOOL *) pVal
12490 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e ue), pValue, (un
124a0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 signed long) ulV
124b0 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 alueLen);......b
124c0 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b reak;....case CK
124d0 41 5f 4c 41 42 45 4c 3a 0a 09 09 09 09 43 41 43 A_LABEL:.....CAC
124e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
124f0 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 ("Requesting att
12500 72 69 62 75 74 65 20 43 4b 41 5f 4c 41 42 45 4c ribute CKA_LABEL
12510 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c (0x%08lx) ...",
12520 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
12530 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 curr_attr_type)
12540 3b 0a 0a 09 09 09 09 2f 2a 20 58 58 58 3a 20 44 ;....../* XXX: D
12550 65 74 65 72 6d 69 6e 65 20 6e 61 6d 65 20 2a 2f etermine name */
12560 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 .....ulValueLen
12570 3d 20 73 6e 70 72 69 6e 74 66 28 28 63 68 61 72 = snprintf((char
12580 20 2a 29 20 75 63 54 6d 70 42 75 66 2c 20 73 69 *) ucTmpBuf, si
12590 7a 65 6f 66 28 75 63 54 6d 70 42 75 66 29 2c 20 zeof(ucTmpBuf),
125a0 22 49 64 65 6e 74 69 74 79 20 23 25 6c 75 22 2c "Identity #%lu",
125b0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
125c0 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 29 3b 0a identity_num);.
125d0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 75 63 54 ....pValue = ucT
125e0 6d 70 42 75 66 3b 0a 0a 09 09 09 09 69 66 20 28 mpBuf;......if (
125f0 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d 20 73 69 ulValueLen >= si
12600 7a 65 6f 66 28 75 63 54 6d 70 42 75 66 29 29 20 zeof(ucTmpBuf))
12610 7b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 {......ulValueLe
12620 6e 20 3d 20 30 3b 0a 09 09 09 09 09 70 56 61 6c n = 0;......pVal
12630 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 7d ue = NULL;.....}
12640 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 ......CACKEY_DEB
12650 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 UG_PRINTF(" ...
12660 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c returning (%p/%l
12670 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e u)", pValue, (un
12680 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 signed long) ulV
12690 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 alueLen);......b
126a0 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b reak;....case CK
126b0 41 5f 56 41 4c 55 45 3a 0a 09 09 09 09 43 41 43 A_VALUE:.....CAC
126c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
126d0 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 ("Requesting att
126e0 72 69 62 75 74 65 20 43 4b 41 5f 56 41 4c 55 45 ribute CKA_VALUE
126f0 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c (0x%08lx) ...",
12700 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
12710 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 curr_attr_type)
12720 3b 0a 0a 09 09 09 09 73 77 69 74 63 68 20 28 6f ;......switch (o
12730 62 6a 65 63 74 63 6c 61 73 73 29 20 7b 0a 09 09 bjectclass) {...
12740 09 09 09 63 61 73 65 20 43 4b 4f 5f 50 52 49 56 ...case CKO_PRIV
12750 41 54 45 5f 4b 45 59 3a 0a 09 09 09 09 09 09 43 ATE_KEY:.......C
12760 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
12770 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 TF(" ... but not
12780 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 getting it beca
12790 75 73 65 20 77 65 20 61 72 65 20 61 20 70 72 69 use we are a pri
127a0 76 61 74 65 20 6b 65 79 2e 22 29 3b 0a 0a 09 09 vate key.");....
127b0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 ....break;......
127c0 63 61 73 65 20 43 4b 4f 5f 50 55 42 4c 49 43 5f case CKO_PUBLIC_
127d0 4b 45 59 3a 0a 09 09 09 09 09 09 2f 2a 20 58 58 KEY:......./* XX
127e0 58 3a 20 54 4f 44 4f 20 2a 2f 0a 0a 09 09 09 09 X: TODO */......
127f0 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 ..break;......ca
12800 73 65 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 se CKO_CERTIFICA
12810 54 45 3a 0a 09 09 09 09 09 09 70 56 61 6c 75 65 TE:.......pValue
12820 20 3d 20 63 65 72 74 69 66 69 63 61 74 65 3b 0a = certificate;.
12830 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e ......ulValueLen
12840 20 3d 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c = certificate_l
12850 65 6e 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b en;........break
12860 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 ;.....}......CAC
12870 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
12880 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 (" ... returning
12890 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 %p/%lu", pValue
128a0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
128b0 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a ) ulValueLen);..
128c0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 ....break;....ca
128d0 73 65 20 43 4b 41 5f 49 53 53 55 45 52 3a 0a 09 se CKA_ISSUER:..
128e0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
128f0 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 PRINTF("Requesti
12900 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 ng attribute CKA
12910 5f 49 53 53 55 45 52 20 28 30 78 25 30 38 6c 78 _ISSUER (0x%08lx
12920 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 ) ...", (unsigne
12930 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 d long) curr_att
12940 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 r_type);......if
12950 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d (objectclass !=
12960 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 CKO_CERTIFICATE
12970 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f ) {......CACKEY_
12980 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e DEBUG_PRINTF(" .
12990 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 .. but not getti
129a0 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 ng it because we
129b0 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69 are not a certi
129c0 66 69 63 61 74 65 2e 22 29 3b 0a 0a 09 09 09 09 ficate.");......
129d0 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 .break;.....}...
129e0 09 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61 ...if (certifica
129f0 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 te_len >= 0) {..
12a00 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 ....x509_read_re
12a10 74 20 3d 20 78 35 30 39 5f 74 6f 5f 69 73 73 75 t = x509_to_issu
12a20 65 72 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 er(certificate,
12a30 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c certificate_len,
12a40 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 &pValue);......
12a50 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 if (x509_read_re
12a60 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 t < 0) {.......p
12a70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 Value = NULL;...
12a80 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 ...} else {.....
12a90 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 ..ulValueLen = x
12aa0 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 509_read_ret;...
12ab0 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 ...}.....}......
12ac0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
12ad0 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e NTF(" ... return
12ae0 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 ing %p/%lu", pVa
12af0 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c lue, (unsigned l
12b00 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 ong) ulValueLen)
12b10 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 ;......break;...
12b20 09 63 61 73 65 20 43 4b 41 5f 53 45 52 49 41 4c .case CKA_SERIAL
12b30 5f 4e 55 4d 42 45 52 3a 0a 09 09 09 09 43 41 43 _NUMBER:.....CAC
12b40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
12b50 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 ("Requesting att
12b60 72 69 62 75 74 65 20 43 4b 41 5f 53 45 52 49 41 ribute CKA_SERIA
12b70 4c 5f 4e 55 4d 42 45 52 20 28 30 78 25 30 38 6c L_NUMBER (0x%08l
12b80 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e x) ...", (unsign
12b90 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 ed long) curr_at
12ba0 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 tr_type);......i
12bb0 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 f (objectclass !
12bc0 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 = CKO_CERTIFICAT
12bd0 45 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 E) {......CACKEY
12be0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 _DEBUG_PRINTF("
12bf0 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 ... but not gett
12c00 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 ing it because w
12c10 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74 e are not a cert
12c20 69 66 69 63 61 74 65 2e 22 29 3b 0a 0a 09 09 09 ificate.");.....
12c30 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a ..break;.....}..
12c40 09 09 09 09 69 66 20 28 63 65 72 74 69 66 69 63 ....if (certific
12c50 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a ate_len >= 0) {.
12c60 09 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 .....x509_read_r
12c70 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 73 65 72 et = x509_to_ser
12c80 69 61 6c 28 63 65 72 74 69 66 69 63 61 74 65 2c ial(certificate,
12c90 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e certificate_len
12ca0 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 , &pValue);.....
12cb0 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 .if (x509_read_r
12cc0 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 et < 0) {.......
12cd0 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 pValue = NULL;..
12ce0 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 ....} else {....
12cf0 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 ...ulValueLen =
12d00 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 x509_read_ret;..
12d10 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 ....}.....}.....
12d20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
12d30 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 INTF(" ... retur
12d40 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 ning (%p/%lu)",
12d50 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 pValue, (unsigne
12d60 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c d long) ulValueL
12d70 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b en);......break;
12d80 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53 55 42 ....case CKA_SUB
12d90 4a 45 43 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 JECT:.....CACKEY
12da0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
12db0 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 equesting attrib
12dc0 75 74 65 20 43 4b 41 5f 53 55 42 4a 45 43 54 20 ute CKA_SUBJECT
12dd0 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 (0x%08lx) ...",
12de0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
12df0 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b curr_attr_type);
12e00 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 ......if (object
12e10 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 class != CKO_CER
12e20 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09 TIFICATE) {.....
12e30 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
12e40 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e INTF(" ... but n
12e50 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 ot getting it be
12e60 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 cause we are not
12e70 20 61 20 63 65 72 74 69 66 69 63 61 74 65 2e 22 a certificate."
12e80 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a );.......break;.
12e90 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 ....}......if (c
12ea0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e ertificate_len >
12eb0 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 = 0) {......x509
12ec0 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 _read_ret = x509
12ed0 5f 74 6f 5f 73 75 62 6a 65 63 74 28 63 65 72 74 _to_subject(cert
12ee0 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 ificate, certifi
12ef0 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 cate_len, &pValu
12f00 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 e);......if (x50
12f10 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 9_read_ret < 0)
12f20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d {.......pValue =
12f30 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c NULL;......} el
12f40 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c se {.......ulVal
12f50 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 ueLen = x509_rea
12f60 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 d_ret;......}...
12f70 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f ..}......CACKEY_
12f80 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e DEBUG_PRINTF(" .
12f90 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f .. returning %p/
12fa0 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 %lu", pValue, (u
12fb0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c nsigned long) ul
12fc0 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 ValueLen);......
12fd0 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 break;....case C
12fe0 4b 41 5f 49 44 3a 0a 09 09 09 09 43 41 43 4b 45 KA_ID:.....CACKE
12ff0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
13000 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 Requesting attri
13010 62 75 74 65 20 43 4b 41 5f 49 44 20 28 30 78 25 bute CKA_ID (0x%
13020 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 08lx) ...", (uns
13030 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 igned long) curr
13040 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 _attr_type);....
13050 09 09 75 63 54 6d 70 42 75 66 5b 30 5d 20 3d 20 ..ucTmpBuf[0] =
13060 28 28 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 2b ((identity_num +
13070 20 31 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 1) >> 8) & 0xff
13080 3b 0a 09 09 09 09 75 63 54 6d 70 42 75 66 5b 31 ;.....ucTmpBuf[1
13090 5d 20 3d 20 20 28 69 64 65 6e 74 69 74 79 5f 6e ] = (identity_n
130a0 75 6d 20 2b 20 31 29 20 26 20 30 78 66 66 3b 0a um + 1) & 0xff;.
130b0 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 75 .....pValue = &u
130c0 63 54 6d 70 42 75 66 3b 0a 09 09 09 09 75 6c 56 cTmpBuf;.....ulV
130d0 61 6c 75 65 4c 65 6e 20 3d 20 32 3b 0a 0a 09 09 alueLen = 2;....
130e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
130f0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 RINTF(" ... retu
13100 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 rning %p/%lu", p
13110 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 Value, (unsigned
13120 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 long) ulValueLe
13130 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a n);......break;.
13140 09 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52 54 ...case CKA_CERT
13150 49 46 49 43 41 54 45 5f 54 59 50 45 3a 0a 09 09 IFICATE_TYPE:...
13160 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
13170 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e RINTF("Requestin
13180 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f g attribute CKA_
13190 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 CERTIFICATE_TYPE
131a0 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c (0x%08lx) ...",
131b0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
131c0 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 curr_attr_type)
131d0 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 ;......if (objec
131e0 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 tclass != CKO_CE
131f0 52 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09 RTIFICATE) {....
13200 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
13210 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 RINTF(" ... but
13220 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 not getting it b
13230 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f ecause we are no
13240 74 20 61 20 63 65 72 74 69 66 69 63 61 74 65 2e t a certificate.
13250 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b ");.......break;
13260 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 57 .....}....../* W
13270 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 6f e only support o
13280 6e 65 20 63 65 72 74 69 66 69 63 61 74 65 20 74 ne certificate t
13290 79 70 65 20 2a 2f 0a 09 09 09 09 63 6b 5f 63 65 ype */.....ck_ce
132a0 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 20 3d rtificate_type =
132b0 20 43 4b 43 5f 58 5f 35 30 39 3b 0a 0a 09 09 09 CKC_X_509;.....
132c0 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 63 65 .pValue = &ck_ce
132d0 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 3b 0a rtificate_type;.
132e0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d ....ulValueLen =
132f0 20 73 69 7a 65 6f 66 28 63 6b 5f 63 65 72 74 69 sizeof(ck_certi
13300 66 69 63 61 74 65 5f 74 79 70 65 29 3b 0a 0a 09 ficate_type);...
13310 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
13320 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 PRINTF(" ... ret
13330 75 72 6e 69 6e 67 20 43 4b 43 5f 58 5f 35 30 39 urning CKC_X_509
13340 20 28 25 6c 75 29 20 28 25 70 2f 25 6c 75 29 22 (%lu) (%p/%lu)"
13350 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
13360 29 20 2a 28 28 43 4b 5f 43 45 52 54 49 46 49 43 ) *((CK_CERTIFIC
13370 41 54 45 5f 54 59 50 45 20 2a 29 20 70 56 61 6c ATE_TYPE *) pVal
13380 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e ue), pValue, (un
13390 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 signed long) ulV
133a0 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 alueLen);......b
133b0 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b reak;....case CK
133c0 41 5f 4b 45 59 5f 54 59 50 45 3a 0a 09 09 09 09 A_KEY_TYPE:.....
133d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
133e0 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 NTF("Requesting
133f0 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4b 45 attribute CKA_KE
13400 59 5f 54 59 50 45 20 28 30 78 25 30 38 6c 78 29 Y_TYPE (0x%08lx)
13410 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 ...", (unsigned
13420 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 long) curr_attr
13430 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 _type);......if
13440 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 (objectclass !=
13450 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 CKO_PRIVATE_KEY
13460 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 && objectclass !
13470 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 = CKO_PUBLIC_KEY
13480 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f ) {......CACKEY_
13490 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e DEBUG_PRINTF(" .
134a0 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 .. but not getti
134b0 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 ng it because we
134c0 20 61 72 65 20 6e 6f 74 20 61 20 6b 65 79 2e 22 are not a key."
134d0 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a );.......break;.
134e0 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 57 65 ....}....../* We
134f0 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 6f 6e only support on
13500 65 20 6b 65 79 20 74 79 70 65 20 2a 2f 0a 09 09 e key type */...
13510 09 09 63 6b 5f 6b 65 79 5f 74 79 70 65 20 3d 20 ..ck_key_type =
13520 43 4b 4b 5f 52 53 41 3b 0a 0a 09 09 09 09 70 56 CKK_RSA;......pV
13530 61 6c 75 65 20 3d 20 26 63 6b 5f 6b 65 79 5f 74 alue = &ck_key_t
13540 79 70 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 ype;.....ulValue
13550 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f Len = sizeof(ck_
13560 6b 65 79 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 key_type);......
13570 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
13580 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e NTF(" ... return
13590 69 6e 67 20 43 4b 4b 5f 52 53 41 20 28 25 6c 75 ing CKK_RSA (%lu
135a0 29 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e ) (%p/%lu)", (un
135b0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 signed long) *((
135c0 43 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 CK_CERTIFICATE_T
135d0 59 50 45 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 YPE *) pValue),
135e0 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 pValue, (unsigne
135f0 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c d long) ulValueL
13600 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b en);......break;
13610 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53 49 47 ....case CKA_SIG
13620 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 N:.....CACKEY_DE
13630 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 BUG_PRINTF("Requ
13640 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 esting attribute
13650 20 43 4b 41 5f 53 49 47 4e 20 28 30 78 25 30 38 CKA_SIGN (0x%08
13660 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 lx) ...", (unsig
13670 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 ned long) curr_a
13680 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 ttr_type);......
13690 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 if (objectclass
136a0 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b == CKO_PRIVATE_K
136b0 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 EY) {......pValu
136c0 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 e = &ck_true;...
136d0 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 ...ulValueLen =
136e0 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b sizeof(ck_true);
136f0 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 .....} else {...
13700 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f ...pValue = &ck_
13710 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 false;......ulVa
13720 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 lueLen = sizeof(
13730 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d ck_false);.....}
13740 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 ......CACKEY_DEB
13750 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 UG_PRINTF(" ...
13760 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 returning %lu (%
13770 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e p/%lu)", (unsign
13780 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 ed long) *((CK_B
13790 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c BOOL *) pValue),
137a0 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e pValue, (unsign
137b0 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 ed long) ulValue
137c0 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b Len);......break
137d0 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53 49 ;....case CKA_SI
137e0 47 4e 5f 52 45 43 4f 56 45 52 3a 0a 09 09 09 09 GN_RECOVER:.....
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 52 65 71 75 65 73 74 69 6e 67 20 NTF("Requesting
13810 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 49 attribute CKA_SI
13820 47 4e 5f 52 45 43 4f 56 45 52 20 28 30 78 25 30 GN_RECOVER (0x%0
13830 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 8lx) ...", (unsi
13840 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f gned long) curr_
13850 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 attr_type);.....
13860 09 2f 2a 20 57 65 20 63 75 72 72 65 6e 74 6c 79 ./* We currently
13870 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 22 53 only support "S
13880 69 67 6e 20 77 69 74 68 20 41 70 70 65 6e 64 69 ign with Appendi
13890 78 22 20 2a 2f 0a 09 09 09 09 70 56 61 6c 75 65 x" */.....pValue
138a0 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 = &ck_false;...
138b0 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 ..ulValueLen = s
138c0 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b izeof(ck_false);
138d0 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 ......CACKEY_DEB
138e0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 UG_PRINTF(" ...
138f0 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 returning %lu (%
13900 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e p/%lu)", (unsign
13910 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 ed long) *((CK_B
13920 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c BOOL *) pValue),
13930 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e pValue, (unsign
13940 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 ed long) ulValue
13950 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b Len);......break
13960 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 44 45 ;....case CKA_DE
13970 43 52 59 50 54 3a 0a 09 09 09 09 43 41 43 4b 45 CRYPT:.....CACKE
13980 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
13990 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 Requesting attri
139a0 62 75 74 65 20 43 4b 41 5f 44 45 43 52 59 50 54 bute CKA_DECRYPT
139b0 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c (0x%08lx) ...",
139c0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
139d0 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 curr_attr_type)
139e0 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 ;......if (objec
139f0 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 tclass == CKO_PR
13a00 49 56 41 54 45 5f 4b 45 59 20 7c 7c 20 6f 62 6a IVATE_KEY || obj
13a10 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f ectclass == CKO_
13a20 50 55 42 4c 49 43 5f 4b 45 59 29 20 7b 0a 09 09 PUBLIC_KEY) {...
13a30 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f ...pValue = &ck_
13a40 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c true;......ulVal
13a50 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 ueLen = sizeof(c
13a60 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 k_true);.....} e
13a70 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 lse {......pValu
13a80 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 e = &ck_false;..
13a90 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d ....ulValueLen =
13aa0 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 sizeof(ck_false
13ab0 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 );.....}......CA
13ac0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
13ad0 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e F(" ... returnin
13ae0 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c g %lu (%p/%lu)",
13af0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
13b00 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 *((CK_BBOOL *)
13b10 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c pValue), pValue,
13b20 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
13b30 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 ulValueLen);...
13b40 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 ...break;....cas
13b50 65 20 43 4b 41 5f 53 45 4e 53 49 54 49 56 45 3a e CKA_SENSITIVE:
13b60 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
13b70 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 G_PRINTF("Reques
13b80 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 ting attribute C
13b90 4b 41 5f 53 45 4e 53 49 54 49 56 45 20 28 30 78 KA_SENSITIVE (0x
13ba0 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e %08lx) ...", (un
13bb0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 signed long) cur
13bc0 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 r_attr_type);...
13bd0 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 ...if (objectcla
13be0 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 ss == CKO_PRIVAT
13bf0 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56 E_KEY) {......pV
13c00 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b alue = &ck_true;
13c10 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e ......ulValueLen
13c20 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 = sizeof(ck_tru
13c30 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b e);.....} else {
13c40 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 ......pValue = &
13c50 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 ck_false;......u
13c60 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 lValueLen = size
13c70 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 of(ck_false);...
13c80 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f ..}......CACKEY_
13c90 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e DEBUG_PRINTF(" .
13ca0 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 .. returning %lu
13cb0 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 (%p/%lu)", (uns
13cc0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 igned long) *((C
13cd0 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 K_BBOOL *) pValu
13ce0 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 e), pValue, (uns
13cf0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 igned long) ulVa
13d00 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 lueLen);......br
13d10 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 eak;....case CKA
13d20 5f 45 58 54 52 41 43 54 41 42 4c 45 3a 0a 09 09 _EXTRACTABLE:...
13d30 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
13d40 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e RINTF("Requestin
13d50 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f g attribute CKA_
13d60 45 58 54 52 41 43 54 41 42 4c 45 20 28 30 78 25 EXTRACTABLE (0x%
13d70 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 08lx) ...", (uns
13d80 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 igned long) curr
13d90 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 _attr_type);....
13da0 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 ..if (objectclas
13db0 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 s == CKO_PRIVATE
13dc0 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61 _KEY) {......pVa
13dd0 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b lue = &ck_false;
13de0 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e ......ulValueLen
13df0 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 = sizeof(ck_tru
13e00 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b e);.....} else {
13e10 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 ......pValue = &
13e20 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c ck_true;......ul
13e30 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f ValueLen = sizeo
13e40 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 f(ck_false);....
13e50 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 .}......CACKEY_D
13e60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e EBUG_PRINTF(" ..
13e70 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 . returning %lu
13e80 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 (%p/%lu)", (unsi
13e90 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b gned long) *((CK
13ea0 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 _BBOOL *) pValue
13eb0 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 ), pValue, (unsi
13ec0 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c gned long) ulVal
13ed0 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 ueLen);......bre
13ee0 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f ak;....case CKA_
13ef0 4d 4f 44 55 4c 55 53 3a 0a 09 09 09 09 43 41 43 MODULUS:.....CAC
13f00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
13f10 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 ("Requesting att
13f20 72 69 62 75 74 65 20 43 4b 41 5f 4d 4f 44 55 4c ribute CKA_MODUL
13f30 55 53 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e US (0x%08lx) ...
13f40 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e ", (unsigned lon
13f50 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 g) curr_attr_typ
13f60 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 63 65 72 e);......if (cer
13f70 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 tificate_len >=
13f80 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 0) {......x509_r
13f90 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 ead_ret = x509_t
13fa0 6f 5f 6d 6f 64 75 6c 75 73 28 63 65 72 74 69 66 o_modulus(certif
13fb0 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 icate, certifica
13fc0 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 te_len, &pValue)
13fd0 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 39 5f ;......if (x509_
13fe0 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a read_ret < 0) {.
13ff0 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e ......pValue = N
14000 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 ULL;......} else
14010 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 {.......ulValue
14020 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f Len = x509_read_
14030 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 ret;......}.....
14040 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 }......CACKEY_DE
14050 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e BUG_PRINTF(" ...
14060 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25 returning (%p/%
14070 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 lu)", pValue, (u
14080 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c nsigned long) ul
14090 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 ValueLen);......
140a0 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 break;....case C
140b0 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45 KA_PUBLIC_EXPONE
140c0 4e 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 NT:.....CACKEY_D
140d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 EBUG_PRINTF("Req
140e0 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 uesting attribut
140f0 65 20 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 e CKA_PUBLIC_EXP
14100 4f 4e 45 4e 54 20 28 30 78 25 30 38 6c 78 29 20 ONENT (0x%08lx)
14110 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 ...", (unsigned
14120 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f long) curr_attr_
14130 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 type);......if (
14140 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 certificate_len
14150 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 >= 0) {......x50
14160 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 9_read_ret = x50
14170 39 5f 74 6f 5f 65 78 70 6f 6e 65 6e 74 28 63 65 9_to_exponent(ce
14180 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 rtificate, certi
14190 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 ficate_len, &pVa
141a0 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 lue);......if (x
141b0 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 509_read_ret < 0
141c0 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 ) {.......pValue
141d0 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 = NULL;......}
141e0 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 else {.......ulV
141f0 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 alueLen = x509_r
14200 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a ead_ret;......}.
14210 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 ....}......CACKE
14220 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
14230 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 ... returning (
14240 25 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 %p/%lu)", pValue
14250 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
14260 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a ) ulValueLen);..
14270 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 ....break;....ca
14280 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 53 45 52 se CKA_TRUST_SER
14290 56 45 52 5f 41 55 54 48 3a 0a 09 09 09 09 43 41 VER_AUTH:.....CA
142a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
142b0 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 F("Requesting at
142c0 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52 55 53 tribute CKA_TRUS
142d0 54 5f 53 45 52 56 45 52 5f 41 55 54 48 20 28 30 T_SERVER_AUTH (0
142e0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 x%08lx) ...", (u
142f0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 nsigned long) cu
14300 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a rr_attr_type);..
14310 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b ....pValue = &ck
14320 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c _true;.....ulVal
14330 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 ueLen = sizeof(c
14340 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 k_true);......CA
14350 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
14360 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e F(" ... returnin
14370 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c g %lu (%p/%lu)",
14380 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
14390 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 *((CK_BBOOL *)
143a0 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c pValue), pValue,
143b0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
143c0 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 ulValueLen);...
143d0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 ...break;....cas
143e0 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 4c 49 45 e CKA_TRUST_CLIE
143f0 4e 54 5f 41 55 54 48 3a 0a 09 09 09 09 43 41 43 NT_AUTH:.....CAC
14400 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
14410 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 ("Requesting att
14420 72 69 62 75 74 65 20 43 4b 41 5f 54 52 55 53 54 ribute CKA_TRUST
14430 5f 43 4c 49 45 4e 54 5f 41 55 54 48 20 28 30 78 _CLIENT_AUTH (0x
14440 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e %08lx) ...", (un
14450 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 signed long) cur
14460 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 r_attr_type);...
14470 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f ...pValue = &ck_
14480 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 true;.....ulValu
14490 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b eLen = sizeof(ck
144a0 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43 _true);......CAC
144b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
144c0 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 (" ... returning
144d0 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 %lu (%p/%lu)",
144e0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
144f0 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 *((CK_BBOOL *) p
14500 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 Value), pValue,
14510 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
14520 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 ulValueLen);....
14530 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 ..break;....case
14540 20 43 4b 41 5f 54 52 55 53 54 5f 43 4f 44 45 5f CKA_TRUST_CODE_
14550 53 49 47 4e 49 4e 47 3a 0a 09 09 09 09 43 41 43 SIGNING:.....CAC
14560 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
14570 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 ("Requesting att
14580 72 69 62 75 74 65 20 43 4b 41 5f 54 52 55 53 54 ribute CKA_TRUST
14590 5f 43 4f 44 45 5f 53 49 47 4e 49 4e 47 20 28 30 _CODE_SIGNING (0
145a0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 x%08lx) ...", (u
145b0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 nsigned long) cu
145c0 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a rr_attr_type);..
145d0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b ....pValue = &ck
145e0 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c _true;.....ulVal
145f0 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 ueLen = sizeof(c
14600 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 k_true);......CA
14610 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
14620 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e F(" ... returnin
14630 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c g %lu (%p/%lu)",
14640 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
14650 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 *((CK_BBOOL *)
14660 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c pValue), pValue,
14670 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
14680 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 ulValueLen);...
14690 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 ...break;....cas
146a0 65 20 43 4b 41 5f 54 52 55 53 54 5f 45 4d 41 49 e CKA_TRUST_EMAI
146b0 4c 5f 50 52 4f 54 45 43 54 49 4f 4e 3a 0a 09 09 L_PROTECTION:...
146c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
146d0 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e RINTF("Requestin
146e0 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f g attribute CKA_
146f0 54 52 55 53 54 5f 45 4d 41 49 4c 5f 50 52 4f 54 TRUST_EMAIL_PROT
14700 45 43 54 49 4f 4e 20 28 30 78 25 30 38 6c 78 29 ECTION (0x%08lx)
14710 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 ...", (unsigned
14720 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 long) curr_attr
14730 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 _type);......pVa
14740 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a lue = &ck_true;.
14750 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d ....ulValueLen =
14760 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 sizeof(ck_true)
14770 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 ;......CACKEY_DE
14780 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e BUG_PRINTF(" ...
14790 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 returning %lu (
147a0 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 %p/%lu)", (unsig
147b0 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f ned long) *((CK_
147c0 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 BBOOL *) pValue)
147d0 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 , pValue, (unsig
147e0 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 ned long) ulValu
147f0 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 eLen);......brea
14800 6b 3b 0a 09 09 09 64 65 66 61 75 6c 74 3a 0a 09 k;....default:..
14810 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c ...pValue = NULL
14820 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e ;.....ulValueLen
14830 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b = (CK_LONG) -1;
14840 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a .....break;...}.
14850 0a 09 09 69 66 20 28 28 28 43 4b 5f 4c 4f 4e 47 ...if (((CK_LONG
14860 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 20 21 3d ) ulValueLen) !=
14870 20 28 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 29 29 ((CK_LONG) -1))
14880 20 7b 0a 09 09 09 2f 2a 20 50 75 73 68 20 63 75 {..../* Push cu
14890 72 72 5f 61 74 74 72 20 6f 6e 74 6f 20 74 68 65 rr_attr onto the
148a0 20 73 74 61 63 6b 20 2a 2f 0a 09 09 09 63 75 72 stack */....cur
148b0 72 5f 61 74 74 72 2e 74 79 70 65 20 3d 20 63 75 r_attr.type = cu
148c0 72 72 5f 61 74 74 72 5f 74 79 70 65 3b 0a 09 09 rr_attr_type;...
148d0 09 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c .curr_attr.ulVal
148e0 75 65 4c 65 6e 20 3d 20 75 6c 56 61 6c 75 65 4c ueLen = ulValueL
148f0 65 6e 3b 0a 0a 09 09 09 63 75 72 72 5f 61 74 74 en;.....curr_att
14900 72 2e 70 56 61 6c 75 65 20 3d 20 6d 61 6c 6c 6f r.pValue = mallo
14910 63 28 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 c(curr_attr.ulVa
14920 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 6d 65 6d 63 lueLen);....memc
14930 70 79 28 63 75 72 72 5f 61 74 74 72 2e 70 56 61 py(curr_attr.pVa
14940 6c 75 65 2c 20 70 56 61 6c 75 65 2c 20 63 75 72 lue, pValue, cur
14950 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65 r_attr.ulValueLe
14960 6e 29 3b 0a 0a 09 09 09 69 66 20 28 70 56 61 6c n);.....if (pVal
14970 75 65 5f 66 72 65 65 20 26 26 20 70 56 61 6c 75 ue_free && pValu
14980 65 29 20 7b 0a 09 09 09 09 66 72 65 65 28 70 56 e) {.....free(pV
14990 61 6c 75 65 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 alue);....}.....
149a0 69 66 20 28 6e 75 6d 61 74 74 72 73 20 3e 3d 20 if (numattrs >=
149b0 72 65 74 76 61 6c 5f 63 6f 75 6e 74 29 20 7b 0a retval_count) {.
149c0 09 09 09 09 72 65 74 76 61 6c 5f 63 6f 75 6e 74 ....retval_count
149d0 20 2a 3d 20 32 3b 0a 09 09 09 09 72 65 74 76 61 *= 2;.....retva
149e0 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 72 65 74 76 l = realloc(retv
149f0 61 6c 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74 al, retval_count
14a00 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74 76 61 * sizeof(*retva
14a10 6c 29 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d 65 l));....}.....me
14a20 6d 63 70 79 28 26 72 65 74 76 61 6c 5b 6e 75 6d mcpy(&retval[num
14a30 61 74 74 72 73 5d 2c 20 26 63 75 72 72 5f 61 74 attrs], &curr_at
14a40 74 72 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f tr, sizeof(curr_
14a50 61 74 74 72 29 29 3b 0a 09 09 09 6e 75 6d 61 74 attr));....numat
14a60 74 72 73 2b 2b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 trs++;...}..}...
14a70 69 66 20 28 6e 75 6d 61 74 74 72 73 20 21 3d 20 if (numattrs !=
14a80 30 29 20 7b 0a 09 09 72 65 74 76 61 6c 5f 63 6f 0) {...retval_co
14a90 75 6e 74 20 3d 20 6e 75 6d 61 74 74 72 73 3b 0a unt = numattrs;.
14aa0 09 09 72 65 74 76 61 6c 20 3d 20 72 65 61 6c 6c ..retval = reall
14ab0 6f 63 28 72 65 74 76 61 6c 2c 20 72 65 74 76 61 oc(retval, retva
14ac0 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 l_count * sizeof
14ad0 28 2a 72 65 74 76 61 6c 29 29 3b 0a 09 7d 20 65 (*retval));..} e
14ae0 6c 73 65 20 7b 0a 09 09 66 72 65 65 28 72 65 74 lse {...free(ret
14af0 76 61 6c 29 3b 0a 0a 09 09 72 65 74 76 61 6c 20 val);....retval
14b00 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 2a 70 75 = NULL;..}...*pu
14b10 6c 43 6f 75 6e 74 20 3d 20 6e 75 6d 61 74 74 72 lCount = numattr
14b20 73 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 s;...CACKEY_DEBU
14b30 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
14b40 69 6e 67 20 25 6c 75 20 6f 62 6a 65 63 74 73 20 ing %lu objects
14b50 28 25 70 29 2e 22 2c 20 6e 75 6d 61 74 74 72 73 (%p).", numattrs
14b60 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 , retval);...ret
14b70 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a urn(retval);.}..
14b80 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b static void cack
14b90 65 79 5f 66 72 65 65 5f 69 64 65 6e 74 69 74 69 ey_free_identiti
14ba0 65 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 es(struct cackey
14bb0 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 _identity *ident
14bc0 69 74 69 65 73 2c 20 75 6e 73 69 67 6e 65 64 20 ities, unsigned
14bd0 6c 6f 6e 67 20 69 64 65 6e 74 69 74 69 65 73 5f long identities_
14be0 63 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 41 54 54 count) {..CK_ATT
14bf0 52 49 42 55 54 45 20 2a 63 75 72 72 5f 61 74 74 RIBUTE *curr_att
14c00 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e r;..unsigned lon
14c10 67 20 69 64 5f 69 64 78 2c 20 61 74 74 72 5f 69 g id_idx, attr_i
14c20 64 78 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 dx;...if (identi
14c30 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 ties == NULL ||
14c40 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 identities_count
14c50 20 3d 3d 20 30 29 20 7b 0a 09 09 72 65 74 75 72 == 0) {...retur
14c60 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 5f n;..}...for (id_
14c70 69 64 78 20 3d 20 30 3b 20 69 64 5f 69 64 78 20 idx = 0; id_idx
14c80 3c 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 < identities_cou
14c90 6e 74 3b 20 69 64 5f 69 64 78 2b 2b 29 20 7b 0a nt; id_idx++) {.
14ca0 09 09 69 66 20 28 69 64 65 6e 74 69 74 69 65 73 ..if (identities
14cb0 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 [id_idx].attribu
14cc0 74 65 73 29 20 7b 0a 09 09 09 66 6f 72 20 28 61 tes) {....for (a
14cd0 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 61 74 74 ttr_idx = 0; att
14ce0 72 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74 69 r_idx < identiti
14cf0 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 es[id_idx].attri
14d00 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 61 74 74 butes_count; att
14d10 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 63 r_idx++) {.....c
14d20 75 72 72 5f 61 74 74 72 20 3d 20 26 69 64 65 6e urr_attr = &iden
14d30 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 tities[id_idx].a
14d40 74 74 72 69 62 75 74 65 73 5b 61 74 74 72 5f 69 ttributes[attr_i
14d50 64 78 5d 3b 0a 0a 09 09 09 09 69 66 20 28 63 75 dx];......if (cu
14d60 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 29 rr_attr->pValue)
14d70 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75 72 {......free(cur
14d80 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 29 3b r_attr->pValue);
14d90 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 .....}....}.....
14da0 69 66 20 28 69 64 65 6e 74 69 74 69 65 73 5b 69 if (identities[i
14db0 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 d_idx].attribute
14dc0 73 29 20 7b 0a 09 09 09 09 66 72 65 65 28 69 64 s) {.....free(id
14dd0 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d entities[id_idx]
14de0 2e 61 74 74 72 69 62 75 74 65 73 29 3b 0a 09 09 .attributes);...
14df0 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 .}.....cackey_fr
14e00 65 65 5f 63 65 72 74 73 28 69 64 65 6e 74 69 74 ee_certs(identit
14e10 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 ies[id_idx].pcsc
14e20 5f 69 64 65 6e 74 69 74 79 2c 20 31 2c 20 31 29 _identity, 1, 1)
14e30 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 66 72 65 65 28 ;...}..}...free(
14e40 69 64 65 6e 74 69 74 69 65 73 29 3b 0a 7d 0a 0a identities);.}..
14e50 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61 static struct ca
14e60 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 63 ckey_identity *c
14e70 61 63 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e 74 ackey_read_ident
14e80 69 74 69 65 73 28 73 74 72 75 63 74 20 63 61 63 ities(struct cac
14e90 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 key_slot *slot,
14ea0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 69 unsigned long *i
14eb0 64 73 5f 66 6f 75 6e 64 29 20 7b 0a 09 73 74 72 ds_found) {..str
14ec0 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f uct cackey_pcsc_
14ed0 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 identity *pcsc_i
14ee0 64 65 6e 74 69 74 69 65 73 3b 0a 09 73 74 72 75 dentities;..stru
14ef0 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 ct cackey_identi
14f00 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73 3b 0a ty *identities;.
14f10 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e .unsigned long n
14f20 75 6d 5f 69 64 73 2c 20 69 64 5f 69 64 78 2c 20 um_ids, id_idx,
14f30 63 75 72 72 5f 69 64 5f 74 79 70 65 3b 0a 09 75 curr_id_type;..u
14f40 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d nsigned long num
14f50 5f 63 65 72 74 73 2c 20 63 65 72 74 5f 69 64 78 _certs, cert_idx
14f60 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ;...CACKEY_DEBUG
14f70 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
14f80 22 29 3b 0a 0a 09 69 66 20 28 69 64 73 5f 66 6f ");...if (ids_fo
14f90 75 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 und == NULL) {..
14fa0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
14fb0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64 INTF("Error. id
14fc0 73 5f 66 6f 75 6e 64 20 69 73 20 4e 55 4c 4c 22 s_found is NULL"
14fd0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c );....return(NUL
14fe0 4c 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 69 64 L);..}...pcsc_id
14ff0 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65 entities = cacke
15000 79 5f 72 65 61 64 5f 63 65 72 74 73 28 73 6c 6f y_read_certs(slo
15010 74 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 t, NULL, &num_ce
15020 72 74 73 29 3b 0a 09 69 66 20 28 70 63 73 63 5f rts);..if (pcsc_
15030 69 64 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 identities != NU
15040 4c 4c 29 20 7b 0a 09 09 2f 2a 20 43 6f 6e 76 65 LL) {.../* Conve
15050 72 74 20 6e 75 6d 62 65 72 20 6f 66 20 43 65 72 rt number of Cer
15060 74 73 20 74 6f 20 6e 75 6d 62 65 72 20 6f 66 20 ts to number of
15070 6f 62 6a 65 63 74 73 20 2a 2f 0a 09 09 6e 75 6d objects */...num
15080 5f 69 64 73 20 3d 20 28 43 4b 4f 5f 50 52 49 56 _ids = (CKO_PRIV
15090 41 54 45 5f 4b 45 59 20 2d 20 43 4b 4f 5f 43 45 ATE_KEY - CKO_CE
150a0 52 54 49 46 49 43 41 54 45 20 2b 20 31 29 20 2a RTIFICATE + 1) *
150b0 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 0a 09 09 69 num_certs;....i
150c0 64 65 6e 74 69 74 69 65 73 20 3d 20 6d 61 6c 6c dentities = mall
150d0 6f 63 28 6e 75 6d 5f 69 64 73 20 2a 20 73 69 7a oc(num_ids * siz
150e0 65 6f 66 28 2a 69 64 65 6e 74 69 74 69 65 73 29 eof(*identities)
150f0 29 3b 0a 0a 09 09 69 64 5f 69 64 78 20 3d 20 30 );....id_idx = 0
15100 3b 0a 09 09 66 6f 72 20 28 63 65 72 74 5f 69 64 ;...for (cert_id
15110 78 20 3d 20 30 3b 20 63 65 72 74 5f 69 64 78 20 x = 0; cert_idx
15120 3c 20 6e 75 6d 5f 63 65 72 74 73 3b 20 63 65 72 < num_certs; cer
15130 74 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 66 6f t_idx++) {....fo
15140 72 20 28 63 75 72 72 5f 69 64 5f 74 79 70 65 20 r (curr_id_type
15150 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 = CKO_CERTIFICAT
15160 45 3b 20 63 75 72 72 5f 69 64 5f 74 79 70 65 20 E; curr_id_type
15170 3c 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b <= CKO_PRIVATE_K
15180 45 59 3b 20 63 75 72 72 5f 69 64 5f 74 79 70 65 EY; curr_id_type
15190 2b 2b 29 20 7b 0a 09 09 09 09 69 64 65 6e 74 69 ++) {.....identi
151a0 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 ties[id_idx].att
151b0 72 69 62 75 74 65 73 20 3d 20 63 61 63 6b 65 79 ributes = cackey
151c0 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65 73 28 _get_attributes(
151d0 63 75 72 72 5f 69 64 5f 74 79 70 65 2c 20 26 70 curr_id_type, &p
151e0 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 csc_identities[c
151f0 65 72 74 5f 69 64 78 5d 2c 20 63 65 72 74 5f 69 ert_idx], cert_i
15200 64 78 2c 20 26 69 64 65 6e 74 69 74 69 65 73 5b dx, &identities[
15210 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 id_idx].attribut
15220 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 09 es_count);......
15230 69 66 20 28 69 64 65 6e 74 69 74 69 65 73 5b 69 if (identities[i
15240 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 d_idx].attribute
15250 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 s == NULL) {....
15260 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f ..identities[id_
15270 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f idx].attributes_
15280 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 09 09 7d count = 0;.....}
15290 0a 0a 09 09 09 09 69 64 65 6e 74 69 74 69 65 73 ......identities
152a0 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 [id_idx].pcsc_id
152b0 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 entity = malloc(
152c0 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69 sizeof(*identiti
152d0 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f es[id_idx].pcsc_
152e0 69 64 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 identity));.....
152f0 6d 65 6d 63 70 79 28 69 64 65 6e 74 69 74 69 65 memcpy(identitie
15300 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 s[id_idx].pcsc_i
15310 64 65 6e 74 69 74 79 2c 20 26 70 63 73 63 5f 69 dentity, &pcsc_i
15320 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 dentities[cert_i
15330 64 78 5d 2c 20 73 69 7a 65 6f 66 28 2a 69 64 65 dx], sizeof(*ide
15340 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e ntities[id_idx].
15350 70 63 73 63 5f 69 64 65 6e 74 69 74 79 29 29 3b pcsc_identity));
15360 0a 0a 09 09 09 09 69 64 65 6e 74 69 74 69 65 73 ......identities
15370 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 [id_idx].pcsc_id
15380 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 entity->certific
15390 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 70 63 73 ate = malloc(pcs
153a0 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 c_identities[cer
153b0 74 5f 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 t_idx].certifica
153c0 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 6d 65 6d te_len);.....mem
153d0 63 70 79 28 69 64 65 6e 74 69 74 69 65 73 5b 69 cpy(identities[i
153e0 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e d_idx].pcsc_iden
153f0 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 tity->certificat
15400 65 2c 20 70 63 73 63 5f 69 64 65 6e 74 69 74 69 e, pcsc_identiti
15410 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65 72 es[cert_idx].cer
15420 74 69 66 69 63 61 74 65 2c 20 70 63 73 63 5f 69 tificate, pcsc_i
15430 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 dentities[cert_i
15440 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f dx].certificate_
15450 6c 65 6e 29 3b 0a 0a 09 09 09 09 69 64 5f 69 64 len);......id_id
15460 78 2b 2b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 x++;....}...}...
15470 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 .cackey_free_cer
15480 74 73 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 ts(pcsc_identiti
15490 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20 31 es, num_certs, 1
154a0 29 3b 0a 0a 09 09 2a 69 64 73 5f 66 6f 75 6e 64 );....*ids_found
154b0 20 3d 20 6e 75 6d 5f 69 64 73 3b 0a 09 09 72 65 = num_ids;...re
154c0 74 75 72 6e 28 69 64 65 6e 74 69 74 69 65 73 29 turn(identities)
154d0 3b 0a 09 7d 0a 0a 09 2a 69 64 73 5f 66 6f 75 6e ;..}...*ids_foun
154e0 64 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e 28 4e d = 0;..return(N
154f0 55 4c 4c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 ULL);.}..CK_DEFI
15500 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 NE_FUNCTION(CK_R
15510 56 2c 20 43 5f 49 6e 69 74 69 61 6c 69 7a 65 29 V, C_Initialize)
15520 28 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 49 6e (CK_VOID_PTR pIn
15530 69 74 41 72 67 73 29 20 7b 0a 09 43 4b 5f 43 5f itArgs) {..CK_C_
15540 49 4e 49 54 49 41 4c 49 5a 45 5f 41 52 47 53 20 INITIALIZE_ARGS
15550 43 4b 5f 50 54 52 20 61 72 67 73 3b 0a 09 75 69 CK_PTR args;..ui
15560 6e 74 33 32 5f 74 20 69 64 78 3b 0a 09 69 6e 74 nt32_t idx;..int
15570 20 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 3b mutex_init_ret;
15580 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
15590 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
155a0 29 3b 0a 0a 09 69 66 20 28 70 49 6e 69 74 41 72 );...if (pInitAr
155b0 67 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 gs != NULL) {...
155c0 61 72 67 73 20 3d 20 70 49 6e 69 74 41 72 67 73 args = pInitArgs
155d0 3b 0a 09 09 6d 65 6d 63 70 79 28 26 63 61 63 6b ;...memcpy(&cack
155e0 65 79 5f 61 72 67 73 2c 20 61 72 67 73 2c 20 73 ey_args, args, s
155f0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 61 72 67 izeof(cackey_arg
15600 73 29 29 3b 0a 0a 09 09 69 66 20 28 61 72 67 73 s));....if (args
15610 2d 3e 43 72 65 61 74 65 4d 75 74 65 78 20 3d 3d ->CreateMutex ==
15620 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 44 NULL || args->D
15630 65 73 74 72 6f 79 4d 75 74 65 78 20 3d 3d 20 4e estroyMutex == N
15640 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 4c 6f 63 ULL || args->Loc
15650 6b 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c kMutex == NULL |
15660 7c 20 61 72 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 | args->UnlockMu
15670 74 65 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 tex == NULL) {..
15680 09 09 69 66 20 28 61 72 67 73 2d 3e 43 72 65 61 ..if (args->Crea
15690 74 65 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20 teMutex != NULL
156a0 7c 7c 20 61 72 67 73 2d 3e 44 65 73 74 72 6f 79 || args->Destroy
156b0 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c Mutex != NULL ||
156c0 20 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74 65 78 args->LockMutex
156d0 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 != NULL || args
156e0 2d 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 21 3d ->UnlockMutex !=
156f0 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 43 41 43 NULL) {.....CAC
15700 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
15710 28 22 45 72 72 6f 72 2e 20 53 6f 6d 65 2c 20 62 ("Error. Some, b
15720 75 74 20 6e 6f 74 20 41 6c 6c 20 74 68 72 65 61 ut not All threa
15730 64 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20 ding primitives
15740 70 72 6f 76 69 64 65 64 2e 22 29 3b 0a 0a 09 09 provided.");....
15750 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 ..return(CKR_ARG
15760 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09 09 UMENTS_BAD);....
15770 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 61 72 67 }...}....if (arg
15780 73 2d 3e 70 52 65 73 65 72 76 65 64 20 21 3d 20 s->pReserved !=
15790 4e 55 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45 NULL) {....CACKE
157a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
157b0 45 72 72 6f 72 2e 20 70 52 65 73 65 72 76 65 64 Error. pReserved
157c0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b is not NULL.");
157d0 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f .....return(CKR_
157e0 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a ARGUMENTS_BAD);.
157f0 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 ..}..} else {...
15800 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 cackey_args.Crea
15810 74 65 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a teMutex = NULL;.
15820 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 44 65 ..cackey_args.De
15830 73 74 72 6f 79 4d 75 74 65 78 20 3d 20 4e 55 4c stroyMutex = NUL
15840 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 L;...cackey_args
15850 2e 4c 6f 63 6b 4d 75 74 65 78 20 3d 20 4e 55 4c .LockMutex = NUL
15860 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 L;...cackey_args
15870 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d 20 4e .UnlockMutex = N
15880 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 ULL;...cackey_ar
15890 67 73 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 09 7d gs.flags = 0;..}
158a0 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 69 6e ...if (cackey_in
158b0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 itialized) {...C
158c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
158d0 54 46 28 22 45 72 72 6f 72 2e 20 20 41 6c 72 65 TF("Error. Alre
158e0 61 64 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e ady initialized.
158f0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
15900 52 5f 43 52 59 50 54 4f 4b 49 5f 41 4c 52 45 41 R_CRYPTOKI_ALREA
15910 44 59 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b DY_INITIALIZED);
15920 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d ..}...for (idx =
15930 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 0; idx < (sizeo
15940 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e f(cackey_session
15950 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b s) / sizeof(cack
15960 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 ey_sessions[0]))
15970 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 63 61 63 ; idx++) {...cac
15980 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 key_sessions[idx
15990 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d ].active = 0;..}
159a0 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b ...for (idx = 0;
159b0 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 idx < (sizeof(c
159c0 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 ackey_slots) / s
159d0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f izeof(cackey_slo
159e0 74 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 ts[0])); idx++)
159f0 7b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 {...cackey_slots
15a00 5b 69 64 78 5d 2e 61 63 74 69 76 65 20 3d 20 30 [idx].active = 0
15a10 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 ;...cackey_slots
15a20 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 61 64 65 [idx].pcsc_reade
15a30 72 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b r = NULL;...cack
15a40 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 ey_slots[idx].tr
15a50 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 ansaction_depth
15a60 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c = 0;...cackey_sl
15a70 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63 ots[idx].transac
15a80 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 tion_need_hw_loc
15a90 6b 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f k = 0;...cackey_
15aa0 73 6c 6f 74 73 5b 69 64 78 5d 2e 73 6c 6f 74 5f slots[idx].slot_
15ab0 72 65 73 65 74 20 3d 20 30 3b 0a 09 09 63 61 63 reset = 0;...cac
15ac0 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 key_slots[idx].t
15ad0 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a oken_flags = 0;.
15ae0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 ..cackey_slots[i
15af0 64 78 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c dx].label = NULL
15b00 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 69 6e ;..}...cackey_in
15b10 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a itialized = 1;..
15b20 09 69 66 20 28 21 63 61 63 6b 65 79 5f 62 69 67 .if (!cackey_big
15b30 6c 6f 63 6b 5f 69 6e 69 74 29 20 7b 0a 09 09 6d lock_init) {...m
15b40 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 20 3d 20 utex_init_ret =
15b50 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 63 72 65 cackey_mutex_cre
15b60 61 74 65 28 26 63 61 63 6b 65 79 5f 62 69 67 6c ate(&cackey_bigl
15b70 6f 63 6b 29 3b 0a 0a 09 09 69 66 20 28 6d 75 74 ock);....if (mut
15b80 65 78 5f 69 6e 69 74 5f 72 65 74 20 21 3d 20 30 ex_init_ret != 0
15b90 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 ) {....CACKEY_DE
15ba0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
15bb0 72 2e 20 20 4d 75 74 65 78 20 69 6e 69 74 69 61 r. Mutex initia
15bc0 6c 69 7a 61 74 69 6f 6e 20 66 61 69 6c 65 64 2e lization failed.
15bd0 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 ");.....return(C
15be0 4b 52 5f 43 41 4e 54 5f 4c 4f 43 4b 29 3b 0a 09 KR_CANT_LOCK);..
15bf0 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 62 69 67 .}....cackey_big
15c00 6c 6f 63 6b 5f 69 6e 69 74 20 3d 20 31 3b 0a 09 lock_init = 1;..
15c10 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 }...CACKEY_DEBUG
15c20 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
15c30 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c ng CKR_OK (%i)",
15c40 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 CKR_OK);...retu
15c50 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 rn(CKR_OK);.}..C
15c60 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f K_DEFINE_FUNCTIO
15c70 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 61 6c N(CK_RV, C_Final
15c80 69 7a 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54 52 ize)(CK_VOID_PTR
15c90 20 70 52 65 73 65 72 76 65 64 29 20 7b 0a 09 75 pReserved) {..u
15ca0 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 0a 09 43 int32_t idx;...C
15cb0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
15cc0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
15cd0 09 69 66 20 28 70 52 65 73 65 72 76 65 64 20 21 .if (pReserved !
15ce0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b = NULL) {...CACK
15cf0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
15d00 22 45 72 72 6f 72 2e 20 70 52 65 73 65 72 76 65 "Error. pReserve
15d10 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 d is not NULL.")
15d20 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
15d30 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a ARGUMENTS_BAD);.
15d40 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 .}...if (!cackey
15d50 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
15d60 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
15d70 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e RINTF("Error. N
15d80 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 ot initialized."
15d90 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
15da0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e _CRYPTOKI_NOT_IN
15db0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
15dc0 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 .for (idx = 0; i
15dd0 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 dx < (sizeof(cac
15de0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 key_sessions) /
15df0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 sizeof(cackey_se
15e00 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 ssions[0])); idx
15e10 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b ++) {...if (cack
15e20 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d ey_sessions[idx]
15e30 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 43 5f .active) {....C_
15e40 43 6c 6f 73 65 53 65 73 73 69 6f 6e 28 69 64 78 CloseSession(idx
15e50 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b );...}..}...cack
15e60 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e ey_slots_disconn
15e70 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 66 6f 72 ect_all();...for
15e80 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c (idx = 0; idx <
15e90 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f (sizeof(cackey_
15ea0 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 slots) / sizeof(
15eb0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 cackey_slots[0])
15ec0 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 ); idx++) {...if
15ed0 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 (cackey_slots[i
15ee0 64 78 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29 dx].pcsc_reader)
15ef0 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 {....free(cacke
15f00 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 y_slots[idx].pcs
15f10 63 5f 72 65 61 64 65 72 29 3b 0a 09 09 7d 0a 09 c_reader);...}..
15f20 7d 0a 0a 09 63 61 63 6b 65 79 5f 70 63 73 63 5f }...cackey_pcsc_
15f30 64 69 73 63 6f 6e 6e 65 63 74 28 29 3b 0a 0a 09 disconnect();...
15f40 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a cackey_initializ
15f50 65 64 20 3d 20 30 3b 0a 0a 09 43 41 43 4b 45 59 ed = 0;...CACKEY
15f60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
15f70 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 eturning CKR_OK
15f80 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a (%i)", CKR_OK);.
15f90 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 ..return(CKR_OK)
15fa0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 ;.}..CK_DEFINE_F
15fb0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 UNCTION(CK_RV, C
15fc0 5f 47 65 74 49 6e 66 6f 29 28 43 4b 5f 49 4e 46 _GetInfo)(CK_INF
15fd0 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 O_PTR pInfo) {..
15fe0 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 static CK_UTF8CH
15ff0 41 52 20 6d 61 6e 75 66 61 63 74 75 72 65 72 49 AR manufacturerI
16000 44 5b 5d 20 3d 20 22 55 2e 53 2e 20 47 6f 76 65 D[] = "U.S. Gove
16010 72 6e 6d 65 6e 74 22 3b 0a 09 73 74 61 74 69 63 rnment";..static
16020 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6c 69 62 CK_UTF8CHAR lib
16030 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 5b raryDescription[
16040 5d 20 3d 20 22 43 41 43 4b 65 79 22 3b 0a 0a 09 ] = "CACKey";...
16050 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
16060 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a NTF("Called.");.
16070 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e ..if (pInfo == N
16080 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f ULL) {...CACKEY_
16090 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
160a0 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 ror. pInfo is NU
160b0 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e LL.");....return
160c0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 (CKR_ARGUMENTS_B
160d0 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 AD);..}...if (!c
160e0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 ackey_initialize
160f0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 d) {...CACKEY_DE
16100 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
16110 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 r. Not initiali
16120 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 zed.");....retur
16130 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e n(CKR_CRYPTOKI_N
16140 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b OT_INITIALIZED);
16150 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 63 72 79 ..}...pInfo->cry
16160 70 74 6f 6b 69 56 65 72 73 69 6f 6e 2e 6d 61 6a ptokiVersion.maj
16170 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 52 or = ((CACKEY_CR
16180 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 YPTOKI_VERSION_C
16190 4f 44 45 29 20 3e 3e 20 31 36 29 20 26 20 30 78 ODE) >> 16) & 0x
161a0 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 63 72 79 70 ff;..pInfo->cryp
161b0 74 6f 6b 69 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f tokiVersion.mino
161c0 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 52 59 r = ((CACKEY_CRY
161d0 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f PTOKI_VERSION_CO
161e0 44 45 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 DE) >> 8) & 0xff
161f0 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f ;...memset(pInfo
16200 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 ->manufacturerID
16210 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 , ' ', sizeof(pI
16220 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 nfo->manufacture
16230 72 49 44 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 rID));..memcpy(p
16240 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 Info->manufactur
16250 65 72 49 44 2c 20 6d 61 6e 75 66 61 63 74 75 72 erID, manufactur
16260 65 72 49 44 2c 20 73 69 7a 65 6f 66 28 6d 61 6e erID, sizeof(man
16270 75 66 61 63 74 75 72 65 72 49 44 29 20 2d 20 31 ufacturerID) - 1
16280 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 );...pInfo->flag
16290 73 20 3d 20 30 78 30 30 3b 0a 0a 09 6d 65 6d 73 s = 0x00;...mems
162a0 65 74 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 et(pInfo->librar
162b0 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 27 20 yDescription, '
162c0 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d ', sizeof(pInfo-
162d0 3e 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74 >libraryDescript
162e0 69 6f 6e 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 ion));..memcpy(p
162f0 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73 Info->libraryDes
16300 63 72 69 70 74 69 6f 6e 2c 20 6c 69 62 72 61 72 cription, librar
16310 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 69 yDescription, si
16320 7a 65 6f 66 28 6c 69 62 72 61 72 79 44 65 73 63 zeof(libraryDesc
16330 72 69 70 74 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a ription) - 1);..
16340 09 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 56 .pInfo->libraryV
16350 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 ersion.major = (
16360 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f cackey_getversio
16370 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66 n() >> 16) & 0xf
16380 66 3b 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 f;..pInfo->libra
16390 72 79 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 ryVersion.minor
163a0 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 = (cackey_getver
163b0 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26 20 30 sion() >> 8) & 0
163c0 78 66 66 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 xff;...CACKEY_DE
163d0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
163e0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 rning CKR_OK (%i
163f0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 )", CKR_OK);...r
16400 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d eturn(CKR_OK);.}
16410 0a 0a 2f 2a 0a 20 2a 20 50 72 6f 63 65 73 73 20 ../*. * Process
16420 6c 69 73 74 20 6f 66 20 72 65 61 64 65 72 73 2c list of readers,
16430 20 61 6e 64 20 63 72 65 61 74 65 20 6d 61 70 70 and create mapp
16440 69 6e 67 20 62 65 74 77 65 65 6e 20 72 65 61 64 ing between read
16450 65 72 20 6e 61 6d 65 20 61 6e 64 20 73 6c 6f 74 er name and slot
16460 20 49 44 0a 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e ID. */.CK_DEFIN
16470 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 E_FUNCTION(CK_RV
16480 2c 20 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74 29 , C_GetSlotList)
16490 28 43 4b 5f 42 42 4f 4f 4c 20 74 6f 6b 65 6e 50 (CK_BBOOL tokenP
164a0 72 65 73 65 6e 74 2c 20 43 4b 5f 53 4c 4f 54 5f resent, CK_SLOT_
164b0 49 44 5f 50 54 52 20 70 53 6c 6f 74 4c 69 73 74 ID_PTR pSlotList
164c0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 , CK_ULONG_PTR p
164d0 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 69 6e 74 20 ulCount) {..int
164e0 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 mutex_retval;..i
164f0 6e 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f nt pcsc_connect_
16500 72 65 74 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 63 ret;..CK_ULONG c
16510 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63 6f 75 6e 74 ount, slot_count
16520 20 3d 20 30 2c 20 63 75 72 72 73 6c 6f 74 3b 0a = 0, currslot;.
16530 09 63 68 61 72 20 2a 70 63 73 63 5f 72 65 61 64 .char *pcsc_read
16540 65 72 73 2c 20 2a 70 63 73 63 5f 72 65 61 64 65 ers, *pcsc_reade
16550 72 73 5f 73 2c 20 2a 70 63 73 63 5f 72 65 61 64 rs_s, *pcsc_read
16560 65 72 73 5f 65 3b 0a 09 44 57 4f 52 44 20 70 63 ers_e;..DWORD pc
16570 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 3b 0a sc_readers_len;.
16580 09 4c 4f 4e 47 20 73 63 61 72 64 5f 6c 69 73 74 .LONG scard_list
16590 72 65 61 64 65 72 73 5f 72 65 74 3b 0a 09 73 69 readers_ret;..si
165a0 7a 65 5f 74 20 63 75 72 72 5f 72 65 61 64 65 72 ze_t curr_reader
165b0 5f 6c 65 6e 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 _len;...CACKEY_D
165c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
165d0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 75 led.");...if (pu
165e0 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 lCount == NULL)
165f0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
16600 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
16610 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e 55 4c 4c pulCount is NULL
16620 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
16630 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 KR_ARGUMENTS_BAD
16640 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 );..}...if (!cac
16650 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 key_initialized)
16660 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
16670 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
16680 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 Not initialize
16690 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
166a0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 CKR_CRYPTOKI_NOT
166b0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 _INITIALIZED);..
166c0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c }...mutex_retval
166d0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f = cackey_mutex_
166e0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
166f0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 ock);..if (mutex
16700 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a _retval != 0) {.
16710 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
16720 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c RINTF("Error. L
16730 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 ocking failed.")
16740 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
16750 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a GENERAL_ERROR);.
16760 09 7d 0a 0a 09 2f 2a 20 43 6c 65 61 72 20 6c 69 .}.../* Clear li
16770 73 74 20 6f 66 20 73 6c 6f 74 73 20 2a 2f 0a 09 st of slots */..
16780 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 29 20 7b if (pSlotList) {
16790 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
167a0 50 52 49 4e 54 46 28 22 50 75 72 67 69 6e 67 20 PRINTF("Purging
167b0 61 6c 6c 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 all slot informa
167c0 74 69 6f 6e 2e 22 29 3b 0a 0a 09 09 2f 2a 20 4f tion.");..../* O
167d0 6e 6c 79 20 75 70 64 61 74 65 20 74 68 65 20 6c nly update the l
167e0 69 73 74 20 6f 66 20 73 6c 6f 74 73 20 69 66 20 ist of slots if
167f0 77 65 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 we are actually
16800 62 65 69 6e 67 20 73 75 70 70 6c 79 20 74 68 65 being supply the
16810 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f slot informatio
16820 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 73 6c n */...cackey_sl
16830 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 ots_disconnect_a
16840 6c 6c 28 29 3b 0a 0a 09 09 66 6f 72 20 28 63 75 ll();....for (cu
16850 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75 72 72 rrslot = 0; curr
16860 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 slot < (sizeof(c
16870 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 ackey_slots) / s
16880 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f izeof(cackey_slo
16890 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f ts[0])); currslo
168a0 74 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28 63 61 t++) {....if (ca
168b0 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 ckey_slots[currs
168c0 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 lot].pcsc_reader
168d0 29 20 7b 0a 09 09 09 09 66 72 65 65 28 63 61 63 ) {.....free(cac
168e0 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c key_slots[currsl
168f0 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29 ot].pcsc_reader)
16900 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 6c ;......cackey_sl
16910 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 ots[currslot].pc
16920 73 63 5f 72 65 61 64 65 72 20 3d 20 4e 55 4c 4c sc_reader = NULL
16930 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 63 ;....}.....if (c
16940 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 ackey_slots[curr
16950 73 6c 6f 74 5d 2e 6c 61 62 65 6c 29 20 7b 0a 09 slot].label) {..
16960 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 ...free(cackey_s
16970 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c lots[currslot].l
16980 61 62 65 6c 29 3b 0a 0a 09 09 09 09 63 61 63 6b abel);......cack
16990 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f ey_slots[currslo
169a0 74 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b t].label = NULL;
169b0 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 ....}.....cackey
169c0 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d _slots[currslot]
169d0 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 09 7d .active = 0;...}
169e0 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 ..}.../* Determi
169f0 6e 65 20 6c 69 73 74 20 6f 66 20 72 65 61 64 65 ne list of reade
16a00 72 73 20 2a 2f 0a 09 70 63 73 63 5f 63 6f 6e 6e rs */..pcsc_conn
16a10 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 ect_ret = cackey
16a20 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b _pcsc_connect();
16a30 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 ..if (pcsc_conne
16a40 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 ct_ret != CACKEY
16a50 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 _PCSC_S_OK) {...
16a60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
16a70 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 NTF("Connection
16a80 74 6f 20 50 43 2f 53 43 20 66 61 69 6c 65 64 2c to PC/SC failed,
16a90 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 73 6c 6f assuming no slo
16aa0 74 73 22 29 3b 0a 0a 09 09 73 6c 6f 74 5f 63 6f ts");....slot_co
16ab0 75 6e 74 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 unt = 0;..} else
16ac0 20 7b 0a 09 09 70 63 73 63 5f 72 65 61 64 65 72 {...pcsc_reader
16ad0 73 5f 6c 65 6e 20 3d 20 30 3b 0a 0a 09 09 73 63 s_len = 0;....sc
16ae0 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f ard_listreaders_
16af0 72 65 74 20 3d 20 53 43 61 72 64 4c 69 73 74 52 ret = SCardListR
16b00 65 61 64 65 72 73 28 2a 63 61 63 6b 65 79 5f 70 eaders(*cackey_p
16b10 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c csc_handle, NULL
16b20 2c 20 4e 55 4c 4c 2c 20 26 70 63 73 63 5f 72 65 , NULL, &pcsc_re
16b30 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 0a 09 09 69 aders_len);....i
16b40 66 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 f (scard_listrea
16b50 64 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 ders_ret == SCAR
16b60 44 5f 46 5f 43 4f 4d 4d 5f 45 52 52 4f 52 29 20 D_F_COMM_ERROR)
16b70 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {....CACKEY_DEBU
16b80 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
16b90 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 SCardListReader
16ba0 73 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 s() returned SCA
16bb0 52 44 5f 46 5f 43 4f 4d 4d 5f 45 52 52 4f 52 2c RD_F_COMM_ERROR,
16bc0 20 61 73 73 75 6d 69 6e 67 20 43 6f 6e 6e 65 63 assuming Connec
16bd0 74 69 6f 6e 20 74 6f 20 50 43 2f 53 43 20 77 65 tion to PC/SC we
16be0 6e 74 20 61 77 61 79 2e 20 52 65 63 6f 6e 6e 65 nt away. Reconne
16bf0 63 74 69 6e 67 2e 22 29 3b 0a 0a 09 09 09 63 61 cting.");.....ca
16c00 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e ckey_pcsc_discon
16c10 6e 65 63 74 28 29 3b 0a 09 09 09 63 61 63 6b 65 nect();....cacke
16c20 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 y_pcsc_connect()
16c30 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 ;.....CACKEY_DEB
16c40 55 47 5f 50 52 49 4e 54 46 28 22 54 72 79 69 6e UG_PRINTF("Tryin
16c50 67 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 g SCardListReade
16c60 72 73 28 29 20 61 67 61 69 6e 22 29 3b 0a 09 09 rs() again");...
16c70 09 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 .scard_listreade
16c80 72 73 5f 72 65 74 20 3d 20 53 43 61 72 64 4c 69 rs_ret = SCardLi
16c90 73 74 52 65 61 64 65 72 73 28 2a 63 61 63 6b 65 stReaders(*cacke
16ca0 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e y_pcsc_handle, N
16cb0 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63 73 63 ULL, NULL, &pcsc
16cc0 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 _readers_len);..
16cd0 09 7d 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f .}....if (scard_
16ce0 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 listreaders_ret
16cf0 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 == SCARD_S_SUCCE
16d00 53 53 20 26 26 20 70 63 73 63 5f 72 65 61 64 65 SS && pcsc_reade
16d10 72 73 5f 6c 65 6e 20 21 3d 20 30 29 20 7b 0a 09 rs_len != 0) {..
16d20 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 20 3d ..pcsc_readers =
16d30 20 6d 61 6c 6c 6f 63 28 70 63 73 63 5f 72 65 61 malloc(pcsc_rea
16d40 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 09 70 63 ders_len);....pc
16d50 73 63 5f 72 65 61 64 65 72 73 5f 73 20 3d 20 70 sc_readers_s = p
16d60 63 73 63 5f 72 65 61 64 65 72 73 3b 0a 0a 09 09 csc_readers;....
16d70 09 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 .scard_listreade
16d80 72 73 5f 72 65 74 20 3d 20 53 43 61 72 64 4c 69 rs_ret = SCardLi
16d90 73 74 52 65 61 64 65 72 73 28 2a 63 61 63 6b 65 stReaders(*cacke
16da0 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e y_pcsc_handle, N
16db0 55 4c 4c 2c 20 70 63 73 63 5f 72 65 61 64 65 72 ULL, pcsc_reader
16dc0 73 2c 20 26 70 63 73 63 5f 72 65 61 64 65 72 73 s, &pcsc_readers
16dd0 5f 6c 65 6e 29 3b 0a 09 09 09 69 66 20 28 73 63 _len);....if (sc
16de0 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f ard_listreaders_
16df0 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 ret == SCARD_S_S
16e00 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09 70 63 UCCESS) {.....pc
16e10 73 63 5f 72 65 61 64 65 72 73 5f 65 20 3d 20 70 sc_readers_e = p
16e20 63 73 63 5f 72 65 61 64 65 72 73 20 2b 20 70 63 csc_readers + pc
16e30 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 3b 0a sc_readers_len;.
16e40 0a 09 09 09 09 2f 2a 20 53 74 61 72 74 20 77 69 ...../* Start wi
16e50 74 68 20 53 6c 6f 74 20 49 44 20 31 2c 20 74 6f th Slot ID 1, to
16e60 20 61 76 6f 69 64 20 61 20 62 75 67 20 69 6e 20 avoid a bug in
16e70 47 44 4d 20 6f 6e 20 52 48 45 4c 20 2a 2f 0a 09 GDM on RHEL */..
16e80 09 09 09 2f 2a 20 42 75 67 20 35 39 34 39 31 31 .../* Bug 594911
16e90 3a 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c : https://bugzil
16ea0 6c 61 2e 72 65 64 68 61 74 2e 63 6f 6d 2f 73 68 la.redhat.com/sh
16eb0 6f 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d 35 39 ow_bug.cgi?id=59
16ec0 34 39 31 31 20 2a 2f 0a 09 09 09 09 63 75 72 72 4911 */.....curr
16ed0 73 6c 6f 74 20 3d 20 31 3b 0a 09 09 09 09 77 68 slot = 1;.....wh
16ee0 69 6c 65 20 28 70 63 73 63 5f 72 65 61 64 65 72 ile (pcsc_reader
16ef0 73 20 3c 20 70 63 73 63 5f 72 65 61 64 65 72 73 s < pcsc_readers
16f00 5f 65 29 20 7b 0a 09 09 09 09 09 63 75 72 72 5f _e) {......curr_
16f10 72 65 61 64 65 72 5f 6c 65 6e 20 3d 20 73 74 72 reader_len = str
16f20 6c 65 6e 28 70 63 73 63 5f 72 65 61 64 65 72 73 len(pcsc_readers
16f30 29 3b 0a 0a 09 09 09 09 09 69 66 20 28 28 70 63 );.......if ((pc
16f40 73 63 5f 72 65 61 64 65 72 73 20 2b 20 63 75 72 sc_readers + cur
16f50 72 5f 72 65 61 64 65 72 5f 6c 65 6e 29 20 3e 20 r_reader_len) >
16f60 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65 29 20 pcsc_readers_e)
16f70 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 {.......break;..
16f80 09 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 ....}.......if (
16f90 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 curr_reader_len
16fa0 3d 3d 20 30 29 20 7b 0a 09 09 09 09 09 09 62 72 == 0) {.......br
16fb0 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 eak;......}.....
16fc0 09 09 69 66 20 28 63 75 72 72 73 6c 6f 74 20 3e ..if (currslot >
16fd0 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 = (sizeof(cackey
16fe0 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 _slots) / sizeof
16ff0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d (cackey_slots[0]
17000 29 29 29 20 7b 0a 09 09 09 09 09 09 43 41 43 4b ))) {.......CACK
17010 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
17020 22 46 6f 75 6e 64 20 6d 6f 72 65 20 72 65 61 64 "Found more read
17030 65 72 73 20 74 68 61 6e 20 73 6c 6f 74 73 20 61 ers than slots a
17040 72 65 20 61 76 61 69 6c 61 62 6c 65 21 22 29 3b re available!");
17050 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 ........break;..
17060 09 09 09 09 7d 0a 0a 09 09 09 09 09 43 41 43 4b ....}.......CACK
17070 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
17080 22 46 6f 75 6e 64 20 72 65 61 64 65 72 3a 20 25 "Found reader: %
17090 73 22 2c 20 70 63 73 63 5f 72 65 61 64 65 72 73 s", pcsc_readers
170a0 29 3b 0a 0a 09 09 09 09 09 2f 2a 20 4f 6e 6c 79 );......./* Only
170b0 20 75 70 64 61 74 65 20 74 68 65 20 6c 69 73 74 update the list
170c0 20 6f 66 20 73 6c 6f 74 73 20 69 66 20 77 65 20 of slots if we
170d0 61 72 65 20 61 63 74 75 61 6c 6c 79 20 62 65 69 are actually bei
170e0 6e 67 20 61 73 6b 65 64 20 73 75 70 70 6c 79 20 ng asked supply
170f0 74 68 65 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 the slot informa
17100 74 69 6f 6e 20 2a 2f 0a 09 09 09 09 09 69 66 20 tion */......if
17110 28 70 53 6c 6f 74 4c 69 73 74 29 20 7b 0a 09 09 (pSlotList) {...
17120 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 ....cackey_slots
17130 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 [currslot].activ
17140 65 20 3d 20 31 3b 0a 09 09 09 09 09 09 63 61 63 e = 1;.......cac
17150 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c key_slots[currsl
17160 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20 ot].pcsc_reader
17170 3d 20 73 74 72 64 75 70 28 70 63 73 63 5f 72 65 = strdup(pcsc_re
17180 61 64 65 72 73 29 3b 0a 09 09 09 09 09 09 63 61 aders);.......ca
17190 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 ckey_slots[currs
171a0 6c 6f 74 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 lot].pcsc_card_c
171b0 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09 09 onnected = 0;...
171c0 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 ....cackey_slots
171d0 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 72 61 6e 73 [currslot].trans
171e0 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30 action_depth = 0
171f0 3b 0a 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 ;.......cackey_s
17200 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 lots[currslot].t
17210 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f ransaction_need_
17220 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09 09 hw_lock = 0;....
17230 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b ...cackey_slots[
17240 63 75 72 72 73 6c 6f 74 5d 2e 73 6c 6f 74 5f 72 currslot].slot_r
17250 65 73 65 74 20 3d 20 31 3b 0a 09 09 09 09 09 09 eset = 1;.......
17260 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 cackey_slots[cur
17270 72 73 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 rslot].token_fla
17280 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 gs = CKF_LOGIN_R
17290 45 51 55 49 52 45 44 3b 0a 09 09 09 09 09 09 63 EQUIRED;.......c
172a0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 ackey_slots[curr
172b0 73 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 slot].label = NU
172c0 4c 4c 3b 0a 0a 09 09 09 09 09 09 63 61 63 6b 65 LL;........cacke
172d0 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 y_mark_slot_rese
172e0 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b t(&cackey_slots[
172f0 63 75 72 72 73 6c 6f 74 5d 29 3b 0a 09 09 09 09 currslot]);.....
17300 09 7d 0a 09 09 09 09 09 63 75 72 72 73 6c 6f 74 .}......currslot
17310 2b 2b 3b 0a 0a 09 09 09 09 09 70 63 73 63 5f 72 ++;.......pcsc_r
17320 65 61 64 65 72 73 20 2b 3d 20 63 75 72 72 5f 72 eaders += curr_r
17330 65 61 64 65 72 5f 6c 65 6e 20 2b 20 31 3b 0a 09 eader_len + 1;..
17340 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 53 74 61 ...}....../* Sta
17350 72 74 20 77 69 74 68 20 53 6c 6f 74 20 49 44 20 rt with Slot ID
17360 31 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 62 75 1, to avoid a bu
17370 67 20 69 6e 20 47 44 4d 20 6f 6e 20 52 48 45 4c g in GDM on RHEL
17380 20 2a 2f 0a 09 09 09 09 2f 2a 20 42 75 67 20 35 */...../* Bug 5
17390 39 34 39 31 31 3a 20 68 74 74 70 73 3a 2f 2f 62 94911: https://b
173a0 75 67 7a 69 6c 6c 61 2e 72 65 64 68 61 74 2e 63 ugzilla.redhat.c
173b0 6f 6d 2f 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f om/show_bug.cgi?
173c0 69 64 3d 35 39 34 39 31 31 20 2a 2f 0a 09 09 09 id=594911 */....
173d0 09 69 66 20 28 63 75 72 72 73 6c 6f 74 20 3e 20 .if (currslot >
173e0 31 29 20 7b 0a 09 09 09 09 09 2f 2a 20 53 74 61 1) {....../* Sta
173f0 72 74 20 77 69 74 68 20 53 6c 6f 74 20 49 44 20 rt with Slot ID
17400 31 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 62 75 1, to avoid a bu
17410 67 20 69 6e 20 47 44 4d 20 6f 6e 20 52 48 45 4c g in GDM on RHEL
17420 20 2a 2f 0a 09 09 09 09 09 2f 2a 20 42 75 67 20 */....../* Bug
17430 35 39 34 39 31 31 3a 20 68 74 74 70 73 3a 2f 2f 594911: https://
17440 62 75 67 7a 69 6c 6c 61 2e 72 65 64 68 61 74 2e bugzilla.redhat.
17450 63 6f 6d 2f 73 68 6f 77 5f 62 75 67 2e 63 67 69 com/show_bug.cgi
17460 3f 69 64 3d 35 39 34 39 31 31 20 2a 2f 0a 09 09 ?id=594911 */...
17470 09 09 09 73 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20 ...slot_count =
17480 63 75 72 72 73 6c 6f 74 20 2d 20 31 3b 0a 09 09 currslot - 1;...
17490 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a ..}....} else {.
174a0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
174b0 5f 50 52 49 4e 54 46 28 22 53 65 63 6f 6e 64 20 _PRINTF("Second
174c0 63 61 6c 6c 20 74 6f 20 53 43 61 72 64 4c 69 73 call to SCardLis
174d0 74 52 65 61 64 65 72 73 20 66 61 69 6c 65 64 2c tReaders failed,
174e0 20 72 65 74 75 72 6e 20 25 73 2f 25 6c 69 22 2c return %s/%li",
174f0 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 CACKEY_DEBUG_FU
17500 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 NC_SCARDERR_TO_S
17510 54 52 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 TR(scard_listrea
17520 64 65 72 73 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 ders_ret), (long
17530 29 20 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 ) scard_listread
17540 65 72 73 5f 72 65 74 29 3b 0a 09 09 09 7d 0a 0a ers_ret);....}..
17550 09 09 09 66 72 65 65 28 70 63 73 63 5f 72 65 61 ...free(pcsc_rea
17560 64 65 72 73 5f 73 29 3b 0a 09 09 7d 20 65 6c 73 ders_s);...} els
17570 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 e {....CACKEY_DE
17580 42 55 47 5f 50 52 49 4e 54 46 28 22 46 69 72 73 BUG_PRINTF("Firs
17590 74 20 63 61 6c 6c 20 74 6f 20 53 43 61 72 64 4c t call to SCardL
175a0 69 73 74 52 65 61 64 65 72 73 20 66 61 69 6c 65 istReaders faile
175b0 64 2c 20 72 65 74 75 72 6e 20 25 73 2f 25 6c 69 d, return %s/%li
175c0 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ", CACKEY_DEBUG_
175d0 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f FUNC_SCARDERR_TO
175e0 5f 53 54 52 28 73 63 61 72 64 5f 6c 69 73 74 72 _STR(scard_listr
175f0 65 61 64 65 72 73 5f 72 65 74 29 2c 20 28 6c 6f eaders_ret), (lo
17600 6e 67 29 20 73 63 61 72 64 5f 6c 69 73 74 72 65 ng) scard_listre
17610 61 64 65 72 73 5f 72 65 74 29 3b 0a 09 09 7d 0a aders_ret);...}.
17620 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 .}...mutex_retva
17630 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 l = cackey_mutex
17640 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 _unlock(cackey_b
17650 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 iglock);..if (mu
17660 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 tex_retval != 0)
17670 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
17680 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
17690 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c Unlocking fail
176a0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
176b0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 (CKR_GENERAL_ERR
176c0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 53 OR);..}...if (pS
176d0 6c 6f 74 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 lotList == NULL)
176e0 20 7b 0a 09 09 2a 70 75 6c 43 6f 75 6e 74 20 3d {...*pulCount =
176f0 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b 0a 0a 09 09 slot_count;....
17700 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
17710 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 NTF("Returning C
17720 4b 52 5f 4f 4b 20 28 25 69 29 2e 20 20 46 6f 75 KR_OK (%i). Fou
17730 6e 64 20 25 6c 75 20 72 65 61 64 65 72 73 2c 20 nd %lu readers,
17740 62 75 74 20 6e 6f 74 20 73 74 6f 72 69 6e 67 20 but not storing
17750 49 44 73 20 28 70 53 6c 6f 74 4c 69 73 74 20 3d IDs (pSlotList =
17760 3d 20 4e 55 4c 4c 29 22 2c 20 43 4b 52 5f 4f 4b = NULL)", CKR_OK
17770 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
17780 29 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a ) slot_count);..
17790 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 ..return(CKR_OK)
177a0 3b 0a 09 7d 0a 0a 09 63 6f 75 6e 74 20 3d 20 2a ;..}...count = *
177b0 70 75 6c 43 6f 75 6e 74 3b 0a 09 69 66 20 28 63 pulCount;..if (c
177c0 6f 75 6e 74 20 3c 20 73 6c 6f 74 5f 63 6f 75 6e ount < slot_coun
177d0 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 t) {...CACKEY_DE
177e0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
177f0 72 2e 20 55 73 65 72 20 61 6c 6c 6f 63 61 74 65 r. User allocate
17800 64 20 25 6c 75 20 65 6e 74 72 69 65 73 2c 20 62 d %lu entries, b
17810 75 74 20 77 65 20 68 61 76 65 20 25 6c 75 20 65 ut we have %lu e
17820 6e 74 72 69 65 73 2e 22 2c 20 63 6f 75 6e 74 2c ntries.", count,
17830 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 slot_count);...
17840 09 72 65 74 75 72 6e 28 43 4b 52 5f 42 55 46 46 .return(CKR_BUFF
17850 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 09 0a ER_TOO_SMALL);..
17860 09 7d 0a 0a 09 66 6f 72 20 28 63 75 72 72 73 6c .}...for (currsl
17870 6f 74 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74 ot = 0; currslot
17880 20 3c 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b 20 63 < slot_count; c
17890 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 2f urrslot++) {.../
178a0 2a 20 53 74 61 72 74 20 77 69 74 68 20 53 6c 6f * Start with Slo
178b0 74 20 49 44 20 31 2c 20 74 6f 20 61 76 6f 69 64 t ID 1, to avoid
178c0 20 61 20 62 75 67 20 69 6e 20 47 44 4d 20 6f 6e a bug in GDM on
178d0 20 52 48 45 4c 20 2a 2f 0a 09 09 2f 2a 20 42 75 RHEL */.../* Bu
178e0 67 20 35 39 34 39 31 31 3a 20 68 74 74 70 73 3a g 594911: https:
178f0 2f 2f 62 75 67 7a 69 6c 6c 61 2e 72 65 64 68 61 //bugzilla.redha
17900 74 2e 63 6f 6d 2f 73 68 6f 77 5f 62 75 67 2e 63 t.com/show_bug.c
17910 67 69 3f 69 64 3d 35 39 34 39 31 31 20 2a 2f 0a gi?id=594911 */.
17920 09 09 70 53 6c 6f 74 4c 69 73 74 5b 63 75 72 72 ..pSlotList[curr
17930 73 6c 6f 74 5d 20 3d 20 63 75 72 72 73 6c 6f 74 slot] = currslot
17940 20 2b 20 31 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 43 + 1;..}...*pulC
17950 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f 75 6e ount = slot_coun
17960 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 t;...CACKEY_DEBU
17970 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
17980 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 2e ing CKR_OK (%i).
17990 20 20 46 6f 75 6e 64 20 25 6c 75 20 72 65 61 64 Found %lu read
179a0 65 72 73 2e 22 2c 20 43 4b 52 5f 4f 4b 2c 20 28 ers.", CKR_OK, (
179b0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 unsigned long) s
179c0 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 72 65 lot_count);...re
179d0 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 turn(CKR_OK);...
179e0 74 6f 6b 65 6e 50 72 65 73 65 6e 74 20 3d 20 74 tokenPresent = t
179f0 6f 6b 65 6e 50 72 65 73 65 6e 74 3b 20 2f 2a 20 okenPresent; /*
17a00 53 75 70 72 65 73 73 20 75 6e 75 73 65 64 20 76 Supress unused v
17a10 61 72 69 61 62 6c 65 20 77 61 72 6e 69 6e 67 20 ariable warning
17a20 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f */.}..CK_DEFINE_
17a30 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 FUNCTION(CK_RV,
17a40 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 29 28 43 C_GetSlotInfo)(C
17a50 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 K_SLOT_ID slotID
17a60 2c 20 43 4b 5f 53 4c 4f 54 5f 49 4e 46 4f 5f 50 , CK_SLOT_INFO_P
17a70 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61 TR pInfo) {..sta
17a80 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 tic CK_UTF8CHAR
17a90 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 5b slotDescription[
17aa0 5d 20 3d 20 22 43 41 43 4b 65 79 20 53 6c 6f 74 ] = "CACKey Slot
17ab0 22 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 ";..int mutex_re
17ac0 74 76 61 6c 3b 0a 09 69 6e 74 20 62 79 74 65 73 tval;..int bytes
17ad0 5f 74 6f 5f 63 6f 70 79 3b 0a 0a 09 43 41 43 4b _to_copy;...CACK
17ae0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
17af0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 "Called.");...if
17b00 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 (pInfo == NULL)
17b10 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
17b20 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
17b30 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 pInfo is NULL."
17b40 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
17b50 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b _ARGUMENTS_BAD);
17b60 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ..}...if (!cacke
17b70 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b y_initialized) {
17b80 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
17b90 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
17ba0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e Not initialized.
17bb0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
17bc0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 R_CRYPTOKI_NOT_I
17bd0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
17be0 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 ..if (slotID < 0
17bf0 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 || slotID >= (s
17c00 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f izeof(cackey_slo
17c10 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 ts) / sizeof(cac
17c20 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 key_slots[0])))
17c30 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
17c40 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
17c50 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 Invalid slot req
17c60 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 uested (%lu), ou
17c70 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 tside of valid r
17c80 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a ange", slotID);.
17c90 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c ...return(CKR_SL
17ca0 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a OT_ID_INVALID);.
17cb0 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 .}...mutex_retva
17cc0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 l = cackey_mutex
17cd0 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 _lock(cackey_big
17ce0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 lock);..if (mute
17cf0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b x_retval != 0) {
17d00 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
17d10 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
17d20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 Locking failed."
17d30 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
17d40 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b _GENERAL_ERROR);
17d50 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 ..}...if (cackey
17d60 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 _slots[slotID].a
17d70 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 ctive == 0) {...
17d80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
17d90 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 NTF("Error. Inva
17da0 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 lid slot request
17db0 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e ed (%lu), slot n
17dc0 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 ot currently act
17dd0 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a ive", slotID);..
17de0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 ..cackey_mutex_u
17df0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 nlock(cackey_big
17e00 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e lock);....return
17e10 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 (CKR_SLOT_ID_INV
17e20 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 ALID);..}...pInf
17e30 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 52 o->flags = CKF_R
17e40 45 4d 4f 56 41 42 4c 45 5f 44 45 56 49 43 45 20 EMOVABLE_DEVICE
17e50 7c 20 43 4b 46 5f 48 57 5f 53 4c 4f 54 3b 0a 0a | CKF_HW_SLOT;..
17e60 09 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 .if (cackey_toke
17e70 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65 n_present(&cacke
17e80 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 y_slots[slotID])
17e90 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f == CACKEY_PCSC_
17ea0 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 S_TOKENPRESENT)
17eb0 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 {...pInfo->flags
17ec0 20 7c 3d 20 43 4b 46 5f 54 4f 4b 45 4e 5f 50 52 |= CKF_TOKEN_PR
17ed0 45 53 45 4e 54 3b 0a 09 7d 0a 0a 09 62 79 74 65 ESENT;..}...byte
17ee0 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 73 74 72 6c s_to_copy = strl
17ef0 65 6e 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b en(cackey_slots[
17f00 73 6c 6f 74 49 44 5d 2e 70 63 73 63 5f 72 65 61 slotID].pcsc_rea
17f10 64 65 72 29 3b 0a 09 69 66 20 28 73 69 7a 65 6f der);..if (sizeo
17f20 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 f(pInfo->manufac
17f30 74 75 72 65 72 49 44 29 20 3c 20 62 79 74 65 73 turerID) < bytes
17f40 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a 09 09 62 79 _to_copy) {...by
17f50 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 73 69 tes_to_copy = si
17f60 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 zeof(pInfo->manu
17f70 66 61 63 74 75 72 65 72 49 44 29 3b 0a 09 7d 0a facturerID);..}.
17f80 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d .memcpy(pInfo->m
17f90 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 63 anufacturerID, c
17fa0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 ackey_slots[slot
17fb0 49 44 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 2c ID].pcsc_reader,
17fc0 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 3b bytes_to_copy);
17fd0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 ...mutex_retval
17fe0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 = cackey_mutex_u
17ff0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 nlock(cackey_big
18000 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 lock);..if (mute
18010 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b x_retval != 0) {
18020 0a 09 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 45 72 72 6f 72 2e 20 20 PRINTF("Error.
18040 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 Unlocking failed
18050 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
18060 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 KR_GENERAL_ERROR
18070 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 );..}...memset(p
18080 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69 Info->slotDescri
18090 70 74 69 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65 ption, ' ', size
180a0 6f 66 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 of(pInfo->slotDe
180b0 73 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65 scription));..me
180c0 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 mcpy(pInfo->slot
180d0 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 6c 6f Description, slo
180e0 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 69 tDescription, si
180f0 7a 65 6f 66 28 73 6c 6f 74 44 65 73 63 72 69 70 zeof(slotDescrip
18100 74 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 tion) - 1);...me
18110 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 mset(pInfo->manu
18120 66 61 63 74 75 72 65 72 49 44 2c 20 27 20 27 2c facturerID, ' ',
18130 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d sizeof(pInfo->m
18140 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 29 3b anufacturerID));
18150 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 ...pInfo->hardwa
18160 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 reVersion.major
18170 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 = (cackey_getver
18180 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 sion() >> 16) &
18190 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61 0xff;..pInfo->ha
181a0 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 rdwareVersion.mi
181b0 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 nor = (cackey_ge
181c0 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 tversion() >> 8)
181d0 20 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e 66 6f & 0xff;...pInfo
181e0 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f ->firmwareVersio
181f0 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30 3b 0a n.major = 0x00;.
18200 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 .pInfo->firmware
18210 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 Version.minor =
18220 30 78 30 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 0x00;...CACKEY_D
18230 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
18240 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 urning CKR_OK (%
18250 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 i)", CKR_OK);...
18260 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a return(CKR_OK);.
18270 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e }..CK_DEFINE_FUN
18280 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 CTION(CK_RV, C_G
18290 65 74 54 6f 6b 65 6e 49 6e 66 6f 29 28 43 4b 5f etTokenInfo)(CK_
182a0 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 SLOT_ID slotID,
182b0 43 4b 5f 54 4f 4b 45 4e 5f 49 4e 46 4f 5f 50 54 CK_TOKEN_INFO_PT
182c0 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74 R pInfo) {..stat
182d0 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6d ic CK_UTF8CHAR m
182e0 61 6e 75 66 61 63 74 75 72 65 72 49 44 5b 5d 20 anufacturerID[]
182f0 3d 20 22 55 2e 53 2e 20 47 6f 76 65 72 6e 6d 65 = "U.S. Governme
18300 6e 74 22 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f nt";..static CK_
18310 55 54 46 38 43 48 41 52 20 64 65 66 61 75 6c 74 UTF8CHAR default
18320 4c 61 62 65 6c 5b 5d 20 3d 20 22 55 6e 6b 6e 6f Label[] = "Unkno
18330 77 6e 20 54 6f 6b 65 6e 22 3b 0a 09 73 74 61 74 wn Token";..stat
18340 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6d ic CK_UTF8CHAR m
18350 6f 64 65 6c 5b 5d 20 3d 20 22 43 41 43 20 54 6f odel[] = "CAC To
18360 6b 65 6e 22 3b 0a 09 73 74 72 75 63 74 20 63 61 ken";..struct ca
18370 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 ckey_pcsc_identi
18380 74 79 20 2a 70 63 73 63 5f 69 64 65 6e 74 69 74 ty *pcsc_identit
18390 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c ies;..unsigned l
183a0 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 09 ong num_certs;..
183b0 73 73 69 7a 65 5f 74 20 6c 61 62 65 6c 5f 72 65 ssize_t label_re
183c0 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 t;..int mutex_re
183d0 74 76 61 6c 3b 0a 09 69 6e 74 20 75 73 65 5f 64 tval;..int use_d
183e0 65 66 61 75 6c 74 5f 6c 61 62 65 6c 3b 0a 0a 09 efault_label;...
183f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
18400 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a NTF("Called.");.
18410 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e ..if (pInfo == N
18420 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f ULL) {...CACKEY_
18430 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
18440 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 ror. pInfo is NU
18450 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e LL.");....return
18460 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 (CKR_ARGUMENTS_B
18470 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 AD);..}...if (!c
18480 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 ackey_initialize
18490 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 d) {...CACKEY_DE
184a0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
184b0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 r. Not initiali
184c0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 zed.");....retur
184d0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e n(CKR_CRYPTOKI_N
184e0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b OT_INITIALIZED);
184f0 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 ..}...if (slotID
18500 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e < 0 || slotID >
18510 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 = (sizeof(cackey
18520 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 _slots) / sizeof
18530 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d (cackey_slots[0]
18540 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ))) {...CACKEY_D
18550 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
18560 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 or. Invalid slot
18570 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 requested (%lu)
18580 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c , outside of val
18590 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 id range", slotI
185a0 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b D);....return(CK
185b0 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 R_SLOT_ID_INVALI
185c0 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 D);..}...mutex_r
185d0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d etval = cackey_m
185e0 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 utex_lock(cackey
185f0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 _biglock);..if (
18600 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 mutex_retval !=
18610 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 0) {...CACKEY_DE
18620 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
18630 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c r. Locking fail
18640 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
18650 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 (CKR_GENERAL_ERR
18660 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 OR);..}...if (ca
18670 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 ckey_slots[slotI
18680 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 D].active == 0)
18690 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
186a0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
186b0 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 Invalid slot req
186c0 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c uested (%lu), sl
186d0 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 ot not currently
186e0 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 active", slotID
186f0 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 );....cackey_mut
18700 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 ex_unlock(cackey
18710 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 _biglock);....re
18720 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 turn(CKR_SLOT_ID
18730 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 _INVALID);..}...
18740 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e if (cackey_token
18750 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79 _present(&cackey
18760 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 _slots[slotID])
18770 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 != CACKEY_PCSC_S
18780 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b _TOKENPRESENT) {
18790 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
187a0 50 52 49 4e 54 46 28 22 4e 6f 20 74 6f 6b 65 6e PRINTF("No token
187b0 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 73 is present in s
187c0 6c 6f 74 49 44 20 3d 20 25 6c 75 22 2c 20 73 6c lotID = %lu", sl
187d0 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 otID);....cackey
187e0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 _mutex_unlock(ca
187f0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a ckey_biglock);..
18800 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b ..return(CKR_TOK
18810 45 4e 5f 4e 4f 54 5f 50 52 45 53 45 4e 54 29 3b EN_NOT_PRESENT);
18820 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 ..}...mutex_retv
18830 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 al = cackey_mute
18840 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
18850 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d biglock);..if (m
18860 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 utex_retval != 0
18870 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
18880 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
18890 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 . Unlocking fai
188a0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 led.");....retur
188b0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 n(CKR_GENERAL_ER
188c0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 ROR);..}.../* De
188d0 74 65 72 6d 69 6e 65 20 74 6f 6b 65 6e 20 6c 61 termine token la
188e0 62 65 6c 20 66 72 6f 6d 20 63 65 72 74 69 66 69 bel from certifi
188f0 63 61 74 65 73 20 2a 2f 0a 09 6d 65 6d 73 65 74 cates */..memset
18900 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 27 (pInfo->label, '
18910 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f ', sizeof(pInfo
18920 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 75 73 65 5f ->label));..use_
18930 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 default_label =
18940 31 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 1;...if (cackey_
18950 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 slots[slotID].la
18960 62 65 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 bel == NULL) {..
18970 09 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 .pcsc_identities
18980 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 = cackey_read_c
18990 65 72 74 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f erts(&cackey_slo
189a0 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 4e 55 4c 4c ts[slotID], NULL
189b0 2c 20 26 6e 75 6d 5f 63 65 72 74 73 29 3b 0a 09 , &num_certs);..
189c0 09 69 66 20 28 70 63 73 63 5f 69 64 65 6e 74 69 .if (pcsc_identi
189d0 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a ties != NULL) {.
189e0 09 09 09 69 66 20 28 6e 75 6d 5f 63 65 72 74 73 ...if (num_certs
189f0 20 3e 20 30 29 20 7b 0a 09 09 09 09 6c 61 62 65 > 0) {.....labe
18a00 6c 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70 l_ret = cackey_p
18a10 63 73 63 5f 69 64 65 6e 74 69 74 79 5f 74 6f 5f csc_identity_to_
18a20 6c 61 62 65 6c 28 70 63 73 63 5f 69 64 65 6e 74 label(pcsc_ident
18a30 69 74 69 65 73 2c 20 70 49 6e 66 6f 2d 3e 6c 61 ities, pInfo->la
18a40 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 bel, sizeof(pInf
18a50 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 09 09 09 o->label));.....
18a60 69 66 20 28 6c 61 62 65 6c 5f 72 65 74 20 3e 20 if (label_ret >
18a70 30 29 20 7b 0a 09 09 09 09 09 75 73 65 5f 64 65 0) {......use_de
18a80 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 30 3b fault_label = 0;
18a90 0a 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c .......cackey_sl
18aa0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 ots[slotID].labe
18ab0 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f l = malloc(sizeo
18ac0 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 f(pInfo->label))
18ad0 3b 0a 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 63 ;.......memcpy(c
18ae0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 ackey_slots[slot
18af0 49 44 5d 2e 6c 61 62 65 6c 2c 20 70 49 6e 66 6f ID].label, pInfo
18b00 2d 3e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 ->label, sizeof(
18b10 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a pInfo->label));.
18b20 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 63 ....}....}.....c
18b30 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73 ackey_free_certs
18b40 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 (pcsc_identities
18b50 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b , num_certs, 1);
18b60 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 ...}..} else {..
18b70 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c .memcpy(pInfo->l
18b80 61 62 65 6c 2c 20 63 61 63 6b 65 79 5f 73 6c 6f abel, cackey_slo
18b90 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c ts[slotID].label
18ba0 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e , sizeof(pInfo->
18bb0 6c 61 62 65 6c 29 29 3b 0a 0a 09 09 75 73 65 5f label));....use_
18bc0 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 default_label =
18bd0 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73 65 5f 0;..}...if (use_
18be0 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 29 20 7b default_label) {
18bf0 0a 09 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d ...memcpy(pInfo-
18c00 3e 6c 61 62 65 6c 2c 20 64 65 66 61 75 6c 74 4c >label, defaultL
18c10 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 64 65 66 abel, sizeof(def
18c20 61 75 6c 74 4c 61 62 65 6c 29 20 2d 20 31 29 3b aultLabel) - 1);
18c30 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e ..}...memset(pIn
18c40 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 fo->manufacturer
18c50 49 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 ID, ' ', sizeof(
18c60 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 pInfo->manufactu
18c70 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63 70 79 rerID));..memcpy
18c80 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 (pInfo->manufact
18c90 75 72 65 72 49 44 2c 20 6d 61 6e 75 66 61 63 74 urerID, manufact
18ca0 75 72 65 72 49 44 2c 20 73 69 7a 65 6f 66 28 6d urerID, sizeof(m
18cb0 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 20 2d anufacturerID) -
18cc0 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 1);...memset(pI
18cd0 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 27 20 27 2c nfo->model, ' ',
18ce0 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d sizeof(pInfo->m
18cf0 6f 64 65 6c 29 29 3b 0a 09 6d 65 6d 63 70 79 28 odel));..memcpy(
18d00 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 6d 6f pInfo->model, mo
18d10 64 65 6c 2c 20 73 69 7a 65 6f 66 28 6d 6f 64 65 del, sizeof(mode
18d20 6c 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 l) - 1);...memse
18d30 74 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61 6c 4e t(pInfo->serialN
18d40 75 6d 62 65 72 2c 20 27 20 27 2c 20 73 69 7a 65 umber, ' ', size
18d50 6f 66 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61 6c of(pInfo->serial
18d60 4e 75 6d 62 65 72 29 29 3b 0a 0a 09 6d 65 6d 73 Number));...mems
18d70 65 74 28 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d et(pInfo->utcTim
18d80 65 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 e, ' ', sizeof(p
18d90 49 6e 66 6f 2d 3e 75 74 63 54 69 6d 65 29 29 3b Info->utcTime));
18da0 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 ...pInfo->hardwa
18db0 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 reVersion.major
18dc0 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 = (cackey_getver
18dd0 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 sion() >> 16) &
18de0 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61 0xff;..pInfo->ha
18df0 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 rdwareVersion.mi
18e00 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 nor = (cackey_ge
18e10 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 tversion() >> 8)
18e20 20 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e 66 6f & 0xff;...pInfo
18e30 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f ->firmwareVersio
18e40 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30 3b 0a n.major = 0x00;.
18e50 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 .pInfo->firmware
18e60 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 Version.minor =
18e70 30 78 30 30 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 0x00;...pInfo->f
18e80 6c 61 67 73 20 3d 20 43 4b 46 5f 57 52 49 54 45 lags = CKF_WRITE
18e90 5f 50 52 4f 54 45 43 54 45 44 20 7c 20 43 4b 46 _PROTECTED | CKF
18ea0 5f 55 53 45 52 5f 50 49 4e 5f 49 4e 49 54 49 41 _USER_PIN_INITIA
18eb0 4c 49 5a 45 44 20 7c 20 43 4b 46 5f 54 4f 4b 45 LIZED | CKF_TOKE
18ec0 4e 5f 49 4e 49 54 49 41 4c 49 5a 45 44 20 7c 20 N_INITIALIZED |
18ed0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f cackey_slots[slo
18ee0 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 tID].token_flags
18ef0 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 ;...pInfo->ulMax
18f00 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 28 SessionCount = (
18f10 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 sizeof(cackey_se
18f20 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 ssions) / sizeof
18f30 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 (cackey_sessions
18f40 5b 30 5d 29 29 20 2d 20 31 3b 0a 09 70 49 6e 66 [0])) - 1;..pInf
18f50 6f 2d 3e 75 6c 53 65 73 73 69 6f 6e 43 6f 75 6e o->ulSessionCoun
18f60 74 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 t = CK_UNAVAILAB
18f70 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a LE_INFORMATION;.
18f80 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 52 77 53 .pInfo->ulMaxRwS
18f90 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 30 3b essionCount = 0;
18fa0 0a 09 70 49 6e 66 6f 2d 3e 75 6c 52 77 53 65 73 ..pInfo->ulRwSes
18fb0 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f 55 sionCount = CK_U
18fc0 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 NAVAILABLE_INFOR
18fd0 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e MATION;..pInfo->
18fe0 75 6c 4d 61 78 50 69 6e 4c 65 6e 20 3d 20 31 32 ulMaxPinLen = 12
18ff0 38 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 8;..pInfo->ulMin
19000 50 69 6e 4c 65 6e 20 3d 20 30 3b 0a 09 70 49 6e PinLen = 0;..pIn
19010 66 6f 2d 3e 75 6c 54 6f 74 61 6c 50 75 62 6c 69 fo->ulTotalPubli
19020 63 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 cMemory = CK_UNA
19030 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 VAILABLE_INFORMA
19040 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c TION;..pInfo->ul
19050 46 72 65 65 50 75 62 6c 69 63 4d 65 6d 6f 72 79 FreePublicMemory
19060 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c = CK_UNAVAILABL
19070 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 E_INFORMATION;..
19080 70 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61 6c 50 72 pInfo->ulTotalPr
19090 69 76 61 74 65 4d 65 6d 6f 72 79 20 3d 20 43 4b ivateMemory = CK
190a0 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 _UNAVAILABLE_INF
190b0 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f ORMATION;..pInfo
190c0 2d 3e 75 6c 46 72 65 65 50 72 69 76 61 74 65 4d ->ulFreePrivateM
190d0 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 emory = CK_UNAVA
190e0 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 ILABLE_INFORMATI
190f0 4f 4e 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 ON;...CACKEY_DEB
19100 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
19110 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 ning CKR_OK (%i)
19120 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 ", CKR_OK);...re
19130 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a turn(CKR_OK);.}.
19140 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 .CK_DEFINE_FUNCT
19150 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 57 61 69 ION(CK_RV, C_Wai
19160 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74 29 28 43 tForSlotEvent)(C
19170 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73 2c 20 43 K_FLAGS flags, C
19180 4b 5f 53 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53 K_SLOT_ID_PTR pS
19190 6c 6f 74 49 44 2c 20 43 4b 5f 56 4f 49 44 5f 50 lotID, CK_VOID_P
191a0 54 52 20 70 52 65 73 65 72 76 65 64 29 20 7b 0a TR pReserved) {.
191b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
191c0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
191d0 0a 0a 09 69 66 20 28 70 52 65 73 65 72 76 65 64 ...if (pReserved
191e0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 != NULL) {...CA
191f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
19200 46 28 22 45 72 72 6f 72 2e 20 70 52 65 73 65 72 F("Error. pReser
19210 76 65 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e ved is not NULL.
19220 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
19230 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 R_ARGUMENTS_BAD)
19240 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b ;..}...if (!cack
19250 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 ey_initialized)
19260 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
19270 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
19280 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 Not initialized
19290 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
192a0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f KR_CRYPTOKI_NOT_
192b0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d INITIALIZED);..}
192c0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
192d0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e PRINTF("Returnin
192e0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e g CKR_FUNCTION_N
192f0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 OT_SUPPORTED (%i
19300 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e )", CKR_FUNCTION
19310 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
19320 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 ...return(CKR_FU
19330 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
19340 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 RTED);.}..CK_DEF
19350 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f INE_FUNCTION(CK_
19360 52 56 2c 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 RV, C_GetMechani
19370 73 6d 4c 69 73 74 29 28 43 4b 5f 53 4c 4f 54 5f smList)(CK_SLOT_
19380 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45 ID slotID, CK_ME
19390 43 48 41 4e 49 53 4d 5f 54 59 50 45 5f 50 54 52 CHANISM_TYPE_PTR
193a0 20 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 2c pMechanismList,
193b0 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 CK_ULONG_PTR pu
193c0 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41 43 4b 45 lCount) {..CACKE
193d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
193e0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 Called.");...if
193f0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c (!cackey_initial
19400 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 ized) {...CACKEY
19410 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
19420 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 rror. Not initi
19430 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 alized.");....re
19440 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b turn(CKR_CRYPTOK
19450 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 I_NOT_INITIALIZE
19460 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c D);..}...if (pul
19470 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b Count == NULL) {
19480 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
19490 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
194a0 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e 55 4c 4c pulCount is NULL
194b0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
194c0 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 KR_ARGUMENTS_BAD
194d0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 );..}...if (pMec
194e0 68 61 6e 69 73 6d 4c 69 73 74 20 3d 3d 20 4e 55 hanismList == NU
194f0 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c 43 6f 75 6e LL) {...*pulCoun
19500 74 20 3d 20 33 3b 0a 0a 09 09 43 41 43 4b 45 59 t = 3;....CACKEY
19510 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
19520 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 eturning CKR_OK
19530 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a (%i)", CKR_OK);.
19540 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b ...return(CKR_OK
19550 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 2a 70 75 6c );..}...if (*pul
19560 43 6f 75 6e 74 20 3c 20 33 29 20 7b 0a 09 09 43 Count < 3) {...C
19570 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
19580 54 46 28 22 45 72 72 6f 72 2e 20 20 42 75 66 66 TF("Error. Buff
19590 65 72 20 74 6f 6f 20 73 6d 61 6c 6c 2e 22 29 3b er too small.");
195a0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 42 ....return(CKR_B
195b0 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 UFFER_TOO_SMALL)
195c0 3b 0a 09 7d 0a 0a 09 70 4d 65 63 68 61 6e 69 73 ;..}...pMechanis
195d0 6d 4c 69 73 74 5b 30 5d 20 3d 20 43 4b 4d 5f 52 mList[0] = CKM_R
195e0 53 41 5f 50 4b 43 53 3b 0a 09 70 4d 65 63 68 61 SA_PKCS;..pMecha
195f0 6e 69 73 6d 4c 69 73 74 5b 31 5d 20 3d 20 43 4b nismList[1] = CK
19600 4d 5f 53 48 41 31 5f 52 53 41 5f 50 4b 43 53 3b M_SHA1_RSA_PKCS;
19610 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 32 3b ..*pulCount = 2;
19620 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
19630 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e PRINTF("Returnin
19640 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 g CKR_OK (%i)",
19650 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 CKR_OK);...retur
19660 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b n(CKR_OK);.}..CK
19670 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e _DEFINE_FUNCTION
19680 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4d 65 63 (CK_RV, C_GetMec
19690 68 61 6e 69 73 6d 49 6e 66 6f 29 28 43 4b 5f 53 hanismInfo)(CK_S
196a0 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 LOT_ID slotID, C
196b0 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 K_MECHANISM_TYPE
196c0 20 74 79 70 65 2c 20 43 4b 5f 4d 45 43 48 41 4e type, CK_MECHAN
196d0 49 53 4d 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e ISM_INFO_PTR pIn
196e0 66 6f 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 fo) {..int mutex
196f0 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 _retval;...CACKE
19700 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
19710 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 Called.");...if
19720 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 (pInfo == NULL)
19730 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
19740 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
19750 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 pInfo is NULL.")
19760 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
19770 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a ARGUMENTS_BAD);.
19780 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 .}...if (!cackey
19790 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
197a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
197b0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e RINTF("Error. N
197c0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 ot initialized."
197d0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
197e0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e _CRYPTOKI_NOT_IN
197f0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
19800 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 .if (slotID < 0
19810 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 || slotID >= (si
19820 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 zeof(cackey_slot
19830 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b s) / sizeof(cack
19840 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b ey_slots[0]))) {
19850 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
19860 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 PRINTF("Error. I
19870 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 nvalid slot requ
19880 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 ested (%lu), out
19890 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 side of valid ra
198a0 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a nge", slotID);..
198b0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f ..return(CKR_SLO
198c0 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 T_ID_INVALID);..
198d0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c }...mutex_retval
198e0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f = cackey_mutex_
198f0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
19900 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 ock);..if (mutex
19910 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a _retval != 0) {.
19920 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
19930 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c RINTF("Error. L
19940 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 ocking failed.")
19950 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
19960 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a GENERAL_ERROR);.
19970 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f .}...if (cackey_
19980 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 slots[slotID].ac
19990 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 tive == 0) {...C
199a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
199b0 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c TF("Error. Inval
199c0 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 id slot requeste
199d0 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f d (%lu), slot no
199e0 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 t currently acti
199f0 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 ve", slotID);...
19a00 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e .cackey_mutex_un
19a10 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
19a20 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 ock);....return(
19a30 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 CKR_SLOT_ID_INVA
19a40 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 LID);..}...mutex
19a50 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 _retval = cackey
19a60 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 _mutex_unlock(ca
19a70 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 ckey_biglock);..
19a80 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c if (mutex_retval
19a90 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 != 0) {...CACKE
19aa0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
19ab0 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e Error. Unlockin
19ac0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 g failed.");....
19ad0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 return(CKR_GENER
19ae0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 AL_ERROR);..}...
19af0 2f 2a 20 58 58 58 3a 20 54 68 69 73 20 69 73 20 /* XXX: This is
19b00 75 6e 74 65 73 74 65 64 2c 20 61 6e 64 20 66 75 untested, and fu
19b10 72 74 68 65 72 20 49 27 6d 20 6e 6f 74 20 72 65 rther I'm not re
19b20 61 6c 6c 79 20 73 75 72 65 20 69 66 20 74 68 69 ally sure if thi
19b30 73 20 69 73 20 63 6f 72 72 65 63 74 2e 20 2a 2f s is correct. */
19b40 0a 09 73 77 69 74 63 68 20 28 74 79 70 65 29 20 ..switch (type)
19b50 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 {...case CKM_RSA
19b60 5f 50 4b 43 53 3a 0a 09 09 09 70 49 6e 66 6f 2d _PKCS:....pInfo-
19b70 3e 75 6c 4d 69 6e 4b 65 79 53 69 7a 65 20 3d 20 >ulMinKeySize =
19b80 35 31 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 512;....pInfo->u
19b90 6c 4d 61 78 4b 65 79 53 69 7a 65 20 3d 20 38 31 lMaxKeySize = 81
19ba0 39 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 66 6c 92;....pInfo->fl
19bb0 61 67 73 20 3d 20 43 4b 46 5f 48 57 20 7c 20 43 ags = CKF_HW | C
19bc0 4b 46 5f 45 4e 43 52 59 50 54 20 7c 20 43 4b 46 KF_ENCRYPT | CKF
19bd0 5f 44 45 43 52 59 50 54 20 7c 20 43 4b 46 5f 53 _DECRYPT | CKF_S
19be0 49 47 4e 20 7c 20 43 4b 46 5f 56 45 52 49 46 59 IGN | CKF_VERIFY
19bf0 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 ;....break;...ca
19c00 73 65 20 43 4b 4d 5f 52 53 41 5f 58 5f 35 30 39 se CKM_RSA_X_509
19c10 3a 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 :....pInfo->ulMi
19c20 6e 4b 65 79 53 69 7a 65 20 3d 20 35 31 32 3b 0a nKeySize = 512;.
19c30 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 4b ...pInfo->ulMaxK
19c40 65 79 53 69 7a 65 20 3d 20 38 31 39 32 3b 0a 09 eySize = 8192;..
19c50 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d ..pInfo->flags =
19c60 20 43 4b 46 5f 48 57 20 7c 20 43 4b 46 5f 45 4e CKF_HW | CKF_EN
19c70 43 52 59 50 54 20 7c 20 43 4b 46 5f 44 45 43 52 CRYPT | CKF_DECR
19c80 59 50 54 20 7c 20 43 4b 46 5f 53 49 47 4e 20 7c YPT | CKF_SIGN |
19c90 20 43 4b 46 5f 56 45 52 49 46 59 3b 0a 09 09 09 CKF_VERIFY;....
19ca0 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 43 4b break;...case CK
19cb0 4d 5f 53 48 41 31 5f 52 53 41 5f 50 4b 43 53 3a M_SHA1_RSA_PKCS:
19cc0 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e ....pInfo->ulMin
19cd0 4b 65 79 53 69 7a 65 20 3d 20 35 31 32 3b 0a 09 KeySize = 512;..
19ce0 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 4b 65 ..pInfo->ulMaxKe
19cf0 79 53 69 7a 65 20 3d 20 38 31 39 32 3b 0a 09 09 ySize = 8192;...
19d00 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 .pInfo->flags =
19d10 43 4b 46 5f 48 57 20 7c 20 43 4b 46 5f 53 49 47 CKF_HW | CKF_SIG
19d20 4e 20 7c 20 43 4b 46 5f 56 45 52 49 46 59 3b 0a N | CKF_VERIFY;.
19d30 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 43 ...break;..}...C
19d40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
19d50 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b TF("Returning CK
19d60 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f R_OK (%i)", CKR_
19d70 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b OK);...return(CK
19d80 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 R_OK);.}../* We
19d90 64 6f 6e 27 74 20 73 75 70 70 6f 72 74 20 74 68 don't support th
19da0 69 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b is method. */.CK
19db0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e _DEFINE_FUNCTION
19dc0 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 54 6f (CK_RV, C_InitTo
19dd0 6b 65 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 ken)(CK_SLOT_ID
19de0 73 6c 6f 74 49 44 2c 20 43 4b 5f 55 54 46 38 43 slotID, CK_UTF8C
19df0 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b HAR_PTR pPin, CK
19e00 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 2c _ULONG ulPinLen,
19e10 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 CK_UTF8CHAR_PTR
19e20 20 70 4c 61 62 65 6c 29 20 7b 0a 09 43 41 43 4b pLabel) {..CACK
19e30 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
19e40 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 "Called.");...if
19e50 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 (!cackey_initia
19e60 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 lized) {...CACKE
19e70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
19e80 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 Error. Not init
19e90 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 ialized.");....r
19ea0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f eturn(CKR_CRYPTO
19eb0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a KI_NOT_INITIALIZ
19ec0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 ED);..}...CACKEY
19ed0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
19ee0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 54 4f 4b eturning CKR_TOK
19ef0 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 EN_WRITE_PROTECT
19f00 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 54 4f ED (%i)", CKR_TO
19f10 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 KEN_WRITE_PROTEC
19f20 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 TED);...return(C
19f30 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 KR_TOKEN_WRITE_P
19f40 52 4f 54 45 43 54 45 44 29 3b 0a 7d 0a 0a 2f 2a ROTECTED);.}../*
19f50 20 57 65 20 64 6f 6e 27 74 20 73 75 70 70 6f 72 We don't suppor
19f60 74 20 74 68 69 73 20 6d 65 74 68 6f 64 2e 20 2a t this method. *
19f70 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 /.CK_DEFINE_FUNC
19f80 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e TION(CK_RV, C_In
19f90 69 74 50 49 4e 29 28 43 4b 5f 53 45 53 53 49 4f itPIN)(CK_SESSIO
19fa0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f N_HANDLE hSessio
19fb0 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 n, CK_UTF8CHAR_P
19fc0 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e TR pPin, CK_ULON
19fd0 47 20 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09 43 G ulPinLen) {..C
19fe0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
19ff0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
1a000 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 .if (!cackey_ini
1a010 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 tialized) {...CA
1a020 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
1a030 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 F("Error. Not i
1a040 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a nitialized.");..
1a050 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 ..return(CKR_CRY
1a060 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 PTOKI_NOT_INITIA
1a070 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 LIZED);..}...CAC
1a080 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1a090 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f ("Returning CKR_
1a0a0 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 TOKEN_WRITE_PROT
1a0b0 45 43 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 ECTED (%i)", CKR
1a0c0 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f _TOKEN_WRITE_PRO
1a0d0 54 45 43 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 TECTED);...retur
1a0e0 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 n(CKR_TOKEN_WRIT
1a0f0 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 7d 0a E_PROTECTED);.}.
1a100 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73 75 70 ./* We don't sup
1a110 70 6f 72 74 20 74 68 69 73 20 6d 65 74 68 6f 64 port this method
1a120 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 . */.CK_DEFINE_F
1a130 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 UNCTION(CK_RV, C
1a140 5f 53 65 74 50 49 4e 29 28 43 4b 5f 53 45 53 53 _SetPIN)(CK_SESS
1a150 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 ION_HANDLE hSess
1a160 69 6f 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 ion, CK_UTF8CHAR
1a170 5f 50 54 52 20 70 4f 6c 64 50 69 6e 2c 20 43 4b _PTR pOldPin, CK
1a180 5f 55 4c 4f 4e 47 20 75 6c 4f 6c 64 50 69 6e 4c _ULONG ulOldPinL
1a190 65 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f en, CK_UTF8CHAR_
1a1a0 50 54 52 20 70 4e 65 77 50 69 6e 2c 20 43 4b 5f PTR pNewPin, CK_
1a1b0 55 4c 4f 4e 47 20 75 6c 4e 65 77 50 69 6e 4c 65 ULONG ulNewPinLe
1a1c0 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 n) {..CACKEY_DEB
1a1d0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
1a1e0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 d.");...if (!cac
1a1f0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 key_initialized)
1a200 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
1a210 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
1a220 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 Not initialize
1a230 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
1a240 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 CKR_CRYPTOKI_NOT
1a250 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 _INITIALIZED);..
1a260 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 }...CACKEY_DEBUG
1a270 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
1a280 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f ng CKR_FUNCTION_
1a290 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 NOT_SUPPORTED (%
1a2a0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f i)", CKR_FUNCTIO
1a2b0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 N_NOT_SUPPORTED)
1a2c0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 ;...return(CKR_F
1a2d0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
1a2e0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 ORTED);.}..CK_DE
1a2f0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b FINE_FUNCTION(CK
1a300 5f 52 56 2c 20 43 5f 4f 70 65 6e 53 65 73 73 69 _RV, C_OpenSessi
1a310 6f 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 on)(CK_SLOT_ID s
1a320 6c 6f 74 49 44 2c 20 43 4b 5f 46 4c 41 47 53 20 lotID, CK_FLAGS
1a330 66 6c 61 67 73 2c 20 43 4b 5f 56 4f 49 44 5f 50 flags, CK_VOID_P
1a340 54 52 20 70 41 70 70 6c 69 63 61 74 69 6f 6e 2c TR pApplication,
1a350 20 43 4b 5f 4e 4f 54 49 46 59 20 6e 6f 74 69 66 CK_NOTIFY notif
1a360 79 2c 20 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 y, CK_SESSION_HA
1a370 4e 44 4c 45 5f 50 54 52 20 70 68 53 65 73 73 69 NDLE_PTR phSessi
1a380 6f 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 on) {..unsigned
1a390 6c 6f 6e 67 20 69 64 78 3b 0a 09 69 6e 74 20 6d long idx;..int m
1a3a0 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e utex_retval;..in
1a3b0 74 20 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 20 t found_session
1a3c0 3d 20 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 = 0;...CACKEY_DE
1a3d0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
1a3e0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 66 6c ed.");...if ((fl
1a3f0 61 67 73 20 26 20 43 4b 46 5f 53 45 52 49 41 4c ags & CKF_SERIAL
1a400 5f 53 45 53 53 49 4f 4e 29 20 21 3d 20 43 4b 46 _SESSION) != CKF
1a410 5f 53 45 52 49 41 4c 5f 53 45 53 53 49 4f 4e 29 _SERIAL_SESSION)
1a420 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f {...return(CKR_
1a430 53 45 53 53 49 4f 4e 5f 50 41 52 41 4c 4c 45 4c SESSION_PARALLEL
1a440 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
1a450 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ..}...if (!cacke
1a460 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b y_initialized) {
1a470 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1a480 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
1a490 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e Not initialized.
1a4a0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
1a4b0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 R_CRYPTOKI_NOT_I
1a4c0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
1a4d0 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 ..if (slotID < 0
1a4e0 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 || slotID >= (s
1a4f0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f izeof(cackey_slo
1a500 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 ts) / sizeof(cac
1a510 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 key_slots[0])))
1a520 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
1a530 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
1a540 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 Invalid slot req
1a550 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 uested (%lu), ou
1a560 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 tside of valid r
1a570 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a ange", slotID);.
1a580 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c ...return(CKR_SL
1a590 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a OT_ID_INVALID);.
1a5a0 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 .}...mutex_retva
1a5b0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 l = cackey_mutex
1a5c0 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 _lock(cackey_big
1a5d0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 lock);..if (mute
1a5e0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b x_retval != 0) {
1a5f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1a600 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
1a610 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 Locking failed."
1a620 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
1a630 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b _GENERAL_ERROR);
1a640 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 ..}...if (cackey
1a650 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 _slots[slotID].a
1a660 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 ctive == 0) {...
1a670 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1a680 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 NTF("Error. Inva
1a690 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 lid slot request
1a6a0 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e ed (%lu), slot n
1a6b0 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 ot currently act
1a6c0 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a ive", slotID);..
1a6d0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 ..cackey_mutex_u
1a6e0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 nlock(cackey_big
1a6f0 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e lock);....return
1a700 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 (CKR_SLOT_ID_INV
1a710 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 ALID);..}.../* V
1a720 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63 erify that the c
1a730 61 72 64 20 69 73 20 61 63 74 75 61 6c 6c 79 20 ard is actually
1a740 69 6e 20 74 68 65 20 73 6c 6f 74 2e 20 2a 2f 0a in the slot. */.
1a750 09 2f 2a 20 58 58 58 3a 20 43 68 65 63 6b 20 74 ./* XXX: Check t
1a760 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 69 73 o make sure this
1a770 20 69 73 20 69 6e 20 74 68 65 20 50 4b 43 53 23 is in the PKCS#
1a780 31 31 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 11 specification
1a790 20 2a 2f 0a 09 69 66 20 28 63 61 63 6b 65 79 5f */..if (cackey_
1a7a0 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26 63 token_present(&c
1a7b0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 ackey_slots[slot
1a7c0 49 44 5d 29 20 21 3d 20 43 41 43 4b 45 59 5f 50 ID]) != CACKEY_P
1a7d0 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 CSC_S_TOKENPRESE
1a7e0 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 NT) {...CACKEY_D
1a7f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
1a800 6f 72 2e 20 20 43 61 72 64 20 6e 6f 74 20 70 72 or. Card not pr
1a810 65 73 65 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e esent. Returnin
1a820 67 20 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d g CKR_DEVICE_REM
1a830 4f 56 45 44 22 29 3b 0a 0a 09 09 63 61 63 6b 65 OVED");....cacke
1a840 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
1a850 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
1a860 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 44 45 ...return(CKR_DE
1a870 56 49 43 45 5f 52 45 4d 4f 56 45 44 29 3b 0a 09 VICE_REMOVED);..
1a880 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 31 }...for (idx = 1
1a890 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 ; idx < (sizeof(
1a8a0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 cackey_sessions)
1a8b0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 / sizeof(cackey
1a8c0 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 _sessions[0]));
1a8d0 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 21 idx++) {...if (!
1a8e0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
1a8f0 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 idx].active) {..
1a900 09 09 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 20 ..found_session
1a910 3d 20 31 3b 0a 0a 09 09 09 2a 70 68 53 65 73 73 = 1;.....*phSess
1a920 69 6f 6e 20 3d 20 69 64 78 3b 0a 0a 09 09 09 63 ion = idx;.....c
1a930 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 ackey_sessions[i
1a940 64 78 5d 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a dx].active = 1;.
1a950 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f ...cackey_sessio
1a960 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74 49 44 20 3d ns[idx].slotID =
1a970 20 73 6c 6f 74 49 44 3b 0a 09 09 09 63 61 63 6b slotID;....cack
1a980 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d ey_sessions[idx]
1a990 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f .state = CKS_RO_
1a9a0 50 55 42 4c 49 43 5f 53 45 53 53 49 4f 4e 3b 0a PUBLIC_SESSION;.
1a9b0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f ...cackey_sessio
1a9c0 6e 73 5b 69 64 78 5d 2e 66 6c 61 67 73 20 3d 20 ns[idx].flags =
1a9d0 66 6c 61 67 73 3b 0a 09 09 09 63 61 63 6b 65 79 flags;....cackey
1a9e0 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 75 _sessions[idx].u
1a9f0 6c 44 65 76 69 63 65 45 72 72 6f 72 20 3d 20 30 lDeviceError = 0
1aa00 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 ;....cackey_sess
1aa10 69 6f 6e 73 5b 69 64 78 5d 2e 70 41 70 70 6c 69 ions[idx].pAppli
1aa20 63 61 74 69 6f 6e 20 3d 20 70 41 70 70 6c 69 63 cation = pApplic
1aa30 61 74 69 6f 6e 3b 0a 09 09 09 63 61 63 6b 65 79 ation;....cackey
1aa40 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 4e _sessions[idx].N
1aa50 6f 74 69 66 79 20 3d 20 6e 6f 74 69 66 79 3b 0a otify = notify;.
1aa60 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 ....cackey_sessi
1aa70 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 ons[idx].identit
1aa80 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63 ies = NULL;....c
1aa90 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 ackey_sessions[i
1aaa0 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 dx].identities_c
1aab0 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 09 63 61 ount = 0;.....ca
1aac0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 ckey_sessions[id
1aad0 78 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 x].search_active
1aae0 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 = 0;.....cackey
1aaf0 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 _sessions[idx].s
1ab00 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a ign_active = 0;.
1ab10 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 ....cackey_sessi
1ab20 6f 6e 73 5b 69 64 78 5d 2e 64 65 63 72 79 70 74 ons[idx].decrypt
1ab30 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 _active = 0;....
1ab40 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 .cackey_sessions
1ab50 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 [idx].identities
1ab60 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 69 = cackey_read_i
1ab70 64 65 6e 74 69 74 69 65 73 28 26 63 61 63 6b 65 dentities(&cacke
1ab80 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c y_slots[slotID],
1ab90 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e &cackey_session
1aba0 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 s[idx].identitie
1abb0 73 5f 63 6f 75 6e 74 29 3b 0a 0a 0a 09 09 09 62 s_count);......b
1abc0 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d reak;...}..}...m
1abd0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 utex_retval = ca
1abe0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 ckey_mutex_unloc
1abf0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
1ac00 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 );..if (mutex_re
1ac10 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 tval != 0) {...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 55 6e 6c 6f TF("Error. Unlo
1ac40 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b cking failed.");
1ac50 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 ....return(CKR_G
1ac60 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 ENERAL_ERROR);..
1ac70 7d 0a 0a 09 69 66 20 28 21 66 6f 75 6e 64 5f 73 }...if (!found_s
1ac80 65 73 73 69 6f 6e 29 20 7b 0a 09 09 43 41 43 4b ession) {...CACK
1ac90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1aca0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 53 "Returning CKR_S
1acb0 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 20 28 25 69 ESSION_COUNT (%i
1acc0 29 22 2c 20 43 4b 52 5f 53 45 53 53 49 4f 4e 5f )", CKR_SESSION_
1acd0 43 4f 55 4e 54 29 3b 0a 0a 09 09 72 65 74 75 72 COUNT);....retur
1ace0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f n(CKR_SESSION_CO
1acf0 55 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 UNT);..}...CACKE
1ad00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1ad10 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b Returning CKR_OK
1ad20 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b (%i)", CKR_OK);
1ad30 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b ...return(CKR_OK
1ad40 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f );.}..CK_DEFINE_
1ad50 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 FUNCTION(CK_RV,
1ad60 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 29 28 C_CloseSession)(
1ad70 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c CK_SESSION_HANDL
1ad80 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 69 E hSession) {..i
1ad90 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b nt mutex_retval;
1ada0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1adb0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
1adc0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 );...if (!cackey
1add0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
1ade0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1adf0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e RINTF("Error. N
1ae00 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 ot initialized."
1ae10 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
1ae20 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e _CRYPTOKI_NOT_IN
1ae30 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
1ae40 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d .if (hSession ==
1ae50 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 0 || hSession >
1ae60 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 = (sizeof(cackey
1ae70 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a _sessions) / siz
1ae80 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 eof(cackey_sessi
1ae90 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 ons[0]))) {...CA
1aea0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
1aeb0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 F("Error. Sessi
1aec0 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e on out of range.
1aed0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 ");......return(
1aee0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 CKR_SESSION_HAND
1aef0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a LE_INVALID);..}.
1af00 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d ..mutex_retval =
1af10 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f cackey_mutex_lo
1af20 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
1af30 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 k);..if (mutex_r
1af40 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 etval != 0) {...
1af50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1af60 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 NTF("Error. Loc
1af70 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a king failed.");.
1af80 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 ...return(CKR_GE
1af90 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d NERAL_ERROR);..}
1afa0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 ...if (!cackey_s
1afb0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
1afc0 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 ].active) {...ca
1afd0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 ckey_mutex_unloc
1afe0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
1aff0 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 );....CACKEY_DEB
1b000 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
1b010 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 . Session not a
1b020 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 ctive.");......r
1b030 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f eturn(CKR_SESSIO
1b040 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 N_HANDLE_INVALID
1b050 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 );..}...cackey_s
1b060 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
1b070 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 63 ].active = 0;..c
1b080 61 63 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e 74 ackey_free_ident
1b090 69 74 69 65 73 28 63 61 63 6b 65 79 5f 73 65 73 ities(cackey_ses
1b0a0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
1b0b0 69 64 65 6e 74 69 74 69 65 73 2c 20 63 61 63 6b identities, cack
1b0c0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
1b0d0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 sion].identities
1b0e0 5f 63 6f 75 6e 74 29 3b 0a 0a 09 6d 75 74 65 78 _count);...mutex
1b0f0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 _retval = cackey
1b100 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 _mutex_unlock(ca
1b110 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 ckey_biglock);..
1b120 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c if (mutex_retval
1b130 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 != 0) {...CACKE
1b140 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1b150 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e Error. Unlockin
1b160 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 g failed.");....
1b170 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 return(CKR_GENER
1b180 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 AL_ERROR);..}...
1b190 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1b1a0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 NTF("Returning C
1b1b0 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 KR_OK (%i)", CKR
1b1c0 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 _OK);...return(C
1b1d0 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 KR_OK);.}..CK_DE
1b1e0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b FINE_FUNCTION(CK
1b1f0 5f 52 56 2c 20 43 5f 43 6c 6f 73 65 41 6c 6c 53 _RV, C_CloseAllS
1b200 65 73 73 69 6f 6e 73 29 28 43 4b 5f 53 4c 4f 54 essions)(CK_SLOT
1b210 5f 49 44 20 73 6c 6f 74 49 44 29 20 7b 0a 09 75 _ID slotID) {..u
1b220 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 09 69 6e int32_t idx;..in
1b230 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a t mutex_retval;.
1b240 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1b250 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
1b260 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f ;...if (!cackey_
1b270 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 initialized) {..
1b280 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1b290 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f INTF("Error. No
1b2a0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 t initialized.")
1b2b0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
1b2c0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 CRYPTOKI_NOT_INI
1b2d0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 TIALIZED);..}...
1b2e0 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c if (slotID < 0 |
1b2f0 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a | slotID >= (siz
1b300 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 eof(cackey_slots
1b310 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 ) / sizeof(cacke
1b320 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a y_slots[0]))) {.
1b330 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1b340 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e RINTF("Error. In
1b350 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 valid slot reque
1b360 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 sted (%lu), outs
1b370 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e ide of valid ran
1b380 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 ge", slotID);...
1b390 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 .return(CKR_SLOT
1b3a0 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d _ID_INVALID);..}
1b3b0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 ...mutex_retval
1b3c0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c = cackey_mutex_l
1b3d0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
1b3e0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f ck);..if (mutex_
1b3f0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 retval != 0) {..
1b400 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1b410 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f INTF("Error. Lo
1b420 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b cking failed.");
1b430 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 ....return(CKR_G
1b440 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 ENERAL_ERROR);..
1b450 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 }...if (cackey_s
1b460 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 lots[slotID].act
1b470 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 ive == 0) {...CA
1b480 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
1b490 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 F("Error. Invali
1b4a0 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 d slot requested
1b4b0 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 (%lu), slot not
1b4c0 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 currently activ
1b4d0 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 e", slotID);....
1b4e0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c cackey_mutex_unl
1b4f0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
1b500 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 ck);....return(C
1b510 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c KR_SLOT_ID_INVAL
1b520 49 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 ID);..}...for (i
1b530 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 dx = 0; idx < (s
1b540 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 izeof(cackey_ses
1b550 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 sions) / sizeof(
1b560 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
1b570 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 0])); idx++) {..
1b580 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 .if (cackey_sess
1b590 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 ions[idx].active
1b5a0 29 20 7b 0a 09 09 09 69 66 20 28 63 61 63 6b 65 ) {....if (cacke
1b5b0 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e y_sessions[idx].
1b5c0 73 6c 6f 74 49 44 20 21 3d 20 73 6c 6f 74 49 44 slotID != slotID
1b5d0 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 ) {.....continue
1b5e0 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 ;....}.....cacke
1b5f0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
1b600 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
1b610 09 09 09 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f ...C_CloseSessio
1b620 6e 28 69 64 78 29 3b 0a 09 09 09 63 61 63 6b 65 n(idx);....cacke
1b630 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 y_mutex_lock(cac
1b640 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 key_biglock);...
1b650 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 }..}...mutex_ret
1b660 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 val = cackey_mut
1b670 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 ex_unlock(cackey
1b680 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 _biglock);..if (
1b690 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 mutex_retval !=
1b6a0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 0) {...CACKEY_DE
1b6b0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
1b6c0 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 r. Unlocking fa
1b6d0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 iled.");....retu
1b6e0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 rn(CKR_GENERAL_E
1b6f0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b RROR);..}...CACK
1b700 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1b710 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f "Returning CKR_O
1b720 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 K (%i)", CKR_OK)
1b730 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f ;...return(CKR_O
1b740 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 K);.}..CK_DEFINE
1b750 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c _FUNCTION(CK_RV,
1b760 20 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e 66 C_GetSessionInf
1b770 6f 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 o)(CK_SESSION_HA
1b780 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 NDLE hSession, C
1b790 4b 5f 53 45 53 53 49 4f 4e 5f 49 4e 46 4f 5f 50 K_SESSION_INFO_P
1b7a0 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 69 6e 74 TR pInfo) {..int
1b7b0 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a mutex_retval;..
1b7c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1b7d0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
1b7e0 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 ...if (pInfo ==
1b7f0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 NULL) {...CACKEY
1b800 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
1b810 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e rror. pInfo is N
1b820 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 ULL.");....retur
1b830 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f n(CKR_ARGUMENTS_
1b840 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 BAD);..}...if (!
1b850 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a cackey_initializ
1b860 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...CACKEY_D
1b870 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
1b880 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c or. Not initial
1b890 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 ized.");....retu
1b8a0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f rn(CKR_CRYPTOKI_
1b8b0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 NOT_INITIALIZED)
1b8c0 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 ;..}...if (hSess
1b8d0 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 ion == 0 || hSes
1b8e0 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 sion >= (sizeof(
1b8f0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 cackey_sessions)
1b900 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 / sizeof(cackey
1b910 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 _sessions[0])))
1b920 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
1b930 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
1b940 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 Session out of
1b950 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 range.");......r
1b960 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f eturn(CKR_SESSIO
1b970 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 N_HANDLE_INVALID
1b980 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 );..}...mutex_re
1b990 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 tval = cackey_mu
1b9a0 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f tex_lock(cackey_
1b9b0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d biglock);..if (m
1b9c0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 utex_retval != 0
1b9d0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
1b9e0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
1b9f0 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 . Locking faile
1ba00 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
1ba10 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f CKR_GENERAL_ERRO
1ba20 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 R);..}...if (!ca
1ba30 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
1ba40 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 ession].active)
1ba50 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 {...cackey_mutex
1ba60 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 _unlock(cackey_b
1ba70 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b iglock);....CACK
1ba80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1ba90 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e "Error. Session
1baa0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a not active.");.
1bab0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f .....return(CKR_
1bac0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 SESSION_HANDLE_I
1bad0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 70 49 NVALID);..}...pI
1bae0 6e 66 6f 2d 3e 73 6c 6f 74 49 44 20 3d 20 63 61 nfo->slotID = ca
1baf0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
1bb00 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a ession].slotID;.
1bb10 09 70 49 6e 66 6f 2d 3e 73 74 61 74 65 20 3d 20 .pInfo->state =
1bb20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
1bb30 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65 3b hSession].state;
1bb40 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d ..pInfo->flags =
1bb50 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 cackey_sessions
1bb60 5b 68 53 65 73 73 69 6f 6e 5d 2e 66 6c 61 67 73 [hSession].flags
1bb70 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 44 65 76 69 ;..pInfo->ulDevi
1bb80 63 65 45 72 72 6f 72 20 3d 20 63 61 63 6b 65 79 ceError = cackey
1bb90 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
1bba0 6f 6e 5d 2e 75 6c 44 65 76 69 63 65 45 72 72 6f on].ulDeviceErro
1bbb0 72 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 r;...mutex_retva
1bbc0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 l = cackey_mutex
1bbd0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 _unlock(cackey_b
1bbe0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 iglock);..if (mu
1bbf0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 tex_retval != 0)
1bc00 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
1bc10 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
1bc20 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c Unlocking fail
1bc30 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
1bc40 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 (CKR_GENERAL_ERR
1bc50 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 OR);..}...CACKEY
1bc60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
1bc70 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 eturning CKR_OK
1bc80 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a (%i)", CKR_OK);.
1bc90 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 ..return(CKR_OK)
1bca0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 ;.}..CK_DEFINE_F
1bcb0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 UNCTION(CK_RV, C
1bcc0 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 _GetOperationSta
1bcd0 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 te)(CK_SESSION_H
1bce0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 ANDLE hSession,
1bcf0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4f 70 65 CK_BYTE_PTR pOpe
1bd00 72 61 74 69 6f 6e 53 74 61 74 65 2c 20 43 4b 5f rationState, CK_
1bd10 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4f 70 65 ULONG_PTR pulOpe
1bd20 72 61 74 69 6f 6e 53 74 61 74 65 4c 65 6e 29 20 rationStateLen)
1bd30 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f {..CACKEY_DEBUG_
1bd40 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
1bd50 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 );...if (!cackey
1bd60 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
1bd70 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1bd80 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e RINTF("Error. N
1bd90 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 ot initialized."
1bda0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
1bdb0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e _CRYPTOKI_NOT_IN
1bdc0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
1bdd0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1bde0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
1bdf0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
1be00 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 _SUPPORTED (%i)"
1be10 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e , CKR_FUNCTION_N
1be20 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a OT_SUPPORTED);..
1be30 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 .return(CKR_FUNC
1be40 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
1be50 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e ED);.}..CK_DEFIN
1be60 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 E_FUNCTION(CK_RV
1be70 2c 20 43 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e , C_SetOperation
1be80 53 74 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f State)(CK_SESSIO
1be90 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f N_HANDLE hSessio
1bea0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 n, CK_BYTE_PTR p
1beb0 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 2c 20 OperationState,
1bec0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 70 65 72 61 CK_ULONG ulOpera
1bed0 74 69 6f 6e 53 74 61 74 65 4c 65 6e 2c 20 43 4b tionStateLen, CK
1bee0 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 _OBJECT_HANDLE h
1bef0 45 6e 63 72 79 70 74 69 6f 6e 4b 65 79 2c 20 43 EncryptionKey, C
1bf00 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 K_OBJECT_HANDLE
1bf10 68 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 4b hAuthenticationK
1bf20 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 ey) {..CACKEY_DE
1bf30 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
1bf40 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 ed.");...if (!ca
1bf50 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 ckey_initialized
1bf60 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
1bf70 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
1bf80 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a . Not initializ
1bf90 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
1bfa0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f (CKR_CRYPTOKI_NO
1bfb0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a T_INITIALIZED);.
1bfc0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 .}...CACKEY_DEBU
1bfd0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
1bfe0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e ing CKR_FUNCTION
1bff0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 _NOT_SUPPORTED (
1c000 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 %i)", CKR_FUNCTI
1c010 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
1c020 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f );...return(CKR_
1c030 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
1c040 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 PORTED);.}..CK_D
1c050 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 EFINE_FUNCTION(C
1c060 4b 5f 52 56 2c 20 43 5f 4c 6f 67 69 6e 29 28 43 K_RV, C_Login)(C
1c070 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 K_SESSION_HANDLE
1c080 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 53 hSession, CK_US
1c090 45 52 5f 54 59 50 45 20 75 73 65 72 54 79 70 65 ER_TYPE userType
1c0a0 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 , CK_UTF8CHAR_PT
1c0b0 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 R pPin, CK_ULONG
1c0c0 20 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09 43 4b ulPinLen) {..CK
1c0d0 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b _SLOT_ID slotID;
1c0e0 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 ..int mutex_retv
1c0f0 61 6c 3b 0a 09 69 6e 74 20 74 72 69 65 73 5f 72 al;..int tries_r
1c100 65 6d 61 69 6e 69 6e 67 3b 0a 09 69 6e 74 20 6c emaining;..int l
1c110 6f 67 69 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b ogin_ret;...CACK
1c120 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1c130 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 "Called.");...if
1c140 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 (!cackey_initia
1c150 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 lized) {...CACKE
1c160 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1c170 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 Error. Not init
1c180 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 ialized.");....r
1c190 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f eturn(CKR_CRYPTO
1c1a0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a KI_NOT_INITIALIZ
1c1b0 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 ED);..}...if (hS
1c1c0 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 ession == 0 || h
1c1d0 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 Session >= (size
1c1e0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f of(cackey_sessio
1c1f0 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 ns) / sizeof(cac
1c200 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 key_sessions[0])
1c210 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 )) {...CACKEY_DE
1c220 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
1c230 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 r. Session out
1c240 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a of range.");....
1c250 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 ..return(CKR_SES
1c260 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 SION_HANDLE_INVA
1c270 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 LID);..}...if (u
1c280 73 65 72 54 79 70 65 20 21 3d 20 43 4b 55 5f 55 serType != CKU_U
1c290 53 45 52 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f SER) {...CACKEY_
1c2a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
1c2b0 72 6f 72 2e 20 20 57 65 20 6f 6e 6c 79 20 73 75 ror. We only su
1c2c0 70 70 6f 72 74 20 55 53 45 52 20 6d 6f 64 65 2c pport USER mode,
1c2d0 20 61 73 6b 65 64 20 66 6f 72 20 25 6c 75 20 6d asked for %lu m
1c2e0 6f 64 65 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 ode.", (unsigned
1c2f0 20 6c 6f 6e 67 29 20 75 73 65 72 54 79 70 65 29 long) userType)
1c300 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 55 ....return(CKR_U
1c310 53 45 52 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 SER_TYPE_INVALID
1c320 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 );..}...mutex_re
1c330 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 tval = cackey_mu
1c340 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f tex_lock(cackey_
1c350 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d biglock);..if (m
1c360 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 utex_retval != 0
1c370 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
1c380 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
1c390 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 . Locking faile
1c3a0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
1c3b0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f CKR_GENERAL_ERRO
1c3c0 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 R);..}...if (!ca
1c3d0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
1c3e0 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 ession].active)
1c3f0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 {...cackey_mutex
1c400 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 _unlock(cackey_b
1c410 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b iglock);....CACK
1c420 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1c430 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e "Error. Session
1c440 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a not active.");.
1c450 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f .....return(CKR_
1c460 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 SESSION_HANDLE_I
1c470 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 6c NVALID);..}...sl
1c480 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 otID = cackey_se
1c490 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
1c4a0 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 .slotID;...if (s
1c4b0 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f lotID < 0 || slo
1c4c0 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 tID >= (sizeof(c
1c4d0 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 ackey_slots) / s
1c4e0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f izeof(cackey_slo
1c4f0 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 ts[0]))) {...CAC
1c500 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1c510 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 ("Error. Invalid
1c520 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 slot requested
1c530 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f (%lu), outside o
1c540 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 f valid range",
1c550 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 slotID);....retu
1c560 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 rn(CKR_GENERAL_E
1c570 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 RROR);..}...if (
1c580 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f cackey_slots[slo
1c590 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 tID].active == 0
1c5a0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
1c5b0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
1c5c0 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 . Invalid slot r
1c5d0 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 equested (%lu),
1c5e0 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 slot not current
1c5f0 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 ly active", slot
1c600 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d ID);....cackey_m
1c610 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b utex_unlock(cack
1c620 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 ey_biglock);....
1c630 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 return(CKR_GENER
1c640 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 AL_ERROR);..}...
1c650 6c 6f 67 69 6e 5f 72 65 74 20 3d 20 63 61 63 6b login_ret = cack
1c660 65 79 5f 6c 6f 67 69 6e 28 26 63 61 63 6b 65 79 ey_login(&cackey
1c670 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 _slots[slotID],
1c680 70 50 69 6e 2c 20 75 6c 50 69 6e 4c 65 6e 2c 20 pPin, ulPinLen,
1c690 26 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 &tries_remaining
1c6a0 29 3b 0a 09 69 66 20 28 6c 6f 67 69 6e 5f 72 65 );..if (login_re
1c6b0 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 t != CACKEY_PCSC
1c6c0 5f 53 5f 4f 4b 29 20 7b 0a 09 09 63 61 63 6b 65 _S_OK) {...cacke
1c6d0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
1c6e0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
1c6f0 0a 09 09 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74 ...if (login_ret
1c700 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f == CACKEY_PCSC_
1c710 45 5f 4c 4f 43 4b 45 44 29 20 7b 0a 09 09 09 43 E_LOCKED) {....C
1c720 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1c730 54 46 28 22 45 72 72 6f 72 2e 20 20 54 6f 6b 65 TF("Error. Toke
1c740 6e 20 69 73 20 6c 6f 63 6b 65 64 2e 22 29 3b 0a n is locked.");.
1c750 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 ....cackey_slots
1c760 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 [slotID].token_f
1c770 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 55 53 45 52 lags |= CKF_USER
1c780 5f 50 49 4e 5f 4c 4f 43 4b 45 44 3b 0a 0a 09 09 _PIN_LOCKED;....
1c790 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f .return(CKR_PIN_
1c7a0 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d 20 65 6c 73 LOCKED);...} els
1c7b0 65 20 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20 e if (login_ret
1c7c0 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 == CACKEY_PCSC_E
1c7d0 5f 42 41 44 50 49 4e 29 20 7b 0a 09 09 09 43 41 _BADPIN) {....CA
1c7e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
1c7f0 46 28 22 45 72 72 6f 72 2e 20 20 49 6e 76 61 6c F("Error. Inval
1c800 69 64 20 50 49 4e 2e 22 29 3b 0a 0a 09 09 09 63 id PIN.");.....c
1c810 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 ackey_slots[slot
1c820 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 ID].token_flags
1c830 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f |= CKF_USER_PIN_
1c840 43 4f 55 4e 54 5f 4c 4f 57 3b 0a 0a 09 09 09 69 COUNT_LOW;.....i
1c850 66 20 28 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 f (tries_remaini
1c860 6e 67 20 3d 3d 20 31 29 20 7b 0a 09 09 09 09 63 ng == 1) {.....c
1c870 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 ackey_slots[slot
1c880 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 ID].token_flags
1c890 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f |= CKF_USER_PIN_
1c8a0 46 49 4e 41 4c 5f 54 52 59 3b 0a 09 09 09 7d 0a FINAL_TRY;....}.
1c8b0 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 ....return(CKR_P
1c8c0 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a 09 IN_INCORRECT);..
1c8d0 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 .}....CACKEY_DEB
1c8e0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
1c8f0 2e 20 20 55 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 . Unknown error
1c900 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 63 returned from c
1c910 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 29 20 28 25 ackey_login() (%
1c920 69 29 22 2c 20 6c 6f 67 69 6e 5f 72 65 74 29 3b i)", login_ret);
1c930 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 ....return(CKR_G
1c940 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 ENERAL_ERROR);..
1c950 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 }...cackey_slots
1c960 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 [slotID].token_f
1c970 6c 61 67 73 20 26 3d 20 7e 28 43 4b 46 5f 55 53 lags &= ~(CKF_US
1c980 45 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 20 7c 20 ER_PIN_LOCKED |
1c990 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 43 4f 55 CKF_USER_PIN_COU
1c9a0 4e 54 5f 4c 4f 57 20 7c 20 43 4b 46 5f 4c 4f 47 NT_LOW | CKF_LOG
1c9b0 49 4e 5f 52 45 51 55 49 52 45 44 20 7c 20 43 4b IN_REQUIRED | CK
1c9c0 46 5f 55 53 45 52 5f 50 49 4e 5f 46 49 4e 41 4c F_USER_PIN_FINAL
1c9d0 5f 54 52 59 29 3b 0a 0a 09 63 61 63 6b 65 79 5f _TRY);...cackey_
1c9e0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
1c9f0 6e 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 n].state = CKS_R
1ca00 4f 5f 55 53 45 52 5f 46 55 4e 43 54 49 4f 4e 53 O_USER_FUNCTIONS
1ca10 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c ;...mutex_retval
1ca20 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f = cackey_mutex_
1ca30 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 unlock(cackey_bi
1ca40 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 glock);..if (mut
1ca50 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 ex_retval != 0)
1ca60 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
1ca70 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
1ca80 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 Unlocking faile
1ca90 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
1caa0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f CKR_GENERAL_ERRO
1cab0 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f R);..}...CACKEY_
1cac0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
1cad0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 turning CKR_OK (
1cae0 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a %i)", CKR_OK);..
1caf0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b .return(CKR_OK);
1cb00 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 .}..CK_DEFINE_FU
1cb10 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f NCTION(CK_RV, C_
1cb20 4c 6f 67 6f 75 74 29 28 43 4b 5f 53 45 53 53 49 Logout)(CK_SESSI
1cb30 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 ON_HANDLE hSessi
1cb40 6f 6e 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 on) {..CK_SLOT_I
1cb50 44 20 73 6c 6f 74 49 44 3b 0a 09 69 6e 74 20 6d D slotID;..int m
1cb60 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 utex_retval;...C
1cb70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1cb80 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
1cb90 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 .if (!cackey_ini
1cba0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 tialized) {...CA
1cbb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
1cbc0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 F("Error. Not i
1cbd0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a nitialized.");..
1cbe0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 ..return(CKR_CRY
1cbf0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 PTOKI_NOT_INITIA
1cc00 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 LIZED);..}...if
1cc10 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c (hSession == 0 |
1cc20 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 | hSession >= (s
1cc30 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 izeof(cackey_ses
1cc40 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 sions) / sizeof(
1cc50 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
1cc60 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 0]))) {...CACKEY
1cc70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
1cc80 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f rror. Session o
1cc90 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a ut of range.");.
1cca0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f .....return(CKR_
1ccb0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 SESSION_HANDLE_I
1ccc0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 NVALID);..}...mu
1ccd0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 tex_retval = cac
1cce0 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 key_mutex_lock(c
1ccf0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
1cd00 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 .if (mutex_retva
1cd10 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b l != 0) {...CACK
1cd20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1cd30 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 "Error. Locking
1cd40 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 failed.");....r
1cd50 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 eturn(CKR_GENERA
1cd60 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 L_ERROR);..}...i
1cd70 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 f (!cackey_sessi
1cd80 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 ons[hSession].ac
1cd90 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 tive) {...cackey
1cda0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 _mutex_unlock(ca
1cdb0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a ckey_biglock);..
1cdc0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1cdd0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 RINTF("Error. S
1cde0 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 ession not activ
1cdf0 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 e.");......retur
1ce00 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 n(CKR_SESSION_HA
1ce10 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 NDLE_INVALID);..
1ce20 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 }...slotID = cac
1ce30 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
1ce40 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a ssion].slotID;..
1ce50 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 .if (slotID < 0
1ce60 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 || slotID >= (si
1ce70 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 zeof(cackey_slot
1ce80 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b s) / sizeof(cack
1ce90 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b ey_slots[0]))) {
1cea0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1ceb0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 PRINTF("Error. I
1cec0 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 nvalid slot requ
1ced0 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 ested (%lu), out
1cee0 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 side of valid ra
1cef0 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a nge", slotID);..
1cf00 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e ..return(CKR_GEN
1cf10 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a ERAL_ERROR);..}.
1cf20 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f ..if (cackey_slo
1cf30 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 ts[slotID].activ
1cf40 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b e == 0) {...CACK
1cf50 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1cf60 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 "Error. Invalid
1cf70 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 slot requested (
1cf80 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 %lu), slot not c
1cf90 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 urrently active"
1cfa0 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 , slotID);....ca
1cfb0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 ckey_mutex_unloc
1cfc0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
1cfd0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
1cfe0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b _GENERAL_ERROR);
1cff0 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 ..}...cackey_ses
1d000 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
1d010 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 50 state = CKS_RO_P
1d020 55 42 4c 49 43 5f 53 45 53 53 49 4f 4e 3b 0a 09 UBLIC_SESSION;..
1d030 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f cackey_slots[slo
1d040 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 tID].token_flags
1d050 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 = CKF_LOGIN_REQ
1d060 55 49 52 45 44 3b 0a 0a 09 6d 75 74 65 78 5f 72 UIRED;...mutex_r
1d070 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d etval = cackey_m
1d080 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b utex_unlock(cack
1d090 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 ey_biglock);..if
1d0a0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 (mutex_retval !
1d0b0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f = 0) {...CACKEY_
1d0c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
1d0d0 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 ror. Unlocking
1d0e0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 failed.");....re
1d0f0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c turn(CKR_GENERAL
1d100 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 _ERROR);..}...CA
1d110 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
1d120 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 F("Returning CKR
1d130 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f _OK (%i)", CKR_O
1d140 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 K);...return(CKR
1d150 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 _OK);.}..CK_DEFI
1d160 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 NE_FUNCTION(CK_R
1d170 56 2c 20 43 5f 43 72 65 61 74 65 4f 62 6a 65 63 V, C_CreateObjec
1d180 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 t)(CK_SESSION_HA
1d190 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 NDLE hSession, C
1d1a0 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 K_ATTRIBUTE_PTR
1d1b0 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c pTemplate, CK_UL
1d1c0 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f ONG ulCount, CK_
1d1d0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 OBJECT_HANDLE_PT
1d1e0 52 20 70 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43 R phObject) {..C
1d1f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1d200 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
1d210 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 .if (!cackey_ini
1d220 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 tialized) {...CA
1d230 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
1d240 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 F("Error. Not i
1d250 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a nitialized.");..
1d260 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 ..return(CKR_CRY
1d270 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 PTOKI_NOT_INITIA
1d280 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 LIZED);..}...CAC
1d290 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1d2a0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f ("Returning CKR_
1d2b0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
1d2c0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b PORTED (%i)", CK
1d2d0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
1d2e0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 UPPORTED);...ret
1d2f0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e urn(CKR_FUNCTION
1d300 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
1d310 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 .}..CK_DEFINE_FU
1d320 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f NCTION(CK_RV, C_
1d330 43 6f 70 79 4f 62 6a 65 63 74 29 28 43 4b 5f 53 CopyObject)(CK_S
1d340 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 ESSION_HANDLE hS
1d350 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 ession, CK_OBJEC
1d360 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 T_HANDLE hObject
1d370 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 , CK_ATTRIBUTE_P
1d380 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b TR pTemplate, CK
1d390 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 _ULONG ulCount,
1d3a0 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 CK_OBJECT_HANDLE
1d3b0 5f 50 54 52 20 70 68 4e 65 77 4f 62 6a 65 63 74 _PTR phNewObject
1d3c0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 ) {..CACKEY_DEBU
1d3d0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 G_PRINTF("Called
1d3e0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b .");...if (!cack
1d3f0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 ey_initialized)
1d400 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
1d410 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
1d420 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 Not initialized
1d430 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
1d440 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f KR_CRYPTOKI_NOT_
1d450 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d INITIALIZED);..}
1d460 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1d470 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e PRINTF("Returnin
1d480 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e g CKR_FUNCTION_N
1d490 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 OT_SUPPORTED (%i
1d4a0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e )", CKR_FUNCTION
1d4b0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
1d4c0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 ...return(CKR_FU
1d4d0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
1d4e0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 RTED);.}..CK_DEF
1d4f0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f INE_FUNCTION(CK_
1d500 52 56 2c 20 43 5f 44 65 73 74 72 6f 79 4f 62 6a RV, C_DestroyObj
1d510 65 63 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f ect)(CK_SESSION_
1d520 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c HANDLE hSession,
1d530 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c CK_OBJECT_HANDL
1d540 45 20 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 E hObject) {..CA
1d550 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
1d560 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
1d570 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 if (!cackey_init
1d580 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 ialized) {...CAC
1d590 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1d5a0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e ("Error. Not in
1d5b0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 itialized.");...
1d5c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 .return(CKR_CRYP
1d5d0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c TOKI_NOT_INITIAL
1d5e0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b IZED);..}...CACK
1d5f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1d600 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 "Returning CKR_F
1d610 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
1d620 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 ORTED (%i)", CKR
1d630 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
1d640 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 PPORTED);...retu
1d650 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f rn(CKR_FUNCTION_
1d660 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
1d670 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e }..CK_DEFINE_FUN
1d680 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 CTION(CK_RV, C_G
1d690 65 74 4f 62 6a 65 63 74 53 69 7a 65 29 28 43 4b etObjectSize)(CK
1d6a0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 _SESSION_HANDLE
1d6b0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a hSession, CK_OBJ
1d6c0 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 ECT_HANDLE hObje
1d6d0 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 ct, CK_ULONG_PTR
1d6e0 20 70 75 6c 53 69 7a 65 29 20 7b 0a 09 43 41 43 pulSize) {..CAC
1d6f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1d700 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 ("Called.");...i
1d710 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 f (!cackey_initi
1d720 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b alized) {...CACK
1d730 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1d740 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 "Error. Not ini
1d750 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 tialized.");....
1d760 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 return(CKR_CRYPT
1d770 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 OKI_NOT_INITIALI
1d780 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 ZED);..}...CACKE
1d790 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1d7a0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 Returning CKR_FU
1d7b0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
1d7c0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f RTED (%i)", CKR_
1d7d0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
1d7e0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 PORTED);...retur
1d7f0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e n(CKR_FUNCTION_N
1d800 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d OT_SUPPORTED);.}
1d810 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 ..CK_DEFINE_FUNC
1d820 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 TION(CK_RV, C_Ge
1d830 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 29 tAttributeValue)
1d840 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 (CK_SESSION_HAND
1d850 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f LE hSession, CK_
1d860 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f OBJECT_HANDLE hO
1d870 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 42 bject, CK_ATTRIB
1d880 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 UTE_PTR pTemplat
1d890 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f e, CK_ULONG ulCo
1d8a0 75 6e 74 29 20 7b 0a 09 43 4b 5f 41 54 54 52 49 unt) {..CK_ATTRI
1d8b0 42 55 54 45 20 2a 63 75 72 72 5f 61 74 74 72 3b BUTE *curr_attr;
1d8c0 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f ..struct cackey_
1d8d0 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 identity *identi
1d8e0 74 79 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f ty;..unsigned lo
1d8f0 6e 67 20 69 64 65 6e 74 69 74 79 5f 69 64 78 2c ng identity_idx,
1d900 20 61 74 74 72 5f 69 64 78 2c 20 73 65 73 73 5f attr_idx, sess_
1d910 61 74 74 72 5f 69 64 78 2c 20 6e 75 6d 5f 69 64 attr_idx, num_id
1d920 73 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 s;..int mutex_re
1d930 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 72 65 74 tval;..CK_RV ret
1d940 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 43 val = CKR_OK;..C
1d950 4b 5f 56 4f 49 44 5f 50 54 52 20 70 56 61 6c 75 K_VOID_PTR pValu
1d960 65 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56 e;..CK_ULONG ulV
1d970 61 6c 75 65 4c 65 6e 3b 0a 0a 09 43 41 43 4b 45 alueLen;...CACKE
1d980 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1d990 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 Called.");...if
1d9a0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c (!cackey_initial
1d9b0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 ized) {...CACKEY
1d9c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
1d9d0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 rror. Not initi
1d9e0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 alized.");....re
1d9f0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b turn(CKR_CRYPTOK
1da00 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 I_NOT_INITIALIZE
1da10 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 D);..}...if (hSe
1da20 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 ssion == 0 || hS
1da30 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f ession >= (sizeo
1da40 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e f(cackey_session
1da50 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b s) / sizeof(cack
1da60 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 ey_sessions[0]))
1da70 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
1da80 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
1da90 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f . Session out o
1daa0 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 f range.");.....
1dab0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 .return(CKR_SESS
1dac0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c ION_HANDLE_INVAL
1dad0 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4f ID);..}...if (hO
1dae0 62 6a 65 63 74 20 3d 3d 20 30 29 20 7b 0a 09 09 bject == 0) {...
1daf0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1db00 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4f 62 6a NTF("Error. Obj
1db10 65 63 74 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f ect handle out o
1db20 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 f range.");.....
1db30 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 .return(CKR_OBJE
1db40 43 54 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 CT_HANDLE_INVALI
1db50 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 43 D);..}...if (ulC
1db60 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 2f ount == 0) {.../
1db70 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69 74 2c * Short circuit,
1db80 20 69 66 20 7a 65 72 6f 20 6f 62 6a 65 63 74 73 if zero objects
1db90 20 77 65 72 65 20 73 70 65 63 69 66 69 65 64 20 were specified
1dba0 72 65 74 75 72 6e 20 7a 65 72 6f 20 69 74 65 6d return zero item
1dbb0 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a 2f s immediately */
1dbc0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1dbd0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e PRINTF("Returnin
1dbe0 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 g CKR_OK (%i) (s
1dbf0 68 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c 20 hort circuit)",
1dc00 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 CKR_OK);....retu
1dc10 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a rn(CKR_OK);..}..
1dc20 09 69 66 20 28 70 54 65 6d 70 6c 61 74 65 20 3d .if (pTemplate =
1dc30 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b = NULL) {...CACK
1dc40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1dc50 22 45 72 72 6f 72 2e 20 20 70 54 65 6d 70 6c 61 "Error. pTempla
1dc60 74 65 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a te is NULL.");..
1dc70 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 ..return(CKR_ARG
1dc80 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a UMENTS_BAD);..}.
1dc90 0a 09 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3d ..identity_idx =
1dca0 20 68 4f 62 6a 65 63 74 20 2d 20 31 3b 0a 0a 09 hObject - 1;...
1dcb0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 mutex_retval = c
1dcc0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b ackey_mutex_lock
1dcd0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 (cackey_biglock)
1dce0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 ;..if (mutex_ret
1dcf0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 val != 0) {...CA
1dd00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
1dd10 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 F("Error. Locki
1dd20 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 ng failed.");...
1dd30 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 .return(CKR_GENE
1dd40 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a RAL_ERROR);..}..
1dd50 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 .if (!cackey_ses
1dd60 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
1dd70 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b active) {...cack
1dd80 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 ey_mutex_unlock(
1dd90 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
1dda0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
1ddb0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
1ddc0 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 Session not act
1ddd0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 ive.");......ret
1dde0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f urn(CKR_SESSION_
1ddf0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b HANDLE_INVALID);
1de00 0a 09 7d 0a 0a 09 6e 75 6d 5f 69 64 73 20 3d 20 ..}...num_ids =
1de10 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
1de20 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 hSession].identi
1de30 74 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69 66 ties_count;...if
1de40 20 28 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3e (identity_idx >
1de50 3d 20 6e 75 6d 5f 69 64 73 29 20 7b 0a 09 09 63 = num_ids) {...c
1de60 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f ackey_mutex_unlo
1de70 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
1de80 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 k);....CACKEY_DE
1de90 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
1dea0 72 2e 20 20 4f 62 6a 65 63 74 20 68 61 6e 64 6c r. Object handl
1deb0 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 e out of range.
1dec0 20 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3d 20 identity_idx =
1ded0 25 6c 75 2c 20 6e 75 6d 5f 69 64 73 20 3d 20 25 %lu, num_ids = %
1dee0 6c 75 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 lu.", (unsigned
1def0 6c 6f 6e 67 29 20 69 64 65 6e 74 69 74 79 5f 69 long) identity_i
1df00 64 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f dx, (unsigned lo
1df10 6e 67 29 20 6e 75 6d 5f 69 64 73 29 3b 0a 0a 09 ng) num_ids);...
1df20 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 .return(CKR_OBJE
1df30 43 54 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 CT_HANDLE_INVALI
1df40 44 29 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74 69 74 D);..}...identit
1df50 79 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 y = &cackey_sess
1df60 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 ions[hSession].i
1df70 64 65 6e 74 69 74 69 65 73 5b 69 64 65 6e 74 69 dentities[identi
1df80 74 79 5f 69 64 78 5d 3b 0a 0a 09 66 6f 72 20 28 ty_idx];...for (
1df90 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 61 74 attr_idx = 0; at
1dfa0 74 72 5f 69 64 78 20 3c 20 75 6c 43 6f 75 6e 74 tr_idx < ulCount
1dfb0 3b 20 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a ; attr_idx++) {.
1dfc0 09 09 63 75 72 72 5f 61 74 74 72 20 3d 20 26 70 ..curr_attr = &p
1dfd0 54 65 6d 70 6c 61 74 65 5b 61 74 74 72 5f 69 64 Template[attr_id
1dfe0 78 5d 3b 0a 0a 09 09 70 56 61 6c 75 65 20 3d 20 x];....pValue =
1dff0 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65 4c NULL;...ulValueL
1e000 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d en = (CK_LONG) -
1e010 31 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 1;....CACKEY_DEB
1e020 55 47 5f 50 52 49 4e 54 46 28 22 4c 6f 6f 6b 69 UG_PRINTF("Looki
1e030 6e 67 20 66 6f 72 20 61 74 74 72 69 62 75 74 65 ng for attribute
1e040 20 30 78 25 30 38 6c 78 20 28 69 64 65 6e 74 69 0x%08lx (identi
1e050 74 79 3a 25 6c 75 29 20 2e 2e 2e 22 2c 20 28 75 ty:%lu) ...", (u
1e060 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 nsigned long) cu
1e070 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 2c 20 28 rr_attr->type, (
1e080 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 unsigned long) i
1e090 64 65 6e 74 69 74 79 5f 69 64 78 29 3b 0a 0a 09 dentity_idx);...
1e0a0 09 66 6f 72 20 28 73 65 73 73 5f 61 74 74 72 5f .for (sess_attr_
1e0b0 69 64 78 20 3d 20 30 3b 20 73 65 73 73 5f 61 74 idx = 0; sess_at
1e0c0 74 72 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74 tr_idx < identit
1e0d0 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5f 63 6f y->attributes_co
1e0e0 75 6e 74 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 unt; sess_attr_i
1e0f0 64 78 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28 69 dx++) {....if (i
1e100 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 dentity->attribu
1e110 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 tes[sess_attr_id
1e120 78 5d 2e 74 79 70 65 20 3d 3d 20 63 75 72 72 5f x].type == curr_
1e130 61 74 74 72 2d 3e 74 79 70 65 29 20 7b 0a 09 09 attr->type) {...
1e140 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1e150 52 49 4e 54 46 28 22 20 2e 2e 2e 20 66 6f 75 6e RINTF(" ... foun
1e160 64 20 69 74 2c 20 70 56 61 6c 75 65 20 3d 20 25 d it, pValue = %
1e170 70 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 p, ulValueLen =
1e180 25 6c 75 22 2c 20 69 64 65 6e 74 69 74 79 2d 3e %lu", identity->
1e190 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f attributes[sess_
1e1a0 61 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 attr_idx].pValue
1e1b0 2c 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 , identity->attr
1e1c0 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 ibutes[sess_attr
1e1d0 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e _idx].ulValueLen
1e1e0 29 3b 0a 09 09 09 09 0a 09 09 09 09 70 56 61 6c );..........pVal
1e1f0 75 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 61 ue = identity->a
1e200 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 ttributes[sess_a
1e210 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 3b ttr_idx].pValue;
1e220 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 .....ulValueLen
1e230 3d 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 = identity->attr
1e240 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 ibutes[sess_attr
1e250 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e _idx].ulValueLen
1e260 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 ;....}...}....if
1e270 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 (curr_attr->pVa
1e280 6c 75 65 20 26 26 20 70 56 61 6c 75 65 29 20 7b lue && pValue) {
1e290 0a 09 09 09 69 66 20 28 63 75 72 72 5f 61 74 74 ....if (curr_att
1e2a0 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d r->ulValueLen >=
1e2b0 20 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 ulValueLen) {..
1e2c0 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61 ...memcpy(curr_a
1e2d0 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20 70 56 61 ttr->pValue, pVa
1e2e0 6c 75 65 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 29 lue, ulValueLen)
1e2f0 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 ;....} else {...
1e300 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 ..ulValueLen = (
1e310 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 CK_LONG) -1;....
1e320 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 ..retval = CKR_B
1e330 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b UFFER_TOO_SMALL;
1e340 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 75 72 ....}...}....cur
1e350 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c r_attr->ulValueL
1e360 65 6e 20 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 3b en = ulValueLen;
1e370 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 ..}...mutex_retv
1e380 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 al = cackey_mute
1e390 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
1e3a0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d biglock);..if (m
1e3b0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 utex_retval != 0
1e3c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
1e3d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
1e3e0 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 . Unlocking fai
1e3f0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 led.");....retur
1e400 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 n(CKR_GENERAL_ER
1e410 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 ROR);..}...if (r
1e420 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 41 54 54 etval == CKR_ATT
1e430 52 49 42 55 54 45 5f 54 59 50 45 5f 49 4e 56 41 RIBUTE_TYPE_INVA
1e440 4c 49 44 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f LID) {...CACKEY_
1e450 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
1e460 74 75 72 6e 69 6e 67 20 43 4b 52 5f 41 54 54 52 turning CKR_ATTR
1e470 49 42 55 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c IBUTE_TYPE_INVAL
1e480 49 44 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20 ID (%i)", (int)
1e490 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 retval);..} else
1e4a0 20 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 43 if (retval == C
1e4b0 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d KR_BUFFER_TOO_SM
1e4c0 41 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f ALL) {...CACKEY_
1e4d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
1e4e0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 42 55 46 46 turning CKR_BUFF
1e4f0 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28 25 69 ER_TOO_SMALL (%i
1e500 29 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c )", (int) retval
1e510 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 72 );..} else if (r
1e520 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 4f 4b 29 etval == CKR_OK)
1e530 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
1e540 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
1e550 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 ing CKR_OK (%i)"
1e560 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b , (int) retval);
1e570 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43 ..} else {...CAC
1e580 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1e590 28 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c ("Returning %i",
1e5a0 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a (int) retval);.
1e5b0 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 .}...return(retv
1e5c0 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e al);.}..CK_DEFIN
1e5d0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 E_FUNCTION(CK_RV
1e5e0 2c 20 43 5f 53 65 74 41 74 74 72 69 62 75 74 65 , C_SetAttribute
1e5f0 56 61 6c 75 65 29 28 43 4b 5f 53 45 53 53 49 4f Value)(CK_SESSIO
1e600 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f N_HANDLE hSessio
1e610 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e n, CK_OBJECT_HAN
1e620 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f DLE hObject, CK_
1e630 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 ATTRIBUTE_PTR pT
1e640 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e emplate, CK_ULON
1e650 47 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41 G ulCount) {..CA
1e660 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
1e670 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
1e680 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 if (!cackey_init
1e690 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 ialized) {...CAC
1e6a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1e6b0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e ("Error. Not in
1e6c0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 itialized.");...
1e6d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 .return(CKR_CRYP
1e6e0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c TOKI_NOT_INITIAL
1e6f0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b IZED);..}...CACK
1e700 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1e710 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 "Returning CKR_F
1e720 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
1e730 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 ORTED (%i)", CKR
1e740 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
1e750 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 PPORTED);...retu
1e760 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f rn(CKR_FUNCTION_
1e770 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
1e780 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e }..CK_DEFINE_FUN
1e790 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 CTION(CK_RV, C_F
1e7a0 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 29 28 indObjectsInit)(
1e7b0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c CK_SESSION_HANDL
1e7c0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 41 E hSession, CK_A
1e7d0 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 TTRIBUTE_PTR pTe
1e7e0 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 mplate, CK_ULONG
1e7f0 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f ulCount) {..CK_
1e800 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a SLOT_ID slotID;.
1e810 09 43 4b 5f 55 4c 4f 4e 47 20 69 64 78 3b 0a 09 .CK_ULONG idx;..
1e820 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c int mutex_retval
1e830 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ;...CACKEY_DEBUG
1e840 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
1e850 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ");...if (!cacke
1e860 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b y_initialized) {
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 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e Not initialized.
1e8a0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
1e8b0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 R_CRYPTOKI_NOT_I
1e8c0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
1e8d0 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d ..if (hSession =
1e8e0 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 = 0 || hSession
1e8f0 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 >= (sizeof(cacke
1e900 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 y_sessions) / si
1e910 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 zeof(cackey_sess
1e920 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 ions[0]))) {...C
1e930 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1e940 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 TF("Error. Sess
1e950 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 ion out of range
1e960 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e .");......return
1e970 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e (CKR_SESSION_HAN
1e980 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d DLE_INVALID);..}
1e990 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 ...mutex_retval
1e9a0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c = cackey_mutex_l
1e9b0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
1e9c0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f ck);..if (mutex_
1e9d0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 retval != 0) {..
1e9e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1e9f0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f INTF("Error. Lo
1ea00 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b cking failed.");
1ea10 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 ....return(CKR_G
1ea20 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 ENERAL_ERROR);..
1ea30 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f }...if (!cackey_
1ea40 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
1ea50 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 n].active) {...c
1ea60 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f ackey_mutex_unlo
1ea70 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
1ea80 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 k);....CACKEY_DE
1ea90 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
1eaa0 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 r. Session not
1eab0 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 active.");......
1eac0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 return(CKR_SESSI
1ead0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 ON_HANDLE_INVALI
1eae0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 D);..}...if (cac
1eaf0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
1eb00 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 ssion].search_ac
1eb10 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 tive) {...cackey
1eb20 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 _mutex_unlock(ca
1eb30 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a ckey_biglock);..
1eb40 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1eb50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 RINTF("Error. S
1eb60 65 61 72 63 68 20 61 6c 72 65 61 64 79 20 61 63 earch already ac
1eb70 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 tive.");......re
1eb80 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 turn(CKR_OPERATI
1eb90 4f 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a ON_ACTIVE);..}..
1eba0 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 .slotID = cackey
1ebb0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
1ebc0 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 on].slotID;...if
1ebd0 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 (slotID < 0 ||
1ebe0 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f slotID >= (sizeo
1ebf0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 f(cackey_slots)
1ec00 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f / sizeof(cackey_
1ec10 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 slots[0]))) {...
1ec20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1ec30 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 NTF("Error. Inva
1ec40 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 lid slot request
1ec50 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 ed (%lu), outsid
1ec60 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 e of valid range
1ec70 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 ", slotID);....r
1ec80 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 eturn(CKR_GENERA
1ec90 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 L_ERROR);..}...i
1eca0 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b f (cackey_slots[
1ecb0 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d slotID].active =
1ecc0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f = 0) {...CACKEY_
1ecd0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
1ece0 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f ror. Invalid slo
1ecf0 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 t requested (%lu
1ed00 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 ), slot not curr
1ed10 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 ently active", s
1ed20 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 lotID);....cacke
1ed30 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
1ed40 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
1ed50 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 ...return(CKR_GE
1ed60 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d NERAL_ERROR);..}
1ed70 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c ...if (cackey_sl
1ed80 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c 6f 74 ots[slotID].slot
1ed90 5f 72 65 73 65 74 29 20 7b 0a 09 09 43 41 43 4b _reset) {...CACK
1eda0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1edb0 22 54 68 65 20 73 6c 6f 74 20 68 61 73 20 62 65 "The slot has be
1edc0 65 6e 20 72 65 73 65 74 20 73 69 6e 63 65 20 77 en reset since w
1edd0 65 20 6c 61 73 74 20 6c 6f 6f 6b 65 64 20 66 6f e last looked fo
1ede0 72 20 69 64 65 6e 74 69 74 69 65 73 20 2d 2d 20 r identities --
1edf0 72 65 73 63 61 6e 6e 69 6e 67 22 29 3b 0a 0a 09 rescanning");...
1ee00 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 .if (cackey_sess
1ee10 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 ions[hSession].i
1ee20 64 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c dentities != NUL
1ee30 4c 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 66 L) {....cackey_f
1ee40 72 65 65 5f 69 64 65 6e 74 69 74 69 65 73 28 63 ree_identities(c
1ee50 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
1ee60 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 Session].identit
1ee70 69 65 73 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 ies, cackey_sess
1ee80 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 ions[hSession].i
1ee90 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 dentities_count)
1eea0 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 ;.....cackey_ses
1eeb0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
1eec0 69 64 65 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c identities = NUL
1eed0 4c 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 L;....cackey_ses
1eee0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
1eef0 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 identities_count
1ef00 20 3d 20 30 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 = 0;...}....if
1ef10 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c (cackey_slots[sl
1ef20 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 21 3d 20 4e otID].label != N
1ef30 55 4c 4c 29 20 7b 0a 09 09 09 66 72 65 65 28 63 ULL) {....free(c
1ef40 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 ackey_slots[slot
1ef50 49 44 5d 2e 6c 61 62 65 6c 29 3b 0a 09 09 09 63 ID].label);....c
1ef60 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 ackey_slots[slot
1ef70 49 44 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c ID].label = NULL
1ef80 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f ;...}....cackey_
1ef90 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 mark_slot_reset(
1efa0 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c &cackey_slots[sl
1efb0 6f 74 49 44 5d 29 3b 0a 09 7d 0a 0a 09 69 66 20 otID]);..}...if
1efc0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 (cackey_sessions
1efd0 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 [hSession].ident
1efe0 69 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b ities == NULL) {
1eff0 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f ...cackey_sessio
1f000 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 ns[hSession].ide
1f010 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 ntities = cackey
1f020 5f 72 65 61 64 5f 69 64 65 6e 74 69 74 69 65 73 _read_identities
1f030 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 (&cackey_slots[s
1f040 6c 6f 74 49 44 5d 2c 20 26 63 61 63 6b 65 79 5f lotID], &cackey_
1f050 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
1f060 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f n].identities_co
1f070 75 6e 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 unt);..}...if (p
1f080 54 65 6d 70 6c 61 74 65 20 21 3d 20 4e 55 4c 4c Template != NULL
1f090 29 20 7b 0a 09 09 69 66 20 28 75 6c 43 6f 75 6e ) {...if (ulCoun
1f0a0 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 63 61 63 t != 0) {....cac
1f0b0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
1f0c0 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 ssion].search_qu
1f0d0 65 72 79 5f 63 6f 75 6e 74 20 3d 20 75 6c 43 6f ery_count = ulCo
1f0e0 75 6e 74 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 unt;....cackey_s
1f0f0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
1f100 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 20 3d ].search_query =
1f110 20 6d 61 6c 6c 6f 63 28 75 6c 43 6f 75 6e 74 20 malloc(ulCount
1f120 2a 20 73 69 7a 65 6f 66 28 2a 70 54 65 6d 70 6c * sizeof(*pTempl
1f130 61 74 65 29 29 3b 0a 0a 09 09 09 6d 65 6d 63 70 ate));.....memcp
1f140 79 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e y(cackey_session
1f150 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 s[hSession].sear
1f160 63 68 5f 71 75 65 72 79 2c 20 70 54 65 6d 70 6c ch_query, pTempl
1f170 61 74 65 2c 20 75 6c 43 6f 75 6e 74 20 2a 20 73 ate, ulCount * s
1f180 69 7a 65 6f 66 28 2a 70 54 65 6d 70 6c 61 74 65 izeof(*pTemplate
1f190 29 29 3b 0a 09 09 09 66 6f 72 20 28 69 64 78 20 ));....for (idx
1f1a0 3d 20 30 3b 20 69 64 78 20 3c 20 75 6c 43 6f 75 = 0; idx < ulCou
1f1b0 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 09 nt; idx++) {....
1f1c0 09 69 66 20 28 70 54 65 6d 70 6c 61 74 65 5b 69 .if (pTemplate[i
1f1d0 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d dx].ulValueLen =
1f1e0 3d 20 30 29 20 7b 0a 09 09 09 09 09 63 61 63 6b = 0) {......cack
1f1f0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
1f200 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 sion].search_que
1f210 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 20 3d ry[idx].pValue =
1f220 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09 63 6f 6e NULL;.......con
1f230 74 69 6e 75 65 3b 0a 09 09 09 09 7d 0a 0a 09 09 tinue;.....}....
1f240 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e ..cackey_session
1f250 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 s[hSession].sear
1f260 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 ch_query[idx].pV
1f270 61 6c 75 65 20 3d 20 6d 61 6c 6c 6f 63 28 70 54 alue = malloc(pT
1f280 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 75 6c 56 emplate[idx].ulV
1f290 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 69 alueLen);......i
1f2a0 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f f (cackey_sessio
1f2b0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 ns[hSession].sea
1f2c0 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 rch_query[idx].p
1f2d0 56 61 6c 75 65 29 20 7b 0a 09 09 09 09 09 6d 65 Value) {......me
1f2e0 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 65 73 73 mcpy(cackey_sess
1f2f0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 ions[hSession].s
1f300 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d earch_query[idx]
1f310 2e 70 56 61 6c 75 65 2c 20 70 54 65 6d 70 6c 61 .pValue, pTempla
1f320 74 65 5b 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 te[idx].pValue,
1f330 70 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 75 pTemplate[idx].u
1f340 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 09 lValueLen);.....
1f350 7d 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 }....}...} else
1f360 7b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 {....cackey_sess
1f370 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 ions[hSession].s
1f380 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e earch_query_coun
1f390 74 20 3d 20 30 3b 0a 09 09 09 63 61 63 6b 65 79 t = 0;....cackey
1f3a0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
1f3b0 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 on].search_query
1f3c0 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 20 = NULL;...}..}
1f3d0 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 75 6c 43 else {...if (ulC
1f3e0 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 ount != 0) {....
1f3f0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c cackey_mutex_unl
1f400 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
1f410 63 6b 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f ck);.....CACKEY_
1f420 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
1f430 72 6f 72 2e 20 20 53 65 61 72 63 68 20 71 75 65 ror. Search que
1f440 72 79 20 73 70 65 63 69 66 69 65 64 20 61 73 20 ry specified as
1f450 4e 55 4c 4c 2c 20 62 75 74 20 6e 75 6d 62 65 72 NULL, but number
1f460 20 6f 66 20 71 75 65 72 79 20 74 65 72 6d 73 20 of query terms
1f470 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20 61 73 not specified as
1f480 20 30 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 0.");.....retur
1f490 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f n(CKR_ARGUMENTS_
1f4a0 42 41 44 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 BAD);...}....cac
1f4b0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
1f4c0 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 ssion].search_qu
1f4d0 65 72 79 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 ery_count = 0;..
1f4e0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 .cackey_sessions
1f4f0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 [hSession].searc
1f500 68 5f 71 75 65 72 79 20 3d 20 4e 55 4c 4c 3b 0a h_query = NULL;.
1f510 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 .}...cackey_sess
1f520 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 ions[hSession].s
1f530 65 61 72 63 68 5f 61 63 74 69 76 65 20 3d 20 31 earch_active = 1
1f540 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f ;..cackey_sessio
1f550 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 ns[hSession].sea
1f560 72 63 68 5f 63 75 72 72 5f 69 64 20 3d 20 30 3b rch_curr_id = 0;
1f570 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 ...mutex_retval
1f580 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 = cackey_mutex_u
1f590 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 nlock(cackey_big
1f5a0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 lock);..if (mute
1f5b0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b x_retval != 0) {
1f5c0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1f5d0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
1f5e0 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 Unlocking failed
1f5f0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
1f600 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 KR_GENERAL_ERROR
1f610 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 );..}...CACKEY_D
1f620 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
1f630 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 urning CKR_OK (%
1f640 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 i)", CKR_OK);...
1f650 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a return(CKR_OK);.
1f660 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e }..CK_DEFINE_FUN
1f670 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 CTION(CK_RV, C_F
1f680 69 6e 64 4f 62 6a 65 63 74 73 29 28 43 4b 5f 53 indObjects)(CK_S
1f690 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 ESSION_HANDLE hS
1f6a0 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 ession, CK_OBJEC
1f6b0 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4f T_HANDLE_PTR phO
1f6c0 62 6a 65 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 bject, CK_ULONG
1f6d0 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 ulMaxObjectCount
1f6e0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 , CK_ULONG_PTR p
1f6f0 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 29 20 7b ulObjectCount) {
1f700 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f ..struct cackey_
1f710 69 64 65 6e 74 69 74 79 20 2a 63 75 72 72 5f 69 identity *curr_i
1f720 64 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 d;..CK_ATTRIBUTE
1f730 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09 43 4b *curr_attr;..CK
1f740 5f 55 4c 4f 4e 47 20 63 75 72 72 5f 69 64 5f 69 _ULONG curr_id_i
1f750 64 78 2c 20 63 75 72 72 5f 6f 75 74 5f 69 64 5f dx, curr_out_id_
1f760 69 64 78 2c 20 63 75 72 72 5f 61 74 74 72 5f 69 idx, curr_attr_i
1f770 64 78 2c 20 73 65 73 73 5f 61 74 74 72 5f 69 64 dx, sess_attr_id
1f780 78 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 6d 61 74 x;..CK_ULONG mat
1f790 63 68 65 64 5f 63 6f 75 6e 74 2c 20 70 72 65 76 ched_count, prev
1f7a0 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 3b 0a _matched_count;.
1f7b0 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 .int mutex_retva
1f7c0 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 l;...CACKEY_DEBU
1f7d0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 G_PRINTF("Called
1f7e0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b .");...if (!cack
1f7f0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 ey_initialized)
1f800 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
1f810 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
1f820 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 Not initialized
1f830 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
1f840 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f KR_CRYPTOKI_NOT_
1f850 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d INITIALIZED);..}
1f860 0a 0a 09 69 66 20 28 70 75 6c 4f 62 6a 65 63 74 ...if (pulObject
1f870 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b Count == NULL) {
1f880 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1f890 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
1f8a0 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 69 pulObjectCount i
1f8b0 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 s NULL.");....re
1f8c0 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e turn(CKR_ARGUMEN
1f8d0 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 TS_BAD);..}...if
1f8e0 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55 (phObject == NU
1f8f0 4c 4c 20 26 26 20 75 6c 4d 61 78 4f 62 6a 65 63 LL && ulMaxObjec
1f900 74 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 tCount == 0) {..
1f910 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69 ./* Short circui
1f920 74 2c 20 69 66 20 7a 65 72 6f 20 6f 62 6a 65 63 t, if zero objec
1f930 74 73 20 77 65 72 65 20 73 70 65 63 69 66 69 65 ts were specifie
1f940 64 20 72 65 74 75 72 6e 20 7a 65 72 6f 20 69 74 d return zero it
1f950 65 6d 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 ems immediately
1f960 2a 2f 0a 09 09 2a 70 75 6c 4f 62 6a 65 63 74 43 */...*pulObjectC
1f970 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 43 41 43 ount = 0;....CAC
1f980 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1f990 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f ("Returning CKR_
1f9a0 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20 63 OK (%i) (short c
1f9b0 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b ircuit)", CKR_OK
1f9c0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
1f9d0 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 _OK);..}...if (p
1f9e0 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c 29 hObject == NULL)
1f9f0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
1fa00 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
1fa10 20 20 70 68 4f 62 6a 65 63 74 20 69 73 20 4e 55 phObject is NU
1fa20 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e LL.");....return
1fa30 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 (CKR_ARGUMENTS_B
1fa40 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c AD);..}...if (ul
1fa50 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d MaxObjectCount =
1fa60 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f = 0) {...CACKEY_
1fa70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
1fa80 72 6f 72 2e 20 20 4d 61 78 69 6d 75 6d 20 6e 75 ror. Maximum nu
1fa90 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 mber of objects
1faa0 73 70 65 63 69 66 69 65 64 20 61 73 20 7a 65 72 specified as zer
1fab0 6f 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 o.");....return(
1fac0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 CKR_ARGUMENTS_BA
1fad0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 D);..}...if (hSe
1fae0 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 ssion == 0 || hS
1faf0 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f ession >= (sizeo
1fb00 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e f(cackey_session
1fb10 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b s) / sizeof(cack
1fb20 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 ey_sessions[0]))
1fb30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
1fb40 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
1fb50 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f . Session out o
1fb60 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 f range.");.....
1fb70 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 .return(CKR_SESS
1fb80 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c ION_HANDLE_INVAL
1fb90 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f ID);..}...mutex_
1fba0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f retval = cackey_
1fbb0 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 mutex_lock(cacke
1fbc0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 y_biglock);..if
1fbd0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d (mutex_retval !=
1fbe0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 0) {...CACKEY_D
1fbf0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
1fc00 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 or. Locking fai
1fc10 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 led.");....retur
1fc20 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 n(CKR_GENERAL_ER
1fc30 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 ROR);..}...if (!
1fc40 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
1fc50 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 hSession].active
1fc60 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 ) {...cackey_mut
1fc70 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 ex_unlock(cackey
1fc80 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 _biglock);....CA
1fc90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
1fca0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 F("Error. Sessi
1fcb0 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 on not active.")
1fcc0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b ;......return(CK
1fcd0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 R_SESSION_HANDLE
1fce0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 _INVALID);..}...
1fcf0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 if (!cackey_sess
1fd00 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 ions[hSession].s
1fd10 65 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b 0a earch_active) {.
1fd20 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 ..cackey_mutex_u
1fd30 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 nlock(cackey_big
1fd40 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 lock);....CACKEY
1fd50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
1fd60 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 6e 6f rror. Search no
1fd70 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a t active.");....
1fd80 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 ..return(CKR_OPE
1fd90 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 RATION_NOT_INITI
1fda0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 63 75 ALIZED);..}...cu
1fdb0 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 20 3d 20 rr_out_id_idx =
1fdc0 30 3b 0a 09 66 6f 72 20 28 63 75 72 72 5f 69 64 0;..for (curr_id
1fdd0 5f 69 64 78 20 3d 20 63 61 63 6b 65 79 5f 73 65 _idx = cackey_se
1fde0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
1fdf0 2e 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64 3b .search_curr_id;
1fe00 20 63 75 72 72 5f 69 64 5f 69 64 78 20 3c 20 63 curr_id_idx < c
1fe10 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
1fe20 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 Session].identit
1fe30 69 65 73 5f 63 6f 75 6e 74 20 26 26 20 75 6c 4d ies_count && ulM
1fe40 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 3b 20 63 axObjectCount; c
1fe50 75 72 72 5f 69 64 5f 69 64 78 2b 2b 29 20 7b 0a urr_id_idx++) {.
1fe60 09 09 63 75 72 72 5f 69 64 20 3d 20 26 63 61 63 ..curr_id = &cac
1fe70 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
1fe80 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 ssion].identitie
1fe90 73 5b 63 75 72 72 5f 69 64 5f 69 64 78 5d 3b 0a s[curr_id_idx];.
1fea0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1feb0 50 52 49 4e 54 46 28 22 50 72 6f 63 65 73 73 69 PRINTF("Processi
1fec0 6e 67 20 69 64 65 6e 74 69 74 79 3a 25 6c 75 22 ng identity:%lu"
1fed0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
1fee0 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a ) curr_id_idx);.
1fef0 0a 09 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 ...matched_count
1ff00 20 3d 20 30 3b 0a 0a 09 09 66 6f 72 20 28 63 75 = 0;....for (cu
1ff10 72 72 5f 61 74 74 72 5f 69 64 78 20 3d 20 30 3b rr_attr_idx = 0;
1ff20 20 63 75 72 72 5f 61 74 74 72 5f 69 64 78 20 3c curr_attr_idx <
1ff30 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 cackey_sessions
1ff40 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 [hSession].searc
1ff50 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b 20 63 h_query_count; c
1ff60 75 72 72 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 urr_attr_idx++)
1ff70 7b 0a 09 09 09 70 72 65 76 5f 6d 61 74 63 68 65 {....prev_matche
1ff80 64 5f 63 6f 75 6e 74 20 3d 20 6d 61 74 63 68 65 d_count = matche
1ff90 64 5f 63 6f 75 6e 74 3b 0a 0a 09 09 09 63 75 72 d_count;.....cur
1ffa0 72 5f 61 74 74 72 20 3d 20 26 63 61 63 6b 65 79 r_attr = &cackey
1ffb0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
1ffc0 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 on].search_query
1ffd0 5b 63 75 72 72 5f 61 74 74 72 5f 69 64 78 5d 3b [curr_attr_idx];
1ffe0 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
1fff0 47 5f 50 52 49 4e 54 46 28 22 20 20 43 68 65 63 G_PRINTF(" Chec
20000 6b 69 6e 67 20 66 6f 72 20 61 74 74 72 69 62 75 king for attribu
20010 74 65 20 30 78 25 30 38 6c 78 20 69 6e 20 69 64 te 0x%08lx in id
20020 65 6e 74 69 74 79 3a 25 69 2e 2e 2e 22 2c 20 28 entity:%i...", (
20030 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 unsigned long) c
20040 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 2c 20 urr_attr->type,
20050 28 69 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64 (int) curr_id_id
20060 78 29 3b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 x);....CACKEY_DE
20070 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 20 20 BUG_PRINTBUF("
20080 20 20 56 61 6c 75 65 20 6c 6f 6f 6b 69 6e 67 20 Value looking
20090 66 6f 72 3a 22 2c 20 63 75 72 72 5f 61 74 74 72 for:", curr_attr
200a0 2d 3e 70 56 61 6c 75 65 2c 20 63 75 72 72 5f 61 ->pValue, curr_a
200b0 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 ttr->ulValueLen)
200c0 3b 0a 0a 09 09 09 66 6f 72 20 28 73 65 73 73 5f ;.....for (sess_
200d0 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 73 65 attr_idx = 0; se
200e0 73 73 5f 61 74 74 72 5f 69 64 78 20 3c 20 63 75 ss_attr_idx < cu
200f0 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65 rr_id->attribute
20100 73 5f 63 6f 75 6e 74 3b 20 73 65 73 73 5f 61 74 s_count; sess_at
20110 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 tr_idx++) {.....
20120 69 66 20 28 63 75 72 72 5f 69 64 2d 3e 61 74 74 if (curr_id->att
20130 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 ributes[sess_att
20140 72 5f 69 64 78 5d 2e 74 79 70 65 20 3d 3d 20 63 r_idx].type == c
20150 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 29 20 urr_attr->type)
20160 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 {......CACKEY_DE
20170 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20 20 BUG_PRINTF("
20180 2e 2e 2e 20 66 6f 75 6e 64 20 6d 61 74 63 68 69 ... found matchi
20190 6e 67 20 74 79 70 65 20 2e 2e 2e 22 29 3b 0a 09 ng type ...");..
201a0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
201b0 5f 50 52 49 4e 54 42 55 46 28 22 20 20 20 20 2e _PRINTBUF(" .
201c0 2e 2e 20 6f 75 72 20 76 61 6c 75 65 3a 22 2c 20 .. our value:",
201d0 63 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 curr_id->attribu
201e0 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 tes[sess_attr_id
201f0 78 5d 2e 70 56 61 6c 75 65 2c 20 63 75 72 72 5f x].pValue, curr_
20200 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 id->attributes[s
20210 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c ess_attr_idx].ul
20220 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 ValueLen);......
20230 09 69 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e .if (curr_attr->
20240 70 56 61 6c 75 65 20 3d 3d 20 4e 55 4c 4c 29 20 pValue == NULL)
20250 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 {.......CACKEY_D
20260 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20 EBUG_PRINTF("
20270 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 77 69 ... found wi
20280 6c 64 63 61 72 64 20 6d 61 74 63 68 22 29 3b 0a ldcard match");.
20290 0a 09 09 09 09 09 09 6d 61 74 63 68 65 64 5f 63 .......matched_c
202a0 6f 75 6e 74 2b 2b 3b 0a 0a 09 09 09 09 09 09 62 ount++;........b
202b0 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 20 09 reak;......}.. .
202c0 09 09 09 09 69 66 20 28 63 75 72 72 5f 61 74 74 ....if (curr_att
202d0 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d r->ulValueLen ==
202e0 20 63 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 curr_id->attrib
202f0 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 utes[sess_attr_i
20300 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 20 26 dx].ulValueLen &
20310 26 20 6d 65 6d 63 6d 70 28 63 75 72 72 5f 61 74 & memcmp(curr_at
20320 74 72 2d 3e 70 56 61 6c 75 65 2c 20 63 75 72 72 tr->pValue, curr
20330 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5b _id->attributes[
20340 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 70 sess_attr_idx].p
20350 56 61 6c 75 65 2c 20 63 75 72 72 5f 69 64 2d 3e Value, curr_id->
20360 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f attributes[sess_
20370 61 74 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 attr_idx].ulValu
20380 65 4c 65 6e 29 20 3d 3d 20 30 29 20 7b 0a 09 09 eLen) == 0) {...
20390 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
203a0 5f 50 52 49 4e 54 46 28 22 20 20 20 20 20 20 20 _PRINTF("
203b0 2e 2e 2e 20 66 6f 75 6e 64 20 65 78 61 63 74 20 ... found exact
203c0 6d 61 74 63 68 22 29 3b 0a 0a 09 09 09 09 09 09 match");........
203d0 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2b 2b 3b matched_count++;
203e0 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 ........break;..
203f0 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 7d ....}.....}....}
20400 0a 0a 09 09 09 2f 2a 20 49 66 20 74 68 65 20 61 ...../* If the a
20410 74 74 72 69 62 75 74 65 20 63 6f 75 6c 64 20 6e ttribute could n
20420 6f 74 20 62 65 20 6d 61 74 63 68 65 64 2c 20 64 ot be matched, d
20430 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 6d 61 74 o not try to mat
20440 63 68 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 74 ch additional at
20450 74 72 69 62 75 74 65 73 20 2a 2f 0a 09 09 09 69 tributes */....i
20460 66 20 28 70 72 65 76 5f 6d 61 74 63 68 65 64 5f f (prev_matched_
20470 63 6f 75 6e 74 20 3d 3d 20 6d 61 74 63 68 65 64 count == matched
20480 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 62 72 _count) {.....br
20490 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 eak;....}...}...
204a0 09 69 66 20 28 6d 61 74 63 68 65 64 5f 63 6f 75 .if (matched_cou
204b0 6e 74 20 3d 3d 20 63 61 63 6b 65 79 5f 73 65 73 nt == cackey_ses
204c0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
204d0 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 search_query_cou
204e0 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f nt) {....CACKEY_
204f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 DEBUG_PRINTF("
20500 2e 2e 2e 20 41 6c 6c 20 25 69 20 61 74 74 72 69 ... All %i attri
20510 62 75 74 65 73 20 63 68 65 63 6b 65 64 20 66 6f butes checked fo
20520 72 20 66 6f 75 6e 64 2c 20 61 64 64 69 6e 67 20 r found, adding
20530 69 64 65 6e 74 69 74 79 3a 25 69 20 74 6f 20 72 identity:%i to r
20540 65 74 75 72 6e 65 64 20 6c 69 73 74 22 2c 20 28 eturned list", (
20550 69 6e 74 29 20 63 61 63 6b 65 79 5f 73 65 73 73 int) cackey_sess
20560 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 ions[hSession].s
20570 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e earch_query_coun
20580 74 2c 20 28 69 6e 74 29 20 63 75 72 72 5f 69 64 t, (int) curr_id
20590 5f 69 64 78 29 3b 0a 0a 09 09 09 70 68 4f 62 6a _idx);.....phObj
205a0 65 63 74 5b 63 75 72 72 5f 6f 75 74 5f 69 64 5f ect[curr_out_id_
205b0 69 64 78 5d 20 3d 20 63 75 72 72 5f 69 64 5f 69 idx] = curr_id_i
205c0 64 78 20 2b 20 31 3b 0a 0a 09 09 09 75 6c 4d 61 dx + 1;.....ulMa
205d0 78 4f 62 6a 65 63 74 43 6f 75 6e 74 2d 2d 3b 0a xObjectCount--;.
205e0 0a 09 09 09 63 75 72 72 5f 6f 75 74 5f 69 64 5f ....curr_out_id_
205f0 69 64 78 2b 2b 3b 0a 09 09 7d 20 65 6c 73 65 20 idx++;...} else
20600 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {....CACKEY_DEBU
20610 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 G_PRINTF(" ...
20620 4e 6f 74 20 61 6c 6c 20 25 69 20 28 6f 6e 6c 79 Not all %i (only
20630 20 66 6f 75 6e 64 20 25 69 29 20 61 74 74 72 69 found %i) attri
20640 62 75 74 65 73 20 63 68 65 63 6b 65 64 20 66 6f butes checked fo
20650 72 20 66 6f 75 6e 64 2c 20 6e 6f 74 20 61 64 64 r found, not add
20660 69 6e 67 20 69 64 65 6e 74 69 74 79 3a 25 69 22 ing identity:%i"
20670 2c 20 28 69 6e 74 29 20 63 61 63 6b 65 79 5f 73 , (int) cackey_s
20680 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
20690 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 ].search_query_c
206a0 6f 75 6e 74 2c 20 28 69 6e 74 29 20 6d 61 74 63 ount, (int) matc
206b0 68 65 64 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29 hed_count, (int)
206c0 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a 09 curr_id_idx);..
206d0 09 7d 0a 09 7d 0a 09 63 61 63 6b 65 79 5f 73 65 .}..}..cackey_se
206e0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
206f0 2e 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64 20 .search_curr_id
20700 3d 20 63 75 72 72 5f 69 64 5f 69 64 78 3b 0a 09 = curr_id_idx;..
20710 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 *pulObjectCount
20720 3d 20 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 = curr_out_id_id
20730 78 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 x;...mutex_retva
20740 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 l = cackey_mutex
20750 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 _unlock(cackey_b
20760 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 iglock);..if (mu
20770 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 tex_retval != 0)
20780 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
20790 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
207a0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c Unlocking fail
207b0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
207c0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 (CKR_GENERAL_ERR
207d0 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 OR);..}...CACKEY
207e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
207f0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 eturning CKR_OK
20800 28 25 69 29 2c 20 6e 75 6d 20 6f 62 6a 65 63 74 (%i), num object
20810 73 20 3d 20 25 6c 75 22 2c 20 43 4b 52 5f 4f 4b s = %lu", CKR_OK
20820 2c 20 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e , *pulObjectCoun
20830 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 t);...return(CKR
20840 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 _OK);.}..CK_DEFI
20850 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 NE_FUNCTION(CK_R
20860 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 V, C_FindObjects
20870 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f Final)(CK_SESSIO
20880 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f N_HANDLE hSessio
20890 6e 29 20 7b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 69 n) {..CK_ULONG i
208a0 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 dx;..int mutex_r
208b0 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f etval;...CACKEY_
208c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
208d0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 lled.");...if (!
208e0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a cackey_initializ
208f0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...CACKEY_D
20900 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
20910 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c or. Not initial
20920 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 ized.");....retu
20930 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f rn(CKR_CRYPTOKI_
20940 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 NOT_INITIALIZED)
20950 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 ;..}...if (hSess
20960 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 ion == 0 || hSes
20970 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 sion >= (sizeof(
20980 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 cackey_sessions)
20990 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 / sizeof(cackey
209a0 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 _sessions[0])))
209b0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
209c0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
209d0 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 Session out of
209e0 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 range.");......r
209f0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f eturn(CKR_SESSIO
20a00 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 N_HANDLE_INVALID
20a10 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 );..}...mutex_re
20a20 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 tval = cackey_mu
20a30 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f tex_lock(cackey_
20a40 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d biglock);..if (m
20a50 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 utex_retval != 0
20a60 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
20a70 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
20a80 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 . Locking faile
20a90 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
20aa0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f CKR_GENERAL_ERRO
20ab0 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 R);..}...if (!ca
20ac0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
20ad0 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 ession].active)
20ae0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 {...cackey_mutex
20af0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 _unlock(cackey_b
20b00 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b iglock);....CACK
20b10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
20b20 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e "Error. Session
20b30 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a not active.");.
20b40 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f .....return(CKR_
20b50 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 SESSION_HANDLE_I
20b60 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 NVALID);..}...if
20b70 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f (!cackey_sessio
20b80 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 ns[hSession].sea
20b90 72 63 68 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 rch_active) {...
20ba0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c cackey_mutex_unl
20bb0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
20bc0 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 ck);....CACKEY_D
20bd0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
20be0 6f 72 2e 20 20 53 65 61 72 63 68 20 6e 6f 74 20 or. Search not
20bf0 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 active.");......
20c00 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 return(CKR_OPERA
20c10 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c TION_NOT_INITIAL
20c20 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b IZED);..}...cack
20c30 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
20c40 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 sion].search_act
20c50 69 76 65 20 3d 20 30 3b 0a 0a 09 66 6f 72 20 28 ive = 0;...for (
20c60 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 63 idx = 0; idx < c
20c70 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
20c80 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f Session].search_
20c90 71 75 65 72 79 5f 63 6f 75 6e 74 3b 20 69 64 78 query_count; idx
20ca0 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b ++) {...if (cack
20cb0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
20cc0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 sion].search_que
20cd0 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 29 20 ry[idx].pValue)
20ce0 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 {....free(cackey
20cf0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
20d00 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 on].search_query
20d10 5b 69 64 78 5d 2e 70 56 61 6c 75 65 29 3b 0a 09 [idx].pValue);..
20d20 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b .}..}...if (cack
20d30 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
20d40 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 sion].search_que
20d50 72 79 29 20 7b 0a 09 09 66 72 65 65 28 63 61 63 ry) {...free(cac
20d60 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
20d70 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 ssion].search_qu
20d80 65 72 79 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 ery);..}...mutex
20d90 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 _retval = cackey
20da0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 _mutex_unlock(ca
20db0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 ckey_biglock);..
20dc0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c if (mutex_retval
20dd0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 != 0) {...CACKE
20de0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
20df0 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e Error. Unlockin
20e00 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 g failed.");....
20e10 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 return(CKR_GENER
20e20 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 AL_ERROR);..}...
20e30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
20e40 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 NTF("Returning C
20e50 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 KR_OK (%i)", CKR
20e60 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 _OK);...return(C
20e70 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 KR_OK);.}..CK_DE
20e80 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b FINE_FUNCTION(CK
20e90 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 49 6e _RV, C_EncryptIn
20ea0 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 it)(CK_SESSION_H
20eb0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 ANDLE hSession,
20ec0 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 CK_MECHANISM_PTR
20ed0 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f pMechanism, CK_
20ee0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b OBJECT_HANDLE hK
20ef0 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 ey) {..CACKEY_DE
20f00 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
20f10 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 ed.");...if (!ca
20f20 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 ckey_initialized
20f30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
20f40 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
20f50 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a . Not initializ
20f60 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
20f70 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f (CKR_CRYPTOKI_NO
20f80 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a T_INITIALIZED);.
20f90 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 .}...CACKEY_DEBU
20fa0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
20fb0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e ing CKR_FUNCTION
20fc0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 _NOT_SUPPORTED (
20fd0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 %i)", CKR_FUNCTI
20fe0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
20ff0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f );...return(CKR_
21000 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
21010 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 PORTED);.}..CK_D
21020 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 EFINE_FUNCTION(C
21030 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 29 K_RV, C_Encrypt)
21040 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 (CK_SESSION_HAND
21050 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f LE hSession, CK_
21060 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 BYTE_PTR pData,
21070 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c CK_ULONG ulDataL
21080 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 en, CK_BYTE_PTR
21090 70 45 6e 63 72 79 70 74 65 64 44 61 74 61 2c 20 pEncryptedData,
210a0 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c CK_ULONG_PTR pul
210b0 45 6e 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e EncryptedDataLen
210c0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 ) {..CACKEY_DEBU
210d0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 G_PRINTF("Called
210e0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b .");...if (!cack
210f0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 ey_initialized)
21100 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
21110 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
21120 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 Not initialized
21130 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
21140 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f KR_CRYPTOKI_NOT_
21150 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d INITIALIZED);..}
21160 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
21170 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e PRINTF("Returnin
21180 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e g CKR_FUNCTION_N
21190 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 OT_SUPPORTED (%i
211a0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e )", CKR_FUNCTION
211b0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
211c0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 ...return(CKR_FU
211d0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
211e0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 RTED);.}..CK_DEF
211f0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f INE_FUNCTION(CK_
21200 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 55 70 64 RV, C_EncryptUpd
21210 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f ate)(CK_SESSION_
21220 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c HANDLE hSession,
21230 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 CK_BYTE_PTR pPa
21240 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 rt, CK_ULONG ulP
21250 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f artLen, CK_BYTE_
21260 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 PTR pEncryptedPa
21270 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 rt, CK_ULONG_PTR
21280 20 70 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 pulEncryptedPar
21290 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f tLen) {..CACKEY_
212a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
212b0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 lled.");...if (!
212c0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a cackey_initializ
212d0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...CACKEY_D
212e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
212f0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c or. Not initial
21300 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 ized.");....retu
21310 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f rn(CKR_CRYPTOKI_
21320 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 NOT_INITIALIZED)
21330 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ;..}...CACKEY_DE
21340 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
21350 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 rning CKR_FUNCTI
21360 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
21370 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 (%i)", CKR_FUNC
21380 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
21390 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b ED);...return(CK
213a0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
213b0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b UPPORTED);.}..CK
213c0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e _DEFINE_FUNCTION
213d0 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 (CK_RV, C_Encryp
213e0 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 tFinal)(CK_SESSI
213f0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 ON_HANDLE hSessi
21400 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 on, CK_BYTE_PTR
21410 70 4c 61 73 74 45 6e 63 72 79 70 74 65 64 50 61 pLastEncryptedPa
21420 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 rt, CK_ULONG_PTR
21430 20 70 75 6c 4c 61 73 74 45 6e 63 72 79 70 74 65 pulLastEncrypte
21440 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 dPartLen) {..CAC
21450 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
21460 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 ("Called.");...i
21470 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 f (!cackey_initi
21480 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b alized) {...CACK
21490 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
214a0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 "Error. Not ini
214b0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 tialized.");....
214c0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 return(CKR_CRYPT
214d0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 OKI_NOT_INITIALI
214e0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 ZED);..}...CACKE
214f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
21500 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 Returning CKR_FU
21510 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
21520 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f RTED (%i)", CKR_
21530 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
21540 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 PORTED);...retur
21550 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e n(CKR_FUNCTION_N
21560 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d OT_SUPPORTED);.}
21570 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 ..CK_DEFINE_FUNC
21580 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 TION(CK_RV, C_De
21590 63 72 79 70 74 49 6e 69 74 29 28 43 4b 5f 53 45 cryptInit)(CK_SE
215a0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 SSION_HANDLE hSe
215b0 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e ssion, CK_MECHAN
215c0 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 ISM_PTR pMechani
215d0 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 sm, CK_OBJECT_HA
215e0 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 69 6e NDLE hKey) {..in
215f0 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a t mutex_retval;.
21600 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43 4b ..hKey--;...CACK
21610 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
21620 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 "Called.");...if
21630 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 (!cackey_initia
21640 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 lized) {...CACKE
21650 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
21660 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 Error. Not init
21670 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 ialized.");....r
21680 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f eturn(CKR_CRYPTO
21690 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a KI_NOT_INITIALIZ
216a0 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d ED);..}...if (pM
216b0 65 63 68 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c 4c echanism == NULL
216c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
216d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
216e0 2e 20 70 4d 65 63 68 61 6e 69 73 6d 20 69 73 20 . pMechanism is
216f0 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 NULL.");....retu
21700 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 rn(CKR_ARGUMENTS
21710 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 _BAD);..}...if (
21720 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 pMechanism->mech
21730 61 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f 52 53 41 anism != CKM_RSA
21740 5f 50 4b 43 53 29 20 7b 0a 09 09 43 41 43 4b 45 _PKCS) {...CACKE
21750 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
21760 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 Error. pMechanis
21770 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 6e 6f 74 m->mechanism not
21780 20 73 70 65 63 69 66 69 65 64 20 61 73 20 43 4b specified as CK
21790 4d 5f 52 53 41 5f 50 4b 43 53 22 29 3b 0a 0a 09 M_RSA_PKCS");...
217a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4d 45 43 48 .return(CKR_MECH
217b0 41 4e 49 53 4d 5f 50 41 52 41 4d 5f 49 4e 56 41 ANISM_PARAM_INVA
217c0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 LID);..}...if (h
217d0 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 Session == 0 ||
217e0 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a hSession >= (siz
217f0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 eof(cackey_sessi
21800 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 ons) / sizeof(ca
21810 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d ckey_sessions[0]
21820 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ))) {...CACKEY_D
21830 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
21840 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 or. Session out
21850 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 of range.");...
21860 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 ...return(CKR_SE
21870 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 SSION_HANDLE_INV
21880 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 ALID);..}...mute
21890 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 x_retval = cacke
218a0 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 y_mutex_lock(cac
218b0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 key_biglock);..i
218c0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 f (mutex_retval
218d0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 != 0) {...CACKEY
218e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
218f0 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 rror. Locking f
21900 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 ailed.");....ret
21910 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f urn(CKR_GENERAL_
21920 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 ERROR);..}...if
21930 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e (!cackey_session
21940 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 s[hSession].acti
21950 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d ve) {...cackey_m
21960 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b utex_unlock(cack
21970 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 ey_biglock);....
21980 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
21990 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 NTF("Error. Ses
219a0 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e sion not active.
219b0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 ");......return(
219c0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 CKR_SESSION_HAND
219d0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a LE_INVALID);..}.
219e0 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 ..if (cackey_ses
219f0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
21a00 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 29 20 decrypt_active)
21a10 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 {...cackey_mutex
21a20 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 _unlock(cackey_b
21a30 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b iglock);....CACK
21a40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
21a50 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 "Error. Decrypt
21a60 20 61 6c 72 65 61 64 79 20 69 6e 20 70 72 6f 67 already in prog
21a70 72 65 73 73 2e 22 29 3b 0a 09 09 0a 09 09 72 65 ress.");......re
21a80 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 turn(CKR_OPERATI
21a90 4f 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a ON_ACTIVE);..}..
21aa0 09 69 66 20 28 68 4b 65 79 20 3e 3d 20 63 61 63 .if (hKey >= cac
21ab0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
21ac0 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 ssion].identitie
21ad0 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 63 61 63 s_count) {...cac
21ae0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b key_mutex_unlock
21af0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 (cackey_biglock)
21b00 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 ;....CACKEY_DEBU
21b10 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
21b20 20 20 4b 65 79 20 68 61 6e 64 6c 65 20 6f 75 74 Key handle out
21b30 20 6f 66 20 72 61 6e 67 65 20 28 72 65 71 75 65 of range (reque
21b40 73 74 65 64 20 6b 65 79 20 25 6c 75 2c 20 6f 6e sted key %lu, on
21b50 6c 79 20 25 6c 75 20 69 64 65 6e 74 69 74 69 65 ly %lu identitie
21b60 73 20 61 76 61 69 6c 61 62 6c 65 29 2e 22 2c 20 s available).",
21b70 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
21b80 68 4b 65 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 hKey, (unsigned
21b90 6c 6f 6e 67 29 20 63 61 63 6b 65 79 5f 73 65 73 long) cackey_ses
21ba0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
21bb0 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 identities_count
21bc0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
21bd0 5f 4b 45 59 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 _KEY_HANDLE_INVA
21be0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 LID);..}...cacke
21bf0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
21c00 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 ion].decrypt_act
21c10 69 76 65 20 3d 20 31 3b 0a 0a 09 63 61 63 6b 65 ive = 1;...cacke
21c20 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
21c30 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 ion].decrypt_mec
21c40 68 61 6e 69 73 6d 20 3d 20 70 4d 65 63 68 61 6e hanism = pMechan
21c50 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b 0a ism->mechanism;.
21c60 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 .cackey_sessions
21c70 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 [hSession].decry
21c80 70 74 5f 6d 65 63 68 5f 70 61 72 6d 20 3d 20 70 pt_mech_parm = p
21c90 4d 65 63 68 61 6e 69 73 6d 2d 3e 70 50 61 72 61 Mechanism->pPara
21ca0 6d 65 74 65 72 3b 0a 09 63 61 63 6b 65 79 5f 73 meter;..cackey_s
21cb0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
21cc0 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 ].decrypt_mech_p
21cd0 61 72 6d 6c 65 6e 20 3d 20 70 4d 65 63 68 61 6e armlen = pMechan
21ce0 69 73 6d 2d 3e 75 6c 50 61 72 61 6d 65 74 65 72 ism->ulParameter
21cf0 4c 65 6e 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 Len;..cackey_ses
21d00 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
21d10 64 65 63 72 79 70 74 5f 69 64 65 6e 74 69 74 79 decrypt_identity
21d20 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 = &cackey_sessi
21d30 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 ons[hSession].id
21d40 65 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d 3b 0a entities[hKey];.
21d50 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d ..mutex_retval =
21d60 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e cackey_mutex_un
21d70 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
21d80 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 ock);..if (mutex
21d90 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a _retval != 0) {.
21da0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
21db0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 RINTF("Error. U
21dc0 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e nlocking failed.
21dd0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
21de0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 R_GENERAL_ERROR)
21df0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ;..}...CACKEY_DE
21e00 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
21e10 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 rning CKR_OK (%i
21e20 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 )", CKR_OK);...r
21e30 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d eturn(CKR_OK);.}
21e40 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 ..CK_DEFINE_FUNC
21e50 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 TION(CK_RV, C_De
21e60 63 72 79 70 74 29 28 43 4b 5f 53 45 53 53 49 4f crypt)(CK_SESSIO
21e70 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f N_HANDLE hSessio
21e80 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 n, CK_BYTE_PTR p
21e90 45 6e 63 72 79 70 74 65 64 44 61 74 61 2c 20 43 EncryptedData, C
21ea0 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 K_ULONG ulEncryp
21eb0 74 65 64 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 tedDataLen, CK_B
21ec0 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 YTE_PTR pData, C
21ed0 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 K_ULONG_PTR pulD
21ee0 61 74 61 4c 65 6e 29 20 7b 0a 09 43 4b 5f 55 4c ataLen) {..CK_UL
21ef0 4f 4e 47 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 ONG datalen_upda
21f00 74 65 2c 20 64 61 74 61 6c 65 6e 5f 66 69 6e 61 te, datalen_fina
21f10 6c 3b 0a 09 43 4b 5f 52 56 20 64 65 63 72 79 70 l;..CK_RV decryp
21f20 74 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f t_ret;...CACKEY_
21f30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
21f40 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 lled.");...if (!
21f50 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a cackey_initializ
21f60 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...CACKEY_D
21f70 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
21f80 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c or. Not initial
21f90 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 ized.");....retu
21fa0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f rn(CKR_CRYPTOKI_
21fb0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 NOT_INITIALIZED)
21fc0 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 44 61 ;..}...if (pulDa
21fd0 74 61 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b taLen == NULL) {
21fe0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
21ff0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 PRINTF("Error. p
22000 75 6c 44 61 74 61 4c 65 6e 20 69 73 20 4e 55 4c ulDataLen is NUL
22010 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 L.");....return(
22020 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 CKR_ARGUMENTS_BA
22030 44 29 3b 0a 09 7d 0a 0a 09 64 61 74 61 6c 65 6e D);..}...datalen
22040 5f 75 70 64 61 74 65 20 3d 20 2a 70 75 6c 44 61 _update = *pulDa
22050 74 61 4c 65 6e 3b 0a 0a 09 64 65 63 72 79 70 74 taLen;...decrypt
22060 5f 72 65 74 20 3d 20 43 5f 44 65 63 72 79 70 74 _ret = C_Decrypt
22070 55 70 64 61 74 65 28 68 53 65 73 73 69 6f 6e 2c Update(hSession,
22080 20 70 45 6e 63 72 79 70 74 65 64 44 61 74 61 2c pEncryptedData,
22090 20 75 6c 45 6e 63 72 79 70 74 65 64 44 61 74 61 ulEncryptedData
220a0 4c 65 6e 2c 20 70 44 61 74 61 2c 20 26 64 61 74 Len, pData, &dat
220b0 61 6c 65 6e 5f 75 70 64 61 74 65 29 3b 0a 09 69 alen_update);..i
220c0 66 20 28 64 65 63 72 79 70 74 5f 72 65 74 20 21 f (decrypt_ret !
220d0 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 = CKR_OK) {...CA
220e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
220f0 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 F("Error. Decry
22100 70 74 55 70 64 61 74 65 28 29 20 72 65 74 75 72 ptUpdate() retur
22110 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72 76 20 ned failure (rv
22120 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 = %lu).", (unsig
22130 6e 65 64 20 6c 6f 6e 67 29 20 64 65 63 72 79 70 ned long) decryp
22140 74 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 t_ret);....retur
22150 6e 28 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a n(decrypt_ret);.
22160 09 7d 0a 0a 09 69 66 20 28 70 44 61 74 61 29 20 .}...if (pData)
22170 7b 0a 09 09 70 44 61 74 61 20 2b 3d 20 64 61 74 {...pData += dat
22180 61 6c 65 6e 5f 75 70 64 61 74 65 3b 0a 09 7d 0a alen_update;..}.
22190 09 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 20 3d .datalen_final =
221a0 20 2a 70 75 6c 44 61 74 61 4c 65 6e 20 2d 20 64 *pulDataLen - d
221b0 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 3b 0a 0a atalen_update;..
221c0 09 64 65 63 72 79 70 74 5f 72 65 74 20 3d 20 43 .decrypt_ret = C
221d0 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 28 68 53 _DecryptFinal(hS
221e0 65 73 73 69 6f 6e 2c 20 70 44 61 74 61 2c 20 26 ession, pData, &
221f0 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 29 3b 0a datalen_final);.
22200 09 69 66 20 28 64 65 63 72 79 70 74 5f 72 65 74 .if (decrypt_ret
22210 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 != CKR_OK) {...
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 45 72 72 6f 72 2e 20 20 44 65 63 NTF("Error. Dec
22240 72 79 70 74 46 69 6e 61 6c 28 29 20 72 65 74 75 ryptFinal() retu
22250 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72 76 rned failure (rv
22260 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 = %lu).", (unsi
22270 67 6e 65 64 20 6c 6f 6e 67 29 20 64 65 63 72 79 gned long) decry
22280 70 74 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 pt_ret);....retu
22290 72 6e 28 64 65 63 72 79 70 74 5f 72 65 74 29 3b rn(decrypt_ret);
222a0 0a 09 7d 0a 0a 09 2a 70 75 6c 44 61 74 61 4c 65 ..}...*pulDataLe
222b0 6e 20 3d 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 n = datalen_upda
222c0 74 65 20 2b 20 64 61 74 61 6c 65 6e 5f 66 69 6e te + datalen_fin
222d0 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 al;...CACKEY_DEB
222e0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
222f0 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 ning CKR_OK (%i)
22300 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 ", CKR_OK);...re
22310 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a turn(CKR_OK);.}.
22320 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 .CK_DEFINE_FUNCT
22330 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 ION(CK_RV, C_Dec
22340 72 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53 ryptUpdate)(CK_S
22350 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 ESSION_HANDLE hS
22360 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f ession, CK_BYTE_
22370 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 PTR pEncryptedPa
22380 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 rt, CK_ULONG ulE
22390 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c ncryptedPartLen,
223a0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 CK_BYTE_PTR pPa
223b0 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 rt, CK_ULONG_PTR
223c0 20 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 pulPartLen) {..
223d0 73 74 61 74 69 63 20 43 4b 5f 42 59 54 45 20 62 static CK_BYTE b
223e0 75 66 5b 31 36 33 38 34 5d 3b 0a 09 73 73 69 7a uf[16384];..ssiz
223f0 65 5f 74 20 62 75 66 6c 65 6e 3b 0a 09 43 4b 5f e_t buflen;..CK_
22400 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a SLOT_ID slotID;.
22410 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d 20 .CK_RV retval =
22420 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f CKR_GENERAL_ERRO
22430 52 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 R;..int mutex_re
22440 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 tval;...CACKEY_D
22450 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
22460 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 led.");...if (!c
22470 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 ackey_initialize
22480 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 d) {...CACKEY_DE
22490 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
224a0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 r. Not initiali
224b0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 zed.");....retur
224c0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e n(CKR_CRYPTOKI_N
224d0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b OT_INITIALIZED);
224e0 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 ..}...if (hSessi
224f0 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 on == 0 || hSess
22500 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 ion >= (sizeof(c
22510 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 ackey_sessions)
22520 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f / sizeof(cackey_
22530 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b sessions[0]))) {
22540 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
22550 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
22560 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 Session out of r
22570 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 ange.");......re
22580 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e turn(CKR_SESSION
22590 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 _HANDLE_INVALID)
225a0 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 45 6e 63 72 ;..}...if (pEncr
225b0 79 70 74 65 64 50 61 72 74 20 3d 3d 20 4e 55 4c yptedPart == NUL
225c0 4c 20 26 26 20 75 6c 45 6e 63 72 79 70 74 65 64 L && ulEncrypted
225d0 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a PartLen == 0) {.
225e0 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75 ../* Short circu
225f0 69 74 20 69 66 20 77 65 20 61 72 65 20 61 73 6b it if we are ask
22600 65 64 20 74 6f 20 64 65 63 72 79 70 74 20 6e 6f ed to decrypt no
22610 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 43 41 thing... */...CA
22620 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
22630 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 F("Returning CKR
22640 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20 _OK (%i) (short
22650 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f circuit)", CKR_O
22660 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b K);....return(CK
22670 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 R_OK);..}...if (
22680 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 20 3d pEncryptedPart =
22690 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b = NULL) {...CACK
226a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
226b0 22 45 72 72 6f 72 2e 20 70 45 6e 63 72 79 70 74 "Error. pEncrypt
226c0 65 64 50 61 72 74 20 69 73 20 4e 55 4c 4c 2c 20 edPart is NULL,
226d0 62 75 74 20 75 6c 45 6e 63 72 79 70 74 65 64 50 but ulEncryptedP
226e0 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74 20 30 2e artLen is not 0.
226f0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
22700 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 R_ARGUMENTS_BAD)
22710 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 45 6e 63 ;..}...if (ulEnc
22720 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20 3d 3d ryptedPartLen ==
22730 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 0) {...CACKEY_D
22740 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
22750 6f 72 2e 20 75 6c 45 6e 63 72 79 70 74 65 64 50 or. ulEncryptedP
22760 61 72 74 4c 65 6e 20 69 73 20 30 2c 20 62 75 74 artLen is 0, but
22770 20 70 50 61 72 74 20 69 73 20 6e 6f 74 20 4e 55 pPart is not NU
22780 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e LL.");....return
22790 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 (CKR_ARGUMENTS_B
227a0 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 AD);..}...if (pu
227b0 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 4e 55 4c 4c lPartLen == NULL
227c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
227d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
227e0 2e 20 70 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 . pulPartLen is
227f0 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 NULL.");....retu
22800 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 rn(CKR_ARGUMENTS
22810 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 _BAD);..}...mute
22820 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 x_retval = cacke
22830 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 y_mutex_lock(cac
22840 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 key_biglock);..i
22850 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 f (mutex_retval
22860 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 != 0) {...CACKEY
22870 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
22880 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 rror. Locking f
22890 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 ailed.");....ret
228a0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f urn(CKR_GENERAL_
228b0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 ERROR);..}...if
228c0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e (!cackey_session
228d0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 s[hSession].acti
228e0 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d ve) {...cackey_m
228f0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b utex_unlock(cack
22900 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 ey_biglock);....
22910 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
22920 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 NTF("Error. Ses
22930 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e sion not active.
22940 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 ");......return(
22950 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 CKR_SESSION_HAND
22960 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a LE_INVALID);..}.
22970 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 ..if (!cackey_se
22980 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
22990 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 29 .decrypt_active)
229a0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 {...cackey_mute
229b0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
229c0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 biglock);....CAC
229d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
229e0 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 ("Error. Decryp
229f0 74 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b t not active.");
22a00 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 ......return(CKR
22a10 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 _OPERATION_NOT_I
22a20 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
22a30 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 ..slotID = cacke
22a40 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
22a50 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 ion].slotID;...i
22a60 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c f (slotID < 0 ||
22a70 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 slotID >= (size
22a80 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 of(cackey_slots)
22a90 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 / sizeof(cackey
22aa0 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 _slots[0]))) {..
22ab0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
22ac0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 INTF("Error. Inv
22ad0 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 alid slot reques
22ae0 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 ted (%lu), outsi
22af0 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 de of valid rang
22b00 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 e", slotID);....
22b10 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 return(CKR_GENER
22b20 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 AL_ERROR);..}...
22b30 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 if (cackey_slots
22b40 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 [slotID].active
22b50 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 == 0) {...CACKEY
22b60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
22b70 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c rror. Invalid sl
22b80 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c ot requested (%l
22b90 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 u), slot not cur
22ba0 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 rently active",
22bb0 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b slotID);....cack
22bc0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 ey_mutex_unlock(
22bd0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
22be0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 ....return(CKR_G
22bf0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 ENERAL_ERROR);..
22c00 7d 0a 0a 09 73 77 69 74 63 68 20 28 63 61 63 6b }...switch (cack
22c10 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
22c20 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 sion].decrypt_me
22c30 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61 73 chanism) {...cas
22c40 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a e CKM_RSA_PKCS:.
22c50 09 09 09 2f 2a 20 41 73 6b 20 63 61 72 64 20 74 .../* Ask card t
22c60 6f 20 64 65 63 72 79 70 74 20 2a 2f 0a 09 09 09 o decrypt */....
22c70 62 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65 79 5f buflen = cackey_
22c80 73 69 67 6e 64 65 63 72 79 70 74 28 26 63 61 63 signdecrypt(&cac
22c90 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 key_slots[slotID
22ca0 5d 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f ], cackey_sessio
22cb0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 ns[hSession].dec
22cc0 72 79 70 74 5f 69 64 65 6e 74 69 74 79 2c 20 70 rypt_identity, p
22cd0 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 75 EncryptedPart, u
22ce0 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 lEncryptedPartLe
22cf0 6e 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 n, buf, sizeof(b
22d00 75 66 29 2c 20 30 2c 20 31 29 3b 0a 0a 09 09 09 uf), 0, 1);.....
22d10 69 66 20 28 62 75 66 6c 65 6e 20 3c 20 30 29 20 if (buflen < 0)
22d20 7b 0a 09 09 09 09 2f 2a 20 44 65 63 72 79 70 74 {...../* Decrypt
22d30 69 6f 6e 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 09 ion failed. */..
22d40 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20 3d 3d ...if (buflen ==
22d50 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e CACKEY_PCSC_E_N
22d60 45 45 44 4c 4f 47 49 4e 29 20 7b 0a 09 09 09 09 EEDLOGIN) {.....
22d70 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 55 53 .retval = CKR_US
22d80 45 52 5f 4e 4f 54 5f 4c 4f 47 47 45 44 5f 49 4e ER_NOT_LOGGED_IN
22d90 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 69 66 20 ;.....} else if
22da0 28 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 (buflen == CACKE
22db0 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 Y_PCSC_E_TOKENAB
22dc0 53 45 4e 54 29 20 7b 0a 09 09 09 09 09 72 65 74 SENT) {......ret
22dd0 76 61 6c 20 3d 20 43 4b 52 5f 44 45 56 49 43 45 val = CKR_DEVICE
22de0 5f 52 45 4d 4f 56 45 44 3b 0a 09 09 09 09 7d 20 _REMOVED;.....}
22df0 65 6c 73 65 20 7b 0a 09 09 09 09 09 72 65 74 76 else {......retv
22e00 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c al = CKR_GENERAL
22e10 5f 45 52 52 4f 52 3b 0a 09 09 09 09 7d 0a 09 09 _ERROR;.....}...
22e20 09 7d 20 65 6c 73 65 20 69 66 20 28 28 28 75 6e .} else if (((un
22e30 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62 75 66 signed long) buf
22e40 6c 65 6e 29 20 3e 20 2a 70 75 6c 50 61 72 74 4c len) > *pulPartL
22e50 65 6e 20 26 26 20 70 50 61 72 74 29 20 7b 0a 09 en && pPart) {..
22e60 09 09 09 2f 2a 20 44 65 63 72 79 70 74 65 64 20 .../* Decrypted
22e70 64 61 74 61 20 74 6f 6f 20 6c 61 72 67 65 20 2a data too large *
22e80 2f 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 /.....retval = C
22e90 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d KR_BUFFER_TOO_SM
22ea0 41 4c 4c 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b ALL;....} else {
22eb0 0a 09 09 09 09 69 66 20 28 70 50 61 72 74 29 20 .....if (pPart)
22ec0 7b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 70 50 {......memcpy(pP
22ed0 61 72 74 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e art, buf, buflen
22ee0 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2a 70 );.....}......*p
22ef0 75 6c 50 61 72 74 4c 65 6e 20 3d 20 62 75 66 6c ulPartLen = bufl
22f00 65 6e 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 en;......retval
22f10 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a = CKR_OK;....}..
22f20 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 6d ...break;..}...m
22f30 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 utex_retval = ca
22f40 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 ckey_mutex_unloc
22f50 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
22f60 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 );..if (mutex_re
22f70 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 tval != 0) {...C
22f80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
22f90 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f TF("Error. Unlo
22fa0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b cking failed.");
22fb0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 ....return(CKR_G
22fc0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 ENERAL_ERROR);..
22fd0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 }...CACKEY_DEBUG
22fe0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
22ff0 6e 67 20 25 69 22 2c 20 28 69 6e 74 29 20 72 65 ng %i", (int) re
23000 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 tval);...return(
23010 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 retval);.}..CK_D
23020 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 EFINE_FUNCTION(C
23030 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 46 K_RV, C_DecryptF
23040 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e inal)(CK_SESSION
23050 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e _HANDLE hSession
23060 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4c , CK_BYTE_PTR pL
23070 61 73 74 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e astPart, CK_ULON
23080 47 5f 50 54 52 20 70 75 6c 4c 61 73 74 50 61 72 G_PTR pulLastPar
23090 74 4c 65 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 tLen) {..int mut
230a0 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 ex_retval;..int
230b0 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79 70 terminate_decryp
230c0 74 20 3d 20 31 3b 0a 0a 09 43 41 43 4b 45 59 5f t = 1;...CACKEY_
230d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
230e0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 lled.");...if (!
230f0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a cackey_initializ
23100 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...CACKEY_D
23110 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
23120 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c or. Not initial
23130 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 ized.");....retu
23140 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f rn(CKR_CRYPTOKI_
23150 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 NOT_INITIALIZED)
23160 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 ;..}...if (hSess
23170 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 ion == 0 || hSes
23180 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 sion >= (sizeof(
23190 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 cackey_sessions)
231a0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 / sizeof(cackey
231b0 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 _sessions[0])))
231c0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
231d0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
231e0 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 Session out of
231f0 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 range.");......r
23200 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f eturn(CKR_SESSIO
23210 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 N_HANDLE_INVALID
23220 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 4c );..}...if (pulL
23230 61 73 74 50 61 72 74 4c 65 6e 20 3d 3d 20 4e 55 astPartLen == NU
23240 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 LL) {...CACKEY_D
23250 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
23260 6f 72 2e 20 70 75 6c 4c 61 73 74 50 61 72 74 4c or. pulLastPartL
23270 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a en is NULL.");..
23280 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 ..return(CKR_ARG
23290 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a UMENTS_BAD);..}.
232a0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d ..mutex_retval =
232b0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f cackey_mutex_lo
232c0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
232d0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 k);..if (mutex_r
232e0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 etval != 0) {...
232f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
23300 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 NTF("Error. Loc
23310 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a king failed.");.
23320 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 ...return(CKR_GE
23330 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d NERAL_ERROR);..}
23340 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 ...if (!cackey_s
23350 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
23360 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 ].active) {...ca
23370 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 ckey_mutex_unloc
23380 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
23390 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 );....CACKEY_DEB
233a0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
233b0 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 . Session not a
233c0 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 ctive.");......r
233d0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f eturn(CKR_SESSIO
233e0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 N_HANDLE_INVALID
233f0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 );..}...if (!cac
23400 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
23410 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 ssion].decrypt_a
23420 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 ctive) {...cacke
23430 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
23440 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
23450 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
23460 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
23470 44 65 63 72 79 70 74 20 6e 6f 74 20 61 63 74 69 Decrypt not acti
23480 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 ve.");......retu
23490 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e rn(CKR_OPERATION
234a0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 _NOT_INITIALIZED
234b0 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 4c 61 73 74 );..}...*pulLast
234c0 50 61 72 74 4c 65 6e 20 3d 20 30 3b 0a 0a 09 69 PartLen = 0;...i
234d0 66 20 28 70 4c 61 73 74 50 61 72 74 20 3d 3d 20 f (pLastPart ==
234e0 4e 55 4c 4c 29 20 7b 0a 09 09 74 65 72 6d 69 6e NULL) {...termin
234f0 61 74 65 5f 64 65 63 72 79 70 74 20 3d 20 30 3b ate_decrypt = 0;
23500 0a 09 7d 0a 0a 09 69 66 20 28 74 65 72 6d 69 6e ..}...if (termin
23510 61 74 65 5f 64 65 63 72 79 70 74 29 20 7b 0a 09 ate_decrypt) {..
23520 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 .cackey_sessions
23530 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 [hSession].decry
23540 70 74 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 pt_active = 0;..
23550 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c }...mutex_retval
23560 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f = cackey_mutex_
23570 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 unlock(cackey_bi
23580 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 glock);..if (mut
23590 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 ex_retval != 0)
235a0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
235b0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
235c0 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 Unlocking faile
235d0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
235e0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f CKR_GENERAL_ERRO
235f0 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f R);..}...CACKEY_
23600 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
23610 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 turning CKR_OK (
23620 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a %i)", CKR_OK);..
23630 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b .return(CKR_OK);
23640 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 .}..CK_DEFINE_FU
23650 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f NCTION(CK_RV, C_
23660 44 69 67 65 73 74 49 6e 69 74 29 28 43 4b 5f 53 DigestInit)(CK_S
23670 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 ESSION_HANDLE hS
23680 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 ession, CK_MECHA
23690 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e NISM_PTR pMechan
236a0 69 73 6d 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 ism) {..CACKEY_D
236b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
236c0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 led.");...if (!c
236d0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 ackey_initialize
236e0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 d) {...CACKEY_DE
236f0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
23700 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 r. Not initiali
23710 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 zed.");....retur
23720 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e n(CKR_CRYPTOKI_N
23730 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b OT_INITIALIZED);
23740 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 ..}...CACKEY_DEB
23750 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
23760 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f ning CKR_FUNCTIO
23770 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 N_NOT_SUPPORTED
23780 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 (%i)", CKR_FUNCT
23790 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
237a0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 D);...return(CKR
237b0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
237c0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f PPORTED);.}..CK_
237d0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 DEFINE_FUNCTION(
237e0 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 29 CK_RV, C_Digest)
237f0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 (CK_SESSION_HAND
23800 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f LE hSession, CK_
23810 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 BYTE_PTR pData,
23820 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c CK_ULONG ulDataL
23830 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 en, CK_BYTE_PTR
23840 70 44 69 67 65 73 74 2c 20 43 4b 5f 55 4c 4f 4e pDigest, CK_ULON
23850 47 5f 50 54 52 20 70 75 6c 44 69 67 65 73 74 4c G_PTR pulDigestL
23860 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 en) {..CACKEY_DE
23870 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
23880 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 ed.");...if (!ca
23890 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 ckey_initialized
238a0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
238b0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
238c0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a . Not initializ
238d0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
238e0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f (CKR_CRYPTOKI_NO
238f0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a T_INITIALIZED);.
23900 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 .}...CACKEY_DEBU
23910 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
23920 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e ing CKR_FUNCTION
23930 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 _NOT_SUPPORTED (
23940 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 %i)", CKR_FUNCTI
23950 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
23960 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f );...return(CKR_
23970 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
23980 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 PORTED);.}..CK_D
23990 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 EFINE_FUNCTION(C
239a0 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 55 70 K_RV, C_DigestUp
239b0 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e date)(CK_SESSION
239c0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e _HANDLE hSession
239d0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 , CK_BYTE_PTR pP
239e0 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c art, CK_ULONG ul
239f0 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b PartLen) {..CACK
23a00 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
23a10 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 "Called.");...if
23a20 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 (!cackey_initia
23a30 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 lized) {...CACKE
23a40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
23a50 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 Error. Not init
23a60 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 ialized.");....r
23a70 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f eturn(CKR_CRYPTO
23a80 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a KI_NOT_INITIALIZ
23a90 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 ED);..}...CACKEY
23aa0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
23ab0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e eturning CKR_FUN
23ac0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
23ad0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 TED (%i)", CKR_F
23ae0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
23af0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e ORTED);...return
23b00 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f (CKR_FUNCTION_NO
23b10 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a T_SUPPORTED);.}.
23b20 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 .CK_DEFINE_FUNCT
23b30 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 ION(CK_RV, C_Dig
23b40 65 73 74 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 estKey)(CK_SESSI
23b50 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 ON_HANDLE hSessi
23b60 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 on, CK_OBJECT_HA
23b70 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 NDLE hKey) {..CA
23b80 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
23b90 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
23ba0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 if (!cackey_init
23bb0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 ialized) {...CAC
23bc0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
23bd0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e ("Error. Not in
23be0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 itialized.");...
23bf0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 .return(CKR_CRYP
23c00 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c TOKI_NOT_INITIAL
23c10 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b IZED);..}...CACK
23c20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
23c30 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 "Returning CKR_F
23c40 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
23c50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 ORTED (%i)", CKR
23c60 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
23c70 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 PPORTED);...retu
23c80 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f rn(CKR_FUNCTION_
23c90 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
23ca0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e }..CK_DEFINE_FUN
23cb0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 CTION(CK_RV, C_D
23cc0 69 67 65 73 74 46 69 6e 61 6c 29 28 43 4b 5f 53 igestFinal)(CK_S
23cd0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 ESSION_HANDLE hS
23ce0 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f ession, CK_BYTE_
23cf0 50 54 52 20 70 44 69 67 65 73 74 2c 20 43 4b 5f PTR pDigest, CK_
23d00 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 69 67 ULONG_PTR pulDig
23d10 65 73 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 estLen) {..CACKE
23d20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
23d30 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 Called.");...if
23d40 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c (!cackey_initial
23d50 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 ized) {...CACKEY
23d60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
23d70 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 rror. Not initi
23d80 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 alized.");....re
23d90 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b turn(CKR_CRYPTOK
23da0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 I_NOT_INITIALIZE
23db0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f D);..}...CACKEY_
23dc0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
23dd0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 turning CKR_FUNC
23de0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
23df0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 ED (%i)", CKR_FU
23e00 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
23e10 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 RTED);...return(
23e20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
23e30 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a _SUPPORTED);.}..
23e40 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 CK_DEFINE_FUNCTI
23e50 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e ON(CK_RV, C_Sign
23e60 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e Init)(CK_SESSION
23e70 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e _HANDLE hSession
23e80 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 , CK_MECHANISM_P
23e90 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 TR pMechanism, C
23ea0 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 K_OBJECT_HANDLE
23eb0 68 4b 65 79 29 20 7b 0a 09 69 6e 74 20 6d 75 74 hKey) {..int mut
23ec0 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 68 4b 65 ex_retval;...hKe
23ed0 79 2d 2d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 y--;...CACKEY_DE
23ee0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
23ef0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 ed.");...if (!ca
23f00 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 ckey_initialized
23f10 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
23f20 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
23f30 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a . Not initializ
23f40 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
23f50 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f (CKR_CRYPTOKI_NO
23f60 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a T_INITIALIZED);.
23f70 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e .}...if (pMechan
23f80 69 73 6d 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ism == NULL) {..
23f90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
23fa0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 INTF("Error. pMe
23fb0 63 68 61 6e 69 73 6d 20 69 73 20 4e 55 4c 4c 2e chanism is NULL.
23fc0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
23fd0 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 R_ARGUMENTS_BAD)
23fe0 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 ;..}...if (pMech
23ff0 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d anism->mechanism
24000 20 21 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 != CKM_RSA_PKCS
24010 20 26 26 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e && pMechanism->
24020 6d 65 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d mechanism != CKM
24030 5f 53 48 41 31 5f 52 53 41 5f 50 4b 43 53 29 20 _SHA1_RSA_PKCS)
24040 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
24050 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
24060 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 pMechanism->mech
24070 61 6e 69 73 6d 20 6e 6f 74 20 73 70 65 63 69 66 anism not specif
24080 69 65 64 20 61 73 20 43 4b 4d 5f 52 53 41 5f 50 ied as CKM_RSA_P
24090 4b 43 53 20 6f 72 20 43 4b 4d 5f 53 48 41 31 5f KCS or CKM_SHA1_
240a0 52 53 41 5f 50 4b 43 53 22 29 3b 0a 0a 09 09 72 RSA_PKCS");....r
240b0 65 74 75 72 6e 28 43 4b 52 5f 4d 45 43 48 41 4e eturn(CKR_MECHAN
240c0 49 53 4d 5f 50 41 52 41 4d 5f 49 4e 56 41 4c 49 ISM_PARAM_INVALI
240d0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 D);..}...if (hSe
240e0 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 ssion == 0 || hS
240f0 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f ession >= (sizeo
24100 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e f(cackey_session
24110 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b s) / sizeof(cack
24120 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 ey_sessions[0]))
24130 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
24140 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
24150 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f . Session out o
24160 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 f range.");.....
24170 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 .return(CKR_SESS
24180 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c ION_HANDLE_INVAL
24190 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f ID);..}...mutex_
241a0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f retval = cackey_
241b0 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 mutex_lock(cacke
241c0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 y_biglock);..if
241d0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d (mutex_retval !=
241e0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 0) {...CACKEY_D
241f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
24200 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 or. Locking fai
24210 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 led.");....retur
24220 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 n(CKR_GENERAL_ER
24230 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 ROR);..}...if (!
24240 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
24250 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 hSession].active
24260 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 ) {...cackey_mut
24270 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 ex_unlock(cackey
24280 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 _biglock);....CA
24290 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
242a0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 F("Error. Sessi
242b0 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 on not active.")
242c0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b ;......return(CK
242d0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 R_SESSION_HANDLE
242e0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 _INVALID);..}...
242f0 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 if (cackey_sessi
24300 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 ons[hSession].si
24310 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 gn_active) {...c
24320 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f ackey_mutex_unlo
24330 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
24340 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 k);....CACKEY_DE
24350 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
24360 72 2e 20 20 53 69 67 6e 20 61 6c 72 65 61 64 79 r. Sign already
24370 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 22 29 3b in progress.");
24380 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 ......return(CKR
24390 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 _OPERATION_ACTIV
243a0 45 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65 E);..}...if (hKe
243b0 79 20 3e 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 y >= cackey_sess
243c0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 ions[hSession].i
243d0 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 dentities_count)
243e0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 {...cackey_mute
243f0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
24400 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 biglock);....CAC
24410 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
24420 28 22 45 72 72 6f 72 2e 20 20 4b 65 79 20 68 61 ("Error. Key ha
24430 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 ndle out of rang
24440 65 20 28 72 65 71 75 65 73 74 65 64 20 6b 65 79 e (requested key
24450 20 25 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75 20 69 %lu, only %lu i
24460 64 65 6e 74 69 74 69 65 73 20 61 76 61 69 6c 61 dentities availa
24470 62 6c 65 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 ble).", (unsigne
24480 64 20 6c 6f 6e 67 29 20 68 4b 65 79 2c 20 28 75 d long) hKey, (u
24490 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61 nsigned long) ca
244a0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
244b0 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 ession].identiti
244c0 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 es_count);....re
244d0 74 75 72 6e 28 43 4b 52 5f 4b 45 59 5f 48 41 4e turn(CKR_KEY_HAN
244e0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d DLE_INVALID);..}
244f0 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f ...cackey_sessio
24500 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 ns[hSession].sig
24510 6e 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a 09 n_active = 1;...
24520 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
24530 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d hSession].sign_m
24540 65 63 68 61 6e 69 73 6d 20 3d 20 70 4d 65 63 68 echanism = pMech
24550 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d anism->mechanism
24560 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 ;...cackey_sessi
24570 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 ons[hSession].si
24580 67 6e 5f 62 75 66 6c 65 6e 20 3d 20 31 32 38 3b gn_buflen = 128;
24590 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e ..cackey_session
245a0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e s[hSession].sign
245b0 5f 62 75 66 75 73 65 64 20 3d 20 30 3b 0a 09 63 _bufused = 0;..c
245c0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
245d0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 Session].sign_bu
245e0 66 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f f = malloc(sizeo
245f0 66 28 2a 63 61 63 6b 65 79 5f 73 65 73 73 69 6f f(*cackey_sessio
24600 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 ns[hSession].sig
24610 6e 5f 62 75 66 29 20 2a 20 63 61 63 6b 65 79 5f n_buf) * cackey_
24620 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
24630 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29 3b n].sign_buflen);
24640 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
24650 50 52 49 4e 54 46 28 22 53 65 73 73 69 6f 6e 20 PRINTF("Session
24660 25 6c 75 20 73 69 67 6e 5f 69 64 65 6e 74 69 74 %lu sign_identit
24670 79 20 69 73 20 25 70 20 28 69 64 65 6e 74 69 74 y is %p (identit
24680 79 20 23 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 y #%lu)", (unsig
24690 6e 65 64 20 6c 6f 6e 67 29 20 68 53 65 73 73 69 ned long) hSessi
246a0 6f 6e 2c 20 26 63 61 63 6b 65 79 5f 73 65 73 73 on, &cackey_sess
246b0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 ions[hSession].i
246c0 64 65 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d 2c dentities[hKey],
246d0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
246e0 20 68 4b 65 79 29 3b 0a 09 63 61 63 6b 65 79 5f hKey);..cackey_
246f0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
24700 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 n].sign_identity
24710 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 = &cackey_sessi
24720 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 ons[hSession].id
24730 65 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d 3b 0a entities[hKey];.
24740 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d ..mutex_retval =
24750 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e cackey_mutex_un
24760 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
24770 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 ock);..if (mutex
24780 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a _retval != 0) {.
24790 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
247a0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 RINTF("Error. U
247b0 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e nlocking failed.
247c0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
247d0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 R_GENERAL_ERROR)
247e0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ;..}...CACKEY_DE
247f0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
24800 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 rning CKR_OK (%i
24810 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 )", CKR_OK);...r
24820 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d eturn(CKR_OK);.}
24830 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 ..CK_DEFINE_FUNC
24840 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 TION(CK_RV, C_Si
24850 67 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 gn)(CK_SESSION_H
24860 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 ANDLE hSession,
24870 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 CK_BYTE_PTR pDat
24880 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 a, CK_ULONG ulDa
24890 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 taLen, CK_BYTE_P
248a0 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 TR pSignature, C
248b0 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 K_ULONG_PTR pulS
248c0 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 ignatureLen) {..
248d0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 74 unsigned long st
248e0 61 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 art_sign_bufused
248f0 3b 0a 09 43 4b 5f 52 56 20 73 69 67 6e 5f 72 65 ;..CK_RV sign_re
24900 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 t;...CACKEY_DEBU
24910 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 G_PRINTF("Called
24920 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b .");...if (!cack
24930 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 ey_initialized)
24940 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
24950 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
24960 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 Not initialized
24970 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
24980 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f KR_CRYPTOKI_NOT_
24990 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d INITIALIZED);..}
249a0 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 ...if (hSession
249b0 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e == 0 || hSession
249c0 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b >= (sizeof(cack
249d0 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 ey_sessions) / s
249e0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 izeof(cackey_ses
249f0 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 sions[0]))) {...
24a00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
24a10 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 NTF("Error. Ses
24a20 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 sion out of rang
24a30 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 e.");......retur
24a40 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 n(CKR_SESSION_HA
24a50 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 NDLE_INVALID);..
24a60 7d 0a 0a 09 73 74 61 72 74 5f 73 69 67 6e 5f 62 }...start_sign_b
24a70 75 66 75 73 65 64 20 3d 20 63 61 63 6b 65 79 5f ufused = cackey_
24a80 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
24a90 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 3b n].sign_bufused;
24aa0 0a 0a 09 73 69 67 6e 5f 72 65 74 20 3d 20 43 5f ...sign_ret = C_
24ab0 53 69 67 6e 55 70 64 61 74 65 28 68 53 65 73 73 SignUpdate(hSess
24ac0 69 6f 6e 2c 20 70 44 61 74 61 2c 20 75 6c 44 61 ion, pData, ulDa
24ad0 74 61 4c 65 6e 29 3b 0a 09 69 66 20 28 73 69 67 taLen);..if (sig
24ae0 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 n_ret != CKR_OK)
24af0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
24b00 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
24b10 20 20 53 69 67 6e 55 70 64 61 74 65 28 29 20 72 SignUpdate() r
24b20 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20 eturned failure
24b30 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 (rv = %lu).", (u
24b40 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 nsigned long) si
24b50 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 gn_ret);....retu
24b60 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 7d rn(sign_ret);..}
24b70 0a 0a 09 73 69 67 6e 5f 72 65 74 20 3d 20 43 5f ...sign_ret = C_
24b80 53 69 67 6e 46 69 6e 61 6c 28 68 53 65 73 73 69 SignFinal(hSessi
24b90 6f 6e 2c 20 70 53 69 67 6e 61 74 75 72 65 2c 20 on, pSignature,
24ba0 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 pulSignatureLen)
24bb0 3b 0a 09 69 66 20 28 73 69 67 6e 5f 72 65 74 20 ;..if (sign_ret
24bc0 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 69 != CKR_OK) {...i
24bd0 66 20 28 73 69 67 6e 5f 72 65 74 20 3d 3d 20 43 f (sign_ret == C
24be0 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d KR_BUFFER_TOO_SM
24bf0 41 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 ALL) {....CACKEY
24c00 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 _DEBUG_PRINTF("S
24c10 69 67 6e 46 69 6e 61 6c 28 29 20 72 65 74 75 72 ignFinal() retur
24c20 6e 65 64 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 ned CKR_BUFFER_T
24c30 4f 4f 5f 53 4d 41 4c 4c 20 28 72 76 20 3d 20 25 OO_SMALL (rv = %
24c40 6c 75 29 2c 20 75 6e 64 6f 69 6e 67 20 43 5f 53 lu), undoing C_S
24c50 69 67 6e 55 70 64 61 74 65 28 29 22 2c 20 28 75 ignUpdate()", (u
24c60 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 nsigned long) si
24c70 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 09 63 61 63 gn_ret);.....cac
24c80 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
24c90 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 ssion].sign_bufu
24ca0 73 65 64 20 3d 20 73 74 61 72 74 5f 73 69 67 6e sed = start_sign
24cb0 5f 62 75 66 75 73 65 64 3b 0a 0a 09 09 09 72 65 _bufused;.....re
24cc0 74 75 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a turn(sign_ret);.
24cd0 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 ..}....CACKEY_DE
24ce0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
24cf0 72 2e 20 20 53 69 67 6e 46 69 6e 61 6c 28 29 20 r. SignFinal()
24d00 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65 returned failure
24d10 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 (rv = %lu).", (
24d20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 unsigned long) s
24d30 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 ign_ret);....ret
24d40 75 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 urn(sign_ret);..
24d50 7d 0a 0a 09 69 66 20 28 70 53 69 67 6e 61 74 75 }...if (pSignatu
24d60 72 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 re == NULL) {...
24d70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
24d80 4e 54 46 28 22 70 53 69 67 6e 61 74 75 72 65 20 NTF("pSignature
24d90 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c specified as NUL
24da0 4c 2c 20 75 6e 64 6f 69 6e 67 20 43 5f 53 69 67 L, undoing C_Sig
24db0 6e 55 70 64 61 74 65 28 29 22 29 3b 0a 0a 09 09 nUpdate()");....
24dc0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
24dd0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 hSession].sign_b
24de0 75 66 75 73 65 64 20 3d 20 73 74 61 72 74 5f 73 ufused = start_s
24df0 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 0a 09 09 ign_bufused;....
24e00 72 65 74 75 72 6e 28 73 69 67 6e 5f 72 65 74 29 return(sign_ret)
24e10 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ;..}...CACKEY_DE
24e20 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
24e30 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 rning CKR_OK (%i
24e40 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 )", CKR_OK);...r
24e50 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d eturn(CKR_OK);.}
24e60 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 ..CK_DEFINE_FUNC
24e70 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 TION(CK_RV, C_Si
24e80 67 6e 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 gnUpdate)(CK_SES
24e90 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 SION_HANDLE hSes
24ea0 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 sion, CK_BYTE_PT
24eb0 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e R pPart, CK_ULON
24ec0 47 20 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 G ulPartLen) {..
24ed0 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c int mutex_retval
24ee0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ;...CACKEY_DEBUG
24ef0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
24f00 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ");...if (!cacke
24f10 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b y_initialized) {
24f20 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
24f30 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
24f40 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e Not initialized.
24f50 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
24f60 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 R_CRYPTOKI_NOT_I
24f70 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
24f80 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d ..if (hSession =
24f90 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 = 0 || hSession
24fa0 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 >= (sizeof(cacke
24fb0 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 y_sessions) / si
24fc0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 zeof(cackey_sess
24fd0 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 ions[0]))) {...C
24fe0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
24ff0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 TF("Error. Sess
25000 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 ion out of range
25010 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e .");......return
25020 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e (CKR_SESSION_HAN
25030 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d DLE_INVALID);..}
25040 0a 0a 09 69 66 20 28 70 50 61 72 74 20 3d 3d 20 ...if (pPart ==
25050 4e 55 4c 4c 20 26 26 20 75 6c 50 61 72 74 4c 65 NULL && ulPartLe
25060 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 n == 0) {.../* S
25070 68 6f 72 74 20 63 69 72 63 75 69 74 20 69 66 20 hort circuit if
25080 77 65 20 61 72 65 20 61 73 6b 65 64 20 74 6f 20 we are asked to
25090 73 69 67 6e 20 6e 6f 74 68 69 6e 67 2e 2e 2e 20 sign nothing...
250a0 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 */...CACKEY_DEBU
250b0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
250c0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 ing CKR_OK (%i)
250d0 28 73 68 6f 72 74 20 63 69 72 63 75 69 74 29 22 (short circuit)"
250e0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 , CKR_OK);....re
250f0 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d turn(CKR_OK);..}
25100 0a 0a 09 69 66 20 28 70 50 61 72 74 20 3d 3d 20 ...if (pPart ==
25110 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 NULL) {...CACKEY
25120 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
25130 72 72 6f 72 2e 20 70 50 61 72 74 20 69 73 20 4e rror. pPart is N
25140 55 4c 4c 2c 20 62 75 74 20 75 6c 50 61 72 74 4c ULL, but ulPartL
25150 65 6e 20 69 73 20 6e 6f 74 20 30 2e 22 29 3b 0a en is not 0.");.
25160 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 ...return(CKR_AR
25170 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d GUMENTS_BAD);..}
25180 0a 0a 09 69 66 20 28 75 6c 50 61 72 74 4c 65 6e ...if (ulPartLen
25190 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 == 0) {...CACKE
251a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
251b0 45 72 72 6f 72 2e 20 75 6c 50 61 72 74 4c 65 6e Error. ulPartLen
251c0 20 69 73 20 30 2c 20 62 75 74 20 70 50 61 72 74 is 0, but pPart
251d0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b is not NULL.");
251e0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 ....return(CKR_A
251f0 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 RGUMENTS_BAD);..
25200 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c }...mutex_retval
25210 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f = cackey_mutex_
25220 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
25230 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 ock);..if (mutex
25240 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a _retval != 0) {.
25250 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
25260 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c RINTF("Error. L
25270 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 ocking failed.")
25280 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
25290 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a GENERAL_ERROR);.
252a0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 .}...if (!cackey
252b0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
252c0 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 on].active) {...
252d0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c cackey_mutex_unl
252e0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
252f0 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 ck);....CACKEY_D
25300 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
25310 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 or. Session not
25320 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 active.");.....
25330 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 .return(CKR_SESS
25340 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c ION_HANDLE_INVAL
25350 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 ID);..}...if (!c
25360 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
25370 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 Session].sign_ac
25380 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 tive) {...cackey
25390 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 _mutex_unlock(ca
253a0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a ckey_biglock);..
253b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
253c0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 RINTF("Error. S
253d0 69 67 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 ign not active."
253e0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 );......return(C
253f0 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 KR_OPERATION_NOT
25400 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 _INITIALIZED);..
25410 7d 0a 0a 09 73 77 69 74 63 68 20 28 63 61 63 6b }...switch (cack
25420 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
25430 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 sion].sign_mecha
25440 6e 69 73 6d 29 20 7b 0a 09 09 63 61 73 65 20 43 nism) {...case C
25450 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 KM_RSA_PKCS:....
25460 2f 2a 20 41 63 63 75 6d 75 6c 61 74 65 20 64 69 /* Accumulate di
25470 72 65 63 74 6c 79 20 2a 2f 0a 09 09 09 69 66 20 rectly */....if
25480 28 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e ((cackey_session
25490 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e s[hSession].sign
254a0 5f 62 75 66 75 73 65 64 20 2b 20 75 6c 50 61 72 _bufused + ulPar
254b0 74 4c 65 6e 29 20 3e 20 63 61 63 6b 65 79 5f 73 tLen) > cackey_s
254c0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
254d0 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29 20 7b ].sign_buflen) {
254e0 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 .....cackey_sess
254f0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 ions[hSession].s
25500 69 67 6e 5f 62 75 66 6c 65 6e 20 2a 3d 20 32 3b ign_buflen *= 2;
25510 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 65 73 ......cackey_ses
25520 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
25530 73 69 67 6e 5f 62 75 66 20 3d 20 72 65 61 6c 6c sign_buf = reall
25540 6f 63 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f oc(cackey_sessio
25550 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 ns[hSession].sig
25560 6e 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28 2a 63 n_buf, sizeof(*c
25570 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
25580 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 Session].sign_bu
25590 66 29 20 2a 20 63 61 63 6b 65 79 5f 73 65 73 73 f) * cackey_sess
255a0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 ions[hSession].s
255b0 69 67 6e 5f 62 75 66 6c 65 6e 29 3b 0a 09 09 09 ign_buflen);....
255c0 7d 0a 0a 09 09 09 6d 65 6d 63 70 79 28 63 61 63 }.....memcpy(cac
255d0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
255e0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 ssion].sign_buf
255f0 2b 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e + cackey_session
25600 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e s[hSession].sign
25610 5f 62 75 66 75 73 65 64 2c 20 70 50 61 72 74 2c _bufused, pPart,
25620 20 75 6c 50 61 72 74 4c 65 6e 29 3b 0a 0a 09 09 ulPartLen);....
25630 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 .cackey_sessions
25640 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f [hSession].sign_
25650 62 75 66 75 73 65 64 20 2b 3d 20 75 6c 50 61 72 bufused += ulPar
25660 74 4c 65 6e 3b 0a 0a 09 09 09 62 72 65 61 6b 3b tLen;.....break;
25670 0a 09 09 63 61 73 65 20 43 4b 4d 5f 53 48 41 31 ...case CKM_SHA1
25680 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a _RSA_PKCS:..../*
25690 20 58 58 58 3a 20 41 63 63 75 6d 75 6c 61 74 65 XXX: Accumulate
256a0 20 69 6e 74 6f 20 61 20 53 48 41 31 20 68 61 73 into a SHA1 has
256b0 68 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 6d h */....cackey_m
256c0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b utex_unlock(cack
256d0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 ey_biglock);....
256e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
256f0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
25700 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
25710 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 _SUPPORTED (%i)"
25720 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e , CKR_FUNCTION_N
25730 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a OT_SUPPORTED);..
25740 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 ...return(CKR_FU
25750 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
25760 52 54 45 44 29 3b 0a 09 09 09 62 72 65 61 6b 3b RTED);....break;
25770 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 ..}...mutex_retv
25780 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 al = cackey_mute
25790 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
257a0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d biglock);..if (m
257b0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 utex_retval != 0
257c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
257d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
257e0 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 . Unlocking fai
257f0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 led.");....retur
25800 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 n(CKR_GENERAL_ER
25810 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 ROR);..}...CACKE
25820 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
25830 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b Returning CKR_OK
25840 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b (%i)", CKR_OK);
25850 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b ...return(CKR_OK
25860 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f );.}..CK_DEFINE_
25870 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 FUNCTION(CK_RV,
25880 43 5f 53 69 67 6e 46 69 6e 61 6c 29 28 43 4b 5f C_SignFinal)(CK_
25890 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 SESSION_HANDLE h
258a0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 Session, CK_BYTE
258b0 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c _PTR pSignature,
258c0 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 CK_ULONG_PTR pu
258d0 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b lSignatureLen) {
258e0 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 59 54 45 ..static CK_BYTE
258f0 20 73 69 67 62 75 66 5b 31 30 32 34 5d 3b 0a 09 sigbuf[1024];..
25900 73 73 69 7a 65 5f 74 20 73 69 67 62 75 66 6c 65 ssize_t sigbufle
25910 6e 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 n;..CK_SLOT_ID s
25920 6c 6f 74 49 44 3b 0a 09 43 4b 5f 52 56 20 72 65 lotID;..CK_RV re
25930 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 tval = CKR_GENER
25940 41 4c 5f 45 52 52 4f 52 3b 0a 09 69 6e 74 20 74 AL_ERROR;..int t
25950 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 erminate_sign =
25960 31 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 1;..int mutex_re
25970 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 tval;...CACKEY_D
25980 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
25990 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 led.");...if (!c
259a0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 ackey_initialize
259b0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 d) {...CACKEY_DE
259c0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
259d0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 r. Not initiali
259e0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 zed.");....retur
259f0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e n(CKR_CRYPTOKI_N
25a00 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b OT_INITIALIZED);
25a10 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 53 69 67 ..}...if (pulSig
25a20 6e 61 74 75 72 65 4c 65 6e 20 3d 3d 20 4e 55 4c natureLen == NUL
25a30 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 L) {...CACKEY_DE
25a40 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
25a50 72 2e 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c r. pulSignatureL
25a60 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a en is NULL.");..
25a70 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 ..return(CKR_ARG
25a80 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a UMENTS_BAD);..}.
25a90 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d ..if (hSession =
25aa0 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 = 0 || hSession
25ab0 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 >= (sizeof(cacke
25ac0 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 y_sessions) / si
25ad0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 zeof(cackey_sess
25ae0 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 ions[0]))) {...C
25af0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
25b00 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 TF("Error. Sess
25b10 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 ion out of range
25b20 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e .");......return
25b30 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e (CKR_SESSION_HAN
25b40 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d DLE_INVALID);..}
25b50 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 ...mutex_retval
25b60 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c = cackey_mutex_l
25b70 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
25b80 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f ck);..if (mutex_
25b90 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 retval != 0) {..
25ba0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
25bb0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f INTF("Error. Lo
25bc0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b cking failed.");
25bd0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 ....return(CKR_G
25be0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 ENERAL_ERROR);..
25bf0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f }...if (!cackey_
25c00 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
25c10 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 n].active) {...c
25c20 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f ackey_mutex_unlo
25c30 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
25c40 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 k);....CACKEY_DE
25c50 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
25c60 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 r. Session not
25c70 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 active.");......
25c80 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 return(CKR_SESSI
25c90 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 ON_HANDLE_INVALI
25ca0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 D);..}...if (!ca
25cb0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
25cc0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 ession].sign_act
25cd0 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f ive) {...cackey_
25ce0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 mutex_unlock(cac
25cf0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 key_biglock);...
25d00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
25d10 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 INTF("Error. Si
25d20 67 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 gn not active.")
25d30 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b ;......return(CK
25d40 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f R_OPERATION_NOT_
25d50 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d INITIALIZED);..}
25d60 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b ...slotID = cack
25d70 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
25d80 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 sion].slotID;...
25d90 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c if (slotID < 0 |
25da0 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a | slotID >= (siz
25db0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 eof(cackey_slots
25dc0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 ) / sizeof(cacke
25dd0 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a y_slots[0]))) {.
25de0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
25df0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e RINTF("Error. In
25e00 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 valid slot reque
25e10 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 sted (%lu), outs
25e20 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e ide of valid ran
25e30 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 ge", slotID);...
25e40 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 .return(CKR_GENE
25e50 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a RAL_ERROR);..}..
25e60 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 .if (cackey_slot
25e70 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 s[slotID].active
25e80 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 == 0) {...CACKE
25e90 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
25ea0 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 Error. Invalid s
25eb0 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 lot requested (%
25ec0 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 lu), slot not cu
25ed0 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c rrently active",
25ee0 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 slotID);....cac
25ef0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b key_mutex_unlock
25f00 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 (cackey_biglock)
25f10 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
25f20 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a GENERAL_ERROR);.
25f30 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 63 61 63 .}...switch (cac
25f40 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
25f50 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68 ssion].sign_mech
25f60 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61 73 65 20 anism) {...case
25f70 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 CKM_RSA_PKCS:...
25f80 09 2f 2a 20 41 73 6b 20 63 61 72 64 20 74 6f 20 ./* Ask card to
25f90 73 69 67 6e 20 2a 2f 0a 09 09 09 43 41 43 4b 45 sign */....CACKE
25fa0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
25fb0 41 73 6b 69 6e 67 20 74 6f 20 73 69 67 6e 20 66 Asking to sign f
25fc0 72 6f 6d 20 69 64 65 6e 74 69 74 79 20 25 70 20 rom identity %p
25fd0 69 6e 20 73 65 73 73 69 6f 6e 20 25 6c 75 22 2c in session %lu",
25fe0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 cackey_sessions
25ff0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f [hSession].sign_
26000 69 64 65 6e 74 69 74 79 2c 20 28 75 6e 73 69 67 identity, (unsig
26010 6e 65 64 20 6c 6f 6e 67 29 20 68 53 65 73 73 69 ned long) hSessi
26020 6f 6e 29 3b 0a 09 09 09 73 69 67 62 75 66 6c 65 on);....sigbufle
26030 6e 20 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 n = cackey_signd
26040 65 63 72 79 70 74 28 26 63 61 63 6b 65 79 5f 73 ecrypt(&cackey_s
26050 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 lots[slotID], ca
26060 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
26070 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 ession].sign_ide
26080 6e 74 69 74 79 2c 20 63 61 63 6b 65 79 5f 73 65 ntity, cackey_se
26090 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
260a0 2e 73 69 67 6e 5f 62 75 66 2c 20 63 61 63 6b 65 .sign_buf, cacke
260b0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
260c0 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 ion].sign_bufuse
260d0 64 2c 20 73 69 67 62 75 66 2c 20 73 69 7a 65 6f d, sigbuf, sizeo
260e0 66 28 73 69 67 62 75 66 29 2c 20 31 2c 20 30 29 f(sigbuf), 1, 0)
260f0 3b 0a 0a 09 09 09 69 66 20 28 73 69 67 62 75 66 ;.....if (sigbuf
26100 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 09 09 2f len < 0) {...../
26110 2a 20 53 69 67 6e 69 6e 67 20 66 61 69 6c 65 64 * Signing failed
26120 2e 20 2a 2f 0a 09 09 09 09 69 66 20 28 73 69 67 . */.....if (sig
26130 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 buflen == CACKEY
26140 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 _PCSC_E_NEEDLOGI
26150 4e 29 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c N) {......retval
26160 20 3d 20 43 4b 52 5f 55 53 45 52 5f 4e 4f 54 5f = CKR_USER_NOT_
26170 4c 4f 47 47 45 44 5f 49 4e 3b 0a 09 09 09 09 7d LOGGED_IN;.....}
26180 20 65 6c 73 65 20 69 66 20 28 73 69 67 62 75 66 else if (sigbuf
26190 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 len == CACKEY_PC
261a0 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 SC_E_TOKENABSENT
261b0 29 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 ) {......retval
261c0 3d 20 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d = CKR_DEVICE_REM
261d0 4f 56 45 44 3b 0a 09 09 09 09 7d 20 65 6c 73 65 OVED;.....} else
261e0 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d {......retval =
261f0 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 CKR_GENERAL_ERR
26200 4f 52 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 OR;.....}....} e
26210 6c 73 65 20 69 66 20 28 28 28 75 6e 73 69 67 6e lse if (((unsign
26220 65 64 20 6c 6f 6e 67 29 20 73 69 67 62 75 66 6c ed long) sigbufl
26230 65 6e 29 20 3e 20 2a 70 75 6c 53 69 67 6e 61 74 en) > *pulSignat
26240 75 72 65 4c 65 6e 20 26 26 20 70 53 69 67 6e 61 ureLen && pSigna
26250 74 75 72 65 29 20 7b 0a 09 09 09 09 2f 2a 20 53 ture) {...../* S
26260 69 67 6e 65 64 20 64 61 74 61 20 74 6f 6f 20 6c igned data too l
26270 61 72 67 65 20 2a 2f 0a 09 09 09 09 43 41 43 4b arge */.....CACK
26280 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
26290 22 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 "retval = CKR_BU
262a0 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 20 FFER_TOO_SMALL;
262b0 20 73 69 67 62 75 66 6c 65 6e 20 3d 20 25 6c 75 sigbuflen = %lu
262c0 2c 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 , pulSignatureLe
262d0 6e 20 3d 20 25 6c 75 22 2c 20 28 75 6e 73 69 67 n = %lu", (unsig
262e0 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 62 75 66 ned long) sigbuf
262f0 6c 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c len, (unsigned l
26300 6f 6e 67 29 20 2a 70 75 6c 53 69 67 6e 61 74 75 ong) *pulSignatu
26310 72 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 72 65 74 reLen);......ret
26320 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 val = CKR_BUFFER
26330 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 0a 09 09 09 _TOO_SMALL;.....
26340 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 .terminate_sign
26350 3d 20 30 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b = 0;....} else {
26360 0a 09 09 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 .....terminate_s
26370 69 67 6e 20 3d 20 30 3b 0a 0a 09 09 09 09 69 66 ign = 0;......if
26380 20 28 70 53 69 67 6e 61 74 75 72 65 29 20 7b 0a (pSignature) {.
26390 09 09 09 09 09 6d 65 6d 63 70 79 28 70 53 69 67 .....memcpy(pSig
263a0 6e 61 74 75 72 65 2c 20 73 69 67 62 75 66 2c 20 nature, sigbuf,
263b0 73 69 67 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 sigbuflen);.....
263c0 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e ..terminate_sign
263d0 20 3d 20 31 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 = 1;.....}.....
263e0 09 2a 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 .*pulSignatureLe
263f0 6e 20 3d 20 73 69 67 62 75 66 6c 65 6e 3b 0a 0a n = sigbuflen;..
26400 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 ....retval = CKR
26410 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72 _OK;....}.....br
26420 65 61 6b 3b 0a 09 09 63 61 73 65 20 43 4b 4d 5f eak;...case CKM_
26430 53 48 41 31 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 SHA1_RSA_PKCS:..
26440 09 09 2f 2a 20 58 58 58 3a 20 41 63 63 75 6d 75 ../* XXX: Accumu
26450 6c 61 74 65 20 69 6e 74 6f 20 61 20 53 48 41 31 late into a SHA1
26460 20 68 61 73 68 20 2a 2f 0a 09 09 09 63 61 63 6b hash */....cack
26470 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 ey_mutex_unlock(
26480 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
26490 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
264a0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
264b0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e ing CKR_FUNCTION
264c0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 _NOT_SUPPORTED (
264d0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 %i)", CKR_FUNCTI
264e0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
264f0 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b );.....return(CK
26500 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
26510 55 50 50 4f 52 54 45 44 29 3b 0a 09 09 09 62 72 UPPORTED);....br
26520 65 61 6b 3b 0a 09 7d 0a 0a 09 69 66 20 28 74 65 eak;..}...if (te
26530 72 6d 69 6e 61 74 65 5f 73 69 67 6e 29 20 7b 0a rminate_sign) {.
26540 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 ..if (cackey_ses
26550 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
26560 73 69 67 6e 5f 62 75 66 29 20 7b 0a 09 09 09 66 sign_buf) {....f
26570 72 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69 ree(cackey_sessi
26580 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 ons[hSession].si
26590 67 6e 5f 62 75 66 29 3b 0a 09 09 7d 0a 0a 09 09 gn_buf);...}....
265a0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
265b0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 hSession].sign_a
265c0 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 ctive = 0;..}...
265d0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 mutex_retval = c
265e0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f ackey_mutex_unlo
265f0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
26600 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 k);..if (mutex_r
26610 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 etval != 0) {...
26620 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
26630 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c NTF("Error. Unl
26640 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 ocking failed.")
26650 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
26660 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a GENERAL_ERROR);.
26670 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 .}...CACKEY_DEBU
26680 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
26690 69 6e 67 20 25 69 22 2c 20 28 69 6e 74 29 20 72 ing %i", (int) r
266a0 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e etval);...return
266b0 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f (retval);.}..CK_
266c0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 DEFINE_FUNCTION(
266d0 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 52 65 63 CK_RV, C_SignRec
266e0 6f 76 65 72 49 6e 69 74 29 28 43 4b 5f 53 45 53 overInit)(CK_SES
266f0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 SION_HANDLE hSes
26700 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 sion, CK_MECHANI
26710 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 SM_PTR pMechanis
26720 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e m, CK_OBJECT_HAN
26730 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 DLE hKey) {..CAC
26740 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
26750 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 ("Called.");...i
26760 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 f (!cackey_initi
26770 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b alized) {...CACK
26780 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
26790 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 "Error. Not ini
267a0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 tialized.");....
267b0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 return(CKR_CRYPT
267c0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 OKI_NOT_INITIALI
267d0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 ZED);..}...CACKE
267e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
267f0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 Returning CKR_FU
26800 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
26810 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f RTED (%i)", CKR_
26820 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
26830 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 PORTED);...retur
26840 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e n(CKR_FUNCTION_N
26850 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d OT_SUPPORTED);.}
26860 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 ..CK_DEFINE_FUNC
26870 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 TION(CK_RV, C_Si
26880 67 6e 52 65 63 6f 76 65 72 29 28 43 4b 5f 53 45 gnRecover)(CK_SE
26890 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 SSION_HANDLE hSe
268a0 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 ssion, CK_BYTE_P
268b0 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f TR pData, CK_ULO
268c0 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b NG ulDataLen, CK
268d0 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 _BYTE_PTR pSigna
268e0 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 ture, CK_ULONG_P
268f0 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c TR pulSignatureL
26900 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 en) {..CACKEY_DE
26910 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
26920 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 ed.");...if (!ca
26930 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 ckey_initialized
26940 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
26950 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
26960 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a . Not initializ
26970 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
26980 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f (CKR_CRYPTOKI_NO
26990 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a T_INITIALIZED);.
269a0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 .}...CACKEY_DEBU
269b0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
269c0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e ing CKR_FUNCTION
269d0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 _NOT_SUPPORTED (
269e0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 %i)", CKR_FUNCTI
269f0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
26a00 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f );...return(CKR_
26a10 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
26a20 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 PORTED);.}..CK_D
26a30 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 EFINE_FUNCTION(C
26a40 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 49 6e K_RV, C_VerifyIn
26a50 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 it)(CK_SESSION_H
26a60 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 ANDLE hSession,
26a70 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 CK_MECHANISM_PTR
26a80 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f pMechanism, CK_
26a90 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b OBJECT_HANDLE hK
26aa0 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 ey) {..CACKEY_DE
26ab0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
26ac0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 ed.");...if (!ca
26ad0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 ckey_initialized
26ae0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
26af0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
26b00 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a . Not initializ
26b10 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
26b20 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f (CKR_CRYPTOKI_NO
26b30 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a T_INITIALIZED);.
26b40 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 .}...CACKEY_DEBU
26b50 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
26b60 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e ing CKR_FUNCTION
26b70 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 _NOT_SUPPORTED (
26b80 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 %i)", CKR_FUNCTI
26b90 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
26ba0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f );...return(CKR_
26bb0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
26bc0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 PORTED);.}..CK_D
26bd0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 EFINE_FUNCTION(C
26be0 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 29 28 K_RV, C_Verify)(
26bf0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c CK_SESSION_HANDL
26c00 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 E hSession, CK_B
26c10 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 YTE_PTR pData, C
26c20 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 K_ULONG ulDataLe
26c30 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 n, CK_BYTE_PTR p
26c40 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c Signature, CK_UL
26c50 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72 65 4c ONG ulSignatureL
26c60 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 en) {..CACKEY_DE
26c70 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
26c80 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 ed.");...if (!ca
26c90 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 ckey_initialized
26ca0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
26cb0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
26cc0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a . Not initializ
26cd0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
26ce0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f (CKR_CRYPTOKI_NO
26cf0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a T_INITIALIZED);.
26d00 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 .}...CACKEY_DEBU
26d10 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
26d20 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e ing CKR_FUNCTION
26d30 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 _NOT_SUPPORTED (
26d40 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 %i)", CKR_FUNCTI
26d50 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
26d60 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f );...return(CKR_
26d70 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
26d80 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 PORTED);.}..CK_D
26d90 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 EFINE_FUNCTION(C
26da0 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 55 70 K_RV, C_VerifyUp
26db0 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e date)(CK_SESSION
26dc0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e _HANDLE hSession
26dd0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 , CK_BYTE_PTR pP
26de0 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c art, CK_ULONG ul
26df0 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b PartLen) {..CACK
26e00 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
26e10 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 "Called.");...if
26e20 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 (!cackey_initia
26e30 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 lized) {...CACKE
26e40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
26e50 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 Error. Not init
26e60 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 ialized.");....r
26e70 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f eturn(CKR_CRYPTO
26e80 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a KI_NOT_INITIALIZ
26e90 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 ED);..}...CACKEY
26ea0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
26eb0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e eturning CKR_FUN
26ec0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
26ed0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 TED (%i)", CKR_F
26ee0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
26ef0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e ORTED);...return
26f00 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f (CKR_FUNCTION_NO
26f10 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a T_SUPPORTED);.}.
26f20 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 .CK_DEFINE_FUNCT
26f30 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 ION(CK_RV, C_Ver
26f40 69 66 79 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 ifyFinal)(CK_SES
26f50 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 SION_HANDLE hSes
26f60 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 sion, CK_BYTE_PT
26f70 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b R pSignature, CK
26f80 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 _ULONG ulSignatu
26f90 72 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 reLen) {..CACKEY
26fa0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 _DEBUG_PRINTF("C
26fb0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 alled.");...if (
26fc0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 !cackey_initiali
26fd0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f zed) {...CACKEY_
26fe0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
26ff0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 ror. Not initia
27000 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 lized.");....ret
27010 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 urn(CKR_CRYPTOKI
27020 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 _NOT_INITIALIZED
27030 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 );..}...CACKEY_D
27040 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
27050 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 urning CKR_FUNCT
27060 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
27070 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e D (%i)", CKR_FUN
27080 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
27090 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 TED);...return(C
270a0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
270b0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 SUPPORTED);.}..C
270c0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f K_DEFINE_FUNCTIO
270d0 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 N(CK_RV, C_Verif
270e0 79 52 65 63 6f 76 65 72 49 6e 69 74 29 28 43 4b yRecoverInit)(CK
270f0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 _SESSION_HANDLE
27100 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 hSession, CK_MEC
27110 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 HANISM_PTR pMech
27120 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 anism, CK_OBJECT
27130 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a _HANDLE hKey) {.
27140 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
27150 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
27160 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 ...if (!cackey_i
27170 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 nitialized) {...
27180 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
27190 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 NTF("Error. Not
271a0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b initialized.");
271b0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 ....return(CKR_C
271c0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 RYPTOKI_NOT_INIT
271d0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 IALIZED);..}...C
271e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
271f0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b TF("Returning CK
27200 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
27210 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 UPPORTED (%i)",
27220 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
27230 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 _SUPPORTED);...r
27240 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 eturn(CKR_FUNCTI
27250 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
27260 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f );.}..CK_DEFINE_
27270 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 FUNCTION(CK_RV,
27280 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 29 C_VerifyRecover)
27290 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 (CK_SESSION_HAND
272a0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f LE hSession, CK_
272b0 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 BYTE_PTR pSignat
272c0 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c ure, CK_ULONG ul
272d0 53 69 67 6e 61 74 75 72 65 4c 65 6e 2c 20 43 4b SignatureLen, CK
272e0 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c _BYTE_PTR pData,
272f0 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 CK_ULONG_PTR pu
27300 6c 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43 lDataLen) {..CAC
27310 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
27320 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 ("Called.");...i
27330 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 f (!cackey_initi
27340 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b alized) {...CACK
27350 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
27360 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 "Error. Not ini
27370 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 tialized.");....
27380 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 return(CKR_CRYPT
27390 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 OKI_NOT_INITIALI
273a0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 ZED);..}...CACKE
273b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
273c0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 Returning CKR_FU
273d0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
273e0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f RTED (%i)", CKR_
273f0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
27400 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 PORTED);...retur
27410 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e n(CKR_FUNCTION_N
27420 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d OT_SUPPORTED);.}
27430 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 ..CK_DEFINE_FUNC
27440 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 TION(CK_RV, C_Di
27450 67 65 73 74 45 6e 63 72 79 70 74 55 70 64 61 74 gestEncryptUpdat
27460 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 e)(CK_SESSION_HA
27470 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 NDLE hSession, C
27480 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 K_BYTE_PTR pPart
27490 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 , CK_ULONG ulPar
274a0 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 tLen, CK_BYTE_PT
274b0 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 R pEncryptedPart
274c0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 , CK_ULONG_PTR p
274d0 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c ulEncryptedPartL
274e0 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 en) {..CACKEY_DE
274f0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
27500 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 ed.");...if (!ca
27510 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 ckey_initialized
27520 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
27530 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
27540 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a . Not initializ
27550 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
27560 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f (CKR_CRYPTOKI_NO
27570 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a T_INITIALIZED);.
27580 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 .}...CACKEY_DEBU
27590 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
275a0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e ing CKR_FUNCTION
275b0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 _NOT_SUPPORTED (
275c0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 %i)", CKR_FUNCTI
275d0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
275e0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f );...return(CKR_
275f0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
27600 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 PORTED);.}..CK_D
27610 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 EFINE_FUNCTION(C
27620 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 44 K_RV, C_DecryptD
27630 69 67 65 73 74 55 70 64 61 74 65 29 28 43 4b 5f igestUpdate)(CK_
27640 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 SESSION_HANDLE h
27650 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 Session, CK_BYTE
27660 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 _PTR pEncryptedP
27670 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c art, CK_ULONG ul
27680 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e EncryptedPartLen
27690 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 , CK_BYTE_PTR pP
276a0 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 art, CK_ULONG_PT
276b0 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a R pulPartLen) {.
276c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
276d0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
276e0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 ...if (!cackey_i
276f0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 nitialized) {...
27700 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
27710 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 NTF("Error. Not
27720 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b initialized.");
27730 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 ....return(CKR_C
27740 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 RYPTOKI_NOT_INIT
27750 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 IALIZED);..}...C
27760 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
27770 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b TF("Returning CK
27780 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
27790 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 UPPORTED (%i)",
277a0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
277b0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 _SUPPORTED);...r
277c0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 eturn(CKR_FUNCTI
277d0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
277e0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f );.}..CK_DEFINE_
277f0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 FUNCTION(CK_RV,
27800 43 5f 53 69 67 6e 45 6e 63 72 79 70 74 55 70 64 C_SignEncryptUpd
27810 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f ate)(CK_SESSION_
27820 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c HANDLE hSession,
27830 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 CK_BYTE_PTR pPa
27840 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 rt, CK_ULONG ulP
27850 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f artLen, CK_BYTE_
27860 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 PTR pEncryptedPa
27870 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 rt, CK_ULONG_PTR
27880 20 70 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 pulEncryptedPar
27890 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f tLen) {..CACKEY_
278a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
278b0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 lled.");...if (!
278c0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a cackey_initializ
278d0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...CACKEY_D
278e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
278f0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c or. Not initial
27900 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 ized.");....retu
27910 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f rn(CKR_CRYPTOKI_
27920 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 NOT_INITIALIZED)
27930 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ;..}...CACKEY_DE
27940 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
27950 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 rning CKR_FUNCTI
27960 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
27970 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 (%i)", CKR_FUNC
27980 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
27990 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b ED);...return(CK
279a0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
279b0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b UPPORTED);.}..CK
279c0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e _DEFINE_FUNCTION
279d0 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 (CK_RV, C_Decryp
279e0 74 56 65 72 69 66 79 55 70 64 61 74 65 29 28 43 tVerifyUpdate)(C
279f0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 K_SESSION_HANDLE
27a00 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 hSession, CK_BY
27a10 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 TE_PTR pEncrypte
27a20 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 dPart, CK_ULONG
27a30 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c ulEncryptedPartL
27a40 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 en, CK_BYTE_PTR
27a50 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f pPart, CK_ULONG_
27a60 50 54 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20 PTR pulPartLen)
27a70 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f {..CACKEY_DEBUG_
27a80 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
27a90 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 );...if (!cackey
27aa0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
27ab0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
27ac0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e RINTF("Error. N
27ad0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 ot initialized."
27ae0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
27af0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e _CRYPTOKI_NOT_IN
27b00 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
27b10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
27b20 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
27b30 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
27b40 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 _SUPPORTED (%i)"
27b50 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e , CKR_FUNCTION_N
27b60 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a OT_SUPPORTED);..
27b70 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 .return(CKR_FUNC
27b80 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
27b90 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e ED);.}..CK_DEFIN
27ba0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 E_FUNCTION(CK_RV
27bb0 2c 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 29 , C_GenerateKey)
27bc0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 (CK_SESSION_HAND
27bd0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f LE hSession, CK_
27be0 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d MECHANISM_PTR pM
27bf0 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 41 54 54 echanism, CK_ATT
27c00 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 RIBUTE_PTR pTemp
27c10 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 late, CK_ULONG u
27c20 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 lCount, CK_OBJEC
27c30 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b T_HANDLE_PTR phK
27c40 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 ey) {..CACKEY_DE
27c50 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
27c60 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 ed.");...if (!ca
27c70 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 ckey_initialized
27c80 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
27c90 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
27ca0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a . Not initializ
27cb0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
27cc0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f (CKR_CRYPTOKI_NO
27cd0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a T_INITIALIZED);.
27ce0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 .}...CACKEY_DEBU
27cf0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
27d00 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e ing CKR_FUNCTION
27d10 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 _NOT_SUPPORTED (
27d20 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 %i)", CKR_FUNCTI
27d30 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
27d40 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f );...return(CKR_
27d50 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
27d60 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 PORTED);.}..CK_D
27d70 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 EFINE_FUNCTION(C
27d80 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61 74 65 K_RV, C_Generate
27d90 4b 65 79 50 61 69 72 29 28 43 4b 5f 53 45 53 53 KeyPair)(CK_SESS
27da0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 ION_HANDLE hSess
27db0 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 ion, CK_MECHANIS
27dc0 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d M_PTR pMechanism
27dd0 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 , CK_ATTRIBUTE_P
27de0 54 52 20 70 50 75 62 6c 69 63 4b 65 79 54 65 6d TR pPublicKeyTem
27df0 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 plate, CK_ULONG
27e00 75 6c 50 75 62 6c 69 63 4b 65 79 41 74 74 72 69 ulPublicKeyAttri
27e10 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 41 54 buteCount, CK_AT
27e20 54 52 49 42 55 54 45 5f 50 54 52 20 70 50 72 69 TRIBUTE_PTR pPri
27e30 76 61 74 65 4b 65 79 54 65 6d 70 6c 61 74 65 2c vateKeyTemplate,
27e40 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 72 69 76 CK_ULONG ulPriv
27e50 61 74 65 4b 65 79 41 74 74 72 69 62 75 74 65 43 ateKeyAttributeC
27e60 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f ount, CK_OBJECT_
27e70 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 50 75 62 HANDLE_PTR phPub
27e80 6c 69 63 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 licKey, CK_OBJEC
27e90 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 50 T_HANDLE_PTR phP
27ea0 72 69 76 61 74 65 4b 65 79 29 20 7b 0a 09 43 41 rivateKey) {..CA
27eb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
27ec0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
27ed0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 if (!cackey_init
27ee0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 ialized) {...CAC
27ef0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
27f00 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e ("Error. Not in
27f10 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 itialized.");...
27f20 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 .return(CKR_CRYP
27f30 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c TOKI_NOT_INITIAL
27f40 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b IZED);..}...CACK
27f50 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
27f60 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 "Returning CKR_F
27f70 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
27f80 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 ORTED (%i)", CKR
27f90 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
27fa0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 PPORTED);...retu
27fb0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f rn(CKR_FUNCTION_
27fc0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
27fd0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e }..CK_DEFINE_FUN
27fe0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 57 CTION(CK_RV, C_W
27ff0 72 61 70 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 rapKey)(CK_SESSI
28000 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 ON_HANDLE hSessi
28010 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d on, CK_MECHANISM
28020 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c _PTR pMechanism,
28030 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c CK_OBJECT_HANDL
28040 45 20 68 57 72 61 70 70 69 6e 67 4b 65 79 2c 20 E hWrappingKey,
28050 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 CK_OBJECT_HANDLE
28060 20 68 4b 65 79 2c 20 43 4b 5f 42 59 54 45 5f 50 hKey, CK_BYTE_P
28070 54 52 20 70 57 72 61 70 70 65 64 4b 65 79 2c 20 TR pWrappedKey,
28080 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c CK_ULONG_PTR pul
28090 57 72 61 70 70 65 64 4b 65 79 4c 65 6e 29 20 7b WrappedKeyLen) {
280a0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
280b0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
280c0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f ;...if (!cackey_
280d0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 initialized) {..
280e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
280f0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f INTF("Error. No
28100 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 t initialized.")
28110 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
28120 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 CRYPTOKI_NOT_INI
28130 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 TIALIZED);..}...
28140 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
28150 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 NTF("Returning C
28160 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
28170 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c SUPPORTED (%i)",
28180 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f CKR_FUNCTION_NO
28190 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 T_SUPPORTED);...
281a0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 return(CKR_FUNCT
281b0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
281c0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 D);.}..CK_DEFINE
281d0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c _FUNCTION(CK_RV,
281e0 20 43 5f 55 6e 77 72 61 70 4b 65 79 29 28 43 4b C_UnwrapKey)(CK
281f0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 _SESSION_HANDLE
28200 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 hSession, CK_MEC
28210 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 HANISM_PTR pMech
28220 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 anism, CK_OBJECT
28230 5f 48 41 4e 44 4c 45 20 68 55 6e 77 72 61 70 70 _HANDLE hUnwrapp
28240 69 6e 67 4b 65 79 2c 20 43 4b 5f 42 59 54 45 5f ingKey, CK_BYTE_
28250 50 54 52 20 70 57 72 61 70 70 65 64 4b 65 79 2c PTR pWrappedKey,
28260 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 57 72 61 70 CK_ULONG ulWrap
28270 70 65 64 4b 65 79 4c 65 6e 2c 20 43 4b 5f 41 54 pedKeyLen, CK_AT
28280 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d TRIBUTE_PTR pTem
28290 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 plate, CK_ULONG
282a0 75 6c 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74 ulAttributeCount
282b0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 , CK_OBJECT_HAND
282c0 4c 45 5f 50 54 52 20 70 68 4b 65 79 29 20 7b 0a LE_PTR phKey) {.
282d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
282e0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
282f0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 ...if (!cackey_i
28300 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 nitialized) {...
28310 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
28320 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 NTF("Error. Not
28330 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b initialized.");
28340 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 ....return(CKR_C
28350 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 RYPTOKI_NOT_INIT
28360 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 IALIZED);..}...C
28370 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
28380 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b TF("Returning CK
28390 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
283a0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 UPPORTED (%i)",
283b0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
283c0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 _SUPPORTED);...r
283d0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 eturn(CKR_FUNCTI
283e0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
283f0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f );.}..CK_DEFINE_
28400 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 FUNCTION(CK_RV,
28410 43 5f 44 65 72 69 76 65 4b 65 79 29 28 43 4b 5f C_DeriveKey)(CK_
28420 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 SESSION_HANDLE h
28430 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 Session, CK_MECH
28440 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 ANISM_PTR pMecha
28450 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f nism, CK_OBJECT_
28460 48 41 4e 44 4c 45 20 68 42 61 73 65 4b 65 79 2c HANDLE hBaseKey,
28470 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 CK_ATTRIBUTE_PT
28480 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f R pTemplate, CK_
28490 55 4c 4f 4e 47 20 75 6c 41 74 74 72 69 62 75 74 ULONG ulAttribut
284a0 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 eCount, CK_OBJEC
284b0 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b T_HANDLE_PTR phK
284c0 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 ey) {..CACKEY_DE
284d0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
284e0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 ed.");...if (!ca
284f0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 ckey_initialized
28500 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
28510 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
28520 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a . Not initializ
28530 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
28540 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f (CKR_CRYPTOKI_NO
28550 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a T_INITIALIZED);.
28560 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 .}...CACKEY_DEBU
28570 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
28580 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e ing CKR_FUNCTION
28590 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 _NOT_SUPPORTED (
285a0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 %i)", CKR_FUNCTI
285b0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
285c0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f );...return(CKR_
285d0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
285e0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 PORTED);.}..CK_D
285f0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 EFINE_FUNCTION(C
28600 4b 5f 52 56 2c 20 43 5f 53 65 65 64 52 61 6e 64 K_RV, C_SeedRand
28610 6f 6d 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 om)(CK_SESSION_H
28620 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 ANDLE hSession,
28630 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 65 65 CK_BYTE_PTR pSee
28640 64 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 65 d, CK_ULONG ulSe
28650 65 64 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 edLen) {..CACKEY
28660 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 _DEBUG_PRINTF("C
28670 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 alled.");...if (
28680 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 !cackey_initiali
28690 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f zed) {...CACKEY_
286a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
286b0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 ror. Not initia
286c0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 lized.");....ret
286d0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 urn(CKR_CRYPTOKI
286e0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 _NOT_INITIALIZED
286f0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 );..}...CACKEY_D
28700 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
28710 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 urning CKR_FUNCT
28720 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
28730 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e D (%i)", CKR_FUN
28740 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
28750 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 TED);...return(C
28760 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
28770 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 SUPPORTED);.}..C
28780 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f K_DEFINE_FUNCTIO
28790 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72 N(CK_RV, C_Gener
287a0 61 74 65 52 61 6e 64 6f 6d 29 28 43 4b 5f 53 45 ateRandom)(CK_SE
287b0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 SSION_HANDLE hSe
287c0 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 ssion, CK_BYTE_P
287d0 54 52 20 70 52 61 6e 64 6f 6d 44 61 74 61 2c 20 TR pRandomData,
287e0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 52 61 6e 64 6f CK_ULONG ulRando
287f0 6d 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f mLen) {..CACKEY_
28800 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
28810 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 lled.");...if (!
28820 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a cackey_initializ
28830 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...CACKEY_D
28840 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
28850 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c or. Not initial
28860 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 ized.");....retu
28870 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f rn(CKR_CRYPTOKI_
28880 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 NOT_INITIALIZED)
28890 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ;..}...CACKEY_DE
288a0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
288b0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 rning CKR_FUNCTI
288c0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
288d0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 (%i)", CKR_FUNC
288e0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
288f0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b ED);...return(CK
28900 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
28910 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 2f 2a UPPORTED);.}../*
28920 20 44 65 70 72 65 63 61 74 65 64 20 46 75 6e 63 Deprecated Func
28930 74 69 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e tion */.CK_DEFIN
28940 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 E_FUNCTION(CK_RV
28950 2c 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53 , C_GetFunctionS
28960 74 61 74 75 73 29 28 43 4b 5f 53 45 53 53 49 4f tatus)(CK_SESSIO
28970 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f N_HANDLE hSessio
28980 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 n) {..CACKEY_DEB
28990 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
289a0 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 d.");...CACKEY_D
289b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
289c0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 urning CKR_FUNCT
289d0 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c ION_NOT_PARALLEL
289e0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 (%i)", CKR_FUNC
289f0 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 TION_NOT_PARALLE
28a00 4c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 L);...return(CKR
28a10 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 _FUNCTION_NOT_PA
28a20 52 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65 73 73 RALLEL);...hSess
28a30 69 6f 6e 20 3d 20 68 53 65 73 73 69 6f 6e 3b 20 ion = hSession;
28a40 2f 2a 20 53 75 70 72 65 73 73 20 75 6e 75 73 65 /* Supress unuse
28a50 64 20 76 61 72 69 61 62 6c 65 20 77 61 72 6e 69 d variable warni
28a60 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 20 44 65 70 72 ng */.}../* Depr
28a70 65 63 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 20 ecated Function
28a80 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e */.CK_DEFINE_FUN
28a90 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 CTION(CK_RV, C_C
28aa0 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 29 28 43 ancelFunction)(C
28ab0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 K_SESSION_HANDLE
28ac0 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 41 hSession) {..CA
28ad0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
28ae0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
28af0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
28b00 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 NTF("Returning C
28b10 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
28b20 50 41 52 41 4c 4c 45 4c 20 28 25 69 29 22 2c 20 PARALLEL (%i)",
28b30 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
28b40 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72 65 _PARALLEL);...re
28b50 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f turn(CKR_FUNCTIO
28b60 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b N_NOT_PARALLEL);
28b70 0a 0a 09 68 53 65 73 73 69 6f 6e 20 3d 20 68 53 ...hSession = hS
28b80 65 73 73 69 6f 6e 3b 20 2f 2a 20 53 75 70 72 65 ession; /* Supre
28b90 73 73 20 75 6e 75 73 65 64 20 76 61 72 69 61 62 ss unused variab
28ba0 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a le warning */.}.
28bb0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 .CK_DEFINE_FUNCT
28bc0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 ION(CK_RV, C_Get
28bd0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 28 43 4b FunctionList)(CK
28be0 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 _FUNCTION_LIST_P
28bf0 54 52 5f 50 54 52 20 70 70 46 75 6e 63 74 69 6f TR_PTR ppFunctio
28c00 6e 4c 69 73 74 29 20 7b 0a 09 43 4b 5f 46 55 4e nList) {..CK_FUN
28c10 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 20 70 CTION_LIST_PTR p
28c20 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 FunctionList;...
28c30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
28c40 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a NTF("Called.");.
28c50 0a 09 69 66 20 28 70 70 46 75 6e 63 74 69 6f 6e ..if (ppFunction
28c60 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a List == NULL) {.
28c70 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
28c80 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 70 RINTF("Error. pp
28c90 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 69 73 20 FunctionList is
28ca0 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 NULL.");....retu
28cb0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 rn(CKR_ARGUMENTS
28cc0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 70 46 75 6e _BAD);..}...pFun
28cd0 63 74 69 6f 6e 4c 69 73 74 20 3d 20 6d 61 6c 6c ctionList = mall
28ce0 6f 63 28 73 69 7a 65 6f 66 28 2a 70 46 75 6e 63 oc(sizeof(*pFunc
28cf0 74 69 6f 6e 4c 69 73 74 29 29 3b 0a 0a 09 70 46 tionList));...pF
28d00 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72 unctionList->ver
28d10 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43 sion.major = ((C
28d20 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 ACKEY_CRYPTOKI_V
28d30 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 ERSION_CODE) >>
28d40 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70 46 75 16) & 0xff;..pFu
28d50 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72 73 nctionList->vers
28d60 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41 ion.minor = ((CA
28d70 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 CKEY_CRYPTOKI_VE
28d80 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38 RSION_CODE) >> 8
28d90 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 46 75 6e ) & 0xff;...pFun
28da0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 ctionList->C_Ini
28db0 74 69 61 6c 69 7a 65 20 3d 20 43 5f 49 6e 69 74 tialize = C_Init
28dc0 69 61 6c 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69 ialize;..pFuncti
28dd0 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 61 6c 69 onList->C_Finali
28de0 7a 65 20 3d 20 43 5f 46 69 6e 61 6c 69 7a 65 3b ze = C_Finalize;
28df0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d ..pFunctionList-
28e00 3e 43 5f 47 65 74 49 6e 66 6f 20 3d 20 43 5f 47 >C_GetInfo = C_G
28e10 65 74 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 etInfo;..pFuncti
28e20 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f onList->C_GetSlo
28e30 74 4c 69 73 74 20 3d 20 43 5f 47 65 74 53 6c 6f tList = C_GetSlo
28e40 74 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f tList;..pFunctio
28e50 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f 74 nList->C_GetSlot
28e60 49 6e 66 6f 20 3d 20 43 5f 47 65 74 53 6c 6f 74 Info = C_GetSlot
28e70 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e Info;..pFunction
28e80 4c 69 73 74 2d 3e 43 5f 47 65 74 54 6f 6b 65 6e List->C_GetToken
28e90 49 6e 66 6f 20 3d 20 43 5f 47 65 74 54 6f 6b 65 Info = C_GetToke
28ea0 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f nInfo;..pFunctio
28eb0 6e 4c 69 73 74 2d 3e 43 5f 57 61 69 74 46 6f 72 nList->C_WaitFor
28ec0 53 6c 6f 74 45 76 65 6e 74 20 3d 20 43 5f 57 61 SlotEvent = C_Wa
28ed0 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74 3b 0a itForSlotEvent;.
28ee0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e .pFunctionList->
28ef0 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69 C_GetMechanismLi
28f00 73 74 20 3d 20 43 5f 47 65 74 4d 65 63 68 61 6e st = C_GetMechan
28f10 69 73 6d 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74 ismList;..pFunct
28f20 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4d 65 ionList->C_GetMe
28f30 63 68 61 6e 69 73 6d 49 6e 66 6f 20 3d 20 43 5f chanismInfo = C_
28f40 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f GetMechanismInfo
28f50 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 ;..pFunctionList
28f60 2d 3e 43 5f 49 6e 69 74 54 6f 6b 65 6e 20 3d 20 ->C_InitToken =
28f70 43 5f 49 6e 69 74 54 6f 6b 65 6e 3b 0a 09 70 46 C_InitToken;..pF
28f80 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 unctionList->C_I
28f90 6e 69 74 50 49 4e 20 3d 20 43 5f 49 6e 69 74 50 nitPIN = C_InitP
28fa0 49 4e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 IN;..pFunctionLi
28fb0 73 74 2d 3e 43 5f 53 65 74 50 49 4e 20 3d 20 43 st->C_SetPIN = C
28fc0 5f 53 65 74 50 49 4e 3b 0a 09 70 46 75 6e 63 74 _SetPIN;..pFunct
28fd0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4f 70 65 6e 53 ionList->C_OpenS
28fe0 65 73 73 69 6f 6e 20 3d 20 43 5f 4f 70 65 6e 53 ession = C_OpenS
28ff0 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 ession;..pFuncti
29000 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 53 onList->C_CloseS
29010 65 73 73 69 6f 6e 20 3d 20 43 5f 43 6c 6f 73 65 ession = C_Close
29020 53 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 Session;..pFunct
29030 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 ionList->C_Close
29040 41 6c 6c 53 65 73 73 69 6f 6e 73 20 3d 20 43 5f AllSessions = C_
29050 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73 CloseAllSessions
29060 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 ;..pFunctionList
29070 2d 3e 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e ->C_GetSessionIn
29080 66 6f 20 3d 20 43 5f 47 65 74 53 65 73 73 69 6f fo = C_GetSessio
29090 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f nInfo;..pFunctio
290a0 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 70 65 72 nList->C_GetOper
290b0 61 74 69 6f 6e 53 74 61 74 65 20 3d 20 43 5f 47 ationState = C_G
290c0 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 etOperationState
290d0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 ;..pFunctionList
290e0 2d 3e 43 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e ->C_SetOperation
290f0 53 74 61 74 65 20 3d 20 43 5f 53 65 74 4f 70 65 State = C_SetOpe
29100 72 61 74 69 6f 6e 53 74 61 74 65 3b 0a 09 70 46 rationState;..pF
29110 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4c unctionList->C_L
29120 6f 67 69 6e 20 3d 20 43 5f 4c 6f 67 69 6e 3b 0a ogin = C_Login;.
29130 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e .pFunctionList->
29140 43 5f 4c 6f 67 6f 75 74 20 3d 20 43 5f 4c 6f 67 C_Logout = C_Log
29150 6f 75 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c out;..pFunctionL
29160 69 73 74 2d 3e 43 5f 43 72 65 61 74 65 4f 62 6a ist->C_CreateObj
29170 65 63 74 20 3d 20 43 5f 43 72 65 61 74 65 4f 62 ect = C_CreateOb
29180 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e ject;..pFunction
29190 4c 69 73 74 2d 3e 43 5f 43 6f 70 79 4f 62 6a 65 List->C_CopyObje
291a0 63 74 20 3d 20 43 5f 43 6f 70 79 4f 62 6a 65 63 ct = C_CopyObjec
291b0 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 t;..pFunctionLis
291c0 74 2d 3e 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65 t->C_DestroyObje
291d0 63 74 20 3d 20 43 5f 44 65 73 74 72 6f 79 4f 62 ct = C_DestroyOb
291e0 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e ject;..pFunction
291f0 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 62 6a 65 63 List->C_GetObjec
29200 74 53 69 7a 65 20 3d 20 43 5f 47 65 74 4f 62 6a tSize = C_GetObj
29210 65 63 74 53 69 7a 65 3b 0a 09 70 46 75 6e 63 74 ectSize;..pFunct
29220 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 41 74 ionList->C_GetAt
29230 74 72 69 62 75 74 65 56 61 6c 75 65 20 3d 20 43 tributeValue = C
29240 5f 47 65 74 41 74 74 72 69 62 75 74 65 56 61 6c _GetAttributeVal
29250 75 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 ue;..pFunctionLi
29260 73 74 2d 3e 43 5f 53 65 74 41 74 74 72 69 62 75 st->C_SetAttribu
29270 74 65 56 61 6c 75 65 20 3d 20 43 5f 53 65 74 41 teValue = C_SetA
29280 74 74 72 69 62 75 74 65 56 61 6c 75 65 3b 0a 09 ttributeValue;..
29290 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 pFunctionList->C
292a0 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 _FindObjectsInit
292b0 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 = C_FindObjects
292c0 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e Init;..pFunction
292d0 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 List->C_FindObje
292e0 63 74 73 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 cts = C_FindObje
292f0 63 74 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c cts;..pFunctionL
29300 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 ist->C_FindObjec
29310 74 73 46 69 6e 61 6c 20 3d 20 43 5f 46 69 6e 64 tsFinal = C_Find
29320 4f 62 6a 65 63 74 73 46 69 6e 61 6c 3b 0a 09 70 ObjectsFinal;..p
29330 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f FunctionList->C_
29340 45 6e 63 72 79 70 74 49 6e 69 74 20 3d 20 43 5f EncryptInit = C_
29350 45 6e 63 72 79 70 74 49 6e 69 74 3b 0a 09 70 46 EncryptInit;..pF
29360 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 unctionList->C_E
29370 6e 63 72 79 70 74 20 3d 20 43 5f 45 6e 63 72 79 ncrypt = C_Encry
29380 70 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 pt;..pFunctionLi
29390 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 55 70 64 st->C_EncryptUpd
293a0 61 74 65 20 3d 20 43 5f 45 6e 63 72 79 70 74 55 ate = C_EncryptU
293b0 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f pdate;..pFunctio
293c0 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 nList->C_Encrypt
293d0 46 69 6e 61 6c 20 3d 20 43 5f 45 6e 63 72 79 70 Final = C_Encryp
293e0 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 tFinal;..pFuncti
293f0 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 onList->C_Decryp
29400 74 49 6e 69 74 20 3d 20 43 5f 44 65 63 72 79 70 tInit = C_Decryp
29410 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f tInit;..pFunctio
29420 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 nList->C_Decrypt
29430 20 3d 20 43 5f 44 65 63 72 79 70 74 3b 0a 09 70 = C_Decrypt;..p
29440 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f FunctionList->C_
29450 44 65 63 72 79 70 74 55 70 64 61 74 65 20 3d 20 DecryptUpdate =
29460 43 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 3b C_DecryptUpdate;
29470 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d ..pFunctionList-
29480 3e 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 20 >C_DecryptFinal
29490 3d 20 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c = C_DecryptFinal
294a0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 ;..pFunctionList
294b0 2d 3e 43 5f 44 69 67 65 73 74 49 6e 69 74 20 3d ->C_DigestInit =
294c0 20 43 5f 44 69 67 65 73 74 49 6e 69 74 3b 0a 09 C_DigestInit;..
294d0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 pFunctionList->C
294e0 5f 44 69 67 65 73 74 20 3d 20 43 5f 44 69 67 65 _Digest = C_Dige
294f0 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 st;..pFunctionLi
29500 73 74 2d 3e 43 5f 44 69 67 65 73 74 55 70 64 61 st->C_DigestUpda
29510 74 65 20 3d 20 43 5f 44 69 67 65 73 74 55 70 64 te = C_DigestUpd
29520 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c ate;..pFunctionL
29530 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 4b 65 79 ist->C_DigestKey
29540 20 3d 20 43 5f 44 69 67 65 73 74 4b 65 79 3b 0a = C_DigestKey;.
29550 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e .pFunctionList->
29560 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 20 3d 20 C_DigestFinal =
29570 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 3b 0a 09 C_DigestFinal;..
29580 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 pFunctionList->C
29590 5f 53 69 67 6e 49 6e 69 74 20 3d 20 43 5f 53 69 _SignInit = C_Si
295a0 67 6e 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 gnInit;..pFuncti
295b0 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 20 3d onList->C_Sign =
295c0 20 43 5f 53 69 67 6e 3b 0a 09 70 46 75 6e 63 74 C_Sign;..pFunct
295d0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 55 ionList->C_SignU
295e0 70 64 61 74 65 20 3d 20 43 5f 53 69 67 6e 55 70 pdate = C_SignUp
295f0 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e date;..pFunction
29600 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 46 69 6e 61 List->C_SignFina
29610 6c 20 3d 20 43 5f 53 69 67 6e 46 69 6e 61 6c 3b l = C_SignFinal;
29620 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d ..pFunctionList-
29630 3e 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 49 6e >C_SignRecoverIn
29640 69 74 20 3d 20 43 5f 53 69 67 6e 52 65 63 6f 76 it = C_SignRecov
29650 65 72 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 erInit;..pFuncti
29660 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 52 65 onList->C_SignRe
29670 63 6f 76 65 72 20 3d 20 43 5f 53 69 67 6e 52 65 cover = C_SignRe
29680 63 6f 76 65 72 3b 0a 09 70 46 75 6e 63 74 69 6f cover;..pFunctio
29690 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 49 nList->C_VerifyI
296a0 6e 69 74 20 3d 20 43 5f 56 65 72 69 66 79 49 6e nit = C_VerifyIn
296b0 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 it;..pFunctionLi
296c0 73 74 2d 3e 43 5f 56 65 72 69 66 79 20 3d 20 43 st->C_Verify = C
296d0 5f 56 65 72 69 66 79 3b 0a 09 70 46 75 6e 63 74 _Verify;..pFunct
296e0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 ionList->C_Verif
296f0 79 55 70 64 61 74 65 20 3d 20 43 5f 56 65 72 69 yUpdate = C_Veri
29700 66 79 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 fyUpdate;..pFunc
29710 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 tionList->C_Veri
29720 66 79 46 69 6e 61 6c 20 3d 20 43 5f 56 65 72 69 fyFinal = C_Veri
29730 66 79 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 fyFinal;..pFunct
29740 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 ionList->C_Verif
29750 79 52 65 63 6f 76 65 72 49 6e 69 74 20 3d 20 43 yRecoverInit = C
29760 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 49 6e _VerifyRecoverIn
29770 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 it;..pFunctionLi
29780 73 74 2d 3e 43 5f 56 65 72 69 66 79 52 65 63 6f st->C_VerifyReco
29790 76 65 72 20 3d 20 43 5f 56 65 72 69 66 79 52 65 ver = C_VerifyRe
297a0 63 6f 76 65 72 3b 0a 09 70 46 75 6e 63 74 69 6f cover;..pFunctio
297b0 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 45 nList->C_DigestE
297c0 6e 63 72 79 70 74 55 70 64 61 74 65 20 3d 20 43 ncryptUpdate = C
297d0 5f 44 69 67 65 73 74 45 6e 63 72 79 70 74 55 70 _DigestEncryptUp
297e0 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e date;..pFunction
297f0 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 44 List->C_DecryptD
29800 69 67 65 73 74 55 70 64 61 74 65 20 3d 20 43 5f igestUpdate = C_
29810 44 65 63 72 79 70 74 44 69 67 65 73 74 55 70 64 DecryptDigestUpd
29820 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c ate;..pFunctionL
29830 69 73 74 2d 3e 43 5f 53 69 67 6e 45 6e 63 72 79 ist->C_SignEncry
29840 70 74 55 70 64 61 74 65 20 3d 20 43 5f 53 69 67 ptUpdate = C_Sig
29850 6e 45 6e 63 72 79 70 74 55 70 64 61 74 65 3b 0a nEncryptUpdate;.
29860 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e .pFunctionList->
29870 43 5f 44 65 63 72 79 70 74 56 65 72 69 66 79 55 C_DecryptVerifyU
29880 70 64 61 74 65 20 3d 20 43 5f 44 65 63 72 79 70 pdate = C_Decryp
29890 74 56 65 72 69 66 79 55 70 64 61 74 65 3b 0a 09 tVerifyUpdate;..
298a0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 pFunctionList->C
298b0 5f 47 65 6e 65 72 61 74 65 4b 65 79 20 3d 20 43 _GenerateKey = C
298c0 5f 47 65 6e 65 72 61 74 65 4b 65 79 3b 0a 09 70 _GenerateKey;..p
298d0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f FunctionList->C_
298e0 47 65 6e 65 72 61 74 65 4b 65 79 50 61 69 72 20 GenerateKeyPair
298f0 3d 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 50 = C_GenerateKeyP
29900 61 69 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c air;..pFunctionL
29910 69 73 74 2d 3e 43 5f 57 72 61 70 4b 65 79 20 3d ist->C_WrapKey =
29920 20 43 5f 57 72 61 70 4b 65 79 3b 0a 09 70 46 75 C_WrapKey;..pFu
29930 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 55 6e nctionList->C_Un
29940 77 72 61 70 4b 65 79 20 3d 20 43 5f 55 6e 77 72 wrapKey = C_Unwr
29950 61 70 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f apKey;..pFunctio
29960 6e 4c 69 73 74 2d 3e 43 5f 44 65 72 69 76 65 4b nList->C_DeriveK
29970 65 79 20 3d 20 43 5f 44 65 72 69 76 65 4b 65 79 ey = C_DeriveKey
29980 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 ;..pFunctionList
29990 2d 3e 43 5f 53 65 65 64 52 61 6e 64 6f 6d 20 3d ->C_SeedRandom =
299a0 20 43 5f 53 65 65 64 52 61 6e 64 6f 6d 3b 0a 09 C_SeedRandom;..
299b0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 pFunctionList->C
299c0 5f 47 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d 20 _GenerateRandom
299d0 3d 20 43 5f 47 65 6e 65 72 61 74 65 52 61 6e 64 = C_GenerateRand
299e0 6f 6d 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 om;..pFunctionLi
299f0 73 74 2d 3e 43 5f 47 65 74 46 75 6e 63 74 69 6f st->C_GetFunctio
29a00 6e 53 74 61 74 75 73 20 3d 20 43 5f 47 65 74 46 nStatus = C_GetF
29a10 75 6e 63 74 69 6f 6e 53 74 61 74 75 73 3b 0a 09 unctionStatus;..
29a20 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 pFunctionList->C
29a30 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 20 _CancelFunction
29a40 3d 20 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69 = C_CancelFuncti
29a50 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 on;..pFunctionLi
29a60 73 74 2d 3e 43 5f 47 65 74 46 75 6e 63 74 69 6f st->C_GetFunctio
29a70 6e 4c 69 73 74 20 3d 20 43 5f 47 65 74 46 75 6e nList = C_GetFun
29a80 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 2a 70 70 ctionList;...*pp
29a90 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 70 FunctionList = p
29aa0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 FunctionList;...
29ab0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
29ac0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 NTF("Returning C
29ad0 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 KR_OK (%i)", CKR
29ae0 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 _OK);...return(C
29af0 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a KR_OK);.}..