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 23 69 66 64 65 66 if.#endif.#ifdef
02f0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 53 45 CACKEY_DEBUG_SE
0300: 41 52 43 48 5f 53 50 45 45 44 54 45 53 54 0a 23 ARCH_SPEEDTEST.#
0310: 20 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 include <sys/t
0320: 69 6d 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 ime.h>.#endif..#
0330: 64 65 66 69 6e 65 20 43 4b 5f 50 54 52 20 2a 0a define CK_PTR *.
0340: 23 64 65 66 69 6e 65 20 43 4b 5f 44 45 46 49 4e #define CK_DEFIN
0350: 45 5f 46 55 4e 43 54 49 4f 4e 28 72 65 74 75 72 E_FUNCTION(retur
0360: 6e 54 79 70 65 2c 20 6e 61 6d 65 29 20 72 65 74 nType, name) ret
0370: 75 72 6e 54 79 70 65 20 6e 61 6d 65 0a 23 64 65 urnType name.#de
0380: 66 69 6e 65 20 43 4b 5f 44 45 43 4c 41 52 45 5f fine CK_DECLARE_
0390: 46 55 4e 43 54 49 4f 4e 28 72 65 74 75 72 6e 54 FUNCTION(returnT
03a0: 79 70 65 2c 20 6e 61 6d 65 29 20 72 65 74 75 72 ype, name) retur
03b0: 6e 54 79 70 65 20 6e 61 6d 65 0a 23 64 65 66 69 nType name.#defi
03c0: 6e 65 20 43 4b 5f 44 45 43 4c 41 52 45 5f 46 55 ne CK_DECLARE_FU
03d0: 4e 43 54 49 4f 4e 5f 50 4f 49 4e 54 45 52 28 72 NCTION_POINTER(r
03e0: 65 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d 65 29 eturnType, name)
03f0: 20 72 65 74 75 72 6e 54 79 70 65 20 28 2a 20 6e returnType (* n
0400: 61 6d 65 29 0a 23 64 65 66 69 6e 65 20 43 4b 5f ame).#define CK_
0410: 43 41 4c 4c 42 41 43 4b 5f 46 55 4e 43 54 49 4f CALLBACK_FUNCTIO
0420: 4e 28 72 65 74 75 72 6e 54 79 70 65 2c 20 6e 61 N(returnType, na
0430: 6d 65 29 20 72 65 74 75 72 6e 54 79 70 65 20 28 me) returnType (
0440: 2a 20 6e 61 6d 65 29 0a 23 69 66 6e 64 65 66 20 * name).#ifndef
0450: 4e 55 4c 4c 5f 50 54 52 0a 23 20 20 64 65 66 69 NULL_PTR.# defi
0460: 6e 65 20 4e 55 4c 4c 5f 50 54 52 20 30 0a 23 65 ne NULL_PTR 0.#e
0470: 6e 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20 22 ndif..#include "
0480: 70 6b 63 73 31 31 2e 68 22 0a 23 69 6e 63 6c 75 pkcs11.h".#inclu
0490: 64 65 20 22 70 6b 63 73 31 31 6e 2e 68 22 0a 23 de "pkcs11n.h".#
04a0: 69 6e 63 6c 75 64 65 20 22 61 73 6e 31 2d 78 35 include "asn1-x5
04b0: 30 39 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 09.h".#include "
04c0: 73 68 61 31 2e 68 22 0a 23 69 6e 63 6c 75 64 65 sha1.h".#include
04d0: 20 22 6d 64 35 2e 68 22 0a 0a 2f 2a 0a 20 2a 20 "md5.h"../*. *
04e0: 49 6e 63 6c 75 64 65 20 74 68 65 73 65 20 73 6f Include these so
04f0: 75 72 63 65 20 66 69 6c 65 73 20 69 6e 20 74 68 urce files in th
0500: 69 73 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 75 is translation u
0510: 6e 69 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 nit so that we c
0520: 61 6e 20 62 69 6e 64 20 74 6f 0a 20 2a 20 66 75 an bind to. * fu
0530: 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 74 20 nctions and not
0540: 69 6e 63 6c 75 64 65 20 61 6e 79 20 73 79 6d 62 include any symb
0550: 6f 6c 73 20 69 6e 20 74 68 65 20 6f 75 74 70 75 ols in the outpu
0560: 74 20 73 68 61 72 65 64 20 6f 62 6a 65 63 74 2e t shared object.
0570: 0a 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 61 . */.#include "a
0580: 73 6e 31 2d 78 35 30 39 2e 63 22 0a 23 69 6e 63 sn1-x509.c".#inc
0590: 6c 75 64 65 20 22 73 68 61 31 2e 63 22 0a 23 69 lude "sha1.c".#i
05a0: 6e 63 6c 75 64 65 20 22 6d 64 35 2e 63 22 0a 0a nclude "md5.c"..
05b0: 23 69 66 6e 64 65 66 20 43 41 43 4b 45 59 5f 43 #ifndef CACKEY_C
05c0: 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f RYPTOKI_VERSION_
05d0: 43 4f 44 45 0a 23 20 20 64 65 66 69 6e 65 20 43 CODE.# define C
05e0: 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 ACKEY_CRYPTOKI_V
05f0: 45 52 53 49 4f 4e 5f 43 4f 44 45 20 30 78 30 32 ERSION_CODE 0x02
0600: 31 65 30 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 1e00.#endif../*
0610: 47 53 43 2d 49 53 20 76 32 2e 31 20 44 65 66 69 GSC-IS v2.1 Defi
0620: 6e 69 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 2a 20 43 nitions */./** C
0630: 6c 61 73 73 65 73 20 2a 2a 2f 0a 23 64 65 66 69 lasses **/.#defi
0640: 6e 65 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 ne GSCIS_CLASS_I
0650: 53 4f 37 38 31 36 20 20 20 20 20 20 20 20 20 20 SO7816
0660: 20 30 78 30 30 0a 23 64 65 66 69 6e 65 20 47 53 0x00.#define GS
0670: 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c CIS_CLASS_GLOBAL
0680: 5f 50 4c 41 54 46 4f 52 4d 20 20 20 30 78 38 30 _PLATFORM 0x80
0690: 0a 0a 2f 2a 2a 20 49 6e 73 74 72 75 63 74 69 6f ../** Instructio
06a0: 6e 73 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 ns **/.#define G
06b0: 53 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 52 SCIS_INSTR_GET_R
06c0: 45 53 50 4f 4e 53 45 20 20 20 20 20 20 30 78 43 ESPONSE 0xC
06d0: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 0.#define GSCIS_
06e0: 49 4e 53 54 52 5f 52 45 41 44 5f 42 49 4e 41 52 INSTR_READ_BINAR
06f0: 59 20 20 20 20 20 20 20 30 78 42 30 0a 23 64 65 Y 0xB0.#de
0700: 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 fine GSCIS_INSTR
0710: 5f 55 50 44 41 54 45 5f 42 49 4e 41 52 59 20 20 _UPDATE_BINARY
0720: 20 20 20 30 78 44 36 0a 23 64 65 66 69 6e 65 20 0xD6.#define
0730: 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45 GSCIS_INSTR_SELE
0740: 43 54 20 20 20 20 20 20 20 20 20 20 20 20 30 78 CT 0x
0750: 41 34 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 A4.#define GSCIS
0760: 5f 49 4e 53 54 52 5f 45 58 54 45 52 4e 41 4c 5f _INSTR_EXTERNAL_
0770: 41 55 54 48 20 20 20 20 20 30 78 38 32 0a 23 64 AUTH 0x82.#d
0780: 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 efine GSCIS_INST
0790: 52 5f 47 45 54 5f 43 48 41 4c 4c 45 4e 47 45 20 R_GET_CHALLENGE
07a0: 20 20 20 20 30 78 38 34 0a 23 64 65 66 69 6e 65 0x84.#define
07b0: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 49 4e 54 GSCIS_INSTR_INT
07c0: 45 52 4e 41 4c 5f 41 55 54 48 20 20 20 20 20 30 ERNAL_AUTH 0
07d0: 78 38 38 0a 23 64 65 66 69 6e 65 20 47 53 43 49 x88.#define GSCI
07e0: 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 20 20 S_INSTR_VERIFY
07f0: 20 20 20 20 20 20 20 20 20 20 30 78 32 30 0a 23 0x20.#
0800: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 define GSCIS_INS
0810: 54 52 5f 53 49 47 4e 20 20 20 20 20 20 20 20 20 TR_SIGN
0820: 20 20 20 20 20 30 78 32 41 0a 23 64 65 66 69 6e 0x2A.#defin
0830: 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45 e GSCIS_INSTR_GE
0840: 54 5f 50 52 4f 50 20 20 20 20 20 20 20 20 20 20 T_PROP
0850: 30 78 35 36 0a 23 64 65 66 69 6e 65 20 47 53 43 0x56.#define GSC
0860: 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 41 43 52 IS_INSTR_GET_ACR
0870: 20 20 20 20 20 20 20 20 20 20 20 30 78 34 43 0a 0x4C.
0880: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e #define GSCIS_IN
0890: 53 54 52 5f 52 45 41 44 5f 42 55 46 46 45 52 20 STR_READ_BUFFER
08a0: 20 20 20 20 20 20 30 78 35 32 0a 23 64 65 66 69 0x52.#defi
08b0: 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 ne GSCIS_INSTR_S
08c0: 49 47 4e 44 45 43 52 59 50 54 20 20 20 20 20 20 IGNDECRYPT
08d0: 20 30 78 34 32 0a 0a 23 64 65 66 69 6e 65 20 47 0x42..#define G
08e0: 53 43 49 53 5f 50 41 52 41 4d 5f 53 45 4c 45 43 SCIS_PARAM_SELEC
08f0: 54 5f 41 50 50 4c 45 54 20 20 20 20 20 30 78 30 T_APPLET 0x0
0900: 34 0a 0a 2f 2a 2a 20 54 61 67 73 20 2a 2a 2f 0a 4../** Tags **/.
0910: 2f 2a 2a 2a 20 43 43 43 20 54 61 67 73 20 2a 2a /*** CCC Tags **
0920: 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 */.#define GSCIS
0930: 5f 54 41 47 5f 43 41 52 44 49 44 20 20 20 20 20 _TAG_CARDID
0940: 20 20 20 20 20 20 20 20 20 30 78 46 30 0a 23 64 0xF0.#d
0950: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f efine GSCIS_TAG_
0960: 43 43 43 5f 56 45 52 20 20 20 20 20 20 20 20 20 CCC_VER
0970: 20 20 20 20 30 78 46 31 0a 23 64 65 66 69 6e 65 0xF1.#define
0980: 20 47 53 43 49 53 5f 54 41 47 5f 43 43 47 5f 56 GSCIS_TAG_CCG_V
0990: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 30 ER 0
09a0: 78 46 32 0a 23 64 65 66 69 6e 65 20 47 53 43 49 xF2.#define GSCI
09b0: 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 20 20 20 S_TAG_CARDURL
09c0: 20 20 20 20 20 20 20 20 20 20 30 78 46 33 0a 23 0xF3.#
09d0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 define GSCIS_TAG
09e0: 5f 50 4b 43 53 31 35 20 20 20 20 20 20 20 20 20 _PKCS15
09f0: 20 20 20 20 20 30 78 46 34 0a 23 64 65 66 69 6e 0xF4.#defin
0a00: 65 20 47 53 43 49 53 5f 54 41 47 5f 52 45 47 5f e GSCIS_TAG_REG_
0a10: 44 41 54 41 5f 4d 4f 44 45 4c 20 20 20 20 20 20 DATA_MODEL
0a20: 30 78 46 35 0a 23 64 65 66 69 6e 65 20 47 53 43 0xF5.#define GSC
0a30: 49 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45 IS_TAG_ACR_TABLE
0a40: 20 20 20 20 20 20 20 20 20 20 20 30 78 46 36 0a 0xF6.
0a50: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 #define GSCIS_TA
0a60: 47 5f 43 41 52 44 5f 41 50 44 55 20 20 20 20 20 G_CARD_APDU
0a70: 20 20 20 20 20 20 30 78 46 37 0a 23 64 65 66 69 0xF7.#defi
0a80: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 52 45 44 ne GSCIS_TAG_RED
0a90: 49 52 45 43 54 49 4f 4e 20 20 20 20 20 20 20 20 IRECTION
0aa0: 20 30 78 46 41 0a 23 64 65 66 69 6e 65 20 47 53 0xFA.#define GS
0ab0: 43 49 53 5f 54 41 47 5f 43 54 20 20 20 20 20 20 CIS_TAG_CT
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 46 42 0xFB
0ad0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 .#define GSCIS_T
0ae0: 41 47 5f 53 54 20 20 20 20 20 20 20 20 20 20 20 AG_ST
0af0: 20 20 20 20 20 20 20 30 78 46 43 0a 23 64 65 66 0xFC.#def
0b00: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 45 ine GSCIS_TAG_NE
0b10: 58 54 43 43 43 20 20 20 20 20 20 20 20 20 20 20 XTCCC
0b20: 20 20 30 78 46 44 0a 0a 2f 2a 2a 2a 20 47 65 6e 0xFD../*** Gen
0b30: 65 72 61 6c 20 2d 20 45 46 20 32 32 30 30 20 2a eral - EF 2200 *
0b40: 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49 **/.#define GSCI
0b50: 53 5f 54 41 47 5f 46 4e 41 4d 45 20 20 20 20 20 S_TAG_FNAME
0b60: 20 20 20 20 20 20 20 20 20 20 30 78 30 31 0a 23 0x01.#
0b70: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 define GSCIS_TAG
0b80: 5f 4d 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20 _MNAME
0b90: 20 20 20 20 20 30 78 30 32 0a 23 64 65 66 69 6e 0x02.#defin
0ba0: 65 20 47 53 43 49 53 5f 54 41 47 5f 4c 4e 41 4d e GSCIS_TAG_LNAM
0bb0: 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 E
0bc0: 30 78 30 33 0a 23 64 65 66 69 6e 65 20 47 53 43 0x03.#define GSC
0bd0: 49 53 5f 54 41 47 5f 53 55 46 46 49 58 20 20 20 IS_TAG_SUFFIX
0be0: 20 20 20 20 20 20 20 20 20 20 20 30 78 30 34 0a 0x04.
0bf0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 #define GSCIS_TA
0c00: 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59 20 20 20 G_GOVT_AGENCY
0c10: 20 20 20 20 20 20 30 78 30 35 0a 23 64 65 66 69 0x05.#defi
0c20: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 52 ne GSCIS_TAG_BUR
0c30: 45 41 55 20 20 20 20 20 20 20 20 20 20 20 20 20 EAU
0c40: 20 30 78 30 36 0a 23 64 65 66 69 6e 65 20 47 53 0x06.#define GS
0c50: 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 5f 43 CIS_TAG_BUREAU_C
0c60: 4f 44 45 20 20 20 20 20 20 20 20 20 30 78 30 37 ODE 0x07
0c70: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 .#define GSCIS_T
0c80: 41 47 5f 44 45 50 54 5f 43 4f 44 45 20 20 20 20 AG_DEPT_CODE
0c90: 20 20 20 20 20 20 20 30 78 30 38 0a 23 64 65 66 0x08.#def
0ca0: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 54 49 ine GSCIS_TAG_TI
0cb0: 54 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20 TLE
0cc0: 20 20 30 78 30 39 0a 23 64 65 66 69 6e 65 20 47 0x09.#define G
0cd0: 53 43 49 53 5f 54 41 47 5f 42 55 49 4c 44 49 4e SCIS_TAG_BUILDIN
0ce0: 47 20 20 20 20 20 20 20 20 20 20 20 20 30 78 31 G 0x1
0cf0: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 0.#define GSCIS_
0d00: 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 31 TAG_OFFICE_ADDR1
0d10: 20 20 20 20 20 20 20 20 30 78 31 31 0a 23 64 65 0x11.#de
0d20: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f fine GSCIS_TAG_O
0d30: 46 46 49 43 45 5f 41 44 44 52 32 20 20 20 20 20 FFICE_ADDR2
0d40: 20 20 20 30 78 31 32 0a 23 64 65 66 69 6e 65 20 0x12.#define
0d50: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 GSCIS_TAG_OFFICE
0d60: 5f 43 49 54 59 20 20 20 20 20 20 20 20 20 30 78 _CITY 0x
0d70: 31 33 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 13.#define GSCIS
0d80: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53 54 41 54 _TAG_OFFICE_STAT
0d90: 45 20 20 20 20 20 20 20 20 30 78 31 34 0a 23 64 E 0x14.#d
0da0: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f efine GSCIS_TAG_
0db0: 4f 46 46 49 43 45 5f 5a 49 50 20 20 20 20 20 20 OFFICE_ZIP
0dc0: 20 20 20 20 30 78 31 35 0a 23 64 65 66 69 6e 65 0x15.#define
0dd0: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 GSCIS_TAG_OFFIC
0de0: 45 5f 43 4f 55 4e 54 52 59 20 20 20 20 20 20 30 E_COUNTRY 0
0df0: 78 31 36 0a 23 64 65 66 69 6e 65 20 47 53 43 49 x16.#define GSCI
0e00: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f S_TAG_OFFICE_PHO
0e10: 4e 45 20 20 20 20 20 20 20 20 30 78 31 37 0a 23 NE 0x17.#
0e20: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 define GSCIS_TAG
0e30: 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 5f 45 58 _OFFICE_PHONE_EX
0e40: 54 20 20 20 20 30 78 31 38 0a 23 64 65 66 69 6e T 0x18.#defin
0e50: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 e GSCIS_TAG_OFFI
0e60: 43 45 5f 46 41 58 20 20 20 20 20 20 20 20 20 20 CE_FAX
0e70: 30 78 31 39 0a 23 64 65 66 69 6e 65 20 47 53 43 0x19.#define GSC
0e80: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d IS_TAG_OFFICE_EM
0e90: 41 49 4c 20 20 20 20 20 20 20 20 30 78 31 41 0a AIL 0x1A.
0ea0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 #define GSCIS_TA
0eb0: 47 5f 4f 46 46 49 43 45 5f 52 4f 4f 4d 20 20 20 G_OFFICE_ROOM
0ec0: 20 20 20 20 20 20 30 78 31 42 0a 23 64 65 66 69 0x1B.#defi
0ed0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 4f 4e ne GSCIS_TAG_NON
0ee0: 47 4f 56 5f 41 47 45 4e 43 59 20 20 20 20 20 20 GOV_AGENCY
0ef0: 20 30 78 31 43 0a 23 64 65 66 69 6e 65 20 47 53 0x1C.#define GS
0f00: 43 49 53 5f 54 41 47 5f 53 53 4e 5f 44 45 53 49 CIS_TAG_SSN_DESI
0f10: 47 4e 41 54 4f 52 20 20 20 20 20 20 30 78 31 44 GNATOR 0x1D
0f20: 0a 0a 2f 2a 2a 2a 20 50 49 49 20 2d 20 45 46 20 ../*** PII - EF
0f30: 32 31 30 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 2100 ***/.#defin
0f40: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 20 e GSCIS_TAG_SSN
0f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0f60: 30 78 32 30 0a 23 64 65 66 69 6e 65 20 47 53 43 0x20.#define GSC
0f70: 49 53 5f 54 41 47 5f 44 4f 42 20 20 20 20 20 20 IS_TAG_DOB
0f80: 20 20 20 20 20 20 20 20 20 20 20 30 78 32 31 0a 0x21.
0f90: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 #define GSCIS_TA
0fa0: 47 5f 47 45 4e 44 45 52 20 20 20 20 20 20 20 20 G_GENDER
0fb0: 20 20 20 20 20 20 30 78 32 32 0a 0a 2f 2a 2a 2a 0x22../***
0fc0: 20 4c 6f 67 69 6e 20 49 6e 66 6f 72 6d 61 74 69 Login Informati
0fd0: 6f 6e 20 2d 20 45 46 20 34 30 30 30 20 2a 2a 2a on - EF 4000 ***
0fe0: 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f /.#define GSCIS_
0ff0: 54 41 47 5f 55 53 45 52 49 44 20 20 20 20 20 20 TAG_USERID
1000: 20 20 20 20 20 20 20 20 30 78 34 30 0a 23 64 65 0x40.#de
1010: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 44 fine GSCIS_TAG_D
1020: 4f 4d 41 49 4e 20 20 20 20 20 20 20 20 20 20 20 OMAIN
1030: 20 20 20 30 78 34 31 0a 23 64 65 66 69 6e 65 20 0x41.#define
1040: 47 53 43 49 53 5f 54 41 47 5f 50 41 53 53 57 4f GSCIS_TAG_PASSWO
1050: 52 44 20 20 20 20 20 20 20 20 20 20 20 20 30 78 RD 0x
1060: 34 32 0a 0a 2f 2a 2a 2a 20 43 61 72 64 20 49 6e 42../*** Card In
1070: 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 45 46 20 35 formation - EF 5
1080: 30 30 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 000 ***/.#define
1090: 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45 GSCIS_TAG_ISSUE
10a0: 52 49 44 20 20 20 20 20 20 20 20 20 20 20 20 30 RID 0
10b0: 78 35 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 x50.#define GSCI
10c0: 53 5f 54 41 47 5f 53 45 52 4e 4f 20 20 20 20 20 S_TAG_SERNO
10d0: 20 20 20 20 20 20 20 20 20 20 30 78 35 31 0a 23 0x51.#
10e0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 define GSCIS_TAG
10f0: 5f 49 53 53 55 45 5f 44 41 54 45 20 20 20 20 20 _ISSUE_DATE
1100: 20 20 20 20 20 30 78 35 32 0a 23 64 65 66 69 6e 0x52.#defin
1110: 65 20 47 53 43 49 53 5f 54 41 47 5f 45 58 50 49 e GSCIS_TAG_EXPI
1120: 52 45 5f 44 41 54 45 20 20 20 20 20 20 20 20 20 RE_DATE
1130: 30 78 35 33 0a 23 64 65 66 69 6e 65 20 47 53 43 0x53.#define GSC
1140: 49 53 5f 54 41 47 5f 43 41 52 44 5f 54 59 50 45 IS_TAG_CARD_TYPE
1150: 20 20 20 20 20 20 20 20 20 20 20 30 78 35 34 0a 0x54.
1160: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 #define GSCIS_TA
1170: 47 5f 53 45 43 55 52 49 54 59 5f 43 4f 44 45 20 G_SECURITY_CODE
1180: 20 20 20 20 20 20 30 78 35 37 0a 23 64 65 66 69 0x57.#defi
1190: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 ne GSCIS_TAG_CAR
11a0: 44 49 44 5f 41 49 44 20 20 20 20 20 20 20 20 20 DID_AID
11b0: 20 30 78 35 38 0a 0a 2f 2a 2a 2a 20 50 49 56 20 0x58../*** PIV
11c0: 43 6f 64 65 73 20 2a 2a 2a 2f 0a 23 64 65 66 69 Codes ***/.#defi
11d0: 6e 65 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f ne NISTSP800_73_
11e0: 33 5f 49 4e 53 54 52 5f 47 45 54 5f 44 41 54 41 3_INSTR_GET_DATA
11f0: 20 30 78 43 42 0a 23 64 65 66 69 6e 65 20 4e 49 0xCB.#define NI
1200: 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 49 4e 53 STSP800_73_3_INS
1210: 54 52 5f 47 45 4e 41 55 54 48 20 20 30 78 38 37 TR_GENAUTH 0x87
1220: 0a 0a 2f 2a 2a 2a 20 50 4b 49 20 49 6e 66 6f 72 ../*** PKI Infor
1230: 6d 61 74 69 6f 6e 20 2d 20 45 46 20 37 30 30 30 mation - EF 7000
1240: 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 ***/.#define GS
1250: 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 CIS_TAG_CERTIFIC
1260: 41 54 45 20 20 20 20 20 20 20 20 20 30 78 37 30 ATE 0x70
1270: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 .#define GSCIS_T
1280: 41 47 5f 43 45 52 54 5f 49 53 53 55 45 5f 44 41 AG_CERT_ISSUE_DA
1290: 54 45 20 20 20 20 20 30 78 37 31 0a 23 64 65 66 TE 0x71.#def
12a0: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45 ine GSCIS_TAG_CE
12b0: 52 54 5f 45 58 50 49 52 45 5f 44 41 54 45 20 20 RT_EXPIRE_DATE
12c0: 20 20 30 78 37 32 0a 0a 2f 2a 2a 20 41 70 70 6c 0x72../** Appl
12d0: 65 74 20 49 44 73 20 2a 2a 2f 0a 23 64 65 66 69 et IDs **/.#defi
12e0: 6e 65 20 47 53 43 49 53 5f 41 49 44 5f 43 43 43 ne GSCIS_AID_CCC
12f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1300: 20 30 78 41 30 2c 20 30 78 30 30 2c 20 30 78 30 0xA0, 0x00, 0x0
1310: 30 2c 20 30 78 30 31 2c 20 30 78 31 36 2c 20 30 0, 0x01, 0x16, 0
1320: 78 44 42 2c 20 30 78 30 30 0a 23 64 65 66 69 6e xDB, 0x00.#defin
1330: 65 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 e NISTSP800_73_3
1340: 5f 50 49 56 5f 41 49 44 20 20 20 20 20 20 20 20 _PIV_AID
1350: 30 78 41 30 2c 20 30 78 30 30 2c 20 30 78 30 30 0xA0, 0x00, 0x00
1360: 2c 20 30 78 30 33 2c 20 30 78 30 38 2c 20 30 78 , 0x03, 0x08, 0x
1370: 30 30 2c 20 30 78 30 30 2c 20 30 78 31 30 2c 20 00, 0x00, 0x10,
1380: 30 78 30 30 2c 20 30 78 30 31 2c 20 30 78 30 30 0x00, 0x01, 0x00
1390: 0a 0a 2f 2a 20 50 49 56 20 49 44 73 20 2a 2f 0a ../* PIV IDs */.
13a0: 2f 2a 2a 20 4b 65 79 20 49 64 65 6e 74 69 66 69 /** Key Identifi
13b0: 65 72 73 20 28 4e 49 53 54 20 53 50 20 38 30 30 ers (NIST SP 800
13c0: 2d 37 38 2d 33 2c 20 54 61 62 6c 65 20 36 2d 31 -78-3, Table 6-1
13d0: 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 49 53 **/.#define NIS
13e0: 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f TSP800_78_3_KEY_
13f0: 50 49 56 41 55 54 48 20 20 20 30 78 39 41 0a 23 PIVAUTH 0x9A.#
1400: 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30 define NISTSP800
1410: 5f 37 38 5f 33 5f 4b 45 59 5f 53 49 47 4e 41 54 _78_3_KEY_SIGNAT
1420: 55 52 45 20 30 78 39 43 0a 23 64 65 66 69 6e 65 URE 0x9C.#define
1430: 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f NISTSP800_78_3_
1440: 4b 45 59 5f 4b 45 59 4d 47 54 20 20 20 20 30 78 KEY_KEYMGT 0x
1450: 39 44 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53 9D.#define NISTS
1460: 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 43 41 P800_78_3_KEY_CA
1470: 52 44 41 55 54 48 20 20 30 78 39 45 0a 0a 2f 2a RDAUTH 0x9E../*
1480: 2a 20 41 6c 67 6f 72 69 74 68 6d 20 49 64 65 6e * Algorithm Iden
1490: 74 69 66 69 65 72 73 20 28 4e 49 53 54 20 53 50 tifiers (NIST SP
14a0: 20 38 30 30 2d 37 38 2d 33 2c 20 54 61 62 6c 65 800-78-3, Table
14b0: 20 36 2d 32 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 6-2 **/.#define
14c0: 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f NISTSP800_78_3_
14d0: 41 4c 47 4f 5f 52 53 41 31 30 32 34 20 20 30 78 ALGO_RSA1024 0x
14e0: 30 36 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53 06.#define NISTS
14f0: 50 38 30 30 5f 37 38 5f 33 5f 41 4c 47 4f 5f 52 P800_78_3_ALGO_R
1500: 53 41 32 30 34 38 20 20 30 78 30 37 0a 0a 2f 2a SA2048 0x07../*
1510: 2a 20 4f 62 6a 65 63 74 20 49 64 65 6e 74 69 66 * Object Identif
1520: 69 65 72 73 20 28 4e 49 53 54 20 53 50 20 38 30 iers (NIST SP 80
1530: 30 2d 37 33 2d 33 20 50 61 72 74 20 31 2c 20 54 0-73-3 Part 1, T
1540: 61 62 6c 65 20 32 29 20 2a 2a 2f 0a 23 64 65 66 able 2) **/.#def
1550: 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f 37 33 ine NISTSP800_73
1560: 5f 33 5f 4f 49 44 5f 50 49 56 41 55 54 48 20 20 _3_OID_PIVAUTH
1570: 20 30 78 35 46 2c 20 30 78 43 31 2c 20 30 78 30 0x5F, 0xC1, 0x0
1580: 35 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53 50 5.#define NISTSP
1590: 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 53 49 47 800_73_3_OID_SIG
15a0: 4e 41 54 55 52 45 20 30 78 35 46 2c 20 30 78 43 NATURE 0x5F, 0xC
15b0: 31 2c 20 30 78 30 41 0a 23 64 65 66 69 6e 65 20 1, 0x0A.#define
15c0: 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f NISTSP800_73_3_O
15d0: 49 44 5f 4b 45 59 4d 47 54 20 20 20 20 30 78 35 ID_KEYMGT 0x5
15e0: 46 2c 20 30 78 43 31 2c 20 30 78 30 42 0a 23 64 F, 0xC1, 0x0B.#d
15f0: 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f efine NISTSP800_
1600: 37 33 5f 33 5f 4f 49 44 5f 43 41 52 44 41 55 54 73_3_OID_CARDAUT
1610: 48 20 20 30 78 35 46 2c 20 30 78 43 31 2c 20 30 H 0x5F, 0xC1, 0
1620: 78 30 31 0a 0a 2f 2a 20 4d 61 78 69 6d 75 6d 20 x01../* Maximum
1630: 73 69 7a 65 20 6f 66 20 64 61 74 61 20 70 6f 72 size of data por
1640: 74 69 6f 6e 20 6f 66 20 41 50 44 55 73 20 2a 2f tion of APDUs */
1650: 0a 2f 2a 2a 20 44 6f 20 6e 6f 74 20 73 65 74 20 ./** Do not set
1660: 74 68 69 73 20 61 62 6f 76 65 20 32 35 30 20 2a this above 250 *
1670: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 41 43 4b 45 */.#define CACKE
1680: 59 5f 41 50 44 55 5f 4d 54 55 20 20 20 20 20 20 Y_APDU_MTU
1690: 20 20 20 20 20 20 20 20 20 32 35 30 0a 0a 2f 2a 250../*
16a0: 20 41 54 52 20 49 66 20 6e 6f 74 20 61 76 61 69 ATR If not avai
16b0: 6c 61 62 6c 65 20 2a 2f 0a 23 69 66 6e 64 65 66 lable */.#ifndef
16c0: 20 4d 41 58 5f 41 54 52 5f 53 49 5a 45 0a 23 64 MAX_ATR_SIZE.#d
16d0: 65 66 69 6e 65 20 4d 41 58 5f 41 54 52 5f 53 49 efine MAX_ATR_SI
16e0: 5a 45 20 31 30 32 34 0a 23 65 6e 64 69 66 0a 0a ZE 1024.#endif..
16f0: 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45 #ifdef CACKEY_DE
1700: 42 55 47 0a 23 20 20 69 66 64 65 66 20 48 41 56 BUG.# ifdef HAV
1710: 45 5f 54 49 4d 45 5f 48 0a 23 20 20 20 20 69 6e E_TIME_H.# in
1720: 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 73 clude <time.h>.s
1730: 74 61 74 69 63 20 74 69 6d 65 5f 74 20 63 61 63 tatic time_t cac
1740: 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72 74 5f key_debug_start_
1750: 74 69 6d 65 20 3d 20 30 3b 0a 23 20 20 20 20 64 time = 0;.# d
1760: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 efine CACKEY_DEB
1770: 55 47 5f 50 52 49 4e 54 54 49 4d 45 20 7b 20 69 UG_PRINTTIME { i
1780: 66 20 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f f (cackey_debug_
1790: 73 74 61 72 74 5f 74 69 6d 65 20 3d 3d 20 30 29 start_time == 0)
17a0: 20 7b 20 63 61 63 6b 65 79 5f 64 65 62 75 67 5f { cackey_debug_
17b0: 73 74 61 72 74 5f 74 69 6d 65 20 3d 20 74 69 6d start_time = tim
17c0: 65 28 4e 55 4c 4c 29 3b 20 7d 3b 20 66 70 72 69 e(NULL); }; fpri
17d0: 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67 ntf(cackey_debug
17e0: 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d 3a 20 22 _fd(), "[%lu]: "
17f0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
1800: 29 20 28 74 69 6d 65 28 4e 55 4c 4c 29 20 2d 20 ) (time(NULL) -
1810: 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 cackey_debug_sta
1820: 72 74 5f 74 69 6d 65 29 29 3b 20 7d 0a 23 20 20 rt_time)); }.#
1830: 65 6c 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 else.# define
1840: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 CACKEY_DEBUG_PR
1850: 49 4e 54 54 49 4d 45 20 2f 2a 2a 2f 0a 23 20 20 INTTIME /**/.#
1860: 65 6e 64 69 66 0a 0a 23 20 20 64 65 66 69 6e 65 endif..# define
1870: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 CACKEY_DEBUG_PR
1880: 49 4e 54 46 28 78 2e 2e 2e 29 20 7b 20 43 41 43 INTF(x...) { CAC
1890: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 54 KEY_DEBUG_PRINTT
18a0: 49 4d 45 3b 20 66 70 72 69 6e 74 66 28 63 61 63 IME; fprintf(cac
18b0: 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c 20 key_debug_fd(),
18c0: 22 25 73 28 29 3a 25 69 3a 20 22 2c 20 5f 5f 66 "%s():%i: ", __f
18d0: 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 unc__, __LINE__)
18e0: 3b 20 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 ; fprintf(cackey
18f0: 5f 64 65 62 75 67 5f 66 64 28 29 2c 20 78 29 3b _debug_fd(), x);
1900: 20 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f fprintf(cackey_
1910: 64 65 62 75 67 5f 66 64 28 29 2c 20 22 5c 6e 22 debug_fd(), "\n"
1920: 29 3b 20 66 66 6c 75 73 68 28 63 61 63 6b 65 79 ); fflush(cackey
1930: 5f 64 65 62 75 67 5f 66 64 28 29 29 3b 20 7d 0a _debug_fd()); }.
1940: 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 # define CACKEY
1950: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 _DEBUG_PRINTBUF(
1960: 66 2c 20 78 2c 20 79 29 20 7b 20 75 6e 73 69 67 f, x, y) { unsig
1970: 6e 65 64 20 63 68 61 72 20 2a 54 4d 50 42 55 46 ned char *TMPBUF
1980: 3b 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 ; unsigned long
1990: 69 64 78 3b 20 54 4d 50 42 55 46 20 3d 20 28 75 idx; TMPBUF = (u
19a0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 nsigned char *)
19b0: 28 78 29 3b 20 43 41 43 4b 45 59 5f 44 45 42 55 (x); CACKEY_DEBU
19c0: 47 5f 50 52 49 4e 54 54 49 4d 45 3b 20 66 70 72 G_PRINTTIME; fpr
19d0: 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75 intf(cackey_debu
19e0: 67 5f 66 64 28 29 2c 20 22 25 73 28 29 3a 25 69 g_fd(), "%s():%i
19f0: 3a 20 25 73 20 20 28 25 73 2f 25 6c 75 20 3d 20 : %s (%s/%lu =
1a00: 7b 25 30 32 78 22 2c 20 5f 5f 66 75 6e 63 5f 5f {%02x", __func__
1a10: 2c 20 5f 5f 4c 49 4e 45 5f 5f 2c 20 66 2c 20 23 , __LINE__, f, #
1a20: 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e x, (unsigned lon
1a30: 67 29 20 28 79 29 2c 20 54 4d 50 42 55 46 5b 30 g) (y), TMPBUF[0
1a40: 5d 29 3b 20 66 6f 72 20 28 69 64 78 20 3d 20 31 ]); for (idx = 1
1a50: 3b 20 69 64 78 20 3c 20 28 79 29 3b 20 69 64 78 ; idx < (y); idx
1a60: 2b 2b 29 20 7b 20 66 70 72 69 6e 74 66 28 63 61 ++) { fprintf(ca
1a70: 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c ckey_debug_fd(),
1a80: 20 22 2c 20 25 30 32 78 22 2c 20 54 4d 50 42 55 ", %02x", TMPBU
1a90: 46 5b 69 64 78 5d 29 3b 20 7d 3b 20 66 70 72 69 F[idx]); }; fpri
1aa0: 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67 ntf(cackey_debug
1ab0: 5f 66 64 28 29 2c 20 22 7d 29 5c 6e 22 29 3b 20 _fd(), "})\n");
1ac0: 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f 64 65 fflush(cackey_de
1ad0: 62 75 67 5f 66 64 28 29 29 3b 20 7d 0a 23 20 20 bug_fd()); }.#
1ae0: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 define CACKEY_DE
1af0: 42 55 47 5f 50 45 52 52 4f 52 28 78 29 20 7b 20 BUG_PERROR(x) {
1b00: 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 fprintf(cackey_d
1b10: 65 62 75 67 5f 66 64 28 29 2c 20 22 25 73 28 29 ebug_fd(), "%s()
1b20: 3a 25 69 3a 20 22 2c 20 5f 5f 66 75 6e 63 5f 5f :%i: ", __func__
1b30: 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 43 41 43 , __LINE__); CAC
1b40: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 54 KEY_DEBUG_PRINTT
1b50: 49 4d 45 3b 20 70 65 72 72 6f 72 28 78 29 3b 20 IME; perror(x);
1b60: 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f 64 65 fflush(cackey_de
1b70: 62 75 67 5f 66 64 28 29 29 3b 20 7d 0a 23 20 20 bug_fd()); }.#
1b80: 64 65 66 69 6e 65 20 66 72 65 65 28 78 29 20 7b define free(x) {
1b90: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 CACKEY_DEBUG_PR
1ba0: 49 4e 54 46 28 22 46 52 45 45 28 25 70 29 20 28 INTF("FREE(%p) (
1bb0: 25 73 29 22 2c 20 28 76 6f 69 64 20 2a 29 20 78 %s)", (void *) x
1bc0: 2c 20 23 78 29 3b 20 66 72 65 65 28 78 29 3b 20 , #x); free(x);
1bd0: 7d 0a 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a }..static FILE *
1be0: 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 cackey_debug_fd(
1bf0: 76 6f 69 64 29 20 7b 0a 09 73 74 61 74 69 63 20 void) {..static
1c00: 46 49 4c 45 20 2a 66 64 20 3d 20 4e 55 4c 4c 3b FILE *fd = NULL;
1c10: 0a 09 63 68 61 72 20 2a 6c 6f 67 66 69 6c 65 3b ..char *logfile;
1c20: 0a 0a 09 69 66 20 28 66 64 20 21 3d 20 4e 55 4c ...if (fd != NUL
1c30: 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 66 64 L) {...return(fd
1c40: 29 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4c );..}.../*.. * L
1c50: 6f 67 20 74 6f 20 73 74 64 65 72 72 20 69 6e 69 og to stderr ini
1c60: 74 69 61 6c 6c 79 20 73 6f 20 77 65 20 63 61 6e tially so we can
1c70: 20 75 73 65 20 64 65 62 75 67 67 69 6e 67 20 77 use debugging w
1c80: 69 74 68 69 6e 0a 09 20 2a 20 74 68 69 73 20 66 ithin.. * this f
1c90: 75 6e 63 74 69 6f 6e 20 77 69 74 68 6f 75 74 20 unction without
1ca0: 67 65 74 74 69 6e 67 20 69 6e 74 6f 20 61 6e 20 getting into an
1cb0: 69 6e 66 69 6e 69 74 65 20 6c 6f 6f 70 0a 09 20 infinite loop..
1cc0: 2a 2f 0a 09 66 64 20 3d 20 73 74 64 65 72 72 3b */..fd = stderr;
1cd0: 0a 0a 09 6c 6f 67 66 69 6c 65 20 3d 20 67 65 74 ...logfile = get
1ce0: 65 6e 76 28 22 43 41 43 4b 45 59 5f 44 45 42 55 env("CACKEY_DEBU
1cf0: 47 5f 4c 4f 47 46 49 4c 45 22 29 3b 0a 09 69 66 G_LOGFILE");..if
1d00: 20 28 6c 6f 67 66 69 6c 65 20 21 3d 20 4e 55 4c (logfile != NUL
1d10: 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 L) {...CACKEY_DE
1d20: 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e BUG_PRINTF("Foun
1d30: 64 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 d environment va
1d40: 72 69 61 62 6c 65 3a 20 25 73 22 2c 20 6c 6f 67 riable: %s", log
1d50: 66 69 6c 65 29 3b 0a 0a 09 09 6c 6f 67 66 69 6c file);....logfil
1d60: 65 20 3d 20 73 74 72 63 68 72 28 6c 6f 67 66 69 e = strchr(logfi
1d70: 6c 65 2c 20 27 3d 27 29 3b 0a 09 09 69 66 20 28 le, '=');...if (
1d80: 6c 6f 67 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 logfile == NULL)
1d90: 20 7b 0a 09 09 09 6c 6f 67 66 69 6c 65 20 3d 20 {....logfile =
1da0: 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 44 getenv("CACKEY_D
1db0: 45 42 55 47 5f 4c 4f 47 46 49 4c 45 22 29 3b 0a EBUG_LOGFILE");.
1dc0: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 6c 6f ..} else {....lo
1dd0: 67 66 69 6c 65 2b 2b 3b 0a 09 09 7d 0a 09 7d 0a gfile++;...}..}.
1de0: 0a 09 69 66 20 28 6c 6f 67 66 69 6c 65 20 21 3d ..if (logfile !=
1df0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 NULL) {...CACKE
1e00: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1e10: 46 6f 75 6e 64 20 6c 6f 67 20 66 69 6c 65 3a 20 Found log file:
1e20: 25 73 22 2c 20 6c 6f 67 66 69 6c 65 29 3b 0a 0a %s", logfile);..
1e30: 09 09 66 64 20 3d 20 66 6f 70 65 6e 28 6c 6f 67 ..fd = fopen(log
1e40: 66 69 6c 65 2c 20 22 61 22 29 3b 0a 09 7d 0a 0a file, "a");..}..
1e50: 09 69 66 20 28 66 64 20 3d 3d 20 4e 55 4c 4c 29 .if (fd == NULL)
1e60: 20 7b 0a 09 09 66 64 20 3d 20 73 74 64 65 72 72 {...fd = stderr
1e70: 3b 0a 09 7d 0a 0a 09 69 66 20 28 66 64 20 3d 3d ;..}...if (fd ==
1e80: 20 73 74 64 65 72 72 29 20 7b 0a 09 09 43 41 43 stderr) {...CAC
1e90: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1ea0: 28 22 52 65 74 75 72 6e 69 6e 67 20 73 74 64 65 ("Returning stde
1eb0: 72 72 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a rr");..} else {.
1ec0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1ed0: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
1ee0: 20 25 70 22 2c 20 28 76 6f 69 64 20 2a 29 20 66 %p", (void *) f
1ef0: 64 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 d);..}...return(
1f00: 66 64 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 fd);.}..static v
1f10: 6f 69 64 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 oid *CACKEY_DEBU
1f20: 47 5f 46 55 4e 43 5f 4d 41 4c 4c 4f 43 28 73 69 G_FUNC_MALLOC(si
1f30: 7a 65 5f 74 20 73 69 7a 65 2c 20 63 6f 6e 73 74 ze_t size, const
1f40: 20 63 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 char *func, int
1f50: 20 6c 69 6e 65 29 20 7b 0a 09 76 6f 69 64 20 2a line) {..void *
1f60: 72 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c retval;...retval
1f70: 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 29 3b = malloc(size);
1f80: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1f90: 50 52 49 4e 54 54 49 4d 45 3b 0a 09 66 70 72 69 PRINTTIME;..fpri
1fa0: 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67 ntf(cackey_debug
1fb0: 5f 66 64 28 29 2c 20 22 25 73 28 29 3a 25 69 3a _fd(), "%s():%i:
1fc0: 20 22 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 29 3b ", func, line);
1fd0: 0a 09 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 ..fprintf(cackey
1fe0: 5f 64 65 62 75 67 5f 66 64 28 29 2c 20 22 4d 41 _debug_fd(), "MA
1ff0: 4c 4c 4f 43 28 29 20 3d 20 25 70 22 2c 20 72 65 LLOC() = %p", re
2000: 74 76 61 6c 29 3b 0a 09 66 70 72 69 6e 74 66 28 tval);..fprintf(
2010: 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 cackey_debug_fd(
2020: 29 2c 20 22 5c 6e 22 29 3b 0a 09 66 66 6c 75 73 ), "\n");..fflus
2030: 68 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 h(cackey_debug_f
2040: 64 28 29 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 d());...return(r
2050: 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 etval);.}..stati
2060: 63 20 76 6f 69 64 20 2a 43 41 43 4b 45 59 5f 44 c void *CACKEY_D
2070: 45 42 55 47 5f 46 55 4e 43 5f 52 45 41 4c 4c 4f EBUG_FUNC_REALLO
2080: 43 28 76 6f 69 64 20 2a 70 74 72 2c 20 73 69 7a C(void *ptr, siz
2090: 65 5f 74 20 73 69 7a 65 2c 20 63 6f 6e 73 74 20 e_t size, const
20a0: 63 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20 char *func, int
20b0: 6c 69 6e 65 29 20 7b 0a 09 76 6f 69 64 20 2a 72 line) {..void *r
20c0: 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 etval;...retval
20d0: 3d 20 72 65 61 6c 6c 6f 63 28 70 74 72 2c 20 73 = realloc(ptr, s
20e0: 69 7a 65 29 3b 0a 0a 09 69 66 20 28 72 65 74 76 ize);...if (retv
20f0: 61 6c 20 21 3d 20 70 74 72 29 20 7b 0a 09 09 43 al != ptr) {...C
2100: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
2110: 54 54 49 4d 45 3b 0a 09 09 66 70 72 69 6e 74 66 TTIME;...fprintf
2120: 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 (cackey_debug_fd
2130: 28 29 2c 20 22 25 73 28 29 3a 25 69 3a 20 22 2c (), "%s():%i: ",
2140: 20 66 75 6e 63 2c 20 6c 69 6e 65 29 3b 0a 09 09 func, line);...
2150: 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 fprintf(cackey_d
2160: 65 62 75 67 5f 66 64 28 29 2c 20 22 52 45 41 4c ebug_fd(), "REAL
2170: 4c 4f 43 28 25 70 29 20 3d 20 25 70 22 2c 20 70 LOC(%p) = %p", p
2180: 74 72 2c 20 72 65 74 76 61 6c 29 3b 0a 09 09 66 tr, retval);...f
2190: 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 printf(cackey_de
21a0: 62 75 67 5f 66 64 28 29 2c 20 22 5c 6e 22 29 3b bug_fd(), "\n");
21b0: 0a 09 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79 ...fflush(cackey
21c0: 5f 64 65 62 75 67 5f 66 64 28 29 29 3b 0a 09 7d _debug_fd());..}
21d0: 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20 3d 3d ...if (retval ==
21e0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 NULL) {...CACKE
21f0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
2200: 20 2a 2a 2a 20 45 52 52 4f 52 20 2a 2a 2a 20 72 *** ERROR *** r
2210: 65 61 6c 6c 6f 63 20 72 65 74 75 72 6e 65 64 20 ealloc returned
2220: 4e 55 4c 4c 20 28 73 69 7a 65 20 3d 20 25 6c 75 NULL (size = %lu
2230: 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f )", (unsigned lo
2240: 6e 67 29 20 73 69 7a 65 29 3b 0a 09 7d 0a 0a 09 ng) size);..}...
2250: 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a return(retval);.
2260: 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a }..static char *
2270: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e CACKEY_DEBUG_FUN
2280: 43 5f 53 54 52 44 55 50 28 63 6f 6e 73 74 20 63 C_STRDUP(const c
2290: 68 61 72 20 2a 70 74 72 2c 20 63 6f 6e 73 74 20 har *ptr, const
22a0: 63 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20 char *func, int
22b0: 6c 69 6e 65 29 20 7b 0a 09 63 68 61 72 20 2a 72 line) {..char *r
22c0: 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 etval;...retval
22d0: 3d 20 73 74 72 64 75 70 28 70 74 72 29 3b 0a 0a = strdup(ptr);..
22e0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
22f0: 49 4e 54 54 49 4d 45 3b 0a 09 66 70 72 69 6e 74 INTTIME;..fprint
2300: 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 f(cackey_debug_f
2310: 64 28 29 2c 20 22 25 73 28 29 3a 25 69 3a 20 22 d(), "%s():%i: "
2320: 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 29 3b 0a 09 , func, line);..
2330: 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 fprintf(cackey_d
2340: 65 62 75 67 5f 66 64 28 29 2c 20 22 53 54 52 44 ebug_fd(), "STRD
2350: 55 50 5f 4d 41 4c 4c 4f 43 28 29 20 3d 20 25 70 UP_MALLOC() = %p
2360: 22 2c 20 72 65 74 76 61 6c 29 3b 0a 09 66 70 72 ", retval);..fpr
2370: 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75 intf(cackey_debu
2380: 67 5f 66 64 28 29 2c 20 22 5c 6e 22 29 3b 0a 09 g_fd(), "\n");..
2390: 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f 64 65 fflush(cackey_de
23a0: 62 75 67 5f 66 64 28 29 29 3b 0a 0a 09 72 65 74 bug_fd());...ret
23b0: 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a urn(retval);.}..
23c0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 static const cha
23d0: 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f r *CACKEY_DEBUG_
23e0: 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 FUNC_TAG_TO_STR(
23f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 61 unsigned char ta
2400: 67 29 20 7b 0a 09 73 77 69 74 63 68 20 28 74 61 g) {..switch (ta
2410: 67 29 20 7b 0a 09 09 63 61 73 65 20 47 53 43 49 g) {...case GSCI
2420: 53 5f 54 41 47 5f 43 41 52 44 49 44 3a 0a 09 09 S_TAG_CARDID:...
2430: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 .return("GSCIS_T
2440: 41 47 5f 43 41 52 44 49 44 22 29 3b 0a 09 09 63 AG_CARDID");...c
2450: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 43 ase GSCIS_TAG_CC
2460: 43 5f 56 45 52 3a 0a 09 09 09 72 65 74 75 72 6e C_VER:....return
2470: 28 22 47 53 43 49 53 5f 54 41 47 5f 43 43 43 5f ("GSCIS_TAG_CCC_
2480: 56 45 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53 VER");...case GS
2490: 43 49 53 5f 54 41 47 5f 43 43 47 5f 56 45 52 3a CIS_TAG_CCG_VER:
24a0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 ....return("GSCI
24b0: 53 5f 54 41 47 5f 43 43 47 5f 56 45 52 22 29 3b S_TAG_CCG_VER");
24c0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 ...case GSCIS_TA
24d0: 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09 72 65 G_CARDURL:....re
24e0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f turn("GSCIS_TAG_
24f0: 43 41 52 44 55 52 4c 22 29 3b 0a 09 09 63 61 73 CARDURL");...cas
2500: 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 53 e GSCIS_TAG_PKCS
2510: 31 35 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 15:....return("G
2520: 53 43 49 53 5f 54 41 47 5f 50 4b 43 53 31 35 22 SCIS_TAG_PKCS15"
2530: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f );...case GSCIS_
2540: 54 41 47 5f 52 45 47 5f 44 41 54 41 5f 4d 4f 44 TAG_REG_DATA_MOD
2550: 45 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 EL:....return("G
2560: 53 43 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 SCIS_TAG_REG_DAT
2570: 41 5f 4d 4f 44 45 4c 22 29 3b 0a 09 09 63 61 73 A_MODEL");...cas
2580: 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f e GSCIS_TAG_ACR_
2590: 54 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e TABLE:....return
25a0: 28 22 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f ("GSCIS_TAG_ACR_
25b0: 54 41 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 TABLE");...case
25c0: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 41 GSCIS_TAG_CARD_A
25d0: 50 44 55 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 PDU:....return("
25e0: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 41 GSCIS_TAG_CARD_A
25f0: 50 44 55 22 29 3b 0a 09 09 63 61 73 65 20 47 53 PDU");...case GS
2600: 43 49 53 5f 54 41 47 5f 52 45 44 49 52 45 43 54 CIS_TAG_REDIRECT
2610: 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 ION:....return("
2620: 47 53 43 49 53 5f 54 41 47 5f 52 45 44 49 52 45 GSCIS_TAG_REDIRE
2630: 43 54 49 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 CTION");...case
2640: 47 53 43 49 53 5f 54 41 47 5f 43 54 3a 0a 09 09 GSCIS_TAG_CT:...
2650: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 .return("GSCIS_T
2660: 41 47 5f 43 54 22 29 3b 0a 09 09 63 61 73 65 20 AG_CT");...case
2670: 47 53 43 49 53 5f 54 41 47 5f 53 54 3a 0a 09 09 GSCIS_TAG_ST:...
2680: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 .return("GSCIS_T
2690: 41 47 5f 53 54 22 29 3b 0a 09 09 63 61 73 65 20 AG_ST");...case
26a0: 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54 43 43 GSCIS_TAG_NEXTCC
26b0: 43 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 C:....return("GS
26c0: 43 49 53 5f 54 41 47 5f 4e 45 58 54 43 43 43 22 CIS_TAG_NEXTCCC"
26d0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f );...case GSCIS_
26e0: 54 41 47 5f 46 4e 41 4d 45 3a 0a 09 09 09 72 65 TAG_FNAME:....re
26f0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f turn("GSCIS_TAG_
2700: 46 4e 41 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 FNAME");...case
2710: 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41 4d 45 3a GSCIS_TAG_MNAME:
2720: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 ....return("GSCI
2730: 53 5f 54 41 47 5f 4d 4e 41 4d 45 22 29 3b 0a 09 S_TAG_MNAME");..
2740: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f .case GSCIS_TAG_
2750: 4c 4e 41 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e LNAME:....return
2760: 28 22 47 53 43 49 53 5f 54 41 47 5f 4c 4e 41 4d ("GSCIS_TAG_LNAM
2770: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 E");...case GSCI
2780: 53 5f 54 41 47 5f 53 55 46 46 49 58 3a 0a 09 09 S_TAG_SUFFIX:...
2790: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 .return("GSCIS_T
27a0: 41 47 5f 53 55 46 46 49 58 22 29 3b 0a 09 09 63 AG_SUFFIX");...c
27b0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 47 4f ase GSCIS_TAG_GO
27c0: 56 54 5f 41 47 45 4e 43 59 3a 0a 09 09 09 72 65 VT_AGENCY:....re
27d0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f turn("GSCIS_TAG_
27e0: 47 4f 56 54 5f 41 47 45 4e 43 59 22 29 3b 0a 09 GOVT_AGENCY");..
27f0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f .case GSCIS_TAG_
2800: 42 55 52 45 41 55 3a 0a 09 09 09 72 65 74 75 72 BUREAU:....retur
2810: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 42 55 52 n("GSCIS_TAG_BUR
2820: 45 41 55 22 29 3b 0a 09 09 63 61 73 65 20 47 53 EAU");...case GS
2830: 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 5f 43 CIS_TAG_BUREAU_C
2840: 4f 44 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 ODE:....return("
2850: 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 GSCIS_TAG_BUREAU
2860: 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61 73 65 20 _CODE");...case
2870: 47 53 43 49 53 5f 54 41 47 5f 44 45 50 54 5f 43 GSCIS_TAG_DEPT_C
2880: 4f 44 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 ODE:....return("
2890: 47 53 43 49 53 5f 54 41 47 5f 44 45 50 54 5f 43 GSCIS_TAG_DEPT_C
28a0: 4f 44 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 ODE");...case GS
28b0: 43 49 53 5f 54 41 47 5f 54 49 54 4c 45 3a 0a 09 CIS_TAG_TITLE:..
28c0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f ..return("GSCIS_
28d0: 54 41 47 5f 54 49 54 4c 45 22 29 3b 0a 09 09 63 TAG_TITLE");...c
28e0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 ase GSCIS_TAG_BU
28f0: 49 4c 44 49 4e 47 3a 0a 09 09 09 72 65 74 75 72 ILDING:....retur
2900: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 42 55 49 n("GSCIS_TAG_BUI
2910: 4c 44 49 4e 47 22 29 3b 0a 09 09 63 61 73 65 20 LDING");...case
2920: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 GSCIS_TAG_OFFICE
2930: 5f 41 44 44 52 31 3a 0a 09 09 09 72 65 74 75 72 _ADDR1:....retur
2940: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 n("GSCIS_TAG_OFF
2950: 49 43 45 5f 41 44 44 52 31 22 29 3b 0a 09 09 63 ICE_ADDR1");...c
2960: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 ase GSCIS_TAG_OF
2970: 46 49 43 45 5f 41 44 44 52 32 3a 0a 09 09 09 72 FICE_ADDR2:....r
2980: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 eturn("GSCIS_TAG
2990: 5f 4f 46 46 49 43 45 5f 41 44 44 52 32 22 29 3b _OFFICE_ADDR2");
29a0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 ...case GSCIS_TA
29b0: 47 5f 4f 46 46 49 43 45 5f 43 49 54 59 3a 0a 09 G_OFFICE_CITY:..
29c0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f ..return("GSCIS_
29d0: 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54 59 22 TAG_OFFICE_CITY"
29e0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f );...case GSCIS_
29f0: 54 41 47 5f 4f 46 46 49 43 45 5f 53 54 41 54 45 TAG_OFFICE_STATE
2a00: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 :....return("GSC
2a10: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53 54 IS_TAG_OFFICE_ST
2a20: 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 ATE");...case GS
2a30: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 5a CIS_TAG_OFFICE_Z
2a40: 49 50 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 IP:....return("G
2a50: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f SCIS_TAG_OFFICE_
2a60: 5a 49 50 22 29 3b 0a 09 09 63 61 73 65 20 47 53 ZIP");...case GS
2a70: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 CIS_TAG_OFFICE_C
2a80: 4f 55 4e 54 52 59 3a 0a 09 09 09 72 65 74 75 72 OUNTRY:....retur
2a90: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 n("GSCIS_TAG_OFF
2aa0: 49 43 45 5f 43 4f 55 4e 54 52 59 22 29 3b 0a 09 ICE_COUNTRY");..
2ab0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f .case GSCIS_TAG_
2ac0: 4f 46 46 49 43 45 5f 50 48 4f 4e 45 3a 0a 09 09 OFFICE_PHONE:...
2ad0: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 .return("GSCIS_T
2ae0: 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 22 AG_OFFICE_PHONE"
2af0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f );...case GSCIS_
2b00: 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 TAG_OFFICE_PHONE
2b10: 5f 45 58 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 _EXT:....return(
2b20: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 "GSCIS_TAG_OFFIC
2b30: 45 5f 50 48 4f 4e 45 5f 45 58 54 22 29 3b 0a 09 E_PHONE_EXT");..
2b40: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f .case GSCIS_TAG_
2b50: 4f 46 46 49 43 45 5f 46 41 58 3a 0a 09 09 09 72 OFFICE_FAX:....r
2b60: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 eturn("GSCIS_TAG
2b70: 5f 4f 46 46 49 43 45 5f 46 41 58 22 29 3b 0a 09 _OFFICE_FAX");..
2b80: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f .case GSCIS_TAG_
2b90: 4f 46 46 49 43 45 5f 45 4d 41 49 4c 3a 0a 09 09 OFFICE_EMAIL:...
2ba0: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 .return("GSCIS_T
2bb0: 41 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c 22 AG_OFFICE_EMAIL"
2bc0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f );...case GSCIS_
2bd0: 54 41 47 5f 4f 46 46 49 43 45 5f 52 4f 4f 4d 3a TAG_OFFICE_ROOM:
2be0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 ....return("GSCI
2bf0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52 4f 4f S_TAG_OFFICE_ROO
2c00: 4d 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 M");...case GSCI
2c10: 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f 41 47 45 S_TAG_NONGOV_AGE
2c20: 4e 43 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 NCY:....return("
2c30: 47 53 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 GSCIS_TAG_NONGOV
2c40: 5f 41 47 45 4e 43 59 22 29 3b 0a 09 09 63 61 73 _AGENCY");...cas
2c50: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 5f e GSCIS_TAG_SSN_
2c60: 44 45 53 49 47 4e 41 54 4f 52 3a 0a 09 09 09 72 DESIGNATOR:....r
2c70: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 eturn("GSCIS_TAG
2c80: 5f 53 53 4e 5f 44 45 53 49 47 4e 41 54 4f 52 22 _SSN_DESIGNATOR"
2c90: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f );...case GSCIS_
2ca0: 54 41 47 5f 53 53 4e 3a 0a 09 09 09 72 65 74 75 TAG_SSN:....retu
2cb0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53 53 rn("GSCIS_TAG_SS
2cc0: 4e 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 N");...case GSCI
2cd0: 53 5f 54 41 47 5f 44 4f 42 3a 0a 09 09 09 72 65 S_TAG_DOB:....re
2ce0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f turn("GSCIS_TAG_
2cf0: 44 4f 42 22 29 3b 0a 09 09 63 61 73 65 20 47 53 DOB");...case GS
2d00: 43 49 53 5f 54 41 47 5f 47 45 4e 44 45 52 3a 0a CIS_TAG_GENDER:.
2d10: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 ...return("GSCIS
2d20: 5f 54 41 47 5f 47 45 4e 44 45 52 22 29 3b 0a 09 _TAG_GENDER");..
2d30: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f .case GSCIS_TAG_
2d40: 55 53 45 52 49 44 3a 0a 09 09 09 72 65 74 75 72 USERID:....retur
2d50: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 55 53 45 n("GSCIS_TAG_USE
2d60: 52 49 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53 RID");...case GS
2d70: 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49 4e 3a 0a CIS_TAG_DOMAIN:.
2d80: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 ...return("GSCIS
2d90: 5f 54 41 47 5f 44 4f 4d 41 49 4e 22 29 3b 0a 09 _TAG_DOMAIN");..
2da0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f .case GSCIS_TAG_
2db0: 50 41 53 53 57 4f 52 44 3a 0a 09 09 09 72 65 74 PASSWORD:....ret
2dc0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 50 urn("GSCIS_TAG_P
2dd0: 41 53 53 57 4f 52 44 22 29 3b 0a 09 09 63 61 73 ASSWORD");...cas
2de0: 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55 e GSCIS_TAG_ISSU
2df0: 45 52 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 ERID:....return(
2e00: 22 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45 "GSCIS_TAG_ISSUE
2e10: 52 49 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53 RID");...case GS
2e20: 43 49 53 5f 54 41 47 5f 53 45 52 4e 4f 3a 0a 09 CIS_TAG_SERNO:..
2e30: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f ..return("GSCIS_
2e40: 54 41 47 5f 53 45 52 4e 4f 22 29 3b 0a 09 09 63 TAG_SERNO");...c
2e50: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53 ase GSCIS_TAG_IS
2e60: 53 55 45 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 SUE_DATE:....ret
2e70: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 49 urn("GSCIS_TAG_I
2e80: 53 53 55 45 5f 44 41 54 45 22 29 3b 0a 09 09 63 SSUE_DATE");...c
2e90: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 45 58 ase GSCIS_TAG_EX
2ea0: 50 49 52 45 5f 44 41 54 45 3a 0a 09 09 09 72 65 PIRE_DATE:....re
2eb0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f turn("GSCIS_TAG_
2ec0: 45 58 50 49 52 45 5f 44 41 54 45 22 29 3b 0a 09 EXPIRE_DATE");..
2ed0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f .case GSCIS_TAG_
2ee0: 43 41 52 44 5f 54 59 50 45 3a 0a 09 09 09 72 65 CARD_TYPE:....re
2ef0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f turn("GSCIS_TAG_
2f00: 43 41 52 44 5f 54 59 50 45 22 29 3b 0a 09 09 63 CARD_TYPE");...c
2f10: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53 45 ase GSCIS_TAG_SE
2f20: 43 55 52 49 54 59 5f 43 4f 44 45 3a 0a 09 09 09 CURITY_CODE:....
2f30: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 return("GSCIS_TA
2f40: 47 5f 53 45 43 55 52 49 54 59 5f 43 4f 44 45 22 G_SECURITY_CODE"
2f50: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f );...case GSCIS_
2f60: 54 41 47 5f 43 41 52 44 49 44 5f 41 49 44 3a 0a TAG_CARDID_AID:.
2f70: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 ...return("GSCIS
2f80: 5f 54 41 47 5f 43 41 52 44 49 44 5f 41 49 44 22 _TAG_CARDID_AID"
2f90: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f );...case GSCIS_
2fa0: 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 3a TAG_CERTIFICATE:
2fb0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 ....return("GSCI
2fc0: 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 S_TAG_CERTIFICAT
2fd0: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 E");...case GSCI
2fe0: 53 5f 54 41 47 5f 43 45 52 54 5f 49 53 53 55 45 S_TAG_CERT_ISSUE
2ff0: 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e _DATE:....return
3000: 28 22 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 ("GSCIS_TAG_CERT
3010: 5f 49 53 53 55 45 5f 44 41 54 45 22 29 3b 0a 09 _ISSUE_DATE");..
3020: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f .case GSCIS_TAG_
3030: 43 45 52 54 5f 45 58 50 49 52 45 5f 44 41 54 45 CERT_EXPIRE_DATE
3040: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 :....return("GSC
3050: 49 53 5f 54 41 47 5f 43 45 52 54 5f 45 58 50 49 IS_TAG_CERT_EXPI
3060: 52 45 5f 44 41 54 45 22 29 3b 0a 09 7d 0a 0a 09 RE_DATE");..}...
3070: 72 65 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 return("UNKNOWN"
3080: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e );.}..static con
3090: 73 74 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f st char *CACKEY_
30a0: 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 DEBUG_FUNC_SCARD
30b0: 45 52 52 5f 54 4f 5f 53 54 52 28 4c 4f 4e 47 20 ERR_TO_STR(LONG
30c0: 72 65 74 63 6f 64 65 29 20 7b 0a 09 73 77 69 74 retcode) {..swit
30d0: 63 68 20 28 72 65 74 63 6f 64 65 29 20 7b 0a 09 ch (retcode) {..
30e0: 09 63 61 73 65 20 53 43 41 52 44 5f 53 5f 53 55 .case SCARD_S_SU
30f0: 43 43 45 53 53 3a 0a 09 09 09 72 65 74 75 72 6e CCESS:....return
3100: 28 22 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 ("SCARD_S_SUCCES
3110: 53 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 S");...case SCAR
3120: 44 5f 45 5f 43 41 4e 43 45 4c 4c 45 44 3a 0a 09 D_E_CANCELLED:..
3130: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f ..return("SCARD_
3140: 45 5f 43 41 4e 43 45 4c 4c 45 44 22 29 3b 0a 09 E_CANCELLED");..
3150: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 43 41 .case SCARD_E_CA
3160: 4e 54 5f 44 49 53 50 4f 53 45 3a 0a 09 09 09 72 NT_DISPOSE:....r
3170: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 43 eturn("SCARD_E_C
3180: 41 4e 54 5f 44 49 53 50 4f 53 45 22 29 3b 0a 09 ANT_DISPOSE");..
3190: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e .case SCARD_E_IN
31a0: 53 55 46 46 49 43 49 45 4e 54 5f 42 55 46 46 45 SUFFICIENT_BUFFE
31b0: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 R:....return("SC
31c0: 41 52 44 5f 45 5f 49 4e 53 55 46 46 49 43 49 45 ARD_E_INSUFFICIE
31d0: 4e 54 5f 42 55 46 46 45 52 22 29 3b 0a 09 09 63 NT_BUFFER");...c
31e0: 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 ase SCARD_E_INVA
31f0: 4c 49 44 5f 41 54 52 3a 0a 09 09 09 72 65 74 75 LID_ATR:....retu
3200: 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 rn("SCARD_E_INVA
3210: 4c 49 44 5f 41 54 52 22 29 3b 0a 09 09 63 61 73 LID_ATR");...cas
3220: 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 e SCARD_E_INVALI
3230: 44 5f 48 41 4e 44 4c 45 3a 0a 09 09 09 72 65 74 D_HANDLE:....ret
3240: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 urn("SCARD_E_INV
3250: 41 4c 49 44 5f 48 41 4e 44 4c 45 22 29 3b 0a 09 ALID_HANDLE");..
3260: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e .case SCARD_E_IN
3270: 56 41 4c 49 44 5f 50 41 52 41 4d 45 54 45 52 3a VALID_PARAMETER:
3280: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 ....return("SCAR
3290: 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 50 41 52 41 D_E_INVALID_PARA
32a0: 4d 45 54 45 52 22 29 3b 0a 09 09 63 61 73 65 20 METER");...case
32b0: 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f SCARD_E_INVALID_
32c0: 54 41 52 47 45 54 3a 0a 09 09 09 72 65 74 75 72 TARGET:....retur
32d0: 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c n("SCARD_E_INVAL
32e0: 49 44 5f 54 41 52 47 45 54 22 29 3b 0a 09 09 63 ID_TARGET");...c
32f0: 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 ase SCARD_E_INVA
3300: 4c 49 44 5f 56 41 4c 55 45 3a 0a 09 09 09 72 65 LID_VALUE:....re
3310: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e turn("SCARD_E_IN
3320: 56 41 4c 49 44 5f 56 41 4c 55 45 22 29 3b 0a 09 VALID_VALUE");..
3330: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f .case SCARD_E_NO
3340: 5f 4d 45 4d 4f 52 59 3a 0a 09 09 09 72 65 74 75 _MEMORY:....retu
3350: 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 4d rn("SCARD_E_NO_M
3360: 45 4d 4f 52 59 22 29 3b 0a 09 09 63 61 73 65 20 EMORY");...case
3370: 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f SCARD_E_UNKNOWN_
3380: 52 45 41 44 45 52 3a 0a 09 09 09 72 65 74 75 72 READER:....retur
3390: 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f n("SCARD_E_UNKNO
33a0: 57 4e 5f 52 45 41 44 45 52 22 29 3b 0a 09 09 63 WN_READER");...c
33b0: 61 73 65 20 53 43 41 52 44 5f 45 5f 54 49 4d 45 ase SCARD_E_TIME
33c0: 4f 55 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 OUT:....return("
33d0: 53 43 41 52 44 5f 45 5f 54 49 4d 45 4f 55 54 22 SCARD_E_TIMEOUT"
33e0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f );...case SCARD_
33f0: 45 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54 E_SHARING_VIOLAT
3400: 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 ION:....return("
3410: 53 43 41 52 44 5f 45 5f 53 48 41 52 49 4e 47 5f SCARD_E_SHARING_
3420: 56 49 4f 4c 41 54 49 4f 4e 22 29 3b 0a 09 09 63 VIOLATION");...c
3430: 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 ase SCARD_E_NO_S
3440: 4d 41 52 54 43 41 52 44 3a 0a 09 09 09 72 65 74 MARTCARD:....ret
3450: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f urn("SCARD_E_NO_
3460: 53 4d 41 52 54 43 41 52 44 22 29 3b 0a 09 09 63 SMARTCARD");...c
3470: 61 73 65 20 53 43 41 52 44 5f 45 5f 55 4e 4b 4e ase SCARD_E_UNKN
3480: 4f 57 4e 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 OWN_CARD:....ret
3490: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e 4b urn("SCARD_E_UNK
34a0: 4e 4f 57 4e 5f 43 41 52 44 22 29 3b 0a 09 09 63 NOWN_CARD");...c
34b0: 61 73 65 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 ase SCARD_E_PROT
34c0: 4f 5f 4d 49 53 4d 41 54 43 48 3a 0a 09 09 09 72 O_MISMATCH:....r
34d0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 50 eturn("SCARD_E_P
34e0: 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 22 29 3b ROTO_MISMATCH");
34f0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f ...case SCARD_E_
3500: 4e 4f 54 5f 52 45 41 44 59 3a 0a 09 09 09 72 65 NOT_READY:....re
3510: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f turn("SCARD_E_NO
3520: 54 5f 52 45 41 44 59 22 29 3b 0a 09 09 63 61 73 T_READY");...cas
3530: 65 20 53 43 41 52 44 5f 45 5f 53 59 53 54 45 4d e SCARD_E_SYSTEM
3540: 5f 43 41 4e 43 45 4c 4c 45 44 3a 0a 09 09 09 72 _CANCELLED:....r
3550: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 53 eturn("SCARD_E_S
3560: 59 53 54 45 4d 5f 43 41 4e 43 45 4c 4c 45 44 22 YSTEM_CANCELLED"
3570: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f );...case SCARD_
3580: 45 5f 4e 4f 54 5f 54 52 41 4e 53 41 43 54 45 44 E_NOT_TRANSACTED
3590: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 :....return("SCA
35a0: 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41 43 RD_E_NOT_TRANSAC
35b0: 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 TED");...case SC
35c0: 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 41 ARD_E_READER_UNA
35d0: 56 41 49 4c 41 42 4c 45 3a 0a 09 09 09 72 65 74 VAILABLE:....ret
35e0: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 52 45 41 urn("SCARD_E_REA
35f0: 44 45 52 5f 55 4e 41 56 41 49 4c 41 42 4c 45 22 DER_UNAVAILABLE"
3600: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f );...case SCARD_
3610: 57 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f 43 41 W_UNSUPPORTED_CA
3620: 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 RD:....return("S
3630: 43 41 52 44 5f 57 5f 55 4e 53 55 50 50 4f 52 54 CARD_W_UNSUPPORT
3640: 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 ED_CARD");...cas
3650: 65 20 53 43 41 52 44 5f 57 5f 55 4e 52 45 53 50 e SCARD_W_UNRESP
3660: 4f 4e 53 49 56 45 5f 43 41 52 44 3a 0a 09 09 09 ONSIVE_CARD:....
3670: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f return("SCARD_W_
3680: 55 4e 52 45 53 50 4f 4e 53 49 56 45 5f 43 41 52 UNRESPONSIVE_CAR
3690: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 D");...case SCAR
36a0: 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41 D_W_UNPOWERED_CA
36b0: 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 RD:....return("S
36c0: 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44 CARD_W_UNPOWERED
36d0: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 _CARD");...case
36e0: 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 SCARD_W_RESET_CA
36f0: 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 RD:....return("S
3700: 43 41 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52 CARD_W_RESET_CAR
3710: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 D");...case SCAR
3720: 44 5f 57 5f 52 45 4d 4f 56 45 44 5f 43 41 52 44 D_W_REMOVED_CARD
3730: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 :....return("SCA
3740: 52 44 5f 57 5f 52 45 4d 4f 56 45 44 5f 43 41 52 RD_W_REMOVED_CAR
3750: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 D");...case SCAR
3760: 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f 53 4d 41 4c D_E_PCI_TOO_SMAL
3770: 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 L:....return("SC
3780: 41 52 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f 53 4d ARD_E_PCI_TOO_SM
3790: 41 4c 4c 22 29 3b 0a 09 09 63 61 73 65 20 53 43 ALL");...case SC
37a0: 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 53 ARD_E_READER_UNS
37b0: 55 50 50 4f 52 54 45 44 3a 0a 09 09 09 72 65 74 UPPORTED:....ret
37c0: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 52 45 41 urn("SCARD_E_REA
37d0: 44 45 52 5f 55 4e 53 55 50 50 4f 52 54 45 44 22 DER_UNSUPPORTED"
37e0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f );...case SCARD_
37f0: 45 5f 44 55 50 4c 49 43 41 54 45 5f 52 45 41 44 E_DUPLICATE_READ
3800: 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 ER:....return("S
3810: 43 41 52 44 5f 45 5f 44 55 50 4c 49 43 41 54 45 CARD_E_DUPLICATE
3820: 5f 52 45 41 44 45 52 22 29 3b 0a 09 09 63 61 73 _READER");...cas
3830: 65 20 53 43 41 52 44 5f 45 5f 43 41 52 44 5f 55 e SCARD_E_CARD_U
3840: 4e 53 55 50 50 4f 52 54 45 44 3a 0a 09 09 09 72 NSUPPORTED:....r
3850: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 43 eturn("SCARD_E_C
3860: 41 52 44 5f 55 4e 53 55 50 50 4f 52 54 45 44 22 ARD_UNSUPPORTED"
3870: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f );...case SCARD_
3880: 45 5f 4e 4f 5f 53 45 52 56 49 43 45 3a 0a 09 09 E_NO_SERVICE:...
3890: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 .return("SCARD_E
38a0: 5f 4e 4f 5f 53 45 52 56 49 43 45 22 29 3b 0a 09 _NO_SERVICE");..
38b0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 53 45 .case SCARD_E_SE
38c0: 52 56 49 43 45 5f 53 54 4f 50 50 45 44 3a 0a 09 RVICE_STOPPED:..
38d0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f ..return("SCARD_
38e0: 45 5f 53 45 52 56 49 43 45 5f 53 54 4f 50 50 45 E_SERVICE_STOPPE
38f0: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 D");...case SCAR
3900: 44 5f 45 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f D_E_UNSUPPORTED_
3910: 46 45 41 54 55 52 45 3a 0a 09 09 09 72 65 74 75 FEATURE:....retu
3920: 72 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e 53 55 rn("SCARD_E_UNSU
3930: 50 50 4f 52 54 45 44 5f 46 45 41 54 55 52 45 22 PPORTED_FEATURE"
3940: 29 3b 0a 23 69 66 64 65 66 20 53 43 41 52 44 5f );.#ifdef SCARD_
3950: 57 5f 49 4e 53 45 52 54 45 44 5f 43 41 52 44 0a W_INSERTED_CARD.
3960: 09 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f 49 ..case SCARD_W_I
3970: 4e 53 45 52 54 45 44 5f 43 41 52 44 3a 0a 09 09 NSERTED_CARD:...
3980: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57 .return("SCARD_W
3990: 5f 49 4e 53 45 52 54 45 44 5f 43 41 52 44 22 29 _INSERTED_CARD")
39a0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 ;.#endif.#ifdef
39b0: 53 43 41 52 44 5f 45 5f 4e 4f 5f 52 45 41 44 45 SCARD_E_NO_READE
39c0: 52 53 5f 41 56 41 49 4c 41 42 4c 45 0a 09 09 63 RS_AVAILABLE...c
39d0: 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 52 ase SCARD_E_NO_R
39e0: 45 41 44 45 52 53 5f 41 56 41 49 4c 41 42 4c 45 EADERS_AVAILABLE
39f0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 :....return("SCA
3a00: 52 44 5f 45 5f 4e 4f 5f 52 45 41 44 45 52 53 5f RD_E_NO_READERS_
3a10: 41 56 41 49 4c 41 42 4c 45 22 29 3b 0a 23 65 6e AVAILABLE");.#en
3a20: 64 69 66 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 dif..}...return(
3a30: 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 "UNKNOWN");.}..s
3a40: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 tatic const char
3a50: 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 *CACKEY_DEBUG_F
3a60: 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 UNC_OBJID_TO_STR
3a70: 28 75 69 6e 74 31 36 5f 74 20 6f 62 6a 69 64 29 (uint16_t objid)
3a80: 20 7b 0a 09 73 77 69 74 63 68 20 28 6f 62 6a 69 {..switch (obji
3a90: 64 29 20 7b 0a 09 09 63 61 73 65 20 30 78 32 30 d) {...case 0x20
3aa0: 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 00:....return("C
3ab0: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f ACKEY_TLV_OBJID_
3ac0: 47 45 4e 45 52 41 4c 49 4e 46 4f 22 29 3b 0a 09 GENERALINFO");..
3ad0: 09 63 61 73 65 20 30 78 32 31 30 30 3a 0a 09 09 .case 0x2100:...
3ae0: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f .return("CACKEY_
3af0: 54 4c 56 5f 4f 42 4a 49 44 5f 50 52 4f 50 45 52 TLV_OBJID_PROPER
3b00: 53 4f 4e 41 4c 49 4e 46 4f 22 29 3b 0a 09 09 63 SONALINFO");...c
3b10: 61 73 65 20 30 78 33 30 30 30 3a 0a 09 09 09 72 ase 0x3000:....r
3b20: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c eturn("CACKEY_TL
3b30: 56 5f 4f 42 4a 49 44 5f 41 43 43 45 53 53 43 4f V_OBJID_ACCESSCO
3b40: 4e 54 52 4f 4c 22 29 3b 0a 09 09 63 61 73 65 20 NTROL");...case
3b50: 30 78 34 30 30 30 3a 0a 09 09 09 72 65 74 75 72 0x4000:....retur
3b60: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 n("CACKEY_TLV_OB
3b70: 4a 49 44 5f 4c 4f 47 49 4e 22 29 3b 0a 09 09 63 JID_LOGIN");...c
3b80: 61 73 65 20 30 78 35 30 30 30 3a 0a 09 09 09 72 ase 0x5000:....r
3b90: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c eturn("CACKEY_TL
3ba0: 56 5f 4f 42 4a 49 44 5f 43 41 52 44 49 4e 46 4f V_OBJID_CARDINFO
3bb0: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 36 30 30 ");...case 0x600
3bc0: 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 0:....return("CA
3bd0: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 42 CKEY_TLV_OBJID_B
3be0: 49 4f 4d 45 54 52 49 43 53 22 29 3b 0a 09 09 63 IOMETRICS");...c
3bf0: 61 73 65 20 30 78 37 30 30 30 3a 0a 09 09 09 72 ase 0x7000:....r
3c00: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c eturn("CACKEY_TL
3c10: 56 5f 4f 42 4a 49 44 5f 44 49 47 49 54 41 4c 53 V_OBJID_DIGITALS
3c20: 49 47 43 45 52 54 22 29 3b 0a 09 09 63 61 73 65 IGCERT");...case
3c30: 20 30 78 30 32 30 30 3a 0a 09 09 09 72 65 74 75 0x0200:....retu
3c40: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f rn("CACKEY_TLV_O
3c50: 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e 22 BJID_CAC_PERSON"
3c60: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32 30 32 );...case 0x0202
3c70: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 :....return("CAC
3c80: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 KEY_TLV_OBJID_CA
3c90: 43 5f 42 45 4e 45 46 49 54 53 22 29 3b 0a 09 09 C_BENEFITS");...
3ca0: 63 61 73 65 20 30 78 30 32 30 33 3a 0a 09 09 09 case 0x0203:....
3cb0: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 return("CACKEY_T
3cc0: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f 54 48 LV_OBJID_CAC_OTH
3cd0: 45 52 42 45 4e 45 46 49 54 53 22 29 3b 0a 09 09 ERBENEFITS");...
3ce0: 63 61 73 65 20 30 78 30 32 30 31 3a 0a 09 09 09 case 0x0201:....
3cf0: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 return("CACKEY_T
3d00: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 LV_OBJID_CAC_PER
3d10: 53 4f 4e 4e 45 4c 22 29 3b 0a 09 09 63 61 73 65 SONNEL");...case
3d20: 20 30 78 30 32 46 45 3a 0a 09 09 09 72 65 74 75 0x02FE:....retu
3d30: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f rn("CACKEY_TLV_O
3d40: 42 4a 49 44 5f 43 41 43 5f 50 4b 49 43 45 52 54 BJID_CAC_PKICERT
3d50: 22 29 3b 0a 09 7d 0a 09 0a 09 72 65 74 75 72 6e ");..}....return
3d60: 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a ("UNKNOWN");.}..
3d70: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 static const cha
3d80: 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f r *CACKEY_DEBUG_
3d90: 46 55 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f FUNC_APPTYPE_TO_
3da0: 53 54 52 28 75 69 6e 74 38 5f 74 20 61 70 70 74 STR(uint8_t appt
3db0: 79 70 65 29 20 7b 0a 09 73 77 69 74 63 68 20 28 ype) {..switch (
3dc0: 61 70 70 74 79 70 65 29 20 7b 0a 09 09 63 61 73 apptype) {...cas
3dd0: 65 20 30 78 30 30 3a 0a 09 09 09 72 65 74 75 72 e 0x00:....retur
3de0: 6e 28 22 4e 4f 4e 45 22 29 3b 0a 09 09 63 61 73 n("NONE");...cas
3df0: 65 20 30 78 30 31 3a 0a 09 09 09 72 65 74 75 72 e 0x01:....retur
3e00: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 n("CACKEY_TLV_AP
3e10: 50 5f 47 45 4e 45 52 49 43 22 29 3b 0a 09 09 63 P_GENERIC");...c
3e20: 61 73 65 20 30 78 30 32 3a 0a 09 09 09 72 65 74 ase 0x02:....ret
3e30: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f urn("CACKEY_TLV_
3e40: 41 50 50 5f 53 4b 49 22 29 3b 0a 09 09 63 61 73 APP_SKI");...cas
3e50: 65 20 30 78 30 33 3a 0a 09 09 09 72 65 74 75 72 e 0x03:....retur
3e60: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 n("CACKEY_TLV_AP
3e70: 50 5f 47 45 4e 45 52 49 43 20 7c 20 43 41 43 4b P_GENERIC | CACK
3e80: 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 22 29 EY_TLV_APP_SKI")
3e90: 3b 0a 09 09 63 61 73 65 20 30 78 30 34 3a 0a 09 ;...case 0x04:..
3ea0: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 ..return("CACKEY
3eb0: 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a _TLV_APP_PKI");.
3ec0: 09 09 63 61 73 65 20 30 78 30 35 3a 0a 09 09 09 ..case 0x05:....
3ed0: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 return("CACKEY_T
3ee0: 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 7c LV_APP_GENERIC |
3ef0: 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f CACKEY_TLV_APP_
3f00: 50 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78 PKI");...case 0x
3f10: 30 36 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 06:....return("C
3f20: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b ACKEY_TLV_APP_SK
3f30: 49 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 I | CACKEY_TLV_A
3f40: 50 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61 73 65 PP_PKI");...case
3f50: 20 30 78 30 37 3a 0a 09 09 09 72 65 74 75 72 6e 0x07:....return
3f60: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 ("CACKEY_TLV_APP
3f70: 5f 47 45 4e 45 52 49 43 20 7c 20 43 41 43 4b 45 _GENERIC | CACKE
3f80: 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 20 7c 20 Y_TLV_APP_SKI |
3f90: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 CACKEY_TLV_APP_P
3fa0: 4b 49 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 KI");..}...retur
3fb0: 6e 28 22 49 4e 56 41 4c 49 44 22 29 3b 0a 7d 0a n("INVALID");.}.
3fc0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 .static const ch
3fd0: 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 ar *CACKEY_DEBUG
3fe0: 5f 46 55 4e 43 5f 41 54 54 52 49 42 55 54 45 5f _FUNC_ATTRIBUTE_
3ff0: 54 4f 5f 53 54 52 28 43 4b 5f 41 54 54 52 49 42 TO_STR(CK_ATTRIB
4000: 55 54 45 5f 54 59 50 45 20 61 74 74 72 29 20 7b UTE_TYPE attr) {
4010: 0a 09 73 77 69 74 63 68 20 28 61 74 74 72 29 20 ..switch (attr)
4020: 7b 0a 09 09 63 61 73 65 20 43 4b 41 5f 43 4c 41 {...case CKA_CLA
4030: 53 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 SS:....return("C
4040: 4b 41 5f 43 4c 41 53 53 22 29 3b 0a 09 09 63 61 KA_CLASS");...ca
4050: 73 65 20 43 4b 41 5f 54 4f 4b 45 4e 3a 0a 09 09 se CKA_TOKEN:...
4060: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 54 4f 4b .return("CKA_TOK
4070: 45 4e 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 EN");...case CKA
4080: 5f 50 52 49 56 41 54 45 3a 0a 09 09 09 72 65 74 _PRIVATE:....ret
4090: 75 72 6e 28 22 43 4b 41 5f 50 52 49 56 41 54 45 urn("CKA_PRIVATE
40a0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4c ");...case CKA_L
40b0: 41 42 45 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 ABEL:....return(
40c0: 22 43 4b 41 5f 4c 41 42 45 4c 22 29 3b 0a 09 09 "CKA_LABEL");...
40d0: 63 61 73 65 20 43 4b 41 5f 41 50 50 4c 49 43 41 case CKA_APPLICA
40e0: 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 TION:....return(
40f0: 22 43 4b 41 5f 41 50 50 4c 49 43 41 54 49 4f 4e "CKA_APPLICATION
4100: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56 ");...case CKA_V
4110: 41 4c 55 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 ALUE:....return(
4120: 22 43 4b 41 5f 56 41 4c 55 45 22 29 3b 0a 09 09 "CKA_VALUE");...
4130: 63 61 73 65 20 43 4b 41 5f 4f 42 4a 45 43 54 5f case CKA_OBJECT_
4140: 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 ID:....return("C
4150: 4b 41 5f 4f 42 4a 45 43 54 5f 49 44 22 29 3b 0a KA_OBJECT_ID");.
4160: 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52 54 49 ..case CKA_CERTI
4170: 46 49 43 41 54 45 5f 54 59 50 45 3a 0a 09 09 09 FICATE_TYPE:....
4180: 72 65 74 75 72 6e 28 22 43 4b 41 5f 43 45 52 54 return("CKA_CERT
4190: 49 46 49 43 41 54 45 5f 54 59 50 45 22 29 3b 0a IFICATE_TYPE");.
41a0: 09 09 63 61 73 65 20 43 4b 41 5f 49 53 53 55 45 ..case CKA_ISSUE
41b0: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b R:....return("CK
41c0: 41 5f 49 53 53 55 45 52 22 29 3b 0a 09 09 63 61 A_ISSUER");...ca
41d0: 73 65 20 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 se CKA_SERIAL_NU
41e0: 4d 42 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 MBER:....return(
41f0: 22 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42 "CKA_SERIAL_NUMB
4200: 45 52 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 ER");...case CKA
4210: 5f 41 43 5f 49 53 53 55 45 52 3a 0a 09 09 09 72 _AC_ISSUER:....r
4220: 65 74 75 72 6e 28 22 43 4b 41 5f 41 43 5f 49 53 eturn("CKA_AC_IS
4230: 53 55 45 52 22 29 3b 0a 09 09 63 61 73 65 20 43 SUER");...case C
4240: 4b 41 5f 4f 57 4e 45 52 3a 0a 09 09 09 72 65 74 KA_OWNER:....ret
4250: 75 72 6e 28 22 43 4b 41 5f 4f 57 4e 45 52 22 29 urn("CKA_OWNER")
4260: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 41 54 54 ;...case CKA_ATT
4270: 52 5f 54 59 50 45 53 3a 0a 09 09 09 72 65 74 75 R_TYPES:....retu
4280: 72 6e 28 22 43 4b 41 5f 41 54 54 52 5f 54 59 50 rn("CKA_ATTR_TYP
4290: 45 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 ES");...case CKA
42a0: 5f 54 52 55 53 54 45 44 3a 0a 09 09 09 72 65 74 _TRUSTED:....ret
42b0: 75 72 6e 28 22 43 4b 41 5f 54 52 55 53 54 45 44 urn("CKA_TRUSTED
42c0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4b ");...case CKA_K
42d0: 45 59 5f 54 59 50 45 3a 0a 09 09 09 72 65 74 75 EY_TYPE:....retu
42e0: 72 6e 28 22 43 4b 41 5f 4b 45 59 5f 54 59 50 45 rn("CKA_KEY_TYPE
42f0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53 ");...case CKA_S
4300: 55 42 4a 45 43 54 3a 0a 09 09 09 72 65 74 75 72 UBJECT:....retur
4310: 6e 28 22 43 4b 41 5f 53 55 42 4a 45 43 54 22 29 n("CKA_SUBJECT")
4320: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 49 44 3a ;...case CKA_ID:
4330: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f ....return("CKA_
4340: 49 44 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 ID");...case CKA
4350: 5f 53 45 4e 53 49 54 49 56 45 3a 0a 09 09 09 72 _SENSITIVE:....r
4360: 65 74 75 72 6e 28 22 43 4b 41 5f 53 45 4e 53 49 eturn("CKA_SENSI
4370: 54 49 56 45 22 29 3b 0a 09 09 63 61 73 65 20 43 TIVE");...case C
4380: 4b 41 5f 45 4e 43 52 59 50 54 3a 0a 09 09 09 72 KA_ENCRYPT:....r
4390: 65 74 75 72 6e 28 22 43 4b 41 5f 45 4e 43 52 59 eturn("CKA_ENCRY
43a0: 50 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 PT");...case CKA
43b0: 5f 44 45 43 52 59 50 54 3a 0a 09 09 09 72 65 74 _DECRYPT:....ret
43c0: 75 72 6e 28 22 43 4b 41 5f 44 45 43 52 59 50 54 urn("CKA_DECRYPT
43d0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 57 ");...case CKA_W
43e0: 52 41 50 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 RAP:....return("
43f0: 43 4b 41 5f 57 52 41 50 22 29 3b 0a 09 09 63 61 CKA_WRAP");...ca
4400: 73 65 20 43 4b 41 5f 55 4e 57 52 41 50 3a 0a 09 se CKA_UNWRAP:..
4410: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 55 4e ..return("CKA_UN
4420: 57 52 41 50 22 29 3b 0a 09 09 63 61 73 65 20 43 WRAP");...case C
4430: 4b 41 5f 53 49 47 4e 3a 0a 09 09 09 72 65 74 75 KA_SIGN:....retu
4440: 72 6e 28 22 43 4b 41 5f 53 49 47 4e 22 29 3b 0a rn("CKA_SIGN");.
4450: 09 09 63 61 73 65 20 43 4b 41 5f 53 49 47 4e 5f ..case CKA_SIGN_
4460: 52 45 43 4f 56 45 52 3a 0a 09 09 09 72 65 74 75 RECOVER:....retu
4470: 72 6e 28 22 43 4b 41 5f 53 49 47 4e 5f 52 45 43 rn("CKA_SIGN_REC
4480: 4f 56 45 52 22 29 3b 0a 09 09 63 61 73 65 20 43 OVER");...case C
4490: 4b 41 5f 56 45 52 49 46 59 3a 0a 09 09 09 72 65 KA_VERIFY:....re
44a0: 74 75 72 6e 28 22 43 4b 41 5f 56 45 52 49 46 59 turn("CKA_VERIFY
44b0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56 ");...case CKA_V
44c0: 45 52 49 46 59 5f 52 45 43 4f 56 45 52 3a 0a 09 ERIFY_RECOVER:..
44d0: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 56 45 ..return("CKA_VE
44e0: 52 49 46 59 5f 52 45 43 4f 56 45 52 22 29 3b 0a RIFY_RECOVER");.
44f0: 09 09 63 61 73 65 20 43 4b 41 5f 44 45 52 49 56 ..case CKA_DERIV
4500: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b E:....return("CK
4510: 41 5f 44 45 52 49 56 45 22 29 3b 0a 09 09 63 61 A_DERIVE");...ca
4520: 73 65 20 43 4b 41 5f 53 54 41 52 54 5f 44 41 54 se CKA_START_DAT
4530: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b E:....return("CK
4540: 41 5f 53 54 41 52 54 5f 44 41 54 45 22 29 3b 0a A_START_DATE");.
4550: 09 09 63 61 73 65 20 43 4b 41 5f 45 4e 44 5f 44 ..case CKA_END_D
4560: 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 ATE:....return("
4570: 43 4b 41 5f 45 4e 44 5f 44 41 54 45 22 29 3b 0a CKA_END_DATE");.
4580: 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55 4c ..case CKA_MODUL
4590: 55 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 US:....return("C
45a0: 4b 41 5f 4d 4f 44 55 4c 55 53 22 29 3b 0a 09 09 KA_MODULUS");...
45b0: 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 case CKA_MODULUS
45c0: 5f 42 49 54 53 3a 0a 09 09 09 72 65 74 75 72 6e _BITS:....return
45d0: 28 22 43 4b 41 5f 4d 4f 44 55 4c 55 53 5f 42 49 ("CKA_MODULUS_BI
45e0: 54 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 TS");...case CKA
45f0: 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45 4e 54 _PUBLIC_EXPONENT
4600: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 :....return("CKA
4610: 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45 4e 54 _PUBLIC_EXPONENT
4620: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 ");...case CKA_P
4630: 52 49 56 41 54 45 5f 45 58 50 4f 4e 45 4e 54 3a RIVATE_EXPONENT:
4640: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f ....return("CKA_
4650: 50 52 49 56 41 54 45 5f 45 58 50 4f 4e 45 4e 54 PRIVATE_EXPONENT
4660: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 ");...case CKA_P
4670: 52 49 4d 45 5f 31 3a 0a 09 09 09 72 65 74 75 72 RIME_1:....retur
4680: 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f 31 22 29 n("CKA_PRIME_1")
4690: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49 ;...case CKA_PRI
46a0: 4d 45 5f 32 3a 0a 09 09 09 72 65 74 75 72 6e 28 ME_2:....return(
46b0: 22 43 4b 41 5f 50 52 49 4d 45 5f 32 22 29 3b 0a "CKA_PRIME_2");.
46c0: 09 09 63 61 73 65 20 43 4b 41 5f 45 58 50 4f 4e ..case CKA_EXPON
46d0: 45 4e 54 5f 31 3a 0a 09 09 09 72 65 74 75 72 6e ENT_1:....return
46e0: 28 22 43 4b 41 5f 45 58 50 4f 4e 45 4e 54 5f 31 ("CKA_EXPONENT_1
46f0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 ");...case CKA_E
4700: 58 50 4f 4e 45 4e 54 5f 32 3a 0a 09 09 09 72 65 XPONENT_2:....re
4710: 74 75 72 6e 28 22 43 4b 41 5f 45 58 50 4f 4e 45 turn("CKA_EXPONE
4720: 4e 54 5f 32 22 29 3b 0a 09 09 63 61 73 65 20 43 NT_2");...case C
4730: 4b 41 5f 43 4f 45 46 46 49 43 49 45 4e 54 3a 0a KA_COEFFICIENT:.
4740: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 43 ...return("CKA_C
4750: 4f 45 46 46 49 43 49 45 4e 54 22 29 3b 0a 09 09 OEFFICIENT");...
4760: 63 61 73 65 20 43 4b 41 5f 50 52 49 4d 45 3a 0a case CKA_PRIME:.
4770: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 50 ...return("CKA_P
4780: 52 49 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 43 RIME");...case C
4790: 4b 41 5f 53 55 42 50 52 49 4d 45 3a 0a 09 09 09 KA_SUBPRIME:....
47a0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 55 42 50 return("CKA_SUBP
47b0: 52 49 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 43 RIME");...case C
47c0: 4b 41 5f 42 41 53 45 3a 0a 09 09 09 72 65 74 75 KA_BASE:....retu
47d0: 72 6e 28 22 43 4b 41 5f 42 41 53 45 22 29 3b 0a rn("CKA_BASE");.
47e0: 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49 4d 45 ..case CKA_PRIME
47f0: 5f 42 49 54 53 3a 0a 09 09 09 72 65 74 75 72 6e _BITS:....return
4800: 28 22 43 4b 41 5f 50 52 49 4d 45 5f 42 49 54 53 ("CKA_PRIME_BITS
4810: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53 ");...case CKA_S
4820: 55 42 5f 50 52 49 4d 45 5f 42 49 54 53 3a 0a 09 UB_PRIME_BITS:..
4830: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 55 ..return("CKA_SU
4840: 42 5f 50 52 49 4d 45 5f 42 49 54 53 22 29 3b 0a B_PRIME_BITS");.
4850: 09 09 63 61 73 65 20 43 4b 41 5f 56 41 4c 55 45 ..case CKA_VALUE
4860: 5f 42 49 54 53 3a 0a 09 09 09 72 65 74 75 72 6e _BITS:....return
4870: 28 22 43 4b 41 5f 56 41 4c 55 45 5f 42 49 54 53 ("CKA_VALUE_BITS
4880: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56 ");...case CKA_V
4890: 41 4c 55 45 5f 4c 45 4e 3a 0a 09 09 09 72 65 74 ALUE_LEN:....ret
48a0: 75 72 6e 28 22 43 4b 41 5f 56 41 4c 55 45 5f 4c urn("CKA_VALUE_L
48b0: 45 4e 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 EN");...case CKA
48c0: 5f 45 58 54 52 41 43 54 41 42 4c 45 3a 0a 09 09 _EXTRACTABLE:...
48d0: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 58 54 .return("CKA_EXT
48e0: 52 41 43 54 41 42 4c 45 22 29 3b 0a 09 09 63 61 RACTABLE");...ca
48f0: 73 65 20 43 4b 41 5f 4c 4f 43 41 4c 3a 0a 09 09 se CKA_LOCAL:...
4900: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4c 4f 43 .return("CKA_LOC
4910: 41 4c 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 AL");...case CKA
4920: 5f 4e 45 56 45 52 5f 45 58 54 52 41 43 54 41 42 _NEVER_EXTRACTAB
4930: 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 LE:....return("C
4940: 4b 41 5f 4e 45 56 45 52 5f 45 58 54 52 41 43 54 KA_NEVER_EXTRACT
4950: 41 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 43 ABLE");...case C
4960: 4b 41 5f 41 4c 57 41 59 53 5f 53 45 4e 53 49 54 KA_ALWAYS_SENSIT
4970: 49 56 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 IVE:....return("
4980: 43 4b 41 5f 41 4c 57 41 59 53 5f 53 45 4e 53 49 CKA_ALWAYS_SENSI
4990: 54 49 56 45 22 29 3b 0a 09 09 63 61 73 65 20 43 TIVE");...case C
49a0: 4b 41 5f 4b 45 59 5f 47 45 4e 5f 4d 45 43 48 41 KA_KEY_GEN_MECHA
49b0: 4e 49 53 4d 3a 0a 09 09 09 72 65 74 75 72 6e 28 NISM:....return(
49c0: 22 43 4b 41 5f 4b 45 59 5f 47 45 4e 5f 4d 45 43 "CKA_KEY_GEN_MEC
49d0: 48 41 4e 49 53 4d 22 29 3b 0a 09 09 63 61 73 65 HANISM");...case
49e0: 20 43 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45 3a CKA_MODIFIABLE:
49f0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f ....return("CKA_
4a00: 4d 4f 44 49 46 49 41 42 4c 45 22 29 3b 0a 09 09 MODIFIABLE");...
4a10: 63 61 73 65 20 43 4b 41 5f 45 43 44 53 41 5f 50 case CKA_ECDSA_P
4a20: 41 52 41 4d 53 3a 0a 09 09 09 72 65 74 75 72 6e ARAMS:....return
4a30: 28 22 43 4b 41 5f 45 43 44 53 41 5f 50 41 52 41 ("CKA_ECDSA_PARA
4a40: 4d 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 MS");...case CKA
4a50: 5f 45 43 5f 50 4f 49 4e 54 3a 0a 09 09 09 72 65 _EC_POINT:....re
4a60: 74 75 72 6e 28 22 43 4b 41 5f 45 43 5f 50 4f 49 turn("CKA_EC_POI
4a70: 4e 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 NT");...case CKA
4a80: 5f 53 45 43 4f 4e 44 41 52 59 5f 41 55 54 48 3a _SECONDARY_AUTH:
4a90: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f ....return("CKA_
4aa0: 53 45 43 4f 4e 44 41 52 59 5f 41 55 54 48 22 29 SECONDARY_AUTH")
4ab0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 41 55 54 ;...case CKA_AUT
4ac0: 48 5f 50 49 4e 5f 46 4c 41 47 53 3a 0a 09 09 09 H_PIN_FLAGS:....
4ad0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 41 55 54 48 return("CKA_AUTH
4ae0: 5f 50 49 4e 5f 46 4c 41 47 53 22 29 3b 0a 09 09 _PIN_FLAGS");...
4af0: 63 61 73 65 20 43 4b 41 5f 48 57 5f 46 45 41 54 case CKA_HW_FEAT
4b00: 55 52 45 5f 54 59 50 45 3a 0a 09 09 09 72 65 74 URE_TYPE:....ret
4b10: 75 72 6e 28 22 43 4b 41 5f 48 57 5f 46 45 41 54 urn("CKA_HW_FEAT
4b20: 55 52 45 5f 54 59 50 45 22 29 3b 0a 09 09 63 61 URE_TYPE");...ca
4b30: 73 65 20 43 4b 41 5f 52 45 53 45 54 5f 4f 4e 5f se CKA_RESET_ON_
4b40: 49 4e 49 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 INIT:....return(
4b50: 22 43 4b 41 5f 52 45 53 45 54 5f 4f 4e 5f 49 4e "CKA_RESET_ON_IN
4b60: 49 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 IT");...case CKA
4b70: 5f 48 41 53 5f 52 45 53 45 54 3a 0a 09 09 09 72 _HAS_RESET:....r
4b80: 65 74 75 72 6e 28 22 43 4b 41 5f 48 41 53 5f 52 eturn("CKA_HAS_R
4b90: 45 53 45 54 22 29 3b 0a 09 09 63 61 73 65 20 43 ESET");...case C
4ba0: 4b 41 5f 56 45 4e 44 4f 52 5f 44 45 46 49 4e 45 KA_VENDOR_DEFINE
4bb0: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b D:....return("CK
4bc0: 41 5f 56 45 4e 44 4f 52 5f 44 45 46 49 4e 45 44 A_VENDOR_DEFINED
4bd0: 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 ");..}...return(
4be0: 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 23 "UNKNOWN");.}..#
4bf0: 20 20 64 65 66 69 6e 65 20 6d 61 6c 6c 6f 63 28 define malloc(
4c00: 78 29 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f x) CACKEY_DEBUG_
4c10: 46 55 4e 43 5f 4d 41 4c 4c 4f 43 28 78 2c 20 5f FUNC_MALLOC(x, _
4c20: 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f _func__, __LINE_
4c30: 5f 29 0a 23 20 20 64 65 66 69 6e 65 20 72 65 61 _).# define rea
4c40: 6c 6c 6f 63 28 78 2c 20 79 29 20 43 41 43 4b 45 lloc(x, y) CACKE
4c50: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 52 45 41 Y_DEBUG_FUNC_REA
4c60: 4c 4c 4f 43 28 78 2c 20 79 2c 20 5f 5f 66 75 6e LLOC(x, y, __fun
4c70: 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 c__, __LINE__).#
4c80: 20 20 69 66 64 65 66 20 73 74 72 64 75 70 0a 23 ifdef strdup.#
4c90: 20 20 20 20 75 6e 64 65 66 20 73 74 72 64 75 70 undef strdup
4ca0: 0a 23 20 20 65 6e 64 69 66 0a 23 20 20 64 65 66 .# endif.# def
4cb0: 69 6e 65 20 73 74 72 64 75 70 28 78 29 20 43 41 ine strdup(x) CA
4cc0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f CKEY_DEBUG_FUNC_
4cd0: 53 54 52 44 55 50 28 78 2c 20 5f 5f 66 75 6e 63 STRDUP(x, __func
4ce0: 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 65 __, __LINE__).#e
4cf0: 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 43 41 lse.# define CA
4d00: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
4d10: 46 28 78 2e 2e 2e 29 20 2f 2a 2a 2f 0a 23 20 20 F(x...) /**/.#
4d20: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 define CACKEY_DE
4d30: 42 55 47 5f 50 52 49 4e 54 42 55 46 28 66 2c 20 BUG_PRINTBUF(f,
4d40: 78 2c 20 79 29 20 2f 2a 2a 2f 0a 23 20 20 64 65 x, y) /**/.# de
4d50: 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 fine CACKEY_DEBU
4d60: 47 5f 50 45 52 52 4f 52 28 78 29 20 2f 2a 2a 2f G_PERROR(x) /**/
4d70: 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 .# define CACKE
4d80: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 Y_DEBUG_FUNC_TAG
4d90: 5f 54 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55 _TO_STR(x) "DEBU
4da0: 47 5f 44 49 53 41 42 4c 45 44 22 0a 23 20 20 64 G_DISABLED".# d
4db0: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 efine CACKEY_DEB
4dc0: 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 UG_FUNC_SCARDERR
4dd0: 5f 54 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55 _TO_STR(x) "DEBU
4de0: 47 5f 44 49 53 41 42 4c 45 44 22 0a 23 20 20 64 G_DISABLED".# d
4df0: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 efine CACKEY_DEB
4e00: 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f UG_FUNC_OBJID_TO
4e10: 5f 53 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 _STR(x) "DEBUG_D
4e20: 49 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69 ISABLED".# defi
4e30: 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ne CACKEY_DEBUG_
4e40: 46 55 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f FUNC_APPTYPE_TO_
4e50: 53 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 STR(x) "DEBUG_DI
4e60: 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e SABLED".# defin
4e70: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 e CACKEY_DEBUG_F
4e80: 55 4e 43 5f 41 54 54 52 49 42 55 54 45 5f 54 4f UNC_ATTRIBUTE_TO
4e90: 5f 53 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 _STR(x) "DEBUG_D
4ea0: 49 53 41 42 4c 45 44 22 0a 23 65 6e 64 69 66 0a ISABLED".#endif.
4eb0: 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 .struct cackey_p
4ec0: 63 73 63 5f 69 64 65 6e 74 69 74 79 20 7b 0a 09 csc_identity {..
4ed0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 70 unsigned char ap
4ee0: 70 6c 65 74 5b 37 5d 3b 0a 09 75 69 6e 74 31 36 plet[7];..uint16
4ef0: 5f 74 20 66 69 6c 65 3b 0a 0a 09 73 69 7a 65 5f _t file;...size_
4f00: 74 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 t certificate_le
4f10: 6e 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 n;..unsigned cha
4f20: 72 20 2a 63 65 72 74 69 66 69 63 61 74 65 3b 0a r *certificate;.
4f30: 0a 09 73 73 69 7a 65 5f 74 20 6b 65 79 73 69 7a ..ssize_t keysiz
4f40: 65 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 e;.};..struct ca
4f50: 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 7b 0a ckey_identity {.
4f60: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 .struct cackey_p
4f70: 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 csc_identity *pc
4f80: 73 63 5f 69 64 65 6e 74 69 74 79 3b 0a 0a 09 43 sc_identity;...C
4f90: 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 61 74 74 K_ATTRIBUTE *att
4fa0: 72 69 62 75 74 65 73 3b 0a 09 43 4b 5f 55 4c 4f ributes;..CK_ULO
4fb0: 4e 47 20 61 74 74 72 69 62 75 74 65 73 5f 63 6f NG attributes_co
4fc0: 75 6e 74 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 unt;.};..struct
4fd0: 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 20 7b cackey_session {
4fe0: 0a 09 69 6e 74 20 61 63 74 69 76 65 3b 0a 0a 09 ..int active;...
4ff0: 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 CK_SLOT_ID slotI
5000: 44 3b 0a 0a 09 43 4b 5f 53 54 41 54 45 20 73 74 D;...CK_STATE st
5010: 61 74 65 3b 0a 09 43 4b 5f 46 4c 41 47 53 20 66 ate;..CK_FLAGS f
5020: 6c 61 67 73 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 lags;..CK_ULONG
5030: 75 6c 44 65 76 69 63 65 45 72 72 6f 72 3b 0a 09 ulDeviceError;..
5040: 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 41 70 70 CK_VOID_PTR pApp
5050: 6c 69 63 61 74 69 6f 6e 3b 0a 09 43 4b 5f 4e 4f lication;..CK_NO
5060: 54 49 46 59 20 4e 6f 74 69 66 79 3b 0a 0a 09 73 TIFY Notify;...s
5070: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 truct cackey_ide
5080: 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65 ntity *identitie
5090: 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e s;..unsigned lon
50a0: 67 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 g identities_cou
50b0: 6e 74 3b 0a 0a 09 69 6e 74 20 73 65 61 72 63 68 nt;...int search
50c0: 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f 41 54 54 _active;..CK_ATT
50d0: 52 49 42 55 54 45 5f 50 54 52 20 73 65 61 72 63 RIBUTE_PTR searc
50e0: 68 5f 71 75 65 72 79 3b 0a 09 43 4b 5f 55 4c 4f h_query;..CK_ULO
50f0: 4e 47 20 73 65 61 72 63 68 5f 71 75 65 72 79 5f NG search_query_
5100: 63 6f 75 6e 74 3b 0a 09 75 6e 73 69 67 6e 65 64 count;..unsigned
5110: 20 6c 6f 6e 67 20 73 65 61 72 63 68 5f 63 75 72 long search_cur
5120: 72 5f 69 64 3b 0a 0a 09 69 6e 74 20 73 69 67 6e r_id;...int sign
5130: 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f 4d 45 43 _active;..CK_MEC
5140: 48 41 4e 49 53 4d 5f 54 59 50 45 20 73 69 67 6e HANISM_TYPE sign
5150: 5f 6d 65 63 68 61 6e 69 73 6d 3b 0a 09 43 4b 5f _mechanism;..CK_
5160: 42 59 54 45 5f 50 54 52 20 73 69 67 6e 5f 62 75 BYTE_PTR sign_bu
5170: 66 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e f;..unsigned lon
5180: 67 20 73 69 67 6e 5f 62 75 66 6c 65 6e 3b 0a 09 g sign_buflen;..
5190: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69 unsigned long si
51a0: 67 6e 5f 62 75 66 75 73 65 64 3b 0a 09 73 74 72 gn_bufused;..str
51b0: 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 uct cackey_ident
51c0: 69 74 79 20 2a 73 69 67 6e 5f 69 64 65 6e 74 69 ity *sign_identi
51d0: 74 79 3b 0a 0a 09 69 6e 74 20 64 65 63 72 79 70 ty;...int decryp
51e0: 74 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f 4d 45 t_active;..CK_ME
51f0: 43 48 41 4e 49 53 4d 5f 54 59 50 45 20 64 65 63 CHANISM_TYPE dec
5200: 72 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d 3b 0a rypt_mechanism;.
5210: 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 64 65 63 .CK_VOID_PTR dec
5220: 72 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d 3b 0a rypt_mech_parm;.
5230: 09 43 4b 5f 55 4c 4f 4e 47 20 64 65 63 72 79 70 .CK_ULONG decryp
5240: 74 5f 6d 65 63 68 5f 70 61 72 6d 6c 65 6e 3b 0a t_mech_parmlen;.
5250: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 .struct cackey_i
5260: 64 65 6e 74 69 74 79 20 2a 64 65 63 72 79 70 74 dentity *decrypt
5270: 5f 69 64 65 6e 74 69 74 79 3b 0a 7d 3b 0a 0a 73 _identity;.};..s
5280: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f truct cackey_slo
5290: 74 20 7b 0a 09 69 6e 74 20 61 63 74 69 76 65 3b t {..int active;
52a0: 0a 09 69 6e 74 20 69 6e 74 65 72 6e 61 6c 3b 0a ..int internal;.
52b0: 0a 09 63 68 61 72 20 2a 70 63 73 63 5f 72 65 61 ..char *pcsc_rea
52c0: 64 65 72 3b 0a 0a 09 69 6e 74 20 70 63 73 63 5f der;...int pcsc_
52d0: 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 3b 0a card_connected;.
52e0: 09 53 43 41 52 44 48 41 4e 44 4c 45 20 70 63 73 .SCARDHANDLE pcs
52f0: 63 5f 63 61 72 64 3b 0a 0a 09 69 6e 74 20 74 72 c_card;...int tr
5300: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 3b ansaction_depth;
5310: 0a 09 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f ..int transactio
5320: 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 3b 0a n_need_hw_lock;.
5330: 0a 09 69 6e 74 20 73 6c 6f 74 5f 72 65 73 65 74 ..int slot_reset
5340: 3b 0a 0a 09 43 4b 5f 46 4c 41 47 53 20 74 6f 6b ;...CK_FLAGS tok
5350: 65 6e 5f 66 6c 61 67 73 3b 0a 0a 09 75 6e 73 69 en_flags;...unsi
5360: 67 6e 65 64 20 63 68 61 72 20 2a 6c 61 62 65 6c gned char *label
5370: 3b 0a 0a 09 44 57 4f 52 44 20 70 72 6f 74 6f 63 ;...DWORD protoc
5380: 6f 6c 3b 0a 0a 09 75 6e 73 69 67 6e 65 64 20 69 ol;...unsigned i
5390: 6e 74 20 63 61 63 68 65 64 5f 63 65 72 74 73 5f nt cached_certs_
53a0: 63 6f 75 6e 74 3b 0a 09 73 74 72 75 63 74 20 63 count;..struct c
53b0: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 ackey_pcsc_ident
53c0: 69 74 79 20 2a 63 61 63 68 65 64 5f 63 65 72 74 ity *cached_cert
53d0: 73 3b 0a 7d 3b 0a 0a 74 79 70 65 64 65 66 20 65 s;.};..typedef e
53e0: 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 54 4c num {..CACKEY_TL
53f0: 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 3d 20 V_APP_GENERIC =
5400: 30 78 30 31 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 0x01,..CACKEY_TL
5410: 56 5f 41 50 50 5f 53 4b 49 20 20 20 20 20 3d 20 V_APP_SKI =
5420: 30 78 30 32 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 0x02,..CACKEY_TL
5430: 56 5f 41 50 50 5f 50 4b 49 20 20 20 20 20 3d 20 V_APP_PKI =
5440: 30 78 30 34 0a 7d 20 63 61 63 6b 65 79 5f 74 6c 0x04.} cackey_tl
5450: 76 5f 61 70 70 74 79 70 65 3b 0a 0a 74 79 70 65 v_apptype;..type
5460: 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b def enum {..CACK
5470: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 47 45 4e EY_TLV_OBJID_GEN
5480: 45 52 41 4c 49 4e 46 4f 20 20 20 20 20 20 20 3d ERALINFO =
5490: 20 30 78 32 30 30 30 2c 0a 09 43 41 43 4b 45 59 0x2000,..CACKEY
54a0: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 50 52 4f 50 45 _TLV_OBJID_PROPE
54b0: 52 53 4f 4e 41 4c 49 4e 46 4f 20 20 20 3d 20 30 RSONALINFO = 0
54c0: 78 32 31 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 x2100,..CACKEY_T
54d0: 4c 56 5f 4f 42 4a 49 44 5f 41 43 43 45 53 53 43 LV_OBJID_ACCESSC
54e0: 4f 4e 54 52 4f 4c 20 20 20 20 20 3d 20 30 78 33 ONTROL = 0x3
54f0: 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 000,..CACKEY_TLV
5500: 5f 4f 42 4a 49 44 5f 4c 4f 47 49 4e 20 20 20 20 _OBJID_LOGIN
5510: 20 20 20 20 20 20 20 20 20 3d 20 30 78 34 30 30 = 0x400
5520: 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 0,..CACKEY_TLV_O
5530: 42 4a 49 44 5f 43 41 52 44 49 4e 46 4f 20 20 20 BJID_CARDINFO
5540: 20 20 20 20 20 20 20 3d 20 30 78 35 30 30 30 2c = 0x5000,
5550: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a ..CACKEY_TLV_OBJ
5560: 49 44 5f 42 49 4f 4d 45 54 52 49 43 53 20 20 20 ID_BIOMETRICS
5570: 20 20 20 20 20 3d 20 30 78 36 30 30 30 2c 0a 09 = 0x6000,..
5580: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 CACKEY_TLV_OBJID
5590: 5f 44 49 47 49 54 41 4c 53 49 47 43 45 52 54 20 _DIGITALSIGCERT
55a0: 20 20 20 3d 20 30 78 37 30 30 30 2c 0a 09 43 41 = 0x7000,..CA
55b0: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 CKEY_TLV_OBJID_C
55c0: 41 43 5f 50 45 52 53 4f 4e 20 20 20 20 20 20 20 AC_PERSON
55d0: 20 3d 20 30 78 30 32 30 30 2c 0a 09 43 41 43 4b = 0x0200,..CACK
55e0: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 EY_TLV_OBJID_CAC
55f0: 5f 42 45 4e 45 46 49 54 53 20 20 20 20 20 20 3d _BENEFITS =
5600: 20 30 78 30 32 30 32 2c 0a 09 43 41 43 4b 45 59 0x0202,..CACKEY
5610: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f _TLV_OBJID_CAC_O
5620: 54 48 45 52 42 45 4e 45 46 49 54 53 20 3d 20 30 THERBENEFITS = 0
5630: 78 30 32 30 33 2c 0a 09 43 41 43 4b 45 59 5f 54 x0203,..CACKEY_T
5640: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 LV_OBJID_CAC_PER
5650: 53 4f 4e 4e 45 4c 20 20 20 20 20 3d 20 30 78 30 SONNEL = 0x0
5660: 32 30 31 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 201,..CACKEY_TLV
5670: 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 4b 49 43 45 _OBJID_CAC_PKICE
5680: 52 54 20 20 20 20 20 20 20 3d 20 30 78 30 32 46 RT = 0x02F
5690: 45 0a 7d 20 63 61 63 6b 65 79 5f 74 6c 76 5f 6f E.} cackey_tlv_o
56a0: 62 6a 65 63 74 69 64 3b 0a 0a 74 79 70 65 64 65 bjectid;..typede
56b0: 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59 f enum {..CACKEY
56c0: 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 _PCSC_S_TOKENPRE
56d0: 53 45 4e 54 20 20 20 20 3d 20 31 2c 0a 09 43 41 SENT = 1,..CA
56e0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 CKEY_PCSC_S_OK
56f0: 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 2c = 0,
5700: 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f ..CACKEY_PCSC_E_
5710: 47 45 4e 45 52 49 43 20 20 20 20 20 20 20 20 20 GENERIC
5720: 3d 20 2d 31 2c 0a 09 43 41 43 4b 45 59 5f 50 43 = -1,..CACKEY_PC
5730: 53 43 5f 45 5f 42 41 44 50 49 4e 20 20 20 20 20 SC_E_BADPIN
5740: 20 20 20 20 20 3d 20 2d 32 2c 0a 09 43 41 43 4b = -2,..CACK
5750: 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 EY_PCSC_E_LOCKED
5760: 20 20 20 20 20 20 20 20 20 20 3d 20 2d 33 2c 0a = -3,.
5770: 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e .CACKEY_PCSC_E_N
5780: 45 45 44 4c 4f 47 49 4e 20 20 20 20 20 20 20 3d EEDLOGIN =
5790: 20 2d 34 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 -4,..CACKEY_PCS
57a0: 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 20 C_E_TOKENABSENT
57b0: 20 20 20 20 3d 20 2d 36 2c 0a 09 43 41 43 4b 45 = -6,..CACKE
57c0: 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 20 20 Y_PCSC_E_RETRY
57d0: 20 20 20 20 20 20 20 20 20 3d 20 2d 37 0a 7d 20 = -7.}
57e0: 63 61 63 6b 65 79 5f 72 65 74 3b 0a 0a 73 74 72 cackey_ret;..str
57f0: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 63 uct cackey_tlv_c
5800: 61 72 64 75 72 6c 20 7b 0a 09 75 6e 73 69 67 6e ardurl {..unsign
5810: 65 64 20 63 68 61 72 20 20 20 20 20 20 20 20 72 ed char r
5820: 69 64 5b 35 5d 3b 0a 09 63 61 63 6b 65 79 5f 74 id[5];..cackey_t
5830: 6c 76 5f 61 70 70 74 79 70 65 20 20 20 61 70 70 lv_apptype app
5840: 74 79 70 65 3b 0a 09 63 61 63 6b 65 79 5f 74 6c type;..cackey_tl
5850: 76 5f 6f 62 6a 65 63 74 69 64 20 20 6f 62 6a 65 v_objectid obje
5860: 63 74 69 64 3b 0a 09 63 61 63 6b 65 79 5f 74 6c ctid;..cackey_tl
5870: 76 5f 6f 62 6a 65 63 74 69 64 20 20 61 70 70 69 v_objectid appi
5880: 64 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 d;..unsigned cha
5890: 72 20 20 20 20 20 20 20 20 70 69 6e 69 64 3b 0a r pinid;.
58a0: 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65 };..struct cacke
58b0: 79 5f 74 6c 76 5f 65 6e 74 69 74 79 3b 0a 73 74 y_tlv_entity;.st
58c0: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f ruct cackey_tlv_
58d0: 65 6e 74 69 74 79 20 7b 0a 09 75 69 6e 74 38 5f entity {..uint8_
58e0: 74 20 74 61 67 3b 0a 09 73 69 7a 65 5f 74 20 6c t tag;..size_t l
58f0: 65 6e 67 74 68 3b 0a 0a 09 75 6e 69 6f 6e 20 7b ength;...union {
5900: 0a 09 09 76 6f 69 64 20 2a 76 61 6c 75 65 3b 0a ...void *value;.
5910: 09 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f ..struct cackey_
5920: 74 6c 76 5f 63 61 72 64 75 72 6c 20 2a 76 61 6c tlv_cardurl *val
5930: 75 65 5f 63 61 72 64 75 72 6c 3b 0a 09 09 75 69 ue_cardurl;...ui
5940: 6e 74 38 5f 74 20 76 61 6c 75 65 5f 62 79 74 65 nt8_t value_byte
5950: 3b 0a 09 7d 3b 0a 0a 09 73 74 72 75 63 74 20 63 ;..};...struct c
5960: 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 ackey_tlv_entity
5970: 20 2a 5f 6e 65 78 74 3b 0a 7d 3b 0a 0a 2f 2a 20 *_next;.};../*
5980: 43 41 43 4b 45 59 20 47 6c 6f 62 61 6c 20 48 61 CACKEY Global Ha
5990: 6e 64 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 ndles */.static
59a0: 76 6f 69 64 20 2a 63 61 63 6b 65 79 5f 62 69 67 void *cackey_big
59b0: 6c 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 lock = NULL;.sta
59c0: 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 tic struct cacke
59d0: 79 5f 73 65 73 73 69 6f 6e 20 63 61 63 6b 65 79 y_session cackey
59e0: 5f 73 65 73 73 69 6f 6e 73 5b 31 32 38 5d 3b 0a _sessions[128];.
59f0: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61 static struct ca
5a00: 63 6b 65 79 5f 73 6c 6f 74 20 63 61 63 6b 65 79 ckey_slot cackey
5a10: 5f 73 6c 6f 74 73 5b 31 32 38 5d 3b 0a 73 74 61 _slots[128];.sta
5a20: 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 69 tic int cackey_i
5a30: 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a nitialized = 0;.
5a40: 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 static int cacke
5a50: 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d y_biglock_init =
5a60: 20 30 3b 0a 43 4b 5f 43 5f 49 4e 49 54 49 41 4c 0;.CK_C_INITIAL
5a70: 49 5a 45 5f 41 52 47 53 20 63 61 63 6b 65 79 5f IZE_ARGS cackey_
5a80: 61 72 67 73 3b 0a 0a 2f 2a 2a 20 45 78 74 72 61 args;../** Extra
5a90: 20 63 65 72 74 69 66 69 63 61 74 65 73 20 74 6f certificates to
5aa0: 20 69 6e 63 6c 75 64 65 20 69 6e 20 74 6f 6b 65 include in toke
5ab0: 6e 20 2a 2a 2f 0a 73 74 72 75 63 74 20 63 61 63 n **/.struct cac
5ac0: 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 key_pcsc_identit
5ad0: 79 20 65 78 74 72 61 5f 63 65 72 74 73 5b 5d 20 y extra_certs[]
5ae0: 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 63 61 = {.#include "ca
5af0: 63 6b 65 79 5f 62 75 69 6c 74 69 6e 5f 63 65 72 ckey_builtin_cer
5b00: 74 73 2e 68 22 0a 7d 3b 0a 0a 2f 2a 20 50 43 53 ts.h".};../* PCS
5b10: 43 20 47 6c 6f 62 61 6c 20 48 61 6e 64 6c 65 73 C Global Handles
5b20: 20 2a 2f 0a 73 74 61 74 69 63 20 4c 50 53 43 41 */.static LPSCA
5b30: 52 44 43 4f 4e 54 45 58 54 20 63 61 63 6b 65 79 RDCONTEXT cackey
5b40: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e _pcsc_handle = N
5b50: 55 4c 4c 3b 0a 0a 73 74 61 74 69 63 20 75 6e 73 ULL;..static uns
5b60: 69 67 6e 65 64 20 6c 6f 6e 67 20 63 61 63 6b 65 igned long cacke
5b70: 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 76 6f 69 y_getversion(voi
5b80: 64 29 20 7b 0a 09 73 74 61 74 69 63 20 75 6e 73 d) {..static uns
5b90: 69 67 6e 65 64 20 6c 6f 6e 67 20 72 65 74 76 61 igned long retva
5ba0: 6c 20 3d 20 32 35 35 3b 0a 09 75 6e 73 69 67 6e l = 255;..unsign
5bb0: 65 64 20 6c 6f 6e 67 20 6d 61 6a 6f 72 20 3d 20 ed long major =
5bc0: 30 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 0;..unsigned lon
5bd0: 67 20 6d 69 6e 6f 72 20 3d 20 30 3b 0a 09 63 68 g minor = 0;..ch
5be0: 61 72 20 2a 6d 61 6a 6f 72 5f 73 74 72 20 3d 20 ar *major_str =
5bf0: 4e 55 4c 4c 3b 0a 09 63 68 61 72 20 2a 6d 69 6e NULL;..char *min
5c00: 6f 72 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b 0a 0a or_str = NULL;..
5c10: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
5c20: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
5c30: 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20 21 3d ...if (retval !=
5c40: 20 32 35 35 29 20 7b 0a 09 09 43 41 43 4b 45 59 255) {...CACKEY
5c50: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
5c60: 65 74 75 72 6e 69 6e 67 20 30 78 25 6c 78 20 28 eturning 0x%lx (
5c70: 63 61 63 68 65 64 29 2e 22 2c 20 72 65 74 76 61 cached).", retva
5c80: 6c 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 72 65 l);....return(re
5c90: 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65 74 76 tval);..}...retv
5ca0: 61 6c 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 al = 0;..#ifdef
5cb0: 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 0a PACKAGE_VERSION.
5cc0: 20 20 20 20 20 20 20 20 6d 61 6a 6f 72 5f 73 74 major_st
5cd0: 72 20 3d 20 50 41 43 4b 41 47 45 5f 56 45 52 53 r = PACKAGE_VERS
5ce0: 49 4f 4e 3b 0a 09 69 66 20 28 6d 61 6a 6f 72 5f ION;..if (major_
5cf0: 73 74 72 29 20 7b 0a 09 20 20 20 20 20 20 20 20 str) {..
5d00: 6d 61 6a 6f 72 20 3d 20 73 74 72 74 6f 75 6c 28 major = strtoul(
5d10: 6d 61 6a 6f 72 5f 73 74 72 2c 20 26 6d 69 6e 6f major_str, &mino
5d20: 72 5f 73 74 72 2c 20 31 30 29 3b 0a 0a 09 09 69 r_str, 10);....i
5d30: 66 20 28 6d 69 6e 6f 72 5f 73 74 72 29 20 7b 0a f (minor_str) {.
5d40: 09 09 09 6d 69 6e 6f 72 20 3d 20 73 74 72 74 6f ...minor = strto
5d50: 75 6c 28 6d 69 6e 6f 72 5f 73 74 72 20 2b 20 31 ul(minor_str + 1
5d60: 2c 20 4e 55 4c 4c 2c 20 31 30 29 3b 0a 09 09 7d , NULL, 10);...}
5d70: 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20 28 ..}...retval = (
5d80: 6d 61 6a 6f 72 20 3c 3c 20 31 36 29 20 7c 20 28 major << 16) | (
5d90: 6d 69 6e 6f 72 20 3c 3c 20 38 29 3b 0a 23 65 6e minor << 8);.#en
5da0: 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 dif...CACKEY_DEB
5db0: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
5dc0: 6e 69 6e 67 20 30 78 25 6c 78 22 2c 20 72 65 74 ning 0x%lx", ret
5dd0: 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 val);...return(r
5de0: 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 20 50 43 etval);.}../* PC
5df0: 2f 53 43 20 52 65 6c 61 74 65 64 20 46 75 6e 63 /SC Related Func
5e00: 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a 20 53 tions */./*. * S
5e10: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 76 YNPOSIS. * v
5e20: 6f 69 64 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 oid cackey_slots
5e30: 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 _disconnect_all(
5e40: 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 void);. *. * ARG
5e50: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f UMENTS. * No
5e60: 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 ne. *. * RETURN
5e70: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f 6e VALUE. * Non
5e80: 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a e. *. * NOTES. *
5e90: 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 This functi
5ea0: 6f 6e 20 64 69 73 63 6f 6e 6e 65 63 74 73 20 66 on disconnects f
5eb0: 72 6f 6d 20 61 6c 6c 20 63 61 72 64 73 2e 0a 20 rom all cards..
5ec0: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 *. */.static voi
5ed0: 64 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 d cackey_slots_d
5ee0: 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 76 6f isconnect_all(vo
5ef0: 69 64 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20 id) {..uint32_t
5f00: 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 idx;...CACKEY_DE
5f10: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
5f20: 65 64 2e 22 29 3b 0a 0a 09 66 6f 72 20 28 69 64 ed.");...for (id
5f30: 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 x = 0; idx < (si
5f40: 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 zeof(cackey_slot
5f50: 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b s) / sizeof(cack
5f60: 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69 ey_slots[0])); i
5f70: 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 dx++) {...if (ca
5f80: 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e ckey_slots[idx].
5f90: 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 09 2f internal) {..../
5fa0: 2a 20 53 6b 69 70 20 69 6e 74 65 72 6e 61 6c 20 * Skip internal
5fb0: 73 6c 6f 74 73 20 2a 2f 0a 09 09 09 63 6f 6e 74 slots */....cont
5fc0: 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 inue;...}....if
5fd0: 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 (cackey_slots[id
5fe0: 78 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e x].pcsc_card_con
5ff0: 6e 65 63 74 65 64 29 20 7b 0a 09 09 09 43 41 43 nected) {....CAC
6000: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
6010: 28 22 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 ("SCardDisconnec
6020: 74 28 25 6c 75 29 20 63 61 6c 6c 65 64 22 2c 20 t(%lu) called",
6030: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
6040: 69 64 78 29 3b 0a 0a 09 09 09 53 43 61 72 64 44 idx);.....SCardD
6050: 69 73 63 6f 6e 6e 65 63 74 28 63 61 63 6b 65 79 isconnect(cackey
6060: 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 _slots[idx].pcsc
6070: 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 _card, SCARD_LEA
6080: 56 45 5f 43 41 52 44 29 3b 0a 09 09 7d 0a 0a 09 VE_CARD);...}...
6090: 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 .if (cackey_slot
60a0: 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 29 20 7b 0a s[idx].label) {.
60b0: 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 ...free(cackey_s
60c0: 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 29 lots[idx].label)
60d0: 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f ;.....cackey_slo
60e0: 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 20 3d 20 ts[idx].label =
60f0: 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 NULL;...}....cac
6100: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 key_slots[idx].p
6110: 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 csc_card_connect
6120: 65 64 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 ed = 0;...cackey
6130: 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e _slots[idx].tran
6140: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 saction_depth =
6150: 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 0;...cackey_slot
6160: 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63 74 69 s[idx].transacti
6170: 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 on_need_hw_lock
6180: 3d 20 30 3b 0a 0a 09 09 69 66 20 28 63 61 63 6b = 0;....if (cack
6190: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 61 63 ey_slots[idx].ac
61a0: 74 69 76 65 29 20 7b 0a 09 09 09 43 41 43 4b 45 tive) {....CACKE
61b0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
61c0: 4d 61 72 6b 69 6e 67 20 61 63 74 69 76 65 20 73 Marking active s
61d0: 6c 6f 74 20 25 6c 75 20 61 73 20 62 65 69 6e 67 lot %lu as being
61e0: 20 72 65 73 65 74 22 2c 20 28 75 6e 73 69 67 6e reset", (unsign
61f0: 65 64 20 6c 6f 6e 67 29 20 69 64 78 29 3b 0a 09 ed long) idx);..
6200: 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f .}....cackey_slo
6210: 74 73 5b 69 64 78 5d 2e 73 6c 6f 74 5f 72 65 73 ts[idx].slot_res
6220: 65 74 20 3d 20 31 3b 0a 09 7d 0a 0a 09 43 41 43 et = 1;..}...CAC
6230: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
6240: 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a 0a ("Returning");..
6250: 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 .return;.}../*.
6260: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 * SYNPOSIS. *
6270: 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 cackey_ret cac
6280: 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 key_pcsc_connect
6290: 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 (void);. *. * AR
62a0: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e GUMENTS. * N
62b0: 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e one. *. * RETURN
62c0: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 VALUE. * CA
62d0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 CKEY_PCSC_S_OK
62e0: 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 On succes
62f0: 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f s. * CACKEY_
6300: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 PCSC_E_GENERIC
6310: 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a On error. *. *
6320: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 NOTES. * Th
6330: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 6e is function conn
6340: 65 63 74 73 20 74 6f 20 74 68 65 20 50 43 2f 53 ects to the PC/S
6350: 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 4d 61 6e C Connection Man
6360: 61 67 65 72 20 61 6e 64 20 75 70 64 61 74 65 73 ager and updates
6370: 20 74 68 65 0a 20 2a 20 20 20 20 20 67 6c 6f 62 the. * glob
6380: 61 6c 20 68 61 6e 64 6c 65 2e 0a 20 2a 0a 20 2a al handle.. *. *
6390: 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f /.static cackey_
63a0: 72 65 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f ret cackey_pcsc_
63b0: 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 20 7b 0a connect(void) {.
63c0: 09 4c 4f 4e 47 20 73 63 61 72 64 5f 65 73 74 5f .LONG scard_est_
63d0: 63 6f 6e 74 65 78 74 5f 72 65 74 3b 0a 23 69 66 context_ret;.#if
63e0: 64 65 66 20 48 41 56 45 5f 53 43 41 52 44 49 53 def HAVE_SCARDIS
63f0: 56 41 4c 49 44 43 4f 4e 54 45 58 54 0a 09 4c 4f VALIDCONTEXT..LO
6400: 4e 47 20 73 63 61 72 64 5f 69 73 76 61 6c 69 64 NG scard_isvalid
6410: 5f 72 65 74 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 _ret;.#endif...C
6420: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
6430: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
6440: 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63 .if (cackey_pcsc
6450: 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 _handle == NULL)
6460: 20 7b 0a 09 09 63 61 63 6b 65 79 5f 70 63 73 63 {...cackey_pcsc
6470: 5f 68 61 6e 64 6c 65 20 3d 20 6d 61 6c 6c 6f 63 _handle = malloc
6480: 28 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f (sizeof(*cackey_
6490: 70 63 73 63 5f 68 61 6e 64 6c 65 29 29 3b 0a 09 pcsc_handle));..
64a0: 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63 .if (cackey_pcsc
64b0: 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 _handle == NULL)
64c0: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 {....CACKEY_DEB
64d0: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 20 UG_PRINTF("Call
64e0: 74 6f 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c to malloc() fail
64f0: 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e ed, returning in
6500: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 failure");.....
6510: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 cackey_slots_dis
6520: 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a connect_all();..
6530: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 ...return(CACKEY
6540: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 _PCSC_E_GENERIC)
6550: 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f ;...}....CACKEY_
6560: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 DEBUG_PRINTF("SC
6570: 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 ardEstablishCont
6580: 65 78 74 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a ext() called");.
6590: 09 09 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 ..scard_est_cont
65a0: 65 78 74 5f 72 65 74 20 3d 20 53 43 61 72 64 45 ext_ret = SCardE
65b0: 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 stablishContext(
65c0: 53 43 41 52 44 5f 53 43 4f 50 45 5f 53 59 53 54 SCARD_SCOPE_SYST
65d0: 45 4d 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 EM, NULL, NULL,
65e0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 cackey_pcsc_hand
65f0: 6c 65 29 3b 0a 09 09 69 66 20 28 73 63 61 72 64 le);...if (scard
6600: 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 _est_context_ret
6610: 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 != SCARD_S_SUCC
6620: 45 53 53 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 ESS) {....CACKEY
6630: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 _DEBUG_PRINTF("C
6640: 61 6c 6c 20 74 6f 20 53 43 61 72 64 45 73 74 61 all to SCardEsta
6650: 62 6c 69 73 68 43 6f 6e 74 65 78 74 20 66 61 69 blishContext fai
6660: 6c 65 64 20 28 72 65 74 75 72 6e 65 64 20 25 73 led (returned %s
6670: 2f 25 6c 69 29 2c 20 72 65 74 75 72 6e 69 6e 67 /%li), returning
6680: 20 69 6e 20 66 61 69 6c 75 72 65 22 2c 20 43 41 in failure", CA
6690: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f CKEY_DEBUG_FUNC_
66a0: 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 SCARDERR_TO_STR(
66b0: 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 scard_est_contex
66c0: 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 t_ret), (long) s
66d0: 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 card_est_context
66e0: 5f 72 65 74 29 3b 0a 0a 09 09 09 66 72 65 65 28 _ret);.....free(
66f0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 cackey_pcsc_hand
6700: 6c 65 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 70 le);....cackey_p
6710: 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c csc_handle = NUL
6720: 4c 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c L;.....cackey_sl
6730: 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 ots_disconnect_a
6740: 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e ll();.....return
6750: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 (CACKEY_PCSC_E_G
6760: 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 09 7d 0a ENERIC);...}..}.
6770: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 43 41 .#ifdef HAVE_SCA
6780: 52 44 49 53 56 41 4c 49 44 43 4f 4e 54 45 58 54 RDISVALIDCONTEXT
6790: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
67a0: 52 49 4e 54 46 28 22 53 43 61 72 64 49 73 56 61 RINTF("SCardIsVa
67b0: 6c 69 64 43 6f 6e 74 65 78 74 28 29 20 63 61 6c lidContext() cal
67c0: 6c 65 64 22 29 3b 0a 09 73 63 61 72 64 5f 69 73 led");..scard_is
67d0: 76 61 6c 69 64 5f 72 65 74 20 3d 20 53 43 61 72 valid_ret = SCar
67e0: 64 49 73 56 61 6c 69 64 43 6f 6e 74 65 78 74 28 dIsValidContext(
67f0: 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e *cackey_pcsc_han
6800: 64 6c 65 29 3b 0a 09 69 66 20 28 73 63 61 72 64 dle);..if (scard
6810: 5f 69 73 76 61 6c 69 64 5f 72 65 74 20 21 3d 20 _isvalid_ret !=
6820: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 SCARD_S_SUCCESS)
6830: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
6840: 47 5f 50 52 49 4e 54 46 28 22 48 61 6e 64 6c 65 G_PRINTF("Handle
6850: 20 68 61 73 20 62 65 63 6f 6d 65 20 69 6e 76 61 has become inva
6860: 6c 69 64 20 28 53 43 61 72 64 49 73 56 61 6c 69 lid (SCardIsVali
6870: 64 43 6f 6e 74 65 78 74 20 3d 20 25 73 2f 25 6c dContext = %s/%l
6880: 69 29 2c 20 74 72 79 69 6e 67 20 74 6f 20 72 65 i), trying to re
6890: 2d 65 73 74 61 62 6c 69 73 68 2e 2e 2e 22 2c 20 -establish...",
68a0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e CACKEY_DEBUG_FUN
68b0: 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 C_SCARDERR_TO_ST
68c0: 52 28 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f R(scard_isvalid_
68d0: 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 ret), (long) sca
68e0: 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 29 3b rd_isvalid_ret);
68f0: 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
6900: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 45 73 _PRINTF("SCardEs
6910: 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 29 tablishContext()
6920: 20 63 61 6c 6c 65 64 22 29 3b 0a 09 09 73 63 61 called");...sca
6930: 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 rd_est_context_r
6940: 65 74 20 3d 20 53 43 61 72 64 45 73 74 61 62 6c et = SCardEstabl
6950: 69 73 68 43 6f 6e 74 65 78 74 28 53 43 41 52 44 ishContext(SCARD
6960: 5f 53 43 4f 50 45 5f 53 59 53 54 45 4d 2c 20 4e _SCOPE_SYSTEM, N
6970: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 63 61 63 6b 65 ULL, NULL, cacke
6980: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a y_pcsc_handle);.
6990: 09 09 69 66 20 28 73 63 61 72 64 5f 65 73 74 5f ..if (scard_est_
69a0: 63 6f 6e 74 65 78 74 5f 72 65 74 20 21 3d 20 53 context_ret != S
69b0: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 CARD_S_SUCCESS)
69c0: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {....CACKEY_DEBU
69d0: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 20 74 G_PRINTF("Call t
69e0: 6f 20 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 o SCardEstablish
69f0: 43 6f 6e 74 65 78 74 20 66 61 69 6c 65 64 20 28 Context failed (
6a00: 72 65 74 75 72 6e 65 64 20 25 73 2f 25 6c 69 29 returned %s/%li)
6a10: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 , returning in f
6a20: 61 69 6c 75 72 65 22 2c 20 43 41 43 4b 45 59 5f ailure", CACKEY_
6a30: 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 DEBUG_FUNC_SCARD
6a40: 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 ERR_TO_STR(scard
6a50: 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 _est_context_ret
6a60: 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f ), (long) scard_
6a70: 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 est_context_ret)
6a80: 3b 0a 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 ;.....free(cacke
6a90: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a y_pcsc_handle);.
6aa0: 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 ...cackey_pcsc_h
6ab0: 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 andle = NULL;...
6ac0: 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 ..cackey_slots_d
6ad0: 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b isconnect_all();
6ae0: 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b .....return(CACK
6af0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 EY_PCSC_E_GENERI
6b00: 43 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 C);...}....CACKE
6b10: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
6b20: 48 61 6e 64 6c 65 20 68 61 73 20 62 65 65 6e 20 Handle has been
6b30: 72 65 2d 65 73 74 61 62 6c 69 73 68 65 64 22 29 re-established")
6b40: 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 43 41 ;..}.#endif...CA
6b50: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
6b60: 46 28 22 53 75 63 65 73 73 66 75 6c 6c 79 20 63 F("Sucessfully c
6b70: 6f 6e 6e 65 63 74 65 64 20 74 6f 20 50 43 2f 53 onnected to PC/S
6b80: 43 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 C, returning in
6b90: 73 75 63 63 65 73 73 22 29 3b 0a 0a 09 72 65 74 success");...ret
6ba0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f urn(CACKEY_PCSC_
6bb0: 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 S_OK);.}../*. *
6bc0: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 SYNPOSIS. *
6bd0: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 cackey_ret cacke
6be0: 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 y_pcsc_disconnec
6bf0: 74 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 t(void);. *. * A
6c00: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 RGUMENTS. *
6c10: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 None. *. * RETUR
6c20: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 N VALUE. * C
6c30: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 ACKEY_PCSC_S_OK
6c40: 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 On succe
6c50: 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 ss. * CACKEY
6c60: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 _PCSC_E_GENERIC
6c70: 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 On error. *.
6c80: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 * NOTES. * T
6c90: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 69 73 his function dis
6ca0: 63 6f 6e 6e 65 63 74 73 20 66 72 6f 6d 20 74 68 connects from th
6cb0: 65 20 50 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69 e PC/SC Connecti
6cc0: 6f 6e 20 6d 61 6e 61 67 65 72 20 61 6e 64 20 75 on manager and u
6cd0: 70 64 61 74 65 73 0a 20 2a 20 20 20 20 20 74 68 pdates. * th
6ce0: 65 20 67 6c 6f 62 61 6c 20 68 61 6e 64 6c 65 2e e global handle.
6cf0: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 . *. */.static c
6d00: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 ackey_ret cackey
6d10: 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 _pcsc_disconnect
6d20: 28 76 6f 69 64 29 20 7b 0a 09 4c 4f 4e 47 20 73 (void) {..LONG s
6d30: 63 61 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 card_rel_context
6d40: 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 _ret;...CACKEY_D
6d50: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
6d60: 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61 led.");...if (ca
6d70: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 ckey_pcsc_handle
6d80: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 == NULL) {...re
6d90: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 turn(CACKEY_PCSC
6da0: 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 63 61 _S_OK);..}...sca
6db0: 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72 rd_rel_context_r
6dc0: 65 74 20 3d 20 53 43 61 72 64 52 65 6c 65 61 73 et = SCardReleas
6dd0: 65 43 6f 6e 74 65 78 74 28 2a 63 61 63 6b 65 79 eContext(*cackey
6de0: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 0a _pcsc_handle);..
6df0: 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63 .if (cackey_pcsc
6e00: 5f 68 61 6e 64 6c 65 29 20 7b 0a 09 09 66 72 65 _handle) {...fre
6e10: 65 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 e(cackey_pcsc_ha
6e20: 6e 64 6c 65 29 3b 0a 09 0a 09 09 63 61 63 6b 65 ndle);.....cacke
6e30: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 y_pcsc_handle =
6e40: 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 NULL;..}...if (s
6e50: 63 61 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 card_rel_context
6e60: 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f _ret != SCARD_S_
6e70: 53 55 43 43 45 53 53 29 20 7b 0a 09 09 72 65 74 SUCCESS) {...ret
6e80: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f urn(CACKEY_PCSC_
6e90: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a E_GENERIC);..}..
6ea0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 .return(CACKEY_P
6eb0: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a CSC_S_OK);.}../*
6ec0: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 . * SYNPOSIS. *
6ed0: 20 20 20 20 76 6f 69 64 20 63 61 63 6b 65 79 5f void cackey_
6ee0: 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 mark_slot_reset(
6ef0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c struct cackey_sl
6f00: 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a ot *slot);. *. *
6f10: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 ARGUMENTS. *
6f20: 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 None. *. * RET
6f30: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 URN VALUE. *
6f40: 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 None. *. * NOTE
6f50: 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 S. * This fu
6f60: 6e 63 74 69 6f 6e 20 6d 61 72 6b 73 20 61 20 73 nction marks a s
6f70: 6c 6f 74 20 68 61 73 20 68 61 76 69 6e 67 20 62 lot has having b
6f80: 65 65 6e 20 72 65 73 65 74 2c 20 74 6f 20 6c 61 een reset, to la
6f90: 74 65 72 20 62 65 20 63 6c 65 61 6e 65 64 20 75 ter be cleaned u
6fa0: 70 2e 0a 20 2a 20 20 20 20 20 43 6c 65 61 6e 75 p.. * Cleanu
6fb0: 70 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 p only happens w
6fc0: 68 65 6e 20 61 20 50 4b 43 53 23 31 31 20 63 6c hen a PKCS#11 cl
6fd0: 69 65 6e 74 20 63 61 6c 6c 73 20 43 5f 46 69 6e ient calls C_Fin
6fe0: 64 4f 62 6a 65 63 74 73 49 6e 69 74 2e 0a 20 2a dObjectsInit.. *
6ff0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 . */.static void
7000: 20 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f cackey_mark_slo
7010: 74 5f 72 65 73 65 74 28 73 74 72 75 63 74 20 63 t_reset(struct c
7020: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 ackey_slot *slot
7030: 29 20 7b 0a 09 69 66 20 28 73 6c 6f 74 20 3d 3d ) {..if (slot ==
7040: 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 NULL) {...retur
7050: 6e 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 n;..}...CACKEY_D
7060: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
7070: 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 73 6c led.");...if (sl
7080: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f ot->pcsc_card_co
7090: 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09 53 43 61 nnected) {...SCa
70a0: 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f rdDisconnect(slo
70b0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 t->pcsc_card, SC
70c0: 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b ARD_LEAVE_CARD);
70d0: 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 73 6c 6f 74 ..}...slot->slot
70e0: 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 73 6c 6f _reset = 1;..slo
70f0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e t->pcsc_card_con
7100: 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09 73 6c 6f nected = 0;..slo
7110: 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d t->token_flags =
7120: 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 CKF_LOGIN_REQUI
7130: 52 45 44 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 RED;...CACKEY_DE
7140: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
7150: 72 6e 69 6e 67 2e 22 29 3b 0a 0a 09 72 65 74 75 rning.");...retu
7160: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e rn;.}../*. * SYN
7170: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 4c 4f 4e POSIS. * LON
7180: 47 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 G cackey_reconne
7190: 63 74 5f 63 61 72 64 28 73 74 72 75 63 74 20 63 ct_card(struct c
71a0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 ackey_slot *slot
71b0: 2c 20 44 57 4f 52 44 20 64 65 66 61 75 6c 74 5f , DWORD default_
71c0: 70 72 6f 74 6f 63 6f 6c 2c 20 4c 50 44 57 4f 52 protocol, LPDWOR
71d0: 44 20 73 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f D selected_proto
71e0: 63 6f 6c 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 col);. *. * ARGU
71f0: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63 MENTS. * cac
7200: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 key_slot *slot.
7210: 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 * Slot t
7220: 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 o send commands
7230: 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 44 57 4f to. *. * DWO
7240: 52 44 20 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f RD default_proto
7250: 63 6f 6c 0a 20 2a 20 20 20 20 20 20 20 20 20 50 col. * P
7260: 72 6f 74 6f 63 6f 6c 20 74 6f 20 61 74 74 65 6d rotocol to attem
7270: 70 74 20 66 69 72 73 74 0a 20 2a 0a 20 2a 20 20 pt first. *. *
7280: 20 20 20 4c 50 44 57 4f 52 44 20 73 65 6c 65 63 LPDWORD selec
7290: 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 0a 20 2a 20 ted_protocol. *
72a0: 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 50 72 [OUT] Pr
72b0: 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 0a otocol selected.
72c0: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c *. * RETURN VAL
72d0: 55 45 0a 20 2a 20 20 20 20 20 54 68 65 20 72 65 UE. * The re
72e0: 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 turn value from
72f0: 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 SCardReconnect()
7300: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 . *. * NOTES. *
7310: 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f This functio
7320: 6e 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61 n is a wrapper a
7330: 72 6f 75 6e 64 20 53 43 61 72 64 52 65 63 6f 6e round SCardRecon
7340: 6e 65 63 74 28 29 0a 20 2a 0a 20 2a 20 20 20 20 nect(). *. *
7350: 20 54 68 65 20 53 43 61 72 64 52 65 63 6f 6e 6e The SCardReconn
7360: 65 63 74 28 29 20 66 75 6e 63 74 69 6f 6e 20 63 ect() function c
7370: 61 6c 6c 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c all will be call
7380: 65 64 20 66 69 72 73 74 20 77 69 74 68 20 74 68 ed first with th
7390: 65 0a 20 2a 20 20 20 20 20 64 77 50 72 65 66 65 e. * dwPrefe
73a0: 72 72 65 64 50 72 6f 74 6f 63 6f 6c 73 20 6f 66 rredProtocols of
73b0: 20 22 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63 "default_protoc
73c0: 6f 6c 22 2e 20 20 49 66 20 74 68 61 74 20 63 61 ol". If that ca
73d0: 6c 6c 20 72 65 74 75 72 6e 73 0a 20 2a 20 20 20 ll returns. *
73e0: 20 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f SCARD_E_PROTO_
73f0: 4d 49 53 4d 41 54 43 48 20 74 72 79 20 61 67 61 MISMATCH try aga
7400: 69 6e 20 77 69 74 68 20 61 20 70 72 6f 74 6f 63 in with a protoc
7410: 6f 6c 20 6f 66 20 54 3d 30 2c 20 61 6e 64 20 66 ol of T=0, and f
7420: 61 69 6c 69 6e 67 0a 20 2a 20 20 20 20 20 74 68 ailing. * th
7430: 61 74 20 54 3d 31 2e 0a 20 2a 0a 20 2a 2f 0a 73 at T=1.. *. */.s
7440: 74 61 74 69 63 20 4c 4f 4e 47 20 63 61 63 6b 65 tatic LONG cacke
7450: 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64 y_reconnect_card
7460: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 (struct cackey_s
7470: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 44 57 4f 52 44 lot *slot, DWORD
7480: 20 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f default_protoco
7490: 6c 2c 20 4c 50 44 57 4f 52 44 20 73 65 6c 65 63 l, LPDWORD selec
74a0: 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 29 20 7b 0a ted_protocol) {.
74b0: 09 4c 4f 4e 47 20 73 63 61 72 64 5f 63 6f 6e 6e .LONG scard_conn
74c0: 5f 72 65 74 3b 0a 0a 09 73 63 61 72 64 5f 63 6f _ret;...scard_co
74d0: 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 52 65 nn_ret = SCardRe
74e0: 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 connect(slot->pc
74f0: 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 53 sc_card, SCARD_S
7500: 48 41 52 45 5f 53 48 41 52 45 44 2c 20 64 65 66 HARE_SHARED, def
7510: 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 2c 20 53 ault_protocol, S
7520: 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52 44 2c CARD_RESET_CARD,
7530: 20 73 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 selected_protoc
7540: 6f 6c 29 3b 0a 0a 09 69 66 20 28 73 63 61 72 64 ol);...if (scard
7550: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 _conn_ret == SCA
7560: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 RD_E_PROTO_MISMA
7570: 54 43 48 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f TCH) {...CACKEY_
7580: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 DEBUG_PRINTF("SC
7590: 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 20 72 ardReconnect() r
75a0: 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f eturned SCARD_E_
75b0: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 PROTO_MISMATCH,
75c0: 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73 74 trying with just
75d0: 20 54 3d 30 22 29 0a 09 09 73 63 61 72 64 5f 63 T=0")...scard_c
75e0: 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 52 onn_ret = SCardR
75f0: 65 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 econnect(slot->p
7600: 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f csc_card, SCARD_
7610: 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 SHARE_SHARED, SC
7620: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c ARD_PROTOCOL_T0,
7630: 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52 SCARD_RESET_CAR
7640: 44 2c 20 73 65 6c 65 63 74 65 64 5f 70 72 6f 74 D, selected_prot
7650: 6f 63 6f 6c 29 3b 0a 0a 09 09 69 66 20 28 73 63 ocol);....if (sc
7660: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 ard_conn_ret ==
7670: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 SCARD_E_PROTO_MI
7680: 53 4d 41 54 43 48 29 20 7b 0a 09 09 09 43 41 43 SMATCH) {....CAC
7690: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
76a0: 28 22 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 ("SCardReconnect
76b0: 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 () returned SCAR
76c0: 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 D_E_PROTO_MISMAT
76d0: 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20 CH, trying with
76e0: 6a 75 73 74 20 54 3d 31 22 29 0a 09 09 09 73 63 just T=1")....sc
76f0: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 ard_conn_ret = S
7700: 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 73 6c CardReconnect(sl
7710: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 ot->pcsc_card, S
7720: 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 CARD_SHARE_SHARE
7730: 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f D, SCARD_PROTOCO
7740: 4c 5f 54 31 2c 20 53 43 41 52 44 5f 52 45 53 45 L_T1, SCARD_RESE
7750: 54 5f 43 41 52 44 2c 20 73 65 6c 65 63 74 65 64 T_CARD, selected
7760: 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 7d 0a _protocol);...}.
7770: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 73 63 61 72 .}...return(scar
7780: 64 5f 63 6f 6e 6e 5f 72 65 74 29 3b 0a 7d 0a 0a d_conn_ret);.}..
7790: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 /*. * SYNPOSIS.
77a0: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 * cackey_ret
77b0: 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f cackey_connect_
77c0: 63 61 72 64 28 73 74 72 75 63 74 20 63 61 63 6b card(struct cack
77d0: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a ey_slot *slot);.
77e0: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a *. * ARGUMENTS.
77f0: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c * cackey_sl
7800: 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 ot *slot. *
7810: 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 Slot to send
7820: 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a commands to. *.
7830: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a * RETURN VALUE.
7840: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 * CACKEY_PC
7850: 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 SC_S_OK
7860: 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 On success. *
7870: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f CACKEY_PCSC_E_
7880: 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 GENERIC On er
7890: 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a ror. *. * NOTES.
78a0: 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 * None. *.
78b0: 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 */.static cackey
78c0: 5f 72 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e _ret cackey_conn
78d0: 65 63 74 5f 63 61 72 64 28 73 74 72 75 63 74 20 ect_card(struct
78e0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f cackey_slot *slo
78f0: 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f 72 65 74 t) {..cackey_ret
7900: 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 pcsc_connect_re
7910: 74 3b 0a 09 44 57 4f 52 44 20 70 72 6f 74 6f 63 t;..DWORD protoc
7920: 6f 6c 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f ol;..LONG scard_
7930: 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b conn_ret;...CACK
7940: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
7950: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 "Called.");...if
7960: 20 28 21 73 6c 6f 74 29 20 7b 0a 09 09 43 41 43 (!slot) {...CAC
7970: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
7980: 28 22 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 73 ("Invalid slot s
7990: 70 65 63 69 66 69 65 64 2c 20 72 65 74 75 72 6e pecified, return
79a0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 ing in failure")
79b0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b ;....return(CACK
79c0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 EY_PCSC_E_GENERI
79d0: 43 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 63 6f C);..}...pcsc_co
79e0: 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b nnect_ret = cack
79f0: 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 ey_pcsc_connect(
7a00: 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e );..if (pcsc_con
7a10: 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b nect_ret != CACK
7a20: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a EY_PCSC_S_OK) {.
7a30: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
7a40: 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f RINTF("Connectio
7a50: 6e 20 74 6f 20 50 43 2f 53 43 20 66 61 69 6c 65 n to PC/SC faile
7a60: 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 d, returning in
7a70: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 failure");....re
7a80: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 turn(CACKEY_PCSC
7a90: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a _E_GENERIC);..}.
7aa0: 0a 09 2f 2a 20 43 6f 6e 6e 65 63 74 20 74 6f 20 ../* Connect to
7ab0: 72 65 61 64 65 72 2c 20 69 66 20 6e 65 65 64 65 reader, if neede
7ac0: 64 20 2a 2f 0a 09 69 66 20 28 21 73 6c 6f 74 2d d */..if (!slot-
7ad0: 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 >pcsc_card_conne
7ae0: 63 74 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 cted) {...CACKEY
7af0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 _DEBUG_PRINTF("S
7b00: 43 61 72 64 43 6f 6e 6e 65 63 74 28 25 73 29 20 CardConnect(%s)
7b10: 63 61 6c 6c 65 64 22 2c 20 73 6c 6f 74 2d 3e 70 called", slot->p
7b20: 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 09 73 csc_reader);...s
7b30: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 card_conn_ret =
7b40: 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 SCardConnect(*ca
7b50: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 ckey_pcsc_handle
7b60: 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 , slot->pcsc_rea
7b70: 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45 der, SCARD_SHARE
7b80: 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 _SHARED, SCARD_P
7b90: 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 41 ROTOCOL_T0 | SCA
7ba0: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 RD_PROTOCOL_T1,
7bb0: 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 &slot->pcsc_card
7bc0: 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 , &protocol);...
7bd0: 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f .if (scard_conn_
7be0: 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 ret == SCARD_E_P
7bf0: 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b ROTO_MISMATCH) {
7c00: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
7c10: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f _PRINTF("SCardCo
7c20: 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 nnect() returned
7c30: 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d SCARD_E_PROTO_M
7c40: 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20 ISMATCH, trying
7c50: 77 69 74 68 20 6a 75 73 74 20 54 3d 30 22 29 0a with just T=0").
7c60: 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 ...scard_conn_re
7c70: 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 t = SCardConnect
7c80: 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 (*cackey_pcsc_ha
7c90: 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 ndle, slot->pcsc
7ca0: 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53 _reader, SCARD_S
7cb0: 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41 HARE_SHARED, SCA
7cc0: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20 RD_PROTOCOL_T0,
7cd0: 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 &slot->pcsc_card
7ce0: 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 , &protocol);...
7cf0: 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e ..if (scard_conn
7d00: 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f _ret == SCARD_E_
7d10: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 PROTO_MISMATCH)
7d20: 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 {.....CACKEY_DEB
7d30: 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 UG_PRINTF("SCard
7d40: 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e Connect() return
7d50: 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f ed SCARD_E_PROTO
7d60: 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e _MISMATCH, tryin
7d70: 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d 31 22 g with just T=1"
7d80: 29 0a 09 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e ).....scard_conn
7d90: 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e _ret = SCardConn
7da0: 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 ect(*cackey_pcsc
7db0: 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 _handle, slot->p
7dc0: 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41 52 csc_reader, SCAR
7dd0: 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20 D_SHARE_SHARED,
7de0: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 SCARD_PROTOCOL_T
7df0: 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 1, &slot->pcsc_c
7e00: 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b ard, &protocol);
7e10: 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 ....}...}....if
7e20: 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 (scard_conn_ret
7e30: 3d 3d 20 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57 == SCARD_W_UNPOW
7e40: 45 52 45 44 5f 43 41 52 44 29 20 7b 0a 09 09 09 ERED_CARD) {....
7e50: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
7e60: 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 NTF("SCardConnec
7e70: 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 t() returned SCA
7e80: 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43 RD_W_UNPOWERED_C
7e90: 41 52 44 2c 20 74 72 79 69 6e 67 20 74 6f 20 72 ARD, trying to r
7ea0: 65 2d 63 6f 6e 6e 65 63 74 2e 2e 2e 22 29 3b 0a e-connect...");.
7eb0: 0a 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 ....scard_conn_r
7ec0: 65 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 et = SCardConnec
7ed0: 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 t(*cackey_pcsc_h
7ee0: 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 andle, slot->pcs
7ef0: 63 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f c_reader, SCARD_
7f00: 53 48 41 52 45 5f 44 49 52 45 43 54 2c 20 53 43 SHARE_DIRECT, SC
7f10: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 ARD_PROTOCOL_T0
7f20: 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c | SCARD_PROTOCOL
7f30: 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 _T1, &slot->pcsc
7f40: 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c _card, &protocol
7f50: 29 3b 0a 0a 09 09 09 69 66 20 28 73 63 61 72 64 );.....if (scard
7f60: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 _conn_ret == SCA
7f70: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 RD_E_PROTO_MISMA
7f80: 54 43 48 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 TCH) {.....CACKE
7f90: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
7fa0: 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 72 SCardConnect() r
7fb0: 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f eturned SCARD_E_
7fc0: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 PROTO_MISMATCH,
7fd0: 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73 74 trying with just
7fe0: 20 54 3d 30 22 29 0a 09 09 09 09 73 63 61 72 64 T=0").....scard
7ff0: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 _conn_ret = SCar
8000: 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 dConnect(*cackey
8010: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c _pcsc_handle, sl
8020: 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c ot->pcsc_reader,
8030: 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 SCARD_SHARE_SHA
8040: 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f RED, SCARD_PROTO
8050: 43 4f 4c 5f 54 30 2c 20 26 73 6c 6f 74 2d 3e 70 COL_T0, &slot->p
8060: 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f csc_card, &proto
8070: 63 6f 6c 29 3b 0a 0a 09 09 09 09 69 66 20 28 73 col);......if (s
8080: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d card_conn_ret ==
8090: 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d SCARD_E_PROTO_M
80a0: 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 09 09 09 ISMATCH) {......
80b0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
80c0: 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 NTF("SCardConnec
80d0: 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 t() returned SCA
80e0: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 RD_E_PROTO_MISMA
80f0: 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68 TCH, trying with
8100: 20 6a 75 73 74 20 54 3d 31 22 29 0a 09 09 09 09 just T=1").....
8110: 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 .scard_conn_ret
8120: 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a = SCardConnect(*
8130: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 cackey_pcsc_hand
8140: 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 le, slot->pcsc_r
8150: 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41 eader, SCARD_SHA
8160: 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 RE_SHARED, SCARD
8170: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 _PROTOCOL_T1, &s
8180: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 lot->pcsc_card,
8190: 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09 09 &protocol);.....
81a0: 7d 0a 09 09 09 7d 0a 0a 09 09 09 73 63 61 72 64 }....}.....scard
81b0: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 61 63 6b _conn_ret = cack
81c0: 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72 ey_reconnect_car
81d0: 64 28 73 6c 6f 74 2c 20 70 72 6f 74 6f 63 6f 6c d(slot, protocol
81e0: 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 , &protocol);...
81f0: 7d 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 63 }....if (scard_c
8200: 6f 6e 6e 5f 72 65 74 20 21 3d 20 53 43 41 52 44 onn_ret != SCARD
8210: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 _S_SUCCESS) {...
8220: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
8230: 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e INTF("Connection
8240: 20 74 6f 20 63 61 72 64 20 66 61 69 6c 65 64 2c to card failed,
8250: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 returning in fa
8260: 69 6c 75 72 65 20 28 53 43 61 72 64 43 6f 6e 6e ilure (SCardConn
8270: 65 63 74 28 29 20 3d 20 25 73 2f 25 6c 69 29 22 ect() = %s/%li)"
8280: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 , CACKEY_DEBUG_F
8290: 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f UNC_SCARDERR_TO_
82a0: 53 54 52 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 STR(scard_conn_r
82b0: 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 et), (long) scar
82c0: 64 5f 63 6f 6e 6e 5f 72 65 74 29 3b 0a 0a 09 09 d_conn_ret);....
82d0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 .return(CACKEY_P
82e0: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a CSC_E_GENERIC);.
82f0: 09 09 7d 0a 0a 09 09 73 6c 6f 74 2d 3e 70 63 73 ..}....slot->pcs
8300: 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 c_card_connected
8310: 20 3d 20 31 3b 0a 09 09 73 6c 6f 74 2d 3e 74 72 = 1;...slot->tr
8320: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 ansaction_depth
8330: 3d 20 30 3b 0a 09 09 73 6c 6f 74 2d 3e 74 72 61 = 0;...slot->tra
8340: 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 nsaction_need_hw
8350: 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09 73 6c 6f _lock = 0;...slo
8360: 74 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d 20 70 72 t->protocol = pr
8370: 6f 74 6f 63 6f 6c 3b 0a 09 7d 0a 0a 09 72 65 74 otocol;..}...ret
8380: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f urn(CACKEY_PCSC_
8390: 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 S_OK);.}../*. *
83a0: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 SYNPOSIS. *
83b0: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 cackey_ret cacke
83c0: 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 y_begin_transact
83d0: 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65 ion(struct cacke
83e0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 y_slot *slot);.
83f0: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 *. * ARGUMENTS.
8400: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f * cackey_slo
8410: 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 t *slot. *
8420: 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 Slot to send
8430: 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 commands to. *.
8440: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 * RETURN VALUE.
8450: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 * CACKEY_PCS
8460: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f C_S_OK O
8470: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 n success. *
8480: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 CACKEY_PCSC_E_G
8490: 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 ENERIC On err
84a0: 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 or. *. * NOTES.
84b0: 2a 20 20 20 20 20 54 68 65 20 74 72 61 6e 73 61 * The transa
84c0: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 ction should be
84d0: 74 65 72 6d 69 6e 61 74 65 64 20 75 73 69 6e 67 terminated using
84e0: 20 22 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 "cackey_end_tra
84f0: 6e 73 61 63 74 69 6f 6e 22 0a 20 2a 0a 20 2a 2f nsaction". *. */
8500: 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 .static cackey_r
8510: 65 74 20 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f et cackey_begin_
8520: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75 transaction(stru
8530: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a ct cackey_slot *
8540: 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f slot) {..cackey_
8550: 72 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f ret cackey_conn_
8560: 72 65 74 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 ret;..LONG scard
8570: 5f 74 72 61 6e 73 5f 72 65 74 3b 0a 0a 09 43 41 _trans_ret;...CA
8580: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
8590: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
85a0: 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74 20 cackey_conn_ret
85b0: 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 = cackey_connect
85c0: 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69 66 _card(slot);..if
85d0: 20 28 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65 (cackey_conn_re
85e0: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 t != CACKEY_PCSC
85f0: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 _S_OK) {...CACKE
8600: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
8610: 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 Unable to connec
8620: 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72 t to card, retur
8630: 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29 3b ning in error");
8640: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 ....return(CACKE
8650: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 Y_PCSC_E_GENERIC
8660: 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 );..}...slot->tr
8670: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2b ansaction_depth+
8680: 2b 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 +;...if (slot->t
8690: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 ransaction_depth
86a0: 20 3e 20 31 20 26 26 20 21 73 6c 6f 74 2d 3e 74 > 1 && !slot->t
86b0: 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f ransaction_need_
86c0: 68 77 5f 6c 6f 63 6b 29 20 7b 0a 09 09 43 41 43 hw_lock) {...CAC
86d0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
86e0: 28 22 41 6c 72 65 61 64 79 20 69 6e 20 61 20 74 ("Already in a t
86f0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 70 65 72 66 ransaction, perf
8700: 6f 72 6d 69 6e 67 20 6e 6f 20 61 63 74 69 6f 6e orming no action
8710: 20 28 6e 65 77 20 64 65 70 74 68 20 3d 20 25 69 (new depth = %i
8720: 29 22 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 )", slot->transa
8730: 63 74 69 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a 09 ction_depth);...
8740: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 .return(CACKEY_P
8750: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 CSC_S_OK);..}...
8760: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f slot->transactio
8770: 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d n_need_hw_lock =
8780: 20 30 3b 0a 0a 09 73 63 61 72 64 5f 74 72 61 6e 0;...scard_tran
8790: 73 5f 72 65 74 20 3d 20 53 43 61 72 64 42 65 67 s_ret = SCardBeg
87a0: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c inTransaction(sl
87b0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 29 3b 0a ot->pcsc_card);.
87c0: 09 69 66 20 28 73 63 61 72 64 5f 74 72 61 6e 73 .if (scard_trans
87d0: 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f _ret != SCARD_S_
87e0: 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43 SUCCESS) {...CAC
87f0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
8800: 28 22 55 6e 61 62 6c 65 20 74 6f 20 62 65 67 69 ("Unable to begi
8810: 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72 n transaction, r
8820: 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f eturning in erro
8830: 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 r");....return(C
8840: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e ACKEY_PCSC_E_GEN
8850: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b ERIC);..}...CACK
8860: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
8870: 22 53 75 63 65 73 73 66 75 6c 6c 79 20 62 65 67 "Sucessfully beg
8880: 61 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f an transaction o
8890: 6e 20 73 6c 6f 74 20 28 25 73 29 22 2c 20 73 6c n slot (%s)", sl
88a0: 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 29 ot->pcsc_reader)
88b0: 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 ;...return(CACKE
88c0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a Y_PCSC_S_OK);.}.
88d0: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a ./*. * SYNPOSIS.
88e0: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 * cackey_re
88f0: 74 20 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 t cackey_end_tra
8900: 6e 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20 nsaction(struct
8910: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f cackey_slot *slo
8920: 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 t);. *. * ARGUME
8930: 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 NTS. * cacke
8940: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 y_slot *slot. *
8950: 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 Slot to
8960: 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f send commands to
8970: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 . *. * RETURN VA
8980: 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 LUE. * CACKE
8990: 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 Y_PCSC_S_OK
89a0: 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 On success.
89b0: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 * CACKEY_PCS
89c0: 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f C_E_GENERIC O
89d0: 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f n error. *. * NO
89e0: 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 TES. * This
89f0: 66 75 6e 63 74 69 6f 6e 20 72 65 71 75 69 72 65 function require
8a00: 73 20 22 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f s "cackey_begin_
8a10: 74 72 61 6e 73 61 63 74 69 6f 6e 22 20 74 6f 20 transaction" to
8a20: 62 65 20 63 61 6c 6c 65 64 20 66 69 72 73 74 0a be called first.
8a30: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 *. */.static ca
8a40: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f ckey_ret cackey_
8a50: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 end_transaction(
8a60: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c struct cackey_sl
8a70: 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 4c 4f 4e ot *slot) {..LON
8a80: 47 20 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 G scard_trans_re
8a90: 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 t;...CACKEY_DEBU
8aa0: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 G_PRINTF("Called
8ab0: 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c 6f 74 .");...if (!slot
8ac0: 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e ->pcsc_card_conn
8ad0: 65 63 74 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 ected) {...CACKE
8ae0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
8af0: 43 61 72 64 20 69 73 20 6e 6f 74 20 63 6f 6e 6e Card is not conn
8b00: 65 63 74 65 64 2c 20 75 6e 61 62 6c 65 20 74 6f ected, unable to
8b10: 20 65 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e end transaction
8b20: 20 6f 6e 20 63 61 72 64 22 29 3b 0a 0a 09 09 69 on card");....i
8b30: 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 f (slot->transac
8b40: 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29 20 tion_depth > 0)
8b50: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {....CACKEY_DEBU
8b60: 47 5f 50 52 49 4e 54 46 28 22 44 65 63 72 65 61 G_PRINTF("Decrea
8b70: 73 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e sing transaction
8b80: 20 64 65 70 74 68 20 61 6e 64 20 61 73 6b 69 6e depth and askin
8b90: 67 20 66 6f 72 20 61 20 68 61 72 64 77 61 72 65 g for a hardware
8ba0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6e 65 78 lock on the nex
8bb0: 74 20 62 65 67 69 6e 20 74 72 61 6e 73 61 63 74 t begin transact
8bc0: 69 6f 6e 20 28 63 75 72 72 65 6e 74 20 64 65 70 ion (current dep
8bd0: 74 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d th = %i)", slot-
8be0: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 >transaction_dep
8bf0: 74 68 29 3b 0a 0a 09 09 09 73 6c 6f 74 2d 3e 74 th);.....slot->t
8c00: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 ransaction_depth
8c10: 2d 2d 3b 0a 0a 09 09 09 69 66 20 28 73 6c 6f 74 --;.....if (slot
8c20: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 ->transaction_de
8c30: 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09 09 73 pth > 0) {.....s
8c40: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e lot->transaction
8c50: 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 _need_hw_lock =
8c60: 31 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 72 1;....}...}....r
8c70: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 eturn(CACKEY_PCS
8c80: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d C_E_GENERIC);..}
8c90: 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 ...if (slot->tra
8ca0: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d nsaction_depth =
8cb0: 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f = 0) {...CACKEY_
8cc0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 65 DEBUG_PRINTF("Te
8cd0: 72 6d 69 6e 61 74 69 6e 67 20 61 20 74 72 61 6e rminating a tran
8ce0: 73 61 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73 saction that has
8cf0: 20 6e 6f 74 20 62 65 67 75 6e 21 22 29 3b 0a 0a not begun!");..
8d00: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f ..return(CACKEY_
8d10: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b PCSC_E_GENERIC);
8d20: 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e ..}...slot->tran
8d30: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b saction_depth--;
8d40: 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 ...if (slot->tra
8d50: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e nsaction_depth >
8d60: 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 0) {...CACKEY_D
8d70: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 72 61 EBUG_PRINTF("Tra
8d80: 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 nsactions still
8d90: 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 6e 6f 74 in progress, not
8da0: 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6f 6e 2d terminating on-
8db0: 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e card Transaction
8dc0: 20 28 63 75 72 72 65 6e 74 20 64 65 70 74 68 20 (current depth
8dd0: 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72 = %i)", slot->tr
8de0: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 29 ansaction_depth)
8df0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b ;....return(CACK
8e00: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 EY_PCSC_S_OK);..
8e10: 7d 0a 0a 09 73 63 61 72 64 5f 74 72 61 6e 73 5f }...scard_trans_
8e20: 72 65 74 20 3d 20 53 43 61 72 64 45 6e 64 54 72 ret = SCardEndTr
8e30: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 2d 3e ansaction(slot->
8e40: 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 pcsc_card, SCARD
8e50: 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 69 _LEAVE_CARD);..i
8e60: 66 20 28 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 f (scard_trans_r
8e70: 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 et != SCARD_S_SU
8e80: 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43 4b 45 CCESS) {...CACKE
8e90: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
8ea0: 55 6e 61 62 6c 65 20 74 6f 20 65 6e 64 20 74 72 Unable to end tr
8eb0: 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 75 72 ansaction, retur
8ec0: 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29 3b ning in error");
8ed0: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 ....return(CACKE
8ee0: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 Y_PCSC_E_GENERIC
8ef0: 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 );..}...CACKEY_D
8f00: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63 EBUG_PRINTF("Suc
8f10: 65 73 73 66 75 6c 6c 79 20 74 65 72 6d 69 6e 61 essfully termina
8f20: 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 ted transaction
8f30: 6f 6e 20 73 6c 6f 74 20 28 25 73 29 22 2c 20 73 on slot (%s)", s
8f40: 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 lot->pcsc_reader
8f50: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b );...return(CACK
8f60: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d EY_PCSC_S_OK);.}
8f70: 0a 0a 2f 2a 20 41 50 44 55 20 52 65 6c 61 74 65 ../* APDU Relate
8f80: 64 20 46 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 2f d Functions */./
8f90: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a *. * SYNPOSIS. *
8fa0: 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 cackey_ret
8fb0: 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 cackey_send_apdu
8fc0: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 (struct cackey_s
8fd0: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 lot *slot, unsig
8fe0: 6e 65 64 20 63 68 61 72 20 63 6c 61 73 73 2c 20 ned char class,
8ff0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e unsigned char in
9000: 73 74 72 75 63 74 69 6f 6e 2c 20 75 6e 73 69 67 struction, unsig
9010: 6e 65 64 20 63 68 61 72 20 70 31 2c 20 75 6e 73 ned char p1, uns
9020: 69 67 6e 65 64 20 63 68 61 72 20 70 32 2c 20 75 igned char p2, u
9030: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c 63 2c nsigned char lc,
9040: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
9050: 64 61 74 61 2c 20 75 6e 73 69 67 6e 65 64 20 63 data, unsigned c
9060: 68 61 72 20 6c 65 2c 20 75 69 6e 74 31 36 5f 74 har le, uint16_t
9070: 20 2a 72 65 73 70 63 6f 64 65 2c 20 75 6e 73 69 *respcode, unsi
9080: 67 6e 65 64 20 63 68 61 72 20 2a 72 65 73 70 64 gned char *respd
9090: 61 74 61 2c 20 73 69 7a 65 5f 74 20 2a 72 65 73 ata, size_t *res
90a0: 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 20 2a 0a 20 pdata_len);. *.
90b0: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 * ARGUMENTS. *
90c0: 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a cackey_slot *
90d0: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 slot. *
90e0: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d Slot to send com
90f0: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 mands to. *. *
9100: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 unsigned char
9110: 20 63 6c 61 73 73 0a 20 2a 20 20 20 20 20 20 20 class. *
9120: 20 20 41 50 44 55 20 43 6c 61 73 73 20 28 47 53 APDU Class (GS
9130: 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 CIS_CLASS_ISO781
9140: 36 20 6f 72 20 47 53 43 49 53 5f 43 4c 41 53 53 6 or GSCIS_CLASS
9150: 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d _GLOBAL_PLATFORM
9160: 0a 20 2a 20 20 20 20 20 20 20 20 20 75 73 75 61 . * usua
9170: 6c 6c 79 29 2c 20 28 43 4c 41 29 0a 20 2a 0a 20 lly), (CLA). *.
9180: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 * unsigned c
9190: 68 61 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a har instruction.
91a0: 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 20 * APDU
91b0: 49 6e 73 74 72 75 63 74 69 6f 6e 20 28 49 4e 53 Instruction (INS
91c0: 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 ). *. * unsi
91d0: 67 6e 65 64 20 63 68 61 72 20 70 31 0a 20 2a 20 gned char p1. *
91e0: 20 20 20 20 20 20 20 20 41 50 44 55 20 50 61 72 APDU Par
91f0: 61 6d 65 74 65 72 20 31 20 28 50 31 29 0a 20 2a ameter 1 (P1). *
9200: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 . * unsigned
9210: 20 63 68 61 72 20 70 32 0a 20 2a 20 20 20 20 20 char p2. *
9220: 20 20 20 20 41 50 44 55 20 50 61 72 61 6d 65 74 APDU Paramet
9230: 65 72 20 32 20 28 50 32 29 0a 20 2a 0a 20 2a 20 er 2 (P2). *. *
9240: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 unsigned cha
9250: 72 20 6c 63 0a 20 2a 20 20 20 20 20 20 20 20 20 r lc. *
9260: 41 50 44 55 20 4c 65 6e 67 74 68 20 6f 66 20 43 APDU Length of C
9270: 6f 6e 74 65 6e 74 20 28 4c 63 29 20 2d 2d 20 74 ontent (Lc) -- t
9280: 68 69 73 20 69 73 20 74 68 65 20 6c 65 6e 67 74 his is the lengt
9290: 68 20 6f 66 20 22 64 61 74 61 22 0a 20 2a 20 20 h of "data". *
92a0: 20 20 20 20 20 20 20 70 61 72 61 6d 65 74 65 72 parameter
92b0: 2e 20 20 49 66 20 22 64 61 74 61 22 20 69 73 20 . If "data" is
92c0: 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c specified as NUL
92d0: 4c 2c 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 L, this paramete
92e0: 72 20 77 69 6c 6c 0a 20 2a 20 20 20 20 20 20 20 r will. *
92f0: 20 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 2a be ignored.. *
9300: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 . * unsigned
9310: 20 63 68 61 72 20 2a 64 61 74 61 0a 20 2a 20 20 char *data. *
9320: 20 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 Pointer t
9330: 6f 20 62 75 66 66 65 72 20 74 6f 20 73 65 6e 64 o buffer to send
9340: 2e 20 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 . It should be
9350: 22 4c 63 22 20 62 79 74 65 73 20 6c 6f 6e 67 2e "Lc" bytes long.
9360: 20 20 49 66 0a 20 2a 20 20 20 20 20 20 20 20 20 If. *
9370: 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c specified as NUL
9380: 4c 2c 20 22 4c 63 22 20 77 69 6c 6c 20 6e 6f 74 L, "Lc" will not
9390: 20 62 65 20 73 65 6e 74 2c 20 61 6e 64 20 74 68 be sent, and th
93a0: 69 73 20 62 75 66 66 65 72 20 77 69 6c 6c 20 62 is buffer will b
93b0: 65 0a 20 2a 20 20 20 20 20 20 20 20 20 69 67 6e e. * ign
93c0: 6f 72 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 ored.. *. *
93d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c 65 unsigned char le
93e0: 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 . * APDU
93f0: 20 4c 65 6e 67 74 68 20 6f 66 20 45 78 70 65 63 Length of Expec
9400: 74 61 74 69 6f 6e 20 28 4c 65 29 20 2d 2d 20 74 tation (Le) -- t
9410: 68 69 73 20 69 73 20 74 68 65 20 6c 65 6e 67 74 his is the lengt
9420: 68 20 6f 66 20 74 68 65 0a 20 2a 20 20 20 20 20 h of the. *
9430: 20 20 20 20 65 78 70 65 63 74 65 64 20 72 65 70 expected rep
9440: 6c 79 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 ly. If this is
9450: 73 70 65 63 69 66 69 65 64 20 61 73 20 30 20 74 specified as 0 t
9460: 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74 0a hen it will not.
9470: 20 2a 20 20 20 20 20 20 20 20 20 62 65 20 73 65 * be se
9480: 6e 74 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 69 nt.. *. * ui
9490: 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f 64 65 nt16_t *respcode
94a0: 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54 . * [OUT
94b0: 5d 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74 6f ] Pointer to sto
94c0: 72 61 67 65 20 6f 66 20 41 50 44 55 20 72 65 73 rage of APDU res
94d0: 70 6f 6e 73 65 20 63 6f 64 65 2e 20 20 49 66 20 ponse code. If
94e0: 74 68 69 73 20 69 73 0a 20 2a 20 20 20 20 20 20 this is. *
94f0: 20 20 20 73 70 65 63 69 66 69 65 64 20 61 73 20 specified as
9500: 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 70 6f 6e NULL, the respon
9510: 73 65 20 63 6f 64 65 20 77 69 6c 6c 20 62 65 20 se code will be
9520: 64 69 73 63 61 72 64 65 64 2e 0a 20 2a 0a 20 2a discarded.. *. *
9530: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 unsigned ch
9540: 61 72 20 2a 72 65 73 70 64 61 74 61 0a 20 2a 20 ar *respdata. *
9550: 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 50 6f [OUT] Po
9560: 69 6e 74 65 72 20 74 6f 20 73 74 6f 72 61 67 65 inter to storage
9570: 20 6f 66 20 41 50 44 55 20 72 65 73 70 6f 6e 73 of APDU respons
9580: 65 20 64 61 74 61 2e 20 20 49 66 20 74 68 69 73 e data. If this
9590: 20 69 73 0a 20 2a 20 20 20 20 20 20 20 20 20 73 is. * s
95a0: 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c pecified as NULL
95b0: 2c 20 74 68 65 20 72 65 73 70 6f 6e 73 65 20 64 , the response d
95c0: 61 74 61 20 77 69 6c 6c 20 62 65 20 64 69 73 63 ata will be disc
95d0: 61 72 64 65 64 2e 20 20 49 66 0a 20 2a 20 20 20 arded. If. *
95e0: 20 20 20 20 20 20 74 68 65 20 22 72 65 73 70 64 the "respd
95f0: 61 74 61 5f 6c 65 6e 22 20 70 61 72 61 6d 65 74 ata_len" paramet
9600: 65 72 20 69 73 20 73 70 65 63 69 66 69 65 64 20 er is specified
9610: 61 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20 62 75 as NULL, this bu
9620: 66 66 65 72 0a 20 2a 20 20 20 20 20 20 20 20 20 ffer. *
9630: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 will not be upda
9640: 74 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 73 ted.. *. * s
9650: 69 7a 65 5f 74 20 2a 72 65 73 70 64 61 74 61 5f ize_t *respdata_
9660: 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 5b len. * [
9670: 49 4e 2c 20 4f 55 54 5d 20 50 6f 69 6e 74 65 72 IN, OUT] Pointer
9680: 20 69 6e 69 74 69 61 6c 69 6e 67 20 63 6f 6e 74 initialing cont
9690: 61 69 6e 69 6e 67 20 74 68 65 20 73 69 7a 65 20 aining the size
96a0: 6f 66 20 74 68 65 20 22 72 65 73 70 64 61 74 61 of the "respdata
96b0: 22 0a 20 2a 20 20 20 20 20 20 20 20 20 62 75 66 ". * buf
96c0: 66 65 72 2e 20 20 42 65 66 6f 72 65 20 72 65 74 fer. Before ret
96d0: 75 72 6e 69 6e 67 2c 20 74 68 65 20 70 6f 69 6e urning, the poin
96e0: 74 65 64 20 74 6f 20 76 61 6c 75 65 20 69 73 20 ted to value is
96f0: 75 70 64 61 74 65 64 20 74 6f 20 74 68 65 0a 20 updated to the.
9700: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72 * number
9710: 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65 of bytes writte
9720: 6e 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 2e n to the buffer.
9730: 20 20 49 66 20 74 68 69 73 20 69 73 20 73 70 65 If this is spe
9740: 63 69 66 69 65 64 20 61 73 0a 20 2a 20 20 20 20 cified as. *
9750: 20 20 20 20 20 4e 55 4c 4c 2c 20 69 74 20 77 69 NULL, it wi
9760: 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74 65 ll not be update
9770: 64 2c 20 61 6e 64 20 22 72 65 73 70 64 61 74 61 d, and "respdata
9780: 22 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 " will be ignore
9790: 64 20 63 61 75 73 69 6e 67 0a 20 2a 20 20 20 20 d causing. *
97a0: 20 20 20 20 20 74 68 65 20 72 65 73 70 6f 6e 73 the respons
97b0: 65 20 64 61 74 61 20 74 6f 20 62 65 20 64 69 73 e data to be dis
97c0: 63 61 72 64 65 64 2e 0a 20 2a 0a 20 2a 20 52 45 carded.. *. * RE
97d0: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 TURN VALUE. *
97e0: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f CACKEY_PCSC_S_
97f0: 4f 4b 20 20 20 20 20 20 20 20 20 20 20 4f 6e 20 OK On
9800: 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 success. * C
9810: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e ACKEY_PCSC_E_GEN
9820: 45 52 49 43 20 20 20 20 20 20 4f 6e 20 65 72 72 ERIC On err
9830: 6f 72 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 or. * CACKEY
9840: 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 _PCSC_E_TOKENABS
9850: 45 4e 54 20 20 49 66 20 74 68 65 20 73 65 6e 64 ENT If the send
9860: 69 6e 67 20 66 61 69 6c 65 64 20 62 65 63 61 75 ing failed becau
9870: 73 65 20 74 68 65 20 74 6f 6b 65 6e 20 69 73 0a se the token is.
9880: 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 *
9890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
98a0: 20 20 61 62 73 65 6e 74 0a 20 2a 0a 20 2a 20 4e absent. *. * N
98b0: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 OTES. * This
98c0: 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 63 function will c
98d0: 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20 50 43 onnect to the PC
98e0: 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 4d /SC Connection M
98f0: 61 6e 61 67 65 72 20 76 69 61 0a 20 2a 20 20 20 anager via. *
9900: 20 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f cackey_pcsc_co
9910: 6e 6e 65 63 74 28 29 20 69 66 20 6e 65 65 64 65 nnect() if neede
9920: 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 49 74 20 d.. *. * It
9930: 77 69 6c 6c 20 63 6f 6e 6e 65 63 74 20 74 6f 20 will connect to
9940: 74 68 65 20 63 61 72 64 20 69 6e 20 74 68 65 20 the card in the
9950: 72 65 61 64 65 72 20 61 74 74 61 63 68 65 64 20 reader attached
9960: 74 6f 20 74 68 65 20 73 6c 6f 74 0a 20 2a 20 20 to the slot. *
9970: 20 20 20 73 70 65 63 69 66 69 65 64 2e 20 20 49 specified. I
9980: 74 20 77 69 6c 6c 20 72 65 63 6f 6e 6e 65 63 74 t will reconnect
9990: 20 74 6f 20 74 68 65 20 63 61 72 64 20 69 66 20 to the card if
99a0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 the connection.
99b0: 2a 20 20 20 20 20 67 6f 65 73 20 61 77 61 79 2e * goes away.
99c0: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 . *. */.static c
99d0: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 ackey_ret cackey
99e0: 5f 73 65 6e 64 5f 61 70 64 75 28 73 74 72 75 63 _send_apdu(struc
99f0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 t cackey_slot *s
9a00: 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 lot, unsigned ch
9a10: 61 72 20 63 6c 61 73 73 2c 20 75 6e 73 69 67 6e ar class, unsign
9a20: 65 64 20 63 68 61 72 20 69 6e 73 74 72 75 63 74 ed char instruct
9a30: 69 6f 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 ion, unsigned ch
9a40: 61 72 20 70 31 2c 20 75 6e 73 69 67 6e 65 64 20 ar p1, unsigned
9a50: 63 68 61 72 20 70 32 2c 20 75 6e 73 69 67 6e 65 char p2, unsigne
9a60: 64 20 69 6e 74 20 6c 63 2c 20 75 6e 73 69 67 6e d int lc, unsign
9a70: 65 64 20 63 68 61 72 20 2a 64 61 74 61 2c 20 75 ed char *data, u
9a80: 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 2c 20 nsigned int le,
9a90: 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f uint16_t *respco
9aa0: 64 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 de, unsigned cha
9ab0: 72 20 2a 72 65 73 70 64 61 74 61 2c 20 73 69 7a r *respdata, siz
9ac0: 65 5f 74 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 e_t *respdata_le
9ad0: 6e 29 20 7b 0a 09 75 69 6e 74 38 5f 74 20 6d 61 n) {..uint8_t ma
9ae0: 6a 6f 72 5f 72 63 2c 20 6d 69 6e 6f 72 5f 72 63 jor_rc, minor_rc
9af0: 3b 0a 09 73 69 7a 65 5f 74 20 62 79 74 65 73 5f ;..size_t bytes_
9b00: 74 6f 5f 63 6f 70 79 2c 20 74 6d 70 5f 72 65 73 to_copy, tmp_res
9b10: 70 64 61 74 61 5f 6c 65 6e 3b 0a 09 4c 50 43 53 pdata_len;..LPCS
9b20: 43 41 52 44 5f 49 4f 5f 52 45 51 55 45 53 54 20 CARD_IO_REQUEST
9b30: 70 69 6f 53 65 6e 64 50 63 69 3b 0a 09 44 57 4f pioSendPci;..DWO
9b40: 52 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 44 57 RD protocol;..DW
9b50: 4f 52 44 20 78 6d 69 74 5f 6c 65 6e 2c 20 72 65 ORD xmit_len, re
9b60: 63 76 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 cv_len;..LONG sc
9b70: 61 72 64 5f 78 6d 69 74 5f 72 65 74 2c 20 73 63 ard_xmit_ret, sc
9b80: 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b 0a ard_reconn_ret;.
9b90: 09 42 59 54 45 20 78 6d 69 74 5f 62 75 66 5b 31 .BYTE xmit_buf[1
9ba0: 30 32 34 5d 2c 20 72 65 63 76 5f 62 75 66 5b 31 024], recv_buf[1
9bb0: 30 32 34 5d 3b 0a 09 69 6e 74 20 70 63 73 63 5f 024];..int pcsc_
9bc0: 63 6f 6e 6e 65 63 74 5f 72 65 74 2c 20 70 63 73 connect_ret, pcs
9bd0: 63 5f 67 65 74 72 65 73 70 5f 72 65 74 3b 0a 09 c_getresp_ret;..
9be0: 69 6e 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 int idx;...CACKE
9bf0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
9c00: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 Called.");...if
9c10: 28 21 73 6c 6f 74 29 20 7b 0a 09 09 43 41 43 4b (!slot) {...CACK
9c20: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
9c30: 22 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 73 70 "Invalid slot sp
9c40: 65 63 69 66 69 65 64 2e 22 29 3b 0a 0a 09 09 72 ecified.");....r
9c50: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 eturn(CACKEY_PCS
9c60: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d C_E_GENERIC);..}
9c70: 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f ...pcsc_connect_
9c80: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e ret = cackey_con
9c90: 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b nect_card(slot);
9ca0: 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 ..if (pcsc_conne
9cb0: 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 ct_ret != CACKEY
9cc0: 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 _PCSC_S_OK) {...
9cd0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
9ce0: 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 NTF("Unable to c
9cf0: 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20 onnect to card,
9d00: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 returning in fai
9d10: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 lure");....retur
9d20: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f n(CACKEY_PCSC_E_
9d30: 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f GENERIC);..}.../
9d40: 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 69 63 * Determine whic
9d50: 68 20 70 72 6f 74 6f 63 6f 6c 20 74 6f 20 73 65 h protocol to se
9d60: 6e 64 20 75 73 69 6e 67 20 2a 2f 0a 09 73 77 69 nd using */..swi
9d70: 74 63 68 20 28 73 6c 6f 74 2d 3e 70 72 6f 74 6f tch (slot->proto
9d80: 63 6f 6c 29 20 7b 0a 09 09 63 61 73 65 20 53 43 col) {...case SC
9d90: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 3a ARD_PROTOCOL_T0:
9da0: 0a 09 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d ....pioSendPci =
9db0: 20 53 43 41 52 44 5f 50 43 49 5f 54 30 3b 0a 0a SCARD_PCI_T0;..
9dc0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 ...break;...case
9dd0: 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f SCARD_PROTOCOL_
9de0: 54 31 3a 0a 09 09 09 70 69 6f 53 65 6e 64 50 63 T1:....pioSendPc
9df0: 69 20 3d 20 53 43 41 52 44 5f 50 43 49 5f 54 31 i = SCARD_PCI_T1
9e00: 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 64 ;.....break;...d
9e10: 65 66 61 75 6c 74 3a 0a 09 09 09 43 41 43 4b 45 efault:....CACKE
9e20: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
9e30: 49 6e 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c Invalid protocol
9e40: 20 66 6f 75 6e 64 2c 20 61 62 6f 72 74 69 6e 67 found, aborting
9e50: 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 .");.....return(
9e60: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 CACKEY_PCSC_E_GE
9e70: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 NERIC);..}.../*
9e80: 54 72 61 6e 73 6d 69 74 20 2a 2f 0a 09 78 6d 69 Transmit */..xmi
9e90: 74 5f 6c 65 6e 20 3d 20 30 3b 0a 09 78 6d 69 74 t_len = 0;..xmit
9ea0: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d _buf[xmit_len++]
9eb0: 20 3d 20 63 6c 61 73 73 3b 0a 09 78 6d 69 74 5f = class;..xmit_
9ec0: 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 buf[xmit_len++]
9ed0: 3d 20 69 6e 73 74 72 75 63 74 69 6f 6e 3b 0a 09 = instruction;..
9ee0: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 xmit_buf[xmit_le
9ef0: 6e 2b 2b 5d 20 3d 20 70 31 3b 0a 09 78 6d 69 74 n++] = p1;..xmit
9f00: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d _buf[xmit_len++]
9f10: 20 3d 20 70 32 3b 0a 09 69 66 20 28 64 61 74 61 = p2;..if (data
9f20: 29 20 7b 0a 09 09 69 66 20 28 6c 63 20 3e 20 32 ) {...if (lc > 2
9f30: 35 36 29 20 7b 0a 09 09 09 78 6d 69 74 5f 62 75 56) {....xmit_bu
9f40: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 f[xmit_len++] =
9f50: 30 78 38 30 3b 20 2f 2a 20 58 58 58 20 55 4e 54 0x80; /* XXX UNT
9f60: 45 53 54 45 44 20 2a 2f 0a 09 09 09 78 6d 69 74 ESTED */....xmit
9f70: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d _buf[xmit_len++]
9f80: 20 3d 20 28 6c 63 20 26 20 30 78 66 66 30 30 29 = (lc & 0xff00)
9f90: 20 3e 3e 20 38 3b 0a 09 09 09 78 6d 69 74 5f 62 >> 8;....xmit_b
9fa0: 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d uf[xmit_len++] =
9fb0: 20 6c 63 20 26 20 30 78 66 66 3b 0a 09 09 7d 20 lc & 0xff;...}
9fc0: 65 6c 73 65 20 7b 0a 09 09 09 78 6d 69 74 5f 62 else {....xmit_b
9fd0: 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d uf[xmit_len++] =
9fe0: 20 6c 63 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28 lc;...}...for (
9ff0: 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 6c idx = 0; idx < l
a000: 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 09 78 c; idx++) {....x
a010: 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e mit_buf[xmit_len
a020: 2b 2b 5d 20 3d 20 64 61 74 61 5b 69 64 78 5d 3b ++] = data[idx];
a030: 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6c 65 ...}..}...if (le
a040: 20 21 3d 20 30 78 30 30 29 20 7b 0a 09 09 69 66 != 0x00) {...if
a050: 20 28 6c 65 20 3e 20 32 35 36 29 20 7b 0a 09 09 (le > 256) {...
a060: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c .xmit_buf[xmit_l
a070: 65 6e 2b 2b 5d 20 3d 20 30 78 38 30 3b 20 2f 2a en++] = 0x80; /*
a080: 20 58 58 58 20 55 4e 54 45 53 54 45 44 20 2a 2f XXX UNTESTED */
a090: 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 ....xmit_buf[xmi
a0a0: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 28 6c 65 20 26 t_len++] = (le &
a0b0: 20 30 78 66 66 30 30 29 20 3e 3e 20 38 3b 0a 09 0xff00) >> 8;..
a0c0: 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f ..xmit_buf[xmit_
a0d0: 6c 65 6e 2b 2b 5d 20 3d 20 6c 65 20 26 20 30 78 len++] = le & 0x
a0e0: 66 66 3b 0a 09 09 7d 20 65 6c 73 65 20 69 66 20 ff;...} else if
a0f0: 28 6c 65 20 3d 3d 20 32 35 36 29 20 7b 0a 09 09 (le == 256) {...
a100: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c .xmit_buf[xmit_l
a110: 65 6e 2b 2b 5d 20 3d 20 30 78 30 30 3b 0a 09 09 en++] = 0x00;...
a120: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 78 6d 69 74 } else {....xmit
a130: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d _buf[xmit_len++]
a140: 20 3d 20 6c 65 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 = le;...}..}...
a150: 2f 2a 20 42 65 67 69 6e 20 53 6d 61 72 74 63 61 /* Begin Smartca
a160: 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a rd Transaction *
a170: 2f 0a 09 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f /..cackey_begin_
a180: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 transaction(slot
a190: 29 3b 0a 0a 09 69 66 20 28 63 6c 61 73 73 20 3d );...if (class =
a1a0: 3d 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 = GSCIS_CLASS_IS
a1b0: 4f 37 38 31 36 20 26 26 20 69 6e 73 74 72 75 63 O7816 && instruc
a1c0: 74 69 6f 6e 20 3d 3d 20 47 53 43 49 53 5f 49 4e tion == GSCIS_IN
a1d0: 53 54 52 5f 56 45 52 49 46 59 20 26 26 20 70 31 STR_VERIFY && p1
a1e0: 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 43 41 == 0x00) {...CA
a1f0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
a200: 46 28 22 53 65 6e 64 69 6e 67 20 41 50 44 55 3a F("Sending APDU:
a210: 20 3c 3c 63 65 6e 73 6f 72 65 64 3e 3e 22 29 3b <<censored>>");
a220: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43 ..} else {...CAC
a230: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 KEY_DEBUG_PRINTB
a240: 55 46 28 22 53 65 6e 64 69 6e 67 20 41 50 44 55 UF("Sending APDU
a250: 3a 22 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d :", xmit_buf, xm
a260: 69 74 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 72 65 it_len);..}...re
a270: 63 76 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 cv_len = sizeof(
a280: 72 65 63 76 5f 62 75 66 29 3b 0a 09 73 63 61 72 recv_buf);..scar
a290: 64 5f 78 6d 69 74 5f 72 65 74 20 3d 20 53 43 61 d_xmit_ret = SCa
a2a0: 72 64 54 72 61 6e 73 6d 69 74 28 73 6c 6f 74 2d rdTransmit(slot-
a2b0: 3e 70 63 73 63 5f 63 61 72 64 2c 20 70 69 6f 53 >pcsc_card, pioS
a2c0: 65 6e 64 50 63 69 2c 20 78 6d 69 74 5f 62 75 66 endPci, xmit_buf
a2d0: 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20 4e 55 4c 4c , xmit_len, NULL
a2e0: 2c 20 72 65 63 76 5f 62 75 66 2c 20 26 72 65 63 , recv_buf, &rec
a2f0: 76 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 73 63 v_len);...if (sc
a300: 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 3d 20 ard_xmit_ret ==
a310: 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e SCARD_E_NOT_TRAN
a320: 53 41 43 54 45 44 29 20 7b 0a 09 09 43 41 43 4b SACTED) {...CACK
a330: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
a340: 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6e 64 20 "Failed to send
a350: 41 50 44 55 20 74 6f 20 63 61 72 64 20 28 53 43 APDU to card (SC
a360: 61 72 64 54 72 61 6e 73 6d 69 74 28 29 20 3d 20 ardTransmit() =
a370: 25 73 2f 25 6c 78 29 2c 20 77 69 6c 6c 20 61 73 %s/%lx), will as
a380: 6b 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 k calling functi
a390: 6f 6e 20 74 6f 20 72 65 74 72 79 20 28 6e 6f 74 on to retry (not
a3a0: 20 72 65 73 65 74 74 69 6e 67 20 63 61 72 64 29 resetting card)
a3b0: 2e 2e 2e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 ...", CACKEY_DEB
a3c0: 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 UG_FUNC_SCARDERR
a3d0: 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 78 6d _TO_STR(scard_xm
a3e0: 69 74 5f 72 65 74 29 2c 20 28 75 6e 73 69 67 6e it_ret), (unsign
a3f0: 65 64 20 6c 6f 6e 67 29 20 73 63 61 72 64 5f 78 ed long) scard_x
a400: 6d 69 74 5f 72 65 74 29 3b 0a 0a 09 09 2f 2a 20 mit_ret);..../*
a410: 42 65 67 69 6e 20 53 6d 61 72 74 63 61 72 64 20 Begin Smartcard
a420: 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 Transaction */..
a430: 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e .cackey_end_tran
a440: 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a saction(slot);..
a450: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f ..return(CACKEY_
a460: 50 43 53 43 5f 45 5f 52 45 54 52 59 29 3b 0a 09 PCSC_E_RETRY);..
a470: 7d 0a 0a 09 69 66 20 28 73 63 61 72 64 5f 78 6d }...if (scard_xm
a480: 69 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f it_ret != SCARD_
a490: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43 S_SUCCESS) {...C
a4a0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
a4b0: 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65 TF("Failed to se
a4c0: 6e 64 20 41 50 44 55 20 74 6f 20 63 61 72 64 20 nd APDU to card
a4d0: 28 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28 29 (SCardTransmit()
a4e0: 20 3d 20 25 73 2f 25 6c 78 29 22 2c 20 43 41 43 = %s/%lx)", CAC
a4f0: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 KEY_DEBUG_FUNC_S
a500: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 CARDERR_TO_STR(s
a510: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20 card_xmit_ret),
a520: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
a530: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b scard_xmit_ret);
a540: 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
a550: 5f 50 52 49 4e 54 46 28 22 4d 61 72 6b 69 6e 67 _PRINTF("Marking
a560: 20 73 6c 6f 74 20 61 73 20 68 61 76 69 6e 67 20 slot as having
a570: 62 65 65 6e 20 72 65 73 65 74 22 29 3b 0a 09 09 been reset");...
a580: 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 cackey_mark_slot
a590: 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 _reset(slot);...
a5a0: 09 69 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f .if (scard_xmit_
a5b0: 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 57 5f 52 ret == SCARD_W_R
a5c0: 45 53 45 54 5f 43 41 52 44 29 20 7b 0a 09 09 09 ESET_CARD) {....
a5d0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
a5e0: 4e 54 46 28 22 52 65 73 65 74 20 72 65 71 75 69 NTF("Reset requi
a5f0: 72 65 64 2c 20 70 6c 65 61 73 65 20 68 6f 6c 64 red, please hold
a600: 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73 63 61 72 64 ...");.....scard
a610: 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 61 _reconn_ret = ca
a620: 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 ckey_reconnect_c
a630: 61 72 64 28 73 6c 6f 74 2c 20 53 43 41 52 44 5f ard(slot, SCARD_
a640: 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 PROTOCOL_T0 | SC
a650: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c ARD_PROTOCOL_T1,
a660: 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 &protocol);....
a670: 09 69 66 20 28 73 63 61 72 64 5f 72 65 63 6f 6e .if (scard_recon
a680: 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 n_ret == SCARD_S
a690: 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09 _SUCCESS) {.....
a6a0: 2f 2a 20 55 70 64 61 74 65 20 70 72 6f 74 6f 63 /* Update protoc
a6b0: 6f 6c 20 2a 2f 0a 09 09 09 09 73 6c 6f 74 2d 3e ol */.....slot->
a6c0: 70 72 6f 74 6f 63 6f 6c 20 3d 20 70 72 6f 74 6f protocol = proto
a6d0: 63 6f 6c 3b 0a 09 09 09 09 73 77 69 74 63 68 20 col;.....switch
a6e0: 28 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 29 (slot->protocol)
a6f0: 20 7b 0a 09 09 09 09 09 63 61 73 65 20 53 43 41 {......case SCA
a700: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 3a 0a RD_PROTOCOL_T0:.
a710: 09 09 09 09 09 09 70 69 6f 53 65 6e 64 50 63 69 ......pioSendPci
a720: 20 3d 20 53 43 41 52 44 5f 50 43 49 5f 54 30 3b = SCARD_PCI_T0;
a730: 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 ........break;..
a740: 09 09 09 09 63 61 73 65 20 53 43 41 52 44 5f 50 ....case SCARD_P
a750: 52 4f 54 4f 43 4f 4c 5f 54 31 3a 0a 09 09 09 09 ROTOCOL_T1:.....
a760: 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53 ..pioSendPci = S
a770: 43 41 52 44 5f 50 43 49 5f 54 31 3b 0a 0a 09 09 CARD_PCI_T1;....
a780: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 ....break;......
a790: 64 65 66 61 75 6c 74 3a 0a 09 09 09 09 09 09 43 default:.......C
a7a0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
a7b0: 54 46 28 22 49 6e 76 61 6c 69 64 20 70 72 6f 74 TF("Invalid prot
a7c0: 6f 63 6f 6c 20 66 6f 75 6e 64 2c 20 62 75 74 20 ocol found, but
a7d0: 74 6f 6f 20 6c 61 74 65 20 74 6f 20 64 6f 20 61 too late to do a
a7e0: 6e 79 74 68 69 6e 67 20 61 62 6f 75 74 20 69 74 nything about it
a7f0: 20 6e 6f 77 20 2d 2d 20 74 72 79 69 6e 67 20 61 now -- trying a
a800: 6e 79 77 61 79 2e 22 29 3b 0a 0a 09 09 09 09 09 nyway.");.......
a810: 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 .break;.....}...
a820: 09 09 09 2f 2a 20 52 65 2d 65 73 74 61 62 6c 69 .../* Re-establi
a830: 73 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 sh transaction,
a840: 69 66 20 69 74 20 77 61 73 20 70 72 65 73 65 6e if it was presen
a850: 74 20 2a 2f 0a 09 09 09 09 69 66 20 28 73 6c 6f t */.....if (slo
a860: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 t->transaction_d
a870: 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09 09 epth > 0) {.....
a880: 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 .slot->transacti
a890: 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 09 09 09 09 on_depth--;.....
a8a0: 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 .slot->transacti
a8b0: 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 on_need_hw_lock
a8c0: 3d 20 31 3b 0a 09 09 09 09 09 63 61 63 6b 65 79 = 1;......cackey
a8d0: 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 _begin_transacti
a8e0: 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09 09 09 7d 0a on(slot);.....}.
a8f0: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
a900: 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 G_PRINTF("Reset
a910: 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 72 successful, retr
a920: 61 6e 73 6d 69 74 74 69 6e 67 22 29 3b 0a 0a 09 ansmitting");...
a930: 09 09 09 72 65 63 76 5f 6c 65 6e 20 3d 20 73 69 ...recv_len = si
a940: 7a 65 6f 66 28 72 65 63 76 5f 62 75 66 29 3b 0a zeof(recv_buf);.
a950: 09 09 09 09 73 63 61 72 64 5f 78 6d 69 74 5f 72 ....scard_xmit_r
a960: 65 74 20 3d 20 53 43 61 72 64 54 72 61 6e 73 6d et = SCardTransm
a970: 69 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 it(slot->pcsc_ca
a980: 72 64 2c 20 70 69 6f 53 65 6e 64 50 63 69 2c 20 rd, pioSendPci,
a990: 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69 74 5f 6c xmit_buf, xmit_l
a9a0: 65 6e 2c 20 4e 55 4c 4c 2c 20 72 65 63 76 5f 62 en, NULL, recv_b
a9b0: 75 66 2c 20 26 72 65 63 76 5f 6c 65 6e 29 3b 0a uf, &recv_len);.
a9c0: 0a 09 09 09 09 69 66 20 28 73 63 61 72 64 5f 78 .....if (scard_x
a9d0: 6d 69 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44 mit_ret != SCARD
a9e0: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 _S_SUCCESS) {...
a9f0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
aa00: 50 52 49 4e 54 46 28 22 52 65 74 72 61 6e 73 6d PRINTF("Retransm
aa10: 69 74 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 it failed, retur
aa20: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20 ning in failure
aa30: 61 66 74 65 72 20 64 69 73 63 6f 6e 6e 65 63 74 after disconnect
aa40: 69 6e 67 20 74 68 65 20 63 61 72 64 20 28 53 43 ing the card (SC
aa50: 61 72 64 54 72 61 6e 73 6d 69 74 20 3d 20 25 73 ardTransmit = %s
aa60: 2f 25 6c 69 29 22 2c 20 43 41 43 4b 45 59 5f 44 /%li)", CACKEY_D
aa70: 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 EBUG_FUNC_SCARDE
aa80: 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f RR_TO_STR(scard_
aa90: 78 6d 69 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 xmit_ret), (long
aaa0: 29 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 ) scard_xmit_ret
aab0: 29 3b 0a 0a 09 09 09 09 09 53 43 61 72 64 44 69 );.......SCardDi
aac0: 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 sconnect(slot->p
aad0: 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f csc_card, SCARD_
aae0: 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 09 09 LEAVE_CARD);....
aaf0: 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 ..slot->pcsc_car
ab00: 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b d_connected = 0;
ab10: 0a 0a 09 09 09 09 09 2f 2a 20 45 6e 64 20 53 6d ......./* End Sm
ab20: 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 artcard Transact
ab30: 69 6f 6e 20 2a 2f 0a 09 09 09 09 09 73 6c 6f 74 ion */......slot
ab40: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 ->transaction_de
ab50: 70 74 68 20 3d 20 31 3b 0a 09 09 09 09 09 63 61 pth = 1;......ca
ab60: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 ckey_end_transac
ab70: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 tion(slot);.....
ab80: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f ..return(CACKEY_
ab90: 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 PCSC_E_TOKENABSE
aba0: 4e 54 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 NT);.....}....}
abb0: 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45 else {.....CACKE
abc0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
abd0: 44 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20 63 61 Disconnecting ca
abe0: 72 64 22 29 3b 0a 0a 09 09 09 09 53 43 61 72 64 rd");......SCard
abf0: 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d Disconnect(slot-
ac00: 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 >pcsc_card, SCAR
ac10: 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 D_LEAVE_CARD);..
ac20: 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 ...slot->pcsc_ca
ac30: 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 rd_connected = 0
ac40: 3b 0a 0a 09 09 09 09 2f 2a 20 45 6e 64 20 53 6d ;....../* End Sm
ac50: 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 artcard Transact
ac60: 69 6f 6e 20 2a 2f 0a 09 09 09 09 73 6c 6f 74 2d ion */.....slot-
ac70: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 >transaction_dep
ac80: 74 68 20 3d 20 31 3b 0a 09 09 09 09 63 61 63 6b th = 1;.....cack
ac90: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 ey_end_transacti
aca0: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 43 on(slot);......C
acb0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
acc0: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e TF("Returning in
acd0: 20 66 61 69 6c 75 72 65 22 29 3b 0a 09 09 09 09 failure");.....
ace0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 return(CACKEY_PC
acf0: 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 SC_E_TOKENABSENT
ad00: 29 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 );....}...} else
ad10: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 {....CACKEY_DEB
ad20: 55 47 5f 50 52 49 4e 54 46 28 22 44 69 73 63 6f UG_PRINTF("Disco
ad30: 6e 6e 65 63 74 69 6e 67 20 63 61 72 64 22 29 3b nnecting card");
ad40: 0a 0a 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e .....SCardDiscon
ad50: 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f nect(slot->pcsc_
ad60: 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 card, SCARD_LEAV
ad70: 45 5f 43 41 52 44 29 3b 0a 09 09 09 73 6c 6f 74 E_CARD);....slot
ad80: 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e ->pcsc_card_conn
ad90: 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09 2f ected = 0;...../
ada0: 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 * End Smartcard
adb0: 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 Transaction */..
adc0: 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 ..slot->transact
add0: 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a 09 ion_depth = 1;..
ade0: 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 ..cackey_end_tra
adf0: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a nsaction(slot);.
ae00: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
ae10: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
ae20: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b ng in failure");
ae30: 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 ....return(CACKE
ae40: 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 Y_PCSC_E_TOKENAB
ae50: 53 45 4e 54 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 SENT);...}..}...
ae60: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
ae70: 4e 54 42 55 46 28 22 52 65 74 75 72 6e 65 64 20 NTBUF("Returned
ae80: 56 61 6c 75 65 3a 22 2c 20 72 65 63 76 5f 62 75 Value:", recv_bu
ae90: 66 2c 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 f, recv_len);...
aea0: 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20 32 if (recv_len < 2
aeb0: 29 20 7b 0a 09 09 2f 2a 20 4d 69 6e 69 6d 61 6c ) {.../* Minimal
aec0: 20 72 65 73 70 6f 6e 73 65 20 6c 65 6e 67 74 68 response length
aed0: 20 69 73 20 32 20 62 79 74 65 73 2c 20 72 65 74 is 2 bytes, ret
aee0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 urning in failur
aef0: 65 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 e */...CACKEY_DE
af00: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 70 BUG_PRINTF("Resp
af10: 6f 6e 73 65 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 onse too small,
af20: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 returning in fai
af30: 6c 75 72 65 20 28 72 65 63 76 5f 6c 65 6e 20 3d lure (recv_len =
af40: 20 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 %lu)", (unsigne
af50: 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e d long) recv_len
af60: 29 3b 0a 0a 09 09 2f 2a 20 45 6e 64 20 53 6d 61 );..../* End Sma
af70: 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 rtcard Transacti
af80: 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 on */...cackey_e
af90: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 nd_transaction(s
afa0: 6c 6f 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 lot);....return(
afb0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 CACKEY_PCSC_E_GE
afc0: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 NERIC);..}.../*
afd0: 44 65 74 65 72 6d 69 6e 65 20 72 65 73 75 6c 74 Determine result
afe0: 20 63 6f 64 65 20 2a 2f 0a 09 6d 61 6a 6f 72 5f code */..major_
aff0: 72 63 20 3d 20 72 65 63 76 5f 62 75 66 5b 72 65 rc = recv_buf[re
b000: 63 76 5f 6c 65 6e 20 2d 20 32 5d 3b 0a 09 6d 69 cv_len - 2];..mi
b010: 6e 6f 72 5f 72 63 20 3d 20 72 65 63 76 5f 62 75 nor_rc = recv_bu
b020: 66 5b 72 65 63 76 5f 6c 65 6e 20 2d 20 31 5d 3b f[recv_len - 1];
b030: 0a 09 69 66 20 28 72 65 73 70 63 6f 64 65 29 20 ..if (respcode)
b040: 7b 0a 09 09 2a 72 65 73 70 63 6f 64 65 20 3d 20 {...*respcode =
b050: 28 6d 61 6a 6f 72 5f 72 63 20 3c 3c 20 38 29 20 (major_rc << 8)
b060: 7c 20 6d 69 6e 6f 72 5f 72 63 3b 0a 09 7d 0a 0a | minor_rc;..}..
b070: 09 2f 2a 20 41 64 6a 75 73 74 20 6d 65 73 73 61 ./* Adjust messa
b080: 67 65 20 62 75 66 66 65 72 20 2a 2f 0a 09 72 65 ge buffer */..re
b090: 63 76 5f 6c 65 6e 20 2d 3d 20 32 3b 0a 0a 09 2f cv_len -= 2;.../
b0a0: 2a 20 41 64 64 20 62 79 74 65 73 20 74 6f 20 72 * Add bytes to r
b0b0: 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 09 eturn value */..
b0c0: 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e tmp_respdata_len
b0d0: 20 3d 20 30 3b 0a 09 69 66 20 28 72 65 73 70 64 = 0;..if (respd
b0e0: 61 74 61 20 26 26 20 72 65 73 70 64 61 74 61 5f ata && respdata_
b0f0: 6c 65 6e 29 20 7b 0a 09 09 74 6d 70 5f 72 65 73 len) {...tmp_res
b100: 70 64 61 74 61 5f 6c 65 6e 20 3d 20 2a 72 65 73 pdata_len = *res
b110: 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 62 79 pdata_len;....by
b120: 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 2a 72 tes_to_copy = *r
b130: 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 espdata_len;....
b140: 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20 62 if (recv_len < b
b150: 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a ytes_to_copy) {.
b160: 09 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 ...bytes_to_copy
b170: 20 3d 20 72 65 63 76 5f 6c 65 6e 3b 0a 09 09 7d = recv_len;...}
b180: 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
b190: 5f 50 52 49 4e 54 46 28 22 43 6f 70 79 69 6e 67 _PRINTF("Copying
b1a0: 20 25 6c 75 20 62 79 74 65 73 20 74 6f 20 74 68 %lu bytes to th
b1b0: 65 20 62 75 66 66 65 72 20 28 72 65 63 76 27 64 e buffer (recv'd
b1c0: 20 25 6c 75 20 62 79 74 65 73 2c 20 62 75 74 20 %lu bytes, but
b1d0: 6f 6e 6c 79 20 25 6c 75 20 62 79 74 65 73 20 6c only %lu bytes l
b1e0: 65 66 74 20 69 6e 20 6f 75 72 20 62 75 66 66 65 eft in our buffe
b1f0: 72 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c r)", (unsigned l
b200: 6f 6e 67 29 20 62 79 74 65 73 5f 74 6f 5f 63 6f ong) bytes_to_co
b210: 70 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f py, (unsigned lo
b220: 6e 67 29 20 72 65 63 76 5f 6c 65 6e 2c 20 28 75 ng) recv_len, (u
b230: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 72 nsigned long) *r
b240: 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 0a 09 espdata_len);...
b250: 09 6d 65 6d 63 70 79 28 72 65 73 70 64 61 74 61 .memcpy(respdata
b260: 2c 20 72 65 63 76 5f 62 75 66 2c 20 62 79 74 65 , recv_buf, byte
b270: 73 5f 74 6f 5f 63 6f 70 79 29 3b 0a 09 09 72 65 s_to_copy);...re
b280: 73 70 64 61 74 61 20 2b 3d 20 62 79 74 65 73 5f spdata += bytes_
b290: 74 6f 5f 63 6f 70 79 3b 0a 0a 09 09 2a 72 65 73 to_copy;....*res
b2a0: 70 64 61 74 61 5f 6c 65 6e 20 3d 20 62 79 74 65 pdata_len = byte
b2b0: 73 5f 74 6f 5f 63 6f 70 79 3b 0a 09 09 74 6d 70 s_to_copy;...tmp
b2c0: 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 2d 3d _respdata_len -=
b2d0: 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a bytes_to_copy;.
b2e0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 .} else {...if (
b2f0: 72 65 63 76 5f 6c 65 6e 20 21 3d 20 30 29 20 7b recv_len != 0) {
b300: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
b310: 5f 50 52 49 4e 54 46 28 22 54 68 72 6f 77 69 6e _PRINTF("Throwin
b320: 67 20 61 77 61 79 20 25 6c 75 20 62 79 74 65 73 g away %lu bytes
b330: 2c 20 6e 6f 77 68 65 72 65 20 74 6f 20 70 75 74 , nowhere to put
b340: 20 74 68 65 6d 21 22 2c 20 28 75 6e 73 69 67 6e them!", (unsign
b350: 65 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65 ed long) recv_le
b360: 6e 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 n);...}..}...if
b370: 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d 20 30 78 36 (major_rc == 0x6
b380: 31 29 20 7b 0a 09 09 2f 2a 20 57 65 20 6e 65 65 1) {.../* We nee
b390: 64 20 74 6f 20 52 45 41 44 20 2a 2f 0a 09 09 43 d to READ */...C
b3a0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
b3b0: 54 46 28 22 42 75 66 66 65 72 20 72 65 61 64 20 TF("Buffer read
b3c0: 72 65 71 75 69 72 65 64 22 29 3b 0a 0a 09 09 69 required");....i
b3d0: 66 20 28 6d 69 6e 6f 72 5f 72 63 20 3d 3d 20 30 f (minor_rc == 0
b3e0: 78 30 30 29 20 7b 0a 09 09 09 6d 69 6e 6f 72 5f x00) {....minor_
b3f0: 72 63 20 3d 20 43 41 43 4b 45 59 5f 41 50 44 55 rc = CACKEY_APDU
b400: 5f 4d 54 55 3b 0a 09 09 7d 0a 0a 09 09 70 63 73 _MTU;...}....pcs
b410: 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20 3d 20 c_getresp_ret =
b420: 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 cackey_send_apdu
b430: 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 (slot, GSCIS_CLA
b440: 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49 SS_ISO7816, GSCI
b450: 53 5f 49 4e 53 54 52 5f 47 45 54 5f 52 45 53 50 S_INSTR_GET_RESP
b460: 4f 4e 53 45 2c 20 30 78 30 30 2c 20 30 78 30 30 ONSE, 0x00, 0x00
b470: 2c 20 30 2c 20 4e 55 4c 4c 2c 20 6d 69 6e 6f 72 , 0, NULL, minor
b480: 5f 72 63 2c 20 72 65 73 70 63 6f 64 65 2c 20 72 _rc, respcode, r
b490: 65 73 70 64 61 74 61 2c 20 26 74 6d 70 5f 72 65 espdata, &tmp_re
b4a0: 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 0a 09 09 spdata_len);....
b4b0: 69 66 20 28 70 63 73 63 5f 67 65 74 72 65 73 70 if (pcsc_getresp
b4c0: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 _ret != CACKEY_P
b4d0: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 CSC_S_OK) {....C
b4e0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
b4f0: 54 46 28 22 42 75 66 66 65 72 20 72 65 61 64 20 TF("Buffer read
b500: 66 61 69 6c 65 64 21 20 20 52 65 74 75 72 6e 69 failed! Returni
b510: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b ng in failure");
b520: 0a 0a 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 ...../* End Smar
b530: 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f tcard Transactio
b540: 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 65 n */....cackey_e
b550: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 nd_transaction(s
b560: 6c 6f 74 29 3b 0a 0a 09 09 09 69 66 20 28 70 63 lot);.....if (pc
b570: 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20 3d sc_getresp_ret =
b580: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f = CACKEY_PCSC_E_
b590: 52 45 54 52 59 29 20 7b 0a 09 09 09 09 72 65 74 RETRY) {.....ret
b5a0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f urn(CACKEY_PCSC_
b5b0: 45 5f 52 45 54 52 59 29 3b 0a 09 09 09 7d 0a 0a E_RETRY);....}..
b5c0: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 ...return(CACKEY
b5d0: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 _PCSC_E_GENERIC)
b5e0: 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72 65 73 ;...}....if (res
b5f0: 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 09 09 pdata_len) {....
b600: 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 2b 3d *respdata_len +=
b610: 20 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 tmp_respdata_le
b620: 6e 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 45 6e 64 n;...}..../* End
b630: 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 Smartcard Trans
b640: 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b action */...cack
b650: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 ey_end_transacti
b660: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 43 41 43 on(slot);....CAC
b670: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
b680: 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 ("Returning in s
b690: 75 63 63 65 73 73 20 28 62 75 66 66 65 72 20 72 uccess (buffer r
b6a0: 65 61 64 20 63 6f 6d 70 6c 65 74 65 29 22 29 3b ead complete)");
b6b0: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 ...return(CACKEY
b6c0: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a _PCSC_S_OK);..}.
b6d0: 0a 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 ../* End Smartca
b6e0: 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a rd Transaction *
b6f0: 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 /..cackey_end_tr
b700: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b ansaction(slot);
b710: 0a 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 72 63 20 ...if (major_rc
b720: 3d 3d 20 30 78 39 30 29 20 7b 0a 09 09 2f 2a 20 == 0x90) {.../*
b730: 53 75 63 63 65 73 73 20 2a 2f 0a 09 09 43 41 43 Success */...CAC
b740: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
b750: 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 ("Returning in s
b760: 75 63 63 65 73 73 20 28 6d 61 6a 6f 72 5f 72 63 uccess (major_rc
b770: 20 3d 20 30 78 39 30 29 22 29 3b 0a 0a 09 09 72 = 0x90)");....r
b780: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 eturn(CACKEY_PCS
b790: 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 0a 09 43 C_S_OK);..}....C
b7a0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
b7b0: 54 46 28 22 41 50 44 55 20 52 65 74 75 72 6e 65 TF("APDU Returne
b7c0: 64 20 61 6e 20 65 72 72 6f 72 2c 20 72 65 74 75 d an error, retu
b7d0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 rning in failure
b7e0: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 ");...return(CAC
b7f0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 KEY_PCSC_E_GENER
b800: 49 43 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 IC);.}../*. * SY
b810: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 73 73 NPOSIS. * ss
b820: 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 67 65 74 ize_t cackey_get
b830: 5f 64 61 74 61 28 73 74 72 75 63 74 20 63 61 63 _data(struct cac
b840: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 key_slot *slot,
b850: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 unsigned char *b
b860: 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 63 6f uffer, size_t co
b870: 75 6e 74 2c 20 2e 2e 2e 2e 0a 20 2a 0a 20 2a 20 unt, ..... *. *
b880: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 ARGUMENTS. *
b890: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 struct cackey_s
b8a0: 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 lot *slot. *
b8b0: 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e Slot to sen
b8c0: 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a d commands to. *
b8d0: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 . * unsigned
b8e0: 20 63 68 61 72 20 2a 62 75 66 66 65 72 0a 20 2a char *buffer. *
b8f0: 20 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 42 [OUT] B
b900: 75 66 66 65 72 0a 20 2a 0a 20 2a 20 20 20 20 20 uffer. *. *
b910: 73 69 7a 65 5f 74 20 63 6f 75 6e 74 0a 20 2a 20 size_t count. *
b920: 20 20 20 20 20 20 20 20 4e 75 6d 62 65 72 20 6f Number o
b930: 66 20 62 79 74 65 73 20 74 6f 20 61 74 74 65 6d f bytes to attem
b940: 70 74 20 74 6f 20 72 65 61 64 0a 20 2a 0a 20 2a pt to read. *. *
b950: 20 20 20 20 20 73 69 7a 65 5f 74 20 69 6e 69 74 size_t init
b960: 69 61 6c 5f 6f 66 66 73 65 74 0a 20 2a 20 20 20 ial_offset. *
b970: 20 20 20 20 20 20 53 70 65 63 69 66 79 20 74 68 Specify th
b980: 65 20 6f 66 66 73 65 74 20 74 6f 20 62 65 67 69 e offset to begi
b990: 6e 20 74 68 65 20 72 65 61 64 20 66 72 6f 6d 0a n the read from.
b9a0: 20 2a 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 *. *. * RETURN
b9b0: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 54 68 69 VALUE. * Thi
b9c0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 s function retur
b9d0: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 ns the number of
b9e0: 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 bytes actually
b9f0: 72 65 61 64 2c 20 6f 72 20 2d 31 20 6f 6e 20 65 read, or -1 on e
ba00: 72 72 6f 72 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 rror.. *. * NOTE
ba10: 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a S. * None. *
ba20: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a . */.static ssiz
ba30: 65 5f 74 20 63 61 63 6b 65 79 5f 67 65 74 5f 64 e_t cackey_get_d
ba40: 61 74 61 28 73 74 72 75 63 74 20 63 61 63 6b 65 ata(struct cacke
ba50: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e y_slot *slot, un
ba60: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 signed char *buf
ba70: 66 65 72 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e fer, size_t coun
ba80: 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 t, unsigned char
ba90: 20 6f 69 64 5b 33 5d 29 20 7b 0a 09 75 6e 73 69 oid[3]) {..unsi
baa0: 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 gned char *buffe
bab0: 72 5f 70 3b 0a 09 73 69 7a 65 5f 74 20 69 6e 69 r_p;..size_t ini
bac0: 74 5f 63 6f 75 6e 74 3b 0a 0a 09 73 69 7a 65 5f t_count;...size_
bad0: 74 20 6f 66 66 73 65 74 20 3d 20 30 2c 20 6d 61 t offset = 0, ma
bae0: 78 5f 6f 66 66 73 65 74 2c 20 6d 61 78 5f 63 6f x_offset, max_co
baf0: 75 6e 74 2c 20 73 69 7a 65 3b 0a 09 75 6e 73 69 unt, size;..unsi
bb00: 67 6e 65 64 20 63 68 61 72 20 63 6d 64 5b 5d 20 gned char cmd[]
bb10: 3d 20 7b 30 78 35 43 2c 20 30 78 30 33 2c 20 30 = {0x5C, 0x03, 0
bb20: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 7d x00, 0x00, 0x00}
bb30: 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70 ;..uint16_t resp
bb40: 63 6f 64 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f code;..int send_
bb50: 72 65 74 3b 0a 09 69 6e 74 20 69 64 78 3b 0a 0a ret;..int idx;..
bb60: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
bb70: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
bb80: 0a 0a 09 69 6e 69 74 5f 63 6f 75 6e 74 20 3d 20 ...init_count =
bb90: 63 6f 75 6e 74 3b 0a 0a 09 6d 61 78 5f 6f 66 66 count;...max_off
bba0: 73 65 74 20 3d 20 63 6f 75 6e 74 3b 0a 09 6d 61 set = count;..ma
bbb0: 78 5f 63 6f 75 6e 74 20 3d 20 43 41 43 4b 45 59 x_count = CACKEY
bbc0: 5f 41 50 44 55 5f 4d 54 55 3b 0a 0a 09 63 6d 64 _APDU_MTU;...cmd
bbd0: 5b 32 5d 20 3d 20 6f 69 64 5b 30 5d 3b 0a 09 63 [2] = oid[0];..c
bbe0: 6d 64 5b 33 5d 20 3d 20 6f 69 64 5b 31 5d 3b 0a md[3] = oid[1];.
bbf0: 09 63 6d 64 5b 34 5d 20 3d 20 6f 69 64 5b 32 5d .cmd[4] = oid[2]
bc00: 3b 0a 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 ;...send_ret = c
bc10: 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 ackey_send_apdu(
bc20: 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 slot, GSCIS_CLAS
bc30: 53 5f 49 53 4f 37 38 31 36 2c 20 4e 49 53 54 53 S_ISO7816, NISTS
bc40: 50 38 30 30 5f 37 33 5f 33 5f 49 4e 53 54 52 5f P800_73_3_INSTR_
bc50: 47 45 54 5f 44 41 54 41 2c 20 30 78 33 46 2c 20 GET_DATA, 0x3F,
bc60: 30 78 46 46 2c 20 73 69 7a 65 6f 66 28 63 6d 64 0xFF, sizeof(cmd
bc70: 29 2c 20 63 6d 64 2c 20 63 6f 75 6e 74 2c 20 26 ), cmd, count, &
bc80: 72 65 73 70 63 6f 64 65 2c 20 62 75 66 66 65 72 respcode, buffer
bc90: 2c 20 26 63 6f 75 6e 74 29 3b 0a 0a 09 69 66 20 , &count);...if
bca0: 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43 (send_ret == CAC
bcb0: 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 KEY_PCSC_E_RETRY
bcc0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
bcd0: 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20 UG_PRINTF("ADPU
bce0: 53 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 2c 20 Sending failed,
bcf0: 72 65 74 72 79 69 6e 67 20 72 65 61 64 20 62 75 retrying read bu
bd00: 66 66 65 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 ffer");....retur
bd10: 6e 28 63 61 63 6b 65 79 5f 67 65 74 5f 64 61 74 n(cackey_get_dat
bd20: 61 28 73 6c 6f 74 2c 20 62 75 66 66 65 72 2c 20 a(slot, buffer,
bd30: 69 6e 69 74 5f 63 6f 75 6e 74 2c 20 6f 69 64 29 init_count, oid)
bd40: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 65 6e 64 );..}...if (send
bd50: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 _ret != CACKEY_P
bd60: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 69 66 CSC_S_OK) {...if
bd70: 20 28 72 65 73 70 63 6f 64 65 20 3d 3d 20 30 78 (respcode == 0x
bd80: 36 41 38 36 29 20 7b 0a 2f 2a 20 58 58 58 20 54 6A86) {./* XXX T
bd90: 4f 44 4f 20 50 49 56 20 2a 2f 0a 09 09 7d 0a 0a ODO PIV */...}..
bda0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
bdb0: 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 73 65 RINTF("cackey_se
bdc0: 6e 64 5f 61 70 64 75 28 29 20 66 61 69 6c 65 64 nd_apdu() failed
bdd0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 , returning in f
bde0: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 ailure");....ret
bdf0: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 6f 66 urn(-1);..}...of
be00: 66 73 65 74 20 2b 3d 20 63 6f 75 6e 74 3b 0a 0a fset += count;..
be10: 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41 #ifdef CACKEY_PA
be20: 52 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20 RANOID.# ifdef
be30: 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 _POSIX_SSIZE_MAX
be40: 0a 09 69 66 20 28 6f 66 66 73 65 74 20 3e 20 5f ..if (offset > _
be50: 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29 POSIX_SSIZE_MAX)
be60: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
be70: 47 5f 50 52 49 4e 54 46 28 22 4f 66 66 73 65 74 G_PRINTF("Offset
be80: 20 65 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d exceeds maximum
be90: 20 76 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e value, returnin
bea0: 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d g in failure. (m
beb0: 61 78 20 3d 20 25 6c 69 2c 20 6f 66 66 73 65 74 ax = %li, offset
bec0: 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 = %lu)", (long)
bed0: 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 _POSIX_SSIZE_MA
bee0: 58 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e X, (unsigned lon
bef0: 67 29 20 6f 66 66 73 65 74 29 3b 0a 0a 09 09 72 g) offset);....r
bf00: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 eturn(-1);..}.#
bf10: 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09 endif.#endif...
bf20: 69 66 20 28 6f 66 66 73 65 74 20 3c 20 32 29 20 if (offset < 2)
bf30: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
bf40: 5f 50 52 49 4e 54 46 28 22 41 50 44 55 20 47 45 _PRINTF("APDU GE
bf50: 54 20 44 41 54 41 20 72 65 74 75 72 6e 65 64 20 T DATA returned
bf60: 25 6c 75 20 62 79 74 65 73 2c 20 77 68 69 63 68 %lu bytes, which
bf70: 20 69 73 20 74 6f 6f 20 73 68 6f 72 74 20 66 6f is too short fo
bf80: 72 20 61 20 42 45 52 2d 54 4c 56 20 72 65 73 70 r a BER-TLV resp
bf90: 6f 6e 73 65 22 2c 20 28 75 6e 73 69 67 6e 65 64 onse", (unsigned
bfa0: 20 6c 6f 6e 67 29 20 6f 66 66 73 65 74 29 3b 0a long) offset);.
bfb0: 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 ...return(-1);..
bfc0: 7d 0a 0a 09 62 75 66 66 65 72 5f 70 20 3d 20 62 }...buffer_p = b
bfd0: 75 66 66 65 72 3b 0a 09 69 66 20 28 2a 62 75 66 uffer;..if (*buf
bfe0: 66 65 72 5f 70 20 21 3d 20 30 78 35 33 29 20 7b fer_p != 0x53) {
bff0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
c000: 50 52 49 4e 54 46 28 22 41 50 44 55 20 47 45 54 PRINTF("APDU GET
c010: 20 44 41 54 41 20 64 69 64 20 6e 6f 74 20 72 65 DATA did not re
c020: 74 75 72 6e 20 61 20 42 45 52 2d 54 4c 56 20 77 turn a BER-TLV w
c030: 69 74 68 20 74 61 67 20 35 33 2e 20 20 54 61 67 ith tag 53. Tag
c040: 20 3d 20 25 30 32 78 22 2c 20 28 75 6e 73 69 67 = %02x", (unsig
c050: 6e 65 64 20 69 6e 74 29 20 2a 62 75 66 66 65 72 ned int) *buffer
c060: 5f 70 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d _p);....return(-
c070: 31 29 3b 0a 09 7d 0a 09 62 75 66 66 65 72 5f 70 1);..}..buffer_p
c080: 2b 2b 3b 0a 0a 09 69 66 20 28 28 2a 62 75 66 66 ++;...if ((*buff
c090: 65 72 5f 70 20 26 20 30 78 38 30 29 20 3d 3d 20 er_p & 0x80) ==
c0a0: 30 78 38 30 29 20 7b 0a 09 09 73 69 7a 65 20 3d 0x80) {...size =
c0b0: 20 30 3b 0a 09 09 69 64 78 20 3d 20 28 2a 62 75 0;...idx = (*bu
c0c0: 66 66 65 72 5f 70 20 26 20 30 78 37 66 29 3b 0a ffer_p & 0x7f);.
c0d0: 0a 09 09 69 66 20 28 28 28 62 75 66 66 65 72 5f ...if (((buffer_
c0e0: 70 20 2d 20 62 75 66 66 65 72 29 20 2b 20 69 64 p - buffer) + id
c0f0: 78 29 20 3e 3d 20 6f 66 66 73 65 74 29 20 7b 0a x) >= offset) {.
c100: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
c110: 50 52 49 4e 54 46 28 22 4d 61 6c 66 6f 72 6d 65 PRINTF("Malforme
c120: 64 20 42 45 52 20 76 61 6c 75 65 20 2d 2d 20 6e d BER value -- n
c130: 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 ot enough bytes
c140: 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 72 65 61 available to rea
c150: 64 20 6c 65 6e 67 74 68 22 29 3b 0a 0a 09 09 09 d length");.....
c160: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a return(-1);...}.
c170: 0a 09 09 66 6f 72 20 28 3b 20 69 64 78 20 3e 20 ...for (; idx >
c180: 30 3b 20 69 64 78 2d 2d 29 20 7b 0a 09 09 09 62 0; idx--) {....b
c190: 75 66 66 65 72 5f 70 2b 2b 3b 0a 09 09 09 73 69 uffer_p++;....si
c1a0: 7a 65 20 3c 3c 3d 20 38 3b 0a 09 09 09 73 69 7a ze <<= 8;....siz
c1b0: 65 20 7c 3d 20 2a 62 75 66 66 65 72 5f 70 3b 0a e |= *buffer_p;.
c1c0: 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 ..}..} else {...
c1d0: 73 69 7a 65 20 3d 20 2a 62 75 66 66 65 72 5f 70 size = *buffer_p
c1e0: 3b 0a 09 7d 0a 09 62 75 66 66 65 72 5f 70 2b 2b ;..}..buffer_p++
c1f0: 3b 0a 0a 09 69 66 20 28 28 28 62 75 66 66 65 72 ;...if (((buffer
c200: 5f 70 20 2d 20 62 75 66 66 65 72 29 20 2b 20 73 _p - buffer) + s
c210: 69 7a 65 29 20 21 3d 20 6f 66 66 73 65 74 29 20 ize) != offset)
c220: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
c230: 5f 50 52 49 4e 54 46 28 22 45 6e 74 69 72 65 20 _PRINTF("Entire
c240: 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 63 6f buffer is not co
c250: 6e 73 75 6d 65 64 21 22 29 3b 0a 0a 09 09 69 66 nsumed!");....if
c260: 20 28 28 28 62 75 66 66 65 72 5f 70 20 2d 20 62 (((buffer_p - b
c270: 75 66 66 65 72 29 20 2b 20 73 69 7a 65 29 20 3e uffer) + size) >
c280: 20 6f 66 66 73 65 74 29 20 7b 0a 09 09 09 43 41 offset) {....CA
c290: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
c2a0: 46 28 22 45 6e 63 6f 64 65 64 20 73 69 7a 65 20 F("Encoded size
c2b0: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 is greater than
c2c0: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 64 61 the amount of da
c2d0: 74 61 20 72 65 61 64 2c 20 64 72 6f 70 70 69 6e ta read, droppin
c2e0: 67 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 g");.....return(
c2f0: 2d 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 65 -1);...}..}...me
c300: 6d 6d 6f 76 65 28 62 75 66 66 65 72 2c 20 62 75 mmove(buffer, bu
c310: 66 66 65 72 5f 70 2c 20 73 69 7a 65 29 3b 0a 0a ffer_p, size);..
c320: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
c330: 49 4e 54 42 55 46 28 22 47 45 54 20 44 41 54 41 INTBUF("GET DATA
c340: 20 72 65 73 75 6c 74 22 2c 20 62 75 66 66 65 72 result", buffer
c350: 2c 20 73 69 7a 65 29 3b 0a 0a 09 43 41 43 4b 45 , size);...CACKE
c360: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
c370: 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 Returning in suc
c380: 63 65 73 73 2c 20 72 65 61 64 20 25 6c 75 20 62 cess, read %lu b
c390: 79 74 65 73 22 2c 20 28 75 6e 73 69 67 6e 65 64 ytes", (unsigned
c3a0: 20 6c 6f 6e 67 29 20 73 69 7a 65 29 3b 0a 0a 09 long) size);...
c3b0: 72 65 74 75 72 6e 28 73 69 7a 65 29 3b 0a 7d 0a return(size);.}.
c3c0: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a ./*. * SYNPOSIS.
c3d0: 20 2a 20 20 20 20 20 73 73 69 7a 65 5f 74 20 63 * ssize_t c
c3e0: 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65 ackey_read_buffe
c3f0: 72 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f r(struct cackey_
c400: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 slot *slot, unsi
c410: 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 gned char *buffe
c420: 72 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c r, size_t count,
c430: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 unsigned char t
c440: 5f 6f 72 5f 76 2c 20 73 69 7a 65 5f 74 20 69 6e _or_v, size_t in
c450: 69 74 69 61 6c 5f 6f 66 66 73 65 74 29 3b 0a 20 itial_offset);.
c460: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 *. * ARGUMENTS.
c470: 2a 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63 * struct cac
c480: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 key_slot *slot.
c490: 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 * Slot t
c4a0: 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 o send commands
c4b0: 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 to. *. * uns
c4c0: 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 igned char *buff
c4d0: 65 72 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f er. * [O
c4e0: 55 54 5d 20 42 75 66 66 65 72 0a 20 2a 0a 20 2a UT] Buffer. *. *
c4f0: 20 20 20 20 20 73 69 7a 65 5f 74 20 63 6f 75 6e size_t coun
c500: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 4e 75 6d t. * Num
c510: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 ber of bytes to
c520: 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64 0a attempt to read.
c530: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e *. * unsign
c540: 65 64 20 63 68 61 72 20 74 5f 6f 72 5f 76 0a 20 ed char t_or_v.
c550: 2a 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 * Select
c560: 20 74 68 65 20 54 2d 62 75 66 66 65 72 20 28 30 the T-buffer (0
c570: 31 29 20 6f 72 20 56 2d 62 75 66 66 65 72 20 28 1) or V-buffer (
c580: 30 32 29 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 02) to read from
c590: 2e 20 20 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 . . *. * si
c5a0: 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66 ze_t initial_off
c5b0: 73 65 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 set. * S
c5c0: 70 65 63 69 66 79 20 74 68 65 20 6f 66 66 73 65 pecify the offse
c5d0: 74 20 74 6f 20 62 65 67 69 6e 20 74 68 65 20 72 t to begin the r
c5e0: 65 61 64 20 66 72 6f 6d 0a 20 2a 0a 20 2a 0a 20 ead from. *. *.
c5f0: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 * RETURN VALUE.
c600: 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 * This funct
c610: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 ion returns the
c620: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 number of bytes
c630: 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2c 20 6f actually read, o
c640: 72 20 2d 31 20 6f 6e 20 65 72 72 6f 72 2e 0a 20 r -1 on error..
c650: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 *. * NOTES. *
c660: 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 None. *. */.st
c670: 61 74 69 63 20 73 73 69 7a 65 5f 74 20 63 61 63 atic ssize_t cac
c680: 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 key_read_buffer(
c690: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c struct cackey_sl
c6a0: 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e ot *slot, unsign
c6b0: 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 2c ed char *buffer,
c6c0: 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 75 size_t count, u
c6d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 5f 6f nsigned char t_o
c6e0: 72 5f 76 2c 20 73 69 7a 65 5f 74 20 69 6e 69 74 r_v, size_t init
c6f0: 69 61 6c 5f 6f 66 66 73 65 74 29 20 7b 0a 09 75 ial_offset) {..u
c700: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 69 6e nsigned char *in
c710: 69 74 5f 62 75 66 66 65 72 3b 0a 09 73 69 7a 65 it_buffer;..size
c720: 5f 74 20 69 6e 69 74 5f 63 6f 75 6e 74 3b 0a 09 _t init_count;..
c730: 73 69 7a 65 5f 74 20 69 6e 69 74 5f 69 6e 69 74 size_t init_init
c740: 69 61 6c 5f 6f 66 66 73 65 74 3b 0a 0a 09 73 69 ial_offset;...si
c750: 7a 65 5f 74 20 6f 66 66 73 65 74 20 3d 20 30 2c ze_t offset = 0,
c760: 20 6d 61 78 5f 6f 66 66 73 65 74 2c 20 6d 61 78 max_offset, max
c770: 5f 63 6f 75 6e 74 3b 0a 09 75 6e 73 69 67 6e 65 _count;..unsigne
c780: 64 20 63 68 61 72 20 63 6d 64 5b 32 5d 3b 0a 09 d char cmd[2];..
c790: 75 69 6e 74 31 36 5f 74 20 72 65 73 70 63 6f 64 uint16_t respcod
c7a0: 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 e;..int send_ret
c7b0: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ;...CACKEY_DEBUG
c7c0: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
c7d0: 22 29 3b 0a 0a 09 69 6e 69 74 5f 62 75 66 66 65 ");...init_buffe
c7e0: 72 20 3d 20 62 75 66 66 65 72 3b 0a 09 69 6e 69 r = buffer;..ini
c7f0: 74 5f 63 6f 75 6e 74 20 3d 20 63 6f 75 6e 74 3b t_count = count;
c800: 0a 09 69 6e 69 74 5f 69 6e 69 74 69 61 6c 5f 6f ..init_initial_o
c810: 66 66 73 65 74 20 3d 20 69 6e 69 74 69 61 6c 5f ffset = initial_
c820: 6f 66 66 73 65 74 3b 0a 0a 09 6d 61 78 5f 6f 66 offset;...max_of
c830: 66 73 65 74 20 3d 20 63 6f 75 6e 74 3b 0a 09 6d fset = count;..m
c840: 61 78 5f 63 6f 75 6e 74 20 3d 20 43 41 43 4b 45 ax_count = CACKE
c850: 59 5f 41 50 44 55 5f 4d 54 55 3b 0a 0a 09 69 66 Y_APDU_MTU;...if
c860: 20 28 74 5f 6f 72 5f 76 20 21 3d 20 31 20 26 26 (t_or_v != 1 &&
c870: 20 74 5f 6f 72 5f 76 20 21 3d 20 32 29 20 7b 0a t_or_v != 2) {.
c880: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
c890: 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 54 RINTF("Invalid T
c8a0: 20 6f 72 20 56 20 70 61 72 61 6d 65 74 65 72 20 or V parameter
c8b0: 73 70 65 63 69 66 69 65 64 2c 20 72 65 74 75 72 specified, retur
c8c0: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 ning in failure"
c8d0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 );....return(-1)
c8e0: 3b 0a 09 7d 0a 0a 09 63 6d 64 5b 30 5d 20 3d 20 ;..}...cmd[0] =
c8f0: 74 5f 6f 72 5f 76 3b 0a 0a 09 77 68 69 6c 65 20 t_or_v;...while
c900: 28 31 29 20 7b 0a 09 09 69 66 20 28 6f 66 66 73 (1) {...if (offs
c910: 65 74 20 3e 3d 20 6d 61 78 5f 6f 66 66 73 65 74 et >= max_offset
c920: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 ) {....CACKEY_DE
c930: 42 55 47 5f 50 52 49 4e 54 46 28 22 42 75 66 66 BUG_PRINTF("Buff
c940: 65 72 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65 er too small, re
c950: 74 75 72 6e 69 6e 67 20 77 68 61 74 20 77 65 20 turning what we
c960: 67 6f 74 2e 2e 2e 22 29 3b 0a 0a 09 09 09 62 72 got...");.....br
c970: 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 63 6f 75 6e eak;...}....coun
c980: 74 20 3d 20 6d 61 78 5f 6f 66 66 73 65 74 20 2d t = max_offset -
c990: 20 6f 66 66 73 65 74 3b 0a 09 09 69 66 20 28 63 offset;...if (c
c9a0: 6f 75 6e 74 20 3e 20 6d 61 78 5f 63 6f 75 6e 74 ount > max_count
c9b0: 29 20 7b 0a 09 09 09 63 6f 75 6e 74 20 3d 20 6d ) {....count = m
c9c0: 61 78 5f 63 6f 75 6e 74 3b 0a 09 09 7d 0a 0a 09 ax_count;...}...
c9d0: 09 63 6d 64 5b 31 5d 20 3d 20 63 6f 75 6e 74 3b .cmd[1] = count;
c9e0: 0a 0a 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 ....send_ret = c
c9f0: 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 ackey_send_apdu(
ca00: 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 slot, GSCIS_CLAS
ca10: 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 S_GLOBAL_PLATFOR
ca20: 4d 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 52 M, GSCIS_INSTR_R
ca30: 45 41 44 5f 42 55 46 46 45 52 2c 20 28 28 69 6e EAD_BUFFER, ((in
ca40: 69 74 69 61 6c 5f 6f 66 66 73 65 74 20 2b 20 6f itial_offset + o
ca50: 66 66 73 65 74 29 20 3e 3e 20 38 29 20 26 20 30 ffset) >> 8) & 0
ca60: 78 66 66 2c 20 28 69 6e 69 74 69 61 6c 5f 6f 66 xff, (initial_of
ca70: 66 73 65 74 20 2b 20 6f 66 66 73 65 74 29 20 26 fset + offset) &
ca80: 20 30 78 66 66 2c 20 73 69 7a 65 6f 66 28 63 6d 0xff, sizeof(cm
ca90: 64 29 2c 20 63 6d 64 2c 20 30 78 30 30 2c 20 26 d), cmd, 0x00, &
caa0: 72 65 73 70 63 6f 64 65 2c 20 62 75 66 66 65 72 respcode, buffer
cab0: 20 2b 20 6f 66 66 73 65 74 2c 20 26 63 6f 75 6e + offset, &coun
cac0: 74 29 3b 0a 0a 09 09 69 66 20 28 73 65 6e 64 5f t);....if (send_
cad0: 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 ret == CACKEY_PC
cae0: 53 43 5f 45 5f 52 45 54 52 59 29 20 7b 0a 09 09 SC_E_RETRY) {...
caf0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
cb00: 49 4e 54 46 28 22 41 44 50 55 20 53 65 6e 64 69 INTF("ADPU Sendi
cb10: 6e 67 20 66 61 69 6c 65 64 2c 20 72 65 74 72 79 ng failed, retry
cb20: 69 6e 67 20 72 65 61 64 20 62 75 66 66 65 72 22 ing read buffer"
cb30: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 63 61 );.....return(ca
cb40: 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 ckey_read_buffer
cb50: 28 73 6c 6f 74 2c 20 69 6e 69 74 5f 62 75 66 66 (slot, init_buff
cb60: 65 72 2c 20 69 6e 69 74 5f 63 6f 75 6e 74 2c 20 er, init_count,
cb70: 74 5f 6f 72 5f 76 2c 20 69 6e 69 74 5f 69 6e 69 t_or_v, init_ini
cb80: 74 69 61 6c 5f 6f 66 66 73 65 74 29 29 3b 0a 09 tial_offset));..
cb90: 09 7d 0a 0a 09 09 69 66 20 28 73 65 6e 64 5f 72 .}....if (send_r
cba0: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 et != CACKEY_PCS
cbb0: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 69 66 20 C_S_OK) {....if
cbc0: 28 72 65 73 70 63 6f 64 65 20 3d 3d 20 30 78 36 (respcode == 0x6
cbd0: 41 38 36 29 20 7b 0a 09 09 09 09 69 66 20 28 6d A86) {.....if (m
cbe0: 61 78 5f 63 6f 75 6e 74 20 3d 3d 20 31 29 20 7b ax_count == 1) {
cbf0: 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 ......break;....
cc00: 09 7d 0a 0a 09 09 09 09 6d 61 78 5f 63 6f 75 6e .}......max_coun
cc10: 74 20 3d 20 6d 61 78 5f 63 6f 75 6e 74 20 2f 20 t = max_count /
cc20: 32 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 2;......continue
cc30: 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45 ;....}.....CACKE
cc40: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
cc50: 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 cackey_send_apdu
cc60: 28 29 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 () failed, retur
cc70: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 ning in failure"
cc80: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 );.....return(-1
cc90: 29 3b 0a 09 09 7d 0a 0a 09 09 6f 66 66 73 65 74 );...}....offset
cca0: 20 2b 3d 20 63 6f 75 6e 74 3b 0a 0a 09 09 69 66 += count;....if
ccb0: 20 28 63 6f 75 6e 74 20 3c 20 6d 61 78 5f 63 6f (count < max_co
ccc0: 75 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 unt) {....CACKEY
ccd0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 _DEBUG_PRINTF("S
cce0: 68 6f 72 74 20 72 65 61 64 20 2d 2d 20 63 6f 75 hort read -- cou
ccf0: 6e 74 20 3d 20 25 69 2c 20 63 6d 64 5b 31 5d 20 nt = %i, cmd[1]
cd00: 3d 20 25 69 22 2c 20 28 69 6e 74 29 20 63 6f 75 = %i", (int) cou
cd10: 6e 74 2c 20 28 69 6e 74 29 20 63 6d 64 5b 31 5d nt, (int) cmd[1]
cd20: 29 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 );.....break;...
cd30: 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 }..}..#ifdef CAC
cd40: 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 KEY_PARANOID.#
cd50: 69 66 64 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 ifdef _POSIX_SSI
cd60: 5a 45 5f 4d 41 58 0a 09 69 66 20 28 6f 66 66 73 ZE_MAX..if (offs
cd70: 65 74 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a et > _POSIX_SSIZ
cd80: 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b 45 E_MAX) {...CACKE
cd90: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
cda0: 4f 66 66 73 65 74 20 65 78 63 65 65 64 73 20 6d Offset exceeds m
cdb0: 61 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 aximum value, re
cdc0: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 turning in failu
cdd0: 72 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 re. (max = %li,
cde0: 6f 66 66 73 65 74 20 3d 20 25 6c 75 29 22 2c 20 offset = %lu)",
cdf0: 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53 (long) _POSIX_SS
ce00: 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e IZE_MAX, (unsign
ce10: 65 64 20 6c 6f 6e 67 29 20 6f 66 66 73 65 74 29 ed long) offset)
ce20: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b ;....return(-1);
ce30: 0a 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e ..}.# endif.#en
ce40: 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 dif...CACKEY_DEB
ce50: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
ce60: 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c ning in success,
ce70: 20 72 65 61 64 20 25 6c 75 20 62 79 74 65 73 22 read %lu bytes"
ce80: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
ce90: 29 20 6f 66 66 73 65 74 29 3b 0a 0a 09 72 65 74 ) offset);...ret
cea0: 75 72 6e 28 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a urn(offset);.}..
ceb0: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 /*. * SYNPOSIS.
cec0: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 * cackey_ret
ced0: 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 cackey_select_a
cee0: 70 70 6c 65 74 28 73 74 72 75 63 74 20 63 61 63 pplet(struct cac
cef0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 key_slot *slot,
cf00: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 unsigned char *a
cf10: 69 64 2c 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c id, size_t aid_l
cf20: 65 6e 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d en);. *. * ARGUM
cf30: 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75 ENTS. * stru
cf40: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a ct cackey_slot *
cf50: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 slot. *
cf60: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d Slot to send com
cf70: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 mands to. *. *
cf80: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 unsigned char
cf90: 20 2a 61 69 64 0a 20 2a 20 20 20 20 20 20 20 20 *aid. *
cfa0: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 Buffer containi
cfb0: 6e 67 20 41 70 70 6c 65 74 20 49 44 20 74 6f 20 ng Applet ID to
cfc0: 73 65 6c 65 63 74 0a 20 2a 0a 20 2a 20 20 20 20 select. *. *
cfd0: 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 0a size_t aid_len.
cfe0: 20 2a 20 20 20 20 20 20 20 20 20 4e 75 6d 62 65 * Numbe
cff0: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 r of bytes in th
d000: 65 20 22 61 69 64 22 20 28 41 70 70 6c 65 74 20 e "aid" (Applet
d010: 49 44 29 20 70 61 72 61 6d 65 74 65 72 0a 20 2a ID) parameter. *
d020: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 . * RETURN VALUE
d030: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 . * CACKEY_P
d040: 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 CSC_S_OK
d050: 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 On success. *
d060: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 CACKEY_PCSC_E
d070: 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 _GENERIC On e
d080: 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 rror. *. * NOTES
d090: 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a . * None. *.
d0a0: 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 */.static cacke
d0b0: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6c y_ret cackey_sel
d0c0: 65 63 74 5f 61 70 70 6c 65 74 28 73 74 72 75 63 ect_applet(struc
d0d0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 t cackey_slot *s
d0e0: 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 lot, unsigned ch
d0f0: 61 72 20 2a 61 69 64 2c 20 73 69 7a 65 5f 74 20 ar *aid, size_t
d100: 61 69 64 5f 6c 65 6e 29 20 7b 0a 09 69 6e 74 20 aid_len) {..int
d110: 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b send_ret;...CACK
d120: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
d130: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 "Called.");...CA
d140: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
d150: 42 55 46 28 22 53 65 6c 65 63 74 69 6e 67 20 61 BUF("Selecting a
d160: 70 70 6c 65 74 3a 22 2c 20 61 69 64 2c 20 61 69 pplet:", aid, ai
d170: 64 5f 6c 65 6e 29 3b 0a 0a 09 73 65 6e 64 5f 72 d_len);...send_r
d180: 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 et = cackey_send
d190: 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 _apdu(slot, GSCI
d1a0: 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c S_CLASS_ISO7816,
d1b0: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c GSCIS_INSTR_SEL
d1c0: 45 43 54 2c 20 47 53 43 49 53 5f 50 41 52 41 4d ECT, GSCIS_PARAM
d1d0: 5f 53 45 4c 45 43 54 5f 41 50 50 4c 45 54 2c 20 _SELECT_APPLET,
d1e0: 30 78 30 30 2c 20 61 69 64 5f 6c 65 6e 2c 20 61 0x00, aid_len, a
d1f0: 69 64 2c 20 30 78 30 30 2c 20 4e 55 4c 4c 2c 20 id, 0x00, NULL,
d200: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 NULL, NULL);...i
d210: 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 f (send_ret == C
d220: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 ACKEY_PCSC_E_RET
d230: 52 59 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 RY) {...CACKEY_D
d240: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50 EBUG_PRINTF("ADP
d250: 55 20 53 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 U Sending failed
d260: 2c 20 72 65 74 72 79 69 6e 67 20 73 65 6c 65 63 , retrying selec
d270: 74 20 61 70 70 6c 65 74 22 29 3b 0a 0a 09 09 72 t applet");....r
d280: 65 74 75 72 6e 28 63 61 63 6b 65 79 5f 73 65 6c eturn(cackey_sel
d290: 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c ect_applet(slot,
d2a0: 20 61 69 64 2c 20 61 69 64 5f 6c 65 6e 29 29 3b aid, aid_len));
d2b0: 0a 09 7d 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 ..}...if (send_r
d2c0: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 et != CACKEY_PCS
d2d0: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b C_S_OK) {...CACK
d2e0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
d2f0: 22 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 "Failed to open
d300: 61 70 70 6c 65 74 2c 20 72 65 74 75 72 6e 69 6e applet, returnin
d310: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a g in failure");.
d320: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 ...return(CACKEY
d330: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 _PCSC_E_GENERIC)
d340: 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ;..}...CACKEY_DE
d350: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63 63 BUG_PRINTF("Succ
d360: 65 73 73 66 75 6c 6c 79 20 73 65 6c 65 63 74 65 essfully selecte
d370: 64 20 66 69 6c 65 22 29 3b 0a 0a 09 72 65 74 75 d file");...retu
d380: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 rn(CACKEY_PCSC_S
d390: 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 _OK);.}../*. * S
d3a0: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 YNPOSIS. * c
d3b0: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 ackey_ret cackey
d3c0: 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 74 72 _select_file(str
d3d0: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 uct cackey_slot
d3e0: 2a 73 6c 6f 74 2c 20 75 69 6e 74 31 36 5f 74 20 *slot, uint16_t
d3f0: 65 66 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d ef);. *. * ARGUM
d400: 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75 ENTS. * stru
d410: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a ct cackey_slot *
d420: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 slot. *
d430: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d Slot to send com
d440: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 mands to. *. *
d450: 20 20 20 75 69 6e 74 31 36 5f 74 20 65 66 0a 20 uint16_t ef.
d460: 2a 20 20 20 20 20 20 20 20 20 45 6c 65 6d 65 6e * Elemen
d470: 74 61 6c 20 46 69 6c 65 20 74 6f 20 73 65 6c 65 tal File to sele
d480: 63 74 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 ct. *. * RETURN
d490: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 VALUE. * CAC
d4a0: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 KEY_PCSC_S_OK
d4b0: 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 On success
d4c0: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 . * CACKEY_P
d4d0: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 CSC_E_GENERIC
d4e0: 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 On error. *. *
d4f0: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 NOTES. * Thi
d500: 73 20 73 65 6c 65 63 74 73 20 61 6e 20 45 6c 65 s selects an Ele
d510: 6d 65 6e 74 61 72 79 20 46 69 6c 65 20 28 45 46 mentary File (EF
d520: 29 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 72 ) under the curr
d530: 65 6e 74 6c 79 20 73 65 6c 65 63 74 65 64 0a 20 ently selected.
d540: 2a 20 20 20 20 20 44 65 64 69 63 61 74 65 64 20 * Dedicated
d550: 46 69 6c 65 20 28 44 46 29 0a 20 2a 0a 20 2a 20 File (DF). *. *
d560: 20 20 20 20 54 79 70 69 63 61 6c 6c 79 20 74 68 Typically th
d570: 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 is is called aft
d580: 65 72 20 73 65 6c 65 63 74 69 6e 67 20 74 68 65 er selecting the
d590: 20 63 6f 72 72 65 63 74 20 41 70 70 6c 65 74 20 correct Applet
d5a0: 28 75 73 69 6e 67 0a 20 2a 20 20 20 20 20 63 61 (using. * ca
d5b0: 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c ckey_select_appl
d5c0: 65 74 29 20 66 6f 72 20 56 4d 20 63 61 72 64 73 et) for VM cards
d5d0: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 . *. */.static c
d5e0: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 ackey_ret cackey
d5f0: 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 74 72 _select_file(str
d600: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 uct cackey_slot
d610: 2a 73 6c 6f 74 2c 20 75 69 6e 74 31 36 5f 74 20 *slot, uint16_t
d620: 65 66 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 ef) {..unsigned
d630: 63 68 61 72 20 66 69 64 5f 62 75 66 5b 32 5d 3b char fid_buf[2];
d640: 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a ..int send_ret;.
d650: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
d660: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
d670: 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 20 74 68 65 20 ;.../* Open the
d680: 65 6c 65 6d 65 6e 74 61 72 79 20 66 69 6c 65 20 elementary file
d690: 2a 2f 0a 09 66 69 64 5f 62 75 66 5b 30 5d 20 3d */..fid_buf[0] =
d6a0: 20 28 65 66 20 3e 3e 20 38 29 20 26 20 30 78 66 (ef >> 8) & 0xf
d6b0: 66 3b 0a 09 66 69 64 5f 62 75 66 5b 31 5d 20 3d f;..fid_buf[1] =
d6c0: 20 65 66 20 26 20 30 78 66 66 3b 0a 0a 09 43 41 ef & 0xff;...CA
d6d0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
d6e0: 46 28 22 53 65 6c 65 63 74 69 6e 67 20 66 69 6c F("Selecting fil
d6f0: 65 3a 20 25 30 34 6c 78 22 2c 20 28 75 6e 73 69 e: %04lx", (unsi
d700: 67 6e 65 64 20 6c 6f 6e 67 29 20 65 66 29 3b 0a gned long) ef);.
d710: 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 ..send_ret = cac
d720: 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c key_send_apdu(sl
d730: 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f ot, GSCIS_CLASS_
d740: 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49 ISO7816, GSCIS_I
d750: 4e 53 54 52 5f 53 45 4c 45 43 54 2c 20 30 78 30 NSTR_SELECT, 0x0
d760: 32 2c 20 30 78 30 43 2c 20 73 69 7a 65 6f 66 28 2, 0x0C, sizeof(
d770: 66 69 64 5f 62 75 66 29 2c 20 66 69 64 5f 62 75 fid_buf), fid_bu
d780: 66 2c 20 30 78 30 30 2c 20 4e 55 4c 4c 2c 20 4e f, 0x00, NULL, N
d790: 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 ULL, NULL);..if
d7a0: 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 (send_ret != CAC
d7b0: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b KEY_PCSC_S_OK) {
d7c0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
d7d0: 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 PRINTF("Failed t
d7e0: 6f 20 6f 70 65 6e 20 66 69 6c 65 2c 20 72 65 74 o open file, ret
d7f0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 urning in failur
d800: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 e");....return(C
d810: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e ACKEY_PCSC_E_GEN
d820: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b ERIC);..}...CACK
d830: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
d840: 22 53 75 63 63 65 73 73 66 75 6c 6c 79 20 73 65 "Successfully se
d850: 6c 65 63 74 65 64 20 66 69 6c 65 22 29 3b 0a 0a lected file");..
d860: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 .return(CACKEY_P
d870: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a CSC_S_OK);.}../*
d880: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 . * SYNPOSIS. *
d890: 20 20 20 20 76 6f 69 64 20 63 61 63 6b 65 79 5f void cackey_
d8a0: 66 72 65 65 5f 74 6c 76 28 73 74 72 75 63 74 20 free_tlv(struct
d8b0: 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 cackey_tlv_entit
d8c0: 79 20 2a 72 6f 6f 74 29 3b 0a 20 2a 0a 20 2a 20 y *root);. *. *
d8d0: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 ARGUMENTS. *
d8e0: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 struct cackey_t
d8f0: 6c 76 5f 65 6e 74 69 74 79 20 2a 72 6f 6f 74 0a lv_entity *root.
d900: 20 2a 20 20 20 20 20 20 20 20 20 52 6f 6f 74 20 * Root
d910: 6f 66 20 74 68 65 20 54 4c 56 20 6c 69 73 74 20 of the TLV list
d920: 74 6f 20 73 74 61 72 74 20 66 72 65 65 69 6e 67 to start freeing
d930: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 . *. * RETURN VA
d940: 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a LUE. * None.
d950: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 *. * NOTES. *
d960: 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e This function
d970: 20 66 72 65 65 73 20 74 68 65 20 54 4c 56 20 6c frees the TLV l
d980: 69 6e 6b 65 64 20 6c 69 73 74 65 64 20 72 65 74 inked listed ret
d990: 75 72 6e 65 64 20 66 72 6f 6d 0a 20 2a 20 20 20 urned from. *
d9a0: 20 20 22 63 61 63 6b 65 79 5f 72 65 61 64 5f 74 "cackey_read_t
d9b0: 6c 76 22 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 lv". *. */.stati
d9c0: 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72 c void cackey_fr
d9d0: 65 65 5f 74 6c 76 28 73 74 72 75 63 74 20 63 61 ee_tlv(struct ca
d9e0: 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 ckey_tlv_entity
d9f0: 2a 72 6f 6f 74 29 20 7b 0a 09 73 74 72 75 63 74 *root) {..struct
da00: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 cackey_tlv_enti
da10: 74 79 20 2a 63 75 72 72 2c 20 2a 6e 65 78 74 3b ty *curr, *next;
da20: 0a 0a 09 69 66 20 28 72 6f 6f 74 20 3d 3d 20 4e ...if (root == N
da30: 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b ULL) {...return;
da40: 0a 09 7d 0a 0a 09 66 6f 72 20 28 63 75 72 72 20 ..}...for (curr
da50: 3d 20 72 6f 6f 74 3b 20 63 75 72 72 3b 20 63 75 = root; curr; cu
da60: 72 72 20 3d 20 6e 65 78 74 29 20 7b 0a 09 09 6e rr = next) {...n
da70: 65 78 74 20 3d 20 63 75 72 72 2d 3e 5f 6e 65 78 ext = curr->_nex
da80: 74 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 63 75 t;....switch (cu
da90: 72 72 2d 3e 74 61 67 29 20 7b 0a 09 09 09 63 61 rr->tag) {....ca
daa0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43 52 se GSCIS_TAG_ACR
dab0: 5f 54 41 42 4c 45 3a 0a 09 09 09 63 61 73 65 20 _TABLE:....case
dac0: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 GSCIS_TAG_CERTIF
dad0: 49 43 41 54 45 3a 0a 09 09 09 09 69 66 20 28 63 ICATE:.....if (c
dae0: 75 72 72 2d 3e 76 61 6c 75 65 29 20 7b 0a 09 09 urr->value) {...
daf0: 09 09 09 66 72 65 65 28 63 75 72 72 2d 3e 76 61 ...free(curr->va
db00: 6c 75 65 29 3b 0a 09 09 09 09 7d 0a 09 09 09 09 lue);.....}.....
db10: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 break;....case G
db20: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c SCIS_TAG_CARDURL
db30: 3a 0a 09 09 09 09 69 66 20 28 63 75 72 72 2d 3e :.....if (curr->
db40: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 29 20 7b value_cardurl) {
db50: 0a 09 09 09 09 09 66 72 65 65 28 63 75 72 72 2d ......free(curr-
db60: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 29 3b >value_cardurl);
db70: 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b .....}.....break
db80: 3b 0a 09 09 7d 0a 0a 09 09 66 72 65 65 28 63 75 ;...}....free(cu
db90: 72 72 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e rr);..}...return
dba0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f ;.}../*. * SYNPO
dbb0: 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 SIS. * ....
dbc0: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 *. * ARGUMENTS.
dbd0: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 * .... *. *
dbe0: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 RETURN VALUE. *
dbf0: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f .... *. * NO
dc00: 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 TES. * ....
dc10: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 *. */.static str
dc20: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 uct cackey_tlv_e
dc30: 6e 74 69 74 79 20 2a 63 61 63 6b 65 79 5f 72 65 ntity *cackey_re
dc40: 61 64 5f 74 6c 76 28 73 74 72 75 63 74 20 63 61 ad_tlv(struct ca
dc50: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 ckey_slot *slot)
dc60: 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 {..struct cacke
dc70: 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 75 y_tlv_entity *cu
dc80: 72 72 5f 65 6e 74 69 74 79 2c 20 2a 72 6f 6f 74 rr_entity, *root
dc90: 20 3d 20 4e 55 4c 4c 2c 20 2a 6c 61 73 74 20 3d = NULL, *last =
dca0: 20 4e 55 4c 4c 3b 0a 09 75 6e 73 69 67 6e 65 64 NULL;..unsigned
dcb0: 20 63 68 61 72 20 74 6c 65 6e 5f 62 75 66 5b 32 char tlen_buf[2
dcc0: 5d 2c 20 74 76 61 6c 5f 62 75 66 5b 31 30 32 34 ], tval_buf[1024
dcd0: 5d 2c 20 2a 74 76 61 6c 3b 0a 09 75 6e 73 69 67 ], *tval;..unsig
dce0: 6e 65 64 20 63 68 61 72 20 76 6c 65 6e 5f 62 75 ned char vlen_bu
dcf0: 66 5b 32 5d 2c 20 76 76 61 6c 5f 62 75 66 5b 38 f[2], vval_buf[8
dd00: 31 39 32 5d 2c 20 2a 76 76 61 6c 3b 0a 09 75 6e 192], *vval;..un
dd10: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 6d 70 signed char *tmp
dd20: 62 75 66 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c buf;..unsigned l
dd30: 6f 6e 67 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 ong tmpbuflen;..
dd40: 73 73 69 7a 65 5f 74 20 74 6c 65 6e 2c 20 76 6c ssize_t tlen, vl
dd50: 65 6e 3b 0a 09 73 73 69 7a 65 5f 74 20 72 65 61 en;..ssize_t rea
dd60: 64 5f 72 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6f d_ret;..size_t o
dd70: 66 66 73 65 74 5f 74 20 3d 20 30 2c 20 6f 66 66 ffset_t = 0, off
dd80: 73 65 74 5f 76 20 3d 20 30 3b 0a 09 75 6e 73 69 set_v = 0;..unsi
dd90: 67 6e 65 64 20 63 68 61 72 20 74 61 67 3b 0a 09 gned char tag;..
dda0: 73 69 7a 65 5f 74 20 6c 65 6e 67 74 68 3b 0a 23 size_t length;.#
ddb0: 69 66 64 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a ifdef HAVE_LIBZ.
ddc0: 09 69 6e 74 20 75 6e 63 6f 6d 70 72 65 73 73 5f .int uncompress_
ddd0: 72 65 74 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41 ret;.#endif...CA
dde0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
ddf0: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
de00: 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 read_ret = cacke
de10: 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c y_read_buffer(sl
de20: 6f 74 2c 20 74 6c 65 6e 5f 62 75 66 2c 20 73 69 ot, tlen_buf, si
de30: 7a 65 6f 66 28 74 6c 65 6e 5f 62 75 66 29 2c 20 zeof(tlen_buf),
de40: 31 2c 20 6f 66 66 73 65 74 5f 74 29 3b 0a 09 69 1, offset_t);..i
de50: 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20 73 f (read_ret != s
de60: 69 7a 65 6f 66 28 74 6c 65 6e 5f 62 75 66 29 29 izeof(tlen_buf))
de70: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
de80: 47 5f 50 52 49 4e 54 46 28 22 52 65 61 64 20 66 G_PRINTF("Read f
de90: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 ailed, returning
dea0: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a in failure");..
deb0: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a ..return(NULL);.
dec0: 09 7d 0a 0a 09 74 6c 65 6e 20 3d 20 28 74 6c 65 .}...tlen = (tle
ded0: 6e 5f 62 75 66 5b 31 5d 20 3c 3c 20 38 29 20 7c n_buf[1] << 8) |
dee0: 20 74 6c 65 6e 5f 62 75 66 5b 30 5d 3b 0a 0a 09 tlen_buf[0];...
def0: 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 read_ret = cacke
df00: 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c y_read_buffer(sl
df10: 6f 74 2c 20 76 6c 65 6e 5f 62 75 66 2c 20 73 69 ot, vlen_buf, si
df20: 7a 65 6f 66 28 76 6c 65 6e 5f 62 75 66 29 2c 20 zeof(vlen_buf),
df30: 32 2c 20 6f 66 66 73 65 74 5f 76 29 3b 0a 09 69 2, offset_v);..i
df40: 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20 73 f (read_ret != s
df50: 69 7a 65 6f 66 28 76 6c 65 6e 5f 62 75 66 29 29 izeof(vlen_buf))
df60: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
df70: 47 5f 50 52 49 4e 54 46 28 22 52 65 61 64 20 66 G_PRINTF("Read f
df80: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 ailed, returning
df90: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a in failure");..
dfa0: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a ..return(NULL);.
dfb0: 09 7d 0a 0a 09 76 6c 65 6e 20 3d 20 28 76 6c 65 .}...vlen = (vle
dfc0: 6e 5f 62 75 66 5b 31 5d 20 3c 3c 20 38 29 20 7c n_buf[1] << 8) |
dfd0: 20 76 6c 65 6e 5f 62 75 66 5b 30 5d 3b 0a 0a 09 vlen_buf[0];...
dfe0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
dff0: 4e 54 46 28 22 54 61 67 20 4c 65 6e 67 74 68 20 NTF("Tag Length
e000: 3d 20 25 6c 75 2c 20 56 61 6c 75 65 20 4c 65 6e = %lu, Value Len
e010: 67 74 68 20 3d 20 25 6c 75 22 2c 20 28 75 6e 73 gth = %lu", (uns
e020: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 74 6c 65 6e igned long) tlen
e030: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
e040: 29 20 76 6c 65 6e 29 3b 0a 0a 09 6f 66 66 73 65 ) vlen);...offse
e050: 74 5f 74 20 2b 3d 20 32 3b 0a 09 6f 66 66 73 65 t_t += 2;..offse
e060: 74 5f 76 20 2b 3d 20 32 3b 0a 0a 09 69 66 20 28 t_v += 2;...if (
e070: 74 6c 65 6e 20 3e 20 73 69 7a 65 6f 66 28 74 76 tlen > sizeof(tv
e080: 61 6c 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43 al_buf)) {...CAC
e090: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
e0a0: 28 22 54 61 67 20 6c 65 6e 67 74 68 20 69 73 20 ("Tag length is
e0b0: 74 6f 6f 20 6c 61 72 67 65 2c 20 72 65 74 75 72 too large, retur
e0c0: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 ning in failure"
e0d0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c );....return(NUL
e0e0: 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 76 6c 65 L);..}...if (vle
e0f0: 6e 20 3e 20 73 69 7a 65 6f 66 28 76 76 61 6c 5f n > sizeof(vval_
e100: 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 buf)) {...CACKEY
e110: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 56 _DEBUG_PRINTF("V
e120: 61 6c 75 65 20 6c 65 6e 67 74 68 20 69 73 20 74 alue length is t
e130: 6f 6f 20 6c 61 72 67 65 2c 20 72 65 74 75 72 6e oo large, return
e140: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 ing in failure")
e150: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c ;....return(NULL
e160: 29 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f 72 65 74 );..}...read_ret
e170: 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 = cackey_read_b
e180: 75 66 66 65 72 28 73 6c 6f 74 2c 20 74 76 61 6c uffer(slot, tval
e190: 5f 62 75 66 2c 20 74 6c 65 6e 2c 20 31 2c 20 6f _buf, tlen, 1, o
e1a0: 66 66 73 65 74 5f 74 29 3b 0a 09 69 66 20 28 72 ffset_t);..if (r
e1b0: 65 61 64 5f 72 65 74 20 21 3d 20 74 6c 65 6e 29 ead_ret != tlen)
e1c0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
e1d0: 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 G_PRINTF("Unable
e1e0: 20 74 6f 20 72 65 61 64 20 65 6e 74 69 72 65 20 to read entire
e1f0: 54 2d 62 75 66 66 65 72 2c 20 72 65 74 75 72 6e T-buffer, return
e200: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 ing in failure")
e210: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c ;....return(NULL
e220: 29 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f 72 65 74 );..}...read_ret
e230: 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 = cackey_read_b
e240: 75 66 66 65 72 28 73 6c 6f 74 2c 20 76 76 61 6c uffer(slot, vval
e250: 5f 62 75 66 2c 20 76 6c 65 6e 2c 20 32 2c 20 6f _buf, vlen, 2, o
e260: 66 66 73 65 74 5f 76 29 3b 0a 09 69 66 20 28 72 ffset_v);..if (r
e270: 65 61 64 5f 72 65 74 20 21 3d 20 76 6c 65 6e 29 ead_ret != vlen)
e280: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
e290: 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 G_PRINTF("Unable
e2a0: 20 74 6f 20 72 65 61 64 20 65 6e 74 69 72 65 20 to read entire
e2b0: 56 2d 62 75 66 66 65 72 2c 20 72 65 74 75 72 6e V-buffer, return
e2c0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 ing in failure")
e2d0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c ;....return(NULL
e2e0: 29 3b 0a 09 7d 0a 0a 09 74 76 61 6c 20 3d 20 74 );..}...tval = t
e2f0: 76 61 6c 5f 62 75 66 3b 0a 09 76 76 61 6c 20 3d val_buf;..vval =
e300: 20 76 76 61 6c 5f 62 75 66 3b 0a 09 77 68 69 6c vval_buf;..whil
e310: 65 20 28 74 6c 65 6e 20 3e 20 30 20 26 26 20 76 e (tlen > 0 && v
e320: 6c 65 6e 20 3e 20 30 29 20 7b 0a 09 09 74 61 67 len > 0) {...tag
e330: 20 3d 20 2a 74 76 61 6c 3b 0a 09 09 74 76 61 6c = *tval;...tval
e340: 2b 2b 3b 0a 09 09 74 6c 65 6e 2d 2d 3b 0a 0a 09 ++;...tlen--;...
e350: 09 69 66 20 28 2a 74 76 61 6c 20 3d 3d 20 30 78 .if (*tval == 0x
e360: 66 66 29 20 7b 0a 09 09 09 6c 65 6e 67 74 68 20 ff) {....length
e370: 3d 20 28 74 76 61 6c 5b 32 5d 20 3c 3c 20 38 29 = (tval[2] << 8)
e380: 20 7c 20 74 76 61 6c 5b 31 5d 3b 0a 09 09 09 74 | tval[1];....t
e390: 76 61 6c 20 2b 3d 20 33 3b 0a 09 09 09 74 6c 65 val += 3;....tle
e3a0: 6e 20 2d 3d 20 33 3b 0a 09 09 7d 20 65 6c 73 65 n -= 3;...} else
e3b0: 20 7b 0a 09 09 09 6c 65 6e 67 74 68 20 3d 20 2a {....length = *
e3c0: 74 76 61 6c 3b 0a 09 09 09 74 76 61 6c 2b 2b 3b tval;....tval++;
e3d0: 0a 09 09 09 74 6c 65 6e 2d 2d 3b 0a 09 09 7d 0a ....tlen--;...}.
e3e0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
e3f0: 50 52 49 4e 54 46 28 22 54 61 67 3a 20 25 73 20 PRINTF("Tag: %s
e400: 28 25 30 32 78 29 22 2c 20 43 41 43 4b 45 59 5f (%02x)", CACKEY_
e410: 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 DEBUG_FUNC_TAG_T
e420: 4f 5f 53 54 52 28 74 61 67 29 2c 20 28 75 6e 73 O_STR(tag), (uns
e430: 69 67 6e 65 64 20 69 6e 74 29 20 74 61 67 29 3b igned int) tag);
e440: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
e450: 50 52 49 4e 54 42 55 46 28 22 56 61 6c 75 65 3a PRINTBUF("Value:
e460: 22 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 ", vval, length)
e470: 3b 0a 0a 09 09 63 75 72 72 5f 65 6e 74 69 74 79 ;....curr_entity
e480: 20 3d 20 4e 55 4c 4c 3b 0a 09 09 73 77 69 74 63 = NULL;...switc
e490: 68 20 28 74 61 67 29 20 7b 0a 09 09 09 63 61 73 h (tag) {....cas
e4a0: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 e GSCIS_TAG_CARD
e4b0: 55 52 4c 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e URL:.....curr_en
e4c0: 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 tity = malloc(si
e4d0: 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 zeof(*curr_entit
e4e0: 79 29 29 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e y));.....curr_en
e4f0: 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 tity->value_card
e500: 75 72 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a url = malloc(siz
e510: 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 eof(*curr_entity
e520: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 29 ->value_cardurl)
e530: 29 3b 0a 0a 09 09 09 09 6d 65 6d 63 70 79 28 63 );......memcpy(c
e540: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 urr_entity->valu
e550: 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20 e_cardurl->rid,
e560: 76 76 61 6c 2c 20 35 29 3b 0a 09 09 09 09 63 75 vval, 5);.....cu
e570: 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 rr_entity->value
e580: 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 _cardurl->apptyp
e590: 65 20 3d 20 76 76 61 6c 5b 35 5d 3b 0a 09 09 09 e = vval[5];....
e5a0: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 .curr_entity->va
e5b0: 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a lue_cardurl->obj
e5c0: 65 63 74 69 64 20 3d 20 28 76 76 61 6c 5b 36 5d ectid = (vval[6]
e5d0: 20 3c 3c 20 38 29 20 7c 20 76 76 61 6c 5b 37 5d << 8) | vval[7]
e5e0: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 ;.....curr_entit
e5f0: 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c y->value_cardurl
e600: 2d 3e 61 70 70 69 64 20 3d 20 28 76 76 61 6c 5b ->appid = (vval[
e610: 38 5d 20 3c 3c 20 38 29 20 7c 20 76 76 61 6c 5b 8] << 8) | vval[
e620: 39 5d 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 9];......curr_en
e630: 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b tity->tag = tag;
e640: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 .....curr_entity
e650: 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a ->_next = NULL;.
e660: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 .....break;....c
e670: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43 ase GSCIS_TAG_AC
e680: 52 5f 54 41 42 4c 45 3a 0a 09 09 09 09 63 75 72 R_TABLE:.....cur
e690: 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f r_entity = mallo
e6a0: 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 c(sizeof(*curr_e
e6b0: 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 74 6d 70 ntity));.....tmp
e6c0: 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 6c 65 6e buf = malloc(len
e6d0: 67 74 68 29 3b 0a 0a 09 09 09 09 6d 65 6d 63 70 gth);......memcp
e6e0: 79 28 74 6d 70 62 75 66 2c 20 76 76 61 6c 2c 20 y(tmpbuf, vval,
e6f0: 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 09 09 63 75 length);......cu
e700: 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d rr_entity->tag =
e710: 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 tag;.....curr_e
e720: 6e 74 69 74 79 2d 3e 6c 65 6e 67 74 68 20 3d 20 ntity->length =
e730: 6c 65 6e 67 74 68 3b 0a 09 09 09 09 63 75 72 72 length;.....curr
e740: 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 20 3d _entity->value =
e750: 20 74 6d 70 62 75 66 3b 0a 09 09 09 09 63 75 72 tmpbuf;.....cur
e760: 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 r_entity->_next
e770: 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 = NULL;......bre
e780: 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43 49 ak;....case GSCI
e790: 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 S_TAG_CERTIFICAT
e7a0: 45 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 E:.....curr_enti
e7b0: 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 ty = malloc(size
e7c0: 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 of(*curr_entity)
e7d0: 29 3b 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f );..#ifdef HAVE_
e7e0: 4c 49 42 5a 0a 09 09 09 09 74 6d 70 62 75 66 6c LIBZ.....tmpbufl
e7f0: 65 6e 20 3d 20 6c 65 6e 67 74 68 20 2a 20 32 3b en = length * 2;
e800: 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20 6d 61 .....tmpbuf = ma
e810: 6c 6c 6f 63 28 74 6d 70 62 75 66 6c 65 6e 29 3b lloc(tmpbuflen);
e820: 0a 0a 09 09 09 09 75 6e 63 6f 6d 70 72 65 73 73 ......uncompress
e830: 5f 72 65 74 20 3d 20 75 6e 63 6f 6d 70 72 65 73 _ret = uncompres
e840: 73 28 74 6d 70 62 75 66 2c 20 26 74 6d 70 62 75 s(tmpbuf, &tmpbu
e850: 66 6c 65 6e 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 flen, vval, leng
e860: 74 68 29 3b 0a 09 09 09 09 69 66 20 28 75 6e 63 th);.....if (unc
e870: 6f 6d 70 72 65 73 73 5f 72 65 74 20 21 3d 20 5a ompress_ret != Z
e880: 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 43 41 43 4b _OK) {......CACK
e890: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
e8a0: 22 46 61 69 6c 65 64 20 74 6f 20 64 65 63 6f 6d "Failed to decom
e8b0: 70 72 65 73 73 2c 20 75 6e 63 6f 6d 70 72 65 73 press, uncompres
e8c0: 73 28 29 20 72 65 74 75 72 6e 65 64 20 25 69 20 s() returned %i
e8d0: 2d 2d 20 72 65 73 6f 72 74 69 6e 67 20 74 6f 20 -- resorting to
e8e0: 64 69 72 65 63 74 20 63 6f 70 79 22 2c 20 75 6e direct copy", un
e8f0: 63 6f 6d 70 72 65 73 73 5f 72 65 74 29 3b 0a 0a compress_ret);..
e900: 09 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d .....tmpbuflen =
e910: 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09 09 6d 65 length;......me
e920: 6d 63 70 79 28 74 6d 70 62 75 66 2c 20 76 76 61 mcpy(tmpbuf, vva
e930: 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 09 09 09 09 l, length);.....
e940: 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 }......CACKEY_DE
e950: 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 44 65 BUG_PRINTBUF("De
e960: 63 6f 6d 70 72 65 73 73 65 64 20 74 6f 3a 22 2c compressed to:",
e970: 20 74 6d 70 62 75 66 2c 20 74 6d 70 62 75 66 6c tmpbuf, tmpbufl
e980: 65 6e 29 3b 0a 23 65 6c 73 65 0a 09 09 09 09 43 en);.#else.....C
e990: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
e9a0: 54 46 28 22 4d 69 73 73 69 6e 67 20 5a 4c 49 42 TF("Missing ZLIB
e9b0: 20 53 75 70 70 6f 72 74 2c 20 74 68 69 73 20 63 Support, this c
e9c0: 65 72 74 69 66 69 63 61 74 65 20 69 73 20 6c 69 ertificate is li
e9d0: 6b 65 6c 79 20 75 73 65 6c 65 73 73 2e 2e 2e 22 kely useless..."
e9e0: 29 3b 0a 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 );......tmpbufle
e9f0: 6e 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09 n = length;.....
ea00: 6d 65 6d 63 70 79 28 74 6d 70 62 75 66 2c 20 76 memcpy(tmpbuf, v
ea10: 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 23 65 val, length);.#e
ea20: 6e 64 69 66 0a 0a 09 09 09 09 63 75 72 72 5f 65 ndif......curr_e
ea30: 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 ntity->tag = tag
ea40: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 ;.....curr_entit
ea50: 79 2d 3e 6c 65 6e 67 74 68 20 3d 20 74 6d 70 62 y->length = tmpb
ea60: 75 66 6c 65 6e 3b 0a 09 09 09 09 63 75 72 72 5f uflen;.....curr_
ea70: 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 20 3d 20 entity->value =
ea80: 74 6d 70 62 75 66 3b 0a 09 09 09 09 63 75 72 72 tmpbuf;.....curr
ea90: 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d _entity->_next =
eaa0: 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 NULL;......brea
eab0: 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 k;....case GSCIS
eac0: 5f 54 41 47 5f 50 4b 43 53 31 35 3a 0a 09 09 09 _TAG_PKCS15:....
ead0: 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d .curr_entity = m
eae0: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 alloc(sizeof(*cu
eaf0: 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 0a 09 09 rr_entity));....
eb00: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 ..curr_entity->t
eb10: 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 ag = tag;.....cu
eb20: 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 rr_entity->value
eb30: 5f 62 79 74 65 20 3d 20 76 76 61 6c 5b 30 5d 3b _byte = vval[0];
eb40: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 .....curr_entity
eb50: 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a ->_next = NULL;.
eb60: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a .....break;...}.
eb70: 0a 09 09 76 76 61 6c 20 2b 3d 20 6c 65 6e 67 74 ...vval += lengt
eb80: 68 3b 0a 09 09 76 6c 65 6e 20 2d 3d 20 6c 65 6e h;...vlen -= len
eb90: 67 74 68 3b 0a 0a 09 09 69 66 20 28 63 75 72 72 gth;....if (curr
eba0: 5f 65 6e 74 69 74 79 20 21 3d 20 4e 55 4c 4c 29 _entity != NULL)
ebb0: 20 7b 0a 09 09 09 69 66 20 28 72 6f 6f 74 20 3d {....if (root =
ebc0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 72 6f = NULL) {.....ro
ebd0: 6f 74 20 3d 20 63 75 72 72 5f 65 6e 74 69 74 79 ot = curr_entity
ebe0: 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 6c ;....}.....if (l
ebf0: 61 73 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ast != NULL) {..
ec00: 09 09 09 6c 61 73 74 2d 3e 5f 6e 65 78 74 20 3d ...last->_next =
ec10: 20 63 75 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09 curr_entity;...
ec20: 09 7d 0a 0a 09 09 09 6c 61 73 74 20 3d 20 63 75 .}.....last = cu
ec30: 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09 7d 0a 09 rr_entity;...}..
ec40: 7d 0a 0a 09 72 65 74 75 72 6e 28 72 6f 6f 74 29 }...return(root)
ec50: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f ;.}../*. * SYNPO
ec60: 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 SIS. * ....
ec70: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 *. * ARGUMENTS.
ec80: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 * .... *. *
ec90: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 RETURN VALUE. *
eca0: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f .... *. * NO
ecb0: 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 TES. * ....
ecc0: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 *. */.static voi
ecd0: 64 20 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 d cackey_free_ce
ece0: 72 74 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 rts(struct cacke
ecf0: 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 y_pcsc_identity
ed00: 2a 73 74 61 72 74 2c 20 73 69 7a 65 5f 74 20 63 *start, size_t c
ed10: 6f 75 6e 74 2c 20 69 6e 74 20 66 72 65 65 5f 73 ount, int free_s
ed20: 74 61 72 74 29 20 7b 0a 09 73 69 7a 65 5f 74 20 tart) {..size_t
ed30: 69 64 78 3b 0a 0a 09 69 66 20 28 73 74 61 72 74 idx;...if (start
ed40: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 == NULL) {...re
ed50: 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 turn;..}...for (
ed60: 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 63 idx = 0; idx < c
ed70: 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 ount; idx++) {..
ed80: 09 69 66 20 28 73 74 61 72 74 5b 69 64 78 5d 2e .if (start[idx].
ed90: 63 65 72 74 69 66 69 63 61 74 65 29 20 7b 0a 09 certificate) {..
eda0: 09 09 66 72 65 65 28 73 74 61 72 74 5b 69 64 78 ..free(start[idx
edb0: 5d 2e 63 65 72 74 69 66 69 63 61 74 65 29 3b 0a ].certificate);.
edc0: 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 66 72 65 ..}..}...if (fre
edd0: 65 5f 73 74 61 72 74 29 20 7b 0a 09 09 66 72 65 e_start) {...fre
ede0: 65 28 73 74 61 72 74 29 3b 0a 09 7d 0a 0a 09 72 e(start);..}...r
edf0: 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63 eturn;.}..static
ee00: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 struct cackey_p
ee10: 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 61 csc_identity *ca
ee20: 63 6b 65 79 5f 63 6f 70 79 5f 63 65 72 74 73 28 ckey_copy_certs(
ee30: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 struct cackey_pc
ee40: 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 64 65 73 sc_identity *des
ee50: 74 2c 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 t, struct cackey
ee60: 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a _pcsc_identity *
ee70: 73 74 61 72 74 2c 20 73 69 7a 65 5f 74 20 63 6f start, size_t co
ee80: 75 6e 74 29 20 7b 0a 09 73 69 7a 65 5f 74 20 69 unt) {..size_t i
ee90: 64 78 3b 0a 0a 09 69 66 20 28 73 74 61 72 74 20 dx;...if (start
eea0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 == NULL) {...ret
eeb0: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 urn(NULL);..}...
eec0: 69 66 20 28 64 65 73 74 20 3d 3d 20 4e 55 4c 4c if (dest == NULL
eed0: 29 20 7b 0a 09 09 64 65 73 74 20 3d 20 6d 61 6c ) {...dest = mal
eee0: 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 64 65 73 74 loc(sizeof(*dest
eef0: 29 20 2a 20 63 6f 75 6e 74 29 3b 0a 09 7d 0a 0a ) * count);..}..
ef00: 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 .for (idx = 0; i
ef10: 64 78 20 3c 20 63 6f 75 6e 74 3b 20 69 64 78 2b dx < count; idx+
ef20: 2b 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28 64 65 +) {...memcpy(de
ef30: 73 74 5b 69 64 78 5d 2e 61 70 70 6c 65 74 2c 20 st[idx].applet,
ef40: 73 74 61 72 74 5b 69 64 78 5d 2e 61 70 70 6c 65 start[idx].apple
ef50: 74 2c 20 73 69 7a 65 6f 66 28 64 65 73 74 5b 69 t, sizeof(dest[i
ef60: 64 78 5d 2e 61 70 70 6c 65 74 29 29 3b 0a 09 09 dx].applet));...
ef70: 64 65 73 74 5b 69 64 78 5d 2e 66 69 6c 65 20 3d dest[idx].file =
ef80: 20 73 74 61 72 74 5b 69 64 78 5d 2e 66 69 6c 65 start[idx].file
ef90: 3b 0a 09 09 64 65 73 74 5b 69 64 78 5d 2e 63 65 ;...dest[idx].ce
efa0: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 rtificate_len =
efb0: 73 74 61 72 74 5b 69 64 78 5d 2e 63 65 72 74 69 start[idx].certi
efc0: 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 09 64 65 ficate_len;...de
efd0: 73 74 5b 69 64 78 5d 2e 6b 65 79 73 69 7a 65 20 st[idx].keysize
efe0: 3d 20 73 74 61 72 74 5b 69 64 78 5d 2e 6b 65 79 = start[idx].key
eff0: 73 69 7a 65 3b 0a 0a 09 09 64 65 73 74 5b 69 64 size;....dest[id
f000: 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 20 3d x].certificate =
f010: 20 6d 61 6c 6c 6f 63 28 64 65 73 74 5b 69 64 78 malloc(dest[idx
f020: 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 ].certificate_le
f030: 6e 29 3b 0a 09 09 6d 65 6d 63 70 79 28 64 65 73 n);...memcpy(des
f040: 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 t[idx].certifica
f050: 74 65 2c 20 73 74 61 72 74 5b 69 64 78 5d 2e 63 te, start[idx].c
f060: 65 72 74 69 66 69 63 61 74 65 2c 20 64 65 73 74 ertificate, dest
f070: 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 [idx].certificat
f080: 65 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 72 65 74 e_len);..}...ret
f090: 75 72 6e 28 64 65 73 74 29 3b 0a 7d 0a 0a 2f 2a urn(dest);.}../*
f0a0: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 . * SYNPOSIS. *
f0b0: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 .... *. * AR
f0c0: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e GUMENTS. * .
f0d0: 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 ... *. * RETURN
f0e0: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e VALUE. * ...
f0f0: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 . *. * NOTES. *
f100: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 .... *. */.s
f110: 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63 tatic struct cac
f120: 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 key_pcsc_identit
f130: 79 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 y *cackey_read_c
f140: 65 72 74 73 28 73 74 72 75 63 74 20 63 61 63 6b erts(struct cack
f150: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 73 ey_slot *slot, s
f160: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 truct cackey_pcs
f170: 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 65 72 74 c_identity *cert
f180: 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 s, unsigned long
f190: 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 73 74 72 75 *count) {..stru
f1a0: 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 ct cackey_pcsc_i
f1b0: 64 65 6e 74 69 74 79 20 2a 63 75 72 72 5f 69 64 dentity *curr_id
f1c0: 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 ;..struct cackey
f1d0: 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 63 63 _tlv_entity *ccc
f1e0: 5f 74 6c 76 2c 20 2a 63 63 63 5f 63 75 72 72 2c _tlv, *ccc_curr,
f1f0: 20 2a 61 70 70 5f 74 6c 76 2c 20 2a 61 70 70 5f *app_tlv, *app_
f200: 63 75 72 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20 curr;..unsigned
f210: 63 68 61 72 20 63 63 63 5f 61 69 64 5b 5d 20 3d char ccc_aid[] =
f220: 20 7b 47 53 43 49 53 5f 41 49 44 5f 43 43 43 7d {GSCIS_AID_CCC}
f230: 2c 20 70 69 76 5f 61 69 64 5b 5d 20 3d 20 7b 4e , piv_aid[] = {N
f240: 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 50 49 ISTSP800_73_3_PI
f250: 56 5f 41 49 44 7d 3b 0a 09 75 6e 73 69 67 6e 65 V_AID};..unsigne
f260: 64 20 63 68 61 72 20 2a 70 69 76 5f 6f 69 64 2c d char *piv_oid,
f270: 20 70 69 76 5f 6f 69 64 5f 70 69 76 61 75 74 68 piv_oid_pivauth
f280: 5b 5d 20 3d 20 7b 4e 49 53 54 53 50 38 30 30 5f [] = {NISTSP800_
f290: 37 33 5f 33 5f 4f 49 44 5f 50 49 56 41 55 54 48 73_3_OID_PIVAUTH
f2a0: 7d 2c 20 70 69 76 5f 6f 69 64 5f 73 69 67 6e 61 }, piv_oid_signa
f2b0: 74 75 72 65 5b 5d 20 3d 20 7b 4e 49 53 54 53 50 ture[] = {NISTSP
f2c0: 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 53 49 47 800_73_3_OID_SIG
f2d0: 4e 41 54 55 52 45 7d 2c 20 70 69 76 5f 6f 69 64 NATURE}, piv_oid
f2e0: 5f 6b 65 79 6d 67 74 5b 5d 20 3d 20 7b 4e 49 53 _keymgt[] = {NIS
f2f0: 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f TSP800_73_3_OID_
f300: 4b 45 59 4d 47 54 7d 3b 0a 09 75 6e 73 69 67 6e KEYMGT};..unsign
f310: 65 64 20 63 68 61 72 20 63 75 72 72 5f 61 69 64 ed char curr_aid
f320: 5b 37 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 [7];..unsigned c
f330: 68 61 72 20 62 75 66 66 65 72 5b 38 31 39 32 5d har buffer[8192]
f340: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 ;..unsigned long
f350: 20 6f 75 74 69 64 78 20 3d 20 30 3b 0a 09 63 61 outidx = 0;..ca
f360: 63 6b 65 79 5f 72 65 74 20 74 72 61 6e 73 61 63 ckey_ret transac
f370: 74 69 6f 6e 5f 72 65 74 3b 0a 09 73 73 69 7a 65 tion_ret;..ssize
f380: 5f 74 20 72 65 61 64 5f 72 65 74 3b 0a 09 69 6e _t read_ret;..in
f390: 74 20 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c t certs_resizabl
f3a0: 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 e;..int send_ret
f3b0: 2c 20 73 65 6c 65 63 74 5f 72 65 74 3b 0a 09 69 , select_ret;..i
f3c0: 6e 74 20 70 69 76 5f 6b 65 79 2c 20 70 69 76 20 nt piv_key, piv
f3d0: 3d 20 30 3b 0a 09 69 6e 74 20 69 64 78 3b 0a 0a = 0;..int idx;..
f3e0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
f3f0: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
f400: 0a 0a 09 69 66 20 28 63 6f 75 6e 74 20 3d 3d 20 ...if (count ==
f410: 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 NULL) {...CACKEY
f420: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 _DEBUG_PRINTF("c
f430: 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 72 65 ount is NULL, re
f440: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 turning in failu
f450: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 re");....return(
f460: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 NULL);..}...if (
f470: 63 65 72 74 73 20 21 3d 20 4e 55 4c 4c 29 20 7b certs != NULL) {
f480: 0a 09 09 69 66 20 28 2a 63 6f 75 6e 74 20 3d 3d ...if (*count ==
f490: 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 0) {....CACKEY_
f4a0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
f4b0: 71 75 65 73 74 65 64 20 77 65 20 72 65 74 75 72 quested we retur
f4c0: 6e 20 30 20 6f 62 6a 65 63 74 73 2c 20 73 68 6f n 0 objects, sho
f4d0: 72 74 2d 63 69 72 63 75 69 74 22 29 3b 0a 0a 09 rt-circuit");...
f4e0: 09 09 72 65 74 75 72 6e 28 63 65 72 74 73 29 3b ..return(certs);
f4f0: 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 21 73 ...}..}...if (!s
f500: 6c 6f 74 2d 3e 73 6c 6f 74 5f 72 65 73 65 74 29 lot->slot_reset)
f510: 20 7b 0a 09 09 69 66 20 28 73 6c 6f 74 2d 3e 63 {...if (slot->c
f520: 61 63 68 65 64 5f 63 65 72 74 73 29 20 7b 0a 09 ached_certs) {..
f530: 09 09 69 66 20 28 63 65 72 74 73 20 3d 3d 20 4e ..if (certs == N
f540: 55 4c 4c 29 20 7b 0a 09 09 09 09 63 65 72 74 73 ULL) {.....certs
f550: 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 = malloc(sizeof
f560: 28 2a 63 65 72 74 73 29 20 2a 20 73 6c 6f 74 2d (*certs) * slot-
f570: 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f >cached_certs_co
f580: 75 6e 74 29 3b 0a 09 09 09 09 2a 63 6f 75 6e 74 unt);.....*count
f590: 20 3d 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f = slot->cached_
f5a0: 63 65 72 74 73 5f 63 6f 75 6e 74 3b 0a 0a 09 09 certs_count;....
f5b0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 69 66 .} else {.....if
f5c0: 20 28 2a 63 6f 75 6e 74 20 3e 20 73 6c 6f 74 2d (*count > slot-
f5d0: 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f >cached_certs_co
f5e0: 75 6e 74 29 20 7b 0a 09 09 09 09 09 2a 63 6f 75 unt) {......*cou
f5f0: 6e 74 20 3d 20 73 6c 6f 74 2d 3e 63 61 63 68 65 nt = slot->cache
f600: 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 3b 0a 09 d_certs_count;..
f610: 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 63 61 ...}....}.....ca
f620: 63 6b 65 79 5f 63 6f 70 79 5f 63 65 72 74 73 28 ckey_copy_certs(
f630: 63 65 72 74 73 2c 20 73 6c 6f 74 2d 3e 63 61 63 certs, slot->cac
f640: 68 65 64 5f 63 65 72 74 73 2c 20 2a 63 6f 75 6e hed_certs, *coun
f650: 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 63 t);.....return(c
f660: 65 72 74 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 erts);...}..}...
f670: 69 66 20 28 73 6c 6f 74 2d 3e 63 61 63 68 65 64 if (slot->cached
f680: 5f 63 65 72 74 73 29 20 7b 0a 09 09 63 61 63 6b _certs) {...cack
f690: 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 73 6c ey_free_certs(sl
f6a0: 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 ot->cached_certs
f6b0: 2c 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 , slot->cached_c
f6c0: 65 72 74 73 5f 63 6f 75 6e 74 2c 20 31 29 3b 0a erts_count, 1);.
f6d0: 0a 09 09 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f ...slot->cached_
f6e0: 63 65 72 74 73 20 3d 20 4e 55 4c 4c 3b 0a 09 7d certs = NULL;..}
f6f0: 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 61 20 53 6d .../* Begin a Sm
f700: 61 72 74 43 61 72 64 20 74 72 61 6e 73 61 63 74 artCard transact
f710: 69 6f 6e 20 2a 2f 0a 09 74 72 61 6e 73 61 63 74 ion */..transact
f720: 69 6f 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 ion_ret = cackey
f730: 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 _begin_transacti
f740: 6f 6e 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28 74 on(slot);..if (t
f750: 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74 20 21 ransaction_ret !
f760: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f = CACKEY_PCSC_S_
f770: 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 OK) {...CACKEY_D
f780: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 EBUG_PRINTF("Una
f790: 62 6c 65 20 62 65 67 69 6e 20 74 72 61 6e 73 61 ble begin transa
f7a0: 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e 69 6e 67 ction, returning
f7b0: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a in failure");..
f7c0: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a ..return(NULL);.
f7d0: 09 7d 0a 0a 09 69 66 20 28 63 65 72 74 73 20 3d .}...if (certs =
f7e0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 65 72 74 = NULL) {...cert
f7f0: 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f s = malloc(sizeo
f800: 66 28 2a 63 65 72 74 73 29 20 2a 20 35 29 3b 0a f(*certs) * 5);.
f810: 09 09 2a 63 6f 75 6e 74 20 3d 20 35 3b 0a 09 09 ..*count = 5;...
f820: 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 20 certs_resizable
f830: 3d 20 31 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 = 1;..} else {..
f840: 09 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 .certs_resizable
f850: 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 = 0;..}.../* Se
f860: 6c 65 63 74 20 74 68 65 20 43 43 43 20 41 70 70 lect the CCC App
f870: 6c 65 74 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74 let */..send_ret
f880: 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 = cackey_select
f890: 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63 63 _applet(slot, cc
f8a0: 63 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 63 63 c_aid, sizeof(cc
f8b0: 63 5f 61 69 64 29 29 3b 0a 09 69 66 20 28 73 65 c_aid));..if (se
f8c0: 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 nd_ret != CACKEY
f8d0: 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 _PCSC_S_OK) {...
f8e0: 2f 2a 20 54 72 79 20 50 49 56 20 61 70 70 6c 69 /* Try PIV appli
f8f0: 63 61 74 69 6f 6e 20 2a 2f 0a 09 09 73 65 6e 64 cation */...send
f900: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 _ret = cackey_se
f910: 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 lect_applet(slot
f920: 2c 20 70 69 76 5f 61 69 64 2c 20 73 69 7a 65 6f , piv_aid, sizeo
f930: 66 28 70 69 76 5f 61 69 64 29 29 3b 0a 09 09 69 f(piv_aid));...i
f940: 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 f (send_ret == C
f950: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 ACKEY_PCSC_S_OK)
f960: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 {....CACKEY_DEB
f970: 55 47 5f 50 52 49 4e 54 46 28 22 57 65 20 68 61 UG_PRINTF("We ha
f980: 76 65 20 61 20 50 49 56 20 63 61 72 64 2c 20 64 ve a PIV card, d
f990: 6f 69 6e 67 20 74 68 65 20 6e 65 65 64 66 75 6c oing the needful
f9a0: 22 29 3b 0a 0a 09 09 09 70 69 76 20 3d 20 31 3b ");.....piv = 1;
f9b0: 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 0a 09 09 09 ...} else {.....
f9c0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
f9d0: 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 73 NTF("Unable to s
f9e0: 65 6c 65 63 74 20 43 43 43 20 41 70 70 6c 65 74 elect CCC Applet
f9f0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 , returning in f
fa00: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 2f 2a ailure");...../*
fa10: 20 54 65 72 6d 69 6e 61 74 65 20 53 6d 61 72 74 Terminate Smart
fa20: 43 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e Card Transaction
fa30: 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e */....cackey_en
fa40: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c d_transaction(sl
fa50: 6f 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 ot);.....return(
fa60: 4e 55 4c 4c 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 NULL);...}..}...
fa70: 69 66 20 28 70 69 76 29 20 7b 0a 09 09 66 6f 72 if (piv) {...for
fa80: 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c (idx = 0; idx <
fa90: 20 33 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 09 3; idx++) {....
faa0: 73 77 69 74 63 68 20 28 69 64 78 29 20 7b 0a 09 switch (idx) {..
fab0: 09 09 09 63 61 73 65 20 30 3a 0a 09 09 09 09 09 ...case 0:......
fac0: 70 69 76 5f 6f 69 64 20 3d 20 70 69 76 5f 6f 69 piv_oid = piv_oi
fad0: 64 5f 70 69 76 61 75 74 68 3b 0a 09 09 09 09 09 d_pivauth;......
fae0: 70 69 76 5f 6b 65 79 20 3d 20 4e 49 53 54 53 50 piv_key = NISTSP
faf0: 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 50 49 56 800_78_3_KEY_PIV
fb00: 41 55 54 48 3b 0a 09 09 09 09 09 62 72 65 61 6b AUTH;......break
fb10: 3b 0a 09 09 09 09 63 61 73 65 20 31 3a 0a 09 09 ;.....case 1:...
fb20: 09 09 09 70 69 76 5f 6f 69 64 20 3d 20 70 69 76 ...piv_oid = piv
fb30: 5f 6f 69 64 5f 73 69 67 6e 61 74 75 72 65 3b 0a _oid_signature;.
fb40: 09 09 09 09 09 70 69 76 5f 6b 65 79 20 3d 20 4e .....piv_key = N
fb50: 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 ISTSP800_78_3_KE
fb60: 59 5f 53 49 47 4e 41 54 55 52 45 3b 0a 09 09 09 Y_SIGNATURE;....
fb70: 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 63 61 73 ..break;.....cas
fb80: 65 20 32 3a 0a 09 09 09 09 09 70 69 76 5f 6f 69 e 2:......piv_oi
fb90: 64 20 3d 20 70 69 76 5f 6f 69 64 5f 6b 65 79 6d d = piv_oid_keym
fba0: 67 74 3b 0a 09 09 09 09 09 70 69 76 5f 6b 65 79 gt;......piv_key
fbb0: 20 3d 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f = NISTSP800_78_
fbc0: 33 5f 4b 45 59 5f 4b 45 59 4d 47 54 3b 0a 09 09 3_KEY_KEYMGT;...
fbd0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 0a ...break;....}..
fbe0: 09 09 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61 ...read_ret = ca
fbf0: 63 6b 65 79 5f 67 65 74 5f 64 61 74 61 28 73 6c ckey_get_data(sl
fc00: 6f 74 2c 20 62 75 66 66 65 72 2c 20 73 69 7a 65 ot, buffer, size
fc10: 6f 66 28 62 75 66 66 65 72 29 2c 20 70 69 76 5f of(buffer), piv_
fc20: 6f 69 64 29 3b 0a 0a 09 09 09 69 66 20 28 72 65 oid);.....if (re
fc30: 61 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09 ad_ret <= 0) {..
fc40: 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 ...continue;....
fc50: 7d 0a 0a 09 09 09 63 75 72 72 5f 69 64 20 3d 20 }.....curr_id =
fc60: 26 63 65 72 74 73 5b 6f 75 74 69 64 78 5d 3b 0a &certs[outidx];.
fc70: 09 09 09 6f 75 74 69 64 78 2b 2b 3b 0a 0a 09 09 ...outidx++;....
fc80: 09 63 75 72 72 5f 69 64 2d 3e 6b 65 79 73 69 7a .curr_id->keysiz
fc90: 65 20 3d 20 2d 31 3b 0a 09 09 09 63 75 72 72 5f e = -1;....curr_
fca0: 69 64 2d 3e 66 69 6c 65 20 3d 20 30 78 46 46 46 id->file = 0xFFF
fcb0: 46 3b 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 61 F;....curr_id->a
fcc0: 70 70 6c 65 74 5b 30 5d 20 3d 20 70 69 76 5f 6b pplet[0] = piv_k
fcd0: 65 79 3b 0a 0a 09 09 09 63 75 72 72 5f 69 64 2d ey;.....curr_id-
fce0: 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e >certificate_len
fcf0: 20 3d 20 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 = read_ret;....
fd00: 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 curr_id->certifi
fd10: 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75 cate = malloc(cu
fd20: 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 rr_id->certifica
fd30: 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 6d 65 6d 63 te_len);....memc
fd40: 70 79 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 py(curr_id->cert
fd50: 69 66 69 63 61 74 65 2c 20 62 75 66 66 65 72 20 ificate, buffer
fd60: 2b 20 34 2c 20 63 75 72 72 5f 69 64 2d 3e 63 65 + 4, curr_id->ce
fd70: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 2d 20 rtificate_len -
fd80: 34 29 3b 20 2f 2a 20 58 58 58 20 54 4f 44 4f 20 4); /* XXX TODO
fd90: 50 49 56 20 28 2d 34 20 68 65 61 64 65 72 2c 20 PIV (-4 header,
fda0: 2d 35 20 74 72 61 69 6c 65 72 20 3d 3d 20 77 68 -5 trailer == wh
fdb0: 79 20 3f 29 20 2a 2f 0a 09 09 09 63 75 72 72 5f y ?) */....curr_
fdc0: 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f id->certificate_
fdd0: 6c 65 6e 20 2d 3d 20 34 3b 0a 09 09 09 63 75 72 len -= 4;....cur
fde0: 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 r_id->certificat
fdf0: 65 5f 6c 65 6e 20 2d 3d 20 35 3b 0a 09 09 7d 0a e_len -= 5;...}.
fe00: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 2f 2a 20 52 .} else {.../* R
fe10: 65 61 64 20 61 6c 6c 20 74 68 65 20 61 70 70 6c ead all the appl
fe20: 65 74 73 20 66 72 6f 6d 20 74 68 65 20 43 43 43 ets from the CCC
fe30: 27 73 20 54 4c 56 20 2a 2f 0a 09 09 63 63 63 5f 's TLV */...ccc_
fe40: 74 6c 76 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 tlv = cackey_rea
fe50: 64 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a 0a 09 09 d_tlv(slot);....
fe60: 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 43 41 52 44 /* Look for CARD
fe70: 55 52 4c 73 20 74 68 61 74 20 63 6f 6f 72 65 73 URLs that coores
fe80: 70 6f 6e 64 20 74 6f 20 50 4b 49 20 61 70 70 6c pond to PKI appl
fe90: 65 74 73 20 2a 2f 0a 09 09 66 6f 72 20 28 63 63 ets */...for (cc
fea0: 63 5f 63 75 72 72 20 3d 20 63 63 63 5f 74 6c 76 c_curr = ccc_tlv
feb0: 3b 20 63 63 63 5f 63 75 72 72 3b 20 63 63 63 5f ; ccc_curr; ccc_
fec0: 63 75 72 72 20 3d 20 63 63 63 5f 63 75 72 72 2d curr = ccc_curr-
fed0: 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 09 43 41 43 >_next) {....CAC
fee0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
fef0: 28 22 46 6f 75 6e 64 20 74 61 67 3a 20 25 73 20 ("Found tag: %s
ff00: 2e 2e 2e 20 22 2c 20 43 41 43 4b 45 59 5f 44 45 ... ", CACKEY_DE
ff10: 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f BUG_FUNC_TAG_TO_
ff20: 53 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 74 61 STR(ccc_curr->ta
ff30: 67 29 29 3b 0a 0a 09 09 09 69 66 20 28 63 63 63 g));.....if (ccc
ff40: 5f 63 75 72 72 2d 3e 74 61 67 20 21 3d 20 47 53 _curr->tag != GS
ff50: 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 29 CIS_TAG_CARDURL)
ff60: 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 {.....CACKEY_DE
ff70: 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e BUG_PRINTF(" ..
ff80: 2e 20 73 6b 69 70 70 69 6e 67 20 69 74 20 28 77 . skipping it (w
ff90: 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 e only care abou
ffa0: 74 20 43 41 52 44 55 52 4c 73 29 22 29 3b 0a 0a t CARDURLs)");..
ffb0: 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 ....continue;...
ffc0: 09 7d 0a 0a 09 09 09 69 66 20 28 28 63 63 63 5f .}.....if ((ccc_
ffd0: 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 curr->value_card
ffe0: 75 72 6c 2d 3e 61 70 70 74 79 70 65 20 26 20 43 url->apptype & C
fff0: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b ACKEY_TLV_APP_PK
10000 49 29 20 21 3d 20 43 41 43 4b 45 59 5f 54 4c 56 I) != CACKEY_TLV
10010 5f 41 50 50 5f 50 4b 49 29 20 7b 0a 09 09 09 09 _APP_PKI) {.....
10020 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
10030 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70 70 NTF(" ... skipp
10040 69 6e 67 20 69 74 20 28 77 65 20 6f 6e 6c 79 20 ing it (we only
10050 63 61 72 65 20 61 62 6f 75 74 20 50 4b 49 20 61 care about PKI a
10060 70 70 6c 65 74 73 2c 20 74 68 69 73 20 61 70 70 pplets, this app
10070 6c 65 74 20 73 75 70 70 6f 72 74 73 3a 20 25 73 let supports: %s
10080 2f 25 30 32 78 29 22 2c 20 43 41 43 4b 45 59 5f /%02x)", CACKEY_
10090 44 45 42 55 47 5f 46 55 4e 43 5f 41 50 50 54 59 DEBUG_FUNC_APPTY
100a0 50 45 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 PE_TO_STR(ccc_cu
100b0 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 rr->value_cardur
100c0 6c 2d 3e 61 70 70 74 79 70 65 29 2c 20 28 75 6e l->apptype), (un
100d0 73 69 67 6e 65 64 20 69 6e 74 29 20 63 63 63 5f signed int) ccc_
100e0 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 curr->value_card
100f0 75 72 6c 2d 3e 61 70 70 74 79 70 65 29 3b 0a 0a url->apptype);..
10100 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 ....continue;...
10110 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 .}.....CACKEY_DE
10120 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 52 49 BUG_PRINTBUF("RI
10130 44 3a 22 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76 D:", ccc_curr->v
10140 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 alue_cardurl->ri
10150 64 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 63 75 d, sizeof(ccc_cu
10160 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 rr->value_cardur
10170 6c 2d 3e 72 69 64 29 29 3b 0a 09 09 09 43 41 43 l->rid));....CAC
10180 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
10190 28 22 41 70 70 49 44 20 3d 20 25 73 2f 25 30 34 ("AppID = %s/%04
101a0 6c 78 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 lx", CACKEY_DEBU
101b0 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f G_FUNC_OBJID_TO_
101c0 53 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 STR(ccc_curr->va
101d0 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 lue_cardurl->app
101e0 69 64 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c id), (unsigned l
101f0 6f 6e 67 29 20 63 63 63 5f 63 75 72 72 2d 3e 76 ong) ccc_curr->v
10200 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 alue_cardurl->ap
10210 70 69 64 29 3b 0a 09 09 09 43 41 43 4b 45 59 5f pid);....CACKEY_
10220 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 62 DEBUG_PRINTF("Ob
10230 6a 65 63 74 49 44 20 3d 20 25 73 2f 25 30 34 6c jectID = %s/%04l
10240 78 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 x", CACKEY_DEBUG
10250 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 _FUNC_OBJID_TO_S
10260 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c TR(ccc_curr->val
10270 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 ue_cardurl->obje
10280 63 74 69 64 29 2c 20 28 75 6e 73 69 67 6e 65 64 ctid), (unsigned
10290 20 6c 6f 6e 67 29 20 63 63 63 5f 63 75 72 72 2d long) ccc_curr-
102a0 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e >value_cardurl->
102b0 6f 62 6a 65 63 74 69 64 29 3b 0a 0a 09 09 09 6d objectid);.....m
102c0 65 6d 63 70 79 28 63 75 72 72 5f 61 69 64 2c 20 emcpy(curr_aid,
102d0 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f ccc_curr->value_
102e0 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20 73 69 cardurl->rid, si
102f0 7a 65 6f 66 28 63 63 63 5f 63 75 72 72 2d 3e 76 zeof(ccc_curr->v
10300 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 alue_cardurl->ri
10310 64 29 29 3b 0a 09 09 09 63 75 72 72 5f 61 69 64 d));....curr_aid
10320 5b 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 69 64 [sizeof(curr_aid
10330 29 20 2d 20 32 5d 20 3d 20 28 63 63 63 5f 63 75 ) - 2] = (ccc_cu
10340 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 rr->value_cardur
10350 6c 2d 3e 61 70 70 69 64 20 3e 3e 20 38 29 20 26 l->appid >> 8) &
10360 20 30 78 66 66 3b 0a 09 09 09 63 75 72 72 5f 61 0xff;....curr_a
10370 69 64 5b 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 id[sizeof(curr_a
10380 69 64 29 20 2d 20 31 5d 20 3d 20 63 63 63 5f 63 id) - 1] = ccc_c
10390 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 urr->value_cardu
103a0 72 6c 2d 3e 61 70 70 69 64 20 26 20 30 78 66 66 rl->appid & 0xff
103b0 3b 0a 0a 09 09 09 2f 2a 20 53 65 6c 65 63 74 20 ;...../* Select
103c0 66 6f 75 6e 64 20 61 70 70 6c 65 74 20 2e 2e 2e found applet ...
103d0 20 2a 2f 0a 09 09 09 73 65 6c 65 63 74 5f 72 65 */....select_re
103e0 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 t = cackey_selec
103f0 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63 t_applet(slot, c
10400 75 72 72 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 urr_aid, sizeof(
10410 63 75 72 72 5f 61 69 64 29 29 3b 0a 09 09 09 69 curr_aid));....i
10420 66 20 28 73 65 6c 65 63 74 5f 72 65 74 20 21 3d f (select_ret !=
10430 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f CACKEY_PCSC_S_O
10440 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f K) {.....CACKEY_
10450 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 DEBUG_PRINTF("Fa
10460 69 6c 65 64 20 74 6f 20 73 65 6c 65 63 74 20 61 iled to select a
10470 70 70 6c 65 74 2c 20 73 6b 69 70 70 69 6e 67 20 pplet, skipping
10480 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68 processing of th
10490 69 73 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 is object");....
104a0 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d ..continue;....}
104b0 0a 0a 09 09 09 2f 2a 20 2e 2e 2e 20 61 6e 64 20 ...../* ... and
104c0 6f 62 6a 65 63 74 20 28 66 69 6c 65 29 20 2a 2f object (file) */
104d0 0a 09 09 09 73 65 6c 65 63 74 5f 72 65 74 20 3d ....select_ret =
104e0 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 cackey_select_f
104f0 69 6c 65 28 73 6c 6f 74 2c 20 63 63 63 5f 63 75 ile(slot, ccc_cu
10500 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 rr->value_cardur
10510 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 3b 0a 09 09 l->objectid);...
10520 09 69 66 20 28 73 65 6c 65 63 74 5f 72 65 74 20 .if (select_ret
10530 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 != CACKEY_PCSC_S
10540 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 _OK) {.....CACKE
10550 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
10560 46 61 69 6c 65 64 20 74 6f 20 73 65 6c 65 63 74 Failed to select
10570 20 66 69 6c 65 2c 20 73 6b 69 70 70 69 6e 67 20 file, skipping
10580 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68 processing of th
10590 69 73 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 is object");....
105a0 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d ..continue;....}
105b0 0a 0a 09 09 09 2f 2a 20 50 72 6f 63 65 73 73 20 ...../* Process
105c0 74 68 69 73 20 66 69 6c 65 27 73 20 54 4c 56 20 this file's TLV
105d0 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 63 65 72 74 looking for cert
105e0 69 66 69 63 61 74 65 73 20 2a 2f 0a 09 09 09 61 ificates */....a
105f0 70 70 5f 74 6c 76 20 3d 20 63 61 63 6b 65 79 5f pp_tlv = cackey_
10600 72 65 61 64 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a read_tlv(slot);.
10610 09 0a 09 09 09 66 6f 72 20 28 61 70 70 5f 63 75 .....for (app_cu
10620 72 72 20 3d 20 61 70 70 5f 74 6c 76 3b 20 61 70 rr = app_tlv; ap
10630 70 5f 63 75 72 72 3b 20 61 70 70 5f 63 75 72 72 p_curr; app_curr
10640 20 3d 20 61 70 70 5f 63 75 72 72 2d 3e 5f 6e 65 = app_curr->_ne
10650 78 74 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 xt) {.....CACKEY
10660 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 _DEBUG_PRINTF("F
10670 6f 75 6e 64 20 74 61 67 3a 20 25 73 22 2c 20 43 ound tag: %s", C
10680 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 ACKEY_DEBUG_FUNC
10690 5f 54 41 47 5f 54 4f 5f 53 54 52 28 61 70 70 5f _TAG_TO_STR(app_
106a0 63 75 72 72 2d 3e 74 61 67 29 29 3b 0a 09 09 09 curr->tag));....
106b0 09 69 66 20 28 61 70 70 5f 63 75 72 72 2d 3e 74 .if (app_curr->t
106c0 61 67 20 21 3d 20 47 53 43 49 53 5f 54 41 47 5f ag != GSCIS_TAG_
106d0 43 45 52 54 49 46 49 43 41 54 45 29 20 7b 0a 09 CERTIFICATE) {..
106e0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
106f0 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73 _PRINTF(" ... s
10700 6b 69 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f kipping it (we o
10710 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 43 nly care about C
10720 45 52 54 49 46 49 43 41 54 45 73 29 22 29 3b 0a ERTIFICATEs)");.
10730 0a 09 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a ......continue;.
10740 09 09 09 09 7d 0a 0a 09 09 09 09 63 75 72 72 5f ....}......curr_
10750 69 64 20 3d 20 26 63 65 72 74 73 5b 6f 75 74 69 id = &certs[outi
10760 64 78 5d 3b 0a 09 09 09 09 6f 75 74 69 64 78 2b dx];.....outidx+
10770 2b 3b 0a 0a 09 09 09 09 6d 65 6d 63 70 79 28 63 +;......memcpy(c
10780 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 2c 20 urr_id->applet,
10790 63 75 72 72 5f 61 69 64 2c 20 73 69 7a 65 6f 66 curr_aid, sizeof
107a0 28 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 (curr_id->applet
107b0 29 29 3b 0a 09 09 09 09 63 75 72 72 5f 69 64 2d ));.....curr_id-
107c0 3e 66 69 6c 65 20 3d 20 63 63 63 5f 63 75 72 72 >file = ccc_curr
107d0 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d ->value_cardurl-
107e0 3e 6f 62 6a 65 63 74 69 64 3b 0a 09 09 09 09 63 >objectid;.....c
107f0 75 72 72 5f 69 64 2d 3e 6b 65 79 73 69 7a 65 20 urr_id->keysize
10800 3d 20 2d 31 3b 0a 0a 09 09 09 09 43 41 43 4b 45 = -1;......CACKE
10810 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
10820 46 69 6c 6c 69 6e 67 20 63 75 72 72 5f 69 64 2d Filling curr_id-
10830 3e 61 70 70 6c 65 74 20 28 25 70 29 20 77 69 74 >applet (%p) wit
10840 68 20 25 6c 75 20 62 79 74 65 73 3a 22 2c 20 63 h %lu bytes:", c
10850 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 2c 20 urr_id->applet,
10860 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
10870 73 69 7a 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e sizeof(curr_id->
10880 61 70 70 6c 65 74 29 29 3b 0a 09 09 09 09 43 41 applet));.....CA
10890 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
108a0 42 55 46 28 22 56 41 4c 3a 22 2c 20 63 75 72 72 BUF("VAL:", curr
108b0 5f 69 64 2d 3e 61 70 70 6c 65 74 2c 20 73 69 7a _id->applet, siz
108c0 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e 61 70 70 eof(curr_id->app
108d0 6c 65 74 29 29 3b 0a 0a 09 09 09 09 63 75 72 72 let));......curr
108e0 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 _id->certificate
108f0 5f 6c 65 6e 20 3d 20 61 70 70 5f 63 75 72 72 2d _len = app_curr-
10900 3e 6c 65 6e 67 74 68 3b 0a 0a 09 09 09 09 63 75 >length;......cu
10910 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 rr_id->certifica
10920 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72 te = malloc(curr
10930 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 _id->certificate
10940 5f 6c 65 6e 29 3b 0a 09 09 09 09 6d 65 6d 63 70 _len);.....memcp
10950 79 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 y(curr_id->certi
10960 66 69 63 61 74 65 2c 20 61 70 70 5f 63 75 72 72 ficate, app_curr
10970 2d 3e 76 61 6c 75 65 2c 20 63 75 72 72 5f 69 64 ->value, curr_id
10980 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 ->certificate_le
10990 6e 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 75 74 n);......if (out
109a0 69 64 78 20 3e 3d 20 2a 63 6f 75 6e 74 29 20 7b idx >= *count) {
109b0 0a 09 09 09 09 09 69 66 20 28 63 65 72 74 73 5f ......if (certs_
109c0 72 65 73 69 7a 61 62 6c 65 29 20 7b 0a 09 09 09 resizable) {....
109d0 09 09 09 2a 63 6f 75 6e 74 20 2a 3d 20 32 3b 0a ...*count *= 2;.
109e0 09 09 09 09 09 09 63 65 72 74 73 20 3d 20 72 65 ......certs = re
109f0 61 6c 6c 6f 63 28 63 65 72 74 73 2c 20 73 69 7a alloc(certs, siz
10a00 65 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 28 2a eof(*certs) * (*
10a10 63 6f 75 6e 74 29 29 3b 0a 09 09 09 09 09 7d 20 count));......}
10a20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 62 72 65 else {.......bre
10a30 61 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d ak;......}.....}
10a40 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 ....}.....cackey
10a50 5f 66 72 65 65 5f 74 6c 76 28 61 70 70 5f 74 6c _free_tlv(app_tl
10a60 76 29 3b 0a 0a 09 09 09 69 66 20 28 6f 75 74 69 v);.....if (outi
10a70 64 78 20 3e 3d 20 2a 63 6f 75 6e 74 29 20 7b 0a dx >= *count) {.
10a80 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a ....break;....}.
10a90 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 66 72 ..}....cackey_fr
10aa0 65 65 5f 74 6c 76 28 63 63 63 5f 74 6c 76 29 3b ee_tlv(ccc_tlv);
10ab0 0a 09 7d 0a 0a 09 2a 63 6f 75 6e 74 20 3d 20 6f ..}...*count = o
10ac0 75 74 69 64 78 3b 0a 0a 09 69 66 20 28 63 65 72 utidx;...if (cer
10ad0 74 73 5f 72 65 73 69 7a 61 62 6c 65 29 20 7b 0a ts_resizable) {.
10ae0 09 09 63 65 72 74 73 20 3d 20 72 65 61 6c 6c 6f ..certs = reallo
10af0 63 28 63 65 72 74 73 2c 20 73 69 7a 65 6f 66 28 c(certs, sizeof(
10b00 2a 63 65 72 74 73 29 20 2a 20 28 2a 63 6f 75 6e *certs) * (*coun
10b10 74 29 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e t));..}...slot->
10b20 63 61 63 68 65 64 5f 63 65 72 74 73 20 3d 20 63 cached_certs = c
10b30 61 63 6b 65 79 5f 63 6f 70 79 5f 63 65 72 74 73 ackey_copy_certs
10b40 28 4e 55 4c 4c 2c 20 63 65 72 74 73 2c 20 2a 63 (NULL, certs, *c
10b50 6f 75 6e 74 29 3b 0a 09 73 6c 6f 74 2d 3e 63 61 ount);..slot->ca
10b60 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 ched_certs_count
10b70 20 3d 20 2a 63 6f 75 6e 74 3b 0a 0a 09 2f 2a 20 = *count;.../*
10b80 54 65 72 6d 69 6e 61 74 65 20 53 6d 61 72 74 43 Terminate SmartC
10b90 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 ard Transaction
10ba0 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 */..cackey_end_t
10bb0 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 ransaction(slot)
10bc0 3b 0a 0a 09 72 65 74 75 72 6e 28 63 65 72 74 73 ;...return(certs
10bd0 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 );.}../*. * SYNP
10be0 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a OSIS. * ....
10bf0 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a *. * ARGUMENTS.
10c00 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a * .... *. *
10c10 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a RETURN VALUE. *
10c20 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e .... *. * N
10c30 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a OTES. * ....
10c40 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73 *. */.static ss
10c50 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 73 69 67 ize_t cackey_sig
10c60 6e 64 65 63 72 79 70 74 28 73 74 72 75 63 74 20 ndecrypt(struct
10c70 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f cackey_slot *slo
10c80 74 2c 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 t, struct cackey
10c90 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 _identity *ident
10ca0 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 ity, unsigned ch
10cb0 61 72 20 2a 62 75 66 2c 20 73 69 7a 65 5f 74 20 ar *buf, size_t
10cc0 62 75 66 6c 65 6e 2c 20 75 6e 73 69 67 6e 65 64 buflen, unsigned
10cd0 20 63 68 61 72 20 2a 6f 75 74 62 75 66 2c 20 73 char *outbuf, s
10ce0 69 7a 65 5f 74 20 6f 75 74 62 75 66 6c 65 6e 2c ize_t outbuflen,
10cf0 20 69 6e 74 20 70 61 64 49 6e 70 75 74 2c 20 69 int padInput, i
10d00 6e 74 20 75 6e 70 61 64 4f 75 74 70 75 74 29 20 nt unpadOutput)
10d10 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 {..unsigned char
10d20 20 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 dyn_auth_templa
10d30 74 65 5b 31 30 5d 3b 0a 09 75 6e 73 69 67 6e 65 te[10];..unsigne
10d40 64 20 63 68 61 72 20 2a 74 6d 70 62 75 66 2c 20 d char *tmpbuf,
10d50 2a 74 6d 70 62 75 66 5f 73 2c 20 2a 6f 75 74 62 *tmpbuf_s, *outb
10d60 75 66 5f 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 uf_s;..unsigned
10d70 63 68 61 72 20 62 79 74 65 73 5f 74 6f 5f 73 65 char bytes_to_se
10d80 6e 64 2c 20 70 31 2c 20 63 6c 61 73 73 3b 0a 09 nd, p1, class;..
10d90 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62 6c unsigned char bl
10da0 6f 63 6b 74 79 70 65 3b 0a 09 63 61 63 6b 65 79 ocktype;..cackey
10db0 5f 72 65 74 20 73 65 6e 64 5f 72 65 74 3b 0a 09 _ret send_ret;..
10dc0 75 69 6e 74 31 36 5f 74 20 72 65 73 70 63 6f 64 uint16_t respcod
10dd0 65 3b 0a 09 73 73 69 7a 65 5f 74 20 72 65 74 76 e;..ssize_t retv
10de0 61 6c 20 3d 20 30 2c 20 75 6e 70 61 64 6f 66 66 al = 0, unpadoff
10df0 73 65 74 3b 0a 09 73 69 7a 65 5f 74 20 74 6d 70 set;..size_t tmp
10e00 62 75 66 6c 65 6e 2c 20 70 61 64 6c 65 6e 2c 20 buflen, padlen,
10e10 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 69 tmpoutbuflen;..i
10e20 6e 74 20 66 72 65 65 5f 74 6d 70 62 75 66 20 3d nt free_tmpbuf =
10e30 20 30 3b 0a 09 69 6e 74 20 6c 65 3b 0a 09 69 6e 0;..int le;..in
10e40 74 20 70 69 76 3b 0a 0a 09 43 41 43 4b 45 59 5f t piv;...CACKEY_
10e50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
10e60 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 73 lled.");...if (s
10e70 6c 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 lot == NULL) {..
10e80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
10e90 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 73 6c INTF("Error. sl
10ea0 6f 74 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 ot is NULL");...
10eb0 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a .return(-1);..}.
10ec0 0a 09 69 66 20 28 62 75 66 20 3d 3d 20 4e 55 4c ..if (buf == NUL
10ed0 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 L) {...CACKEY_DE
10ee0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
10ef0 72 2e 20 20 62 75 66 20 69 73 20 4e 55 4c 4c 22 r. buf is NULL"
10f00 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 );....return(-1)
10f10 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 75 74 62 75 ;..}...if (outbu
10f20 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 f == NULL) {...C
10f30 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
10f40 54 46 28 22 45 72 72 6f 72 2e 20 20 6f 75 74 62 TF("Error. outb
10f50 75 66 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 uf is NULL");...
10f60 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a .return(-1);..}.
10f70 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79 20 3d ..if (identity =
10f80 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b = NULL) {...CACK
10f90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
10fa0 22 45 72 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 "Error. identit
10fb0 79 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 y is NULL");....
10fc0 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a return(-1);..}..
10fd0 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 .if (identity->p
10fe0 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 3d 20 csc_identity ==
10ff0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 NULL) {...CACKEY
11000 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
11010 72 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79 2d rror. identity-
11020 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 69 >pcsc_identity i
11030 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 s NULL");....ret
11040 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 2f 2a urn(-1);..}.../*
11050 20 44 65 74 65 72 6d 69 6e 65 20 69 64 65 6e 74 Determine ident
11060 69 74 79 20 4b 65 79 20 73 69 7a 65 20 2a 2f 0a ity Key size */.
11070 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 .if (identity->p
11080 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 csc_identity->ke
11090 79 73 69 7a 65 20 3c 20 30 29 20 7b 0a 09 09 69 ysize < 0) {...i
110a0 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 dentity->pcsc_id
110b0 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 entity->keysize
110c0 3d 20 78 35 30 39 5f 74 6f 5f 6b 65 79 73 69 7a = x509_to_keysiz
110d0 65 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 e(identity->pcsc
110e0 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 _identity->certi
110f0 66 69 63 61 74 65 2c 20 69 64 65 6e 74 69 74 79 ficate, identity
11100 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d ->pcsc_identity-
11110 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e >certificate_len
11120 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 50 61 64 20 6d );..}.../* Pad m
11130 65 73 73 61 67 65 20 74 6f 20 6b 65 79 20 73 69 essage to key si
11140 7a 65 20 2a 2f 0a 09 69 66 20 28 70 61 64 49 6e ze */..if (padIn
11150 70 75 74 29 20 7b 0a 09 09 69 66 20 28 69 64 65 put) {...if (ide
11160 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e ntity->pcsc_iden
11170 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 3e 20 tity->keysize >
11180 30 29 20 7b 0a 09 09 09 69 66 20 28 62 75 66 6c 0) {....if (bufl
11190 65 6e 20 21 3d 20 69 64 65 6e 74 69 74 79 2d 3e en != identity->
111a0 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b pcsc_identity->k
111b0 65 79 73 69 7a 65 29 20 7b 0a 09 09 09 09 69 66 eysize) {.....if
111c0 20 28 62 75 66 6c 65 6e 20 3e 20 28 69 64 65 6e (buflen > (iden
111d0 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 tity->pcsc_ident
111e0 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 2b 20 33 ity->keysize + 3
111f0 29 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 )) {......CACKEY
11200 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
11210 72 72 6f 72 2e 20 20 4d 65 73 73 61 67 65 20 69 rror. Message i
11220 73 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20 73 s too large to s
11230 69 67 6e 2f 64 65 63 72 79 70 74 22 29 3b 0a 0a ign/decrypt");..
11240 09 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b .....return(-1);
11250 0a 09 09 09 09 7d 0a 0a 09 09 09 09 74 6d 70 62 .....}......tmpb
11260 75 66 6c 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 uflen = identity
11270 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d ->pcsc_identity-
11280 3e 6b 65 79 73 69 7a 65 3b 0a 09 09 09 09 74 6d >keysize;.....tm
11290 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d pbuf = malloc(tm
112a0 70 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 66 72 pbuflen);.....fr
112b0 65 65 5f 74 6d 70 62 75 66 20 3d 20 31 3b 0a 0a ee_tmpbuf = 1;..
112c0 09 09 09 09 70 61 64 6c 65 6e 20 3d 20 74 6d 70 ....padlen = tmp
112d0 62 75 66 6c 65 6e 20 2d 20 62 75 66 6c 65 6e 20 buflen - buflen
112e0 2d 20 33 3b 0a 0a 09 09 09 09 2f 2a 20 52 53 41 - 3;....../* RSA
112f0 20 50 4b 43 53 23 31 20 45 4d 53 41 2d 50 4b 43 PKCS#1 EMSA-PKC
11300 53 31 2d 76 31 5f 35 20 50 61 64 64 69 6e 67 20 S1-v1_5 Padding
11310 2a 2f 0a 09 09 09 09 74 6d 70 62 75 66 5b 30 5d */.....tmpbuf[0]
11320 20 3d 20 30 78 30 30 3b 0a 09 09 09 09 74 6d 70 = 0x00;.....tmp
11330 62 75 66 5b 31 5d 20 3d 20 30 78 30 31 3b 0a 09 buf[1] = 0x01;..
11340 09 09 09 6d 65 6d 73 65 74 28 26 74 6d 70 62 75 ...memset(&tmpbu
11350 66 5b 32 5d 2c 20 30 78 46 46 2c 20 70 61 64 6c f[2], 0xFF, padl
11360 65 6e 29 3b 0a 09 09 09 09 74 6d 70 62 75 66 5b en);.....tmpbuf[
11370 70 61 64 6c 65 6e 20 2b 20 32 5d 3d 20 30 78 30 padlen + 2]= 0x0
11380 30 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 26 74 0;.....memcpy(&t
11390 6d 70 62 75 66 5b 70 61 64 6c 65 6e 20 2b 20 33 mpbuf[padlen + 3
113a0 5d 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b ], buf, buflen);
113b0 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 ......CACKEY_DEB
113c0 55 47 5f 50 52 49 4e 54 42 55 46 28 22 55 6e 70 UG_PRINTBUF("Unp
113d0 61 64 64 65 64 3a 22 2c 20 62 75 66 2c 20 62 75 added:", buf, bu
113e0 66 6c 65 6e 29 3b 0a 09 09 09 09 43 41 43 4b 45 flen);.....CACKE
113f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 Y_DEBUG_PRINTBUF
11400 28 22 50 61 64 64 65 64 3a 22 2c 20 74 6d 70 62 ("Padded:", tmpb
11410 75 66 2c 20 74 6d 70 62 75 66 6c 65 6e 29 3b 0a uf, tmpbuflen);.
11420 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 ...} else {.....
11430 74 6d 70 62 75 66 20 3d 20 62 75 66 3b 0a 09 09 tmpbuf = buf;...
11440 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 62 75 ..tmpbuflen = bu
11450 66 6c 65 6e 3b 0a 09 09 09 09 66 72 65 65 5f 74 flen;.....free_t
11460 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09 09 09 70 mpbuf = 0;.....p
11470 61 64 6c 65 6e 20 3d 20 30 3b 0a 09 09 09 7d 0a adlen = 0;....}.
11480 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 ..} else {....CA
11490 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
114a0 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 64 65 74 F("Unable to det
114b0 65 72 6d 69 6e 65 20 6b 65 79 20 73 69 7a 65 2c ermine key size,
114c0 20 68 6f 70 69 6e 67 20 74 68 65 20 6d 65 73 73 hoping the mess
114d0 61 67 65 20 69 73 20 70 72 6f 70 65 72 6c 79 20 age is properly
114e0 70 61 64 64 65 64 21 22 29 3b 0a 0a 09 09 09 74 padded!");.....t
114f0 6d 70 62 75 66 20 3d 20 62 75 66 3b 0a 09 09 09 mpbuf = buf;....
11500 74 6d 70 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c tmpbuflen = bufl
11510 65 6e 3b 0a 09 09 09 66 72 65 65 5f 74 6d 70 62 en;....free_tmpb
11520 75 66 20 3d 20 30 3b 0a 09 09 09 70 61 64 6c 65 uf = 0;....padle
11530 6e 20 3d 20 30 3b 0a 09 09 7d 0a 09 7d 20 65 6c n = 0;...}..} el
11540 73 65 20 7b 0a 09 09 74 6d 70 62 75 66 20 3d 20 se {...tmpbuf =
11550 62 75 66 3b 0a 09 09 74 6d 70 62 75 66 6c 65 6e buf;...tmpbuflen
11560 20 3d 20 62 75 66 6c 65 6e 3b 0a 09 09 66 72 65 = buflen;...fre
11570 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09 e_tmpbuf = 0;...
11580 70 61 64 6c 65 6e 20 3d 20 30 3b 0a 09 7d 0a 0a padlen = 0;..}..
11590 09 2f 2a 20 42 65 67 69 6e 20 74 72 61 6e 73 61 ./* Begin transa
115a0 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 ction */..cackey
115b0 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 _begin_transacti
115c0 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 2f 2a 20 44 on(slot);.../* D
115d0 65 74 65 72 6d 69 6e 65 20 74 79 70 65 20 6f 66 etermine type of
115e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a transaction */.
115f0 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 .if (identity->p
11600 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 66 69 csc_identity->fi
11610 6c 65 20 3d 3d 20 30 78 46 46 46 46 29 20 7b 0a le == 0xFFFF) {.
11620 09 09 70 69 76 20 3d 20 31 3b 0a 09 7d 20 65 6c ..piv = 1;..} el
11630 73 65 20 7b 0a 09 09 70 69 76 20 3d 20 30 3b 0a se {...piv = 0;.
11640 09 7d 0a 0a 09 2f 2a 20 53 65 6c 65 63 74 20 63 .}.../* Select c
11650 6f 72 72 65 63 74 20 61 70 70 6c 65 74 20 2a 2f orrect applet */
11660 0a 09 69 66 20 28 21 70 69 76 29 20 7b 0a 09 09 ..if (!piv) {...
11670 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
11680 4e 54 46 28 22 53 65 6c 65 63 74 69 6e 67 20 61 NTF("Selecting a
11690 70 70 6c 65 74 20 66 6f 75 6e 64 20 61 74 20 25 pplet found at %
116a0 70 20 2e 2e 2e 22 2c 20 69 64 65 6e 74 69 74 79 p ...", identity
116b0 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d ->pcsc_identity-
116c0 3e 61 70 70 6c 65 74 29 3b 0a 09 09 63 61 63 6b >applet);...cack
116d0 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 ey_select_applet
116e0 28 73 6c 6f 74 2c 20 69 64 65 6e 74 69 74 79 2d (slot, identity-
116f0 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e >pcsc_identity->
11700 61 70 70 6c 65 74 2c 20 73 69 7a 65 6f 66 28 69 applet, sizeof(i
11710 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 dentity->pcsc_id
11720 65 6e 74 69 74 79 2d 3e 61 70 70 6c 65 74 29 29 entity->applet))
11730 3b 0a 0a 09 09 2f 2a 20 53 65 6c 65 63 74 20 63 ;..../* Select c
11740 6f 72 72 65 63 74 20 66 69 6c 65 20 2a 2f 0a 09 orrect file */..
11750 09 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 .cackey_select_f
11760 69 6c 65 28 73 6c 6f 74 2c 20 69 64 65 6e 74 69 ile(slot, identi
11770 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 ty->pcsc_identit
11780 79 2d 3e 66 69 6c 65 29 3b 0a 09 7d 20 65 6c 73 y->file);..} els
11790 65 20 7b 0a 09 09 64 79 6e 5f 61 75 74 68 5f 74 e {...dyn_auth_t
117a0 65 6d 70 6c 61 74 65 5b 30 5d 20 3d 20 30 78 37 emplate[0] = 0x7
117b0 43 3b 0a 09 09 64 79 6e 5f 61 75 74 68 5f 74 65 C;...dyn_auth_te
117c0 6d 70 6c 61 74 65 5b 31 5d 20 3d 20 30 78 38 32 mplate[1] = 0x82
117d0 3b 0a 09 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d ;...dyn_auth_tem
117e0 70 6c 61 74 65 5b 32 5d 20 3d 20 28 28 74 6d 70 plate[2] = ((tmp
117f0 62 75 66 6c 65 6e 20 2b 20 36 29 20 26 20 30 78 buflen + 6) & 0x
11800 66 66 30 30 29 20 3e 3e 20 38 3b 0a 09 09 64 79 ff00) >> 8;...dy
11810 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b n_auth_template[
11820 33 5d 20 3d 20 28 74 6d 70 62 75 66 6c 65 6e 20 3] = (tmpbuflen
11830 2b 20 36 29 20 26 20 30 78 30 30 66 66 3b 0a 09 + 6) & 0x00ff;..
11840 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 .dyn_auth_templa
11850 74 65 5b 34 5d 20 3d 20 30 78 38 32 3b 0a 09 09 te[4] = 0x82;...
11860 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 dyn_auth_templat
11870 65 5b 35 5d 20 3d 20 30 78 30 30 3b 0a 09 09 64 e[5] = 0x00;...d
11880 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 yn_auth_template
11890 5b 36 5d 20 3d 20 30 78 38 31 3b 0a 09 09 64 79 [6] = 0x81;...dy
118a0 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b n_auth_template[
118b0 37 5d 20 3d 20 30 78 38 32 3b 0a 09 09 64 79 6e 7] = 0x82;...dyn
118c0 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 38 _auth_template[8
118d0 5d 20 3d 20 28 74 6d 70 62 75 66 6c 65 6e 20 26 ] = (tmpbuflen &
118e0 20 30 78 66 66 30 30 29 20 3e 3e 20 38 3b 0a 09 0xff00) >> 8;..
118f0 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 .dyn_auth_templa
11900 74 65 5b 39 5d 20 3d 20 74 6d 70 62 75 66 6c 65 te[9] = tmpbufle
11910 6e 20 26 20 30 78 30 30 66 66 3b 0a 0a 09 09 73 n & 0x00ff;....s
11920 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 end_ret = cackey
11930 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c _send_apdu(slot,
11940 20 30 78 31 30 2c 20 4e 49 53 54 53 50 38 30 30 0x10, NISTSP800
11950 5f 37 33 5f 33 5f 49 4e 53 54 52 5f 47 45 4e 41 _73_3_INSTR_GENA
11960 55 54 48 2c 20 4e 49 53 54 53 50 38 30 30 5f 37 UTH, NISTSP800_7
11970 38 5f 33 5f 41 4c 47 4f 5f 52 53 41 32 30 34 38 8_3_ALGO_RSA2048
11980 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 , identity->pcsc
11990 5f 69 64 65 6e 74 69 74 79 2d 3e 61 70 70 6c 65 _identity->apple
119a0 74 5b 30 5d 2c 20 73 69 7a 65 6f 66 28 64 79 6e t[0], sizeof(dyn
119b0 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 29 2c _auth_template),
119c0 20 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 dyn_auth_templa
119d0 74 65 2c 20 30 78 30 30 2c 20 4e 55 4c 4c 2c 20 te, 0x00, NULL,
119e0 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 7d 0a NULL, NULL);..}.
119f0 0a 09 74 6d 70 62 75 66 5f 73 20 3d 20 74 6d 70 ..tmpbuf_s = tmp
11a00 62 75 66 3b 0a 09 6f 75 74 62 75 66 5f 73 20 3d buf;..outbuf_s =
11a10 20 6f 75 74 62 75 66 3b 0a 09 77 68 69 6c 65 20 outbuf;..while
11a20 28 74 6d 70 62 75 66 6c 65 6e 29 20 7b 0a 09 09 (tmpbuflen) {...
11a30 69 66 20 28 74 6d 70 62 75 66 6c 65 6e 20 3e 20 if (tmpbuflen >
11a40 32 34 35 29 20 7b 0a 09 09 09 62 79 74 65 73 5f 245) {....bytes_
11a50 74 6f 5f 73 65 6e 64 20 3d 20 32 34 35 3b 0a 09 to_send = 245;..
11a60 09 09 69 66 20 28 70 69 76 29 20 7b 0a 09 09 09 ..if (piv) {....
11a70 09 63 6c 61 73 73 20 3d 20 30 78 31 30 3b 0a 09 .class = 0x10;..
11a80 09 09 09 6c 65 20 3d 20 30 78 30 30 3b 0a 09 09 ...le = 0x00;...
11a90 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 70 31 .} else {.....p1
11aa0 20 3d 20 30 78 38 30 3b 0a 09 09 09 09 6c 65 20 = 0x80;.....le
11ab0 3d 20 30 78 30 30 3b 0a 09 09 09 7d 0a 09 09 7d = 0x00;....}...}
11ac0 20 65 6c 73 65 20 7b 0a 09 09 09 62 79 74 65 73 else {....bytes
11ad0 5f 74 6f 5f 73 65 6e 64 20 3d 20 74 6d 70 62 75 _to_send = tmpbu
11ae0 66 6c 65 6e 3b 0a 09 09 09 69 66 20 28 70 69 76 flen;....if (piv
11af0 29 20 7b 0a 09 09 09 09 63 6c 61 73 73 20 3d 20 ) {.....class =
11b00 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 GSCIS_CLASS_ISO7
11b10 38 31 36 3b 0a 09 09 09 09 6c 65 20 3d 20 32 35 816;.....le = 25
11b20 36 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 6;....} else {..
11b30 09 09 09 70 31 20 3d 20 30 78 30 30 3b 0a 09 09 ...p1 = 0x00;...
11b40 09 09 6c 65 20 3d 20 30 78 30 30 3b 0a 09 09 09 ..le = 0x00;....
11b50 7d 0a 09 09 7d 0a 0a 09 09 74 6d 70 6f 75 74 62 }...}....tmpoutb
11b60 75 66 6c 65 6e 20 3d 20 6f 75 74 62 75 66 6c 65 uflen = outbufle
11b70 6e 3b 0a 0a 09 09 69 66 20 28 70 69 76 29 20 7b n;....if (piv) {
11b80 0a 09 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 ....send_ret = c
11b90 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 ackey_send_apdu(
11ba0 73 6c 6f 74 2c 20 63 6c 61 73 73 2c 20 4e 49 53 slot, class, NIS
11bb0 54 53 50 38 30 30 5f 37 33 5f 33 5f 49 4e 53 54 TSP800_73_3_INST
11bc0 52 5f 47 45 4e 41 55 54 48 2c 20 4e 49 53 54 53 R_GENAUTH, NISTS
11bd0 50 38 30 30 5f 37 38 5f 33 5f 41 4c 47 4f 5f 52 P800_78_3_ALGO_R
11be0 53 41 32 30 34 38 2c 20 69 64 65 6e 74 69 74 79 SA2048, identity
11bf0 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d ->pcsc_identity-
11c00 3e 61 70 70 6c 65 74 5b 30 5d 2c 20 62 79 74 65 >applet[0], byte
11c10 73 5f 74 6f 5f 73 65 6e 64 2c 20 74 6d 70 62 75 s_to_send, tmpbu
11c20 66 2c 20 6c 65 2c 20 26 72 65 73 70 63 6f 64 65 f, le, &respcode
11c30 2c 20 6f 75 74 62 75 66 2c 20 26 74 6d 70 6f 75 , outbuf, &tmpou
11c40 74 62 75 66 6c 65 6e 29 3b 0a 09 09 7d 20 65 6c tbuflen);...} el
11c50 73 65 20 7b 0a 09 09 09 73 65 6e 64 5f 72 65 74 se {....send_ret
11c60 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 = cackey_send_a
11c70 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f pdu(slot, GSCIS_
11c80 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 CLASS_GLOBAL_PLA
11c90 54 46 4f 52 4d 2c 20 47 53 43 49 53 5f 49 4e 53 TFORM, GSCIS_INS
11ca0 54 52 5f 53 49 47 4e 44 45 43 52 59 50 54 2c 20 TR_SIGNDECRYPT,
11cb0 70 31 2c 20 30 78 30 30 2c 20 62 79 74 65 73 5f p1, 0x00, bytes_
11cc0 74 6f 5f 73 65 6e 64 2c 20 74 6d 70 62 75 66 2c to_send, tmpbuf,
11cd0 20 6c 65 2c 20 26 72 65 73 70 63 6f 64 65 2c 20 le, &respcode,
11ce0 6f 75 74 62 75 66 2c 20 26 74 6d 70 6f 75 74 62 outbuf, &tmpoutb
11cf0 75 66 6c 65 6e 29 3b 0a 09 09 7d 0a 09 09 69 66 uflen);...}...if
11d00 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 (send_ret != CA
11d10 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 CKEY_PCSC_S_OK)
11d20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {....CACKEY_DEBU
11d30 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20 53 G_PRINTF("ADPU S
11d40 65 6e 64 69 6e 67 20 46 61 69 6c 65 64 20 2d 2d ending Failed --
11d50 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 returning in er
11d60 72 6f 72 2e 22 29 3b 0a 0a 09 09 09 69 66 20 28 ror.");.....if (
11d70 66 72 65 65 5f 74 6d 70 62 75 66 29 20 7b 0a 09 free_tmpbuf) {..
11d80 09 09 09 69 66 20 28 74 6d 70 62 75 66 5f 73 29 ...if (tmpbuf_s)
11d90 20 7b 0a 09 09 09 09 09 66 72 65 65 28 74 6d 70 {......free(tmp
11da0 62 75 66 5f 73 29 3b 0a 09 09 09 09 7d 0a 09 09 buf_s);.....}...
11db0 09 7d 0a 0a 09 09 09 2f 2a 20 45 6e 64 20 74 72 .}...../* End tr
11dc0 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 ansaction */....
11dd0 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 cackey_end_trans
11de0 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 action(slot);...
11df0 09 09 69 66 20 28 72 65 73 70 63 6f 64 65 20 3d ..if (respcode =
11e00 3d 20 30 78 36 39 38 32 29 20 7b 0a 09 09 09 09 = 0x6982) {.....
11e10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
11e20 4e 54 46 28 22 53 65 63 75 72 69 74 79 20 73 74 NTF("Security st
11e30 61 74 75 73 20 6e 6f 74 20 73 61 74 69 73 69 66 atus not satisif
11e40 69 65 64 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 ied. Returning
11e50 4e 45 45 44 4c 4f 47 49 4e 22 29 3b 0a 0a 09 09 NEEDLOGIN");....
11e60 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c ..cackey_mark_sl
11e70 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a ot_reset(slot);.
11e80 09 09 09 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f ....slot->token_
11e90 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 flags = CKF_LOGI
11ea0 4e 5f 52 45 51 55 49 52 45 44 3b 0a 0a 09 09 09 N_REQUIRED;.....
11eb0 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 .return(CACKEY_P
11ec0 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 CSC_E_NEEDLOGIN)
11ed0 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 73 ;....}.....if (s
11ee0 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 end_ret == CACKE
11ef0 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 Y_PCSC_E_TOKENAB
11f00 53 45 4e 54 29 20 7b 0a 09 09 09 09 43 41 43 4b SENT) {.....CACK
11f10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
11f20 22 54 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 "Token absent.
11f30 52 65 74 75 72 6e 69 6e 67 20 54 4f 4b 45 4e 41 Returning TOKENA
11f40 42 53 45 4e 54 22 29 3b 0a 0a 09 09 09 09 63 61 BSENT");......ca
11f50 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 ckey_mark_slot_r
11f60 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 eset(slot);.....
11f70 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 .return(CACKEY_P
11f80 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e CSC_E_TOKENABSEN
11f90 54 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 T);....}.....ret
11fa0 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 urn(-1);...}....
11fb0 74 6d 70 62 75 66 20 2b 3d 20 62 79 74 65 73 5f tmpbuf += bytes_
11fc0 74 6f 5f 73 65 6e 64 3b 0a 09 09 74 6d 70 62 75 to_send;...tmpbu
11fd0 66 6c 65 6e 20 2d 3d 20 62 79 74 65 73 5f 74 6f flen -= bytes_to
11fe0 5f 73 65 6e 64 3b 0a 0a 09 09 6f 75 74 62 75 66 _send;....outbuf
11ff0 20 2b 3d 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e += tmpoutbuflen
12000 3b 0a 09 09 6f 75 74 62 75 66 6c 65 6e 20 2d 3d ;...outbuflen -=
12010 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 tmpoutbuflen;..
12020 09 72 65 74 76 61 6c 20 2b 3d 20 74 6d 70 6f 75 .retval += tmpou
12030 74 62 75 66 6c 65 6e 3b 0a 09 7d 0a 0a 09 69 66 tbuflen;..}...if
12040 20 28 66 72 65 65 5f 74 6d 70 62 75 66 29 20 7b (free_tmpbuf) {
12050 0a 09 09 69 66 20 28 74 6d 70 62 75 66 5f 73 29 ...if (tmpbuf_s)
12060 20 7b 0a 09 09 09 66 72 65 65 28 74 6d 70 62 75 {....free(tmpbu
12070 66 5f 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6f f_s);...}..}...o
12080 75 74 62 75 66 20 3d 20 6f 75 74 62 75 66 5f 73 utbuf = outbuf_s
12090 3b 0a 0a 09 2f 2a 20 45 6e 64 20 74 72 61 6e 73 ;.../* End trans
120a0 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 action */..cacke
120b0 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f y_end_transactio
120c0 6e 28 73 6c 6f 74 29 3b 0a 0a 23 69 66 64 65 66 n(slot);..#ifdef
120d0 20 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44 CACKEY_PARANOID
120e0 0a 23 20 20 69 66 64 65 66 20 5f 50 4f 53 49 58 .# ifdef _POSIX
120f0 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28 _SSIZE_MAX..if (
12100 6f 75 74 62 75 66 6c 65 6e 20 3e 20 5f 50 4f 53 outbuflen > _POS
12110 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a IX_SSIZE_MAX) {.
12120 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
12130 52 49 4e 54 46 28 22 4f 75 74 62 75 66 6c 65 6e RINTF("Outbuflen
12140 20 65 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d exceeds maximum
12150 20 76 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e value, returnin
12160 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d g in failure. (m
12170 61 78 20 3d 20 25 6c 69 2c 20 6f 75 74 62 75 66 ax = %li, outbuf
12180 6c 65 6e 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f len = %lu)", (lo
12190 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 ng) _POSIX_SSIZE
121a0 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65 64 20 _MAX, (unsigned
121b0 6c 6f 6e 67 29 20 6f 75 74 62 75 66 6c 65 6e 29 long) outbuflen)
121c0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b ;....return(-1);
121d0 0a 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e ..}.# endif.#en
121e0 64 69 66 0a 0a 09 2f 2a 20 57 65 20 6d 75 73 74 dif.../* We must
121f0 20 72 65 6d 6f 76 65 20 74 68 65 20 22 37 43 22 remove the "7C"
12200 20 74 61 67 20 74 6f 20 67 65 74 20 74 6f 20 74 tag to get to t
12210 68 65 20 73 69 67 6e 61 74 75 72 65 20 2a 2f 0a he signature */.
12220 09 69 66 20 28 70 69 76 29 20 7b 0a 09 09 69 66 .if (piv) {...if
12230 20 28 6f 75 74 62 75 66 5b 30 5d 20 21 3d 20 30 (outbuf[0] != 0
12240 78 37 43 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 x7C) {....CACKEY
12250 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
12260 65 73 70 6f 6e 73 65 20 66 72 6f 6d 20 50 49 56 esponse from PIV
12270 20 66 6f 72 20 47 45 4e 45 52 41 54 45 20 41 55 for GENERATE AU
12280 54 48 45 4e 54 49 43 41 54 49 4f 4e 20 77 61 73 THENTICATION was
12290 20 6e 6f 74 20 61 20 30 78 37 43 20 74 61 67 2c not a 0x7C tag,
122a0 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 returning in fa
122b0 69 6c 75 72 65 22 29 3b 0a 0a 0a 09 09 09 72 65 ilure");......re
122c0 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 turn(-1);...}...
122d0 09 2f 2a 20 58 58 58 20 54 4f 44 4f 20 50 49 56 ./* XXX TODO PIV
122e0 20 2a 2f 0a 09 09 6d 65 6d 6d 6f 76 65 28 6f 75 */...memmove(ou
122f0 74 62 75 66 2c 20 6f 75 74 62 75 66 20 2b 20 38 tbuf, outbuf + 8
12300 2c 20 72 65 74 76 61 6c 20 2d 20 38 29 3b 0a 09 , retval - 8);..
12310 09 72 65 74 76 61 6c 20 2d 3d 20 38 3b 0a 09 7d .retval -= 8;..}
12320 0a 0a 09 2f 2a 20 55 6e 70 61 64 20 72 65 70 6c .../* Unpad repl
12330 79 20 2a 2f 0a 09 69 66 20 28 75 6e 70 61 64 4f y */..if (unpadO
12340 75 74 70 75 74 29 20 7b 0a 09 09 69 66 20 28 72 utput) {...if (r
12350 65 74 76 61 6c 20 3c 20 33 29 20 7b 0a 09 09 09 etval < 3) {....
12360 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
12370 4e 54 46 28 22 52 65 70 6c 79 20 69 73 20 74 6f NTF("Reply is to
12380 6f 20 73 6d 61 6c 6c 2c 20 77 65 20 61 72 65 20 o small, we are
12390 6e 6f 74 20 61 62 6c 65 20 74 6f 20 75 6e 70 61 not able to unpa
123a0 64 20 2d 2d 20 70 61 73 73 69 6e 67 20 62 61 63 d -- passing bac
123b0 6b 20 61 6e 64 20 68 6f 70 69 6e 67 20 66 6f 72 k and hoping for
123c0 20 74 68 65 20 62 65 73 74 21 22 29 3b 0a 0a 09 the best!");...
123d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
123e0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
123f0 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74 in success, ret
12400 76 61 6c 20 3d 20 25 6c 69 20 28 62 79 74 65 73 val = %li (bytes
12410 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65 74 76 61 )", (long) retva
12420 6c 29 3b 0a 09 09 09 72 65 74 75 72 6e 28 72 65 l);....return(re
12430 74 76 61 6c 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 tval);...}....if
12440 20 28 6f 75 74 62 75 66 5b 30 5d 20 21 3d 20 30 (outbuf[0] != 0
12450 78 30 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 x00) {....CACKEY
12460 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 _DEBUG_PRINTF("U
12470 6e 72 65 63 6f 67 6e 69 7a 65 64 20 70 61 64 64 nrecognized padd
12480 69 6e 67 20 73 63 68 65 6d 65 20 2d 2d 20 70 61 ing scheme -- pa
12490 73 73 69 6e 67 20 62 61 63 6b 20 61 6e 64 20 68 ssing back and h
124a0 6f 70 69 6e 67 20 66 6f 72 20 74 68 65 20 62 65 oping for the be
124b0 73 74 21 22 29 3b 0a 0a 09 09 09 43 41 43 4b 45 st!");.....CACKE
124c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
124d0 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 Returning in suc
124e0 63 65 73 73 2c 20 72 65 74 76 61 6c 20 3d 20 25 cess, retval = %
124f0 6c 69 20 28 62 79 74 65 73 29 22 2c 20 28 6c 6f li (bytes)", (lo
12500 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a 09 09 09 ng) retval);....
12510 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a return(retval);.
12520 09 09 7d 0a 0a 09 09 62 6c 6f 63 6b 74 79 70 65 ..}....blocktype
12530 20 3d 20 6f 75 74 62 75 66 5b 31 5d 3b 0a 09 09 = outbuf[1];...
12540 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 30 3b unpadoffset = 0;
12550 0a 0a 09 09 73 77 69 74 63 68 20 28 62 6c 6f 63 ....switch (bloc
12560 6b 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65 ktype) {....case
12570 20 30 78 30 30 3a 0a 09 09 09 09 2f 2a 20 50 61 0x00:...../* Pa
12580 64 64 69 6e 67 20 53 63 68 65 6d 65 20 31 2c 20 dding Scheme 1,
12590 74 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d 7a 65 the first non-ze
125a0 72 6f 20 62 79 74 65 20 69 73 20 74 68 65 20 73 ro byte is the s
125b0 74 61 72 74 20 6f 66 20 64 61 74 61 20 2a 2f 0a tart of data */.
125c0 09 09 09 09 66 6f 72 20 28 75 6e 70 61 64 6f 66 ....for (unpadof
125d0 66 73 65 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f fset = 2; unpado
125e0 66 66 73 65 74 20 3c 20 72 65 74 76 61 6c 3b 20 ffset < retval;
125f0 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b unpadoffset++) {
12600 0a 09 09 09 09 09 69 66 20 28 6f 75 74 62 75 66 ......if (outbuf
12610 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 21 3d [unpadoffset] !=
12620 20 30 78 30 30 29 20 7b 0a 09 09 09 09 09 09 62 0x00) {.......b
12630 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 09 reak;......}....
12640 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 .}.....break;...
12650 09 63 61 73 65 20 30 78 30 31 3a 0a 09 09 09 09 .case 0x01:.....
12660 2f 2a 20 50 61 64 64 69 6e 67 20 53 63 68 65 6d /* Padding Schem
12670 65 20 32 2c 20 70 61 64 20 62 79 74 65 73 20 61 e 2, pad bytes a
12680 72 65 20 30 78 46 46 20 66 6f 6c 6c 6f 77 65 64 re 0xFF followed
12690 20 62 79 20 30 78 30 30 20 2a 2f 0a 09 09 09 09 by 0x00 */.....
126a0 66 6f 72 20 28 75 6e 70 61 64 6f 66 66 73 65 74 for (unpadoffset
126b0 20 3d 20 32 3b 20 75 6e 70 61 64 6f 66 66 73 65 = 2; unpadoffse
126c0 74 20 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70 61 t < retval; unpa
126d0 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09 09 doffset++) {....
126e0 09 09 69 66 20 28 6f 75 74 62 75 66 5b 75 6e 70 ..if (outbuf[unp
126f0 61 64 6f 66 66 73 65 74 5d 20 21 3d 20 30 78 46 adoffset] != 0xF
12700 46 29 20 7b 0a 09 09 09 09 09 09 69 66 20 28 6f F) {.......if (o
12710 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 utbuf[unpadoffse
12720 74 5d 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 t] == 0x00) {...
12730 09 09 09 09 09 75 6e 70 61 64 6f 66 66 73 65 74 .....unpadoffset
12740 2b 2b 3b 0a 0a 09 09 09 09 09 09 09 62 72 65 61 ++;.........brea
12750 6b 3b 0a 09 09 09 09 09 09 7d 20 65 6c 73 65 20 k;.......} else
12760 7b 0a 09 09 09 09 09 09 09 43 41 43 4b 45 59 5f {........CACKEY_
12770 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e DEBUG_PRINTF("In
12780 76 61 6c 69 64 20 70 61 64 64 69 6e 67 20 64 61 valid padding da
12790 74 61 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e ta found, return
127a0 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2c 20 ing in failure,
127b0 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e should have been
127c0 20 30 78 30 30 20 66 6f 75 6e 64 20 30 78 25 30 0x00 found 0x%0
127d0 32 78 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 2x", (unsigned i
127e0 6e 74 29 20 6f 75 74 62 75 66 5b 75 6e 70 61 64 nt) outbuf[unpad
127f0 6f 66 66 73 65 74 5d 29 3b 0a 0a 09 09 09 09 09 offset]);.......
12800 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 ..return(-1);...
12810 09 09 09 09 7d 0a 09 09 09 09 09 7d 20 65 6c 73 ....}......} els
12820 65 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59 e {.......CACKEY
12830 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 _DEBUG_PRINTF("I
12840 6e 76 61 6c 69 64 20 70 61 64 64 69 6e 67 20 64 nvalid padding d
12850 61 74 61 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 ata found, retur
12860 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2c ning in failure,
12870 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 should have bee
12880 6e 20 30 78 46 46 20 66 6f 75 6e 64 20 30 78 25 n 0xFF found 0x%
12890 30 32 78 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 02x", (unsigned
128a0 69 6e 74 29 20 6f 75 74 62 75 66 5b 75 6e 70 61 int) outbuf[unpa
128b0 64 6f 66 66 73 65 74 5d 29 3b 0a 0a 09 09 09 09 doffset]);......
128c0 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 ..return(-1);...
128d0 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 09 62 ...}.....}.....b
128e0 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 reak;....case 0x
128f0 30 32 3a 0a 09 09 09 09 2f 2a 20 50 61 64 64 69 02:...../* Paddi
12900 6e 67 20 53 63 68 65 6d 65 20 33 2c 20 70 61 64 ng Scheme 3, pad
12910 20 62 79 74 65 73 20 61 72 65 20 6e 6f 6e 2d 7a bytes are non-z
12920 65 72 6f 20 66 69 72 73 74 20 7a 65 72 6f 20 62 ero first zero b
12930 79 74 65 20 66 6f 75 6e 64 20 69 73 20 74 68 65 yte found is the
12940 20 73 65 70 65 72 61 74 6f 72 20 62 79 74 65 20 seperator byte
12950 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75 6e 70 61 */.....for (unpa
12960 64 6f 66 66 73 65 74 20 3d 20 32 3b 20 75 6e 70 doffset = 2; unp
12970 61 64 6f 66 66 73 65 74 20 3c 20 72 65 74 76 61 adoffset < retva
12980 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b l; unpadoffset++
12990 29 20 7b 0a 09 09 09 09 09 69 66 20 28 6f 75 74 ) {......if (out
129a0 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d buf[unpadoffset]
129b0 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 09 == 0x00) {.....
129c0 09 09 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 3b ..unpadoffset++;
129d0 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 ........break;..
129e0 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 09 ....}.....}.....
129f0 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66 break;...}....if
12a00 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3e 20 (unpadoffset >
12a10 72 65 74 76 61 6c 29 20 7b 0a 09 09 09 43 41 43 retval) {....CAC
12a20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
12a30 28 22 4f 66 66 73 65 74 20 67 72 65 61 74 65 72 ("Offset greater
12a40 20 74 68 61 6e 20 72 65 70 6c 79 20 73 69 7a 65 than reply size
12a50 2c 20 61 62 6f 72 74 69 6e 67 2e 20 20 28 75 6e , aborting. (un
12a60 70 61 64 6f 66 66 73 65 74 20 3d 20 25 6c 75 2c padoffset = %lu,
12a70 20 72 65 74 76 61 6c 20 3d 20 25 6c 75 29 22 2c retval = %lu)",
12a80 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
12a90 20 75 6e 70 61 64 6f 66 66 73 65 74 2c 20 28 75 unpadoffset, (u
12aa0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65 nsigned long) re
12ab0 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72 tval);.....retur
12ac0 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 n(-1);...}....CA
12ad0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
12ae0 42 55 46 28 22 50 61 64 64 65 64 3a 22 2c 20 6f BUF("Padded:", o
12af0 75 74 62 75 66 2c 20 72 65 74 76 61 6c 29 3b 0a utbuf, retval);.
12b00 0a 09 09 72 65 74 76 61 6c 20 2d 3d 20 75 6e 70 ...retval -= unp
12b10 61 64 6f 66 66 73 65 74 3b 0a 09 09 6d 65 6d 6d adoffset;...memm
12b20 6f 76 65 28 6f 75 74 62 75 66 2c 20 6f 75 74 62 ove(outbuf, outb
12b30 75 66 20 2b 20 75 6e 70 61 64 6f 66 66 73 65 74 uf + unpadoffset
12b40 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 43 41 , retval);....CA
12b50 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
12b60 42 55 46 28 22 55 6e 70 61 64 64 65 64 3a 22 2c BUF("Unpadded:",
12b70 20 6f 75 74 62 75 66 2c 20 72 65 74 76 61 6c 29 outbuf, retval)
12b80 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b 45 59 5f 44 ;..}....CACKEY_D
12b90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
12ba0 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 urning in succes
12bb0 73 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c 69 20 s, retval = %li
12bc0 28 62 79 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29 (bytes)", (long)
12bd0 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 retval);...retu
12be0 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f rn(retval);.}../
12bf0 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a *. * SYNPOSIS. *
12c00 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 .... *. * A
12c10 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 RGUMENTS. *
12c20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e .... *. * RETURN
12c30 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e VALUE. * ..
12c40 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a .. *. * NOTES. *
12c50 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a .... *. */.
12c60 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 static cackey_re
12c70 74 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 73 t cackey_login(s
12c80 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f truct cackey_slo
12c90 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 t *slot, unsigne
12ca0 64 20 63 68 61 72 20 2a 70 69 6e 2c 20 75 6e 73 d char *pin, uns
12cb0 69 67 6e 65 64 20 6c 6f 6e 67 20 70 69 6e 5f 6c igned long pin_l
12cc0 65 6e 2c 20 69 6e 74 20 2a 74 72 69 65 73 5f 72 en, int *tries_r
12cd0 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 75 emaining_p) {..u
12ce0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 61 63 nsigned char cac
12cf0 5f 70 69 6e 5b 38 5d 20 3d 20 7b 30 78 46 46 2c _pin[8] = {0xFF,
12d00 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 0xFF, 0xFF, 0xF
12d10 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 F, 0xFF, 0xFF, 0
12d20 78 46 46 2c 20 30 78 46 46 7d 3b 0a 09 75 69 6e xFF, 0xFF};..uin
12d30 74 31 36 5f 74 20 72 65 73 70 6f 6e 73 65 5f 63 t16_t response_c
12d40 6f 64 65 3b 0a 09 69 6e 74 20 74 72 69 65 73 5f ode;..int tries_
12d50 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 69 6e 74 20 remaining;..int
12d60 73 65 6e 64 5f 72 65 74 3b 0a 09 69 6e 74 20 6b send_ret;..int k
12d70 65 79 5f 72 65 66 65 72 65 6e 63 65 20 3d 20 30 ey_reference = 0
12d80 78 30 30 3b 0a 0a 09 2f 2a 20 49 6e 64 69 63 61 x00;.../* Indica
12d90 74 65 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f te that we do no
12da0 74 20 6b 6e 6f 77 20 61 62 6f 75 74 20 68 6f 77 t know about how
12db0 20 6d 61 6e 79 20 74 72 69 65 73 20 61 72 65 20 many tries are
12dc0 72 65 6d 61 69 6e 69 6e 67 20 2a 2f 0a 09 69 66 remaining */..if
12dd0 20 28 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e (tries_remainin
12de0 67 5f 70 29 20 7b 0a 09 09 2a 74 72 69 65 73 5f g_p) {...*tries_
12df0 72 65 6d 61 69 6e 69 6e 67 5f 70 20 3d 20 2d 31 remaining_p = -1
12e00 3b 0a 09 7d 0a 0a 09 2f 2a 20 41 70 70 61 72 65 ;..}.../* Appare
12e10 6e 74 6c 79 2c 20 43 41 43 20 50 49 4e 73 20 61 ntly, CAC PINs a
12e20 72 65 20 2a 45 58 41 43 54 4c 59 2a 20 38 20 62 re *EXACTLY* 8 b
12e30 79 74 65 73 20 6c 6f 6e 67 20 2d 2d 20 70 61 64 ytes long -- pad
12e40 20 77 69 74 68 20 30 78 46 46 20 69 66 20 74 6f with 0xFF if to
12e50 6f 20 73 68 6f 72 74 20 2a 2f 0a 09 69 66 20 28 o short */..if (
12e60 70 69 6e 5f 6c 65 6e 20 3e 3d 20 38 29 20 7b 0a pin_len >= 8) {.
12e70 09 09 6d 65 6d 63 70 79 28 63 61 63 5f 70 69 6e ..memcpy(cac_pin
12e80 2c 20 70 69 6e 2c 20 38 29 3b 0a 09 7d 20 65 6c , pin, 8);..} el
12e90 73 65 20 7b 0a 09 09 6d 65 6d 63 70 79 28 63 61 se {...memcpy(ca
12ea0 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 70 69 6e 5f c_pin, pin, pin_
12eb0 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 49 73 len);..}.../* Is
12ec0 73 75 65 20 50 49 4e 20 56 65 72 69 66 79 20 2a sue PIN Verify *
12ed0 2f 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 /..send_ret = ca
12ee0 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 ckey_send_apdu(s
12ef0 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 lot, GSCIS_CLASS
12f00 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f _ISO7816, GSCIS_
12f10 49 4e 53 54 52 5f 56 45 52 49 46 59 2c 20 30 78 INSTR_VERIFY, 0x
12f20 30 30 2c 20 6b 65 79 5f 72 65 66 65 72 65 6e 63 00, key_referenc
12f30 65 2c 20 73 69 7a 65 6f 66 28 63 61 63 5f 70 69 e, sizeof(cac_pi
12f40 6e 29 2c 20 63 61 63 5f 70 69 6e 2c 20 30 78 30 n), cac_pin, 0x0
12f50 30 2c 20 26 72 65 73 70 6f 6e 73 65 5f 63 6f 64 0, &response_cod
12f60 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a e, NULL, NULL);.
12f70 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d .if (send_ret !=
12f80 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f CACKEY_PCSC_S_O
12f90 4b 20 26 26 20 72 65 73 70 6f 6e 73 65 5f 63 6f K && response_co
12fa0 64 65 20 3d 3d 20 30 78 36 41 38 38 29 20 7b 0a de == 0x6A88) {.
12fb0 09 09 6b 65 79 5f 72 65 66 65 72 65 6e 63 65 20 ..key_reference
12fc0 3d 20 30 78 38 30 3b 0a 0a 09 09 73 65 6e 64 5f = 0x80;....send_
12fd0 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e ret = cackey_sen
12fe0 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 d_apdu(slot, GSC
12ff0 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 IS_CLASS_ISO7816
13000 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 56 45 , GSCIS_INSTR_VE
13010 52 49 46 59 2c 20 30 78 30 30 2c 20 6b 65 79 5f RIFY, 0x00, key_
13020 72 65 66 65 72 65 6e 63 65 2c 20 73 69 7a 65 6f reference, sizeo
13030 66 28 63 61 63 5f 70 69 6e 29 2c 20 63 61 63 5f f(cac_pin), cac_
13040 70 69 6e 2c 20 30 78 30 30 2c 20 26 72 65 73 70 pin, 0x00, &resp
13050 6f 6e 73 65 5f 63 6f 64 65 2c 20 4e 55 4c 4c 2c onse_code, NULL,
13060 20 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 NULL);..}...if
13070 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 (send_ret != CAC
13080 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b KEY_PCSC_S_OK) {
13090 0a 09 09 69 66 20 28 28 72 65 73 70 6f 6e 73 65 ...if ((response
130a0 5f 63 6f 64 65 20 26 20 30 78 36 33 43 30 29 20 _code & 0x63C0)
130b0 3d 3d 20 30 78 36 33 43 30 29 20 7b 0a 09 09 09 == 0x63C0) {....
130c0 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20 tries_remaining
130d0 3d 20 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 = (response_code
130e0 20 26 20 30 78 46 29 3b 0a 0a 09 09 09 43 41 43 & 0xF);.....CAC
130f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
13100 28 22 50 49 4e 20 56 65 72 69 66 69 63 61 74 69 ("PIN Verificati
13110 6f 6e 20 66 61 69 6c 65 64 2c 20 25 69 20 74 72 on failed, %i tr
13120 69 65 73 20 72 65 6d 61 69 6e 69 6e 67 22 2c 20 ies remaining",
13130 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 29 tries_remaining)
13140 3b 0a 0a 09 09 09 69 66 20 28 74 72 69 65 73 5f ;.....if (tries_
13150 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 remaining_p) {..
13160 09 09 09 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e ...*tries_remain
13170 69 6e 67 5f 70 20 3d 20 74 72 69 65 73 5f 72 65 ing_p = tries_re
13180 6d 61 69 6e 69 6e 67 3b 0a 09 09 09 7d 0a 0a 09 maining;....}...
13190 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f ..return(CACKEY_
131a0 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a PCSC_E_BADPIN);.
131b0 09 09 7d 0a 0a 09 09 69 66 20 28 72 65 73 70 6f ..}....if (respo
131c0 6e 73 65 5f 63 6f 64 65 20 3d 3d 20 30 78 36 39 nse_code == 0x69
131d0 38 33 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 83) {....CACKEY_
131e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49 DEBUG_PRINTF("PI
131f0 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20 66 N Verification f
13200 61 69 6c 65 64 2c 20 64 65 76 69 63 65 20 69 73 ailed, device is
13210 20 6c 6f 63 6b 65 64 22 29 3b 0a 0a 09 09 09 72 locked");.....r
13220 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 eturn(CACKEY_PCS
13230 43 5f 45 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d C_E_LOCKED);...}
13240 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 ....return(CACKE
13250 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 Y_PCSC_E_GENERIC
13260 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 );..}...CACKEY_D
13270 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e EBUG_PRINTF("PIN
13280 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20 73 75 Verification su
13290 63 63 65 65 64 65 64 22 29 3b 0a 0a 09 72 65 74 cceeded");...ret
132a0 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f urn(CACKEY_PCSC_
132b0 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 S_OK);.}../*. *
132c0 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 SYNPOSIS. *
132d0 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 .... *. * ARGUME
132e0 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 NTS. * ....
132f0 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 *. * RETURN VALU
13300 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a E. * .... *.
13310 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 * NOTES. *
13320 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 .... *. */.stati
13330 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 c cackey_ret cac
13340 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e key_token_presen
13350 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f t(struct cackey_
13360 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 slot *slot) {..c
13370 61 63 6b 65 79 5f 72 65 74 20 70 63 73 63 5f 63 ackey_ret pcsc_c
13380 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 44 57 4f onnect_ret;..DWO
13390 52 44 20 72 65 61 64 65 72 5f 6c 65 6e 20 3d 20 RD reader_len =
133a0 30 2c 20 73 74 61 74 65 20 3d 20 30 2c 20 70 72 0, state = 0, pr
133b0 6f 74 6f 63 6f 6c 20 3d 20 30 2c 20 61 74 72 5f otocol = 0, atr_
133c0 6c 65 6e 3b 0a 09 42 59 54 45 20 61 74 72 5b 4d len;..BYTE atr[M
133d0 41 58 5f 41 54 52 5f 53 49 5a 45 5d 3b 0a 09 4c AX_ATR_SIZE];..L
133e0 4f 4e 47 20 73 74 61 74 75 73 5f 72 65 74 2c 20 ONG status_ret,
133f0 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 scard_reconn_ret
13400 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ;...CACKEY_DEBUG
13410 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
13420 22 29 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e ");...if (slot->
13430 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 43 41 internal) {...CA
13440 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
13450 46 28 22 52 65 74 75 72 6e 69 6e 67 20 74 6f 6b F("Returning tok
13460 65 6e 20 70 72 65 73 65 6e 74 20 28 69 6e 74 65 en present (inte
13470 72 6e 61 6c 20 74 6f 6b 65 6e 29 22 29 3b 0a 0a rnal token)");..
13480 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f ..return(CACKEY_
13490 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 PCSC_S_TOKENPRES
134a0 45 4e 54 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f ENT);..}...pcsc_
134b0 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 connect_ret = ca
134c0 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 ckey_connect_car
134d0 64 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28 70 63 d(slot);..if (pc
134e0 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 sc_connect_ret !
134f0 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f = CACKEY_PCSC_S_
13500 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 OK) {...CACKEY_D
13510 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 EBUG_PRINTF("Una
13520 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74 ble to connect t
13530 6f 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e o card, returnin
13540 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 22 29 g token absent")
13550 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b ;....return(CACK
13560 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 EY_PCSC_E_TOKENA
13570 42 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 61 74 72 BSENT);..}...atr
13580 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 61 74 _len = sizeof(at
13590 72 29 3b 0a 09 73 74 61 74 75 73 5f 72 65 74 20 r);..status_ret
135a0 3d 20 53 43 61 72 64 53 74 61 74 75 73 28 73 6c = SCardStatus(sl
135b0 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 4e ot->pcsc_card, N
135c0 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f 6c 65 6e ULL, &reader_len
135d0 2c 20 26 73 74 61 74 65 2c 20 26 70 72 6f 74 6f , &state, &proto
135e0 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74 72 5f 6c col, atr, &atr_l
135f0 65 6e 29 3b 0a 0a 09 69 66 20 28 73 74 61 74 75 en);...if (statu
13600 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 s_ret == SCARD_E
13610 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 29 _INVALID_HANDLE)
13620 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
13630 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 53 G_PRINTF("SCardS
13640 74 61 74 75 73 28 29 20 72 65 74 75 72 6e 65 64 tatus() returned
13650 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 SCARD_E_INVALID
13660 5f 48 41 4e 44 4c 45 2c 20 6d 61 72 6b 69 6e 67 _HANDLE, marking
13670 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 is not already
13680 63 6f 6e 6e 65 63 74 65 64 20 61 6e 64 20 74 72 connected and tr
13690 79 69 6e 67 20 61 67 61 69 6e 22 29 3b 0a 09 09 ying again");...
136a0 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 cackey_mark_slot
136b0 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 _reset(slot);...
136c0 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 .pcsc_connect_re
136d0 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 t = cackey_conne
136e0 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 ct_card(slot);..
136f0 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 .if (pcsc_connec
13700 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f t_ret != CACKEY_
13710 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 PCSC_S_OK) {....
13720 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
13730 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 NTF("Unable to c
13740 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20 onnect to card,
13750 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 returning token
13760 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09 09 72 65 absent");.....re
13770 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 turn(CACKEY_PCSC
13780 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b _E_TOKENABSENT);
13790 0a 09 09 7d 0a 0a 09 09 61 74 72 5f 6c 65 6e 20 ...}....atr_len
137a0 3d 20 73 69 7a 65 6f 66 28 61 74 72 29 3b 0a 09 = sizeof(atr);..
137b0 09 73 74 61 74 75 73 5f 72 65 74 20 3d 20 53 43 .status_ret = SC
137c0 61 72 64 53 74 61 74 75 73 28 73 6c 6f 74 2d 3e ardStatus(slot->
137d0 70 63 73 63 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c pcsc_card, NULL,
137e0 20 26 72 65 61 64 65 72 5f 6c 65 6e 2c 20 26 73 &reader_len, &s
137f0 74 61 74 65 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c tate, &protocol,
13800 20 61 74 72 2c 20 26 61 74 72 5f 6c 65 6e 29 3b atr, &atr_len);
13810 0a 09 7d 0a 0a 09 69 66 20 28 73 74 61 74 75 73 ..}...if (status
13820 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f _ret != SCARD_S_
13830 53 55 43 43 45 53 53 29 20 7b 0a 09 09 63 61 63 SUCCESS) {...cac
13840 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 key_mark_slot_re
13850 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 69 66 set(slot);....if
13860 20 28 73 74 61 74 75 73 5f 72 65 74 20 3d 3d 20 (status_ret ==
13870 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 SCARD_W_RESET_CA
13880 52 44 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f RD) {....CACKEY_
13890 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
138a0 73 65 74 20 72 65 71 75 69 72 65 64 2c 20 70 6c set required, pl
138b0 65 61 73 65 20 68 6f 6c 64 2e 2e 2e 22 29 3b 0a ease hold...");.
138c0 0a 09 09 09 73 63 61 72 64 5f 72 65 63 6f 6e 6e ....scard_reconn
138d0 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 _ret = cackey_re
138e0 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f connect_card(slo
138f0 74 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f t, SCARD_PROTOCO
13900 4c 5f 54 30 20 7c 20 53 43 41 52 44 5f 50 52 4f L_T0 | SCARD_PRO
13910 54 4f 43 4f 4c 5f 54 31 2c 20 26 70 72 6f 74 6f TOCOL_T1, &proto
13920 63 6f 6c 29 3b 0a 09 09 09 69 66 20 28 73 63 61 col);....if (sca
13930 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 3d rd_reconn_ret ==
13940 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 SCARD_S_SUCCESS
13950 29 20 7b 0a 09 09 09 09 2f 2a 20 55 70 64 61 74 ) {...../* Updat
13960 65 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 09 e protocol */...
13970 09 09 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c ..slot->protocol
13980 20 3d 20 70 72 6f 74 6f 63 6f 6c 3b 0a 0a 09 09 = protocol;....
13990 09 09 2f 2a 20 52 65 2d 65 73 74 61 62 6c 69 73 ../* Re-establis
139a0 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 h transaction, i
139b0 66 20 69 74 20 77 61 73 20 70 72 65 73 65 6e 74 f it was present
139c0 20 2a 2f 0a 09 09 09 09 69 66 20 28 73 6c 6f 74 */.....if (slot
139d0 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 ->transaction_de
139e0 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 pth > 0) {......
139f0 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f slot->transactio
13a00 6e 5f 64 65 70 74 68 2d 2d 3b 0a 09 09 09 09 09 n_depth--;......
13a10 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f slot->transactio
13a20 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d n_need_hw_lock =
13a30 20 31 3b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 1;......cackey_
13a40 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f begin_transactio
13a50 6e 28 73 6c 6f 74 29 3b 0a 09 09 09 09 7d 0a 0a n(slot);.....}..
13a60 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
13a70 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 73 _PRINTF("Reset s
13a80 75 63 63 65 73 73 66 75 6c 2c 20 72 65 71 75 65 uccessful, reque
13a90 72 79 69 6e 67 22 29 3b 0a 09 09 09 09 73 74 61 rying");.....sta
13aa0 74 75 73 5f 72 65 74 20 3d 20 53 43 61 72 64 53 tus_ret = SCardS
13ab0 74 61 74 75 73 28 73 6c 6f 74 2d 3e 70 63 73 63 tatus(slot->pcsc
13ac0 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c 20 26 72 65 _card, NULL, &re
13ad0 61 64 65 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65 ader_len, &state
13ae0 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72 , &protocol, atr
13af0 2c 20 26 61 74 72 5f 6c 65 6e 29 3b 0a 09 09 09 , &atr_len);....
13b00 09 69 66 20 28 73 74 61 74 75 73 5f 72 65 74 20 .if (status_ret
13b10 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 != SCARD_S_SUCCE
13b20 53 53 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 SS) {......CACKE
13b30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
13b40 53 74 69 6c 6c 20 75 6e 61 62 6c 65 20 74 6f 20 Still unable to
13b50 71 75 65 72 79 20 63 61 72 64 20 73 74 61 74 75 query card statu
13b60 73 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b s, returning tok
13b70 65 6e 20 61 62 73 65 6e 74 2e 20 20 53 43 61 72 en absent. SCar
13b80 64 53 74 61 74 75 73 28 29 20 3d 20 25 73 22 2c dStatus() = %s",
13b90 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 CACKEY_DEBUG_FU
13ba0 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 NC_SCARDERR_TO_S
13bb0 54 52 28 73 74 61 74 75 73 5f 72 65 74 29 29 3b TR(status_ret));
13bc0 0a 0a 09 09 09 09 09 72 65 74 75 72 6e 28 43 41 .......return(CA
13bd0 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 CKEY_PCSC_E_TOKE
13be0 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 09 7d 0a NABSENT);.....}.
13bf0 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 ...} else {.....
13c00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
13c10 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 72 NTF("Unable to r
13c20 65 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 econnect to card
13c30 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 , returning toke
13c40 6e 20 61 62 73 65 6e 74 2e 20 20 53 43 61 72 64 n absent. SCard
13c50 52 65 63 6f 6e 6e 65 63 74 28 29 20 3d 20 25 73 Reconnect() = %s
13c60 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ", CACKEY_DEBUG_
13c70 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f FUNC_SCARDERR_TO
13c80 5f 53 54 52 28 73 63 61 72 64 5f 72 65 63 6f 6e _STR(scard_recon
13c90 6e 5f 72 65 74 29 29 3b 0a 0a 09 09 09 09 72 65 n_ret));......re
13ca0 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 turn(CACKEY_PCSC
13cb0 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b _E_TOKENABSENT);
13cc0 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b ....}...} else {
13cd0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
13ce0 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 _PRINTF("Unable
13cf0 74 6f 20 71 75 65 72 79 20 63 61 72 64 20 73 74 to query card st
13d00 61 74 75 73 2c 20 72 65 74 75 72 6e 69 6e 67 20 atus, returning
13d10 74 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 53 token absent. S
13d20 43 61 72 64 53 74 61 74 75 73 28 29 20 3d 20 25 CardStatus() = %
13d30 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 s", CACKEY_DEBUG
13d40 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 _FUNC_SCARDERR_T
13d50 4f 5f 53 54 52 28 73 74 61 74 75 73 5f 72 65 74 O_STR(status_ret
13d60 29 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 ));.....return(C
13d70 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b ACKEY_PCSC_E_TOK
13d80 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 7d 0a 09 ENABSENT);...}..
13d90 7d 0a 0a 09 69 66 20 28 28 73 74 61 74 65 20 26 }...if ((state &
13da0 20 53 43 41 52 44 5f 41 42 53 45 4e 54 29 20 3d SCARD_ABSENT) =
13db0 3d 20 53 43 41 52 44 5f 41 42 53 45 4e 54 29 20 = SCARD_ABSENT)
13dc0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
13dd0 5f 50 52 49 4e 54 46 28 22 43 61 72 64 20 69 73 _PRINTF("Card is
13de0 20 61 62 73 65 6e 74 2c 20 72 65 74 75 72 6e 69 absent, returni
13df0 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 22 ng token absent"
13e00 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 );....return(CAC
13e10 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e KEY_PCSC_E_TOKEN
13e20 41 42 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41 ABSENT);..}...CA
13e30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
13e40 46 28 22 52 65 74 75 72 6e 69 6e 67 20 74 6f 6b F("Returning tok
13e50 65 6e 20 70 72 65 73 65 6e 74 2e 22 29 3b 0a 0a en present.");..
13e60 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 .return(CACKEY_P
13e70 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 CSC_S_TOKENPRESE
13e80 4e 54 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 NT);.}../*. * SY
13e90 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e NPOSIS. * ..
13ea0 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 .. *. * ARGUMENT
13eb0 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a S. * .... *.
13ec0 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a * RETURN VALUE.
13ed0 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a * .... *. *
13ee0 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e NOTES. * ..
13ef0 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 .. *. */.static
13f00 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 70 ssize_t cackey_p
13f10 63 73 63 5f 69 64 65 6e 74 69 74 79 5f 74 6f 5f csc_identity_to_
13f20 6c 61 62 65 6c 28 73 74 72 75 63 74 20 63 61 63 label(struct cac
13f30 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 key_pcsc_identit
13f40 79 20 2a 69 64 65 6e 74 69 74 79 2c 20 75 6e 73 y *identity, uns
13f50 69 67 6e 65 64 20 63 68 61 72 20 2a 6c 61 62 65 igned char *labe
13f60 6c 5f 62 75 66 2c 20 75 6e 73 69 67 6e 65 64 20 l_buf, unsigned
13f70 6c 6f 6e 67 20 6c 61 62 65 6c 5f 62 75 66 5f 6c long label_buf_l
13f80 65 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 en) {..unsigned
13f90 6c 6f 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 long certificate
13fa0 5f 6c 65 6e 3b 0a 09 76 6f 69 64 20 2a 6c 61 62 _len;..void *lab
13fb0 65 6c 5f 61 73 6e 31 3b 0a 09 76 6f 69 64 20 2a el_asn1;..void *
13fc0 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 69 6e certificate;..in
13fd0 74 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b t x509_read_ret;
13fe0 0a 0a 09 63 65 72 74 69 66 69 63 61 74 65 20 3d ...certificate =
13ff0 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 identity->certi
14000 66 69 63 61 74 65 3b 0a 09 63 65 72 74 69 66 69 ficate;..certifi
14010 63 61 74 65 5f 6c 65 6e 20 3d 20 69 64 65 6e 74 cate_len = ident
14020 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 ity->certificate
14030 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 63 65 72 74 _len;...if (cert
14040 69 66 69 63 61 74 65 5f 6c 65 6e 20 3c 20 30 29 ificate_len < 0)
14050 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b {...return(-1);
14060 0a 09 7d 0a 0a 09 78 35 30 39 5f 72 65 61 64 5f ..}...x509_read_
14070 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 73 75 ret = x509_to_su
14080 62 6a 65 63 74 28 63 65 72 74 69 66 69 63 61 74 bject(certificat
14090 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c e, certificate_l
140a0 65 6e 2c 20 28 76 6f 69 64 20 2a 2a 29 20 26 6c en, (void **) &l
140b0 61 62 65 6c 5f 61 73 6e 31 29 3b 0a 09 69 66 20 abel_asn1);..if
140c0 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c (x509_read_ret <
140d0 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d 0) {...return(-
140e0 31 29 3b 0a 09 7d 0a 0a 09 78 35 30 39 5f 72 65 1);..}...x509_re
140f0 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 64 6e ad_ret = x509_dn
14100 5f 74 6f 5f 73 74 72 69 6e 67 28 6c 61 62 65 6c _to_string(label
14110 5f 61 73 6e 31 2c 20 78 35 30 39 5f 72 65 61 64 _asn1, x509_read
14120 5f 72 65 74 2c 20 28 63 68 61 72 20 2a 29 20 6c _ret, (char *) l
14130 61 62 65 6c 5f 62 75 66 2c 20 6c 61 62 65 6c 5f abel_buf, label_
14140 62 75 66 5f 6c 65 6e 2c 20 22 43 4e 22 29 3b 0a buf_len, "CN");.
14150 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 .if (x509_read_r
14160 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09 78 35 30 et <= 0) {...x50
14170 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 9_read_ret = x50
14180 39 5f 64 6e 5f 74 6f 5f 73 74 72 69 6e 67 28 6c 9_dn_to_string(l
14190 61 62 65 6c 5f 61 73 6e 31 2c 20 78 35 30 39 5f abel_asn1, x509_
141a0 72 65 61 64 5f 72 65 74 2c 20 28 63 68 61 72 20 read_ret, (char
141b0 2a 29 20 6c 61 62 65 6c 5f 62 75 66 2c 20 6c 61 *) label_buf, la
141c0 62 65 6c 5f 62 75 66 5f 6c 65 6e 2c 20 4e 55 4c bel_buf_len, NUL
141d0 4c 29 3b 0a 0a 09 09 69 66 20 28 78 35 30 39 5f L);....if (x509_
141e0 72 65 61 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b read_ret <= 0) {
141f0 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a ....return(-1);.
14200 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 ..}..}..#ifdef C
14210 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23 ACKEY_PARANOID.#
14220 20 20 69 66 64 65 66 20 5f 50 4f 53 49 58 5f 53 ifdef _POSIX_S
14230 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28 78 35 SIZE_MAX..if (x5
14240 30 39 5f 72 65 61 64 5f 72 65 74 20 3e 20 5f 50 09_read_ret > _P
14250 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20 OSIX_SSIZE_MAX)
14260 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
14270 5f 50 52 49 4e 54 46 28 22 78 35 30 39 5f 72 65 _PRINTF("x509_re
14280 61 64 5f 72 65 74 20 65 78 63 65 65 64 73 20 6d ad_ret exceeds m
14290 61 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 aximum value, re
142a0 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 turning in failu
142b0 72 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 re. (max = %li,
142c0 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 x509_read_ret =
142d0 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 %lu)", (long) _P
142e0 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 OSIX_SSIZE_MAX,
142f0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
14300 78 35 30 39 5f 72 65 61 64 5f 72 65 74 29 3b 0a x509_read_ret);.
14310 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 ...return(-1);..
14320 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 }.# endif.#endi
14330 66 0a 0a 09 72 65 74 75 72 6e 28 78 35 30 39 5f f...return(x509_
14340 72 65 61 64 5f 72 65 74 29 3b 0a 7d 0a 0a 2f 2a read_ret);.}../*
14350 20 52 65 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 Returns 0 on su
14360 63 63 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 ccess */.static
14370 69 6e 74 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 int cackey_mutex
14380 5f 63 72 65 61 74 65 28 76 6f 69 64 20 2a 2a 6d _create(void **m
14390 75 74 65 78 29 20 7b 0a 09 70 74 68 72 65 61 64 utex) {..pthread
143a0 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68 72 65 61 _mutex_t *pthrea
143b0 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70 74 d_mutex;..int pt
143c0 68 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43 hread_retval;..C
143d0 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65 74 76 K_RV custom_retv
143e0 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 al;...CACKEY_DEB
143f0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
14400 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63 61 63 d.");...if ((cac
14410 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 26 key_args.flags &
14420 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f CKF_OS_LOCKING_
14430 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f OK) == CKF_OS_LO
14440 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 CKING_OK) {...pt
14450 68 72 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d 61 hread_mutex = ma
14460 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 74 68 lloc(sizeof(*pth
14470 72 65 61 64 5f 6d 75 74 65 78 29 29 3b 0a 09 09 read_mutex));...
14480 69 66 20 28 21 70 74 68 72 65 61 64 5f 6d 75 74 if (!pthread_mut
14490 65 78 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f ex) {....CACKEY_
144a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 DEBUG_PRINTF("Fa
144b0 69 6c 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 iled to allocate
144c0 20 6d 65 6d 6f 72 79 2e 22 29 3b 0a 0a 09 09 09 memory.");.....
144d0 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a return(-1);...}.
144e0 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74 76 61 ...pthread_retva
144f0 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65 l = pthread_mute
14500 78 5f 69 6e 69 74 28 70 74 68 72 65 61 64 5f 6d x_init(pthread_m
14510 75 74 65 78 2c 20 4e 55 4c 4c 29 3b 0a 09 09 69 utex, NULL);...i
14520 66 20 28 70 74 68 72 65 61 64 5f 72 65 74 76 61 f (pthread_retva
14530 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 l != 0) {....CAC
14540 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
14550 28 22 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f ("pthread_mutex_
14560 69 6e 69 74 28 29 20 72 65 74 75 72 6e 65 64 20 init() returned
14570 65 72 72 6f 72 20 28 25 69 29 2e 22 2c 20 70 74 error (%i).", pt
14580 68 72 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a hread_retval);..
14590 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 ...return(-1);..
145a0 09 7d 0a 0a 09 09 2a 6d 75 74 65 78 20 3d 20 70 .}....*mutex = p
145b0 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 7d thread_mutex;..}
145c0 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 63 61 else {...if (ca
145d0 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65 ckey_args.Create
145e0 4d 75 74 65 78 29 20 7b 0a 09 09 09 63 75 73 74 Mutex) {....cust
145f0 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b om_retval = cack
14600 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75 ey_args.CreateMu
14610 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09 09 tex(mutex);.....
14620 69 66 20 28 63 75 73 74 6f 6d 5f 72 65 74 76 61 if (custom_retva
14630 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 l != CKR_OK) {..
14640 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
14650 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 61 PRINTF("cackey_a
14660 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78 28 rgs.CreateMutex(
14670 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 ) returned error
14680 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 (%li).", (long)
14690 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b custom_retval);
146a0 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 ......return(-1)
146b0 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 ;....}...}..}...
146c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
146d0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 73 NTF("Returning s
146e0 75 63 65 73 73 66 75 6c 6c 79 20 28 30 29 22 29 ucessfully (0)")
146f0 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d ;...return(0);.}
14700 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30 20 6f ../* Returns 0 o
14710 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 73 74 61 n success */.sta
14720 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d tic int cackey_m
14730 75 74 65 78 5f 6c 6f 63 6b 28 76 6f 69 64 20 2a utex_lock(void *
14740 6d 75 74 65 78 29 20 7b 0a 09 70 74 68 72 65 61 mutex) {..pthrea
14750 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68 72 65 d_mutex_t *pthre
14760 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70 ad_mutex;..int p
14770 74 68 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09 thread_retval;..
14780 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65 74 CK_RV custom_ret
14790 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 val;...CACKEY_DE
147a0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
147b0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63 61 ed.");...if ((ca
147c0 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 ckey_args.flags
147d0 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 & CKF_OS_LOCKING
147e0 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c _OK) == CKF_OS_L
147f0 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 OCKING_OK) {...p
14800 74 68 72 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d thread_mutex = m
14810 75 74 65 78 3b 0a 0a 09 09 70 74 68 72 65 61 64 utex;....pthread
14820 5f 72 65 74 76 61 6c 20 3d 20 70 74 68 72 65 61 _retval = pthrea
14830 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 70 74 68 d_mutex_lock(pth
14840 72 65 61 64 5f 6d 75 74 65 78 29 3b 0a 09 09 69 read_mutex);...i
14850 66 20 28 70 74 68 72 65 61 64 5f 72 65 74 76 61 f (pthread_retva
14860 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 l != 0) {....CAC
14870 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
14880 28 22 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f ("pthread_mutex_
14890 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e 65 64 20 lock() returned
148a0 65 72 72 6f 72 20 28 25 69 29 2e 22 2c 20 70 74 error (%i).", pt
148b0 68 72 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a hread_retval);..
148c0 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 ...return(-1);..
148d0 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 .}..} else {...i
148e0 66 20 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c f (cackey_args.L
148f0 6f 63 6b 4d 75 74 65 78 29 20 7b 0a 09 09 09 63 ockMutex) {....c
14900 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63 ustom_retval = c
14910 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d ackey_args.LockM
14920 75 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09 utex(mutex);....
14930 09 69 66 20 28 63 75 73 74 6f 6d 5f 72 65 74 76 .if (custom_retv
14940 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a al != CKR_OK) {.
14950 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
14960 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f _PRINTF("cackey_
14970 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 28 29 args.LockMutex()
14980 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 returned error
14990 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 (%li).", (long)
149a0 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a custom_retval);.
149b0 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b .....return(-1);
149c0 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 ....}...}..}...C
149d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
149e0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 73 75 TF("Returning su
149f0 63 65 73 73 66 75 6c 6c 79 20 28 30 29 22 29 3b cessfully (0)");
14a00 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a ...return(0);.}.
14a10 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30 20 6f 6e ./* Returns 0 on
14a20 20 73 75 63 63 65 73 73 20 2a 2f 0a 73 74 61 74 success */.stat
14a30 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d 75 ic int cackey_mu
14a40 74 65 78 5f 75 6e 6c 6f 63 6b 28 76 6f 69 64 20 tex_unlock(void
14a50 2a 6d 75 74 65 78 29 20 7b 0a 09 70 74 68 72 65 *mutex) {..pthre
14a60 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68 72 ad_mutex_t *pthr
14a70 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20 ead_mutex;..int
14a80 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a pthread_retval;.
14a90 09 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65 .CK_RV custom_re
14aa0 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 tval;...CACKEY_D
14ab0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
14ac0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63 led.");...if ((c
14ad0 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 ackey_args.flags
14ae0 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e & CKF_OS_LOCKIN
14af0 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f G_OK) == CKF_OS_
14b00 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 LOCKING_OK) {...
14b10 70 74 68 72 65 61 64 5f 6d 75 74 65 78 20 3d 20 pthread_mutex =
14b20 6d 75 74 65 78 3b 0a 0a 09 09 70 74 68 72 65 61 mutex;....pthrea
14b30 64 5f 72 65 74 76 61 6c 20 3d 20 70 74 68 72 65 d_retval = pthre
14b40 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 ad_mutex_unlock(
14b50 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29 3b 0a pthread_mutex);.
14b60 09 09 69 66 20 28 70 74 68 72 65 61 64 5f 72 65 ..if (pthread_re
14b70 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 tval != 0) {....
14b80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
14b90 4e 54 46 28 22 70 74 68 72 65 61 64 5f 6d 75 74 NTF("pthread_mut
14ba0 65 78 5f 75 6e 6c 6f 63 6b 28 29 20 72 65 74 75 ex_unlock() retu
14bb0 72 6e 65 64 20 65 72 72 6f 72 20 28 25 69 29 2e rned error (%i).
14bc0 22 2c 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 ", pthread_retva
14bd0 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d l);.....return(-
14be0 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 1);...}..} else
14bf0 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 61 {...if (cackey_a
14c00 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 29 rgs.UnlockMutex)
14c10 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65 74 {....custom_ret
14c20 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72 67 val = cackey_arg
14c30 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 28 6d 75 s.UnlockMutex(mu
14c40 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 75 tex);.....if (cu
14c50 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43 stom_retval != C
14c60 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 KR_OK) {.....CAC
14c70 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
14c80 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e ("cackey_args.Un
14c90 6c 6f 63 6b 4d 75 74 65 78 28 29 20 72 65 74 75 lockMutex() retu
14ca0 72 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29 rned error (%li)
14cb0 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f .", (long) custo
14cc0 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 m_retval);......
14cd0 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d return(-1);....}
14ce0 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 ...}..}...CACKEY
14cf0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
14d00 65 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66 eturning sucessf
14d10 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 ully (0)");...re
14d20 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 73 74 61 74 turn(0);.}..stat
14d30 69 63 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f ic CK_ATTRIBUTE_
14d40 50 54 52 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 PTR cackey_get_a
14d50 74 74 72 69 62 75 74 65 73 28 43 4b 5f 4f 42 4a ttributes(CK_OBJ
14d60 45 43 54 5f 43 4c 41 53 53 20 6f 62 6a 65 63 74 ECT_CLASS object
14d70 63 6c 61 73 73 2c 20 73 74 72 75 63 74 20 63 61 class, struct ca
14d80 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 ckey_pcsc_identi
14d90 74 79 20 2a 69 64 65 6e 74 69 74 79 2c 20 75 6e ty *identity, un
14da0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e signed long iden
14db0 74 69 74 79 5f 6e 75 6d 2c 20 43 4b 5f 55 4c 4f tity_num, CK_ULO
14dc0 4e 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 NG_PTR pulCount)
14dd0 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 42 {..static CK_BB
14de0 4f 4f 4c 20 63 6b 5f 74 72 75 65 20 3d 20 31 3b OOL ck_true = 1;
14df0 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 42 4f 4f ..static CK_BBOO
14e00 4c 20 63 6b 5f 66 61 6c 73 65 20 3d 20 30 3b 0a L ck_false = 0;.
14e10 09 73 74 61 74 69 63 20 43 4b 5f 54 52 55 53 54 .static CK_TRUST
14e20 20 63 6b 5f 74 72 75 73 74 65 64 20 3d 20 43 4b ck_trusted = CK
14e30 5f 54 52 55 53 54 45 44 5f 44 45 4c 45 47 41 54 _TRUSTED_DELEGAT
14e40 4f 52 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 6e 75 OR;..CK_ULONG nu
14e50 6d 61 74 74 72 73 20 3d 20 30 2c 20 72 65 74 76 mattrs = 0, retv
14e60 61 6c 5f 63 6f 75 6e 74 3b 0a 09 43 4b 5f 41 54 al_count;..CK_AT
14e70 54 52 49 42 55 54 45 5f 54 59 50 45 20 63 75 72 TRIBUTE_TYPE cur
14e80 72 5f 61 74 74 72 5f 74 79 70 65 3b 0a 09 43 4b r_attr_type;..CK
14e90 5f 41 54 54 52 49 42 55 54 45 20 63 75 72 72 5f _ATTRIBUTE curr_
14ea0 61 74 74 72 2c 20 2a 72 65 74 76 61 6c 3b 0a 09 attr, *retval;..
14eb0 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 56 61 6c CK_VOID_PTR pVal
14ec0 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c ue;..CK_ULONG ul
14ed0 56 61 6c 75 65 4c 65 6e 3b 0a 09 43 4b 5f 4f 42 ValueLen;..CK_OB
14ee0 4a 45 43 54 5f 43 4c 41 53 53 20 63 6b 5f 6f 62 JECT_CLASS ck_ob
14ef0 6a 65 63 74 5f 63 6c 61 73 73 3b 0a 09 43 4b 5f ject_class;..CK_
14f00 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 CERTIFICATE_TYPE
14f10 20 63 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f ck_certificate_
14f20 74 79 70 65 3b 0a 09 43 4b 5f 4b 45 59 5f 54 59 type;..CK_KEY_TY
14f30 50 45 20 63 6b 5f 6b 65 79 5f 74 79 70 65 3b 0a PE ck_key_type;.
14f40 09 43 4b 5f 55 54 46 38 43 48 41 52 20 75 63 54 .CK_UTF8CHAR ucT
14f50 6d 70 42 75 66 5b 31 30 32 34 5d 3b 0a 09 53 48 mpBuf[1024];..SH
14f60 41 31 43 6f 6e 74 65 78 74 20 73 68 61 31 5f 63 A1Context sha1_c
14f70 74 78 3b 0a 09 4d 44 35 5f 43 54 58 20 6d 64 35 tx;..MD5_CTX md5
14f80 5f 63 74 78 3b 0a 09 75 69 6e 74 38 5f 74 20 73 _ctx;..uint8_t s
14f90 68 61 31 5f 68 61 73 68 5b 53 48 41 31 48 61 73 ha1_hash[SHA1Has
14fa0 68 53 69 7a 65 5d 3b 0a 09 75 69 6e 74 38 5f 74 hSize];..uint8_t
14fb0 20 6d 64 35 5f 68 61 73 68 5b 4d 44 35 48 61 73 md5_hash[MD5Has
14fc0 68 53 69 7a 65 5d 3b 0a 09 75 6e 73 69 67 6e 65 hSize];..unsigne
14fd0 64 20 63 68 61 72 20 2a 63 65 72 74 69 66 69 63 d char *certific
14fe0 61 74 65 3b 0a 09 73 73 69 7a 65 5f 74 20 63 65 ate;..ssize_t ce
14ff0 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 rtificate_len =
15000 2d 31 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65 -1, x509_read_re
15010 74 3b 0a 09 69 6e 74 20 70 56 61 6c 75 65 5f 66 t;..int pValue_f
15020 72 65 65 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ree;...CACKEY_DE
15030 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
15040 65 64 20 28 6f 62 6a 65 63 74 43 6c 61 73 73 20 ed (objectClass
15050 3d 20 25 6c 75 2c 20 69 64 65 6e 74 69 74 79 5f = %lu, identity_
15060 6e 75 6d 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 num = %lu).", (u
15070 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 62 nsigned long) ob
15080 6a 65 63 74 63 6c 61 73 73 2c 20 69 64 65 6e 74 jectclass, ident
15090 69 74 79 5f 6e 75 6d 29 3b 0a 0a 09 2a 70 75 6c ity_num);...*pul
150a0 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 69 66 20 Count = 0;...if
150b0 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 (objectclass !=
150c0 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 20 CKO_CERTIFICATE
150d0 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 && objectclass !
150e0 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 = CKO_PUBLIC_KEY
150f0 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 && objectclass
15100 21 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b != CKO_PRIVATE_K
15110 45 59 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 EY && objectclas
15120 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 s != CKO_NETSCAP
15130 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 43 41 43 E_TRUST) {...CAC
15140 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
15150 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20 6f 62 ("Returning 0 ob
15160 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20 69 6e jects (NULL), in
15170 76 61 6c 69 64 20 6f 62 6a 65 63 74 20 63 6c 61 valid object cla
15180 73 73 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 ss");....return(
15190 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 47 NULL);..}.../* G
151a0 65 74 20 43 65 72 74 20 2a 2f 0a 09 69 66 20 28 et Cert */..if (
151b0 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55 4c 4c identity == NULL
151c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
151d0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
151e0 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28 ning 0 objects (
151f0 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69 64 20 69 NULL), invalid i
15200 64 65 6e 74 69 79 20 70 72 6f 76 69 64 65 64 22 dentiy provided"
15210 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c );....return(NUL
15220 4c 29 3b 0a 09 7d 0a 0a 09 63 65 72 74 69 66 69 L);..}...certifi
15230 63 61 74 65 20 3d 20 69 64 65 6e 74 69 74 79 2d cate = identity-
15240 3e 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 63 >certificate;..c
15250 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d ertificate_len =
15260 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 identity->certi
15270 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09 69 66 ficate_len;...if
15280 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 (certificate_le
15290 6e 20 3d 3d 20 2d 31 20 7c 7c 20 63 65 72 74 69 n == -1 || certi
152a0 66 69 63 61 74 65 20 3d 3d 20 4e 55 4c 4c 29 20 ficate == NULL)
152b0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
152c0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
152d0 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 ng 0 objects (NU
152e0 4c 4c 29 2c 20 74 68 69 73 20 69 64 65 6e 74 69 LL), this identi
152f0 74 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 ty does not have
15300 20 61 6e 20 58 2e 35 30 39 20 63 65 72 74 69 66 an X.509 certif
15310 69 63 61 74 65 20 61 73 73 6f 63 69 61 74 65 64 icate associated
15320 20 77 69 74 68 20 69 74 20 61 6e 64 20 77 69 6c with it and wil
15330 6c 20 6e 6f 74 20 77 6f 72 6b 22 29 3b 0a 0a 09 l not work");...
15340 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 .return(NULL);..
15350 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 79 20 74 68 }.../* Verify th
15360 61 74 20 63 65 72 74 69 66 69 63 61 74 65 20 69 at certificate i
15370 73 20 41 53 4e 2e 31 20 65 6e 63 6f 64 65 64 20 s ASN.1 encoded
15380 58 2e 35 30 39 20 63 65 72 74 69 66 69 63 61 74 X.509 certificat
15390 65 20 2a 2f 0a 09 69 66 20 28 78 35 30 39 5f 74 e */..if (x509_t
153a0 6f 5f 73 65 72 69 61 6c 28 63 65 72 74 69 66 69 o_serial(certifi
153b0 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 cate, certificat
153c0 65 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 20 3c 20 30 e_len, NULL) < 0
153d0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
153e0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
153f0 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28 ning 0 objects (
15400 4e 55 4c 4c 29 2c 20 74 68 65 20 58 2e 35 30 39 NULL), the X.509
15410 20 63 65 72 74 69 66 69 63 61 74 65 20 61 73 73 certificate ass
15420 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 ociated with thi
15430 73 20 69 64 65 6e 74 69 74 79 20 69 73 20 6e 6f s identity is no
15440 74 20 76 61 6c 69 64 22 29 3b 0a 0a 09 09 72 65 t valid");....re
15450 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a turn(NULL);..}..
15460 09 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 3d 20 .retval_count =
15470 36 34 3b 0a 09 72 65 74 76 61 6c 20 3d 20 6d 61 64;..retval = ma
15480 6c 6c 6f 63 28 72 65 74 76 61 6c 5f 63 6f 75 6e lloc(retval_coun
15490 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74 76 t * sizeof(*retv
154a0 61 6c 29 29 3b 0a 0a 09 66 6f 72 20 28 63 75 72 al));...for (cur
154b0 72 5f 61 74 74 72 5f 74 79 70 65 20 3d 20 30 3b r_attr_type = 0;
154c0 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20 curr_attr_type
154d0 3c 20 30 78 63 65 35 33 36 33 62 66 3b 20 63 75 < 0xce5363bf; cu
154e0 72 72 5f 61 74 74 72 5f 74 79 70 65 2b 2b 29 20 rr_attr_type++)
154f0 7b 0a 09 09 69 66 20 28 63 75 72 72 5f 61 74 74 {...if (curr_att
15500 72 5f 74 79 70 65 20 3d 3d 20 30 78 38 30 30 29 r_type == 0x800)
15510 20 7b 0a 09 09 09 63 75 72 72 5f 61 74 74 72 5f {....curr_attr_
15520 74 79 70 65 20 3d 20 30 78 63 65 35 33 36 33 30 type = 0xce53630
15530 30 3b 0a 09 09 7d 0a 0a 09 09 70 56 61 6c 75 65 0;...}....pValue
15540 5f 66 72 65 65 20 3d 20 30 3b 0a 09 09 70 56 61 _free = 0;...pVa
15550 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 75 6c lue = NULL;...ul
15560 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c ValueLen = (CK_L
15570 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 73 77 69 74 ONG) -1;....swit
15580 63 68 20 28 63 75 72 72 5f 61 74 74 72 5f 74 79 ch (curr_attr_ty
15590 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20 43 4b pe) {....case CK
155a0 41 5f 43 4c 41 53 53 3a 0a 09 09 09 09 43 41 43 A_CLASS:.....CAC
155b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
155c0 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 ("Requesting att
155d0 72 69 62 75 74 65 20 43 4b 41 5f 43 4c 41 53 53 ribute CKA_CLASS
155e0 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c (0x%08lx) ...",
155f0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
15600 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 curr_attr_type)
15610 3b 0a 0a 09 09 09 09 63 6b 5f 6f 62 6a 65 63 74 ;......ck_object
15620 5f 63 6c 61 73 73 20 3d 20 6f 62 6a 65 63 74 63 _class = objectc
15630 6c 61 73 73 3b 0a 0a 09 09 09 09 70 56 61 6c 75 lass;......pValu
15640 65 20 3d 20 26 63 6b 5f 6f 62 6a 65 63 74 5f 63 e = &ck_object_c
15650 6c 61 73 73 3b 0a 09 09 09 09 75 6c 56 61 6c 75 lass;.....ulValu
15660 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b eLen = sizeof(ck
15670 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 29 3b 0a _object_class);.
15680 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
15690 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 G_PRINTF(" ... r
156a0 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 eturning %lu (%p
156b0 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 /%lu)", (unsigne
156c0 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 4f 42 d long) *((CK_OB
156d0 4a 45 43 54 5f 43 4c 41 53 53 20 2a 29 20 70 56 JECT_CLASS *) pV
156e0 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 alue), pValue, (
156f0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 unsigned long) u
15700 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 lValueLen);.....
15710 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 .break;....case
15720 43 4b 41 5f 54 4f 4b 45 4e 3a 0a 09 09 09 09 43 CKA_TOKEN:.....C
15730 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
15740 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 TF("Requesting a
15750 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 4f 4b ttribute CKA_TOK
15760 45 4e 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e EN (0x%08lx) ...
15770 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e ", (unsigned lon
15780 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 g) curr_attr_typ
15790 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 e);......pValue
157a0 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 = &ck_true;.....
157b0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a ulValueLen = siz
157c0 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 eof(ck_true);...
157d0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
157e0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 PRINTF(" ... ret
157f0 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 urning %lu (%p/%
15800 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 lu)", (unsigned
15810 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f long) *((CK_BBOO
15820 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 L *) pValue), pV
15830 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 alue, (unsigned
15840 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e long) ulValueLen
15850 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 );......break;..
15860 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49 56 41 ..case CKA_PRIVA
15870 54 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 TE:.....CACKEY_D
15880 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 EBUG_PRINTF("Req
15890 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 uesting attribut
158a0 65 20 43 4b 41 5f 50 52 49 56 41 54 45 20 28 30 e CKA_PRIVATE (0
158b0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 x%08lx) ...", (u
158c0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 nsigned long) cu
158d0 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a rr_attr_type);..
158e0 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c ....if (objectcl
158f0 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 ass != CKO_NETSC
15900 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 APE_TRUST) {....
15910 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
15920 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 RINTF(" ... but
15930 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 not getting it b
15940 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f ecause we are no
15950 74 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 t a Netscape tru
15960 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 st object");....
15970 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a ...break;.....}.
15980 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 .....pValue = &c
15990 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 75 6c 56 k_false;.....ulV
159a0 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 alueLen = sizeof
159b0 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a 09 09 09 (ck_false);.....
159c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
159d0 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 INTF(" ... retur
159e0 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 ning %lu (%p/%lu
159f0 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f )", (unsigned lo
15a00 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 ng) *((CK_BBOOL
15a10 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c *) pValue), pVal
15a20 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f ue, (unsigned lo
15a30 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b ng) ulValueLen);
15a40 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 ......break;....
15a50 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 45 44 case CKA_TRUSTED
15a60 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 :.....CACKEY_DEB
15a70 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 UG_PRINTF("Reque
15a80 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 sting attribute
15a90 43 4b 41 5f 54 52 55 53 54 45 44 20 28 30 78 25 CKA_TRUSTED (0x%
15aa0 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 08lx) ...", (uns
15ab0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 igned long) curr
15ac0 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 _attr_type);....
15ad0 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 ..if (objectclas
15ae0 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 s == CKO_NETSCAP
15af0 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 E_TRUST) {......
15b00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
15b10 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f NTF(" ... but no
15b20 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 t getting it bec
15b30 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 ause we are a Ne
15b40 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a tscape trust obj
15b50 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 ect");.......bre
15b60 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 70 ak;.....}......p
15b70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 Value = &ck_true
15b80 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e ;.....ulValueLen
15b90 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 = sizeof(ck_tru
15ba0 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f e);......CACKEY_
15bb0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e DEBUG_PRINTF(" .
15bc0 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 .. returning %lu
15bd0 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 (%p/%lu)", (uns
15be0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 igned long) *((C
15bf0 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 K_BBOOL *) pValu
15c00 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 e), pValue, (uns
15c10 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 igned long) ulVa
15c20 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 lueLen);......br
15c30 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 eak;....case CKA
15c40 5f 4d 4f 44 49 46 49 41 42 4c 45 3a 0a 09 09 09 _MODIFIABLE:....
15c50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
15c60 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 INTF("Requesting
15c70 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4d attribute CKA_M
15c80 4f 44 49 46 49 41 42 4c 45 20 28 30 78 25 30 38 ODIFIABLE (0x%08
15c90 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 lx) ...", (unsig
15ca0 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 ned long) curr_a
15cb0 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 ttr_type);......
15cc0 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c pValue = &ck_fal
15cd0 73 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c se;.....ulValueL
15ce0 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 en = sizeof(ck_f
15cf0 61 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b alse);......CACK
15d00 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
15d10 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 " ... returning
15d20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 %lu (%p/%lu)", (
15d30 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a unsigned long) *
15d40 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 ((CK_BBOOL *) pV
15d50 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 alue), pValue, (
15d60 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 unsigned long) u
15d70 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 lValueLen);.....
15d80 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 .break;....case
15d90 43 4b 41 5f 4c 41 42 45 4c 3a 0a 09 09 09 09 43 CKA_LABEL:.....C
15da0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
15db0 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 TF("Requesting a
15dc0 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4c 41 42 ttribute CKA_LAB
15dd0 45 4c 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e EL (0x%08lx) ...
15de0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e ", (unsigned lon
15df0 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 g) curr_attr_typ
15e00 65 29 3b 0a 0a 09 09 09 09 2f 2a 20 58 58 58 3a e);....../* XXX:
15e10 20 44 65 74 65 72 6d 69 6e 65 20 6e 61 6d 65 20 Determine name
15e20 2a 2f 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 */.....ulValueLe
15e30 6e 20 3d 20 73 6e 70 72 69 6e 74 66 28 28 63 68 n = snprintf((ch
15e40 61 72 20 2a 29 20 75 63 54 6d 70 42 75 66 2c 20 ar *) ucTmpBuf,
15e50 73 69 7a 65 6f 66 28 75 63 54 6d 70 42 75 66 29 sizeof(ucTmpBuf)
15e60 2c 20 22 49 64 65 6e 74 69 74 79 20 23 25 6c 75 , "Identity #%lu
15e70 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e ", (unsigned lon
15e80 67 29 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 29 g) identity_num)
15e90 3b 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 75 ;.....pValue = u
15ea0 63 54 6d 70 42 75 66 3b 0a 0a 09 09 09 09 69 66 cTmpBuf;......if
15eb0 20 28 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d 20 (ulValueLen >=
15ec0 73 69 7a 65 6f 66 28 75 63 54 6d 70 42 75 66 29 sizeof(ucTmpBuf)
15ed0 29 20 7b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 ) {......ulValue
15ee0 4c 65 6e 20 3d 20 30 3b 0a 09 09 09 09 09 70 56 Len = 0;......pV
15ef0 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 alue = NULL;....
15f00 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 .}......CACKEY_D
15f10 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e EBUG_PRINTF(" ..
15f20 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f . returning (%p/
15f30 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 %lu)", pValue, (
15f40 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 unsigned long) u
15f50 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 lValueLen);.....
15f60 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 .break;....case
15f70 43 4b 41 5f 56 41 4c 55 45 3a 0a 09 09 09 09 43 CKA_VALUE:.....C
15f80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
15f90 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 TF("Requesting a
15fa0 74 74 72 69 62 75 74 65 20 43 4b 41 5f 56 41 4c ttribute CKA_VAL
15fb0 55 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e UE (0x%08lx) ...
15fc0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e ", (unsigned lon
15fd0 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 g) curr_attr_typ
15fe0 65 29 3b 0a 0a 09 09 09 09 73 77 69 74 63 68 20 e);......switch
15ff0 28 6f 62 6a 65 63 74 63 6c 61 73 73 29 20 7b 0a (objectclass) {.
16000 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 50 52 .....case CKO_PR
16010 49 56 41 54 45 5f 4b 45 59 3a 0a 09 09 09 09 09 IVATE_KEY:......
16020 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
16030 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e INTF(" ... but n
16040 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 ot getting it be
16050 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20 70 cause we are a p
16060 72 69 76 61 74 65 20 6b 65 79 2e 22 29 3b 0a 0a rivate key.");..
16070 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 ......break;....
16080 09 09 63 61 73 65 20 43 4b 4f 5f 4e 45 54 53 43 ..case CKO_NETSC
16090 41 50 45 5f 54 52 55 53 54 3a 0a 09 09 09 09 09 APE_TRUST:......
160a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
160b0 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e INTF(" ... but n
160c0 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 ot getting it be
160d0 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e cause we are a N
160e0 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 etscape trust ob
160f0 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 09 62 ject");........b
16100 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73 65 20 reak;......case
16110 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 3a 0a CKO_PUBLIC_KEY:.
16120 09 09 09 09 09 09 69 66 20 28 63 65 72 74 69 66 ......if (certif
16130 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 icate_len >= 0)
16140 7b 0a 09 09 09 09 09 09 09 78 35 30 39 5f 72 65 {........x509_re
16150 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f ad_ret = x509_to
16160 5f 70 75 62 6b 65 79 28 63 65 72 74 69 66 69 63 _pubkey(certific
16170 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 ate, certificate
16180 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a _len, &pValue);.
16190 09 09 09 09 09 09 09 69 66 20 28 78 35 30 39 5f .......if (x509_
161a0 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 20 read_ret < 0) {
161b0 0a 09 09 09 09 09 09 09 09 70 56 61 6c 75 65 20 .........pValue
161c0 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 09 09 7d = NULL;........}
161d0 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 09 09 else {.........
161e0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 ulValueLen = x50
161f0 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 9_read_ret;.....
16200 09 09 09 7d 0a 09 09 09 09 09 09 7d 0a 0a 09 09 ...}.......}....
16210 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 ....break;......
16220 63 61 73 65 20 43 4b 4f 5f 43 45 52 54 49 46 49 case CKO_CERTIFI
16230 43 41 54 45 3a 0a 09 09 09 09 09 09 70 56 61 6c CATE:.......pVal
16240 75 65 20 3d 20 63 65 72 74 69 66 69 63 61 74 65 ue = certificate
16250 3b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c ;.......ulValueL
16260 65 6e 20 3d 20 63 65 72 74 69 66 69 63 61 74 65 en = certificate
16270 5f 6c 65 6e 3b 0a 0a 09 09 09 09 09 09 62 72 65 _len;........bre
16280 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 ak;.....}......C
16290 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
162a0 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 TF(" ... returni
162b0 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c ng %p/%lu", pVal
162c0 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f ue, (unsigned lo
162d0 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b ng) ulValueLen);
162e0 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 ......break;....
162f0 63 61 73 65 20 43 4b 41 5f 49 53 53 55 45 52 3a case CKA_ISSUER:
16300 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
16310 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 G_PRINTF("Reques
16320 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 ting attribute C
16330 4b 41 5f 49 53 53 55 45 52 20 28 30 78 25 30 38 KA_ISSUER (0x%08
16340 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 lx) ...", (unsig
16350 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 ned long) curr_a
16360 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 ttr_type);......
16370 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 if (objectclass
16380 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 != CKO_CERTIFICA
16390 54 45 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 TE && objectclas
163a0 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 s != CKO_NETSCAP
163b0 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 E_TRUST) {......
163c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
163d0 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f NTF(" ... but no
163e0 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 t getting it bec
163f0 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 ause we are not
16400 61 20 63 65 72 74 69 66 69 63 61 74 65 20 6f 72 a certificate or
16410 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 Netscape trust
16420 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 object");.......
16430 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 break;.....}....
16440 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 ..if (certificat
16450 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 e_len >= 0) {...
16460 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 ...x509_read_ret
16470 20 3d 20 78 35 30 39 5f 74 6f 5f 69 73 73 75 65 = x509_to_issue
16480 72 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 r(certificate, c
16490 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 ertificate_len,
164a0 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 &pValue);......i
164b0 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 f (x509_read_ret
164c0 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56 < 0) {.......pV
164d0 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 alue = NULL;....
164e0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 ..} else {......
164f0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 .ulValueLen = x5
16500 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09_read_ret;....
16510 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 ..}.....}......C
16520 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
16530 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 TF(" ... returni
16540 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c ng %p/%lu", pVal
16550 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f ue, (unsigned lo
16560 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b ng) ulValueLen);
16570 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 ......break;....
16580 63 61 73 65 20 43 4b 41 5f 53 45 52 49 41 4c 5f case CKA_SERIAL_
16590 4e 55 4d 42 45 52 3a 0a 09 09 09 09 43 41 43 4b NUMBER:.....CACK
165a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
165b0 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 "Requesting attr
165c0 69 62 75 74 65 20 43 4b 41 5f 53 45 52 49 41 4c ibute CKA_SERIAL
165d0 5f 4e 55 4d 42 45 52 20 28 30 78 25 30 38 6c 78 _NUMBER (0x%08lx
165e0 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 ) ...", (unsigne
165f0 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 d long) curr_att
16600 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 r_type);......if
16610 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d (objectclass !=
16620 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 CKO_CERTIFICATE
16630 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 && objectclass
16640 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f != CKO_NETSCAPE_
16650 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 TRUST) {......CA
16660 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
16670 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 F(" ... but not
16680 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 getting it becau
16690 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 se we are not a
166a0 63 65 72 74 69 66 69 63 61 74 65 20 6f 72 20 4e certificate or N
166b0 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 etscape trust ob
166c0 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 ject");.......br
166d0 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 eak;.....}......
166e0 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f if (certificate_
166f0 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 len >= 0) {.....
16700 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d .x509_read_ret =
16710 20 78 35 30 39 5f 74 6f 5f 73 65 72 69 61 6c 28 x509_to_serial(
16720 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 certificate, cer
16730 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 tificate_len, &p
16740 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20 Value);......if
16750 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c (x509_read_ret <
16760 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 0) {.......pVal
16770 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 ue = NULL;......
16780 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 } else {.......u
16790 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 lValueLen = x509
167a0 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 _read_ret;......
167b0 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 }.....}......CAC
167c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
167d0 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 (" ... returning
167e0 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c (%p/%lu)", pVal
167f0 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f ue, (unsigned lo
16800 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b ng) ulValueLen);
16810 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 ......break;....
16820 63 61 73 65 20 43 4b 41 5f 53 55 42 4a 45 43 54 case CKA_SUBJECT
16830 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 :.....CACKEY_DEB
16840 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 UG_PRINTF("Reque
16850 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 sting attribute
16860 43 4b 41 5f 53 55 42 4a 45 43 54 20 28 30 78 25 CKA_SUBJECT (0x%
16870 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 08lx) ...", (uns
16880 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 igned long) curr
16890 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 _attr_type);....
168a0 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 ..if (objectclas
168b0 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 s != CKO_CERTIFI
168c0 43 41 54 45 29 20 7b 0a 09 09 09 09 09 43 41 43 CATE) {......CAC
168d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
168e0 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 (" ... but not g
168f0 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 etting it becaus
16900 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 63 e we are not a c
16910 65 72 74 69 66 69 63 61 74 65 22 29 3b 0a 0a 09 ertificate");...
16920 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d ....break;.....}
16930 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74 69 66 ......if (certif
16940 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 icate_len >= 0)
16950 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65 61 64 {......x509_read
16960 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 73 _ret = x509_to_s
16970 75 62 6a 65 63 74 28 63 65 72 74 69 66 69 63 61 ubject(certifica
16980 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f te, certificate_
16990 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 len, &pValue);..
169a0 09 09 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 ....if (x509_rea
169b0 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 d_ret < 0) {....
169c0 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c ...pValue = NULL
169d0 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a ;......} else {.
169e0 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e ......ulValueLen
169f0 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 = x509_read_ret
16a00 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a ;......}.....}..
16a10 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
16a20 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 _PRINTF(" ... re
16a30 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c turning %p/%lu",
16a40 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e pValue, (unsign
16a50 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 ed long) ulValue
16a60 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b Len);......break
16a70 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 49 44 ;....case CKA_ID
16a80 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 :.....CACKEY_DEB
16a90 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 UG_PRINTF("Reque
16aa0 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 sting attribute
16ab0 43 4b 41 5f 49 44 20 28 30 78 25 30 38 6c 78 29 CKA_ID (0x%08lx)
16ac0 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 ...", (unsigned
16ad0 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 long) curr_attr
16ae0 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 _type);......if
16af0 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 (objectclass ==
16b00 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 CKO_NETSCAPE_TRU
16b10 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 ST) {......CACKE
16b20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
16b30 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 ... but not get
16b40 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 ting it because
16b50 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 we are a Netscap
16b60 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 e trust object")
16b70 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 ;.......break;..
16b80 09 09 09 7d 0a 0a 09 09 09 09 75 63 54 6d 70 42 ...}......ucTmpB
16b90 75 66 5b 30 5d 20 3d 20 28 28 69 64 65 6e 74 69 uf[0] = ((identi
16ba0 74 79 5f 6e 75 6d 20 2b 20 31 29 20 3e 3e 20 38 ty_num + 1) >> 8
16bb0 29 20 26 20 30 78 66 66 3b 0a 09 09 09 09 75 63 ) & 0xff;.....uc
16bc0 54 6d 70 42 75 66 5b 31 5d 20 3d 20 20 28 69 64 TmpBuf[1] = (id
16bd0 65 6e 74 69 74 79 5f 6e 75 6d 20 2b 20 31 29 20 entity_num + 1)
16be0 26 20 30 78 66 66 3b 0a 0a 09 09 09 09 70 56 61 & 0xff;......pVa
16bf0 6c 75 65 20 3d 20 26 75 63 54 6d 70 42 75 66 3b lue = &ucTmpBuf;
16c00 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 .....ulValueLen
16c10 3d 20 32 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 = 2;......CACKEY
16c20 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 _DEBUG_PRINTF("
16c30 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 ... returning %p
16c40 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 /%lu", pValue, (
16c50 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 unsigned long) u
16c60 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 lValueLen);.....
16c70 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 .break;....case
16c80 43 4b 41 5f 43 45 52 54 49 46 49 43 41 54 45 5f CKA_CERTIFICATE_
16c90 54 59 50 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 TYPE:.....CACKEY
16ca0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
16cb0 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 equesting attrib
16cc0 75 74 65 20 43 4b 41 5f 43 45 52 54 49 46 49 43 ute CKA_CERTIFIC
16cd0 41 54 45 5f 54 59 50 45 20 28 30 78 25 30 38 6c ATE_TYPE (0x%08l
16ce0 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e x) ...", (unsign
16cf0 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 ed long) curr_at
16d00 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 tr_type);......i
16d10 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 f (objectclass !
16d20 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 = CKO_CERTIFICAT
16d30 45 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 E) {......CACKEY
16d40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 _DEBUG_PRINTF("
16d50 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 ... but not gett
16d60 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 ing it because w
16d70 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74 e are not a cert
16d80 69 66 69 63 61 74 65 2e 22 29 3b 0a 0a 09 09 09 ificate.");.....
16d90 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a ..break;.....}..
16da0 09 09 09 09 2f 2a 20 57 65 20 6f 6e 6c 79 20 73 ..../* We only s
16db0 75 70 70 6f 72 74 20 6f 6e 65 20 63 65 72 74 69 upport one certi
16dc0 66 69 63 61 74 65 20 74 79 70 65 20 2a 2f 0a 09 ficate type */..
16dd0 09 09 09 63 6b 5f 63 65 72 74 69 66 69 63 61 74 ...ck_certificat
16de0 65 5f 74 79 70 65 20 3d 20 43 4b 43 5f 58 5f 35 e_type = CKC_X_5
16df0 30 39 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 09;......pValue
16e00 3d 20 26 63 6b 5f 63 65 72 74 69 66 69 63 61 74 = &ck_certificat
16e10 65 5f 74 79 70 65 3b 0a 09 09 09 09 75 6c 56 61 e_type;.....ulVa
16e20 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 lueLen = sizeof(
16e30 63 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74 ck_certificate_t
16e40 79 70 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 ype);......CACKE
16e50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
16e60 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 43 ... returning C
16e70 4b 43 5f 58 5f 35 30 39 20 28 25 6c 75 29 20 28 KC_X_509 (%lu) (
16e80 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 %p/%lu)", (unsig
16e90 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f ned long) *((CK_
16ea0 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 CERTIFICATE_TYPE
16eb0 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 *) pValue), pVa
16ec0 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c lue, (unsigned l
16ed0 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 ong) ulValueLen)
16ee0 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 ;......break;...
16ef0 09 63 61 73 65 20 43 4b 41 5f 4b 45 59 5f 54 59 .case CKA_KEY_TY
16f00 50 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 PE:.....CACKEY_D
16f10 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 EBUG_PRINTF("Req
16f20 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 uesting attribut
16f30 65 20 43 4b 41 5f 4b 45 59 5f 54 59 50 45 20 28 e CKA_KEY_TYPE (
16f40 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 0x%08lx) ...", (
16f50 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 unsigned long) c
16f60 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a urr_attr_type);.
16f70 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 .....if (objectc
16f80 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 52 49 56 lass != CKO_PRIV
16f90 41 54 45 5f 4b 45 59 20 26 26 20 6f 62 6a 65 63 ATE_KEY && objec
16fa0 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 55 tclass != CKO_PU
16fb0 42 4c 49 43 5f 4b 45 59 29 20 7b 0a 09 09 09 09 BLIC_KEY) {.....
16fc0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
16fd0 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e INTF(" ... but n
16fe0 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 ot getting it be
16ff0 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 cause we are not
17000 20 61 20 6b 65 79 2e 22 29 3b 0a 0a 09 09 09 09 a key.");......
17010 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 .break;.....}...
17020 09 09 09 2f 2a 20 57 65 20 6f 6e 6c 79 20 73 75 .../* We only su
17030 70 70 6f 72 74 20 6f 6e 65 20 6b 65 79 20 74 79 pport one key ty
17040 70 65 20 2a 2f 0a 09 09 09 09 63 6b 5f 6b 65 79 pe */.....ck_key
17050 5f 74 79 70 65 20 3d 20 43 4b 4b 5f 52 53 41 3b _type = CKK_RSA;
17060 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 ......pValue = &
17070 63 6b 5f 6b 65 79 5f 74 79 70 65 3b 0a 09 09 09 ck_key_type;....
17080 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 .ulValueLen = si
17090 7a 65 6f 66 28 63 6b 5f 6b 65 79 5f 74 79 70 65 zeof(ck_key_type
170a0 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 );......CACKEY_D
170b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e EBUG_PRINTF(" ..
170c0 2e 20 72 65 74 75 72 6e 69 6e 67 20 43 4b 4b 5f . returning CKK_
170d0 52 53 41 20 28 25 6c 75 29 20 28 25 70 2f 25 6c RSA (%lu) (%p/%l
170e0 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c u)", (unsigned l
170f0 6f 6e 67 29 20 2a 28 28 43 4b 5f 43 45 52 54 49 ong) *((CK_CERTI
17100 46 49 43 41 54 45 5f 54 59 50 45 20 2a 29 20 70 FICATE_TYPE *) p
17110 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 Value), pValue,
17120 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
17130 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 ulValueLen);....
17140 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 ..break;....case
17150 20 43 4b 41 5f 53 49 47 4e 3a 0a 09 09 09 09 43 CKA_SIGN:.....C
17160 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
17170 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 TF("Requesting a
17180 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 49 47 ttribute CKA_SIG
17190 4e 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 N (0x%08lx) ..."
171a0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
171b0 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 ) curr_attr_type
171c0 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 );......if (obje
171d0 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e ctclass == CKO_N
171e0 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b ETSCAPE_TRUST) {
171f0 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 ......CACKEY_DEB
17200 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 UG_PRINTF(" ...
17210 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 but not getting
17220 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 it because we ar
17230 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 e a Netscape tru
17240 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 st object");....
17250 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a ...break;.....}.
17260 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 .....if (objectc
17270 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 lass == CKO_PRIV
17280 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 ATE_KEY) {......
17290 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 pValue = &ck_tru
172a0 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c e;......ulValueL
172b0 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 en = sizeof(ck_t
172c0 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 rue);.....} else
172d0 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d {......pValue =
172e0 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 &ck_false;.....
172f0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 .ulValueLen = si
17300 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a zeof(ck_false);.
17310 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 ....}......CACKE
17320 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
17330 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 ... returning %
17340 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 lu (%p/%lu)", (u
17350 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 nsigned long) *(
17360 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 (CK_BBOOL *) pVa
17370 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 lue), pValue, (u
17380 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c nsigned long) ul
17390 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 ValueLen);......
173a0 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 break;....case C
173b0 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56 45 52 3a KA_SIGN_RECOVER:
173c0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
173d0 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 G_PRINTF("Reques
173e0 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 ting attribute C
173f0 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56 45 52 20 KA_SIGN_RECOVER
17400 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 (0x%08lx) ...",
17410 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
17420 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b curr_attr_type);
17430 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 ......if (object
17440 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 class == CKO_NET
17450 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 SCAPE_TRUST) {..
17460 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
17470 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 _PRINTF(" ... bu
17480 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 t not getting it
17490 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 because we are
174a0 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 a Netscape trust
174b0 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 object");......
174c0 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 .break;.....}...
174d0 09 09 09 2f 2a 20 57 65 20 63 75 72 72 65 6e 74 .../* We current
174e0 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 ly only support
174f0 22 53 69 67 6e 20 77 69 74 68 20 41 70 70 65 6e "Sign with Appen
17500 64 69 78 22 20 2a 2f 0a 09 09 09 09 70 56 61 6c dix" */.....pVal
17510 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a ue = &ck_false;.
17520 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d ....ulValueLen =
17530 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 sizeof(ck_false
17540 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 );......CACKEY_D
17550 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e EBUG_PRINTF(" ..
17560 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 . returning %lu
17570 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 (%p/%lu)", (unsi
17580 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b gned long) *((CK
17590 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 _BBOOL *) pValue
175a0 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 ), pValue, (unsi
175b0 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c gned long) ulVal
175c0 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 ueLen);......bre
175d0 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f ak;....case CKA_
175e0 44 45 43 52 59 50 54 3a 0a 09 09 09 09 43 41 43 DECRYPT:.....CAC
175f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
17600 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 ("Requesting att
17610 72 69 62 75 74 65 20 43 4b 41 5f 44 45 43 52 59 ribute CKA_DECRY
17620 50 54 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e PT (0x%08lx) ...
17630 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e ", (unsigned lon
17640 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 g) curr_attr_typ
17650 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a e);......if (obj
17660 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f ectclass == CKO_
17670 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 NETSCAPE_TRUST)
17680 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 {......CACKEY_DE
17690 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e BUG_PRINTF(" ...
176a0 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 but not getting
176b0 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 it because we a
176c0 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 re a Netscape tr
176d0 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 ust object");...
176e0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d ....break;.....}
176f0 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 ......if (object
17700 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 class == CKO_PRI
17710 56 41 54 45 5f 4b 45 59 20 7c 7c 20 6f 62 6a 65 VATE_KEY || obje
17720 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 ctclass == CKO_P
17730 55 42 4c 49 43 5f 4b 45 59 29 20 7b 0a 09 09 09 UBLIC_KEY) {....
17740 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 ..pValue = &ck_t
17750 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 rue;......ulValu
17760 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b eLen = sizeof(ck
17770 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c _true);.....} el
17780 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 se {......pValue
17790 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 = &ck_false;...
177a0 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 ...ulValueLen =
177b0 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 sizeof(ck_false)
177c0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 ;.....}......CAC
177d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
177e0 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 (" ... returning
177f0 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 %lu (%p/%lu)",
17800 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
17810 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 *((CK_BBOOL *) p
17820 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 Value), pValue,
17830 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
17840 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 ulValueLen);....
17850 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 ..break;....case
17860 20 43 4b 41 5f 53 45 4e 53 49 54 49 56 45 3a 0a CKA_SENSITIVE:.
17870 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
17880 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 _PRINTF("Request
17890 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b ing attribute CK
178a0 41 5f 53 45 4e 53 49 54 49 56 45 20 28 30 78 25 A_SENSITIVE (0x%
178b0 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 08lx) ...", (uns
178c0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 igned long) curr
178d0 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 _attr_type);....
178e0 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 ..if (objectclas
178f0 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 s == CKO_NETSCAP
17900 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 E_TRUST) {......
17910 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
17920 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f NTF(" ... but no
17930 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 t getting it bec
17940 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 ause we are a Ne
17950 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a tscape trust obj
17960 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 ect");.......bre
17970 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 ak;.....}......i
17980 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d f (objectclass =
17990 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 = CKO_PRIVATE_KE
179a0 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 Y) {......pValue
179b0 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 = &ck_true;....
179c0 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 ..ulValueLen = s
179d0 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a izeof(ck_true);.
179e0 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 ....} else {....
179f0 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 ..pValue = &ck_f
17a00 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c alse;......ulVal
17a10 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 ueLen = sizeof(c
17a20 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a k_false);.....}.
17a30 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
17a40 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 G_PRINTF(" ... r
17a50 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 eturning %lu (%p
17a60 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 /%lu)", (unsigne
17a70 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 d long) *((CK_BB
17a80 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 OOL *) pValue),
17a90 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 pValue, (unsigne
17aa0 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c d long) ulValueL
17ab0 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b en);......break;
17ac0 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 45 58 54 ....case CKA_EXT
17ad0 52 41 43 54 41 42 4c 45 3a 0a 09 09 09 09 43 41 RACTABLE:.....CA
17ae0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
17af0 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 F("Requesting at
17b00 74 72 69 62 75 74 65 20 43 4b 41 5f 45 58 54 52 tribute CKA_EXTR
17b10 41 43 54 41 42 4c 45 20 28 30 78 25 30 38 6c 78 ACTABLE (0x%08lx
17b20 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 ) ...", (unsigne
17b30 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 d long) curr_att
17b40 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 r_type);......if
17b50 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d (objectclass ==
17b60 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 CKO_NETSCAPE_TR
17b70 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b UST) {......CACK
17b80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
17b90 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 " ... but not ge
17ba0 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 tting it because
17bb0 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 we are a Netsca
17bc0 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 pe trust object"
17bd0 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a );.......break;.
17be0 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f ....}......if (o
17bf0 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b bjectclass == CK
17c00 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 29 20 7b O_PRIVATE_KEY) {
17c10 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 ......pValue = &
17c20 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 ck_false;......u
17c30 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 lValueLen = size
17c40 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 of(ck_true);....
17c50 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 .} else {......p
17c60 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 Value = &ck_true
17c70 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 ;......ulValueLe
17c80 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 n = sizeof(ck_fa
17c90 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 lse);.....}.....
17ca0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
17cb0 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 INTF(" ... retur
17cc0 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 ning %lu (%p/%lu
17cd0 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f )", (unsigned lo
17ce0 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 ng) *((CK_BBOOL
17cf0 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c *) pValue), pVal
17d00 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f ue, (unsigned lo
17d10 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b ng) ulValueLen);
17d20 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 ......break;....
17d30 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 case CKA_MODULUS
17d40 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 :.....CACKEY_DEB
17d50 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 UG_PRINTF("Reque
17d60 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 sting attribute
17d70 43 4b 41 5f 4d 4f 44 55 4c 55 53 20 28 30 78 25 CKA_MODULUS (0x%
17d80 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 08lx) ...", (uns
17d90 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 igned long) curr
17da0 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 _attr_type);....
17db0 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 ..if (objectclas
17dc0 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 s == CKO_NETSCAP
17dd0 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 E_TRUST) {......
17de0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
17df0 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f NTF(" ... but no
17e00 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 t getting it bec
17e10 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 ause we are a Ne
17e20 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a tscape trust obj
17e30 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 ect");.......bre
17e40 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 ak;.....}......i
17e50 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c f (certificate_l
17e60 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 en >= 0) {......
17e70 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 x509_read_ret =
17e80 78 35 30 39 5f 74 6f 5f 6d 6f 64 75 6c 75 73 28 x509_to_modulus(
17e90 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 certificate, cer
17ea0 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 tificate_len, &p
17eb0 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20 Value);......if
17ec0 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c (x509_read_ret <
17ed0 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 0) {.......pVal
17ee0 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 ue = NULL;......
17ef0 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 } else {.......u
17f00 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 lValueLen = x509
17f10 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 _read_ret;......
17f20 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 }.....}......CAC
17f30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
17f40 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 (" ... returning
17f50 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c (%p/%lu)", pVal
17f60 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f ue, (unsigned lo
17f70 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b ng) ulValueLen);
17f80 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 ......break;....
17f90 63 61 73 65 20 43 4b 41 5f 50 55 42 4c 49 43 5f case CKA_PUBLIC_
17fa0 45 58 50 4f 4e 45 4e 54 3a 0a 09 09 09 09 43 41 EXPONENT:.....CA
17fb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
17fc0 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 F("Requesting at
17fd0 74 72 69 62 75 74 65 20 43 4b 41 5f 50 55 42 4c tribute CKA_PUBL
17fe0 49 43 5f 45 58 50 4f 4e 45 4e 54 20 28 30 78 25 IC_EXPONENT (0x%
17ff0 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 08lx) ...", (uns
18000 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 igned long) curr
18010 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 _attr_type);....
18020 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 ..if (objectclas
18030 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 s == CKO_NETSCAP
18040 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 E_TRUST) {......
18050 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
18060 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f NTF(" ... but no
18070 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 t getting it bec
18080 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 ause we are a Ne
18090 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a tscape trust obj
180a0 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 ect");.......bre
180b0 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 ak;.....}......i
180c0 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c f (certificate_l
180d0 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 en >= 0) {......
180e0 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 x509_read_ret =
180f0 78 35 30 39 5f 74 6f 5f 65 78 70 6f 6e 65 6e 74 x509_to_exponent
18100 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 (certificate, ce
18110 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 rtificate_len, &
18120 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 pValue);......if
18130 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 (x509_read_ret
18140 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61 < 0) {.......pVa
18150 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 lue = NULL;.....
18160 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 .} else {.......
18170 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 ulValueLen = x50
18180 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 9_read_ret;.....
18190 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 .}.....}......CA
181a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
181b0 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e F(" ... returnin
181c0 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 56 61 g (%p/%lu)", pVa
181d0 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c lue, (unsigned l
181e0 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 ong) ulValueLen)
181f0 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 ;......break;...
18200 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f .case CKA_TRUST_
18210 44 49 47 49 54 41 4c 5f 53 49 47 4e 41 54 55 52 DIGITAL_SIGNATUR
18220 45 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 E:....case CKA_T
18230 52 55 53 54 5f 4e 4f 4e 5f 52 45 50 55 44 49 41 RUST_NON_REPUDIA
18240 54 49 4f 4e 3a 0a 09 09 09 63 61 73 65 20 43 4b TION:....case CK
18250 41 5f 54 52 55 53 54 5f 4b 45 59 5f 45 4e 43 49 A_TRUST_KEY_ENCI
18260 50 48 45 52 4d 45 4e 54 3a 0a 09 09 09 63 61 73 PHERMENT:....cas
18270 65 20 43 4b 41 5f 54 52 55 53 54 5f 44 41 54 41 e CKA_TRUST_DATA
18280 5f 45 4e 43 49 50 48 45 52 4d 45 4e 54 3a 0a 09 _ENCIPHERMENT:..
18290 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 ..case CKA_TRUST
182a0 5f 4b 45 59 5f 41 47 52 45 45 4d 45 4e 54 3a 0a _KEY_AGREEMENT:.
182b0 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 ...case CKA_TRUS
182c0 54 5f 4b 45 59 5f 43 45 52 54 5f 53 49 47 4e 3a T_KEY_CERT_SIGN:
182d0 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 ....case CKA_TRU
182e0 53 54 5f 43 52 4c 5f 53 49 47 4e 3a 0a 09 09 09 ST_CRL_SIGN:....
182f0 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 53 case CKA_TRUST_S
18300 45 52 56 45 52 5f 41 55 54 48 3a 0a 09 09 09 63 ERVER_AUTH:....c
18310 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 4c ase CKA_TRUST_CL
18320 49 45 4e 54 5f 41 55 54 48 3a 0a 09 09 09 63 61 IENT_AUTH:....ca
18330 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 4f 44 se CKA_TRUST_COD
18340 45 5f 53 49 47 4e 49 4e 47 3a 0a 09 09 09 63 61 E_SIGNING:....ca
18350 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 45 4d 41 se CKA_TRUST_EMA
18360 49 4c 5f 50 52 4f 54 45 43 54 49 4f 4e 3a 0a 09 IL_PROTECTION:..
18370 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
18380 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 PRINTF("Requesti
18390 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 ng attribute CKA
183a0 5f 54 52 55 53 54 5f 2e 2e 2e 20 28 30 78 25 30 _TRUST_... (0x%0
183b0 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 8lx) ...", (unsi
183c0 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f gned long) curr_
183d0 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 attr_type);.....
183e0 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 .pValue = &ck_tr
183f0 75 73 74 65 64 3b 0a 09 09 09 09 75 6c 56 61 6c usted;.....ulVal
18400 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 ueLen = sizeof(c
18410 6b 5f 74 72 75 73 74 65 64 29 3b 0a 0a 09 09 09 k_trusted);.....
18420 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
18430 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 INTF(" ... retur
18440 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 ning %lu (%p/%lu
18450 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f )", (unsigned lo
18460 6e 67 29 20 2a 28 28 43 4b 5f 54 52 55 53 54 20 ng) *((CK_TRUST
18470 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c *) pValue), pVal
18480 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f ue, (unsigned lo
18490 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b ng) ulValueLen);
184a0 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 ......break;....
184b0 63 61 73 65 20 43 4b 41 5f 43 45 52 54 5f 53 48 case CKA_CERT_SH
184c0 41 31 5f 48 41 53 48 3a 0a 09 09 09 09 43 41 43 A1_HASH:.....CAC
184d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
184e0 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 ("Requesting att
184f0 72 69 62 75 74 65 20 43 4b 41 5f 43 45 52 54 5f ribute CKA_CERT_
18500 53 48 41 31 5f 48 41 53 48 20 28 30 78 25 30 38 SHA1_HASH (0x%08
18510 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 lx) ...", (unsig
18520 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 ned long) curr_a
18530 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 ttr_type);......
18540 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 if (objectclass
18550 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f != CKO_NETSCAPE_
18560 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 TRUST) {......CA
18570 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
18580 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 F(" ... but not
18590 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 getting it becau
185a0 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 se we are not a
185b0 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f Netscape trust o
185c0 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 bject");.......b
185d0 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 reak;.....}.....
185e0 09 53 48 41 31 52 65 73 65 74 28 26 73 68 61 31 .SHA1Reset(&sha1
185f0 5f 63 74 78 29 3b 0a 09 09 09 09 53 48 41 31 49 _ctx);.....SHA1I
18600 6e 70 75 74 28 26 73 68 61 31 5f 63 74 78 2c 20 nput(&sha1_ctx,
18610 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 certificate, cer
18620 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 tificate_len);..
18630 09 09 09 53 48 41 31 52 65 73 75 6c 74 28 26 73 ...SHA1Result(&s
18640 68 61 31 5f 63 74 78 2c 20 73 68 61 31 5f 68 61 ha1_ctx, sha1_ha
18650 73 68 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 sh);......pValue
18660 20 3d 20 73 68 61 31 5f 68 61 73 68 3b 0a 09 09 = sha1_hash;...
18670 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 ..ulValueLen = s
18680 69 7a 65 6f 66 28 73 68 61 31 5f 68 61 73 68 29 izeof(sha1_hash)
18690 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 ;......CACKEY_DE
186a0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e BUG_PRINTF(" ...
186b0 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c returning %p/%l
186c0 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 u", pValue, (uns
186d0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 igned long) ulVa
186e0 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 lueLen);......br
186f0 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 eak;....case CKA
18700 5f 43 45 52 54 5f 4d 44 35 5f 48 41 53 48 3a 0a _CERT_MD5_HASH:.
18710 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
18720 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 _PRINTF("Request
18730 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b ing attribute CK
18740 41 5f 43 45 52 54 5f 4d 44 35 5f 48 41 53 48 20 A_CERT_MD5_HASH
18750 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 (0x%08lx) ...",
18760 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
18770 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b curr_attr_type);
18780 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 ......if (object
18790 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 class != CKO_NET
187a0 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 SCAPE_TRUST) {..
187b0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
187c0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 _PRINTF(" ... bu
187d0 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 t not getting it
187e0 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 because we are
187f0 6e 6f 74 20 61 20 4e 65 74 73 63 61 70 65 20 74 not a Netscape t
18800 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a rust object");..
18810 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 .....break;.....
18820 7d 0a 0a 09 09 09 09 4d 44 35 49 6e 69 74 28 26 }......MD5Init(&
18830 6d 64 35 5f 63 74 78 29 3b 0a 09 09 09 09 4d 44 md5_ctx);.....MD
18840 35 55 70 64 61 74 65 28 26 6d 64 35 5f 63 74 78 5Update(&md5_ctx
18850 2c 20 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 , certificate, c
18860 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b ertificate_len);
18870 0a 09 09 09 09 4d 44 35 46 69 6e 61 6c 28 6d 64 .....MD5Final(md
18880 35 5f 68 61 73 68 2c 20 26 6d 64 35 5f 63 74 78 5_hash, &md5_ctx
18890 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d );......pValue =
188a0 20 6d 64 35 5f 68 61 73 68 3b 0a 09 09 09 09 75 md5_hash;.....u
188b0 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 lValueLen = size
188c0 6f 66 28 6d 64 35 5f 68 61 73 68 29 3b 0a 0a 09 of(md5_hash);...
188d0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
188e0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 PRINTF(" ... ret
188f0 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 urning %p/%lu",
18900 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 pValue, (unsigne
18910 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c d long) ulValueL
18920 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b en);......break;
18930 0a 09 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 ....default:....
18940 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a .pValue = NULL;.
18950 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d ....ulValueLen =
18960 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 09 (CK_LONG) -1;..
18970 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 ...break;...}...
18980 09 69 66 20 28 28 28 43 4b 5f 4c 4f 4e 47 29 20 .if (((CK_LONG)
18990 75 6c 56 61 6c 75 65 4c 65 6e 29 20 21 3d 20 28 ulValueLen) != (
189a0 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 29 29 20 7b (CK_LONG) -1)) {
189b0 0a 09 09 09 2f 2a 20 50 75 73 68 20 63 75 72 72 ..../* Push curr
189c0 5f 61 74 74 72 20 6f 6e 74 6f 20 74 68 65 20 73 _attr onto the s
189d0 74 61 63 6b 20 2a 2f 0a 09 09 09 63 75 72 72 5f tack */....curr_
189e0 61 74 74 72 2e 74 79 70 65 20 3d 20 63 75 72 72 attr.type = curr
189f0 5f 61 74 74 72 5f 74 79 70 65 3b 0a 09 09 09 63 _attr_type;....c
18a00 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65 urr_attr.ulValue
18a10 4c 65 6e 20 3d 20 75 6c 56 61 6c 75 65 4c 65 6e Len = ulValueLen
18a20 3b 0a 0a 09 09 09 63 75 72 72 5f 61 74 74 72 2e ;.....curr_attr.
18a30 70 56 61 6c 75 65 20 3d 20 6d 61 6c 6c 6f 63 28 pValue = malloc(
18a40 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75 curr_attr.ulValu
18a50 65 4c 65 6e 29 3b 0a 09 09 09 6d 65 6d 63 70 79 eLen);....memcpy
18a60 28 63 75 72 72 5f 61 74 74 72 2e 70 56 61 6c 75 (curr_attr.pValu
18a70 65 2c 20 70 56 61 6c 75 65 2c 20 63 75 72 72 5f e, pValue, curr_
18a80 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 attr.ulValueLen)
18a90 3b 0a 0a 09 09 09 69 66 20 28 70 56 61 6c 75 65 ;.....if (pValue
18aa0 5f 66 72 65 65 20 26 26 20 70 56 61 6c 75 65 29 _free && pValue)
18ab0 20 7b 0a 09 09 09 09 66 72 65 65 28 70 56 61 6c {.....free(pVal
18ac0 75 65 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 ue);....}.....if
18ad0 20 28 6e 75 6d 61 74 74 72 73 20 3e 3d 20 72 65 (numattrs >= re
18ae0 74 76 61 6c 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 tval_count) {...
18af0 09 09 72 65 74 76 61 6c 20 3d 20 72 65 61 6c 6c ..retval = reall
18b00 6f 63 28 72 65 74 76 61 6c 2c 20 72 65 74 76 61 oc(retval, retva
18b10 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 l_count * sizeof
18b20 28 2a 72 65 74 76 61 6c 29 29 3b 0a 09 09 09 7d (*retval));....}
18b30 0a 0a 09 09 09 6d 65 6d 63 70 79 28 26 72 65 74 .....memcpy(&ret
18b40 76 61 6c 5b 6e 75 6d 61 74 74 72 73 5d 2c 20 26 val[numattrs], &
18b50 63 75 72 72 5f 61 74 74 72 2c 20 73 69 7a 65 6f curr_attr, sizeo
18b60 66 28 63 75 72 72 5f 61 74 74 72 29 29 3b 0a 09 f(curr_attr));..
18b70 09 09 6e 75 6d 61 74 74 72 73 2b 2b 3b 0a 09 09 ..numattrs++;...
18b80 7d 0a 09 7d 0a 0a 09 69 66 20 28 6e 75 6d 61 74 }..}...if (numat
18b90 74 72 73 20 21 3d 20 30 29 20 7b 0a 09 09 72 65 trs != 0) {...re
18ba0 74 76 61 6c 5f 63 6f 75 6e 74 20 3d 20 6e 75 6d tval_count = num
18bb0 61 74 74 72 73 3b 0a 09 09 72 65 74 76 61 6c 20 attrs;...retval
18bc0 3d 20 72 65 61 6c 6c 6f 63 28 72 65 74 76 61 6c = realloc(retval
18bd0 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a , retval_count *
18be0 20 73 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29 sizeof(*retval)
18bf0 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 66 );..} else {...f
18c00 72 65 65 28 72 65 74 76 61 6c 29 3b 0a 0a 09 09 ree(retval);....
18c10 72 65 74 76 61 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 retval = NULL;..
18c20 7d 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 }...*pulCount =
18c30 6e 75 6d 61 74 74 72 73 3b 0a 0a 09 43 41 43 4b numattrs;...CACK
18c40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
18c50 22 52 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 6f "Returning %lu o
18c60 62 6a 65 63 74 73 20 28 25 70 29 2e 22 2c 20 6e bjects (%p).", n
18c70 75 6d 61 74 74 72 73 2c 20 28 76 6f 69 64 20 2a umattrs, (void *
18c80 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 ) retval);...ret
18c90 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a urn(retval);.}..
18ca0 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b static void cack
18cb0 65 79 5f 66 72 65 65 5f 69 64 65 6e 74 69 74 69 ey_free_identiti
18cc0 65 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 es(struct cackey
18cd0 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 _identity *ident
18ce0 69 74 69 65 73 2c 20 75 6e 73 69 67 6e 65 64 20 ities, unsigned
18cf0 6c 6f 6e 67 20 69 64 65 6e 74 69 74 69 65 73 5f long identities_
18d00 63 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 41 54 54 count) {..CK_ATT
18d10 52 49 42 55 54 45 20 2a 63 75 72 72 5f 61 74 74 RIBUTE *curr_att
18d20 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e r;..unsigned lon
18d30 67 20 69 64 5f 69 64 78 2c 20 61 74 74 72 5f 69 g id_idx, attr_i
18d40 64 78 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 dx;...if (identi
18d50 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 ties == NULL ||
18d60 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 identities_count
18d70 20 3d 3d 20 30 29 20 7b 0a 09 09 72 65 74 75 72 == 0) {...retur
18d80 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 5f n;..}...for (id_
18d90 69 64 78 20 3d 20 30 3b 20 69 64 5f 69 64 78 20 idx = 0; id_idx
18da0 3c 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 < identities_cou
18db0 6e 74 3b 20 69 64 5f 69 64 78 2b 2b 29 20 7b 0a nt; id_idx++) {.
18dc0 09 09 69 66 20 28 69 64 65 6e 74 69 74 69 65 73 ..if (identities
18dd0 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 [id_idx].attribu
18de0 74 65 73 29 20 7b 0a 09 09 09 66 6f 72 20 28 61 tes) {....for (a
18df0 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 61 74 74 ttr_idx = 0; att
18e00 72 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74 69 r_idx < identiti
18e10 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 es[id_idx].attri
18e20 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 61 74 74 butes_count; att
18e30 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 63 r_idx++) {.....c
18e40 75 72 72 5f 61 74 74 72 20 3d 20 26 69 64 65 6e urr_attr = &iden
18e50 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 tities[id_idx].a
18e60 74 74 72 69 62 75 74 65 73 5b 61 74 74 72 5f 69 ttributes[attr_i
18e70 64 78 5d 3b 0a 0a 09 09 09 09 69 66 20 28 63 75 dx];......if (cu
18e80 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 29 rr_attr->pValue)
18e90 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75 72 {......free(cur
18ea0 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 29 3b r_attr->pValue);
18eb0 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 .....}....}.....
18ec0 69 66 20 28 69 64 65 6e 74 69 74 69 65 73 5b 69 if (identities[i
18ed0 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 d_idx].attribute
18ee0 73 29 20 7b 0a 09 09 09 09 66 72 65 65 28 69 64 s) {.....free(id
18ef0 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d entities[id_idx]
18f00 2e 61 74 74 72 69 62 75 74 65 73 29 3b 0a 09 09 .attributes);...
18f10 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 .}.....cackey_fr
18f20 65 65 5f 63 65 72 74 73 28 69 64 65 6e 74 69 74 ee_certs(identit
18f30 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 ies[id_idx].pcsc
18f40 5f 69 64 65 6e 74 69 74 79 2c 20 31 2c 20 31 29 _identity, 1, 1)
18f50 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 66 72 65 65 28 ;...}..}...free(
18f60 69 64 65 6e 74 69 74 69 65 73 29 3b 0a 7d 0a 0a identities);.}..
18f70 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 static unsigned
18f80 6c 6f 6e 67 20 63 61 63 6b 65 79 5f 72 65 61 64 long cackey_read
18f90 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69 65 73 28 _dod_identities(
18fa0 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 struct cackey_id
18fb0 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 69 entity *identiti
18fc0 65 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e es, unsigned lon
18fd0 67 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29 g num_dod_certs)
18fe0 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e {..unsigned lon
18ff0 67 20 63 65 72 74 5f 69 64 78 2c 20 69 64 5f 69 g cert_idx, id_i
19000 64 78 20 3d 20 30 3b 0a 0a 09 69 66 20 28 69 64 dx = 0;...if (id
19010 65 6e 74 69 74 69 65 73 20 3d 3d 20 4e 55 4c 4c entities == NULL
19020 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 6e 75 6d ) {...return(num
19030 5f 64 6f 64 5f 63 65 72 74 73 20 2a 20 33 29 3b _dod_certs * 3);
19040 0a 09 7d 0a 0a 09 66 6f 72 20 28 63 65 72 74 5f ..}...for (cert_
19050 69 64 78 20 3d 20 30 3b 20 63 65 72 74 5f 69 64 idx = 0; cert_id
19060 78 20 3c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 x < num_dod_cert
19070 73 3b 20 63 65 72 74 5f 69 64 78 2b 2b 29 20 7b s; cert_idx++) {
19080 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 ...identities[id
19090 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 _idx].pcsc_ident
190a0 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 69 64 ity = NULL;...id
190b0 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d entities[id_idx]
190c0 2e 61 74 74 72 69 62 75 74 65 73 20 3d 20 63 61 .attributes = ca
190d0 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75 ckey_get_attribu
190e0 74 65 73 28 43 4b 4f 5f 43 45 52 54 49 46 49 43 tes(CKO_CERTIFIC
190f0 41 54 45 2c 20 26 65 78 74 72 61 5f 63 65 72 74 ATE, &extra_cert
19100 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 30 78 66 s[cert_idx], 0xf
19110 30 30 30 20 7c 20 63 65 72 74 5f 69 64 78 2c 20 000 | cert_idx,
19120 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 &identities[id_i
19130 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63 dx].attributes_c
19140 6f 75 6e 74 29 3b 0a 09 09 69 64 5f 69 64 78 2b ount);...id_idx+
19150 2b 3b 0a 0a 09 09 69 64 65 6e 74 69 74 69 65 73 +;....identities
19160 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 [id_idx].pcsc_id
19170 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 entity = NULL;..
19180 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 .identities[id_i
19190 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 20 3d dx].attributes =
191a0 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 cackey_get_attr
191b0 69 62 75 74 65 73 28 43 4b 4f 5f 50 55 42 4c 49 ibutes(CKO_PUBLI
191c0 43 5f 4b 45 59 2c 20 26 65 78 74 72 61 5f 63 65 C_KEY, &extra_ce
191d0 72 74 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 30 rts[cert_idx], 0
191e0 78 66 30 30 30 20 7c 20 63 65 72 74 5f 69 64 78 xf000 | cert_idx
191f0 2c 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64 , &identities[id
19200 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 _idx].attributes
19210 5f 63 6f 75 6e 74 29 3b 0a 09 09 69 64 5f 69 64 _count);...id_id
19220 78 2b 2b 3b 0a 0a 09 09 69 64 65 6e 74 69 74 69 x++;....identiti
19230 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f es[id_idx].pcsc_
19240 69 64 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b identity = NULL;
19250 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 ...identities[id
19260 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 _idx].attributes
19270 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 = cackey_get_at
19280 74 72 69 62 75 74 65 73 28 43 4b 4f 5f 4e 45 54 tributes(CKO_NET
19290 53 43 41 50 45 5f 54 52 55 53 54 2c 20 26 65 78 SCAPE_TRUST, &ex
192a0 74 72 61 5f 63 65 72 74 73 5b 63 65 72 74 5f 69 tra_certs[cert_i
192b0 64 78 5d 2c 20 30 78 66 30 30 30 20 7c 20 63 65 dx], 0xf000 | ce
192c0 72 74 5f 69 64 78 2c 20 26 69 64 65 6e 74 69 74 rt_idx, &identit
192d0 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 ies[id_idx].attr
192e0 69 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 ibutes_count);..
192f0 09 69 64 5f 69 64 78 2b 2b 3b 0a 09 7d 0a 0a 09 .id_idx++;..}...
19300 72 65 74 75 72 6e 28 69 64 5f 69 64 78 29 3b 0a return(id_idx);.
19310 7d 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 }..static struct
19320 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 cackey_identity
19330 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f 69 64 *cackey_read_id
19340 65 6e 74 69 74 69 65 73 28 73 74 72 75 63 74 20 entities(struct
19350 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f cackey_slot *slo
19360 74 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 t, unsigned long
19370 20 2a 69 64 73 5f 66 6f 75 6e 64 29 20 7b 0a 09 *ids_found) {..
19380 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 struct cackey_pc
19390 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73 sc_identity *pcs
193a0 63 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 73 c_identities;..s
193b0 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 truct cackey_ide
193c0 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65 ntity *identitie
193d0 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e s;..unsigned lon
193e0 67 20 6e 75 6d 5f 69 64 73 2c 20 69 64 5f 69 64 g num_ids, id_id
193f0 78 2c 20 63 75 72 72 5f 69 64 5f 74 79 70 65 3b x, curr_id_type;
19400 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 ..unsigned long
19410 6e 75 6d 5f 63 65 72 74 73 2c 20 6e 75 6d 5f 64 num_certs, num_d
19420 6f 64 5f 63 65 72 74 73 2c 20 63 65 72 74 5f 69 od_certs, cert_i
19430 64 78 3b 0a 09 69 6e 74 20 69 6e 63 6c 75 64 65 dx;..int include
19440 5f 65 78 74 72 61 5f 63 65 72 74 73 20 3d 20 30 _extra_certs = 0
19450 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ;...CACKEY_DEBUG
19460 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
19470 22 29 3b 0a 0a 09 69 66 20 28 69 64 73 5f 66 6f ");...if (ids_fo
19480 75 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 und == NULL) {..
19490 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
194a0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64 INTF("Error. id
194b0 73 5f 66 6f 75 6e 64 20 69 73 20 4e 55 4c 4c 22 s_found is NULL"
194c0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c );....return(NUL
194d0 4c 29 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 L);..}..#ifdef C
194e0 41 43 4b 45 59 5f 43 41 52 44 5f 53 4c 4f 54 5f ACKEY_CARD_SLOT_
194f0 49 4e 43 4c 55 44 45 5f 45 58 54 52 41 5f 43 45 INCLUDE_EXTRA_CE
19500 52 54 53 0a 09 69 6e 63 6c 75 64 65 5f 65 78 74 RTS..include_ext
19510 72 61 5f 63 65 72 74 73 20 3d 20 31 3b 0a 23 65 ra_certs = 1;.#e
19520 6e 64 69 66 0a 0a 09 69 66 20 28 67 65 74 65 6e ndif...if (geten
19530 76 28 22 43 41 43 4b 45 59 5f 44 4f 44 5f 43 45 v("CACKEY_DOD_CE
19540 52 54 53 5f 4f 4e 5f 48 57 5f 53 4c 4f 54 53 22 RTS_ON_HW_SLOTS"
19550 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 ) != NULL) {...i
19560 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72 nclude_extra_cer
19570 74 73 20 3d 20 31 3b 0a 09 7d 0a 0a 09 69 66 20 ts = 1;..}...if
19580 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f (getenv("CACKEY_
19590 4e 4f 5f 44 4f 44 5f 43 45 52 54 53 5f 4f 4e 5f NO_DOD_CERTS_ON_
195a0 48 57 5f 53 4c 4f 54 53 22 29 20 21 3d 20 4e 55 HW_SLOTS") != NU
195b0 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f LL) {...include_
195c0 65 78 74 72 61 5f 63 65 72 74 73 20 3d 20 30 3b extra_certs = 0;
195d0 0a 09 7d 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 ..}...if (getenv
195e0 28 22 43 41 43 4b 45 59 5f 4e 4f 5f 45 58 54 52 ("CACKEY_NO_EXTR
195f0 41 5f 43 45 52 54 53 22 29 20 21 3d 20 4e 55 4c A_CERTS") != NUL
19600 4c 29 20 7b 0a 09 09 6e 75 6d 5f 64 6f 64 5f 63 L) {...num_dod_c
19610 65 72 74 73 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 erts = 0;..} els
19620 65 20 7b 0a 09 09 6e 75 6d 5f 64 6f 64 5f 63 65 e {...num_dod_ce
19630 72 74 73 20 3d 20 73 69 7a 65 6f 66 28 65 78 74 rts = sizeof(ext
19640 72 61 5f 63 65 72 74 73 29 20 2f 20 73 69 7a 65 ra_certs) / size
19650 6f 66 28 65 78 74 72 61 5f 63 65 72 74 73 5b 30 of(extra_certs[0
19660 5d 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f ]);..}...if (slo
19670 74 2d 3e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 t->internal) {..
19680 09 6e 75 6d 5f 69 64 73 20 3d 20 63 61 63 6b 65 .num_ids = cacke
19690 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74 y_read_dod_ident
196a0 69 74 69 65 73 28 4e 55 4c 4c 2c 20 6e 75 6d 5f ities(NULL, num_
196b0 64 6f 64 5f 63 65 72 74 73 29 3b 0a 0a 09 09 69 dod_certs);....i
196c0 66 20 28 6e 75 6d 5f 69 64 73 20 21 3d 20 30 29 f (num_ids != 0)
196d0 20 7b 0a 09 09 09 69 64 65 6e 74 69 74 69 65 73 {....identities
196e0 20 3d 20 6d 61 6c 6c 6f 63 28 6e 75 6d 5f 69 64 = malloc(num_id
196f0 73 20 2a 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e s * sizeof(*iden
19700 74 69 74 69 65 73 29 29 3b 0a 0a 09 09 09 63 61 tities));.....ca
19710 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64 ckey_read_dod_id
19720 65 6e 74 69 74 69 65 73 28 69 64 65 6e 74 69 74 entities(identit
19730 69 65 73 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 ies, num_dod_cer
19740 74 73 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a ts);...} else {.
19750 09 09 09 69 64 65 6e 74 69 74 69 65 73 20 3d 20 ...identities =
19760 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09 2a 69 64 NULL;...}....*id
19770 73 5f 66 6f 75 6e 64 20 3d 20 6e 75 6d 5f 69 64 s_found = num_id
19780 73 3b 0a 0a 09 09 72 65 74 75 72 6e 28 69 64 65 s;....return(ide
19790 6e 74 69 74 69 65 73 29 3b 0a 09 7d 0a 0a 09 70 ntities);..}...p
197a0 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 3d csc_identities =
197b0 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 cackey_read_cer
197c0 74 73 28 73 6c 6f 74 2c 20 4e 55 4c 4c 2c 20 26 ts(slot, NULL, &
197d0 6e 75 6d 5f 63 65 72 74 73 29 3b 0a 09 69 66 20 num_certs);..if
197e0 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 (pcsc_identities
197f0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2f 2a != NULL) {.../*
19800 20 43 6f 6e 76 65 72 74 20 6e 75 6d 62 65 72 20 Convert number
19810 6f 66 20 43 65 72 74 73 20 74 6f 20 6e 75 6d 62 of Certs to numb
19820 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 2a 2f er of objects */
19830 0a 09 09 6e 75 6d 5f 69 64 73 20 3d 20 28 43 4b ...num_ids = (CK
19840 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 2d 20 O_PRIVATE_KEY -
19850 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 20 CKO_CERTIFICATE
19860 2b 20 31 29 20 2a 20 6e 75 6d 5f 63 65 72 74 73 + 1) * num_certs
19870 3b 0a 0a 09 09 69 66 20 28 69 6e 63 6c 75 64 65 ;....if (include
19880 5f 65 78 74 72 61 5f 63 65 72 74 73 29 20 7b 0a _extra_certs) {.
19890 09 09 09 6e 75 6d 5f 69 64 73 20 2b 3d 20 63 61 ...num_ids += ca
198a0 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64 ckey_read_dod_id
198b0 65 6e 74 69 74 69 65 73 28 4e 55 4c 4c 2c 20 6e entities(NULL, n
198c0 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29 3b 0a 09 um_dod_certs);..
198d0 09 7d 0a 0a 09 09 69 64 65 6e 74 69 74 69 65 73 .}....identities
198e0 20 3d 20 6d 61 6c 6c 6f 63 28 6e 75 6d 5f 69 64 = malloc(num_id
198f0 73 20 2a 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e s * sizeof(*iden
19900 74 69 74 69 65 73 29 29 3b 0a 0a 09 09 2f 2a 20 tities));..../*
19910 41 64 64 20 63 65 72 74 69 66 69 63 61 74 65 73 Add certificates
19920 2c 20 70 75 62 6c 69 63 20 6b 65 79 73 2c 20 61 , public keys, a
19930 6e 64 20 70 72 69 76 61 74 65 20 6b 65 79 73 20 nd private keys
19940 66 72 6f 6d 20 74 68 65 20 73 6d 61 72 74 63 61 from the smartca
19950 72 64 20 2a 2f 0a 09 09 69 64 5f 69 64 78 20 3d rd */...id_idx =
19960 20 30 3b 0a 09 09 66 6f 72 20 28 63 65 72 74 5f 0;...for (cert_
19970 69 64 78 20 3d 20 30 3b 20 63 65 72 74 5f 69 64 idx = 0; cert_id
19980 78 20 3c 20 6e 75 6d 5f 63 65 72 74 73 3b 20 63 x < num_certs; c
19990 65 72 74 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 ert_idx++) {....
199a0 66 6f 72 20 28 63 75 72 72 5f 69 64 5f 74 79 70 for (curr_id_typ
199b0 65 20 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 e = CKO_CERTIFIC
199c0 41 54 45 3b 20 63 75 72 72 5f 69 64 5f 74 79 70 ATE; curr_id_typ
199d0 65 20 3c 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 e <= CKO_PRIVATE
199e0 5f 4b 45 59 3b 20 63 75 72 72 5f 69 64 5f 74 79 _KEY; curr_id_ty
199f0 70 65 2b 2b 29 20 7b 0a 09 09 09 09 69 64 65 6e pe++) {.....iden
19a00 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 tities[id_idx].a
19a10 74 74 72 69 62 75 74 65 73 20 3d 20 63 61 63 6b ttributes = cack
19a20 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65 ey_get_attribute
19a30 73 28 63 75 72 72 5f 69 64 5f 74 79 70 65 2c 20 s(curr_id_type,
19a40 26 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 &pcsc_identities
19a50 5b 63 65 72 74 5f 69 64 78 5d 2c 20 63 65 72 74 [cert_idx], cert
19a60 5f 69 64 78 2c 20 26 69 64 65 6e 74 69 74 69 65 _idx, &identitie
19a70 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 s[id_idx].attrib
19a80 75 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 utes_count);....
19a90 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f ..identities[id_
19aa0 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 idx].pcsc_identi
19ab0 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 ty = malloc(size
19ac0 6f 66 28 2a 69 64 65 6e 74 69 74 69 65 73 5b 69 of(*identities[i
19ad0 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e d_idx].pcsc_iden
19ae0 74 69 74 79 29 29 3b 0a 09 09 09 09 6d 65 6d 63 tity));.....memc
19af0 70 79 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 py(identities[id
19b00 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 _idx].pcsc_ident
19b10 69 74 79 2c 20 26 70 63 73 63 5f 69 64 65 6e 74 ity, &pcsc_ident
19b20 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2c ities[cert_idx],
19b30 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 sizeof(*identit
19b40 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 ies[id_idx].pcsc
19b50 5f 69 64 65 6e 74 69 74 79 29 29 3b 0a 0a 09 09 _identity));....
19b60 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f ..identities[id_
19b70 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 idx].pcsc_identi
19b80 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 20 ty->certificate
19b90 3d 20 6d 61 6c 6c 6f 63 28 70 63 73 63 5f 69 64 = malloc(pcsc_id
19ba0 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64 entities[cert_id
19bb0 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c x].certificate_l
19bc0 65 6e 29 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 en);.....memcpy(
19bd0 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 identities[id_id
19be0 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 x].pcsc_identity
19bf0 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20 70 ->certificate, p
19c00 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 csc_identities[c
19c10 65 72 74 5f 69 64 78 5d 2e 63 65 72 74 69 66 69 ert_idx].certifi
19c20 63 61 74 65 2c 20 70 63 73 63 5f 69 64 65 6e 74 cate, pcsc_ident
19c30 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e ities[cert_idx].
19c40 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 certificate_len)
19c50 3b 0a 0a 09 09 09 09 69 64 5f 69 64 78 2b 2b 3b ;......id_idx++;
19c60 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 ....}...}....if
19c70 28 69 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 (include_extra_c
19c80 65 72 74 73 29 20 7b 0a 09 09 09 43 41 43 4b 45 erts) {....CACKE
19c90 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
19ca0 49 6e 63 6c 75 64 69 6e 67 20 44 6f 44 20 43 65 Including DoD Ce
19cb0 72 74 69 66 69 63 61 74 65 73 20 6f 6e 20 68 61 rtificates on ha
19cc0 72 64 77 61 72 65 20 73 6c 6f 74 22 29 3b 0a 0a rdware slot");..
19cd0 09 09 09 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 ...cackey_read_d
19ce0 6f 64 5f 69 64 65 6e 74 69 74 69 65 73 28 69 64 od_identities(id
19cf0 65 6e 74 69 74 69 65 73 20 2b 20 69 64 5f 69 64 entities + id_id
19d00 78 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 x, num_dod_certs
19d10 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 );...}....cackey
19d20 5f 66 72 65 65 5f 63 65 72 74 73 28 70 63 73 63 _free_certs(pcsc
19d30 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d _identities, num
19d40 5f 63 65 72 74 73 2c 20 31 29 3b 0a 0a 09 09 2a _certs, 1);....*
19d50 69 64 73 5f 66 6f 75 6e 64 20 3d 20 6e 75 6d 5f ids_found = num_
19d60 69 64 73 3b 0a 0a 09 09 72 65 74 75 72 6e 28 69 ids;....return(i
19d70 64 65 6e 74 69 74 69 65 73 29 3b 0a 09 7d 0a 0a dentities);..}..
19d80 0a 09 2a 69 64 73 5f 66 6f 75 6e 64 20 3d 20 30 ..*ids_found = 0
19d90 3b 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b ;..return(NULL);
19da0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 .}..CK_DEFINE_FU
19db0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f NCTION(CK_RV, C_
19dc0 49 6e 69 74 69 61 6c 69 7a 65 29 28 43 4b 5f 56 Initialize)(CK_V
19dd0 4f 49 44 5f 50 54 52 20 70 49 6e 69 74 41 72 67 OID_PTR pInitArg
19de0 73 29 20 7b 0a 09 43 4b 5f 43 5f 49 4e 49 54 49 s) {..CK_C_INITI
19df0 41 4c 49 5a 45 5f 41 52 47 53 20 43 4b 5f 50 54 ALIZE_ARGS CK_PT
19e00 52 20 61 72 67 73 3b 0a 09 75 69 6e 74 33 32 5f R args;..uint32_
19e10 74 20 69 64 78 2c 20 68 69 67 68 65 73 74 5f 73 t idx, highest_s
19e20 6c 6f 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f lot;..int mutex_
19e30 69 6e 69 74 5f 72 65 74 3b 0a 0a 09 43 41 43 4b init_ret;...CACK
19e40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
19e50 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 "Called.");...if
19e60 20 28 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c (cackey_initial
19e70 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 ized) {...CACKEY
19e80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
19e90 72 72 6f 72 2e 20 20 41 6c 72 65 61 64 79 20 69 rror. Already i
19ea0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a nitialized.");..
19eb0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 ..return(CKR_CRY
19ec0 50 54 4f 4b 49 5f 41 4c 52 45 41 44 59 5f 49 4e PTOKI_ALREADY_IN
19ed0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
19ee0 09 69 66 20 28 70 49 6e 69 74 41 72 67 73 20 21 .if (pInitArgs !
19ef0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 61 72 67 73 = NULL) {...args
19f00 20 3d 20 70 49 6e 69 74 41 72 67 73 3b 0a 09 09 = pInitArgs;...
19f10 6d 65 6d 63 70 79 28 26 63 61 63 6b 65 79 5f 61 memcpy(&cackey_a
19f20 72 67 73 2c 20 61 72 67 73 2c 20 73 69 7a 65 6f rgs, args, sizeo
19f30 66 28 63 61 63 6b 65 79 5f 61 72 67 73 29 29 3b f(cackey_args));
19f40 0a 0a 09 09 69 66 20 28 61 72 67 73 2d 3e 43 72 ....if (args->Cr
19f50 65 61 74 65 4d 75 74 65 78 20 3d 3d 20 4e 55 4c eateMutex == NUL
19f60 4c 20 7c 7c 20 61 72 67 73 2d 3e 44 65 73 74 72 L || args->Destr
19f70 6f 79 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 oyMutex == NULL
19f80 7c 7c 20 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74 || args->LockMut
19f90 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 ex == NULL || ar
19fa0 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 gs->UnlockMutex
19fb0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 == NULL) {....if
19fc0 20 28 61 72 67 73 2d 3e 43 72 65 61 74 65 4d 75 (args->CreateMu
19fd0 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 tex != NULL || a
19fe0 72 67 73 2d 3e 44 65 73 74 72 6f 79 4d 75 74 65 rgs->DestroyMute
19ff0 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 x != NULL || arg
1a000 73 2d 3e 4c 6f 63 6b 4d 75 74 65 78 20 21 3d 20 s->LockMutex !=
1a010 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 55 6e NULL || args->Un
1a020 6c 6f 63 6b 4d 75 74 65 78 20 21 3d 20 4e 55 4c lockMutex != NUL
1a030 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f L) {.....CACKEY_
1a040 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
1a050 72 6f 72 2e 20 53 6f 6d 65 2c 20 62 75 74 20 6e ror. Some, but n
1a060 6f 74 20 41 6c 6c 20 74 68 72 65 61 64 69 6e 67 ot All threading
1a070 20 70 72 69 6d 69 74 69 76 65 73 20 70 72 6f 76 primitives prov
1a080 69 64 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 ided.");......re
1a090 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e turn(CKR_ARGUMEN
1a0a0 54 53 5f 42 41 44 29 3b 0a 09 09 09 7d 0a 09 09 TS_BAD);....}...
1a0b0 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 63 61 }..} else {...ca
1a0c0 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65 ckey_args.Create
1a0d0 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 Mutex = NULL;...
1a0e0 63 61 63 6b 65 79 5f 61 72 67 73 2e 44 65 73 74 cackey_args.Dest
1a0f0 72 6f 79 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b royMutex = NULL;
1a100 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c ...cackey_args.L
1a110 6f 63 6b 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b ockMutex = NULL;
1a120 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 ...cackey_args.U
1a130 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d 20 4e 55 4c nlockMutex = NUL
1a140 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 L;...cackey_args
1a150 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a .flags = 0;..}..
1a160 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 .for (idx = 0; i
1a170 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 dx < (sizeof(cac
1a180 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 key_sessions) /
1a190 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 sizeof(cackey_se
1a1a0 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 ssions[0])); idx
1a1b0 2b 2b 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 ++) {...cackey_s
1a1c0 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 essions[idx].act
1a1d0 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 66 6f ive = 0;..}...fo
1a1e0 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 r (idx = 0; idx
1a1f0 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 < (sizeof(cackey
1a200 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 _slots) / sizeof
1a210 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d (cackey_slots[0]
1a220 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 63 )); idx++) {...c
1a230 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d ackey_slots[idx]
1a240 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 09 63 .active = 0;...c
1a250 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d ackey_slots[idx]
1a260 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20 4e .pcsc_reader = N
1a270 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c ULL;...cackey_sl
1a280 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63 ots[idx].transac
1a290 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a tion_depth = 0;.
1a2a0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 ..cackey_slots[i
1a2b0 64 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f dx].transaction_
1a2c0 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 need_hw_lock = 0
1a2d0 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 ;...cackey_slots
1a2e0 5b 69 64 78 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 [idx].slot_reset
1a2f0 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 = 0;...cackey_s
1a300 6c 6f 74 73 5b 69 64 78 5d 2e 74 6f 6b 65 6e 5f lots[idx].token_
1a310 66 6c 61 67 73 20 3d 20 30 3b 0a 09 09 63 61 63 flags = 0;...cac
1a320 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c key_slots[idx].l
1a330 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 abel = NULL;...c
1a340 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d ackey_slots[idx]
1a350 2e 69 6e 74 65 72 6e 61 6c 20 3d 20 30 3b 0a 09 .internal = 0;..
1a360 7d 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 }...if (getenv("
1a370 43 41 43 4b 45 59 5f 4e 4f 5f 45 58 54 52 41 5f CACKEY_NO_EXTRA_
1a380 43 45 52 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 CERTS") != NULL)
1a390 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
1a3a0 47 5f 50 52 49 4e 54 46 28 22 41 73 6b 65 64 20 G_PRINTF("Asked
1a3b0 6e 6f 74 20 74 6f 20 69 6e 63 6c 75 64 65 20 44 not to include D
1a3c0 6f 44 20 63 65 72 74 69 66 69 63 61 74 65 73 22 oD certificates"
1a3d0 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 68 );..} else {...h
1a3e0 69 67 68 65 73 74 5f 73 6c 6f 74 20 3d 20 28 73 ighest_slot = (s
1a3f0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f izeof(cackey_slo
1a400 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 ts) / sizeof(cac
1a410 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 20 2d key_slots[0])) -
1a420 20 31 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 1;....CACKEY_DE
1a430 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 63 6c BUG_PRINTF("Incl
1a440 75 64 69 6e 67 20 44 6f 44 20 63 65 72 74 73 20 uding DoD certs
1a450 69 6e 20 73 6c 6f 74 20 25 6c 75 22 2c 20 28 75 in slot %lu", (u
1a460 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 69 nsigned long) hi
1a470 67 68 65 73 74 5f 73 6c 6f 74 29 3b 0a 0a 09 09 ghest_slot);....
1a480 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67 cackey_slots[hig
1a490 68 65 73 74 5f 73 6c 6f 74 5d 2e 61 63 74 69 76 hest_slot].activ
1a4a0 65 20 3d 20 31 3b 0a 09 09 63 61 63 6b 65 79 5f e = 1;...cackey_
1a4b0 73 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f 73 6c slots[highest_sl
1a4c0 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 20 3d 20 31 ot].internal = 1
1a4d0 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 ;...cackey_slots
1a4e0 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 6c [highest_slot].l
1a4f0 61 62 65 6c 20 3d 20 28 75 6e 73 69 67 6e 65 64 abel = (unsigned
1a500 20 63 68 61 72 20 2a 29 20 22 44 6f 44 20 43 65 char *) "DoD Ce
1a510 72 74 69 66 69 63 61 74 65 73 22 3b 0a 09 09 63 rtificates";...c
1a520 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68 ackey_slots[high
1a530 65 73 74 5f 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 est_slot].pcsc_r
1a540 65 61 64 65 72 20 3d 20 22 43 41 43 4b 65 79 22 eader = "CACKey"
1a550 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 ;...cackey_slots
1a560 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 74 [highest_slot].t
1a570 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a oken_flags = 0;.
1a580 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 69 6e 69 74 .}...cackey_init
1a590 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a 09 69 ialized = 1;...i
1a5a0 66 20 28 21 63 61 63 6b 65 79 5f 62 69 67 6c 6f f (!cackey_biglo
1a5b0 63 6b 5f 69 6e 69 74 29 20 7b 0a 09 09 6d 75 74 ck_init) {...mut
1a5c0 65 78 5f 69 6e 69 74 5f 72 65 74 20 3d 20 63 61 ex_init_ret = ca
1a5d0 63 6b 65 79 5f 6d 75 74 65 78 5f 63 72 65 61 74 ckey_mutex_creat
1a5e0 65 28 26 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 e(&cackey_bigloc
1a5f0 6b 29 3b 0a 0a 09 09 69 66 20 28 6d 75 74 65 78 k);....if (mutex
1a600 5f 69 6e 69 74 5f 72 65 74 20 21 3d 20 30 29 20 _init_ret != 0)
1a610 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {....CACKEY_DEBU
1a620 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
1a630 20 20 4d 75 74 65 78 20 69 6e 69 74 69 61 6c 69 Mutex initiali
1a640 7a 61 74 69 6f 6e 20 66 61 69 6c 65 64 2e 22 29 zation failed.")
1a650 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 ;.....return(CKR
1a660 5f 43 41 4e 54 5f 4c 4f 43 4b 29 3b 0a 09 09 7d _CANT_LOCK);...}
1a670 0a 0a 09 09 63 61 63 6b 65 79 5f 62 69 67 6c 6f ....cackey_biglo
1a680 63 6b 5f 69 6e 69 74 20 3d 20 31 3b 0a 09 7d 0a ck_init = 1;..}.
1a690 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1a6a0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
1a6b0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 CKR_OK (%i)", C
1a6c0 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e KR_OK);...return
1a6d0 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f (CKR_OK);.}..CK_
1a6e0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 DEFINE_FUNCTION(
1a6f0 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 61 6c 69 7a CK_RV, C_Finaliz
1a700 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 e)(CK_VOID_PTR p
1a710 52 65 73 65 72 76 65 64 29 20 7b 0a 09 75 69 6e Reserved) {..uin
1a720 74 33 32 5f 74 20 69 64 78 3b 0a 0a 09 43 41 43 t32_t idx;...CAC
1a730 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1a740 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 ("Called.");...i
1a750 66 20 28 70 52 65 73 65 72 76 65 64 20 21 3d 20 f (pReserved !=
1a760 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 NULL) {...CACKEY
1a770 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
1a780 72 72 6f 72 2e 20 70 52 65 73 65 72 76 65 64 20 rror. pReserved
1a790 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a is not NULL.");.
1a7a0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 ...return(CKR_AR
1a7b0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d GUMENTS_BAD);..}
1a7c0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 ...if (!cackey_i
1a7d0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 nitialized) {...
1a7e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1a7f0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 NTF("Error. Not
1a800 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b initialized.");
1a810 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 ....return(CKR_C
1a820 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 RYPTOKI_NOT_INIT
1a830 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 66 IALIZED);..}...f
1a840 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 or (idx = 0; idx
1a850 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 < (sizeof(cacke
1a860 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 y_sessions) / si
1a870 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 zeof(cackey_sess
1a880 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b ions[0])); idx++
1a890 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 ) {...if (cackey
1a8a0 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 _sessions[idx].a
1a8b0 63 74 69 76 65 29 20 7b 0a 09 09 09 43 5f 43 6c ctive) {....C_Cl
1a8c0 6f 73 65 53 65 73 73 69 6f 6e 28 69 64 78 29 3b oseSession(idx);
1a8d0 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 ...}..}...cackey
1a8e0 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 _slots_disconnec
1a8f0 74 5f 61 6c 6c 28 29 3b 0a 0a 09 66 6f 72 20 28 t_all();...for (
1a900 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 idx = 0; idx < (
1a910 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c sizeof(cackey_sl
1a920 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 ots) / sizeof(ca
1a930 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b ckey_slots[0]));
1a940 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 idx++) {...if (
1a950 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 cackey_slots[idx
1a960 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 ].internal) {...
1a970 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a .continue;...}..
1a980 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f ..if (cackey_slo
1a990 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 61 ts[idx].pcsc_rea
1a9a0 64 65 72 29 20 7b 0a 09 09 09 66 72 65 65 28 63 der) {....free(c
1a9b0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d ackey_slots[idx]
1a9c0 2e 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 .pcsc_reader);..
1a9d0 09 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 .}....if (cackey
1a9e0 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 63 61 63 68 _slots[idx].cach
1a9f0 65 64 5f 63 65 72 74 73 29 20 7b 0a 09 09 09 63 ed_certs) {....c
1aa00 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73 ackey_free_certs
1aa10 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 (cackey_slots[id
1aa20 78 5d 2e 63 61 63 68 65 64 5f 63 65 72 74 73 2c x].cached_certs,
1aa30 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 cackey_slots[id
1aa40 78 5d 2e 63 61 63 68 65 64 5f 63 65 72 74 73 5f x].cached_certs_
1aa50 63 6f 75 6e 74 2c 20 31 29 3b 0a 0a 09 09 09 63 count, 1);.....c
1aa60 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d ackey_slots[idx]
1aa70 2e 63 61 63 68 65 64 5f 63 65 72 74 73 20 3d 20 .cached_certs =
1aa80 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 NULL;...}..}...c
1aa90 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f ackey_pcsc_disco
1aaa0 6e 6e 65 63 74 28 29 3b 0a 0a 09 63 61 63 6b 65 nnect();...cacke
1aab0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 y_initialized =
1aac0 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 0;...CACKEY_DEBU
1aad0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
1aae0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 ing CKR_OK (%i)"
1aaf0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 , CKR_OK);...ret
1ab00 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a urn(CKR_OK);.}..
1ab10 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 CK_DEFINE_FUNCTI
1ab20 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 49 ON(CK_RV, C_GetI
1ab30 6e 66 6f 29 28 43 4b 5f 49 4e 46 4f 5f 50 54 52 nfo)(CK_INFO_PTR
1ab40 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74 69 pInfo) {..stati
1ab50 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6d 61 c CK_UTF8CHAR ma
1ab60 6e 75 66 61 63 74 75 72 65 72 49 44 5b 5d 20 3d nufacturerID[] =
1ab70 20 22 55 2e 53 2e 20 47 6f 76 65 72 6e 6d 65 6e "U.S. Governmen
1ab80 74 22 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 t";..static CK_U
1ab90 54 46 38 43 48 41 52 20 6c 69 62 72 61 72 79 44 TF8CHAR libraryD
1aba0 65 73 63 72 69 70 74 69 6f 6e 5b 5d 20 3d 20 22 escription[] = "
1abb0 43 41 43 4b 65 79 22 3b 0a 0a 09 43 41 43 4b 45 CACKey";...CACKE
1abc0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1abd0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 Called.");...if
1abe0 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 (pInfo == NULL)
1abf0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
1ac00 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
1ac10 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 pInfo is NULL.")
1ac20 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
1ac30 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a ARGUMENTS_BAD);.
1ac40 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 .}...if (!cackey
1ac50 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
1ac60 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1ac70 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e RINTF("Error. N
1ac80 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 ot initialized."
1ac90 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
1aca0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e _CRYPTOKI_NOT_IN
1acb0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
1acc0 09 70 49 6e 66 6f 2d 3e 63 72 79 70 74 6f 6b 69 .pInfo->cryptoki
1acd0 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 Version.major =
1ace0 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b ((CACKEY_CRYPTOK
1acf0 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 I_VERSION_CODE)
1ad00 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09 >> 16) & 0xff;..
1ad10 70 49 6e 66 6f 2d 3e 63 72 79 70 74 6f 6b 69 56 pInfo->cryptokiV
1ad20 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 ersion.minor = (
1ad30 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 (CACKEY_CRYPTOKI
1ad40 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e _VERSION_CODE) >
1ad50 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 6d > 8) & 0xff;...m
1ad60 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e emset(pInfo->man
1ad70 75 66 61 63 74 75 72 65 72 49 44 2c 20 27 20 27 ufacturerID, ' '
1ad80 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e , sizeof(pInfo->
1ad90 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 29 manufacturerID))
1ada0 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d ;..memcpy(pInfo-
1adb0 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c >manufacturerID,
1adc0 20 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c manufacturerID,
1add0 20 73 69 7a 65 6f 66 28 6d 61 6e 75 66 61 63 74 sizeof(manufact
1ade0 75 72 65 72 49 44 29 20 2d 20 31 29 3b 0a 0a 09 urerID) - 1);...
1adf0 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 30 pInfo->flags = 0
1ae00 78 30 30 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 x00;...memset(pI
1ae10 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73 63 nfo->libraryDesc
1ae20 72 69 70 74 69 6f 6e 2c 20 27 20 27 2c 20 73 69 ription, ' ', si
1ae30 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 zeof(pInfo->libr
1ae40 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 29 29 aryDescription))
1ae50 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d ;..memcpy(pInfo-
1ae60 3e 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74 >libraryDescript
1ae70 69 6f 6e 2c 20 6c 69 62 72 61 72 79 44 65 73 63 ion, libraryDesc
1ae80 72 69 70 74 69 6f 6e 2c 20 73 69 7a 65 6f 66 28 ription, sizeof(
1ae90 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69 libraryDescripti
1aea0 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09 70 49 6e 66 on) - 1);...pInf
1aeb0 6f 2d 3e 6c 69 62 72 61 72 79 56 65 72 73 69 6f o->libraryVersio
1aec0 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65 n.major = (cacke
1aed0 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e y_getversion() >
1aee0 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70 > 16) & 0xff;..p
1aef0 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 56 65 72 Info->libraryVer
1af00 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 sion.minor = (ca
1af10 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 ckey_getversion(
1af20 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a ) >> 8) & 0xff;.
1af30 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1af40 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
1af50 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 CKR_OK (%i)", C
1af60 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e KR_OK);...return
1af70 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a (CKR_OK);.}../*.
1af80 20 2a 20 50 72 6f 63 65 73 73 20 6c 69 73 74 20 * Process list
1af90 6f 66 20 72 65 61 64 65 72 73 2c 20 61 6e 64 20 of readers, and
1afa0 63 72 65 61 74 65 20 6d 61 70 70 69 6e 67 20 62 create mapping b
1afb0 65 74 77 65 65 6e 20 72 65 61 64 65 72 20 6e 61 etween reader na
1afc0 6d 65 20 61 6e 64 20 73 6c 6f 74 20 49 44 0a 20 me and slot ID.
1afd0 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e */.CK_DEFINE_FUN
1afe0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 CTION(CK_RV, C_G
1aff0 65 74 53 6c 6f 74 4c 69 73 74 29 28 43 4b 5f 42 etSlotList)(CK_B
1b000 42 4f 4f 4c 20 74 6f 6b 65 6e 50 72 65 73 65 6e BOOL tokenPresen
1b010 74 2c 20 43 4b 5f 53 4c 4f 54 5f 49 44 5f 50 54 t, CK_SLOT_ID_PT
1b020 52 20 70 53 6c 6f 74 4c 69 73 74 2c 20 43 4b 5f R pSlotList, CK_
1b030 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f 75 ULONG_PTR pulCou
1b040 6e 74 29 20 7b 0a 09 73 74 61 74 69 63 20 69 6e nt) {..static in
1b050 74 20 66 69 72 73 74 5f 63 61 6c 6c 20 3d 20 31 t first_call = 1
1b060 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 ;..int mutex_ret
1b070 76 61 6c 3b 0a 09 69 6e 74 20 70 63 73 63 5f 63 val;..int pcsc_c
1b080 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 43 4b 5f onnect_ret;..CK_
1b090 55 4c 4f 4e 47 20 63 6f 75 6e 74 2c 20 73 6c 6f ULONG count, slo
1b0a0 74 5f 63 6f 75 6e 74 20 3d 20 30 2c 20 63 75 72 t_count = 0, cur
1b0b0 72 73 6c 6f 74 2c 20 73 6c 6f 74 5f 69 64 78 3b rslot, slot_idx;
1b0c0 0a 09 63 68 61 72 20 2a 70 63 73 63 5f 72 65 61 ..char *pcsc_rea
1b0d0 64 65 72 73 2c 20 2a 70 63 73 63 5f 72 65 61 64 ders, *pcsc_read
1b0e0 65 72 73 5f 73 2c 20 2a 70 63 73 63 5f 72 65 61 ers_s, *pcsc_rea
1b0f0 64 65 72 73 5f 65 3b 0a 09 44 57 4f 52 44 20 70 ders_e;..DWORD p
1b100 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 3b csc_readers_len;
1b110 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 6c 69 73 ..LONG scard_lis
1b120 74 72 65 61 64 65 72 73 5f 72 65 74 3b 0a 09 73 treaders_ret;..s
1b130 69 7a 65 5f 74 20 63 75 72 72 5f 72 65 61 64 65 ize_t curr_reade
1b140 72 5f 6c 65 6e 3b 0a 09 69 6e 74 20 73 6c 6f 74 r_len;..int slot
1b150 5f 72 65 73 65 74 3b 0a 0a 09 43 41 43 4b 45 59 _reset;...CACKEY
1b160 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 _DEBUG_PRINTF("C
1b170 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 alled.");...if (
1b180 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c pulCount == NULL
1b190 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
1b1a0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
1b1b0 2e 20 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e 55 . pulCount is NU
1b1c0 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e LL.");....return
1b1d0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 (CKR_ARGUMENTS_B
1b1e0 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 AD);..}...if (!c
1b1f0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 ackey_initialize
1b200 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 d) {...CACKEY_DE
1b210 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
1b220 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 r. Not initiali
1b230 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 zed.");....retur
1b240 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e n(CKR_CRYPTOKI_N
1b250 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b OT_INITIALIZED);
1b260 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 ..}...mutex_retv
1b270 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 al = cackey_mute
1b280 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 x_lock(cackey_bi
1b290 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 glock);..if (mut
1b2a0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 ex_retval != 0)
1b2b0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
1b2c0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
1b2d0 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e Locking failed.
1b2e0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
1b2f0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 R_GENERAL_ERROR)
1b300 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6c 65 61 72 20 ;..}.../* Clear
1b310 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73 20 2a 2f list of slots */
1b320 0a 09 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 30 ..slot_reset = 0
1b330 3b 0a 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 ;..if (pSlotList
1b340 29 20 7b 0a 09 09 69 66 20 28 66 69 72 73 74 5f ) {...if (first_
1b350 63 61 6c 6c 29 20 7b 0a 09 09 09 66 69 72 73 74 call) {....first
1b360 5f 63 61 6c 6c 20 3d 20 30 3b 0a 0a 09 09 09 73 _call = 0;.....s
1b370 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 lot_reset = 1;..
1b380 09 7d 0a 0a 09 09 2f 2a 20 49 66 20 61 6e 79 20 .}..../* If any
1b390 6f 66 20 74 68 65 20 73 6c 6f 74 73 20 68 61 76 of the slots hav
1b3a0 65 20 62 65 65 6e 20 72 65 73 65 74 20 74 68 65 e been reset the
1b3b0 6e 20 70 75 72 67 65 20 61 6c 6c 20 69 6e 66 6f n purge all info
1b3c0 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63 68 65 63 rmation and chec
1b3d0 6b 20 61 67 61 69 6e 20 2a 2f 0a 09 09 66 6f 72 k again */...for
1b3e0 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 (currslot = 0;
1b3f0 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 currslot < (size
1b400 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 of(cackey_slots)
1b410 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 / sizeof(cackey
1b420 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72 _slots[0])); cur
1b430 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 69 66 rslot++) {....if
1b440 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 (cackey_slots[c
1b450 75 72 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 urrslot].interna
1b460 6c 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 l) {.....continu
1b470 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 e;....}.....if (
1b480 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 !cackey_slots[cu
1b490 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20 rrslot].active)
1b4a0 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a {.....continue;.
1b4b0 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 63 61 63 ...}.....if (cac
1b4c0 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c key_slots[currsl
1b4d0 6f 74 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 29 20 ot].slot_reset)
1b4e0 7b 0a 09 09 09 09 73 6c 6f 74 5f 72 65 73 65 74 {.....slot_reset
1b4f0 20 3d 20 31 3b 0a 0a 09 09 09 09 62 72 65 61 6b = 1;......break
1b500 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 ;....}...}....if
1b510 20 28 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a (slot_reset) {.
1b520 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1b530 50 52 49 4e 54 46 28 22 50 75 72 67 69 6e 67 20 PRINTF("Purging
1b540 61 6c 6c 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 all slot informa
1b550 74 69 6f 6e 2e 22 29 3b 0a 0a 09 09 09 2f 2a 20 tion.");...../*
1b560 4f 6e 6c 79 20 75 70 64 61 74 65 20 74 68 65 20 Only update the
1b570 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73 20 69 66 list of slots if
1b580 20 77 65 20 61 72 65 20 61 63 74 75 61 6c 6c 79 we are actually
1b590 20 62 65 69 6e 67 20 73 75 70 70 6c 79 20 74 68 being supply th
1b5a0 65 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69 e slot informati
1b5b0 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f on */....cackey_
1b5c0 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 slots_disconnect
1b5d0 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 66 6f 72 20 _all();.....for
1b5e0 28 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63 (currslot = 0; c
1b5f0 75 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f urrslot < (sizeo
1b600 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 f(cackey_slots)
1b610 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f / sizeof(cackey_
1b620 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 slots[0])); curr
1b630 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 09 69 66 slot++) {.....if
1b640 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 (cackey_slots[c
1b650 75 72 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 urrslot].interna
1b660 6c 29 20 7b 0a 09 09 09 09 09 63 6f 6e 74 69 6e l) {......contin
1b670 75 65 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 ue;.....}......i
1b680 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b f (cackey_slots[
1b690 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 currslot].pcsc_r
1b6a0 65 61 64 65 72 29 20 7b 0a 09 09 09 09 09 66 72 eader) {......fr
1b6b0 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b ee(cackey_slots[
1b6c0 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 currslot].pcsc_r
1b6d0 65 61 64 65 72 29 3b 0a 0a 09 09 09 09 09 63 61 eader);.......ca
1b6e0 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 ckey_slots[currs
1b6f0 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 lot].pcsc_reader
1b700 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 7d 0a 0a = NULL;.....}..
1b710 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 ....if (cackey_s
1b720 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c lots[currslot].l
1b730 61 62 65 6c 29 20 7b 0a 09 09 09 09 09 66 72 65 abel) {......fre
1b740 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 e(cackey_slots[c
1b750 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 29 3b urrslot].label);
1b760 0a 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c .......cackey_sl
1b770 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 ots[currslot].la
1b780 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 bel = NULL;.....
1b790 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 6c }......cackey_sl
1b7a0 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 ots[currslot].ac
1b7b0 74 69 76 65 20 3d 20 30 3b 0a 09 09 09 7d 0a 09 tive = 0;....}..
1b7c0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 0a 09 09 .} else {.......
1b7d0 7d 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d }..}.../* Determ
1b7e0 69 6e 65 20 6c 69 73 74 20 6f 66 20 72 65 61 64 ine list of read
1b7f0 65 72 73 20 2a 2f 0a 09 70 63 73 63 5f 63 6f 6e ers */..pcsc_con
1b800 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 nect_ret = cacke
1b810 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 y_pcsc_connect()
1b820 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e ;..if (pcsc_conn
1b830 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 ect_ret != CACKE
1b840 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 Y_PCSC_S_OK) {..
1b850 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1b860 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e INTF("Connection
1b870 20 74 6f 20 50 43 2f 53 43 20 66 61 69 6c 65 64 to PC/SC failed
1b880 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 73 6c , assuming no sl
1b890 6f 74 73 22 29 3b 0a 0a 09 09 73 6c 6f 74 5f 63 ots");....slot_c
1b8a0 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 ount = 0;..} els
1b8b0 65 20 7b 0a 09 09 70 63 73 63 5f 72 65 61 64 65 e {...pcsc_reade
1b8c0 72 73 5f 6c 65 6e 20 3d 20 30 3b 0a 0a 09 09 73 rs_len = 0;....s
1b8d0 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 card_listreaders
1b8e0 5f 72 65 74 20 3d 20 53 43 61 72 64 4c 69 73 74 _ret = SCardList
1b8f0 52 65 61 64 65 72 73 28 2a 63 61 63 6b 65 79 5f Readers(*cackey_
1b900 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c pcsc_handle, NUL
1b910 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63 73 63 5f 72 L, NULL, &pcsc_r
1b920 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 0a 09 09 eaders_len);....
1b930 69 66 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65 if (scard_listre
1b940 61 64 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41 aders_ret == SCA
1b950 52 44 5f 46 5f 43 4f 4d 4d 5f 45 52 52 4f 52 29 RD_F_COMM_ERROR)
1b960 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 {....CACKEY_DEB
1b970 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
1b980 2e 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 . SCardListReade
1b990 72 73 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 rs() returned SC
1b9a0 41 52 44 5f 46 5f 43 4f 4d 4d 5f 45 52 52 4f 52 ARD_F_COMM_ERROR
1b9b0 2c 20 61 73 73 75 6d 69 6e 67 20 43 6f 6e 6e 65 , assuming Conne
1b9c0 63 74 69 6f 6e 20 74 6f 20 50 43 2f 53 43 20 77 ction to PC/SC w
1b9d0 65 6e 74 20 61 77 61 79 2e 20 52 65 63 6f 6e 6e ent away. Reconn
1b9e0 65 63 74 69 6e 67 2e 22 29 3b 0a 0a 09 09 09 63 ecting.");.....c
1b9f0 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f ackey_pcsc_disco
1ba00 6e 6e 65 63 74 28 29 3b 0a 09 09 09 63 61 63 6b nnect();....cack
1ba10 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 ey_pcsc_connect(
1ba20 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 );.....CACKEY_DE
1ba30 42 55 47 5f 50 52 49 4e 54 46 28 22 54 72 79 69 BUG_PRINTF("Tryi
1ba40 6e 67 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 ng SCardListRead
1ba50 65 72 73 28 29 20 61 67 61 69 6e 22 29 3b 0a 09 ers() again");..
1ba60 09 09 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 ..scard_listread
1ba70 65 72 73 5f 72 65 74 20 3d 20 53 43 61 72 64 4c ers_ret = SCardL
1ba80 69 73 74 52 65 61 64 65 72 73 28 2a 63 61 63 6b istReaders(*cack
1ba90 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 ey_pcsc_handle,
1baa0 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63 73 NULL, NULL, &pcs
1bab0 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a c_readers_len);.
1bac0 09 09 7d 0a 0a 09 09 69 66 20 28 73 63 61 72 64 ..}....if (scard
1bad0 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 _listreaders_ret
1bae0 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 == SCARD_S_SUCC
1baf0 45 53 53 20 26 26 20 70 63 73 63 5f 72 65 61 64 ESS && pcsc_read
1bb00 65 72 73 5f 6c 65 6e 20 21 3d 20 30 29 20 7b 0a ers_len != 0) {.
1bb10 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 20 ...pcsc_readers
1bb20 3d 20 6d 61 6c 6c 6f 63 28 70 63 73 63 5f 72 65 = malloc(pcsc_re
1bb30 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 09 70 aders_len);....p
1bb40 63 73 63 5f 72 65 61 64 65 72 73 5f 73 20 3d 20 csc_readers_s =
1bb50 70 63 73 63 5f 72 65 61 64 65 72 73 3b 0a 0a 09 pcsc_readers;...
1bb60 09 09 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 ..scard_listread
1bb70 65 72 73 5f 72 65 74 20 3d 20 53 43 61 72 64 4c ers_ret = SCardL
1bb80 69 73 74 52 65 61 64 65 72 73 28 2a 63 61 63 6b istReaders(*cack
1bb90 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 ey_pcsc_handle,
1bba0 4e 55 4c 4c 2c 20 70 63 73 63 5f 72 65 61 64 65 NULL, pcsc_reade
1bbb0 72 73 2c 20 26 70 63 73 63 5f 72 65 61 64 65 72 rs, &pcsc_reader
1bbc0 73 5f 6c 65 6e 29 3b 0a 09 09 09 69 66 20 28 73 s_len);....if (s
1bbd0 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 card_listreaders
1bbe0 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f _ret == SCARD_S_
1bbf0 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09 70 SUCCESS) {.....p
1bc00 63 73 63 5f 72 65 61 64 65 72 73 5f 65 20 3d 20 csc_readers_e =
1bc10 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b 20 70 pcsc_readers + p
1bc20 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 3b csc_readers_len;
1bc30 0a 0a 09 09 09 09 2f 2a 20 53 74 61 72 74 20 77 ....../* Start w
1bc40 69 74 68 20 53 6c 6f 74 20 49 44 20 31 2c 20 74 ith Slot ID 1, t
1bc50 6f 20 61 76 6f 69 64 20 61 20 62 75 67 20 69 6e o avoid a bug in
1bc60 20 47 44 4d 20 6f 6e 20 52 48 45 4c 20 2a 2f 0a GDM on RHEL */.
1bc70 09 09 09 09 2f 2a 20 42 75 67 20 35 39 34 39 31 ..../* Bug 59491
1bc80 31 3a 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69 1: https://bugzi
1bc90 6c 6c 61 2e 72 65 64 68 61 74 2e 63 6f 6d 2f 73 lla.redhat.com/s
1bca0 68 6f 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d 35 how_bug.cgi?id=5
1bcb0 39 34 39 31 31 20 2a 2f 0a 09 09 09 09 63 75 72 94911 */.....cur
1bcc0 72 73 6c 6f 74 20 3d 20 31 3b 0a 09 09 09 09 73 rslot = 1;.....s
1bcd0 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 lot_count = 0;..
1bce0 09 09 09 77 68 69 6c 65 20 28 70 63 73 63 5f 72 ...while (pcsc_r
1bcf0 65 61 64 65 72 73 20 3c 20 70 63 73 63 5f 72 65 eaders < pcsc_re
1bd00 61 64 65 72 73 5f 65 29 20 7b 0a 09 09 09 09 09 aders_e) {......
1bd10 2f 2a 20 46 69 6e 64 20 6e 65 78 74 20 61 76 61 /* Find next ava
1bd20 69 6c 61 62 6c 65 20 73 6c 6f 74 20 2a 2f 0a 09 ilable slot */..
1bd30 09 09 09 09 66 6f 72 20 28 3b 20 63 75 72 72 73 ....for (; currs
1bd40 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 lot < (sizeof(ca
1bd50 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 ckey_slots) / si
1bd60 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 zeof(cackey_slot
1bd70 73 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 s[0])); currslot
1bd80 2b 2b 29 20 7b 0a 09 09 09 09 09 09 69 66 20 28 ++) {.......if (
1bd90 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 !cackey_slots[cu
1bda0 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20 rrslot].active)
1bdb0 7b 0a 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a {........break;.
1bdc0 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 0a 0a ......}......}..
1bdd0 09 09 09 09 09 63 75 72 72 5f 72 65 61 64 65 72 .....curr_reader
1bde0 5f 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 70 63 _len = strlen(pc
1bdf0 73 63 5f 72 65 61 64 65 72 73 29 3b 0a 0a 09 09 sc_readers);....
1be00 09 09 09 69 66 20 28 28 70 63 73 63 5f 72 65 61 ...if ((pcsc_rea
1be10 64 65 72 73 20 2b 20 63 75 72 72 5f 72 65 61 64 ders + curr_read
1be20 65 72 5f 6c 65 6e 29 20 3e 20 70 63 73 63 5f 72 er_len) > pcsc_r
1be30 65 61 64 65 72 73 5f 65 29 20 7b 0a 09 09 09 09 eaders_e) {.....
1be40 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a ..break;......}.
1be50 0a 09 09 09 09 09 69 66 20 28 63 75 72 72 5f 72 ......if (curr_r
1be60 65 61 64 65 72 5f 6c 65 6e 20 3d 3d 20 30 29 20 eader_len == 0)
1be70 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 {.......break;..
1be80 09 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 ....}.......if (
1be90 63 75 72 72 73 6c 6f 74 20 3e 3d 20 28 73 69 7a currslot >= (siz
1bea0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 eof(cackey_slots
1beb0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 ) / sizeof(cacke
1bec0 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a y_slots[0]))) {.
1bed0 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 ......CACKEY_DEB
1bee0 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 UG_PRINTF("Found
1bef0 20 6d 6f 72 65 20 72 65 61 64 65 72 73 20 74 68 more readers th
1bf00 61 6e 20 73 6c 6f 74 73 20 61 72 65 20 61 76 61 an slots are ava
1bf10 69 6c 61 62 6c 65 21 22 29 3b 0a 0a 09 09 09 09 ilable!");......
1bf20 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a ..break;......}.
1bf30 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 ......CACKEY_DEB
1bf40 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 UG_PRINTF("Found
1bf50 20 72 65 61 64 65 72 3a 20 25 73 22 2c 20 70 63 reader: %s", pc
1bf60 73 63 5f 72 65 61 64 65 72 73 29 3b 0a 0a 09 09 sc_readers);....
1bf70 09 09 09 2f 2a 20 4f 6e 6c 79 20 75 70 64 61 74 .../* Only updat
1bf80 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20 73 6c e the list of sl
1bf90 6f 74 73 20 69 66 20 77 65 20 61 72 65 20 61 63 ots if we are ac
1bfa0 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 61 73 6b tually being ask
1bfb0 65 64 20 73 75 70 70 6c 79 20 74 68 65 20 73 6c ed supply the sl
1bfc0 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a ot information *
1bfd0 2f 0a 09 09 09 09 09 69 66 20 28 70 53 6c 6f 74 /......if (pSlot
1bfe0 4c 69 73 74 29 20 7b 0a 09 09 09 09 09 09 69 66 List) {.......if
1bff0 20 28 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a (slot_reset) {.
1c000 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c .......cackey_sl
1c010 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 ots[currslot].ac
1c020 74 69 76 65 20 3d 20 31 3b 0a 09 09 09 09 09 09 tive = 1;.......
1c030 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 .cackey_slots[cu
1c040 72 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c rrslot].internal
1c050 20 3d 20 30 3b 0a 09 09 09 09 09 09 09 63 61 63 = 0;........cac
1c060 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c key_slots[currsl
1c070 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20 ot].pcsc_reader
1c080 3d 20 73 74 72 64 75 70 28 70 63 73 63 5f 72 65 = strdup(pcsc_re
1c090 61 64 65 72 73 29 3b 0a 09 09 09 09 09 09 09 63 aders);........c
1c0a0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 ackey_slots[curr
1c0b0 73 6c 6f 74 5d 2e 70 63 73 63 5f 63 61 72 64 5f slot].pcsc_card_
1c0c0 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09 connected = 0;..
1c0d0 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f ......cackey_slo
1c0e0 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 72 61 ts[currslot].tra
1c0f0 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d nsaction_depth =
1c100 20 30 3b 0a 09 09 09 09 09 09 09 63 61 63 6b 65 0;........cacke
1c110 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 y_slots[currslot
1c120 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 ].transaction_ne
1c130 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a ed_hw_lock = 0;.
1c140 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c .......cackey_sl
1c150 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 6f ots[currslot].to
1c160 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f ken_flags = CKF_
1c170 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a LOGIN_REQUIRED;.
1c180 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c .......cackey_sl
1c190 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 ots[currslot].la
1c1a0 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 bel = NULL;.....
1c1b0 09 09 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f ....cackey_mark_
1c1c0 73 6c 6f 74 5f 72 65 73 65 74 28 26 63 61 63 6b slot_reset(&cack
1c1d0 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f ey_slots[currslo
1c1e0 74 5d 29 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 t]);.......}....
1c1f0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 ..} else {......
1c200 09 2f 2a 20 41 72 74 69 66 69 63 69 61 6c 6c 79 ./* Artificially
1c210 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 6e 75 increase the nu
1c220 6d 62 65 72 20 6f 66 20 61 63 74 69 76 65 20 73 mber of active s
1c230 6c 6f 74 73 20 62 79 20 77 68 61 74 20 77 69 6c lots by what wil
1c240 6c 20 62 65 63 6f 6d 65 20 61 63 74 69 76 65 20 l become active
1c250 2a 2f 0a 09 09 09 09 09 09 73 6c 6f 74 5f 63 6f */.......slot_co
1c260 75 6e 74 2b 2b 3b 0a 09 09 09 09 09 7d 0a 09 09 unt++;......}...
1c270 09 09 09 63 75 72 72 73 6c 6f 74 2b 2b 3b 0a 0a ...currslot++;..
1c280 09 09 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 .....pcsc_reader
1c290 73 20 2b 3d 20 63 75 72 72 5f 72 65 61 64 65 72 s += curr_reader
1c2a0 5f 6c 65 6e 20 2b 20 31 3b 0a 09 09 09 09 7d 0a _len + 1;.....}.
1c2b0 0a 09 09 09 09 66 6f 72 20 28 63 75 72 72 73 6c .....for (currsl
1c2c0 6f 74 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74 ot = 0; currslot
1c2d0 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 < (sizeof(cacke
1c2e0 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f y_slots) / sizeo
1c2f0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 f(cackey_slots[0
1c300 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29 ])); currslot++)
1c310 20 7b 0a 09 09 09 09 09 69 66 20 28 63 61 63 6b {......if (cack
1c320 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f ey_slots[currslo
1c330 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 t].active) {....
1c340 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1c350 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 61 63 PRINTF("Found ac
1c360 74 69 76 65 20 73 6c 6f 74 20 25 6c 75 22 2c 20 tive slot %lu",
1c370 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
1c380 63 75 72 72 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 currslot);......
1c390 09 09 73 6c 6f 74 5f 63 6f 75 6e 74 2b 2b 3b 0a ..slot_count++;.
1c3a0 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 .....}.....}....
1c3b0 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 } else {.....CAC
1c3c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1c3d0 28 22 53 65 63 6f 6e 64 20 63 61 6c 6c 20 74 6f ("Second call to
1c3e0 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 SCardListReader
1c3f0 73 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e s failed, return
1c400 20 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59 %s/%li", CACKEY
1c410 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 _DEBUG_FUNC_SCAR
1c420 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 DERR_TO_STR(scar
1c430 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 d_listreaders_re
1c440 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 t), (long) scard
1c450 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 _listreaders_ret
1c460 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 66 72 65 65 );....}.....free
1c470 28 70 63 73 63 5f 72 65 61 64 65 72 73 5f 73 29 (pcsc_readers_s)
1c480 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 ;...} else {....
1c490 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1c4a0 4e 54 46 28 22 46 69 72 73 74 20 63 61 6c 6c 20 NTF("First call
1c4b0 74 6f 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 to SCardListRead
1c4c0 65 72 73 20 66 61 69 6c 65 64 2c 20 72 65 74 75 ers failed, retu
1c4d0 72 6e 20 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b rn %s/%li", CACK
1c4e0 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 EY_DEBUG_FUNC_SC
1c4f0 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 ARDERR_TO_STR(sc
1c500 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f ard_listreaders_
1c510 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 ret), (long) sca
1c520 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 rd_listreaders_r
1c530 65 74 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 et);...}..}...mu
1c540 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 tex_retval = cac
1c550 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b key_mutex_unlock
1c560 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 (cackey_biglock)
1c570 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 ;..if (mutex_ret
1c580 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 val != 0) {...CA
1c590 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
1c5a0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 F("Error. Unloc
1c5b0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a king failed.");.
1c5c0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 ...return(CKR_GE
1c5d0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d NERAL_ERROR);..}
1c5e0 0a 0a 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 ...if (pSlotList
1c5f0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 == NULL) {...*p
1c600 75 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 ulCount = slot_c
1c610 6f 75 6e 74 3b 0a 0a 09 09 43 41 43 4b 45 59 5f ount;....CACKEY_
1c620 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
1c630 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 turning CKR_OK (
1c640 25 69 29 2e 20 20 46 6f 75 6e 64 20 25 6c 75 20 %i). Found %lu
1c650 72 65 61 64 65 72 73 2c 20 62 75 74 20 6e 6f 74 readers, but not
1c660 20 73 74 6f 72 69 6e 67 20 49 44 73 20 28 70 53 storing IDs (pS
1c670 6c 6f 74 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 lotList == NULL)
1c680 22 2c 20 43 4b 52 5f 4f 4b 2c 20 28 75 6e 73 69 ", CKR_OK, (unsi
1c690 67 6e 65 64 20 6c 6f 6e 67 29 20 73 6c 6f 74 5f gned long) slot_
1c6a0 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72 count);....retur
1c6b0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 n(CKR_OK);..}...
1c6c0 63 6f 75 6e 74 20 3d 20 2a 70 75 6c 43 6f 75 6e count = *pulCoun
1c6d0 74 3b 0a 09 69 66 20 28 63 6f 75 6e 74 20 3c 20 t;..if (count <
1c6e0 73 6c 6f 74 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 slot_count) {...
1c6f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1c700 4e 54 46 28 22 45 72 72 6f 72 2e 20 55 73 65 72 NTF("Error. User
1c710 20 61 6c 6c 6f 63 61 74 65 64 20 25 6c 75 20 65 allocated %lu e
1c720 6e 74 72 69 65 73 2c 20 62 75 74 20 77 65 20 68 ntries, but we h
1c730 61 76 65 20 25 6c 75 20 65 6e 74 72 69 65 73 2e ave %lu entries.
1c740 22 2c 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63 ", count, slot_c
1c750 6f 75 6e 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 ount);....CACKEY
1c760 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
1c770 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 42 55 46 eturning CKR_BUF
1c780 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 22 29 3b FER_TOO_SMALL");
1c790 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 42 ....return(CKR_B
1c7a0 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 UFFER_TOO_SMALL)
1c7b0 3b 09 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 ;...}...mutex_re
1c7c0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 tval = cackey_mu
1c7d0 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f tex_lock(cackey_
1c7e0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d biglock);..if (m
1c7f0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 utex_retval != 0
1c800 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
1c810 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
1c820 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 . Locking faile
1c830 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
1c840 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f CKR_GENERAL_ERRO
1c850 52 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 5f 69 64 R);..}...slot_id
1c860 78 20 3d 20 30 3b 0a 09 66 6f 72 20 28 63 75 72 x = 0;..for (cur
1c870 72 73 6c 6f 74 20 3d 20 30 3b 20 28 63 75 72 72 rslot = 0; (curr
1c880 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 slot < (sizeof(c
1c890 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 ackey_slots) / s
1c8a0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f izeof(cackey_slo
1c8b0 74 73 5b 30 5d 29 29 29 3b 20 63 75 72 72 73 6c ts[0]))); currsl
1c8c0 6f 74 2b 2b 29 20 7b 0a 09 09 69 66 20 28 21 63 ot++) {...if (!c
1c8d0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 ackey_slots[curr
1c8e0 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a slot].active) {.
1c8f0 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d ...continue;...}
1c900 0a 0a 09 09 69 66 20 28 73 6c 6f 74 5f 69 64 78 ....if (slot_idx
1c910 20 3e 3d 20 63 6f 75 6e 74 29 20 7b 0a 09 09 09 >= count) {....
1c920 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1c930 4e 54 46 28 22 45 72 72 6f 72 2e 20 55 73 65 72 NTF("Error. User
1c940 20 61 6c 6c 6f 63 61 74 65 64 20 25 6c 75 20 65 allocated %lu e
1c950 6e 74 72 69 65 73 2c 20 62 75 74 20 77 65 20 6a ntries, but we j
1c960 75 73 74 20 74 72 69 65 64 20 74 6f 20 77 72 69 ust tried to wri
1c970 74 65 20 74 6f 20 74 68 65 20 25 6c 75 20 69 6e te to the %lu in
1c980 64 65 78 20 2d 2d 20 69 67 6e 6f 72 69 6e 67 22 dex -- ignoring"
1c990 2c 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 69 64 , count, slot_id
1c9a0 78 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65 x);.....continue
1c9b0 3b 0a 09 09 7d 0a 0a 09 09 70 53 6c 6f 74 4c 69 ;...}....pSlotLi
1c9c0 73 74 5b 73 6c 6f 74 5f 69 64 78 5d 20 3d 20 63 st[slot_idx] = c
1c9d0 75 72 72 73 6c 6f 74 3b 0a 09 09 73 6c 6f 74 5f urrslot;...slot_
1c9e0 69 64 78 2b 2b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 idx++;..}...mute
1c9f0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 x_retval = cacke
1ca00 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
1ca10 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
1ca20 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 .if (mutex_retva
1ca30 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b l != 0) {...CACK
1ca40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1ca50 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 "Error. Unlocki
1ca60 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 ng failed.");...
1ca70 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 .return(CKR_GENE
1ca80 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a RAL_ERROR);..}..
1ca90 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f .*pulCount = slo
1caa0 74 5f 63 6f 75 6e 74 3b 0a 0a 09 43 41 43 4b 45 t_count;...CACKE
1cab0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1cac0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b Returning CKR_OK
1cad0 20 28 25 69 29 2e 20 20 46 6f 75 6e 64 20 25 6c (%i). Found %l
1cae0 75 20 72 65 61 64 65 72 73 2e 22 2c 20 43 4b 52 u readers.", CKR
1caf0 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c _OK, (unsigned l
1cb00 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 ong) slot_count)
1cb10 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f ;...return(CKR_O
1cb20 4b 29 3b 0a 0a 09 74 6f 6b 65 6e 50 72 65 73 65 K);...tokenPrese
1cb30 6e 74 20 3d 20 74 6f 6b 65 6e 50 72 65 73 65 6e nt = tokenPresen
1cb40 74 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75 6e t; /* Supress un
1cb50 75 73 65 64 20 76 61 72 69 61 62 6c 65 20 77 61 used variable wa
1cb60 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44 rning */.}..CK_D
1cb70 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 EFINE_FUNCTION(C
1cb80 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74 49 K_RV, C_GetSlotI
1cb90 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 nfo)(CK_SLOT_ID
1cba0 73 6c 6f 74 49 44 2c 20 43 4b 5f 53 4c 4f 54 5f slotID, CK_SLOT_
1cbb0 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 INFO_PTR pInfo)
1cbc0 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 {..static CK_UTF
1cbd0 38 43 48 41 52 20 73 6c 6f 74 44 65 73 63 72 69 8CHAR slotDescri
1cbe0 70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b 65 ption[] = "CACKe
1cbf0 79 20 53 6c 6f 74 22 3b 0a 09 69 6e 74 20 6d 75 y Slot";..int mu
1cc00 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 tex_retval;..int
1cc10 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a bytes_to_copy;.
1cc20 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1cc30 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
1cc40 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d ;...if (pInfo ==
1cc50 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 NULL) {...CACKE
1cc60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1cc70 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 Error. pInfo is
1cc80 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 NULL.");....retu
1cc90 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 rn(CKR_ARGUMENTS
1cca0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 _BAD);..}...if (
1ccb0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 !cackey_initiali
1ccc0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f zed) {...CACKEY_
1ccd0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
1cce0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 ror. Not initia
1ccf0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 lized.");....ret
1cd00 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 urn(CKR_CRYPTOKI
1cd10 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 _NOT_INITIALIZED
1cd20 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 );..}...if (slot
1cd30 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 ID < 0 || slotID
1cd40 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b >= (sizeof(cack
1cd50 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 ey_slots) / size
1cd60 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b of(cackey_slots[
1cd70 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 0]))) {...CACKEY
1cd80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
1cd90 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c rror. Invalid sl
1cda0 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c ot requested (%l
1cdb0 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 u), outside of v
1cdc0 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f alid range", slo
1cdd0 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 tID);....return(
1cde0 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 CKR_SLOT_ID_INVA
1cdf0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 LID);..}...mutex
1ce00 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 _retval = cackey
1ce10 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b _mutex_lock(cack
1ce20 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 ey_biglock);..if
1ce30 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 (mutex_retval !
1ce40 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f = 0) {...CACKEY_
1ce50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
1ce60 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 ror. Locking fa
1ce70 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 iled.");....retu
1ce80 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 rn(CKR_GENERAL_E
1ce90 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 RROR);..}...if (
1cea0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f cackey_slots[slo
1ceb0 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 tID].active == 0
1cec0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
1ced0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
1cee0 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 . Invalid slot r
1cef0 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 equested (%lu),
1cf00 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 slot not current
1cf10 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 ly active", slot
1cf20 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d ID);....cackey_m
1cf30 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b utex_unlock(cack
1cf40 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 ey_biglock);....
1cf50 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f return(CKR_SLOT_
1cf60 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a ID_INVALID);..}.
1cf70 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d ..pInfo->flags =
1cf80 20 43 4b 46 5f 48 57 5f 53 4c 4f 54 3b 0a 0a 09 CKF_HW_SLOT;...
1cf90 69 66 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74 if (!cackey_slot
1cfa0 73 5b 73 6c 6f 74 49 44 5d 2e 69 6e 74 65 72 6e s[slotID].intern
1cfb0 61 6c 29 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 al) {...pInfo->f
1cfc0 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 52 45 4d 4f lags |= CKF_REMO
1cfd0 56 41 42 4c 45 5f 44 45 56 49 43 45 3b 0a 09 7d VABLE_DEVICE;..}
1cfe0 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 74 6f ...if (cackey_to
1cff0 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 63 ken_present(&cac
1d000 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 key_slots[slotID
1d010 5d 29 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 ]) == CACKEY_PCS
1d020 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 C_S_TOKENPRESENT
1d030 29 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 ) {...pInfo->fla
1d040 67 73 20 7c 3d 20 43 4b 46 5f 54 4f 4b 45 4e 5f gs |= CKF_TOKEN_
1d050 50 52 45 53 45 4e 54 3b 0a 09 7d 0a 0a 09 62 79 PRESENT;..}...by
1d060 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 73 74 tes_to_copy = st
1d070 72 6c 65 6e 28 63 61 63 6b 65 79 5f 73 6c 6f 74 rlen(cackey_slot
1d080 73 5b 73 6c 6f 74 49 44 5d 2e 70 63 73 63 5f 72 s[slotID].pcsc_r
1d090 65 61 64 65 72 29 3b 0a 09 69 66 20 28 73 69 7a eader);..if (siz
1d0a0 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 eof(pInfo->manuf
1d0b0 61 63 74 75 72 65 72 49 44 29 20 3c 20 62 79 74 acturerID) < byt
1d0c0 65 73 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a 09 09 es_to_copy) {...
1d0d0 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 bytes_to_copy =
1d0e0 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 sizeof(pInfo->ma
1d0f0 6e 75 66 61 63 74 75 72 65 72 49 44 29 3b 0a 09 nufacturerID);..
1d100 7d 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d }..memcpy(pInfo-
1d110 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c >manufacturerID,
1d120 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c cackey_slots[sl
1d130 6f 74 49 44 5d 2e 70 63 73 63 5f 72 65 61 64 65 otID].pcsc_reade
1d140 72 2c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 r, bytes_to_copy
1d150 29 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 );...mutex_retva
1d160 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 l = cackey_mutex
1d170 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 _unlock(cackey_b
1d180 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 iglock);..if (mu
1d190 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 tex_retval != 0)
1d1a0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
1d1b0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
1d1c0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c Unlocking fail
1d1d0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
1d1e0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 (CKR_GENERAL_ERR
1d1f0 4f 52 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 OR);..}...memset
1d200 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 (pInfo->slotDesc
1d210 72 69 70 74 69 6f 6e 2c 20 27 20 27 2c 20 73 69 ription, ' ', si
1d220 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 zeof(pInfo->slot
1d230 44 65 73 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09 Description));..
1d240 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 73 6c memcpy(pInfo->sl
1d250 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 otDescription, s
1d260 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 lotDescription,
1d270 73 69 7a 65 6f 66 28 73 6c 6f 74 44 65 73 63 72 sizeof(slotDescr
1d280 69 70 74 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09 iption) - 1);...
1d290 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 memset(pInfo->ma
1d2a0 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 27 20 nufacturerID, '
1d2b0 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d ', sizeof(pInfo-
1d2c0 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 >manufacturerID)
1d2d0 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 );...pInfo->hard
1d2e0 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f wareVersion.majo
1d2f0 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 r = (cackey_getv
1d300 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 ersion() >> 16)
1d310 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e & 0xff;..pInfo->
1d320 68 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e hardwareVersion.
1d330 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f minor = (cackey_
1d340 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 getversion() >>
1d350 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e 8) & 0xff;...pIn
1d360 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73 fo->firmwareVers
1d370 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30 ion.major = 0x00
1d380 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 ;..pInfo->firmwa
1d390 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 reVersion.minor
1d3a0 3d 20 30 78 30 30 3b 0a 0a 09 43 41 43 4b 45 59 = 0x00;...CACKEY
1d3b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
1d3c0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 eturning CKR_OK
1d3d0 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a (%i)", CKR_OK);.
1d3e0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 ..return(CKR_OK)
1d3f0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 ;.}..CK_DEFINE_F
1d400 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 UNCTION(CK_RV, C
1d410 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 29 28 43 _GetTokenInfo)(C
1d420 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 K_SLOT_ID slotID
1d430 2c 20 43 4b 5f 54 4f 4b 45 4e 5f 49 4e 46 4f 5f , CK_TOKEN_INFO_
1d440 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74 PTR pInfo) {..st
1d450 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 atic CK_UTF8CHAR
1d460 20 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 5b manufacturerID[
1d470 5d 20 3d 20 22 55 2e 53 2e 20 47 6f 76 65 72 6e ] = "U.S. Govern
1d480 6d 65 6e 74 22 3b 0a 09 73 74 61 74 69 63 20 43 ment";..static C
1d490 4b 5f 55 54 46 38 43 48 41 52 20 64 65 66 61 75 K_UTF8CHAR defau
1d4a0 6c 74 4c 61 62 65 6c 5b 5d 20 3d 20 22 55 6e 6b ltLabel[] = "Unk
1d4b0 6e 6f 77 6e 20 54 6f 6b 65 6e 22 3b 0a 09 73 74 nown Token";..st
1d4c0 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 atic CK_UTF8CHAR
1d4d0 20 6d 6f 64 65 6c 5b 5d 20 3d 20 22 43 41 43 20 model[] = "CAC
1d4e0 54 6f 6b 65 6e 22 3b 0a 09 73 74 72 75 63 74 20 Token";..struct
1d4f0 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e cackey_pcsc_iden
1d500 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e 74 tity *pcsc_ident
1d510 69 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 ities;..unsigned
1d520 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73 3b long num_certs;
1d530 0a 09 73 73 69 7a 65 5f 74 20 6c 61 62 65 6c 5f ..ssize_t label_
1d540 72 65 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f ret;..int mutex_
1d550 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 75 73 65 retval;..int use
1d560 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 3b 0a _default_label;.
1d570 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1d580 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
1d590 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d ;...if (pInfo ==
1d5a0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 NULL) {...CACKE
1d5b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1d5c0 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 Error. pInfo is
1d5d0 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 NULL.");....retu
1d5e0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 rn(CKR_ARGUMENTS
1d5f0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 _BAD);..}...if (
1d600 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 !cackey_initiali
1d610 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f zed) {...CACKEY_
1d620 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
1d630 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 ror. Not initia
1d640 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 lized.");....ret
1d650 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 urn(CKR_CRYPTOKI
1d660 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 _NOT_INITIALIZED
1d670 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 );..}...if (slot
1d680 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 ID < 0 || slotID
1d690 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b >= (sizeof(cack
1d6a0 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 ey_slots) / size
1d6b0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b of(cackey_slots[
1d6c0 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 0]))) {...CACKEY
1d6d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
1d6e0 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c rror. Invalid sl
1d6f0 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c ot requested (%l
1d700 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 u), outside of v
1d710 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f alid range", slo
1d720 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 tID);....return(
1d730 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 CKR_SLOT_ID_INVA
1d740 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 LID);..}...mutex
1d750 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 _retval = cackey
1d760 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b _mutex_lock(cack
1d770 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 ey_biglock);..if
1d780 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 (mutex_retval !
1d790 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f = 0) {...CACKEY_
1d7a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
1d7b0 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 ror. Locking fa
1d7c0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 iled.");....retu
1d7d0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 rn(CKR_GENERAL_E
1d7e0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 RROR);..}...if (
1d7f0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f cackey_slots[slo
1d800 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 tID].active == 0
1d810 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
1d820 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
1d830 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 . Invalid slot r
1d840 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 equested (%lu),
1d850 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 slot not current
1d860 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 ly active", slot
1d870 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d ID);....cackey_m
1d880 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b utex_unlock(cack
1d890 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 ey_biglock);....
1d8a0 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f return(CKR_SLOT_
1d8b0 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a ID_INVALID);..}.
1d8c0 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b ..if (cackey_tok
1d8d0 65 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b en_present(&cack
1d8e0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d ey_slots[slotID]
1d8f0 29 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 ) != CACKEY_PCSC
1d900 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 _S_TOKENPRESENT)
1d910 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
1d920 47 5f 50 52 49 4e 54 46 28 22 4e 6f 20 74 6f 6b G_PRINTF("No tok
1d930 65 6e 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e en is present in
1d940 20 73 6c 6f 74 49 44 20 3d 20 25 6c 75 22 2c 20 slotID = %lu",
1d950 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b slotID);....cack
1d960 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 ey_mutex_unlock(
1d970 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
1d980 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 ....return(CKR_T
1d990 4f 4b 45 4e 5f 4e 4f 54 5f 50 52 45 53 45 4e 54 OKEN_NOT_PRESENT
1d9a0 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 );..}...mutex_re
1d9b0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 tval = cackey_mu
1d9c0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 tex_unlock(cacke
1d9d0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 y_biglock);..if
1d9e0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d (mutex_retval !=
1d9f0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 0) {...CACKEY_D
1da00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
1da10 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 or. Unlocking f
1da20 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 ailed.");....ret
1da30 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f urn(CKR_GENERAL_
1da40 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 ERROR);..}.../*
1da50 44 65 74 65 72 6d 69 6e 65 20 74 6f 6b 65 6e 20 Determine token
1da60 6c 61 62 65 6c 20 66 72 6f 6d 20 63 65 72 74 69 label from certi
1da70 66 69 63 61 74 65 73 20 2a 2f 0a 09 6d 65 6d 73 ficates */..mems
1da80 65 74 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c et(pInfo->label,
1da90 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e ' ', sizeof(pIn
1daa0 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 75 73 fo->label));..us
1dab0 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20 e_default_label
1dac0 3d 20 31 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 = 1;...if (cacke
1dad0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e y_slots[slotID].
1dae0 6c 61 62 65 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b label == NULL) {
1daf0 0a 09 09 70 63 73 63 5f 69 64 65 6e 74 69 74 69 ...pcsc_identiti
1db00 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 es = cackey_read
1db10 5f 63 65 72 74 73 28 26 63 61 63 6b 65 79 5f 73 _certs(&cackey_s
1db20 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 4e 55 lots[slotID], NU
1db30 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73 29 3b LL, &num_certs);
1db40 0a 09 09 69 66 20 28 70 63 73 63 5f 69 64 65 6e ...if (pcsc_iden
1db50 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 tities != NULL)
1db60 7b 0a 09 09 09 69 66 20 28 6e 75 6d 5f 63 65 72 {....if (num_cer
1db70 74 73 20 3e 20 30 29 20 7b 0a 09 09 09 09 6c 61 ts > 0) {.....la
1db80 62 65 6c 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 bel_ret = cackey
1db90 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 5f 74 _pcsc_identity_t
1dba0 6f 5f 6c 61 62 65 6c 28 70 63 73 63 5f 69 64 65 o_label(pcsc_ide
1dbb0 6e 74 69 74 69 65 73 2c 20 70 49 6e 66 6f 2d 3e ntities, pInfo->
1dbc0 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49 label, sizeof(pI
1dbd0 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 09 nfo->label));...
1dbe0 09 09 69 66 20 28 6c 61 62 65 6c 5f 72 65 74 20 ..if (label_ret
1dbf0 3e 20 30 29 20 7b 0a 09 09 09 09 09 75 73 65 5f > 0) {......use_
1dc00 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 default_label =
1dc10 30 3b 0a 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 0;.......cackey_
1dc20 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 slots[slotID].la
1dc30 62 65 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a bel = malloc(siz
1dc40 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c eof(pInfo->label
1dc50 29 29 3b 0a 0a 09 09 09 09 09 6d 65 6d 63 70 79 ));.......memcpy
1dc60 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c (cackey_slots[sl
1dc70 6f 74 49 44 5d 2e 6c 61 62 65 6c 2c 20 70 49 6e otID].label, pIn
1dc80 66 6f 2d 3e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f fo->label, sizeo
1dc90 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 f(pInfo->label))
1dca0 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 ;.....}....}....
1dcb0 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 .cackey_free_cer
1dcc0 74 73 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 ts(pcsc_identiti
1dcd0 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20 31 es, num_certs, 1
1dce0 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b );...}..} else {
1dcf0 0a 09 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d ...memcpy(pInfo-
1dd00 3e 6c 61 62 65 6c 2c 20 63 61 63 6b 65 79 5f 73 >label, cackey_s
1dd10 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 lots[slotID].lab
1dd20 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f el, sizeof(pInfo
1dd30 2d 3e 6c 61 62 65 6c 29 29 3b 0a 0a 09 09 75 73 ->label));....us
1dd40 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20 e_default_label
1dd50 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73 = 0;..}...if (us
1dd60 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 29 e_default_label)
1dd70 20 7b 0a 09 09 6d 65 6d 63 70 79 28 70 49 6e 66 {...memcpy(pInf
1dd80 6f 2d 3e 6c 61 62 65 6c 2c 20 64 65 66 61 75 6c o->label, defaul
1dd90 74 4c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 64 tLabel, sizeof(d
1dda0 65 66 61 75 6c 74 4c 61 62 65 6c 29 20 2d 20 31 efaultLabel) - 1
1ddb0 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 );..}...memset(p
1ddc0 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 Info->manufactur
1ddd0 65 72 49 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f erID, ' ', sizeo
1dde0 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 f(pInfo->manufac
1ddf0 74 75 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63 turerID));..memc
1de00 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 py(pInfo->manufa
1de10 63 74 75 72 65 72 49 44 2c 20 6d 61 6e 75 66 61 cturerID, manufa
1de20 63 74 75 72 65 72 49 44 2c 20 73 69 7a 65 6f 66 cturerID, sizeof
1de30 28 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 (manufacturerID)
1de40 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 - 1);...memset(
1de50 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 27 20 pInfo->model, '
1de60 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d ', sizeof(pInfo-
1de70 3e 6d 6f 64 65 6c 29 29 3b 0a 09 6d 65 6d 63 70 >model));..memcp
1de80 79 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 y(pInfo->model,
1de90 6d 6f 64 65 6c 2c 20 73 69 7a 65 6f 66 28 6d 6f model, sizeof(mo
1dea0 64 65 6c 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d del) - 1);...mem
1deb0 73 65 74 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61 set(pInfo->seria
1dec0 6c 4e 75 6d 62 65 72 2c 20 27 20 27 2c 20 73 69 lNumber, ' ', si
1ded0 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 73 65 72 69 zeof(pInfo->seri
1dee0 61 6c 4e 75 6d 62 65 72 29 29 3b 0a 0a 09 6d 65 alNumber));...me
1def0 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 75 74 63 54 mset(pInfo->utcT
1df00 69 6d 65 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 ime, ' ', sizeof
1df10 28 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d 65 29 (pInfo->utcTime)
1df20 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 );...pInfo->hard
1df30 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f wareVersion.majo
1df40 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 r = (cackey_getv
1df50 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 ersion() >> 16)
1df60 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e & 0xff;..pInfo->
1df70 68 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e hardwareVersion.
1df80 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f minor = (cackey_
1df90 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 getversion() >>
1dfa0 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e 8) & 0xff;...pIn
1dfb0 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73 fo->firmwareVers
1dfc0 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30 ion.major = 0x00
1dfd0 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 ;..pInfo->firmwa
1dfe0 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 reVersion.minor
1dff0 3d 20 30 78 30 30 3b 0a 0a 09 70 49 6e 66 6f 2d = 0x00;...pInfo-
1e000 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 57 52 49 >flags = CKF_WRI
1e010 54 45 5f 50 52 4f 54 45 43 54 45 44 20 7c 20 43 TE_PROTECTED | C
1e020 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 49 4e 49 54 KF_USER_PIN_INIT
1e030 49 41 4c 49 5a 45 44 20 7c 20 43 4b 46 5f 54 4f IALIZED | CKF_TO
1e040 4b 45 4e 5f 49 4e 49 54 49 41 4c 49 5a 45 44 20 KEN_INITIALIZED
1e050 7c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 | cackey_slots[s
1e060 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 lotID].token_fla
1e070 67 73 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d gs;...pInfo->ulM
1e080 61 78 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d axSessionCount =
1e090 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f (sizeof(cackey_
1e0a0 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 sessions) / size
1e0b0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f of(cackey_sessio
1e0c0 6e 73 5b 30 5d 29 29 20 2d 20 31 3b 0a 09 70 49 ns[0])) - 1;..pI
1e0d0 6e 66 6f 2d 3e 75 6c 53 65 73 73 69 6f 6e 43 6f nfo->ulSessionCo
1e0e0 75 6e 74 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c unt = CK_UNAVAIL
1e0f0 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e ABLE_INFORMATION
1e100 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 52 ;..pInfo->ulMaxR
1e110 77 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 wSessionCount =
1e120 30 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 52 77 53 0;..pInfo->ulRwS
1e130 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b essionCount = CK
1e140 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 _UNAVAILABLE_INF
1e150 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f ORMATION;..pInfo
1e160 2d 3e 75 6c 4d 61 78 50 69 6e 4c 65 6e 20 3d 20 ->ulMaxPinLen =
1e170 31 32 38 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 128;..pInfo->ulM
1e180 69 6e 50 69 6e 4c 65 6e 20 3d 20 30 3b 0a 09 70 inPinLen = 0;..p
1e190 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61 6c 50 75 62 Info->ulTotalPub
1e1a0 6c 69 63 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 licMemory = CK_U
1e1b0 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 NAVAILABLE_INFOR
1e1c0 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e MATION;..pInfo->
1e1d0 75 6c 46 72 65 65 50 75 62 6c 69 63 4d 65 6d 6f ulFreePublicMemo
1e1e0 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 ry = CK_UNAVAILA
1e1f0 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b BLE_INFORMATION;
1e200 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61 6c ..pInfo->ulTotal
1e210 50 72 69 76 61 74 65 4d 65 6d 6f 72 79 20 3d 20 PrivateMemory =
1e220 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 CK_UNAVAILABLE_I
1e230 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e NFORMATION;..pIn
1e240 66 6f 2d 3e 75 6c 46 72 65 65 50 72 69 76 61 74 fo->ulFreePrivat
1e250 65 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 eMemory = CK_UNA
1e260 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 VAILABLE_INFORMA
1e270 54 49 4f 4e 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 TION;...CACKEY_D
1e280 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
1e290 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 urning CKR_OK (%
1e2a0 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 i)", CKR_OK);...
1e2b0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a return(CKR_OK);.
1e2c0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e }..CK_DEFINE_FUN
1e2d0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 57 CTION(CK_RV, C_W
1e2e0 61 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74 29 aitForSlotEvent)
1e2f0 28 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73 2c (CK_FLAGS flags,
1e300 20 43 4b 5f 53 4c 4f 54 5f 49 44 5f 50 54 52 20 CK_SLOT_ID_PTR
1e310 70 53 6c 6f 74 49 44 2c 20 43 4b 5f 56 4f 49 44 pSlotID, CK_VOID
1e320 5f 50 54 52 20 70 52 65 73 65 72 76 65 64 29 20 _PTR pReserved)
1e330 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f {..CACKEY_DEBUG_
1e340 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
1e350 29 3b 0a 0a 09 69 66 20 28 70 52 65 73 65 72 76 );...if (pReserv
1e360 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 ed != NULL) {...
1e370 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1e380 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 52 65 73 NTF("Error. pRes
1e390 65 72 76 65 64 20 69 73 20 6e 6f 74 20 4e 55 4c erved is not NUL
1e3a0 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 L.");....return(
1e3b0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 CKR_ARGUMENTS_BA
1e3c0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 D);..}...if (!ca
1e3d0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 ckey_initialized
1e3e0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
1e3f0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
1e400 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a . Not initializ
1e410 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
1e420 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f (CKR_CRYPTOKI_NO
1e430 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a T_INITIALIZED);.
1e440 09 7d 0a 0a 09 2f 2a 20 58 58 58 3a 20 54 4f 44 .}.../* XXX: TOD
1e450 4f 3a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 69 O: Implement thi
1e460 73 2e 2e 2e 20 2a 2f 0a 09 43 41 43 4b 45 59 5f s... */..CACKEY_
1e470 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
1e480 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 turning CKR_FUNC
1e490 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
1e4a0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 ED (%i)", CKR_FU
1e4b0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
1e4c0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 RTED);...return(
1e4d0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
1e4e0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a _SUPPORTED);.}..
1e4f0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 CK_DEFINE_FUNCTI
1e500 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4d ON(CK_RV, C_GetM
1e510 65 63 68 61 6e 69 73 6d 4c 69 73 74 29 28 43 4b echanismList)(CK
1e520 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c _SLOT_ID slotID,
1e530 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59 CK_MECHANISM_TY
1e540 50 45 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 PE_PTR pMechanis
1e550 6d 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f mList, CK_ULONG_
1e560 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a PTR pulCount) {.
1e570 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1e580 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
1e590 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 ...if (!cackey_i
1e5a0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 nitialized) {...
1e5b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1e5c0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 NTF("Error. Not
1e5d0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b initialized.");
1e5e0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 ....return(CKR_C
1e5f0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 RYPTOKI_NOT_INIT
1e600 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 IALIZED);..}...i
1e610 66 20 28 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e f (pulCount == N
1e620 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f ULL) {...CACKEY_
1e630 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
1e640 72 6f 72 2e 20 20 70 75 6c 43 6f 75 6e 74 20 69 ror. pulCount i
1e650 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 s NULL.");....re
1e660 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e turn(CKR_ARGUMEN
1e670 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 TS_BAD);..}...if
1e680 20 28 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 (pMechanismList
1e690 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 == NULL) {...*p
1e6a0 75 6c 43 6f 75 6e 74 20 3d 20 31 3b 0a 0a 09 09 ulCount = 1;....
1e6b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1e6c0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 NTF("Returning C
1e6d0 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 KR_OK (%i)", CKR
1e6e0 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 _OK);....return(
1e6f0 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 CKR_OK);..}...if
1e700 20 28 2a 70 75 6c 43 6f 75 6e 74 20 3c 20 31 29 (*pulCount < 1)
1e710 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
1e720 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
1e730 20 20 42 75 66 66 65 72 20 74 6f 6f 20 73 6d 61 Buffer too sma
1e740 6c 6c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ll.");....return
1e750 28 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f (CKR_BUFFER_TOO_
1e760 53 4d 41 4c 4c 29 3b 0a 09 7d 0a 0a 09 70 4d 65 SMALL);..}...pMe
1e770 63 68 61 6e 69 73 6d 4c 69 73 74 5b 30 5d 20 3d chanismList[0] =
1e780 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3b 0a 09 CKM_RSA_PKCS;..
1e790 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 31 3b 0a 0a *pulCount = 1;..
1e7a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1e7b0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
1e7c0 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b CKR_OK (%i)", CK
1e7d0 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 R_OK);...return(
1e7e0 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 CKR_OK);.}..CK_D
1e7f0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 EFINE_FUNCTION(C
1e800 4b 5f 52 56 2c 20 43 5f 47 65 74 4d 65 63 68 61 K_RV, C_GetMecha
1e810 6e 69 73 6d 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f nismInfo)(CK_SLO
1e820 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f T_ID slotID, CK_
1e830 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 20 74 MECHANISM_TYPE t
1e840 79 70 65 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 ype, CK_MECHANIS
1e850 4d 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f M_INFO_PTR pInfo
1e860 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 ) {..int mutex_r
1e870 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f etval;...CACKEY_
1e880 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
1e890 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 lled.");...if (p
1e8a0 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a Info == NULL) {.
1e8b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1e8c0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49 RINTF("Error. pI
1e8d0 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a nfo is NULL.");.
1e8e0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 ...return(CKR_AR
1e8f0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d GUMENTS_BAD);..}
1e900 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 ...if (!cackey_i
1e910 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 nitialized) {...
1e920 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1e930 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 NTF("Error. Not
1e940 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b initialized.");
1e950 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 ....return(CKR_C
1e960 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 RYPTOKI_NOT_INIT
1e970 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 IALIZED);..}...i
1e980 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c f (slotID < 0 ||
1e990 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 slotID >= (size
1e9a0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 of(cackey_slots)
1e9b0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 / sizeof(cackey
1e9c0 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 _slots[0]))) {..
1e9d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1e9e0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 INTF("Error. Inv
1e9f0 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 alid slot reques
1ea00 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 ted (%lu), outsi
1ea10 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 de of valid rang
1ea20 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 e", slotID);....
1ea30 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f return(CKR_SLOT_
1ea40 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a ID_INVALID);..}.
1ea50 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d ..mutex_retval =
1ea60 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f cackey_mutex_lo
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 09 69 66 20 28 6d 75 74 65 78 5f 72 k);..if (mutex_r
1ea90 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 etval != 0) {...
1eaa0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1eab0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 NTF("Error. Loc
1eac0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a king failed.");.
1ead0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 ...return(CKR_GE
1eae0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d NERAL_ERROR);..}
1eaf0 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c ...if (cackey_sl
1eb00 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 ots[slotID].acti
1eb10 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 ve == 0) {...CAC
1eb20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1eb30 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 ("Error. Invalid
1eb40 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 slot requested
1eb50 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 (%lu), slot not
1eb60 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 currently active
1eb70 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 ", slotID);....c
1eb80 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f ackey_mutex_unlo
1eb90 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
1eba0 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b k);....return(CK
1ebb0 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 R_SLOT_ID_INVALI
1ebc0 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 D);..}...mutex_r
1ebd0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d etval = cackey_m
1ebe0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b utex_unlock(cack
1ebf0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 ey_biglock);..if
1ec00 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 (mutex_retval !
1ec10 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f = 0) {...CACKEY_
1ec20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
1ec30 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 ror. Unlocking
1ec40 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 failed.");....re
1ec50 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c turn(CKR_GENERAL
1ec60 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 _ERROR);..}...sw
1ec70 69 74 63 68 20 28 74 79 70 65 29 20 7b 0a 09 09 itch (type) {...
1ec80 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 case CKM_RSA_PKC
1ec90 53 3a 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d S:....pInfo->ulM
1eca0 69 6e 4b 65 79 53 69 7a 65 20 3d 20 35 31 32 3b inKeySize = 512;
1ecb0 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 ....pInfo->ulMax
1ecc0 4b 65 79 53 69 7a 65 20 3d 20 38 31 39 32 3b 0a KeySize = 8192;.
1ecd0 09 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 ...pInfo->flags
1ece0 3d 20 43 4b 46 5f 48 57 20 7c 20 43 4b 46 5f 45 = CKF_HW | CKF_E
1ecf0 4e 43 52 59 50 54 20 7c 20 43 4b 46 5f 44 45 43 NCRYPT | CKF_DEC
1ed00 52 59 50 54 20 7c 20 43 4b 46 5f 53 49 47 4e 20 RYPT | CKF_SIGN
1ed10 7c 20 43 4b 46 5f 56 45 52 49 46 59 3b 0a 09 09 | CKF_VERIFY;...
1ed20 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 43 41 43 .break;..}...CAC
1ed30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1ed40 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f ("Returning CKR_
1ed50 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b OK (%i)", CKR_OK
1ed60 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f );...return(CKR_
1ed70 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f OK);.}../* We do
1ed80 6e 27 74 20 73 75 70 70 6f 72 74 20 74 68 69 73 n't support this
1ed90 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 method. */.CK_D
1eda0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 EFINE_FUNCTION(C
1edb0 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 54 6f 6b 65 K_RV, C_InitToke
1edc0 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c n)(CK_SLOT_ID sl
1edd0 6f 74 49 44 2c 20 43 4b 5f 55 54 46 38 43 48 41 otID, CK_UTF8CHA
1ede0 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 R_PTR pPin, CK_U
1edf0 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 2c 20 43 LONG ulPinLen, C
1ee00 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 K_UTF8CHAR_PTR p
1ee10 4c 61 62 65 6c 29 20 7b 0a 09 43 41 43 4b 45 59 Label) {..CACKEY
1ee20 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 _DEBUG_PRINTF("C
1ee30 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 alled.");...if (
1ee40 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 !cackey_initiali
1ee50 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f zed) {...CACKEY_
1ee60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
1ee70 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 ror. Not initia
1ee80 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 lized.");....ret
1ee90 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 urn(CKR_CRYPTOKI
1eea0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 _NOT_INITIALIZED
1eeb0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 );..}...CACKEY_D
1eec0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
1eed0 75 72 6e 69 6e 67 20 43 4b 52 5f 54 4f 4b 45 4e urning CKR_TOKEN
1eee0 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 _WRITE_PROTECTED
1eef0 20 28 25 69 29 22 2c 20 43 4b 52 5f 54 4f 4b 45 (%i)", CKR_TOKE
1ef00 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 N_WRITE_PROTECTE
1ef10 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 D);...return(CKR
1ef20 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f _TOKEN_WRITE_PRO
1ef30 54 45 43 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 57 TECTED);.}../* W
1ef40 65 20 64 6f 6e 27 74 20 73 75 70 70 6f 72 74 20 e don't support
1ef50 74 68 69 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a this method. */.
1ef60 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 CK_DEFINE_FUNCTI
1ef70 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 ON(CK_RV, C_Init
1ef80 50 49 4e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f PIN)(CK_SESSION_
1ef90 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c HANDLE hSession,
1efa0 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 CK_UTF8CHAR_PTR
1efb0 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 pPin, CK_ULONG
1efc0 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09 43 41 43 ulPinLen) {..CAC
1efd0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1efe0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 ("Called.");...i
1eff0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 f (!cackey_initi
1f000 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b alized) {...CACK
1f010 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1f020 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 "Error. Not ini
1f030 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 tialized.");....
1f040 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 return(CKR_CRYPT
1f050 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 OKI_NOT_INITIALI
1f060 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 ZED);..}...CACKE
1f070 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1f080 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 54 4f Returning CKR_TO
1f090 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 KEN_WRITE_PROTEC
1f0a0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 54 TED (%i)", CKR_T
1f0b0 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 OKEN_WRITE_PROTE
1f0c0 43 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 CTED);...return(
1f0d0 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f CKR_TOKEN_WRITE_
1f0e0 50 52 4f 54 45 43 54 45 44 29 3b 0a 7d 0a 0a 2f PROTECTED);.}../
1f0f0 2a 20 57 65 20 64 6f 6e 27 74 20 73 75 70 70 6f * We don't suppo
1f100 72 74 20 74 68 69 73 20 6d 65 74 68 6f 64 2e 20 rt this method.
1f110 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e */.CK_DEFINE_FUN
1f120 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 CTION(CK_RV, C_S
1f130 65 74 50 49 4e 29 28 43 4b 5f 53 45 53 53 49 4f etPIN)(CK_SESSIO
1f140 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f N_HANDLE hSessio
1f150 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 n, CK_UTF8CHAR_P
1f160 54 52 20 70 4f 6c 64 50 69 6e 2c 20 43 4b 5f 55 TR pOldPin, CK_U
1f170 4c 4f 4e 47 20 75 6c 4f 6c 64 50 69 6e 4c 65 6e LONG ulOldPinLen
1f180 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 , CK_UTF8CHAR_PT
1f190 52 20 70 4e 65 77 50 69 6e 2c 20 43 4b 5f 55 4c R pNewPin, CK_UL
1f1a0 4f 4e 47 20 75 6c 4e 65 77 50 69 6e 4c 65 6e 29 ONG ulNewPinLen)
1f1b0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {..CACKEY_DEBUG
1f1c0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
1f1d0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ");...if (!cacke
1f1e0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b y_initialized) {
1f1f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1f200 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
1f210 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e Not initialized.
1f220 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
1f230 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 R_CRYPTOKI_NOT_I
1f240 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
1f250 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1f260 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
1f270 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f CKR_FUNCTION_NO
1f280 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 T_SUPPORTED (%i)
1f290 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f ", CKR_FUNCTION_
1f2a0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
1f2b0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e ..return(CKR_FUN
1f2c0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
1f2d0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 TED);.}..CK_DEFI
1f2e0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 NE_FUNCTION(CK_R
1f2f0 56 2c 20 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e V, C_OpenSession
1f300 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f )(CK_SLOT_ID slo
1f310 74 49 44 2c 20 43 4b 5f 46 4c 41 47 53 20 66 6c tID, CK_FLAGS fl
1f320 61 67 73 2c 20 43 4b 5f 56 4f 49 44 5f 50 54 52 ags, CK_VOID_PTR
1f330 20 70 41 70 70 6c 69 63 61 74 69 6f 6e 2c 20 43 pApplication, C
1f340 4b 5f 4e 4f 54 49 46 59 20 6e 6f 74 69 66 79 2c K_NOTIFY notify,
1f350 20 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 CK_SESSION_HAND
1f360 4c 45 5f 50 54 52 20 70 68 53 65 73 73 69 6f 6e LE_PTR phSession
1f370 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f ) {..unsigned lo
1f380 6e 67 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 ng idx;..int mut
1f390 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 ex_retval;..int
1f3a0 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 20 3d 20 found_session =
1f3b0 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 0;...CACKEY_DEBU
1f3c0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 G_PRINTF("Called
1f3d0 2e 22 29 3b 0a 0a 09 69 66 20 28 28 66 6c 61 67 .");...if ((flag
1f3e0 73 20 26 20 43 4b 46 5f 53 45 52 49 41 4c 5f 53 s & CKF_SERIAL_S
1f3f0 45 53 53 49 4f 4e 29 20 21 3d 20 43 4b 46 5f 53 ESSION) != CKF_S
1f400 45 52 49 41 4c 5f 53 45 53 53 49 4f 4e 29 20 7b ERIAL_SESSION) {
1f410 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 ...return(CKR_SE
1f420 53 53 49 4f 4e 5f 50 41 52 41 4c 4c 45 4c 5f 4e SSION_PARALLEL_N
1f430 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 09 OT_SUPPORTED);..
1f440 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f }...if (!cackey_
1f450 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 initialized) {..
1f460 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1f470 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f INTF("Error. No
1f480 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 t initialized.")
1f490 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
1f4a0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 CRYPTOKI_NOT_INI
1f4b0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 TIALIZED);..}...
1f4c0 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c if (slotID < 0 |
1f4d0 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a | slotID >= (siz
1f4e0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 eof(cackey_slots
1f4f0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 ) / sizeof(cacke
1f500 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a y_slots[0]))) {.
1f510 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1f520 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e RINTF("Error. In
1f530 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 valid slot reque
1f540 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 sted (%lu), outs
1f550 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e ide of valid ran
1f560 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 ge", slotID);...
1f570 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 .return(CKR_SLOT
1f580 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d _ID_INVALID);..}
1f590 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 ...mutex_retval
1f5a0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c = cackey_mutex_l
1f5b0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
1f5c0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f ck);..if (mutex_
1f5d0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 retval != 0) {..
1f5e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1f5f0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f INTF("Error. Lo
1f600 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b cking failed.");
1f610 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 ....return(CKR_G
1f620 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 ENERAL_ERROR);..
1f630 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 }...if (cackey_s
1f640 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 lots[slotID].act
1f650 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 ive == 0) {...CA
1f660 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
1f670 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 F("Error. Invali
1f680 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 d slot requested
1f690 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 (%lu), slot not
1f6a0 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 currently activ
1f6b0 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 e", slotID);....
1f6c0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c cackey_mutex_unl
1f6d0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
1f6e0 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 ck);....return(C
1f6f0 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c KR_SLOT_ID_INVAL
1f700 49 44 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 65 72 ID);..}.../* Ver
1f710 69 66 79 20 74 68 61 74 20 74 68 65 20 63 61 72 ify that the car
1f720 64 20 69 73 20 61 63 74 75 61 6c 6c 79 20 69 6e d is actually in
1f730 20 74 68 65 20 73 6c 6f 74 2e 20 2a 2f 0a 09 2f the slot. */../
1f740 2a 20 58 58 58 3a 20 43 68 65 63 6b 20 74 6f 20 * XXX: Check to
1f750 6d 61 6b 65 20 73 75 72 65 20 74 68 69 73 20 69 make sure this i
1f760 73 20 69 6e 20 74 68 65 20 50 4b 43 53 23 31 31 s in the PKCS#11
1f770 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20 2a specification *
1f780 2f 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 74 6f /..if (cackey_to
1f790 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 63 ken_present(&cac
1f7a0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 key_slots[slotID
1f7b0 5d 29 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 ]) != CACKEY_PCS
1f7c0 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 C_S_TOKENPRESENT
1f7d0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
1f7e0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
1f7f0 2e 20 20 43 61 72 64 20 6e 6f 74 20 70 72 65 73 . Card not pres
1f800 65 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 ent. Returning
1f810 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 CKR_DEVICE_REMOV
1f820 45 44 22 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f ED");....cackey_
1f830 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 mutex_unlock(cac
1f840 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 key_biglock);...
1f850 09 72 65 74 75 72 6e 28 43 4b 52 5f 44 45 56 49 .return(CKR_DEVI
1f860 43 45 5f 52 45 4d 4f 56 45 44 29 3b 0a 09 7d 0a CE_REMOVED);..}.
1f870 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 31 3b 20 ..for (idx = 1;
1f880 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 idx < (sizeof(ca
1f890 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f ckey_sessions) /
1f8a0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 sizeof(cackey_s
1f8b0 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 essions[0])); id
1f8c0 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 21 63 61 x++) {...if (!ca
1f8d0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 ckey_sessions[id
1f8e0 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 x].active) {....
1f8f0 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 20 3d 20 found_session =
1f900 31 3b 0a 0a 09 09 09 2a 70 68 53 65 73 73 69 6f 1;.....*phSessio
1f910 6e 20 3d 20 69 64 78 3b 0a 0a 09 09 09 63 61 63 n = idx;.....cac
1f920 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 key_sessions[idx
1f930 5d 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 09 ].active = 1;...
1f940 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 .cackey_sessions
1f950 5b 69 64 78 5d 2e 73 6c 6f 74 49 44 20 3d 20 73 [idx].slotID = s
1f960 6c 6f 74 49 44 3b 0a 09 09 09 63 61 63 6b 65 79 lotID;....cackey
1f970 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 _sessions[idx].s
1f980 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 50 55 tate = CKS_RO_PU
1f990 42 4c 49 43 5f 53 45 53 53 49 4f 4e 3b 0a 09 09 BLIC_SESSION;...
1f9a0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 .cackey_sessions
1f9b0 5b 69 64 78 5d 2e 66 6c 61 67 73 20 3d 20 66 6c [idx].flags = fl
1f9c0 61 67 73 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 ags;....cackey_s
1f9d0 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 75 6c 44 essions[idx].ulD
1f9e0 65 76 69 63 65 45 72 72 6f 72 20 3d 20 30 3b 0a eviceError = 0;.
1f9f0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f ...cackey_sessio
1fa00 6e 73 5b 69 64 78 5d 2e 70 41 70 70 6c 69 63 61 ns[idx].pApplica
1fa10 74 69 6f 6e 20 3d 20 70 41 70 70 6c 69 63 61 74 tion = pApplicat
1fa20 69 6f 6e 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 ion;....cackey_s
1fa30 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 4e 6f 74 essions[idx].Not
1fa40 69 66 79 20 3d 20 6e 6f 74 69 66 79 3b 0a 0a 09 ify = notify;...
1fa50 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e ..cackey_session
1fa60 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 s[idx].identitie
1fa70 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63 61 63 s = NULL;....cac
1fa80 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 key_sessions[idx
1fa90 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 ].identities_cou
1faa0 6e 74 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b nt = 0;.....cack
1fab0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d ey_sessions[idx]
1fac0 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 20 3d .search_active =
1fad0 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 0;.....cackey_s
1fae0 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 69 67 essions[idx].sig
1faf0 6e 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 n_active = 0;...
1fb00 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e ..cackey_session
1fb10 73 5b 69 64 78 5d 2e 64 65 63 72 79 70 74 5f 61 s[idx].decrypt_a
1fb20 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63 ctive = 0;.....c
1fb30 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 ackey_sessions[i
1fb40 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d dx].identities =
1fb50 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 69 64 65 cackey_read_ide
1fb60 6e 74 69 74 69 65 73 28 26 63 61 63 6b 65 79 5f ntities(&cackey_
1fb70 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 26 slots[slotID], &
1fb80 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
1fb90 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f idx].identities_
1fba0 63 6f 75 6e 74 29 3b 0a 0a 0a 09 09 09 62 72 65 count);......bre
1fbb0 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 ak;...}..}...mut
1fbc0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b ex_retval = cack
1fbd0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 ey_mutex_unlock(
1fbe0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
1fbf0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 ..if (mutex_retv
1fc00 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 al != 0) {...CAC
1fc10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1fc20 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b ("Error. Unlock
1fc30 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a ing failed.");..
1fc40 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e ..return(CKR_GEN
1fc50 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a ERAL_ERROR);..}.
1fc60 0a 09 69 66 20 28 21 66 6f 75 6e 64 5f 73 65 73 ..if (!found_ses
1fc70 73 69 6f 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59 sion) {...CACKEY
1fc80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
1fc90 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 53 45 53 eturning CKR_SES
1fca0 53 49 4f 4e 5f 43 4f 55 4e 54 20 28 25 69 29 22 SION_COUNT (%i)"
1fcb0 2c 20 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f , CKR_SESSION_CO
1fcc0 55 4e 54 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 UNT);....return(
1fcd0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e CKR_SESSION_COUN
1fce0 54 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f T);..}...CACKEY_
1fcf0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
1fd00 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 turning CKR_OK (
1fd10 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a %i)", CKR_OK);..
1fd20 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b .return(CKR_OK);
1fd30 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 .}..CK_DEFINE_FU
1fd40 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f NCTION(CK_RV, C_
1fd50 43 6c 6f 73 65 53 65 73 73 69 6f 6e 29 28 43 4b CloseSession)(CK
1fd60 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 _SESSION_HANDLE
1fd70 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 69 6e 74 hSession) {..int
1fd80 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a mutex_retval;..
1fd90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1fda0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
1fdb0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 ...if (!cackey_i
1fdc0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 nitialized) {...
1fdd0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1fde0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 NTF("Error. Not
1fdf0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b initialized.");
1fe00 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 ....return(CKR_C
1fe10 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 RYPTOKI_NOT_INIT
1fe20 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 IALIZED);..}...i
1fe30 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 f (hSession == 0
1fe40 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 || hSession >=
1fe50 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 (sizeof(cackey_s
1fe60 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f essions) / sizeo
1fe70 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e f(cackey_session
1fe80 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b s[0]))) {...CACK
1fe90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1fea0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e "Error. Session
1feb0 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 out of range.")
1fec0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b ;......return(CK
1fed0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 R_SESSION_HANDLE
1fee0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 _INVALID);..}...
1fef0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 mutex_retval = c
1ff00 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b ackey_mutex_lock
1ff10 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 (cackey_biglock)
1ff20 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 ;..if (mutex_ret
1ff30 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 val != 0) {...CA
1ff40 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
1ff50 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 F("Error. Locki
1ff60 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 ng failed.");...
1ff70 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 .return(CKR_GENE
1ff80 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a RAL_ERROR);..}..
1ff90 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 .if (!cackey_ses
1ffa0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
1ffb0 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b active) {...cack
1ffc0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 ey_mutex_unlock(
1ffd0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
1ffe0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
1fff0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
20000 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 Session not act
20010 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 ive.");......ret
20020 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f urn(CKR_SESSION_
20030 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b HANDLE_INVALID);
20040 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 ..}...cackey_ses
20050 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
20060 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 63 61 63 active = 0;..cac
20070 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e 74 69 74 key_free_identit
20080 69 65 73 28 63 61 63 6b 65 79 5f 73 65 73 73 69 ies(cackey_sessi
20090 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 ons[hSession].id
200a0 65 6e 74 69 74 69 65 73 2c 20 63 61 63 6b 65 79 entities, cackey
200b0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
200c0 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 on].identities_c
200d0 6f 75 6e 74 29 3b 0a 0a 09 6d 75 74 65 78 5f 72 ount);...mutex_r
200e0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d etval = cackey_m
200f0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b utex_unlock(cack
20100 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 ey_biglock);..if
20110 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 (mutex_retval !
20120 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f = 0) {...CACKEY_
20130 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
20140 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 ror. Unlocking
20150 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 failed.");....re
20160 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c turn(CKR_GENERAL
20170 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 _ERROR);..}...CA
20180 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
20190 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 F("Returning CKR
201a0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f _OK (%i)", CKR_O
201b0 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 K);...return(CKR
201c0 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 _OK);.}..CK_DEFI
201d0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 NE_FUNCTION(CK_R
201e0 56 2c 20 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 V, C_CloseAllSes
201f0 73 69 6f 6e 73 29 28 43 4b 5f 53 4c 4f 54 5f 49 sions)(CK_SLOT_I
20200 44 20 73 6c 6f 74 49 44 29 20 7b 0a 09 75 69 6e D slotID) {..uin
20210 74 33 32 5f 74 20 69 64 78 3b 0a 09 69 6e 74 20 t32_t idx;..int
20220 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 mutex_retval;...
20230 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
20240 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a NTF("Called.");.
20250 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e ..if (!cackey_in
20260 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 itialized) {...C
20270 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
20280 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 TF("Error. Not
20290 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a initialized.");.
202a0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 ...return(CKR_CR
202b0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 YPTOKI_NOT_INITI
202c0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 ALIZED);..}...if
202d0 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 (slotID < 0 ||
202e0 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f slotID >= (sizeo
202f0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 f(cackey_slots)
20300 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f / sizeof(cackey_
20310 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 slots[0]))) {...
20320 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
20330 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 NTF("Error. Inva
20340 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 lid slot request
20350 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 ed (%lu), outsid
20360 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 e of valid range
20370 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 ", slotID);....r
20380 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 eturn(CKR_SLOT_I
20390 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a D_INVALID);..}..
203a0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 .mutex_retval =
203b0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 cackey_mutex_loc
203c0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
203d0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 );..if (mutex_re
203e0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 tval != 0) {...C
203f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
20400 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b TF("Error. Lock
20410 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a ing failed.");..
20420 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e ..return(CKR_GEN
20430 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a ERAL_ERROR);..}.
20440 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f ..if (cackey_slo
20450 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 ts[slotID].activ
20460 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b e == 0) {...CACK
20470 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
20480 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 "Error. Invalid
20490 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 slot requested (
204a0 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 %lu), slot not c
204b0 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 urrently active"
204c0 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 , slotID);....ca
204d0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 ckey_mutex_unloc
204e0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
204f0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
20500 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 _SLOT_ID_INVALID
20510 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 );..}...for (idx
20520 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a = 0; idx < (siz
20530 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 eof(cackey_sessi
20540 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 ons) / sizeof(ca
20550 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d ckey_sessions[0]
20560 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 )); idx++) {...i
20570 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f f (cackey_sessio
20580 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20 ns[idx].active)
20590 7b 0a 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f {....if (cackey_
205a0 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 6c sessions[idx].sl
205b0 6f 74 49 44 20 21 3d 20 73 6c 6f 74 49 44 29 20 otID != slotID)
205c0 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a {.....continue;.
205d0 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f ...}.....cackey_
205e0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 mutex_unlock(cac
205f0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 key_biglock);...
20600 09 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 28 .C_CloseSession(
20610 69 64 78 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f idx);....cackey_
20620 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 mutex_lock(cacke
20630 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a y_biglock);...}.
20640 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 .}...mutex_retva
20650 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 l = cackey_mutex
20660 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 _unlock(cackey_b
20670 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 iglock);..if (mu
20680 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 tex_retval != 0)
20690 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
206a0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
206b0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c Unlocking fail
206c0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
206d0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 (CKR_GENERAL_ERR
206e0 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 OR);..}...CACKEY
206f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
20700 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 eturning CKR_OK
20710 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a (%i)", CKR_OK);.
20720 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 ..return(CKR_OK)
20730 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 ;.}..CK_DEFINE_F
20740 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 UNCTION(CK_RV, C
20750 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f 29 _GetSessionInfo)
20760 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 (CK_SESSION_HAND
20770 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f LE hSession, CK_
20780 53 45 53 53 49 4f 4e 5f 49 4e 46 4f 5f 50 54 52 SESSION_INFO_PTR
20790 20 70 49 6e 66 6f 29 20 7b 0a 09 69 6e 74 20 6d pInfo) {..int m
207a0 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 utex_retval;...C
207b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
207c0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
207d0 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 .if (pInfo == NU
207e0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 LL) {...CACKEY_D
207f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
20800 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c or. pInfo is NUL
20810 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 L.");....return(
20820 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 CKR_ARGUMENTS_BA
20830 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 D);..}...if (!ca
20840 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 ckey_initialized
20850 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
20860 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
20870 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a . Not initializ
20880 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
20890 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f (CKR_CRYPTOKI_NO
208a0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a T_INITIALIZED);.
208b0 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f .}...if (hSessio
208c0 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 n == 0 || hSessi
208d0 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 on >= (sizeof(ca
208e0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f ckey_sessions) /
208f0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 sizeof(cackey_s
20900 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a essions[0]))) {.
20910 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
20920 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 RINTF("Error. S
20930 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 ession out of ra
20940 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 nge.");......ret
20950 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f urn(CKR_SESSION_
20960 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b HANDLE_INVALID);
20970 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 ..}...mutex_retv
20980 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 al = cackey_mute
20990 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 x_lock(cackey_bi
209a0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 glock);..if (mut
209b0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 ex_retval != 0)
209c0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
209d0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
209e0 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e Locking failed.
209f0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
20a00 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 R_GENERAL_ERROR)
20a10 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b ;..}...if (!cack
20a20 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
20a30 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a sion].active) {.
20a40 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 ..cackey_mutex_u
20a50 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 nlock(cackey_big
20a60 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 lock);....CACKEY
20a70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
20a80 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e rror. Session n
20a90 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 ot active.");...
20aa0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 ...return(CKR_SE
20ab0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 SSION_HANDLE_INV
20ac0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 ALID);..}...pInf
20ad0 6f 2d 3e 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b o->slotID = cack
20ae0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
20af0 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 09 70 sion].slotID;..p
20b00 49 6e 66 6f 2d 3e 73 74 61 74 65 20 3d 20 63 61 Info->state = ca
20b10 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
20b20 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65 3b 0a 09 ession].state;..
20b30 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 63 pInfo->flags = c
20b40 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
20b50 53 65 73 73 69 6f 6e 5d 2e 66 6c 61 67 73 3b 0a Session].flags;.
20b60 09 70 49 6e 66 6f 2d 3e 75 6c 44 65 76 69 63 65 .pInfo->ulDevice
20b70 45 72 72 6f 72 20 3d 20 63 61 63 6b 65 79 5f 73 Error = cackey_s
20b80 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
20b90 5d 2e 75 6c 44 65 76 69 63 65 45 72 72 6f 72 3b ].ulDeviceError;
20ba0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 ...mutex_retval
20bb0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 = cackey_mutex_u
20bc0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 nlock(cackey_big
20bd0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 lock);..if (mute
20be0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b x_retval != 0) {
20bf0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
20c00 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
20c10 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 Unlocking failed
20c20 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
20c30 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 KR_GENERAL_ERROR
20c40 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 );..}...CACKEY_D
20c50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
20c60 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 urning CKR_OK (%
20c70 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 i)", CKR_OK);...
20c80 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a return(CKR_OK);.
20c90 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e }..CK_DEFINE_FUN
20ca0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 CTION(CK_RV, C_G
20cb0 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 etOperationState
20cc0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e )(CK_SESSION_HAN
20cd0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b DLE hSession, CK
20ce0 5f 42 59 54 45 5f 50 54 52 20 70 4f 70 65 72 61 _BYTE_PTR pOpera
20cf0 74 69 6f 6e 53 74 61 74 65 2c 20 43 4b 5f 55 4c tionState, CK_UL
20d00 4f 4e 47 5f 50 54 52 20 70 75 6c 4f 70 65 72 61 ONG_PTR pulOpera
20d10 74 69 6f 6e 53 74 61 74 65 4c 65 6e 29 20 7b 0a tionStateLen) {.
20d20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
20d30 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
20d40 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 ...if (!cackey_i
20d50 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 nitialized) {...
20d60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
20d70 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 NTF("Error. Not
20d80 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b initialized.");
20d90 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 ....return(CKR_C
20da0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 RYPTOKI_NOT_INIT
20db0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 IALIZED);..}...C
20dc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
20dd0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b TF("Returning CK
20de0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
20df0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 UPPORTED (%i)",
20e00 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
20e10 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 _SUPPORTED);...r
20e20 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 eturn(CKR_FUNCTI
20e30 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
20e40 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f );.}..CK_DEFINE_
20e50 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 FUNCTION(CK_RV,
20e60 43 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 C_SetOperationSt
20e70 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f ate)(CK_SESSION_
20e80 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c HANDLE hSession,
20e90 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4f 70 CK_BYTE_PTR pOp
20ea0 65 72 61 74 69 6f 6e 53 74 61 74 65 2c 20 43 4b erationState, CK
20eb0 5f 55 4c 4f 4e 47 20 75 6c 4f 70 65 72 61 74 69 _ULONG ulOperati
20ec0 6f 6e 53 74 61 74 65 4c 65 6e 2c 20 43 4b 5f 4f onStateLen, CK_O
20ed0 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 45 6e BJECT_HANDLE hEn
20ee0 63 72 79 70 74 69 6f 6e 4b 65 79 2c 20 43 4b 5f cryptionKey, CK_
20ef0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 41 OBJECT_HANDLE hA
20f00 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 4b 65 79 uthenticationKey
20f10 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 ) {..CACKEY_DEBU
20f20 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 G_PRINTF("Called
20f30 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b .");...if (!cack
20f40 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 ey_initialized)
20f50 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
20f60 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
20f70 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 Not initialized
20f80 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
20f90 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f KR_CRYPTOKI_NOT_
20fa0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d INITIALIZED);..}
20fb0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
20fc0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e PRINTF("Returnin
20fd0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e g CKR_FUNCTION_N
20fe0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 OT_SUPPORTED (%i
20ff0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e )", CKR_FUNCTION
21000 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
21010 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 ...return(CKR_FU
21020 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
21030 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 RTED);.}..CK_DEF
21040 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f INE_FUNCTION(CK_
21050 52 56 2c 20 43 5f 4c 6f 67 69 6e 29 28 43 4b 5f RV, C_Login)(CK_
21060 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 SESSION_HANDLE h
21070 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 53 45 52 Session, CK_USER
21080 5f 54 59 50 45 20 75 73 65 72 54 79 70 65 2c 20 _TYPE userType,
21090 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 CK_UTF8CHAR_PTR
210a0 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 pPin, CK_ULONG u
210b0 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09 43 4b 5f 53 lPinLen) {..CK_S
210c0 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 LOT_ID slotID;..
210d0 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c int mutex_retval
210e0 3b 0a 09 69 6e 74 20 74 72 69 65 73 5f 72 65 6d ;..int tries_rem
210f0 61 69 6e 69 6e 67 3b 0a 09 69 6e 74 20 6c 6f 67 aining;..int log
21100 69 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 in_ret;...CACKEY
21110 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 _DEBUG_PRINTF("C
21120 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 alled.");...if (
21130 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 !cackey_initiali
21140 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f zed) {...CACKEY_
21150 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
21160 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 ror. Not initia
21170 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 lized.");....ret
21180 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 urn(CKR_CRYPTOKI
21190 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 _NOT_INITIALIZED
211a0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 );..}...if (hSes
211b0 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 sion == 0 || hSe
211c0 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 ssion >= (sizeof
211d0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 (cackey_sessions
211e0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 ) / sizeof(cacke
211f0 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 y_sessions[0])))
21200 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
21210 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
21220 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 Session out of
21230 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 range.");......
21240 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 return(CKR_SESSI
21250 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 ON_HANDLE_INVALI
21260 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73 65 D);..}...if (use
21270 72 54 79 70 65 20 21 3d 20 43 4b 55 5f 55 53 45 rType != CKU_USE
21280 52 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 R) {...CACKEY_DE
21290 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
212a0 72 2e 20 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 r. We only supp
212b0 6f 72 74 20 55 53 45 52 20 6d 6f 64 65 2c 20 61 ort USER mode, a
212c0 73 6b 65 64 20 66 6f 72 20 25 6c 75 20 6d 6f 64 sked for %lu mod
212d0 65 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c e.", (unsigned l
212e0 6f 6e 67 29 20 75 73 65 72 54 79 70 65 29 0a 0a ong) userType)..
212f0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 55 53 45 ..return(CKR_USE
21300 52 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 29 3b R_TYPE_INVALID);
21310 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 ..}...mutex_retv
21320 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 al = cackey_mute
21330 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 x_lock(cackey_bi
21340 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 glock);..if (mut
21350 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 ex_retval != 0)
21360 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
21370 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
21380 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e Locking failed.
21390 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
213a0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 R_GENERAL_ERROR)
213b0 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b ;..}...if (!cack
213c0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
213d0 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a sion].active) {.
213e0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 ..cackey_mutex_u
213f0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 nlock(cackey_big
21400 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 lock);....CACKEY
21410 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
21420 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e rror. Session n
21430 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 ot active.");...
21440 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 ...return(CKR_SE
21450 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 SSION_HANDLE_INV
21460 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 ALID);..}...slot
21470 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 ID = cackey_sess
21480 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 ions[hSession].s
21490 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f lotID;...if (slo
214a0 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 tID < 0 || slotI
214b0 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 D >= (sizeof(cac
214c0 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a key_slots) / siz
214d0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 eof(cackey_slots
214e0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 [0]))) {...CACKE
214f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
21500 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 Error. Invalid s
21510 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 lot requested (%
21520 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 lu), outside of
21530 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c valid range", sl
21540 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e otID);....return
21550 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 (CKR_GENERAL_ERR
21560 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 OR);..}...if (ca
21570 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 ckey_slots[slotI
21580 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 D].active == 0)
21590 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
215a0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
215b0 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 Invalid slot req
215c0 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c uested (%lu), sl
215d0 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 ot not currently
215e0 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 active", slotID
215f0 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 );....cackey_mut
21600 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 ex_unlock(cackey
21610 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 _biglock);....re
21620 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c turn(CKR_GENERAL
21630 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 6c 6f _ERROR);..}...lo
21640 67 69 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 gin_ret = cackey
21650 5f 6c 6f 67 69 6e 28 26 63 61 63 6b 65 79 5f 73 _login(&cackey_s
21660 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 70 50 lots[slotID], pP
21670 69 6e 2c 20 75 6c 50 69 6e 4c 65 6e 2c 20 26 74 in, ulPinLen, &t
21680 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 29 3b ries_remaining);
21690 0a 09 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20 ..if (login_ret
216a0 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 != CACKEY_PCSC_S
216b0 5f 4f 4b 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f _OK) {...cackey_
216c0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 mutex_unlock(cac
216d0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 key_biglock);...
216e0 09 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20 3d .if (login_ret =
216f0 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f = CACKEY_PCSC_E_
21700 4c 4f 43 4b 45 44 29 20 7b 0a 09 09 09 43 41 43 LOCKED) {....CAC
21710 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
21720 28 22 45 72 72 6f 72 2e 20 20 54 6f 6b 65 6e 20 ("Error. Token
21730 69 73 20 6c 6f 63 6b 65 64 2e 22 29 3b 0a 0a 09 is locked.");...
21740 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 ..cackey_slots[s
21750 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 lotID].token_fla
21760 67 73 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50 gs |= CKF_USER_P
21770 49 4e 5f 4c 4f 43 4b 45 44 3b 0a 0a 09 09 09 72 IN_LOCKED;.....r
21780 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 4c 4f eturn(CKR_PIN_LO
21790 43 4b 45 44 29 3b 0a 09 09 7d 20 65 6c 73 65 20 CKED);...} else
217a0 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d if (login_ret ==
217b0 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 CACKEY_PCSC_E_B
217c0 41 44 50 49 4e 29 20 7b 0a 09 09 09 43 41 43 4b ADPIN) {....CACK
217d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
217e0 22 45 72 72 6f 72 2e 20 20 49 6e 76 61 6c 69 64 "Error. Invalid
217f0 20 50 49 4e 2e 22 29 3b 0a 0a 09 09 09 63 61 63 PIN.");.....cac
21800 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 key_slots[slotID
21810 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d ].token_flags |=
21820 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 43 4f CKF_USER_PIN_CO
21830 55 4e 54 5f 4c 4f 57 3b 0a 0a 09 09 09 69 66 20 UNT_LOW;.....if
21840 28 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 (tries_remaining
21850 20 3d 3d 20 31 29 20 7b 0a 09 09 09 09 63 61 63 == 1) {.....cac
21860 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 key_slots[slotID
21870 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d ].token_flags |=
21880 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 46 49 CKF_USER_PIN_FI
21890 4e 41 4c 5f 54 52 59 3b 0a 09 09 09 7d 0a 0a 09 NAL_TRY;....}...
218a0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e ..return(CKR_PIN
218b0 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a 09 09 7d _INCORRECT);...}
218c0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
218d0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
218e0 20 55 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 20 72 Unknown error r
218f0 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 63 61 63 eturned from cac
21900 6b 65 79 5f 6c 6f 67 69 6e 28 29 20 28 25 69 29 key_login() (%i)
21910 22 2c 20 6c 6f 67 69 6e 5f 72 65 74 29 3b 0a 0a ", login_ret);..
21920 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e ..return(CKR_GEN
21930 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a ERAL_ERROR);..}.
21940 0a 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 ..cackey_slots[s
21950 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 lotID].token_fla
21960 67 73 20 26 3d 20 7e 28 43 4b 46 5f 55 53 45 52 gs &= ~(CKF_USER
21970 5f 50 49 4e 5f 4c 4f 43 4b 45 44 20 7c 20 43 4b _PIN_LOCKED | CK
21980 46 5f 55 53 45 52 5f 50 49 4e 5f 43 4f 55 4e 54 F_USER_PIN_COUNT
21990 5f 4c 4f 57 20 7c 20 43 4b 46 5f 4c 4f 47 49 4e _LOW | CKF_LOGIN
219a0 5f 52 45 51 55 49 52 45 44 20 7c 20 43 4b 46 5f _REQUIRED | CKF_
219b0 55 53 45 52 5f 50 49 4e 5f 46 49 4e 41 4c 5f 54 USER_PIN_FINAL_T
219c0 52 59 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 RY);...cackey_se
219d0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
219e0 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f .state = CKS_RO_
219f0 55 53 45 52 5f 46 55 4e 43 54 49 4f 4e 53 3b 0a USER_FUNCTIONS;.
21a00 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d ..mutex_retval =
21a10 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e cackey_mutex_un
21a20 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
21a30 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 ock);..if (mutex
21a40 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a _retval != 0) {.
21a50 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
21a60 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 RINTF("Error. U
21a70 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e nlocking failed.
21a80 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
21a90 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 R_GENERAL_ERROR)
21aa0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ;..}...CACKEY_DE
21ab0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
21ac0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 rning CKR_OK (%i
21ad0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 )", CKR_OK);...r
21ae0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d eturn(CKR_OK);.}
21af0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 ..CK_DEFINE_FUNC
21b00 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f TION(CK_RV, C_Lo
21b10 67 6f 75 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e gout)(CK_SESSION
21b20 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e _HANDLE hSession
21b30 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 ) {..CK_SLOT_ID
21b40 73 6c 6f 74 49 44 3b 0a 09 69 6e 74 20 6d 75 74 slotID;..int mut
21b50 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 ex_retval;...CAC
21b60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
21b70 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 ("Called.");...i
21b80 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 f (!cackey_initi
21b90 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b alized) {...CACK
21ba0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
21bb0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 "Error. Not ini
21bc0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 tialized.");....
21bd0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 return(CKR_CRYPT
21be0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 OKI_NOT_INITIALI
21bf0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 ZED);..}...if (h
21c00 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 Session == 0 ||
21c10 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a hSession >= (siz
21c20 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 eof(cackey_sessi
21c30 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 ons) / sizeof(ca
21c40 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d ckey_sessions[0]
21c50 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ))) {...CACKEY_D
21c60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
21c70 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 or. Session out
21c80 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 of range.");...
21c90 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 ...return(CKR_SE
21ca0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 SSION_HANDLE_INV
21cb0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 ALID);..}...mute
21cc0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 x_retval = cacke
21cd0 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 y_mutex_lock(cac
21ce0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 key_biglock);..i
21cf0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 f (mutex_retval
21d00 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 != 0) {...CACKEY
21d10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
21d20 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 rror. Locking f
21d30 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 ailed.");....ret
21d40 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f urn(CKR_GENERAL_
21d50 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 ERROR);..}...if
21d60 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e (!cackey_session
21d70 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 s[hSession].acti
21d80 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d ve) {...cackey_m
21d90 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b utex_unlock(cack
21da0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 ey_biglock);....
21db0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
21dc0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 NTF("Error. Ses
21dd0 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e sion not active.
21de0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 ");......return(
21df0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 CKR_SESSION_HAND
21e00 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a LE_INVALID);..}.
21e10 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 ..slotID = cacke
21e20 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
21e30 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 ion].slotID;...i
21e40 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c f (slotID < 0 ||
21e50 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 slotID >= (size
21e60 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 of(cackey_slots)
21e70 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 / sizeof(cackey
21e80 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 _slots[0]))) {..
21e90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
21ea0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 INTF("Error. Inv
21eb0 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 alid slot reques
21ec0 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 ted (%lu), outsi
21ed0 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 de of valid rang
21ee0 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 e", slotID);....
21ef0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 return(CKR_GENER
21f00 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 AL_ERROR);..}...
21f10 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 if (cackey_slots
21f20 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 [slotID].active
21f30 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 == 0) {...CACKEY
21f40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
21f50 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c rror. Invalid sl
21f60 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c ot requested (%l
21f70 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 u), slot not cur
21f80 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 rently active",
21f90 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b slotID);....cack
21fa0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 ey_mutex_unlock(
21fb0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
21fc0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 ....return(CKR_G
21fd0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 ENERAL_ERROR);..
21fe0 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 }...cackey_sessi
21ff0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74 ons[hSession].st
22000 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 50 55 42 ate = CKS_RO_PUB
22010 4c 49 43 5f 53 45 53 53 49 4f 4e 3b 0a 09 63 61 LIC_SESSION;..ca
22020 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 ckey_slots[slotI
22030 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d D].token_flags =
22040 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 CKF_LOGIN_REQUI
22050 52 45 44 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 RED;...mutex_ret
22060 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 val = cackey_mut
22070 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 ex_unlock(cackey
22080 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 _biglock);..if (
22090 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 mutex_retval !=
220a0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 0) {...CACKEY_DE
220b0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
220c0 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 r. Unlocking fa
220d0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 iled.");....retu
220e0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 rn(CKR_GENERAL_E
220f0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b RROR);..}...CACK
22100 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
22110 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f "Returning CKR_O
22120 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 K (%i)", CKR_OK)
22130 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f ;...return(CKR_O
22140 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 K);.}..CK_DEFINE
22150 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c _FUNCTION(CK_RV,
22160 20 43 5f 43 72 65 61 74 65 4f 62 6a 65 63 74 29 C_CreateObject)
22170 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 (CK_SESSION_HAND
22180 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f LE hSession, CK_
22190 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 ATTRIBUTE_PTR pT
221a0 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e emplate, CK_ULON
221b0 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 G ulCount, CK_OB
221c0 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 JECT_HANDLE_PTR
221d0 70 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43 phObject) {..CAC
221e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
221f0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 ("Called.");...i
22200 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 f (!cackey_initi
22210 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b alized) {...CACK
22220 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
22230 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 "Error. Not ini
22240 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 tialized.");....
22250 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 return(CKR_CRYPT
22260 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 OKI_NOT_INITIALI
22270 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 ZED);..}...CACKE
22280 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
22290 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 Returning CKR_FU
222a0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
222b0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f RTED (%i)", CKR_
222c0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
222d0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 PORTED);...retur
222e0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e n(CKR_FUNCTION_N
222f0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d OT_SUPPORTED);.}
22300 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 ..CK_DEFINE_FUNC
22310 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6f TION(CK_RV, C_Co
22320 70 79 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45 53 pyObject)(CK_SES
22330 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 SION_HANDLE hSes
22340 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f sion, CK_OBJECT_
22350 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 HANDLE hObject,
22360 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 CK_ATTRIBUTE_PTR
22370 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 pTemplate, CK_U
22380 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b LONG ulCount, CK
22390 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 _OBJECT_HANDLE_P
223a0 54 52 20 70 68 4e 65 77 4f 62 6a 65 63 74 29 20 TR phNewObject)
223b0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f {..CACKEY_DEBUG_
223c0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
223d0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 );...if (!cackey
223e0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
223f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
22400 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e RINTF("Error. N
22410 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 ot initialized."
22420 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
22430 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e _CRYPTOKI_NOT_IN
22440 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
22450 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
22460 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
22470 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
22480 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 _SUPPORTED (%i)"
22490 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e , CKR_FUNCTION_N
224a0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a OT_SUPPORTED);..
224b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 .return(CKR_FUNC
224c0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
224d0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e ED);.}..CK_DEFIN
224e0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 E_FUNCTION(CK_RV
224f0 2c 20 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63 , C_DestroyObjec
22500 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 t)(CK_SESSION_HA
22510 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 NDLE hSession, C
22520 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 K_OBJECT_HANDLE
22530 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b hObject) {..CACK
22540 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
22550 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 "Called.");...if
22560 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 (!cackey_initia
22570 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 lized) {...CACKE
22580 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
22590 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 Error. Not init
225a0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 ialized.");....r
225b0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f eturn(CKR_CRYPTO
225c0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a KI_NOT_INITIALIZ
225d0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 ED);..}...CACKEY
225e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
225f0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e eturning CKR_FUN
22600 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
22610 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 TED (%i)", CKR_F
22620 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
22630 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e ORTED);...return
22640 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f (CKR_FUNCTION_NO
22650 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a T_SUPPORTED);.}.
22660 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 .CK_DEFINE_FUNCT
22670 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 ION(CK_RV, C_Get
22680 4f 62 6a 65 63 74 53 69 7a 65 29 28 43 4b 5f 53 ObjectSize)(CK_S
22690 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 ESSION_HANDLE hS
226a0 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 ession, CK_OBJEC
226b0 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 T_HANDLE hObject
226c0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 , CK_ULONG_PTR p
226d0 75 6c 53 69 7a 65 29 20 7b 0a 09 43 41 43 4b 45 ulSize) {..CACKE
226e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
226f0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 Called.");...if
22700 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c (!cackey_initial
22710 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 ized) {...CACKEY
22720 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
22730 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 rror. Not initi
22740 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 alized.");....re
22750 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b turn(CKR_CRYPTOK
22760 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 I_NOT_INITIALIZE
22770 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f D);..}...CACKEY_
22780 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
22790 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 turning CKR_FUNC
227a0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
227b0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 ED (%i)", CKR_FU
227c0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
227d0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 RTED);...return(
227e0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
227f0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a _SUPPORTED);.}..
22800 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 CK_DEFINE_FUNCTI
22810 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 41 ON(CK_RV, C_GetA
22820 74 74 72 69 62 75 74 65 56 61 6c 75 65 29 28 43 ttributeValue)(C
22830 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 K_SESSION_HANDLE
22840 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 hSession, CK_OB
22850 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a JECT_HANDLE hObj
22860 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 ect, CK_ATTRIBUT
22870 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c E_PTR pTemplate,
22880 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e CK_ULONG ulCoun
22890 74 29 20 7b 0a 09 43 4b 5f 41 54 54 52 49 42 55 t) {..CK_ATTRIBU
228a0 54 45 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09 TE *curr_attr;..
228b0 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 struct cackey_id
228c0 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79 entity *identity
228d0 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 ;..unsigned long
228e0 20 69 64 65 6e 74 69 74 79 5f 69 64 78 2c 20 61 identity_idx, a
228f0 74 74 72 5f 69 64 78 2c 20 73 65 73 73 5f 61 74 ttr_idx, sess_at
22900 74 72 5f 69 64 78 2c 20 6e 75 6d 5f 69 64 73 3b tr_idx, num_ids;
22910 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 ..int mutex_retv
22920 61 6c 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 al;..CK_RV retva
22930 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 43 4b 5f l = CKR_OK;..CK_
22940 56 4f 49 44 5f 50 54 52 20 70 56 61 6c 75 65 3b VOID_PTR pValue;
22950 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c ..CK_ULONG ulVal
22960 75 65 4c 65 6e 3b 0a 0a 09 43 41 43 4b 45 59 5f ueLen;...CACKEY_
22970 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
22980 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 lled.");...if (!
22990 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a cackey_initializ
229a0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...CACKEY_D
229b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
229c0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c or. Not initial
229d0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 ized.");....retu
229e0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f rn(CKR_CRYPTOKI_
229f0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 NOT_INITIALIZED)
22a00 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 ;..}...if (hSess
22a10 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 ion == 0 || hSes
22a20 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 sion >= (sizeof(
22a30 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 cackey_sessions)
22a40 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 / sizeof(cackey
22a50 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 _sessions[0])))
22a60 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
22a70 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
22a80 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 Session out of
22a90 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 range.");......r
22aa0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f eturn(CKR_SESSIO
22ab0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 N_HANDLE_INVALID
22ac0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4f 62 6a );..}...if (hObj
22ad0 65 63 74 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 ect == 0) {...CA
22ae0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
22af0 46 28 22 45 72 72 6f 72 2e 20 20 4f 62 6a 65 63 F("Error. Objec
22b00 74 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 t handle out of
22b10 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 range.");......r
22b20 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 54 eturn(CKR_OBJECT
22b30 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 _HANDLE_INVALID)
22b40 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 43 6f 75 ;..}...if (ulCou
22b50 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 nt == 0) {.../*
22b60 53 68 6f 72 74 20 63 69 72 63 75 69 74 2c 20 69 Short circuit, i
22b70 66 20 7a 65 72 6f 20 6f 62 6a 65 63 74 73 20 77 f zero objects w
22b80 65 72 65 20 73 70 65 63 69 66 69 65 64 20 72 65 ere specified re
22b90 74 75 72 6e 20 7a 65 72 6f 20 69 74 65 6d 73 20 turn zero items
22ba0 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a 09 immediately */..
22bb0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
22bc0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
22bd0 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f CKR_OK (%i) (sho
22be0 72 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b rt circuit)", CK
22bf0 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e R_OK);....return
22c00 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 (CKR_OK);..}...i
22c10 66 20 28 70 54 65 6d 70 6c 61 74 65 20 3d 3d 20 f (pTemplate ==
22c20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 NULL) {...CACKEY
22c30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
22c40 72 72 6f 72 2e 20 20 70 54 65 6d 70 6c 61 74 65 rror. pTemplate
22c50 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 is NULL.");....
22c60 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d return(CKR_ARGUM
22c70 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 ENTS_BAD);..}...
22c80 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3d 20 68 identity_idx = h
22c90 4f 62 6a 65 63 74 20 2d 20 31 3b 0a 0a 09 6d 75 Object - 1;...mu
22ca0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 tex_retval = cac
22cb0 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 key_mutex_lock(c
22cc0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
22cd0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 .if (mutex_retva
22ce0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b l != 0) {...CACK
22cf0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
22d00 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 "Error. Locking
22d10 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 failed.");....r
22d20 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 eturn(CKR_GENERA
22d30 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 L_ERROR);..}...i
22d40 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 f (!cackey_sessi
22d50 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 ons[hSession].ac
22d60 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 tive) {...cackey
22d70 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 _mutex_unlock(ca
22d80 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a ckey_biglock);..
22d90 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
22da0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 RINTF("Error. S
22db0 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 ession not activ
22dc0 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 e.");......retur
22dd0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 n(CKR_SESSION_HA
22de0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 NDLE_INVALID);..
22df0 7d 0a 0a 09 6e 75 6d 5f 69 64 73 20 3d 20 63 61 }...num_ids = ca
22e00 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
22e10 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 ession].identiti
22e20 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69 66 20 28 es_count;...if (
22e30 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3e 3d 20 identity_idx >=
22e40 6e 75 6d 5f 69 64 73 29 20 7b 0a 09 09 63 61 63 num_ids) {...cac
22e50 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b key_mutex_unlock
22e60 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 (cackey_biglock)
22e70 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 ;....CACKEY_DEBU
22e80 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
22e90 20 20 4f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 Object handle
22ea0 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 69 out of range. i
22eb0 64 65 6e 74 69 74 79 5f 69 64 78 20 3d 20 25 6c dentity_idx = %l
22ec0 75 2c 20 6e 75 6d 5f 69 64 73 20 3d 20 25 6c 75 u, num_ids = %lu
22ed0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f .", (unsigned lo
22ee0 6e 67 29 20 69 64 65 6e 74 69 74 79 5f 69 64 78 ng) identity_idx
22ef0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
22f00 29 20 6e 75 6d 5f 69 64 73 29 3b 0a 0a 09 09 72 ) num_ids);....r
22f10 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 54 eturn(CKR_OBJECT
22f20 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 _HANDLE_INVALID)
22f30 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74 69 74 79 20 ;..}...identity
22f40 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f = &cackey_sessio
22f50 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 ns[hSession].ide
22f60 6e 74 69 74 69 65 73 5b 69 64 65 6e 74 69 74 79 ntities[identity
22f70 5f 69 64 78 5d 3b 0a 0a 09 66 6f 72 20 28 61 74 _idx];...for (at
22f80 74 72 5f 69 64 78 20 3d 20 30 3b 20 61 74 74 72 tr_idx = 0; attr
22f90 5f 69 64 78 20 3c 20 75 6c 43 6f 75 6e 74 3b 20 _idx < ulCount;
22fa0 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 attr_idx++) {...
22fb0 63 75 72 72 5f 61 74 74 72 20 3d 20 26 70 54 65 curr_attr = &pTe
22fc0 6d 70 6c 61 74 65 5b 61 74 74 72 5f 69 64 78 5d mplate[attr_idx]
22fd0 3b 0a 0a 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 ;....pValue = NU
22fe0 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65 4c 65 6e LL;...ulValueLen
22ff0 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b = (CK_LONG) -1;
23000 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
23010 5f 50 52 49 4e 54 46 28 22 4c 6f 6f 6b 69 6e 67 _PRINTF("Looking
23020 20 66 6f 72 20 61 74 74 72 69 62 75 74 65 20 30 for attribute 0
23030 78 25 30 38 6c 78 20 28 69 64 65 6e 74 69 74 79 x%08lx (identity
23040 3a 25 6c 75 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 :%lu) ...", (uns
23050 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 igned long) curr
23060 5f 61 74 74 72 2d 3e 74 79 70 65 2c 20 28 75 6e _attr->type, (un
23070 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65 signed long) ide
23080 6e 74 69 74 79 5f 69 64 78 29 3b 0a 0a 09 09 66 ntity_idx);....f
23090 6f 72 20 28 73 65 73 73 5f 61 74 74 72 5f 69 64 or (sess_attr_id
230a0 78 20 3d 20 30 3b 20 73 65 73 73 5f 61 74 74 72 x = 0; sess_attr
230b0 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74 79 2d _idx < identity-
230c0 3e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e >attributes_coun
230d0 74 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 t; sess_attr_idx
230e0 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28 69 64 65 ++) {....if (ide
230f0 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65 ntity->attribute
23100 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d s[sess_attr_idx]
23110 2e 74 79 70 65 20 3d 3d 20 63 75 72 72 5f 61 74 .type == curr_at
23120 74 72 2d 3e 74 79 70 65 29 20 7b 0a 09 09 09 09 tr->type) {.....
23130 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
23140 4e 54 46 28 22 20 2e 2e 2e 20 66 6f 75 6e 64 20 NTF(" ... found
23150 69 74 2c 20 70 56 61 6c 75 65 20 3d 20 25 70 2c it, pValue = %p,
23160 20 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 25 6c ulValueLen = %l
23170 75 22 2c 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 u", identity->at
23180 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 tributes[sess_at
23190 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 tr_idx].pValue,
231a0 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 identity->attrib
231b0 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 utes[sess_attr_i
231c0 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b dx].ulValueLen);
231d0 0a 09 09 09 09 0a 09 09 09 09 70 56 61 6c 75 65 ..........pValue
231e0 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 = identity->att
231f0 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 ributes[sess_att
23200 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 3b 0a 09 r_idx].pValue;..
23210 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 ...ulValueLen =
23220 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 identity->attrib
23230 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 utes[sess_attr_i
23240 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a dx].ulValueLen;.
23250 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 ...}...}....if (
23260 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 curr_attr->pValu
23270 65 20 26 26 20 70 56 61 6c 75 65 29 20 7b 0a 09 e && pValue) {..
23280 09 09 69 66 20 28 63 75 72 72 5f 61 74 74 72 2d ..if (curr_attr-
23290 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d 20 75 >ulValueLen >= u
232a0 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09 09 lValueLen) {....
232b0 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61 74 74 .memcpy(curr_att
232c0 72 2d 3e 70 56 61 6c 75 65 2c 20 70 56 61 6c 75 r->pValue, pValu
232d0 65 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a e, ulValueLen);.
232e0 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 ...} else {.....
232f0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b ulValueLen = (CK
23300 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 09 09 _LONG) -1;......
23310 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 retval = CKR_BUF
23320 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 FER_TOO_SMALL;..
23330 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 75 72 72 5f ..}...}....curr_
23340 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e attr->ulValueLen
23350 20 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 = ulValueLen;..
23360 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c }...mutex_retval
23370 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f = cackey_mutex_
23380 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 unlock(cackey_bi
23390 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 glock);..if (mut
233a0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 ex_retval != 0)
233b0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
233c0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
233d0 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 Unlocking faile
233e0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
233f0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f CKR_GENERAL_ERRO
23400 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65 74 R);..}...if (ret
23410 76 61 6c 20 3d 3d 20 43 4b 52 5f 41 54 54 52 49 val == CKR_ATTRI
23420 42 55 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49 BUTE_TYPE_INVALI
23430 44 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 D) {...CACKEY_DE
23440 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
23450 72 6e 69 6e 67 20 43 4b 52 5f 41 54 54 52 49 42 rning CKR_ATTRIB
23460 55 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 UTE_TYPE_INVALID
23470 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20 72 65 (%i)", (int) re
23480 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 69 tval);..} else i
23490 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52 f (retval == CKR
234a0 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c _BUFFER_TOO_SMAL
234b0 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 L) {...CACKEY_DE
234c0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
234d0 72 6e 69 6e 67 20 43 4b 52 5f 42 55 46 46 45 52 rning CKR_BUFFER
234e0 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28 25 69 29 22 _TOO_SMALL (%i)"
234f0 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b , (int) retval);
23500 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74 ..} else if (ret
23510 76 61 6c 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20 7b val == CKR_OK) {
23520 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
23530 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e PRINTF("Returnin
23540 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 g CKR_OK (%i)",
23550 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 (int) retval);..
23560 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b 45 } else {...CACKE
23570 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
23580 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 28 Returning %i", (
23590 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d int) retval);..}
235a0 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c ...return(retval
235b0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f );.}..CK_DEFINE_
235c0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 FUNCTION(CK_RV,
235d0 43 5f 53 65 74 41 74 74 72 69 62 75 74 65 56 61 C_SetAttributeVa
235e0 6c 75 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f lue)(CK_SESSION_
235f0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c HANDLE hSession,
23600 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c CK_OBJECT_HANDL
23610 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54 E hObject, CK_AT
23620 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d TRIBUTE_PTR pTem
23630 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 plate, CK_ULONG
23640 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41 43 4b ulCount) {..CACK
23650 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
23660 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 "Called.");...if
23670 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 (!cackey_initia
23680 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 lized) {...CACKE
23690 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
236a0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 Error. Not init
236b0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 ialized.");....r
236c0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f eturn(CKR_CRYPTO
236d0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a KI_NOT_INITIALIZ
236e0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 ED);..}...CACKEY
236f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
23700 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e eturning CKR_FUN
23710 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
23720 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 TED (%i)", CKR_F
23730 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
23740 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e ORTED);...return
23750 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f (CKR_FUNCTION_NO
23760 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a T_SUPPORTED);.}.
23770 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 .CK_DEFINE_FUNCT
23780 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e ION(CK_RV, C_Fin
23790 64 4f 62 6a 65 63 74 73 49 6e 69 74 29 28 43 4b dObjectsInit)(CK
237a0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 _SESSION_HANDLE
237b0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 41 54 54 hSession, CK_ATT
237c0 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 RIBUTE_PTR pTemp
237d0 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 late, CK_ULONG u
237e0 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 53 4c lCount) {..CK_SL
237f0 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 43 OT_ID slotID;..C
23800 4b 5f 55 4c 4f 4e 47 20 69 64 78 3b 0a 09 69 6e K_ULONG idx;..in
23810 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a t mutex_retval;.
23820 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
23830 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
23840 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f ;...if (!cackey_
23850 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 initialized) {..
23860 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
23870 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f INTF("Error. No
23880 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 t initialized.")
23890 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
238a0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 CRYPTOKI_NOT_INI
238b0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 TIALIZED);..}...
238c0 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 if (hSession ==
238d0 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 0 || hSession >=
238e0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f (sizeof(cackey_
238f0 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 sessions) / size
23900 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f of(cackey_sessio
23910 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 ns[0]))) {...CAC
23920 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
23930 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f ("Error. Sessio
23940 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 n out of range."
23950 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 );......return(C
23960 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c KR_SESSION_HANDL
23970 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a E_INVALID);..}..
23980 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 .mutex_retval =
23990 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 cackey_mutex_loc
239a0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
239b0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 );..if (mutex_re
239c0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 tval != 0) {...C
239d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
239e0 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b TF("Error. Lock
239f0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a ing failed.");..
23a00 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e ..return(CKR_GEN
23a10 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a ERAL_ERROR);..}.
23a20 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 ..if (!cackey_se
23a30 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
23a40 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 .active) {...cac
23a50 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b key_mutex_unlock
23a60 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 (cackey_biglock)
23a70 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 ;....CACKEY_DEBU
23a80 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
23a90 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 Session not ac
23aa0 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 tive.");......re
23ab0 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e turn(CKR_SESSION
23ac0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 _HANDLE_INVALID)
23ad0 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 ;..}...if (cacke
23ae0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
23af0 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 ion].search_acti
23b00 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d ve) {...cackey_m
23b10 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b utex_unlock(cack
23b20 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 ey_biglock);....
23b30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
23b40 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 NTF("Error. Sea
23b50 72 63 68 20 61 6c 72 65 61 64 79 20 61 63 74 69 rch already acti
23b60 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 ve.");......retu
23b70 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e rn(CKR_OPERATION
23b80 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 73 _ACTIVE);..}...s
23b90 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 lotID = cackey_s
23ba0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
23bb0 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 ].slotID;...if (
23bc0 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c slotID < 0 || sl
23bd0 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 otID >= (sizeof(
23be0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 cackey_slots) /
23bf0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c sizeof(cackey_sl
23c00 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 ots[0]))) {...CA
23c10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
23c20 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 F("Error. Invali
23c30 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 d slot requested
23c40 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 (%lu), outside
23c50 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c of valid range",
23c60 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 slotID);....ret
23c70 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f urn(CKR_GENERAL_
23c80 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 ERROR);..}...if
23c90 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c (cackey_slots[sl
23ca0 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 otID].active ==
23cb0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 0) {...CACKEY_DE
23cc0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
23cd0 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 r. Invalid slot
23ce0 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c requested (%lu),
23cf0 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e slot not curren
23d00 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f tly active", slo
23d10 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f tID);....cackey_
23d20 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 mutex_unlock(cac
23d30 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 key_biglock);...
23d40 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 .return(CKR_GENE
23d50 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a RAL_ERROR);..}..
23d60 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 .if (cackey_slot
23d70 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72 s[slotID].slot_r
23d80 65 73 65 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 eset) {...CACKEY
23d90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 _DEBUG_PRINTF("T
23da0 68 65 20 73 6c 6f 74 20 68 61 73 20 62 65 65 6e he slot has been
23db0 20 72 65 73 65 74 20 73 69 6e 63 65 20 77 65 20 reset since we
23dc0 6c 61 73 74 20 6c 6f 6f 6b 65 64 20 66 6f 72 20 last looked for
23dd0 69 64 65 6e 74 69 74 69 65 73 20 2d 2d 20 72 65 identities -- re
23de0 73 63 61 6e 6e 69 6e 67 22 29 3b 0a 0a 09 09 69 scanning");....i
23df0 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f f (cackey_sessio
23e00 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 ns[hSession].ide
23e10 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 ntities != NULL)
23e20 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65 {....cackey_fre
23e30 65 5f 69 64 65 6e 74 69 74 69 65 73 28 63 61 63 e_identities(cac
23e40 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
23e50 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 ssion].identitie
23e60 73 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f s, cackey_sessio
23e70 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 ns[hSession].ide
23e80 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a ntities_count);.
23e90 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 ....cackey_sessi
23ea0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 ons[hSession].id
23eb0 65 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c 4c 3b entities = NULL;
23ec0 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 ....cackey_sessi
23ed0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 ons[hSession].id
23ee0 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d entities_count =
23ef0 20 30 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 0;...}....if (c
23f00 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 ackey_slots[slot
23f10 49 44 5d 2e 6c 61 62 65 6c 20 21 3d 20 4e 55 4c ID].label != NUL
23f20 4c 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63 L) {....free(cac
23f30 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 key_slots[slotID
23f40 5d 2e 6c 61 62 65 6c 29 3b 0a 09 09 09 63 61 63 ].label);....cac
23f50 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 key_slots[slotID
23f60 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a ].label = NULL;.
23f70 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 61 ..}....cackey_ma
23f80 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 26 63 rk_slot_reset(&c
23f90 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 ackey_slots[slot
23fa0 49 44 5d 29 3b 0a 09 09 63 61 63 6b 65 79 5f 73 ID]);...cackey_s
23fb0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c 6f lots[slotID].slo
23fc0 74 5f 72 65 73 65 74 20 3d 20 30 3b 0a 09 7d 0a t_reset = 0;..}.
23fd0 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 ..if (cackey_ses
23fe0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
23ff0 69 64 65 6e 74 69 74 69 65 73 20 3d 3d 20 4e 55 identities == NU
24000 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 LL) {...cackey_s
24010 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
24020 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63 ].identities = c
24030 61 63 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e 74 ackey_read_ident
24040 69 74 69 65 73 28 26 63 61 63 6b 65 79 5f 73 6c ities(&cackey_sl
24050 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 26 63 61 ots[slotID], &ca
24060 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
24070 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 ession].identiti
24080 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 7d 0a 0a 09 es_count);..}...
24090 69 66 20 28 70 54 65 6d 70 6c 61 74 65 20 21 3d if (pTemplate !=
240a0 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28 75 NULL) {...if (u
240b0 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09 lCount != 0) {..
240c0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e ..cackey_session
240d0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 s[hSession].sear
240e0 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d ch_query_count =
240f0 20 75 6c 43 6f 75 6e 74 3b 0a 09 09 09 63 61 63 ulCount;....cac
24100 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
24110 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 ssion].search_qu
24120 65 72 79 20 3d 20 6d 61 6c 6c 6f 63 28 75 6c 43 ery = malloc(ulC
24130 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70 ount * sizeof(*p
24140 54 65 6d 70 6c 61 74 65 29 29 3b 0a 0a 09 09 09 Template));.....
24150 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 65 memcpy(cackey_se
24160 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
24170 2e 73 65 61 72 63 68 5f 71 75 65 72 79 2c 20 70 .search_query, p
24180 54 65 6d 70 6c 61 74 65 2c 20 75 6c 43 6f 75 6e Template, ulCoun
24190 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70 54 65 6d t * sizeof(*pTem
241a0 70 6c 61 74 65 29 29 3b 0a 09 09 09 66 6f 72 20 plate));....for
241b0 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 (idx = 0; idx <
241c0 75 6c 43 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20 ulCount; idx++)
241d0 7b 0a 09 09 09 09 69 66 20 28 70 54 65 6d 70 6c {.....if (pTempl
241e0 61 74 65 5b 69 64 78 5d 2e 75 6c 56 61 6c 75 65 ate[idx].ulValue
241f0 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 Len == 0) {.....
24200 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 .cackey_sessions
24210 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 [hSession].searc
24220 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 h_query[idx].pVa
24230 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 lue = NULL;.....
24240 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 09 ..continue;.....
24250 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 65 }......cackey_se
24260 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
24270 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64 .search_query[id
24280 78 5d 2e 70 56 61 6c 75 65 20 3d 20 6d 61 6c 6c x].pValue = mall
24290 6f 63 28 70 54 65 6d 70 6c 61 74 65 5b 69 64 78 oc(pTemplate[idx
242a0 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a ].ulValueLen);..
242b0 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 ....if (cackey_s
242c0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
242d0 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69 ].search_query[i
242e0 64 78 5d 2e 70 56 61 6c 75 65 29 20 7b 0a 09 09 dx].pValue) {...
242f0 09 09 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 ...memcpy(cackey
24300 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
24310 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 on].search_query
24320 5b 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 70 54 [idx].pValue, pT
24330 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 70 56 61 emplate[idx].pVa
24340 6c 75 65 2c 20 70 54 65 6d 70 6c 61 74 65 5b 69 lue, pTemplate[i
24350 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b dx].ulValueLen);
24360 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 09 09 7d 20 .....}....}...}
24370 65 6c 73 65 20 7b 0a 09 09 09 63 61 63 6b 65 79 else {....cackey
24380 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
24390 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 on].search_query
243a0 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 09 63 _count = 0;....c
243b0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
243c0 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f Session].search_
243d0 71 75 65 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 query = NULL;...
243e0 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 }..} else {...if
243f0 20 28 75 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20 (ulCount != 0)
24400 7b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 {....cackey_mute
24410 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
24420 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43 41 biglock);.....CA
24430 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
24440 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 F("Error. Searc
24450 68 20 71 75 65 72 79 20 73 70 65 63 69 66 69 65 h query specifie
24460 64 20 61 73 20 4e 55 4c 4c 2c 20 62 75 74 20 6e d as NULL, but n
24470 75 6d 62 65 72 20 6f 66 20 71 75 65 72 79 20 74 umber of query t
24480 65 72 6d 73 20 6e 6f 74 20 73 70 65 63 69 66 69 erms not specifi
24490 65 64 20 61 73 20 30 2e 22 29 3b 0a 0a 09 09 09 ed as 0.");.....
244a0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d return(CKR_ARGUM
244b0 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09 7d 0a 0a ENTS_BAD);...}..
244c0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e ..cackey_session
244d0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 s[hSession].sear
244e0 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d ch_query_count =
244f0 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 0;...cackey_ses
24500 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
24510 73 65 61 72 63 68 5f 71 75 65 72 79 20 3d 20 4e search_query = N
24520 55 4c 4c 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 ULL;..}...cackey
24530 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
24540 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 on].search_activ
24550 65 20 3d 20 31 3b 0a 09 63 61 63 6b 65 79 5f 73 e = 1;..cackey_s
24560 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
24570 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64 ].search_curr_id
24580 20 3d 20 30 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 = 0;...mutex_re
24590 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 tval = cackey_mu
245a0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 tex_unlock(cacke
245b0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 y_biglock);..if
245c0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d (mutex_retval !=
245d0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 0) {...CACKEY_D
245e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
245f0 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 or. Unlocking f
24600 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 ailed.");....ret
24610 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f urn(CKR_GENERAL_
24620 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 ERROR);..}...CAC
24630 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
24640 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f ("Returning CKR_
24650 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b OK (%i)", CKR_OK
24660 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f );...return(CKR_
24670 4f 4b 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 OK);.}..static i
24680 6e 74 20 63 61 63 6b 65 79 5f 70 6b 63 73 31 31 nt cackey_pkcs11
24690 5f 63 6f 6d 70 61 72 65 5f 61 74 74 72 69 62 75 _compare_attribu
246a0 74 65 73 28 43 4b 5f 41 54 54 52 49 42 55 54 45 tes(CK_ATTRIBUTE
246b0 20 2a 61 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 *a, CK_ATTRIBUT
246c0 45 20 2a 62 29 20 7b 0a 09 75 6e 73 69 67 6e 65 E *b) {..unsigne
246d0 64 20 63 68 61 72 20 2a 73 6d 61 6c 6c 62 75 66 d char *smallbuf
246e0 2c 20 2a 6c 61 72 67 65 62 75 66 3b 0a 09 73 69 , *largebuf;..si
246f0 7a 65 5f 74 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 ze_t smallbuf_le
24700 6e 2c 20 6c 61 72 67 65 62 75 66 5f 6c 65 6e 3b n, largebuf_len;
24710 0a 0a 09 69 66 20 28 61 2d 3e 74 79 70 65 20 21 ...if (a->type !
24720 3d 20 62 2d 3e 74 79 70 65 29 20 7b 0a 09 09 72 = b->type) {...r
24730 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 09 43 eturn(0);..}...C
24740 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
24750 54 46 28 22 20 20 20 20 2e 2e 2e 20 66 6f 75 6e TF(" ... foun
24760 64 20 6d 61 74 63 68 69 6e 67 20 74 79 70 65 20 d matching type
24770 2e 2e 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f ...");...CACKEY_
24780 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 DEBUG_PRINTBUF("
24790 20 20 20 20 2e 2e 2e 20 6f 75 72 20 76 61 6c 75 ... our valu
247a0 65 3a 22 2c 20 61 2d 3e 70 56 61 6c 75 65 2c 20 e:", a->pValue,
247b0 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a a->ulValueLen);.
247c0 0a 09 69 66 20 28 62 2d 3e 70 56 61 6c 75 65 20 ..if (b->pValue
247d0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 == NULL) {...CAC
247e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
247f0 28 22 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75 (" ... fou
24800 6e 64 20 77 69 6c 64 63 61 72 64 20 6d 61 74 63 nd wildcard matc
24810 68 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31 h");....return(1
24820 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 61 2d 3e 70 );..}...if (a->p
24830 56 61 6c 75 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b Value == NULL) {
24840 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d ...return(0);..}
24850 0a 0a 20 09 69 66 20 28 62 2d 3e 75 6c 56 61 6c .. .if (b->ulVal
24860 75 65 4c 65 6e 20 3d 3d 20 61 2d 3e 75 6c 56 61 ueLen == a->ulVa
24870 6c 75 65 4c 65 6e 20 26 26 20 6d 65 6d 63 6d 70 lueLen && memcmp
24880 28 61 2d 3e 70 56 61 6c 75 65 2c 20 62 2d 3e 70 (a->pValue, b->p
24890 56 61 6c 75 65 2c 20 62 2d 3e 75 6c 56 61 6c 75 Value, b->ulValu
248a0 65 4c 65 6e 29 20 3d 3d 20 30 29 20 7b 0a 09 09 eLen) == 0) {...
248b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
248c0 4e 54 46 28 22 20 20 20 20 20 20 20 2e 2e 2e 20 NTF(" ...
248d0 66 6f 75 6e 64 20 65 78 61 63 74 20 6d 61 74 63 found exact matc
248e0 68 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31 h");....return(1
248f0 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 );..}...switch (
24900 61 2d 3e 74 79 70 65 29 20 7b 0a 09 09 63 61 73 a->type) {...cas
24910 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09 e CKA_MODULUS:..
24920 09 09 69 66 20 28 61 2d 3e 75 6c 56 61 6c 75 65 ..if (a->ulValue
24930 4c 65 6e 20 3d 3d 20 62 2d 3e 75 6c 56 61 6c 75 Len == b->ulValu
24940 65 4c 65 6e 29 20 7b 0a 09 09 09 09 62 72 65 61 eLen) {.....brea
24950 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 k;....}.....if (
24960 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 20 a->ulValueLen >
24970 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b b->ulValueLen) {
24980 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66 20 3d 20 .....smallbuf =
24990 62 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09 73 b->pValue;.....s
249a0 6d 61 6c 6c 62 75 66 5f 6c 65 6e 20 3d 20 62 2d mallbuf_len = b-
249b0 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09 >ulValueLen;....
249c0 09 09 6c 61 72 67 65 62 75 66 20 3d 20 61 2d 3e ..largebuf = a->
249d0 70 56 61 6c 75 65 3b 0a 09 09 09 09 6c 61 72 67 pValue;.....larg
249e0 65 62 75 66 5f 6c 65 6e 20 3d 20 61 2d 3e 75 6c ebuf_len = a->ul
249f0 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d 20 65 ValueLen;....} e
24a00 6c 73 65 20 7b 0a 09 09 09 09 73 6d 61 6c 6c 62 lse {.....smallb
24a10 75 66 20 3d 20 61 2d 3e 70 56 61 6c 75 65 3b 0a uf = a->pValue;.
24a20 09 09 09 09 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e ....smallbuf_len
24a30 20 3d 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e = a->ulValueLen
24a40 3b 0a 0a 09 09 09 09 6c 61 72 67 65 62 75 66 20 ;......largebuf
24a50 3d 20 62 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09 = b->pValue;....
24a60 09 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20 3d 20 .largebuf_len =
24a70 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 b->ulValueLen;..
24a80 09 09 7d 0a 0a 09 09 09 66 6f 72 20 28 3b 20 6c ..}.....for (; l
24a90 61 72 67 65 62 75 66 5f 6c 65 6e 20 21 3d 20 73 argebuf_len != s
24aa0 6d 61 6c 6c 62 75 66 5f 6c 65 6e 3b 20 6c 61 72 mallbuf_len; lar
24ab0 67 65 62 75 66 2b 2b 2c 6c 61 72 67 65 62 75 66 gebuf++,largebuf
24ac0 5f 6c 65 6e 2d 2d 29 20 7b 0a 09 09 09 09 69 66 _len--) {.....if
24ad0 20 28 6c 61 72 67 65 62 75 66 5b 30 5d 20 21 3d (largebuf[0] !=
24ae0 20 30 29 20 7b 0a 09 09 09 09 09 62 72 65 61 6b 0) {......break
24af0 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 ;.....}....}....
24b00 09 69 66 20 28 6c 61 72 67 65 62 75 66 5f 6c 65 .if (largebuf_le
24b10 6e 20 21 3d 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 n != smallbuf_le
24b20 6e 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a n) {.....break;.
24b30 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 6d 65 6d ...}.....if (mem
24b40 63 6d 70 28 6c 61 72 67 65 62 75 66 2c 20 73 6d cmp(largebuf, sm
24b50 61 6c 6c 62 75 66 2c 20 73 6d 61 6c 6c 62 75 66 allbuf, smallbuf
24b60 5f 6c 65 6e 29 20 3d 3d 20 30 29 20 7b 0a 09 09 _len) == 0) {...
24b70 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
24b80 52 49 4e 54 46 28 22 20 20 20 20 20 20 20 2e 2e RINTF(" ..
24b90 2e 20 66 6f 75 6e 64 20 61 70 70 72 6f 78 69 6d . found approxim
24ba0 61 74 65 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09 ate match");....
24bb0 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 09 09 ..return(1);....
24bc0 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a }.....break;..}.
24bd0 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a ..return(0);.}..
24be0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 CK_DEFINE_FUNCTI
24bf0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 ON(CK_RV, C_Find
24c00 4f 62 6a 65 63 74 73 29 28 43 4b 5f 53 45 53 53 Objects)(CK_SESS
24c10 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 ION_HANDLE hSess
24c20 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 ion, CK_OBJECT_H
24c30 41 4e 44 4c 45 5f 50 54 52 20 70 68 4f 62 6a 65 ANDLE_PTR phObje
24c40 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4d ct, CK_ULONG ulM
24c50 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 2c 20 43 axObjectCount, C
24c60 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4f K_ULONG_PTR pulO
24c70 62 6a 65 63 74 43 6f 75 6e 74 29 20 7b 0a 09 73 bjectCount) {..s
24c80 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 truct cackey_ide
24c90 6e 74 69 74 79 20 2a 63 75 72 72 5f 69 64 3b 0a ntity *curr_id;.
24ca0 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 63 .CK_ATTRIBUTE *c
24cb0 75 72 72 5f 61 74 74 72 3b 0a 09 43 4b 5f 55 4c urr_attr;..CK_UL
24cc0 4f 4e 47 20 63 75 72 72 5f 69 64 5f 69 64 78 2c ONG curr_id_idx,
24cd0 20 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 curr_out_id_idx
24ce0 2c 20 63 75 72 72 5f 61 74 74 72 5f 69 64 78 2c , curr_attr_idx,
24cf0 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 3b 0a sess_attr_idx;.
24d00 09 43 4b 5f 55 4c 4f 4e 47 20 6d 61 74 63 68 65 .CK_ULONG matche
24d10 64 5f 63 6f 75 6e 74 2c 20 70 72 65 76 5f 6d 61 d_count, prev_ma
24d20 74 63 68 65 64 5f 63 6f 75 6e 74 3b 0a 09 69 6e tched_count;..in
24d30 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a t mutex_retval;.
24d40 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45 #ifdef CACKEY_DE
24d50 42 55 47 5f 53 45 41 52 43 48 5f 53 50 45 45 44 BUG_SEARCH_SPEED
24d60 54 45 53 54 0a 09 73 74 72 75 63 74 20 74 69 6d TEST..struct tim
24d70 65 76 61 6c 20 73 74 61 72 74 2c 20 65 6e 64 3b eval start, end;
24d80 0a 09 75 69 6e 74 36 34 5f 74 20 73 74 61 72 74 ..uint64_t start
24d90 5f 69 6e 74 2c 20 65 6e 64 5f 69 6e 74 3b 0a 23 _int, end_int;.#
24da0 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 endif...CACKEY_D
24db0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
24dc0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 led.");...if (!c
24dd0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 ackey_initialize
24de0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 d) {...CACKEY_DE
24df0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
24e00 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 r. Not initiali
24e10 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 zed.");....retur
24e20 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e n(CKR_CRYPTOKI_N
24e30 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b OT_INITIALIZED);
24e40 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 4f 62 6a ..}...if (pulObj
24e50 65 63 74 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c ectCount == NULL
24e60 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
24e70 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
24e80 2e 20 20 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e . pulObjectCoun
24e90 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 t is NULL.");...
24ea0 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 .return(CKR_ARGU
24eb0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a MENTS_BAD);..}..
24ec0 09 69 66 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d .if (phObject ==
24ed0 20 4e 55 4c 4c 20 26 26 20 75 6c 4d 61 78 4f 62 NULL && ulMaxOb
24ee0 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20 30 29 20 jectCount == 0)
24ef0 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 {.../* Short cir
24f00 63 75 69 74 2c 20 69 66 20 7a 65 72 6f 20 6f 62 cuit, if zero ob
24f10 6a 65 63 74 73 20 77 65 72 65 20 73 70 65 63 69 jects were speci
24f20 66 69 65 64 20 72 65 74 75 72 6e 20 7a 65 72 6f fied return zero
24f30 20 69 74 65 6d 73 20 69 6d 6d 65 64 69 61 74 65 items immediate
24f40 6c 79 20 2a 2f 0a 09 09 2a 70 75 6c 4f 62 6a 65 ly */...*pulObje
24f50 63 74 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 ctCount = 0;....
24f60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
24f70 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 NTF("Returning C
24f80 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 KR_OK (%i) (shor
24f90 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 t circuit)", CKR
24fa0 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 _OK);....return(
24fb0 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 CKR_OK);..}...if
24fc0 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55 (phObject == NU
24fd0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 LL) {...CACKEY_D
24fe0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
24ff0 6f 72 2e 20 20 70 68 4f 62 6a 65 63 74 20 69 73 or. phObject is
25000 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 NULL.");....ret
25010 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 urn(CKR_ARGUMENT
25020 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 S_BAD);..}...if
25030 28 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e (ulMaxObjectCoun
25040 74 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b t == 0) {...CACK
25050 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
25060 22 45 72 72 6f 72 2e 20 20 4d 61 78 69 6d 75 6d "Error. Maximum
25070 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 number of objec
25080 74 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20 ts specified as
25090 7a 65 72 6f 2e 22 29 3b 0a 0a 09 09 72 65 74 75 zero.");....retu
250a0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 rn(CKR_ARGUMENTS
250b0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 _BAD);..}...if (
250c0 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c hSession == 0 ||
250d0 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 hSession >= (si
250e0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 zeof(cackey_sess
250f0 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 ions) / sizeof(c
25100 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 ackey_sessions[0
25110 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f ]))) {...CACKEY_
25120 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
25130 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 ror. Session ou
25140 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 t of range.");..
25150 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 ....return(CKR_S
25160 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e ESSION_HANDLE_IN
25170 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 VALID);..}...mut
25180 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b ex_retval = cack
25190 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 ey_mutex_lock(ca
251a0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 ckey_biglock);..
251b0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c if (mutex_retval
251c0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 != 0) {...CACKE
251d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
251e0 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 Error. Locking
251f0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 failed.");....re
25200 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c turn(CKR_GENERAL
25210 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 _ERROR);..}...if
25220 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f (!cackey_sessio
25230 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 ns[hSession].act
25240 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f ive) {...cackey_
25250 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 mutex_unlock(cac
25260 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 key_biglock);...
25270 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
25280 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 INTF("Error. Se
25290 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 ssion not active
252a0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e .");......return
252b0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e (CKR_SESSION_HAN
252c0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d DLE_INVALID);..}
252d0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 ...if (!cackey_s
252e0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
252f0 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 29 ].search_active)
25300 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 {...cackey_mute
25310 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
25320 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 biglock);....CAC
25330 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
25340 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 ("Error. Search
25350 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a not active.");.
25360 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f .....return(CKR_
25370 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e OPERATION_NOT_IN
25380 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
25390 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45 #ifdef CACKEY_DE
253a0 42 55 47 5f 53 45 41 52 43 48 5f 53 50 45 45 44 BUG_SEARCH_SPEED
253b0 54 45 53 54 0a 09 67 65 74 74 69 6d 65 6f 66 64 TEST..gettimeofd
253c0 61 79 28 26 73 74 61 72 74 2c 20 4e 55 4c 4c 29 ay(&start, NULL)
253d0 3b 0a 23 65 6e 64 69 66 0a 0a 09 63 75 72 72 5f ;.#endif...curr_
253e0 6f 75 74 5f 69 64 5f 69 64 78 20 3d 20 30 3b 0a out_id_idx = 0;.
253f0 09 66 6f 72 20 28 63 75 72 72 5f 69 64 5f 69 64 .for (curr_id_id
25400 78 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 x = cackey_sessi
25410 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 ons[hSession].se
25420 61 72 63 68 5f 63 75 72 72 5f 69 64 3b 20 63 75 arch_curr_id; cu
25430 72 72 5f 69 64 5f 69 64 78 20 3c 20 63 61 63 6b rr_id_idx < cack
25440 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
25450 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 sion].identities
25460 5f 63 6f 75 6e 74 20 26 26 20 75 6c 4d 61 78 4f _count && ulMaxO
25470 62 6a 65 63 74 43 6f 75 6e 74 3b 20 63 75 72 72 bjectCount; curr
25480 5f 69 64 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 63 _id_idx++) {...c
25490 75 72 72 5f 69 64 20 3d 20 26 63 61 63 6b 65 79 urr_id = &cackey
254a0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
254b0 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 63 on].identities[c
254c0 75 72 72 5f 69 64 5f 69 64 78 5d 3b 0a 0a 09 09 urr_id_idx];....
254d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
254e0 4e 54 46 28 22 50 72 6f 63 65 73 73 69 6e 67 20 NTF("Processing
254f0 69 64 65 6e 74 69 74 79 3a 25 6c 75 22 2c 20 28 identity:%lu", (
25500 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 unsigned long) c
25510 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a 0a 09 09 urr_id_idx);....
25520 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 20 matched_count =
25530 30 3b 0a 0a 09 09 66 6f 72 20 28 63 75 72 72 5f 0;....for (curr_
25540 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 63 75 attr_idx = 0; cu
25550 72 72 5f 61 74 74 72 5f 69 64 78 20 3c 20 63 61 rr_attr_idx < ca
25560 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
25570 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 ession].search_q
25580 75 65 72 79 5f 63 6f 75 6e 74 3b 20 63 75 72 72 uery_count; curr
25590 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 _attr_idx++) {..
255a0 09 09 70 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 ..prev_matched_c
255b0 6f 75 6e 74 20 3d 20 6d 61 74 63 68 65 64 5f 63 ount = matched_c
255c0 6f 75 6e 74 3b 0a 0a 09 09 09 63 75 72 72 5f 61 ount;.....curr_a
255d0 74 74 72 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 ttr = &cackey_se
255e0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
255f0 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 63 75 .search_query[cu
25600 72 72 5f 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 rr_attr_idx];...
25610 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
25620 52 49 4e 54 46 28 22 20 20 43 68 65 63 6b 69 6e RINTF(" Checkin
25630 67 20 66 6f 72 20 61 74 74 72 69 62 75 74 65 20 g for attribute
25640 25 73 20 28 30 78 25 30 38 6c 78 29 20 69 6e 20 %s (0x%08lx) in
25650 69 64 65 6e 74 69 74 79 3a 25 69 2e 2e 2e 22 2c identity:%i...",
25660 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 CACKEY_DEBUG_FU
25670 4e 43 5f 41 54 54 52 49 42 55 54 45 5f 54 4f 5f NC_ATTRIBUTE_TO_
25680 53 54 52 28 63 75 72 72 5f 61 74 74 72 2d 3e 74 STR(curr_attr->t
25690 79 70 65 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 ype), (unsigned
256a0 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 2d long) curr_attr-
256b0 3e 74 79 70 65 2c 20 28 69 6e 74 29 20 63 75 72 >type, (int) cur
256c0 72 5f 69 64 5f 69 64 78 29 3b 0a 09 09 09 43 41 r_id_idx);....CA
256d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
256e0 42 55 46 28 22 20 20 20 20 56 61 6c 75 65 20 6c BUF(" Value l
256f0 6f 6f 6b 69 6e 67 20 66 6f 72 3a 22 2c 20 63 75 ooking for:", cu
25700 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c rr_attr->pValue,
25710 20 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61 curr_attr->ulVa
25720 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 66 6f 72 lueLen);.....for
25730 20 28 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20 (sess_attr_idx
25740 3d 20 30 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 = 0; sess_attr_i
25750 64 78 20 3c 20 63 75 72 72 5f 69 64 2d 3e 61 74 dx < curr_id->at
25760 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 tributes_count;
25770 73 65 73 73 5f 61 74 74 72 5f 69 64 78 2b 2b 29 sess_attr_idx++)
25780 20 7b 0a 09 09 09 09 69 66 20 28 63 61 63 6b 65 {.....if (cacke
25790 79 5f 70 6b 63 73 31 31 5f 63 6f 6d 70 61 72 65 y_pkcs11_compare
257a0 5f 61 74 74 72 69 62 75 74 65 73 28 26 63 75 72 _attributes(&cur
257b0 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73 r_id->attributes
257c0 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2c [sess_attr_idx],
257d0 20 63 75 72 72 5f 61 74 74 72 29 29 20 7b 0a 09 curr_attr)) {..
257e0 09 09 09 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e ....matched_coun
257f0 74 2b 2b 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b t++;.......break
25800 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 ;.....}....}....
25810 09 2f 2a 20 49 66 20 74 68 65 20 61 74 74 72 69 ./* If the attri
25820 62 75 74 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 bute could not b
25830 65 20 6d 61 74 63 68 65 64 2c 20 64 6f 20 6e 6f e matched, do no
25840 74 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20 61 t try to match a
25850 64 64 69 74 69 6f 6e 61 6c 20 61 74 74 72 69 62 dditional attrib
25860 75 74 65 73 20 2a 2f 0a 09 09 09 69 66 20 28 70 utes */....if (p
25870 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e rev_matched_coun
25880 74 20 3d 3d 20 6d 61 74 63 68 65 64 5f 63 6f 75 t == matched_cou
25890 6e 74 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b nt) {.....break;
258a0 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 ....}...}....if
258b0 28 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d (matched_count =
258c0 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e = cackey_session
258d0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 s[hSession].sear
258e0 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 29 20 ch_query_count)
258f0 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {....CACKEY_DEBU
25900 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 G_PRINTF(" ...
25910 41 6c 6c 20 25 69 20 61 74 74 72 69 62 75 74 65 All %i attribute
25920 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 66 6f s checked for fo
25930 75 6e 64 2c 20 61 64 64 69 6e 67 20 69 64 65 6e und, adding iden
25940 74 69 74 79 3a 25 69 20 74 6f 20 72 65 74 75 72 tity:%i to retur
25950 6e 65 64 20 6c 69 73 74 22 2c 20 28 69 6e 74 29 ned list", (int)
25960 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 cackey_sessions
25970 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 [hSession].searc
25980 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 2c 20 28 h_query_count, (
25990 69 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64 78 int) curr_id_idx
259a0 29 3b 0a 0a 09 09 09 70 68 4f 62 6a 65 63 74 5b );.....phObject[
259b0 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 5d curr_out_id_idx]
259c0 20 3d 20 63 75 72 72 5f 69 64 5f 69 64 78 20 2b = curr_id_idx +
259d0 20 31 3b 0a 0a 09 09 09 75 6c 4d 61 78 4f 62 6a 1;.....ulMaxObj
259e0 65 63 74 43 6f 75 6e 74 2d 2d 3b 0a 0a 09 09 09 ectCount--;.....
259f0 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 2b curr_out_id_idx+
25a00 2b 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 +;...} else {...
25a10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
25a20 49 4e 54 46 28 22 20 20 2e 2e 2e 20 4e 6f 74 20 INTF(" ... Not
25a30 61 6c 6c 20 25 69 20 28 6f 6e 6c 79 20 66 6f 75 all %i (only fou
25a40 6e 64 20 25 69 29 20 61 74 74 72 69 62 75 74 65 nd %i) attribute
25a50 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 66 6f s checked for fo
25a60 75 6e 64 2c 20 6e 6f 74 20 61 64 64 69 6e 67 20 und, not adding
25a70 69 64 65 6e 74 69 74 79 3a 25 69 22 2c 20 28 69 identity:%i", (i
25a80 6e 74 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69 nt) cackey_sessi
25a90 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 ons[hSession].se
25aa0 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 arch_query_count
25ab0 2c 20 28 69 6e 74 29 20 6d 61 74 63 68 65 64 5f , (int) matched_
25ac0 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63 75 72 count, (int) cur
25ad0 72 5f 69 64 5f 69 64 78 29 3b 0a 09 09 7d 0a 09 r_id_idx);...}..
25ae0 7d 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f }..cackey_sessio
25af0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 ns[hSession].sea
25b00 72 63 68 5f 63 75 72 72 5f 69 64 20 3d 20 63 75 rch_curr_id = cu
25b10 72 72 5f 69 64 5f 69 64 78 3b 0a 09 2a 70 75 6c rr_id_idx;..*pul
25b20 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 20 63 75 ObjectCount = cu
25b30 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 3b 0a 0a rr_out_id_idx;..
25b40 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45 #ifdef CACKEY_DE
25b50 42 55 47 5f 53 45 41 52 43 48 5f 53 50 45 45 44 BUG_SEARCH_SPEED
25b60 54 45 53 54 0a 09 67 65 74 74 69 6d 65 6f 66 64 TEST..gettimeofd
25b70 61 79 28 26 65 6e 64 2c 20 4e 55 4c 4c 29 3b 0a ay(&end, NULL);.
25b80 09 73 74 61 72 74 5f 69 6e 74 20 3d 20 28 73 74 .start_int = (st
25b90 61 72 74 2e 74 76 5f 73 65 63 20 2a 20 31 30 30 art.tv_sec * 100
25ba0 30 30 30 30 29 20 2b 20 73 74 61 72 74 2e 74 76 0000) + start.tv
25bb0 5f 75 73 65 63 3b 0a 09 65 6e 64 5f 69 6e 74 20 _usec;..end_int
25bc0 3d 20 28 65 6e 64 2e 74 76 5f 73 65 63 20 2a 20 = (end.tv_sec *
25bd0 31 30 30 30 30 30 30 29 20 2b 20 65 6e 64 2e 74 1000000) + end.t
25be0 76 5f 75 73 65 63 3b 0a 09 66 70 72 69 6e 74 66 v_usec;..fprintf
25bf0 28 73 74 64 65 72 72 2c 20 22 53 65 61 72 63 68 (stderr, "Search
25c00 20 74 6f 6f 6b 20 25 6c 75 20 6d 69 63 72 6f 73 took %lu micros
25c10 65 63 6f 6e 64 73 5c 6e 22 2c 20 28 75 6e 73 69 econds\n", (unsi
25c20 67 6e 65 64 20 6c 6f 6e 67 29 20 28 65 6e 64 5f gned long) (end_
25c30 69 6e 74 20 2d 20 73 74 61 72 74 5f 69 6e 74 29 int - start_int)
25c40 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 6d 75 74 65 );.#endif...mute
25c50 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 x_retval = cacke
25c60 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
25c70 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
25c80 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 .if (mutex_retva
25c90 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b l != 0) {...CACK
25ca0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
25cb0 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 "Error. Unlocki
25cc0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 ng failed.");...
25cd0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 .return(CKR_GENE
25ce0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a RAL_ERROR);..}..
25cf0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
25d00 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
25d10 43 4b 52 5f 4f 4b 20 28 25 69 29 2c 20 6e 75 6d CKR_OK (%i), num
25d20 20 6f 62 6a 65 63 74 73 20 3d 20 25 6c 75 22 2c objects = %lu",
25d30 20 43 4b 52 5f 4f 4b 2c 20 2a 70 75 6c 4f 62 6a CKR_OK, *pulObj
25d40 65 63 74 43 6f 75 6e 74 29 3b 0a 0a 09 72 65 74 ectCount);...ret
25d50 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a urn(CKR_OK);.}..
25d60 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 CK_DEFINE_FUNCTI
25d70 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 ON(CK_RV, C_Find
25d80 4f 62 6a 65 63 74 73 46 69 6e 61 6c 29 28 43 4b ObjectsFinal)(CK
25d90 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 _SESSION_HANDLE
25da0 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 4b 5f hSession) {..CK_
25db0 55 4c 4f 4e 47 20 69 64 78 3b 0a 09 69 6e 74 20 ULONG idx;..int
25dc0 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 mutex_retval;...
25dd0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
25de0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a NTF("Called.");.
25df0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e ..if (!cackey_in
25e00 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 itialized) {...C
25e10 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
25e20 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 TF("Error. Not
25e30 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a initialized.");.
25e40 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 ...return(CKR_CR
25e50 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 YPTOKI_NOT_INITI
25e60 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 ALIZED);..}...if
25e70 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 (hSession == 0
25e80 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 || hSession >= (
25e90 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 sizeof(cackey_se
25ea0 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 ssions) / sizeof
25eb0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 (cackey_sessions
25ec0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 [0]))) {...CACKE
25ed0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
25ee0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 Error. Session
25ef0 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b out of range.");
25f00 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 ......return(CKR
25f10 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f _SESSION_HANDLE_
25f20 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d INVALID);..}...m
25f30 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 utex_retval = ca
25f40 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 ckey_mutex_lock(
25f50 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
25f60 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 ..if (mutex_retv
25f70 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 al != 0) {...CAC
25f80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
25f90 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e ("Error. Lockin
25fa0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 g failed.");....
25fb0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 return(CKR_GENER
25fc0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 AL_ERROR);..}...
25fd0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 if (!cackey_sess
25fe0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 ions[hSession].a
25ff0 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 ctive) {...cacke
26000 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
26010 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
26020 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
26030 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
26040 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 Session not acti
26050 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 ve.");......retu
26060 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 rn(CKR_SESSION_H
26070 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a ANDLE_INVALID);.
26080 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 .}...if (!cackey
26090 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
260a0 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 on].search_activ
260b0 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 e) {...cackey_mu
260c0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 tex_unlock(cacke
260d0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 y_biglock);....C
260e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
260f0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 TF("Error. Sear
26100 63 68 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 ch not active.")
26110 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b ;......return(CK
26120 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f R_OPERATION_NOT_
26130 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d INITIALIZED);..}
26140 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f ...cackey_sessio
26150 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 ns[hSession].sea
26160 72 63 68 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a rch_active = 0;.
26170 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 ..for (idx = 0;
26180 69 64 78 20 3c 20 63 61 63 6b 65 79 5f 73 65 73 idx < cackey_ses
26190 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
261a0 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 search_query_cou
261b0 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 nt; idx++) {...i
261c0 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f f (cackey_sessio
261d0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 ns[hSession].sea
261e0 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 rch_query[idx].p
261f0 56 61 6c 75 65 29 20 7b 0a 09 09 09 66 72 65 65 Value) {....free
26200 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 (cackey_sessions
26210 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 [hSession].searc
26220 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 h_query[idx].pVa
26230 6c 75 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 lue);...}..}...i
26240 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f f (cackey_sessio
26250 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 ns[hSession].sea
26260 72 63 68 5f 71 75 65 72 79 29 20 7b 0a 09 09 66 rch_query) {...f
26270 72 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69 ree(cackey_sessi
26280 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 ons[hSession].se
26290 61 72 63 68 5f 71 75 65 72 79 29 3b 0a 09 7d 0a arch_query);..}.
262a0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d ..mutex_retval =
262b0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e cackey_mutex_un
262c0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
262d0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 ock);..if (mutex
262e0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a _retval != 0) {.
262f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
26300 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 RINTF("Error. U
26310 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e nlocking failed.
26320 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
26330 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 R_GENERAL_ERROR)
26340 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ;..}...CACKEY_DE
26350 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
26360 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 rning CKR_OK (%i
26370 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 )", CKR_OK);...r
26380 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d eturn(CKR_OK);.}
26390 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 ..CK_DEFINE_FUNC
263a0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e TION(CK_RV, C_En
263b0 63 72 79 70 74 49 6e 69 74 29 28 43 4b 5f 53 45 cryptInit)(CK_SE
263c0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 SSION_HANDLE hSe
263d0 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e ssion, CK_MECHAN
263e0 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 ISM_PTR pMechani
263f0 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 sm, CK_OBJECT_HA
26400 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 NDLE hKey) {..CA
26410 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
26420 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
26430 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 if (!cackey_init
26440 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 ialized) {...CAC
26450 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
26460 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e ("Error. Not in
26470 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 itialized.");...
26480 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 .return(CKR_CRYP
26490 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c TOKI_NOT_INITIAL
264a0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b IZED);..}...CACK
264b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
264c0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 "Returning CKR_F
264d0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
264e0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 ORTED (%i)", CKR
264f0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
26500 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 PPORTED);...retu
26510 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f rn(CKR_FUNCTION_
26520 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
26530 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e }..CK_DEFINE_FUN
26540 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 CTION(CK_RV, C_E
26550 6e 63 72 79 70 74 29 28 43 4b 5f 53 45 53 53 49 ncrypt)(CK_SESSI
26560 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 ON_HANDLE hSessi
26570 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 on, CK_BYTE_PTR
26580 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 pData, CK_ULONG
26590 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 ulDataLen, CK_BY
265a0 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 TE_PTR pEncrypte
265b0 64 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f dData, CK_ULONG_
265c0 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64 PTR pulEncrypted
265d0 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43 4b DataLen) {..CACK
265e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
265f0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 "Called.");...if
26600 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 (!cackey_initia
26610 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 lized) {...CACKE
26620 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
26630 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 Error. Not init
26640 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 ialized.");....r
26650 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f eturn(CKR_CRYPTO
26660 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a KI_NOT_INITIALIZ
26670 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 ED);..}...CACKEY
26680 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
26690 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e eturning CKR_FUN
266a0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
266b0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 TED (%i)", CKR_F
266c0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
266d0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e ORTED);...return
266e0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f (CKR_FUNCTION_NO
266f0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a T_SUPPORTED);.}.
26700 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 .CK_DEFINE_FUNCT
26710 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 ION(CK_RV, C_Enc
26720 72 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53 ryptUpdate)(CK_S
26730 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 ESSION_HANDLE hS
26740 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f ession, CK_BYTE_
26750 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c PTR pPart, CK_UL
26760 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43 ONG ulPartLen, C
26770 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 K_BYTE_PTR pEncr
26780 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c yptedPart, CK_UL
26790 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 ONG_PTR pulEncry
267a0 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 ptedPartLen) {..
267b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
267c0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a NTF("Called.");.
267d0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e ..if (!cackey_in
267e0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 itialized) {...C
267f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
26800 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 TF("Error. Not
26810 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a initialized.");.
26820 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 ...return(CKR_CR
26830 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 YPTOKI_NOT_INITI
26840 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 ALIZED);..}...CA
26850 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
26860 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 F("Returning CKR
26870 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
26880 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 PPORTED (%i)", C
26890 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
268a0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 SUPPORTED);...re
268b0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f turn(CKR_FUNCTIO
268c0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 N_NOT_SUPPORTED)
268d0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 ;.}..CK_DEFINE_F
268e0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 UNCTION(CK_RV, C
268f0 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c 29 28 43 _EncryptFinal)(C
26900 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 K_SESSION_HANDLE
26910 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 hSession, CK_BY
26920 54 45 5f 50 54 52 20 70 4c 61 73 74 45 6e 63 72 TE_PTR pLastEncr
26930 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c yptedPart, CK_UL
26940 4f 4e 47 5f 50 54 52 20 70 75 6c 4c 61 73 74 45 ONG_PTR pulLastE
26950 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29 ncryptedPartLen)
26960 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {..CACKEY_DEBUG
26970 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
26980 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ");...if (!cacke
26990 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b y_initialized) {
269a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
269b0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
269c0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e Not initialized.
269d0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
269e0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 R_CRYPTOKI_NOT_I
269f0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
26a00 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
26a10 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
26a20 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f CKR_FUNCTION_NO
26a30 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 T_SUPPORTED (%i)
26a40 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f ", CKR_FUNCTION_
26a50 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
26a60 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e ..return(CKR_FUN
26a70 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
26a80 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 TED);.}..CK_DEFI
26a90 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 NE_FUNCTION(CK_R
26aa0 56 2c 20 43 5f 44 65 63 72 79 70 74 49 6e 69 74 V, C_DecryptInit
26ab0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e )(CK_SESSION_HAN
26ac0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b DLE hSession, CK
26ad0 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 _MECHANISM_PTR p
26ae0 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 Mechanism, CK_OB
26af0 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 JECT_HANDLE hKey
26b00 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 ) {..int mutex_r
26b10 65 74 76 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b etval;...hKey--;
26b20 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
26b30 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
26b40 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 );...if (!cackey
26b50 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
26b60 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
26b70 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e RINTF("Error. N
26b80 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 ot initialized."
26b90 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
26ba0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e _CRYPTOKI_NOT_IN
26bb0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
26bc0 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 20 .if (pMechanism
26bd0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 == NULL) {...CAC
26be0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
26bf0 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e ("Error. pMechan
26c00 69 73 6d 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a ism is NULL.");.
26c10 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 ...return(CKR_AR
26c20 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d GUMENTS_BAD);..}
26c30 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 ...if (pMechanis
26c40 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 21 3d 20 m->mechanism !=
26c50 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 29 20 7b 0a CKM_RSA_PKCS) {.
26c60 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
26c70 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d RINTF("Error. pM
26c80 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e echanism->mechan
26c90 69 73 6d 20 6e 6f 74 20 73 70 65 63 69 66 69 65 ism not specifie
26ca0 64 20 61 73 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 d as CKM_RSA_PKC
26cb0 53 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 S");....return(C
26cc0 4b 52 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 41 52 KR_MECHANISM_PAR
26cd0 41 4d 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a AM_INVALID);..}.
26ce0 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d ..if (hSession =
26cf0 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 = 0 || hSession
26d00 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 >= (sizeof(cacke
26d10 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 y_sessions) / si
26d20 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 zeof(cackey_sess
26d30 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 ions[0]))) {...C
26d40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
26d50 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 TF("Error. Sess
26d60 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 ion out of range
26d70 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e .");......return
26d80 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e (CKR_SESSION_HAN
26d90 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d DLE_INVALID);..}
26da0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 ...mutex_retval
26db0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c = cackey_mutex_l
26dc0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
26dd0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f ck);..if (mutex_
26de0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 retval != 0) {..
26df0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
26e00 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f INTF("Error. Lo
26e10 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b cking failed.");
26e20 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 ....return(CKR_G
26e30 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 ENERAL_ERROR);..
26e40 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f }...if (!cackey_
26e50 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
26e60 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 n].active) {...c
26e70 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f ackey_mutex_unlo
26e80 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
26e90 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 k);....CACKEY_DE
26ea0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
26eb0 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 r. Session not
26ec0 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 active.");......
26ed0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 return(CKR_SESSI
26ee0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 ON_HANDLE_INVALI
26ef0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 D);..}...if (cac
26f00 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
26f10 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 ssion].decrypt_a
26f20 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 ctive) {...cacke
26f30 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
26f40 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
26f50 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
26f60 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
26f70 44 65 63 72 79 70 74 20 61 6c 72 65 61 64 79 20 Decrypt already
26f80 69 6e 20 70 72 6f 67 72 65 73 73 2e 22 29 3b 0a in progress.");.
26f90 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f .....return(CKR_
26fa0 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 45 OPERATION_ACTIVE
26fb0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65 79 );..}...if (hKey
26fc0 20 3e 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 >= cackey_sessi
26fd0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 ons[hSession].id
26fe0 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 20 entities_count)
26ff0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 {...cackey_mutex
27000 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 _unlock(cackey_b
27010 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b iglock);....CACK
27020 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
27030 22 45 72 72 6f 72 2e 20 20 4b 65 79 20 68 61 6e "Error. Key han
27040 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 dle out of range
27050 20 28 72 65 71 75 65 73 74 65 64 20 6b 65 79 20 (requested key
27060 25 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75 20 69 64 %lu, only %lu id
27070 65 6e 74 69 74 69 65 73 20 61 76 61 69 6c 61 62 entities availab
27080 6c 65 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 le).", (unsigned
27090 20 6c 6f 6e 67 29 20 68 4b 65 79 2c 20 28 75 6e long) hKey, (un
270a0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63 signed long) cac
270b0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
270c0 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 ssion].identitie
270d0 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 s_count);....ret
270e0 75 72 6e 28 43 4b 52 5f 4b 45 59 5f 48 41 4e 44 urn(CKR_KEY_HAND
270f0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a LE_INVALID);..}.
27100 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e ..cackey_session
27110 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 s[hSession].decr
27120 79 70 74 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a ypt_active = 1;.
27130 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e ..cackey_session
27140 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 s[hSession].decr
27150 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d 20 3d 20 ypt_mechanism =
27160 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 pMechanism->mech
27170 61 6e 69 73 6d 3b 0a 09 63 61 63 6b 65 79 5f 73 anism;..cackey_s
27180 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
27190 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 ].decrypt_mech_p
271a0 61 72 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d arm = pMechanism
271b0 2d 3e 70 50 61 72 61 6d 65 74 65 72 3b 0a 09 63 ->pParameter;..c
271c0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
271d0 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 Session].decrypt
271e0 5f 6d 65 63 68 5f 70 61 72 6d 6c 65 6e 20 3d 20 _mech_parmlen =
271f0 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 75 6c 50 61 pMechanism->ulPa
27200 72 61 6d 65 74 65 72 4c 65 6e 3b 0a 09 63 61 63 rameterLen;..cac
27210 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
27220 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69 ssion].decrypt_i
27230 64 65 6e 74 69 74 79 20 3d 20 26 63 61 63 6b 65 dentity = &cacke
27240 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
27250 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b ion].identities[
27260 68 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72 hKey];...mutex_r
27270 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d etval = cackey_m
27280 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b utex_unlock(cack
27290 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 ey_biglock);..if
272a0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 (mutex_retval !
272b0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f = 0) {...CACKEY_
272c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
272d0 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 ror. Unlocking
272e0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 failed.");....re
272f0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c turn(CKR_GENERAL
27300 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 _ERROR);..}...CA
27310 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
27320 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 F("Returning CKR
27330 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f _OK (%i)", CKR_O
27340 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 K);...return(CKR
27350 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 _OK);.}..CK_DEFI
27360 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 NE_FUNCTION(CK_R
27370 56 2c 20 43 5f 44 65 63 72 79 70 74 29 28 43 4b V, C_Decrypt)(CK
27380 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 _SESSION_HANDLE
27390 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 hSession, CK_BYT
273a0 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 E_PTR pEncrypted
273b0 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 Data, CK_ULONG u
273c0 6c 45 6e 63 72 79 70 74 65 64 44 61 74 61 4c 65 lEncryptedDataLe
273d0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 n, CK_BYTE_PTR p
273e0 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 Data, CK_ULONG_P
273f0 54 52 20 70 75 6c 44 61 74 61 4c 65 6e 29 20 7b TR pulDataLen) {
27400 0a 09 43 4b 5f 55 4c 4f 4e 47 20 64 61 74 61 6c ..CK_ULONG datal
27410 65 6e 5f 75 70 64 61 74 65 2c 20 64 61 74 61 6c en_update, datal
27420 65 6e 5f 66 69 6e 61 6c 3b 0a 09 43 4b 5f 52 56 en_final;..CK_RV
27430 20 64 65 63 72 79 70 74 5f 72 65 74 3b 0a 09 69 decrypt_ret;..i
27440 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b nt mutex_retval;
27450 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
27460 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
27470 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 );...if (!cackey
27480 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
27490 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
274a0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e RINTF("Error. N
274b0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 ot initialized."
274c0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
274d0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e _CRYPTOKI_NOT_IN
274e0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
274f0 09 69 66 20 28 70 75 6c 44 61 74 61 4c 65 6e 20 .if (pulDataLen
27500 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 == NULL) {...CAC
27510 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
27520 28 22 45 72 72 6f 72 2e 20 70 75 6c 44 61 74 61 ("Error. pulData
27530 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a Len is NULL.");.
27540 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 ...return(CKR_AR
27550 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d GUMENTS_BAD);..}
27560 0a 0a 09 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 ...datalen_updat
27570 65 20 3d 20 2a 70 75 6c 44 61 74 61 4c 65 6e 3b e = *pulDataLen;
27580 0a 0a 09 64 65 63 72 79 70 74 5f 72 65 74 20 3d ...decrypt_ret =
27590 20 43 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 C_DecryptUpdate
275a0 28 68 53 65 73 73 69 6f 6e 2c 20 70 45 6e 63 72 (hSession, pEncr
275b0 79 70 74 65 64 44 61 74 61 2c 20 75 6c 45 6e 63 yptedData, ulEnc
275c0 72 79 70 74 65 64 44 61 74 61 4c 65 6e 2c 20 70 ryptedDataLen, p
275d0 44 61 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f 75 Data, &datalen_u
275e0 70 64 61 74 65 29 3b 0a 09 69 66 20 28 64 65 63 pdate);..if (dec
275f0 72 79 70 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f rypt_ret != CKR_
27600 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 OK) {...CACKEY_D
27610 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
27620 6f 72 2e 20 20 44 65 63 72 79 70 74 55 70 64 61 or. DecryptUpda
27630 74 65 28 29 20 72 65 74 75 72 6e 65 64 20 66 61 te() returned fa
27640 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29 ilure (rv = %lu)
27650 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f .", (unsigned lo
27660 6e 67 29 20 64 65 63 72 79 70 74 5f 72 65 74 29 ng) decrypt_ret)
27670 3b 0a 0a 09 09 69 66 20 28 64 65 63 72 79 70 74 ;....if (decrypt
27680 5f 72 65 74 20 21 3d 20 43 4b 52 5f 42 55 46 46 _ret != CKR_BUFF
27690 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a ER_TOO_SMALL) {.
276a0 09 09 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20 .../* Terminate
276b0 64 65 63 72 79 70 74 69 6f 6e 20 6f 70 65 72 61 decryption opera
276c0 74 69 6f 6e 20 2a 2f 0a 0a 09 09 09 6d 75 74 65 tion */.....mute
276d0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 x_retval = cacke
276e0 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 y_mutex_lock(cac
276f0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 key_biglock);...
27700 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 .if (mutex_retva
27710 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 43 41 l != 0) {.....CA
27720 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
27730 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 F("Error. Locki
27740 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 ng failed.");...
27750 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 ...return(CKR_GE
27760 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 NERAL_ERROR);...
27770 09 7d 0a 0a 09 09 09 69 66 20 28 21 63 61 63 6b .}.....if (!cack
27780 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
27790 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a sion].active) {.
277a0 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 ....cackey_mutex
277b0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 _unlock(cackey_b
277c0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 iglock);......CA
277d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
277e0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 F("Error. Sessi
277f0 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 on not active.")
27800 3b 0a 09 09 0a 09 09 09 09 72 65 74 75 72 6e 28 ;........return(
27810 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 CKR_SESSION_HAND
27820 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 09 09 LE_INVALID);....
27830 7d 0a 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65 }.....if (!cacke
27840 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
27850 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 ion].decrypt_act
27860 69 76 65 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 ive) {.....cacke
27870 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
27880 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
27890 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
278a0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
278b0 20 20 44 65 63 72 79 70 74 20 6e 6f 74 20 61 63 Decrypt not ac
278c0 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09 tive.");........
278d0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 return(CKR_OPERA
278e0 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c TION_NOT_INITIAL
278f0 49 5a 45 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 IZED);....}.....
27900 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
27910 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 hSession].decryp
27920 74 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 t_active = 0;...
27930 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d ..mutex_retval =
27940 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e cackey_mutex_un
27950 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
27960 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75 74 ock);....if (mut
27970 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 ex_retval != 0)
27980 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 {.....CACKEY_DEB
27990 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
279a0 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 . Unlocking fai
279b0 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 led.");......ret
279c0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f urn(CKR_GENERAL_
279d0 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 09 09 7d ERROR);....}...}
279e0 0a 0a 09 09 72 65 74 75 72 6e 28 64 65 63 72 79 ....return(decry
279f0 70 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 69 66 pt_ret);..}...if
27a00 20 28 70 44 61 74 61 29 20 7b 0a 09 09 70 44 61 (pData) {...pDa
27a10 74 61 20 2b 3d 20 64 61 74 61 6c 65 6e 5f 75 70 ta += datalen_up
27a20 64 61 74 65 3b 0a 09 7d 0a 09 64 61 74 61 6c 65 date;..}..datale
27a30 6e 5f 66 69 6e 61 6c 20 3d 20 2a 70 75 6c 44 61 n_final = *pulDa
27a40 74 61 4c 65 6e 20 2d 20 64 61 74 61 6c 65 6e 5f taLen - datalen_
27a50 75 70 64 61 74 65 3b 0a 0a 09 64 65 63 72 79 70 update;...decryp
27a60 74 5f 72 65 74 20 3d 20 43 5f 44 65 63 72 79 70 t_ret = C_Decryp
27a70 74 46 69 6e 61 6c 28 68 53 65 73 73 69 6f 6e 2c tFinal(hSession,
27a80 20 70 44 61 74 61 2c 20 26 64 61 74 61 6c 65 6e pData, &datalen
27a90 5f 66 69 6e 61 6c 29 3b 0a 09 69 66 20 28 64 65 _final);..if (de
27aa0 63 72 79 70 74 5f 72 65 74 20 21 3d 20 43 4b 52 crypt_ret != CKR
27ab0 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f _OK) {...CACKEY_
27ac0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
27ad0 72 6f 72 2e 20 20 44 65 63 72 79 70 74 46 69 6e ror. DecryptFin
27ae0 61 6c 28 29 20 72 65 74 75 72 6e 65 64 20 66 61 al() returned fa
27af0 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29 ilure (rv = %lu)
27b00 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f .", (unsigned lo
27b10 6e 67 29 20 64 65 63 72 79 70 74 5f 72 65 74 29 ng) decrypt_ret)
27b20 3b 0a 0a 09 09 72 65 74 75 72 6e 28 64 65 63 72 ;....return(decr
27b30 79 70 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 2a ypt_ret);..}...*
27b40 70 75 6c 44 61 74 61 4c 65 6e 20 3d 20 64 61 74 pulDataLen = dat
27b50 61 6c 65 6e 5f 75 70 64 61 74 65 20 2b 20 64 61 alen_update + da
27b60 74 61 6c 65 6e 5f 66 69 6e 61 6c 3b 0a 0a 09 43 talen_final;...C
27b70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
27b80 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b TF("Returning CK
27b90 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f R_OK (%i)", CKR_
27ba0 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b OK);...return(CK
27bb0 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 R_OK);.}..CK_DEF
27bc0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f INE_FUNCTION(CK_
27bd0 52 56 2c 20 43 5f 44 65 63 72 79 70 74 55 70 64 RV, C_DecryptUpd
27be0 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f ate)(CK_SESSION_
27bf0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c HANDLE hSession,
27c00 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e CK_BYTE_PTR pEn
27c10 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f cryptedPart, CK_
27c20 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 ULONG ulEncrypte
27c30 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 dPartLen, CK_BYT
27c40 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f E_PTR pPart, CK_
27c50 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61 72 ULONG_PTR pulPar
27c60 74 4c 65 6e 29 20 7b 0a 09 73 74 61 74 69 63 20 tLen) {..static
27c70 43 4b 5f 42 59 54 45 20 62 75 66 5b 31 36 33 38 CK_BYTE buf[1638
27c80 34 5d 3b 0a 09 73 73 69 7a 65 5f 74 20 62 75 66 4];..ssize_t buf
27c90 6c 65 6e 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 len;..CK_SLOT_ID
27ca0 20 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 52 56 20 slotID;..CK_RV
27cb0 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e retval = CKR_GEN
27cc0 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 69 6e 74 ERAL_ERROR;..int
27cd0 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a mutex_retval;..
27ce0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
27cf0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
27d00 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 ...if (!cackey_i
27d10 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 nitialized) {...
27d20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
27d30 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 NTF("Error. Not
27d40 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b initialized.");
27d50 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 ....return(CKR_C
27d60 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 RYPTOKI_NOT_INIT
27d70 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 IALIZED);..}...i
27d80 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 f (hSession == 0
27d90 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 || hSession >=
27da0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 (sizeof(cackey_s
27db0 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f essions) / sizeo
27dc0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e f(cackey_session
27dd0 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b s[0]))) {...CACK
27de0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
27df0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e "Error. Session
27e00 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 out of range.")
27e10 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b ;......return(CK
27e20 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 R_SESSION_HANDLE
27e30 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 _INVALID);..}...
27e40 69 66 20 28 70 45 6e 63 72 79 70 74 65 64 50 61 if (pEncryptedPa
27e50 72 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 6c rt == NULL && ul
27e60 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e EncryptedPartLen
27e70 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 == 0) {.../* Sh
27e80 6f 72 74 20 63 69 72 63 75 69 74 20 69 66 20 77 ort circuit if w
27e90 65 20 61 72 65 20 61 73 6b 65 64 20 74 6f 20 64 e are asked to d
27ea0 65 63 72 79 70 74 20 6e 6f 74 68 69 6e 67 2e 2e ecrypt nothing..
27eb0 2e 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 . */...CACKEY_DE
27ec0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
27ed0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 rning CKR_OK (%i
27ee0 29 20 28 73 68 6f 72 74 20 63 69 72 63 75 69 74 ) (short circuit
27ef0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 )", CKR_OK);....
27f00 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a return(CKR_OK);.
27f10 09 7d 0a 0a 09 69 66 20 28 70 45 6e 63 72 79 70 .}...if (pEncryp
27f20 74 65 64 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 tedPart == NULL)
27f30 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
27f40 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
27f50 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 20 pEncryptedPart
27f60 69 73 20 4e 55 4c 4c 2c 20 62 75 74 20 75 6c 45 is NULL, but ulE
27f70 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20 ncryptedPartLen
27f80 69 73 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09 09 is not 0.");....
27f90 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d return(CKR_ARGUM
27fa0 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 ENTS_BAD);..}...
27fb0 69 66 20 28 75 6c 45 6e 63 72 79 70 74 65 64 50 if (ulEncryptedP
27fc0 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 artLen == 0) {..
27fd0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
27fe0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 75 6c 45 INTF("Error. ulE
27ff0 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20 ncryptedPartLen
28000 69 73 20 30 2c 20 62 75 74 20 70 50 61 72 74 20 is 0, but pPart
28010 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a is not NULL.");.
28020 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 ...return(CKR_AR
28030 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d GUMENTS_BAD);..}
28040 0a 0a 09 69 66 20 28 70 75 6c 50 61 72 74 4c 65 ...if (pulPartLe
28050 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 n == NULL) {...C
28060 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
28070 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 50 61 TF("Error. pulPa
28080 72 74 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 rtLen is NULL.")
28090 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
280a0 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a ARGUMENTS_BAD);.
280b0 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 .}...mutex_retva
280c0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 l = cackey_mutex
280d0 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 _lock(cackey_big
280e0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 lock);..if (mute
280f0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b x_retval != 0) {
28100 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
28110 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
28120 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 Locking failed."
28130 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
28140 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b _GENERAL_ERROR);
28150 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ..}...if (!cacke
28160 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
28170 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 ion].active) {..
28180 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e .cackey_mutex_un
28190 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
281a0 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f ock);....CACKEY_
281b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
281c0 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f ror. Session no
281d0 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a t active.");....
281e0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 ..return(CKR_SES
281f0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 SION_HANDLE_INVA
28200 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 LID);..}...if (!
28210 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
28220 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 hSession].decryp
28230 74 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 t_active) {...ca
28240 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 ckey_mutex_unloc
28250 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
28260 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 );....CACKEY_DEB
28270 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
28280 2e 20 20 44 65 63 72 79 70 74 20 6e 6f 74 20 61 . Decrypt not a
28290 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 ctive.");......r
282a0 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 eturn(CKR_OPERAT
282b0 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 ION_NOT_INITIALI
282c0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 ZED);..}...slotI
282d0 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 D = cackey_sessi
282e0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c ons[hSession].sl
282f0 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 otID;...if (slot
28300 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 ID < 0 || slotID
28310 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b >= (sizeof(cack
28320 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 ey_slots) / size
28330 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b of(cackey_slots[
28340 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 0]))) {...CACKEY
28350 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
28360 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c rror. Invalid sl
28370 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c ot requested (%l
28380 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 u), outside of v
28390 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f alid range", slo
283a0 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 tID);....return(
283b0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f CKR_GENERAL_ERRO
283c0 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 R);..}...if (cac
283d0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 key_slots[slotID
283e0 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b ].active == 0) {
283f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
28400 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 PRINTF("Error. I
28410 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 nvalid slot requ
28420 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f ested (%lu), slo
28430 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 t not currently
28440 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 active", slotID)
28450 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 ;....cackey_mute
28460 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
28470 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 biglock);....ret
28480 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f urn(CKR_GENERAL_
28490 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 ERROR);..}...swi
284a0 74 63 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73 tch (cackey_sess
284b0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 ions[hSession].d
284c0 65 63 72 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d ecrypt_mechanism
284d0 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 ) {...case CKM_R
284e0 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 SA_PKCS:..../* A
284f0 73 6b 20 63 61 72 64 20 74 6f 20 64 65 63 72 79 sk card to decry
28500 70 74 20 2a 2f 0a 09 09 09 62 75 66 6c 65 6e 20 pt */....buflen
28510 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 = cackey_signdec
28520 72 79 70 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f rypt(&cackey_slo
28530 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b ts[slotID], cack
28540 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
28550 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64 sion].decrypt_id
28560 65 6e 74 69 74 79 2c 20 70 45 6e 63 72 79 70 74 entity, pEncrypt
28570 65 64 50 61 72 74 2c 20 75 6c 45 6e 63 72 79 70 edPart, ulEncryp
28580 74 65 64 50 61 72 74 4c 65 6e 2c 20 62 75 66 2c tedPartLen, buf,
28590 20 73 69 7a 65 6f 66 28 62 75 66 29 2c 20 30 2c sizeof(buf), 0,
285a0 20 31 29 3b 0a 0a 09 09 09 69 66 20 28 62 75 66 1);.....if (buf
285b0 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 09 09 2f len < 0) {...../
285c0 2a 20 44 65 63 72 79 70 74 69 6f 6e 20 66 61 69 * Decryption fai
285d0 6c 65 64 2e 20 2a 2f 0a 09 09 09 09 69 66 20 28 led. */.....if (
285e0 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 buflen == CACKEY
285f0 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 _PCSC_E_NEEDLOGI
28600 4e 29 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c N) {......retval
28610 20 3d 20 43 4b 52 5f 55 53 45 52 5f 4e 4f 54 5f = CKR_USER_NOT_
28620 4c 4f 47 47 45 44 5f 49 4e 3b 0a 09 09 09 09 7d LOGGED_IN;.....}
28630 20 65 6c 73 65 20 69 66 20 28 62 75 66 6c 65 6e else if (buflen
28640 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f == CACKEY_PCSC_
28650 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b E_TOKENABSENT) {
28660 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 ......retval = C
28670 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 KR_DEVICE_REMOVE
28680 44 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a D;.....} else {.
28690 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b .....retval = CK
286a0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b R_GENERAL_ERROR;
286b0 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 .....}....} else
286c0 20 69 66 20 28 28 28 75 6e 73 69 67 6e 65 64 20 if (((unsigned
286d0 6c 6f 6e 67 29 20 62 75 66 6c 65 6e 29 20 3e 20 long) buflen) >
286e0 2a 70 75 6c 50 61 72 74 4c 65 6e 20 26 26 20 70 *pulPartLen && p
286f0 50 61 72 74 29 20 7b 0a 09 09 09 09 2f 2a 20 44 Part) {...../* D
28700 65 63 72 79 70 74 65 64 20 64 61 74 61 20 74 6f ecrypted data to
28710 6f 20 6c 61 72 67 65 20 2a 2f 0a 09 09 09 09 72 o large */.....r
28720 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 etval = CKR_BUFF
28730 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 ER_TOO_SMALL;...
28740 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 69 66 .} else {.....if
28750 20 28 70 50 61 72 74 29 20 7b 0a 09 09 09 09 09 (pPart) {......
28760 6d 65 6d 63 70 79 28 70 50 61 72 74 2c 20 62 75 memcpy(pPart, bu
28770 66 2c 20 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 f, buflen);.....
28780 7d 0a 0a 09 09 09 09 2a 70 75 6c 50 61 72 74 4c }......*pulPartL
28790 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 0a 09 09 en = buflen;....
287a0 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f ..retval = CKR_O
287b0 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61 K;....}.....brea
287c0 6b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 k;..}...mutex_re
287d0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 tval = cackey_mu
287e0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 tex_unlock(cacke
287f0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 y_biglock);..if
28800 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d (mutex_retval !=
28810 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 0) {...CACKEY_D
28820 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
28830 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 or. Unlocking f
28840 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 ailed.");....ret
28850 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f urn(CKR_GENERAL_
28860 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 ERROR);..}...CAC
28870 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
28880 28 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c ("Returning %i",
28890 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a (int) retval);.
288a0 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 ..return(retval)
288b0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 ;.}..CK_DEFINE_F
288c0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 UNCTION(CK_RV, C
288d0 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 29 28 43 _DecryptFinal)(C
288e0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 K_SESSION_HANDLE
288f0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 hSession, CK_BY
28900 54 45 5f 50 54 52 20 70 4c 61 73 74 50 61 72 74 TE_PTR pLastPart
28910 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 , CK_ULONG_PTR p
28920 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 29 20 7b ulLastPartLen) {
28930 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 ..int mutex_retv
28940 61 6c 3b 0a 09 69 6e 74 20 74 65 72 6d 69 6e 61 al;..int termina
28950 74 65 5f 64 65 63 72 79 70 74 20 3d 20 31 3b 0a te_decrypt = 1;.
28960 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
28970 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
28980 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f ;...if (!cackey_
28990 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 initialized) {..
289a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
289b0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f INTF("Error. No
289c0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 t initialized.")
289d0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
289e0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 CRYPTOKI_NOT_INI
289f0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 TIALIZED);..}...
28a00 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 if (hSession ==
28a10 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 0 || hSession >=
28a20 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f (sizeof(cackey_
28a30 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 sessions) / size
28a40 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f of(cackey_sessio
28a50 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 ns[0]))) {...CAC
28a60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
28a70 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f ("Error. Sessio
28a80 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 n out of range."
28a90 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 );......return(C
28aa0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c KR_SESSION_HANDL
28ab0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a E_INVALID);..}..
28ac0 09 69 66 20 28 70 75 6c 4c 61 73 74 50 61 72 74 .if (pulLastPart
28ad0 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 Len == NULL) {..
28ae0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
28af0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c INTF("Error. pul
28b00 4c 61 73 74 50 61 72 74 4c 65 6e 20 69 73 20 4e LastPartLen is N
28b10 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 ULL.");....retur
28b20 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f n(CKR_ARGUMENTS_
28b30 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 BAD);..}...mutex
28b40 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 _retval = cackey
28b50 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b _mutex_lock(cack
28b60 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 ey_biglock);..if
28b70 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 (mutex_retval !
28b80 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f = 0) {...CACKEY_
28b90 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
28ba0 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 ror. Locking fa
28bb0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 iled.");....retu
28bc0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 rn(CKR_GENERAL_E
28bd0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 RROR);..}...if (
28be0 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 !cackey_sessions
28bf0 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 [hSession].activ
28c00 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 e) {...cackey_mu
28c10 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 tex_unlock(cacke
28c20 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 y_biglock);....C
28c30 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
28c40 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 TF("Error. Sess
28c50 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 ion not active."
28c60 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 );......return(C
28c70 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c KR_SESSION_HANDL
28c80 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a E_INVALID);..}..
28c90 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 .if (!cackey_ses
28ca0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
28cb0 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 29 20 decrypt_active)
28cc0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 {...cackey_mutex
28cd0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 _unlock(cackey_b
28ce0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b iglock);....CACK
28cf0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
28d00 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 "Error. Decrypt
28d10 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a not active.");.
28d20 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f .....return(CKR_
28d30 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e OPERATION_NOT_IN
28d40 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
28d50 09 2a 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e .*pulLastPartLen
28d60 20 3d 20 30 3b 0a 0a 09 69 66 20 28 70 4c 61 73 = 0;...if (pLas
28d70 74 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b tPart == NULL) {
28d80 0a 09 09 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 ...terminate_dec
28d90 72 79 70 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 rypt = 0;..}...i
28da0 66 20 28 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 f (terminate_dec
28db0 72 79 70 74 29 20 7b 0a 09 09 63 61 63 6b 65 79 rypt) {...cackey
28dc0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
28dd0 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 on].decrypt_acti
28de0 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74 ve = 0;..}...mut
28df0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b ex_retval = cack
28e00 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 ey_mutex_unlock(
28e10 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
28e20 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 ..if (mutex_retv
28e30 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 al != 0) {...CAC
28e40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
28e50 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b ("Error. Unlock
28e60 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a ing failed.");..
28e70 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e ..return(CKR_GEN
28e80 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a ERAL_ERROR);..}.
28e90 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
28ea0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
28eb0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 CKR_OK (%i)", C
28ec0 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e KR_OK);...return
28ed0 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f (CKR_OK);.}..CK_
28ee0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 DEFINE_FUNCTION(
28ef0 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 49 CK_RV, C_DigestI
28f00 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f nit)(CK_SESSION_
28f10 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c HANDLE hSession,
28f20 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 CK_MECHANISM_PT
28f30 52 20 70 4d 65 63 68 61 6e 69 73 6d 29 20 7b 0a R pMechanism) {.
28f40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
28f50 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
28f60 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 ...if (!cackey_i
28f70 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 nitialized) {...
28f80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
28f90 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 NTF("Error. Not
28fa0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b initialized.");
28fb0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 ....return(CKR_C
28fc0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 RYPTOKI_NOT_INIT
28fd0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 IALIZED);..}...C
28fe0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
28ff0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b TF("Returning CK
29000 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
29010 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 UPPORTED (%i)",
29020 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
29030 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 _SUPPORTED);...r
29040 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 eturn(CKR_FUNCTI
29050 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
29060 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f );.}..CK_DEFINE_
29070 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 FUNCTION(CK_RV,
29080 43 5f 44 69 67 65 73 74 29 28 43 4b 5f 53 45 53 C_Digest)(CK_SES
29090 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 SION_HANDLE hSes
290a0 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 sion, CK_BYTE_PT
290b0 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e R pData, CK_ULON
290c0 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f G ulDataLen, CK_
290d0 42 59 54 45 5f 50 54 52 20 70 44 69 67 65 73 74 BYTE_PTR pDigest
290e0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 , CK_ULONG_PTR p
290f0 75 6c 44 69 67 65 73 74 4c 65 6e 29 20 7b 0a 09 ulDigestLen) {..
29100 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
29110 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a NTF("Called.");.
29120 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e ..if (!cackey_in
29130 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 itialized) {...C
29140 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
29150 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 TF("Error. Not
29160 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a initialized.");.
29170 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 ...return(CKR_CR
29180 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 YPTOKI_NOT_INITI
29190 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 ALIZED);..}...CA
291a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
291b0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 F("Returning CKR
291c0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
291d0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 PPORTED (%i)", C
291e0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
291f0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 SUPPORTED);...re
29200 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f turn(CKR_FUNCTIO
29210 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 N_NOT_SUPPORTED)
29220 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 ;.}..CK_DEFINE_F
29230 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 UNCTION(CK_RV, C
29240 5f 44 69 67 65 73 74 55 70 64 61 74 65 29 28 43 _DigestUpdate)(C
29250 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 K_SESSION_HANDLE
29260 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 hSession, CK_BY
29270 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b TE_PTR pPart, CK
29280 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e _ULONG ulPartLen
29290 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 ) {..CACKEY_DEBU
292a0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 G_PRINTF("Called
292b0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b .");...if (!cack
292c0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 ey_initialized)
292d0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
292e0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
292f0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 Not initialized
29300 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
29310 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f KR_CRYPTOKI_NOT_
29320 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d INITIALIZED);..}
29330 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
29340 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e PRINTF("Returnin
29350 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e g CKR_FUNCTION_N
29360 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 OT_SUPPORTED (%i
29370 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e )", CKR_FUNCTION
29380 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
29390 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 ...return(CKR_FU
293a0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
293b0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 RTED);.}..CK_DEF
293c0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f INE_FUNCTION(CK_
293d0 52 56 2c 20 43 5f 44 69 67 65 73 74 4b 65 79 29 RV, C_DigestKey)
293e0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 (CK_SESSION_HAND
293f0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f LE hSession, CK_
29400 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b OBJECT_HANDLE hK
29410 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 ey) {..CACKEY_DE
29420 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
29430 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 ed.");...if (!ca
29440 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 ckey_initialized
29450 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
29460 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
29470 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a . Not initializ
29480 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
29490 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f (CKR_CRYPTOKI_NO
294a0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a T_INITIALIZED);.
294b0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 .}...CACKEY_DEBU
294c0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
294d0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e ing CKR_FUNCTION
294e0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 _NOT_SUPPORTED (
294f0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 %i)", CKR_FUNCTI
29500 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
29510 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f );...return(CKR_
29520 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
29530 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 PORTED);.}..CK_D
29540 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 EFINE_FUNCTION(C
29550 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 46 69 K_RV, C_DigestFi
29560 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f nal)(CK_SESSION_
29570 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c HANDLE hSession,
29580 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 69 CK_BYTE_PTR pDi
29590 67 65 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 gest, CK_ULONG_P
295a0 54 52 20 70 75 6c 44 69 67 65 73 74 4c 65 6e 29 TR pulDigestLen)
295b0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {..CACKEY_DEBUG
295c0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
295d0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ");...if (!cacke
295e0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b y_initialized) {
295f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
29600 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
29610 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e Not initialized.
29620 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
29630 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 R_CRYPTOKI_NOT_I
29640 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
29650 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
29660 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
29670 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f CKR_FUNCTION_NO
29680 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 T_SUPPORTED (%i)
29690 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f ", CKR_FUNCTION_
296a0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
296b0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e ..return(CKR_FUN
296c0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
296d0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 TED);.}..CK_DEFI
296e0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 NE_FUNCTION(CK_R
296f0 56 2c 20 43 5f 53 69 67 6e 49 6e 69 74 29 28 43 V, C_SignInit)(C
29700 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 K_SESSION_HANDLE
29710 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 hSession, CK_ME
29720 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 CHANISM_PTR pMec
29730 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 hanism, CK_OBJEC
29740 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b T_HANDLE hKey) {
29750 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 ..int mutex_retv
29760 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09 al;...hKey--;...
29770 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
29780 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a NTF("Called.");.
29790 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e ..if (!cackey_in
297a0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 itialized) {...C
297b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
297c0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 TF("Error. Not
297d0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a initialized.");.
297e0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 ...return(CKR_CR
297f0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 YPTOKI_NOT_INITI
29800 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 ALIZED);..}...if
29810 20 28 70 4d 65 63 68 61 6e 69 73 6d 20 3d 3d 20 (pMechanism ==
29820 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 NULL) {...CACKEY
29830 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
29840 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d rror. pMechanism
29850 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 is NULL.");....
29860 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d return(CKR_ARGUM
29870 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 ENTS_BAD);..}...
29880 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 2d 3e if (pMechanism->
29890 6d 65 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d mechanism != CKM
298a0 5f 52 53 41 5f 50 4b 43 53 29 20 7b 0a 09 09 43 _RSA_PKCS) {...C
298b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
298c0 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 TF("Error. pMech
298d0 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d anism->mechanism
298e0 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20 61 not specified a
298f0 73 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 22 29 s CKM_RSA_PKCS")
29900 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
29910 4d 45 43 48 41 4e 49 53 4d 5f 50 41 52 41 4d 5f MECHANISM_PARAM_
29920 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 INVALID);..}...i
29930 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 f (hSession == 0
29940 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 || hSession >=
29950 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 (sizeof(cackey_s
29960 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f essions) / sizeo
29970 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e f(cackey_session
29980 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b s[0]))) {...CACK
29990 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
299a0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e "Error. Session
299b0 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 out of range.")
299c0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b ;......return(CK
299d0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 R_SESSION_HANDLE
299e0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 _INVALID);..}...
299f0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 mutex_retval = c
29a00 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b ackey_mutex_lock
29a10 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 (cackey_biglock)
29a20 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 ;..if (mutex_ret
29a30 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 val != 0) {...CA
29a40 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
29a50 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 F("Error. Locki
29a60 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 ng failed.");...
29a70 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 .return(CKR_GENE
29a80 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a RAL_ERROR);..}..
29a90 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 .if (!cackey_ses
29aa0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
29ab0 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b active) {...cack
29ac0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 ey_mutex_unlock(
29ad0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
29ae0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
29af0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
29b00 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 Session not act
29b10 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 ive.");......ret
29b20 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f urn(CKR_SESSION_
29b30 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b HANDLE_INVALID);
29b40 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 ..}...if (cackey
29b50 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
29b60 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 on].sign_active)
29b70 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 {...cackey_mute
29b80 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
29b90 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 biglock);....CAC
29ba0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
29bb0 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 61 ("Error. Sign a
29bc0 6c 72 65 61 64 79 20 69 6e 20 70 72 6f 67 72 65 lready in progre
29bd0 73 73 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 ss.");......retu
29be0 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e rn(CKR_OPERATION
29bf0 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 69 _ACTIVE);..}...i
29c00 66 20 28 68 4b 65 79 20 3e 3d 20 63 61 63 6b 65 f (hKey >= cacke
29c10 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
29c20 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f ion].identities_
29c30 63 6f 75 6e 74 29 20 7b 0a 09 09 63 61 63 6b 65 count) {...cacke
29c40 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
29c50 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
29c60 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
29c70 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
29c80 4b 65 79 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f Key handle out o
29c90 66 20 72 61 6e 67 65 20 28 72 65 71 75 65 73 74 f range (request
29ca0 65 64 20 6b 65 79 20 25 6c 75 2c 20 6f 6e 6c 79 ed key %lu, only
29cb0 20 25 6c 75 20 69 64 65 6e 74 69 74 69 65 73 20 %lu identities
29cc0 61 76 61 69 6c 61 62 6c 65 29 2e 22 2c 20 28 75 available).", (u
29cd0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b nsigned long) hK
29ce0 65 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f ey, (unsigned lo
29cf0 6e 67 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69 ng) cackey_sessi
29d00 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 ons[hSession].id
29d10 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b entities_count);
29d20 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4b ....return(CKR_K
29d30 45 59 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 EY_HANDLE_INVALI
29d40 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f D);..}...cackey_
29d50 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
29d60 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d n].sign_active =
29d70 20 31 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 1;...cackey_ses
29d80 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
29d90 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 20 3d sign_mechanism =
29da0 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 pMechanism->mec
29db0 68 61 6e 69 73 6d 3b 0a 0a 09 63 61 63 6b 65 79 hanism;...cackey
29dc0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
29dd0 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20 on].sign_buflen
29de0 3d 20 31 32 38 3b 0a 09 63 61 63 6b 65 79 5f 73 = 128;..cackey_s
29df0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
29e00 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d ].sign_bufused =
29e10 20 30 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 0;..cackey_sess
29e20 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 ions[hSession].s
29e30 69 67 6e 5f 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 ign_buf = malloc
29e40 28 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f (sizeof(*cackey_
29e50 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
29e60 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20 2a 20 63 n].sign_buf) * c
29e70 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
29e80 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 Session].sign_bu
29e90 66 6c 65 6e 29 3b 0a 0a 09 43 41 43 4b 45 59 5f flen);...CACKEY_
29ea0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 DEBUG_PRINTF("Se
29eb0 73 73 69 6f 6e 20 25 6c 75 20 73 69 67 6e 5f 69 ssion %lu sign_i
29ec0 64 65 6e 74 69 74 79 20 69 73 20 25 70 20 28 69 dentity is %p (i
29ed0 64 65 6e 74 69 74 79 20 23 25 6c 75 29 22 2c 20 dentity #%lu)",
29ee0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
29ef0 68 53 65 73 73 69 6f 6e 2c 20 28 76 6f 69 64 20 hSession, (void
29f00 2a 29 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 *) &cackey_sessi
29f10 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 ons[hSession].id
29f20 65 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d 2c 20 entities[hKey],
29f30 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
29f40 68 4b 65 79 29 3b 0a 09 63 61 63 6b 65 79 5f 73 hKey);..cackey_s
29f50 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
29f60 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 20 ].sign_identity
29f70 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f = &cackey_sessio
29f80 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 ns[hSession].ide
29f90 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d 3b 0a 0a ntities[hKey];..
29fa0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 .mutex_retval =
29fb0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c cackey_mutex_unl
29fc0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
29fd0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f ck);..if (mutex_
29fe0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 retval != 0) {..
29ff0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
2a000 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e INTF("Error. Un
2a010 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 locking failed."
2a020 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
2a030 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b _GENERAL_ERROR);
2a040 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 ..}...CACKEY_DEB
2a050 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
2a060 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 ning CKR_OK (%i)
2a070 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 ", CKR_OK);...re
2a080 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a turn(CKR_OK);.}.
2a090 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 .CK_DEFINE_FUNCT
2a0a0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 ION(CK_RV, C_Sig
2a0b0 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 n)(CK_SESSION_HA
2a0c0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 NDLE hSession, C
2a0d0 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 K_BYTE_PTR pData
2a0e0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 , CK_ULONG ulDat
2a0f0 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 aLen, CK_BYTE_PT
2a100 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b R pSignature, CK
2a110 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 _ULONG_PTR pulSi
2a120 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 75 gnatureLen) {..u
2a130 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 74 61 nsigned long sta
2a140 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 3b rt_sign_bufused;
2a150 0a 09 43 4b 5f 52 56 20 73 69 67 6e 5f 72 65 74 ..CK_RV sign_ret
2a160 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 ;..int mutex_ret
2a170 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 val;...CACKEY_DE
2a180 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
2a190 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 ed.");...if (!ca
2a1a0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 ckey_initialized
2a1b0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
2a1c0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
2a1d0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a . Not initializ
2a1e0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
2a1f0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f (CKR_CRYPTOKI_NO
2a200 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a T_INITIALIZED);.
2a210 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f .}...if (hSessio
2a220 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 n == 0 || hSessi
2a230 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 on >= (sizeof(ca
2a240 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f ckey_sessions) /
2a250 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 sizeof(cackey_s
2a260 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a essions[0]))) {.
2a270 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
2a280 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 RINTF("Error. S
2a290 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 ession out of ra
2a2a0 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 nge.");......ret
2a2b0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f urn(CKR_SESSION_
2a2c0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b HANDLE_INVALID);
2a2d0 0a 09 7d 0a 0a 09 73 74 61 72 74 5f 73 69 67 6e ..}...start_sign
2a2e0 5f 62 75 66 75 73 65 64 20 3d 20 63 61 63 6b 65 _bufused = cacke
2a2f0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
2a300 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 ion].sign_bufuse
2a310 64 3b 0a 0a 09 73 69 67 6e 5f 72 65 74 20 3d 20 d;...sign_ret =
2a320 43 5f 53 69 67 6e 55 70 64 61 74 65 28 68 53 65 C_SignUpdate(hSe
2a330 73 73 69 6f 6e 2c 20 70 44 61 74 61 2c 20 75 6c ssion, pData, ul
2a340 44 61 74 61 4c 65 6e 29 3b 0a 09 69 66 20 28 73 DataLen);..if (s
2a350 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f ign_ret != CKR_O
2a360 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 K) {...CACKEY_DE
2a370 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
2a380 72 2e 20 20 53 69 67 6e 55 70 64 61 74 65 28 29 r. SignUpdate()
2a390 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72 returned failur
2a3a0 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 e (rv = %lu).",
2a3b0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
2a3c0 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 69 66 sign_ret);....if
2a3d0 20 28 73 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b (sign_ret != CK
2a3e0 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 R_BUFFER_TOO_SMA
2a3f0 4c 4c 29 20 7b 0a 09 09 09 6d 75 74 65 78 5f 72 LL) {....mutex_r
2a400 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d etval = cackey_m
2a410 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 utex_lock(cackey
2a420 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 _biglock);....if
2a430 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 (mutex_retval !
2a440 3d 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 = 0) {.....CACKE
2a450 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
2a460 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 Error. Locking
2a470 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09 failed.");......
2a480 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 return(CKR_GENER
2a490 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a AL_ERROR);....}.
2a4a0 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f ....if (!cackey_
2a4b0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
2a4c0 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 n].active) {....
2a4d0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e .cackey_mutex_un
2a4e0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
2a4f0 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 ock);......CACKE
2a500 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
2a510 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 Error. Session
2a520 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 not active.");..
2a530 09 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 ......return(CKR
2a540 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f _SESSION_HANDLE_
2a550 49 4e 56 41 4c 49 44 29 3b 0a 09 09 09 7d 0a 0a INVALID);....}..
2a560 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 ...if (!cackey_s
2a570 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
2a580 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b ].sign_active) {
2a590 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 .....cackey_mute
2a5a0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
2a5b0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 biglock);......C
2a5c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
2a5d0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e TF("Error. Sign
2a5e0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a not active.");.
2a5f0 09 09 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b .......return(CK
2a600 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f R_OPERATION_NOT_
2a610 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 09 INITIALIZED);...
2a620 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 .}.....cackey_se
2a630 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
2a640 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 30 .sign_active = 0
2a650 3b 0a 0a 09 09 09 6d 75 74 65 78 5f 72 65 74 76 ;.....mutex_retv
2a660 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 al = cackey_mute
2a670 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
2a680 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20 biglock);....if
2a690 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d (mutex_retval !=
2a6a0 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 0) {.....CACKEY
2a6b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
2a6c0 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 rror. Unlocking
2a6d0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 failed.");.....
2a6e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 .return(CKR_GENE
2a6f0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d RAL_ERROR);....}
2a700 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 73 ...}....return(s
2a710 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 73 ign_ret);..}...s
2a720 69 67 6e 5f 72 65 74 20 3d 20 43 5f 53 69 67 6e ign_ret = C_Sign
2a730 46 69 6e 61 6c 28 68 53 65 73 73 69 6f 6e 2c 20 Final(hSession,
2a740 70 53 69 67 6e 61 74 75 72 65 2c 20 70 75 6c 53 pSignature, pulS
2a750 69 67 6e 61 74 75 72 65 4c 65 6e 29 3b 0a 09 69 ignatureLen);..i
2a760 66 20 28 73 69 67 6e 5f 72 65 74 20 21 3d 20 43 f (sign_ret != C
2a770 4b 52 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28 73 KR_OK) {...if (s
2a780 69 67 6e 5f 72 65 74 20 3d 3d 20 43 4b 52 5f 42 ign_ret == CKR_B
2a790 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 UFFER_TOO_SMALL)
2a7a0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 {....CACKEY_DEB
2a7b0 55 47 5f 50 52 49 4e 54 46 28 22 53 69 67 6e 46 UG_PRINTF("SignF
2a7c0 69 6e 61 6c 28 29 20 72 65 74 75 72 6e 65 64 20 inal() returned
2a7d0 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 CKR_BUFFER_TOO_S
2a7e0 4d 41 4c 4c 20 28 72 76 20 3d 20 25 6c 75 29 2c MALL (rv = %lu),
2a7f0 20 75 6e 64 6f 69 6e 67 20 43 5f 53 69 67 6e 55 undoing C_SignU
2a800 70 64 61 74 65 28 29 22 2c 20 28 75 6e 73 69 67 pdate()", (unsig
2a810 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 ned long) sign_r
2a820 65 74 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f et);.....cackey_
2a830 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
2a840 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 n].sign_bufused
2a850 3d 20 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 66 = start_sign_buf
2a860 75 73 65 64 3b 0a 0a 09 09 09 72 65 74 75 72 6e used;.....return
2a870 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 09 7d 0a (sign_ret);...}.
2a880 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
2a890 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
2a8a0 53 69 67 6e 46 69 6e 61 6c 28 29 20 72 65 74 75 SignFinal() retu
2a8b0 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72 76 rned failure (rv
2a8c0 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 = %lu).", (unsi
2a8d0 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f gned long) sign_
2a8e0 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 ret);....return(
2a8f0 73 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 sign_ret);..}...
2a900 69 66 20 28 70 53 69 67 6e 61 74 75 72 65 20 3d if (pSignature =
2a910 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b = NULL) {...CACK
2a920 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
2a930 22 70 53 69 67 6e 61 74 75 72 65 20 73 70 65 63 "pSignature spec
2a940 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 75 ified as NULL, u
2a950 6e 64 6f 69 6e 67 20 43 5f 53 69 67 6e 55 70 64 ndoing C_SignUpd
2a960 61 74 65 28 29 22 29 3b 0a 0a 09 09 63 61 63 6b ate()");....cack
2a970 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
2a980 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 sion].sign_bufus
2a990 65 64 20 3d 20 73 74 61 72 74 5f 73 69 67 6e 5f ed = start_sign_
2a9a0 62 75 66 75 73 65 64 3b 0a 0a 09 09 72 65 74 75 bufused;....retu
2a9b0 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 7d rn(sign_ret);..}
2a9c0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
2a9d0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e PRINTF("Returnin
2a9e0 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 g CKR_OK (%i)",
2a9f0 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 CKR_OK);...retur
2aa00 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b n(CKR_OK);.}..CK
2aa10 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e _DEFINE_FUNCTION
2aa20 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 55 70 (CK_RV, C_SignUp
2aa30 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e date)(CK_SESSION
2aa40 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e _HANDLE hSession
2aa50 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 , CK_BYTE_PTR pP
2aa60 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c art, CK_ULONG ul
2aa70 50 61 72 74 4c 65 6e 29 20 7b 0a 09 69 6e 74 20 PartLen) {..int
2aa80 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 mutex_retval;...
2aa90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
2aaa0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a NTF("Called.");.
2aab0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e ..if (!cackey_in
2aac0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 itialized) {...C
2aad0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
2aae0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 TF("Error. Not
2aaf0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a initialized.");.
2ab00 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 ...return(CKR_CR
2ab10 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 YPTOKI_NOT_INITI
2ab20 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 ALIZED);..}...if
2ab30 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 (hSession == 0
2ab40 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 || hSession >= (
2ab50 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 sizeof(cackey_se
2ab60 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 ssions) / sizeof
2ab70 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 (cackey_sessions
2ab80 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 [0]))) {...CACKE
2ab90 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
2aba0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 Error. Session
2abb0 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b out of range.");
2abc0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 ......return(CKR
2abd0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f _SESSION_HANDLE_
2abe0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 INVALID);..}...i
2abf0 66 20 28 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c f (pPart == NULL
2ac00 20 26 26 20 75 6c 50 61 72 74 4c 65 6e 20 3d 3d && ulPartLen ==
2ac10 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 0) {.../* Short
2ac20 20 63 69 72 63 75 69 74 20 69 66 20 77 65 20 61 circuit if we a
2ac30 72 65 20 61 73 6b 65 64 20 74 6f 20 73 69 67 6e re asked to sign
2ac40 20 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 nothing... */..
2ac50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
2ac60 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
2ac70 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f CKR_OK (%i) (sho
2ac80 72 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b rt circuit)", CK
2ac90 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e R_OK);....return
2aca0 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 (CKR_OK);..}...i
2acb0 66 20 28 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c f (pPart == NULL
2acc0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
2acd0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
2ace0 2e 20 70 50 61 72 74 20 69 73 20 4e 55 4c 4c 2c . pPart is NULL,
2acf0 20 62 75 74 20 75 6c 50 61 72 74 4c 65 6e 20 69 but ulPartLen i
2ad00 73 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09 09 72 s not 0.");....r
2ad10 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 eturn(CKR_ARGUME
2ad20 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 NTS_BAD);..}...i
2ad30 66 20 28 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 f (ulPartLen ==
2ad40 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 0) {...CACKEY_DE
2ad50 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
2ad60 72 2e 20 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 r. ulPartLen is
2ad70 30 2c 20 62 75 74 20 70 50 61 72 74 20 69 73 20 0, but pPart is
2ad80 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 not NULL.");....
2ad90 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d return(CKR_ARGUM
2ada0 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 ENTS_BAD);..}...
2adb0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 mutex_retval = c
2adc0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b ackey_mutex_lock
2add0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 (cackey_biglock)
2ade0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 ;..if (mutex_ret
2adf0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 val != 0) {...CA
2ae00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
2ae10 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 F("Error. Locki
2ae20 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 ng failed.");...
2ae30 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 .return(CKR_GENE
2ae40 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a RAL_ERROR);..}..
2ae50 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 .if (!cackey_ses
2ae60 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
2ae70 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b active) {...cack
2ae80 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 ey_mutex_unlock(
2ae90 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
2aea0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
2aeb0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
2aec0 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 Session not act
2aed0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 ive.");......ret
2aee0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f urn(CKR_SESSION_
2aef0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b HANDLE_INVALID);
2af00 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ..}...if (!cacke
2af10 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
2af20 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 ion].sign_active
2af30 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 ) {...cackey_mut
2af40 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 ex_unlock(cackey
2af50 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 _biglock);....CA
2af60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
2af70 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 F("Error. Sign
2af80 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 not active.");..
2af90 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f ....return(CKR_O
2afa0 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 PERATION_NOT_INI
2afb0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 TIALIZED);..}...
2afc0 73 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73 switch (cackey_s
2afd0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
2afe0 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d ].sign_mechanism
2aff0 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 ) {...case CKM_R
2b000 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 SA_PKCS:..../* A
2b010 63 63 75 6d 75 6c 61 74 65 20 64 69 72 65 63 74 ccumulate direct
2b020 6c 79 20 2a 2f 0a 09 09 09 69 66 20 28 28 63 61 ly */....if ((ca
2b030 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
2b040 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 ession].sign_buf
2b050 75 73 65 64 20 2b 20 75 6c 50 61 72 74 4c 65 6e used + ulPartLen
2b060 29 20 3e 20 63 61 63 6b 65 79 5f 73 65 73 73 69 ) > cackey_sessi
2b070 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 ons[hSession].si
2b080 67 6e 5f 62 75 66 6c 65 6e 29 20 7b 0a 09 09 09 gn_buflen) {....
2b090 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 .cackey_sessions
2b0a0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f [hSession].sign_
2b0b0 62 75 66 6c 65 6e 20 2a 3d 20 32 3b 0a 0a 09 09 buflen *= 2;....
2b0c0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e ..cackey_session
2b0d0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e s[hSession].sign
2b0e0 5f 62 75 66 20 3d 20 72 65 61 6c 6c 6f 63 28 63 _buf = realloc(c
2b0f0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
2b100 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 Session].sign_bu
2b110 66 2c 20 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 f, sizeof(*cacke
2b120 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
2b130 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20 2a ion].sign_buf) *
2b140 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 cackey_sessions
2b150 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f [hSession].sign_
2b160 62 75 66 6c 65 6e 29 3b 0a 09 09 09 7d 0a 0a 09 buflen);....}...
2b170 09 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f ..memcpy(cackey_
2b180 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
2b190 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 2b 20 63 61 n].sign_buf + ca
2b1a0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
2b1b0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 ession].sign_buf
2b1c0 75 73 65 64 2c 20 70 50 61 72 74 2c 20 75 6c 50 used, pPart, ulP
2b1d0 61 72 74 4c 65 6e 29 3b 0a 0a 09 09 09 63 61 63 artLen);.....cac
2b1e0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
2b1f0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 ssion].sign_bufu
2b200 73 65 64 20 2b 3d 20 75 6c 50 61 72 74 4c 65 6e sed += ulPartLen
2b210 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a ;.....break;..}.
2b220 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d ..mutex_retval =
2b230 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e cackey_mutex_un
2b240 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
2b250 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 ock);..if (mutex
2b260 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a _retval != 0) {.
2b270 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
2b280 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 RINTF("Error. U
2b290 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e nlocking failed.
2b2a0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
2b2b0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 R_GENERAL_ERROR)
2b2c0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ;..}...CACKEY_DE
2b2d0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
2b2e0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 rning CKR_OK (%i
2b2f0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 )", CKR_OK);...r
2b300 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d eturn(CKR_OK);.}
2b310 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 ..CK_DEFINE_FUNC
2b320 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 TION(CK_RV, C_Si
2b330 67 6e 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 gnFinal)(CK_SESS
2b340 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 ION_HANDLE hSess
2b350 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 ion, CK_BYTE_PTR
2b360 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f pSignature, CK_
2b370 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 67 ULONG_PTR pulSig
2b380 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 73 74 natureLen) {..st
2b390 61 74 69 63 20 43 4b 5f 42 59 54 45 20 73 69 67 atic CK_BYTE sig
2b3a0 62 75 66 5b 31 30 32 34 5d 3b 0a 09 73 73 69 7a buf[1024];..ssiz
2b3b0 65 5f 74 20 73 69 67 62 75 66 6c 65 6e 3b 0a 09 e_t sigbuflen;..
2b3c0 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 CK_SLOT_ID slotI
2b3d0 44 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c D;..CK_RV retval
2b3e0 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 = CKR_GENERAL_E
2b3f0 52 52 4f 52 3b 0a 09 69 6e 74 20 74 65 72 6d 69 RROR;..int termi
2b400 6e 61 74 65 5f 73 69 67 6e 20 3d 20 31 3b 0a 09 nate_sign = 1;..
2b410 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c int mutex_retval
2b420 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ;...CACKEY_DEBUG
2b430 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
2b440 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ");...if (!cacke
2b450 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b y_initialized) {
2b460 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
2b470 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
2b480 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e Not initialized.
2b490 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
2b4a0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 R_CRYPTOKI_NOT_I
2b4b0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
2b4c0 0a 09 69 66 20 28 70 75 6c 53 69 67 6e 61 74 75 ..if (pulSignatu
2b4d0 72 65 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b reLen == NULL) {
2b4e0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
2b4f0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 PRINTF("Error. p
2b500 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 69 ulSignatureLen i
2b510 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 s NULL.");....re
2b520 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e turn(CKR_ARGUMEN
2b530 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 TS_BAD);..}...if
2b540 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 (hSession == 0
2b550 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 || hSession >= (
2b560 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 sizeof(cackey_se
2b570 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 ssions) / sizeof
2b580 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 (cackey_sessions
2b590 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 [0]))) {...CACKE
2b5a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
2b5b0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 Error. Session
2b5c0 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b out of range.");
2b5d0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 ......return(CKR
2b5e0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f _SESSION_HANDLE_
2b5f0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d INVALID);..}...m
2b600 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 utex_retval = ca
2b610 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 ckey_mutex_lock(
2b620 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
2b630 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 ..if (mutex_retv
2b640 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 al != 0) {...CAC
2b650 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
2b660 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e ("Error. Lockin
2b670 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 g failed.");....
2b680 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 return(CKR_GENER
2b690 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 AL_ERROR);..}...
2b6a0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 if (!cackey_sess
2b6b0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 ions[hSession].a
2b6c0 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 ctive) {...cacke
2b6d0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
2b6e0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
2b6f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
2b700 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
2b710 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 Session not acti
2b720 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 ve.");......retu
2b730 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 rn(CKR_SESSION_H
2b740 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a ANDLE_INVALID);.
2b750 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 .}...if (!cackey
2b760 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
2b770 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 on].sign_active)
2b780 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 {...cackey_mute
2b790 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
2b7a0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 biglock);....CAC
2b7b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
2b7c0 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e ("Error. Sign n
2b7d0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 ot active.");...
2b7e0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 ...return(CKR_OP
2b7f0 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 ERATION_NOT_INIT
2b800 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 IALIZED);..}...s
2b810 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 lotID = cackey_s
2b820 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
2b830 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 ].slotID;...if (
2b840 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c slotID < 0 || sl
2b850 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 otID >= (sizeof(
2b860 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 cackey_slots) /
2b870 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c sizeof(cackey_sl
2b880 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 ots[0]))) {...CA
2b890 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
2b8a0 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 F("Error. Invali
2b8b0 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 d slot requested
2b8c0 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 (%lu), outside
2b8d0 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c of valid range",
2b8e0 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 slotID);....ret
2b8f0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f urn(CKR_GENERAL_
2b900 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 ERROR);..}...if
2b910 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c (cackey_slots[sl
2b920 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 otID].active ==
2b930 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 0) {...CACKEY_DE
2b940 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
2b950 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 r. Invalid slot
2b960 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c requested (%lu),
2b970 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e slot not curren
2b980 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f tly active", slo
2b990 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f tID);....cackey_
2b9a0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 mutex_unlock(cac
2b9b0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 key_biglock);...
2b9c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 .return(CKR_GENE
2b9d0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a RAL_ERROR);..}..
2b9e0 09 73 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f .switch (cackey_
2b9f0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
2ba00 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 n].sign_mechanis
2ba10 6d 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f m) {...case CKM_
2ba20 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 RSA_PKCS:..../*
2ba30 41 73 6b 20 63 61 72 64 20 74 6f 20 73 69 67 6e Ask card to sign
2ba40 20 2a 2f 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 */....CACKEY_DE
2ba50 42 55 47 5f 50 52 49 4e 54 46 28 22 41 73 6b 69 BUG_PRINTF("Aski
2ba60 6e 67 20 74 6f 20 73 69 67 6e 20 66 72 6f 6d 20 ng to sign from
2ba70 69 64 65 6e 74 69 74 79 20 25 70 20 69 6e 20 73 identity %p in s
2ba80 65 73 73 69 6f 6e 20 25 6c 75 22 2c 20 28 76 6f ession %lu", (vo
2ba90 69 64 20 2a 29 20 63 61 63 6b 65 79 5f 73 65 73 id *) cackey_ses
2baa0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
2bab0 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 2c 20 28 sign_identity, (
2bac0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 unsigned long) h
2bad0 53 65 73 73 69 6f 6e 29 3b 0a 09 09 09 73 69 67 Session);....sig
2bae0 62 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65 79 5f buflen = cackey_
2baf0 73 69 67 6e 64 65 63 72 79 70 74 28 26 63 61 63 signdecrypt(&cac
2bb00 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 key_slots[slotID
2bb10 5d 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f ], cackey_sessio
2bb20 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 ns[hSession].sig
2bb30 6e 5f 69 64 65 6e 74 69 74 79 2c 20 63 61 63 6b n_identity, cack
2bb40 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
2bb50 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 sion].sign_buf,
2bb60 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
2bb70 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 hSession].sign_b
2bb80 75 66 75 73 65 64 2c 20 73 69 67 62 75 66 2c 20 ufused, sigbuf,
2bb90 73 69 7a 65 6f 66 28 73 69 67 62 75 66 29 2c 20 sizeof(sigbuf),
2bba0 31 2c 20 30 29 3b 0a 0a 09 09 09 69 66 20 28 73 1, 0);.....if (s
2bbb0 69 67 62 75 66 6c 65 6e 20 3c 20 30 29 20 7b 0a igbuflen < 0) {.
2bbc0 09 09 09 09 2f 2a 20 53 69 67 6e 69 6e 67 20 66 ..../* Signing f
2bbd0 61 69 6c 65 64 2e 20 2a 2f 0a 09 09 09 09 69 66 ailed. */.....if
2bbe0 20 28 73 69 67 62 75 66 6c 65 6e 20 3d 3d 20 43 (sigbuflen == C
2bbf0 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45 ACKEY_PCSC_E_NEE
2bc00 44 4c 4f 47 49 4e 29 20 7b 0a 09 09 09 09 09 72 DLOGIN) {......r
2bc10 65 74 76 61 6c 20 3d 20 43 4b 52 5f 55 53 45 52 etval = CKR_USER
2bc20 5f 4e 4f 54 5f 4c 4f 47 47 45 44 5f 49 4e 3b 0a _NOT_LOGGED_IN;.
2bc30 09 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28 73 ....} else if (s
2bc40 69 67 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b igbuflen == CACK
2bc50 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 EY_PCSC_E_TOKENA
2bc60 42 53 45 4e 54 29 20 7b 0a 09 09 09 09 09 72 65 BSENT) {......re
2bc70 74 76 61 6c 20 3d 20 43 4b 52 5f 44 45 56 49 43 tval = CKR_DEVIC
2bc80 45 5f 52 45 4d 4f 56 45 44 3b 0a 09 09 09 09 7d E_REMOVED;.....}
2bc90 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 72 65 74 else {......ret
2bca0 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 val = CKR_GENERA
2bcb0 4c 5f 45 52 52 4f 52 3b 0a 09 09 09 09 7d 0a 09 L_ERROR;.....}..
2bcc0 09 09 7d 20 65 6c 73 65 20 69 66 20 28 28 28 75 ..} else if (((u
2bcd0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 nsigned long) si
2bce0 67 62 75 66 6c 65 6e 29 20 3e 20 2a 70 75 6c 53 gbuflen) > *pulS
2bcf0 69 67 6e 61 74 75 72 65 4c 65 6e 20 26 26 20 70 ignatureLen && p
2bd00 53 69 67 6e 61 74 75 72 65 29 20 7b 0a 09 09 09 Signature) {....
2bd10 09 2f 2a 20 53 69 67 6e 65 64 20 64 61 74 61 20 ./* Signed data
2bd20 74 6f 6f 20 6c 61 72 67 65 20 2a 2f 0a 09 09 09 too large */....
2bd30 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
2bd40 49 4e 54 46 28 22 72 65 74 76 61 6c 20 3d 20 43 INTF("retval = C
2bd50 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d KR_BUFFER_TOO_SM
2bd60 41 4c 4c 3b 20 20 73 69 67 62 75 66 6c 65 6e 20 ALL; sigbuflen
2bd70 3d 20 25 6c 75 2c 20 70 75 6c 53 69 67 6e 61 74 = %lu, pulSignat
2bd80 75 72 65 4c 65 6e 20 3d 20 25 6c 75 22 2c 20 28 ureLen = %lu", (
2bd90 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 unsigned long) s
2bda0 69 67 62 75 66 6c 65 6e 2c 20 28 75 6e 73 69 67 igbuflen, (unsig
2bdb0 6e 65 64 20 6c 6f 6e 67 29 20 2a 70 75 6c 53 69 ned long) *pulSi
2bdc0 67 6e 61 74 75 72 65 4c 65 6e 29 3b 0a 0a 09 09 gnatureLen);....
2bdd0 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 ..retval = CKR_B
2bde0 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b UFFER_TOO_SMALL;
2bdf0 0a 0a 09 09 09 09 74 65 72 6d 69 6e 61 74 65 5f ......terminate_
2be00 73 69 67 6e 20 3d 20 30 3b 0a 09 09 09 7d 20 65 sign = 0;....} e
2be10 6c 73 65 20 7b 0a 09 09 09 09 74 65 72 6d 69 6e lse {.....termin
2be20 61 74 65 5f 73 69 67 6e 20 3d 20 30 3b 0a 0a 09 ate_sign = 0;...
2be30 09 09 09 69 66 20 28 70 53 69 67 6e 61 74 75 72 ...if (pSignatur
2be40 65 29 20 7b 0a 09 09 09 09 09 6d 65 6d 63 70 79 e) {......memcpy
2be50 28 70 53 69 67 6e 61 74 75 72 65 2c 20 73 69 67 (pSignature, sig
2be60 62 75 66 2c 20 73 69 67 62 75 66 6c 65 6e 29 3b buf, sigbuflen);
2be70 0a 0a 09 09 09 09 09 74 65 72 6d 69 6e 61 74 65 .......terminate
2be80 5f 73 69 67 6e 20 3d 20 31 3b 0a 09 09 09 09 7d _sign = 1;.....}
2be90 0a 0a 09 09 09 09 2a 70 75 6c 53 69 67 6e 61 74 ......*pulSignat
2bea0 75 72 65 4c 65 6e 20 3d 20 73 69 67 62 75 66 6c ureLen = sigbufl
2beb0 65 6e 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 en;......retval
2bec0 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a = CKR_OK;....}..
2bed0 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 69 ...break;..}...i
2bee0 66 20 28 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 f (terminate_sig
2bef0 6e 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 n) {...if (cacke
2bf00 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
2bf10 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20 7b ion].sign_buf) {
2bf20 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f ....free(cackey_
2bf30 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
2bf40 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 3b 0a 09 09 n].sign_buf);...
2bf50 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 }....cackey_sess
2bf60 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 ions[hSession].s
2bf70 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a ign_active = 0;.
2bf80 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 .}...mutex_retva
2bf90 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 l = cackey_mutex
2bfa0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 _unlock(cackey_b
2bfb0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 iglock);..if (mu
2bfc0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 tex_retval != 0)
2bfd0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
2bfe0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
2bff0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c Unlocking fail
2c000 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
2c010 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 (CKR_GENERAL_ERR
2c020 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 OR);..}...CACKEY
2c030 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
2c040 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 28 69 eturning %i", (i
2c050 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 nt) retval);...r
2c060 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d eturn(retval);.}
2c070 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 ..CK_DEFINE_FUNC
2c080 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 TION(CK_RV, C_Si
2c090 67 6e 52 65 63 6f 76 65 72 49 6e 69 74 29 28 43 gnRecoverInit)(C
2c0a0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 K_SESSION_HANDLE
2c0b0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 hSession, CK_ME
2c0c0 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 CHANISM_PTR pMec
2c0d0 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 hanism, CK_OBJEC
2c0e0 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b T_HANDLE hKey) {
2c0f0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
2c100 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
2c110 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f ;...if (!cackey_
2c120 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 initialized) {..
2c130 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
2c140 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f INTF("Error. No
2c150 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 t initialized.")
2c160 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
2c170 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 CRYPTOKI_NOT_INI
2c180 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 TIALIZED);..}...
2c190 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
2c1a0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 NTF("Returning C
2c1b0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
2c1c0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c SUPPORTED (%i)",
2c1d0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f CKR_FUNCTION_NO
2c1e0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 T_SUPPORTED);...
2c1f0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 return(CKR_FUNCT
2c200 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
2c210 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 D);.}..CK_DEFINE
2c220 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c _FUNCTION(CK_RV,
2c230 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 29 28 C_SignRecover)(
2c240 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c CK_SESSION_HANDL
2c250 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 E hSession, CK_B
2c260 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 YTE_PTR pData, C
2c270 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 K_ULONG ulDataLe
2c280 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 n, CK_BYTE_PTR p
2c290 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c Signature, CK_UL
2c2a0 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 67 6e 61 ONG_PTR pulSigna
2c2b0 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b tureLen) {..CACK
2c2c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
2c2d0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 "Called.");...if
2c2e0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 (!cackey_initia
2c2f0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 lized) {...CACKE
2c300 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
2c310 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 Error. Not init
2c320 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 ialized.");....r
2c330 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f eturn(CKR_CRYPTO
2c340 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a KI_NOT_INITIALIZ
2c350 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 ED);..}...CACKEY
2c360 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
2c370 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e eturning CKR_FUN
2c380 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
2c390 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 TED (%i)", CKR_F
2c3a0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
2c3b0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e ORTED);...return
2c3c0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f (CKR_FUNCTION_NO
2c3d0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a T_SUPPORTED);.}.
2c3e0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 .CK_DEFINE_FUNCT
2c3f0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 ION(CK_RV, C_Ver
2c400 69 66 79 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 ifyInit)(CK_SESS
2c410 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 ION_HANDLE hSess
2c420 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 ion, CK_MECHANIS
2c430 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d M_PTR pMechanism
2c440 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 , CK_OBJECT_HAND
2c450 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b LE hKey) {..CACK
2c460 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
2c470 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 "Called.");...if
2c480 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 (!cackey_initia
2c490 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 lized) {...CACKE
2c4a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
2c4b0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 Error. Not init
2c4c0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 ialized.");....r
2c4d0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f eturn(CKR_CRYPTO
2c4e0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a KI_NOT_INITIALIZ
2c4f0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 ED);..}...CACKEY
2c500 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
2c510 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e eturning CKR_FUN
2c520 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
2c530 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 TED (%i)", CKR_F
2c540 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
2c550 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e ORTED);...return
2c560 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f (CKR_FUNCTION_NO
2c570 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a T_SUPPORTED);.}.
2c580 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 .CK_DEFINE_FUNCT
2c590 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 ION(CK_RV, C_Ver
2c5a0 69 66 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f ify)(CK_SESSION_
2c5b0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c HANDLE hSession,
2c5c0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 CK_BYTE_PTR pDa
2c5d0 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 ta, CK_ULONG ulD
2c5e0 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f ataLen, CK_BYTE_
2c5f0 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 PTR pSignature,
2c600 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 CK_ULONG ulSigna
2c610 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b tureLen) {..CACK
2c620 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
2c630 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 "Called.");...if
2c640 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 (!cackey_initia
2c650 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 lized) {...CACKE
2c660 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
2c670 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 Error. Not init
2c680 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 ialized.");....r
2c690 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f eturn(CKR_CRYPTO
2c6a0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a KI_NOT_INITIALIZ
2c6b0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 ED);..}...CACKEY
2c6c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
2c6d0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e eturning CKR_FUN
2c6e0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
2c6f0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 TED (%i)", CKR_F
2c700 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
2c710 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e ORTED);...return
2c720 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f (CKR_FUNCTION_NO
2c730 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a T_SUPPORTED);.}.
2c740 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 .CK_DEFINE_FUNCT
2c750 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 ION(CK_RV, C_Ver
2c760 69 66 79 55 70 64 61 74 65 29 28 43 4b 5f 53 45 ifyUpdate)(CK_SE
2c770 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 SSION_HANDLE hSe
2c780 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 ssion, CK_BYTE_P
2c790 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f TR pPart, CK_ULO
2c7a0 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a NG ulPartLen) {.
2c7b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
2c7c0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
2c7d0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 ...if (!cackey_i
2c7e0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 nitialized) {...
2c7f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
2c800 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 NTF("Error. Not
2c810 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b initialized.");
2c820 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 ....return(CKR_C
2c830 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 RYPTOKI_NOT_INIT
2c840 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 IALIZED);..}...C
2c850 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
2c860 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b TF("Returning CK
2c870 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
2c880 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 UPPORTED (%i)",
2c890 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
2c8a0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 _SUPPORTED);...r
2c8b0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 eturn(CKR_FUNCTI
2c8c0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
2c8d0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f );.}..CK_DEFINE_
2c8e0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 FUNCTION(CK_RV,
2c8f0 43 5f 56 65 72 69 66 79 46 69 6e 61 6c 29 28 43 C_VerifyFinal)(C
2c900 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 K_SESSION_HANDLE
2c910 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 hSession, CK_BY
2c920 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 TE_PTR pSignatur
2c930 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 e, CK_ULONG ulSi
2c940 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43 gnatureLen) {..C
2c950 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
2c960 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
2c970 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 .if (!cackey_ini
2c980 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 tialized) {...CA
2c990 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
2c9a0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 F("Error. Not i
2c9b0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a nitialized.");..
2c9c0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 ..return(CKR_CRY
2c9d0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 PTOKI_NOT_INITIA
2c9e0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 LIZED);..}...CAC
2c9f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
2ca00 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f ("Returning CKR_
2ca10 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
2ca20 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b PORTED (%i)", CK
2ca30 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
2ca40 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 UPPORTED);...ret
2ca50 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e urn(CKR_FUNCTION
2ca60 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
2ca70 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 .}..CK_DEFINE_FU
2ca80 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f NCTION(CK_RV, C_
2ca90 56 65 72 69 66 79 52 65 63 6f 76 65 72 49 6e 69 VerifyRecoverIni
2caa0 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 t)(CK_SESSION_HA
2cab0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 NDLE hSession, C
2cac0 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 K_MECHANISM_PTR
2cad0 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f pMechanism, CK_O
2cae0 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 BJECT_HANDLE hKe
2caf0 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 y) {..CACKEY_DEB
2cb00 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
2cb10 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 d.");...if (!cac
2cb20 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 key_initialized)
2cb30 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
2cb40 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
2cb50 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 Not initialize
2cb60 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
2cb70 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 CKR_CRYPTOKI_NOT
2cb80 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 _INITIALIZED);..
2cb90 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 }...CACKEY_DEBUG
2cba0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
2cbb0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f ng CKR_FUNCTION_
2cbc0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 NOT_SUPPORTED (%
2cbd0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f i)", CKR_FUNCTIO
2cbe0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 N_NOT_SUPPORTED)
2cbf0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 ;...return(CKR_F
2cc00 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
2cc10 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 ORTED);.}..CK_DE
2cc20 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b FINE_FUNCTION(CK
2cc30 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 52 65 63 _RV, C_VerifyRec
2cc40 6f 76 65 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e over)(CK_SESSION
2cc50 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e _HANDLE hSession
2cc60 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 , CK_BYTE_PTR pS
2cc70 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f ignature, CK_ULO
2cc80 4e 47 20 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 NG ulSignatureLe
2cc90 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 n, CK_BYTE_PTR p
2cca0 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 Data, CK_ULONG_P
2ccb0 54 52 20 70 75 6c 44 61 74 61 4c 65 6e 29 20 7b TR pulDataLen) {
2ccc0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
2ccd0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
2cce0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f ;...if (!cackey_
2ccf0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 initialized) {..
2cd00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
2cd10 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f INTF("Error. No
2cd20 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 t initialized.")
2cd30 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
2cd40 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 CRYPTOKI_NOT_INI
2cd50 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 TIALIZED);..}...
2cd60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
2cd70 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 NTF("Returning C
2cd80 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
2cd90 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c SUPPORTED (%i)",
2cda0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f CKR_FUNCTION_NO
2cdb0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 T_SUPPORTED);...
2cdc0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 return(CKR_FUNCT
2cdd0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
2cde0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 D);.}..CK_DEFINE
2cdf0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c _FUNCTION(CK_RV,
2ce00 20 43 5f 44 69 67 65 73 74 45 6e 63 72 79 70 74 C_DigestEncrypt
2ce10 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 Update)(CK_SESSI
2ce20 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 ON_HANDLE hSessi
2ce30 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 on, CK_BYTE_PTR
2ce40 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 pPart, CK_ULONG
2ce50 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 ulPartLen, CK_BY
2ce60 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 TE_PTR pEncrypte
2ce70 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f dPart, CK_ULONG_
2ce80 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64 PTR pulEncrypted
2ce90 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b PartLen) {..CACK
2cea0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
2ceb0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 "Called.");...if
2cec0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 (!cackey_initia
2ced0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 lized) {...CACKE
2cee0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
2cef0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 Error. Not init
2cf00 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 ialized.");....r
2cf10 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f eturn(CKR_CRYPTO
2cf20 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a KI_NOT_INITIALIZ
2cf30 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 ED);..}...CACKEY
2cf40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
2cf50 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e eturning CKR_FUN
2cf60 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
2cf70 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 TED (%i)", CKR_F
2cf80 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
2cf90 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e ORTED);...return
2cfa0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f (CKR_FUNCTION_NO
2cfb0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a T_SUPPORTED);.}.
2cfc0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 .CK_DEFINE_FUNCT
2cfd0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 ION(CK_RV, C_Dec
2cfe0 72 79 70 74 44 69 67 65 73 74 55 70 64 61 74 65 ryptDigestUpdate
2cff0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e )(CK_SESSION_HAN
2d000 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b DLE hSession, CK
2d010 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 _BYTE_PTR pEncry
2d020 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f ptedPart, CK_ULO
2d030 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 NG ulEncryptedPa
2d040 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 rtLen, CK_BYTE_P
2d050 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f TR pPart, CK_ULO
2d060 4e 47 5f 50 54 52 20 70 75 6c 50 61 72 74 4c 65 NG_PTR pulPartLe
2d070 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 n) {..CACKEY_DEB
2d080 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
2d090 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 d.");...if (!cac
2d0a0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 key_initialized)
2d0b0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
2d0c0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
2d0d0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 Not initialize
2d0e0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
2d0f0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 CKR_CRYPTOKI_NOT
2d100 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 _INITIALIZED);..
2d110 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 }...CACKEY_DEBUG
2d120 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
2d130 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f ng CKR_FUNCTION_
2d140 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 NOT_SUPPORTED (%
2d150 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f i)", CKR_FUNCTIO
2d160 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 N_NOT_SUPPORTED)
2d170 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 ;...return(CKR_F
2d180 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
2d190 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 ORTED);.}..CK_DE
2d1a0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b FINE_FUNCTION(CK
2d1b0 5f 52 56 2c 20 43 5f 53 69 67 6e 45 6e 63 72 79 _RV, C_SignEncry
2d1c0 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 ptUpdate)(CK_SES
2d1d0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 SION_HANDLE hSes
2d1e0 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 sion, CK_BYTE_PT
2d1f0 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e R pPart, CK_ULON
2d200 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f G ulPartLen, CK_
2d210 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 BYTE_PTR pEncryp
2d220 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e tedPart, CK_ULON
2d230 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74 G_PTR pulEncrypt
2d240 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 edPartLen) {..CA
2d250 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
2d260 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
2d270 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 if (!cackey_init
2d280 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 ialized) {...CAC
2d290 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
2d2a0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e ("Error. Not in
2d2b0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 itialized.");...
2d2c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 .return(CKR_CRYP
2d2d0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c TOKI_NOT_INITIAL
2d2e0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b IZED);..}...CACK
2d2f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
2d300 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 "Returning CKR_F
2d310 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
2d320 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 ORTED (%i)", CKR
2d330 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
2d340 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 PPORTED);...retu
2d350 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f rn(CKR_FUNCTION_
2d360 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
2d370 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e }..CK_DEFINE_FUN
2d380 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 CTION(CK_RV, C_D
2d390 65 63 72 79 70 74 56 65 72 69 66 79 55 70 64 61 ecryptVerifyUpda
2d3a0 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 te)(CK_SESSION_H
2d3b0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 ANDLE hSession,
2d3c0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 CK_BYTE_PTR pEnc
2d3d0 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 ryptedPart, CK_U
2d3e0 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64 LONG ulEncrypted
2d3f0 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 PartLen, CK_BYTE
2d400 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 _PTR pPart, CK_U
2d410 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61 72 74 LONG_PTR pulPart
2d420 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 Len) {..CACKEY_D
2d430 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
2d440 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 led.");...if (!c
2d450 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 ackey_initialize
2d460 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 d) {...CACKEY_DE
2d470 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
2d480 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 r. Not initiali
2d490 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 zed.");....retur
2d4a0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e n(CKR_CRYPTOKI_N
2d4b0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b OT_INITIALIZED);
2d4c0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 ..}...CACKEY_DEB
2d4d0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
2d4e0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f ning CKR_FUNCTIO
2d4f0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 N_NOT_SUPPORTED
2d500 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 (%i)", CKR_FUNCT
2d510 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
2d520 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 D);...return(CKR
2d530 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
2d540 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f PPORTED);.}..CK_
2d550 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 DEFINE_FUNCTION(
2d560 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61 74 CK_RV, C_Generat
2d570 65 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e eKey)(CK_SESSION
2d580 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e _HANDLE hSession
2d590 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 , CK_MECHANISM_P
2d5a0 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 TR pMechanism, C
2d5b0 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 K_ATTRIBUTE_PTR
2d5c0 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c pTemplate, CK_UL
2d5d0 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f ONG ulCount, CK_
2d5e0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 OBJECT_HANDLE_PT
2d5f0 52 20 70 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b R phKey) {..CACK
2d600 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
2d610 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 "Called.");...if
2d620 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 (!cackey_initia
2d630 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 lized) {...CACKE
2d640 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
2d650 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 Error. Not init
2d660 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 ialized.");....r
2d670 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f eturn(CKR_CRYPTO
2d680 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a KI_NOT_INITIALIZ
2d690 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 ED);..}...CACKEY
2d6a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
2d6b0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e eturning CKR_FUN
2d6c0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
2d6d0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 TED (%i)", CKR_F
2d6e0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
2d6f0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e ORTED);...return
2d700 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f (CKR_FUNCTION_NO
2d710 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a T_SUPPORTED);.}.
2d720 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 .CK_DEFINE_FUNCT
2d730 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e ION(CK_RV, C_Gen
2d740 65 72 61 74 65 4b 65 79 50 61 69 72 29 28 43 4b erateKeyPair)(CK
2d750 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 _SESSION_HANDLE
2d760 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 hSession, CK_MEC
2d770 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 HANISM_PTR pMech
2d780 61 6e 69 73 6d 2c 20 43 4b 5f 41 54 54 52 49 42 anism, CK_ATTRIB
2d790 55 54 45 5f 50 54 52 20 70 50 75 62 6c 69 63 4b UTE_PTR pPublicK
2d7a0 65 79 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 eyTemplate, CK_U
2d7b0 4c 4f 4e 47 20 75 6c 50 75 62 6c 69 63 4b 65 79 LONG ulPublicKey
2d7c0 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 AttributeCount,
2d7d0 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 CK_ATTRIBUTE_PTR
2d7e0 20 70 50 72 69 76 61 74 65 4b 65 79 54 65 6d 70 pPrivateKeyTemp
2d7f0 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 late, CK_ULONG u
2d800 6c 50 72 69 76 61 74 65 4b 65 79 41 74 74 72 69 lPrivateKeyAttri
2d810 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 buteCount, CK_OB
2d820 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 JECT_HANDLE_PTR
2d830 70 68 50 75 62 6c 69 63 4b 65 79 2c 20 43 4b 5f phPublicKey, CK_
2d840 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 OBJECT_HANDLE_PT
2d850 52 20 70 68 50 72 69 76 61 74 65 4b 65 79 29 20 R phPrivateKey)
2d860 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f {..CACKEY_DEBUG_
2d870 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
2d880 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 );...if (!cackey
2d890 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
2d8a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
2d8b0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e RINTF("Error. N
2d8c0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 ot initialized."
2d8d0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
2d8e0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e _CRYPTOKI_NOT_IN
2d8f0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
2d900 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
2d910 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
2d920 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
2d930 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 _SUPPORTED (%i)"
2d940 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e , CKR_FUNCTION_N
2d950 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a OT_SUPPORTED);..
2d960 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 .return(CKR_FUNC
2d970 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
2d980 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e ED);.}..CK_DEFIN
2d990 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 E_FUNCTION(CK_RV
2d9a0 2c 20 43 5f 57 72 61 70 4b 65 79 29 28 43 4b 5f , C_WrapKey)(CK_
2d9b0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 SESSION_HANDLE h
2d9c0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 Session, CK_MECH
2d9d0 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 ANISM_PTR pMecha
2d9e0 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f nism, CK_OBJECT_
2d9f0 48 41 4e 44 4c 45 20 68 57 72 61 70 70 69 6e 67 HANDLE hWrapping
2da00 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 Key, CK_OBJECT_H
2da10 41 4e 44 4c 45 20 68 4b 65 79 2c 20 43 4b 5f 42 ANDLE hKey, CK_B
2da20 59 54 45 5f 50 54 52 20 70 57 72 61 70 70 65 64 YTE_PTR pWrapped
2da30 4b 65 79 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 Key, CK_ULONG_PT
2da40 52 20 70 75 6c 57 72 61 70 70 65 64 4b 65 79 4c R pulWrappedKeyL
2da50 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 en) {..CACKEY_DE
2da60 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
2da70 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 ed.");...if (!ca
2da80 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 ckey_initialized
2da90 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
2daa0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
2dab0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a . Not initializ
2dac0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
2dad0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f (CKR_CRYPTOKI_NO
2dae0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a T_INITIALIZED);.
2daf0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 .}...CACKEY_DEBU
2db00 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
2db10 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e ing CKR_FUNCTION
2db20 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 _NOT_SUPPORTED (
2db30 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 %i)", CKR_FUNCTI
2db40 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
2db50 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f );...return(CKR_
2db60 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
2db70 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 PORTED);.}..CK_D
2db80 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 EFINE_FUNCTION(C
2db90 4b 5f 52 56 2c 20 43 5f 55 6e 77 72 61 70 4b 65 K_RV, C_UnwrapKe
2dba0 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 y)(CK_SESSION_HA
2dbb0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 NDLE hSession, C
2dbc0 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 K_MECHANISM_PTR
2dbd0 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f pMechanism, CK_O
2dbe0 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 55 6e BJECT_HANDLE hUn
2dbf0 77 72 61 70 70 69 6e 67 4b 65 79 2c 20 43 4b 5f wrappingKey, CK_
2dc00 42 59 54 45 5f 50 54 52 20 70 57 72 61 70 70 65 BYTE_PTR pWrappe
2dc10 64 4b 65 79 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 dKey, CK_ULONG u
2dc20 6c 57 72 61 70 70 65 64 4b 65 79 4c 65 6e 2c 20 lWrappedKeyLen,
2dc30 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 CK_ATTRIBUTE_PTR
2dc40 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 pTemplate, CK_U
2dc50 4c 4f 4e 47 20 75 6c 41 74 74 72 69 62 75 74 65 LONG ulAttribute
2dc60 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 Count, CK_OBJECT
2dc70 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65 _HANDLE_PTR phKe
2dc80 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 y) {..CACKEY_DEB
2dc90 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
2dca0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 d.");...if (!cac
2dcb0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 key_initialized)
2dcc0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
2dcd0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
2dce0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 Not initialize
2dcf0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
2dd00 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 CKR_CRYPTOKI_NOT
2dd10 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 _INITIALIZED);..
2dd20 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 }...CACKEY_DEBUG
2dd30 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
2dd40 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f ng CKR_FUNCTION_
2dd50 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 NOT_SUPPORTED (%
2dd60 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f i)", CKR_FUNCTIO
2dd70 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 N_NOT_SUPPORTED)
2dd80 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 ;...return(CKR_F
2dd90 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
2dda0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 ORTED);.}..CK_DE
2ddb0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b FINE_FUNCTION(CK
2ddc0 5f 52 56 2c 20 43 5f 44 65 72 69 76 65 4b 65 79 _RV, C_DeriveKey
2ddd0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e )(CK_SESSION_HAN
2dde0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b DLE hSession, CK
2ddf0 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 _MECHANISM_PTR p
2de00 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 Mechanism, CK_OB
2de10 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 42 61 73 JECT_HANDLE hBas
2de20 65 4b 65 79 2c 20 43 4b 5f 41 54 54 52 49 42 55 eKey, CK_ATTRIBU
2de30 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 TE_PTR pTemplate
2de40 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 41 74 74 , CK_ULONG ulAtt
2de50 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f ributeCount, CK_
2de60 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 OBJECT_HANDLE_PT
2de70 52 20 70 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b R phKey) {..CACK
2de80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
2de90 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 "Called.");...if
2dea0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 (!cackey_initia
2deb0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 lized) {...CACKE
2dec0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
2ded0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 Error. Not init
2dee0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 ialized.");....r
2def0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f eturn(CKR_CRYPTO
2df00 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a KI_NOT_INITIALIZ
2df10 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 ED);..}...CACKEY
2df20 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
2df30 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e eturning CKR_FUN
2df40 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
2df50 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 TED (%i)", CKR_F
2df60 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
2df70 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e ORTED);...return
2df80 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f (CKR_FUNCTION_NO
2df90 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a T_SUPPORTED);.}.
2dfa0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 .CK_DEFINE_FUNCT
2dfb0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 65 ION(CK_RV, C_See
2dfc0 64 52 61 6e 64 6f 6d 29 28 43 4b 5f 53 45 53 53 dRandom)(CK_SESS
2dfd0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 ION_HANDLE hSess
2dfe0 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 ion, CK_BYTE_PTR
2dff0 20 70 53 65 65 64 2c 20 43 4b 5f 55 4c 4f 4e 47 pSeed, CK_ULONG
2e000 20 75 6c 53 65 65 64 4c 65 6e 29 20 7b 0a 09 43 ulSeedLen) {..C
2e010 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
2e020 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
2e030 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 .if (!cackey_ini
2e040 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 tialized) {...CA
2e050 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
2e060 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 F("Error. Not i
2e070 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a nitialized.");..
2e080 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 ..return(CKR_CRY
2e090 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 PTOKI_NOT_INITIA
2e0a0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 LIZED);..}...CAC
2e0b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
2e0c0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f ("Returning CKR_
2e0d0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
2e0e0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b PORTED (%i)", CK
2e0f0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
2e100 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 UPPORTED);...ret
2e110 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e urn(CKR_FUNCTION
2e120 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
2e130 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 .}..CK_DEFINE_FU
2e140 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f NCTION(CK_RV, C_
2e150 47 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d 29 28 GenerateRandom)(
2e160 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c CK_SESSION_HANDL
2e170 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 E hSession, CK_B
2e180 59 54 45 5f 50 54 52 20 70 52 61 6e 64 6f 6d 44 YTE_PTR pRandomD
2e190 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c ata, CK_ULONG ul
2e1a0 52 61 6e 64 6f 6d 4c 65 6e 29 20 7b 0a 09 43 41 RandomLen) {..CA
2e1b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
2e1c0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
2e1d0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 if (!cackey_init
2e1e0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 ialized) {...CAC
2e1f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
2e200 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e ("Error. Not in
2e210 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 itialized.");...
2e220 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 .return(CKR_CRYP
2e230 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c TOKI_NOT_INITIAL
2e240 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b IZED);..}...CACK
2e250 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
2e260 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 "Returning CKR_F
2e270 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
2e280 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 ORTED (%i)", CKR
2e290 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
2e2a0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 PPORTED);...retu
2e2b0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f rn(CKR_FUNCTION_
2e2c0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
2e2d0 7d 0a 0a 2f 2a 20 44 65 70 72 65 63 61 74 65 64 }../* Deprecated
2e2e0 20 46 75 6e 63 74 69 6f 6e 20 2a 2f 0a 43 4b 5f Function */.CK_
2e2f0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 DEFINE_FUNCTION(
2e300 43 4b 5f 52 56 2c 20 43 5f 47 65 74 46 75 6e 63 CK_RV, C_GetFunc
2e310 74 69 6f 6e 53 74 61 74 75 73 29 28 43 4b 5f 53 tionStatus)(CK_S
2e320 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 ESSION_HANDLE hS
2e330 65 73 73 69 6f 6e 29 20 7b 0a 09 43 41 43 4b 45 ession) {..CACKE
2e340 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
2e350 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43 Called.");...CAC
2e360 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
2e370 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f ("Returning CKR_
2e380 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 FUNCTION_NOT_PAR
2e390 41 4c 4c 45 4c 20 28 25 69 29 22 2c 20 43 4b 52 ALLEL (%i)", CKR
2e3a0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 _FUNCTION_NOT_PA
2e3b0 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72 65 74 75 72 RALLEL);...retur
2e3c0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e n(CKR_FUNCTION_N
2e3d0 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 OT_PARALLEL);...
2e3e0 68 53 65 73 73 69 6f 6e 20 3d 20 68 53 65 73 73 hSession = hSess
2e3f0 69 6f 6e 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 ion; /* Supress
2e400 75 6e 75 73 65 64 20 76 61 72 69 61 62 6c 65 20 unused variable
2e410 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a warning */.}../*
2e420 20 44 65 70 72 65 63 61 74 65 64 20 46 75 6e 63 Deprecated Func
2e430 74 69 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e tion */.CK_DEFIN
2e440 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 E_FUNCTION(CK_RV
2e450 2c 20 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69 , C_CancelFuncti
2e460 6f 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 on)(CK_SESSION_H
2e470 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 ANDLE hSession)
2e480 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f {..CACKEY_DEBUG_
2e490 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
2e4a0 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 );...CACKEY_DEBU
2e4b0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
2e4c0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e ing CKR_FUNCTION
2e4d0 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 20 28 25 _NOT_PARALLEL (%
2e4e0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f i)", CKR_FUNCTIO
2e4f0 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b N_NOT_PARALLEL);
2e500 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 ...return(CKR_FU
2e510 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c NCTION_NOT_PARAL
2e520 4c 45 4c 29 3b 0a 0a 09 68 53 65 73 73 69 6f 6e LEL);...hSession
2e530 20 3d 20 68 53 65 73 73 69 6f 6e 3b 20 2f 2a 20 = hSession; /*
2e540 53 75 70 72 65 73 73 20 75 6e 75 73 65 64 20 76 Supress unused v
2e550 61 72 69 61 62 6c 65 20 77 61 72 6e 69 6e 67 20 ariable warning
2e560 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f */.}..CK_DEFINE_
2e570 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 FUNCTION(CK_RV,
2e580 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73 C_GetFunctionLis
2e590 74 29 28 43 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c t)(CK_FUNCTION_L
2e5a0 49 53 54 5f 50 54 52 5f 50 54 52 20 70 70 46 75 IST_PTR_PTR ppFu
2e5b0 6e 63 74 69 6f 6e 4c 69 73 74 29 20 7b 0a 09 43 nctionList) {..C
2e5c0 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f K_FUNCTION_LIST_
2e5d0 50 54 52 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73 PTR pFunctionLis
2e5e0 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 t;...CACKEY_DEBU
2e5f0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 G_PRINTF("Called
2e600 2e 22 29 3b 0a 0a 09 69 66 20 28 70 70 46 75 6e .");...if (ppFun
2e610 63 74 69 6f 6e 4c 69 73 74 20 3d 3d 20 4e 55 4c ctionList == NUL
2e620 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 L) {...CACKEY_DE
2e630 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
2e640 72 2e 20 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 r. ppFunctionLis
2e650 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 t is NULL.");...
2e660 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 .return(CKR_ARGU
2e670 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a MENTS_BAD);..}..
2e680 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d .pFunctionList =
2e690 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a malloc(sizeof(*
2e6a0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 29 3b pFunctionList));
2e6b0 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 ...pFunctionList
2e6c0 2d 3e 76 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 ->version.major
2e6d0 3d 20 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54 = ((CACKEY_CRYPT
2e6e0 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 OKI_VERSION_CODE
2e6f0 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b ) >> 16) & 0xff;
2e700 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d ..pFunctionList-
2e710 3e 76 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d >version.minor =
2e720 20 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f ((CACKEY_CRYPTO
2e730 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 KI_VERSION_CODE)
2e740 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a >> 8) & 0xff;..
2e750 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e .pFunctionList->
2e760 43 5f 49 6e 69 74 69 61 6c 69 7a 65 20 3d 20 43 C_Initialize = C
2e770 5f 49 6e 69 74 69 61 6c 69 7a 65 3b 0a 09 70 46 _Initialize;..pF
2e780 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 unctionList->C_F
2e790 69 6e 61 6c 69 7a 65 20 3d 20 43 5f 46 69 6e 61 inalize = C_Fina
2e7a0 6c 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e lize;..pFunction
2e7b0 4c 69 73 74 2d 3e 43 5f 47 65 74 49 6e 66 6f 20 List->C_GetInfo
2e7c0 3d 20 43 5f 47 65 74 49 6e 66 6f 3b 0a 09 70 46 = C_GetInfo;..pF
2e7d0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 unctionList->C_G
2e7e0 65 74 53 6c 6f 74 4c 69 73 74 20 3d 20 43 5f 47 etSlotList = C_G
2e7f0 65 74 53 6c 6f 74 4c 69 73 74 3b 0a 09 70 46 75 etSlotList;..pFu
2e800 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 nctionList->C_Ge
2e810 74 53 6c 6f 74 49 6e 66 6f 20 3d 20 43 5f 47 65 tSlotInfo = C_Ge
2e820 74 53 6c 6f 74 49 6e 66 6f 3b 0a 09 70 46 75 6e tSlotInfo;..pFun
2e830 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 ctionList->C_Get
2e840 54 6f 6b 65 6e 49 6e 66 6f 20 3d 20 43 5f 47 65 TokenInfo = C_Ge
2e850 74 54 6f 6b 65 6e 49 6e 66 6f 3b 0a 09 70 46 75 tTokenInfo;..pFu
2e860 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 57 61 nctionList->C_Wa
2e870 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74 20 3d itForSlotEvent =
2e880 20 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74 45 76 C_WaitForSlotEv
2e890 65 6e 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c ent;..pFunctionL
2e8a0 69 73 74 2d 3e 43 5f 47 65 74 4d 65 63 68 61 6e ist->C_GetMechan
2e8b0 69 73 6d 4c 69 73 74 20 3d 20 43 5f 47 65 74 4d ismList = C_GetM
2e8c0 65 63 68 61 6e 69 73 6d 4c 69 73 74 3b 0a 09 70 echanismList;..p
2e8d0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f FunctionList->C_
2e8e0 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f GetMechanismInfo
2e8f0 20 3d 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 = C_GetMechanis
2e900 6d 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f mInfo;..pFunctio
2e910 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 54 6f 6b nList->C_InitTok
2e920 65 6e 20 3d 20 43 5f 49 6e 69 74 54 6f 6b 65 6e en = C_InitToken
2e930 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 ;..pFunctionList
2e940 2d 3e 43 5f 49 6e 69 74 50 49 4e 20 3d 20 43 5f ->C_InitPIN = C_
2e950 49 6e 69 74 50 49 4e 3b 0a 09 70 46 75 6e 63 74 InitPIN;..pFunct
2e960 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 50 49 ionList->C_SetPI
2e970 4e 20 3d 20 43 5f 53 65 74 50 49 4e 3b 0a 09 70 N = C_SetPIN;..p
2e980 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f FunctionList->C_
2e990 4f 70 65 6e 53 65 73 73 69 6f 6e 20 3d 20 43 5f OpenSession = C_
2e9a0 4f 70 65 6e 53 65 73 73 69 6f 6e 3b 0a 09 70 46 OpenSession;..pF
2e9b0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 unctionList->C_C
2e9c0 6c 6f 73 65 53 65 73 73 69 6f 6e 20 3d 20 43 5f loseSession = C_
2e9d0 43 6c 6f 73 65 53 65 73 73 69 6f 6e 3b 0a 09 70 CloseSession;..p
2e9e0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f FunctionList->C_
2e9f0 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73 CloseAllSessions
2ea00 20 3d 20 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 = C_CloseAllSes
2ea10 73 69 6f 6e 73 3b 0a 09 70 46 75 6e 63 74 69 6f sions;..pFunctio
2ea20 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 65 73 73 nList->C_GetSess
2ea30 69 6f 6e 49 6e 66 6f 20 3d 20 43 5f 47 65 74 53 ionInfo = C_GetS
2ea40 65 73 73 69 6f 6e 49 6e 66 6f 3b 0a 09 70 46 75 essionInfo;..pFu
2ea50 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 nctionList->C_Ge
2ea60 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 20 tOperationState
2ea70 3d 20 43 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e = C_GetOperation
2ea80 53 74 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f State;..pFunctio
2ea90 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 4f 70 65 72 nList->C_SetOper
2eaa0 61 74 69 6f 6e 53 74 61 74 65 20 3d 20 43 5f 53 ationState = C_S
2eab0 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 etOperationState
2eac0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 ;..pFunctionList
2ead0 2d 3e 43 5f 4c 6f 67 69 6e 20 3d 20 43 5f 4c 6f ->C_Login = C_Lo
2eae0 67 69 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c gin;..pFunctionL
2eaf0 69 73 74 2d 3e 43 5f 4c 6f 67 6f 75 74 20 3d 20 ist->C_Logout =
2eb00 43 5f 4c 6f 67 6f 75 74 3b 0a 09 70 46 75 6e 63 C_Logout;..pFunc
2eb10 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 72 65 61 tionList->C_Crea
2eb20 74 65 4f 62 6a 65 63 74 20 3d 20 43 5f 43 72 65 teObject = C_Cre
2eb30 61 74 65 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e ateObject;..pFun
2eb40 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6f 70 ctionList->C_Cop
2eb50 79 4f 62 6a 65 63 74 20 3d 20 43 5f 43 6f 70 79 yObject = C_Copy
2eb60 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 Object;..pFuncti
2eb70 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 73 74 72 6f onList->C_Destro
2eb80 79 4f 62 6a 65 63 74 20 3d 20 43 5f 44 65 73 74 yObject = C_Dest
2eb90 72 6f 79 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e royObject;..pFun
2eba0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 ctionList->C_Get
2ebb0 4f 62 6a 65 63 74 53 69 7a 65 20 3d 20 43 5f 47 ObjectSize = C_G
2ebc0 65 74 4f 62 6a 65 63 74 53 69 7a 65 3b 0a 09 70 etObjectSize;..p
2ebd0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f FunctionList->C_
2ebe0 47 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 GetAttributeValu
2ebf0 65 20 3d 20 43 5f 47 65 74 41 74 74 72 69 62 75 e = C_GetAttribu
2ec00 74 65 56 61 6c 75 65 3b 0a 09 70 46 75 6e 63 74 teValue;..pFunct
2ec10 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 41 74 ionList->C_SetAt
2ec20 74 72 69 62 75 74 65 56 61 6c 75 65 20 3d 20 43 tributeValue = C
2ec30 5f 53 65 74 41 74 74 72 69 62 75 74 65 56 61 6c _SetAttributeVal
2ec40 75 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 ue;..pFunctionLi
2ec50 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74 st->C_FindObject
2ec60 73 49 6e 69 74 20 3d 20 43 5f 46 69 6e 64 4f 62 sInit = C_FindOb
2ec70 6a 65 63 74 73 49 6e 69 74 3b 0a 09 70 46 75 6e jectsInit;..pFun
2ec80 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e ctionList->C_Fin
2ec90 64 4f 62 6a 65 63 74 73 20 3d 20 43 5f 46 69 6e dObjects = C_Fin
2eca0 64 4f 62 6a 65 63 74 73 3b 0a 09 70 46 75 6e 63 dObjects;..pFunc
2ecb0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 tionList->C_Find
2ecc0 4f 62 6a 65 63 74 73 46 69 6e 61 6c 20 3d 20 43 ObjectsFinal = C
2ecd0 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46 69 6e 61 _FindObjectsFina
2ece0 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 l;..pFunctionLis
2ecf0 74 2d 3e 43 5f 45 6e 63 72 79 70 74 49 6e 69 74 t->C_EncryptInit
2ed00 20 3d 20 43 5f 45 6e 63 72 79 70 74 49 6e 69 74 = C_EncryptInit
2ed10 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 ;..pFunctionList
2ed20 2d 3e 43 5f 45 6e 63 72 79 70 74 20 3d 20 43 5f ->C_Encrypt = C_
2ed30 45 6e 63 72 79 70 74 3b 0a 09 70 46 75 6e 63 74 Encrypt;..pFunct
2ed40 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 ionList->C_Encry
2ed50 70 74 55 70 64 61 74 65 20 3d 20 43 5f 45 6e 63 ptUpdate = C_Enc
2ed60 72 79 70 74 55 70 64 61 74 65 3b 0a 09 70 46 75 ryptUpdate;..pFu
2ed70 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e nctionList->C_En
2ed80 63 72 79 70 74 46 69 6e 61 6c 20 3d 20 43 5f 45 cryptFinal = C_E
2ed90 6e 63 72 79 70 74 46 69 6e 61 6c 3b 0a 09 70 46 ncryptFinal;..pF
2eda0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 unctionList->C_D
2edb0 65 63 72 79 70 74 49 6e 69 74 20 3d 20 43 5f 44 ecryptInit = C_D
2edc0 65 63 72 79 70 74 49 6e 69 74 3b 0a 09 70 46 75 ecryptInit;..pFu
2edd0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 nctionList->C_De
2ede0 63 72 79 70 74 20 3d 20 43 5f 44 65 63 72 79 70 crypt = C_Decryp
2edf0 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 t;..pFunctionLis
2ee00 74 2d 3e 43 5f 44 65 63 72 79 70 74 55 70 64 61 t->C_DecryptUpda
2ee10 74 65 20 3d 20 43 5f 44 65 63 72 79 70 74 55 70 te = C_DecryptUp
2ee20 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e date;..pFunction
2ee30 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 46 List->C_DecryptF
2ee40 69 6e 61 6c 20 3d 20 43 5f 44 65 63 72 79 70 74 inal = C_Decrypt
2ee50 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f Final;..pFunctio
2ee60 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 49 nList->C_DigestI
2ee70 6e 69 74 20 3d 20 43 5f 44 69 67 65 73 74 49 6e nit = C_DigestIn
2ee80 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 it;..pFunctionLi
2ee90 73 74 2d 3e 43 5f 44 69 67 65 73 74 20 3d 20 43 st->C_Digest = C
2eea0 5f 44 69 67 65 73 74 3b 0a 09 70 46 75 6e 63 74 _Digest;..pFunct
2eeb0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 ionList->C_Diges
2eec0 74 55 70 64 61 74 65 20 3d 20 43 5f 44 69 67 65 tUpdate = C_Dige
2eed0 73 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 stUpdate;..pFunc
2eee0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 tionList->C_Dige
2eef0 73 74 4b 65 79 20 3d 20 43 5f 44 69 67 65 73 74 stKey = C_Digest
2ef00 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c Key;..pFunctionL
2ef10 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 46 69 6e ist->C_DigestFin
2ef20 61 6c 20 3d 20 43 5f 44 69 67 65 73 74 46 69 6e al = C_DigestFin
2ef30 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 al;..pFunctionLi
2ef40 73 74 2d 3e 43 5f 53 69 67 6e 49 6e 69 74 20 3d st->C_SignInit =
2ef50 20 43 5f 53 69 67 6e 49 6e 69 74 3b 0a 09 70 46 C_SignInit;..pF
2ef60 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 unctionList->C_S
2ef70 69 67 6e 20 3d 20 43 5f 53 69 67 6e 3b 0a 09 70 ign = C_Sign;..p
2ef80 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f FunctionList->C_
2ef90 53 69 67 6e 55 70 64 61 74 65 20 3d 20 43 5f 53 SignUpdate = C_S
2efa0 69 67 6e 55 70 64 61 74 65 3b 0a 09 70 46 75 6e ignUpdate;..pFun
2efb0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 ctionList->C_Sig
2efc0 6e 46 69 6e 61 6c 20 3d 20 43 5f 53 69 67 6e 46 nFinal = C_SignF
2efd0 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e inal;..pFunction
2efe0 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 52 65 63 6f List->C_SignReco
2eff0 76 65 72 49 6e 69 74 20 3d 20 43 5f 53 69 67 6e verInit = C_Sign
2f000 52 65 63 6f 76 65 72 49 6e 69 74 3b 0a 09 70 46 RecoverInit;..pF
2f010 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 unctionList->C_S
2f020 69 67 6e 52 65 63 6f 76 65 72 20 3d 20 43 5f 53 ignRecover = C_S
2f030 69 67 6e 52 65 63 6f 76 65 72 3b 0a 09 70 46 75 ignRecover;..pFu
2f040 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 nctionList->C_Ve
2f050 72 69 66 79 49 6e 69 74 20 3d 20 43 5f 56 65 72 rifyInit = C_Ver
2f060 69 66 79 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 ifyInit;..pFunct
2f070 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 ionList->C_Verif
2f080 79 20 3d 20 43 5f 56 65 72 69 66 79 3b 0a 09 70 y = C_Verify;..p
2f090 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f FunctionList->C_
2f0a0 56 65 72 69 66 79 55 70 64 61 74 65 20 3d 20 43 VerifyUpdate = C
2f0b0 5f 56 65 72 69 66 79 55 70 64 61 74 65 3b 0a 09 _VerifyUpdate;..
2f0c0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 pFunctionList->C
2f0d0 5f 56 65 72 69 66 79 46 69 6e 61 6c 20 3d 20 43 _VerifyFinal = C
2f0e0 5f 56 65 72 69 66 79 46 69 6e 61 6c 3b 0a 09 70 _VerifyFinal;..p
2f0f0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f FunctionList->C_
2f100 56 65 72 69 66 79 52 65 63 6f 76 65 72 49 6e 69 VerifyRecoverIni
2f110 74 20 3d 20 43 5f 56 65 72 69 66 79 52 65 63 6f t = C_VerifyReco
2f120 76 65 72 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 verInit;..pFunct
2f130 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 ionList->C_Verif
2f140 79 52 65 63 6f 76 65 72 20 3d 20 43 5f 56 65 72 yRecover = C_Ver
2f150 69 66 79 52 65 63 6f 76 65 72 3b 0a 09 70 46 75 ifyRecover;..pFu
2f160 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 nctionList->C_Di
2f170 67 65 73 74 45 6e 63 72 79 70 74 55 70 64 61 74 gestEncryptUpdat
2f180 65 20 3d 20 43 5f 44 69 67 65 73 74 45 6e 63 72 e = C_DigestEncr
2f190 79 70 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e yptUpdate;..pFun
2f1a0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 ctionList->C_Dec
2f1b0 72 79 70 74 44 69 67 65 73 74 55 70 64 61 74 65 ryptDigestUpdate
2f1c0 20 3d 20 43 5f 44 65 63 72 79 70 74 44 69 67 65 = C_DecryptDige
2f1d0 73 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 stUpdate;..pFunc
2f1e0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e tionList->C_Sign
2f1f0 45 6e 63 72 79 70 74 55 70 64 61 74 65 20 3d 20 EncryptUpdate =
2f200 43 5f 53 69 67 6e 45 6e 63 72 79 70 74 55 70 64 C_SignEncryptUpd
2f210 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c ate;..pFunctionL
2f220 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 56 65 ist->C_DecryptVe
2f230 72 69 66 79 55 70 64 61 74 65 20 3d 20 43 5f 44 rifyUpdate = C_D
2f240 65 63 72 79 70 74 56 65 72 69 66 79 55 70 64 61 ecryptVerifyUpda
2f250 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 te;..pFunctionLi
2f260 73 74 2d 3e 43 5f 47 65 6e 65 72 61 74 65 4b 65 st->C_GenerateKe
2f270 79 20 3d 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 y = C_GenerateKe
2f280 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 y;..pFunctionLis
2f290 74 2d 3e 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 t->C_GenerateKey
2f2a0 50 61 69 72 20 3d 20 43 5f 47 65 6e 65 72 61 74 Pair = C_Generat
2f2b0 65 4b 65 79 50 61 69 72 3b 0a 09 70 46 75 6e 63 eKeyPair;..pFunc
2f2c0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 57 72 61 70 tionList->C_Wrap
2f2d0 4b 65 79 20 3d 20 43 5f 57 72 61 70 4b 65 79 3b Key = C_WrapKey;
2f2e0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d ..pFunctionList-
2f2f0 3e 43 5f 55 6e 77 72 61 70 4b 65 79 20 3d 20 43 >C_UnwrapKey = C
2f300 5f 55 6e 77 72 61 70 4b 65 79 3b 0a 09 70 46 75 _UnwrapKey;..pFu
2f310 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 nctionList->C_De
2f320 72 69 76 65 4b 65 79 20 3d 20 43 5f 44 65 72 69 riveKey = C_Deri
2f330 76 65 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f veKey;..pFunctio
2f340 6e 4c 69 73 74 2d 3e 43 5f 53 65 65 64 52 61 6e nList->C_SeedRan
2f350 64 6f 6d 20 3d 20 43 5f 53 65 65 64 52 61 6e 64 dom = C_SeedRand
2f360 6f 6d 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 om;..pFunctionLi
2f370 73 74 2d 3e 43 5f 47 65 6e 65 72 61 74 65 52 61 st->C_GenerateRa
2f380 6e 64 6f 6d 20 3d 20 43 5f 47 65 6e 65 72 61 74 ndom = C_Generat
2f390 65 52 61 6e 64 6f 6d 3b 0a 09 70 46 75 6e 63 74 eRandom;..pFunct
2f3a0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 46 75 ionList->C_GetFu
2f3b0 6e 63 74 69 6f 6e 53 74 61 74 75 73 20 3d 20 43 nctionStatus = C
2f3c0 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53 74 61 74 _GetFunctionStat
2f3d0 75 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 us;..pFunctionLi
2f3e0 73 74 2d 3e 43 5f 43 61 6e 63 65 6c 46 75 6e 63 st->C_CancelFunc
2f3f0 74 69 6f 6e 20 3d 20 43 5f 43 61 6e 63 65 6c 46 tion = C_CancelF
2f400 75 6e 63 74 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 unction;..pFunct
2f410 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 46 75 ionList->C_GetFu
2f420 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 43 5f 47 nctionList = C_G
2f430 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a etFunctionList;.
2f440 0a 09 2a 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 ..*ppFunctionLis
2f450 74 20 3d 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73 t = pFunctionLis
2f460 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 t;...CACKEY_DEBU
2f470 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
2f480 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 ing CKR_OK (%i)"
2f490 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 , CKR_OK);...ret
2f4a0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a urn(CKR_OK);.}..