0000: 23 69 66 64 65 66 20 48 41 56 45 5f 43 4f 4e 46 #ifdef HAVE_CONF
0010: 49 47 5f 48 0a 23 69 6e 63 6c 75 64 65 20 22 63 IG_H.#include "c
0020: 6f 6e 66 69 67 2e 68 22 0a 23 65 6e 64 69 66 0a onfig.h".#endif.
0030: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 57 49 4e .#ifdef HAVE_WIN
0040: 54 59 50 45 53 5f 48 0a 23 20 20 69 6e 63 6c 75 TYPES_H.# inclu
0050: 64 65 20 3c 77 69 6e 74 79 70 65 73 2e 68 3e 0a de <wintypes.h>.
0060: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 #endif.#ifdef HA
0070: 56 45 5f 50 43 53 43 4c 49 54 45 5f 48 0a 23 20 VE_PCSCLITE_H.#
0080: 20 69 6e 63 6c 75 64 65 20 3c 70 63 73 63 6c 69 include <pcscli
0090: 74 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 te.h>.#endif.#if
00a0: 64 65 66 20 48 41 56 45 5f 57 49 4e 53 43 41 52 def HAVE_WINSCAR
00b0: 44 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c D_H.# include <
00c0: 77 69 6e 73 63 61 72 64 2e 68 3e 0a 23 65 6e 64 winscard.h>.#end
00d0: 69 66 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 if.#ifdef HAVE_S
00e0: 54 44 49 4e 54 5f 48 0a 23 20 20 69 6e 63 6c 75 TDINT_H.# inclu
00f0: 64 65 20 3c 73 74 64 69 6e 74 2e 68 3e 0a 23 65 de <stdint.h>.#e
0100: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45 ndif.#ifdef HAVE
0110: 5f 49 4e 54 54 59 50 45 53 5f 48 0a 23 20 20 69 _INTTYPES_H.# i
0120: 6e 63 6c 75 64 65 20 3c 69 6e 74 74 79 70 65 73 nclude <inttypes
0130: 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 .h>.#endif.#ifde
0140: 66 20 48 41 56 45 5f 53 54 44 4c 49 42 5f 48 0a f HAVE_STDLIB_H.
0150: 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c # include <stdl
0160: 69 62 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 ib.h>.#endif.#if
0170: 64 65 66 20 48 41 56 45 5f 55 4e 49 53 54 44 5f def HAVE_UNISTD_
0180: 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 75 6e H.# include <un
0190: 69 73 74 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 istd.h>.#endif.#
01a0: 69 66 64 65 66 20 48 41 56 45 5f 53 54 52 49 4e ifdef HAVE_STRIN
01b0: 47 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c G_H.# include <
01c0: 73 74 72 69 6e 67 2e 68 3e 0a 23 65 6e 64 69 66 string.h>.#endif
01d0: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 50 54 48 .#ifdef HAVE_PTH
01e0: 52 45 41 44 5f 48 0a 23 20 20 69 6e 63 6c 75 64 READ_H.# includ
01f0: 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 65 e <pthread.h>.#e
0200: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45 ndif.#ifdef HAVE
0210: 5f 4c 49 4d 49 54 53 5f 48 0a 23 20 20 69 6e 63 _LIMITS_H.# inc
0220: 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a lude <limits.h>.
0230: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 #endif.#ifdef HA
0240: 56 45 5f 53 54 44 49 4f 5f 48 0a 23 20 20 69 6e VE_STDIO_H.# in
0250: 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a clude <stdio.h>.
0260: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 #endif.#ifdef HA
0270: 56 45 5f 5a 4c 49 42 5f 48 0a 23 20 20 69 66 64 VE_ZLIB_H.# ifd
0280: 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 23 20 20 ef HAVE_LIBZ.#
0290: 20 20 69 6e 63 6c 75 64 65 20 3c 7a 6c 69 62 2e include <zlib.
02a0: 68 3e 0a 23 20 20 65 6e 64 69 66 0a 23 65 6c 73 h>.# endif.#els
02b0: 65 0a 23 20 20 69 66 64 65 66 20 48 41 56 45 5f e.# ifdef HAVE_
02c0: 4c 49 42 5a 0a 23 20 20 20 20 75 6e 64 65 66 20 LIBZ.# undef
02d0: 48 41 56 45 5f 4c 49 42 5a 0a 23 20 20 65 6e 64 HAVE_LIBZ.# end
02e0: 69 66 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 if.#endif..#defi
02f0: 6e 65 20 43 4b 5f 50 54 52 20 2a 0a 23 64 65 66 ne CK_PTR *.#def
0300: 69 6e 65 20 43 4b 5f 44 45 46 49 4e 45 5f 46 55 ine CK_DEFINE_FU
0310: 4e 43 54 49 4f 4e 28 72 65 74 75 72 6e 54 79 70 NCTION(returnTyp
0320: 65 2c 20 6e 61 6d 65 29 20 72 65 74 75 72 6e 54 e, name) returnT
0330: 79 70 65 20 6e 61 6d 65 0a 23 64 65 66 69 6e 65 ype name.#define
0340: 20 43 4b 5f 44 45 43 4c 41 52 45 5f 46 55 4e 43 CK_DECLARE_FUNC
0350: 54 49 4f 4e 28 72 65 74 75 72 6e 54 79 70 65 2c TION(returnType,
0360: 20 6e 61 6d 65 29 20 72 65 74 75 72 6e 54 79 70 name) returnTyp
0370: 65 20 6e 61 6d 65 0a 23 64 65 66 69 6e 65 20 43 e name.#define C
0380: 4b 5f 44 45 43 4c 41 52 45 5f 46 55 4e 43 54 49 K_DECLARE_FUNCTI
0390: 4f 4e 5f 50 4f 49 4e 54 45 52 28 72 65 74 75 72 ON_POINTER(retur
03a0: 6e 54 79 70 65 2c 20 6e 61 6d 65 29 20 72 65 74 nType, name) ret
03b0: 75 72 6e 54 79 70 65 20 28 2a 20 6e 61 6d 65 29 urnType (* name)
03c0: 0a 23 64 65 66 69 6e 65 20 43 4b 5f 43 41 4c 4c .#define CK_CALL
03d0: 42 41 43 4b 5f 46 55 4e 43 54 49 4f 4e 28 72 65 BACK_FUNCTION(re
03e0: 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d 65 29 20 turnType, name)
03f0: 72 65 74 75 72 6e 54 79 70 65 20 28 2a 20 6e 61 returnType (* na
0400: 6d 65 29 0a 23 69 66 6e 64 65 66 20 4e 55 4c 4c me).#ifndef NULL
0410: 5f 50 54 52 0a 23 20 20 64 65 66 69 6e 65 20 4e _PTR.# define N
0420: 55 4c 4c 5f 50 54 52 20 30 0a 23 65 6e 64 69 66 ULL_PTR 0.#endif
0430: 0a 0a 23 69 6e 63 6c 75 64 65 20 22 70 6b 63 73 ..#include "pkcs
0440: 31 31 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 11.h".#include "
0450: 70 6b 63 73 31 31 6e 2e 68 22 0a 23 69 6e 63 6c pkcs11n.h".#incl
0460: 75 64 65 20 22 61 73 6e 31 2d 78 35 30 39 2e 68 ude "asn1-x509.h
0470: 22 0a 23 69 6e 63 6c 75 64 65 20 22 73 68 61 31 ".#include "sha1
0480: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 6d 64 .h".#include "md
0490: 35 2e 68 22 0a 0a 2f 2a 0a 20 2a 20 49 6e 63 6c 5.h"../*. * Incl
04a0: 75 64 65 20 74 68 65 73 65 20 73 6f 75 72 63 65 ude these source
04b0: 20 66 69 6c 65 73 20 69 6e 20 74 68 69 73 20 74 files in this t
04c0: 72 61 6e 73 6c 61 74 69 6f 6e 20 75 6e 69 74 20 ranslation unit
04d0: 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 62 so that we can b
04e0: 69 6e 64 20 74 6f 0a 20 2a 20 66 75 6e 63 74 69 ind to. * functi
04f0: 6f 6e 73 20 61 6e 64 20 6e 6f 74 20 69 6e 63 6c ons and not incl
0500: 75 64 65 20 61 6e 79 20 73 79 6d 62 6f 6c 73 20 ude any symbols
0510: 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73 68 in the output sh
0520: 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 2a 2f ared object.. */
0530: 0a 23 69 6e 63 6c 75 64 65 20 22 61 73 6e 31 2d .#include "asn1-
0540: 78 35 30 39 2e 63 22 0a 23 69 6e 63 6c 75 64 65 x509.c".#include
0550: 20 22 73 68 61 31 2e 63 22 0a 23 69 6e 63 6c 75 "sha1.c".#inclu
0560: 64 65 20 22 6d 64 35 2e 63 22 0a 0a 23 69 66 6e de "md5.c"..#ifn
0570: 64 65 66 20 43 41 43 4b 45 59 5f 43 52 59 50 54 def CACKEY_CRYPT
0580: 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 OKI_VERSION_CODE
0590: 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 .# define CACKE
05a0: 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 Y_CRYPTOKI_VERSI
05b0: 4f 4e 5f 43 4f 44 45 20 30 78 30 32 31 65 30 30 ON_CODE 0x021e00
05c0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 47 53 43 2d .#endif../* GSC-
05d0: 49 53 20 76 32 2e 31 20 44 65 66 69 6e 69 74 69 IS v2.1 Definiti
05e0: 6f 6e 73 20 2a 2f 0a 2f 2a 2a 20 43 6c 61 73 73 ons */./** Class
05f0: 65 73 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 es **/.#define G
0600: 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 SCIS_CLASS_ISO78
0610: 31 36 20 20 20 20 20 20 20 20 20 20 20 30 78 30 16 0x0
0620: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 0.#define GSCIS_
0630: 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 CLASS_GLOBAL_PLA
0640: 54 46 4f 52 4d 20 20 20 30 78 38 30 0a 0a 2f 2a TFORM 0x80../*
0650: 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a * Instructions *
0660: 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 */.#define GSCIS
0670: 5f 49 4e 53 54 52 5f 47 45 54 5f 52 45 53 50 4f _INSTR_GET_RESPO
0680: 4e 53 45 20 20 20 20 20 20 30 78 43 30 0a 23 64 NSE 0xC0.#d
0690: 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 efine GSCIS_INST
06a0: 52 5f 52 45 41 44 5f 42 49 4e 41 52 59 20 20 20 R_READ_BINARY
06b0: 20 20 20 20 30 78 42 30 0a 23 64 65 66 69 6e 65 0xB0.#define
06c0: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 55 50 44 GSCIS_INSTR_UPD
06d0: 41 54 45 5f 42 49 4e 41 52 59 20 20 20 20 20 30 ATE_BINARY 0
06e0: 78 44 36 0a 23 64 65 66 69 6e 65 20 47 53 43 49 xD6.#define GSCI
06f0: 53 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54 20 20 S_INSTR_SELECT
0700: 20 20 20 20 20 20 20 20 20 20 30 78 41 34 0a 23 0xA4.#
0710: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 define GSCIS_INS
0720: 54 52 5f 45 58 54 45 52 4e 41 4c 5f 41 55 54 48 TR_EXTERNAL_AUTH
0730: 20 20 20 20 20 30 78 38 32 0a 23 64 65 66 69 6e 0x82.#defin
0740: 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45 e GSCIS_INSTR_GE
0750: 54 5f 43 48 41 4c 4c 45 4e 47 45 20 20 20 20 20 T_CHALLENGE
0760: 30 78 38 34 0a 23 64 65 66 69 6e 65 20 47 53 43 0x84.#define GSC
0770: 49 53 5f 49 4e 53 54 52 5f 49 4e 54 45 52 4e 41 IS_INSTR_INTERNA
0780: 4c 5f 41 55 54 48 20 20 20 20 20 30 78 38 38 0a L_AUTH 0x88.
0790: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e #define GSCIS_IN
07a0: 53 54 52 5f 56 45 52 49 46 59 20 20 20 20 20 20 STR_VERIFY
07b0: 20 20 20 20 20 20 30 78 32 30 0a 23 64 65 66 69 0x20.#defi
07c0: 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 ne GSCIS_INSTR_S
07d0: 49 47 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 IGN
07e0: 20 30 78 32 41 0a 23 64 65 66 69 6e 65 20 47 53 0x2A.#define GS
07f0: 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 50 52 CIS_INSTR_GET_PR
0800: 4f 50 20 20 20 20 20 20 20 20 20 20 30 78 35 36 OP 0x56
0810: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 .#define GSCIS_I
0820: 4e 53 54 52 5f 47 45 54 5f 41 43 52 20 20 20 20 NSTR_GET_ACR
0830: 20 20 20 20 20 20 20 30 78 34 43 0a 23 64 65 66 0x4C.#def
0840: 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f ine GSCIS_INSTR_
0850: 52 45 41 44 5f 42 55 46 46 45 52 20 20 20 20 20 READ_BUFFER
0860: 20 20 30 78 35 32 0a 23 64 65 66 69 6e 65 20 47 0x52.#define G
0870: 53 43 49 53 5f 49 4e 53 54 52 5f 53 49 47 4e 44 SCIS_INSTR_SIGND
0880: 45 43 52 59 50 54 20 20 20 20 20 20 20 30 78 34 ECRYPT 0x4
0890: 32 0a 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 2..#define GSCIS
08a0: 5f 50 41 52 41 4d 5f 53 45 4c 45 43 54 5f 41 50 _PARAM_SELECT_AP
08b0: 50 4c 45 54 20 20 20 20 20 30 78 30 34 0a 0a 2f PLET 0x04../
08c0: 2a 2a 20 54 61 67 73 20 2a 2a 2f 0a 2f 2a 2a 2a ** Tags **/./***
08d0: 20 43 43 43 20 54 61 67 73 20 2a 2a 2a 2f 0a 23 CCC Tags ***/.#
08e0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 define GSCIS_TAG
08f0: 5f 43 41 52 44 49 44 20 20 20 20 20 20 20 20 20 _CARDID
0900: 20 20 20 20 20 30 78 46 30 0a 23 64 65 66 69 6e 0xF0.#defin
0910: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 43 43 5f e GSCIS_TAG_CCC_
0920: 56 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 VER
0930: 30 78 46 31 0a 23 64 65 66 69 6e 65 20 47 53 43 0xF1.#define GSC
0940: 49 53 5f 54 41 47 5f 43 43 47 5f 56 45 52 20 20 IS_TAG_CCG_VER
0950: 20 20 20 20 20 20 20 20 20 20 20 30 78 46 32 0a 0xF2.
0960: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 #define GSCIS_TA
0970: 47 5f 43 41 52 44 55 52 4c 20 20 20 20 20 20 20 G_CARDURL
0980: 20 20 20 20 20 20 30 78 46 33 0a 23 64 65 66 69 0xF3.#defi
0990: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 ne GSCIS_TAG_PKC
09a0: 53 31 35 20 20 20 20 20 20 20 20 20 20 20 20 20 S15
09b0: 20 30 78 46 34 0a 23 64 65 66 69 6e 65 20 47 53 0xF4.#define GS
09c0: 43 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 41 CIS_TAG_REG_DATA
09d0: 5f 4d 4f 44 45 4c 20 20 20 20 20 20 30 78 46 35 _MODEL 0xF5
09e0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 .#define GSCIS_T
09f0: 41 47 5f 41 43 52 5f 54 41 42 4c 45 20 20 20 20 AG_ACR_TABLE
0a00: 20 20 20 20 20 20 20 30 78 46 36 0a 23 64 65 66 0xF6.#def
0a10: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 ine GSCIS_TAG_CA
0a20: 52 44 5f 41 50 44 55 20 20 20 20 20 20 20 20 20 RD_APDU
0a30: 20 20 30 78 46 37 0a 23 64 65 66 69 6e 65 20 47 0xF7.#define G
0a40: 53 43 49 53 5f 54 41 47 5f 52 45 44 49 52 45 43 SCIS_TAG_REDIREC
0a50: 54 49 4f 4e 20 20 20 20 20 20 20 20 20 30 78 46 TION 0xF
0a60: 41 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f A.#define GSCIS_
0a70: 54 41 47 5f 43 54 20 20 20 20 20 20 20 20 20 20 TAG_CT
0a80: 20 20 20 20 20 20 20 20 30 78 46 42 0a 23 64 65 0xFB.#de
0a90: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53 fine GSCIS_TAG_S
0aa0: 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 T
0ab0: 20 20 20 30 78 46 43 0a 23 64 65 66 69 6e 65 20 0xFC.#define
0ac0: 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54 43 43 GSCIS_TAG_NEXTCC
0ad0: 43 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 C 0x
0ae0: 46 44 0a 0a 2f 2a 2a 2a 20 47 65 6e 65 72 61 6c FD../*** General
0af0: 20 2d 20 45 46 20 32 32 30 30 20 2a 2a 2a 2f 0a - EF 2200 ***/.
0b00: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 #define GSCIS_TA
0b10: 47 5f 46 4e 41 4d 45 20 20 20 20 20 20 20 20 20 G_FNAME
0b20: 20 20 20 20 20 20 30 78 30 31 0a 23 64 65 66 69 0x01.#defi
0b30: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41 ne GSCIS_TAG_MNA
0b40: 4d 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ME
0b50: 20 30 78 30 32 0a 23 64 65 66 69 6e 65 20 47 53 0x02.#define GS
0b60: 43 49 53 5f 54 41 47 5f 4c 4e 41 4d 45 20 20 20 CIS_TAG_LNAME
0b70: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30 33 0x03
0b80: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 .#define GSCIS_T
0b90: 41 47 5f 53 55 46 46 49 58 20 20 20 20 20 20 20 AG_SUFFIX
0ba0: 20 20 20 20 20 20 20 30 78 30 34 0a 23 64 65 66 0x04.#def
0bb0: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 47 4f ine GSCIS_TAG_GO
0bc0: 56 54 5f 41 47 45 4e 43 59 20 20 20 20 20 20 20 VT_AGENCY
0bd0: 20 20 30 78 30 35 0a 23 64 65 66 69 6e 65 20 47 0x05.#define G
0be0: 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 20 SCIS_TAG_BUREAU
0bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30 0x0
0c00: 36 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 6.#define GSCIS_
0c10: 54 41 47 5f 42 55 52 45 41 55 5f 43 4f 44 45 20 TAG_BUREAU_CODE
0c20: 20 20 20 20 20 20 20 20 30 78 30 37 0a 23 64 65 0x07.#de
0c30: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 44 fine GSCIS_TAG_D
0c40: 45 50 54 5f 43 4f 44 45 20 20 20 20 20 20 20 20 EPT_CODE
0c50: 20 20 20 30 78 30 38 0a 23 64 65 66 69 6e 65 20 0x08.#define
0c60: 47 53 43 49 53 5f 54 41 47 5f 54 49 54 4c 45 20 GSCIS_TAG_TITLE
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 0x
0c80: 30 39 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 09.#define GSCIS
0c90: 5f 54 41 47 5f 42 55 49 4c 44 49 4e 47 20 20 20 _TAG_BUILDING
0ca0: 20 20 20 20 20 20 20 20 20 30 78 31 30 0a 23 64 0x10.#d
0cb0: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f efine GSCIS_TAG_
0cc0: 4f 46 46 49 43 45 5f 41 44 44 52 31 20 20 20 20 OFFICE_ADDR1
0cd0: 20 20 20 20 30 78 31 31 0a 23 64 65 66 69 6e 65 0x11.#define
0ce0: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 GSCIS_TAG_OFFIC
0cf0: 45 5f 41 44 44 52 32 20 20 20 20 20 20 20 20 30 E_ADDR2 0
0d00: 78 31 32 0a 23 64 65 66 69 6e 65 20 47 53 43 49 x12.#define GSCI
0d10: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54 S_TAG_OFFICE_CIT
0d20: 59 20 20 20 20 20 20 20 20 20 30 78 31 33 0a 23 Y 0x13.#
0d30: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 define GSCIS_TAG
0d40: 5f 4f 46 46 49 43 45 5f 53 54 41 54 45 20 20 20 _OFFICE_STATE
0d50: 20 20 20 20 20 30 78 31 34 0a 23 64 65 66 69 6e 0x14.#defin
0d60: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 e GSCIS_TAG_OFFI
0d70: 43 45 5f 5a 49 50 20 20 20 20 20 20 20 20 20 20 CE_ZIP
0d80: 30 78 31 35 0a 23 64 65 66 69 6e 65 20 47 53 43 0x15.#define GSC
0d90: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 4f IS_TAG_OFFICE_CO
0da0: 55 4e 54 52 59 20 20 20 20 20 20 30 78 31 36 0a UNTRY 0x16.
0db0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 #define GSCIS_TA
0dc0: 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 20 20 G_OFFICE_PHONE
0dd0: 20 20 20 20 20 20 30 78 31 37 0a 23 64 65 66 69 0x17.#defi
0de0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 ne GSCIS_TAG_OFF
0df0: 49 43 45 5f 50 48 4f 4e 45 5f 45 58 54 20 20 20 ICE_PHONE_EXT
0e00: 20 30 78 31 38 0a 23 64 65 66 69 6e 65 20 47 53 0x18.#define GS
0e10: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 46 CIS_TAG_OFFICE_F
0e20: 41 58 20 20 20 20 20 20 20 20 20 20 30 78 31 39 AX 0x19
0e30: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 .#define GSCIS_T
0e40: 41 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c 20 AG_OFFICE_EMAIL
0e50: 20 20 20 20 20 20 20 30 78 31 41 0a 23 64 65 66 0x1A.#def
0e60: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 ine GSCIS_TAG_OF
0e70: 46 49 43 45 5f 52 4f 4f 4d 20 20 20 20 20 20 20 FICE_ROOM
0e80: 20 20 30 78 31 42 0a 23 64 65 66 69 6e 65 20 47 0x1B.#define G
0e90: 53 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f SCIS_TAG_NONGOV_
0ea0: 41 47 45 4e 43 59 20 20 20 20 20 20 20 30 78 31 AGENCY 0x1
0eb0: 43 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f C.#define GSCIS_
0ec0: 54 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41 54 TAG_SSN_DESIGNAT
0ed0: 4f 52 20 20 20 20 20 20 30 78 31 44 0a 0a 2f 2a OR 0x1D../*
0ee0: 2a 2a 20 50 49 49 20 2d 20 45 46 20 32 31 30 30 ** PII - EF 2100
0ef0: 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 ***/.#define GS
0f00: 43 49 53 5f 54 41 47 5f 53 53 4e 20 20 20 20 20 CIS_TAG_SSN
0f10: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 32 30 0x20
0f20: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 .#define GSCIS_T
0f30: 41 47 5f 44 4f 42 20 20 20 20 20 20 20 20 20 20 AG_DOB
0f40: 20 20 20 20 20 20 20 30 78 32 31 0a 23 64 65 66 0x21.#def
0f50: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 47 45 ine GSCIS_TAG_GE
0f60: 4e 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 NDER
0f70: 20 20 30 78 32 32 0a 0a 2f 2a 2a 2a 20 4c 6f 67 0x22../*** Log
0f80: 69 6e 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d in Information -
0f90: 20 45 46 20 34 30 30 30 20 2a 2a 2a 2f 0a 23 64 EF 4000 ***/.#d
0fa0: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f efine GSCIS_TAG_
0fb0: 55 53 45 52 49 44 20 20 20 20 20 20 20 20 20 20 USERID
0fc0: 20 20 20 20 30 78 34 30 0a 23 64 65 66 69 6e 65 0x40.#define
0fd0: 20 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49 GSCIS_TAG_DOMAI
0fe0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 N 0
0ff0: 78 34 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49 x41.#define GSCI
1000: 53 5f 54 41 47 5f 50 41 53 53 57 4f 52 44 20 20 S_TAG_PASSWORD
1010: 20 20 20 20 20 20 20 20 20 20 30 78 34 32 0a 0a 0x42..
1020: 2f 2a 2a 2a 20 43 61 72 64 20 49 6e 66 6f 72 6d /*** Card Inform
1030: 61 74 69 6f 6e 20 2d 20 45 46 20 35 30 30 30 20 ation - EF 5000
1040: 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 ***/.#define GSC
1050: 49 53 5f 54 41 47 5f 49 53 53 55 45 52 49 44 20 IS_TAG_ISSUERID
1060: 20 20 20 20 20 20 20 20 20 20 20 30 78 35 30 0a 0x50.
1070: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 #define GSCIS_TA
1080: 47 5f 53 45 52 4e 4f 20 20 20 20 20 20 20 20 20 G_SERNO
1090: 20 20 20 20 20 20 30 78 35 31 0a 23 64 65 66 69 0x51.#defi
10a0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53 ne GSCIS_TAG_ISS
10b0: 55 45 5f 44 41 54 45 20 20 20 20 20 20 20 20 20 UE_DATE
10c0: 20 30 78 35 32 0a 23 64 65 66 69 6e 65 20 47 53 0x52.#define GS
10d0: 43 49 53 5f 54 41 47 5f 45 58 50 49 52 45 5f 44 CIS_TAG_EXPIRE_D
10e0: 41 54 45 20 20 20 20 20 20 20 20 20 30 78 35 33 ATE 0x53
10f0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 .#define GSCIS_T
1100: 41 47 5f 43 41 52 44 5f 54 59 50 45 20 20 20 20 AG_CARD_TYPE
1110: 20 20 20 20 20 20 20 30 78 35 34 0a 23 64 65 66 0x54.#def
1120: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53 45 ine GSCIS_TAG_SE
1130: 43 55 52 49 54 59 5f 43 4f 44 45 20 20 20 20 20 CURITY_CODE
1140: 20 20 30 78 35 37 0a 23 64 65 66 69 6e 65 20 47 0x57.#define G
1150: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f SCIS_TAG_CARDID_
1160: 41 49 44 20 20 20 20 20 20 20 20 20 20 30 78 35 AID 0x5
1170: 38 0a 0a 2f 2a 2a 2a 20 50 4b 49 20 49 6e 66 6f 8../*** PKI Info
1180: 72 6d 61 74 69 6f 6e 20 2d 20 45 46 20 37 30 30 rmation - EF 700
1190: 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 0 ***/.#define G
11a0: 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 SCIS_TAG_CERTIFI
11b0: 43 41 54 45 20 20 20 20 20 20 20 20 20 30 78 37 CATE 0x7
11c0: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 0.#define GSCIS_
11d0: 54 41 47 5f 43 45 52 54 5f 49 53 53 55 45 5f 44 TAG_CERT_ISSUE_D
11e0: 41 54 45 20 20 20 20 20 30 78 37 31 0a 23 64 65 ATE 0x71.#de
11f0: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 fine GSCIS_TAG_C
1200: 45 52 54 5f 45 58 50 49 52 45 5f 44 41 54 45 20 ERT_EXPIRE_DATE
1210: 20 20 20 30 78 37 32 0a 0a 2f 2a 2a 20 41 70 70 0x72../** App
1220: 6c 65 74 20 49 44 73 20 2a 2a 2f 0a 23 64 65 66 let IDs **/.#def
1230: 69 6e 65 20 47 53 43 49 53 5f 41 49 44 5f 43 43 ine GSCIS_AID_CC
1240: 43 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 C
1250: 20 20 30 78 41 30 2c 20 30 78 30 30 2c 20 30 78 0xA0, 0x00, 0x
1260: 30 30 2c 20 30 78 30 31 2c 20 30 78 31 36 2c 20 00, 0x01, 0x16,
1270: 30 78 44 42 2c 20 30 78 30 30 0a 0a 2f 2a 20 4d 0xDB, 0x00../* M
1280: 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 64 aximum size of d
1290: 61 74 61 20 70 6f 72 74 69 6f 6e 20 6f 66 20 41 ata portion of A
12a0: 50 44 55 73 20 2a 2f 0a 2f 2a 2a 20 44 6f 20 6e PDUs */./** Do n
12b0: 6f 74 20 73 65 74 20 74 68 69 73 20 61 62 6f 76 ot set this abov
12c0: 65 20 32 35 30 20 2a 2a 2f 0a 23 64 65 66 69 6e e 250 **/.#defin
12d0: 65 20 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 e CACKEY_APDU_MT
12e0: 55 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 U
12f0: 32 35 30 0a 0a 2f 2a 20 41 54 52 20 49 66 20 6e 250../* ATR If n
1300: 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a ot available */.
1310: 23 69 66 6e 64 65 66 20 4d 41 58 5f 41 54 52 5f #ifndef MAX_ATR_
1320: 53 49 5a 45 0a 23 64 65 66 69 6e 65 20 4d 41 58 SIZE.#define MAX
1330: 5f 41 54 52 5f 53 49 5a 45 20 31 30 32 34 0a 23 _ATR_SIZE 1024.#
1340: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 43 41 endif..#ifdef CA
1350: 43 4b 45 59 5f 44 45 42 55 47 0a 23 20 20 69 66 CKEY_DEBUG.# if
1360: 64 65 66 20 48 41 56 45 5f 54 49 4d 45 5f 48 0a def HAVE_TIME_H.
1370: 23 20 20 20 20 69 6e 63 6c 75 64 65 20 3c 74 69 # include <ti
1380: 6d 65 2e 68 3e 0a 73 74 61 74 69 63 20 74 69 6d me.h>.static tim
1390: 65 5f 74 20 63 61 63 6b 65 79 5f 64 65 62 75 67 e_t cackey_debug
13a0: 5f 73 74 61 72 74 5f 74 69 6d 65 20 3d 20 30 3b _start_time = 0;
13b0: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 43 41 43 .# define CAC
13c0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 54 KEY_DEBUG_PRINTT
13d0: 49 4d 45 20 7b 20 69 66 20 28 63 61 63 6b 65 79 IME { if (cackey
13e0: 5f 64 65 62 75 67 5f 73 74 61 72 74 5f 74 69 6d _debug_start_tim
13f0: 65 20 3d 3d 20 30 29 20 7b 20 63 61 63 6b 65 79 e == 0) { cackey
1400: 5f 64 65 62 75 67 5f 73 74 61 72 74 5f 74 69 6d _debug_start_tim
1410: 65 20 3d 20 74 69 6d 65 28 4e 55 4c 4c 29 3b 20 e = time(NULL);
1420: 7d 3b 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 }; fprintf(stder
1430: 72 2c 20 22 5b 25 6c 75 5d 3a 20 22 2c 20 28 75 r, "[%lu]: ", (u
1440: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 74 nsigned long) (t
1450: 69 6d 65 28 4e 55 4c 4c 29 20 2d 20 63 61 63 6b ime(NULL) - cack
1460: 65 79 5f 64 65 62 75 67 5f 73 74 61 72 74 5f 74 ey_debug_start_t
1470: 69 6d 65 29 29 3b 20 7d 0a 23 20 20 65 6c 73 65 ime)); }.# else
1480: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 43 41 43 .# define CAC
1490: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 54 KEY_DEBUG_PRINTT
14a0: 49 4d 45 20 2f 2a 2a 2f 0a 23 20 20 65 6e 64 69 IME /**/.# endi
14b0: 66 0a 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 f..# define CAC
14c0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
14d0: 28 78 2e 2e 2e 29 20 7b 20 43 41 43 4b 45 59 5f (x...) { CACKEY_
14e0: 44 45 42 55 47 5f 50 52 49 4e 54 54 49 4d 45 3b DEBUG_PRINTTIME;
14f0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c fprintf(stderr,
1500: 20 22 25 73 28 29 3a 25 69 3a 20 22 2c 20 5f 5f "%s():%i: ", __
1510: 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f func__, __LINE__
1520: 29 3b 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 ); fprintf(stder
1530: 72 2c 20 78 29 3b 20 66 70 72 69 6e 74 66 28 73 r, x); fprintf(s
1540: 74 64 65 72 72 2c 20 22 5c 6e 22 29 3b 20 66 66 tderr, "\n"); ff
1550: 6c 75 73 68 28 73 74 64 65 72 72 29 3b 20 7d 0a lush(stderr); }.
1560: 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 # define CACKEY
1570: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 _DEBUG_PRINTBUF(
1580: 66 2c 20 78 2c 20 79 29 20 7b 20 75 6e 73 69 67 f, x, y) { unsig
1590: 6e 65 64 20 63 68 61 72 20 2a 54 4d 50 42 55 46 ned char *TMPBUF
15a0: 3b 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 ; unsigned long
15b0: 69 64 78 3b 20 54 4d 50 42 55 46 20 3d 20 28 75 idx; TMPBUF = (u
15c0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 nsigned char *)
15d0: 28 78 29 3b 20 43 41 43 4b 45 59 5f 44 45 42 55 (x); CACKEY_DEBU
15e0: 47 5f 50 52 49 4e 54 54 49 4d 45 3b 20 66 70 72 G_PRINTTIME; fpr
15f0: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 intf(stderr, "%s
1600: 28 29 3a 25 69 3a 20 25 73 20 20 28 25 73 2f 25 ():%i: %s (%s/%
1610: 6c 75 20 3d 20 7b 25 30 32 78 22 2c 20 5f 5f 66 lu = {%02x", __f
1620: 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 2c unc__, __LINE__,
1630: 20 66 2c 20 23 78 2c 20 28 75 6e 73 69 67 6e 65 f, #x, (unsigne
1640: 64 20 6c 6f 6e 67 29 20 28 79 29 2c 20 54 4d 50 d long) (y), TMP
1650: 42 55 46 5b 30 5d 29 3b 20 66 6f 72 20 28 69 64 BUF[0]); for (id
1660: 78 20 3d 20 31 3b 20 69 64 78 20 3c 20 28 79 29 x = 1; idx < (y)
1670: 3b 20 69 64 78 2b 2b 29 20 7b 20 66 70 72 69 6e ; idx++) { fprin
1680: 74 66 28 73 74 64 65 72 72 2c 20 22 2c 20 25 30 tf(stderr, ", %0
1690: 32 78 22 2c 20 54 4d 50 42 55 46 5b 69 64 78 5d 2x", TMPBUF[idx]
16a0: 29 3b 20 7d 3b 20 66 70 72 69 6e 74 66 28 73 74 ); }; fprintf(st
16b0: 64 65 72 72 2c 20 22 7d 29 5c 6e 22 29 3b 20 66 derr, "})\n"); f
16c0: 66 6c 75 73 68 28 73 74 64 65 72 72 29 3b 20 7d flush(stderr); }
16d0: 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 .# define CACKE
16e0: 59 5f 44 45 42 55 47 5f 50 45 52 52 4f 52 28 78 Y_DEBUG_PERROR(x
16f0: 29 20 7b 20 66 70 72 69 6e 74 66 28 73 74 64 65 ) { fprintf(stde
1700: 72 72 2c 20 22 25 73 28 29 3a 25 69 3a 20 22 2c rr, "%s():%i: ",
1710: 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e __func__, __LIN
1720: 45 5f 5f 29 3b 20 43 41 43 4b 45 59 5f 44 45 42 E__); CACKEY_DEB
1730: 55 47 5f 50 52 49 4e 54 54 49 4d 45 3b 20 70 65 UG_PRINTTIME; pe
1740: 72 72 6f 72 28 78 29 3b 20 66 66 6c 75 73 68 28 rror(x); fflush(
1750: 73 74 64 65 72 72 29 3b 20 7d 0a 23 20 20 64 65 stderr); }.# de
1760: 66 69 6e 65 20 66 72 65 65 28 78 29 20 7b 20 43 fine free(x) { C
1770: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1780: 54 46 28 22 46 52 45 45 28 25 70 29 20 28 25 73 TF("FREE(%p) (%s
1790: 29 22 2c 20 78 2c 20 23 78 29 3b 20 66 72 65 65 )", x, #x); free
17a0: 28 78 29 3b 20 7d 0a 0a 73 74 61 74 69 63 20 76 (x); }..static v
17b0: 6f 69 64 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 oid *CACKEY_DEBU
17c0: 47 5f 46 55 4e 43 5f 4d 41 4c 4c 4f 43 28 73 69 G_FUNC_MALLOC(si
17d0: 7a 65 5f 74 20 73 69 7a 65 2c 20 63 6f 6e 73 74 ze_t size, const
17e0: 20 63 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 char *func, int
17f0: 20 6c 69 6e 65 29 20 7b 0a 09 76 6f 69 64 20 2a line) {..void *
1800: 72 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c retval;...retval
1810: 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 29 3b = malloc(size);
1820: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1830: 50 52 49 4e 54 54 49 4d 45 3b 0a 09 66 70 72 69 PRINTTIME;..fpri
1840: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 28 ntf(stderr, "%s(
1850: 29 3a 25 69 3a 20 22 2c 20 66 75 6e 63 2c 20 6c ):%i: ", func, l
1860: 69 6e 65 29 3b 0a 09 66 70 72 69 6e 74 66 28 73 ine);..fprintf(s
1870: 74 64 65 72 72 2c 20 22 4d 41 4c 4c 4f 43 28 29 tderr, "MALLOC()
1880: 20 3d 20 25 70 22 2c 20 72 65 74 76 61 6c 29 3b = %p", retval);
1890: 0a 09 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 ..fprintf(stderr
18a0: 2c 20 22 5c 6e 22 29 3b 0a 09 66 66 6c 75 73 68 , "\n");..fflush
18b0: 28 73 74 64 65 72 72 29 3b 0a 0a 09 72 65 74 75 (stderr);...retu
18c0: 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 rn(retval);.}..s
18d0: 74 61 74 69 63 20 76 6f 69 64 20 2a 43 41 43 4b tatic void *CACK
18e0: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 52 45 EY_DEBUG_FUNC_RE
18f0: 41 4c 4c 4f 43 28 76 6f 69 64 20 2a 70 74 72 2c ALLOC(void *ptr,
1900: 20 73 69 7a 65 5f 74 20 73 69 7a 65 2c 20 63 6f size_t size, co
1910: 6e 73 74 20 63 68 61 72 20 2a 66 75 6e 63 2c 20 nst char *func,
1920: 69 6e 74 20 6c 69 6e 65 29 20 7b 0a 09 76 6f 69 int line) {..voi
1930: 64 20 2a 72 65 74 76 61 6c 3b 0a 0a 09 72 65 74 d *retval;...ret
1940: 76 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 70 74 val = realloc(pt
1950: 72 2c 20 73 69 7a 65 29 3b 0a 0a 09 69 66 20 28 r, size);...if (
1960: 72 65 74 76 61 6c 20 21 3d 20 70 74 72 29 20 7b retval != ptr) {
1970: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1980: 50 52 49 4e 54 54 49 4d 45 3b 0a 09 09 66 70 72 PRINTTIME;...fpr
1990: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 intf(stderr, "%s
19a0: 28 29 3a 25 69 3a 20 22 2c 20 66 75 6e 63 2c 20 ():%i: ", func,
19b0: 6c 69 6e 65 29 3b 0a 09 09 66 70 72 69 6e 74 66 line);...fprintf
19c0: 28 73 74 64 65 72 72 2c 20 22 52 45 41 4c 4c 4f (stderr, "REALLO
19d0: 43 28 25 70 29 20 3d 20 25 70 22 2c 20 70 74 72 C(%p) = %p", ptr
19e0: 2c 20 72 65 74 76 61 6c 29 3b 0a 09 09 66 70 72 , retval);...fpr
19f0: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 5c 6e intf(stderr, "\n
1a00: 22 29 3b 0a 09 09 66 66 6c 75 73 68 28 73 74 64 ");...fflush(std
1a10: 65 72 72 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 err);..}...if (r
1a20: 65 74 76 61 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b etval == NULL) {
1a30: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1a40: 50 52 49 4e 54 46 28 22 20 2a 2a 2a 20 45 52 52 PRINTF(" *** ERR
1a50: 4f 52 20 2a 2a 2a 20 72 65 61 6c 6c 6f 63 20 72 OR *** realloc r
1a60: 65 74 75 72 6e 65 64 20 4e 55 4c 4c 20 28 73 69 eturned NULL (si
1a70: 7a 65 20 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73 ze = %lu)", (uns
1a80: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65 igned long) size
1a90: 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 );..}...return(r
1aa0: 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 etval);.}..stati
1ab0: 63 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 c char *CACKEY_D
1ac0: 45 42 55 47 5f 46 55 4e 43 5f 53 54 52 44 55 50 EBUG_FUNC_STRDUP
1ad0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 74 72 (const char *ptr
1ae0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 75 , const char *fu
1af0: 6e 63 2c 20 69 6e 74 20 6c 69 6e 65 29 20 7b 0a nc, int line) {.
1b00: 09 63 68 61 72 20 2a 72 65 74 76 61 6c 3b 0a 0a .char *retval;..
1b10: 09 72 65 74 76 61 6c 20 3d 20 73 74 72 64 75 70 .retval = strdup
1b20: 28 70 74 72 29 3b 0a 0a 09 43 41 43 4b 45 59 5f (ptr);...CACKEY_
1b30: 44 45 42 55 47 5f 50 52 49 4e 54 54 49 4d 45 3b DEBUG_PRINTTIME;
1b40: 0a 09 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 ..fprintf(stderr
1b50: 2c 20 22 25 73 28 29 3a 25 69 3a 20 22 2c 20 66 , "%s():%i: ", f
1b60: 75 6e 63 2c 20 6c 69 6e 65 29 3b 0a 09 66 70 72 unc, line);..fpr
1b70: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 54 intf(stderr, "ST
1b80: 52 44 55 50 5f 4d 41 4c 4c 4f 43 28 29 20 3d 20 RDUP_MALLOC() =
1b90: 25 70 22 2c 20 72 65 74 76 61 6c 29 3b 0a 09 66 %p", retval);..f
1ba0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 printf(stderr, "
1bb0: 5c 6e 22 29 3b 0a 09 66 66 6c 75 73 68 28 73 74 \n");..fflush(st
1bc0: 64 65 72 72 29 3b 0a 0a 09 72 65 74 75 72 6e 28 derr);...return(
1bd0: 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 retval);.}..stat
1be0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 43 ic const char *C
1bf0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 ACKEY_DEBUG_FUNC
1c00: 5f 54 41 47 5f 54 4f 5f 53 54 52 28 75 6e 73 69 _TAG_TO_STR(unsi
1c10: 67 6e 65 64 20 63 68 61 72 20 74 61 67 29 20 7b gned char tag) {
1c20: 0a 09 73 77 69 74 63 68 20 28 74 61 67 29 20 7b ..switch (tag) {
1c30: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 ...case GSCIS_TA
1c40: 47 5f 43 41 52 44 49 44 3a 0a 09 09 09 72 65 74 G_CARDID:....ret
1c50: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 urn("GSCIS_TAG_C
1c60: 41 52 44 49 44 22 29 3b 0a 09 09 63 61 73 65 20 ARDID");...case
1c70: 47 53 43 49 53 5f 54 41 47 5f 43 43 43 5f 56 45 GSCIS_TAG_CCC_VE
1c80: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 R:....return("GS
1c90: 43 49 53 5f 54 41 47 5f 43 43 43 5f 56 45 52 22 CIS_TAG_CCC_VER"
1ca0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f );...case GSCIS_
1cb0: 54 41 47 5f 43 43 47 5f 56 45 52 3a 0a 09 09 09 TAG_CCG_VER:....
1cc0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 return("GSCIS_TA
1cd0: 47 5f 43 43 47 5f 56 45 52 22 29 3b 0a 09 09 63 G_CCG_VER");...c
1ce0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 ase GSCIS_TAG_CA
1cf0: 52 44 55 52 4c 3a 0a 09 09 09 72 65 74 75 72 6e RDURL:....return
1d00: 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 ("GSCIS_TAG_CARD
1d10: 55 52 4c 22 29 3b 0a 09 09 63 61 73 65 20 47 53 URL");...case GS
1d20: 43 49 53 5f 54 41 47 5f 50 4b 43 53 31 35 3a 0a CIS_TAG_PKCS15:.
1d30: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 ...return("GSCIS
1d40: 5f 54 41 47 5f 50 4b 43 53 31 35 22 29 3b 0a 09 _TAG_PKCS15");..
1d50: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f .case GSCIS_TAG_
1d60: 52 45 47 5f 44 41 54 41 5f 4d 4f 44 45 4c 3a 0a REG_DATA_MODEL:.
1d70: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 ...return("GSCIS
1d80: 5f 54 41 47 5f 52 45 47 5f 44 41 54 41 5f 4d 4f _TAG_REG_DATA_MO
1d90: 44 45 4c 22 29 3b 0a 09 09 63 61 73 65 20 47 53 DEL");...case GS
1da0: 43 49 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c CIS_TAG_ACR_TABL
1db0: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 E:....return("GS
1dc0: 43 49 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c CIS_TAG_ACR_TABL
1dd0: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 E");...case GSCI
1de0: 53 5f 54 41 47 5f 43 41 52 44 5f 41 50 44 55 3a S_TAG_CARD_APDU:
1df0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 ....return("GSCI
1e00: 53 5f 54 41 47 5f 43 41 52 44 5f 41 50 44 55 22 S_TAG_CARD_APDU"
1e10: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f );...case GSCIS_
1e20: 54 41 47 5f 52 45 44 49 52 45 43 54 49 4f 4e 3a TAG_REDIRECTION:
1e30: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 ....return("GSCI
1e40: 53 5f 54 41 47 5f 52 45 44 49 52 45 43 54 49 4f S_TAG_REDIRECTIO
1e50: 4e 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 N");...case GSCI
1e60: 53 5f 54 41 47 5f 43 54 3a 0a 09 09 09 72 65 74 S_TAG_CT:....ret
1e70: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 urn("GSCIS_TAG_C
1e80: 54 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 T");...case GSCI
1e90: 53 5f 54 41 47 5f 53 54 3a 0a 09 09 09 72 65 74 S_TAG_ST:....ret
1ea0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53 urn("GSCIS_TAG_S
1eb0: 54 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 T");...case GSCI
1ec0: 53 5f 54 41 47 5f 4e 45 58 54 43 43 43 3a 0a 09 S_TAG_NEXTCCC:..
1ed0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f ..return("GSCIS_
1ee0: 54 41 47 5f 4e 45 58 54 43 43 43 22 29 3b 0a 09 TAG_NEXTCCC");..
1ef0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f .case GSCIS_TAG_
1f00: 46 4e 41 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e FNAME:....return
1f10: 28 22 47 53 43 49 53 5f 54 41 47 5f 46 4e 41 4d ("GSCIS_TAG_FNAM
1f20: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 E");...case GSCI
1f30: 53 5f 54 41 47 5f 4d 4e 41 4d 45 3a 0a 09 09 09 S_TAG_MNAME:....
1f40: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 return("GSCIS_TA
1f50: 47 5f 4d 4e 41 4d 45 22 29 3b 0a 09 09 63 61 73 G_MNAME");...cas
1f60: 65 20 47 53 43 49 53 5f 54 41 47 5f 4c 4e 41 4d e GSCIS_TAG_LNAM
1f70: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 E:....return("GS
1f80: 43 49 53 5f 54 41 47 5f 4c 4e 41 4d 45 22 29 3b CIS_TAG_LNAME");
1f90: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 ...case GSCIS_TA
1fa0: 47 5f 53 55 46 46 49 58 3a 0a 09 09 09 72 65 74 G_SUFFIX:....ret
1fb0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53 urn("GSCIS_TAG_S
1fc0: 55 46 46 49 58 22 29 3b 0a 09 09 63 61 73 65 20 UFFIX");...case
1fd0: 47 53 43 49 53 5f 54 41 47 5f 47 4f 56 54 5f 41 GSCIS_TAG_GOVT_A
1fe0: 47 45 4e 43 59 3a 0a 09 09 09 72 65 74 75 72 6e GENCY:....return
1ff0: 28 22 47 53 43 49 53 5f 54 41 47 5f 47 4f 56 54 ("GSCIS_TAG_GOVT
2000: 5f 41 47 45 4e 43 59 22 29 3b 0a 09 09 63 61 73 _AGENCY");...cas
2010: 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45 e GSCIS_TAG_BURE
2020: 41 55 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 AU:....return("G
2030: 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 22 SCIS_TAG_BUREAU"
2040: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f );...case GSCIS_
2050: 54 41 47 5f 42 55 52 45 41 55 5f 43 4f 44 45 3a TAG_BUREAU_CODE:
2060: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 ....return("GSCI
2070: 53 5f 54 41 47 5f 42 55 52 45 41 55 5f 43 4f 44 S_TAG_BUREAU_COD
2080: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 E");...case GSCI
2090: 53 5f 54 41 47 5f 44 45 50 54 5f 43 4f 44 45 3a S_TAG_DEPT_CODE:
20a0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 ....return("GSCI
20b0: 53 5f 54 41 47 5f 44 45 50 54 5f 43 4f 44 45 22 S_TAG_DEPT_CODE"
20c0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f );...case GSCIS_
20d0: 54 41 47 5f 54 49 54 4c 45 3a 0a 09 09 09 72 65 TAG_TITLE:....re
20e0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f turn("GSCIS_TAG_
20f0: 54 49 54 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 TITLE");...case
2100: 47 53 43 49 53 5f 54 41 47 5f 42 55 49 4c 44 49 GSCIS_TAG_BUILDI
2110: 4e 47 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 NG:....return("G
2120: 53 43 49 53 5f 54 41 47 5f 42 55 49 4c 44 49 4e SCIS_TAG_BUILDIN
2130: 47 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 G");...case GSCI
2140: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 S_TAG_OFFICE_ADD
2150: 52 31 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 R1:....return("G
2160: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f SCIS_TAG_OFFICE_
2170: 41 44 44 52 31 22 29 3b 0a 09 09 63 61 73 65 20 ADDR1");...case
2180: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 GSCIS_TAG_OFFICE
2190: 5f 41 44 44 52 32 3a 0a 09 09 09 72 65 74 75 72 _ADDR2:....retur
21a0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 n("GSCIS_TAG_OFF
21b0: 49 43 45 5f 41 44 44 52 32 22 29 3b 0a 09 09 63 ICE_ADDR2");...c
21c0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 ase GSCIS_TAG_OF
21d0: 46 49 43 45 5f 43 49 54 59 3a 0a 09 09 09 72 65 FICE_CITY:....re
21e0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f turn("GSCIS_TAG_
21f0: 4f 46 46 49 43 45 5f 43 49 54 59 22 29 3b 0a 09 OFFICE_CITY");..
2200: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f .case GSCIS_TAG_
2210: 4f 46 46 49 43 45 5f 53 54 41 54 45 3a 0a 09 09 OFFICE_STATE:...
2220: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 .return("GSCIS_T
2230: 41 47 5f 4f 46 46 49 43 45 5f 53 54 41 54 45 22 AG_OFFICE_STATE"
2240: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f );...case GSCIS_
2250: 54 41 47 5f 4f 46 46 49 43 45 5f 5a 49 50 3a 0a TAG_OFFICE_ZIP:.
2260: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 ...return("GSCIS
2270: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 5a 49 50 22 _TAG_OFFICE_ZIP"
2280: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f );...case GSCIS_
2290: 54 41 47 5f 4f 46 46 49 43 45 5f 43 4f 55 4e 54 TAG_OFFICE_COUNT
22a0: 52 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 RY:....return("G
22b0: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f SCIS_TAG_OFFICE_
22c0: 43 4f 55 4e 54 52 59 22 29 3b 0a 09 09 63 61 73 COUNTRY");...cas
22d0: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 e GSCIS_TAG_OFFI
22e0: 43 45 5f 50 48 4f 4e 45 3a 0a 09 09 09 72 65 74 CE_PHONE:....ret
22f0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f urn("GSCIS_TAG_O
2300: 46 46 49 43 45 5f 50 48 4f 4e 45 22 29 3b 0a 09 FFICE_PHONE");..
2310: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f .case GSCIS_TAG_
2320: 4f 46 46 49 43 45 5f 50 48 4f 4e 45 5f 45 58 54 OFFICE_PHONE_EXT
2330: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 :....return("GSC
2340: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 IS_TAG_OFFICE_PH
2350: 4f 4e 45 5f 45 58 54 22 29 3b 0a 09 09 63 61 73 ONE_EXT");...cas
2360: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 e GSCIS_TAG_OFFI
2370: 43 45 5f 46 41 58 3a 0a 09 09 09 72 65 74 75 72 CE_FAX:....retur
2380: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 n("GSCIS_TAG_OFF
2390: 49 43 45 5f 46 41 58 22 29 3b 0a 09 09 63 61 73 ICE_FAX");...cas
23a0: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 e GSCIS_TAG_OFFI
23b0: 43 45 5f 45 4d 41 49 4c 3a 0a 09 09 09 72 65 74 CE_EMAIL:....ret
23c0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f urn("GSCIS_TAG_O
23d0: 46 46 49 43 45 5f 45 4d 41 49 4c 22 29 3b 0a 09 FFICE_EMAIL");..
23e0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f .case GSCIS_TAG_
23f0: 4f 46 46 49 43 45 5f 52 4f 4f 4d 3a 0a 09 09 09 OFFICE_ROOM:....
2400: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 return("GSCIS_TA
2410: 47 5f 4f 46 46 49 43 45 5f 52 4f 4f 4d 22 29 3b G_OFFICE_ROOM");
2420: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 ...case GSCIS_TA
2430: 47 5f 4e 4f 4e 47 4f 56 5f 41 47 45 4e 43 59 3a G_NONGOV_AGENCY:
2440: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 ....return("GSCI
2450: 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f 41 47 45 S_TAG_NONGOV_AGE
2460: 4e 43 59 22 29 3b 0a 09 09 63 61 73 65 20 47 53 NCY");...case GS
2470: 43 49 53 5f 54 41 47 5f 53 53 4e 5f 44 45 53 49 CIS_TAG_SSN_DESI
2480: 47 4e 41 54 4f 52 3a 0a 09 09 09 72 65 74 75 72 GNATOR:....retur
2490: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53 53 4e n("GSCIS_TAG_SSN
24a0: 5f 44 45 53 49 47 4e 41 54 4f 52 22 29 3b 0a 09 _DESIGNATOR");..
24b0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f .case GSCIS_TAG_
24c0: 53 53 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 SSN:....return("
24d0: 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 22 29 3b GSCIS_TAG_SSN");
24e0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 ...case GSCIS_TA
24f0: 47 5f 44 4f 42 3a 0a 09 09 09 72 65 74 75 72 6e G_DOB:....return
2500: 28 22 47 53 43 49 53 5f 54 41 47 5f 44 4f 42 22 ("GSCIS_TAG_DOB"
2510: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f );...case GSCIS_
2520: 54 41 47 5f 47 45 4e 44 45 52 3a 0a 09 09 09 72 TAG_GENDER:....r
2530: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 eturn("GSCIS_TAG
2540: 5f 47 45 4e 44 45 52 22 29 3b 0a 09 09 63 61 73 _GENDER");...cas
2550: 65 20 47 53 43 49 53 5f 54 41 47 5f 55 53 45 52 e GSCIS_TAG_USER
2560: 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 ID:....return("G
2570: 53 43 49 53 5f 54 41 47 5f 55 53 45 52 49 44 22 SCIS_TAG_USERID"
2580: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f );...case GSCIS_
2590: 54 41 47 5f 44 4f 4d 41 49 4e 3a 0a 09 09 09 72 TAG_DOMAIN:....r
25a0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 eturn("GSCIS_TAG
25b0: 5f 44 4f 4d 41 49 4e 22 29 3b 0a 09 09 63 61 73 _DOMAIN");...cas
25c0: 65 20 47 53 43 49 53 5f 54 41 47 5f 50 41 53 53 e GSCIS_TAG_PASS
25d0: 57 4f 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 WORD:....return(
25e0: 22 47 53 43 49 53 5f 54 41 47 5f 50 41 53 53 57 "GSCIS_TAG_PASSW
25f0: 4f 52 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53 ORD");...case GS
2600: 43 49 53 5f 54 41 47 5f 49 53 53 55 45 52 49 44 CIS_TAG_ISSUERID
2610: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 :....return("GSC
2620: 49 53 5f 54 41 47 5f 49 53 53 55 45 52 49 44 22 IS_TAG_ISSUERID"
2630: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f );...case GSCIS_
2640: 54 41 47 5f 53 45 52 4e 4f 3a 0a 09 09 09 72 65 TAG_SERNO:....re
2650: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f turn("GSCIS_TAG_
2660: 53 45 52 4e 4f 22 29 3b 0a 09 09 63 61 73 65 20 SERNO");...case
2670: 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45 5f GSCIS_TAG_ISSUE_
2680: 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 DATE:....return(
2690: 22 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45 "GSCIS_TAG_ISSUE
26a0: 5f 44 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 _DATE");...case
26b0: 47 53 43 49 53 5f 54 41 47 5f 45 58 50 49 52 45 GSCIS_TAG_EXPIRE
26c0: 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e _DATE:....return
26d0: 28 22 47 53 43 49 53 5f 54 41 47 5f 45 58 50 49 ("GSCIS_TAG_EXPI
26e0: 52 45 5f 44 41 54 45 22 29 3b 0a 09 09 63 61 73 RE_DATE");...cas
26f0: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 e GSCIS_TAG_CARD
2700: 5f 54 59 50 45 3a 0a 09 09 09 72 65 74 75 72 6e _TYPE:....return
2710: 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 ("GSCIS_TAG_CARD
2720: 5f 54 59 50 45 22 29 3b 0a 09 09 63 61 73 65 20 _TYPE");...case
2730: 47 53 43 49 53 5f 54 41 47 5f 53 45 43 55 52 49 GSCIS_TAG_SECURI
2740: 54 59 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75 TY_CODE:....retu
2750: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53 45 rn("GSCIS_TAG_SE
2760: 43 55 52 49 54 59 5f 43 4f 44 45 22 29 3b 0a 09 CURITY_CODE");..
2770: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f .case GSCIS_TAG_
2780: 43 41 52 44 49 44 5f 41 49 44 3a 0a 09 09 09 72 CARDID_AID:....r
2790: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 eturn("GSCIS_TAG
27a0: 5f 43 41 52 44 49 44 5f 41 49 44 22 29 3b 0a 09 _CARDID_AID");..
27b0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f .case GSCIS_TAG_
27c0: 43 45 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09 CERTIFICATE:....
27d0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 return("GSCIS_TA
27e0: 47 5f 43 45 52 54 49 46 49 43 41 54 45 22 29 3b G_CERTIFICATE");
27f0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 ...case GSCIS_TA
2800: 47 5f 43 45 52 54 5f 49 53 53 55 45 5f 44 41 54 G_CERT_ISSUE_DAT
2810: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 E:....return("GS
2820: 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 49 53 53 CIS_TAG_CERT_ISS
2830: 55 45 5f 44 41 54 45 22 29 3b 0a 09 09 63 61 73 UE_DATE");...cas
2840: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 e GSCIS_TAG_CERT
2850: 5f 45 58 50 49 52 45 5f 44 41 54 45 3a 0a 09 09 _EXPIRE_DATE:...
2860: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 .return("GSCIS_T
2870: 41 47 5f 43 45 52 54 5f 45 58 50 49 52 45 5f 44 AG_CERT_EXPIRE_D
2880: 41 54 45 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 ATE");..}...retu
2890: 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d rn("UNKNOWN");.}
28a0: 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 ..static const c
28b0: 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 har *CACKEY_DEBU
28c0: 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f G_FUNC_SCARDERR_
28d0: 54 4f 5f 53 54 52 28 4c 4f 4e 47 20 72 65 74 63 TO_STR(LONG retc
28e0: 6f 64 65 29 20 7b 0a 09 73 77 69 74 63 68 20 28 ode) {..switch (
28f0: 72 65 74 63 6f 64 65 29 20 7b 0a 09 09 63 61 73 retcode) {...cas
2900: 65 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 e SCARD_S_SUCCES
2910: 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 S:....return("SC
2920: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 22 29 3b ARD_S_SUCCESS");
2930: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f ...case SCARD_E_
2940: 43 41 4e 43 45 4c 4c 45 44 3a 0a 09 09 09 72 65 CANCELLED:....re
2950: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 43 41 turn("SCARD_E_CA
2960: 4e 43 45 4c 4c 45 44 22 29 3b 0a 09 09 63 61 73 NCELLED");...cas
2970: 65 20 53 43 41 52 44 5f 45 5f 43 41 4e 54 5f 44 e SCARD_E_CANT_D
2980: 49 53 50 4f 53 45 3a 0a 09 09 09 72 65 74 75 72 ISPOSE:....retur
2990: 6e 28 22 53 43 41 52 44 5f 45 5f 43 41 4e 54 5f n("SCARD_E_CANT_
29a0: 44 49 53 50 4f 53 45 22 29 3b 0a 09 09 63 61 73 DISPOSE");...cas
29b0: 65 20 53 43 41 52 44 5f 45 5f 49 4e 53 55 46 46 e SCARD_E_INSUFF
29c0: 49 43 49 45 4e 54 5f 42 55 46 46 45 52 3a 0a 09 ICIENT_BUFFER:..
29d0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f ..return("SCARD_
29e0: 45 5f 49 4e 53 55 46 46 49 43 49 45 4e 54 5f 42 E_INSUFFICIENT_B
29f0: 55 46 46 45 52 22 29 3b 0a 09 09 63 61 73 65 20 UFFER");...case
2a00: 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f SCARD_E_INVALID_
2a10: 41 54 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 ATR:....return("
2a20: 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f SCARD_E_INVALID_
2a30: 41 54 52 22 29 3b 0a 09 09 63 61 73 65 20 53 43 ATR");...case SC
2a40: 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41 ARD_E_INVALID_HA
2a50: 4e 44 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 NDLE:....return(
2a60: 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 "SCARD_E_INVALID
2a70: 5f 48 41 4e 44 4c 45 22 29 3b 0a 09 09 63 61 73 _HANDLE");...cas
2a80: 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 e SCARD_E_INVALI
2a90: 44 5f 50 41 52 41 4d 45 54 45 52 3a 0a 09 09 09 D_PARAMETER:....
2aa0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f return("SCARD_E_
2ab0: 49 4e 56 41 4c 49 44 5f 50 41 52 41 4d 45 54 45 INVALID_PARAMETE
2ac0: 52 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 R");...case SCAR
2ad0: 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 54 41 52 47 D_E_INVALID_TARG
2ae0: 45 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 ET:....return("S
2af0: 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 54 CARD_E_INVALID_T
2b00: 41 52 47 45 54 22 29 3b 0a 09 09 63 61 73 65 20 ARGET");...case
2b10: 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f SCARD_E_INVALID_
2b20: 56 41 4c 55 45 3a 0a 09 09 09 72 65 74 75 72 6e VALUE:....return
2b30: 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 ("SCARD_E_INVALI
2b40: 44 5f 56 41 4c 55 45 22 29 3b 0a 09 09 63 61 73 D_VALUE");...cas
2b50: 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 4d 45 4d e SCARD_E_NO_MEM
2b60: 4f 52 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 ORY:....return("
2b70: 53 43 41 52 44 5f 45 5f 4e 4f 5f 4d 45 4d 4f 52 SCARD_E_NO_MEMOR
2b80: 59 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 Y");...case SCAR
2b90: 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 52 45 41 44 D_E_UNKNOWN_READ
2ba0: 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 ER:....return("S
2bb0: 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 52 CARD_E_UNKNOWN_R
2bc0: 45 41 44 45 52 22 29 3b 0a 09 09 63 61 73 65 20 EADER");...case
2bd0: 53 43 41 52 44 5f 45 5f 54 49 4d 45 4f 55 54 3a SCARD_E_TIMEOUT:
2be0: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 ....return("SCAR
2bf0: 44 5f 45 5f 54 49 4d 45 4f 55 54 22 29 3b 0a 09 D_E_TIMEOUT");..
2c00: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 53 48 .case SCARD_E_SH
2c10: 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 3a ARING_VIOLATION:
2c20: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 ....return("SCAR
2c30: 44 5f 45 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c D_E_SHARING_VIOL
2c40: 41 54 49 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 ATION");...case
2c50: 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 4d 41 52 54 SCARD_E_NO_SMART
2c60: 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 CARD:....return(
2c70: 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 4d 41 52 "SCARD_E_NO_SMAR
2c80: 54 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 TCARD");...case
2c90: 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f SCARD_E_UNKNOWN_
2ca0: 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 CARD:....return(
2cb0: 22 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e "SCARD_E_UNKNOWN
2cc0: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 _CARD");...case
2cd0: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 SCARD_E_PROTO_MI
2ce0: 53 4d 41 54 43 48 3a 0a 09 09 09 72 65 74 75 72 SMATCH:....retur
2cf0: 6e 28 22 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f n("SCARD_E_PROTO
2d00: 5f 4d 49 53 4d 41 54 43 48 22 29 3b 0a 09 09 63 _MISMATCH");...c
2d10: 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 54 5f ase SCARD_E_NOT_
2d20: 52 45 41 44 59 3a 0a 09 09 09 72 65 74 75 72 6e READY:....return
2d30: 28 22 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 52 45 ("SCARD_E_NOT_RE
2d40: 41 44 59 22 29 3b 0a 09 09 63 61 73 65 20 53 43 ADY");...case SC
2d50: 41 52 44 5f 45 5f 53 59 53 54 45 4d 5f 43 41 4e ARD_E_SYSTEM_CAN
2d60: 43 45 4c 4c 45 44 3a 0a 09 09 09 72 65 74 75 72 CELLED:....retur
2d70: 6e 28 22 53 43 41 52 44 5f 45 5f 53 59 53 54 45 n("SCARD_E_SYSTE
2d80: 4d 5f 43 41 4e 43 45 4c 4c 45 44 22 29 3b 0a 09 M_CANCELLED");..
2d90: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f .case SCARD_E_NO
2da0: 54 5f 54 52 41 4e 53 41 43 54 45 44 3a 0a 09 09 T_TRANSACTED:...
2db0: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 .return("SCARD_E
2dc0: 5f 4e 4f 54 5f 54 52 41 4e 53 41 43 54 45 44 22 _NOT_TRANSACTED"
2dd0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f );...case SCARD_
2de0: 45 5f 52 45 41 44 45 52 5f 55 4e 41 56 41 49 4c E_READER_UNAVAIL
2df0: 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 ABLE:....return(
2e00: 22 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52 5f "SCARD_E_READER_
2e10: 55 4e 41 56 41 49 4c 41 42 4c 45 22 29 3b 0a 09 UNAVAILABLE");..
2e20: 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f 55 4e .case SCARD_W_UN
2e30: 53 55 50 50 4f 52 54 45 44 5f 43 41 52 44 3a 0a SUPPORTED_CARD:.
2e40: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 ...return("SCARD
2e50: 5f 57 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f 43 _W_UNSUPPORTED_C
2e60: 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 ARD");...case SC
2e70: 41 52 44 5f 57 5f 55 4e 52 45 53 50 4f 4e 53 49 ARD_W_UNRESPONSI
2e80: 56 45 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 VE_CARD:....retu
2e90: 72 6e 28 22 53 43 41 52 44 5f 57 5f 55 4e 52 45 rn("SCARD_W_UNRE
2ea0: 53 50 4f 4e 53 49 56 45 5f 43 41 52 44 22 29 3b SPONSIVE_CARD");
2eb0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f ...case SCARD_W_
2ec0: 55 4e 50 4f 57 45 52 45 44 5f 43 41 52 44 3a 0a UNPOWERED_CARD:.
2ed0: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 ...return("SCARD
2ee0: 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41 52 _W_UNPOWERED_CAR
2ef0: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 D");...case SCAR
2f00: 44 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 3a 0a D_W_RESET_CARD:.
2f10: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 ...return("SCARD
2f20: 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 22 29 3b _W_RESET_CARD");
2f30: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f ...case SCARD_W_
2f40: 52 45 4d 4f 56 45 44 5f 43 41 52 44 3a 0a 09 09 REMOVED_CARD:...
2f50: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57 .return("SCARD_W
2f60: 5f 52 45 4d 4f 56 45 44 5f 43 41 52 44 22 29 3b _REMOVED_CARD");
2f70: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f ...case SCARD_E_
2f80: 50 43 49 5f 54 4f 4f 5f 53 4d 41 4c 4c 3a 0a 09 PCI_TOO_SMALL:..
2f90: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f ..return("SCARD_
2fa0: 45 5f 50 43 49 5f 54 4f 4f 5f 53 4d 41 4c 4c 22 E_PCI_TOO_SMALL"
2fb0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f );...case SCARD_
2fc0: 45 5f 52 45 41 44 45 52 5f 55 4e 53 55 50 50 4f E_READER_UNSUPPO
2fd0: 52 54 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 RTED:....return(
2fe0: 22 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52 5f "SCARD_E_READER_
2ff0: 55 4e 53 55 50 50 4f 52 54 45 44 22 29 3b 0a 09 UNSUPPORTED");..
3000: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 44 55 .case SCARD_E_DU
3010: 50 4c 49 43 41 54 45 5f 52 45 41 44 45 52 3a 0a PLICATE_READER:.
3020: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 ...return("SCARD
3030: 5f 45 5f 44 55 50 4c 49 43 41 54 45 5f 52 45 41 _E_DUPLICATE_REA
3040: 44 45 52 22 29 3b 0a 09 09 63 61 73 65 20 53 43 DER");...case SC
3050: 41 52 44 5f 45 5f 43 41 52 44 5f 55 4e 53 55 50 ARD_E_CARD_UNSUP
3060: 50 4f 52 54 45 44 3a 0a 09 09 09 72 65 74 75 72 PORTED:....retur
3070: 6e 28 22 53 43 41 52 44 5f 45 5f 43 41 52 44 5f n("SCARD_E_CARD_
3080: 55 4e 53 55 50 50 4f 52 54 45 44 22 29 3b 0a 09 UNSUPPORTED");..
3090: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f .case SCARD_E_NO
30a0: 5f 53 45 52 56 49 43 45 3a 0a 09 09 09 72 65 74 _SERVICE:....ret
30b0: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f urn("SCARD_E_NO_
30c0: 53 45 52 56 49 43 45 22 29 3b 0a 09 09 63 61 73 SERVICE");...cas
30d0: 65 20 53 43 41 52 44 5f 45 5f 53 45 52 56 49 43 e SCARD_E_SERVIC
30e0: 45 5f 53 54 4f 50 50 45 44 3a 0a 09 09 09 72 65 E_STOPPED:....re
30f0: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 53 45 turn("SCARD_E_SE
3100: 52 56 49 43 45 5f 53 54 4f 50 50 45 44 22 29 3b RVICE_STOPPED");
3110: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f ...case SCARD_E_
3120: 55 4e 53 55 50 50 4f 52 54 45 44 5f 46 45 41 54 UNSUPPORTED_FEAT
3130: 55 52 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 URE:....return("
3140: 53 43 41 52 44 5f 45 5f 55 4e 53 55 50 50 4f 52 SCARD_E_UNSUPPOR
3150: 54 45 44 5f 46 45 41 54 55 52 45 22 29 3b 0a 23 TED_FEATURE");.#
3160: 69 66 64 65 66 20 53 43 41 52 44 5f 57 5f 49 4e ifdef SCARD_W_IN
3170: 53 45 52 54 45 44 5f 43 41 52 44 0a 09 09 63 61 SERTED_CARD...ca
3180: 73 65 20 53 43 41 52 44 5f 57 5f 49 4e 53 45 52 se SCARD_W_INSER
3190: 54 45 44 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 TED_CARD:....ret
31a0: 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 49 4e 53 urn("SCARD_W_INS
31b0: 45 52 54 45 44 5f 43 41 52 44 22 29 3b 0a 23 65 ERTED_CARD");.#e
31c0: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 43 41 52 ndif.#ifdef SCAR
31d0: 44 5f 45 5f 4e 4f 5f 52 45 41 44 45 52 53 5f 41 D_E_NO_READERS_A
31e0: 56 41 49 4c 41 42 4c 45 0a 09 09 63 61 73 65 20 VAILABLE...case
31f0: 53 43 41 52 44 5f 45 5f 4e 4f 5f 52 45 41 44 45 SCARD_E_NO_READE
3200: 52 53 5f 41 56 41 49 4c 41 42 4c 45 3a 0a 09 09 RS_AVAILABLE:...
3210: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 .return("SCARD_E
3220: 5f 4e 4f 5f 52 45 41 44 45 52 53 5f 41 56 41 49 _NO_READERS_AVAI
3230: 4c 41 42 4c 45 22 29 3b 0a 23 65 6e 64 69 66 0a LABLE");.#endif.
3240: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b .}...return("UNK
3250: 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 NOWN");.}..stati
3260: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 c const char *CA
3270: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f CKEY_DEBUG_FUNC_
3280: 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28 75 69 6e OBJID_TO_STR(uin
3290: 74 31 36 5f 74 20 6f 62 6a 69 64 29 20 7b 0a 09 t16_t objid) {..
32a0: 73 77 69 74 63 68 20 28 6f 62 6a 69 64 29 20 7b switch (objid) {
32b0: 0a 09 09 63 61 73 65 20 30 78 32 30 30 30 3a 0a ...case 0x2000:.
32c0: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 ...return("CACKE
32d0: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 47 45 4e 45 Y_TLV_OBJID_GENE
32e0: 52 41 4c 49 4e 46 4f 22 29 3b 0a 09 09 63 61 73 RALINFO");...cas
32f0: 65 20 30 78 32 31 30 30 3a 0a 09 09 09 72 65 74 e 0x2100:....ret
3300: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f urn("CACKEY_TLV_
3310: 4f 42 4a 49 44 5f 50 52 4f 50 45 52 53 4f 4e 41 OBJID_PROPERSONA
3320: 4c 49 4e 46 4f 22 29 3b 0a 09 09 63 61 73 65 20 LINFO");...case
3330: 30 78 33 30 30 30 3a 0a 09 09 09 72 65 74 75 72 0x3000:....retur
3340: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 n("CACKEY_TLV_OB
3350: 4a 49 44 5f 41 43 43 45 53 53 43 4f 4e 54 52 4f JID_ACCESSCONTRO
3360: 4c 22 29 3b 0a 09 09 63 61 73 65 20 30 78 34 30 L");...case 0x40
3370: 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 00:....return("C
3380: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f ACKEY_TLV_OBJID_
3390: 4c 4f 47 49 4e 22 29 3b 0a 09 09 63 61 73 65 20 LOGIN");...case
33a0: 30 78 35 30 30 30 3a 0a 09 09 09 72 65 74 75 72 0x5000:....retur
33b0: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 n("CACKEY_TLV_OB
33c0: 4a 49 44 5f 43 41 52 44 49 4e 46 4f 22 29 3b 0a JID_CARDINFO");.
33d0: 09 09 63 61 73 65 20 30 78 36 30 30 30 3a 0a 09 ..case 0x6000:..
33e0: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 ..return("CACKEY
33f0: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 42 49 4f 4d 45 _TLV_OBJID_BIOME
3400: 54 52 49 43 53 22 29 3b 0a 09 09 63 61 73 65 20 TRICS");...case
3410: 30 78 37 30 30 30 3a 0a 09 09 09 72 65 74 75 72 0x7000:....retur
3420: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 n("CACKEY_TLV_OB
3430: 4a 49 44 5f 44 49 47 49 54 41 4c 53 49 47 43 45 JID_DIGITALSIGCE
3440: 52 54 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 RT");...case 0x0
3450: 32 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 200:....return("
3460: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 CACKEY_TLV_OBJID
3470: 5f 43 41 43 5f 50 45 52 53 4f 4e 22 29 3b 0a 09 _CAC_PERSON");..
3480: 09 63 61 73 65 20 30 78 30 32 30 32 3a 0a 09 09 .case 0x0202:...
3490: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f .return("CACKEY_
34a0: 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 42 45 TLV_OBJID_CAC_BE
34b0: 4e 45 46 49 54 53 22 29 3b 0a 09 09 63 61 73 65 NEFITS");...case
34c0: 20 30 78 30 32 30 33 3a 0a 09 09 09 72 65 74 75 0x0203:....retu
34d0: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f rn("CACKEY_TLV_O
34e0: 42 4a 49 44 5f 43 41 43 5f 4f 54 48 45 52 42 45 BJID_CAC_OTHERBE
34f0: 4e 45 46 49 54 53 22 29 3b 0a 09 09 63 61 73 65 NEFITS");...case
3500: 20 30 78 30 32 30 31 3a 0a 09 09 09 72 65 74 75 0x0201:....retu
3510: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f rn("CACKEY_TLV_O
3520: 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e 4e BJID_CAC_PERSONN
3530: 45 4c 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 EL");...case 0x0
3540: 32 46 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 2FE:....return("
3550: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 CACKEY_TLV_OBJID
3560: 5f 43 41 43 5f 50 4b 49 43 45 52 54 22 29 3b 0a _CAC_PKICERT");.
3570: 09 7d 0a 09 0a 09 72 65 74 75 72 6e 28 22 55 4e .}....return("UN
3580: 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 KNOWN");.}..stat
3590: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 43 ic const char *C
35a0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 ACKEY_DEBUG_FUNC
35b0: 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53 54 52 28 _APPTYPE_TO_STR(
35c0: 75 69 6e 74 38 5f 74 20 61 70 70 74 79 70 65 29 uint8_t apptype)
35d0: 20 7b 0a 09 73 77 69 74 63 68 20 28 61 70 70 74 {..switch (appt
35e0: 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20 30 78 ype) {...case 0x
35f0: 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 4e 00:....return("N
3600: 4f 4e 45 22 29 3b 0a 09 09 63 61 73 65 20 30 78 ONE");...case 0x
3610: 30 31 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 01:....return("C
3620: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45 ACKEY_TLV_APP_GE
3630: 4e 45 52 49 43 22 29 3b 0a 09 09 63 61 73 65 20 NERIC");...case
3640: 30 78 30 32 3a 0a 09 09 09 72 65 74 75 72 6e 28 0x02:....return(
3650: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f "CACKEY_TLV_APP_
3660: 53 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78 SKI");...case 0x
3670: 30 33 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 03:....return("C
3680: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45 ACKEY_TLV_APP_GE
3690: 4e 45 52 49 43 20 7c 20 43 41 43 4b 45 59 5f 54 NERIC | CACKEY_T
36a0: 4c 56 5f 41 50 50 5f 53 4b 49 22 29 3b 0a 09 09 LV_APP_SKI");...
36b0: 63 61 73 65 20 30 78 30 34 3a 0a 09 09 09 72 65 case 0x04:....re
36c0: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 turn("CACKEY_TLV
36d0: 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61 _APP_PKI");...ca
36e0: 73 65 20 30 78 30 35 3a 0a 09 09 09 72 65 74 75 se 0x05:....retu
36f0: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 rn("CACKEY_TLV_A
3700: 50 50 5f 47 45 4e 45 52 49 43 20 7c 20 43 41 43 PP_GENERIC | CAC
3710: 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22 KEY_TLV_APP_PKI"
3720: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 36 3a 0a );...case 0x06:.
3730: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 ...return("CACKE
3740: 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 20 7c 20 Y_TLV_APP_SKI |
3750: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 CACKEY_TLV_APP_P
3760: 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 KI");...case 0x0
3770: 37 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 7:....return("CA
3780: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e CKEY_TLV_APP_GEN
3790: 45 52 49 43 20 7c 20 43 41 43 4b 45 59 5f 54 4c ERIC | CACKEY_TL
37a0: 56 5f 41 50 50 5f 53 4b 49 20 7c 20 43 41 43 4b V_APP_SKI | CACK
37b0: 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29 EY_TLV_APP_PKI")
37c0: 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 22 49 ;..}...return("I
37d0: 4e 56 41 4c 49 44 22 29 3b 0a 7d 0a 0a 23 20 20 NVALID");.}..#
37e0: 64 65 66 69 6e 65 20 6d 61 6c 6c 6f 63 28 78 29 define malloc(x)
37f0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 CACKEY_DEBUG_FU
3800: 4e 43 5f 4d 41 4c 4c 4f 43 28 78 2c 20 5f 5f 66 NC_MALLOC(x, __f
3810: 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 unc__, __LINE__)
3820: 0a 23 20 20 64 65 66 69 6e 65 20 72 65 61 6c 6c .# define reall
3830: 6f 63 28 78 2c 20 79 29 20 43 41 43 4b 45 59 5f oc(x, y) CACKEY_
3840: 44 45 42 55 47 5f 46 55 4e 43 5f 52 45 41 4c 4c DEBUG_FUNC_REALL
3850: 4f 43 28 78 2c 20 79 2c 20 5f 5f 66 75 6e 63 5f OC(x, y, __func_
3860: 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 20 20 _, __LINE__).#
3870: 69 66 64 65 66 20 73 74 72 64 75 70 0a 23 20 20 ifdef strdup.#
3880: 20 20 75 6e 64 65 66 20 73 74 72 64 75 70 0a 23 undef strdup.#
3890: 20 20 65 6e 64 69 66 0a 23 20 20 64 65 66 69 6e endif.# defin
38a0: 65 20 73 74 72 64 75 70 28 78 29 20 43 41 43 4b e strdup(x) CACK
38b0: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 54 EY_DEBUG_FUNC_ST
38c0: 52 44 55 50 28 78 2c 20 5f 5f 66 75 6e 63 5f 5f RDUP(x, __func__
38d0: 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 65 6c 73 , __LINE__).#els
38e0: 65 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b e.# define CACK
38f0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
3900: 78 2e 2e 2e 29 20 2f 2a 2a 2f 0a 23 20 20 64 65 x...) /**/.# de
3910: 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 fine CACKEY_DEBU
3920: 47 5f 50 52 49 4e 54 42 55 46 28 66 2c 20 78 2c G_PRINTBUF(f, x,
3930: 20 79 29 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 69 y) /**/.# defi
3940: 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ne CACKEY_DEBUG_
3950: 50 45 52 52 4f 52 28 78 29 20 2f 2a 2a 2f 0a 23 PERROR(x) /**/.#
3960: 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f define CACKEY_
3970: 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 DEBUG_FUNC_TAG_T
3980: 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55 47 5f O_STR(x) "DEBUG_
3990: 44 49 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66 DISABLED".# def
39a0: 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 ine CACKEY_DEBUG
39b0: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 _FUNC_SCARDERR_T
39c0: 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55 47 5f O_STR(x) "DEBUG_
39d0: 44 49 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66 DISABLED".# def
39e0: 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 ine CACKEY_DEBUG
39f0: 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 _FUNC_OBJID_TO_S
3a00: 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53 TR(x) "DEBUG_DIS
3a10: 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65 ABLED".# define
3a20: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 CACKEY_DEBUG_FU
3a30: 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53 54 NC_APPTYPE_TO_ST
3a40: 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53 41 R(x) "DEBUG_DISA
3a50: 42 4c 45 44 22 0a 23 65 6e 64 69 66 0a 0a 73 74 BLED".#endif..st
3a60: 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 ruct cackey_pcsc
3a70: 5f 69 64 65 6e 74 69 74 79 20 7b 0a 09 75 6e 73 _identity {..uns
3a80: 69 67 6e 65 64 20 63 68 61 72 20 61 70 70 6c 65 igned char apple
3a90: 74 5b 37 5d 3b 0a 09 75 69 6e 74 31 36 5f 74 20 t[7];..uint16_t
3aa0: 66 69 6c 65 3b 0a 0a 09 73 69 7a 65 5f 74 20 63 file;...size_t c
3ab0: 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a ertificate_len;.
3ac0: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a .unsigned char *
3ad0: 63 65 72 74 69 66 69 63 61 74 65 3b 0a 0a 09 73 certificate;...s
3ae0: 73 69 7a 65 5f 74 20 6b 65 79 73 69 7a 65 3b 0a size_t keysize;.
3af0: 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65 };..struct cacke
3b00: 79 5f 69 64 65 6e 74 69 74 79 20 7b 0a 09 73 74 y_identity {..st
3b10: 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 ruct cackey_pcsc
3b20: 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63 5f _identity *pcsc_
3b30: 69 64 65 6e 74 69 74 79 3b 0a 0a 09 43 4b 5f 41 identity;...CK_A
3b40: 54 54 52 49 42 55 54 45 20 2a 61 74 74 72 69 62 TTRIBUTE *attrib
3b50: 75 74 65 73 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 utes;..CK_ULONG
3b60: 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 attributes_count
3b70: 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 ;.};..struct cac
3b80: 6b 65 79 5f 73 65 73 73 69 6f 6e 20 7b 0a 09 69 key_session {..i
3b90: 6e 74 20 61 63 74 69 76 65 3b 0a 0a 09 43 4b 5f nt active;...CK_
3ba0: 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a SLOT_ID slotID;.
3bb0: 0a 09 43 4b 5f 53 54 41 54 45 20 73 74 61 74 65 ..CK_STATE state
3bc0: 3b 0a 09 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67 ;..CK_FLAGS flag
3bd0: 73 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 s;..CK_ULONG ulD
3be0: 65 76 69 63 65 45 72 72 6f 72 3b 0a 09 43 4b 5f eviceError;..CK_
3bf0: 56 4f 49 44 5f 50 54 52 20 70 41 70 70 6c 69 63 VOID_PTR pApplic
3c00: 61 74 69 6f 6e 3b 0a 09 43 4b 5f 4e 4f 54 49 46 ation;..CK_NOTIF
3c10: 59 20 4e 6f 74 69 66 79 3b 0a 0a 09 73 74 72 75 Y Notify;...stru
3c20: 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 ct cackey_identi
3c30: 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73 3b 0a ty *identities;.
3c40: 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 .unsigned long i
3c50: 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b dentities_count;
3c60: 0a 0a 09 69 6e 74 20 73 65 61 72 63 68 5f 61 63 ...int search_ac
3c70: 74 69 76 65 3b 0a 09 43 4b 5f 41 54 54 52 49 42 tive;..CK_ATTRIB
3c80: 55 54 45 5f 50 54 52 20 73 65 61 72 63 68 5f 71 UTE_PTR search_q
3c90: 75 65 72 79 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 uery;..CK_ULONG
3ca0: 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 search_query_cou
3cb0: 6e 74 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f nt;..unsigned lo
3cc0: 6e 67 20 73 65 61 72 63 68 5f 63 75 72 72 5f 69 ng search_curr_i
3cd0: 64 3b 0a 0a 09 69 6e 74 20 73 69 67 6e 5f 61 63 d;...int sign_ac
3ce0: 74 69 76 65 3b 0a 09 43 4b 5f 4d 45 43 48 41 4e tive;..CK_MECHAN
3cf0: 49 53 4d 5f 54 59 50 45 20 73 69 67 6e 5f 6d 65 ISM_TYPE sign_me
3d00: 63 68 61 6e 69 73 6d 3b 0a 09 43 4b 5f 42 59 54 chanism;..CK_BYT
3d10: 45 5f 50 54 52 20 73 69 67 6e 5f 62 75 66 3b 0a E_PTR sign_buf;.
3d20: 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 .unsigned long s
3d30: 69 67 6e 5f 62 75 66 6c 65 6e 3b 0a 09 75 6e 73 ign_buflen;..uns
3d40: 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69 67 6e 5f igned long sign_
3d50: 62 75 66 75 73 65 64 3b 0a 09 73 74 72 75 63 74 bufused;..struct
3d60: 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 cackey_identity
3d70: 20 2a 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 3b *sign_identity;
3d80: 0a 0a 09 69 6e 74 20 64 65 63 72 79 70 74 5f 61 ...int decrypt_a
3d90: 63 74 69 76 65 3b 0a 09 43 4b 5f 4d 45 43 48 41 ctive;..CK_MECHA
3da0: 4e 49 53 4d 5f 54 59 50 45 20 64 65 63 72 79 70 NISM_TYPE decryp
3db0: 74 5f 6d 65 63 68 61 6e 69 73 6d 3b 0a 09 43 4b t_mechanism;..CK
3dc0: 5f 56 4f 49 44 5f 50 54 52 20 64 65 63 72 79 70 _VOID_PTR decryp
3dd0: 74 5f 6d 65 63 68 5f 70 61 72 6d 3b 0a 09 43 4b t_mech_parm;..CK
3de0: 5f 55 4c 4f 4e 47 20 64 65 63 72 79 70 74 5f 6d _ULONG decrypt_m
3df0: 65 63 68 5f 70 61 72 6d 6c 65 6e 3b 0a 09 73 74 ech_parmlen;..st
3e00: 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e ruct cackey_iden
3e10: 74 69 74 79 20 2a 64 65 63 72 79 70 74 5f 69 64 tity *decrypt_id
3e20: 65 6e 74 69 74 79 3b 0a 7d 3b 0a 0a 73 74 72 75 entity;.};..stru
3e30: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 7b ct cackey_slot {
3e40: 0a 09 69 6e 74 20 61 63 74 69 76 65 3b 0a 0a 09 ..int active;...
3e50: 63 68 61 72 20 2a 70 63 73 63 5f 72 65 61 64 65 char *pcsc_reade
3e60: 72 3b 0a 0a 09 69 6e 74 20 70 63 73 63 5f 63 61 r;...int pcsc_ca
3e70: 72 64 5f 63 6f 6e 6e 65 63 74 65 64 3b 0a 09 53 rd_connected;..S
3e80: 43 41 52 44 48 41 4e 44 4c 45 20 70 63 73 63 5f CARDHANDLE pcsc_
3e90: 63 61 72 64 3b 0a 0a 09 69 6e 74 20 74 72 61 6e card;...int tran
3ea0: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 3b 0a 09 saction_depth;..
3eb0: 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 5f int transaction_
3ec0: 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 3b 0a 0a 09 need_hw_lock;...
3ed0: 69 6e 74 20 73 6c 6f 74 5f 72 65 73 65 74 3b 0a int slot_reset;.
3ee0: 0a 09 43 4b 5f 46 4c 41 47 53 20 74 6f 6b 65 6e ..CK_FLAGS token
3ef0: 5f 66 6c 61 67 73 3b 0a 0a 09 75 6e 73 69 67 6e _flags;...unsign
3f00: 65 64 20 63 68 61 72 20 2a 6c 61 62 65 6c 3b 0a ed char *label;.
3f10: 0a 09 44 57 4f 52 44 20 70 72 6f 74 6f 63 6f 6c ..DWORD protocol
3f20: 3b 0a 7d 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e ;.};..typedef en
3f30: 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 54 4c 56 um {..CACKEY_TLV
3f40: 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 3d 20 30 _APP_GENERIC = 0
3f50: 78 30 31 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 x01,..CACKEY_TLV
3f60: 5f 41 50 50 5f 53 4b 49 20 20 20 20 20 3d 20 30 _APP_SKI = 0
3f70: 78 30 32 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 x02,..CACKEY_TLV
3f80: 5f 41 50 50 5f 50 4b 49 20 20 20 20 20 3d 20 30 _APP_PKI = 0
3f90: 78 30 34 0a 7d 20 63 61 63 6b 65 79 5f 74 6c 76 x04.} cackey_tlv
3fa0: 5f 61 70 70 74 79 70 65 3b 0a 0a 74 79 70 65 64 _apptype;..typed
3fb0: 65 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 ef enum {..CACKE
3fc0: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 47 45 4e 45 Y_TLV_OBJID_GENE
3fd0: 52 41 4c 49 4e 46 4f 20 20 20 20 20 20 20 3d 20 RALINFO =
3fe0: 30 78 32 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 0x2000,..CACKEY_
3ff0: 54 4c 56 5f 4f 42 4a 49 44 5f 50 52 4f 50 45 52 TLV_OBJID_PROPER
4000: 53 4f 4e 41 4c 49 4e 46 4f 20 20 20 3d 20 30 78 SONALINFO = 0x
4010: 32 31 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 2100,..CACKEY_TL
4020: 56 5f 4f 42 4a 49 44 5f 41 43 43 45 53 53 43 4f V_OBJID_ACCESSCO
4030: 4e 54 52 4f 4c 20 20 20 20 20 3d 20 30 78 33 30 NTROL = 0x30
4040: 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 00,..CACKEY_TLV_
4050: 4f 42 4a 49 44 5f 4c 4f 47 49 4e 20 20 20 20 20 OBJID_LOGIN
4060: 20 20 20 20 20 20 20 20 3d 20 30 78 34 30 30 30 = 0x4000
4070: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 ,..CACKEY_TLV_OB
4080: 4a 49 44 5f 43 41 52 44 49 4e 46 4f 20 20 20 20 JID_CARDINFO
4090: 20 20 20 20 20 20 3d 20 30 78 35 30 30 30 2c 0a = 0x5000,.
40a0: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 .CACKEY_TLV_OBJI
40b0: 44 5f 42 49 4f 4d 45 54 52 49 43 53 20 20 20 20 D_BIOMETRICS
40c0: 20 20 20 20 3d 20 30 78 36 30 30 30 2c 0a 09 43 = 0x6000,..C
40d0: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f ACKEY_TLV_OBJID_
40e0: 44 49 47 49 54 41 4c 53 49 47 43 45 52 54 20 20 DIGITALSIGCERT
40f0: 20 20 3d 20 30 78 37 30 30 30 2c 0a 09 43 41 43 = 0x7000,..CAC
4100: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 KEY_TLV_OBJID_CA
4110: 43 5f 50 45 52 53 4f 4e 20 20 20 20 20 20 20 20 C_PERSON
4120: 3d 20 30 78 30 32 30 30 2c 0a 09 43 41 43 4b 45 = 0x0200,..CACKE
4130: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f Y_TLV_OBJID_CAC_
4140: 42 45 4e 45 46 49 54 53 20 20 20 20 20 20 3d 20 BENEFITS =
4150: 30 78 30 32 30 32 2c 0a 09 43 41 43 4b 45 59 5f 0x0202,..CACKEY_
4160: 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f 54 TLV_OBJID_CAC_OT
4170: 48 45 52 42 45 4e 45 46 49 54 53 20 3d 20 30 78 HERBENEFITS = 0x
4180: 30 32 30 33 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 0203,..CACKEY_TL
4190: 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 V_OBJID_CAC_PERS
41a0: 4f 4e 4e 45 4c 20 20 20 20 20 3d 20 30 78 30 32 ONNEL = 0x02
41b0: 30 31 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 01,..CACKEY_TLV_
41c0: 4f 42 4a 49 44 5f 43 41 43 5f 50 4b 49 43 45 52 OBJID_CAC_PKICER
41d0: 54 20 20 20 20 20 20 20 3d 20 30 78 30 32 46 45 T = 0x02FE
41e0: 0a 7d 20 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 .} cackey_tlv_ob
41f0: 6a 65 63 74 69 64 3b 0a 0a 74 79 70 65 64 65 66 jectid;..typedef
4200: 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f enum {..CACKEY_
4210: 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 PCSC_S_TOKENPRES
4220: 45 4e 54 20 20 20 20 3d 20 31 2c 0a 09 43 41 43 ENT = 1,..CAC
4230: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 KEY_PCSC_S_OK
4240: 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 2c 0a = 0,.
4250: 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 .CACKEY_PCSC_E_G
4260: 45 4e 45 52 49 43 20 20 20 20 20 20 20 20 20 3d ENERIC =
4270: 20 2d 31 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 -1,..CACKEY_PCS
4280: 43 5f 45 5f 42 41 44 50 49 4e 20 20 20 20 20 20 C_E_BADPIN
4290: 20 20 20 20 3d 20 2d 32 2c 0a 09 43 41 43 4b 45 = -2,..CACKE
42a0: 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 20 Y_PCSC_E_LOCKED
42b0: 20 20 20 20 20 20 20 20 20 3d 20 2d 33 2c 0a 09 = -3,..
42c0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45 CACKEY_PCSC_E_NE
42d0: 45 44 4c 4f 47 49 4e 20 20 20 20 20 20 20 3d 20 EDLOGIN =
42e0: 2d 34 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 -4,..CACKEY_PCSC
42f0: 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 20 20 _E_TOKENABSENT
4300: 20 20 20 3d 20 2d 36 2c 0a 09 43 41 43 4b 45 59 = -6,..CACKEY
4310: 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 20 20 20 _PCSC_E_RETRY
4320: 20 20 20 20 20 20 20 20 3d 20 2d 37 0a 7d 20 63 = -7.} c
4330: 61 63 6b 65 79 5f 72 65 74 3b 0a 0a 73 74 72 75 ackey_ret;..stru
4340: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 63 61 ct cackey_tlv_ca
4350: 72 64 75 72 6c 20 7b 0a 09 75 6e 73 69 67 6e 65 rdurl {..unsigne
4360: 64 20 63 68 61 72 20 20 20 20 20 20 20 20 72 69 d char ri
4370: 64 5b 35 5d 3b 0a 09 63 61 63 6b 65 79 5f 74 6c d[5];..cackey_tl
4380: 76 5f 61 70 70 74 79 70 65 20 20 20 61 70 70 74 v_apptype appt
4390: 79 70 65 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76 ype;..cackey_tlv
43a0: 5f 6f 62 6a 65 63 74 69 64 20 20 6f 62 6a 65 63 _objectid objec
43b0: 74 69 64 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76 tid;..cackey_tlv
43c0: 5f 6f 62 6a 65 63 74 69 64 20 20 61 70 70 69 64 _objectid appid
43d0: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 ;..unsigned char
43e0: 20 20 20 20 20 20 20 20 70 69 6e 69 64 3b 0a 7d pinid;.}
43f0: 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 ;..struct cackey
4400: 5f 74 6c 76 5f 65 6e 74 69 74 79 3b 0a 73 74 72 _tlv_entity;.str
4410: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 uct cackey_tlv_e
4420: 6e 74 69 74 79 20 7b 0a 09 75 69 6e 74 38 5f 74 ntity {..uint8_t
4430: 20 74 61 67 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 tag;..size_t le
4440: 6e 67 74 68 3b 0a 0a 09 75 6e 69 6f 6e 20 7b 0a ngth;...union {.
4450: 09 09 76 6f 69 64 20 2a 76 61 6c 75 65 3b 0a 09 ..void *value;..
4460: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 .struct cackey_t
4470: 6c 76 5f 63 61 72 64 75 72 6c 20 2a 76 61 6c 75 lv_cardurl *valu
4480: 65 5f 63 61 72 64 75 72 6c 3b 0a 09 09 75 69 6e e_cardurl;...uin
4490: 74 38 5f 74 20 76 61 6c 75 65 5f 62 79 74 65 3b t8_t value_byte;
44a0: 0a 09 7d 3b 0a 0a 09 73 74 72 75 63 74 20 63 61 ..};...struct ca
44b0: 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 ckey_tlv_entity
44c0: 2a 5f 6e 65 78 74 3b 0a 7d 3b 0a 0a 2f 2a 20 43 *_next;.};../* C
44d0: 41 43 4b 45 59 20 47 6c 6f 62 61 6c 20 48 61 6e ACKEY Global Han
44e0: 64 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 dles */.static v
44f0: 6f 69 64 20 2a 63 61 63 6b 65 79 5f 62 69 67 6c oid *cackey_bigl
4500: 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74 ock = NULL;.stat
4510: 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 ic struct cackey
4520: 5f 73 65 73 73 69 6f 6e 20 63 61 63 6b 65 79 5f _session cackey_
4530: 73 65 73 73 69 6f 6e 73 5b 31 32 38 5d 3b 0a 73 sessions[128];.s
4540: 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63 tatic struct cac
4550: 6b 65 79 5f 73 6c 6f 74 20 63 61 63 6b 65 79 5f key_slot cackey_
4560: 73 6c 6f 74 73 5b 31 32 38 5d 3b 0a 73 74 61 74 slots[128];.stat
4570: 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 69 6e ic int cackey_in
4580: 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 73 itialized = 0;.s
4590: 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 tatic int cackey
45a0: 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d 20 _biglock_init =
45b0: 30 3b 0a 43 4b 5f 43 5f 49 4e 49 54 49 41 4c 49 0;.CK_C_INITIALI
45c0: 5a 45 5f 41 52 47 53 20 63 61 63 6b 65 79 5f 61 ZE_ARGS cackey_a
45d0: 72 67 73 3b 0a 0a 2f 2a 2a 20 45 78 74 72 61 20 rgs;../** Extra
45e0: 63 65 72 74 69 66 69 63 61 74 65 73 20 74 6f 20 certificates to
45f0: 69 6e 63 6c 75 64 65 20 69 6e 20 74 6f 6b 65 6e include in token
4600: 20 2a 2a 2f 0a 73 74 72 75 63 74 20 63 61 63 6b **/.struct cack
4610: 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 ey_pcsc_identity
4620: 20 65 78 74 72 61 5f 63 65 72 74 73 5b 5d 20 3d extra_certs[] =
4630: 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 63 61 63 {.#include "cac
4640: 6b 65 79 5f 62 75 69 6c 74 69 6e 5f 63 65 72 74 key_builtin_cert
4650: 73 2e 68 22 0a 7d 3b 0a 0a 2f 2a 20 50 43 53 43 s.h".};../* PCSC
4660: 20 47 6c 6f 62 61 6c 20 48 61 6e 64 6c 65 73 20 Global Handles
4670: 2a 2f 0a 73 74 61 74 69 63 20 4c 50 53 43 41 52 */.static LPSCAR
4680: 44 43 4f 4e 54 45 58 54 20 63 61 63 6b 65 79 5f DCONTEXT cackey_
4690: 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 pcsc_handle = NU
46a0: 4c 4c 3b 0a 0a 73 74 61 74 69 63 20 75 6e 73 69 LL;..static unsi
46b0: 67 6e 65 64 20 6c 6f 6e 67 20 63 61 63 6b 65 79 gned long cackey
46c0: 5f 67 65 74 76 65 72 73 69 6f 6e 28 76 6f 69 64 _getversion(void
46d0: 29 20 7b 0a 09 73 74 61 74 69 63 20 75 6e 73 69 ) {..static unsi
46e0: 67 6e 65 64 20 6c 6f 6e 67 20 72 65 74 76 61 6c gned long retval
46f0: 20 3d 20 32 35 35 3b 0a 09 75 6e 73 69 67 6e 65 = 255;..unsigne
4700: 64 20 6c 6f 6e 67 20 6d 61 6a 6f 72 20 3d 20 30 d long major = 0
4710: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 ;..unsigned long
4720: 20 6d 69 6e 6f 72 20 3d 20 30 3b 0a 09 63 68 61 minor = 0;..cha
4730: 72 20 2a 6d 61 6a 6f 72 5f 73 74 72 20 3d 20 4e r *major_str = N
4740: 55 4c 4c 3b 0a 09 63 68 61 72 20 2a 6d 69 6e 6f ULL;..char *mino
4750: 72 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 r_str = NULL;...
4760: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
4770: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a NTF("Called.");.
4780: 0a 09 69 66 20 28 72 65 74 76 61 6c 20 21 3d 20 ..if (retval !=
4790: 32 35 35 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 255) {...CACKEY_
47a0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
47b0: 74 75 72 6e 69 6e 67 20 30 78 25 6c 78 20 28 63 turning 0x%lx (c
47c0: 61 63 68 65 64 29 2e 22 2c 20 72 65 74 76 61 6c ached).", retval
47d0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 72 65 74 );....return(ret
47e0: 76 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65 74 76 61 val);..}...retva
47f0: 6c 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 50 l = 0;..#ifdef P
4800: 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 0a 20 ACKAGE_VERSION.
4810: 20 20 20 20 20 20 20 6d 61 6a 6f 72 5f 73 74 72 major_str
4820: 20 3d 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 = PACKAGE_VERSI
4830: 4f 4e 3b 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 73 ON;..if (major_s
4840: 74 72 29 20 7b 0a 09 20 20 20 20 20 20 20 20 6d tr) {.. m
4850: 61 6a 6f 72 20 3d 20 73 74 72 74 6f 75 6c 28 6d ajor = strtoul(m
4860: 61 6a 6f 72 5f 73 74 72 2c 20 26 6d 69 6e 6f 72 ajor_str, &minor
4870: 5f 73 74 72 2c 20 31 30 29 3b 0a 0a 09 09 69 66 _str, 10);....if
4880: 20 28 6d 69 6e 6f 72 5f 73 74 72 29 20 7b 0a 09 (minor_str) {..
4890: 09 09 6d 69 6e 6f 72 20 3d 20 73 74 72 74 6f 75 ..minor = strtou
48a0: 6c 28 6d 69 6e 6f 72 5f 73 74 72 20 2b 20 31 2c l(minor_str + 1,
48b0: 20 4e 55 4c 4c 2c 20 31 30 29 3b 0a 09 09 7d 0a NULL, 10);...}.
48c0: 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20 28 6d .}...retval = (m
48d0: 61 6a 6f 72 20 3c 3c 20 31 36 29 20 7c 20 28 6d ajor << 16) | (m
48e0: 69 6e 6f 72 20 3c 3c 20 38 29 3b 0a 23 65 6e 64 inor << 8);.#end
48f0: 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 if...CACKEY_DEBU
4900: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
4910: 69 6e 67 20 30 78 25 6c 78 22 2c 20 72 65 74 76 ing 0x%lx", retv
4920: 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 al);...return(re
4930: 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 20 50 43 2f tval);.}../* PC/
4940: 53 43 20 52 65 6c 61 74 65 64 20 46 75 6e 63 74 SC Related Funct
4950: 69 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a 20 53 59 ions */./*. * SY
4960: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 76 6f NPOSIS. * vo
4970: 69 64 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f id cackey_slots_
4980: 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 76 disconnect_all(v
4990: 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 oid);. *. * ARGU
49a0: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e MENTS. * Non
49b0: 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 e. *. * RETURN V
49c0: 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 ALUE. * None
49d0: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 . *. * NOTES. *
49e0: 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f This functio
49f0: 6e 20 64 69 73 63 6f 6e 6e 65 63 74 73 20 66 72 n disconnects fr
4a00: 6f 6d 20 61 6c 6c 20 63 61 72 64 73 2e 0a 20 2a om all cards.. *
4a10: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 . */.static void
4a20: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 cackey_slots_di
4a30: 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 76 6f 69 sconnect_all(voi
4a40: 64 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69 d) {..uint32_t i
4a50: 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 dx;...CACKEY_DEB
4a60: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
4a70: 64 2e 22 29 3b 0a 0a 09 66 6f 72 20 28 69 64 78 d.");...for (idx
4a80: 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a = 0; idx < (siz
4a90: 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 eof(cackey_slots
4aa0: 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 ) / sizeof(cacke
4ab0: 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69 64 y_slots[0])); id
4ac0: 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63 x++) {...if (cac
4ad0: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 key_slots[idx].p
4ae0: 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 csc_card_connect
4af0: 65 64 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f ed) {....CACKEY_
4b00: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 DEBUG_PRINTF("SC
4b10: 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 25 6c ardDisconnect(%l
4b20: 75 29 20 63 61 6c 6c 65 64 22 2c 20 28 75 6e 73 u) called", (uns
4b30: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 78 29 igned long) idx)
4b40: 3b 0a 0a 09 09 09 53 43 61 72 64 44 69 73 63 6f ;.....SCardDisco
4b50: 6e 6e 65 63 74 28 63 61 63 6b 65 79 5f 73 6c 6f nnect(cackey_slo
4b60: 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 63 61 72 ts[idx].pcsc_car
4b70: 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 d, SCARD_LEAVE_C
4b80: 41 52 44 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 ARD);...}....if
4b90: 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 (cackey_slots[id
4ba0: 78 5d 2e 6c 61 62 65 6c 29 20 7b 0a 09 09 09 66 x].label) {....f
4bb0: 72 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 ree(cackey_slots
4bc0: 5b 69 64 78 5d 2e 6c 61 62 65 6c 29 3b 0a 0a 09 [idx].label);...
4bd0: 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 ..cackey_slots[i
4be0: 64 78 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c dx].label = NULL
4bf0: 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f ;...}....cackey_
4c00: 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f slots[idx].pcsc_
4c10: 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d card_connected =
4c20: 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 0;...cackey_slo
4c30: 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63 74 ts[idx].transact
4c40: 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 ion_depth = 0;..
4c50: 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 .cackey_slots[id
4c60: 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e x].transaction_n
4c70: 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b eed_hw_lock = 0;
4c80: 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 ....if (cackey_s
4c90: 6c 6f 74 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 lots[idx].active
4ca0: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 ) {....CACKEY_DE
4cb0: 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 61 72 6b BUG_PRINTF("Mark
4cc0: 69 6e 67 20 61 63 74 69 76 65 20 73 6c 6f 74 20 ing active slot
4cd0: 25 6c 75 20 61 73 20 62 65 69 6e 67 20 72 65 73 %lu as being res
4ce0: 65 74 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c et", (unsigned l
4cf0: 6f 6e 67 29 20 69 64 78 29 3b 0a 09 09 7d 0a 0a ong) idx);...}..
4d00: 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 ..cackey_slots[i
4d10: 64 78 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 20 3d dx].slot_reset =
4d20: 20 31 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 1;..}...CACKEY_
4d30: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
4d40: 74 75 72 6e 69 6e 67 22 29 3b 0a 0a 09 72 65 74 turning");...ret
4d50: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 urn;.}../*. * SY
4d60: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 NPOSIS. * ca
4d70: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f ckey_ret cackey_
4d80: 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 76 6f 69 pcsc_connect(voi
4d90: 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 d);. *. * ARGUME
4da0: 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a NTS. * None.
4db0: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c *. * RETURN VAL
4dc0: 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 UE. * CACKEY
4dd0: 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 _PCSC_S_OK
4de0: 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a On success. *
4df0: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 CACKEY_PCSC
4e00: 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e _E_GENERIC On
4e10: 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 error. *. * NOT
4e20: 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 ES. * This f
4e30: 75 6e 63 74 69 6f 6e 20 63 6f 6e 6e 65 63 74 73 unction connects
4e40: 20 74 6f 20 74 68 65 20 50 43 2f 53 43 20 43 6f to the PC/SC Co
4e50: 6e 6e 65 63 74 69 6f 6e 20 4d 61 6e 61 67 65 72 nnection Manager
4e60: 20 61 6e 64 20 75 70 64 61 74 65 73 20 74 68 65 and updates the
4e70: 0a 20 2a 20 20 20 20 20 67 6c 6f 62 61 6c 20 68 . * global h
4e80: 61 6e 64 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 andle.. *. */.st
4e90: 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 atic cackey_ret
4ea0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e cackey_pcsc_conn
4eb0: 65 63 74 28 76 6f 69 64 29 20 7b 0a 09 4c 4f 4e ect(void) {..LON
4ec0: 47 20 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 G scard_est_cont
4ed0: 65 78 74 5f 72 65 74 3b 0a 23 69 66 64 65 66 20 ext_ret;.#ifdef
4ee0: 48 41 56 45 5f 53 43 41 52 44 49 53 56 41 4c 49 HAVE_SCARDISVALI
4ef0: 44 43 4f 4e 54 45 58 54 0a 09 4c 4f 4e 47 20 73 DCONTEXT..LONG s
4f00: 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 card_isvalid_ret
4f10: 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 ;.#endif...CACKE
4f20: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
4f30: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 Called.");...if
4f40: 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e (cackey_pcsc_han
4f50: 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 dle == NULL) {..
4f60: 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e .cackey_pcsc_han
4f70: 64 6c 65 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a dle = malloc(siz
4f80: 65 6f 66 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 eof(*cackey_pcsc
4f90: 5f 68 61 6e 64 6c 65 29 29 3b 0a 09 09 69 66 20 _handle));...if
4fa0: 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e (cackey_pcsc_han
4fb0: 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 dle == NULL) {..
4fc0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
4fd0: 52 49 4e 54 46 28 22 43 61 6c 6c 20 74 6f 20 6d RINTF("Call to m
4fe0: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 2c 20 alloc() failed,
4ff0: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 returning in fai
5000: 6c 75 72 65 22 29 3b 0a 0a 09 09 09 63 61 63 6b lure");.....cack
5010: 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e ey_slots_disconn
5020: 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 72 ect_all();.....r
5030: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 eturn(CACKEY_PCS
5040: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 C_E_GENERIC);...
5050: 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 }....CACKEY_DEBU
5060: 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 45 G_PRINTF("SCardE
5070: 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 stablishContext(
5080: 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09 09 73 63 ) called");...sc
5090: 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f ard_est_context_
50a0: 72 65 74 20 3d 20 53 43 61 72 64 45 73 74 61 62 ret = SCardEstab
50b0: 6c 69 73 68 43 6f 6e 74 65 78 74 28 53 43 41 52 lishContext(SCAR
50c0: 44 5f 53 43 4f 50 45 5f 53 59 53 54 45 4d 2c 20 D_SCOPE_SYSTEM,
50d0: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 63 61 63 6b NULL, NULL, cack
50e0: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b ey_pcsc_handle);
50f0: 0a 09 09 69 66 20 28 73 63 61 72 64 5f 65 73 74 ...if (scard_est
5100: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 21 3d 20 _context_ret !=
5110: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 SCARD_S_SUCCESS)
5120: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 {....CACKEY_DEB
5130: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 20 UG_PRINTF("Call
5140: 74 6f 20 53 43 61 72 64 45 73 74 61 62 6c 69 73 to SCardEstablis
5150: 68 43 6f 6e 74 65 78 74 20 66 61 69 6c 65 64 20 hContext failed
5160: 28 72 65 74 75 72 6e 65 64 20 25 73 2f 25 6c 69 (returned %s/%li
5170: 29 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 ), returning in
5180: 66 61 69 6c 75 72 65 22 2c 20 43 41 43 4b 45 59 failure", CACKEY
5190: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 _DEBUG_FUNC_SCAR
51a0: 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 DERR_TO_STR(scar
51b0: 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 d_est_context_re
51c0: 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 t), (long) scard
51d0: 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 _est_context_ret
51e0: 29 3b 0a 0a 09 09 09 66 72 65 65 28 63 61 63 6b );.....free(cack
51f0: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b ey_pcsc_handle);
5200: 0a 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f ....cackey_pcsc_
5210: 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a handle = NULL;..
5220: 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f ...cackey_slots_
5230: 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 disconnect_all()
5240: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 ;.....return(CAC
5250: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 KEY_PCSC_E_GENER
5260: 49 43 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 IC);...}..}..#if
5270: 64 65 66 20 48 41 56 45 5f 53 43 41 52 44 49 53 def HAVE_SCARDIS
5280: 56 41 4c 49 44 43 4f 4e 54 45 58 54 0a 09 43 41 VALIDCONTEXT..CA
5290: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
52a0: 46 28 22 53 43 61 72 64 49 73 56 61 6c 69 64 43 F("SCardIsValidC
52b0: 6f 6e 74 65 78 74 28 29 20 63 61 6c 6c 65 64 22 ontext() called"
52c0: 29 3b 0a 09 73 63 61 72 64 5f 69 73 76 61 6c 69 );..scard_isvali
52d0: 64 5f 72 65 74 20 3d 20 53 43 61 72 64 49 73 56 d_ret = SCardIsV
52e0: 61 6c 69 64 43 6f 6e 74 65 78 74 28 2a 63 61 63 alidContext(*cac
52f0: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 key_pcsc_handle)
5300: 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 69 73 76 ;..if (scard_isv
5310: 61 6c 69 64 5f 72 65 74 20 21 3d 20 53 43 41 52 alid_ret != SCAR
5320: 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 D_S_SUCCESS) {..
5330: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
5340: 49 4e 54 46 28 22 48 61 6e 64 6c 65 20 68 61 73 INTF("Handle has
5350: 20 62 65 63 6f 6d 65 20 69 6e 76 61 6c 69 64 20 become invalid
5360: 28 53 43 61 72 64 49 73 56 61 6c 69 64 43 6f 6e (SCardIsValidCon
5370: 74 65 78 74 20 3d 20 25 73 2f 25 6c 69 29 2c 20 text = %s/%li),
5380: 74 72 79 69 6e 67 20 74 6f 20 72 65 2d 65 73 74 trying to re-est
5390: 61 62 6c 69 73 68 2e 2e 2e 22 2c 20 43 41 43 4b ablish...", CACK
53a0: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 EY_DEBUG_FUNC_SC
53b0: 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 ARDERR_TO_STR(sc
53c0: 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 29 ard_isvalid_ret)
53d0: 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 69 , (long) scard_i
53e0: 73 76 61 6c 69 64 5f 72 65 74 29 3b 0a 0a 09 09 svalid_ret);....
53f0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
5400: 4e 54 46 28 22 53 43 61 72 64 45 73 74 61 62 6c NTF("SCardEstabl
5410: 69 73 68 43 6f 6e 74 65 78 74 28 29 20 63 61 6c ishContext() cal
5420: 6c 65 64 22 29 3b 0a 09 09 73 63 61 72 64 5f 65 led");...scard_e
5430: 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 3d st_context_ret =
5440: 20 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 SCardEstablishC
5450: 6f 6e 74 65 78 74 28 53 43 41 52 44 5f 53 43 4f ontext(SCARD_SCO
5460: 50 45 5f 53 59 53 54 45 4d 2c 20 4e 55 4c 4c 2c PE_SYSTEM, NULL,
5470: 20 4e 55 4c 4c 2c 20 63 61 63 6b 65 79 5f 70 63 NULL, cackey_pc
5480: 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 69 66 sc_handle);...if
5490: 20 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 (scard_est_cont
54a0: 65 78 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44 ext_ret != SCARD
54b0: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 _S_SUCCESS) {...
54c0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
54d0: 49 4e 54 46 28 22 43 61 6c 6c 20 74 6f 20 53 43 INTF("Call to SC
54e0: 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 ardEstablishCont
54f0: 65 78 74 20 66 61 69 6c 65 64 20 28 72 65 74 75 ext failed (retu
5500: 72 6e 65 64 20 25 73 2f 25 6c 69 29 2c 20 72 65 rned %s/%li), re
5510: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 turning in failu
5520: 72 65 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 re", CACKEY_DEBU
5530: 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f G_FUNC_SCARDERR_
5540: 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 65 73 74 TO_STR(scard_est
5550: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 2c 20 28 _context_ret), (
5560: 6c 6f 6e 67 29 20 73 63 61 72 64 5f 65 73 74 5f long) scard_est_
5570: 63 6f 6e 74 65 78 74 5f 72 65 74 29 3b 0a 0a 09 context_ret);...
5580: 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 70 63 ..free(cackey_pc
5590: 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 09 63 sc_handle);....c
55a0: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c ackey_pcsc_handl
55b0: 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 63 61 e = NULL;.....ca
55c0: 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f ckey_slots_disco
55d0: 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 nnect_all();....
55e0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 .return(CACKEY_P
55f0: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a CSC_E_GENERIC);.
5600: 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 ..}....CACKEY_DE
5610: 42 55 47 5f 50 52 49 4e 54 46 28 22 48 61 6e 64 BUG_PRINTF("Hand
5620: 6c 65 20 68 61 73 20 62 65 65 6e 20 72 65 2d 65 le has been re-e
5630: 73 74 61 62 6c 69 73 68 65 64 22 29 3b 0a 09 7d stablished");..}
5640: 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 .#endif...CACKEY
5650: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 _DEBUG_PRINTF("S
5660: 75 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e 6e 65 ucessfully conne
5670: 63 74 65 64 20 74 6f 20 50 43 2f 53 43 2c 20 72 cted to PC/SC, r
5680: 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 eturning in succ
5690: 65 73 73 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 ess");...return(
56a0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b CACKEY_PCSC_S_OK
56b0: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 );.}../*. * SYNP
56c0: 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b OSIS. * cack
56d0: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 70 63 ey_ret cackey_pc
56e0: 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 76 6f sc_disconnect(vo
56f0: 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d id);. *. * ARGUM
5700: 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 ENTS. * None
5710: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 . *. * RETURN VA
5720: 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 LUE. * CACKE
5730: 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 Y_PCSC_S_OK
5740: 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 On success.
5750: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 * CACKEY_PCS
5760: 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f C_E_GENERIC O
5770: 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f n error. *. * NO
5780: 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 TES. * This
5790: 66 75 6e 63 74 69 6f 6e 20 64 69 73 63 6f 6e 6e function disconn
57a0: 65 63 74 73 20 66 72 6f 6d 20 74 68 65 20 50 43 ects from the PC
57b0: 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 6d /SC Connection m
57c0: 61 6e 61 67 65 72 20 61 6e 64 20 75 70 64 61 74 anager and updat
57d0: 65 73 0a 20 2a 20 20 20 20 20 74 68 65 20 67 6c es. * the gl
57e0: 6f 62 61 6c 20 68 61 6e 64 6c 65 2e 0a 20 2a 0a obal handle.. *.
57f0: 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 */.static cacke
5800: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 70 63 73 y_ret cackey_pcs
5810: 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 76 6f 69 c_disconnect(voi
5820: 64 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 d) {..LONG scard
5830: 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72 65 74 _rel_context_ret
5840: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ;...CACKEY_DEBUG
5850: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
5860: 22 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 ");...if (cackey
5870: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 3d 20 _pcsc_handle ==
5880: 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e NULL) {...return
5890: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f (CACKEY_PCSC_S_O
58a0: 4b 29 3b 0a 09 7d 0a 0a 09 73 63 61 72 64 5f 72 K);..}...scard_r
58b0: 65 6c 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 3d el_context_ret =
58c0: 20 53 43 61 72 64 52 65 6c 65 61 73 65 43 6f 6e SCardReleaseCon
58d0: 74 65 78 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 text(*cackey_pcs
58e0: 63 5f 68 61 6e 64 6c 65 29 3b 0a 0a 09 69 66 20 c_handle);...if
58f0: 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e (cackey_pcsc_han
5900: 64 6c 65 29 20 7b 0a 09 09 66 72 65 65 28 63 61 dle) {...free(ca
5910: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 ckey_pcsc_handle
5920: 29 3b 0a 09 0a 09 09 63 61 63 6b 65 79 5f 70 63 );.....cackey_pc
5930: 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c sc_handle = NULL
5940: 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 63 61 72 64 ;..}...if (scard
5950: 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72 65 74 _rel_context_ret
5960: 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 != SCARD_S_SUCC
5970: 45 53 53 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 ESS) {...return(
5980: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 CACKEY_PCSC_E_GE
5990: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 72 65 74 NERIC);..}...ret
59a0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f urn(CACKEY_PCSC_
59b0: 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 S_OK);.}../*. *
59c0: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 SYNPOSIS. *
59d0: 76 6f 69 64 20 63 61 63 6b 65 79 5f 6d 61 72 6b void cackey_mark
59e0: 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 74 72 75 _slot_reset(stru
59f0: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a ct cackey_slot *
5a00: 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 slot);. *. * ARG
5a10: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f UMENTS. * No
5a20: 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 ne. *. * RETURN
5a30: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f 6e VALUE. * Non
5a40: 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a e. *. * NOTES. *
5a50: 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 This functi
5a60: 6f 6e 20 6d 61 72 6b 73 20 61 20 73 6c 6f 74 20 on marks a slot
5a70: 68 61 73 20 68 61 76 69 6e 67 20 62 65 65 6e 20 has having been
5a80: 72 65 73 65 74 2c 20 74 6f 20 6c 61 74 65 72 20 reset, to later
5a90: 62 65 20 63 6c 65 61 6e 65 64 20 75 70 2e 0a 20 be cleaned up..
5aa0: 2a 20 20 20 20 20 43 6c 65 61 6e 75 70 20 6f 6e * Cleanup on
5ab0: 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 ly happens when
5ac0: 61 20 50 4b 43 53 23 31 31 20 63 6c 69 65 6e 74 a PKCS#11 client
5ad0: 20 63 61 6c 6c 73 20 43 5f 46 69 6e 64 4f 62 6a calls C_FindObj
5ae0: 65 63 74 73 49 6e 69 74 2e 0a 20 2a 0a 20 2a 2f ectsInit.. *. */
5af0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 .static void cac
5b00: 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 key_mark_slot_re
5b10: 73 65 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 set(struct cacke
5b20: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a y_slot *slot) {.
5b30: 09 69 66 20 28 73 6c 6f 74 20 3d 3d 20 4e 55 4c .if (slot == NUL
5b40: 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 L) {...return;..
5b50: 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 }...CACKEY_DEBUG
5b60: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
5b70: 22 29 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e ");...if (slot->
5b80: 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 pcsc_card_connec
5b90: 74 65 64 29 20 7b 0a 09 09 53 43 61 72 64 44 69 ted) {...SCardDi
5ba0: 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 sconnect(slot->p
5bb0: 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f csc_card, SCARD_
5bc0: 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 7d 0a LEAVE_CARD);..}.
5bd0: 0a 09 73 6c 6f 74 2d 3e 73 6c 6f 74 5f 72 65 73 ..slot->slot_res
5be0: 65 74 20 3d 20 31 3b 0a 09 73 6c 6f 74 2d 3e 70 et = 1;..slot->p
5bf0: 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 csc_card_connect
5c00: 65 64 20 3d 20 30 3b 0a 09 73 6c 6f 74 2d 3e 74 ed = 0;..slot->t
5c10: 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 oken_flags = CKF
5c20: 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b _LOGIN_REQUIRED;
5c30: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
5c40: 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e PRINTF("Returnin
5c50: 67 2e 22 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a g.");...return;.
5c60: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 }../*. * SYNPOSI
5c70: 53 0a 20 2a 20 20 20 20 20 4c 4f 4e 47 20 63 61 S. * LONG ca
5c80: 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 ckey_reconnect_c
5c90: 61 72 64 28 73 74 72 75 63 74 20 63 61 63 6b 65 ard(struct cacke
5ca0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 44 57 y_slot *slot, DW
5cb0: 4f 52 44 20 64 65 66 61 75 6c 74 5f 70 72 6f 74 ORD default_prot
5cc0: 6f 63 6f 6c 2c 20 4c 50 44 57 4f 52 44 20 73 65 ocol, LPDWORD se
5cd0: 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 29 lected_protocol)
5ce0: 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 ;. *. * ARGUMENT
5cf0: 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f S. * cackey_
5d00: 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 slot *slot. *
5d10: 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 Slot to se
5d20: 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 nd commands to.
5d30: 2a 0a 20 2a 20 20 20 20 20 44 57 4f 52 44 20 64 *. * DWORD d
5d40: 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 0a efault_protocol.
5d50: 20 2a 20 20 20 20 20 20 20 20 20 50 72 6f 74 6f * Proto
5d60: 63 6f 6c 20 74 6f 20 61 74 74 65 6d 70 74 20 66 col to attempt f
5d70: 69 72 73 74 0a 20 2a 0a 20 2a 20 20 20 20 20 4c irst. *. * L
5d80: 50 44 57 4f 52 44 20 73 65 6c 65 63 74 65 64 5f PDWORD selected_
5d90: 70 72 6f 74 6f 63 6f 6c 0a 20 2a 20 20 20 20 20 protocol. *
5da0: 20 20 20 20 5b 4f 55 54 5d 20 50 72 6f 74 6f 63 [OUT] Protoc
5db0: 6f 6c 20 73 65 6c 65 63 74 65 64 0a 20 2a 0a 20 ol selected. *.
5dc0: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 * RETURN VALUE.
5dd0: 2a 20 20 20 20 20 54 68 65 20 72 65 74 75 72 6e * The return
5de0: 20 76 61 6c 75 65 20 66 72 6f 6d 20 53 43 61 72 value from SCar
5df0: 64 52 65 63 6f 6e 6e 65 63 74 28 29 0a 20 2a 0a dReconnect(). *.
5e00: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 * NOTES. *
5e10: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 This function is
5e20: 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e a wrapper aroun
5e30: 64 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 d SCardReconnect
5e40: 28 29 0a 20 2a 0a 20 2a 20 20 20 20 20 54 68 65 (). *. * The
5e50: 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 SCardReconnect(
5e60: 29 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 ) function call
5e70: 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 66 will be called f
5e80: 69 72 73 74 20 77 69 74 68 20 74 68 65 0a 20 2a irst with the. *
5e90: 20 20 20 20 20 64 77 50 72 65 66 65 72 72 65 64 dwPreferred
5ea0: 50 72 6f 74 6f 63 6f 6c 73 20 6f 66 20 22 64 65 Protocols of "de
5eb0: 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 22 2e fault_protocol".
5ec0: 20 20 49 66 20 74 68 61 74 20 63 61 6c 6c 20 72 If that call r
5ed0: 65 74 75 72 6e 73 0a 20 2a 20 20 20 20 20 53 43 eturns. * SC
5ee0: 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d ARD_E_PROTO_MISM
5ef0: 41 54 43 48 20 74 72 79 20 61 67 61 69 6e 20 77 ATCH try again w
5f00: 69 74 68 20 61 20 70 72 6f 74 6f 63 6f 6c 20 6f ith a protocol o
5f10: 66 20 54 3d 30 2c 20 61 6e 64 20 66 61 69 6c 69 f T=0, and faili
5f20: 6e 67 0a 20 2a 20 20 20 20 20 74 68 61 74 20 54 ng. * that T
5f30: 3d 31 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 =1.. *. */.stati
5f40: 63 20 4c 4f 4e 47 20 63 61 63 6b 65 79 5f 72 65 c LONG cackey_re
5f50: 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 74 72 connect_card(str
5f60: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 uct cackey_slot
5f70: 2a 73 6c 6f 74 2c 20 44 57 4f 52 44 20 64 65 66 *slot, DWORD def
5f80: 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 2c 20 4c ault_protocol, L
5f90: 50 44 57 4f 52 44 20 73 65 6c 65 63 74 65 64 5f PDWORD selected_
5fa0: 70 72 6f 74 6f 63 6f 6c 29 20 7b 0a 09 4c 4f 4e protocol) {..LON
5fb0: 47 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 G scard_conn_ret
5fc0: 3b 0a 0a 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 ;...scard_conn_r
5fd0: 65 74 20 3d 20 53 43 61 72 64 52 65 63 6f 6e 6e et = SCardReconn
5fe0: 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 ect(slot->pcsc_c
5ff0: 61 72 64 2c 20 53 43 41 52 44 5f 53 48 41 52 45 ard, SCARD_SHARE
6000: 5f 53 48 41 52 45 44 2c 20 64 65 66 61 75 6c 74 _SHARED, default
6010: 5f 70 72 6f 74 6f 63 6f 6c 2c 20 53 43 41 52 44 _protocol, SCARD
6020: 5f 52 45 53 45 54 5f 43 41 52 44 2c 20 73 65 6c _RESET_CARD, sel
6030: 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b ected_protocol);
6040: 0a 0a 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e ...if (scard_con
6050: 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 n_ret == SCARD_E
6060: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 _PROTO_MISMATCH)
6070: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
6080: 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 52 G_PRINTF("SCardR
6090: 65 63 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72 econnect() retur
60a0: 6e 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 ned SCARD_E_PROT
60b0: 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69 O_MISMATCH, tryi
60c0: 6e 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d 30 ng with just T=0
60d0: 22 29 0a 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f ")...scard_conn_
60e0: 72 65 74 20 3d 20 53 43 61 72 64 52 65 63 6f 6e ret = SCardRecon
60f0: 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f nect(slot->pcsc_
6100: 63 61 72 64 2c 20 53 43 41 52 44 5f 53 48 41 52 card, SCARD_SHAR
6110: 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f E_SHARED, SCARD_
6120: 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20 53 43 41 PROTOCOL_T0, SCA
6130: 52 44 5f 52 45 53 45 54 5f 43 41 52 44 2c 20 73 RD_RESET_CARD, s
6140: 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c elected_protocol
6150: 29 3b 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f );....if (scard_
6160: 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 conn_ret == SCAR
6170: 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 D_E_PROTO_MISMAT
6180: 43 48 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f CH) {....CACKEY_
6190: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 DEBUG_PRINTF("SC
61a0: 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 20 72 ardReconnect() r
61b0: 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f eturned SCARD_E_
61c0: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 PROTO_MISMATCH,
61d0: 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73 74 trying with just
61e0: 20 54 3d 31 22 29 0a 09 09 09 73 63 61 72 64 5f T=1")....scard_
61f0: 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 conn_ret = SCard
6200: 52 65 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e Reconnect(slot->
6210: 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 pcsc_card, SCARD
6220: 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 _SHARE_SHARED, S
6230: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 CARD_PROTOCOL_T1
6240: 2c 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41 , SCARD_RESET_CA
6250: 52 44 2c 20 73 65 6c 65 63 74 65 64 5f 70 72 6f RD, selected_pro
6260: 74 6f 63 6f 6c 29 3b 0a 09 09 7d 0a 09 7d 0a 0a tocol);...}..}..
6270: 09 72 65 74 75 72 6e 28 73 63 61 72 64 5f 63 6f .return(scard_co
6280: 6e 6e 5f 72 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 nn_ret);.}../*.
6290: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 * SYNPOSIS. *
62a0: 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 cackey_ret cac
62b0: 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 key_connect_card
62c0: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 (struct cackey_s
62d0: 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 lot *slot);. *.
62e0: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 * ARGUMENTS. *
62f0: 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a cackey_slot *
6300: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 slot. *
6310: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d Slot to send com
6320: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 mands to. *. * R
6330: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 ETURN VALUE. *
6340: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 CACKEY_PCSC_S
6350: 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 _OK On s
6360: 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 uccess. * CA
6370: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 CKEY_PCSC_E_GENE
6380: 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a RIC On error.
6390: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 *. * NOTES. *
63a0: 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 None. *. */.s
63b0: 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 tatic cackey_ret
63c0: 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f cackey_connect_
63d0: 63 61 72 64 28 73 74 72 75 63 74 20 63 61 63 6b card(struct cack
63e0: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b ey_slot *slot) {
63f0: 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 70 63 73 ..cackey_ret pcs
6400: 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 c_connect_ret;..
6410: 44 57 4f 52 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a DWORD protocol;.
6420: 09 4c 4f 4e 47 20 73 63 61 72 64 5f 63 6f 6e 6e .LONG scard_conn
6430: 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 _ret;...CACKEY_D
6440: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
6450: 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 led.");...if (!s
6460: 6c 6f 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f lot) {...CACKEY_
6470: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e DEBUG_PRINTF("In
6480: 76 61 6c 69 64 20 73 6c 6f 74 20 73 70 65 63 69 valid slot speci
6490: 66 69 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 fied, returning
64a0: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 in failure");...
64b0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 .return(CACKEY_P
64c0: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a CSC_E_GENERIC);.
64d0: 09 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 .}...pcsc_connec
64e0: 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70 t_ret = cackey_p
64f0: 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 csc_connect();..
6500: 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 if (pcsc_connect
6510: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 _ret != CACKEY_P
6520: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 CSC_S_OK) {...CA
6530: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
6540: 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f F("Connection to
6550: 20 50 43 2f 53 43 20 66 61 69 6c 65 64 2c 20 72 PC/SC failed, r
6560: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c eturning in fail
6570: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ure");....return
6580: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 (CACKEY_PCSC_E_G
6590: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a ENERIC);..}.../*
65a0: 20 43 6f 6e 6e 65 63 74 20 74 6f 20 72 65 61 64 Connect to read
65b0: 65 72 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f er, if needed */
65c0: 0a 09 69 66 20 28 21 73 6c 6f 74 2d 3e 70 63 73 ..if (!slot->pcs
65d0: 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 c_card_connected
65e0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
65f0: 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 UG_PRINTF("SCard
6600: 43 6f 6e 6e 65 63 74 28 25 73 29 20 63 61 6c 6c Connect(%s) call
6610: 65 64 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f ed", slot->pcsc_
6620: 72 65 61 64 65 72 29 3b 0a 09 09 73 63 61 72 64 reader);...scard
6630: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 _conn_ret = SCar
6640: 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 dConnect(*cackey
6650: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c _pcsc_handle, sl
6660: 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c ot->pcsc_reader,
6670: 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 SCARD_SHARE_SHA
6680: 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f RED, SCARD_PROTO
6690: 43 4f 4c 5f 54 30 20 7c 20 53 43 41 52 44 5f 50 COL_T0 | SCARD_P
66a0: 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f ROTOCOL_T1, &slo
66b0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70 t->pcsc_card, &p
66c0: 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 69 66 20 rotocol);....if
66d0: 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 (scard_conn_ret
66e0: 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f == SCARD_E_PROTO
66f0: 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 09 _MISMATCH) {....
6700: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
6710: 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 NTF("SCardConnec
6720: 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 t() returned SCA
6730: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 RD_E_PROTO_MISMA
6740: 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68 TCH, trying with
6750: 20 6a 75 73 74 20 54 3d 30 22 29 0a 09 09 09 73 just T=0")....s
6760: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 card_conn_ret =
6770: 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 SCardConnect(*ca
6780: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 ckey_pcsc_handle
6790: 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 , slot->pcsc_rea
67a0: 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45 der, SCARD_SHARE
67b0: 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 _SHARED, SCARD_P
67c0: 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20 26 73 6c 6f ROTOCOL_T0, &slo
67d0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70 t->pcsc_card, &p
67e0: 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 09 69 66 rotocol);.....if
67f0: 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 (scard_conn_ret
6800: 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 == SCARD_E_PROT
6810: 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 O_MISMATCH) {...
6820: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
6830: 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e RINTF("SCardConn
6840: 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 ect() returned S
6850: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 CARD_E_PROTO_MIS
6860: 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69 MATCH, trying wi
6870: 74 68 20 6a 75 73 74 20 54 3d 31 22 29 0a 09 09 th just T=1")...
6880: 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 ..scard_conn_ret
6890: 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 = SCardConnect(
68a0: 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e *cackey_pcsc_han
68b0: 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f dle, slot->pcsc_
68c0: 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48 reader, SCARD_SH
68d0: 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52 ARE_SHARED, SCAR
68e0: 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 D_PROTOCOL_T1, &
68f0: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c slot->pcsc_card,
6900: 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09 &protocol);....
6910: 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 63 61 }...}....if (sca
6920: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 rd_conn_ret == S
6930: 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44 CARD_W_UNPOWERED
6940: 5f 43 41 52 44 29 20 7b 0a 09 09 09 43 41 43 4b _CARD) {....CACK
6950: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
6960: 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 "SCardConnect()
6970: 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 57 returned SCARD_W
6980: 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41 52 44 2c _UNPOWERED_CARD,
6990: 20 74 72 79 69 6e 67 20 74 6f 20 72 65 2d 63 6f trying to re-co
69a0: 6e 6e 65 63 74 2e 2e 2e 22 29 3b 0a 0a 09 09 09 nnect...");.....
69b0: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d scard_conn_ret =
69c0: 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 SCardConnect(*c
69d0: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c ackey_pcsc_handl
69e0: 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 e, slot->pcsc_re
69f0: 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 ader, SCARD_SHAR
6a00: 45 5f 44 49 52 45 43 54 2c 20 53 43 41 52 44 5f E_DIRECT, SCARD_
6a10: 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 PROTOCOL_T0 | SC
6a20: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c ARD_PROTOCOL_T1,
6a30: 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 &slot->pcsc_car
6a40: 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a d, &protocol);..
6a50: 09 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e ...if (scard_con
6a60: 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 n_ret == SCARD_E
6a70: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 _PROTO_MISMATCH)
6a80: 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 {.....CACKEY_DE
6a90: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 BUG_PRINTF("SCar
6aa0: 64 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72 dConnect() retur
6ab0: 6e 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 ned SCARD_E_PROT
6ac0: 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69 O_MISMATCH, tryi
6ad0: 6e 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d 30 ng with just T=0
6ae0: 22 29 0a 09 09 09 09 73 63 61 72 64 5f 63 6f 6e ").....scard_con
6af0: 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e n_ret = SCardCon
6b00: 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 nect(*cackey_pcs
6b10: 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e c_handle, slot->
6b20: 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41 pcsc_reader, SCA
6b30: 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c RD_SHARE_SHARED,
6b40: 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f SCARD_PROTOCOL_
6b50: 54 30 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f T0, &slot->pcsc_
6b60: 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 card, &protocol)
6b70: 3b 0a 0a 09 09 09 09 69 66 20 28 73 63 61 72 64 ;......if (scard
6b80: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 _conn_ret == SCA
6b90: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 RD_E_PROTO_MISMA
6ba0: 54 43 48 29 20 7b 0a 09 09 09 09 09 43 41 43 4b TCH) {......CACK
6bb0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
6bc0: 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 "SCardConnect()
6bd0: 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45 returned SCARD_E
6be0: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c _PROTO_MISMATCH,
6bf0: 20 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73 trying with jus
6c00: 74 20 54 3d 31 22 29 0a 09 09 09 09 09 73 63 61 t T=1")......sca
6c10: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 rd_conn_ret = SC
6c20: 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b ardConnect(*cack
6c30: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 ey_pcsc_handle,
6c40: 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 slot->pcsc_reade
6c50: 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 r, SCARD_SHARE_S
6c60: 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f HARED, SCARD_PRO
6c70: 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74 2d TOCOL_T1, &slot-
6c80: 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f >pcsc_card, &pro
6c90: 74 6f 63 6f 6c 29 3b 0a 09 09 09 09 7d 0a 09 09 tocol);.....}...
6ca0: 09 7d 0a 0a 09 09 09 73 63 61 72 64 5f 63 6f 6e .}.....scard_con
6cb0: 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 n_ret = cackey_r
6cc0: 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c econnect_card(sl
6cd0: 6f 74 2c 20 70 72 6f 74 6f 63 6f 6c 2c 20 26 70 ot, protocol, &p
6ce0: 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 7d 0a 0a 09 rotocol);...}...
6cf0: 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f .if (scard_conn_
6d00: 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 ret != SCARD_S_S
6d10: 55 43 43 45 53 53 29 20 7b 0a 09 09 09 43 41 43 UCCESS) {....CAC
6d20: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
6d30: 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 ("Connection to
6d40: 63 61 72 64 20 66 61 69 6c 65 64 2c 20 72 65 74 card failed, ret
6d50: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 urning in failur
6d60: 65 20 28 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 e (SCardConnect(
6d70: 29 20 3d 20 25 73 2f 25 6c 69 29 22 2c 20 43 41 ) = %s/%li)", CA
6d80: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f CKEY_DEBUG_FUNC_
6d90: 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 SCARDERR_TO_STR(
6da0: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 29 2c scard_conn_ret),
6db0: 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 63 6f (long) scard_co
6dc0: 6e 6e 5f 72 65 74 29 3b 0a 0a 09 09 09 72 65 74 nn_ret);.....ret
6dd0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f urn(CACKEY_PCSC_
6de0: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a E_GENERIC);...}.
6df0: 0a 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 ...slot->pcsc_ca
6e00: 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 31 rd_connected = 1
6e10: 3b 0a 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 ;...slot->transa
6e20: 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b ction_depth = 0;
6e30: 0a 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 ...slot->transac
6e40: 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 tion_need_hw_loc
6e50: 6b 20 3d 20 30 3b 0a 09 09 73 6c 6f 74 2d 3e 70 k = 0;...slot->p
6e60: 72 6f 74 6f 63 6f 6c 20 3d 20 70 72 6f 74 6f 63 rotocol = protoc
6e70: 6f 6c 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 ol;..}...return(
6e80: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b CACKEY_PCSC_S_OK
6e90: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 );.}../*. * SYNP
6ea0: 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b OSIS. * cack
6eb0: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 62 65 ey_ret cackey_be
6ec0: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 gin_transaction(
6ed0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c struct cackey_sl
6ee0: 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a ot *slot);. *. *
6ef0: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 ARGUMENTS. *
6f00: 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 cackey_slot *s
6f10: 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 lot. * S
6f20: 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d lot to send comm
6f30: 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45 ands to. *. * RE
6f40: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 TURN VALUE. *
6f50: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f CACKEY_PCSC_S_
6f60: 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 OK On su
6f70: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 ccess. * CAC
6f80: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 KEY_PCSC_E_GENER
6f90: 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 IC On error.
6fa0: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 *. * NOTES. *
6fb0: 20 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f The transactio
6fc0: 6e 20 73 68 6f 75 6c 64 20 62 65 20 74 65 72 6d n should be term
6fd0: 69 6e 61 74 65 64 20 75 73 69 6e 67 20 22 63 61 inated using "ca
6fe0: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 ckey_end_transac
6ff0: 74 69 6f 6e 22 0a 20 2a 0a 20 2a 2f 0a 73 74 61 tion". *. */.sta
7000: 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 tic cackey_ret c
7010: 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e ackey_begin_tran
7020: 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20 63 saction(struct c
7030: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 ackey_slot *slot
7040: 29 20 7b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 ) {..cackey_ret
7050: 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74 3b cackey_conn_ret;
7060: 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 74 72 61 ..LONG scard_tra
7070: 6e 73 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 ns_ret;...CACKEY
7080: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 _DEBUG_PRINTF("C
7090: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 63 61 63 6b alled.");...cack
70a0: 65 79 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 61 ey_conn_ret = ca
70b0: 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 ckey_connect_car
70c0: 64 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28 63 61 d(slot);..if (ca
70d0: 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74 20 21 3d ckey_conn_ret !=
70e0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f CACKEY_PCSC_S_O
70f0: 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 K) {...CACKEY_DE
7100: 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 BUG_PRINTF("Unab
7110: 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f le to connect to
7120: 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 card, returning
7130: 20 69 6e 20 65 72 72 6f 72 22 29 3b 0a 0a 09 09 in error");....
7140: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 return(CACKEY_PC
7150: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 SC_E_GENERIC);..
7160: 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 }...slot->transa
7170: 63 74 69 6f 6e 5f 64 65 70 74 68 2b 2b 3b 0a 0a ction_depth++;..
7180: 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 .if (slot->trans
7190: 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 31 action_depth > 1
71a0: 20 26 26 20 21 73 6c 6f 74 2d 3e 74 72 61 6e 73 && !slot->trans
71b0: 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c action_need_hw_l
71c0: 6f 63 6b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f ock) {...CACKEY_
71d0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 6c DEBUG_PRINTF("Al
71e0: 72 65 61 64 79 20 69 6e 20 61 20 74 72 61 6e 73 ready in a trans
71f0: 61 63 74 69 6f 6e 2c 20 70 65 72 66 6f 72 6d 69 action, performi
7200: 6e 67 20 6e 6f 20 61 63 74 69 6f 6e 20 28 6e 65 ng no action (ne
7210: 77 20 64 65 70 74 68 20 3d 20 25 69 29 22 2c 20 w depth = %i)",
7220: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f slot->transactio
7230: 6e 5f 64 65 70 74 68 29 3b 0a 0a 09 09 72 65 74 n_depth);....ret
7240: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f urn(CACKEY_PCSC_
7250: 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 S_OK);..}...slot
7260: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 ->transaction_ne
7270: 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a ed_hw_lock = 0;.
7280: 0a 09 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 ..scard_trans_re
7290: 74 20 3d 20 53 43 61 72 64 42 65 67 69 6e 54 72 t = SCardBeginTr
72a0: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 2d 3e ansaction(slot->
72b0: 70 63 73 63 5f 63 61 72 64 29 3b 0a 09 69 66 20 pcsc_card);..if
72c0: 28 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 (scard_trans_ret
72d0: 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 != SCARD_S_SUCC
72e0: 45 53 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f ESS) {...CACKEY_
72f0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e DEBUG_PRINTF("Un
7300: 61 62 6c 65 20 74 6f 20 62 65 67 69 6e 20 74 72 able to begin tr
7310: 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 75 72 ansaction, retur
7320: 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29 3b ning in error");
7330: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 ....return(CACKE
7340: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 Y_PCSC_E_GENERIC
7350: 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 );..}...CACKEY_D
7360: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63 EBUG_PRINTF("Suc
7370: 65 73 73 66 75 6c 6c 79 20 62 65 67 61 6e 20 74 essfully began t
7380: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 73 6c ransaction on sl
7390: 6f 74 20 28 25 73 29 22 2c 20 73 6c 6f 74 2d 3e ot (%s)", slot->
73a0: 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09 pcsc_reader);...
73b0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 return(CACKEY_PC
73c0: 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a SC_S_OK);.}../*.
73d0: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 * SYNPOSIS. *
73e0: 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 cackey_ret ca
73f0: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 ckey_end_transac
7400: 74 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b tion(struct cack
7410: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a ey_slot *slot);.
7420: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a *. * ARGUMENTS.
7430: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c * cackey_sl
7440: 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 ot *slot. *
7450: 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 Slot to send
7460: 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a commands to. *.
7470: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a * RETURN VALUE.
7480: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 * CACKEY_PC
7490: 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 SC_S_OK
74a0: 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 On success. *
74b0: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f CACKEY_PCSC_E_
74c0: 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 GENERIC On er
74d0: 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a ror. *. * NOTES.
74e0: 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 * This func
74f0: 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 22 63 tion requires "c
7500: 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e ackey_begin_tran
7510: 73 61 63 74 69 6f 6e 22 20 74 6f 20 62 65 20 63 saction" to be c
7520: 61 6c 6c 65 64 20 66 69 72 73 74 0a 20 2a 0a 20 alled first. *.
7530: 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 */.static cackey
7540: 5f 72 65 74 20 63 61 63 6b 65 79 5f 65 6e 64 5f _ret cackey_end_
7550: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75 transaction(stru
7560: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a ct cackey_slot *
7570: 73 6c 6f 74 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 slot) {..LONG sc
7580: 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 3b 0a 0a ard_trans_ret;..
7590: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
75a0: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
75b0: 0a 0a 09 69 66 20 28 21 73 6c 6f 74 2d 3e 70 63 ...if (!slot->pc
75c0: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 sc_card_connecte
75d0: 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 d) {...CACKEY_DE
75e0: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 72 64 BUG_PRINTF("Card
75f0: 20 69 73 20 6e 6f 74 20 63 6f 6e 6e 65 63 74 65 is not connecte
7600: 64 2c 20 75 6e 61 62 6c 65 20 74 6f 20 65 6e 64 d, unable to end
7610: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 transaction on
7620: 63 61 72 64 22 29 3b 0a 0a 09 09 69 66 20 28 73 card");....if (s
7630: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e lot->transaction
7640: 5f 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 _depth > 0) {...
7650: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
7660: 49 4e 54 46 28 22 44 65 63 72 65 61 73 69 6e 67 INTF("Decreasing
7670: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 65 70 transaction dep
7680: 74 68 20 61 6e 64 20 61 73 6b 69 6e 67 20 66 6f th and asking fo
7690: 72 20 61 20 68 61 72 64 77 61 72 65 20 6c 6f 63 r a hardware loc
76a0: 6b 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 62 65 k on the next be
76b0: 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 gin transaction
76c0: 28 63 75 72 72 65 6e 74 20 64 65 70 74 68 20 3d (current depth =
76d0: 20 25 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72 61 %i)", slot->tra
76e0: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 29 3b nsaction_depth);
76f0: 0a 0a 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 .....slot->trans
7700: 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a action_depth--;.
7710: 0a 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 ....if (slot->tr
7720: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 ansaction_depth
7730: 3e 20 30 29 20 7b 0a 09 09 09 09 73 6c 6f 74 2d > 0) {.....slot-
7740: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 >transaction_nee
7750: 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 31 3b 0a 09 d_hw_lock = 1;..
7760: 09 09 7d 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 ..}...}....retur
7770: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f n(CACKEY_PCSC_E_
7780: 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 69 GENERIC);..}...i
7790: 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 f (slot->transac
77a0: 74 69 6f 6e 5f 64 65 70 74 68 20 3d 3d 20 30 29 tion_depth == 0)
77b0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
77c0: 47 5f 50 52 49 4e 54 46 28 22 54 65 72 6d 69 6e G_PRINTF("Termin
77d0: 61 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 ating a transact
77e0: 69 6f 6e 20 74 68 61 74 20 68 61 73 20 6e 6f 74 ion that has not
77f0: 20 62 65 67 75 6e 21 22 29 3b 0a 0a 09 09 72 65 begun!");....re
7800: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 turn(CACKEY_PCSC
7810: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a _E_GENERIC);..}.
7820: 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 ..slot->transact
7830: 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 0a 09 69 ion_depth--;...i
7840: 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 f (slot->transac
7850: 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29 20 tion_depth > 0)
7860: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
7870: 5f 50 52 49 4e 54 46 28 22 54 72 61 6e 73 61 63 _PRINTF("Transac
7880: 74 69 6f 6e 73 20 73 74 69 6c 6c 20 69 6e 20 70 tions still in p
7890: 72 6f 67 72 65 73 73 2c 20 6e 6f 74 20 74 65 72 rogress, not ter
78a0: 6d 69 6e 61 74 69 6e 67 20 6f 6e 2d 63 61 72 64 minating on-card
78b0: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 28 63 75 Transaction (cu
78c0: 72 72 65 6e 74 20 64 65 70 74 68 20 3d 20 25 69 rrent depth = %i
78d0: 29 22 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 )", slot->transa
78e0: 63 74 69 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a 09 ction_depth);...
78f0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 .return(CACKEY_P
7900: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 CSC_S_OK);..}...
7910: 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 20 scard_trans_ret
7920: 3d 20 53 43 61 72 64 45 6e 64 54 72 61 6e 73 61 = SCardEndTransa
7930: 63 74 69 6f 6e 28 73 6c 6f 74 2d 3e 70 63 73 63 ction(slot->pcsc
7940: 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 _card, SCARD_LEA
7950: 56 45 5f 43 41 52 44 29 3b 0a 09 69 66 20 28 73 VE_CARD);..if (s
7960: 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 20 21 card_trans_ret !
7970: 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 = SCARD_S_SUCCES
7980: 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 S) {...CACKEY_DE
7990: 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 BUG_PRINTF("Unab
79a0: 6c 65 20 74 6f 20 65 6e 64 20 74 72 61 6e 73 61 le to end transa
79b0: 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e 69 6e 67 ction, returning
79c0: 20 69 6e 20 65 72 72 6f 72 22 29 3b 0a 0a 09 09 in error");....
79d0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 return(CACKEY_PC
79e0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 SC_E_GENERIC);..
79f0: 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 }...CACKEY_DEBUG
7a00: 5f 50 52 49 4e 54 46 28 22 53 75 63 65 73 73 66 _PRINTF("Sucessf
7a10: 75 6c 6c 79 20 74 65 72 6d 69 6e 61 74 65 64 20 ully terminated
7a20: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 73 transaction on s
7a30: 6c 6f 74 20 28 25 73 29 22 2c 20 73 6c 6f 74 2d lot (%s)", slot-
7a40: 3e 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 0a >pcsc_reader);..
7a50: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 .return(CACKEY_P
7a60: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a CSC_S_OK);.}../*
7a70: 20 41 50 44 55 20 52 65 6c 61 74 65 64 20 46 75 APDU Related Fu
7a80: 6e 63 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a nctions */./*. *
7a90: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 SYNPOSIS. *
7aa0: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b cackey_ret cack
7ab0: 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 74 72 ey_send_apdu(str
7ac0: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 uct cackey_slot
7ad0: 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 *slot, unsigned
7ae0: 63 68 61 72 20 63 6c 61 73 73 2c 20 75 6e 73 69 char class, unsi
7af0: 67 6e 65 64 20 63 68 61 72 20 69 6e 73 74 72 75 gned char instru
7b00: 63 74 69 6f 6e 2c 20 75 6e 73 69 67 6e 65 64 20 ction, unsigned
7b10: 63 68 61 72 20 70 31 2c 20 75 6e 73 69 67 6e 65 char p1, unsigne
7b20: 64 20 63 68 61 72 20 70 32 2c 20 75 6e 73 69 67 d char p2, unsig
7b30: 6e 65 64 20 63 68 61 72 20 6c 63 2c 20 75 6e 73 ned char lc, uns
7b40: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 igned char *data
7b50: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 , unsigned char
7b60: 6c 65 2c 20 75 69 6e 74 31 36 5f 74 20 2a 72 65 le, uint16_t *re
7b70: 73 70 63 6f 64 65 2c 20 75 6e 73 69 67 6e 65 64 spcode, unsigned
7b80: 20 63 68 61 72 20 2a 72 65 73 70 64 61 74 61 2c char *respdata,
7b90: 20 73 69 7a 65 5f 74 20 2a 72 65 73 70 64 61 74 size_t *respdat
7ba0: 61 5f 6c 65 6e 29 3b 0a 20 2a 0a 20 2a 20 41 52 a_len);. *. * AR
7bb0: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63 GUMENTS. * c
7bc0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 ackey_slot *slot
7bd0: 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 . * Slot
7be0: 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 to send command
7bf0: 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 s to. *. * u
7c00: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6c 61 nsigned char cla
7c10: 73 73 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 ss. * AP
7c20: 44 55 20 43 6c 61 73 73 20 28 47 53 43 49 53 5f DU Class (GSCIS_
7c30: 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 20 6f 72 CLASS_ISO7816 or
7c40: 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f GSCIS_CLASS_GLO
7c50: 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 0a 20 2a 20 BAL_PLATFORM. *
7c60: 20 20 20 20 20 20 20 20 75 73 75 61 6c 6c 79 29 usually)
7c70: 2c 20 28 43 4c 41 29 0a 20 2a 0a 20 2a 20 20 20 , (CLA). *. *
7c80: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 unsigned char
7c90: 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 2a 20 20 instruction. *
7ca0: 20 20 20 20 20 20 20 41 50 44 55 20 49 6e 73 74 APDU Inst
7cb0: 72 75 63 74 69 6f 6e 20 28 49 4e 53 29 0a 20 2a ruction (INS). *
7cc0: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 . * unsigned
7cd0: 20 63 68 61 72 20 70 31 0a 20 2a 20 20 20 20 20 char p1. *
7ce0: 20 20 20 20 41 50 44 55 20 50 61 72 61 6d 65 74 APDU Paramet
7cf0: 65 72 20 31 20 28 50 31 29 0a 20 2a 0a 20 2a 20 er 1 (P1). *. *
7d00: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 unsigned cha
7d10: 72 20 70 32 0a 20 2a 20 20 20 20 20 20 20 20 20 r p2. *
7d20: 41 50 44 55 20 50 61 72 61 6d 65 74 65 72 20 32 APDU Parameter 2
7d30: 20 28 50 32 29 0a 20 2a 0a 20 2a 20 20 20 20 20 (P2). *. *
7d40: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c 63 unsigned char lc
7d50: 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 . * APDU
7d60: 20 4c 65 6e 67 74 68 20 6f 66 20 43 6f 6e 74 65 Length of Conte
7d70: 6e 74 20 28 4c 63 29 20 2d 2d 20 74 68 69 73 20 nt (Lc) -- this
7d80: 69 73 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 is the length of
7d90: 20 22 64 61 74 61 22 0a 20 2a 20 20 20 20 20 20 "data". *
7da0: 20 20 20 70 61 72 61 6d 65 74 65 72 2e 20 20 49 parameter. I
7db0: 66 20 22 64 61 74 61 22 20 69 73 20 73 70 65 63 f "data" is spec
7dc0: 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74 ified as NULL, t
7dd0: 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 77 69 his parameter wi
7de0: 6c 6c 0a 20 2a 20 20 20 20 20 20 20 20 20 62 65 ll. * be
7df0: 20 69 67 6e 6f 72 65 64 2e 0a 20 2a 0a 20 2a 20 ignored.. *. *
7e00: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 unsigned cha
7e10: 72 20 2a 64 61 74 61 0a 20 2a 20 20 20 20 20 20 r *data. *
7e20: 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 Pointer to bu
7e30: 66 66 65 72 20 74 6f 20 73 65 6e 64 2e 20 20 49 ffer to send. I
7e40: 74 20 73 68 6f 75 6c 64 20 62 65 20 22 4c 63 22 t should be "Lc"
7e50: 20 62 79 74 65 73 20 6c 6f 6e 67 2e 20 20 49 66 bytes long. If
7e60: 0a 20 2a 20 20 20 20 20 20 20 20 20 73 70 65 63 . * spec
7e70: 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 22 ified as NULL, "
7e80: 4c 63 22 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 Lc" will not be
7e90: 73 65 6e 74 2c 20 61 6e 64 20 74 68 69 73 20 62 sent, and this b
7ea0: 75 66 66 65 72 20 77 69 6c 6c 20 62 65 0a 20 2a uffer will be. *
7eb0: 20 20 20 20 20 20 20 20 20 69 67 6e 6f 72 65 64 ignored
7ec0: 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 .. *. * unsi
7ed0: 67 6e 65 64 20 63 68 61 72 20 6c 65 0a 20 2a 20 gned char le. *
7ee0: 20 20 20 20 20 20 20 20 41 50 44 55 20 4c 65 6e APDU Len
7ef0: 67 74 68 20 6f 66 20 45 78 70 65 63 74 61 74 69 gth of Expectati
7f00: 6f 6e 20 28 4c 65 29 20 2d 2d 20 74 68 69 73 20 on (Le) -- this
7f10: 69 73 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 is the length of
7f20: 20 74 68 65 0a 20 2a 20 20 20 20 20 20 20 20 20 the. *
7f30: 65 78 70 65 63 74 65 64 20 72 65 70 6c 79 2e 20 expected reply.
7f40: 20 49 66 20 74 68 69 73 20 69 73 20 73 70 65 63 If this is spec
7f50: 69 66 69 65 64 20 61 73 20 30 20 74 68 65 6e 20 ified as 0 then
7f60: 69 74 20 77 69 6c 6c 20 6e 6f 74 0a 20 2a 20 20 it will not. *
7f70: 20 20 20 20 20 20 20 62 65 20 73 65 6e 74 2e 0a be sent..
7f80: 20 2a 0a 20 2a 20 20 20 20 20 75 69 6e 74 31 36 *. * uint16
7f90: 5f 74 20 2a 72 65 73 70 63 6f 64 65 0a 20 2a 20 _t *respcode. *
7fa0: 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 50 6f [OUT] Po
7fb0: 69 6e 74 65 72 20 74 6f 20 73 74 6f 72 61 67 65 inter to storage
7fc0: 20 6f 66 20 41 50 44 55 20 72 65 73 70 6f 6e 73 of APDU respons
7fd0: 65 20 63 6f 64 65 2e 20 20 49 66 20 74 68 69 73 e code. If this
7fe0: 20 69 73 0a 20 2a 20 20 20 20 20 20 20 20 20 73 is. * s
7ff0: 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c pecified as NULL
8000: 2c 20 74 68 65 20 72 65 73 70 6f 6e 73 65 20 63 , the response c
8010: 6f 64 65 20 77 69 6c 6c 20 62 65 20 64 69 73 63 ode will be disc
8020: 61 72 64 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 arded.. *. *
8030: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
8040: 72 65 73 70 64 61 74 61 0a 20 2a 20 20 20 20 20 respdata. *
8050: 20 20 20 20 5b 4f 55 54 5d 20 50 6f 69 6e 74 65 [OUT] Pointe
8060: 72 20 74 6f 20 73 74 6f 72 61 67 65 20 6f 66 20 r to storage of
8070: 41 50 44 55 20 72 65 73 70 6f 6e 73 65 20 64 61 APDU response da
8080: 74 61 2e 20 20 49 66 20 74 68 69 73 20 69 73 0a ta. If this is.
8090: 20 2a 20 20 20 20 20 20 20 20 20 73 70 65 63 69 * speci
80a0: 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68 fied as NULL, th
80b0: 65 20 72 65 73 70 6f 6e 73 65 20 64 61 74 61 20 e response data
80c0: 77 69 6c 6c 20 62 65 20 64 69 73 63 61 72 64 65 will be discarde
80d0: 64 2e 20 20 49 66 0a 20 2a 20 20 20 20 20 20 20 d. If. *
80e0: 20 20 74 68 65 20 22 72 65 73 70 64 61 74 61 5f the "respdata_
80f0: 6c 65 6e 22 20 70 61 72 61 6d 65 74 65 72 20 69 len" parameter i
8100: 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e s specified as N
8110: 55 4c 4c 2c 20 74 68 69 73 20 62 75 66 66 65 72 ULL, this buffer
8120: 0a 20 2a 20 20 20 20 20 20 20 20 20 77 69 6c 6c . * will
8130: 20 6e 6f 74 20 62 65 20 75 70 64 61 74 65 64 2e not be updated.
8140: 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f . *. * size_
8150: 74 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 0a t *respdata_len.
8160: 20 2a 20 20 20 20 20 20 20 20 20 5b 49 4e 2c 20 * [IN,
8170: 4f 55 54 5d 20 50 6f 69 6e 74 65 72 20 69 6e 69 OUT] Pointer ini
8180: 74 69 61 6c 69 6e 67 20 63 6f 6e 74 61 69 6e 69 tialing containi
8190: 6e 67 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 ng the size of t
81a0: 68 65 20 22 72 65 73 70 64 61 74 61 22 0a 20 2a he "respdata". *
81b0: 20 20 20 20 20 20 20 20 20 62 75 66 66 65 72 2e buffer.
81c0: 20 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 Before returni
81d0: 6e 67 2c 20 74 68 65 20 70 6f 69 6e 74 65 64 20 ng, the pointed
81e0: 74 6f 20 76 61 6c 75 65 20 69 73 20 75 70 64 61 to value is upda
81f0: 74 65 64 20 74 6f 20 74 68 65 0a 20 2a 20 20 20 ted to the. *
8200: 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 number of
8210: 62 79 74 65 73 20 77 72 69 74 74 65 6e 20 74 6f bytes written to
8220: 20 74 68 65 20 62 75 66 66 65 72 2e 20 20 49 66 the buffer. If
8230: 20 74 68 69 73 20 69 73 20 73 70 65 63 69 66 69 this is specifi
8240: 65 64 20 61 73 0a 20 2a 20 20 20 20 20 20 20 20 ed as. *
8250: 20 4e 55 4c 4c 2c 20 69 74 20 77 69 6c 6c 20 6e NULL, it will n
8260: 6f 74 20 62 65 20 75 70 64 61 74 65 64 2c 20 61 ot be updated, a
8270: 6e 64 20 22 72 65 73 70 64 61 74 61 22 20 77 69 nd "respdata" wi
8280: 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 20 63 61 ll be ignored ca
8290: 75 73 69 6e 67 0a 20 2a 20 20 20 20 20 20 20 20 using. *
82a0: 20 74 68 65 20 72 65 73 70 6f 6e 73 65 20 64 61 the response da
82b0: 74 61 20 74 6f 20 62 65 20 64 69 73 63 61 72 64 ta to be discard
82c0: 65 64 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e ed.. *. * RETURN
82d0: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 VALUE. * CA
82e0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 CKEY_PCSC_S_OK
82f0: 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 On succ
8300: 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 ess. * CACKE
8310: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 Y_PCSC_E_GENERIC
8320: 20 20 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 On error.
8330: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 * CACKEY_PCS
8340: 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 20 C_E_TOKENABSENT
8350: 20 49 66 20 74 68 65 20 73 65 6e 64 69 6e 67 20 If the sending
8360: 66 61 69 6c 65 64 20 62 65 63 61 75 73 65 20 74 failed because t
8370: 68 65 20 74 6f 6b 65 6e 20 69 73 0a 20 2a 20 20 he token is. *
8380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 62 ab
83a0: 73 65 6e 74 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 sent. *. * NOTES
83b0: 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e . * This fun
83c0: 63 74 69 6f 6e 20 77 69 6c 6c 20 63 6f 6e 6e 65 ction will conne
83d0: 63 74 20 74 6f 20 74 68 65 20 50 43 2f 53 43 20 ct to the PC/SC
83e0: 43 6f 6e 6e 65 63 74 69 6f 6e 20 4d 61 6e 61 67 Connection Manag
83f0: 65 72 20 76 69 61 0a 20 2a 20 20 20 20 20 63 61 er via. * ca
8400: 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 ckey_pcsc_connec
8410: 74 28 29 20 69 66 20 6e 65 65 64 65 64 2e 0a 20 t() if needed..
8420: 2a 0a 20 2a 20 20 20 20 20 49 74 20 77 69 6c 6c *. * It will
8430: 20 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20 connect to the
8440: 63 61 72 64 20 69 6e 20 74 68 65 20 72 65 61 64 card in the read
8450: 65 72 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 er attached to t
8460: 68 65 20 73 6c 6f 74 0a 20 2a 20 20 20 20 20 73 he slot. * s
8470: 70 65 63 69 66 69 65 64 2e 20 20 49 74 20 77 69 pecified. It wi
8480: 6c 6c 20 72 65 63 6f 6e 6e 65 63 74 20 74 6f 20 ll reconnect to
8490: 74 68 65 20 63 61 72 64 20 69 66 20 74 68 65 20 the card if the
84a0: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 20 20 20 connection. *
84b0: 20 20 67 6f 65 73 20 61 77 61 79 2e 0a 20 2a 0a goes away.. *.
84c0: 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 */.static cacke
84d0: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6e y_ret cackey_sen
84e0: 64 5f 61 70 64 75 28 73 74 72 75 63 74 20 63 61 d_apdu(struct ca
84f0: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c ckey_slot *slot,
8500: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 unsigned char c
8510: 6c 61 73 73 2c 20 75 6e 73 69 67 6e 65 64 20 63 lass, unsigned c
8520: 68 61 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c har instruction,
8530: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 unsigned char p
8540: 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 1, unsigned char
8550: 20 70 32 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 p2, unsigned ch
8560: 61 72 20 6c 63 2c 20 75 6e 73 69 67 6e 65 64 20 ar lc, unsigned
8570: 63 68 61 72 20 2a 64 61 74 61 2c 20 75 6e 73 69 char *data, unsi
8580: 67 6e 65 64 20 63 68 61 72 20 6c 65 2c 20 75 69 gned char le, ui
8590: 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f 64 65 nt16_t *respcode
85a0: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 , unsigned char
85b0: 2a 72 65 73 70 64 61 74 61 2c 20 73 69 7a 65 5f *respdata, size_
85c0: 74 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 t *respdata_len)
85d0: 20 7b 0a 09 75 69 6e 74 38 5f 74 20 6d 61 6a 6f {..uint8_t majo
85e0: 72 5f 72 63 2c 20 6d 69 6e 6f 72 5f 72 63 3b 0a r_rc, minor_rc;.
85f0: 09 73 69 7a 65 5f 74 20 62 79 74 65 73 5f 74 6f .size_t bytes_to
8600: 5f 63 6f 70 79 2c 20 74 6d 70 5f 72 65 73 70 64 _copy, tmp_respd
8610: 61 74 61 5f 6c 65 6e 3b 0a 09 4c 50 43 53 43 41 ata_len;..LPCSCA
8620: 52 44 5f 49 4f 5f 52 45 51 55 45 53 54 20 70 69 RD_IO_REQUEST pi
8630: 6f 53 65 6e 64 50 63 69 3b 0a 09 44 57 4f 52 44 oSendPci;..DWORD
8640: 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 44 57 4f 52 protocol;..DWOR
8650: 44 20 78 6d 69 74 5f 6c 65 6e 2c 20 72 65 63 76 D xmit_len, recv
8660: 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 _len;..LONG scar
8670: 64 5f 78 6d 69 74 5f 72 65 74 2c 20 73 63 61 72 d_xmit_ret, scar
8680: 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b 0a 09 42 d_reconn_ret;..B
8690: 59 54 45 20 78 6d 69 74 5f 62 75 66 5b 31 30 32 YTE xmit_buf[102
86a0: 34 5d 2c 20 72 65 63 76 5f 62 75 66 5b 31 30 32 4], recv_buf[102
86b0: 34 5d 3b 0a 09 69 6e 74 20 70 63 73 63 5f 63 6f 4];..int pcsc_co
86c0: 6e 6e 65 63 74 5f 72 65 74 2c 20 70 63 73 63 5f nnect_ret, pcsc_
86d0: 67 65 74 72 65 73 70 5f 72 65 74 3b 0a 09 69 6e getresp_ret;..in
86e0: 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f t idx;...CACKEY_
86f0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
8700: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 lled.");...if (!
8710: 73 6c 6f 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 slot) {...CACKEY
8720: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 _DEBUG_PRINTF("I
8730: 6e 76 61 6c 69 64 20 73 6c 6f 74 20 73 70 65 63 nvalid slot spec
8740: 69 66 69 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 ified.");....ret
8750: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f urn(CACKEY_PCSC_
8760: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a E_GENERIC);..}..
8770: 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 .pcsc_connect_re
8780: 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 t = cackey_conne
8790: 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 ct_card(slot);..
87a0: 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 if (pcsc_connect
87b0: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 _ret != CACKEY_P
87c0: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 CSC_S_OK) {...CA
87d0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
87e0: 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e F("Unable to con
87f0: 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65 nect to card, re
8800: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 turning in failu
8810: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 re");....return(
8820: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 CACKEY_PCSC_E_GE
8830: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 NERIC);..}.../*
8840: 44 65 74 65 72 6d 69 6e 65 20 77 68 69 63 68 20 Determine which
8850: 70 72 6f 74 6f 63 6f 6c 20 74 6f 20 73 65 6e 64 protocol to send
8860: 20 75 73 69 6e 67 20 2a 2f 0a 09 73 77 69 74 63 using */..switc
8870: 68 20 28 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f h (slot->protoco
8880: 6c 29 20 7b 0a 09 09 63 61 73 65 20 53 43 41 52 l) {...case SCAR
8890: 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 3a 0a 09 D_PROTOCOL_T0:..
88a0: 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53 ..pioSendPci = S
88b0: 43 41 52 44 5f 50 43 49 5f 54 30 3b 0a 0a 09 09 CARD_PCI_T0;....
88c0: 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 53 .break;...case S
88d0: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 CARD_PROTOCOL_T1
88e0: 3a 0a 09 09 09 70 69 6f 53 65 6e 64 50 63 69 20 :....pioSendPci
88f0: 3d 20 53 43 41 52 44 5f 50 43 49 5f 54 31 3b 0a = SCARD_PCI_T1;.
8900: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 64 65 66 ....break;...def
8910: 61 75 6c 74 3a 0a 09 09 09 43 41 43 4b 45 59 5f ault:....CACKEY_
8920: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e DEBUG_PRINTF("In
8930: 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 66 valid protocol f
8940: 6f 75 6e 64 2c 20 61 62 6f 72 74 69 6e 67 2e 22 ound, aborting."
8950: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 );.....return(CA
8960: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 CKEY_PCSC_E_GENE
8970: 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 72 RIC);..}.../* Tr
8980: 61 6e 73 6d 69 74 20 2a 2f 0a 09 78 6d 69 74 5f ansmit */..xmit_
8990: 6c 65 6e 20 3d 20 30 3b 0a 09 78 6d 69 74 5f 62 len = 0;..xmit_b
89a0: 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d uf[xmit_len++] =
89b0: 20 63 6c 61 73 73 3b 0a 09 78 6d 69 74 5f 62 75 class;..xmit_bu
89c0: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 f[xmit_len++] =
89d0: 69 6e 73 74 72 75 63 74 69 6f 6e 3b 0a 09 78 6d instruction;..xm
89e0: 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b it_buf[xmit_len+
89f0: 2b 5d 20 3d 20 70 31 3b 0a 09 78 6d 69 74 5f 62 +] = p1;..xmit_b
8a00: 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d uf[xmit_len++] =
8a10: 20 70 32 3b 0a 09 69 66 20 28 64 61 74 61 29 20 p2;..if (data)
8a20: 7b 0a 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 {...xmit_buf[xmi
8a30: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 63 3b 0a 09 t_len++] = lc;..
8a40: 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 .for (idx = 0; i
8a50: 64 78 20 3c 20 6c 63 3b 20 69 64 78 2b 2b 29 20 dx < lc; idx++)
8a60: 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d {....xmit_buf[xm
8a70: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 64 61 74 61 it_len++] = data
8a80: 5b 69 64 78 5d 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 [idx];...}..}...
8a90: 69 66 20 28 6c 65 20 21 3d 20 30 78 30 30 29 20 if (le != 0x00)
8aa0: 7b 0a 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 {...xmit_buf[xmi
8ab0: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 65 3b 0a 09 t_len++] = le;..
8ac0: 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 53 6d 61 }.../* Begin Sma
8ad0: 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 rtcard Transacti
8ae0: 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 62 65 on */..cackey_be
8af0: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 gin_transaction(
8b00: 73 6c 6f 74 29 3b 0a 0a 09 69 66 20 28 63 6c 61 slot);...if (cla
8b10: 73 73 20 3d 3d 20 47 53 43 49 53 5f 43 4c 41 53 ss == GSCIS_CLAS
8b20: 53 5f 49 53 4f 37 38 31 36 20 26 26 20 69 6e 73 S_ISO7816 && ins
8b30: 74 72 75 63 74 69 6f 6e 20 3d 3d 20 47 53 43 49 truction == GSCI
8b40: 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 20 26 S_INSTR_VERIFY &
8b50: 26 20 70 31 20 3d 3d 20 30 78 30 30 20 26 26 20 & p1 == 0x00 &&
8b60: 70 32 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 p2 == 0x00) {...
8b70: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
8b80: 4e 54 46 28 22 53 65 6e 64 69 6e 67 20 41 50 44 NTF("Sending APD
8b90: 55 3a 20 3c 3c 63 65 6e 73 6f 72 65 64 3e 3e 22 U: <<censored>>"
8ba0: 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43 );..} else {...C
8bb0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
8bc0: 54 42 55 46 28 22 53 65 6e 64 69 6e 67 20 41 50 TBUF("Sending AP
8bd0: 44 55 3a 22 2c 20 78 6d 69 74 5f 62 75 66 2c 20 DU:", xmit_buf,
8be0: 78 6d 69 74 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 xmit_len);..}...
8bf0: 72 65 63 76 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f recv_len = sizeo
8c00: 66 28 72 65 63 76 5f 62 75 66 29 3b 0a 09 73 63 f(recv_buf);..sc
8c10: 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 20 53 ard_xmit_ret = S
8c20: 43 61 72 64 54 72 61 6e 73 6d 69 74 28 73 6c 6f CardTransmit(slo
8c30: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 70 69 t->pcsc_card, pi
8c40: 6f 53 65 6e 64 50 63 69 2c 20 78 6d 69 74 5f 62 oSendPci, xmit_b
8c50: 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20 4e 55 uf, xmit_len, NU
8c60: 4c 4c 2c 20 72 65 63 76 5f 62 75 66 2c 20 26 72 LL, recv_buf, &r
8c70: 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 ecv_len);...if (
8c80: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d scard_xmit_ret =
8c90: 3d 20 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 = SCARD_E_NOT_TR
8ca0: 41 4e 53 41 43 54 45 44 29 20 7b 0a 09 09 43 41 ANSACTED) {...CA
8cb0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
8cc0: 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6e F("Failed to sen
8cd0: 64 20 41 50 44 55 20 74 6f 20 63 61 72 64 20 28 d APDU to card (
8ce0: 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28 29 20 SCardTransmit()
8cf0: 3d 20 25 73 2f 25 6c 78 29 2c 20 77 69 6c 6c 20 = %s/%lx), will
8d00: 61 73 6b 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 ask calling func
8d10: 74 69 6f 6e 20 74 6f 20 72 65 74 72 79 20 28 6e tion to retry (n
8d20: 6f 74 20 72 65 73 65 74 74 69 6e 67 20 63 61 72 ot resetting car
8d30: 64 29 2e 2e 2e 22 2c 20 43 41 43 4b 45 59 5f 44 d)...", CACKEY_D
8d40: 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 EBUG_FUNC_SCARDE
8d50: 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f RR_TO_STR(scard_
8d60: 78 6d 69 74 5f 72 65 74 29 2c 20 28 75 6e 73 69 xmit_ret), (unsi
8d70: 67 6e 65 64 20 6c 6f 6e 67 29 20 73 63 61 72 64 gned long) scard
8d80: 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a 09 09 2f _xmit_ret);..../
8d90: 2a 20 42 65 67 69 6e 20 53 6d 61 72 74 63 61 72 * Begin Smartcar
8da0: 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f d Transaction */
8db0: 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 ...cackey_end_tr
8dc0: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b ansaction(slot);
8dd0: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 ....return(CACKE
8de0: 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29 3b Y_PCSC_E_RETRY);
8df0: 0a 09 7d 0a 0a 09 69 66 20 28 73 63 61 72 64 5f ..}...if (scard_
8e00: 78 6d 69 74 5f 72 65 74 20 21 3d 20 53 43 41 52 xmit_ret != SCAR
8e10: 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 D_S_SUCCESS) {..
8e20: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
8e30: 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 INTF("Failed to
8e40: 73 65 6e 64 20 41 50 44 55 20 74 6f 20 63 61 72 send APDU to car
8e50: 64 20 28 53 43 61 72 64 54 72 61 6e 73 6d 69 74 d (SCardTransmit
8e60: 28 29 20 3d 20 25 73 2f 25 6c 78 29 22 2c 20 43 () = %s/%lx)", C
8e70: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 ACKEY_DEBUG_FUNC
8e80: 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 _SCARDERR_TO_STR
8e90: 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 (scard_xmit_ret)
8ea0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
8eb0: 29 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 ) scard_xmit_ret
8ec0: 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 );....CACKEY_DEB
8ed0: 55 47 5f 50 52 49 4e 54 46 28 22 4d 61 72 6b 69 UG_PRINTF("Marki
8ee0: 6e 67 20 73 6c 6f 74 20 61 73 20 68 61 76 69 6e ng slot as havin
8ef0: 67 20 62 65 65 6e 20 72 65 73 65 74 22 29 3b 0a g been reset");.
8f00: 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c ..cackey_mark_sl
8f10: 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a ot_reset(slot);.
8f20: 0a 09 09 69 66 20 28 73 63 61 72 64 5f 78 6d 69 ...if (scard_xmi
8f30: 74 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 57 t_ret == SCARD_W
8f40: 5f 52 45 53 45 54 5f 43 41 52 44 29 20 7b 0a 09 _RESET_CARD) {..
8f50: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
8f60: 52 49 4e 54 46 28 22 52 65 73 65 74 20 72 65 71 RINTF("Reset req
8f70: 75 69 72 65 64 2c 20 70 6c 65 61 73 65 20 68 6f uired, please ho
8f80: 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73 63 61 ld...");.....sca
8f90: 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 20 rd_reconn_ret =
8fa0: 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74 cackey_reconnect
8fb0: 5f 63 61 72 64 28 73 6c 6f 74 2c 20 53 43 41 52 _card(slot, SCAR
8fc0: 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 D_PROTOCOL_T0 |
8fd0: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 SCARD_PROTOCOL_T
8fe0: 31 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 1, &protocol);..
8ff0: 09 09 09 69 66 20 28 73 63 61 72 64 5f 72 65 63 ...if (scard_rec
9000: 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 onn_ret == SCARD
9010: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 _S_SUCCESS) {...
9020: 09 09 2f 2a 20 55 70 64 61 74 65 20 70 72 6f 74 ../* Update prot
9030: 6f 63 6f 6c 20 2a 2f 0a 09 09 09 09 73 6c 6f 74 ocol */.....slot
9040: 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d 20 70 72 6f ->protocol = pro
9050: 74 6f 63 6f 6c 3b 0a 09 09 09 09 73 77 69 74 63 tocol;.....switc
9060: 68 20 28 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f h (slot->protoco
9070: 6c 29 20 7b 0a 09 09 09 09 09 63 61 73 65 20 53 l) {......case S
9080: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 CARD_PROTOCOL_T0
9090: 3a 0a 09 09 09 09 09 09 70 69 6f 53 65 6e 64 50 :.......pioSendP
90a0: 63 69 20 3d 20 53 43 41 52 44 5f 50 43 49 5f 54 ci = SCARD_PCI_T
90b0: 30 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0;........break;
90c0: 0a 09 09 09 09 09 63 61 73 65 20 53 43 41 52 44 ......case SCARD
90d0: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 3a 0a 09 09 _PROTOCOL_T1:...
90e0: 09 09 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d ....pioSendPci =
90f0: 20 53 43 41 52 44 5f 50 43 49 5f 54 31 3b 0a 0a SCARD_PCI_T1;..
9100: 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 ......break;....
9110: 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 09 09 ..default:......
9120: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
9130: 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 70 72 INTF("Invalid pr
9140: 6f 74 6f 63 6f 6c 20 66 6f 75 6e 64 2c 20 62 75 otocol found, bu
9150: 74 20 74 6f 6f 20 6c 61 74 65 20 74 6f 20 64 6f t too late to do
9160: 20 61 6e 79 74 68 69 6e 67 20 61 62 6f 75 74 20 anything about
9170: 69 74 20 6e 6f 77 20 2d 2d 20 74 72 79 69 6e 67 it now -- trying
9180: 20 61 6e 79 77 61 79 2e 22 29 3b 0a 0a 09 09 09 anyway.");.....
9190: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a ...break;.....}.
91a0: 0a 09 09 09 09 2f 2a 20 52 65 2d 65 73 74 61 62 ...../* Re-estab
91b0: 6c 69 73 68 20 74 72 61 6e 73 61 63 74 69 6f 6e lish transaction
91c0: 2c 20 69 66 20 69 74 20 77 61 73 20 70 72 65 73 , if it was pres
91d0: 65 6e 74 20 2a 2f 0a 09 09 09 09 69 66 20 28 73 ent */.....if (s
91e0: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e lot->transaction
91f0: 5f 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 _depth > 0) {...
9200: 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 ...slot->transac
9210: 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 09 09 tion_depth--;...
9220: 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 ...slot->transac
9230: 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 tion_need_hw_loc
9240: 6b 20 3d 20 31 3b 0a 09 09 09 09 09 63 61 63 6b k = 1;......cack
9250: 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 ey_begin_transac
9260: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09 09 09 tion(slot);.....
9270: 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 }......CACKEY_DE
9280: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65 BUG_PRINTF("Rese
9290: 74 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 t successful, re
92a0: 74 72 61 6e 73 6d 69 74 74 69 6e 67 22 29 3b 0a transmitting");.
92b0: 0a 09 09 09 09 72 65 63 76 5f 6c 65 6e 20 3d 20 .....recv_len =
92c0: 73 69 7a 65 6f 66 28 72 65 63 76 5f 62 75 66 29 sizeof(recv_buf)
92d0: 3b 0a 09 09 09 09 73 63 61 72 64 5f 78 6d 69 74 ;.....scard_xmit
92e0: 5f 72 65 74 20 3d 20 53 43 61 72 64 54 72 61 6e _ret = SCardTran
92f0: 73 6d 69 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f smit(slot->pcsc_
9300: 63 61 72 64 2c 20 70 69 6f 53 65 6e 64 50 63 69 card, pioSendPci
9310: 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69 74 , xmit_buf, xmit
9320: 5f 6c 65 6e 2c 20 4e 55 4c 4c 2c 20 72 65 63 76 _len, NULL, recv
9330: 5f 62 75 66 2c 20 26 72 65 63 76 5f 6c 65 6e 29 _buf, &recv_len)
9340: 3b 0a 0a 09 09 09 09 69 66 20 28 73 63 61 72 64 ;......if (scard
9350: 5f 78 6d 69 74 5f 72 65 74 20 21 3d 20 53 43 41 _xmit_ret != SCA
9360: 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a RD_S_SUCCESS) {.
9370: 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
9380: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 72 61 6e G_PRINTF("Retran
9390: 73 6d 69 74 20 66 61 69 6c 65 64 2c 20 72 65 74 smit failed, ret
93a0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 urning in failur
93b0: 65 20 61 66 74 65 72 20 64 69 73 63 6f 6e 6e 65 e after disconne
93c0: 63 74 69 6e 67 20 74 68 65 20 63 61 72 64 20 28 cting the card (
93d0: 53 43 61 72 64 54 72 61 6e 73 6d 69 74 20 3d 20 SCardTransmit =
93e0: 25 73 2f 25 6c 69 29 22 2c 20 43 41 43 4b 45 59 %s/%li)", CACKEY
93f0: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 _DEBUG_FUNC_SCAR
9400: 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 DERR_TO_STR(scar
9410: 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28 6c 6f d_xmit_ret), (lo
9420: 6e 67 29 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 ng) scard_xmit_r
9430: 65 74 29 3b 0a 0a 09 09 09 09 09 53 43 61 72 64 et);.......SCard
9440: 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d Disconnect(slot-
9450: 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 >pcsc_card, SCAR
9460: 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 D_LEAVE_CARD);..
9470: 09 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 ....slot->pcsc_c
9480: 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 ard_connected =
9490: 30 3b 0a 0a 09 09 09 09 09 2f 2a 20 45 6e 64 20 0;......./* End
94a0: 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 Smartcard Transa
94b0: 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 09 09 73 6c ction */......sl
94c0: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f ot->transaction_
94d0: 64 65 70 74 68 20 3d 20 31 3b 0a 09 09 09 09 09 depth = 1;......
94e0: 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 cackey_end_trans
94f0: 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 action(slot);...
9500: 09 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 ....return(CACKE
9510: 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 Y_PCSC_E_TOKENAB
9520: 53 45 4e 54 29 3b 0a 09 09 09 09 7d 0a 09 09 09 SENT);.....}....
9530: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 } else {.....CAC
9540: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
9550: 28 22 44 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20 ("Disconnecting
9560: 63 61 72 64 22 29 3b 0a 0a 09 09 09 09 53 43 61 card");......SCa
9570: 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f rdDisconnect(slo
9580: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 t->pcsc_card, SC
9590: 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b ARD_LEAVE_CARD);
95a0: 0a 09 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f .....slot->pcsc_
95b0: 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d card_connected =
95c0: 20 30 3b 0a 0a 09 09 09 09 2f 2a 20 45 6e 64 20 0;....../* End
95d0: 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 Smartcard Transa
95e0: 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 09 73 6c 6f ction */.....slo
95f0: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 t->transaction_d
9600: 65 70 74 68 20 3d 20 31 3b 0a 09 09 09 09 63 61 epth = 1;.....ca
9610: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 ckey_end_transac
9620: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 tion(slot);.....
9630: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
9640: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
9650: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 09 09 in failure");...
9660: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f ..return(CACKEY_
9670: 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 PCSC_E_TOKENABSE
9680: 4e 54 29 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c NT);....}...} el
9690: 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 se {....CACKEY_D
96a0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 44 69 73 EBUG_PRINTF("Dis
96b0: 63 6f 6e 6e 65 63 74 69 6e 67 20 63 61 72 64 22 connecting card"
96c0: 29 3b 0a 0a 09 09 09 53 43 61 72 64 44 69 73 63 );.....SCardDisc
96d0: 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 onnect(slot->pcs
96e0: 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 c_card, SCARD_LE
96f0: 41 56 45 5f 43 41 52 44 29 3b 0a 09 09 09 73 6c AVE_CARD);....sl
9700: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f ot->pcsc_card_co
9710: 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 nnected = 0;....
9720: 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 ./* End Smartcar
9730: 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f d Transaction */
9740: 0a 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 ....slot->transa
9750: 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31 3b ction_depth = 1;
9760: 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 ....cackey_end_t
9770: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 ransaction(slot)
9780: 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 ;.....CACKEY_DEB
9790: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
97a0: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 ning in failure"
97b0: 29 3b 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 );....return(CAC
97c0: 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e KEY_PCSC_E_TOKEN
97d0: 41 42 53 45 4e 54 29 3b 0a 09 09 7d 0a 09 7d 0a ABSENT);...}..}.
97e0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
97f0: 52 49 4e 54 42 55 46 28 22 52 65 74 75 72 6e 65 RINTBUF("Returne
9800: 64 20 56 61 6c 75 65 3a 22 2c 20 72 65 63 76 5f d Value:", recv_
9810: 62 75 66 2c 20 72 65 63 76 5f 6c 65 6e 29 3b 0a buf, recv_len);.
9820: 0a 09 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 3c ..if (recv_len <
9830: 20 32 29 20 7b 0a 09 09 2f 2a 20 4d 69 6e 69 6d 2) {.../* Minim
9840: 61 6c 20 72 65 73 70 6f 6e 73 65 20 6c 65 6e 67 al response leng
9850: 74 68 20 69 73 20 32 20 62 79 74 65 73 2c 20 72 th is 2 bytes, r
9860: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c eturning in fail
9870: 75 72 65 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f ure */...CACKEY_
9880: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
9890: 73 70 6f 6e 73 65 20 74 6f 6f 20 73 6d 61 6c 6c sponse too small
98a0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 , returning in f
98b0: 61 69 6c 75 72 65 20 28 72 65 63 76 5f 6c 65 6e ailure (recv_len
98c0: 20 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 = %lu)", (unsig
98d0: 6e 65 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c ned long) recv_l
98e0: 65 6e 29 3b 0a 0a 09 09 2f 2a 20 45 6e 64 20 53 en);..../* End S
98f0: 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 martcard Transac
9900: 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 tion */...cackey
9910: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e _end_transaction
9920: 28 73 6c 6f 74 29 3b 0a 0a 09 09 72 65 74 75 72 (slot);....retur
9930: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f n(CACKEY_PCSC_E_
9940: 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f GENERIC);..}.../
9950: 2a 20 44 65 74 65 72 6d 69 6e 65 20 72 65 73 75 * Determine resu
9960: 6c 74 20 63 6f 64 65 20 2a 2f 0a 09 6d 61 6a 6f lt code */..majo
9970: 72 5f 72 63 20 3d 20 72 65 63 76 5f 62 75 66 5b r_rc = recv_buf[
9980: 72 65 63 76 5f 6c 65 6e 20 2d 20 32 5d 3b 0a 09 recv_len - 2];..
9990: 6d 69 6e 6f 72 5f 72 63 20 3d 20 72 65 63 76 5f minor_rc = recv_
99a0: 62 75 66 5b 72 65 63 76 5f 6c 65 6e 20 2d 20 31 buf[recv_len - 1
99b0: 5d 3b 0a 09 69 66 20 28 72 65 73 70 63 6f 64 65 ];..if (respcode
99c0: 29 20 7b 0a 09 09 2a 72 65 73 70 63 6f 64 65 20 ) {...*respcode
99d0: 3d 20 28 6d 61 6a 6f 72 5f 72 63 20 3c 3c 20 38 = (major_rc << 8
99e0: 29 20 7c 20 6d 69 6e 6f 72 5f 72 63 3b 0a 09 7d ) | minor_rc;..}
99f0: 0a 0a 09 2f 2a 20 41 64 6a 75 73 74 20 6d 65 73 .../* Adjust mes
9a00: 73 61 67 65 20 62 75 66 66 65 72 20 2a 2f 0a 09 sage buffer */..
9a10: 72 65 63 76 5f 6c 65 6e 20 2d 3d 20 32 3b 0a 0a recv_len -= 2;..
9a20: 09 2f 2a 20 41 64 64 20 62 79 74 65 73 20 74 6f ./* Add bytes to
9a30: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f return value */
9a40: 0a 09 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c ..tmp_respdata_l
9a50: 65 6e 20 3d 20 30 3b 0a 09 69 66 20 28 72 65 73 en = 0;..if (res
9a60: 70 64 61 74 61 20 26 26 20 72 65 73 70 64 61 74 pdata && respdat
9a70: 61 5f 6c 65 6e 29 20 7b 0a 09 09 74 6d 70 5f 72 a_len) {...tmp_r
9a80: 65 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20 2a 72 espdata_len = *r
9a90: 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 espdata_len;....
9aa0: 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 bytes_to_copy =
9ab0: 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a *respdata_len;..
9ac0: 09 09 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 3c ..if (recv_len <
9ad0: 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 20 bytes_to_copy)
9ae0: 7b 0a 09 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f {....bytes_to_co
9af0: 70 79 20 3d 20 72 65 63 76 5f 6c 65 6e 3b 0a 09 py = recv_len;..
9b00: 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 .}....CACKEY_DEB
9b10: 55 47 5f 50 52 49 4e 54 46 28 22 43 6f 70 79 69 UG_PRINTF("Copyi
9b20: 6e 67 20 25 6c 75 20 62 79 74 65 73 20 74 6f 20 ng %lu bytes to
9b30: 74 68 65 20 62 75 66 66 65 72 20 28 72 65 63 76 the buffer (recv
9b40: 27 64 20 25 6c 75 20 62 79 74 65 73 2c 20 62 75 'd %lu bytes, bu
9b50: 74 20 6f 6e 6c 79 20 25 6c 75 20 62 79 74 65 73 t only %lu bytes
9b60: 20 6c 65 66 74 20 69 6e 20 6f 75 72 20 62 75 66 left in our buf
9b70: 66 65 72 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 fer)", (unsigned
9b80: 20 6c 6f 6e 67 29 20 62 79 74 65 73 5f 74 6f 5f long) bytes_to_
9b90: 63 6f 70 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 copy, (unsigned
9ba0: 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e 2c 20 long) recv_len,
9bb0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
9bc0: 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a *respdata_len);.
9bd0: 0a 09 09 6d 65 6d 63 70 79 28 72 65 73 70 64 61 ...memcpy(respda
9be0: 74 61 2c 20 72 65 63 76 5f 62 75 66 2c 20 62 79 ta, recv_buf, by
9bf0: 74 65 73 5f 74 6f 5f 63 6f 70 79 29 3b 0a 09 09 tes_to_copy);...
9c00: 72 65 73 70 64 61 74 61 20 2b 3d 20 62 79 74 65 respdata += byte
9c10: 73 5f 74 6f 5f 63 6f 70 79 3b 0a 0a 09 09 2a 72 s_to_copy;....*r
9c20: 65 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20 62 79 espdata_len = by
9c30: 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 09 09 74 tes_to_copy;...t
9c40: 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 mp_respdata_len
9c50: 2d 3d 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 -= bytes_to_copy
9c60: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 ;..} else {...if
9c70: 20 28 72 65 63 76 5f 6c 65 6e 20 21 3d 20 30 29 (recv_len != 0)
9c80: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 {....CACKEY_DEB
9c90: 55 47 5f 50 52 49 4e 54 46 28 22 54 68 72 6f 77 UG_PRINTF("Throw
9ca0: 69 6e 67 20 61 77 61 79 20 25 6c 75 20 62 79 74 ing away %lu byt
9cb0: 65 73 2c 20 6e 6f 77 68 65 72 65 20 74 6f 20 70 es, nowhere to p
9cc0: 75 74 20 74 68 65 6d 21 22 2c 20 28 75 6e 73 69 ut them!", (unsi
9cd0: 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f gned long) recv_
9ce0: 6c 65 6e 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 len);...}..}...i
9cf0: 66 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d 20 30 f (major_rc == 0
9d00: 78 36 31 29 20 7b 0a 09 09 2f 2a 20 57 65 20 6e x61) {.../* We n
9d10: 65 65 64 20 74 6f 20 52 45 41 44 20 2a 2f 0a 09 eed to READ */..
9d20: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
9d30: 49 4e 54 46 28 22 42 75 66 66 65 72 20 72 65 61 INTF("Buffer rea
9d40: 64 20 72 65 71 75 69 72 65 64 22 29 3b 0a 0a 09 d required");...
9d50: 09 69 66 20 28 6d 69 6e 6f 72 5f 72 63 20 3d 3d .if (minor_rc ==
9d60: 20 30 78 30 30 29 20 7b 0a 09 09 09 6d 69 6e 6f 0x00) {....mino
9d70: 72 5f 72 63 20 3d 20 43 41 43 4b 45 59 5f 41 50 r_rc = CACKEY_AP
9d80: 44 55 5f 4d 54 55 3b 0a 09 09 7d 0a 0a 09 09 70 DU_MTU;...}....p
9d90: 63 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20 csc_getresp_ret
9da0: 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 = cackey_send_ap
9db0: 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 du(slot, GSCIS_C
9dc0: 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 LASS_ISO7816, GS
9dd0: 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 52 45 CIS_INSTR_GET_RE
9de0: 53 50 4f 4e 53 45 2c 20 30 78 30 30 2c 20 30 78 SPONSE, 0x00, 0x
9df0: 30 30 2c 20 30 2c 20 4e 55 4c 4c 2c 20 6d 69 6e 00, 0, NULL, min
9e00: 6f 72 5f 72 63 2c 20 72 65 73 70 63 6f 64 65 2c or_rc, respcode,
9e10: 20 72 65 73 70 64 61 74 61 2c 20 26 74 6d 70 5f respdata, &tmp_
9e20: 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 0a respdata_len);..
9e30: 09 09 69 66 20 28 70 63 73 63 5f 67 65 74 72 65 ..if (pcsc_getre
9e40: 73 70 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 sp_ret != CACKEY
9e50: 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 _PCSC_S_OK) {...
9e60: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
9e70: 49 4e 54 46 28 22 42 75 66 66 65 72 20 72 65 61 INTF("Buffer rea
9e80: 64 20 66 61 69 6c 65 64 21 20 20 52 65 74 75 72 d failed! Retur
9e90: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 ning in failure"
9ea0: 29 3b 0a 0a 09 09 09 2f 2a 20 45 6e 64 20 53 6d );...../* End Sm
9eb0: 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 artcard Transact
9ec0: 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 ion */....cackey
9ed0: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e _end_transaction
9ee0: 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 69 66 20 28 (slot);.....if (
9ef0: 70 63 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 pcsc_getresp_ret
9f00: 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f == CACKEY_PCSC_
9f10: 45 5f 52 45 54 52 59 29 20 7b 0a 09 09 09 09 72 E_RETRY) {.....r
9f20: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 eturn(CACKEY_PCS
9f30: 43 5f 45 5f 52 45 54 52 59 29 3b 0a 09 09 09 7d C_E_RETRY);....}
9f40: 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b .....return(CACK
9f50: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 EY_PCSC_E_GENERI
9f60: 43 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72 C);...}....if (r
9f70: 65 73 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 espdata_len) {..
9f80: 09 09 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 ..*respdata_len
9f90: 2b 3d 20 74 6d 70 5f 72 65 73 70 64 61 74 61 5f += tmp_respdata_
9fa0: 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 45 len;...}..../* E
9fb0: 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 nd Smartcard Tra
9fc0: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 nsaction */...ca
9fd0: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 ckey_end_transac
9fe0: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 43 tion(slot);....C
9ff0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
a000: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e TF("Returning in
a010: 20 73 75 63 63 65 73 73 20 28 62 75 66 66 65 72 success (buffer
a020: 20 72 65 61 64 20 63 6f 6d 70 6c 65 74 65 29 22 read complete)"
a030: 29 3b 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b );...return(CACK
a040: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 EY_PCSC_S_OK);..
a050: 7d 0a 0a 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 }.../* End Smart
a060: 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e card Transaction
a070: 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f */..cackey_end_
a080: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 transaction(slot
a090: 29 3b 0a 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 72 );...if (major_r
a0a0: 63 20 3d 3d 20 30 78 39 30 29 20 7b 0a 09 09 2f c == 0x90) {.../
a0b0: 2a 20 53 75 63 63 65 73 73 20 2a 2f 0a 09 09 43 * Success */...C
a0c0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
a0d0: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e TF("Returning in
a0e0: 20 73 75 63 63 65 73 73 20 28 6d 61 6a 6f 72 5f success (major_
a0f0: 72 63 20 3d 20 30 78 39 30 29 22 29 3b 0a 0a 09 rc = 0x90)");...
a100: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 .return(CACKEY_P
a110: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 0a CSC_S_OK);..}...
a120: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
a130: 49 4e 54 46 28 22 41 50 44 55 20 52 65 74 75 72 INTF("APDU Retur
a140: 6e 65 64 20 61 6e 20 65 72 72 6f 72 2c 20 72 65 ned an error, re
a150: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 turning in failu
a160: 72 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 re");...return(C
a170: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e ACKEY_PCSC_E_GEN
a180: 45 52 49 43 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 ERIC);.}../*. *
a190: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 SYNPOSIS. *
a1a0: 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 72 ssize_t cackey_r
a1b0: 65 61 64 5f 62 75 66 66 65 72 28 73 74 72 75 63 ead_buffer(struc
a1c0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 t cackey_slot *s
a1d0: 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 lot, unsigned ch
a1e0: 61 72 20 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 ar *buffer, size
a1f0: 5f 74 20 63 6f 75 6e 74 2c 20 75 6e 73 69 67 6e _t count, unsign
a200: 65 64 20 63 68 61 72 20 74 5f 6f 72 5f 76 2c 20 ed char t_or_v,
a210: 73 69 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f size_t initial_o
a220: 66 66 73 65 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 ffset);. *. * AR
a230: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 GUMENTS. * s
a240: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f truct cackey_slo
a250: 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 t *slot. *
a260: 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 Slot to send
a270: 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 commands to. *.
a280: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 * unsigned c
a290: 68 61 72 20 2a 62 75 66 66 65 72 0a 20 2a 20 20 har *buffer. *
a2a0: 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 42 75 66 [OUT] Buf
a2b0: 66 65 72 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 fer. *. * si
a2c0: 7a 65 5f 74 20 63 6f 75 6e 74 0a 20 2a 20 20 20 ze_t count. *
a2d0: 20 20 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 Number of
a2e0: 62 79 74 65 73 20 74 6f 20 61 74 74 65 6d 70 74 bytes to attempt
a2f0: 20 74 6f 20 72 65 61 64 0a 20 2a 0a 20 2a 20 20 to read. *. *
a300: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 unsigned char
a310: 20 74 5f 6f 72 5f 76 0a 20 2a 20 20 20 20 20 20 t_or_v. *
a320: 20 20 20 53 65 6c 65 63 74 20 74 68 65 20 54 2d Select the T-
a330: 62 75 66 66 65 72 20 28 30 31 29 20 6f 72 20 56 buffer (01) or V
a340: 2d 62 75 66 66 65 72 20 28 30 32 29 20 74 6f 20 -buffer (02) to
a350: 72 65 61 64 20 66 72 6f 6d 2e 20 20 0a 20 2a 0a read from. . *.
a360: 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 69 6e * size_t in
a370: 69 74 69 61 6c 5f 6f 66 66 73 65 74 0a 20 2a 20 itial_offset. *
a380: 20 20 20 20 20 20 20 20 53 70 65 63 69 66 79 20 Specify
a390: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 62 65 the offset to be
a3a0: 67 69 6e 20 74 68 65 20 72 65 61 64 20 66 72 6f gin the read fro
a3b0: 6d 0a 20 2a 0a 20 2a 0a 20 2a 20 52 45 54 55 52 m. *. *. * RETUR
a3c0: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 54 N VALUE. * T
a3d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 his function ret
a3e0: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 urns the number
a3f0: 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c of bytes actuall
a400: 79 20 72 65 61 64 2c 20 6f 72 20 2d 31 20 6f 6e y read, or -1 on
a410: 20 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 20 4e 4f error.. *. * NO
a420: 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a TES. * None.
a430: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73 *. */.static ss
a440: 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 72 65 61 ize_t cackey_rea
a450: 64 5f 62 75 66 66 65 72 28 73 74 72 75 63 74 20 d_buffer(struct
a460: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f cackey_slot *slo
a470: 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 t, unsigned char
a480: 20 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 *buffer, size_t
a490: 20 63 6f 75 6e 74 2c 20 75 6e 73 69 67 6e 65 64 count, unsigned
a4a0: 20 63 68 61 72 20 74 5f 6f 72 5f 76 2c 20 73 69 char t_or_v, si
a4b0: 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66 ze_t initial_off
a4c0: 73 65 74 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 set) {..unsigned
a4d0: 20 63 68 61 72 20 2a 69 6e 69 74 5f 62 75 66 66 char *init_buff
a4e0: 65 72 3b 0a 09 73 69 7a 65 5f 74 20 69 6e 69 74 er;..size_t init
a4f0: 5f 63 6f 75 6e 74 3b 0a 09 73 69 7a 65 5f 74 20 _count;..size_t
a500: 69 6e 69 74 5f 69 6e 69 74 69 61 6c 5f 6f 66 66 init_initial_off
a510: 73 65 74 3b 0a 0a 09 73 69 7a 65 5f 74 20 6f 66 set;...size_t of
a520: 66 73 65 74 20 3d 20 30 2c 20 6d 61 78 5f 6f 66 fset = 0, max_of
a530: 66 73 65 74 2c 20 6d 61 78 5f 63 6f 75 6e 74 3b fset, max_count;
a540: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 ..unsigned char
a550: 63 6d 64 5b 32 5d 3b 0a 09 75 69 6e 74 31 36 5f cmd[2];..uint16_
a560: 74 20 72 65 73 70 63 6f 64 65 3b 0a 09 69 6e 74 t respcode;..int
a570: 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 43 send_ret;...CAC
a580: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
a590: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 ("Called.");...i
a5a0: 6e 69 74 5f 62 75 66 66 65 72 20 3d 20 62 75 66 nit_buffer = buf
a5b0: 66 65 72 3b 0a 09 69 6e 69 74 5f 63 6f 75 6e 74 fer;..init_count
a5c0: 20 3d 20 63 6f 75 6e 74 3b 0a 09 69 6e 69 74 5f = count;..init_
a5d0: 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 20 3d initial_offset =
a5e0: 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 3b initial_offset;
a5f0: 0a 0a 09 6d 61 78 5f 6f 66 66 73 65 74 20 3d 20 ...max_offset =
a600: 63 6f 75 6e 74 3b 0a 09 6d 61 78 5f 63 6f 75 6e count;..max_coun
a610: 74 20 3d 20 43 41 43 4b 45 59 5f 41 50 44 55 5f t = CACKEY_APDU_
a620: 4d 54 55 3b 0a 0a 09 69 66 20 28 74 5f 6f 72 5f MTU;...if (t_or_
a630: 76 20 21 3d 20 31 20 26 26 20 74 5f 6f 72 5f 76 v != 1 && t_or_v
a640: 20 21 3d 20 32 29 20 7b 0a 09 09 43 41 43 4b 45 != 2) {...CACKE
a650: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
a660: 49 6e 76 61 6c 69 64 20 54 20 6f 72 20 56 20 70 Invalid T or V p
a670: 61 72 61 6d 65 74 65 72 20 73 70 65 63 69 66 69 arameter specifi
a680: 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e ed, returning in
a690: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 failure");....r
a6a0: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 eturn(-1);..}...
a6b0: 63 6d 64 5b 30 5d 20 3d 20 74 5f 6f 72 5f 76 3b cmd[0] = t_or_v;
a6c0: 0a 0a 09 77 68 69 6c 65 20 28 31 29 20 7b 0a 09 ...while (1) {..
a6d0: 09 69 66 20 28 6f 66 66 73 65 74 20 3e 3d 20 6d .if (offset >= m
a6e0: 61 78 5f 6f 66 66 73 65 74 29 20 7b 0a 09 09 09 ax_offset) {....
a6f0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
a700: 4e 54 46 28 22 42 75 66 66 65 72 20 74 6f 6f 20 NTF("Buffer too
a710: 73 6d 61 6c 6c 2c 20 72 65 74 75 72 6e 69 6e 67 small, returning
a720: 20 77 68 61 74 20 77 65 20 67 6f 74 2e 2e 2e 22 what we got..."
a730: 29 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 );.....break;...
a740: 7d 0a 0a 09 09 63 6f 75 6e 74 20 3d 20 6d 61 78 }....count = max
a750: 5f 6f 66 66 73 65 74 20 2d 20 6f 66 66 73 65 74 _offset - offset
a760: 3b 0a 09 09 69 66 20 28 63 6f 75 6e 74 20 3e 20 ;...if (count >
a770: 6d 61 78 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 max_count) {....
a780: 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 63 6f 75 6e count = max_coun
a790: 74 3b 0a 09 09 7d 0a 0a 09 09 63 6d 64 5b 31 5d t;...}....cmd[1]
a7a0: 20 3d 20 63 6f 75 6e 74 3b 0a 0a 09 09 73 65 6e = count;....sen
a7b0: 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 d_ret = cackey_s
a7c0: 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 end_apdu(slot, G
a7d0: 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 SCIS_CLASS_GLOBA
a7e0: 4c 5f 50 4c 41 54 46 4f 52 4d 2c 20 47 53 43 49 L_PLATFORM, GSCI
a7f0: 53 5f 49 4e 53 54 52 5f 52 45 41 44 5f 42 55 46 S_INSTR_READ_BUF
a800: 46 45 52 2c 20 28 28 69 6e 69 74 69 61 6c 5f 6f FER, ((initial_o
a810: 66 66 73 65 74 20 2b 20 6f 66 66 73 65 74 29 20 ffset + offset)
a820: 3e 3e 20 38 29 20 26 20 30 78 66 66 2c 20 28 69 >> 8) & 0xff, (i
a830: 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 20 2b 20 nitial_offset +
a840: 6f 66 66 73 65 74 29 20 26 20 30 78 66 66 2c 20 offset) & 0xff,
a850: 73 69 7a 65 6f 66 28 63 6d 64 29 2c 20 63 6d 64 sizeof(cmd), cmd
a860: 2c 20 30 78 30 30 2c 20 26 72 65 73 70 63 6f 64 , 0x00, &respcod
a870: 65 2c 20 62 75 66 66 65 72 20 2b 20 6f 66 66 73 e, buffer + offs
a880: 65 74 2c 20 26 63 6f 75 6e 74 29 3b 0a 0a 09 09 et, &count);....
a890: 69 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 if (send_ret ==
a8a0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 CACKEY_PCSC_E_RE
a8b0: 54 52 59 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 TRY) {....CACKEY
a8c0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 _DEBUG_PRINTF("A
a8d0: 44 50 55 20 53 65 6e 64 69 6e 67 20 66 61 69 6c DPU Sending fail
a8e0: 65 64 2c 20 72 65 74 72 79 69 6e 67 20 72 65 61 ed, retrying rea
a8f0: 64 20 62 75 66 66 65 72 22 29 3b 0a 0a 09 09 09 d buffer");.....
a900: 72 65 74 75 72 6e 28 63 61 63 6b 65 79 5f 72 65 return(cackey_re
a910: 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 ad_buffer(slot,
a920: 69 6e 69 74 5f 62 75 66 66 65 72 2c 20 69 6e 69 init_buffer, ini
a930: 74 5f 63 6f 75 6e 74 2c 20 74 5f 6f 72 5f 76 2c t_count, t_or_v,
a940: 20 69 6e 69 74 5f 69 6e 69 74 69 61 6c 5f 6f 66 init_initial_of
a950: 66 73 65 74 29 29 3b 0a 09 09 7d 0a 0a 09 09 69 fset));...}....i
a960: 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 f (send_ret != C
a970: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 ACKEY_PCSC_S_OK)
a980: 20 7b 0a 09 09 09 69 66 20 28 72 65 73 70 63 6f {....if (respco
a990: 64 65 20 3d 3d 20 30 78 36 41 38 36 29 20 7b 0a de == 0x6A86) {.
a9a0: 09 09 09 09 69 66 20 28 6d 61 78 5f 63 6f 75 6e ....if (max_coun
a9b0: 74 20 3d 3d 20 31 29 20 7b 0a 09 09 09 09 09 62 t == 1) {......b
a9c0: 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 reak;.....}.....
a9d0: 09 6d 61 78 5f 63 6f 75 6e 74 20 3d 20 6d 61 78 .max_count = max
a9e0: 5f 63 6f 75 6e 74 20 2f 20 32 3b 0a 0a 09 09 09 _count / 2;.....
a9f0: 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a .continue;....}.
aa00: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
aa10: 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f _PRINTF("cackey_
aa20: 73 65 6e 64 5f 61 70 64 75 28 29 20 66 61 69 6c send_apdu() fail
aa30: 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e ed, returning in
aa40: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 failure");.....
aa50: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a return(-1);...}.
aa60: 0a 09 09 6f 66 66 73 65 74 20 2b 3d 20 63 6f 75 ...offset += cou
aa70: 6e 74 3b 0a 0a 09 09 69 66 20 28 63 6f 75 6e 74 nt;....if (count
aa80: 20 3c 20 6d 61 78 5f 63 6f 75 6e 74 29 20 7b 0a < max_count) {.
aa90: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
aaa0: 50 52 49 4e 54 46 28 22 53 68 6f 72 74 20 72 65 PRINTF("Short re
aab0: 61 64 20 2d 2d 20 63 6f 75 6e 74 20 3d 20 25 69 ad -- count = %i
aac0: 2c 20 63 6d 64 5b 31 5d 20 3d 20 25 69 22 2c 20 , cmd[1] = %i",
aad0: 28 69 6e 74 29 20 63 6f 75 6e 74 2c 20 28 69 6e (int) count, (in
aae0: 74 29 20 63 6d 64 5b 31 5d 29 3b 0a 0a 09 09 09 t) cmd[1]);.....
aaf0: 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 break;...}..}..#
ab00: 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41 52 ifdef CACKEY_PAR
ab10: 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20 5f ANOID.# ifdef _
ab20: 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a POSIX_SSIZE_MAX.
ab30: 09 69 66 20 28 6f 66 66 73 65 74 20 3e 20 5f 50 .if (offset > _P
ab40: 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20 OSIX_SSIZE_MAX)
ab50: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
ab60: 5f 50 52 49 4e 54 46 28 22 4f 66 66 73 65 74 20 _PRINTF("Offset
ab70: 65 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d 20 exceeds maximum
ab80: 76 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e 67 value, returning
ab90: 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d 61 in failure. (ma
aba0: 78 20 3d 20 25 6c 69 2c 20 6f 66 66 73 65 74 20 x = %li, offset
abb0: 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20 = %lu)", (long)
abc0: 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 _POSIX_SSIZE_MAX
abd0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
abe0: 29 20 6f 66 66 73 65 74 29 3b 0a 0a 09 09 72 65 ) offset);....re
abf0: 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 turn(-1);..}.#
ac00: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09 43 endif.#endif...C
ac10: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
ac20: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e TF("Returning in
ac30: 20 73 75 63 63 65 73 73 2c 20 72 65 61 64 20 25 success, read %
ac40: 6c 75 20 62 79 74 65 73 22 2c 20 28 75 6e 73 69 lu bytes", (unsi
ac50: 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 66 66 73 65 gned long) offse
ac60: 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 6f 66 66 t);...return(off
ac70: 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 set);.}../*. * S
ac80: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 YNPOSIS. * c
ac90: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 ackey_ret cackey
aca0: 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 _select_applet(s
acb0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f truct cackey_slo
acc0: 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 t *slot, unsigne
acd0: 64 20 63 68 61 72 20 2a 61 69 64 2c 20 73 69 7a d char *aid, siz
ace0: 65 5f 74 20 61 69 64 5f 6c 65 6e 29 3b 0a 20 2a e_t aid_len);. *
acf0: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a . * ARGUMENTS. *
ad00: 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63 6b struct cack
ad10: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a ey_slot *slot. *
ad20: 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f Slot to
ad30: 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 send commands t
ad40: 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 o. *. * unsi
ad50: 67 6e 65 64 20 63 68 61 72 20 2a 61 69 64 0a 20 gned char *aid.
ad60: 2a 20 20 20 20 20 20 20 20 20 42 75 66 66 65 72 * Buffer
ad70: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 41 70 70 6c containing Appl
ad80: 65 74 20 49 44 20 74 6f 20 73 65 6c 65 63 74 0a et ID to select.
ad90: 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 *. * size_t
ada0: 20 61 69 64 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 aid_len. *
adb0: 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 Number of by
adc0: 74 65 73 20 69 6e 20 74 68 65 20 22 61 69 64 22 tes in the "aid"
add0: 20 28 41 70 70 6c 65 74 20 49 44 29 20 70 61 72 (Applet ID) par
ade0: 61 6d 65 74 65 72 0a 20 2a 0a 20 2a 20 52 45 54 ameter. *. * RET
adf0: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 URN VALUE. *
ae00: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f CACKEY_PCSC_S_O
ae10: 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 K On suc
ae20: 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b cess. * CACK
ae30: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 EY_PCSC_E_GENERI
ae40: 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a C On error. *
ae50: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 . * NOTES. *
ae60: 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 None. *. */.sta
ae70: 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 tic cackey_ret c
ae80: 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 ackey_select_app
ae90: 6c 65 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 let(struct cacke
aea0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e y_slot *slot, un
aeb0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 69 64 signed char *aid
aec0: 2c 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e , size_t aid_len
aed0: 29 20 7b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 ) {..int send_re
aee0: 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 t;...CACKEY_DEBU
aef0: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 G_PRINTF("Called
af00: 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 .");...CACKEY_DE
af10: 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 53 65 BUG_PRINTBUF("Se
af20: 6c 65 63 74 69 6e 67 20 61 70 70 6c 65 74 3a 22 lecting applet:"
af30: 2c 20 61 69 64 2c 20 61 69 64 5f 6c 65 6e 29 3b , aid, aid_len);
af40: 0a 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 ...send_ret = ca
af50: 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 ckey_send_apdu(s
af60: 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 lot, GSCIS_CLASS
af70: 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f _ISO7816, GSCIS_
af80: 49 4e 53 54 52 5f 53 45 4c 45 43 54 2c 20 47 53 INSTR_SELECT, GS
af90: 43 49 53 5f 50 41 52 41 4d 5f 53 45 4c 45 43 54 CIS_PARAM_SELECT
afa0: 5f 41 50 50 4c 45 54 2c 20 30 78 30 30 2c 20 61 _APPLET, 0x00, a
afb0: 69 64 5f 6c 65 6e 2c 20 61 69 64 2c 20 30 78 30 id_len, aid, 0x0
afc0: 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 0, NULL, NULL, N
afd0: 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 73 65 6e 64 ULL);...if (send
afe0: 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 _ret == CACKEY_P
aff0: 43 53 43 5f 45 5f 52 45 54 52 59 29 20 7b 0a 09 CSC_E_RETRY) {..
b000: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
b010: 49 4e 54 46 28 22 41 44 50 55 20 53 65 6e 64 69 INTF("ADPU Sendi
b020: 6e 67 20 66 61 69 6c 65 64 2c 20 72 65 74 72 79 ng failed, retry
b030: 69 6e 67 20 73 65 6c 65 63 74 20 61 70 70 6c 65 ing select apple
b040: 74 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 63 t");....return(c
b050: 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 ackey_select_app
b060: 6c 65 74 28 73 6c 6f 74 2c 20 61 69 64 2c 20 61 let(slot, aid, a
b070: 69 64 5f 6c 65 6e 29 29 3b 0a 09 7d 0a 0a 09 69 id_len));..}...i
b080: 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 f (send_ret != C
b090: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 ACKEY_PCSC_S_OK)
b0a0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
b0b0: 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 G_PRINTF("Failed
b0c0: 20 74 6f 20 6f 70 65 6e 20 61 70 70 6c 65 74 2c to open applet,
b0d0: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 returning in fa
b0e0: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 ilure");....retu
b0f0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 rn(CACKEY_PCSC_E
b100: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 _GENERIC);..}...
b110: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
b120: 4e 54 46 28 22 53 75 63 63 65 73 73 66 75 6c 6c NTF("Successfull
b130: 79 20 73 65 6c 65 63 74 65 64 20 66 69 6c 65 22 y selected file"
b140: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b );...return(CACK
b150: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d EY_PCSC_S_OK);.}
b160: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 ../*. * SYNPOSIS
b170: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 . * cackey_r
b180: 65 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 et cackey_select
b190: 5f 66 69 6c 65 28 73 74 72 75 63 74 20 63 61 63 _file(struct cac
b1a0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 key_slot *slot,
b1b0: 75 69 6e 74 31 36 5f 74 20 65 66 29 3b 0a 20 2a uint16_t ef);. *
b1c0: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a . * ARGUMENTS. *
b1d0: 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63 6b struct cack
b1e0: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a ey_slot *slot. *
b1f0: 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f Slot to
b200: 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 send commands t
b210: 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 69 6e 74 o. *. * uint
b220: 31 36 5f 74 20 65 66 0a 20 2a 20 20 20 20 20 20 16_t ef. *
b230: 20 20 20 45 6c 65 6d 65 6e 74 61 6c 20 46 69 6c Elemental Fil
b240: 65 20 74 6f 20 73 65 6c 65 63 74 0a 20 2a 0a 20 e to select. *.
b250: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 * RETURN VALUE.
b260: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 * CACKEY_PCS
b270: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f C_S_OK O
b280: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 n success. *
b290: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 CACKEY_PCSC_E_G
b2a0: 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 ENERIC On err
b2b0: 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 or. *. * NOTES.
b2c0: 2a 20 20 20 20 20 54 68 69 73 20 73 65 6c 65 63 * This selec
b2d0: 74 73 20 61 6e 20 45 6c 65 6d 65 6e 74 61 72 79 ts an Elementary
b2e0: 20 46 69 6c 65 20 28 45 46 29 20 75 6e 64 65 72 File (EF) under
b2f0: 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 73 the currently s
b300: 65 6c 65 63 74 65 64 0a 20 2a 20 20 20 20 20 44 elected. * D
b310: 65 64 69 63 61 74 65 64 20 46 69 6c 65 20 28 44 edicated File (D
b320: 46 29 0a 20 2a 0a 20 2a 20 20 20 20 20 54 79 70 F). *. * Typ
b330: 69 63 61 6c 6c 79 20 74 68 69 73 20 69 73 20 63 ically this is c
b340: 61 6c 6c 65 64 20 61 66 74 65 72 20 73 65 6c 65 alled after sele
b350: 63 74 69 6e 67 20 74 68 65 20 63 6f 72 72 65 63 cting the correc
b360: 74 20 41 70 70 6c 65 74 20 28 75 73 69 6e 67 0a t Applet (using.
b370: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 65 * cackey_se
b380: 6c 65 63 74 5f 61 70 70 6c 65 74 29 20 66 6f 72 lect_applet) for
b390: 20 56 4d 20 63 61 72 64 73 0a 20 2a 0a 20 2a 2f VM cards. *. */
b3a0: 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 .static cackey_r
b3b0: 65 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 et cackey_select
b3c0: 5f 66 69 6c 65 28 73 74 72 75 63 74 20 63 61 63 _file(struct cac
b3d0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 key_slot *slot,
b3e0: 75 69 6e 74 31 36 5f 74 20 65 66 29 20 7b 0a 09 uint16_t ef) {..
b3f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 66 69 unsigned char fi
b400: 64 5f 62 75 66 5b 32 5d 3b 0a 09 69 6e 74 20 73 d_buf[2];..int s
b410: 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 end_ret;...CACKE
b420: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
b430: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 2f 2a 20 Called.");.../*
b440: 4f 70 65 6e 20 74 68 65 20 65 6c 65 6d 65 6e 74 Open the element
b450: 61 72 79 20 66 69 6c 65 20 2a 2f 0a 09 66 69 64 ary file */..fid
b460: 5f 62 75 66 5b 30 5d 20 3d 20 28 65 66 20 3e 3e _buf[0] = (ef >>
b470: 20 38 29 20 26 20 30 78 66 66 3b 0a 09 66 69 64 8) & 0xff;..fid
b480: 5f 62 75 66 5b 31 5d 20 3d 20 65 66 20 26 20 30 _buf[1] = ef & 0
b490: 78 66 66 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 xff;...CACKEY_DE
b4a0: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 6c 65 BUG_PRINTF("Sele
b4b0: 63 74 69 6e 67 20 66 69 6c 65 3a 20 25 30 34 6c cting file: %04l
b4c0: 78 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f x", (unsigned lo
b4d0: 6e 67 29 20 65 66 29 3b 0a 0a 09 73 65 6e 64 5f ng) ef);...send_
b4e0: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e ret = cackey_sen
b4f0: 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 d_apdu(slot, GSC
b500: 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 IS_CLASS_ISO7816
b510: 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 , GSCIS_INSTR_SE
b520: 4c 45 43 54 2c 20 30 78 30 32 2c 20 30 78 30 43 LECT, 0x02, 0x0C
b530: 2c 20 73 69 7a 65 6f 66 28 66 69 64 5f 62 75 66 , sizeof(fid_buf
b540: 29 2c 20 66 69 64 5f 62 75 66 2c 20 30 78 30 30 ), fid_buf, 0x00
b550: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 , NULL, NULL, NU
b560: 4c 4c 29 3b 0a 09 69 66 20 28 73 65 6e 64 5f 72 LL);..if (send_r
b570: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 et != CACKEY_PCS
b580: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b C_S_OK) {...CACK
b590: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
b5a0: 22 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 "Failed to open
b5b0: 66 69 6c 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 file, returning
b5c0: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 in failure");...
b5d0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 .return(CACKEY_P
b5e0: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a CSC_E_GENERIC);.
b5f0: 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 .}...CACKEY_DEBU
b600: 47 5f 50 52 49 4e 54 46 28 22 53 75 63 63 65 73 G_PRINTF("Succes
b610: 73 66 75 6c 6c 79 20 73 65 6c 65 63 74 65 64 20 sfully selected
b620: 66 69 6c 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e file");...return
b630: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f (CACKEY_PCSC_S_O
b640: 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e K);.}../*. * SYN
b650: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 76 6f 69 POSIS. * voi
b660: 64 20 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c d cackey_free_tl
b670: 76 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f v(struct cackey_
b680: 74 6c 76 5f 65 6e 74 69 74 79 20 2a 72 6f 6f 74 tlv_entity *root
b690: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e );. *. * ARGUMEN
b6a0: 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74 TS. * struct
b6b0: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 cackey_tlv_enti
b6c0: 74 79 20 2a 72 6f 6f 74 0a 20 2a 20 20 20 20 20 ty *root. *
b6d0: 20 20 20 20 52 6f 6f 74 20 6f 66 20 74 68 65 20 Root of the
b6e0: 54 4c 56 20 6c 69 73 74 20 74 6f 20 73 74 61 72 TLV list to star
b6f0: 74 20 66 72 65 65 69 6e 67 0a 20 2a 0a 20 2a 20 t freeing. *. *
b700: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 RETURN VALUE. *
b710: 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e None. *. * N
b720: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 OTES. * This
b730: 20 66 75 6e 63 74 69 6f 6e 20 66 72 65 65 73 20 function frees
b740: 74 68 65 20 54 4c 56 20 6c 69 6e 6b 65 64 20 6c the TLV linked l
b750: 69 73 74 65 64 20 72 65 74 75 72 6e 65 64 20 66 isted returned f
b760: 72 6f 6d 0a 20 2a 20 20 20 20 20 22 63 61 63 6b rom. * "cack
b770: 65 79 5f 72 65 61 64 5f 74 6c 76 22 0a 20 2a 0a ey_read_tlv". *.
b780: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 */.static void
b790: 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 cackey_free_tlv(
b7a0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c struct cackey_tl
b7b0: 76 5f 65 6e 74 69 74 79 20 2a 72 6f 6f 74 29 20 v_entity *root)
b7c0: 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 {..struct cackey
b7d0: 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 75 72 _tlv_entity *cur
b7e0: 72 2c 20 2a 6e 65 78 74 3b 0a 0a 09 69 66 20 28 r, *next;...if (
b7f0: 72 6f 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a root == NULL) {.
b800: 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 ..return;..}...f
b810: 6f 72 20 28 63 75 72 72 20 3d 20 72 6f 6f 74 3b or (curr = root;
b820: 20 63 75 72 72 3b 20 63 75 72 72 20 3d 20 6e 65 curr; curr = ne
b830: 78 74 29 20 7b 0a 09 09 6e 65 78 74 20 3d 20 63 xt) {...next = c
b840: 75 72 72 2d 3e 5f 6e 65 78 74 3b 0a 0a 09 09 73 urr->_next;....s
b850: 77 69 74 63 68 20 28 63 75 72 72 2d 3e 74 61 67 witch (curr->tag
b860: 29 20 7b 0a 09 09 09 63 61 73 65 20 47 53 43 49 ) {....case GSCI
b870: 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a S_TAG_ACR_TABLE:
b880: 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 ....case GSCIS_T
b890: 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 3a 0a AG_CERTIFICATE:.
b8a0: 09 09 09 09 69 66 20 28 63 75 72 72 2d 3e 76 61 ....if (curr->va
b8b0: 6c 75 65 29 20 7b 0a 09 09 09 09 09 66 72 65 65 lue) {......free
b8c0: 28 63 75 72 72 2d 3e 76 61 6c 75 65 29 3b 0a 09 (curr->value);..
b8d0: 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a ...}.....break;.
b8e0: 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 ...case GSCIS_TA
b8f0: 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09 09 69 G_CARDURL:.....i
b900: 66 20 28 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 f (curr->value_c
b910: 61 72 64 75 72 6c 29 20 7b 0a 09 09 09 09 09 66 ardurl) {......f
b920: 72 65 65 28 63 75 72 72 2d 3e 76 61 6c 75 65 5f ree(curr->value_
b930: 63 61 72 64 75 72 6c 29 3b 0a 09 09 09 09 7d 0a cardurl);.....}.
b940: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a ....break;...}..
b950: 09 09 66 72 65 65 28 63 75 72 72 29 3b 0a 09 7d ..free(curr);..}
b960: 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a ...return;.}../*
b970: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 . * SYNPOSIS. *
b980: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 .... *. * AR
b990: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e GUMENTS. * .
b9a0: 2e 2e 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 2e 2e 2e VALUE. * ...
b9c0: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 . *. * NOTES. *
b9d0: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 .... *. */.s
b9e0: 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63 tatic struct cac
b9f0: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a key_tlv_entity *
ba00: 63 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28 cackey_read_tlv(
ba10: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c struct cackey_sl
ba20: 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 73 74 72 ot *slot) {..str
ba30: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 uct cackey_tlv_e
ba40: 6e 74 69 74 79 20 2a 63 75 72 72 5f 65 6e 74 69 ntity *curr_enti
ba50: 74 79 2c 20 2a 72 6f 6f 74 20 3d 20 4e 55 4c 4c ty, *root = NULL
ba60: 2c 20 2a 6c 61 73 74 20 3d 20 4e 55 4c 4c 3b 0a , *last = NULL;.
ba70: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 .unsigned char t
ba80: 6c 65 6e 5f 62 75 66 5b 32 5d 2c 20 74 76 61 6c len_buf[2], tval
ba90: 5f 62 75 66 5b 31 30 32 34 5d 2c 20 2a 74 76 61 _buf[1024], *tva
baa0: 6c 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 l;..unsigned cha
bab0: 72 20 76 6c 65 6e 5f 62 75 66 5b 32 5d 2c 20 76 r vlen_buf[2], v
bac0: 76 61 6c 5f 62 75 66 5b 38 31 39 32 5d 2c 20 2a val_buf[8192], *
bad0: 76 76 61 6c 3b 0a 09 75 6e 73 69 67 6e 65 64 20 vval;..unsigned
bae0: 63 68 61 72 20 2a 74 6d 70 62 75 66 3b 0a 09 75 char *tmpbuf;..u
baf0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 74 6d 70 nsigned long tmp
bb00: 62 75 66 6c 65 6e 3b 0a 09 73 73 69 7a 65 5f 74 buflen;..ssize_t
bb10: 20 74 6c 65 6e 2c 20 76 6c 65 6e 3b 0a 09 73 73 tlen, vlen;..ss
bb20: 69 7a 65 5f 74 20 72 65 61 64 5f 72 65 74 3b 0a ize_t read_ret;.
bb30: 09 73 69 7a 65 5f 74 20 6f 66 66 73 65 74 5f 74 .size_t offset_t
bb40: 20 3d 20 30 2c 20 6f 66 66 73 65 74 5f 76 20 3d = 0, offset_v =
bb50: 20 30 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 0;..unsigned ch
bb60: 61 72 20 74 61 67 3b 0a 09 73 69 7a 65 5f 74 20 ar tag;..size_t
bb70: 6c 65 6e 67 74 68 3b 0a 23 69 66 64 65 66 20 48 length;.#ifdef H
bb80: 41 56 45 5f 4c 49 42 5a 0a 09 69 6e 74 20 75 6e AVE_LIBZ..int un
bb90: 63 6f 6d 70 72 65 73 73 5f 72 65 74 3b 0a 23 65 compress_ret;.#e
bba0: 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 ndif...CACKEY_DE
bbb0: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
bbc0: 65 64 2e 22 29 3b 0a 0a 09 72 65 61 64 5f 72 65 ed.");...read_re
bbd0: 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f t = cackey_read_
bbe0: 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 74 6c 65 buffer(slot, tle
bbf0: 6e 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28 74 6c n_buf, sizeof(tl
bc00: 65 6e 5f 62 75 66 29 2c 20 31 2c 20 6f 66 66 73 en_buf), 1, offs
bc10: 65 74 5f 74 29 3b 0a 09 69 66 20 28 72 65 61 64 et_t);..if (read
bc20: 5f 72 65 74 20 21 3d 20 73 69 7a 65 6f 66 28 74 _ret != sizeof(t
bc30: 6c 65 6e 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 len_buf)) {...CA
bc40: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
bc50: 46 28 22 52 65 61 64 20 66 61 69 6c 65 64 2c 20 F("Read failed,
bc60: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 returning in fai
bc70: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 lure");....retur
bc80: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 6c n(NULL);..}...tl
bc90: 65 6e 20 3d 20 28 74 6c 65 6e 5f 62 75 66 5b 31 en = (tlen_buf[1
bca0: 5d 20 3c 3c 20 38 29 20 7c 20 74 6c 65 6e 5f 62 ] << 8) | tlen_b
bcb0: 75 66 5b 30 5d 3b 0a 0a 09 72 65 61 64 5f 72 65 uf[0];...read_re
bcc0: 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f t = cackey_read_
bcd0: 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 76 6c 65 buffer(slot, vle
bce0: 6e 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28 76 6c n_buf, sizeof(vl
bcf0: 65 6e 5f 62 75 66 29 2c 20 32 2c 20 6f 66 66 73 en_buf), 2, offs
bd00: 65 74 5f 76 29 3b 0a 09 69 66 20 28 72 65 61 64 et_v);..if (read
bd10: 5f 72 65 74 20 21 3d 20 73 69 7a 65 6f 66 28 76 _ret != sizeof(v
bd20: 6c 65 6e 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 len_buf)) {...CA
bd30: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
bd40: 46 28 22 52 65 61 64 20 66 61 69 6c 65 64 2c 20 F("Read failed,
bd50: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 returning in fai
bd60: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 lure");....retur
bd70: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 76 6c n(NULL);..}...vl
bd80: 65 6e 20 3d 20 28 76 6c 65 6e 5f 62 75 66 5b 31 en = (vlen_buf[1
bd90: 5d 20 3c 3c 20 38 29 20 7c 20 76 6c 65 6e 5f 62 ] << 8) | vlen_b
bda0: 75 66 5b 30 5d 3b 0a 0a 09 43 41 43 4b 45 59 5f uf[0];...CACKEY_
bdb0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 61 DEBUG_PRINTF("Ta
bdc0: 67 20 4c 65 6e 67 74 68 20 3d 20 25 6c 75 2c 20 g Length = %lu,
bdd0: 56 61 6c 75 65 20 4c 65 6e 67 74 68 20 3d 20 25 Value Length = %
bde0: 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c lu", (unsigned l
bdf0: 6f 6e 67 29 20 74 6c 65 6e 2c 20 28 75 6e 73 69 ong) tlen, (unsi
be00: 67 6e 65 64 20 6c 6f 6e 67 29 20 76 6c 65 6e 29 gned long) vlen)
be10: 3b 0a 0a 09 6f 66 66 73 65 74 5f 74 20 2b 3d 20 ;...offset_t +=
be20: 32 3b 0a 09 6f 66 66 73 65 74 5f 76 20 2b 3d 20 2;..offset_v +=
be30: 32 3b 0a 0a 09 69 66 20 28 74 6c 65 6e 20 3e 20 2;...if (tlen >
be40: 73 69 7a 65 6f 66 28 74 76 61 6c 5f 62 75 66 29 sizeof(tval_buf)
be50: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
be60: 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67 20 6c UG_PRINTF("Tag l
be70: 65 6e 67 74 68 20 69 73 20 74 6f 6f 20 6c 61 72 ength is too lar
be80: 67 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e ge, returning in
be90: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 failure");....r
bea0: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a eturn(NULL);..}.
beb0: 0a 09 69 66 20 28 76 6c 65 6e 20 3e 20 73 69 7a ..if (vlen > siz
bec0: 65 6f 66 28 76 76 61 6c 5f 62 75 66 29 29 20 7b eof(vval_buf)) {
bed0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
bee0: 50 52 49 4e 54 46 28 22 56 61 6c 75 65 20 6c 65 PRINTF("Value le
bef0: 6e 67 74 68 20 69 73 20 74 6f 6f 20 6c 61 72 67 ngth is too larg
bf00: 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 e, returning in
bf10: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 failure");....re
bf20: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a turn(NULL);..}..
bf30: 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b .read_ret = cack
bf40: 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 ey_read_buffer(s
bf50: 6c 6f 74 2c 20 74 76 61 6c 5f 62 75 66 2c 20 74 lot, tval_buf, t
bf60: 6c 65 6e 2c 20 31 2c 20 6f 66 66 73 65 74 5f 74 len, 1, offset_t
bf70: 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74 );..if (read_ret
bf80: 20 21 3d 20 74 6c 65 6e 29 20 7b 0a 09 09 43 41 != tlen) {...CA
bf90: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
bfa0: 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 72 65 61 F("Unable to rea
bfb0: 64 20 65 6e 74 69 72 65 20 54 2d 62 75 66 66 65 d entire T-buffe
bfc0: 72 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 r, returning in
bfd0: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 failure");....re
bfe0: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a turn(NULL);..}..
bff0: 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b .read_ret = cack
c000: 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 ey_read_buffer(s
c010: 6c 6f 74 2c 20 76 76 61 6c 5f 62 75 66 2c 20 76 lot, vval_buf, v
c020: 6c 65 6e 2c 20 32 2c 20 6f 66 66 73 65 74 5f 76 len, 2, offset_v
c030: 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74 );..if (read_ret
c040: 20 21 3d 20 76 6c 65 6e 29 20 7b 0a 09 09 43 41 != vlen) {...CA
c050: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
c060: 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 72 65 61 F("Unable to rea
c070: 64 20 65 6e 74 69 72 65 20 56 2d 62 75 66 66 65 d entire V-buffe
c080: 72 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 r, returning in
c090: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 failure");....re
c0a0: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a turn(NULL);..}..
c0b0: 09 74 76 61 6c 20 3d 20 74 76 61 6c 5f 62 75 66 .tval = tval_buf
c0c0: 3b 0a 09 76 76 61 6c 20 3d 20 76 76 61 6c 5f 62 ;..vval = vval_b
c0d0: 75 66 3b 0a 09 77 68 69 6c 65 20 28 74 6c 65 6e uf;..while (tlen
c0e0: 20 3e 20 30 20 26 26 20 76 6c 65 6e 20 3e 20 30 > 0 && vlen > 0
c0f0: 29 20 7b 0a 09 09 74 61 67 20 3d 20 2a 74 76 61 ) {...tag = *tva
c100: 6c 3b 0a 09 09 74 76 61 6c 2b 2b 3b 0a 09 09 74 l;...tval++;...t
c110: 6c 65 6e 2d 2d 3b 0a 0a 09 09 69 66 20 28 2a 74 len--;....if (*t
c120: 76 61 6c 20 3d 3d 20 30 78 66 66 29 20 7b 0a 09 val == 0xff) {..
c130: 09 09 6c 65 6e 67 74 68 20 3d 20 28 74 76 61 6c ..length = (tval
c140: 5b 32 5d 20 3c 3c 20 38 29 20 7c 20 74 76 61 6c [2] << 8) | tval
c150: 5b 31 5d 3b 0a 09 09 09 74 76 61 6c 20 2b 3d 20 [1];....tval +=
c160: 33 3b 0a 09 09 09 74 6c 65 6e 20 2d 3d 20 33 3b 3;....tlen -= 3;
c170: 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 6c ...} else {....l
c180: 65 6e 67 74 68 20 3d 20 2a 74 76 61 6c 3b 0a 09 ength = *tval;..
c190: 09 09 74 76 61 6c 2b 2b 3b 0a 09 09 09 74 6c 65 ..tval++;....tle
c1a0: 6e 2d 2d 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b n--;...}....CACK
c1b0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
c1c0: 22 54 61 67 3a 20 25 73 20 28 25 30 32 78 29 22 "Tag: %s (%02x)"
c1d0: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 , CACKEY_DEBUG_F
c1e0: 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 74 UNC_TAG_TO_STR(t
c1f0: 61 67 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 ag), (unsigned i
c200: 6e 74 29 20 74 61 67 29 3b 0a 09 09 43 41 43 4b nt) tag);...CACK
c210: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 EY_DEBUG_PRINTBU
c220: 46 28 22 56 61 6c 75 65 3a 22 2c 20 76 76 61 6c F("Value:", vval
c230: 2c 20 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 63 75 , length);....cu
c240: 72 72 5f 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c rr_entity = NULL
c250: 3b 0a 09 09 73 77 69 74 63 68 20 28 74 61 67 29 ;...switch (tag)
c260: 20 7b 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 {....case GSCIS
c270: 5f 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09 _TAG_CARDURL:...
c280: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 ..curr_entity =
c290: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 malloc(sizeof(*c
c2a0: 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 09 09 urr_entity));...
c2b0: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 ..curr_entity->v
c2c0: 61 6c 75 65 5f 63 61 72 64 75 72 6c 20 3d 20 6d alue_cardurl = m
c2d0: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 alloc(sizeof(*cu
c2e0: 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 rr_entity->value
c2f0: 5f 63 61 72 64 75 72 6c 29 29 3b 0a 0a 09 09 09 _cardurl));.....
c300: 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 65 6e 74 .memcpy(curr_ent
c310: 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 ity->value_cardu
c320: 72 6c 2d 3e 72 69 64 2c 20 76 76 61 6c 2c 20 35 rl->rid, vval, 5
c330: 29 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 );.....curr_enti
c340: 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 ty->value_cardur
c350: 6c 2d 3e 61 70 70 74 79 70 65 20 3d 20 76 76 61 l->apptype = vva
c360: 6c 5b 35 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65 l[5];.....curr_e
c370: 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 ntity->value_car
c380: 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 20 3d durl->objectid =
c390: 20 28 76 76 61 6c 5b 36 5d 20 3c 3c 20 38 29 20 (vval[6] << 8)
c3a0: 7c 20 76 76 61 6c 5b 37 5d 3b 0a 09 09 09 09 63 | vval[7];.....c
c3b0: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 urr_entity->valu
c3c0: 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 e_cardurl->appid
c3d0: 20 3d 20 28 76 76 61 6c 5b 38 5d 20 3c 3c 20 38 = (vval[8] << 8
c3e0: 29 20 7c 20 76 76 61 6c 5b 39 5d 3b 0a 0a 09 09 ) | vval[9];....
c3f0: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 ..curr_entity->t
c400: 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 ag = tag;.....cu
c410: 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 rr_entity->_next
c420: 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 = NULL;......br
c430: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43 eak;....case GSC
c440: 49 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45 IS_TAG_ACR_TABLE
c450: 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 :.....curr_entit
c460: 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f y = malloc(sizeo
c470: 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29 f(*curr_entity))
c480: 3b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20 6d ;.....tmpbuf = m
c490: 61 6c 6c 6f 63 28 6c 65 6e 67 74 68 29 3b 0a 0a alloc(length);..
c4a0: 09 09 09 09 6d 65 6d 63 70 79 28 74 6d 70 62 75 ....memcpy(tmpbu
c4b0: 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 f, vval, length)
c4c0: 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 ;......curr_enti
c4d0: 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09 ty->tag = tag;..
c4e0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e ...curr_entity->
c4f0: 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b length = length;
c500: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 .....curr_entity
c510: 2d 3e 76 61 6c 75 65 20 3d 20 74 6d 70 62 75 66 ->value = tmpbuf
c520: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 ;.....curr_entit
c530: 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b y->_next = NULL;
c540: 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 ......break;....
c550: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 case GSCIS_TAG_C
c560: 45 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09 09 ERTIFICATE:.....
c570: 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 curr_entity = ma
c580: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 lloc(sizeof(*cur
c590: 72 5f 65 6e 74 69 74 79 29 29 3b 0a 0a 23 69 66 r_entity));..#if
c5a0: 64 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 09 09 def HAVE_LIBZ...
c5b0: 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 6c 65 ..tmpbuflen = le
c5c0: 6e 67 74 68 20 2a 20 32 3b 0a 09 09 09 09 74 6d ngth * 2;.....tm
c5d0: 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d pbuf = malloc(tm
c5e0: 70 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 75 pbuflen);......u
c5f0: 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 20 ncompress_ret =
c600: 75 6e 63 6f 6d 70 72 65 73 73 28 74 6d 70 62 75 uncompress(tmpbu
c610: 66 2c 20 26 74 6d 70 62 75 66 6c 65 6e 2c 20 76 f, &tmpbuflen, v
c620: 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 09 09 val, length);...
c630: 09 09 69 66 20 28 75 6e 63 6f 6d 70 72 65 73 73 ..if (uncompress
c640: 5f 72 65 74 20 21 3d 20 5a 5f 4f 4b 29 20 7b 0a _ret != Z_OK) {.
c650: 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
c660: 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 G_PRINTF("Failed
c670: 20 74 6f 20 64 65 63 6f 6d 70 72 65 73 73 2c 20 to decompress,
c680: 75 6e 63 6f 6d 70 72 65 73 73 28 29 20 72 65 74 uncompress() ret
c690: 75 72 6e 65 64 20 25 69 20 2d 2d 20 72 65 73 6f urned %i -- reso
c6a0: 72 74 69 6e 67 20 74 6f 20 64 69 72 65 63 74 20 rting to direct
c6b0: 63 6f 70 79 22 2c 20 75 6e 63 6f 6d 70 72 65 73 copy", uncompres
c6c0: 73 5f 72 65 74 29 3b 0a 0a 09 09 09 09 09 74 6d s_ret);.......tm
c6d0: 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 pbuflen = length
c6e0: 3b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 74 6d ;......memcpy(tm
c6f0: 70 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 pbuf, vval, leng
c700: 74 68 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 th);.....}......
c710: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
c720: 4e 54 42 55 46 28 22 44 65 63 6f 6d 70 72 65 73 NTBUF("Decompres
c730: 73 65 64 20 74 6f 3a 22 2c 20 74 6d 70 62 75 66 sed to:", tmpbuf
c740: 2c 20 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 23 65 , tmpbuflen);.#e
c750: 6c 73 65 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 lse.....CACKEY_D
c760: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 69 73 EBUG_PRINTF("Mis
c770: 73 69 6e 67 20 5a 4c 49 42 20 53 75 70 70 6f 72 sing ZLIB Suppor
c780: 74 2c 20 74 68 69 73 20 63 65 72 74 69 66 69 63 t, this certific
c790: 61 74 65 20 69 73 20 6c 69 6b 65 6c 79 20 75 73 ate is likely us
c7a0: 65 6c 65 73 73 2e 2e 2e 22 29 3b 0a 0a 09 09 09 eless...");.....
c7b0: 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e .tmpbuflen = len
c7c0: 67 74 68 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 gth;.....memcpy(
c7d0: 74 6d 70 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65 tmpbuf, vval, le
c7e0: 6e 67 74 68 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 ngth);.#endif...
c7f0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e ...curr_entity->
c800: 74 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 tag = tag;.....c
c810: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e 67 urr_entity->leng
c820: 74 68 20 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a th = tmpbuflen;.
c830: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d ....curr_entity-
c840: 3e 76 61 6c 75 65 20 3d 20 74 6d 70 62 75 66 3b >value = tmpbuf;
c850: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 .....curr_entity
c860: 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a ->_next = NULL;.
c870: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 .....break;....c
c880: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b ase GSCIS_TAG_PK
c890: 43 53 31 35 3a 0a 09 09 09 09 63 75 72 72 5f 65 CS15:.....curr_e
c8a0: 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 ntity = malloc(s
c8b0: 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 izeof(*curr_enti
c8c0: 74 79 29 29 3b 0a 0a 09 09 09 09 63 75 72 72 5f ty));......curr_
c8d0: 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61 entity->tag = ta
c8e0: 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 g;.....curr_enti
c8f0: 74 79 2d 3e 76 61 6c 75 65 5f 62 79 74 65 20 3d ty->value_byte =
c900: 20 76 76 61 6c 5b 30 5d 3b 0a 09 09 09 09 63 75 vval[0];.....cu
c910: 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 rr_entity->_next
c920: 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 = NULL;......br
c930: 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 76 76 61 6c eak;...}....vval
c940: 20 2b 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 76 6c += length;...vl
c950: 65 6e 20 2d 3d 20 6c 65 6e 67 74 68 3b 0a 0a 09 en -= length;...
c960: 09 69 66 20 28 63 75 72 72 5f 65 6e 74 69 74 79 .if (curr_entity
c970: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 != NULL) {....i
c980: 66 20 28 72 6f 6f 74 20 3d 3d 20 4e 55 4c 4c 29 f (root == NULL)
c990: 20 7b 0a 09 09 09 09 72 6f 6f 74 20 3d 20 63 75 {.....root = cu
c9a0: 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09 09 7d 0a rr_entity;....}.
c9b0: 0a 09 09 09 69 66 20 28 6c 61 73 74 20 21 3d 20 ....if (last !=
c9c0: 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 6c 61 73 74 NULL) {.....last
c9d0: 2d 3e 5f 6e 65 78 74 20 3d 20 63 75 72 72 5f 65 ->_next = curr_e
c9e0: 6e 74 69 74 79 3b 0a 09 09 09 7d 0a 0a 09 09 09 ntity;....}.....
c9f0: 6c 61 73 74 20 3d 20 63 75 72 72 5f 65 6e 74 69 last = curr_enti
ca00: 74 79 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 ty;...}..}...ret
ca10: 75 72 6e 28 72 6f 6f 74 29 3b 0a 7d 0a 0a 2f 2a urn(root);.}../*
ca20: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 . * SYNPOSIS. *
ca30: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 .... *. * AR
ca40: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e GUMENTS. * .
ca50: 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 ... *. * RETURN
ca60: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e VALUE. * ...
ca70: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 . *. * NOTES. *
ca80: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 .... *. */.s
ca90: 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 tatic void cacke
caa0: 79 5f 66 72 65 65 5f 63 65 72 74 73 28 73 74 72 y_free_certs(str
cab0: 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f uct cackey_pcsc_
cac0: 69 64 65 6e 74 69 74 79 20 2a 73 74 61 72 74 2c identity *start,
cad0: 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 69 size_t count, i
cae0: 6e 74 20 66 72 65 65 5f 73 74 61 72 74 29 20 7b nt free_start) {
caf0: 0a 09 73 69 7a 65 5f 74 20 69 64 78 3b 0a 0a 09 ..size_t idx;...
cb00: 69 66 20 28 73 74 61 72 74 20 3d 3d 20 4e 55 4c if (start == NUL
cb10: 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 L) {...return;..
cb20: 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 }...for (idx = 0
cb30: 3b 20 69 64 78 20 3c 20 63 6f 75 6e 74 3b 20 69 ; idx < count; i
cb40: 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 73 74 dx++) {...if (st
cb50: 61 72 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 art[idx].certifi
cb60: 63 61 74 65 29 20 7b 0a 09 09 09 66 72 65 65 28 cate) {....free(
cb70: 73 74 61 72 74 5b 69 64 78 5d 2e 63 65 72 74 69 start[idx].certi
cb80: 66 69 63 61 74 65 29 3b 0a 09 09 7d 0a 09 7d 0a ficate);...}..}.
cb90: 0a 09 69 66 20 28 66 72 65 65 5f 73 74 61 72 74 ..if (free_start
cba0: 29 20 7b 0a 09 09 66 72 65 65 28 73 74 61 72 74 ) {...free(start
cbb0: 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a );..}...return;.
cbc0: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 }../*. * SYNPOSI
cbd0: 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a S. * .... *.
cbe0: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 * ARGUMENTS. *
cbf0: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 .... *. * RE
cc00: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 TURN VALUE. *
cc10: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 .... *. * NOTE
cc20: 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a S. * .... *.
cc30: 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 */.static struc
cc40: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 t cackey_pcsc_id
cc50: 65 6e 74 69 74 79 20 2a 63 61 63 6b 65 79 5f 72 entity *cackey_r
cc60: 65 61 64 5f 63 65 72 74 73 28 73 74 72 75 63 74 ead_certs(struct
cc70: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c cackey_slot *sl
cc80: 6f 74 2c 20 73 74 72 75 63 74 20 63 61 63 6b 65 ot, struct cacke
cc90: 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 y_pcsc_identity
cca0: 2a 63 65 72 74 73 2c 20 75 6e 73 69 67 6e 65 64 *certs, unsigned
ccb0: 20 6c 6f 6e 67 20 2a 63 6f 75 6e 74 29 20 7b 0a long *count) {.
ccc0: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 .struct cackey_p
ccd0: 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 75 csc_identity *cu
cce0: 72 72 5f 69 64 3b 0a 09 73 74 72 75 63 74 20 63 rr_id;..struct c
ccf0: 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 ackey_tlv_entity
cd00: 20 2a 63 63 63 5f 74 6c 76 2c 20 2a 63 63 63 5f *ccc_tlv, *ccc_
cd10: 63 75 72 72 2c 20 2a 61 70 70 5f 74 6c 76 2c 20 curr, *app_tlv,
cd20: 2a 61 70 70 5f 63 75 72 72 3b 0a 09 75 6e 73 69 *app_curr;..unsi
cd30: 67 6e 65 64 20 63 68 61 72 20 63 63 63 5f 61 69 gned char ccc_ai
cd40: 64 5b 5d 20 3d 20 7b 47 53 43 49 53 5f 41 49 44 d[] = {GSCIS_AID
cd50: 5f 43 43 43 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 _CCC};..unsigned
cd60: 20 63 68 61 72 20 63 75 72 72 5f 61 69 64 5b 37 char curr_aid[7
cd70: 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e ];..unsigned lon
cd80: 67 20 6f 75 74 69 64 78 20 3d 20 30 3b 0a 09 63 g outidx = 0;..c
cd90: 61 63 6b 65 79 5f 72 65 74 20 74 72 61 6e 73 61 ackey_ret transa
cda0: 63 74 69 6f 6e 5f 72 65 74 3b 0a 09 69 6e 74 20 ction_ret;..int
cdb0: 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 3b certs_resizable;
cdc0: 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 2c 20 ..int send_ret,
cdd0: 73 65 6c 65 63 74 5f 72 65 74 3b 0a 0a 09 43 41 select_ret;...CA
cde0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
cdf0: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
ce00: 69 66 20 28 63 6f 75 6e 74 20 3d 3d 20 4e 55 4c if (count == NUL
ce10: 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 L) {...CACKEY_DE
ce20: 42 55 47 5f 50 52 49 4e 54 46 28 22 63 6f 75 6e BUG_PRINTF("coun
ce30: 74 20 69 73 20 4e 55 4c 4c 2c 20 72 65 74 75 72 t is NULL, retur
ce40: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 ning in failure"
ce50: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c );....return(NUL
ce60: 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 65 72 L);..}...if (cer
ce70: 74 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 ts != NULL) {...
ce80: 69 66 20 28 2a 63 6f 75 6e 74 20 3d 3d 20 30 29 if (*count == 0)
ce90: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 {....CACKEY_DEB
cea0: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 UG_PRINTF("Reque
ceb0: 73 74 65 64 20 77 65 20 72 65 74 75 72 6e 20 30 sted we return 0
cec0: 20 6f 62 6a 65 63 74 73 2c 20 73 68 6f 72 74 2d objects, short-
ced0: 63 69 72 63 75 69 74 22 29 3b 0a 0a 09 09 09 72 circuit");.....r
cee0: 65 74 75 72 6e 28 63 65 72 74 73 29 3b 0a 09 09 eturn(certs);...
cef0: 7d 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 }..}.../* Begin
cf00: 61 20 53 6d 61 72 74 43 61 72 64 20 74 72 61 6e a SmartCard tran
cf10: 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 74 72 61 6e saction */..tran
cf20: 73 61 63 74 69 6f 6e 5f 72 65 74 20 3d 20 63 61 saction_ret = ca
cf30: 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 ckey_begin_trans
cf40: 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 69 action(slot);..i
cf50: 66 20 28 74 72 61 6e 73 61 63 74 69 6f 6e 5f 72 f (transaction_r
cf60: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 et != CACKEY_PCS
cf70: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b C_S_OK) {...CACK
cf80: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
cf90: 22 55 6e 61 62 6c 65 20 62 65 67 69 6e 20 74 72 "Unable begin tr
cfa0: 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 75 72 ansaction, retur
cfb0: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 ning in failure"
cfc0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c );....return(NUL
cfd0: 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 65 72 L);..}...if (cer
cfe0: 74 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 ts == NULL) {...
cff0: 63 65 72 74 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 certs = malloc(s
d000: 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 izeof(*certs) *
d010: 35 29 3b 0a 09 09 2a 63 6f 75 6e 74 20 3d 20 35 5);...*count = 5
d020: 3b 0a 09 09 63 65 72 74 73 5f 72 65 73 69 7a 61 ;...certs_resiza
d030: 62 6c 65 20 3d 20 31 3b 0a 09 7d 20 65 6c 73 65 ble = 1;..} else
d040: 20 7b 0a 09 09 63 65 72 74 73 5f 72 65 73 69 7a {...certs_resiz
d050: 61 62 6c 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f able = 0;..}.../
d060: 2a 20 53 65 6c 65 63 74 20 74 68 65 20 43 43 43 * Select the CCC
d070: 20 41 70 70 6c 65 74 20 2a 2f 0a 09 73 65 6e 64 Applet */..send
d080: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 _ret = cackey_se
d090: 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 lect_applet(slot
d0a0: 2c 20 63 63 63 5f 61 69 64 2c 20 73 69 7a 65 6f , ccc_aid, sizeo
d0b0: 66 28 63 63 63 5f 61 69 64 29 29 3b 0a 09 69 66 f(ccc_aid));..if
d0c0: 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 (send_ret != CA
d0d0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 CKEY_PCSC_S_OK)
d0e0: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
d0f0: 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 _PRINTF("Unable
d100: 74 6f 20 73 65 6c 65 63 74 20 43 43 43 20 41 70 to select CCC Ap
d110: 70 6c 65 74 2c 20 72 65 74 75 72 6e 69 6e 67 20 plet, returning
d120: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 in failure");...
d130: 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20 53 6d ./* Terminate Sm
d140: 61 72 74 43 61 72 64 20 54 72 61 6e 73 61 63 74 artCard Transact
d150: 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f ion */...cackey_
d160: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 end_transaction(
d170: 73 6c 6f 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e slot);....return
d180: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 (NULL);..}.../*
d190: 52 65 61 64 20 61 6c 6c 20 74 68 65 20 61 70 70 Read all the app
d1a0: 6c 65 74 73 20 66 72 6f 6d 20 74 68 65 20 43 43 lets from the CC
d1b0: 43 27 73 20 54 4c 56 20 2a 2f 0a 09 63 63 63 5f C's TLV */..ccc_
d1c0: 74 6c 76 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 tlv = cackey_rea
d1d0: 64 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a 0a 09 2f d_tlv(slot);.../
d1e0: 2a 20 4c 6f 6f 6b 20 66 6f 72 20 43 41 52 44 55 * Look for CARDU
d1f0: 52 4c 73 20 74 68 61 74 20 63 6f 6f 72 65 73 70 RLs that cooresp
d200: 6f 6e 64 20 74 6f 20 50 4b 49 20 61 70 70 6c 65 ond to PKI apple
d210: 74 73 20 2a 2f 0a 09 66 6f 72 20 28 63 63 63 5f ts */..for (ccc_
d220: 63 75 72 72 20 3d 20 63 63 63 5f 74 6c 76 3b 20 curr = ccc_tlv;
d230: 63 63 63 5f 63 75 72 72 3b 20 63 63 63 5f 63 75 ccc_curr; ccc_cu
d240: 72 72 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e 5f rr = ccc_curr->_
d250: 6e 65 78 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 next) {...CACKEY
d260: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 _DEBUG_PRINTF("F
d270: 6f 75 6e 64 20 74 61 67 3a 20 25 73 20 2e 2e 2e ound tag: %s ...
d280: 20 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 ", CACKEY_DEBUG
d290: 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 _FUNC_TAG_TO_STR
d2a0: 28 63 63 63 5f 63 75 72 72 2d 3e 74 61 67 29 29 (ccc_curr->tag))
d2b0: 3b 0a 0a 09 09 69 66 20 28 63 63 63 5f 63 75 72 ;....if (ccc_cur
d2c0: 72 2d 3e 74 61 67 20 21 3d 20 47 53 43 49 53 5f r->tag != GSCIS_
d2d0: 54 41 47 5f 43 41 52 44 55 52 4c 29 20 7b 0a 09 TAG_CARDURL) {..
d2e0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
d2f0: 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b 69 RINTF(" ... ski
d300: 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f 6e 6c pping it (we onl
d310: 79 20 63 61 72 65 20 61 62 6f 75 74 20 43 41 52 y care about CAR
d320: 44 55 52 4c 73 29 22 29 3b 0a 0a 09 09 09 63 6f DURLs)");.....co
d330: 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 69 ntinue;...}....i
d340: 66 20 28 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 f ((ccc_curr->va
d350: 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 lue_cardurl->app
d360: 74 79 70 65 20 26 20 43 41 43 4b 45 59 5f 54 4c type & CACKEY_TL
d370: 56 5f 41 50 50 5f 50 4b 49 29 20 21 3d 20 43 41 V_APP_PKI) != CA
d380: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 CKEY_TLV_APP_PKI
d390: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 ) {....CACKEY_DE
d3a0: 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e BUG_PRINTF(" ..
d3b0: 2e 20 73 6b 69 70 70 69 6e 67 20 69 74 20 28 77 . skipping it (w
d3c0: 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 e only care abou
d3d0: 74 20 50 4b 49 20 61 70 70 6c 65 74 73 2c 20 74 t PKI applets, t
d3e0: 68 69 73 20 61 70 70 6c 65 74 20 73 75 70 70 6f his applet suppo
d3f0: 72 74 73 3a 20 25 73 2f 25 30 32 78 29 22 2c 20 rts: %s/%02x)",
d400: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e CACKEY_DEBUG_FUN
d410: 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53 54 52 C_APPTYPE_TO_STR
d420: 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 (ccc_curr->value
d430: 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 _cardurl->apptyp
d440: 65 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e e), (unsigned in
d450: 74 29 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c t) ccc_curr->val
d460: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 ue_cardurl->appt
d470: 79 70 65 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e ype);.....contin
d480: 75 65 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 ue;...}....CACKE
d490: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 Y_DEBUG_PRINTBUF
d4a0: 28 22 52 49 44 3a 22 2c 20 63 63 63 5f 63 75 72 ("RID:", ccc_cur
d4b0: 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c r->value_cardurl
d4c0: 2d 3e 72 69 64 2c 20 73 69 7a 65 6f 66 28 63 63 ->rid, sizeof(cc
d4d0: 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 c_curr->value_ca
d4e0: 72 64 75 72 6c 2d 3e 72 69 64 29 29 3b 0a 09 09 rdurl->rid));...
d4f0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
d500: 4e 54 46 28 22 41 70 70 49 44 20 3d 20 25 73 2f NTF("AppID = %s/
d510: 25 30 34 6c 78 22 2c 20 43 41 43 4b 45 59 5f 44 %04lx", CACKEY_D
d520: 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f EBUG_FUNC_OBJID_
d530: 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d TO_STR(ccc_curr-
d540: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e >value_cardurl->
d550: 61 70 70 69 64 29 2c 20 28 75 6e 73 69 67 6e 65 appid), (unsigne
d560: 64 20 6c 6f 6e 67 29 20 63 63 63 5f 63 75 72 72 d long) ccc_curr
d570: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d ->value_cardurl-
d580: 3e 61 70 70 69 64 29 3b 0a 09 09 43 41 43 4b 45 >appid);...CACKE
d590: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
d5a0: 4f 62 6a 65 63 74 49 44 20 3d 20 25 73 2f 25 30 ObjectID = %s/%0
d5b0: 34 6c 78 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 4lx", CACKEY_DEB
d5c0: 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f UG_FUNC_OBJID_TO
d5d0: 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 76 _STR(ccc_curr->v
d5e0: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 alue_cardurl->ob
d5f0: 6a 65 63 74 69 64 29 2c 20 28 75 6e 73 69 67 6e jectid), (unsign
d600: 65 64 20 6c 6f 6e 67 29 20 63 63 63 5f 63 75 72 ed long) ccc_cur
d610: 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c r->value_cardurl
d620: 2d 3e 6f 62 6a 65 63 74 69 64 29 3b 0a 0a 09 09 ->objectid);....
d630: 6d 65 6d 63 70 79 28 63 75 72 72 5f 61 69 64 2c memcpy(curr_aid,
d640: 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 ccc_curr->value
d650: 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20 73 _cardurl->rid, s
d660: 69 7a 65 6f 66 28 63 63 63 5f 63 75 72 72 2d 3e izeof(ccc_curr->
d670: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 value_cardurl->r
d680: 69 64 29 29 3b 0a 09 09 63 75 72 72 5f 61 69 64 id));...curr_aid
d690: 5b 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 69 64 [sizeof(curr_aid
d6a0: 29 20 2d 20 32 5d 20 3d 20 28 63 63 63 5f 63 75 ) - 2] = (ccc_cu
d6b0: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 rr->value_cardur
d6c0: 6c 2d 3e 61 70 70 69 64 20 3e 3e 20 38 29 20 26 l->appid >> 8) &
d6d0: 20 30 78 66 66 3b 0a 09 09 63 75 72 72 5f 61 69 0xff;...curr_ai
d6e0: 64 5b 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 69 d[sizeof(curr_ai
d6f0: 64 29 20 2d 20 31 5d 20 3d 20 63 63 63 5f 63 75 d) - 1] = ccc_cu
d700: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 rr->value_cardur
d710: 6c 2d 3e 61 70 70 69 64 20 26 20 30 78 66 66 3b l->appid & 0xff;
d720: 0a 0a 09 09 2f 2a 20 53 65 6c 65 63 74 20 66 6f ..../* Select fo
d730: 75 6e 64 20 61 70 70 6c 65 74 20 2e 2e 2e 20 2a und applet ... *
d740: 2f 0a 09 09 73 65 6c 65 63 74 5f 72 65 74 20 3d /...select_ret =
d750: 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 cackey_select_a
d760: 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63 75 72 72 pplet(slot, curr
d770: 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 63 75 72 _aid, sizeof(cur
d780: 72 5f 61 69 64 29 29 3b 0a 09 09 69 66 20 28 73 r_aid));...if (s
d790: 65 6c 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 elect_ret != CAC
d7a0: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b KEY_PCSC_S_OK) {
d7b0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
d7c0: 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 _PRINTF("Failed
d7d0: 74 6f 20 73 65 6c 65 63 74 20 61 70 70 6c 65 74 to select applet
d7e0: 2c 20 73 6b 69 70 70 69 6e 67 20 70 72 6f 63 65 , skipping proce
d7f0: 73 73 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 62 ssing of this ob
d800: 6a 65 63 74 22 29 3b 0a 0a 09 09 09 63 6f 6e 74 ject");.....cont
d810: 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 inue;...}..../*
d820: 2e 2e 2e 20 61 6e 64 20 6f 62 6a 65 63 74 20 28 ... and object (
d830: 66 69 6c 65 29 20 2a 2f 0a 09 09 73 65 6c 65 63 file) */...selec
d840: 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 t_ret = cackey_s
d850: 65 6c 65 63 74 5f 66 69 6c 65 28 73 6c 6f 74 2c elect_file(slot,
d860: 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 ccc_curr->value
d870: 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 _cardurl->object
d880: 69 64 29 3b 0a 09 09 69 66 20 28 73 65 6c 65 63 id);...if (selec
d890: 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f t_ret != CACKEY_
d8a0: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 PCSC_S_OK) {....
d8b0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
d8c0: 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73 NTF("Failed to s
d8d0: 65 6c 65 63 74 20 66 69 6c 65 2c 20 73 6b 69 70 elect file, skip
d8e0: 70 69 6e 67 20 70 72 6f 63 65 73 73 69 6e 67 20 ping processing
d8f0: 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 22 29 of this object")
d900: 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a ;.....continue;.
d910: 09 09 7d 0a 0a 09 09 2f 2a 20 50 72 6f 63 65 73 ..}..../* Proces
d920: 73 20 74 68 69 73 20 66 69 6c 65 27 73 20 54 4c s this file's TL
d930: 56 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 63 65 V looking for ce
d940: 72 74 69 66 69 63 61 74 65 73 20 2a 2f 0a 09 09 rtificates */...
d950: 61 70 70 5f 74 6c 76 20 3d 20 63 61 63 6b 65 79 app_tlv = cackey
d960: 5f 72 65 61 64 5f 74 6c 76 28 73 6c 6f 74 29 3b _read_tlv(slot);
d970: 0a 0a 09 09 66 6f 72 20 28 61 70 70 5f 63 75 72 ....for (app_cur
d980: 72 20 3d 20 61 70 70 5f 74 6c 76 3b 20 61 70 70 r = app_tlv; app
d990: 5f 63 75 72 72 3b 20 61 70 70 5f 63 75 72 72 20 _curr; app_curr
d9a0: 3d 20 61 70 70 5f 63 75 72 72 2d 3e 5f 6e 65 78 = app_curr->_nex
d9b0: 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 t) {....CACKEY_D
d9c0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 EBUG_PRINTF("Fou
d9d0: 6e 64 20 74 61 67 3a 20 25 73 22 2c 20 43 41 43 nd tag: %s", CAC
d9e0: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 KEY_DEBUG_FUNC_T
d9f0: 41 47 5f 54 4f 5f 53 54 52 28 61 70 70 5f 63 75 AG_TO_STR(app_cu
da00: 72 72 2d 3e 74 61 67 29 29 3b 0a 09 09 09 69 66 rr->tag));....if
da10: 20 28 61 70 70 5f 63 75 72 72 2d 3e 74 61 67 20 (app_curr->tag
da20: 21 3d 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 != GSCIS_TAG_CER
da30: 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09 TIFICATE) {.....
da40: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
da50: 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70 70 NTF(" ... skipp
da60: 69 6e 67 20 69 74 20 28 77 65 20 6f 6e 6c 79 20 ing it (we only
da70: 63 61 72 65 20 61 62 6f 75 74 20 43 45 52 54 49 care about CERTI
da80: 46 49 43 41 54 45 73 29 22 29 3b 0a 0a 09 09 09 FICATEs)");.....
da90: 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a .continue;....}.
daa0: 0a 09 09 09 63 75 72 72 5f 69 64 20 3d 20 26 63 ....curr_id = &c
dab0: 65 72 74 73 5b 6f 75 74 69 64 78 5d 3b 0a 09 09 erts[outidx];...
dac0: 09 6f 75 74 69 64 78 2b 2b 3b 0a 0a 09 09 09 6d .outidx++;.....m
dad0: 65 6d 63 70 79 28 63 75 72 72 5f 69 64 2d 3e 61 emcpy(curr_id->a
dae0: 70 70 6c 65 74 2c 20 63 75 72 72 5f 61 69 64 2c pplet, curr_aid,
daf0: 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 69 64 2d sizeof(curr_id-
db00: 3e 61 70 70 6c 65 74 29 29 3b 0a 09 09 09 63 75 >applet));....cu
db10: 72 72 5f 69 64 2d 3e 66 69 6c 65 20 3d 20 63 63 rr_id->file = cc
db20: 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 c_curr->value_ca
db30: 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 3b rdurl->objectid;
db40: 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 6b 65 79 ....curr_id->key
db50: 73 69 7a 65 20 3d 20 2d 31 3b 0a 0a 09 09 09 43 size = -1;.....C
db60: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
db70: 54 46 28 22 46 69 6c 6c 69 6e 67 20 63 75 72 72 TF("Filling curr
db80: 5f 69 64 2d 3e 61 70 70 6c 65 74 20 28 25 70 29 _id->applet (%p)
db90: 20 77 69 74 68 20 25 6c 75 20 62 79 74 65 73 3a with %lu bytes:
dba0: 22 2c 20 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c ", curr_id->appl
dbb0: 65 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f et, (unsigned lo
dbc0: 6e 67 29 20 73 69 7a 65 6f 66 28 63 75 72 72 5f ng) sizeof(curr_
dbd0: 69 64 2d 3e 61 70 70 6c 65 74 29 29 3b 0a 09 09 id->applet));...
dbe0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
dbf0: 49 4e 54 42 55 46 28 22 56 41 4c 3a 22 2c 20 63 INTBUF("VAL:", c
dc00: 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 2c 20 urr_id->applet,
dc10: 73 69 7a 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e sizeof(curr_id->
dc20: 61 70 70 6c 65 74 29 29 3b 0a 0a 09 09 09 63 75 applet));.....cu
dc30: 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 rr_id->certifica
dc40: 74 65 5f 6c 65 6e 20 3d 20 61 70 70 5f 63 75 72 te_len = app_cur
dc50: 72 2d 3e 6c 65 6e 67 74 68 3b 0a 0a 09 09 09 63 r->length;.....c
dc60: 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 urr_id->certific
dc70: 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 ate = malloc(cur
dc80: 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 r_id->certificat
dc90: 65 5f 6c 65 6e 29 3b 0a 09 09 09 6d 65 6d 63 70 e_len);....memcp
dca0: 79 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 y(curr_id->certi
dcb0: 66 69 63 61 74 65 2c 20 61 70 70 5f 63 75 72 72 ficate, app_curr
dcc0: 2d 3e 76 61 6c 75 65 2c 20 63 75 72 72 5f 69 64 ->value, curr_id
dcd0: 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 ->certificate_le
dce0: 6e 29 3b 0a 0a 09 09 09 69 66 20 28 6f 75 74 69 n);.....if (outi
dcf0: 64 78 20 3e 3d 20 2a 63 6f 75 6e 74 29 20 7b 0a dx >= *count) {.
dd00: 09 09 09 09 69 66 20 28 63 65 72 74 73 5f 72 65 ....if (certs_re
dd10: 73 69 7a 61 62 6c 65 29 20 7b 0a 09 09 09 09 09 sizable) {......
dd20: 2a 63 6f 75 6e 74 20 2a 3d 20 32 3b 0a 09 09 09 *count *= 2;....
dd30: 09 09 63 65 72 74 73 20 3d 20 72 65 61 6c 6c 6f ..certs = reallo
dd40: 63 28 63 65 72 74 73 2c 20 73 69 7a 65 6f 66 28 c(certs, sizeof(
dd50: 2a 63 65 72 74 73 29 20 2a 20 28 2a 63 6f 75 6e *certs) * (*coun
dd60: 74 29 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 t));.....} else
dd70: 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 {......break;...
dd80: 09 09 7d 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 ..}....}...}....
dd90: 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 cackey_free_tlv(
dda0: 61 70 70 5f 74 6c 76 29 3b 0a 0a 09 09 69 66 20 app_tlv);....if
ddb0: 28 6f 75 74 69 64 78 20 3e 3d 20 2a 63 6f 75 6e (outidx >= *coun
ddc0: 74 29 20 7b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 t) {....break;..
ddd0: 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 66 .}..}...cackey_f
dde0: 72 65 65 5f 74 6c 76 28 63 63 63 5f 74 6c 76 29 ree_tlv(ccc_tlv)
ddf0: 3b 0a 0a 09 2a 63 6f 75 6e 74 20 3d 20 6f 75 74 ;...*count = out
de00: 69 64 78 3b 0a 0a 09 69 66 20 28 63 65 72 74 73 idx;...if (certs
de10: 5f 72 65 73 69 7a 61 62 6c 65 29 20 7b 0a 09 09 _resizable) {...
de20: 63 65 72 74 73 20 3d 20 72 65 61 6c 6c 6f 63 28 certs = realloc(
de30: 63 65 72 74 73 2c 20 73 69 7a 65 6f 66 28 2a 63 certs, sizeof(*c
de40: 65 72 74 73 29 20 2a 20 28 2a 63 6f 75 6e 74 29 erts) * (*count)
de50: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 65 72 6d 69 );..}.../* Termi
de60: 6e 61 74 65 20 53 6d 61 72 74 43 61 72 64 20 54 nate SmartCard T
de70: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 ransaction */..c
de80: 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 ackey_end_transa
de90: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 72 ction(slot);...r
dea0: 65 74 75 72 6e 28 63 65 72 74 73 29 3b 0a 7d 0a eturn(certs);.}.
deb0: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a ./*. * SYNPOSIS.
dec0: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a * .... *. *
ded0: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 ARGUMENTS. *
dee0: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 .... *. * RETU
def0: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 RN VALUE. *
df00: 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a .... *. * NOTES.
df10: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a * .... *. *
df20: 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f 74 /.static ssize_t
df30: 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 cackey_signdecr
df40: 79 70 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 ypt(struct cacke
df50: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 73 74 y_slot *slot, st
df60: 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e ruct cackey_iden
df70: 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79 2c 20 tity *identity,
df80: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 unsigned char *b
df90: 75 66 2c 20 73 69 7a 65 5f 74 20 62 75 66 6c 65 uf, size_t bufle
dfa0: 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 n, unsigned char
dfb0: 20 2a 6f 75 74 62 75 66 2c 20 73 69 7a 65 5f 74 *outbuf, size_t
dfc0: 20 6f 75 74 62 75 66 6c 65 6e 2c 20 69 6e 74 20 outbuflen, int
dfd0: 70 61 64 49 6e 70 75 74 2c 20 69 6e 74 20 75 6e padInput, int un
dfe0: 70 61 64 4f 75 74 70 75 74 29 20 7b 0a 09 75 6e padOutput) {..un
dff0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 6d 70 signed char *tmp
e000: 62 75 66 2c 20 2a 74 6d 70 62 75 66 5f 73 2c 20 buf, *tmpbuf_s,
e010: 2a 6f 75 74 62 75 66 5f 73 3b 0a 09 75 6e 73 69 *outbuf_s;..unsi
e020: 67 6e 65 64 20 63 68 61 72 20 62 79 74 65 73 5f gned char bytes_
e030: 74 6f 5f 73 65 6e 64 2c 20 70 31 3b 0a 09 75 6e to_send, p1;..un
e040: 73 69 67 6e 65 64 20 63 68 61 72 20 62 6c 6f 63 signed char bloc
e050: 6b 74 79 70 65 3b 0a 09 63 61 63 6b 65 79 5f 72 ktype;..cackey_r
e060: 65 74 20 73 65 6e 64 5f 72 65 74 3b 0a 09 75 69 et send_ret;..ui
e070: 6e 74 31 36 5f 74 20 72 65 73 70 63 6f 64 65 3b nt16_t respcode;
e080: 0a 09 73 73 69 7a 65 5f 74 20 72 65 74 76 61 6c ..ssize_t retval
e090: 20 3d 20 30 2c 20 75 6e 70 61 64 6f 66 66 73 65 = 0, unpadoffse
e0a0: 74 3b 0a 09 73 69 7a 65 5f 74 20 74 6d 70 62 75 t;..size_t tmpbu
e0b0: 66 6c 65 6e 2c 20 70 61 64 6c 65 6e 2c 20 74 6d flen, padlen, tm
e0c0: 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 69 6e 74 poutbuflen;..int
e0d0: 20 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 free_tmpbuf = 0
e0e0: 3b 0a 09 69 6e 74 20 6c 65 3b 0a 0a 09 43 41 43 ;..int le;...CAC
e0f0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
e100: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 ("Called.");...i
e110: 66 20 28 73 6c 6f 74 20 3d 3d 20 4e 55 4c 4c 29 f (slot == NULL)
e120: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
e130: 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
e140: 20 20 73 6c 6f 74 20 69 73 20 4e 55 4c 4c 22 29 slot is NULL")
e150: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b ;....return(-1);
e160: 0a 09 7d 0a 0a 09 69 66 20 28 62 75 66 20 3d 3d ..}...if (buf ==
e170: 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 NULL) {...CACKE
e180: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
e190: 45 72 72 6f 72 2e 20 20 62 75 66 20 69 73 20 4e Error. buf is N
e1a0: 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ULL");....return
e1b0: 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f (-1);..}...if (o
e1c0: 75 74 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b utbuf == NULL) {
e1d0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
e1e0: 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
e1f0: 6f 75 74 62 75 66 20 69 73 20 4e 55 4c 4c 22 29 outbuf is NULL")
e200: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b ;....return(-1);
e210: 0a 09 7d 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 ..}...if (identi
e220: 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 ty == NULL) {...
e230: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
e240: 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64 65 NTF("Error. ide
e250: 6e 74 69 74 79 20 69 73 20 4e 55 4c 4c 22 29 3b ntity is NULL");
e260: 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a ....return(-1);.
e270: 09 7d 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74 .}...if (identit
e280: 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 y->pcsc_identity
e290: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 == NULL) {...CA
e2a0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
e2b0: 46 28 22 45 72 72 6f 72 2e 20 20 69 64 65 6e 74 F("Error. ident
e2c0: 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 ity->pcsc_identi
e2d0: 74 79 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 ty is NULL");...
e2e0: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a .return(-1);..}.
e2f0: 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 ../* Determine i
e300: 64 65 6e 74 69 74 79 20 4b 65 79 20 73 69 7a 65 dentity Key size
e310: 20 2a 2f 0a 09 69 66 20 28 69 64 65 6e 74 69 74 */..if (identit
e320: 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 y->pcsc_identity
e330: 2d 3e 6b 65 79 73 69 7a 65 20 3c 20 30 29 20 7b ->keysize < 0) {
e340: 0a 09 09 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 ...identity->pcs
e350: 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 c_identity->keys
e360: 69 7a 65 20 3d 20 78 35 30 39 5f 74 6f 5f 6b 65 ize = x509_to_ke
e370: 79 73 69 7a 65 28 69 64 65 6e 74 69 74 79 2d 3e ysize(identity->
e380: 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 pcsc_identity->c
e390: 65 72 74 69 66 69 63 61 74 65 2c 20 69 64 65 6e ertificate, iden
e3a0: 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 tity->pcsc_ident
e3b0: 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 ity->certificate
e3c0: 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 50 _len);..}.../* P
e3d0: 61 64 20 6d 65 73 73 61 67 65 20 74 6f 20 6b 65 ad message to ke
e3e0: 79 20 73 69 7a 65 20 2a 2f 0a 09 69 66 20 28 70 y size */..if (p
e3f0: 61 64 49 6e 70 75 74 29 20 7b 0a 09 09 69 66 20 adInput) {...if
e400: 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f (identity->pcsc_
e410: 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a identity->keysiz
e420: 65 20 3e 20 30 29 20 7b 0a 09 09 09 69 66 20 28 e > 0) {....if (
e430: 62 75 66 6c 65 6e 20 21 3d 20 69 64 65 6e 74 69 buflen != identi
e440: 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 ty->pcsc_identit
e450: 79 2d 3e 6b 65 79 73 69 7a 65 29 20 7b 0a 09 09 y->keysize) {...
e460: 09 09 69 66 20 28 62 75 66 6c 65 6e 20 3e 20 28 ..if (buflen > (
e470: 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 identity->pcsc_i
e480: 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 dentity->keysize
e490: 20 2b 20 33 29 29 20 7b 0a 09 09 09 09 09 43 41 + 3)) {......CA
e4a0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
e4b0: 46 28 22 45 72 72 6f 72 2e 20 20 4d 65 73 73 61 F("Error. Messa
e4c0: 67 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 ge is too large
e4d0: 74 6f 20 73 69 67 6e 2f 64 65 63 72 79 70 74 22 to sign/decrypt"
e4e0: 29 3b 0a 0a 09 09 09 09 09 72 65 74 75 72 6e 28 );.......return(
e4f0: 2d 31 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 -1);.....}......
e500: 74 6d 70 62 75 66 6c 65 6e 20 3d 20 69 64 65 6e tmpbuflen = iden
e510: 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 tity->pcsc_ident
e520: 69 74 79 2d 3e 6b 65 79 73 69 7a 65 3b 0a 09 09 ity->keysize;...
e530: 09 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f ..tmpbuf = mallo
e540: 63 28 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 09 09 c(tmpbuflen);...
e550: 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 ..free_tmpbuf =
e560: 31 3b 0a 0a 09 09 09 09 70 61 64 6c 65 6e 20 3d 1;......padlen =
e570: 20 74 6d 70 62 75 66 6c 65 6e 20 2d 20 62 75 66 tmpbuflen - buf
e580: 6c 65 6e 20 2d 20 33 3b 0a 0a 09 09 09 09 2f 2a len - 3;....../*
e590: 20 52 53 41 20 50 4b 43 53 23 31 20 45 4d 53 41 RSA PKCS#1 EMSA
e5a0: 2d 50 4b 43 53 31 2d 76 31 5f 35 20 50 61 64 64 -PKCS1-v1_5 Padd
e5b0: 69 6e 67 20 2a 2f 0a 09 09 09 09 74 6d 70 62 75 ing */.....tmpbu
e5c0: 66 5b 30 5d 20 3d 20 30 78 30 30 3b 0a 09 09 09 f[0] = 0x00;....
e5d0: 09 74 6d 70 62 75 66 5b 31 5d 20 3d 20 30 78 30 .tmpbuf[1] = 0x0
e5e0: 31 3b 0a 09 09 09 09 6d 65 6d 73 65 74 28 26 74 1;.....memset(&t
e5f0: 6d 70 62 75 66 5b 32 5d 2c 20 30 78 46 46 2c 20 mpbuf[2], 0xFF,
e600: 70 61 64 6c 65 6e 29 3b 0a 09 09 09 09 74 6d 70 padlen);.....tmp
e610: 62 75 66 5b 70 61 64 6c 65 6e 20 2b 20 32 5d 3d buf[padlen + 2]=
e620: 20 30 78 30 30 3b 0a 09 09 09 09 6d 65 6d 63 70 0x00;.....memcp
e630: 79 28 26 74 6d 70 62 75 66 5b 70 61 64 6c 65 6e y(&tmpbuf[padlen
e640: 20 2b 20 33 5d 2c 20 62 75 66 2c 20 62 75 66 6c + 3], buf, bufl
e650: 65 6e 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 en);......CACKEY
e660: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 _DEBUG_PRINTBUF(
e670: 22 55 6e 70 61 64 64 65 64 3a 22 2c 20 62 75 66 "Unpadded:", buf
e680: 2c 20 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 43 , buflen);.....C
e690: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
e6a0: 54 42 55 46 28 22 50 61 64 64 65 64 3a 22 2c 20 TBUF("Padded:",
e6b0: 74 6d 70 62 75 66 2c 20 74 6d 70 62 75 66 6c 65 tmpbuf, tmpbufle
e6c0: 6e 29 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a n);....} else {.
e6d0: 09 09 09 09 74 6d 70 62 75 66 20 3d 20 62 75 66 ....tmpbuf = buf
e6e0: 3b 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 ;.....tmpbuflen
e6f0: 3d 20 62 75 66 6c 65 6e 3b 0a 09 09 09 09 66 72 = buflen;.....fr
e700: 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09 ee_tmpbuf = 0;..
e710: 09 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b 0a 09 ...padlen = 0;..
e720: 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 ..}...} else {..
e730: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
e740: 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f RINTF("Unable to
e750: 20 64 65 74 65 72 6d 69 6e 65 20 6b 65 79 20 73 determine key s
e760: 69 7a 65 2c 20 68 6f 70 69 6e 67 20 74 68 65 20 ize, hoping the
e770: 6d 65 73 73 61 67 65 20 69 73 20 70 72 6f 70 65 message is prope
e780: 72 6c 79 20 70 61 64 64 65 64 21 22 29 3b 0a 0a rly padded!");..
e790: 09 09 09 74 6d 70 62 75 66 20 3d 20 62 75 66 3b ...tmpbuf = buf;
e7a0: 0a 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 ....tmpbuflen =
e7b0: 62 75 66 6c 65 6e 3b 0a 09 09 09 66 72 65 65 5f buflen;....free_
e7c0: 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09 09 70 tmpbuf = 0;....p
e7d0: 61 64 6c 65 6e 20 3d 20 30 3b 0a 09 09 7d 0a 09 adlen = 0;...}..
e7e0: 7d 20 65 6c 73 65 20 7b 0a 09 09 74 6d 70 62 75 } else {...tmpbu
e7f0: 66 20 3d 20 62 75 66 3b 0a 09 09 74 6d 70 62 75 f = buf;...tmpbu
e800: 66 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 09 flen = buflen;..
e810: 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 .free_tmpbuf = 0
e820: 3b 0a 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b 0a ;...padlen = 0;.
e830: 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 74 72 .}.../* Begin tr
e840: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 ansaction */..ca
e850: 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 ckey_begin_trans
e860: 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 action(slot);...
e870: 2f 2a 20 53 65 6c 65 63 74 20 63 6f 72 72 65 63 /* Select correc
e880: 74 20 61 70 70 6c 65 74 20 2a 2f 0a 09 43 41 43 t applet */..CAC
e890: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
e8a0: 28 22 53 65 6c 65 63 74 69 6e 67 20 61 70 70 6c ("Selecting appl
e8b0: 65 74 20 66 6f 75 6e 64 20 61 74 20 25 70 20 2e et found at %p .
e8c0: 2e 2e 22 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 ..", identity->p
e8d0: 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 61 70 csc_identity->ap
e8e0: 70 6c 65 74 29 3b 0a 09 63 61 63 6b 65 79 5f 73 plet);..cackey_s
e8f0: 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f elect_applet(slo
e900: 74 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 t, identity->pcs
e910: 63 5f 69 64 65 6e 74 69 74 79 2d 3e 61 70 70 6c c_identity->appl
e920: 65 74 2c 20 73 69 7a 65 6f 66 28 69 64 65 6e 74 et, sizeof(ident
e930: 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 ity->pcsc_identi
e940: 74 79 2d 3e 61 70 70 6c 65 74 29 29 3b 0a 0a 09 ty->applet));...
e950: 2f 2a 20 53 65 6c 65 63 74 20 63 6f 72 72 65 63 /* Select correc
e960: 74 20 66 69 6c 65 20 2a 2f 0a 09 63 61 63 6b 65 t file */..cacke
e970: 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 6c y_select_file(sl
e980: 6f 74 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 ot, identity->pc
e990: 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 66 69 6c sc_identity->fil
e9a0: 65 29 3b 0a 0a 09 74 6d 70 62 75 66 5f 73 20 3d e);...tmpbuf_s =
e9b0: 20 74 6d 70 62 75 66 3b 0a 09 6f 75 74 62 75 66 tmpbuf;..outbuf
e9c0: 5f 73 20 3d 20 6f 75 74 62 75 66 3b 0a 09 77 68 _s = outbuf;..wh
e9d0: 69 6c 65 20 28 74 6d 70 62 75 66 6c 65 6e 29 20 ile (tmpbuflen)
e9e0: 7b 0a 09 09 69 66 20 28 74 6d 70 62 75 66 6c 65 {...if (tmpbufle
e9f0: 6e 20 3e 20 32 34 35 29 20 7b 0a 09 09 09 62 79 n > 245) {....by
ea00: 74 65 73 5f 74 6f 5f 73 65 6e 64 20 3d 20 32 34 tes_to_send = 24
ea10: 35 3b 0a 09 09 09 70 31 20 3d 20 30 78 38 30 3b 5;....p1 = 0x80;
ea20: 0a 09 09 09 6c 65 20 3d 20 30 78 30 30 3b 0a 09 ....le = 0x00;..
ea30: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 62 79 74 .} else {....byt
ea40: 65 73 5f 74 6f 5f 73 65 6e 64 20 3d 20 74 6d 70 es_to_send = tmp
ea50: 62 75 66 6c 65 6e 3b 0a 09 09 09 70 31 20 3d 20 buflen;....p1 =
ea60: 30 78 30 30 3b 0a 09 09 09 6c 65 20 3d 20 30 78 0x00;....le = 0x
ea70: 30 30 3b 0a 09 09 7d 0a 0a 09 09 74 6d 70 6f 75 00;...}....tmpou
ea80: 74 62 75 66 6c 65 6e 20 3d 20 6f 75 74 62 75 66 tbuflen = outbuf
ea90: 6c 65 6e 3b 0a 0a 09 09 73 65 6e 64 5f 72 65 74 len;....send_ret
eaa0: 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 = cackey_send_a
eab0: 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f pdu(slot, GSCIS_
eac0: 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 CLASS_GLOBAL_PLA
ead0: 54 46 4f 52 4d 2c 20 47 53 43 49 53 5f 49 4e 53 TFORM, GSCIS_INS
eae0: 54 52 5f 53 49 47 4e 44 45 43 52 59 50 54 2c 20 TR_SIGNDECRYPT,
eaf0: 70 31 2c 20 30 78 30 30 2c 20 62 79 74 65 73 5f p1, 0x00, bytes_
eb00: 74 6f 5f 73 65 6e 64 2c 20 74 6d 70 62 75 66 2c to_send, tmpbuf,
eb10: 20 6c 65 2c 20 26 72 65 73 70 63 6f 64 65 2c 20 le, &respcode,
eb20: 6f 75 74 62 75 66 2c 20 26 74 6d 70 6f 75 74 62 outbuf, &tmpoutb
eb30: 75 66 6c 65 6e 29 3b 0a 09 09 69 66 20 28 73 65 uflen);...if (se
eb40: 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 nd_ret != CACKEY
eb50: 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 _PCSC_S_OK) {...
eb60: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
eb70: 49 4e 54 46 28 22 41 44 50 55 20 53 65 6e 64 69 INTF("ADPU Sendi
eb80: 6e 67 20 46 61 69 6c 65 64 20 2d 2d 20 72 65 74 ng Failed -- ret
eb90: 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 2e urning in error.
eba0: 22 29 3b 0a 0a 09 09 09 69 66 20 28 66 72 65 65 ");.....if (free
ebb0: 5f 74 6d 70 62 75 66 29 20 7b 0a 09 09 09 09 69 _tmpbuf) {.....i
ebc0: 66 20 28 74 6d 70 62 75 66 5f 73 29 20 7b 0a 09 f (tmpbuf_s) {..
ebd0: 09 09 09 09 66 72 65 65 28 74 6d 70 62 75 66 5f ....free(tmpbuf_
ebe0: 73 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a s);.....}....}..
ebf0: 09 09 09 2f 2a 20 45 6e 64 20 74 72 61 6e 73 61 .../* End transa
ec00: 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b ction */....cack
ec10: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 ey_end_transacti
ec20: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 69 66 on(slot);.....if
ec30: 20 28 72 65 73 70 63 6f 64 65 20 3d 3d 20 30 78 (respcode == 0x
ec40: 36 39 38 32 29 20 7b 0a 09 09 09 09 43 41 43 4b 6982) {.....CACK
ec50: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
ec60: 22 53 65 63 75 72 69 74 79 20 73 74 61 74 75 73 "Security status
ec70: 20 6e 6f 74 20 73 61 74 69 73 69 66 69 65 64 2e not satisified.
ec80: 20 20 52 65 74 75 72 6e 69 6e 67 20 4e 45 45 44 Returning NEED
ec90: 4c 4f 47 49 4e 22 29 3b 0a 0a 09 09 09 09 63 61 LOGIN");......ca
eca0: 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 ckey_mark_slot_r
ecb0: 65 73 65 74 28 73 6c 6f 74 29 3b 0a 09 09 09 09 eset(slot);.....
ecc0: 73 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67 slot->token_flag
ecd0: 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 s = CKF_LOGIN_RE
ece0: 51 55 49 52 45 44 3b 0a 0a 09 09 09 09 72 65 74 QUIRED;......ret
ecf0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f urn(CACKEY_PCSC_
ed00: 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 3b 0a 09 09 E_NEEDLOGIN);...
ed10: 09 7d 0a 0a 09 09 09 69 66 20 28 73 65 6e 64 5f .}.....if (send_
ed20: 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 ret == CACKEY_PC
ed30: 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 SC_E_TOKENABSENT
ed40: 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 ) {.....CACKEY_D
ed50: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 6f 6b EBUG_PRINTF("Tok
ed60: 65 6e 20 61 62 73 65 6e 74 2e 20 20 52 65 74 75 en absent. Retu
ed70: 72 6e 69 6e 67 20 54 4f 4b 45 4e 41 42 53 45 4e rning TOKENABSEN
ed80: 54 22 29 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79 T");......cackey
ed90: 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 _mark_slot_reset
eda0: 28 73 6c 6f 74 29 3b 0a 09 09 09 09 73 6c 6f 74 (slot);.....slot
edb0: 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 ->token_flags =
edc0: 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 CKF_LOGIN_REQUIR
edd0: 45 44 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 ED;......return(
ede0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f CACKEY_PCSC_E_TO
edf0: 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 7d KENABSENT);....}
ee00: 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b .....return(-1);
ee10: 0a 09 09 7d 0a 0a 09 09 74 6d 70 62 75 66 20 2b ...}....tmpbuf +
ee20: 3d 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 3b = bytes_to_send;
ee30: 0a 09 09 74 6d 70 62 75 66 6c 65 6e 20 2d 3d 20 ...tmpbuflen -=
ee40: 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 3b 0a 0a bytes_to_send;..
ee50: 09 09 6f 75 74 62 75 66 20 2b 3d 20 74 6d 70 6f ..outbuf += tmpo
ee60: 75 74 62 75 66 6c 65 6e 3b 0a 09 09 6f 75 74 62 utbuflen;...outb
ee70: 75 66 6c 65 6e 20 2d 3d 20 74 6d 70 6f 75 74 62 uflen -= tmpoutb
ee80: 75 66 6c 65 6e 3b 0a 09 09 72 65 74 76 61 6c 20 uflen;...retval
ee90: 2b 3d 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b += tmpoutbuflen;
eea0: 0a 09 7d 0a 0a 09 69 66 20 28 66 72 65 65 5f 74 ..}...if (free_t
eeb0: 6d 70 62 75 66 29 20 7b 0a 09 09 69 66 20 28 74 mpbuf) {...if (t
eec0: 6d 70 62 75 66 5f 73 29 20 7b 0a 09 09 09 66 72 mpbuf_s) {....fr
eed0: 65 65 28 74 6d 70 62 75 66 5f 73 29 3b 0a 09 09 ee(tmpbuf_s);...
eee0: 7d 0a 09 7d 0a 0a 09 6f 75 74 62 75 66 20 3d 20 }..}...outbuf =
eef0: 6f 75 74 62 75 66 5f 73 3b 0a 0a 09 2f 2a 20 45 outbuf_s;.../* E
ef00: 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a nd transaction *
ef10: 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 /..cackey_end_tr
ef20: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b ansaction(slot);
ef30: 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f ..#ifdef CACKEY_
ef40: 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 PARANOID.# ifde
ef50: 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d f _POSIX_SSIZE_M
ef60: 41 58 0a 09 69 66 20 28 6f 75 74 62 75 66 6c 65 AX..if (outbufle
ef70: 6e 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 n > _POSIX_SSIZE
ef80: 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 _MAX) {...CACKEY
ef90: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f _DEBUG_PRINTF("O
efa0: 75 74 62 75 66 6c 65 6e 20 65 78 63 65 65 64 73 utbuflen exceeds
efb0: 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20 maximum value,
efc0: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 returning in fai
efd0: 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69 lure. (max = %li
efe0: 2c 20 6f 75 74 62 75 66 6c 65 6e 20 3d 20 25 6c , outbuflen = %l
eff0: 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 u)", (long) _POS
f000: 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75 IX_SSIZE_MAX, (u
f010: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 75 nsigned long) ou
f020: 74 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 tbuflen);....ret
f030: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 urn(-1);..}.# e
f040: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a ndif.#endif.../*
f050: 20 55 6e 70 61 64 20 72 65 70 6c 79 20 2a 2f 0a Unpad reply */.
f060: 09 69 66 20 28 75 6e 70 61 64 4f 75 74 70 75 74 .if (unpadOutput
f070: 29 20 7b 0a 09 09 69 66 20 28 72 65 74 76 61 6c ) {...if (retval
f080: 20 3c 20 33 29 20 7b 0a 09 09 09 43 41 43 4b 45 < 3) {....CACKE
f090: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
f0a0: 52 65 70 6c 79 20 69 73 20 74 6f 6f 20 73 6d 61 Reply is too sma
f0b0: 6c 6c 2c 20 77 65 20 61 72 65 20 6e 6f 74 20 61 ll, we are not a
f0c0: 62 6c 65 20 74 6f 20 75 6e 70 61 64 20 2d 2d 20 ble to unpad --
f0d0: 70 61 73 73 69 6e 67 20 62 61 63 6b 20 61 6e 64 passing back and
f0e0: 20 68 6f 70 69 6e 67 20 66 6f 72 20 74 68 65 20 hoping for the
f0f0: 62 65 73 74 21 22 29 3b 0a 0a 09 09 09 43 41 43 best!");.....CAC
f100: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
f110: 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 ("Returning in s
f120: 75 63 63 65 73 73 2c 20 72 65 74 76 61 6c 20 3d uccess, retval =
f130: 20 25 6c 69 20 28 62 79 74 65 73 29 22 2c 20 28 %li (bytes)", (
f140: 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a 09 long) retval);..
f150: 09 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 ..return(retval)
f160: 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 6f 75 74 ;...}....if (out
f170: 62 75 66 5b 30 5d 20 21 3d 20 30 78 30 30 29 20 buf[0] != 0x00)
f180: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {....CACKEY_DEBU
f190: 47 5f 50 52 49 4e 54 46 28 22 55 6e 72 65 63 6f G_PRINTF("Unreco
f1a0: 67 6e 69 7a 65 64 20 70 61 64 64 69 6e 67 20 73 gnized padding s
f1b0: 63 68 65 6d 65 20 2d 2d 20 70 61 73 73 69 6e 67 cheme -- passing
f1c0: 20 62 61 63 6b 20 61 6e 64 20 68 6f 70 69 6e 67 back and hoping
f1d0: 20 66 6f 72 20 74 68 65 20 62 65 73 74 21 22 29 for the best!")
f1e0: 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 ;.....CACKEY_DEB
f1f0: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
f200: 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c ning in success,
f210: 20 72 65 74 76 61 6c 20 3d 20 25 6c 69 20 28 62 retval = %li (b
f220: 79 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29 20 72 ytes)", (long) r
f230: 65 74 76 61 6c 29 3b 0a 09 09 09 72 65 74 75 72 etval);....retur
f240: 6e 28 72 65 74 76 61 6c 29 3b 0a 09 09 7d 0a 0a n(retval);...}..
f250: 09 09 62 6c 6f 63 6b 74 79 70 65 20 3d 20 6f 75 ..blocktype = ou
f260: 74 62 75 66 5b 31 5d 3b 0a 09 09 75 6e 70 61 64 tbuf[1];...unpad
f270: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 09 09 73 offset = 0;....s
f280: 77 69 74 63 68 20 28 62 6c 6f 63 6b 74 79 70 65 witch (blocktype
f290: 29 20 7b 0a 09 09 09 63 61 73 65 20 30 78 30 30 ) {....case 0x00
f2a0: 3a 0a 09 09 09 09 2f 2a 20 50 61 64 64 69 6e 67 :...../* Padding
f2b0: 20 53 63 68 65 6d 65 20 31 2c 20 74 68 65 20 66 Scheme 1, the f
f2c0: 69 72 73 74 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 irst non-zero by
f2d0: 74 65 20 69 73 20 74 68 65 20 73 74 61 72 74 20 te is the start
f2e0: 6f 66 20 64 61 74 61 20 2a 2f 0a 09 09 09 09 66 of data */.....f
f2f0: 6f 72 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20 or (unpadoffset
f300: 3d 20 32 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 = 2; unpadoffset
f310: 20 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70 61 64 < retval; unpad
f320: 6f 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09 09 09 offset++) {.....
f330: 09 69 66 20 28 6f 75 74 62 75 66 5b 75 6e 70 61 .if (outbuf[unpa
f340: 64 6f 66 66 73 65 74 5d 20 21 3d 20 30 78 30 30 doffset] != 0x00
f350: 29 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b ) {.......break;
f360: 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 ......}.....}...
f370: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 ..break;....case
f380: 20 30 78 30 31 3a 0a 09 09 09 09 2f 2a 20 50 61 0x01:...../* Pa
f390: 64 64 69 6e 67 20 53 63 68 65 6d 65 20 32 2c 20 dding Scheme 2,
f3a0: 70 61 64 20 62 79 74 65 73 20 61 72 65 20 30 78 pad bytes are 0x
f3b0: 46 46 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 30 FF followed by 0
f3c0: 78 30 30 20 2a 2f 0a 09 09 09 09 66 6f 72 20 28 x00 */.....for (
f3d0: 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 32 3b unpadoffset = 2;
f3e0: 20 75 6e 70 61 64 6f 66 66 73 65 74 20 3c 20 72 unpadoffset < r
f3f0: 65 74 76 61 6c 3b 20 75 6e 70 61 64 6f 66 66 73 etval; unpadoffs
f400: 65 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66 20 et++) {......if
f410: 28 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 (outbuf[unpadoff
f420: 73 65 74 5d 20 21 3d 20 30 78 46 46 29 20 7b 0a set] != 0xFF) {.
f430: 09 09 09 09 09 09 69 66 20 28 6f 75 74 62 75 66 ......if (outbuf
f440: 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 3d 3d [unpadoffset] ==
f450: 20 30 78 30 30 29 20 7b 0a 09 09 09 09 09 09 09 0x00) {........
f460: 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 3b 0a 0a unpadoffset++;..
f470: 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 .......break;...
f480: 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 ....} else {....
f490: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
f4a0: 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 _PRINTF("Invalid
f4b0: 20 70 61 64 64 69 6e 67 20 64 61 74 61 20 66 6f padding data fo
f4c0: 75 6e 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 und, returning i
f4d0: 6e 20 66 61 69 6c 75 72 65 2c 20 73 68 6f 75 6c n failure, shoul
f4e0: 64 20 68 61 76 65 20 62 65 65 6e 20 30 78 30 30 d have been 0x00
f4f0: 20 66 6f 75 6e 64 20 30 78 25 30 32 78 22 2c 20 found 0x%02x",
f500: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6f (unsigned int) o
f510: 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 utbuf[unpadoffse
f520: 74 5d 29 3b 0a 0a 09 09 09 09 09 09 09 72 65 74 t]);.........ret
f530: 75 72 6e 28 2d 31 29 3b 0a 09 09 09 09 09 09 7d urn(-1);.......}
f540: 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 ......} else {..
f550: 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
f560: 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 G_PRINTF("Invali
f570: 64 20 70 61 64 64 69 6e 67 20 64 61 74 61 20 66 d padding data f
f580: 6f 75 6e 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 ound, returning
f590: 69 6e 20 66 61 69 6c 75 72 65 2c 20 73 68 6f 75 in failure, shou
f5a0: 6c 64 20 68 61 76 65 20 62 65 65 6e 20 30 78 46 ld have been 0xF
f5b0: 46 20 66 6f 75 6e 64 20 30 78 25 30 32 78 22 2c F found 0x%02x",
f5c0: 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 (unsigned int)
f5d0: 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 outbuf[unpadoffs
f5e0: 65 74 5d 29 3b 0a 0a 09 09 09 09 09 09 72 65 74 et]);........ret
f5f0: 75 72 6e 28 2d 31 29 3b 0a 09 09 09 09 09 7d 0a urn(-1);......}.
f600: 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b ....}.....break;
f610: 0a 09 09 09 63 61 73 65 20 30 78 30 32 3a 0a 09 ....case 0x02:..
f620: 09 09 09 2f 2a 20 50 61 64 64 69 6e 67 20 53 63 .../* Padding Sc
f630: 68 65 6d 65 20 33 2c 20 70 61 64 20 62 79 74 65 heme 3, pad byte
f640: 73 20 61 72 65 20 6e 6f 6e 2d 7a 65 72 6f 20 66 s are non-zero f
f650: 69 72 73 74 20 7a 65 72 6f 20 62 79 74 65 20 66 irst zero byte f
f660: 6f 75 6e 64 20 69 73 20 74 68 65 20 73 65 70 65 ound is the sepe
f670: 72 61 74 6f 72 20 62 79 74 65 20 2a 2f 0a 09 09 rator byte */...
f680: 09 09 66 6f 72 20 28 75 6e 70 61 64 6f 66 66 73 ..for (unpadoffs
f690: 65 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f 66 66 et = 2; unpadoff
f6a0: 73 65 74 20 3c 20 72 65 74 76 61 6c 3b 20 75 6e set < retval; un
f6b0: 70 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a 09 padoffset++) {..
f6c0: 09 09 09 09 69 66 20 28 6f 75 74 62 75 66 5b 75 ....if (outbuf[u
f6d0: 6e 70 61 64 6f 66 66 73 65 74 5d 20 3d 3d 20 30 npadoffset] == 0
f6e0: 78 30 30 29 20 7b 0a 09 09 09 09 09 09 75 6e 70 x00) {.......unp
f6f0: 61 64 6f 66 66 73 65 74 2b 2b 3b 0a 0a 09 09 09 adoffset++;.....
f700: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d ...break;......}
f710: 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b .....}.....break
f720: 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 75 6e 70 ;...}....if (unp
f730: 61 64 6f 66 66 73 65 74 20 3e 20 72 65 74 76 61 adoffset > retva
f740: 6c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 l) {....CACKEY_D
f750: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 66 66 EBUG_PRINTF("Off
f760: 73 65 74 20 67 72 65 61 74 65 72 20 74 68 61 6e set greater than
f770: 20 72 65 70 6c 79 20 73 69 7a 65 2c 20 61 62 6f reply size, abo
f780: 72 74 69 6e 67 2e 20 20 28 75 6e 70 61 64 6f 66 rting. (unpadof
f790: 66 73 65 74 20 3d 20 25 6c 75 2c 20 72 65 74 76 fset = %lu, retv
f7a0: 61 6c 20 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73 al = %lu)", (uns
f7b0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6e 70 61 igned long) unpa
f7c0: 64 6f 66 66 73 65 74 2c 20 28 75 6e 73 69 67 6e doffset, (unsign
f7d0: 65 64 20 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29 ed long) retval)
f7e0: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 ;.....return(-1)
f7f0: 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f ;...}....CACKEY_
f800: 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 DEBUG_PRINTBUF("
f810: 50 61 64 64 65 64 3a 22 2c 20 6f 75 74 62 75 66 Padded:", outbuf
f820: 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 72 65 , retval);....re
f830: 74 76 61 6c 20 2d 3d 20 75 6e 70 61 64 6f 66 66 tval -= unpadoff
f840: 73 65 74 3b 0a 09 09 6d 65 6d 6d 6f 76 65 28 6f set;...memmove(o
f850: 75 74 62 75 66 2c 20 6f 75 74 62 75 66 20 2b 20 utbuf, outbuf +
f860: 75 6e 70 61 64 6f 66 66 73 65 74 2c 20 72 65 74 unpadoffset, ret
f870: 76 61 6c 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f val);....CACKEY_
f880: 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 DEBUG_PRINTBUF("
f890: 55 6e 70 61 64 64 65 64 3a 22 2c 20 6f 75 74 62 Unpadded:", outb
f8a0: 75 66 2c 20 72 65 74 76 61 6c 29 3b 0a 09 7d 0a uf, retval);..}.
f8b0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
f8c0: 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e PRINTF("Returnin
f8d0: 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72 65 g in success, re
f8e0: 74 76 61 6c 20 3d 20 25 6c 69 20 28 62 79 74 65 tval = %li (byte
f8f0: 73 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65 74 76 s)", (long) retv
f900: 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 al);...return(re
f910: 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 tval);.}../*. *
f920: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 SYNPOSIS. *
f930: 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 .... *. * ARGUME
f940: 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 NTS. * ....
f950: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 *. * RETURN VALU
f960: 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a E. * .... *.
f970: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 * NOTES. *
f980: 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 .... *. */.stati
f990: 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 c cackey_ret cac
f9a0: 6b 65 79 5f 6c 6f 67 69 6e 28 73 74 72 75 63 74 key_login(struct
f9b0: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c cackey_slot *sl
f9c0: 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 ot, unsigned cha
f9d0: 72 20 2a 70 69 6e 2c 20 75 6e 73 69 67 6e 65 64 r *pin, unsigned
f9e0: 20 6c 6f 6e 67 20 70 69 6e 5f 6c 65 6e 2c 20 69 long pin_len, i
f9f0: 6e 74 20 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e nt *tries_remain
fa00: 69 6e 67 5f 70 29 20 7b 0a 09 75 6e 73 69 67 6e ing_p) {..unsign
fa10: 65 64 20 63 68 61 72 20 63 61 63 5f 70 69 6e 5b ed char cac_pin[
fa20: 38 5d 20 3d 20 7b 30 78 46 46 2c 20 30 78 46 46 8] = {0xFF, 0xFF
fa30: 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 , 0xFF, 0xFF, 0x
fa40: 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 FF, 0xFF, 0xFF,
fa50: 30 78 46 46 7d 3b 0a 09 75 69 6e 74 31 36 5f 74 0xFF};..uint16_t
fa60: 20 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 3b 0a response_code;.
fa70: 09 69 6e 74 20 74 72 69 65 73 5f 72 65 6d 61 69 .int tries_remai
fa80: 6e 69 6e 67 3b 0a 09 69 6e 74 20 73 65 6e 64 5f ning;..int send_
fa90: 72 65 74 3b 0a 0a 09 2f 2a 20 49 6e 64 69 63 61 ret;.../* Indica
faa0: 74 65 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f te that we do no
fab0: 74 20 6b 6e 6f 77 20 61 62 6f 75 74 20 68 6f 77 t know about how
fac0: 20 6d 61 6e 79 20 74 72 69 65 73 20 61 72 65 20 many tries are
fad0: 72 65 6d 61 69 6e 69 6e 67 20 2a 2f 0a 09 69 66 remaining */..if
fae0: 20 28 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e (tries_remainin
faf0: 67 5f 70 29 20 7b 0a 09 09 2a 74 72 69 65 73 5f g_p) {...*tries_
fb00: 72 65 6d 61 69 6e 69 6e 67 5f 70 20 3d 20 2d 31 remaining_p = -1
fb10: 3b 0a 09 7d 0a 0a 09 2f 2a 20 41 70 70 61 72 65 ;..}.../* Appare
fb20: 6e 74 6c 79 2c 20 43 41 43 20 50 49 4e 73 20 61 ntly, CAC PINs a
fb30: 72 65 20 2a 45 58 41 43 54 4c 59 2a 20 38 20 62 re *EXACTLY* 8 b
fb40: 79 74 65 73 20 6c 6f 6e 67 20 2d 2d 20 70 61 64 ytes long -- pad
fb50: 20 77 69 74 68 20 30 78 46 46 20 69 66 20 74 6f with 0xFF if to
fb60: 6f 20 73 68 6f 72 74 20 2a 2f 0a 09 69 66 20 28 o short */..if (
fb70: 70 69 6e 5f 6c 65 6e 20 3e 3d 20 38 29 20 7b 0a pin_len >= 8) {.
fb80: 09 09 6d 65 6d 63 70 79 28 63 61 63 5f 70 69 6e ..memcpy(cac_pin
fb90: 2c 20 70 69 6e 2c 20 38 29 3b 0a 09 7d 20 65 6c , pin, 8);..} el
fba0: 73 65 20 7b 0a 09 09 6d 65 6d 63 70 79 28 63 61 se {...memcpy(ca
fbb0: 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 70 69 6e 5f c_pin, pin, pin_
fbc0: 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 49 73 len);..}.../* Is
fbd0: 73 75 65 20 50 49 4e 20 56 65 72 69 66 79 20 2a sue PIN Verify *
fbe0: 2f 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 /..send_ret = ca
fbf0: 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 ckey_send_apdu(s
fc00: 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 lot, GSCIS_CLASS
fc10: 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f _ISO7816, GSCIS_
fc20: 49 4e 53 54 52 5f 56 45 52 49 46 59 2c 20 30 78 INSTR_VERIFY, 0x
fc30: 30 30 2c 20 30 78 30 30 2c 20 73 69 7a 65 6f 66 00, 0x00, sizeof
fc40: 28 63 61 63 5f 70 69 6e 29 2c 20 63 61 63 5f 70 (cac_pin), cac_p
fc50: 69 6e 2c 20 30 78 30 30 2c 20 26 72 65 73 70 6f in, 0x00, &respo
fc60: 6e 73 65 5f 63 6f 64 65 2c 20 4e 55 4c 4c 2c 20 nse_code, NULL,
fc70: 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 73 65 6e 64 NULL);..if (send
fc80: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 _ret != CACKEY_P
fc90: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 69 66 CSC_S_OK) {...if
fca0: 20 28 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 ((response_code
fcb0: 20 26 20 30 78 36 33 43 30 29 20 3d 3d 20 30 78 & 0x63C0) == 0x
fcc0: 36 33 43 30 29 20 7b 0a 09 09 09 74 72 69 65 73 63C0) {....tries
fcd0: 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 20 28 72 65 _remaining = (re
fce0: 73 70 6f 6e 73 65 5f 63 6f 64 65 20 26 20 30 78 sponse_code & 0x
fcf0: 46 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 F);.....CACKEY_D
fd00: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e EBUG_PRINTF("PIN
fd10: 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20 66 61 Verification fa
fd20: 69 6c 65 64 2c 20 25 69 20 74 72 69 65 73 20 72 iled, %i tries r
fd30: 65 6d 61 69 6e 69 6e 67 22 2c 20 74 72 69 65 73 emaining", tries
fd40: 5f 72 65 6d 61 69 6e 69 6e 67 29 3b 0a 0a 09 09 _remaining);....
fd50: 09 69 66 20 28 74 72 69 65 73 5f 72 65 6d 61 69 .if (tries_remai
fd60: 6e 69 6e 67 5f 70 29 20 7b 0a 09 09 09 09 2a 74 ning_p) {.....*t
fd70: 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 ries_remaining_p
fd80: 20 3d 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 = tries_remaini
fd90: 6e 67 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 ng;....}.....ret
fda0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f urn(CACKEY_PCSC_
fdb0: 45 5f 42 41 44 50 49 4e 29 3b 0a 09 09 7d 0a 0a E_BADPIN);...}..
fdc0: 09 09 69 66 20 28 72 65 73 70 6f 6e 73 65 5f 63 ..if (response_c
fdd0: 6f 64 65 20 3d 3d 20 30 78 36 39 38 33 29 20 7b ode == 0x6983) {
fde0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
fdf0: 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 56 65 72 _PRINTF("PIN Ver
fe00: 69 66 69 63 61 74 69 6f 6e 20 66 61 69 6c 65 64 ification failed
fe10: 2c 20 64 65 76 69 63 65 20 69 73 20 6c 6f 63 6b , device is lock
fe20: 65 64 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e ed");.....return
fe30: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c (CACKEY_PCSC_E_L
fe40: 4f 43 4b 45 44 29 3b 0a 09 09 7d 0a 0a 09 09 72 OCKED);...}....r
fe50: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 eturn(CACKEY_PCS
fe60: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d C_E_GENERIC);..}
fe70: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
fe80: 50 52 49 4e 54 46 28 22 50 49 4e 20 56 65 72 69 PRINTF("PIN Veri
fe90: 66 69 63 61 74 69 6f 6e 20 73 75 63 63 65 65 64 fication succeed
fea0: 65 64 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 ed");...return(C
feb0: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 ACKEY_PCSC_S_OK)
fec0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f ;.}../*. * SYNPO
fed0: 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 SIS. * ....
fee0: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 *. * ARGUMENTS.
fef0: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 * .... *. *
ff00: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 RETURN VALUE. *
ff10: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f .... *. * NO
ff20: 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 TES. * ....
ff30: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 *. */.static cac
ff40: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 74 key_ret cackey_t
ff50: 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 73 74 72 oken_present(str
ff60: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 uct cackey_slot
ff70: 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79 *slot) {..cackey
ff80: 5f 72 65 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63 _ret pcsc_connec
ff90: 74 5f 72 65 74 3b 0a 09 44 57 4f 52 44 20 72 65 t_ret;..DWORD re
ffa0: 61 64 65 72 5f 6c 65 6e 2c 20 73 74 61 74 65 2c ader_len, state,
ffb0: 20 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72 5f 6c protocol, atr_l
ffc0: 65 6e 3b 0a 09 42 59 54 45 20 61 74 72 5b 4d 41 en;..BYTE atr[MA
ffd0: 58 5f 41 54 52 5f 53 49 5a 45 5d 3b 0a 09 4c 4f X_ATR_SIZE];..LO
ffe0: 4e 47 20 73 74 61 74 75 73 5f 72 65 74 2c 20 73 NG status_ret, s
fff0: 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b card_reconn_ret;
10000 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
10010 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
10020 29 3b 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 );...pcsc_connec
10030 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 t_ret = cackey_c
10040 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 onnect_card(slot
10050 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e );..if (pcsc_con
10060 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b nect_ret != CACK
10070 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a EY_PCSC_S_OK) {.
10080 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
10090 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f RINTF("Unable to
100a0 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 connect to card
100b0 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 , returning toke
100c0 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09 72 n absent");....r
100d0 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 eturn(CACKEY_PCS
100e0 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 C_E_TOKENABSENT)
100f0 3b 0a 09 7d 0a 0a 09 61 74 72 5f 6c 65 6e 20 3d ;..}...atr_len =
10100 20 73 69 7a 65 6f 66 28 61 74 72 29 3b 0a 09 73 sizeof(atr);..s
10110 74 61 74 75 73 5f 72 65 74 20 3d 20 53 43 61 72 tatus_ret = SCar
10120 64 53 74 61 74 75 73 28 73 6c 6f 74 2d 3e 70 63 dStatus(slot->pc
10130 73 63 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c 20 26 sc_card, NULL, &
10140 72 65 61 64 65 72 5f 6c 65 6e 2c 20 26 73 74 61 reader_len, &sta
10150 74 65 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 61 te, &protocol, a
10160 74 72 2c 20 26 61 74 72 5f 6c 65 6e 29 3b 0a 0a tr, &atr_len);..
10170 09 69 66 20 28 73 74 61 74 75 73 5f 72 65 74 20 .if (status_ret
10180 3d 3d 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c == SCARD_E_INVAL
10190 49 44 5f 48 41 4e 44 4c 45 29 20 7b 0a 09 09 43 ID_HANDLE) {...C
101a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
101b0 54 46 28 22 53 43 61 72 64 53 74 61 74 75 73 28 TF("SCardStatus(
101c0 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 ) returned SCARD
101d0 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c _E_INVALID_HANDL
101e0 45 2c 20 6d 61 72 6b 69 6e 67 20 69 73 20 6e 6f E, marking is no
101f0 74 20 61 6c 72 65 61 64 79 20 63 6f 6e 6e 65 63 t already connec
10200 74 65 64 20 61 6e 64 20 74 72 79 69 6e 67 20 61 ted and trying a
10210 67 61 69 6e 22 29 3b 0a 09 09 63 61 63 6b 65 79 gain");...cackey
10220 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 _mark_slot_reset
10230 28 73 6c 6f 74 29 3b 0a 0a 09 09 70 63 73 63 5f (slot);....pcsc_
10240 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 connect_ret = ca
10250 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 ckey_connect_car
10260 64 28 73 6c 6f 74 29 3b 0a 09 09 69 66 20 28 70 d(slot);...if (p
10270 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 csc_connect_ret
10280 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 != CACKEY_PCSC_S
10290 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 _OK) {....CACKEY
102a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 _DEBUG_PRINTF("U
102b0 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 nable to connect
102c0 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72 6e to card, return
102d0 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 ing token absent
102e0 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 ");.....return(C
102f0 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b ACKEY_PCSC_E_TOK
10300 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 7d 0a 0a ENABSENT);...}..
10310 09 09 61 74 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 ..atr_len = size
10320 6f 66 28 61 74 72 29 3b 0a 09 09 73 74 61 74 75 of(atr);...statu
10330 73 5f 72 65 74 20 3d 20 53 43 61 72 64 53 74 61 s_ret = SCardSta
10340 74 75 73 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 tus(slot->pcsc_c
10350 61 72 64 2c 20 4e 55 4c 4c 2c 20 26 72 65 61 64 ard, NULL, &read
10360 65 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65 2c 20 er_len, &state,
10370 26 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 &protocol, atr,
10380 26 61 74 72 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 &atr_len);..}...
10390 69 66 20 28 73 74 61 74 75 73 5f 72 65 74 20 21 if (status_ret !
103a0 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 = SCARD_S_SUCCES
103b0 53 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 61 S) {...cackey_ma
103c0 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c rk_slot_reset(sl
103d0 6f 74 29 3b 0a 0a 09 09 69 66 20 28 73 74 61 74 ot);....if (stat
103e0 75 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f us_ret == SCARD_
103f0 57 5f 52 45 53 45 54 5f 43 41 52 44 29 20 7b 0a W_RESET_CARD) {.
10400 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
10410 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 72 65 PRINTF("Reset re
10420 71 75 69 72 65 64 2c 20 70 6c 65 61 73 65 20 68 quired, please h
10430 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73 63 old...");.....sc
10440 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d ard_reconn_ret =
10450 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 cackey_reconnec
10460 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20 53 43 41 t_card(slot, SCA
10470 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c RD_PROTOCOL_T0 |
10480 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f SCARD_PROTOCOL_
10490 54 31 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a T1, &protocol);.
104a0 09 09 09 69 66 20 28 73 63 61 72 64 5f 72 65 63 ...if (scard_rec
104b0 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 onn_ret == SCARD
104c0 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 _S_SUCCESS) {...
104d0 09 09 2f 2a 20 55 70 64 61 74 65 20 70 72 6f 74 ../* Update prot
104e0 6f 63 6f 6c 20 2a 2f 0a 09 09 09 09 73 6c 6f 74 ocol */.....slot
104f0 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d 20 70 72 6f ->protocol = pro
10500 74 6f 63 6f 6c 3b 0a 0a 09 09 09 09 2f 2a 20 52 tocol;....../* R
10510 65 2d 65 73 74 61 62 6c 69 73 68 20 74 72 61 6e e-establish tran
10520 73 61 63 74 69 6f 6e 2c 20 69 66 20 69 74 20 77 saction, if it w
10530 61 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 09 09 as present */...
10540 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e ..if (slot->tran
10550 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 saction_depth >
10560 30 29 20 7b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 0) {......slot->
10570 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 transaction_dept
10580 68 2d 2d 3b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e h--;......slot->
10590 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 transaction_need
105a0 5f 68 77 5f 6c 6f 63 6b 20 3d 20 31 3b 0a 09 09 _hw_lock = 1;...
105b0 09 09 09 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f ...cackey_begin_
105c0 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 transaction(slot
105d0 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 );.....}......CA
105e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
105f0 46 28 22 52 65 73 65 74 20 73 75 63 63 65 73 73 F("Reset success
10600 66 75 6c 2c 20 72 65 71 75 65 72 79 69 6e 67 22 ful, requerying"
10610 29 3b 0a 09 09 09 09 73 74 61 74 75 73 5f 72 65 );.....status_re
10620 74 20 3d 20 53 43 61 72 64 53 74 61 74 75 73 28 t = SCardStatus(
10630 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c slot->pcsc_card,
10640 20 4e 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f 6c NULL, &reader_l
10650 65 6e 2c 20 26 73 74 61 74 65 2c 20 26 70 72 6f en, &state, &pro
10660 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74 72 tocol, atr, &atr
10670 5f 6c 65 6e 29 3b 0a 09 09 09 09 69 66 20 28 73 _len);.....if (s
10680 74 61 74 75 73 5f 72 65 74 20 21 3d 20 53 43 41 tatus_ret != SCA
10690 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a RD_S_SUCCESS) {.
106a0 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
106b0 47 5f 50 52 49 4e 54 46 28 22 53 74 69 6c 6c 20 G_PRINTF("Still
106c0 75 6e 61 62 6c 65 20 74 6f 20 71 75 65 72 79 20 unable to query
106d0 63 61 72 64 20 73 74 61 74 75 73 2c 20 72 65 74 card status, ret
106e0 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 urning token abs
106f0 65 6e 74 2e 20 20 53 43 61 72 64 53 74 61 74 75 ent. SCardStatu
10700 73 28 29 20 3d 20 25 73 22 2c 20 43 41 43 4b 45 s() = %s", CACKE
10710 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 Y_DEBUG_FUNC_SCA
10720 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 74 61 RDERR_TO_STR(sta
10730 74 75 73 5f 72 65 74 29 29 3b 0a 0a 09 09 09 09 tus_ret));......
10740 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 .return(CACKEY_P
10750 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e CSC_E_TOKENABSEN
10760 54 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 T);.....}....} e
10770 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 lse {.....CACKEY
10780 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 _DEBUG_PRINTF("U
10790 6e 61 62 6c 65 20 74 6f 20 72 65 63 6f 6e 6e 65 nable to reconne
107a0 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75 ct to card, retu
107b0 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 rning token abse
107c0 6e 74 2e 20 20 53 43 61 72 64 52 65 63 6f 6e 6e nt. SCardReconn
107d0 65 63 74 28 29 20 3d 20 25 73 22 2c 20 43 41 43 ect() = %s", CAC
107e0 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 KEY_DEBUG_FUNC_S
107f0 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 CARDERR_TO_STR(s
10800 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 29 card_reconn_ret)
10810 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 );......return(C
10820 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b ACKEY_PCSC_E_TOK
10830 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 7d 0a ENABSENT);....}.
10840 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 ..} else {....CA
10850 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
10860 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 71 75 65 F("Unable to que
10870 72 79 20 63 61 72 64 20 73 74 61 74 75 73 2c 20 ry card status,
10880 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 returning token
10890 61 62 73 65 6e 74 2e 20 20 53 43 61 72 64 53 74 absent. SCardSt
108a0 61 74 75 73 28 29 20 3d 20 25 73 22 2c 20 43 41 atus() = %s", CA
108b0 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f CKEY_DEBUG_FUNC_
108c0 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 SCARDERR_TO_STR(
108d0 73 74 61 74 75 73 5f 72 65 74 29 29 3b 0a 0a 09 status_ret));...
108e0 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f ..return(CACKEY_
108f0 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 PCSC_E_TOKENABSE
10900 4e 54 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 NT);...}..}...if
10910 20 28 28 73 74 61 74 65 20 26 20 53 43 41 52 44 ((state & SCARD
10920 5f 41 42 53 45 4e 54 29 20 3d 3d 20 53 43 41 52 _ABSENT) == SCAR
10930 44 5f 41 42 53 45 4e 54 29 20 7b 0a 09 09 43 41 D_ABSENT) {...CA
10940 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
10950 46 28 22 43 61 72 64 20 69 73 20 61 62 73 65 6e F("Card is absen
10960 74 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b t, returning tok
10970 65 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09 en absent");....
10980 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 return(CACKEY_PC
10990 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 SC_E_TOKENABSENT
109a0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 );..}...CACKEY_D
109b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
109c0 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 70 72 65 urning token pre
109d0 73 65 6e 74 2e 22 29 3b 0a 0a 09 72 65 74 75 72 sent.");...retur
109e0 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f n(CACKEY_PCSC_S_
109f0 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 3b 0a 7d TOKENPRESENT);.}
10a00 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 ../*. * SYNPOSIS
10a10 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 . * .... *.
10a20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 * ARGUMENTS. *
10a30 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 .... *. * RET
10a40 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 URN VALUE. *
10a50 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 .... *. * NOTES
10a60 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 . * .... *.
10a70 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f */.static ssize_
10a80 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 t cackey_pcsc_id
10a90 65 6e 74 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28 entity_to_label(
10aa0 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 struct cackey_pc
10ab0 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 sc_identity *ide
10ac0 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 20 ntity, unsigned
10ad0 63 68 61 72 20 2a 6c 61 62 65 6c 5f 62 75 66 2c char *label_buf,
10ae0 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c unsigned long l
10af0 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 29 20 7b 0a abel_buf_len) {.
10b00 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 .unsigned long c
10b10 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a ertificate_len;.
10b20 09 63 68 61 72 20 2a 6c 61 62 65 6c 5f 61 73 6e .char *label_asn
10b30 31 3b 0a 09 76 6f 69 64 20 2a 63 65 72 74 69 66 1;..void *certif
10b40 69 63 61 74 65 3b 0a 09 69 6e 74 20 78 35 30 39 icate;..int x509
10b50 5f 72 65 61 64 5f 72 65 74 3b 0a 0a 09 63 65 72 _read_ret;...cer
10b60 74 69 66 69 63 61 74 65 20 3d 20 69 64 65 6e 74 tificate = ident
10b70 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 ity->certificate
10b80 3b 0a 09 63 65 72 74 69 66 69 63 61 74 65 5f 6c ;..certificate_l
10b90 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 en = identity->c
10ba0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a ertificate_len;.
10bb0 0a 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 ..if (certificat
10bc0 65 5f 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 72 e_len < 0) {...r
10bd0 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 eturn(-1);..}...
10be0 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 x509_read_ret =
10bf0 78 35 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74 28 x509_to_subject(
10c00 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 certificate, cer
10c10 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 28 76 tificate_len, (v
10c20 6f 69 64 20 2a 2a 29 20 26 6c 61 62 65 6c 5f 61 oid **) &label_a
10c30 73 6e 31 29 3b 0a 09 69 66 20 28 78 35 30 39 5f sn1);..if (x509_
10c40 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a read_ret < 0) {.
10c50 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d ..return(-1);..}
10c60 0a 0a 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 ...x509_read_ret
10c70 20 3d 20 78 35 30 39 5f 64 6e 5f 74 6f 5f 73 74 = x509_dn_to_st
10c80 72 69 6e 67 28 6c 61 62 65 6c 5f 61 73 6e 31 2c ring(label_asn1,
10c90 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 2c 20 x509_read_ret,
10ca0 28 63 68 61 72 20 2a 29 20 6c 61 62 65 6c 5f 62 (char *) label_b
10cb0 75 66 2c 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 uf, label_buf_le
10cc0 6e 2c 20 22 43 4e 22 29 3b 0a 09 69 66 20 28 78 n, "CN");..if (x
10cd0 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 3d 20 509_read_ret <=
10ce0 30 29 20 7b 0a 09 09 78 35 30 39 5f 72 65 61 64 0) {...x509_read
10cf0 5f 72 65 74 20 3d 20 78 35 30 39 5f 64 6e 5f 74 _ret = x509_dn_t
10d00 6f 5f 73 74 72 69 6e 67 28 6c 61 62 65 6c 5f 61 o_string(label_a
10d10 73 6e 31 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 sn1, x509_read_r
10d20 65 74 2c 20 28 63 68 61 72 20 2a 29 20 6c 61 62 et, (char *) lab
10d30 65 6c 5f 62 75 66 2c 20 6c 61 62 65 6c 5f 62 75 el_buf, label_bu
10d40 66 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 f_len, NULL);...
10d50 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 .if (x509_read_r
10d60 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09 09 72 65 et <= 0) {....re
10d70 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d turn(-1);...}..}
10d80 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f ..#ifdef CACKEY_
10d90 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 PARANOID.# ifde
10da0 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d f _POSIX_SSIZE_M
10db0 41 58 0a 09 69 66 20 28 78 35 30 39 5f 72 65 61 AX..if (x509_rea
10dc0 64 5f 72 65 74 20 3e 20 5f 50 4f 53 49 58 5f 53 d_ret > _POSIX_S
10dd0 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 SIZE_MAX) {...CA
10de0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
10df0 46 28 22 78 35 30 39 5f 72 65 61 64 5f 72 65 74 F("x509_read_ret
10e00 20 65 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d exceeds maximum
10e10 20 76 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e value, returnin
10e20 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d g in failure. (m
10e30 61 78 20 3d 20 25 6c 69 2c 20 78 35 30 39 5f 72 ax = %li, x509_r
10e40 65 61 64 5f 72 65 74 20 3d 20 25 6c 75 29 22 2c ead_ret = %lu)",
10e50 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53 (long) _POSIX_S
10e60 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67 SIZE_MAX, (unsig
10e70 6e 65 64 20 6c 6f 6e 67 29 20 78 35 30 39 5f 72 ned long) x509_r
10e80 65 61 64 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 ead_ret);....ret
10e90 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 urn(-1);..}.# e
10ea0 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09 72 65 ndif.#endif...re
10eb0 74 75 72 6e 28 78 35 30 39 5f 72 65 61 64 5f 72 turn(x509_read_r
10ec0 65 74 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 et);.}../* Retur
10ed0 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20 ns 0 on success
10ee0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 */.static int ca
10ef0 63 6b 65 79 5f 6d 75 74 65 78 5f 63 72 65 61 74 ckey_mutex_creat
10f00 65 28 76 6f 69 64 20 2a 2a 6d 75 74 65 78 29 20 e(void **mutex)
10f10 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 {..pthread_mutex
10f20 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 _t *pthread_mute
10f30 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f x;..int pthread_
10f40 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 retval;..CK_RV c
10f50 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 ustom_retval;...
10f60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
10f70 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a NTF("Called.");.
10f80 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72 ..if ((cackey_ar
10f90 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f gs.flags & CKF_O
10fa0 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d S_LOCKING_OK) ==
10fb0 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f CKF_OS_LOCKING_
10fc0 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f OK) {...pthread_
10fd0 6d 75 74 65 78 20 3d 20 6d 61 6c 6c 6f 63 28 73 mutex = malloc(s
10fe0 69 7a 65 6f 66 28 2a 70 74 68 72 65 61 64 5f 6d izeof(*pthread_m
10ff0 75 74 65 78 29 29 3b 0a 09 09 69 66 20 28 21 70 utex));...if (!p
11000 74 68 72 65 61 64 5f 6d 75 74 65 78 29 20 7b 0a thread_mutex) {.
11010 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
11020 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 PRINTF("Failed t
11030 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 o allocate memor
11040 79 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e y.");.....return
11050 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 70 74 68 (-1);...}....pth
11060 72 65 61 64 5f 72 65 74 76 61 6c 20 3d 20 70 74 read_retval = pt
11070 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 hread_mutex_init
11080 28 70 74 68 72 65 61 64 5f 6d 75 74 65 78 2c 20 (pthread_mutex,
11090 4e 55 4c 4c 29 3b 0a 09 09 69 66 20 28 70 74 68 NULL);...if (pth
110a0 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 read_retval != 0
110b0 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 ) {....CACKEY_DE
110c0 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72 BUG_PRINTF("pthr
110d0 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 29 ead_mutex_init()
110e0 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 returned error
110f0 28 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f (%i).", pthread_
11100 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 retval);.....ret
11110 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 urn(-1);...}....
11120 2a 6d 75 74 65 78 20 3d 20 70 74 68 72 65 61 64 *mutex = pthread
11130 5f 6d 75 74 65 78 3b 0a 09 7d 20 65 6c 73 65 20 _mutex;..} else
11140 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 61 {...if (cackey_a
11150 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78 29 rgs.CreateMutex)
11160 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65 74 {....custom_ret
11170 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72 67 val = cackey_arg
11180 73 2e 43 72 65 61 74 65 4d 75 74 65 78 28 6d 75 s.CreateMutex(mu
11190 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 75 tex);.....if (cu
111a0 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43 stom_retval != C
111b0 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 KR_OK) {.....CAC
111c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
111d0 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 ("cackey_args.Cr
111e0 65 61 74 65 4d 75 74 65 78 28 29 20 72 65 74 75 eateMutex() retu
111f0 72 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29 rned error (%li)
11200 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f .", (long) custo
11210 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 m_retval);......
11220 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d return(-1);....}
11230 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 ...}..}...CACKEY
11240 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
11250 65 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66 eturning sucessf
11260 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 ully (0)");...re
11270 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 turn(0);.}../* R
11280 65 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 eturns 0 on succ
11290 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e ess */.static in
112a0 74 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c t cackey_mutex_l
112b0 6f 63 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78 29 ock(void *mutex)
112c0 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65 {..pthread_mute
112d0 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 x_t *pthread_mut
112e0 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64 ex;..int pthread
112f0 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 _retval;..CK_RV
11300 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a custom_retval;..
11310 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
11320 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
11330 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61 ...if ((cackey_a
11340 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f rgs.flags & CKF_
11350 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d OS_LOCKING_OK) =
11360 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 = CKF_OS_LOCKING
11370 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64 _OK) {...pthread
11380 5f 6d 75 74 65 78 20 3d 20 6d 75 74 65 78 3b 0a _mutex = mutex;.
11390 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74 76 61 ...pthread_retva
113a0 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65 l = pthread_mute
113b0 78 5f 6c 6f 63 6b 28 70 74 68 72 65 61 64 5f 6d x_lock(pthread_m
113c0 75 74 65 78 29 3b 0a 09 09 69 66 20 28 70 74 68 utex);...if (pth
113d0 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 read_retval != 0
113e0 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 ) {....CACKEY_DE
113f0 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72 BUG_PRINTF("pthr
11400 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 29 ead_mutex_lock()
11410 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 returned error
11420 28 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f (%i).", pthread_
11430 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 retval);.....ret
11440 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 20 urn(-1);...}..}
11450 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 63 61 63 else {...if (cac
11460 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 key_args.LockMut
11470 65 78 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f ex) {....custom_
11480 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f retval = cackey_
11490 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 28 6d args.LockMutex(m
114a0 75 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 utex);.....if (c
114b0 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 ustom_retval !=
114c0 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 CKR_OK) {.....CA
114d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
114e0 46 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c F("cackey_args.L
114f0 6f 63 6b 4d 75 74 65 78 28 29 20 72 65 74 75 72 ockMutex() retur
11500 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29 2e ned error (%li).
11510 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d ", (long) custom
11520 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72 _retval);......r
11530 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a eturn(-1);....}.
11540 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f ..}..}...CACKEY_
11550 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
11560 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66 75 turning sucessfu
11570 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 74 lly (0)");...ret
11580 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 urn(0);.}../* Re
11590 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 turns 0 on succe
115a0 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 ss */.static int
115b0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e cackey_mutex_un
115c0 6c 6f 63 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78 lock(void *mutex
115d0 29 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 ) {..pthread_mut
115e0 65 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 ex_t *pthread_mu
115f0 74 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 tex;..int pthrea
11600 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 d_retval;..CK_RV
11610 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a custom_retval;.
11620 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
11630 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
11640 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f ;...if ((cackey_
11650 61 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 args.flags & CKF
11660 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 _OS_LOCKING_OK)
11670 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e == CKF_OS_LOCKIN
11680 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 G_OK) {...pthrea
11690 64 5f 6d 75 74 65 78 20 3d 20 6d 75 74 65 78 3b d_mutex = mutex;
116a0 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74 76 ....pthread_retv
116b0 61 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 al = pthread_mut
116c0 65 78 5f 75 6e 6c 6f 63 6b 28 70 74 68 72 65 61 ex_unlock(pthrea
116d0 64 5f 6d 75 74 65 78 29 3b 0a 09 09 69 66 20 28 d_mutex);...if (
116e0 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 21 pthread_retval !
116f0 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 = 0) {....CACKEY
11700 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70 _DEBUG_PRINTF("p
11710 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c thread_mutex_unl
11720 6f 63 6b 28 29 20 72 65 74 75 72 6e 65 64 20 65 ock() returned e
11730 72 72 6f 72 20 28 25 69 29 2e 22 2c 20 70 74 68 rror (%i).", pth
11740 72 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 read_retval);...
11750 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 ..return(-1);...
11760 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 }..} else {...if
11770 20 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e (cackey_args.Un
11780 6c 6f 63 6b 4d 75 74 65 78 29 20 7b 0a 09 09 09 lockMutex) {....
11790 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 custom_retval =
117a0 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f cackey_args.Unlo
117b0 63 6b 4d 75 74 65 78 28 6d 75 74 65 78 29 3b 0a ckMutex(mutex);.
117c0 0a 09 09 09 69 66 20 28 63 75 73 74 6f 6d 5f 72 ....if (custom_r
117d0 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 etval != CKR_OK)
117e0 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 {.....CACKEY_DE
117f0 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b BUG_PRINTF("cack
11800 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 ey_args.UnlockMu
11810 74 65 78 28 29 20 72 65 74 75 72 6e 65 64 20 65 tex() returned e
11820 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c rror (%li).", (l
11830 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65 74 76 ong) custom_retv
11840 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e al);......return
11850 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 (-1);....}...}..
11860 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 }...CACKEY_DEBUG
11870 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
11880 6e 67 20 73 75 63 65 73 73 66 75 6c 6c 79 20 28 ng sucessfully (
11890 30 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 0)");...return(0
118a0 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 43 4b 5f );.}..static CK_
118b0 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 63 61 ATTRIBUTE_PTR ca
118c0 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75 ckey_get_attribu
118d0 74 65 73 28 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c tes(CK_OBJECT_CL
118e0 41 53 53 20 6f 62 6a 65 63 74 63 6c 61 73 73 2c ASS objectclass,
118f0 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 struct cackey_p
11900 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 csc_identity *id
11910 65 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 entity, unsigned
11920 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 79 5f 6e long identity_n
11930 75 6d 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 um, CK_ULONG_PTR
11940 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 73 74 pulCount) {..st
11950 61 74 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b atic CK_BBOOL ck
11960 5f 74 72 75 65 20 3d 20 31 3b 0a 09 73 74 61 74 _true = 1;..stat
11970 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 66 ic CK_BBOOL ck_f
11980 61 6c 73 65 20 3d 20 30 3b 0a 09 73 74 61 74 69 alse = 0;..stati
11990 63 20 43 4b 5f 54 52 55 53 54 20 63 6b 5f 74 72 c CK_TRUST ck_tr
119a0 75 73 74 65 64 20 3d 20 43 4b 5f 54 52 55 53 54 usted = CK_TRUST
119b0 45 44 5f 44 45 4c 45 47 41 54 4f 52 3b 0a 09 43 ED_DELEGATOR;..C
119c0 4b 5f 55 4c 4f 4e 47 20 6e 75 6d 61 74 74 72 73 K_ULONG numattrs
119d0 20 3d 20 30 2c 20 72 65 74 76 61 6c 5f 63 6f 75 = 0, retval_cou
119e0 6e 74 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 nt;..CK_ATTRIBUT
119f0 45 5f 54 59 50 45 20 63 75 72 72 5f 61 74 74 72 E_TYPE curr_attr
11a00 5f 74 79 70 65 3b 0a 09 43 4b 5f 41 54 54 52 49 _type;..CK_ATTRI
11a10 42 55 54 45 20 63 75 72 72 5f 61 74 74 72 2c 20 BUTE curr_attr,
11a20 2a 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 56 4f 49 *retval;..CK_VOI
11a30 44 5f 50 54 52 20 70 56 61 6c 75 65 3b 0a 09 43 D_PTR pValue;..C
11a40 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c 75 65 4c K_ULONG ulValueL
11a50 65 6e 3b 0a 09 43 4b 5f 4f 42 4a 45 43 54 5f 43 en;..CK_OBJECT_C
11a60 4c 41 53 53 20 63 6b 5f 6f 62 6a 65 63 74 5f 63 LASS ck_object_c
11a70 6c 61 73 73 3b 0a 09 43 4b 5f 43 45 52 54 49 46 lass;..CK_CERTIF
11a80 49 43 41 54 45 5f 54 59 50 45 20 63 6b 5f 63 65 ICATE_TYPE ck_ce
11a90 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 3b 0a rtificate_type;.
11aa0 09 43 4b 5f 4b 45 59 5f 54 59 50 45 20 63 6b 5f .CK_KEY_TYPE ck_
11ab0 6b 65 79 5f 74 79 70 65 3b 0a 09 43 4b 5f 55 54 key_type;..CK_UT
11ac0 46 38 43 48 41 52 20 75 63 54 6d 70 42 75 66 5b F8CHAR ucTmpBuf[
11ad0 31 30 32 34 5d 3b 0a 09 53 48 41 31 43 6f 6e 74 1024];..SHA1Cont
11ae0 65 78 74 20 73 68 61 31 5f 63 74 78 3b 0a 09 4d ext sha1_ctx;..M
11af0 44 35 5f 43 54 58 20 6d 64 35 5f 63 74 78 3b 0a D5_CTX md5_ctx;.
11b00 09 75 69 6e 74 38 5f 74 20 73 68 61 31 5f 68 61 .uint8_t sha1_ha
11b10 73 68 5b 53 48 41 31 48 61 73 68 53 69 7a 65 5d sh[SHA1HashSize]
11b20 3b 0a 09 75 69 6e 74 38 5f 74 20 6d 64 35 5f 68 ;..uint8_t md5_h
11b30 61 73 68 5b 4d 44 35 48 61 73 68 53 69 7a 65 5d ash[MD5HashSize]
11b40 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 ;..unsigned char
11b50 20 2a 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 *certificate;..
11b60 73 73 69 7a 65 5f 74 20 63 65 72 74 69 66 69 63 ssize_t certific
11b70 61 74 65 5f 6c 65 6e 20 3d 20 2d 31 2c 20 78 35 ate_len = -1, x5
11b80 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 69 6e 09_read_ret;..in
11b90 74 20 70 56 61 6c 75 65 5f 66 72 65 65 3b 0a 0a t pValue_free;..
11ba0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
11bb0 49 4e 54 46 28 22 43 61 6c 6c 65 64 20 28 6f 62 INTF("Called (ob
11bc0 6a 65 63 74 43 6c 61 73 73 20 3d 20 25 6c 75 2c jectClass = %lu,
11bd0 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 3d 20 identity_num =
11be0 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 %lu).", (unsigne
11bf0 64 20 6c 6f 6e 67 29 20 6f 62 6a 65 63 74 63 6c d long) objectcl
11c00 61 73 73 2c 20 69 64 65 6e 74 69 74 79 5f 6e 75 ass, identity_nu
11c10 6d 29 3b 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 m);...*pulCount
11c20 3d 20 30 3b 0a 0a 09 69 66 20 28 6f 62 6a 65 63 = 0;...if (objec
11c30 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 tclass != CKO_CE
11c40 52 54 49 46 49 43 41 54 45 20 26 26 20 6f 62 6a RTIFICATE && obj
11c50 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f ectclass != CKO_
11c60 50 55 42 4c 49 43 5f 4b 45 59 20 26 26 20 6f 62 PUBLIC_KEY && ob
11c70 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f jectclass != CKO
11c80 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 26 26 20 _PRIVATE_KEY &&
11c90 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 objectclass != C
11ca0 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 KO_NETSCAPE_TRUS
11cb0 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 T) {...CACKEY_DE
11cc0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 BUG_PRINTF("Retu
11cd0 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 rning 0 objects
11ce0 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69 64 20 (NULL), invalid
11cf0 6f 62 6a 65 63 74 20 63 6c 61 73 73 22 29 3b 0a object class");.
11d00 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b ...return(NULL);
11d10 0a 09 7d 0a 0a 09 2f 2a 20 47 65 74 20 43 65 72 ..}.../* Get Cer
11d20 74 20 2a 2f 0a 09 69 66 20 28 69 64 65 6e 74 69 t */..if (identi
11d30 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 ty == NULL) {...
11d40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
11d50 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 NTF("Returning 0
11d60 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c objects (NULL),
11d70 20 69 6e 76 61 6c 69 64 20 69 64 65 6e 74 69 79 invalid identiy
11d80 20 70 72 6f 76 69 64 65 64 22 29 3b 0a 0a 09 09 provided");....
11d90 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d return(NULL);..}
11da0 0a 0a 09 63 65 72 74 69 66 69 63 61 74 65 20 3d ...certificate =
11db0 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 identity->certi
11dc0 66 69 63 61 74 65 3b 0a 09 63 65 72 74 69 66 69 ficate;..certifi
11dd0 63 61 74 65 5f 6c 65 6e 20 3d 20 69 64 65 6e 74 cate_len = ident
11de0 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 ity->certificate
11df0 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 63 65 72 74 _len;...if (cert
11e00 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 3d 20 2d ificate_len == -
11e10 31 20 7c 7c 20 63 65 72 74 69 66 69 63 61 74 65 1 || certificate
11e20 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 == NULL) {...CA
11e30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
11e40 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20 6f F("Returning 0 o
11e50 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20 74 bjects (NULL), t
11e60 68 69 73 20 69 64 65 6e 74 69 74 79 20 64 6f 65 his identity doe
11e70 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 58 2e s not have an X.
11e80 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20 509 certificate
11e90 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 associated with
11ea0 69 74 20 61 6e 64 20 77 69 6c 6c 20 6e 6f 74 20 it and will not
11eb0 77 6f 72 6b 22 29 3b 0a 0a 09 09 72 65 74 75 72 work");....retur
11ec0 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a n(NULL);..}.../*
11ed0 20 56 65 72 69 66 79 20 74 68 61 74 20 63 65 72 Verify that cer
11ee0 74 69 66 69 63 61 74 65 20 69 73 20 41 53 4e 2e tificate is ASN.
11ef0 31 20 65 6e 63 6f 64 65 64 20 58 2e 35 30 39 20 1 encoded X.509
11f00 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 certificate */..
11f10 69 66 20 28 78 35 30 39 5f 74 6f 5f 73 65 72 69 if (x509_to_seri
11f20 61 6c 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 al(certificate,
11f30 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c certificate_len,
11f40 20 4e 55 4c 4c 29 20 3c 20 30 29 20 7b 0a 09 09 NULL) < 0) {...
11f50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
11f60 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 NTF("Returning 0
11f70 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c objects (NULL),
11f80 20 74 68 65 20 58 2e 35 30 39 20 63 65 72 74 69 the X.509 certi
11f90 66 69 63 61 74 65 20 61 73 73 6f 63 69 61 74 65 ficate associate
11fa0 64 20 77 69 74 68 20 74 68 69 73 20 69 64 65 6e d with this iden
11fb0 74 69 74 79 20 69 73 20 6e 6f 74 20 76 61 6c 69 tity is not vali
11fc0 64 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e d");....return(N
11fd0 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 74 76 61 ULL);..}...retva
11fe0 6c 5f 63 6f 75 6e 74 20 3d 20 36 34 3b 0a 09 72 l_count = 64;..r
11ff0 65 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f 63 28 72 etval = malloc(r
12000 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 etval_count * si
12010 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a zeof(*retval));.
12020 0a 09 66 6f 72 20 28 63 75 72 72 5f 61 74 74 72 ..for (curr_attr
12030 5f 74 79 70 65 20 3d 20 30 3b 20 63 75 72 72 5f _type = 0; curr_
12040 61 74 74 72 5f 74 79 70 65 20 3c 20 30 78 63 65 attr_type < 0xce
12050 35 33 36 33 62 66 3b 20 63 75 72 72 5f 61 74 74 5363bf; curr_att
12060 72 5f 74 79 70 65 2b 2b 29 20 7b 0a 09 09 69 66 r_type++) {...if
12070 20 28 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 (curr_attr_type
12080 20 3d 3d 20 30 78 38 30 30 29 20 7b 0a 09 09 09 == 0x800) {....
12090 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3d curr_attr_type =
120a0 20 30 78 63 65 35 33 36 33 30 30 3b 0a 09 09 7d 0xce536300;...}
120b0 0a 0a 09 09 70 56 61 6c 75 65 5f 66 72 65 65 20 ....pValue_free
120c0 3d 20 30 3b 0a 09 09 70 56 61 6c 75 65 20 3d 20 = 0;...pValue =
120d0 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65 4c NULL;...ulValueL
120e0 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d en = (CK_LONG) -
120f0 31 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 63 75 1;....switch (cu
12100 72 72 5f 61 74 74 72 5f 74 79 70 65 29 20 7b 0a rr_attr_type) {.
12110 09 09 09 63 61 73 65 20 43 4b 41 5f 43 4c 41 53 ...case CKA_CLAS
12120 53 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 S:.....CACKEY_DE
12130 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 BUG_PRINTF("Requ
12140 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 esting attribute
12150 20 43 4b 41 5f 43 4c 41 53 53 20 28 30 78 25 30 CKA_CLASS (0x%0
12160 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 8lx) ...", (unsi
12170 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f gned long) curr_
12180 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 attr_type);.....
12190 09 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 .ck_object_class
121a0 20 3d 20 6f 62 6a 65 63 74 63 6c 61 73 73 3b 0a = objectclass;.
121b0 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 .....pValue = &c
121c0 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 3b 0a k_object_class;.
121d0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d ....ulValueLen =
121e0 20 73 69 7a 65 6f 66 28 63 6b 5f 6f 62 6a 65 63 sizeof(ck_objec
121f0 74 5f 63 6c 61 73 73 29 3b 0a 0a 09 09 09 09 43 t_class);......C
12200 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
12210 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 TF(" ... returni
12220 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 ng %lu (%p/%lu)"
12230 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
12240 29 20 2a 28 28 43 4b 5f 4f 42 4a 45 43 54 5f 43 ) *((CK_OBJECT_C
12250 4c 41 53 53 20 2a 29 20 70 56 61 6c 75 65 29 2c LASS *) pValue),
12260 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e pValue, (unsign
12270 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 ed long) ulValue
12280 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b Len);......break
12290 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 4f ;....case CKA_TO
122a0 4b 45 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f KEN:.....CACKEY_
122b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
122c0 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 questing attribu
122d0 74 65 20 43 4b 41 5f 54 4f 4b 45 4e 20 28 30 78 te CKA_TOKEN (0x
122e0 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e %08lx) ...", (un
122f0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 signed long) cur
12300 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 r_attr_type);...
12310 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f ...pValue = &ck_
12320 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 true;.....ulValu
12330 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b eLen = sizeof(ck
12340 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43 _true);......CAC
12350 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
12360 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 (" ... returning
12370 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 %lu (%p/%lu)",
12380 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
12390 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 *((CK_BBOOL *) p
123a0 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 Value), pValue,
123b0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
123c0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 ulValueLen);....
123d0 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 ..break;....case
123e0 20 43 4b 41 5f 50 52 49 56 41 54 45 3a 0a 09 09 CKA_PRIVATE:...
123f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
12400 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e RINTF("Requestin
12410 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f g attribute CKA_
12420 50 52 49 56 41 54 45 20 28 30 78 25 30 38 6c 78 PRIVATE (0x%08lx
12430 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 ) ...", (unsigne
12440 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 d long) curr_att
12450 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 r_type);......if
12460 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d (objectclass !=
12470 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 CKO_NETSCAPE_TR
12480 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b UST) {......CACK
12490 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
124a0 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 " ... but not ge
124b0 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 tting it because
124c0 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 4e 65 we are not a Ne
124d0 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a tscape trust obj
124e0 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 ect");.......bre
124f0 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 70 ak;.....}......p
12500 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 Value = &ck_fals
12510 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 e;.....ulValueLe
12520 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 n = sizeof(ck_fa
12530 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 lse);......CACKE
12540 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
12550 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 ... returning %
12560 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 lu (%p/%lu)", (u
12570 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 nsigned long) *(
12580 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 (CK_BBOOL *) pVa
12590 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 lue), pValue, (u
125a0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c nsigned long) ul
125b0 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 ValueLen);......
125c0 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 break;....case C
125d0 4b 41 5f 54 52 55 53 54 45 44 3a 0a 09 09 09 09 KA_TRUSTED:.....
125e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
125f0 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 NTF("Requesting
12600 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52 attribute CKA_TR
12610 55 53 54 45 44 20 28 30 78 25 30 38 6c 78 29 20 USTED (0x%08lx)
12620 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 ...", (unsigned
12630 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f long) curr_attr_
12640 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 type);......if (
12650 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 objectclass == C
12660 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 KO_NETSCAPE_TRUS
12670 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 T) {......CACKEY
12680 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 _DEBUG_PRINTF("
12690 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 ... but not gett
126a0 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 ing it because w
126b0 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 e are a Netscape
126c0 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b trust object");
126d0 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 .......break;...
126e0 09 09 7d 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 ..}......pValue
126f0 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 = &ck_true;.....
12700 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a ulValueLen = siz
12710 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 eof(ck_true);...
12720 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
12730 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 PRINTF(" ... ret
12740 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 urning %lu (%p/%
12750 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 lu)", (unsigned
12760 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f long) *((CK_BBOO
12770 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 L *) pValue), pV
12780 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 alue, (unsigned
12790 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e long) ulValueLen
127a0 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 );......break;..
127b0 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 49 46 ..case CKA_MODIF
127c0 49 41 42 4c 45 3a 0a 09 09 09 09 43 41 43 4b 45 IABLE:.....CACKE
127d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
127e0 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 Requesting attri
127f0 62 75 74 65 20 43 4b 41 5f 4d 4f 44 49 46 49 41 bute CKA_MODIFIA
12800 42 4c 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e BLE (0x%08lx) ..
12810 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f .", (unsigned lo
12820 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 ng) curr_attr_ty
12830 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 pe);......pValue
12840 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 = &ck_false;...
12850 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 ..ulValueLen = s
12860 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b izeof(ck_false);
12870 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 ......CACKEY_DEB
12880 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 UG_PRINTF(" ...
12890 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 returning %lu (%
128a0 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e p/%lu)", (unsign
128b0 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 ed long) *((CK_B
128c0 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c BOOL *) pValue),
128d0 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e pValue, (unsign
128e0 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 ed long) ulValue
128f0 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b Len);......break
12900 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4c 41 ;....case CKA_LA
12910 42 45 4c 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f BEL:.....CACKEY_
12920 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
12930 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 questing attribu
12940 74 65 20 43 4b 41 5f 4c 41 42 45 4c 20 28 30 78 te CKA_LABEL (0x
12950 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e %08lx) ...", (un
12960 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 signed long) cur
12970 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 r_attr_type);...
12980 09 09 09 2f 2a 20 58 58 58 3a 20 44 65 74 65 72 .../* XXX: Deter
12990 6d 69 6e 65 20 6e 61 6d 65 20 2a 2f 0a 09 09 09 mine name */....
129a0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 6e .ulValueLen = sn
129b0 70 72 69 6e 74 66 28 28 63 68 61 72 20 2a 29 20 printf((char *)
129c0 75 63 54 6d 70 42 75 66 2c 20 73 69 7a 65 6f 66 ucTmpBuf, sizeof
129d0 28 75 63 54 6d 70 42 75 66 29 2c 20 22 49 64 65 (ucTmpBuf), "Ide
129e0 6e 74 69 74 79 20 23 25 6c 75 22 2c 20 28 75 6e ntity #%lu", (un
129f0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65 signed long) ide
12a00 6e 74 69 74 79 5f 6e 75 6d 29 3b 0a 09 09 09 09 ntity_num);.....
12a10 70 56 61 6c 75 65 20 3d 20 75 63 54 6d 70 42 75 pValue = ucTmpBu
12a20 66 3b 0a 0a 09 09 09 09 69 66 20 28 75 6c 56 61 f;......if (ulVa
12a30 6c 75 65 4c 65 6e 20 3e 3d 20 73 69 7a 65 6f 66 lueLen >= sizeof
12a40 28 75 63 54 6d 70 42 75 66 29 29 20 7b 0a 09 09 (ucTmpBuf)) {...
12a50 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 ...ulValueLen =
12a60 30 3b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 0;......pValue =
12a70 20 4e 55 4c 4c 3b 0a 09 09 09 09 7d 0a 0a 09 09 NULL;.....}....
12a80 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
12a90 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 RINTF(" ... retu
12aa0 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c rning (%p/%lu)",
12ab0 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e pValue, (unsign
12ac0 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 ed long) ulValue
12ad0 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b Len);......break
12ae0 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 56 41 ;....case CKA_VA
12af0 4c 55 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f LUE:.....CACKEY_
12b00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
12b10 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 questing attribu
12b20 74 65 20 43 4b 41 5f 56 41 4c 55 45 20 28 30 78 te CKA_VALUE (0x
12b30 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e %08lx) ...", (un
12b40 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 signed long) cur
12b50 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 r_attr_type);...
12b60 09 09 09 73 77 69 74 63 68 20 28 6f 62 6a 65 63 ...switch (objec
12b70 74 63 6c 61 73 73 29 20 7b 0a 09 09 09 09 09 63 tclass) {......c
12b80 61 73 65 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f ase CKO_PRIVATE_
12b90 4b 45 59 3a 0a 09 09 09 09 09 09 43 41 43 4b 45 KEY:.......CACKE
12ba0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
12bb0 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 ... but not get
12bc0 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 ting it because
12bd0 77 65 20 61 72 65 20 61 20 70 72 69 76 61 74 65 we are a private
12be0 20 6b 65 79 2e 22 29 3b 0a 0a 09 09 09 09 09 09 key.");........
12bf0 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73 65 break;......case
12c00 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 CKO_NETSCAPE_TR
12c10 55 53 54 3a 0a 09 09 09 09 09 09 43 41 43 4b 45 UST:.......CACKE
12c20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
12c30 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 ... but not get
12c40 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 ting it because
12c50 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 we are a Netscap
12c60 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 e trust object")
12c70 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a ;........break;.
12c80 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 50 55 .....case CKO_PU
12c90 42 4c 49 43 5f 4b 45 59 3a 0a 09 09 09 09 09 09 BLIC_KEY:.......
12ca0 2f 2a 20 58 58 58 3a 20 54 4f 44 4f 20 2a 2f 0a /* XXX: TODO */.
12cb0 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 .......break;...
12cc0 09 09 09 63 61 73 65 20 43 4b 4f 5f 43 45 52 54 ...case CKO_CERT
12cd0 49 46 49 43 41 54 45 3a 0a 09 09 09 09 09 09 70 IFICATE:.......p
12ce0 56 61 6c 75 65 20 3d 20 63 65 72 74 69 66 69 63 Value = certific
12cf0 61 74 65 3b 0a 09 09 09 09 09 09 75 6c 56 61 6c ate;.......ulVal
12d00 75 65 4c 65 6e 20 3d 20 63 65 72 74 69 66 69 63 ueLen = certific
12d10 61 74 65 5f 6c 65 6e 3b 0a 0a 09 09 09 09 09 09 ate_len;........
12d20 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 break;.....}....
12d30 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
12d40 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 RINTF(" ... retu
12d50 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 rning %p/%lu", p
12d60 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 Value, (unsigned
12d70 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 long) ulValueLe
12d80 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a n);......break;.
12d90 09 09 09 63 61 73 65 20 43 4b 41 5f 49 53 53 55 ...case CKA_ISSU
12da0 45 52 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 ER:.....CACKEY_D
12db0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 EBUG_PRINTF("Req
12dc0 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 uesting attribut
12dd0 65 20 43 4b 41 5f 49 53 53 55 45 52 20 28 30 78 e CKA_ISSUER (0x
12de0 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e %08lx) ...", (un
12df0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 signed long) cur
12e00 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 r_attr_type);...
12e10 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 ...if (objectcla
12e20 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 ss != CKO_CERTIF
12e30 49 43 41 54 45 20 26 26 20 6f 62 6a 65 63 74 63 ICATE && objectc
12e40 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 lass != CKO_NETS
12e50 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 CAPE_TRUST) {...
12e60 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
12e70 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 PRINTF(" ... but
12e80 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 not getting it
12e90 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e because we are n
12ea0 6f 74 20 61 20 63 65 72 74 69 66 69 63 61 74 65 ot a certificate
12eb0 20 6f 72 20 4e 65 74 73 63 61 70 65 20 74 72 75 or Netscape tru
12ec0 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 st object");....
12ed0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a ...break;.....}.
12ee0 0a 09 09 09 09 69 66 20 28 63 65 72 74 69 66 69 .....if (certifi
12ef0 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b cate_len >= 0) {
12f00 0a 09 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f ......x509_read_
12f10 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 69 73 ret = x509_to_is
12f20 73 75 65 72 28 63 65 72 74 69 66 69 63 61 74 65 suer(certificate
12f30 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 , certificate_le
12f40 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 n, &pValue);....
12f50 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f ..if (x509_read_
12f60 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 ret < 0) {......
12f70 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a .pValue = NULL;.
12f80 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 .....} else {...
12f90 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d ....ulValueLen =
12fa0 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a x509_read_ret;.
12fb0 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 .....}.....}....
12fc0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
12fd0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 RINTF(" ... retu
12fe0 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 rning %p/%lu", p
12ff0 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 Value, (unsigned
13000 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 long) ulValueLe
13010 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a n);......break;.
13020 09 09 09 63 61 73 65 20 43 4b 41 5f 53 45 52 49 ...case CKA_SERI
13030 41 4c 5f 4e 55 4d 42 45 52 3a 0a 09 09 09 09 43 AL_NUMBER:.....C
13040 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
13050 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 TF("Requesting a
13060 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 45 52 ttribute CKA_SER
13070 49 41 4c 5f 4e 55 4d 42 45 52 20 28 30 78 25 30 IAL_NUMBER (0x%0
13080 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 8lx) ...", (unsi
13090 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f gned long) curr_
130a0 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 attr_type);.....
130b0 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 .if (objectclass
130c0 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 != CKO_CERTIFIC
130d0 41 54 45 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 ATE && objectcla
130e0 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 ss != CKO_NETSCA
130f0 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 PE_TRUST) {.....
13100 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
13110 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e INTF(" ... but n
13120 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 ot getting it be
13130 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 cause we are not
13140 20 61 20 63 65 72 74 69 66 69 63 61 74 65 20 6f a certificate o
13150 72 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 r Netscape trust
13160 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 object");......
13170 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 .break;.....}...
13180 09 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61 ...if (certifica
13190 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 te_len >= 0) {..
131a0 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 ....x509_read_re
131b0 74 20 3d 20 78 35 30 39 5f 74 6f 5f 73 65 72 69 t = x509_to_seri
131c0 61 6c 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 al(certificate,
131d0 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c certificate_len,
131e0 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 &pValue);......
131f0 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 if (x509_read_re
13200 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 t < 0) {.......p
13210 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 Value = NULL;...
13220 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 ...} else {.....
13230 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 ..ulValueLen = x
13240 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 509_read_ret;...
13250 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 ...}.....}......
13260 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
13270 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e NTF(" ... return
13280 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 ing (%p/%lu)", p
13290 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 Value, (unsigned
132a0 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 long) ulValueLe
132b0 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a n);......break;.
132c0 09 09 09 63 61 73 65 20 43 4b 41 5f 53 55 42 4a ...case CKA_SUBJ
132d0 45 43 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f ECT:.....CACKEY_
132e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
132f0 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 questing attribu
13300 74 65 20 43 4b 41 5f 53 55 42 4a 45 43 54 20 28 te CKA_SUBJECT (
13310 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 0x%08lx) ...", (
13320 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 unsigned long) c
13330 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a urr_attr_type);.
13340 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 .....if (objectc
13350 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 lass != CKO_CERT
13360 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09 09 IFICATE) {......
13370 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
13380 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f NTF(" ... but no
13390 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 t getting it bec
133a0 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 ause we are not
133b0 61 20 63 65 72 74 69 66 69 63 61 74 65 22 29 3b a certificate");
133c0 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 .......break;...
133d0 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72 ..}......if (cer
133e0 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 tificate_len >=
133f0 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 0) {......x509_r
13400 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 ead_ret = x509_t
13410 6f 5f 73 75 62 6a 65 63 74 28 63 65 72 74 69 66 o_subject(certif
13420 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 icate, certifica
13430 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 te_len, &pValue)
13440 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 39 5f ;......if (x509_
13450 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a read_ret < 0) {.
13460 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e ......pValue = N
13470 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 ULL;......} else
13480 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 {.......ulValue
13490 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f Len = x509_read_
134a0 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 ret;......}.....
134b0 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 }......CACKEY_DE
134c0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e BUG_PRINTF(" ...
134d0 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c returning %p/%l
134e0 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 u", pValue, (uns
134f0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 igned long) ulVa
13500 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 lueLen);......br
13510 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 eak;....case CKA
13520 5f 49 44 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f _ID:.....CACKEY_
13530 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
13540 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 questing attribu
13550 74 65 20 43 4b 41 5f 49 44 20 28 30 78 25 30 38 te CKA_ID (0x%08
13560 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 lx) ...", (unsig
13570 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 ned long) curr_a
13580 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 ttr_type);......
13590 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 if (objectclass
135a0 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f == CKO_NETSCAPE_
135b0 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 TRUST) {......CA
135c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
135d0 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 F(" ... but not
135e0 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 getting it becau
135f0 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 se we are a Nets
13600 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 cape trust objec
13610 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b t");.......break
13620 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 75 63 54 ;.....}......ucT
13630 6d 70 42 75 66 5b 30 5d 20 3d 20 28 28 69 64 65 mpBuf[0] = ((ide
13640 6e 74 69 74 79 5f 6e 75 6d 20 2b 20 31 29 20 3e ntity_num + 1) >
13650 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 09 09 09 > 8) & 0xff;....
13660 09 75 63 54 6d 70 42 75 66 5b 31 5d 20 3d 20 20 .ucTmpBuf[1] =
13670 28 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 2b 20 (identity_num +
13680 31 29 20 26 20 30 78 66 66 3b 0a 0a 09 09 09 09 1) & 0xff;......
13690 70 56 61 6c 75 65 20 3d 20 26 75 63 54 6d 70 42 pValue = &ucTmpB
136a0 75 66 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c uf;.....ulValueL
136b0 65 6e 20 3d 20 32 3b 0a 0a 09 09 09 09 43 41 43 en = 2;......CAC
136c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
136d0 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 (" ... returning
136e0 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 %p/%lu", pValue
136f0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
13700 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a ) ulValueLen);..
13710 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 ....break;....ca
13720 73 65 20 43 4b 41 5f 43 45 52 54 49 46 49 43 41 se CKA_CERTIFICA
13730 54 45 5f 54 59 50 45 3a 0a 09 09 09 09 43 41 43 TE_TYPE:.....CAC
13740 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
13750 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 ("Requesting att
13760 72 69 62 75 74 65 20 43 4b 41 5f 43 45 52 54 49 ribute CKA_CERTI
13770 46 49 43 41 54 45 5f 54 59 50 45 20 28 30 78 25 FICATE_TYPE (0x%
13780 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 08lx) ...", (uns
13790 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 igned long) curr
137a0 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 _attr_type);....
137b0 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 ..if (objectclas
137c0 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 s != CKO_CERTIFI
137d0 43 41 54 45 29 20 7b 0a 09 09 09 09 09 43 41 43 CATE) {......CAC
137e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
137f0 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 (" ... but not g
13800 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 etting it becaus
13810 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 63 e we are not a c
13820 65 72 74 69 66 69 63 61 74 65 2e 22 29 3b 0a 0a ertificate.");..
13830 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 .....break;.....
13840 7d 0a 0a 09 09 09 09 2f 2a 20 57 65 20 6f 6e 6c }....../* We onl
13850 79 20 73 75 70 70 6f 72 74 20 6f 6e 65 20 63 65 y support one ce
13860 72 74 69 66 69 63 61 74 65 20 74 79 70 65 20 2a rtificate type *
13870 2f 0a 09 09 09 09 63 6b 5f 63 65 72 74 69 66 69 /.....ck_certifi
13880 63 61 74 65 5f 74 79 70 65 20 3d 20 43 4b 43 5f cate_type = CKC_
13890 58 5f 35 30 39 3b 0a 0a 09 09 09 09 70 56 61 6c X_509;......pVal
138a0 75 65 20 3d 20 26 63 6b 5f 63 65 72 74 69 66 69 ue = &ck_certifi
138b0 63 61 74 65 5f 74 79 70 65 3b 0a 09 09 09 09 75 cate_type;.....u
138c0 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 lValueLen = size
138d0 6f 66 28 63 6b 5f 63 65 72 74 69 66 69 63 61 74 of(ck_certificat
138e0 65 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 43 41 e_type);......CA
138f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
13900 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e F(" ... returnin
13910 67 20 43 4b 43 5f 58 5f 35 30 39 20 28 25 6c 75 g CKC_X_509 (%lu
13920 29 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e ) (%p/%lu)", (un
13930 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 signed long) *((
13940 43 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 CK_CERTIFICATE_T
13950 59 50 45 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 YPE *) pValue),
13960 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 pValue, (unsigne
13970 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c d long) ulValueL
13980 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b en);......break;
13990 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4b 45 59 ....case CKA_KEY
139a0 5f 54 59 50 45 3a 0a 09 09 09 09 43 41 43 4b 45 _TYPE:.....CACKE
139b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
139c0 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 Requesting attri
139d0 62 75 74 65 20 43 4b 41 5f 4b 45 59 5f 54 59 50 bute CKA_KEY_TYP
139e0 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 E (0x%08lx) ..."
139f0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
13a00 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 ) curr_attr_type
13a10 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 );......if (obje
13a20 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 ctclass != CKO_P
13a30 52 49 56 41 54 45 5f 4b 45 59 20 26 26 20 6f 62 RIVATE_KEY && ob
13a40 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f jectclass != CKO
13a50 5f 50 55 42 4c 49 43 5f 4b 45 59 29 20 7b 0a 09 _PUBLIC_KEY) {..
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 20 2e 2e 2e 20 62 75 _PRINTF(" ... bu
13a80 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 t not getting it
13a90 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 because we are
13aa0 6e 6f 74 20 61 20 6b 65 79 2e 22 29 3b 0a 0a 09 not a key.");...
13ab0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d ....break;.....}
13ac0 0a 0a 09 09 09 09 2f 2a 20 57 65 20 6f 6e 6c 79 ....../* We only
13ad0 20 73 75 70 70 6f 72 74 20 6f 6e 65 20 6b 65 79 support one key
13ae0 20 74 79 70 65 20 2a 2f 0a 09 09 09 09 63 6b 5f type */.....ck_
13af0 6b 65 79 5f 74 79 70 65 20 3d 20 43 4b 4b 5f 52 key_type = CKK_R
13b00 53 41 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 SA;......pValue
13b10 3d 20 26 63 6b 5f 6b 65 79 5f 74 79 70 65 3b 0a = &ck_key_type;.
13b20 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d ....ulValueLen =
13b30 20 73 69 7a 65 6f 66 28 63 6b 5f 6b 65 79 5f 74 sizeof(ck_key_t
13b40 79 70 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 ype);......CACKE
13b50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
13b60 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 43 ... returning C
13b70 4b 4b 5f 52 53 41 20 28 25 6c 75 29 20 28 25 70 KK_RSA (%lu) (%p
13b80 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 /%lu)", (unsigne
13b90 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 43 45 d long) *((CK_CE
13ba0 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 20 2a RTIFICATE_TYPE *
13bb0 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 ) pValue), pValu
13bc0 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e e, (unsigned lon
13bd0 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a g) ulValueLen);.
13be0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 .....break;....c
13bf0 61 73 65 20 43 4b 41 5f 53 49 47 4e 3a 0a 09 09 ase CKA_SIGN:...
13c00 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
13c10 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e RINTF("Requestin
13c20 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f g attribute CKA_
13c30 53 49 47 4e 20 28 30 78 25 30 38 6c 78 29 20 2e SIGN (0x%08lx) .
13c40 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c ..", (unsigned l
13c50 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 ong) curr_attr_t
13c60 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f ype);......if (o
13c70 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b bjectclass == CK
13c80 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 O_NETSCAPE_TRUST
13c90 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f ) {......CACKEY_
13ca0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e DEBUG_PRINTF(" .
13cb0 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 .. but not getti
13cc0 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 ng it because we
13cd0 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 are a Netscape
13ce0 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a trust object");.
13cf0 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 ......break;....
13d00 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 .}......if (obje
13d10 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 ctclass == CKO_P
13d20 52 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 RIVATE_KEY) {...
13d30 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f ...pValue = &ck_
13d40 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c true;......ulVal
13d50 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 ueLen = sizeof(c
13d60 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 k_true);.....} e
13d70 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 lse {......pValu
13d80 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 e = &ck_false;..
13d90 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d ....ulValueLen =
13da0 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 sizeof(ck_false
13db0 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 );.....}......CA
13dc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
13dd0 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e F(" ... returnin
13de0 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c g %lu (%p/%lu)",
13df0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
13e00 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 *((CK_BBOOL *)
13e10 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c pValue), pValue,
13e20 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
13e30 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 ulValueLen);...
13e40 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 ...break;....cas
13e50 65 20 43 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56 e CKA_SIGN_RECOV
13e60 45 52 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 ER:.....CACKEY_D
13e70 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 EBUG_PRINTF("Req
13e80 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 uesting attribut
13e90 65 20 43 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56 e CKA_SIGN_RECOV
13ea0 45 52 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e ER (0x%08lx) ...
13eb0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e ", (unsigned lon
13ec0 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 g) curr_attr_typ
13ed0 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a e);......if (obj
13ee0 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f ectclass == CKO_
13ef0 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 NETSCAPE_TRUST)
13f00 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 {......CACKEY_DE
13f10 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e BUG_PRINTF(" ...
13f20 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 but not getting
13f30 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 it because we a
13f40 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 re a Netscape tr
13f50 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 ust object");...
13f60 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d ....break;.....}
13f70 0a 0a 09 09 09 09 2f 2a 20 57 65 20 63 75 72 72 ....../* We curr
13f80 65 6e 74 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f ently only suppo
13f90 72 74 20 22 53 69 67 6e 20 77 69 74 68 20 41 70 rt "Sign with Ap
13fa0 70 65 6e 64 69 78 22 20 2a 2f 0a 09 09 09 09 70 pendix" */.....p
13fb0 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 Value = &ck_fals
13fc0 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 e;.....ulValueLe
13fd0 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 n = sizeof(ck_fa
13fe0 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 lse);......CACKE
13ff0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
14000 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 ... returning %
14010 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 lu (%p/%lu)", (u
14020 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 nsigned long) *(
14030 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 (CK_BBOOL *) pVa
14040 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 lue), pValue, (u
14050 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c nsigned long) ul
14060 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 ValueLen);......
14070 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 break;....case C
14080 4b 41 5f 44 45 43 52 59 50 54 3a 0a 09 09 09 09 KA_DECRYPT:.....
14090 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
140a0 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 NTF("Requesting
140b0 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 44 45 attribute CKA_DE
140c0 43 52 59 50 54 20 28 30 78 25 30 38 6c 78 29 20 CRYPT (0x%08lx)
140d0 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 ...", (unsigned
140e0 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f long) curr_attr_
140f0 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 type);......if (
14100 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 objectclass == C
14110 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 KO_NETSCAPE_TRUS
14120 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 T) {......CACKEY
14130 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 _DEBUG_PRINTF("
14140 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 ... but not gett
14150 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 ing it because w
14160 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 e are a Netscape
14170 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b trust object");
14180 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 .......break;...
14190 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a ..}......if (obj
141a0 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f ectclass == CKO_
141b0 50 52 49 56 41 54 45 5f 4b 45 59 20 7c 7c 20 6f PRIVATE_KEY || o
141c0 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b bjectclass == CK
141d0 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 29 20 7b 0a O_PUBLIC_KEY) {.
141e0 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 .....pValue = &c
141f0 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 k_true;......ulV
14200 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 alueLen = sizeof
14210 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d (ck_true);.....}
14220 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61 else {......pVa
14230 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b lue = &ck_false;
14240 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e ......ulValueLen
14250 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c = sizeof(ck_fal
14260 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 se);.....}......
14270 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
14280 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e NTF(" ... return
14290 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 ing %lu (%p/%lu)
142a0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e ", (unsigned lon
142b0 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a g) *((CK_BBOOL *
142c0 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 ) pValue), pValu
142d0 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e e, (unsigned lon
142e0 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a g) ulValueLen);.
142f0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 .....break;....c
14300 61 73 65 20 43 4b 41 5f 53 45 4e 53 49 54 49 56 ase CKA_SENSITIV
14310 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 E:.....CACKEY_DE
14320 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 BUG_PRINTF("Requ
14330 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 esting attribute
14340 20 43 4b 41 5f 53 45 4e 53 49 54 49 56 45 20 28 CKA_SENSITIVE (
14350 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 0x%08lx) ...", (
14360 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 unsigned long) c
14370 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a urr_attr_type);.
14380 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 .....if (objectc
14390 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 lass == CKO_NETS
143a0 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 CAPE_TRUST) {...
143b0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
143c0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 PRINTF(" ... but
143d0 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 not getting it
143e0 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 because we are a
143f0 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 Netscape trust
14400 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 object");.......
14410 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 break;.....}....
14420 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 ..if (objectclas
14430 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 s == CKO_PRIVATE
14440 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61 _KEY) {......pVa
14450 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a lue = &ck_true;.
14460 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 .....ulValueLen
14470 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 = sizeof(ck_true
14480 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a );.....} else {.
14490 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 .....pValue = &c
144a0 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c k_false;......ul
144b0 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f ValueLen = sizeo
144c0 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 f(ck_false);....
144d0 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 .}......CACKEY_D
144e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e EBUG_PRINTF(" ..
144f0 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 . returning %lu
14500 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 (%p/%lu)", (unsi
14510 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b gned long) *((CK
14520 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 _BBOOL *) pValue
14530 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 ), pValue, (unsi
14540 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c gned long) ulVal
14550 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 ueLen);......bre
14560 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f ak;....case CKA_
14570 45 58 54 52 41 43 54 41 42 4c 45 3a 0a 09 09 09 EXTRACTABLE:....
14580 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
14590 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 INTF("Requesting
145a0 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 45 attribute CKA_E
145b0 58 54 52 41 43 54 41 42 4c 45 20 28 30 78 25 30 XTRACTABLE (0x%0
145c0 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 8lx) ...", (unsi
145d0 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f gned long) curr_
145e0 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 attr_type);.....
145f0 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 .if (objectclass
14600 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 == CKO_NETSCAPE
14610 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 _TRUST) {......C
14620 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
14630 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 TF(" ... but not
14640 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 getting it beca
14650 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 use we are a Net
14660 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 scape trust obje
14670 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 ct");.......brea
14680 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 k;.....}......if
14690 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d (objectclass ==
146a0 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 CKO_PRIVATE_KEY
146b0 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 ) {......pValue
146c0 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 = &ck_false;....
146d0 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 ..ulValueLen = s
146e0 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a izeof(ck_true);.
146f0 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 ....} else {....
14700 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 ..pValue = &ck_t
14710 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 rue;......ulValu
14720 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b eLen = sizeof(ck
14730 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a _false);.....}..
14740 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
14750 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 _PRINTF(" ... re
14760 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f turning %lu (%p/
14770 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 %lu)", (unsigned
14780 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f long) *((CK_BBO
14790 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 OL *) pValue), p
147a0 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 Value, (unsigned
147b0 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 long) ulValueLe
147c0 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a n);......break;.
147d0 09 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55 ...case CKA_MODU
147e0 4c 55 53 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f LUS:.....CACKEY_
147f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
14800 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 questing attribu
14810 74 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 20 28 te CKA_MODULUS (
14820 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 0x%08lx) ...", (
14830 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 unsigned long) c
14840 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a urr_attr_type);.
14850 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 .....if (objectc
14860 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 lass == CKO_NETS
14870 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 CAPE_TRUST) {...
14880 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
14890 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 PRINTF(" ... but
148a0 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 not getting it
148b0 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 because we are a
148c0 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 Netscape trust
148d0 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 object");.......
148e0 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 break;.....}....
148f0 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 ..if (certificat
14900 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 e_len >= 0) {...
14910 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 ...x509_read_ret
14920 20 3d 20 78 35 30 39 5f 74 6f 5f 6d 6f 64 75 6c = x509_to_modul
14930 75 73 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 us(certificate,
14940 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c certificate_len,
14950 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 &pValue);......
14960 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 if (x509_read_re
14970 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 t < 0) {.......p
14980 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 Value = NULL;...
14990 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 ...} else {.....
149a0 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 ..ulValueLen = x
149b0 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 509_read_ret;...
149c0 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 ...}.....}......
149d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
149e0 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e NTF(" ... return
149f0 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 ing (%p/%lu)", p
14a00 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 Value, (unsigned
14a10 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 long) ulValueLe
14a20 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a n);......break;.
14a30 09 09 09 63 61 73 65 20 43 4b 41 5f 50 55 42 4c ...case CKA_PUBL
14a40 49 43 5f 45 58 50 4f 4e 45 4e 54 3a 0a 09 09 09 IC_EXPONENT:....
14a50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
14a60 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 INTF("Requesting
14a70 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 50 attribute CKA_P
14a80 55 42 4c 49 43 5f 45 58 50 4f 4e 45 4e 54 20 28 UBLIC_EXPONENT (
14a90 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 0x%08lx) ...", (
14aa0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 unsigned long) c
14ab0 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a urr_attr_type);.
14ac0 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 .....if (objectc
14ad0 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 lass == CKO_NETS
14ae0 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 CAPE_TRUST) {...
14af0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
14b00 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 PRINTF(" ... but
14b10 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 not getting it
14b20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 because we are a
14b30 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 Netscape trust
14b40 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 object");.......
14b50 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 break;.....}....
14b60 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 ..if (certificat
14b70 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 e_len >= 0) {...
14b80 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 ...x509_read_ret
14b90 20 3d 20 78 35 30 39 5f 74 6f 5f 65 78 70 6f 6e = x509_to_expon
14ba0 65 6e 74 28 63 65 72 74 69 66 69 63 61 74 65 2c ent(certificate,
14bb0 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e certificate_len
14bc0 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 , &pValue);.....
14bd0 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 .if (x509_read_r
14be0 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 et < 0) {.......
14bf0 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 pValue = NULL;..
14c00 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 ....} else {....
14c10 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 ...ulValueLen =
14c20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 x509_read_ret;..
14c30 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 ....}.....}.....
14c40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
14c50 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 INTF(" ... retur
14c60 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 ning (%p/%lu)",
14c70 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 pValue, (unsigne
14c80 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c d long) ulValueL
14c90 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b en);......break;
14ca0 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 ....case CKA_TRU
14cb0 53 54 5f 44 49 47 49 54 41 4c 5f 53 49 47 4e 41 ST_DIGITAL_SIGNA
14cc0 54 55 52 45 3a 0a 09 09 09 63 61 73 65 20 43 4b TURE:....case CK
14cd0 41 5f 54 52 55 53 54 5f 4e 4f 4e 5f 52 45 50 55 A_TRUST_NON_REPU
14ce0 44 49 41 54 49 4f 4e 3a 0a 09 09 09 63 61 73 65 DIATION:....case
14cf0 20 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59 5f 45 CKA_TRUST_KEY_E
14d00 4e 43 49 50 48 45 52 4d 45 4e 54 3a 0a 09 09 09 NCIPHERMENT:....
14d10 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 44 case CKA_TRUST_D
14d20 41 54 41 5f 45 4e 43 49 50 48 45 52 4d 45 4e 54 ATA_ENCIPHERMENT
14d30 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 :....case CKA_TR
14d40 55 53 54 5f 4b 45 59 5f 41 47 52 45 45 4d 45 4e UST_KEY_AGREEMEN
14d50 54 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 T:....case CKA_T
14d60 52 55 53 54 5f 4b 45 59 5f 43 45 52 54 5f 53 49 RUST_KEY_CERT_SI
14d70 47 4e 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f GN:....case CKA_
14d80 54 52 55 53 54 5f 43 52 4c 5f 53 49 47 4e 3a 0a TRUST_CRL_SIGN:.
14d90 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 ...case CKA_TRUS
14da0 54 5f 53 45 52 56 45 52 5f 41 55 54 48 3a 0a 09 T_SERVER_AUTH:..
14db0 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 ..case CKA_TRUST
14dc0 5f 43 4c 49 45 4e 54 5f 41 55 54 48 3a 0a 09 09 _CLIENT_AUTH:...
14dd0 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f .case CKA_TRUST_
14de0 43 4f 44 45 5f 53 49 47 4e 49 4e 47 3a 0a 09 09 CODE_SIGNING:...
14df0 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f .case CKA_TRUST_
14e00 45 4d 41 49 4c 5f 50 52 4f 54 45 43 54 49 4f 4e EMAIL_PROTECTION
14e10 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 :.....CACKEY_DEB
14e20 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 UG_PRINTF("Reque
14e30 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 sting attribute
14e40 43 4b 41 5f 54 52 55 53 54 5f 2e 2e 2e 20 28 30 CKA_TRUST_... (0
14e50 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 x%08lx) ...", (u
14e60 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 nsigned long) cu
14e70 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a rr_attr_type);..
14e80 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b ....pValue = &ck
14e90 5f 74 72 75 73 74 65 64 3b 0a 09 09 09 09 75 6c _trusted;.....ul
14ea0 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f ValueLen = sizeo
14eb0 66 28 63 6b 5f 74 72 75 73 74 65 64 29 3b 0a 0a f(ck_trusted);..
14ec0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
14ed0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 _PRINTF(" ... re
14ee0 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f turning %lu (%p/
14ef0 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 %lu)", (unsigned
14f00 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 54 52 55 long) *((CK_TRU
14f10 53 54 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 ST *) pValue), p
14f20 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 Value, (unsigned
14f30 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 long) ulValueLe
14f40 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a n);......break;.
14f50 09 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52 54 ...case CKA_CERT
14f60 5f 53 48 41 31 5f 48 41 53 48 3a 0a 09 09 09 09 _SHA1_HASH:.....
14f70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
14f80 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 NTF("Requesting
14f90 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43 45 attribute CKA_CE
14fa0 52 54 5f 53 48 41 31 5f 48 41 53 48 20 28 30 78 RT_SHA1_HASH (0x
14fb0 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e %08lx) ...", (un
14fc0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 signed long) cur
14fd0 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 r_attr_type);...
14fe0 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 ...if (objectcla
14ff0 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 ss != CKO_NETSCA
15000 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 PE_TRUST) {.....
15010 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
15020 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e INTF(" ... but n
15030 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 ot getting it be
15040 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 cause we are not
15050 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 a Netscape trus
15060 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 t object");.....
15070 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a ..break;.....}..
15080 09 09 09 09 53 48 41 31 52 65 73 65 74 28 26 73 ....SHA1Reset(&s
15090 68 61 31 5f 63 74 78 29 3b 0a 09 09 09 09 53 48 ha1_ctx);.....SH
150a0 41 31 49 6e 70 75 74 28 26 73 68 61 31 5f 63 74 A1Input(&sha1_ct
150b0 78 2c 20 63 65 72 74 69 66 69 63 61 74 65 2c 20 x, certificate,
150c0 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 certificate_len)
150d0 3b 0a 09 09 09 09 53 48 41 31 52 65 73 75 6c 74 ;.....SHA1Result
150e0 28 26 73 68 61 31 5f 63 74 78 2c 20 73 68 61 31 (&sha1_ctx, sha1
150f0 5f 68 61 73 68 29 3b 0a 0a 09 09 09 09 70 56 61 _hash);......pVa
15100 6c 75 65 20 3d 20 73 68 61 31 5f 68 61 73 68 3b lue = sha1_hash;
15110 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 .....ulValueLen
15120 3d 20 73 69 7a 65 6f 66 28 73 68 61 31 5f 68 61 = sizeof(sha1_ha
15130 73 68 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 sh);......CACKEY
15140 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 _DEBUG_PRINTF("
15150 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 ... returning %p
15160 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 /%lu", pValue, (
15170 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 unsigned long) u
15180 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 lValueLen);.....
15190 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 .break;....case
151a0 43 4b 41 5f 43 45 52 54 5f 4d 44 35 5f 48 41 53 CKA_CERT_MD5_HAS
151b0 48 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 H:.....CACKEY_DE
151c0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 BUG_PRINTF("Requ
151d0 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 esting attribute
151e0 20 43 4b 41 5f 43 45 52 54 5f 4d 44 35 5f 48 41 CKA_CERT_MD5_HA
151f0 53 48 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e SH (0x%08lx) ...
15200 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e ", (unsigned lon
15210 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 g) curr_attr_typ
15220 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a e);......if (obj
15230 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f ectclass != CKO_
15240 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 NETSCAPE_TRUST)
15250 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 {......CACKEY_DE
15260 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e BUG_PRINTF(" ...
15270 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 but not getting
15280 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 it because we a
15290 72 65 20 6e 6f 74 20 61 20 4e 65 74 73 63 61 70 re not a Netscap
152a0 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 e trust object")
152b0 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 ;.......break;..
152c0 09 09 09 7d 0a 0a 09 09 09 09 4d 44 35 49 6e 69 ...}......MD5Ini
152d0 74 28 26 6d 64 35 5f 63 74 78 29 3b 0a 09 09 09 t(&md5_ctx);....
152e0 09 4d 44 35 55 70 64 61 74 65 28 26 6d 64 35 5f .MD5Update(&md5_
152f0 63 74 78 2c 20 63 65 72 74 69 66 69 63 61 74 65 ctx, certificate
15300 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 , certificate_le
15310 6e 29 3b 0a 09 09 09 09 4d 44 35 46 69 6e 61 6c n);.....MD5Final
15320 28 6d 64 35 5f 68 61 73 68 2c 20 26 6d 64 35 5f (md5_hash, &md5_
15330 63 74 78 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 ctx);......pValu
15340 65 20 3d 20 6d 64 35 5f 68 61 73 68 3b 0a 09 09 e = md5_hash;...
15350 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 ..ulValueLen = s
15360 69 7a 65 6f 66 28 6d 64 35 5f 68 61 73 68 29 3b izeof(md5_hash);
15370 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 ......CACKEY_DEB
15380 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 UG_PRINTF(" ...
15390 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 returning %p/%lu
153a0 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 ", pValue, (unsi
153b0 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c gned long) ulVal
153c0 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 ueLen);......bre
153d0 61 6b 3b 0a 09 09 09 64 65 66 61 75 6c 74 3a 0a ak;....default:.
153e0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c ....pValue = NUL
153f0 4c 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 L;.....ulValueLe
15400 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 n = (CK_LONG) -1
15410 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d ;.....break;...}
15420 0a 0a 09 09 69 66 20 28 28 28 43 4b 5f 4c 4f 4e ....if (((CK_LON
15430 47 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 20 21 G) ulValueLen) !
15440 3d 20 28 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 29 = ((CK_LONG) -1)
15450 29 20 7b 0a 09 09 09 2f 2a 20 50 75 73 68 20 63 ) {..../* Push c
15460 75 72 72 5f 61 74 74 72 20 6f 6e 74 6f 20 74 68 urr_attr onto th
15470 65 20 73 74 61 63 6b 20 2a 2f 0a 09 09 09 63 75 e stack */....cu
15480 72 72 5f 61 74 74 72 2e 74 79 70 65 20 3d 20 63 rr_attr.type = c
15490 75 72 72 5f 61 74 74 72 5f 74 79 70 65 3b 0a 09 urr_attr_type;..
154a0 09 09 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 ..curr_attr.ulVa
154b0 6c 75 65 4c 65 6e 20 3d 20 75 6c 56 61 6c 75 65 lueLen = ulValue
154c0 4c 65 6e 3b 0a 0a 09 09 09 63 75 72 72 5f 61 74 Len;.....curr_at
154d0 74 72 2e 70 56 61 6c 75 65 20 3d 20 6d 61 6c 6c tr.pValue = mall
154e0 6f 63 28 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 oc(curr_attr.ulV
154f0 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 6d 65 6d alueLen);....mem
15500 63 70 79 28 63 75 72 72 5f 61 74 74 72 2e 70 56 cpy(curr_attr.pV
15510 61 6c 75 65 2c 20 70 56 61 6c 75 65 2c 20 63 75 alue, pValue, cu
15520 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c rr_attr.ulValueL
15530 65 6e 29 3b 0a 0a 09 09 09 69 66 20 28 70 56 61 en);.....if (pVa
15540 6c 75 65 5f 66 72 65 65 20 26 26 20 70 56 61 6c lue_free && pVal
15550 75 65 29 20 7b 0a 09 09 09 09 66 72 65 65 28 70 ue) {.....free(p
15560 56 61 6c 75 65 29 3b 0a 09 09 09 7d 0a 0a 09 09 Value);....}....
15570 09 69 66 20 28 6e 75 6d 61 74 74 72 73 20 3e 3d .if (numattrs >=
15580 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74 29 20 7b retval_count) {
15590 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 72 65 .....retval = re
155a0 61 6c 6c 6f 63 28 72 65 74 76 61 6c 2c 20 72 65 alloc(retval, re
155b0 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a tval_count * siz
155c0 65 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a 09 eof(*retval));..
155d0 09 09 7d 0a 0a 09 09 09 6d 65 6d 63 70 79 28 26 ..}.....memcpy(&
155e0 72 65 74 76 61 6c 5b 6e 75 6d 61 74 74 72 73 5d retval[numattrs]
155f0 2c 20 26 63 75 72 72 5f 61 74 74 72 2c 20 73 69 , &curr_attr, si
15600 7a 65 6f 66 28 63 75 72 72 5f 61 74 74 72 29 29 zeof(curr_attr))
15610 3b 0a 09 09 09 6e 75 6d 61 74 74 72 73 2b 2b 3b ;....numattrs++;
15620 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6e 75 ...}..}...if (nu
15630 6d 61 74 74 72 73 20 21 3d 20 30 29 20 7b 0a 09 mattrs != 0) {..
15640 09 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 3d 20 .retval_count =
15650 6e 75 6d 61 74 74 72 73 3b 0a 09 09 72 65 74 76 numattrs;...retv
15660 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 72 65 74 al = realloc(ret
15670 76 61 6c 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e val, retval_coun
15680 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74 76 t * sizeof(*retv
15690 61 6c 29 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a al));..} else {.
156a0 09 09 66 72 65 65 28 72 65 74 76 61 6c 29 3b 0a ..free(retval);.
156b0 0a 09 09 72 65 74 76 61 6c 20 3d 20 4e 55 4c 4c ...retval = NULL
156c0 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74 ;..}...*pulCount
156d0 20 3d 20 6e 75 6d 61 74 74 72 73 3b 0a 0a 09 43 = numattrs;...C
156e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
156f0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 25 6c TF("Returning %l
15700 75 20 6f 62 6a 65 63 74 73 20 28 25 70 29 2e 22 u objects (%p)."
15710 2c 20 6e 75 6d 61 74 74 72 73 2c 20 72 65 74 76 , numattrs, retv
15720 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 al);...return(re
15730 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 tval);.}..static
15740 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72 65 void cackey_fre
15750 65 5f 69 64 65 6e 74 69 74 69 65 73 28 73 74 72 e_identities(str
15760 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 uct cackey_ident
15770 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73 2c ity *identities,
15780 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 unsigned long i
15790 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 dentities_count)
157a0 20 7b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 {..CK_ATTRIBUTE
157b0 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09 75 6e *curr_attr;..un
157c0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 5f 69 signed long id_i
157d0 64 78 2c 20 61 74 74 72 5f 69 64 78 3b 0a 0a 09 dx, attr_idx;...
157e0 69 66 20 28 69 64 65 6e 74 69 74 69 65 73 20 3d if (identities =
157f0 3d 20 4e 55 4c 4c 20 7c 7c 20 69 64 65 6e 74 69 = NULL || identi
15800 74 69 65 73 5f 63 6f 75 6e 74 20 3d 3d 20 30 29 ties_count == 0)
15810 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a {...return;..}.
15820 0a 09 66 6f 72 20 28 69 64 5f 69 64 78 20 3d 20 ..for (id_idx =
15830 30 3b 20 69 64 5f 69 64 78 20 3c 20 69 64 65 6e 0; id_idx < iden
15840 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b 20 69 64 tities_count; id
15850 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 _idx++) {...if (
15860 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 identities[id_id
15870 78 5d 2e 61 74 74 72 69 62 75 74 65 73 29 20 7b x].attributes) {
15880 0a 09 09 09 66 6f 72 20 28 61 74 74 72 5f 69 64 ....for (attr_id
15890 78 20 3d 20 30 3b 20 61 74 74 72 5f 69 64 78 20 x = 0; attr_idx
158a0 3c 20 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f < identities[id_
158b0 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f idx].attributes_
158c0 63 6f 75 6e 74 3b 20 61 74 74 72 5f 69 64 78 2b count; attr_idx+
158d0 2b 29 20 7b 0a 09 09 09 09 63 75 72 72 5f 61 74 +) {.....curr_at
158e0 74 72 20 3d 20 26 69 64 65 6e 74 69 74 69 65 73 tr = &identities
158f0 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 [id_idx].attribu
15900 74 65 73 5b 61 74 74 72 5f 69 64 78 5d 3b 0a 0a tes[attr_idx];..
15910 09 09 09 09 69 66 20 28 63 75 72 72 5f 61 74 74 ....if (curr_att
15920 72 2d 3e 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 r->pValue) {....
15930 09 09 66 72 65 65 28 63 75 72 72 5f 61 74 74 72 ..free(curr_attr
15940 2d 3e 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 7d ->pValue);.....}
15950 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 69 64 ....}.....if (id
15960 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d entities[id_idx]
15970 2e 61 74 74 72 69 62 75 74 65 73 29 20 7b 0a 09 .attributes) {..
15980 09 09 09 66 72 65 65 28 69 64 65 6e 74 69 74 69 ...free(identiti
15990 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 es[id_idx].attri
159a0 62 75 74 65 73 29 3b 0a 09 09 09 7d 0a 0a 09 09 butes);....}....
159b0 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 .cackey_free_cer
159c0 74 73 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 ts(identities[id
159d0 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 _idx].pcsc_ident
159e0 69 74 79 2c 20 31 2c 20 31 29 3b 0a 09 09 7d 0a ity, 1, 1);...}.
159f0 09 7d 0a 0a 09 66 72 65 65 28 69 64 65 6e 74 69 .}...free(identi
15a00 74 69 65 73 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 ties);.}..static
15a10 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 struct cackey_i
15a20 64 65 6e 74 69 74 79 20 2a 63 61 63 6b 65 79 5f dentity *cackey_
15a30 72 65 61 64 5f 69 64 65 6e 74 69 74 69 65 73 28 read_identities(
15a40 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c struct cackey_sl
15a50 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e ot *slot, unsign
15a60 65 64 20 6c 6f 6e 67 20 2a 69 64 73 5f 66 6f 75 ed long *ids_fou
15a70 6e 64 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61 nd) {..struct ca
15a80 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 ckey_pcsc_identi
15a90 74 79 20 2a 70 63 73 63 5f 69 64 65 6e 74 69 74 ty *pcsc_identit
15aa0 69 65 73 3b 0a 09 73 74 72 75 63 74 20 63 61 63 ies;..struct cac
15ab0 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 key_identity *id
15ac0 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73 69 67 entities;..unsig
15ad0 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 69 64 73 ned long num_ids
15ae0 2c 20 69 64 5f 69 64 78 2c 20 63 75 72 72 5f 69 , id_idx, curr_i
15af0 64 5f 74 79 70 65 3b 0a 09 75 6e 73 69 67 6e 65 d_type;..unsigne
15b00 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73 d long num_certs
15b10 2c 20 6e 75 6d 5f 65 78 74 72 61 5f 63 65 72 74 , num_extra_cert
15b20 73 2c 20 63 65 72 74 5f 69 64 78 3b 0a 0a 09 43 s, cert_idx;...C
15b30 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
15b40 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
15b50 09 6e 75 6d 5f 65 78 74 72 61 5f 63 65 72 74 73 .num_extra_certs
15b60 20 3d 20 73 69 7a 65 6f 66 28 65 78 74 72 61 5f = sizeof(extra_
15b70 63 65 72 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 certs) / sizeof(
15b80 65 78 74 72 61 5f 63 65 72 74 73 5b 30 5d 29 3b extra_certs[0]);
15b90 0a 0a 09 69 66 20 28 69 64 73 5f 66 6f 75 6e 64 ...if (ids_found
15ba0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 == NULL) {...CA
15bb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
15bc0 46 28 22 45 72 72 6f 72 2e 20 20 69 64 73 5f 66 F("Error. ids_f
15bd0 6f 75 6e 64 20 69 73 20 4e 55 4c 4c 22 29 3b 0a ound is NULL");.
15be0 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b ...return(NULL);
15bf0 0a 09 7d 0a 0a 09 70 63 73 63 5f 69 64 65 6e 74 ..}...pcsc_ident
15c00 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 ities = cackey_r
15c10 65 61 64 5f 63 65 72 74 73 28 73 6c 6f 74 2c 20 ead_certs(slot,
15c20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73 NULL, &num_certs
15c30 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 69 64 65 );..if (pcsc_ide
15c40 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 ntities != NULL)
15c50 20 7b 0a 09 09 2f 2a 20 43 6f 6e 76 65 72 74 20 {.../* Convert
15c60 6e 75 6d 62 65 72 20 6f 66 20 43 65 72 74 73 20 number of Certs
15c70 74 6f 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a to number of obj
15c80 65 63 74 73 20 2a 2f 0a 09 09 6e 75 6d 5f 69 64 ects */...num_id
15c90 73 20 3d 20 28 43 4b 4f 5f 50 52 49 56 41 54 45 s = (CKO_PRIVATE
15ca0 5f 4b 45 59 20 2d 20 43 4b 4f 5f 43 45 52 54 49 _KEY - CKO_CERTI
15cb0 46 49 43 41 54 45 20 2b 20 31 29 20 2a 20 6e 75 FICATE + 1) * nu
15cc0 6d 5f 63 65 72 74 73 3b 0a 09 09 6e 75 6d 5f 69 m_certs;...num_i
15cd0 64 73 20 2b 3d 20 6e 75 6d 5f 65 78 74 72 61 5f ds += num_extra_
15ce0 63 65 72 74 73 20 2a 20 32 3b 0a 0a 09 09 69 64 certs * 2;....id
15cf0 65 6e 74 69 74 69 65 73 20 3d 20 6d 61 6c 6c 6f entities = mallo
15d00 63 28 6e 75 6d 5f 69 64 73 20 2a 20 73 69 7a 65 c(num_ids * size
15d10 6f 66 28 2a 69 64 65 6e 74 69 74 69 65 73 29 29 of(*identities))
15d20 3b 0a 0a 09 09 2f 2a 20 41 64 64 20 63 65 72 74 ;..../* Add cert
15d30 69 66 69 63 61 74 65 73 2c 20 70 75 62 6c 69 63 ificates, public
15d40 20 6b 65 79 73 2c 20 61 6e 64 20 70 72 69 76 61 keys, and priva
15d50 74 65 20 6b 65 79 73 20 66 72 6f 6d 20 74 68 65 te keys from the
15d60 20 73 6d 61 72 74 63 61 72 64 20 2a 2f 0a 09 09 smartcard */...
15d70 69 64 5f 69 64 78 20 3d 20 30 3b 0a 09 09 66 6f id_idx = 0;...fo
15d80 72 20 28 63 65 72 74 5f 69 64 78 20 3d 20 30 3b r (cert_idx = 0;
15d90 20 63 65 72 74 5f 69 64 78 20 3c 20 6e 75 6d 5f cert_idx < num_
15da0 63 65 72 74 73 3b 20 63 65 72 74 5f 69 64 78 2b certs; cert_idx+
15db0 2b 29 20 7b 0a 09 09 09 66 6f 72 20 28 63 75 72 +) {....for (cur
15dc0 72 5f 69 64 5f 74 79 70 65 20 3d 20 43 4b 4f 5f r_id_type = CKO_
15dd0 43 45 52 54 49 46 49 43 41 54 45 3b 20 63 75 72 CERTIFICATE; cur
15de0 72 5f 69 64 5f 74 79 70 65 20 3c 3d 20 43 4b 4f r_id_type <= CKO
15df0 5f 50 52 49 56 41 54 45 5f 4b 45 59 3b 20 63 75 _PRIVATE_KEY; cu
15e00 72 72 5f 69 64 5f 74 79 70 65 2b 2b 29 20 7b 0a rr_id_type++) {.
15e10 09 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 ....identities[i
15e20 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 d_idx].attribute
15e30 73 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 s = cackey_get_a
15e40 74 74 72 69 62 75 74 65 73 28 63 75 72 72 5f 69 ttributes(curr_i
15e50 64 5f 74 79 70 65 2c 20 26 70 63 73 63 5f 69 64 d_type, &pcsc_id
15e60 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64 entities[cert_id
15e70 78 5d 2c 20 63 65 72 74 5f 69 64 78 2c 20 26 69 x], cert_idx, &i
15e80 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 dentities[id_idx
15e90 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 ].attributes_cou
15ea0 6e 74 29 3b 0a 0a 09 09 09 09 69 64 65 6e 74 69 nt);......identi
15eb0 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 ties[id_idx].pcs
15ec0 63 5f 69 64 65 6e 74 69 74 79 20 3d 20 6d 61 6c c_identity = mal
15ed0 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 69 64 65 6e loc(sizeof(*iden
15ee0 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 tities[id_idx].p
15ef0 63 73 63 5f 69 64 65 6e 74 69 74 79 29 29 3b 0a csc_identity));.
15f00 09 09 09 09 6d 65 6d 63 70 79 28 69 64 65 6e 74 ....memcpy(ident
15f10 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 ities[id_idx].pc
15f20 73 63 5f 69 64 65 6e 74 69 74 79 2c 20 26 70 63 sc_identity, &pc
15f30 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 sc_identities[ce
15f40 72 74 5f 69 64 78 5d 2c 20 73 69 7a 65 6f 66 28 rt_idx], sizeof(
15f50 2a 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 *identities[id_i
15f60 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 dx].pcsc_identit
15f70 79 29 29 3b 0a 0a 09 09 09 09 69 64 65 6e 74 69 y));......identi
15f80 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 ties[id_idx].pcs
15f90 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 c_identity->cert
15fa0 69 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 ificate = malloc
15fb0 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 (pcsc_identities
15fc0 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65 72 74 69 [cert_idx].certi
15fd0 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 ficate_len);....
15fe0 09 6d 65 6d 63 70 79 28 69 64 65 6e 74 69 74 69 .memcpy(identiti
15ff0 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f es[id_idx].pcsc_
16000 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 identity->certif
16010 69 63 61 74 65 2c 20 70 63 73 63 5f 69 64 65 6e icate, pcsc_iden
16020 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d tities[cert_idx]
16030 2e 63 65 72 74 69 66 69 63 61 74 65 2c 20 70 63 .certificate, pc
16040 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 sc_identities[ce
16050 72 74 5f 69 64 78 5d 2e 63 65 72 74 69 66 69 63 rt_idx].certific
16060 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 69 ate_len);......i
16070 64 5f 69 64 78 2b 2b 3b 0a 09 09 09 7d 0a 09 09 d_idx++;....}...
16080 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65 }....cackey_free
16090 5f 63 65 72 74 73 28 70 63 73 63 5f 69 64 65 6e _certs(pcsc_iden
160a0 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74 tities, num_cert
160b0 73 2c 20 31 29 3b 0a 0a 09 09 2f 2a 20 41 64 64 s, 1);..../* Add
160c0 20 44 6f 44 20 43 65 72 74 69 66 69 63 61 74 65 DoD Certificate
160d0 73 20 61 6e 64 20 4e 65 74 73 63 61 70 65 20 54 s and Netscape T
160e0 72 75 73 74 20 4f 62 6a 65 63 74 73 20 2a 2f 0a rust Objects */.
160f0 09 09 66 6f 72 20 28 63 65 72 74 5f 69 64 78 20 ..for (cert_idx
16100 3d 20 30 3b 20 63 65 72 74 5f 69 64 78 20 3c 20 = 0; cert_idx <
16110 6e 75 6d 5f 65 78 74 72 61 5f 63 65 72 74 73 3b num_extra_certs;
16120 20 63 65 72 74 5f 69 64 78 2b 2b 29 20 7b 0a 09 cert_idx++) {..
16130 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f ..identities[id_
16140 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 idx].pcsc_identi
16150 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 69 64 ty = NULL;....id
16160 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d entities[id_idx]
16170 2e 61 74 74 72 69 62 75 74 65 73 20 3d 20 63 61 .attributes = ca
16180 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75 ckey_get_attribu
16190 74 65 73 28 43 4b 4f 5f 43 45 52 54 49 46 49 43 tes(CKO_CERTIFIC
161a0 41 54 45 2c 20 26 65 78 74 72 61 5f 63 65 72 74 ATE, &extra_cert
161b0 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 30 78 66 s[cert_idx], 0xf
161c0 30 30 30 20 7c 20 63 65 72 74 5f 69 64 78 2c 20 000 | cert_idx,
161d0 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 &identities[id_i
161e0 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63 dx].attributes_c
161f0 6f 75 6e 74 29 3b 0a 0a 09 09 09 69 64 5f 69 64 ount);.....id_id
16200 78 2b 2b 3b 0a 09 09 7d 0a 0a 09 09 66 6f 72 20 x++;...}....for
16210 28 63 65 72 74 5f 69 64 78 20 3d 20 30 3b 20 63 (cert_idx = 0; c
16220 65 72 74 5f 69 64 78 20 3c 20 6e 75 6d 5f 65 78 ert_idx < num_ex
16230 74 72 61 5f 63 65 72 74 73 3b 20 63 65 72 74 5f tra_certs; cert_
16240 69 64 78 2b 2b 29 20 7b 0a 09 09 09 69 64 65 6e idx++) {....iden
16250 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 tities[id_idx].p
16260 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 20 4e csc_identity = N
16270 55 4c 4c 3b 0a 09 09 09 69 64 65 6e 74 69 74 69 ULL;....identiti
16280 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 es[id_idx].attri
16290 62 75 74 65 73 20 3d 20 63 61 63 6b 65 79 5f 67 butes = cackey_g
162a0 65 74 5f 61 74 74 72 69 62 75 74 65 73 28 43 4b et_attributes(CK
162b0 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 O_NETSCAPE_TRUST
162c0 2c 20 26 65 78 74 72 61 5f 63 65 72 74 73 5b 63 , &extra_certs[c
162d0 65 72 74 5f 69 64 78 5d 2c 20 30 78 66 30 30 30 ert_idx], 0xf000
162e0 20 7c 20 63 65 72 74 5f 69 64 78 2c 20 26 69 64 | cert_idx, &id
162f0 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d entities[id_idx]
16300 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e .attributes_coun
16310 74 29 3b 0a 0a 09 09 09 69 64 5f 69 64 78 2b 2b t);.....id_idx++
16320 3b 0a 09 09 7d 0a 0a 09 09 2a 69 64 73 5f 66 6f ;...}....*ids_fo
16330 75 6e 64 20 3d 20 6e 75 6d 5f 69 64 73 3b 0a 09 und = num_ids;..
16340 09 72 65 74 75 72 6e 28 69 64 65 6e 74 69 74 69 .return(identiti
16350 65 73 29 3b 0a 09 7d 0a 0a 09 2a 69 64 73 5f 66 es);..}...*ids_f
16360 6f 75 6e 64 20 3d 20 30 3b 0a 09 72 65 74 75 72 ound = 0;..retur
16370 6e 28 4e 55 4c 4c 29 3b 0a 7d 0a 0a 43 4b 5f 44 n(NULL);.}..CK_D
16380 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 EFINE_FUNCTION(C
16390 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 69 61 6c 69 K_RV, C_Initiali
163a0 7a 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54 52 20 ze)(CK_VOID_PTR
163b0 70 49 6e 69 74 41 72 67 73 29 20 7b 0a 09 43 4b pInitArgs) {..CK
163c0 5f 43 5f 49 4e 49 54 49 41 4c 49 5a 45 5f 41 52 _C_INITIALIZE_AR
163d0 47 53 20 43 4b 5f 50 54 52 20 61 72 67 73 3b 0a GS CK_PTR args;.
163e0 09 75 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 09 .uint32_t idx;..
163f0 69 6e 74 20 6d 75 74 65 78 5f 69 6e 69 74 5f 72 int mutex_init_r
16400 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 et;...CACKEY_DEB
16410 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
16420 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b d.");...if (cack
16430 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 ey_initialized)
16440 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
16450 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
16460 20 41 6c 72 65 61 64 79 20 69 6e 69 74 69 61 6c Already initial
16470 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 ized.");....retu
16480 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f rn(CKR_CRYPTOKI_
16490 41 4c 52 45 41 44 59 5f 49 4e 49 54 49 41 4c 49 ALREADY_INITIALI
164a0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 ZED);..}...if (p
164b0 49 6e 69 74 41 72 67 73 20 21 3d 20 4e 55 4c 4c InitArgs != NULL
164c0 29 20 7b 0a 09 09 61 72 67 73 20 3d 20 70 49 6e ) {...args = pIn
164d0 69 74 41 72 67 73 3b 0a 09 09 6d 65 6d 63 70 79 itArgs;...memcpy
164e0 28 26 63 61 63 6b 65 79 5f 61 72 67 73 2c 20 61 (&cackey_args, a
164f0 72 67 73 2c 20 73 69 7a 65 6f 66 28 63 61 63 6b rgs, sizeof(cack
16500 65 79 5f 61 72 67 73 29 29 3b 0a 0a 09 09 69 66 ey_args));....if
16510 20 28 61 72 67 73 2d 3e 43 72 65 61 74 65 4d 75 (args->CreateMu
16520 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 tex == NULL || a
16530 72 67 73 2d 3e 44 65 73 74 72 6f 79 4d 75 74 65 rgs->DestroyMute
16540 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 x == NULL || arg
16550 73 2d 3e 4c 6f 63 6b 4d 75 74 65 78 20 3d 3d 20 s->LockMutex ==
16560 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 55 6e NULL || args->Un
16570 6c 6f 63 6b 4d 75 74 65 78 20 3d 3d 20 4e 55 4c lockMutex == NUL
16580 4c 29 20 7b 0a 09 09 09 69 66 20 28 61 72 67 73 L) {....if (args
16590 2d 3e 43 72 65 61 74 65 4d 75 74 65 78 20 21 3d ->CreateMutex !=
165a0 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 44 NULL || args->D
165b0 65 73 74 72 6f 79 4d 75 74 65 78 20 21 3d 20 4e estroyMutex != N
165c0 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 4c 6f 63 ULL || args->Loc
165d0 6b 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c kMutex != NULL |
165e0 7c 20 61 72 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 | args->UnlockMu
165f0 74 65 78 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 tex != NULL) {..
16600 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
16610 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 53 PRINTF("Error. S
16620 6f 6d 65 2c 20 62 75 74 20 6e 6f 74 20 41 6c 6c ome, but not All
16630 20 74 68 72 65 61 64 69 6e 67 20 70 72 69 6d 69 threading primi
16640 74 69 76 65 73 20 70 72 6f 76 69 64 65 64 2e 22 tives provided."
16650 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 );......return(C
16660 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 KR_ARGUMENTS_BAD
16670 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 20 65 );....}...}..} e
16680 6c 73 65 20 7b 0a 09 09 63 61 63 6b 65 79 5f 61 lse {...cackey_a
16690 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78 20 rgs.CreateMutex
166a0 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 = NULL;...cackey
166b0 5f 61 72 67 73 2e 44 65 73 74 72 6f 79 4d 75 74 _args.DestroyMut
166c0 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 ex = NULL;...cac
166d0 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 key_args.LockMut
166e0 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 ex = NULL;...cac
166f0 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d key_args.UnlockM
16700 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 utex = NULL;...c
16710 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 ackey_args.flags
16720 20 3d 20 30 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 = 0;..}...for (
16730 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 idx = 0; idx < (
16740 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 sizeof(cackey_se
16750 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 ssions) / sizeof
16760 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 (cackey_sessions
16770 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a [0])); idx++) {.
16780 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e ..cackey_session
16790 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 20 3d 20 s[idx].active =
167a0 30 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 0;..}...for (idx
167b0 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a = 0; idx < (siz
167c0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 eof(cackey_slots
167d0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 ) / sizeof(cacke
167e0 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69 64 y_slots[0])); id
167f0 78 2b 2b 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f x++) {...cackey_
16800 73 6c 6f 74 73 5b 69 64 78 5d 2e 61 63 74 69 76 slots[idx].activ
16810 65 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f e = 0;...cackey_
16820 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f slots[idx].pcsc_
16830 72 65 61 64 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 reader = NULL;..
16840 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 .cackey_slots[id
16850 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 x].transaction_d
16860 65 70 74 68 20 3d 20 30 3b 0a 09 09 63 61 63 6b epth = 0;...cack
16870 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 ey_slots[idx].tr
16880 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 ansaction_need_h
16890 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09 63 61 w_lock = 0;...ca
168a0 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e ckey_slots[idx].
168b0 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 30 3b 0a slot_reset = 0;.
168c0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 ..cackey_slots[i
168d0 64 78 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 dx].token_flags
168e0 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c = 0;...cackey_sl
168f0 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 20 3d ots[idx].label =
16900 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 63 61 63 6b NULL;..}...cack
16910 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d ey_initialized =
16920 20 31 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 1;...if (!cacke
16930 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 29 20 y_biglock_init)
16940 7b 0a 09 09 6d 75 74 65 78 5f 69 6e 69 74 5f 72 {...mutex_init_r
16950 65 74 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 et = cackey_mute
16960 78 5f 63 72 65 61 74 65 28 26 63 61 63 6b 65 79 x_create(&cackey
16970 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 69 66 _biglock);....if
16980 20 28 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 (mutex_init_ret
16990 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b != 0) {....CACK
169a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
169b0 22 45 72 72 6f 72 2e 20 20 4d 75 74 65 78 20 69 "Error. Mutex i
169c0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 61 nitialization fa
169d0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74 iled.");.....ret
169e0 75 72 6e 28 43 4b 52 5f 43 41 4e 54 5f 4c 4f 43 urn(CKR_CANT_LOC
169f0 4b 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 K);...}....cacke
16a00 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d y_biglock_init =
16a10 20 31 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 1;..}...CACKEY_
16a20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
16a30 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 turning CKR_OK (
16a40 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a %i)", CKR_OK);..
16a50 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b .return(CKR_OK);
16a60 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 .}..CK_DEFINE_FU
16a70 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f NCTION(CK_RV, C_
16a80 46 69 6e 61 6c 69 7a 65 29 28 43 4b 5f 56 4f 49 Finalize)(CK_VOI
16a90 44 5f 50 54 52 20 70 52 65 73 65 72 76 65 64 29 D_PTR pReserved)
16aa0 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78 {..uint32_t idx
16ab0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ;...CACKEY_DEBUG
16ac0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
16ad0 22 29 3b 0a 0a 09 69 66 20 28 70 52 65 73 65 72 ");...if (pReser
16ae0 76 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ved != NULL) {..
16af0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
16b00 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 52 65 INTF("Error. pRe
16b10 73 65 72 76 65 64 20 69 73 20 6e 6f 74 20 4e 55 served is not NU
16b20 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e LL.");....return
16b30 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 (CKR_ARGUMENTS_B
16b40 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 AD);..}...if (!c
16b50 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 ackey_initialize
16b60 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 d) {...CACKEY_DE
16b70 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
16b80 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 r. Not initiali
16b90 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 zed.");....retur
16ba0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e n(CKR_CRYPTOKI_N
16bb0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b OT_INITIALIZED);
16bc0 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d ..}...for (idx =
16bd0 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 0; idx < (sizeo
16be0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e f(cackey_session
16bf0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b s) / sizeof(cack
16c00 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 ey_sessions[0]))
16c10 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 ; idx++) {...if
16c20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 (cackey_sessions
16c30 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a [idx].active) {.
16c40 09 09 09 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f ...C_CloseSessio
16c50 6e 28 69 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a 0a n(idx);...}..}..
16c60 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 .cackey_slots_di
16c70 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a sconnect_all();.
16c80 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 ..for (idx = 0;
16c90 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 idx < (sizeof(ca
16ca0 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 ckey_slots) / si
16cb0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 zeof(cackey_slot
16cc0 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b s[0])); idx++) {
16cd0 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c ...if (cackey_sl
16ce0 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 ots[idx].pcsc_re
16cf0 61 64 65 72 29 20 7b 0a 09 09 09 66 72 65 65 28 ader) {....free(
16d00 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 cackey_slots[idx
16d10 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a ].pcsc_reader);.
16d20 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f ..}..}...cackey_
16d30 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 pcsc_disconnect(
16d40 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 69 6e 69 74 );...cackey_init
16d50 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 09 43 ialized = 0;...C
16d60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
16d70 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b TF("Returning CK
16d80 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f R_OK (%i)", CKR_
16d90 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b OK);...return(CK
16da0 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 R_OK);.}..CK_DEF
16db0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f INE_FUNCTION(CK_
16dc0 52 56 2c 20 43 5f 47 65 74 49 6e 66 6f 29 28 43 RV, C_GetInfo)(C
16dd0 4b 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f K_INFO_PTR pInfo
16de0 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 ) {..static CK_U
16df0 54 46 38 43 48 41 52 20 6d 61 6e 75 66 61 63 74 TF8CHAR manufact
16e00 75 72 65 72 49 44 5b 5d 20 3d 20 22 55 2e 53 2e urerID[] = "U.S.
16e10 20 47 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 Government";..s
16e20 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 tatic CK_UTF8CHA
16e30 52 20 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 R libraryDescrip
16e40 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b 65 79 tion[] = "CACKey
16e50 22 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 ";...CACKEY_DEBU
16e60 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 G_PRINTF("Called
16e70 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f .");...if (pInfo
16e80 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 == NULL) {...CA
16e90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
16ea0 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 F("Error. pInfo
16eb0 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 is NULL.");....r
16ec0 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 eturn(CKR_ARGUME
16ed0 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 NTS_BAD);..}...i
16ee0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 f (!cackey_initi
16ef0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b alized) {...CACK
16f00 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
16f10 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 "Error. Not ini
16f20 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 tialized.");....
16f30 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 return(CKR_CRYPT
16f40 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 OKI_NOT_INITIALI
16f50 5a 45 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f ZED);..}...pInfo
16f60 2d 3e 63 72 79 70 74 6f 6b 69 56 65 72 73 69 6f ->cryptokiVersio
16f70 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43 41 43 4b n.major = ((CACK
16f80 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 EY_CRYPTOKI_VERS
16f90 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 31 36 29 ION_CODE) >> 16)
16fa0 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d & 0xff;..pInfo-
16fb0 3e 63 72 79 70 74 6f 6b 69 56 65 72 73 69 6f 6e >cryptokiVersion
16fc0 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41 43 4b 45 .minor = ((CACKE
16fd0 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 Y_CRYPTOKI_VERSI
16fe0 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38 29 20 26 ON_CODE) >> 8) &
16ff0 20 30 78 66 66 3b 0a 0a 09 6d 65 6d 73 65 74 28 0xff;...memset(
17000 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 pInfo->manufactu
17010 72 65 72 49 44 2c 20 27 20 27 2c 20 73 69 7a 65 rerID, ' ', size
17020 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 of(pInfo->manufa
17030 63 74 75 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d cturerID));..mem
17040 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 cpy(pInfo->manuf
17050 61 63 74 75 72 65 72 49 44 2c 20 6d 61 6e 75 66 acturerID, manuf
17060 61 63 74 75 72 65 72 49 44 2c 20 73 69 7a 65 6f acturerID, sizeo
17070 66 28 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 f(manufacturerID
17080 29 20 2d 20 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d ) - 1);...pInfo-
17090 3e 66 6c 61 67 73 20 3d 20 30 78 30 30 3b 0a 0a >flags = 0x00;..
170a0 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6c .memset(pInfo->l
170b0 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f ibraryDescriptio
170c0 6e 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 n, ' ', sizeof(p
170d0 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73 Info->libraryDes
170e0 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d cription));..mem
170f0 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 cpy(pInfo->libra
17100 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 6c ryDescription, l
17110 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f ibraryDescriptio
17120 6e 2c 20 73 69 7a 65 6f 66 28 6c 69 62 72 61 72 n, sizeof(librar
17130 79 44 65 73 63 72 69 70 74 69 6f 6e 29 20 2d 20 yDescription) -
17140 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62 1);...pInfo->lib
17150 72 61 72 79 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f raryVersion.majo
17160 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 r = (cackey_getv
17170 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 ersion() >> 16)
17180 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e & 0xff;..pInfo->
17190 6c 69 62 72 61 72 79 56 65 72 73 69 6f 6e 2e 6d libraryVersion.m
171a0 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 inor = (cackey_g
171b0 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 etversion() >> 8
171c0 29 20 26 20 30 78 66 66 3b 0a 0a 09 43 41 43 4b ) & 0xff;...CACK
171d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
171e0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f "Returning CKR_O
171f0 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 K (%i)", CKR_OK)
17200 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f ;...return(CKR_O
17210 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 50 72 6f K);.}../*. * Pro
17220 63 65 73 73 20 6c 69 73 74 20 6f 66 20 72 65 61 cess list of rea
17230 64 65 72 73 2c 20 61 6e 64 20 63 72 65 61 74 65 ders, and create
17240 20 6d 61 70 70 69 6e 67 20 62 65 74 77 65 65 6e mapping between
17250 20 72 65 61 64 65 72 20 6e 61 6d 65 20 61 6e 64 reader name and
17260 20 73 6c 6f 74 20 49 44 0a 20 2a 2f 0a 43 4b 5f slot ID. */.CK_
17270 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 DEFINE_FUNCTION(
17280 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74 CK_RV, C_GetSlot
17290 4c 69 73 74 29 28 43 4b 5f 42 42 4f 4f 4c 20 74 List)(CK_BBOOL t
172a0 6f 6b 65 6e 50 72 65 73 65 6e 74 2c 20 43 4b 5f okenPresent, CK_
172b0 53 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53 6c 6f SLOT_ID_PTR pSlo
172c0 74 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f tList, CK_ULONG_
172d0 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a PTR pulCount) {.
172e0 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 .int mutex_retva
172f0 6c 3b 0a 09 69 6e 74 20 70 63 73 63 5f 63 6f 6e l;..int pcsc_con
17300 6e 65 63 74 5f 72 65 74 3b 0a 09 43 4b 5f 55 4c nect_ret;..CK_UL
17310 4f 4e 47 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f ONG count, slot_
17320 63 6f 75 6e 74 20 3d 20 30 2c 20 63 75 72 72 73 count = 0, currs
17330 6c 6f 74 3b 0a 09 63 68 61 72 20 2a 70 63 73 63 lot;..char *pcsc
17340 5f 72 65 61 64 65 72 73 2c 20 2a 70 63 73 63 5f _readers, *pcsc_
17350 72 65 61 64 65 72 73 5f 73 2c 20 2a 70 63 73 63 readers_s, *pcsc
17360 5f 72 65 61 64 65 72 73 5f 65 3b 0a 09 44 57 4f _readers_e;..DWO
17370 52 44 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f RD pcsc_readers_
17380 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 len;..LONG scard
17390 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 _listreaders_ret
173a0 3b 0a 09 73 69 7a 65 5f 74 20 63 75 72 72 5f 72 ;..size_t curr_r
173b0 65 61 64 65 72 5f 6c 65 6e 3b 0a 0a 09 43 41 43 eader_len;...CAC
173c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
173d0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 ("Called.");...i
173e0 66 20 28 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e f (pulCount == N
173f0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f ULL) {...CACKEY_
17400 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
17410 72 6f 72 2e 20 70 75 6c 43 6f 75 6e 74 20 69 73 ror. pulCount is
17420 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 NULL.");....ret
17430 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 urn(CKR_ARGUMENT
17440 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 S_BAD);..}...if
17450 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c (!cackey_initial
17460 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 ized) {...CACKEY
17470 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
17480 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 rror. Not initi
17490 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 alized.");....re
174a0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b turn(CKR_CRYPTOK
174b0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 I_NOT_INITIALIZE
174c0 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 D);..}...mutex_r
174d0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d etval = cackey_m
174e0 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 utex_lock(cackey
174f0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 _biglock);..if (
17500 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 mutex_retval !=
17510 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 0) {...CACKEY_DE
17520 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
17530 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c r. Locking fail
17540 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
17550 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 (CKR_GENERAL_ERR
17560 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6c 65 OR);..}.../* Cle
17570 61 72 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73 ar list of slots
17580 20 2a 2f 0a 09 69 66 20 28 70 53 6c 6f 74 4c 69 */..if (pSlotLi
17590 73 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 st) {...CACKEY_D
175a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 75 72 EBUG_PRINTF("Pur
175b0 67 69 6e 67 20 61 6c 6c 20 73 6c 6f 74 20 69 6e ging all slot in
175c0 66 6f 72 6d 61 74 69 6f 6e 2e 22 29 3b 0a 0a 09 formation.");...
175d0 09 2f 2a 20 4f 6e 6c 79 20 75 70 64 61 74 65 20 ./* Only update
175e0 74 68 65 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 the list of slot
175f0 73 20 69 66 20 77 65 20 61 72 65 20 61 63 74 75 s if we are actu
17600 61 6c 6c 79 20 62 65 69 6e 67 20 73 75 70 70 6c ally being suppl
17610 79 20 74 68 65 20 73 6c 6f 74 20 69 6e 66 6f 72 y the slot infor
17620 6d 61 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b mation */...cack
17630 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e ey_slots_disconn
17640 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 66 6f ect_all();....fo
17650 72 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b r (currslot = 0;
17660 20 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a currslot < (siz
17670 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 eof(cackey_slots
17680 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 ) / sizeof(cacke
17690 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75 y_slots[0])); cu
176a0 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 69 rrslot++) {....i
176b0 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b f (cackey_slots[
176c0 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 currslot].pcsc_r
176d0 65 61 64 65 72 29 20 7b 0a 09 09 09 09 66 72 65 eader) {.....fre
176e0 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 e(cackey_slots[c
176f0 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 urrslot].pcsc_re
17700 61 64 65 72 29 3b 0a 0a 09 09 09 09 63 61 63 6b ader);......cack
17710 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f ey_slots[currslo
17720 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d t].pcsc_reader =
17730 20 4e 55 4c 4c 3b 0a 09 09 09 7d 0a 0a 09 09 09 NULL;....}.....
17740 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 if (cackey_slots
17750 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c [currslot].label
17760 29 20 7b 0a 09 09 09 09 66 72 65 65 28 63 61 63 ) {.....free(cac
17770 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c key_slots[currsl
17780 6f 74 5d 2e 6c 61 62 65 6c 29 3b 0a 0a 09 09 09 ot].label);.....
17790 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 .cackey_slots[cu
177a0 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20 rrslot].label =
177b0 4e 55 4c 4c 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 NULL;....}.....c
177c0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 ackey_slots[curr
177d0 73 6c 6f 74 5d 2e 61 63 74 69 76 65 20 3d 20 30 slot].active = 0
177e0 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 44 65 ;...}..}.../* De
177f0 74 65 72 6d 69 6e 65 20 6c 69 73 74 20 6f 66 20 termine list of
17800 72 65 61 64 65 72 73 20 2a 2f 0a 09 70 63 73 63 readers */..pcsc
17810 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 _connect_ret = c
17820 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 ackey_pcsc_conne
17830 63 74 28 29 3b 0a 09 69 66 20 28 70 63 73 63 5f ct();..if (pcsc_
17840 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 connect_ret != C
17850 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 ACKEY_PCSC_S_OK)
17860 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
17870 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63 G_PRINTF("Connec
17880 74 69 6f 6e 20 74 6f 20 50 43 2f 53 43 20 66 61 tion to PC/SC fa
17890 69 6c 65 64 2c 20 61 73 73 75 6d 69 6e 67 20 6e iled, assuming n
178a0 6f 20 73 6c 6f 74 73 22 29 3b 0a 0a 09 09 73 6c o slots");....sl
178b0 6f 74 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d ot_count = 0;..}
178c0 20 65 6c 73 65 20 7b 0a 09 09 70 63 73 63 5f 72 else {...pcsc_r
178d0 65 61 64 65 72 73 5f 6c 65 6e 20 3d 20 30 3b 0a eaders_len = 0;.
178e0 0a 09 09 73 63 61 72 64 5f 6c 69 73 74 72 65 61 ...scard_listrea
178f0 64 65 72 73 5f 72 65 74 20 3d 20 53 43 61 72 64 ders_ret = SCard
17900 4c 69 73 74 52 65 61 64 65 72 73 28 2a 63 61 63 ListReaders(*cac
17910 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c key_pcsc_handle,
17920 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63 NULL, NULL, &pc
17930 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b sc_readers_len);
17940 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 6c 69 ....if (scard_li
17950 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d 3d streaders_ret ==
17960 20 53 43 41 52 44 5f 46 5f 43 4f 4d 4d 5f 45 52 SCARD_F_COMM_ER
17970 52 4f 52 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 ROR) {....CACKEY
17980 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
17990 72 72 6f 72 2e 20 53 43 61 72 64 4c 69 73 74 52 rror. SCardListR
179a0 65 61 64 65 72 73 28 29 20 72 65 74 75 72 6e 65 eaders() returne
179b0 64 20 53 43 41 52 44 5f 46 5f 43 4f 4d 4d 5f 45 d SCARD_F_COMM_E
179c0 52 52 4f 52 2c 20 61 73 73 75 6d 69 6e 67 20 43 RROR, assuming C
179d0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 50 43 2f onnection to PC/
179e0 53 43 20 77 65 6e 74 20 61 77 61 79 2e 20 52 65 SC went away. Re
179f0 63 6f 6e 6e 65 63 74 69 6e 67 2e 22 29 3b 0a 0a connecting.");..
17a00 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 ...cackey_pcsc_d
17a10 69 73 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 09 09 isconnect();....
17a20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e cackey_pcsc_conn
17a30 65 63 74 28 29 3b 0a 0a 09 09 09 43 41 43 4b 45 ect();.....CACKE
17a40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
17a50 54 72 79 69 6e 67 20 53 43 61 72 64 4c 69 73 74 Trying SCardList
17a60 52 65 61 64 65 72 73 28 29 20 61 67 61 69 6e 22 Readers() again"
17a70 29 3b 0a 09 09 09 73 63 61 72 64 5f 6c 69 73 74 );....scard_list
17a80 72 65 61 64 65 72 73 5f 72 65 74 20 3d 20 53 43 readers_ret = SC
17a90 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 28 2a ardListReaders(*
17aa0 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 cackey_pcsc_hand
17ab0 6c 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 le, NULL, NULL,
17ac0 26 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 &pcsc_readers_le
17ad0 6e 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 n);...}....if (s
17ae0 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 card_listreaders
17af0 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f _ret == SCARD_S_
17b00 53 55 43 43 45 53 53 20 26 26 20 70 63 73 63 5f SUCCESS && pcsc_
17b10 72 65 61 64 65 72 73 5f 6c 65 6e 20 21 3d 20 30 readers_len != 0
17b20 29 20 7b 0a 09 09 09 70 63 73 63 5f 72 65 61 64 ) {....pcsc_read
17b30 65 72 73 20 3d 20 6d 61 6c 6c 6f 63 28 70 63 73 ers = malloc(pcs
17b40 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a c_readers_len);.
17b50 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f ...pcsc_readers_
17b60 73 20 3d 20 70 63 73 63 5f 72 65 61 64 65 72 73 s = pcsc_readers
17b70 3b 0a 0a 09 09 09 73 63 61 72 64 5f 6c 69 73 74 ;.....scard_list
17b80 72 65 61 64 65 72 73 5f 72 65 74 20 3d 20 53 43 readers_ret = SC
17b90 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 28 2a ardListReaders(*
17ba0 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 cackey_pcsc_hand
17bb0 6c 65 2c 20 4e 55 4c 4c 2c 20 70 63 73 63 5f 72 le, NULL, pcsc_r
17bc0 65 61 64 65 72 73 2c 20 26 70 63 73 63 5f 72 65 eaders, &pcsc_re
17bd0 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 09 69 aders_len);....i
17be0 66 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 f (scard_listrea
17bf0 64 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 ders_ret == SCAR
17c00 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 D_S_SUCCESS) {..
17c10 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f ...pcsc_readers_
17c20 65 20 3d 20 70 63 73 63 5f 72 65 61 64 65 72 73 e = pcsc_readers
17c30 20 2b 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f + pcsc_readers_
17c40 6c 65 6e 3b 0a 0a 09 09 09 09 2f 2a 20 53 74 61 len;....../* Sta
17c50 72 74 20 77 69 74 68 20 53 6c 6f 74 20 49 44 20 rt with Slot ID
17c60 31 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 62 75 1, to avoid a bu
17c70 67 20 69 6e 20 47 44 4d 20 6f 6e 20 52 48 45 4c g in GDM on RHEL
17c80 20 2a 2f 0a 09 09 09 09 2f 2a 20 42 75 67 20 35 */...../* Bug 5
17c90 39 34 39 31 31 3a 20 68 74 74 70 73 3a 2f 2f 62 94911: https://b
17ca0 75 67 7a 69 6c 6c 61 2e 72 65 64 68 61 74 2e 63 ugzilla.redhat.c
17cb0 6f 6d 2f 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f om/show_bug.cgi?
17cc0 69 64 3d 35 39 34 39 31 31 20 2a 2f 0a 09 09 09 id=594911 */....
17cd0 09 63 75 72 72 73 6c 6f 74 20 3d 20 31 3b 0a 09 .currslot = 1;..
17ce0 09 09 09 77 68 69 6c 65 20 28 70 63 73 63 5f 72 ...while (pcsc_r
17cf0 65 61 64 65 72 73 20 3c 20 70 63 73 63 5f 72 65 eaders < pcsc_re
17d00 61 64 65 72 73 5f 65 29 20 7b 0a 09 09 09 09 09 aders_e) {......
17d10 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 curr_reader_len
17d20 3d 20 73 74 72 6c 65 6e 28 70 63 73 63 5f 72 65 = strlen(pcsc_re
17d30 61 64 65 72 73 29 3b 0a 0a 09 09 09 09 09 69 66 aders);.......if
17d40 20 28 28 70 63 73 63 5f 72 65 61 64 65 72 73 20 ((pcsc_readers
17d50 2b 20 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 + curr_reader_le
17d60 6e 29 20 3e 20 70 63 73 63 5f 72 65 61 64 65 72 n) > pcsc_reader
17d70 73 5f 65 29 20 7b 0a 09 09 09 09 09 09 62 72 65 s_e) {.......bre
17d80 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 ak;......}......
17d90 09 69 66 20 28 63 75 72 72 5f 72 65 61 64 65 72 .if (curr_reader
17da0 5f 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 09 _len == 0) {....
17db0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d ...break;......}
17dc0 0a 0a 09 09 09 09 09 69 66 20 28 63 75 72 72 73 .......if (currs
17dd0 6c 6f 74 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 lot >= (sizeof(c
17de0 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 ackey_slots) / s
17df0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f izeof(cackey_slo
17e00 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 09 09 09 ts[0]))) {......
17e10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
17e20 49 4e 54 46 28 22 46 6f 75 6e 64 20 6d 6f 72 65 INTF("Found more
17e30 20 72 65 61 64 65 72 73 20 74 68 61 6e 20 73 6c readers than sl
17e40 6f 74 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c ots are availabl
17e50 65 21 22 29 3b 0a 0a 09 09 09 09 09 09 62 72 65 e!");........bre
17e60 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 ak;......}......
17e70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
17e80 49 4e 54 46 28 22 46 6f 75 6e 64 20 72 65 61 64 INTF("Found read
17e90 65 72 3a 20 25 73 22 2c 20 70 63 73 63 5f 72 65 er: %s", pcsc_re
17ea0 61 64 65 72 73 29 3b 0a 0a 09 09 09 09 09 2f 2a aders);......./*
17eb0 20 4f 6e 6c 79 20 75 70 64 61 74 65 20 74 68 65 Only update the
17ec0 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73 20 69 list of slots i
17ed0 66 20 77 65 20 61 72 65 20 61 63 74 75 61 6c 6c f we are actuall
17ee0 79 20 62 65 69 6e 67 20 61 73 6b 65 64 20 73 75 y being asked su
17ef0 70 70 6c 79 20 74 68 65 20 73 6c 6f 74 20 69 6e pply the slot in
17f00 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 09 09 09 formation */....
17f10 09 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 29 ..if (pSlotList)
17f20 20 7b 0a 09 09 09 09 09 09 63 61 63 6b 65 79 5f {.......cackey_
17f30 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e slots[currslot].
17f40 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 09 09 09 active = 1;.....
17f50 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 ..cackey_slots[c
17f60 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 urrslot].pcsc_re
17f70 61 64 65 72 20 3d 20 73 74 72 64 75 70 28 70 63 ader = strdup(pc
17f80 73 63 5f 72 65 61 64 65 72 73 29 3b 0a 09 09 09 sc_readers);....
17f90 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b ...cackey_slots[
17fa0 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 63 currslot].pcsc_c
17fb0 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 ard_connected =
17fc0 30 3b 0a 09 09 09 09 09 09 63 61 63 6b 65 79 5f 0;.......cackey_
17fd0 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e slots[currslot].
17fe0 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 transaction_dept
17ff0 68 20 3d 20 30 3b 0a 09 09 09 09 09 09 63 61 63 h = 0;.......cac
18000 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c key_slots[currsl
18010 6f 74 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f ot].transaction_
18020 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 need_hw_lock = 0
18030 3b 0a 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 ;.......cackey_s
18040 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 73 lots[currslot].s
18050 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 lot_reset = 1;..
18060 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 .....cackey_slot
18070 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 6f 6b 65 s[currslot].toke
18080 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f n_flags = CKF_LO
18090 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 09 09 GIN_REQUIRED;...
180a0 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 ....cackey_slots
180b0 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c [currslot].label
180c0 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09 09 = NULL;........
180d0 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 cackey_mark_slot
180e0 5f 72 65 73 65 74 28 26 63 61 63 6b 65 79 5f 73 _reset(&cackey_s
180f0 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 29 3b lots[currslot]);
18100 0a 09 09 09 09 09 7d 0a 09 09 09 09 09 63 75 72 ......}......cur
18110 72 73 6c 6f 74 2b 2b 3b 0a 0a 09 09 09 09 09 70 rslot++;.......p
18120 63 73 63 5f 72 65 61 64 65 72 73 20 2b 3d 20 63 csc_readers += c
18130 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 2b urr_reader_len +
18140 20 31 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 1;.....}....../
18150 2a 20 53 74 61 72 74 20 77 69 74 68 20 53 6c 6f * Start with Slo
18160 74 20 49 44 20 31 2c 20 74 6f 20 61 76 6f 69 64 t ID 1, to avoid
18170 20 61 20 62 75 67 20 69 6e 20 47 44 4d 20 6f 6e a bug in GDM on
18180 20 52 48 45 4c 20 2a 2f 0a 09 09 09 09 2f 2a 20 RHEL */...../*
18190 42 75 67 20 35 39 34 39 31 31 3a 20 68 74 74 70 Bug 594911: http
181a0 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e 72 65 64 s://bugzilla.red
181b0 68 61 74 2e 63 6f 6d 2f 73 68 6f 77 5f 62 75 67 hat.com/show_bug
181c0 2e 63 67 69 3f 69 64 3d 35 39 34 39 31 31 20 2a .cgi?id=594911 *
181d0 2f 0a 09 09 09 09 69 66 20 28 63 75 72 72 73 6c /.....if (currsl
181e0 6f 74 20 3e 20 31 29 20 7b 0a 09 09 09 09 09 2f ot > 1) {....../
181f0 2a 20 53 74 61 72 74 20 77 69 74 68 20 53 6c 6f * Start with Slo
18200 74 20 49 44 20 31 2c 20 74 6f 20 61 76 6f 69 64 t ID 1, to avoid
18210 20 61 20 62 75 67 20 69 6e 20 47 44 4d 20 6f 6e a bug in GDM on
18220 20 52 48 45 4c 20 2a 2f 0a 09 09 09 09 09 2f 2a RHEL */....../*
18230 20 42 75 67 20 35 39 34 39 31 31 3a 20 68 74 74 Bug 594911: htt
18240 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e 72 65 ps://bugzilla.re
18250 64 68 61 74 2e 63 6f 6d 2f 73 68 6f 77 5f 62 75 dhat.com/show_bu
18260 67 2e 63 67 69 3f 69 64 3d 35 39 34 39 31 31 20 g.cgi?id=594911
18270 2a 2f 0a 09 09 09 09 09 73 6c 6f 74 5f 63 6f 75 */......slot_cou
18280 6e 74 20 3d 20 63 75 72 72 73 6c 6f 74 20 2d 20 nt = currslot -
18290 31 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 1;.....}....} el
182a0 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f se {.....CACKEY_
182b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 DEBUG_PRINTF("Se
182c0 63 6f 6e 64 20 63 61 6c 6c 20 74 6f 20 53 43 61 cond call to SCa
182d0 72 64 4c 69 73 74 52 65 61 64 65 72 73 20 66 61 rdListReaders fa
182e0 69 6c 65 64 2c 20 72 65 74 75 72 6e 20 25 73 2f iled, return %s/
182f0 25 6c 69 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 %li", CACKEY_DEB
18300 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 UG_FUNC_SCARDERR
18310 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 6c 69 _TO_STR(scard_li
18320 73 74 72 65 61 64 65 72 73 5f 72 65 74 29 2c 20 streaders_ret),
18330 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 6c 69 73 (long) scard_lis
18340 74 72 65 61 64 65 72 73 5f 72 65 74 29 3b 0a 09 treaders_ret);..
18350 09 09 7d 0a 0a 09 09 09 66 72 65 65 28 70 63 73 ..}.....free(pcs
18360 63 5f 72 65 61 64 65 72 73 5f 73 29 3b 0a 09 09 c_readers_s);...
18370 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b } else {....CACK
18380 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
18390 22 46 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 53 "First call to S
183a0 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 20 CardListReaders
183b0 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 20 25 failed, return %
183c0 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59 5f 44 s/%li", CACKEY_D
183d0 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 EBUG_FUNC_SCARDE
183e0 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f RR_TO_STR(scard_
183f0 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29 listreaders_ret)
18400 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 6c , (long) scard_l
18410 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29 3b istreaders_ret);
18420 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f ...}..}...mutex_
18430 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f retval = cackey_
18440 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 mutex_unlock(cac
18450 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 key_biglock);..i
18460 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 f (mutex_retval
18470 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 != 0) {...CACKEY
18480 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
18490 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 rror. Unlocking
184a0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 failed.");....r
184b0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 eturn(CKR_GENERA
184c0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 L_ERROR);..}...i
184d0 66 20 28 70 53 6c 6f 74 4c 69 73 74 20 3d 3d 20 f (pSlotList ==
184e0 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c 43 6f NULL) {...*pulCo
184f0 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f 75 6e 74 unt = slot_count
18500 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 ;....CACKEY_DEBU
18510 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
18520 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 2e ing CKR_OK (%i).
18530 20 20 46 6f 75 6e 64 20 25 6c 75 20 72 65 61 64 Found %lu read
18540 65 72 73 2c 20 62 75 74 20 6e 6f 74 20 73 74 6f ers, but not sto
18550 72 69 6e 67 20 49 44 73 20 28 70 53 6c 6f 74 4c ring IDs (pSlotL
18560 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 22 2c 20 43 ist == NULL)", C
18570 4b 52 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e 65 64 KR_OK, (unsigned
18580 20 6c 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f 75 6e long) slot_coun
18590 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b t);....return(CK
185a0 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 63 6f 75 6e R_OK);..}...coun
185b0 74 20 3d 20 2a 70 75 6c 43 6f 75 6e 74 3b 0a 09 t = *pulCount;..
185c0 69 66 20 28 63 6f 75 6e 74 20 3c 20 73 6c 6f 74 if (count < slot
185d0 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 43 41 43 4b _count) {...CACK
185e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
185f0 22 45 72 72 6f 72 2e 20 55 73 65 72 20 61 6c 6c "Error. User all
18600 6f 63 61 74 65 64 20 25 6c 75 20 65 6e 74 72 69 ocated %lu entri
18610 65 73 2c 20 62 75 74 20 77 65 20 68 61 76 65 20 es, but we have
18620 25 6c 75 20 65 6e 74 72 69 65 73 2e 22 2c 20 63 %lu entries.", c
18630 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63 6f 75 6e 74 ount, slot_count
18640 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
18650 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c _BUFFER_TOO_SMAL
18660 4c 29 3b 09 0a 09 7d 0a 0a 09 66 6f 72 20 28 63 L);...}...for (c
18670 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75 72 urrslot = 0; cur
18680 72 73 6c 6f 74 20 3c 20 73 6c 6f 74 5f 63 6f 75 rslot < slot_cou
18690 6e 74 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20 nt; currslot++)
186a0 7b 0a 09 09 2f 2a 20 53 74 61 72 74 20 77 69 74 {.../* Start wit
186b0 68 20 53 6c 6f 74 20 49 44 20 31 2c 20 74 6f 20 h Slot ID 1, to
186c0 61 76 6f 69 64 20 61 20 62 75 67 20 69 6e 20 47 avoid a bug in G
186d0 44 4d 20 6f 6e 20 52 48 45 4c 20 2a 2f 0a 09 09 DM on RHEL */...
186e0 2f 2a 20 42 75 67 20 35 39 34 39 31 31 3a 20 68 /* Bug 594911: h
186f0 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e ttps://bugzilla.
18700 72 65 64 68 61 74 2e 63 6f 6d 2f 73 68 6f 77 5f redhat.com/show_
18710 62 75 67 2e 63 67 69 3f 69 64 3d 35 39 34 39 31 bug.cgi?id=59491
18720 31 20 2a 2f 0a 09 09 70 53 6c 6f 74 4c 69 73 74 1 */...pSlotList
18730 5b 63 75 72 72 73 6c 6f 74 5d 20 3d 20 63 75 72 [currslot] = cur
18740 72 73 6c 6f 74 20 2b 20 31 3b 0a 09 7d 0a 0a 09 rslot + 1;..}...
18750 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 *pulCount = slot
18760 5f 63 6f 75 6e 74 3b 0a 0a 09 43 41 43 4b 45 59 _count;...CACKEY
18770 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
18780 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 eturning CKR_OK
18790 28 25 69 29 2e 20 20 46 6f 75 6e 64 20 25 6c 75 (%i). Found %lu
187a0 20 72 65 61 64 65 72 73 2e 22 2c 20 43 4b 52 5f readers.", CKR_
187b0 4f 4b 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f OK, (unsigned lo
187c0 6e 67 29 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b ng) slot_count);
187d0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b ...return(CKR_OK
187e0 29 3b 0a 0a 09 74 6f 6b 65 6e 50 72 65 73 65 6e );...tokenPresen
187f0 74 20 3d 20 74 6f 6b 65 6e 50 72 65 73 65 6e 74 t = tokenPresent
18800 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75 6e 75 ; /* Supress unu
18810 73 65 64 20 76 61 72 69 61 62 6c 65 20 77 61 72 sed variable war
18820 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45 ning */.}..CK_DE
18830 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b FINE_FUNCTION(CK
18840 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74 49 6e _RV, C_GetSlotIn
18850 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 fo)(CK_SLOT_ID s
18860 6c 6f 74 49 44 2c 20 43 4b 5f 53 4c 4f 54 5f 49 lotID, CK_SLOT_I
18870 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b NFO_PTR pInfo) {
18880 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 ..static CK_UTF8
18890 43 48 41 52 20 73 6c 6f 74 44 65 73 63 72 69 70 CHAR slotDescrip
188a0 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b 65 79 tion[] = "CACKey
188b0 20 53 6c 6f 74 22 3b 0a 09 69 6e 74 20 6d 75 74 Slot";..int mut
188c0 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 ex_retval;..int
188d0 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 0a bytes_to_copy;..
188e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
188f0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
18900 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 ...if (pInfo ==
18910 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 NULL) {...CACKEY
18920 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
18930 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e rror. pInfo is N
18940 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 ULL.");....retur
18950 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f n(CKR_ARGUMENTS_
18960 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 BAD);..}...if (!
18970 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a cackey_initializ
18980 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...CACKEY_D
18990 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
189a0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c or. Not initial
189b0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 ized.");....retu
189c0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f rn(CKR_CRYPTOKI_
189d0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 NOT_INITIALIZED)
189e0 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 ;..}...if (slotI
189f0 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 D < 0 || slotID
18a00 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 >= (sizeof(cacke
18a10 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f y_slots) / sizeo
18a20 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 f(cackey_slots[0
18a30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f ]))) {...CACKEY_
18a40 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
18a50 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f ror. Invalid slo
18a60 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 t requested (%lu
18a70 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 ), outside of va
18a80 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 lid range", slot
18a90 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 ID);....return(C
18aa0 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c KR_SLOT_ID_INVAL
18ab0 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f ID);..}...mutex_
18ac0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f retval = cackey_
18ad0 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 mutex_lock(cacke
18ae0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 y_biglock);..if
18af0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d (mutex_retval !=
18b00 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 0) {...CACKEY_D
18b10 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
18b20 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 or. Locking fai
18b30 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 led.");....retur
18b40 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 n(CKR_GENERAL_ER
18b50 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 ROR);..}...if (c
18b60 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 ackey_slots[slot
18b70 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 ID].active == 0)
18b80 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
18b90 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
18ba0 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 Invalid slot re
18bb0 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 quested (%lu), s
18bc0 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c lot not currentl
18bd0 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 y active", slotI
18be0 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 D);....cackey_mu
18bf0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 tex_unlock(cacke
18c00 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 y_biglock);....r
18c10 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 eturn(CKR_SLOT_I
18c20 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a D_INVALID);..}..
18c30 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 .pInfo->flags =
18c40 43 4b 46 5f 52 45 4d 4f 56 41 42 4c 45 5f 44 45 CKF_REMOVABLE_DE
18c50 56 49 43 45 20 7c 20 43 4b 46 5f 48 57 5f 53 4c VICE | CKF_HW_SL
18c60 4f 54 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 OT;...if (cackey
18c70 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26 _token_present(&
18c80 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f cackey_slots[slo
18c90 74 49 44 5d 29 20 3d 3d 20 43 41 43 4b 45 59 5f tID]) == CACKEY_
18ca0 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 PCSC_S_TOKENPRES
18cb0 45 4e 54 29 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e ENT) {...pInfo->
18cc0 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 54 4f 4b flags |= CKF_TOK
18cd0 45 4e 5f 50 52 45 53 45 4e 54 3b 0a 09 7d 0a 0a EN_PRESENT;..}..
18ce0 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d .bytes_to_copy =
18cf0 20 73 74 72 6c 65 6e 28 63 61 63 6b 65 79 5f 73 strlen(cackey_s
18d00 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 70 63 73 lots[slotID].pcs
18d10 63 5f 72 65 61 64 65 72 29 3b 0a 09 69 66 20 28 c_reader);..if (
18d20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 sizeof(pInfo->ma
18d30 6e 75 66 61 63 74 75 72 65 72 49 44 29 20 3c 20 nufacturerID) <
18d40 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 20 7b bytes_to_copy) {
18d50 0a 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 ...bytes_to_copy
18d60 20 3d 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d = sizeof(pInfo-
18d70 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 >manufacturerID)
18d80 3b 0a 09 7d 0a 09 6d 65 6d 63 70 79 28 70 49 6e ;..}..memcpy(pIn
18d90 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 fo->manufacturer
18da0 49 44 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 ID, cackey_slots
18db0 5b 73 6c 6f 74 49 44 5d 2e 70 63 73 63 5f 72 65 [slotID].pcsc_re
18dc0 61 64 65 72 2c 20 62 79 74 65 73 5f 74 6f 5f 63 ader, bytes_to_c
18dd0 6f 70 79 29 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 opy);...mutex_re
18de0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 tval = cackey_mu
18df0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 tex_unlock(cacke
18e00 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 y_biglock);..if
18e10 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d (mutex_retval !=
18e20 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 0) {...CACKEY_D
18e30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
18e40 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 or. Unlocking f
18e50 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 ailed.");....ret
18e60 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f urn(CKR_GENERAL_
18e70 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 6d 65 6d ERROR);..}...mem
18e80 73 65 74 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 set(pInfo->slotD
18e90 65 73 63 72 69 70 74 69 6f 6e 2c 20 27 20 27 2c escription, ' ',
18ea0 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 73 sizeof(pInfo->s
18eb0 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 29 29 lotDescription))
18ec0 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d ;..memcpy(pInfo-
18ed0 3e 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e >slotDescription
18ee0 2c 20 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f , slotDescriptio
18ef0 6e 2c 20 73 69 7a 65 6f 66 28 73 6c 6f 74 44 65 n, sizeof(slotDe
18f00 73 63 72 69 70 74 69 6f 6e 29 20 2d 20 31 29 3b scription) - 1);
18f10 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d ...memset(pInfo-
18f20 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c >manufacturerID,
18f30 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e ' ', sizeof(pIn
18f40 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 fo->manufacturer
18f50 49 44 29 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68 ID));...pInfo->h
18f60 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d ardwareVersion.m
18f70 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 ajor = (cackey_g
18f80 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 etversion() >> 1
18f90 36 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6) & 0xff;..pInf
18fa0 6f 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73 69 o->hardwareVersi
18fb0 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b on.minor = (cack
18fc0 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 ey_getversion()
18fd0 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 >> 8) & 0xff;...
18fe0 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 pInfo->firmwareV
18ff0 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30 ersion.major = 0
19000 78 30 30 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 x00;..pInfo->fir
19010 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e mwareVersion.min
19020 6f 72 20 3d 20 30 78 30 30 3b 0a 0a 09 43 41 43 or = 0x00;...CAC
19030 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
19040 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f ("Returning CKR_
19050 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b OK (%i)", CKR_OK
19060 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f );...return(CKR_
19070 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e OK);.}..CK_DEFIN
19080 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 E_FUNCTION(CK_RV
19090 2c 20 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f , C_GetTokenInfo
190a0 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f )(CK_SLOT_ID slo
190b0 74 49 44 2c 20 43 4b 5f 54 4f 4b 45 4e 5f 49 4e tID, CK_TOKEN_IN
190c0 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a FO_PTR pInfo) {.
190d0 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 .static CK_UTF8C
190e0 48 41 52 20 6d 61 6e 75 66 61 63 74 75 72 65 72 HAR manufacturer
190f0 49 44 5b 5d 20 3d 20 22 55 2e 53 2e 20 47 6f 76 ID[] = "U.S. Gov
19100 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 74 61 74 69 ernment";..stati
19110 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 64 65 c CK_UTF8CHAR de
19120 66 61 75 6c 74 4c 61 62 65 6c 5b 5d 20 3d 20 22 faultLabel[] = "
19130 55 6e 6b 6e 6f 77 6e 20 54 6f 6b 65 6e 22 3b 0a Unknown Token";.
19140 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 .static CK_UTF8C
19150 48 41 52 20 6d 6f 64 65 6c 5b 5d 20 3d 20 22 43 HAR model[] = "C
19160 41 43 20 54 6f 6b 65 6e 22 3b 0a 09 73 74 72 75 AC Token";..stru
19170 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 ct cackey_pcsc_i
19180 64 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64 dentity *pcsc_id
19190 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73 69 67 entities;..unsig
191a0 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72 ned long num_cer
191b0 74 73 3b 0a 09 73 73 69 7a 65 5f 74 20 6c 61 62 ts;..ssize_t lab
191c0 65 6c 5f 72 65 74 3b 0a 09 69 6e 74 20 6d 75 74 el_ret;..int mut
191d0 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 ex_retval;..int
191e0 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 use_default_labe
191f0 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 l;...CACKEY_DEBU
19200 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 G_PRINTF("Called
19210 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f .");...if (pInfo
19220 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 == NULL) {...CA
19230 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
19240 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 F("Error. pInfo
19250 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 is NULL.");....r
19260 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 eturn(CKR_ARGUME
19270 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 NTS_BAD);..}...i
19280 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 f (!cackey_initi
19290 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b alized) {...CACK
192a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
192b0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 "Error. Not ini
192c0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 tialized.");....
192d0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 return(CKR_CRYPT
192e0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 OKI_NOT_INITIALI
192f0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 ZED);..}...if (s
19300 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f lotID < 0 || slo
19310 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 tID >= (sizeof(c
19320 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 ackey_slots) / s
19330 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f izeof(cackey_slo
19340 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 ts[0]))) {...CAC
19350 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
19360 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 ("Error. Invalid
19370 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 slot requested
19380 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f (%lu), outside o
19390 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 f valid range",
193a0 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 slotID);....retu
193b0 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 rn(CKR_SLOT_ID_I
193c0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 NVALID);..}...mu
193d0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 tex_retval = cac
193e0 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 key_mutex_lock(c
193f0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
19400 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 .if (mutex_retva
19410 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b l != 0) {...CACK
19420 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
19430 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 "Error. Locking
19440 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 failed.");....r
19450 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 eturn(CKR_GENERA
19460 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 L_ERROR);..}...i
19470 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b f (cackey_slots[
19480 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d slotID].active =
19490 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f = 0) {...CACKEY_
194a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
194b0 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f ror. Invalid slo
194c0 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 t requested (%lu
194d0 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 ), slot not curr
194e0 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 ently active", s
194f0 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 lotID);....cacke
19500 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
19510 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
19520 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c ...return(CKR_SL
19530 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a OT_ID_INVALID);.
19540 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f .}...if (cackey_
19550 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26 63 token_present(&c
19560 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 ackey_slots[slot
19570 49 44 5d 29 20 21 3d 20 43 41 43 4b 45 59 5f 50 ID]) != CACKEY_P
19580 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 CSC_S_TOKENPRESE
19590 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 NT) {...CACKEY_D
195a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4e 6f 20 EBUG_PRINTF("No
195b0 74 6f 6b 65 6e 20 69 73 20 70 72 65 73 65 6e 74 token is present
195c0 20 69 6e 20 73 6c 6f 74 49 44 20 3d 20 25 6c 75 in slotID = %lu
195d0 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 ", slotID);....c
195e0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f ackey_mutex_unlo
195f0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
19600 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b k);....return(CK
19610 52 5f 54 4f 4b 45 4e 5f 4e 4f 54 5f 50 52 45 53 R_TOKEN_NOT_PRES
19620 45 4e 54 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 ENT);..}...mutex
19630 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 _retval = cackey
19640 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 _mutex_unlock(ca
19650 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 ckey_biglock);..
19660 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c if (mutex_retval
19670 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 != 0) {...CACKE
19680 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
19690 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e Error. Unlockin
196a0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 g failed.");....
196b0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 return(CKR_GENER
196c0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 AL_ERROR);..}...
196d0 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 6f 6b /* Determine tok
196e0 65 6e 20 6c 61 62 65 6c 20 66 72 6f 6d 20 63 65 en label from ce
196f0 72 74 69 66 69 63 61 74 65 73 20 2a 2f 0a 09 6d rtificates */..m
19700 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6c 61 62 emset(pInfo->lab
19710 65 6c 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 el, ' ', sizeof(
19720 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a pInfo->label));.
19730 09 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 .use_default_lab
19740 65 6c 20 3d 20 31 3b 0a 0a 09 69 66 20 28 63 61 el = 1;...if (ca
19750 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 ckey_slots[slotI
19760 44 5d 2e 6c 61 62 65 6c 20 3d 3d 20 4e 55 4c 4c D].label == NULL
19770 29 20 7b 0a 09 09 70 63 73 63 5f 69 64 65 6e 74 ) {...pcsc_ident
19780 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 ities = cackey_r
19790 65 61 64 5f 63 65 72 74 73 28 26 63 61 63 6b 65 ead_certs(&cacke
197a0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c y_slots[slotID],
197b0 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 NULL, &num_cert
197c0 73 29 3b 0a 09 09 69 66 20 28 70 63 73 63 5f 69 s);...if (pcsc_i
197d0 64 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c dentities != NUL
197e0 4c 29 20 7b 0a 09 09 09 69 66 20 28 6e 75 6d 5f L) {....if (num_
197f0 63 65 72 74 73 20 3e 20 30 29 20 7b 0a 09 09 09 certs > 0) {....
19800 09 6c 61 62 65 6c 5f 72 65 74 20 3d 20 63 61 63 .label_ret = cac
19810 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 key_pcsc_identit
19820 79 5f 74 6f 5f 6c 61 62 65 6c 28 70 63 73 63 5f y_to_label(pcsc_
19830 69 64 65 6e 74 69 74 69 65 73 2c 20 70 49 6e 66 identities, pInf
19840 6f 2d 3e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 o->label, sizeof
19850 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b (pInfo->label));
19860 0a 09 09 09 09 69 66 20 28 6c 61 62 65 6c 5f 72 .....if (label_r
19870 65 74 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 75 et > 0) {......u
19880 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c se_default_label
19890 20 3d 20 30 3b 0a 0a 09 09 09 09 09 63 61 63 6b = 0;.......cack
198a0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d ey_slots[slotID]
198b0 2e 6c 61 62 65 6c 20 3d 20 6d 61 6c 6c 6f 63 28 .label = malloc(
198c0 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 sizeof(pInfo->la
198d0 62 65 6c 29 29 3b 0a 0a 09 09 09 09 09 6d 65 6d bel));.......mem
198e0 63 70 79 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 cpy(cackey_slots
198f0 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 2c 20 [slotID].label,
19900 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 73 69 pInfo->label, si
19910 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 zeof(pInfo->labe
19920 6c 29 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a l));.....}....}.
19930 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f ....cackey_free_
19940 63 65 72 74 73 28 70 63 73 63 5f 69 64 65 6e 74 certs(pcsc_ident
19950 69 74 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73 ities, num_certs
19960 2c 20 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 , 1);...}..} els
19970 65 20 7b 0a 09 09 6d 65 6d 63 70 79 28 70 49 6e e {...memcpy(pIn
19980 66 6f 2d 3e 6c 61 62 65 6c 2c 20 63 61 63 6b 65 fo->label, cacke
19990 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e y_slots[slotID].
199a0 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49 label, sizeof(pI
199b0 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 0a 09 nfo->label));...
199c0 09 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 .use_default_lab
199d0 65 6c 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 el = 0;..}...if
199e0 28 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 (use_default_lab
199f0 65 6c 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28 70 el) {...memcpy(p
19a00 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 64 65 66 Info->label, def
19a10 61 75 6c 74 4c 61 62 65 6c 2c 20 73 69 7a 65 6f aultLabel, sizeo
19a20 66 28 64 65 66 61 75 6c 74 4c 61 62 65 6c 29 20 f(defaultLabel)
19a30 2d 20 31 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 - 1);..}...memse
19a40 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 t(pInfo->manufac
19a50 74 75 72 65 72 49 44 2c 20 27 20 27 2c 20 73 69 turerID, ' ', si
19a60 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 zeof(pInfo->manu
19a70 66 61 63 74 75 72 65 72 49 44 29 29 3b 0a 09 6d facturerID));..m
19a80 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e emcpy(pInfo->man
19a90 75 66 61 63 74 75 72 65 72 49 44 2c 20 6d 61 6e ufacturerID, man
19aa0 75 66 61 63 74 75 72 65 72 49 44 2c 20 73 69 7a ufacturerID, siz
19ab0 65 6f 66 28 6d 61 6e 75 66 61 63 74 75 72 65 72 eof(manufacturer
19ac0 49 44 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 ID) - 1);...mems
19ad0 65 74 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c et(pInfo->model,
19ae0 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e ' ', sizeof(pIn
19af0 66 6f 2d 3e 6d 6f 64 65 6c 29 29 3b 0a 09 6d 65 fo->model));..me
19b00 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 mcpy(pInfo->mode
19b10 6c 2c 20 6d 6f 64 65 6c 2c 20 73 69 7a 65 6f 66 l, model, sizeof
19b20 28 6d 6f 64 65 6c 29 20 2d 20 31 29 3b 0a 0a 09 (model) - 1);...
19b30 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 73 65 memset(pInfo->se
19b40 72 69 61 6c 4e 75 6d 62 65 72 2c 20 27 20 27 2c rialNumber, ' ',
19b50 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 73 sizeof(pInfo->s
19b60 65 72 69 61 6c 4e 75 6d 62 65 72 29 29 3b 0a 0a erialNumber));..
19b70 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 75 .memset(pInfo->u
19b80 74 63 54 69 6d 65 2c 20 27 20 27 2c 20 73 69 7a tcTime, ' ', siz
19b90 65 6f 66 28 70 49 6e 66 6f 2d 3e 75 74 63 54 69 eof(pInfo->utcTi
19ba0 6d 65 29 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68 me));...pInfo->h
19bb0 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d ardwareVersion.m
19bc0 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 ajor = (cackey_g
19bd0 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 etversion() >> 1
19be0 36 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6) & 0xff;..pInf
19bf0 6f 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73 69 o->hardwareVersi
19c00 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b on.minor = (cack
19c10 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 ey_getversion()
19c20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 >> 8) & 0xff;...
19c30 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 pInfo->firmwareV
19c40 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30 ersion.major = 0
19c50 78 30 30 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 x00;..pInfo->fir
19c60 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e mwareVersion.min
19c70 6f 72 20 3d 20 30 78 30 30 3b 0a 0a 09 70 49 6e or = 0x00;...pIn
19c80 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f fo->flags = CKF_
19c90 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 20 WRITE_PROTECTED
19ca0 7c 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 49 | CKF_USER_PIN_I
19cb0 4e 49 54 49 41 4c 49 5a 45 44 20 7c 20 43 4b 46 NITIALIZED | CKF
19cc0 5f 54 4f 4b 45 4e 5f 49 4e 49 54 49 41 4c 49 5a _TOKEN_INITIALIZ
19cd0 45 44 20 7c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 ED | cackey_slot
19ce0 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f s[slotID].token_
19cf0 66 6c 61 67 73 3b 0a 0a 09 70 49 6e 66 6f 2d 3e flags;...pInfo->
19d00 75 6c 4d 61 78 53 65 73 73 69 6f 6e 43 6f 75 6e ulMaxSessionCoun
19d10 74 20 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b t = (sizeof(cack
19d20 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 ey_sessions) / s
19d30 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 izeof(cackey_ses
19d40 73 69 6f 6e 73 5b 30 5d 29 29 20 2d 20 31 3b 0a sions[0])) - 1;.
19d50 09 70 49 6e 66 6f 2d 3e 75 6c 53 65 73 73 69 6f .pInfo->ulSessio
19d60 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f 55 4e 41 56 nCount = CK_UNAV
19d70 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 AILABLE_INFORMAT
19d80 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d ION;..pInfo->ulM
19d90 61 78 52 77 53 65 73 73 69 6f 6e 43 6f 75 6e 74 axRwSessionCount
19da0 20 3d 20 30 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c = 0;..pInfo->ul
19db0 52 77 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d RwSessionCount =
19dc0 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f CK_UNAVAILABLE_
19dd0 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 INFORMATION;..pI
19de0 6e 66 6f 2d 3e 75 6c 4d 61 78 50 69 6e 4c 65 6e nfo->ulMaxPinLen
19df0 20 3d 20 31 32 38 3b 0a 09 70 49 6e 66 6f 2d 3e = 128;..pInfo->
19e00 75 6c 4d 69 6e 50 69 6e 4c 65 6e 20 3d 20 30 3b ulMinPinLen = 0;
19e10 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61 6c ..pInfo->ulTotal
19e20 50 75 62 6c 69 63 4d 65 6d 6f 72 79 20 3d 20 43 PublicMemory = C
19e30 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e K_UNAVAILABLE_IN
19e40 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 FORMATION;..pInf
19e50 6f 2d 3e 75 6c 46 72 65 65 50 75 62 6c 69 63 4d o->ulFreePublicM
19e60 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 emory = CK_UNAVA
19e70 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 ILABLE_INFORMATI
19e80 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54 6f ON;..pInfo->ulTo
19e90 74 61 6c 50 72 69 76 61 74 65 4d 65 6d 6f 72 79 talPrivateMemory
19ea0 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c = CK_UNAVAILABL
19eb0 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 E_INFORMATION;..
19ec0 70 49 6e 66 6f 2d 3e 75 6c 46 72 65 65 50 72 69 pInfo->ulFreePri
19ed0 76 61 74 65 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f vateMemory = CK_
19ee0 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f UNAVAILABLE_INFO
19ef0 52 4d 41 54 49 4f 4e 3b 0a 0a 09 43 41 43 4b 45 RMATION;...CACKE
19f00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
19f10 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b Returning CKR_OK
19f20 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b (%i)", CKR_OK);
19f30 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b ...return(CKR_OK
19f40 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f );.}..CK_DEFINE_
19f50 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 FUNCTION(CK_RV,
19f60 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74 45 76 65 C_WaitForSlotEve
19f70 6e 74 29 28 43 4b 5f 46 4c 41 47 53 20 66 6c 61 nt)(CK_FLAGS fla
19f80 67 73 2c 20 43 4b 5f 53 4c 4f 54 5f 49 44 5f 50 gs, CK_SLOT_ID_P
19f90 54 52 20 70 53 6c 6f 74 49 44 2c 20 43 4b 5f 56 TR pSlotID, CK_V
19fa0 4f 49 44 5f 50 54 52 20 70 52 65 73 65 72 76 65 OID_PTR pReserve
19fb0 64 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 d) {..CACKEY_DEB
19fc0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
19fd0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 52 65 73 d.");...if (pRes
19fe0 65 72 76 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b erved != NULL) {
19ff0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1a000 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 PRINTF("Error. p
1a010 52 65 73 65 72 76 65 64 20 69 73 20 6e 6f 74 20 Reserved is not
1a020 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 NULL.");....retu
1a030 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 rn(CKR_ARGUMENTS
1a040 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 _BAD);..}...if (
1a050 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 !cackey_initiali
1a060 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f zed) {...CACKEY_
1a070 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
1a080 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 ror. Not initia
1a090 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 lized.");....ret
1a0a0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 urn(CKR_CRYPTOKI
1a0b0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 _NOT_INITIALIZED
1a0c0 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 58 58 58 3a 20 );..}.../* XXX:
1a0d0 54 4f 44 4f 3a 20 49 6d 70 6c 65 6d 65 6e 74 20 TODO: Implement
1a0e0 74 68 69 73 2e 2e 2e 20 2a 2f 0a 09 43 41 43 4b this... */..CACK
1a0f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1a100 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 "Returning CKR_F
1a110 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
1a120 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 ORTED (%i)", CKR
1a130 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
1a140 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 PPORTED);...retu
1a150 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f rn(CKR_FUNCTION_
1a160 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
1a170 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e }..CK_DEFINE_FUN
1a180 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 CTION(CK_RV, C_G
1a190 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 29 etMechanismList)
1a1a0 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 (CK_SLOT_ID slot
1a1b0 49 44 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d ID, CK_MECHANISM
1a1c0 5f 54 59 50 45 5f 50 54 52 20 70 4d 65 63 68 61 _TYPE_PTR pMecha
1a1d0 6e 69 73 6d 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f nismList, CK_ULO
1a1e0 4e 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 NG_PTR pulCount)
1a1f0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {..CACKEY_DEBUG
1a200 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
1a210 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ");...if (!cacke
1a220 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b y_initialized) {
1a230 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1a240 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
1a250 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e Not initialized.
1a260 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
1a270 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 R_CRYPTOKI_NOT_I
1a280 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
1a290 0a 09 69 66 20 28 70 75 6c 43 6f 75 6e 74 20 3d ..if (pulCount =
1a2a0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b = NULL) {...CACK
1a2b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1a2c0 22 45 72 72 6f 72 2e 20 20 70 75 6c 43 6f 75 6e "Error. pulCoun
1a2d0 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 t is NULL.");...
1a2e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 .return(CKR_ARGU
1a2f0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a MENTS_BAD);..}..
1a300 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 4c .if (pMechanismL
1a310 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ist == NULL) {..
1a320 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 32 3b 0a .*pulCount = 2;.
1a330 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1a340 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e PRINTF("Returnin
1a350 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 g CKR_OK (%i)",
1a360 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 CKR_OK);....retu
1a370 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a rn(CKR_OK);..}..
1a380 09 69 66 20 28 2a 70 75 6c 43 6f 75 6e 74 20 3c .if (*pulCount <
1a390 20 32 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 2) {...CACKEY_D
1a3a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
1a3b0 6f 72 2e 20 20 42 75 66 66 65 72 20 74 6f 6f 20 or. Buffer too
1a3c0 73 6d 61 6c 6c 2e 22 29 3b 0a 0a 09 09 72 65 74 small.");....ret
1a3d0 75 72 6e 28 43 4b 52 5f 42 55 46 46 45 52 5f 54 urn(CKR_BUFFER_T
1a3e0 4f 4f 5f 53 4d 41 4c 4c 29 3b 0a 09 7d 0a 0a 09 OO_SMALL);..}...
1a3f0 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 5b 30 pMechanismList[0
1a400 5d 20 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 ] = CKM_RSA_PKCS
1a410 3b 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 31 ;..*pulCount = 1
1a420 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ;...CACKEY_DEBUG
1a430 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
1a440 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c ng CKR_OK (%i)",
1a450 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 CKR_OK);...retu
1a460 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 rn(CKR_OK);.}..C
1a470 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f K_DEFINE_FUNCTIO
1a480 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4d 65 N(CK_RV, C_GetMe
1a490 63 68 61 6e 69 73 6d 49 6e 66 6f 29 28 43 4b 5f chanismInfo)(CK_
1a4a0 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 SLOT_ID slotID,
1a4b0 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 CK_MECHANISM_TYP
1a4c0 45 20 74 79 70 65 2c 20 43 4b 5f 4d 45 43 48 41 E type, CK_MECHA
1a4d0 4e 49 53 4d 5f 49 4e 46 4f 5f 50 54 52 20 70 49 NISM_INFO_PTR pI
1a4e0 6e 66 6f 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 nfo) {..int mute
1a4f0 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b x_retval;...CACK
1a500 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1a510 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 "Called.");...if
1a520 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 (pInfo == NULL)
1a530 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
1a540 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
1a550 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 pInfo is NULL."
1a560 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
1a570 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b _ARGUMENTS_BAD);
1a580 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ..}...if (!cacke
1a590 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b y_initialized) {
1a5a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1a5b0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
1a5c0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e Not initialized.
1a5d0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
1a5e0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 R_CRYPTOKI_NOT_I
1a5f0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
1a600 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 ..if (slotID < 0
1a610 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 || slotID >= (s
1a620 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f izeof(cackey_slo
1a630 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 ts) / sizeof(cac
1a640 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 key_slots[0])))
1a650 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
1a660 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
1a670 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 Invalid slot req
1a680 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 uested (%lu), ou
1a690 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 tside of valid r
1a6a0 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a ange", slotID);.
1a6b0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c ...return(CKR_SL
1a6c0 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a OT_ID_INVALID);.
1a6d0 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 .}...mutex_retva
1a6e0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 l = cackey_mutex
1a6f0 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 _lock(cackey_big
1a700 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 lock);..if (mute
1a710 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b x_retval != 0) {
1a720 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1a730 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
1a740 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 Locking failed."
1a750 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
1a760 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b _GENERAL_ERROR);
1a770 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 ..}...if (cackey
1a780 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 _slots[slotID].a
1a790 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 ctive == 0) {...
1a7a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1a7b0 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 NTF("Error. Inva
1a7c0 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 lid slot request
1a7d0 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e ed (%lu), slot n
1a7e0 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 ot currently act
1a7f0 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a ive", slotID);..
1a800 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 ..cackey_mutex_u
1a810 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 nlock(cackey_big
1a820 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e lock);....return
1a830 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 (CKR_SLOT_ID_INV
1a840 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 ALID);..}...mute
1a850 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 x_retval = cacke
1a860 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
1a870 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
1a880 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 .if (mutex_retva
1a890 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b l != 0) {...CACK
1a8a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1a8b0 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 "Error. Unlocki
1a8c0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 ng failed.");...
1a8d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 .return(CKR_GENE
1a8e0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a RAL_ERROR);..}..
1a8f0 09 73 77 69 74 63 68 20 28 74 79 70 65 29 20 7b .switch (type) {
1a900 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f ...case CKM_RSA_
1a910 50 4b 43 53 3a 0a 09 09 09 70 49 6e 66 6f 2d 3e PKCS:....pInfo->
1a920 75 6c 4d 69 6e 4b 65 79 53 69 7a 65 20 3d 20 35 ulMinKeySize = 5
1a930 31 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 12;....pInfo->ul
1a940 4d 61 78 4b 65 79 53 69 7a 65 20 3d 20 38 31 39 MaxKeySize = 819
1a950 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 2;....pInfo->fla
1a960 67 73 20 3d 20 43 4b 46 5f 48 57 20 7c 20 43 4b gs = CKF_HW | CK
1a970 46 5f 45 4e 43 52 59 50 54 20 7c 20 43 4b 46 5f F_ENCRYPT | CKF_
1a980 44 45 43 52 59 50 54 20 7c 20 43 4b 46 5f 53 49 DECRYPT | CKF_SI
1a990 47 4e 20 7c 20 43 4b 46 5f 56 45 52 49 46 59 3b GN | CKF_VERIFY;
1a9a0 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 ....break;..}...
1a9b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1a9c0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 NTF("Returning C
1a9d0 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 KR_OK (%i)", CKR
1a9e0 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 _OK);...return(C
1a9f0 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 KR_OK);.}../* We
1aa00 20 64 6f 6e 27 74 20 73 75 70 70 6f 72 74 20 74 don't support t
1aa10 68 69 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 his method. */.C
1aa20 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f K_DEFINE_FUNCTIO
1aa30 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 54 N(CK_RV, C_InitT
1aa40 6f 6b 65 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 oken)(CK_SLOT_ID
1aa50 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 55 54 46 38 slotID, CK_UTF8
1aa60 43 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 CHAR_PTR pPin, C
1aa70 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e K_ULONG ulPinLen
1aa80 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 , CK_UTF8CHAR_PT
1aa90 52 20 70 4c 61 62 65 6c 29 20 7b 0a 09 43 41 43 R pLabel) {..CAC
1aaa0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1aab0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 ("Called.");...i
1aac0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 f (!cackey_initi
1aad0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b alized) {...CACK
1aae0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1aaf0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 "Error. Not ini
1ab00 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 tialized.");....
1ab10 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 return(CKR_CRYPT
1ab20 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 OKI_NOT_INITIALI
1ab30 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 ZED);..}...CACKE
1ab40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1ab50 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 54 4f Returning CKR_TO
1ab60 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 KEN_WRITE_PROTEC
1ab70 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 54 TED (%i)", CKR_T
1ab80 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 OKEN_WRITE_PROTE
1ab90 43 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 CTED);...return(
1aba0 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f CKR_TOKEN_WRITE_
1abb0 50 52 4f 54 45 43 54 45 44 29 3b 0a 7d 0a 0a 2f PROTECTED);.}../
1abc0 2a 20 57 65 20 64 6f 6e 27 74 20 73 75 70 70 6f * We don't suppo
1abd0 72 74 20 74 68 69 73 20 6d 65 74 68 6f 64 2e 20 rt this method.
1abe0 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e */.CK_DEFINE_FUN
1abf0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 CTION(CK_RV, C_I
1ac00 6e 69 74 50 49 4e 29 28 43 4b 5f 53 45 53 53 49 nitPIN)(CK_SESSI
1ac10 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 ON_HANDLE hSessi
1ac20 6f 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f on, CK_UTF8CHAR_
1ac30 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f PTR pPin, CK_ULO
1ac40 4e 47 20 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09 NG ulPinLen) {..
1ac50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1ac60 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a NTF("Called.");.
1ac70 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e ..if (!cackey_in
1ac80 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 itialized) {...C
1ac90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1aca0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 TF("Error. Not
1acb0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a initialized.");.
1acc0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 ...return(CKR_CR
1acd0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 YPTOKI_NOT_INITI
1ace0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 ALIZED);..}...CA
1acf0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
1ad00 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 F("Returning CKR
1ad10 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f _TOKEN_WRITE_PRO
1ad20 54 45 43 54 45 44 20 28 25 69 29 22 2c 20 43 4b TECTED (%i)", CK
1ad30 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 R_TOKEN_WRITE_PR
1ad40 4f 54 45 43 54 45 44 29 3b 0a 0a 09 72 65 74 75 OTECTED);...retu
1ad50 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 rn(CKR_TOKEN_WRI
1ad60 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 7d TE_PROTECTED);.}
1ad70 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73 75 ../* We don't su
1ad80 70 70 6f 72 74 20 74 68 69 73 20 6d 65 74 68 6f pport this metho
1ad90 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f d. */.CK_DEFINE_
1ada0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 FUNCTION(CK_RV,
1adb0 43 5f 53 65 74 50 49 4e 29 28 43 4b 5f 53 45 53 C_SetPIN)(CK_SES
1adc0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 SION_HANDLE hSes
1add0 73 69 6f 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 sion, CK_UTF8CHA
1ade0 52 5f 50 54 52 20 70 4f 6c 64 50 69 6e 2c 20 43 R_PTR pOldPin, C
1adf0 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 6c 64 50 69 6e K_ULONG ulOldPin
1ae00 4c 65 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 Len, CK_UTF8CHAR
1ae10 5f 50 54 52 20 70 4e 65 77 50 69 6e 2c 20 43 4b _PTR pNewPin, CK
1ae20 5f 55 4c 4f 4e 47 20 75 6c 4e 65 77 50 69 6e 4c _ULONG ulNewPinL
1ae30 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 en) {..CACKEY_DE
1ae40 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
1ae50 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 ed.");...if (!ca
1ae60 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 ckey_initialized
1ae70 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
1ae80 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
1ae90 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a . Not initializ
1aea0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
1aeb0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f (CKR_CRYPTOKI_NO
1aec0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a T_INITIALIZED);.
1aed0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 .}...CACKEY_DEBU
1aee0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
1aef0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e ing CKR_FUNCTION
1af00 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 _NOT_SUPPORTED (
1af10 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 %i)", CKR_FUNCTI
1af20 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 ON_NOT_SUPPORTED
1af30 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f );...return(CKR_
1af40 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
1af50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 PORTED);.}..CK_D
1af60 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 EFINE_FUNCTION(C
1af70 4b 5f 52 56 2c 20 43 5f 4f 70 65 6e 53 65 73 73 K_RV, C_OpenSess
1af80 69 6f 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 ion)(CK_SLOT_ID
1af90 73 6c 6f 74 49 44 2c 20 43 4b 5f 46 4c 41 47 53 slotID, CK_FLAGS
1afa0 20 66 6c 61 67 73 2c 20 43 4b 5f 56 4f 49 44 5f flags, CK_VOID_
1afb0 50 54 52 20 70 41 70 70 6c 69 63 61 74 69 6f 6e PTR pApplication
1afc0 2c 20 43 4b 5f 4e 4f 54 49 46 59 20 6e 6f 74 69 , CK_NOTIFY noti
1afd0 66 79 2c 20 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 fy, CK_SESSION_H
1afe0 41 4e 44 4c 45 5f 50 54 52 20 70 68 53 65 73 73 ANDLE_PTR phSess
1aff0 69 6f 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 ion) {..unsigned
1b000 20 6c 6f 6e 67 20 69 64 78 3b 0a 09 69 6e 74 20 long idx;..int
1b010 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 mutex_retval;..i
1b020 6e 74 20 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e nt found_session
1b030 20 3d 20 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 = 0;...CACKEY_D
1b040 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
1b050 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 66 led.");...if ((f
1b060 6c 61 67 73 20 26 20 43 4b 46 5f 53 45 52 49 41 lags & CKF_SERIA
1b070 4c 5f 53 45 53 53 49 4f 4e 29 20 21 3d 20 43 4b L_SESSION) != CK
1b080 46 5f 53 45 52 49 41 4c 5f 53 45 53 53 49 4f 4e F_SERIAL_SESSION
1b090 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 ) {...return(CKR
1b0a0 5f 53 45 53 53 49 4f 4e 5f 50 41 52 41 4c 4c 45 _SESSION_PARALLE
1b0b0 4c 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 L_NOT_SUPPORTED)
1b0c0 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b ;..}...if (!cack
1b0d0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 ey_initialized)
1b0e0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
1b0f0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
1b100 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 Not initialized
1b110 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
1b120 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f KR_CRYPTOKI_NOT_
1b130 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d INITIALIZED);..}
1b140 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 ...if (slotID <
1b150 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 0 || slotID >= (
1b160 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c sizeof(cackey_sl
1b170 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 ots) / sizeof(ca
1b180 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 ckey_slots[0])))
1b190 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
1b1a0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
1b1b0 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 Invalid slot re
1b1c0 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f quested (%lu), o
1b1d0 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 utside of valid
1b1e0 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b range", slotID);
1b1f0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 ....return(CKR_S
1b200 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b LOT_ID_INVALID);
1b210 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 ..}...mutex_retv
1b220 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 al = cackey_mute
1b230 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 x_lock(cackey_bi
1b240 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 glock);..if (mut
1b250 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 ex_retval != 0)
1b260 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
1b270 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
1b280 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e Locking failed.
1b290 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
1b2a0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 R_GENERAL_ERROR)
1b2b0 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 ;..}...if (cacke
1b2c0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e y_slots[slotID].
1b2d0 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 active == 0) {..
1b2e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1b2f0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 INTF("Error. Inv
1b300 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 alid slot reques
1b310 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 ted (%lu), slot
1b320 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 not currently ac
1b330 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a tive", slotID);.
1b340 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f ...cackey_mutex_
1b350 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 unlock(cackey_bi
1b360 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 glock);....retur
1b370 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e n(CKR_SLOT_ID_IN
1b380 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 VALID);..}.../*
1b390 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 Verify that the
1b3a0 63 61 72 64 20 69 73 20 61 63 74 75 61 6c 6c 79 card is actually
1b3b0 20 69 6e 20 74 68 65 20 73 6c 6f 74 2e 20 2a 2f in the slot. */
1b3c0 0a 09 2f 2a 20 58 58 58 3a 20 43 68 65 63 6b 20 ../* XXX: Check
1b3d0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 69 to make sure thi
1b3e0 73 20 69 73 20 69 6e 20 74 68 65 20 50 4b 43 53 s is in the PKCS
1b3f0 23 31 31 20 73 70 65 63 69 66 69 63 61 74 69 6f #11 specificatio
1b400 6e 20 2a 2f 0a 09 69 66 20 28 63 61 63 6b 65 79 n */..if (cackey
1b410 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26 _token_present(&
1b420 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f cackey_slots[slo
1b430 74 49 44 5d 29 20 21 3d 20 43 41 43 4b 45 59 5f tID]) != CACKEY_
1b440 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 PCSC_S_TOKENPRES
1b450 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f ENT) {...CACKEY_
1b460 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
1b470 72 6f 72 2e 20 20 43 61 72 64 20 6e 6f 74 20 70 ror. Card not p
1b480 72 65 73 65 6e 74 2e 20 20 52 65 74 75 72 6e 69 resent. Returni
1b490 6e 67 20 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 ng CKR_DEVICE_RE
1b4a0 4d 4f 56 45 44 22 29 3b 0a 0a 09 09 63 61 63 6b MOVED");....cack
1b4b0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 ey_mutex_unlock(
1b4c0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
1b4d0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 44 ....return(CKR_D
1b4e0 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 29 3b 0a EVICE_REMOVED);.
1b4f0 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 .}...for (idx =
1b500 31 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 1; idx < (sizeof
1b510 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 (cackey_sessions
1b520 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 ) / sizeof(cacke
1b530 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b y_sessions[0]));
1b540 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 idx++) {...if (
1b550 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 !cackey_sessions
1b560 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a [idx].active) {.
1b570 09 09 09 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e ...found_session
1b580 20 3d 20 31 3b 0a 0a 09 09 09 2a 70 68 53 65 73 = 1;.....*phSes
1b590 73 69 6f 6e 20 3d 20 69 64 78 3b 0a 0a 09 09 09 sion = idx;.....
1b5a0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
1b5b0 69 64 78 5d 2e 61 63 74 69 76 65 20 3d 20 31 3b idx].active = 1;
1b5c0 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 ....cackey_sessi
1b5d0 6f 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74 49 44 20 ons[idx].slotID
1b5e0 3d 20 73 6c 6f 74 49 44 3b 0a 09 09 09 63 61 63 = slotID;....cac
1b5f0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 key_sessions[idx
1b600 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f ].state = CKS_RO
1b610 5f 50 55 42 4c 49 43 5f 53 45 53 53 49 4f 4e 3b _PUBLIC_SESSION;
1b620 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 ....cackey_sessi
1b630 6f 6e 73 5b 69 64 78 5d 2e 66 6c 61 67 73 20 3d ons[idx].flags =
1b640 20 66 6c 61 67 73 3b 0a 09 09 09 63 61 63 6b 65 flags;....cacke
1b650 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e y_sessions[idx].
1b660 75 6c 44 65 76 69 63 65 45 72 72 6f 72 20 3d 20 ulDeviceError =
1b670 30 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 0;....cackey_ses
1b680 73 69 6f 6e 73 5b 69 64 78 5d 2e 70 41 70 70 6c sions[idx].pAppl
1b690 69 63 61 74 69 6f 6e 20 3d 20 70 41 70 70 6c 69 ication = pAppli
1b6a0 63 61 74 69 6f 6e 3b 0a 09 09 09 63 61 63 6b 65 cation;....cacke
1b6b0 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e y_sessions[idx].
1b6c0 4e 6f 74 69 66 79 20 3d 20 6e 6f 74 69 66 79 3b Notify = notify;
1b6d0 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 .....cackey_sess
1b6e0 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 ions[idx].identi
1b6f0 74 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 ties = NULL;....
1b700 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
1b710 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f idx].identities_
1b720 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 09 63 count = 0;.....c
1b730 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 ackey_sessions[i
1b740 64 78 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 dx].search_activ
1b750 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 e = 0;.....cacke
1b760 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e y_sessions[idx].
1b770 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 30 3b sign_active = 0;
1b780 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 .....cackey_sess
1b790 69 6f 6e 73 5b 69 64 78 5d 2e 64 65 63 72 79 70 ions[idx].decryp
1b7a0 74 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 t_active = 0;...
1b7b0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e ..cackey_session
1b7c0 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 s[idx].identitie
1b7d0 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f s = cackey_read_
1b7e0 69 64 65 6e 74 69 74 69 65 73 28 26 63 61 63 6b identities(&cack
1b7f0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d ey_slots[slotID]
1b800 2c 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f , &cackey_sessio
1b810 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 ns[idx].identiti
1b820 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 0a 09 09 09 es_count);......
1b830 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 break;...}..}...
1b840 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 mutex_retval = c
1b850 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f ackey_mutex_unlo
1b860 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
1b870 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 k);..if (mutex_r
1b880 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 etval != 0) {...
1b890 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1b8a0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c NTF("Error. Unl
1b8b0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 ocking failed.")
1b8c0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
1b8d0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a GENERAL_ERROR);.
1b8e0 09 7d 0a 0a 09 69 66 20 28 21 66 6f 75 6e 64 5f .}...if (!found_
1b8f0 73 65 73 73 69 6f 6e 29 20 7b 0a 09 09 43 41 43 session) {...CAC
1b900 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1b910 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f ("Returning CKR_
1b920 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 20 28 25 SESSION_COUNT (%
1b930 69 29 22 2c 20 43 4b 52 5f 53 45 53 53 49 4f 4e i)", CKR_SESSION
1b940 5f 43 4f 55 4e 54 29 3b 0a 0a 09 09 72 65 74 75 _COUNT);....retu
1b950 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 rn(CKR_SESSION_C
1b960 4f 55 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b OUNT);..}...CACK
1b970 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1b980 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f "Returning CKR_O
1b990 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 K (%i)", CKR_OK)
1b9a0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f ;...return(CKR_O
1b9b0 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 K);.}..CK_DEFINE
1b9c0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c _FUNCTION(CK_RV,
1b9d0 20 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 29 C_CloseSession)
1b9e0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 (CK_SESSION_HAND
1b9f0 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 LE hSession) {..
1ba00 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c int mutex_retval
1ba10 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ;...CACKEY_DEBUG
1ba20 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
1ba30 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ");...if (!cacke
1ba40 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b y_initialized) {
1ba50 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1ba60 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
1ba70 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e Not initialized.
1ba80 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
1ba90 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 R_CRYPTOKI_NOT_I
1baa0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
1bab0 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d ..if (hSession =
1bac0 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 = 0 || hSession
1bad0 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 >= (sizeof(cacke
1bae0 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 y_sessions) / si
1baf0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 zeof(cackey_sess
1bb00 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 ions[0]))) {...C
1bb10 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1bb20 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 TF("Error. Sess
1bb30 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 ion out of range
1bb40 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e .");......return
1bb50 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e (CKR_SESSION_HAN
1bb60 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d DLE_INVALID);..}
1bb70 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 ...mutex_retval
1bb80 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c = cackey_mutex_l
1bb90 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
1bba0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f ck);..if (mutex_
1bbb0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 retval != 0) {..
1bbc0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1bbd0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f INTF("Error. Lo
1bbe0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b cking failed.");
1bbf0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 ....return(CKR_G
1bc00 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 ENERAL_ERROR);..
1bc10 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f }...if (!cackey_
1bc20 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
1bc30 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 n].active) {...c
1bc40 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f ackey_mutex_unlo
1bc50 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
1bc60 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 k);....CACKEY_DE
1bc70 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
1bc80 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 r. Session not
1bc90 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 active.");......
1bca0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 return(CKR_SESSI
1bcb0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 ON_HANDLE_INVALI
1bcc0 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f D);..}...cackey_
1bcd0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
1bce0 6e 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 n].active = 0;..
1bcf0 63 61 63 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e cackey_free_iden
1bd00 74 69 74 69 65 73 28 63 61 63 6b 65 79 5f 73 65 tities(cackey_se
1bd10 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
1bd20 2e 69 64 65 6e 74 69 74 69 65 73 2c 20 63 61 63 .identities, cac
1bd30 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
1bd40 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 ssion].identitie
1bd50 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 6d 75 74 65 s_count);...mute
1bd60 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 x_retval = cacke
1bd70 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
1bd80 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
1bd90 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 .if (mutex_retva
1bda0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b l != 0) {...CACK
1bdb0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1bdc0 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 "Error. Unlocki
1bdd0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 ng failed.");...
1bde0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 .return(CKR_GENE
1bdf0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a RAL_ERROR);..}..
1be00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1be10 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
1be20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b CKR_OK (%i)", CK
1be30 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 R_OK);...return(
1be40 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 CKR_OK);.}..CK_D
1be50 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 EFINE_FUNCTION(C
1be60 4b 5f 52 56 2c 20 43 5f 43 6c 6f 73 65 41 6c 6c K_RV, C_CloseAll
1be70 53 65 73 73 69 6f 6e 73 29 28 43 4b 5f 53 4c 4f Sessions)(CK_SLO
1be80 54 5f 49 44 20 73 6c 6f 74 49 44 29 20 7b 0a 09 T_ID slotID) {..
1be90 75 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 09 69 uint32_t idx;..i
1bea0 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b nt mutex_retval;
1beb0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1bec0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
1bed0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 );...if (!cackey
1bee0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
1bef0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1bf00 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e RINTF("Error. N
1bf10 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 ot initialized."
1bf20 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
1bf30 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e _CRYPTOKI_NOT_IN
1bf40 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
1bf50 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 .if (slotID < 0
1bf60 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 || slotID >= (si
1bf70 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 zeof(cackey_slot
1bf80 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b s) / sizeof(cack
1bf90 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b ey_slots[0]))) {
1bfa0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1bfb0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 PRINTF("Error. I
1bfc0 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 nvalid slot requ
1bfd0 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 ested (%lu), out
1bfe0 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 side of valid ra
1bff0 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a nge", slotID);..
1c000 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f ..return(CKR_SLO
1c010 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 T_ID_INVALID);..
1c020 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c }...mutex_retval
1c030 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f = cackey_mutex_
1c040 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
1c050 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 ock);..if (mutex
1c060 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a _retval != 0) {.
1c070 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1c080 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c RINTF("Error. L
1c090 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 ocking failed.")
1c0a0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
1c0b0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a GENERAL_ERROR);.
1c0c0 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f .}...if (cackey_
1c0d0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 slots[slotID].ac
1c0e0 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 tive == 0) {...C
1c0f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1c100 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c TF("Error. Inval
1c110 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 id slot requeste
1c120 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f d (%lu), slot no
1c130 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 t currently acti
1c140 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 ve", slotID);...
1c150 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e .cackey_mutex_un
1c160 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
1c170 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 ock);....return(
1c180 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 CKR_SLOT_ID_INVA
1c190 4c 49 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 LID);..}...for (
1c1a0 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 idx = 0; idx < (
1c1b0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 sizeof(cackey_se
1c1c0 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 ssions) / sizeof
1c1d0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 (cackey_sessions
1c1e0 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a [0])); idx++) {.
1c1f0 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 ..if (cackey_ses
1c200 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 sions[idx].activ
1c210 65 29 20 7b 0a 09 09 09 69 66 20 28 63 61 63 6b e) {....if (cack
1c220 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d ey_sessions[idx]
1c230 2e 73 6c 6f 74 49 44 20 21 3d 20 73 6c 6f 74 49 .slotID != slotI
1c240 44 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 D) {.....continu
1c250 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b e;....}.....cack
1c260 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 ey_mutex_unlock(
1c270 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
1c280 0a 09 09 09 43 5f 43 6c 6f 73 65 53 65 73 73 69 ....C_CloseSessi
1c290 6f 6e 28 69 64 78 29 3b 0a 09 09 09 63 61 63 6b on(idx);....cack
1c2a0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 ey_mutex_lock(ca
1c2b0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 ckey_biglock);..
1c2c0 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 .}..}...mutex_re
1c2d0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 tval = cackey_mu
1c2e0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 tex_unlock(cacke
1c2f0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 y_biglock);..if
1c300 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d (mutex_retval !=
1c310 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 0) {...CACKEY_D
1c320 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
1c330 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 or. Unlocking f
1c340 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 ailed.");....ret
1c350 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f urn(CKR_GENERAL_
1c360 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 ERROR);..}...CAC
1c370 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1c380 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f ("Returning CKR_
1c390 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b OK (%i)", CKR_OK
1c3a0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f );...return(CKR_
1c3b0 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e OK);.}..CK_DEFIN
1c3c0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 E_FUNCTION(CK_RV
1c3d0 2c 20 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e , C_GetSessionIn
1c3e0 66 6f 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 fo)(CK_SESSION_H
1c3f0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 ANDLE hSession,
1c400 43 4b 5f 53 45 53 53 49 4f 4e 5f 49 4e 46 4f 5f CK_SESSION_INFO_
1c410 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 69 6e PTR pInfo) {..in
1c420 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a t mutex_retval;.
1c430 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1c440 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
1c450 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d ;...if (pInfo ==
1c460 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 NULL) {...CACKE
1c470 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1c480 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 Error. pInfo is
1c490 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 NULL.");....retu
1c4a0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 rn(CKR_ARGUMENTS
1c4b0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 _BAD);..}...if (
1c4c0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 !cackey_initiali
1c4d0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f zed) {...CACKEY_
1c4e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
1c4f0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 ror. Not initia
1c500 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 lized.");....ret
1c510 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 urn(CKR_CRYPTOKI
1c520 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 _NOT_INITIALIZED
1c530 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 );..}...if (hSes
1c540 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 sion == 0 || hSe
1c550 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 ssion >= (sizeof
1c560 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 (cackey_sessions
1c570 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 ) / sizeof(cacke
1c580 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 y_sessions[0])))
1c590 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
1c5a0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
1c5b0 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 Session out of
1c5c0 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 range.");......
1c5d0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 return(CKR_SESSI
1c5e0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 ON_HANDLE_INVALI
1c5f0 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 D);..}...mutex_r
1c600 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d etval = cackey_m
1c610 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 utex_lock(cackey
1c620 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 _biglock);..if (
1c630 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 mutex_retval !=
1c640 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 0) {...CACKEY_DE
1c650 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
1c660 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c r. Locking fail
1c670 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
1c680 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 (CKR_GENERAL_ERR
1c690 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 OR);..}...if (!c
1c6a0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
1c6b0 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 Session].active)
1c6c0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 {...cackey_mute
1c6d0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
1c6e0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 biglock);....CAC
1c6f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1c700 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f ("Error. Sessio
1c710 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b n not active.");
1c720 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 ......return(CKR
1c730 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f _SESSION_HANDLE_
1c740 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 70 INVALID);..}...p
1c750 49 6e 66 6f 2d 3e 73 6c 6f 74 49 44 20 3d 20 63 Info->slotID = c
1c760 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
1c770 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b Session].slotID;
1c780 0a 09 70 49 6e 66 6f 2d 3e 73 74 61 74 65 20 3d ..pInfo->state =
1c790 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 cackey_sessions
1c7a0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65 [hSession].state
1c7b0 3b 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 ;..pInfo->flags
1c7c0 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e = cackey_session
1c7d0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 66 6c 61 67 s[hSession].flag
1c7e0 73 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 44 65 76 s;..pInfo->ulDev
1c7f0 69 63 65 45 72 72 6f 72 20 3d 20 63 61 63 6b 65 iceError = cacke
1c800 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
1c810 69 6f 6e 5d 2e 75 6c 44 65 76 69 63 65 45 72 72 ion].ulDeviceErr
1c820 6f 72 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 or;...mutex_retv
1c830 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 al = cackey_mute
1c840 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
1c850 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d biglock);..if (m
1c860 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 utex_retval != 0
1c870 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
1c880 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
1c890 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 . Unlocking fai
1c8a0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 led.");....retur
1c8b0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 n(CKR_GENERAL_ER
1c8c0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 ROR);..}...CACKE
1c8d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1c8e0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b Returning CKR_OK
1c8f0 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b (%i)", CKR_OK);
1c900 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b ...return(CKR_OK
1c910 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f );.}..CK_DEFINE_
1c920 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 FUNCTION(CK_RV,
1c930 43 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 C_GetOperationSt
1c940 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f ate)(CK_SESSION_
1c950 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c HANDLE hSession,
1c960 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4f 70 CK_BYTE_PTR pOp
1c970 65 72 61 74 69 6f 6e 53 74 61 74 65 2c 20 43 4b erationState, CK
1c980 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4f 70 _ULONG_PTR pulOp
1c990 65 72 61 74 69 6f 6e 53 74 61 74 65 4c 65 6e 29 erationStateLen)
1c9a0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {..CACKEY_DEBUG
1c9b0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
1c9c0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ");...if (!cacke
1c9d0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b y_initialized) {
1c9e0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1c9f0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
1ca00 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e Not initialized.
1ca10 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
1ca20 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 R_CRYPTOKI_NOT_I
1ca30 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
1ca40 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1ca50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
1ca60 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f CKR_FUNCTION_NO
1ca70 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 T_SUPPORTED (%i)
1ca80 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f ", CKR_FUNCTION_
1ca90 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
1caa0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e ..return(CKR_FUN
1cab0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
1cac0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 TED);.}..CK_DEFI
1cad0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 NE_FUNCTION(CK_R
1cae0 56 2c 20 43 5f 53 65 74 4f 70 65 72 61 74 69 6f V, C_SetOperatio
1caf0 6e 53 74 61 74 65 29 28 43 4b 5f 53 45 53 53 49 nState)(CK_SESSI
1cb00 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 ON_HANDLE hSessi
1cb10 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 on, CK_BYTE_PTR
1cb20 70 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 2c pOperationState,
1cb30 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 70 65 72 CK_ULONG ulOper
1cb40 61 74 69 6f 6e 53 74 61 74 65 4c 65 6e 2c 20 43 ationStateLen, C
1cb50 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 K_OBJECT_HANDLE
1cb60 68 45 6e 63 72 79 70 74 69 6f 6e 4b 65 79 2c 20 hEncryptionKey,
1cb70 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 CK_OBJECT_HANDLE
1cb80 20 68 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e hAuthentication
1cb90 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 Key) {..CACKEY_D
1cba0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
1cbb0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 led.");...if (!c
1cbc0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 ackey_initialize
1cbd0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 d) {...CACKEY_DE
1cbe0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
1cbf0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 r. Not initiali
1cc00 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 zed.");....retur
1cc10 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e n(CKR_CRYPTOKI_N
1cc20 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b OT_INITIALIZED);
1cc30 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 ..}...CACKEY_DEB
1cc40 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
1cc50 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f ning CKR_FUNCTIO
1cc60 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 N_NOT_SUPPORTED
1cc70 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 (%i)", CKR_FUNCT
1cc80 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
1cc90 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 D);...return(CKR
1cca0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
1ccb0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f PPORTED);.}..CK_
1ccc0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 DEFINE_FUNCTION(
1ccd0 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67 69 6e 29 28 CK_RV, C_Login)(
1cce0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c CK_SESSION_HANDL
1ccf0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 E hSession, CK_U
1cd00 53 45 52 5f 54 59 50 45 20 75 73 65 72 54 79 70 SER_TYPE userTyp
1cd10 65 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 e, CK_UTF8CHAR_P
1cd20 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e TR pPin, CK_ULON
1cd30 47 20 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09 43 G ulPinLen) {..C
1cd40 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 K_SLOT_ID slotID
1cd50 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 ;..int mutex_ret
1cd60 76 61 6c 3b 0a 09 69 6e 74 20 74 72 69 65 73 5f val;..int tries_
1cd70 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 69 6e 74 20 remaining;..int
1cd80 6c 6f 67 69 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 login_ret;...CAC
1cd90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1cda0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 ("Called.");...i
1cdb0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 f (!cackey_initi
1cdc0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b alized) {...CACK
1cdd0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1cde0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 "Error. Not ini
1cdf0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 tialized.");....
1ce00 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 return(CKR_CRYPT
1ce10 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 OKI_NOT_INITIALI
1ce20 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 ZED);..}...if (h
1ce30 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 Session == 0 ||
1ce40 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a hSession >= (siz
1ce50 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 eof(cackey_sessi
1ce60 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 ons) / sizeof(ca
1ce70 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d ckey_sessions[0]
1ce80 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ))) {...CACKEY_D
1ce90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
1cea0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 or. Session out
1ceb0 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 of range.");...
1cec0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 ...return(CKR_SE
1ced0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 SSION_HANDLE_INV
1cee0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 ALID);..}...if (
1cef0 75 73 65 72 54 79 70 65 20 21 3d 20 43 4b 55 5f userType != CKU_
1cf00 55 53 45 52 29 20 7b 0a 09 09 43 41 43 4b 45 59 USER) {...CACKEY
1cf10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
1cf20 72 72 6f 72 2e 20 20 57 65 20 6f 6e 6c 79 20 73 rror. We only s
1cf30 75 70 70 6f 72 74 20 55 53 45 52 20 6d 6f 64 65 upport USER mode
1cf40 2c 20 61 73 6b 65 64 20 66 6f 72 20 25 6c 75 20 , asked for %lu
1cf50 6d 6f 64 65 2e 22 2c 20 28 75 6e 73 69 67 6e 65 mode.", (unsigne
1cf60 64 20 6c 6f 6e 67 29 20 75 73 65 72 54 79 70 65 d long) userType
1cf70 29 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f )....return(CKR_
1cf80 55 53 45 52 5f 54 59 50 45 5f 49 4e 56 41 4c 49 USER_TYPE_INVALI
1cf90 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 D);..}...mutex_r
1cfa0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d etval = cackey_m
1cfb0 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 utex_lock(cackey
1cfc0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 _biglock);..if (
1cfd0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 mutex_retval !=
1cfe0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 0) {...CACKEY_DE
1cff0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
1d000 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c r. Locking fail
1d010 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
1d020 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 (CKR_GENERAL_ERR
1d030 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 OR);..}...if (!c
1d040 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
1d050 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 Session].active)
1d060 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 {...cackey_mute
1d070 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
1d080 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 biglock);....CAC
1d090 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1d0a0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f ("Error. Sessio
1d0b0 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b n not active.");
1d0c0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 ......return(CKR
1d0d0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f _SESSION_HANDLE_
1d0e0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 INVALID);..}...s
1d0f0 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 lotID = cackey_s
1d100 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
1d110 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 ].slotID;...if (
1d120 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c slotID < 0 || sl
1d130 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 otID >= (sizeof(
1d140 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 cackey_slots) /
1d150 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c sizeof(cackey_sl
1d160 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 ots[0]))) {...CA
1d170 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
1d180 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 F("Error. Invali
1d190 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 d slot requested
1d1a0 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 (%lu), outside
1d1b0 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c of valid range",
1d1c0 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 slotID);....ret
1d1d0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f urn(CKR_GENERAL_
1d1e0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 ERROR);..}...if
1d1f0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c (cackey_slots[sl
1d200 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 otID].active ==
1d210 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 0) {...CACKEY_DE
1d220 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
1d230 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 r. Invalid slot
1d240 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c requested (%lu),
1d250 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e slot not curren
1d260 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f tly active", slo
1d270 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f tID);....cackey_
1d280 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 mutex_unlock(cac
1d290 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 key_biglock);...
1d2a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 .return(CKR_GENE
1d2b0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a RAL_ERROR);..}..
1d2c0 09 6c 6f 67 69 6e 5f 72 65 74 20 3d 20 63 61 63 .login_ret = cac
1d2d0 6b 65 79 5f 6c 6f 67 69 6e 28 26 63 61 63 6b 65 key_login(&cacke
1d2e0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c y_slots[slotID],
1d2f0 20 70 50 69 6e 2c 20 75 6c 50 69 6e 4c 65 6e 2c pPin, ulPinLen,
1d300 20 26 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e &tries_remainin
1d310 67 29 3b 0a 09 69 66 20 28 6c 6f 67 69 6e 5f 72 g);..if (login_r
1d320 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 et != CACKEY_PCS
1d330 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 63 61 63 6b C_S_OK) {...cack
1d340 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 ey_mutex_unlock(
1d350 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
1d360 0a 0a 09 09 69 66 20 28 6c 6f 67 69 6e 5f 72 65 ....if (login_re
1d370 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 t == CACKEY_PCSC
1d380 5f 45 5f 4c 4f 43 4b 45 44 29 20 7b 0a 09 09 09 _E_LOCKED) {....
1d390 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1d3a0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 54 6f 6b NTF("Error. Tok
1d3b0 65 6e 20 69 73 20 6c 6f 63 6b 65 64 2e 22 29 3b en is locked.");
1d3c0 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 .....cackey_slot
1d3d0 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f s[slotID].token_
1d3e0 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 55 53 45 flags |= CKF_USE
1d3f0 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 3b 0a 0a 09 R_PIN_LOCKED;...
1d400 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e ..return(CKR_PIN
1d410 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d 20 65 6c _LOCKED);...} el
1d420 73 65 20 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74 se if (login_ret
1d430 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f == CACKEY_PCSC_
1d440 45 5f 42 41 44 50 49 4e 29 20 7b 0a 09 09 09 43 E_BADPIN) {....C
1d450 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1d460 54 46 28 22 45 72 72 6f 72 2e 20 20 49 6e 76 61 TF("Error. Inva
1d470 6c 69 64 20 50 49 4e 2e 22 29 3b 0a 0a 09 09 09 lid PIN.");.....
1d480 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f cackey_slots[slo
1d490 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 tID].token_flags
1d4a0 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e |= CKF_USER_PIN
1d4b0 5f 43 4f 55 4e 54 5f 4c 4f 57 3b 0a 0a 09 09 09 _COUNT_LOW;.....
1d4c0 69 66 20 28 74 72 69 65 73 5f 72 65 6d 61 69 6e if (tries_remain
1d4d0 69 6e 67 20 3d 3d 20 31 29 20 7b 0a 09 09 09 09 ing == 1) {.....
1d4e0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f cackey_slots[slo
1d4f0 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 tID].token_flags
1d500 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e |= CKF_USER_PIN
1d510 5f 46 49 4e 41 4c 5f 54 52 59 3b 0a 09 09 09 7d _FINAL_TRY;....}
1d520 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f .....return(CKR_
1d530 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a PIN_INCORRECT);.
1d540 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 ..}....CACKEY_DE
1d550 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
1d560 72 2e 20 20 55 6e 6b 6e 6f 77 6e 20 65 72 72 6f r. Unknown erro
1d570 72 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 r returned from
1d580 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 29 20 28 cackey_login() (
1d590 25 69 29 22 2c 20 6c 6f 67 69 6e 5f 72 65 74 29 %i)", login_ret)
1d5a0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
1d5b0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a GENERAL_ERROR);.
1d5c0 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 6c 6f 74 .}...cackey_slot
1d5d0 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f s[slotID].token_
1d5e0 66 6c 61 67 73 20 26 3d 20 7e 28 43 4b 46 5f 55 flags &= ~(CKF_U
1d5f0 53 45 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 20 7c SER_PIN_LOCKED |
1d600 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 43 4f CKF_USER_PIN_CO
1d610 55 4e 54 5f 4c 4f 57 20 7c 20 43 4b 46 5f 4c 4f UNT_LOW | CKF_LO
1d620 47 49 4e 5f 52 45 51 55 49 52 45 44 20 7c 20 43 GIN_REQUIRED | C
1d630 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 46 49 4e 41 KF_USER_PIN_FINA
1d640 4c 5f 54 52 59 29 3b 0a 0a 09 63 61 63 6b 65 79 L_TRY);...cackey
1d650 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
1d660 6f 6e 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f on].state = CKS_
1d670 52 4f 5f 55 53 45 52 5f 46 55 4e 43 54 49 4f 4e RO_USER_FUNCTION
1d680 53 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 S;...mutex_retva
1d690 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 l = cackey_mutex
1d6a0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 _unlock(cackey_b
1d6b0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 iglock);..if (mu
1d6c0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 tex_retval != 0)
1d6d0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
1d6e0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
1d6f0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c Unlocking fail
1d700 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
1d710 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 (CKR_GENERAL_ERR
1d720 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 OR);..}...CACKEY
1d730 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
1d740 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 eturning CKR_OK
1d750 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a (%i)", CKR_OK);.
1d760 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 ..return(CKR_OK)
1d770 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 ;.}..CK_DEFINE_F
1d780 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 UNCTION(CK_RV, C
1d790 5f 4c 6f 67 6f 75 74 29 28 43 4b 5f 53 45 53 53 _Logout)(CK_SESS
1d7a0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 ION_HANDLE hSess
1d7b0 69 6f 6e 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f ion) {..CK_SLOT_
1d7c0 49 44 20 73 6c 6f 74 49 44 3b 0a 09 69 6e 74 20 ID slotID;..int
1d7d0 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 mutex_retval;...
1d7e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1d7f0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a NTF("Called.");.
1d800 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e ..if (!cackey_in
1d810 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 itialized) {...C
1d820 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1d830 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 TF("Error. Not
1d840 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a initialized.");.
1d850 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 ...return(CKR_CR
1d860 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 YPTOKI_NOT_INITI
1d870 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 ALIZED);..}...if
1d880 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 (hSession == 0
1d890 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 || hSession >= (
1d8a0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 sizeof(cackey_se
1d8b0 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 ssions) / sizeof
1d8c0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 (cackey_sessions
1d8d0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 [0]))) {...CACKE
1d8e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1d8f0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 Error. Session
1d900 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b out of range.");
1d910 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 ......return(CKR
1d920 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f _SESSION_HANDLE_
1d930 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d INVALID);..}...m
1d940 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 utex_retval = ca
1d950 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 ckey_mutex_lock(
1d960 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
1d970 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 ..if (mutex_retv
1d980 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 al != 0) {...CAC
1d990 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1d9a0 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e ("Error. Lockin
1d9b0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 g failed.");....
1d9c0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 return(CKR_GENER
1d9d0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 AL_ERROR);..}...
1d9e0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 if (!cackey_sess
1d9f0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 ions[hSession].a
1da00 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 ctive) {...cacke
1da10 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
1da20 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
1da30 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1da40 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
1da50 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 Session not acti
1da60 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 ve.");......retu
1da70 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 rn(CKR_SESSION_H
1da80 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a ANDLE_INVALID);.
1da90 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 .}...slotID = ca
1daa0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
1dab0 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a ession].slotID;.
1dac0 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 ..if (slotID < 0
1dad0 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 || slotID >= (s
1dae0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f izeof(cackey_slo
1daf0 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 ts) / sizeof(cac
1db00 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 key_slots[0])))
1db10 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
1db20 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
1db30 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 Invalid slot req
1db40 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 uested (%lu), ou
1db50 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 tside of valid r
1db60 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a ange", slotID);.
1db70 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 ...return(CKR_GE
1db80 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d NERAL_ERROR);..}
1db90 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c ...if (cackey_sl
1dba0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 ots[slotID].acti
1dbb0 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 ve == 0) {...CAC
1dbc0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1dbd0 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 ("Error. Invalid
1dbe0 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 slot requested
1dbf0 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 (%lu), slot not
1dc00 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 currently active
1dc10 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 ", slotID);....c
1dc20 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f ackey_mutex_unlo
1dc30 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
1dc40 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b k);....return(CK
1dc50 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 R_GENERAL_ERROR)
1dc60 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 ;..}...cackey_se
1dc70 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
1dc80 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f .state = CKS_RO_
1dc90 50 55 42 4c 49 43 5f 53 45 53 53 49 4f 4e 3b 0a PUBLIC_SESSION;.
1dca0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c .cackey_slots[sl
1dcb0 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 otID].token_flag
1dcc0 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 s = CKF_LOGIN_RE
1dcd0 51 55 49 52 45 44 3b 0a 0a 09 6d 75 74 65 78 5f QUIRED;...mutex_
1dce0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f retval = cackey_
1dcf0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 mutex_unlock(cac
1dd00 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 key_biglock);..i
1dd10 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 f (mutex_retval
1dd20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 != 0) {...CACKEY
1dd30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
1dd40 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 rror. Unlocking
1dd50 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 failed.");....r
1dd60 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 eturn(CKR_GENERA
1dd70 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 L_ERROR);..}...C
1dd80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1dd90 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b TF("Returning CK
1dda0 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f R_OK (%i)", CKR_
1ddb0 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b OK);...return(CK
1ddc0 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 R_OK);.}..CK_DEF
1ddd0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f INE_FUNCTION(CK_
1dde0 52 56 2c 20 43 5f 43 72 65 61 74 65 4f 62 6a 65 RV, C_CreateObje
1ddf0 63 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 ct)(CK_SESSION_H
1de00 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 ANDLE hSession,
1de10 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 CK_ATTRIBUTE_PTR
1de20 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 pTemplate, CK_U
1de30 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b LONG ulCount, CK
1de40 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 _OBJECT_HANDLE_P
1de50 54 52 20 70 68 4f 62 6a 65 63 74 29 20 7b 0a 09 TR phObject) {..
1de60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1de70 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a NTF("Called.");.
1de80 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e ..if (!cackey_in
1de90 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 itialized) {...C
1dea0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1deb0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 TF("Error. Not
1dec0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a initialized.");.
1ded0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 ...return(CKR_CR
1dee0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 YPTOKI_NOT_INITI
1def0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 ALIZED);..}...CA
1df00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
1df10 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 F("Returning CKR
1df20 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
1df30 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 PPORTED (%i)", C
1df40 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
1df50 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 SUPPORTED);...re
1df60 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f turn(CKR_FUNCTIO
1df70 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 N_NOT_SUPPORTED)
1df80 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 ;.}..CK_DEFINE_F
1df90 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 UNCTION(CK_RV, C
1dfa0 5f 43 6f 70 79 4f 62 6a 65 63 74 29 28 43 4b 5f _CopyObject)(CK_
1dfb0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 SESSION_HANDLE h
1dfc0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 Session, CK_OBJE
1dfd0 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 CT_HANDLE hObjec
1dfe0 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f t, CK_ATTRIBUTE_
1dff0 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 PTR pTemplate, C
1e000 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c K_ULONG ulCount,
1e010 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c CK_OBJECT_HANDL
1e020 45 5f 50 54 52 20 70 68 4e 65 77 4f 62 6a 65 63 E_PTR phNewObjec
1e030 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 t) {..CACKEY_DEB
1e040 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 UG_PRINTF("Calle
1e050 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 d.");...if (!cac
1e060 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 key_initialized)
1e070 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
1e080 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
1e090 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 Not initialize
1e0a0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 d.");....return(
1e0b0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 CKR_CRYPTOKI_NOT
1e0c0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 _INITIALIZED);..
1e0d0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 }...CACKEY_DEBUG
1e0e0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
1e0f0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f ng CKR_FUNCTION_
1e100 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 NOT_SUPPORTED (%
1e110 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f i)", CKR_FUNCTIO
1e120 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 N_NOT_SUPPORTED)
1e130 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 ;...return(CKR_F
1e140 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
1e150 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 ORTED);.}..CK_DE
1e160 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b FINE_FUNCTION(CK
1e170 5f 52 56 2c 20 43 5f 44 65 73 74 72 6f 79 4f 62 _RV, C_DestroyOb
1e180 6a 65 63 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e ject)(CK_SESSION
1e190 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e _HANDLE hSession
1e1a0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 , CK_OBJECT_HAND
1e1b0 4c 45 20 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43 LE hObject) {..C
1e1c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1e1d0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
1e1e0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 .if (!cackey_ini
1e1f0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 tialized) {...CA
1e200 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
1e210 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 F("Error. Not i
1e220 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a nitialized.");..
1e230 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 ..return(CKR_CRY
1e240 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 PTOKI_NOT_INITIA
1e250 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 LIZED);..}...CAC
1e260 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1e270 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f ("Returning CKR_
1e280 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
1e290 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b PORTED (%i)", CK
1e2a0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
1e2b0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 UPPORTED);...ret
1e2c0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e urn(CKR_FUNCTION
1e2d0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
1e2e0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 .}..CK_DEFINE_FU
1e2f0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f NCTION(CK_RV, C_
1e300 47 65 74 4f 62 6a 65 63 74 53 69 7a 65 29 28 43 GetObjectSize)(C
1e310 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 K_SESSION_HANDLE
1e320 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 hSession, CK_OB
1e330 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a JECT_HANDLE hObj
1e340 65 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 ect, CK_ULONG_PT
1e350 52 20 70 75 6c 53 69 7a 65 29 20 7b 0a 09 43 41 R pulSize) {..CA
1e360 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
1e370 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
1e380 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 if (!cackey_init
1e390 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 ialized) {...CAC
1e3a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1e3b0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e ("Error. Not in
1e3c0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 itialized.");...
1e3d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 .return(CKR_CRYP
1e3e0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c TOKI_NOT_INITIAL
1e3f0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b IZED);..}...CACK
1e400 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1e410 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 "Returning CKR_F
1e420 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
1e430 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 ORTED (%i)", CKR
1e440 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
1e450 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 PPORTED);...retu
1e460 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f rn(CKR_FUNCTION_
1e470 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
1e480 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e }..CK_DEFINE_FUN
1e490 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 CTION(CK_RV, C_G
1e4a0 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 etAttributeValue
1e4b0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e )(CK_SESSION_HAN
1e4c0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b DLE hSession, CK
1e4d0 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 _OBJECT_HANDLE h
1e4e0 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 Object, CK_ATTRI
1e4f0 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 BUTE_PTR pTempla
1e500 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 te, CK_ULONG ulC
1e510 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 41 54 54 52 ount) {..CK_ATTR
1e520 49 42 55 54 45 20 2a 63 75 72 72 5f 61 74 74 72 IBUTE *curr_attr
1e530 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 ;..struct cackey
1e540 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 _identity *ident
1e550 69 74 79 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c ity;..unsigned l
1e560 6f 6e 67 20 69 64 65 6e 74 69 74 79 5f 69 64 78 ong identity_idx
1e570 2c 20 61 74 74 72 5f 69 64 78 2c 20 73 65 73 73 , attr_idx, sess
1e580 5f 61 74 74 72 5f 69 64 78 2c 20 6e 75 6d 5f 69 _attr_idx, num_i
1e590 64 73 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 ds;..int mutex_r
1e5a0 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 72 65 etval;..CK_RV re
1e5b0 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 tval = CKR_OK;..
1e5c0 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 56 61 6c CK_VOID_PTR pVal
1e5d0 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c ue;..CK_ULONG ul
1e5e0 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 43 41 43 4b ValueLen;...CACK
1e5f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
1e600 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 "Called.");...if
1e610 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 (!cackey_initia
1e620 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 lized) {...CACKE
1e630 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
1e640 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 Error. Not init
1e650 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 ialized.");....r
1e660 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f eturn(CKR_CRYPTO
1e670 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a KI_NOT_INITIALIZ
1e680 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 ED);..}...if (hS
1e690 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 ession == 0 || h
1e6a0 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 Session >= (size
1e6b0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f of(cackey_sessio
1e6c0 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 ns) / sizeof(cac
1e6d0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 key_sessions[0])
1e6e0 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 )) {...CACKEY_DE
1e6f0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
1e700 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 r. Session out
1e710 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a of range.");....
1e720 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 ..return(CKR_SES
1e730 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 SION_HANDLE_INVA
1e740 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 LID);..}...if (h
1e750 4f 62 6a 65 63 74 20 3d 3d 20 30 29 20 7b 0a 09 Object == 0) {..
1e760 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1e770 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4f 62 INTF("Error. Ob
1e780 6a 65 63 74 20 68 61 6e 64 6c 65 20 6f 75 74 20 ject handle out
1e790 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a of range.");....
1e7a0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a ..return(CKR_OBJ
1e7b0 45 43 54 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c ECT_HANDLE_INVAL
1e7c0 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c ID);..}...if (ul
1e7d0 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 Count == 0) {...
1e7e0 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69 74 /* Short circuit
1e7f0 2c 20 69 66 20 7a 65 72 6f 20 6f 62 6a 65 63 74 , if zero object
1e800 73 20 77 65 72 65 20 73 70 65 63 69 66 69 65 64 s were specified
1e810 20 72 65 74 75 72 6e 20 7a 65 72 6f 20 69 74 65 return zero ite
1e820 6d 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a ms immediately *
1e830 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 /...CACKEY_DEBUG
1e840 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 _PRINTF("Returni
1e850 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 ng CKR_OK (%i) (
1e860 73 68 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c short circuit)",
1e870 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 CKR_OK);....ret
1e880 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a urn(CKR_OK);..}.
1e890 0a 09 69 66 20 28 70 54 65 6d 70 6c 61 74 65 20 ..if (pTemplate
1e8a0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 == NULL) {...CAC
1e8b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1e8c0 28 22 45 72 72 6f 72 2e 20 20 70 54 65 6d 70 6c ("Error. pTempl
1e8d0 61 74 65 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a ate 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 64 65 6e 74 69 74 79 5f 69 64 78 20 ...identity_idx
1e910 3d 20 68 4f 62 6a 65 63 74 20 2d 20 31 3b 0a 0a = hObject - 1;..
1e920 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 .mutex_retval =
1e930 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 cackey_mutex_loc
1e940 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
1e950 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 );..if (mutex_re
1e960 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 tval != 0) {...C
1e970 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1e980 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b TF("Error. Lock
1e990 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a ing failed.");..
1e9a0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e ..return(CKR_GEN
1e9b0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a ERAL_ERROR);..}.
1e9c0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 ..if (!cackey_se
1e9d0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
1e9e0 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 .active) {...cac
1e9f0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b key_mutex_unlock
1ea00 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 (cackey_biglock)
1ea10 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 ;....CACKEY_DEBU
1ea20 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
1ea30 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 Session not ac
1ea40 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 tive.");......re
1ea50 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e turn(CKR_SESSION
1ea60 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 _HANDLE_INVALID)
1ea70 3b 0a 09 7d 0a 0a 09 6e 75 6d 5f 69 64 73 20 3d ;..}...num_ids =
1ea80 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 cackey_sessions
1ea90 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 [hSession].ident
1eaa0 69 74 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69 ities_count;...i
1eab0 66 20 28 69 64 65 6e 74 69 74 79 5f 69 64 78 20 f (identity_idx
1eac0 3e 3d 20 6e 75 6d 5f 69 64 73 29 20 7b 0a 09 09 >= num_ids) {...
1ead0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c cackey_mutex_unl
1eae0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
1eaf0 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 ck);....CACKEY_D
1eb00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
1eb10 6f 72 2e 20 20 4f 62 6a 65 63 74 20 68 61 6e 64 or. Object hand
1eb20 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e le out of range.
1eb30 20 20 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3d identity_idx =
1eb40 20 25 6c 75 2c 20 6e 75 6d 5f 69 64 73 20 3d 20 %lu, num_ids =
1eb50 25 6c 75 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 %lu.", (unsigned
1eb60 20 6c 6f 6e 67 29 20 69 64 65 6e 74 69 74 79 5f long) identity_
1eb70 69 64 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c idx, (unsigned l
1eb80 6f 6e 67 29 20 6e 75 6d 5f 69 64 73 29 3b 0a 0a ong) num_ids);..
1eb90 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a ..return(CKR_OBJ
1eba0 45 43 54 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c ECT_HANDLE_INVAL
1ebb0 49 44 29 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74 69 ID);..}...identi
1ebc0 74 79 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 ty = &cackey_ses
1ebd0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
1ebe0 69 64 65 6e 74 69 74 69 65 73 5b 69 64 65 6e 74 identities[ident
1ebf0 69 74 79 5f 69 64 78 5d 3b 0a 0a 09 66 6f 72 20 ity_idx];...for
1ec00 28 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 61 (attr_idx = 0; a
1ec10 74 74 72 5f 69 64 78 20 3c 20 75 6c 43 6f 75 6e ttr_idx < ulCoun
1ec20 74 3b 20 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b t; attr_idx++) {
1ec30 0a 09 09 63 75 72 72 5f 61 74 74 72 20 3d 20 26 ...curr_attr = &
1ec40 70 54 65 6d 70 6c 61 74 65 5b 61 74 74 72 5f 69 pTemplate[attr_i
1ec50 64 78 5d 3b 0a 0a 09 09 70 56 61 6c 75 65 20 3d dx];....pValue =
1ec60 20 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65 NULL;...ulValue
1ec70 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 Len = (CK_LONG)
1ec80 2d 31 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 -1;....CACKEY_DE
1ec90 42 55 47 5f 50 52 49 4e 54 46 28 22 4c 6f 6f 6b BUG_PRINTF("Look
1eca0 69 6e 67 20 66 6f 72 20 61 74 74 72 69 62 75 74 ing for attribut
1ecb0 65 20 30 78 25 30 38 6c 78 20 28 69 64 65 6e 74 e 0x%08lx (ident
1ecc0 69 74 79 3a 25 6c 75 29 20 2e 2e 2e 22 2c 20 28 ity:%lu) ...", (
1ecd0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 unsigned long) c
1ece0 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 2c 20 urr_attr->type,
1ecf0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
1ed00 69 64 65 6e 74 69 74 79 5f 69 64 78 29 3b 0a 0a identity_idx);..
1ed10 09 09 66 6f 72 20 28 73 65 73 73 5f 61 74 74 72 ..for (sess_attr
1ed20 5f 69 64 78 20 3d 20 30 3b 20 73 65 73 73 5f 61 _idx = 0; sess_a
1ed30 74 74 72 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 ttr_idx < identi
1ed40 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5f 63 ty->attributes_c
1ed50 6f 75 6e 74 3b 20 73 65 73 73 5f 61 74 74 72 5f ount; sess_attr_
1ed60 69 64 78 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28 idx++) {....if (
1ed70 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 identity->attrib
1ed80 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 utes[sess_attr_i
1ed90 64 78 5d 2e 74 79 70 65 20 3d 3d 20 63 75 72 72 dx].type == curr
1eda0 5f 61 74 74 72 2d 3e 74 79 70 65 29 20 7b 0a 09 _attr->type) {..
1edb0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1edc0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 66 6f 75 PRINTF(" ... fou
1edd0 6e 64 20 69 74 2c 20 70 56 61 6c 75 65 20 3d 20 nd it, pValue =
1ede0 25 70 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 20 3d %p, ulValueLen =
1edf0 20 25 6c 75 22 2c 20 69 64 65 6e 74 69 74 79 2d %lu", identity-
1ee00 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 >attributes[sess
1ee10 5f 61 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 _attr_idx].pValu
1ee20 65 2c 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 e, identity->att
1ee30 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 ributes[sess_att
1ee40 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 r_idx].ulValueLe
1ee50 6e 29 3b 0a 09 09 09 09 0a 09 09 09 09 70 56 61 n);..........pVa
1ee60 6c 75 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e lue = identity->
1ee70 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f attributes[sess_
1ee80 61 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 attr_idx].pValue
1ee90 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e ;.....ulValueLen
1eea0 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 = identity->att
1eeb0 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 ributes[sess_att
1eec0 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 r_idx].ulValueLe
1eed0 6e 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 n;....}...}....i
1eee0 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 f (curr_attr->pV
1eef0 61 6c 75 65 20 26 26 20 70 56 61 6c 75 65 29 20 alue && pValue)
1ef00 7b 0a 09 09 09 69 66 20 28 63 75 72 72 5f 61 74 {....if (curr_at
1ef10 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3e tr->ulValueLen >
1ef20 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a = ulValueLen) {.
1ef30 09 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f ....memcpy(curr_
1ef40 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20 70 56 attr->pValue, pV
1ef50 61 6c 75 65 2c 20 75 6c 56 61 6c 75 65 4c 65 6e alue, ulValueLen
1ef60 29 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 );....} else {..
1ef70 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 ...ulValueLen =
1ef80 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 (CK_LONG) -1;...
1ef90 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f ...retval = CKR_
1efa0 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c BUFFER_TOO_SMALL
1efb0 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 75 ;....}...}....cu
1efc0 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 rr_attr->ulValue
1efd0 4c 65 6e 20 3d 20 75 6c 56 61 6c 75 65 4c 65 6e Len = ulValueLen
1efe0 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 ;..}...mutex_ret
1eff0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 val = cackey_mut
1f000 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 ex_unlock(cackey
1f010 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 _biglock);..if (
1f020 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 mutex_retval !=
1f030 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 0) {...CACKEY_DE
1f040 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
1f050 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 r. Unlocking fa
1f060 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 iled.");....retu
1f070 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 rn(CKR_GENERAL_E
1f080 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 RROR);..}...if (
1f090 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 41 54 retval == CKR_AT
1f0a0 54 52 49 42 55 54 45 5f 54 59 50 45 5f 49 4e 56 TRIBUTE_TYPE_INV
1f0b0 41 4c 49 44 29 20 7b 0a 09 09 43 41 43 4b 45 59 ALID) {...CACKEY
1f0c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
1f0d0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 41 54 54 eturning CKR_ATT
1f0e0 52 49 42 55 54 45 5f 54 59 50 45 5f 49 4e 56 41 RIBUTE_TYPE_INVA
1f0f0 4c 49 44 20 28 25 69 29 22 2c 20 28 69 6e 74 29 LID (%i)", (int)
1f100 20 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 retval);..} els
1f110 65 20 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 e if (retval ==
1f120 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 CKR_BUFFER_TOO_S
1f130 4d 41 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 MALL) {...CACKEY
1f140 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
1f150 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 42 55 46 eturning CKR_BUF
1f160 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28 25 FER_TOO_SMALL (%
1f170 69 29 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 i)", (int) retva
1f180 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 l);..} else if (
1f190 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 4f 4b retval == CKR_OK
1f1a0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
1f1b0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
1f1c0 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 ning CKR_OK (%i)
1f1d0 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 ", (int) retval)
1f1e0 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 ;..} else {...CA
1f1f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
1f200 46 28 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22 F("Returning %i"
1f210 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b , (int) retval);
1f220 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 ..}...return(ret
1f230 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 val);.}..CK_DEFI
1f240 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 NE_FUNCTION(CK_R
1f250 56 2c 20 43 5f 53 65 74 41 74 74 72 69 62 75 74 V, C_SetAttribut
1f260 65 56 61 6c 75 65 29 28 43 4b 5f 53 45 53 53 49 eValue)(CK_SESSI
1f270 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 ON_HANDLE hSessi
1f280 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 on, CK_OBJECT_HA
1f290 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b NDLE hObject, CK
1f2a0 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 _ATTRIBUTE_PTR p
1f2b0 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f Template, CK_ULO
1f2c0 4e 47 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 NG ulCount) {..C
1f2d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
1f2e0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
1f2f0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 .if (!cackey_ini
1f300 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 tialized) {...CA
1f310 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
1f320 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 F("Error. Not i
1f330 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a nitialized.");..
1f340 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 ..return(CKR_CRY
1f350 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 PTOKI_NOT_INITIA
1f360 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 LIZED);..}...CAC
1f370 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1f380 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f ("Returning CKR_
1f390 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
1f3a0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b PORTED (%i)", CK
1f3b0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
1f3c0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 UPPORTED);...ret
1f3d0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e urn(CKR_FUNCTION
1f3e0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
1f3f0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 .}..CK_DEFINE_FU
1f400 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f NCTION(CK_RV, C_
1f410 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 29 FindObjectsInit)
1f420 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 (CK_SESSION_HAND
1f430 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f LE hSession, CK_
1f440 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 ATTRIBUTE_PTR pT
1f450 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e emplate, CK_ULON
1f460 47 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 4b G ulCount) {..CK
1f470 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b _SLOT_ID slotID;
1f480 0a 09 43 4b 5f 55 4c 4f 4e 47 20 69 64 78 3b 0a ..CK_ULONG idx;.
1f490 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 .int mutex_retva
1f4a0 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 l;...CACKEY_DEBU
1f4b0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 G_PRINTF("Called
1f4c0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b .");...if (!cack
1f4d0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 ey_initialized)
1f4e0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
1f4f0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
1f500 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 Not initialized
1f510 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
1f520 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f KR_CRYPTOKI_NOT_
1f530 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d INITIALIZED);..}
1f540 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 ...if (hSession
1f550 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e == 0 || hSession
1f560 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b >= (sizeof(cack
1f570 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 ey_sessions) / s
1f580 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 izeof(cackey_ses
1f590 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 sions[0]))) {...
1f5a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
1f5b0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 NTF("Error. Ses
1f5c0 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 sion out of rang
1f5d0 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 e.");......retur
1f5e0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 n(CKR_SESSION_HA
1f5f0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 NDLE_INVALID);..
1f600 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c }...mutex_retval
1f610 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f = cackey_mutex_
1f620 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
1f630 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 ock);..if (mutex
1f640 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a _retval != 0) {.
1f650 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
1f660 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c RINTF("Error. L
1f670 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 ocking failed.")
1f680 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
1f690 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a GENERAL_ERROR);.
1f6a0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 .}...if (!cackey
1f6b0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
1f6c0 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 on].active) {...
1f6d0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c cackey_mutex_unl
1f6e0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
1f6f0 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 ck);....CACKEY_D
1f700 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
1f710 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 or. Session not
1f720 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 active.");.....
1f730 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 .return(CKR_SESS
1f740 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c ION_HANDLE_INVAL
1f750 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 ID);..}...if (ca
1f760 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
1f770 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 ession].search_a
1f780 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 ctive) {...cacke
1f790 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
1f7a0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
1f7b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
1f7c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
1f7d0 53 65 61 72 63 68 20 61 6c 72 65 61 64 79 20 61 Search already a
1f7e0 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 ctive.");......r
1f7f0 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 eturn(CKR_OPERAT
1f800 49 4f 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a ION_ACTIVE);..}.
1f810 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 ..slotID = cacke
1f820 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
1f830 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 ion].slotID;...i
1f840 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c f (slotID < 0 ||
1f850 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 slotID >= (size
1f860 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 of(cackey_slots)
1f870 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 / sizeof(cackey
1f880 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 _slots[0]))) {..
1f890 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
1f8a0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 INTF("Error. Inv
1f8b0 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 alid slot reques
1f8c0 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 ted (%lu), outsi
1f8d0 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 de of valid rang
1f8e0 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 e", slotID);....
1f8f0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 return(CKR_GENER
1f900 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 AL_ERROR);..}...
1f910 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 if (cackey_slots
1f920 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 [slotID].active
1f930 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 == 0) {...CACKEY
1f940 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
1f950 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c rror. Invalid sl
1f960 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c ot requested (%l
1f970 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 u), slot not cur
1f980 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 rently active",
1f990 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b slotID);....cack
1f9a0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 ey_mutex_unlock(
1f9b0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
1f9c0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 ....return(CKR_G
1f9d0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 ENERAL_ERROR);..
1f9e0 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 }...if (cackey_s
1f9f0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c 6f lots[slotID].slo
1fa00 74 5f 72 65 73 65 74 29 20 7b 0a 09 09 43 41 43 t_reset) {...CAC
1fa10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
1fa20 28 22 54 68 65 20 73 6c 6f 74 20 68 61 73 20 62 ("The slot has b
1fa30 65 65 6e 20 72 65 73 65 74 20 73 69 6e 63 65 20 een reset since
1fa40 77 65 20 6c 61 73 74 20 6c 6f 6f 6b 65 64 20 66 we last looked f
1fa50 6f 72 20 69 64 65 6e 74 69 74 69 65 73 20 2d 2d or identities --
1fa60 20 72 65 73 63 61 6e 6e 69 6e 67 22 29 3b 0a 0a rescanning");..
1fa70 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 ..if (cackey_ses
1fa80 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
1fa90 69 64 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 identities != NU
1faa0 4c 4c 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f LL) {....cackey_
1fab0 66 72 65 65 5f 69 64 65 6e 74 69 74 69 65 73 28 free_identities(
1fac0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
1fad0 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 hSession].identi
1fae0 74 69 65 73 2c 20 63 61 63 6b 65 79 5f 73 65 73 ties, cackey_ses
1faf0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
1fb00 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 identities_count
1fb10 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 );.....cackey_se
1fb20 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
1fb30 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20 4e 55 .identities = NU
1fb40 4c 4c 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 LL;....cackey_se
1fb50 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
1fb60 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e .identities_coun
1fb70 74 20 3d 20 30 3b 0a 09 09 7d 0a 0a 09 09 69 66 t = 0;...}....if
1fb80 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 (cackey_slots[s
1fb90 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 21 3d 20 lotID].label !=
1fba0 4e 55 4c 4c 29 20 7b 0a 09 09 09 66 72 65 65 28 NULL) {....free(
1fbb0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f cackey_slots[slo
1fbc0 74 49 44 5d 2e 6c 61 62 65 6c 29 3b 0a 09 09 09 tID].label);....
1fbd0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f cackey_slots[slo
1fbe0 74 49 44 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c tID].label = NUL
1fbf0 4c 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 L;...}....cackey
1fc00 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 _mark_slot_reset
1fc10 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 (&cackey_slots[s
1fc20 6c 6f 74 49 44 5d 29 3b 0a 09 09 63 61 63 6b 65 lotID]);...cacke
1fc30 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e y_slots[slotID].
1fc40 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 30 3b 0a slot_reset = 0;.
1fc50 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f .}...if (cackey_
1fc60 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
1fc70 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 3d n].identities ==
1fc80 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 NULL) {...cacke
1fc90 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
1fca0 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 ion].identities
1fcb0 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 69 64 = cackey_read_id
1fcc0 65 6e 74 69 74 69 65 73 28 26 63 61 63 6b 65 79 entities(&cackey
1fcd0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 _slots[slotID],
1fce0 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 &cackey_sessions
1fcf0 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 [hSession].ident
1fd00 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 7d ities_count);..}
1fd10 0a 0a 09 69 66 20 28 70 54 65 6d 70 6c 61 74 65 ...if (pTemplate
1fd20 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 != NULL) {...if
1fd30 20 28 75 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20 (ulCount != 0)
1fd40 7b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 {....cackey_sess
1fd50 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 ions[hSession].s
1fd60 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e earch_query_coun
1fd70 74 20 3d 20 75 6c 43 6f 75 6e 74 3b 0a 09 09 09 t = ulCount;....
1fd80 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
1fd90 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 hSession].search
1fda0 5f 71 75 65 72 79 20 3d 20 6d 61 6c 6c 6f 63 28 _query = malloc(
1fdb0 75 6c 43 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 ulCount * sizeof
1fdc0 28 2a 70 54 65 6d 70 6c 61 74 65 29 29 3b 0a 0a (*pTemplate));..
1fdd0 09 09 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 ...memcpy(cackey
1fde0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
1fdf0 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 on].search_query
1fe00 2c 20 70 54 65 6d 70 6c 61 74 65 2c 20 75 6c 43 , pTemplate, ulC
1fe10 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70 ount * sizeof(*p
1fe20 54 65 6d 70 6c 61 74 65 29 29 3b 0a 09 09 09 66 Template));....f
1fe30 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 or (idx = 0; idx
1fe40 20 3c 20 75 6c 43 6f 75 6e 74 3b 20 69 64 78 2b < ulCount; idx+
1fe50 2b 29 20 7b 0a 09 09 09 09 69 66 20 28 70 54 65 +) {.....if (pTe
1fe60 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 75 6c 56 61 mplate[idx].ulVa
1fe70 6c 75 65 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 lueLen == 0) {..
1fe80 09 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 ....cackey_sessi
1fe90 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 ons[hSession].se
1fea0 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e arch_query[idx].
1feb0 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 0a pValue = NULL;..
1fec0 09 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 .....continue;..
1fed0 09 09 09 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79 ...}......cackey
1fee0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
1fef0 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 on].search_query
1ff00 5b 69 64 78 5d 2e 70 56 61 6c 75 65 20 3d 20 6d [idx].pValue = m
1ff10 61 6c 6c 6f 63 28 70 54 65 6d 70 6c 61 74 65 5b alloc(pTemplate[
1ff20 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 idx].ulValueLen)
1ff30 3b 0a 0a 09 09 09 09 69 66 20 28 63 61 63 6b 65 ;......if (cacke
1ff40 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
1ff50 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 ion].search_quer
1ff60 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 29 20 7b y[idx].pValue) {
1ff70 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 63 61 63 ......memcpy(cac
1ff80 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
1ff90 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 ssion].search_qu
1ffa0 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 2c ery[idx].pValue,
1ffb0 20 70 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e pTemplate[idx].
1ffc0 70 56 61 6c 75 65 2c 20 70 54 65 6d 70 6c 61 74 pValue, pTemplat
1ffd0 65 5b 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 e[idx].ulValueLe
1ffe0 6e 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 09 n);.....}....}..
1fff0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 63 61 63 .} else {....cac
20000 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
20010 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 ssion].search_qu
20020 65 72 79 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 ery_count = 0;..
20030 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e ..cackey_session
20040 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 s[hSession].sear
20050 63 68 5f 71 75 65 72 79 20 3d 20 4e 55 4c 4c 3b ch_query = NULL;
20060 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 ...}..} else {..
20070 09 69 66 20 28 75 6c 43 6f 75 6e 74 20 21 3d 20 .if (ulCount !=
20080 30 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 0) {....cackey_m
20090 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b utex_unlock(cack
200a0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 ey_biglock);....
200b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
200c0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 INTF("Error. Se
200d0 61 72 63 68 20 71 75 65 72 79 20 73 70 65 63 69 arch query speci
200e0 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 62 75 fied as NULL, bu
200f0 74 20 6e 75 6d 62 65 72 20 6f 66 20 71 75 65 72 t number of quer
20100 79 20 74 65 72 6d 73 20 6e 6f 74 20 73 70 65 63 y terms not spec
20110 69 66 69 65 64 20 61 73 20 30 2e 22 29 3b 0a 0a ified as 0.");..
20120 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 ...return(CKR_AR
20130 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09 GUMENTS_BAD);...
20140 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 }....cackey_sess
20150 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 ions[hSession].s
20160 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e earch_query_coun
20170 74 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f t = 0;...cackey_
20180 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
20190 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 20 n].search_query
201a0 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 63 61 63 = NULL;..}...cac
201b0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
201c0 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 ssion].search_ac
201d0 74 69 76 65 20 3d 20 31 3b 0a 09 63 61 63 6b 65 tive = 1;..cacke
201e0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
201f0 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 ion].search_curr
20200 5f 69 64 20 3d 20 30 3b 0a 0a 09 6d 75 74 65 78 _id = 0;...mutex
20210 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 _retval = cackey
20220 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 _mutex_unlock(ca
20230 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 ckey_biglock);..
20240 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c if (mutex_retval
20250 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 != 0) {...CACKE
20260 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
20270 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e Error. Unlockin
20280 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 g failed.");....
20290 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 return(CKR_GENER
202a0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 AL_ERROR);..}...
202b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
202c0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 NTF("Returning C
202d0 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 KR_OK (%i)", CKR
202e0 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 _OK);...return(C
202f0 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 73 74 61 74 69 KR_OK);.}..stati
20300 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 70 6b 63 c int cackey_pkc
20310 73 31 31 5f 63 6f 6d 70 61 72 65 5f 61 74 74 72 s11_compare_attr
20320 69 62 75 74 65 73 28 43 4b 5f 41 54 54 52 49 42 ibutes(CK_ATTRIB
20330 55 54 45 20 2a 61 2c 20 43 4b 5f 41 54 54 52 49 UTE *a, CK_ATTRI
20340 42 55 54 45 20 2a 62 29 20 7b 0a 09 75 6e 73 69 BUTE *b) {..unsi
20350 67 6e 65 64 20 63 68 61 72 20 2a 73 6d 61 6c 6c gned char *small
20360 62 75 66 2c 20 2a 6c 61 72 67 65 62 75 66 3b 0a buf, *largebuf;.
20370 09 73 69 7a 65 5f 74 20 73 6d 61 6c 6c 62 75 66 .size_t smallbuf
20380 5f 6c 65 6e 2c 20 6c 61 72 67 65 62 75 66 5f 6c _len, largebuf_l
20390 65 6e 3b 0a 0a 09 69 66 20 28 61 2d 3e 74 79 70 en;...if (a->typ
203a0 65 20 21 3d 20 62 2d 3e 74 79 70 65 29 20 7b 0a e != b->type) {.
203b0 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a ..return(0);..}.
203c0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
203d0 52 49 4e 54 46 28 22 20 20 20 20 2e 2e 2e 20 66 RINTF(" ... f
203e0 6f 75 6e 64 20 6d 61 74 63 68 69 6e 67 20 74 79 ound matching ty
203f0 70 65 20 2e 2e 2e 22 29 3b 0a 0a 09 43 41 43 4b pe ...");...CACK
20400 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 EY_DEBUG_PRINTBU
20410 46 28 22 20 20 20 20 2e 2e 2e 20 6f 75 72 20 76 F(" ... our v
20420 61 6c 75 65 3a 22 2c 20 61 2d 3e 70 56 61 6c 75 alue:", a->pValu
20430 65 2c 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e e, a->ulValueLen
20440 29 3b 0a 0a 09 69 66 20 28 62 2d 3e 70 56 61 6c );...if (b->pVal
20450 75 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 ue == NULL) {...
20460 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
20470 4e 54 46 28 22 20 20 20 20 20 20 20 2e 2e 2e 20 NTF(" ...
20480 66 6f 75 6e 64 20 77 69 6c 64 63 61 72 64 20 6d found wildcard m
20490 61 74 63 68 22 29 3b 0a 0a 09 09 72 65 74 75 72 atch");....retur
204a0 6e 28 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 61 n(1);..}...if (a
204b0 2d 3e 70 56 61 6c 75 65 20 3d 3d 20 4e 55 4c 4c ->pValue == NULL
204c0 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 30 29 3b ) {...return(0);
204d0 0a 09 7d 0a 0a 20 09 69 66 20 28 62 2d 3e 75 6c ..}.. .if (b->ul
204e0 56 61 6c 75 65 4c 65 6e 20 3d 3d 20 61 2d 3e 75 ValueLen == a->u
204f0 6c 56 61 6c 75 65 4c 65 6e 20 26 26 20 6d 65 6d lValueLen && mem
20500 63 6d 70 28 61 2d 3e 70 56 61 6c 75 65 2c 20 62 cmp(a->pValue, b
20510 2d 3e 70 56 61 6c 75 65 2c 20 62 2d 3e 75 6c 56 ->pValue, b->ulV
20520 61 6c 75 65 4c 65 6e 29 20 3d 3d 20 30 29 20 7b alueLen) == 0) {
20530 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
20540 50 52 49 4e 54 46 28 22 20 20 20 20 20 20 20 2e PRINTF(" .
20550 2e 2e 20 66 6f 75 6e 64 20 65 78 61 63 74 20 6d .. found exact m
20560 61 74 63 68 22 29 3b 0a 0a 09 09 72 65 74 75 72 atch");....retur
20570 6e 28 31 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 n(1);..}...switc
20580 68 20 28 61 2d 3e 74 79 70 65 29 20 7b 0a 09 09 h (a->type) {...
20590 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 case CKA_MODULUS
205a0 3a 0a 09 09 09 69 66 20 28 61 2d 3e 75 6c 56 61 :....if (a->ulVa
205b0 6c 75 65 4c 65 6e 20 3d 3d 20 62 2d 3e 75 6c 56 lueLen == b->ulV
205c0 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09 09 09 62 alueLen) {.....b
205d0 72 65 61 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 reak;....}.....i
205e0 66 20 28 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e f (a->ulValueLen
205f0 20 3e 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e > b->ulValueLen
20600 29 20 7b 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66 ) {.....smallbuf
20610 20 3d 20 62 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 = b->pValue;...
20620 09 09 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 20 3d ..smallbuf_len =
20630 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a b->ulValueLen;.
20640 0a 09 09 09 09 6c 61 72 67 65 62 75 66 20 3d 20 .....largebuf =
20650 61 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09 6c a->pValue;.....l
20660 61 72 67 65 62 75 66 5f 6c 65 6e 20 3d 20 61 2d argebuf_len = a-
20670 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09 >ulValueLen;....
20680 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 73 6d 61 } else {.....sma
20690 6c 6c 62 75 66 20 3d 20 61 2d 3e 70 56 61 6c 75 llbuf = a->pValu
206a0 65 3b 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66 5f e;.....smallbuf_
206b0 6c 65 6e 20 3d 20 61 2d 3e 75 6c 56 61 6c 75 65 len = a->ulValue
206c0 4c 65 6e 3b 0a 0a 09 09 09 09 6c 61 72 67 65 62 Len;......largeb
206d0 75 66 20 3d 20 62 2d 3e 70 56 61 6c 75 65 3b 0a uf = b->pValue;.
206e0 09 09 09 09 6c 61 72 67 65 62 75 66 5f 6c 65 6e ....largebuf_len
206f0 20 3d 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e = b->ulValueLen
20700 3b 0a 09 09 09 7d 0a 0a 09 09 09 66 6f 72 20 28 ;....}.....for (
20710 3b 20 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20 21 ; largebuf_len !
20720 3d 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 3b 20 = smallbuf_len;
20730 6c 61 72 67 65 62 75 66 2b 2b 2c 6c 61 72 67 65 largebuf++,large
20740 62 75 66 5f 6c 65 6e 2d 2d 29 20 7b 0a 09 09 09 buf_len--) {....
20750 09 69 66 20 28 6c 61 72 67 65 62 75 66 5b 30 5d .if (largebuf[0]
20760 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 09 62 72 != 0) {......br
20770 65 61 6b 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a eak;.....}....}.
20780 0a 09 09 09 69 66 20 28 6c 61 72 67 65 62 75 66 ....if (largebuf
20790 5f 6c 65 6e 20 21 3d 20 73 6d 61 6c 6c 62 75 66 _len != smallbuf
207a0 5f 6c 65 6e 29 20 7b 0a 09 09 09 09 62 72 65 61 _len) {.....brea
207b0 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 k;....}.....if (
207c0 6d 65 6d 63 6d 70 28 6c 61 72 67 65 62 75 66 2c memcmp(largebuf,
207d0 20 73 6d 61 6c 6c 62 75 66 2c 20 73 6d 61 6c 6c smallbuf, small
207e0 62 75 66 5f 6c 65 6e 29 20 3d 3d 20 30 29 20 7b buf_len) == 0) {
207f0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
20800 47 5f 50 52 49 4e 54 46 28 22 20 20 20 20 20 20 G_PRINTF("
20810 20 2e 2e 2e 20 66 6f 75 6e 64 20 61 70 70 72 6f ... found appro
20820 78 69 6d 61 74 65 20 6d 61 74 63 68 22 29 3b 0a ximate match");.
20830 0a 09 09 09 09 72 65 74 75 72 6e 28 31 29 3b 0a .....return(1);.
20840 09 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a ...}.....break;.
20850 09 7d 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a .}...return(0);.
20860 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e }..CK_DEFINE_FUN
20870 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 CTION(CK_RV, C_F
20880 69 6e 64 4f 62 6a 65 63 74 73 29 28 43 4b 5f 53 indObjects)(CK_S
20890 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 ESSION_HANDLE hS
208a0 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 ession, CK_OBJEC
208b0 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4f T_HANDLE_PTR phO
208c0 62 6a 65 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 bject, CK_ULONG
208d0 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 ulMaxObjectCount
208e0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 , CK_ULONG_PTR p
208f0 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 29 20 7b ulObjectCount) {
20900 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f ..struct cackey_
20910 69 64 65 6e 74 69 74 79 20 2a 63 75 72 72 5f 69 identity *curr_i
20920 64 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 d;..CK_ATTRIBUTE
20930 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09 43 4b *curr_attr;..CK
20940 5f 55 4c 4f 4e 47 20 63 75 72 72 5f 69 64 5f 69 _ULONG curr_id_i
20950 64 78 2c 20 63 75 72 72 5f 6f 75 74 5f 69 64 5f dx, curr_out_id_
20960 69 64 78 2c 20 63 75 72 72 5f 61 74 74 72 5f 69 idx, curr_attr_i
20970 64 78 2c 20 73 65 73 73 5f 61 74 74 72 5f 69 64 dx, sess_attr_id
20980 78 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 6d 61 74 x;..CK_ULONG mat
20990 63 68 65 64 5f 63 6f 75 6e 74 2c 20 70 72 65 76 ched_count, prev
209a0 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 3b 0a _matched_count;.
209b0 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 .int mutex_retva
209c0 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 l;...CACKEY_DEBU
209d0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 G_PRINTF("Called
209e0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b .");...if (!cack
209f0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 ey_initialized)
20a00 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
20a10 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
20a20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 Not initialized
20a30 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
20a40 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f KR_CRYPTOKI_NOT_
20a50 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d INITIALIZED);..}
20a60 0a 0a 09 69 66 20 28 70 75 6c 4f 62 6a 65 63 74 ...if (pulObject
20a70 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b Count == NULL) {
20a80 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
20a90 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
20aa0 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 69 pulObjectCount i
20ab0 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 s NULL.");....re
20ac0 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e turn(CKR_ARGUMEN
20ad0 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 TS_BAD);..}...if
20ae0 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55 (phObject == NU
20af0 4c 4c 20 26 26 20 75 6c 4d 61 78 4f 62 6a 65 63 LL && ulMaxObjec
20b00 74 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 tCount == 0) {..
20b10 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69 ./* Short circui
20b20 74 2c 20 69 66 20 7a 65 72 6f 20 6f 62 6a 65 63 t, if zero objec
20b30 74 73 20 77 65 72 65 20 73 70 65 63 69 66 69 65 ts were specifie
20b40 64 20 72 65 74 75 72 6e 20 7a 65 72 6f 20 69 74 d return zero it
20b50 65 6d 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 ems immediately
20b60 2a 2f 0a 09 09 2a 70 75 6c 4f 62 6a 65 63 74 43 */...*pulObjectC
20b70 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 43 41 43 ount = 0;....CAC
20b80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
20b90 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f ("Returning CKR_
20ba0 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20 63 OK (%i) (short c
20bb0 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b ircuit)", CKR_OK
20bc0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
20bd0 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 _OK);..}...if (p
20be0 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c 29 hObject == NULL)
20bf0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 {...CACKEY_DEBU
20c00 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
20c10 20 20 70 68 4f 62 6a 65 63 74 20 69 73 20 4e 55 phObject is NU
20c20 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e LL.");....return
20c30 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 (CKR_ARGUMENTS_B
20c40 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c AD);..}...if (ul
20c50 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d MaxObjectCount =
20c60 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f = 0) {...CACKEY_
20c70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
20c80 72 6f 72 2e 20 20 4d 61 78 69 6d 75 6d 20 6e 75 ror. Maximum nu
20c90 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 mber of objects
20ca0 73 70 65 63 69 66 69 65 64 20 61 73 20 7a 65 72 specified as zer
20cb0 6f 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 o.");....return(
20cc0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 CKR_ARGUMENTS_BA
20cd0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 D);..}...if (hSe
20ce0 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 ssion == 0 || hS
20cf0 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f ession >= (sizeo
20d00 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e f(cackey_session
20d10 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b s) / sizeof(cack
20d20 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 ey_sessions[0]))
20d30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
20d40 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
20d50 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f . Session out o
20d60 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 f range.");.....
20d70 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 .return(CKR_SESS
20d80 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c ION_HANDLE_INVAL
20d90 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f ID);..}...mutex_
20da0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f retval = cackey_
20db0 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 mutex_lock(cacke
20dc0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 y_biglock);..if
20dd0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d (mutex_retval !=
20de0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 0) {...CACKEY_D
20df0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
20e00 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 or. Locking fai
20e10 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 led.");....retur
20e20 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 n(CKR_GENERAL_ER
20e30 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 ROR);..}...if (!
20e40 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
20e50 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 hSession].active
20e60 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 ) {...cackey_mut
20e70 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 ex_unlock(cackey
20e80 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 _biglock);....CA
20e90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
20ea0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 F("Error. Sessi
20eb0 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 on not active.")
20ec0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b ;......return(CK
20ed0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 R_SESSION_HANDLE
20ee0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 _INVALID);..}...
20ef0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 if (!cackey_sess
20f00 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 ions[hSession].s
20f10 65 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b 0a earch_active) {.
20f20 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 ..cackey_mutex_u
20f30 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 nlock(cackey_big
20f40 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 lock);....CACKEY
20f50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
20f60 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 6e 6f rror. Search no
20f70 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a t active.");....
20f80 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 ..return(CKR_OPE
20f90 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 RATION_NOT_INITI
20fa0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 63 75 ALIZED);..}...cu
20fb0 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 20 3d 20 rr_out_id_idx =
20fc0 30 3b 0a 09 66 6f 72 20 28 63 75 72 72 5f 69 64 0;..for (curr_id
20fd0 5f 69 64 78 20 3d 20 63 61 63 6b 65 79 5f 73 65 _idx = cackey_se
20fe0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
20ff0 2e 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64 3b .search_curr_id;
21000 20 63 75 72 72 5f 69 64 5f 69 64 78 20 3c 20 63 curr_id_idx < c
21010 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
21020 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 Session].identit
21030 69 65 73 5f 63 6f 75 6e 74 20 26 26 20 75 6c 4d ies_count && ulM
21040 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 3b 20 63 axObjectCount; c
21050 75 72 72 5f 69 64 5f 69 64 78 2b 2b 29 20 7b 0a urr_id_idx++) {.
21060 09 09 63 75 72 72 5f 69 64 20 3d 20 26 63 61 63 ..curr_id = &cac
21070 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
21080 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 ssion].identitie
21090 73 5b 63 75 72 72 5f 69 64 5f 69 64 78 5d 3b 0a s[curr_id_idx];.
210a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
210b0 50 52 49 4e 54 46 28 22 50 72 6f 63 65 73 73 69 PRINTF("Processi
210c0 6e 67 20 69 64 65 6e 74 69 74 79 3a 25 6c 75 22 ng identity:%lu"
210d0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
210e0 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a ) curr_id_idx);.
210f0 0a 09 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 ...matched_count
21100 20 3d 20 30 3b 0a 0a 09 09 66 6f 72 20 28 63 75 = 0;....for (cu
21110 72 72 5f 61 74 74 72 5f 69 64 78 20 3d 20 30 3b rr_attr_idx = 0;
21120 20 63 75 72 72 5f 61 74 74 72 5f 69 64 78 20 3c curr_attr_idx <
21130 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 cackey_sessions
21140 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 [hSession].searc
21150 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b 20 63 h_query_count; c
21160 75 72 72 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 urr_attr_idx++)
21170 7b 0a 09 09 09 70 72 65 76 5f 6d 61 74 63 68 65 {....prev_matche
21180 64 5f 63 6f 75 6e 74 20 3d 20 6d 61 74 63 68 65 d_count = matche
21190 64 5f 63 6f 75 6e 74 3b 0a 0a 09 09 09 63 75 72 d_count;.....cur
211a0 72 5f 61 74 74 72 20 3d 20 26 63 61 63 6b 65 79 r_attr = &cackey
211b0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
211c0 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 on].search_query
211d0 5b 63 75 72 72 5f 61 74 74 72 5f 69 64 78 5d 3b [curr_attr_idx];
211e0 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 .....CACKEY_DEBU
211f0 47 5f 50 52 49 4e 54 46 28 22 20 20 43 68 65 63 G_PRINTF(" Chec
21200 6b 69 6e 67 20 66 6f 72 20 61 74 74 72 69 62 75 king for attribu
21210 74 65 20 30 78 25 30 38 6c 78 20 69 6e 20 69 64 te 0x%08lx in id
21220 65 6e 74 69 74 79 3a 25 69 2e 2e 2e 22 2c 20 28 entity:%i...", (
21230 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 unsigned long) c
21240 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 2c 20 urr_attr->type,
21250 28 69 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64 (int) curr_id_id
21260 78 29 3b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 x);....CACKEY_DE
21270 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 20 20 BUG_PRINTBUF("
21280 20 20 56 61 6c 75 65 20 6c 6f 6f 6b 69 6e 67 20 Value looking
21290 66 6f 72 3a 22 2c 20 63 75 72 72 5f 61 74 74 72 for:", curr_attr
212a0 2d 3e 70 56 61 6c 75 65 2c 20 63 75 72 72 5f 61 ->pValue, curr_a
212b0 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 ttr->ulValueLen)
212c0 3b 0a 0a 09 09 09 66 6f 72 20 28 73 65 73 73 5f ;.....for (sess_
212d0 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 73 65 attr_idx = 0; se
212e0 73 73 5f 61 74 74 72 5f 69 64 78 20 3c 20 63 75 ss_attr_idx < cu
212f0 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65 rr_id->attribute
21300 73 5f 63 6f 75 6e 74 3b 20 73 65 73 73 5f 61 74 s_count; sess_at
21310 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 tr_idx++) {.....
21320 69 66 20 28 63 61 63 6b 65 79 5f 70 6b 63 73 31 if (cackey_pkcs1
21330 31 5f 63 6f 6d 70 61 72 65 5f 61 74 74 72 69 62 1_compare_attrib
21340 75 74 65 73 28 26 63 75 72 72 5f 69 64 2d 3e 61 utes(&curr_id->a
21350 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 ttributes[sess_a
21360 74 74 72 5f 69 64 78 5d 2c 20 63 75 72 72 5f 61 ttr_idx], curr_a
21370 74 74 72 29 29 20 7b 0a 09 09 09 09 09 6d 61 74 ttr)) {......mat
21380 63 68 65 64 5f 63 6f 75 6e 74 2b 2b 3b 0a 0a 09 ched_count++;...
21390 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d ....break;.....}
213a0 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 49 66 20 ....}...../* If
213b0 74 68 65 20 61 74 74 72 69 62 75 74 65 20 63 6f the attribute co
213c0 75 6c 64 20 6e 6f 74 20 62 65 20 6d 61 74 63 68 uld not be match
213d0 65 64 2c 20 64 6f 20 6e 6f 74 20 74 72 79 20 74 ed, do not try t
213e0 6f 20 6d 61 74 63 68 20 61 64 64 69 74 69 6f 6e o match addition
213f0 61 6c 20 61 74 74 72 69 62 75 74 65 73 20 2a 2f al attributes */
21400 0a 09 09 09 69 66 20 28 70 72 65 76 5f 6d 61 74 ....if (prev_mat
21410 63 68 65 64 5f 63 6f 75 6e 74 20 3d 3d 20 6d 61 ched_count == ma
21420 74 63 68 65 64 5f 63 6f 75 6e 74 29 20 7b 0a 09 tched_count) {..
21430 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09 ...break;....}..
21440 09 7d 0a 0a 09 09 69 66 20 28 6d 61 74 63 68 65 .}....if (matche
21450 64 5f 63 6f 75 6e 74 20 3d 3d 20 63 61 63 6b 65 d_count == cacke
21460 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
21470 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 ion].search_quer
21480 79 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41 y_count) {....CA
21490 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
214a0 46 28 22 20 20 2e 2e 2e 20 41 6c 6c 20 25 69 20 F(" ... All %i
214b0 61 74 74 72 69 62 75 74 65 73 20 63 68 65 63 6b attributes check
214c0 65 64 20 66 6f 72 20 66 6f 75 6e 64 2c 20 61 64 ed for found, ad
214d0 64 69 6e 67 20 69 64 65 6e 74 69 74 79 3a 25 69 ding identity:%i
214e0 20 74 6f 20 72 65 74 75 72 6e 65 64 20 6c 69 73 to returned lis
214f0 74 22 2c 20 28 69 6e 74 29 20 63 61 63 6b 65 79 t", (int) cackey
21500 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
21510 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 on].search_query
21520 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63 75 _count, (int) cu
21530 72 72 5f 69 64 5f 69 64 78 29 3b 0a 0a 09 09 09 rr_id_idx);.....
21540 70 68 4f 62 6a 65 63 74 5b 63 75 72 72 5f 6f 75 phObject[curr_ou
21550 74 5f 69 64 5f 69 64 78 5d 20 3d 20 63 75 72 72 t_id_idx] = curr
21560 5f 69 64 5f 69 64 78 20 2b 20 31 3b 0a 0a 09 09 _id_idx + 1;....
21570 09 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e .ulMaxObjectCoun
21580 74 2d 2d 3b 0a 0a 09 09 09 63 75 72 72 5f 6f 75 t--;.....curr_ou
21590 74 5f 69 64 5f 69 64 78 2b 2b 3b 0a 09 09 7d 20 t_id_idx++;...}
215a0 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 else {....CACKEY
215b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 _DEBUG_PRINTF("
215c0 20 2e 2e 2e 20 4e 6f 74 20 61 6c 6c 20 25 69 20 ... Not all %i
215d0 28 6f 6e 6c 79 20 66 6f 75 6e 64 20 25 69 29 20 (only found %i)
215e0 61 74 74 72 69 62 75 74 65 73 20 63 68 65 63 6b attributes check
215f0 65 64 20 66 6f 72 20 66 6f 75 6e 64 2c 20 6e 6f ed for found, no
21600 74 20 61 64 64 69 6e 67 20 69 64 65 6e 74 69 74 t adding identit
21610 79 3a 25 69 22 2c 20 28 69 6e 74 29 20 63 61 63 y:%i", (int) cac
21620 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
21630 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 ssion].search_qu
21640 65 72 79 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29 ery_count, (int)
21650 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2c 20 matched_count,
21660 28 69 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64 (int) curr_id_id
21670 78 29 3b 0a 09 09 7d 0a 09 7d 0a 09 63 61 63 6b x);...}..}..cack
21680 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
21690 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72 sion].search_cur
216a0 72 5f 69 64 20 3d 20 63 75 72 72 5f 69 64 5f 69 r_id = curr_id_i
216b0 64 78 3b 0a 09 2a 70 75 6c 4f 62 6a 65 63 74 43 dx;..*pulObjectC
216c0 6f 75 6e 74 20 3d 20 63 75 72 72 5f 6f 75 74 5f ount = curr_out_
216d0 69 64 5f 69 64 78 3b 0a 0a 09 6d 75 74 65 78 5f id_idx;...mutex_
216e0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f retval = cackey_
216f0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 mutex_unlock(cac
21700 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 key_biglock);..i
21710 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 f (mutex_retval
21720 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 != 0) {...CACKEY
21730 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
21740 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 rror. Unlocking
21750 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 failed.");....r
21760 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 eturn(CKR_GENERA
21770 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 L_ERROR);..}...C
21780 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
21790 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b TF("Returning CK
217a0 52 5f 4f 4b 20 28 25 69 29 2c 20 6e 75 6d 20 6f R_OK (%i), num o
217b0 62 6a 65 63 74 73 20 3d 20 25 6c 75 22 2c 20 43 bjects = %lu", C
217c0 4b 52 5f 4f 4b 2c 20 2a 70 75 6c 4f 62 6a 65 63 KR_OK, *pulObjec
217d0 74 43 6f 75 6e 74 29 3b 0a 0a 09 72 65 74 75 72 tCount);...retur
217e0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b n(CKR_OK);.}..CK
217f0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e _DEFINE_FUNCTION
21800 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62 (CK_RV, C_FindOb
21810 6a 65 63 74 73 46 69 6e 61 6c 29 28 43 4b 5f 53 jectsFinal)(CK_S
21820 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 ESSION_HANDLE hS
21830 65 73 73 69 6f 6e 29 20 7b 0a 09 43 4b 5f 55 4c ession) {..CK_UL
21840 4f 4e 47 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 ONG idx;..int mu
21850 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 tex_retval;...CA
21860 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
21870 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
21880 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 if (!cackey_init
21890 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 ialized) {...CAC
218a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
218b0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e ("Error. Not in
218c0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 itialized.");...
218d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 .return(CKR_CRYP
218e0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c TOKI_NOT_INITIAL
218f0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 IZED);..}...if (
21900 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c hSession == 0 ||
21910 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 hSession >= (si
21920 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 zeof(cackey_sess
21930 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 ions) / sizeof(c
21940 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 ackey_sessions[0
21950 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f ]))) {...CACKEY_
21960 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
21970 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 ror. Session ou
21980 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 t of range.");..
21990 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 ....return(CKR_S
219a0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e ESSION_HANDLE_IN
219b0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 VALID);..}...mut
219c0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b ex_retval = cack
219d0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 ey_mutex_lock(ca
219e0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 ckey_biglock);..
219f0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c if (mutex_retval
21a00 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 != 0) {...CACKE
21a10 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
21a20 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 Error. Locking
21a30 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 failed.");....re
21a40 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c turn(CKR_GENERAL
21a50 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 _ERROR);..}...if
21a60 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f (!cackey_sessio
21a70 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 ns[hSession].act
21a80 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f ive) {...cackey_
21a90 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 mutex_unlock(cac
21aa0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 key_biglock);...
21ab0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
21ac0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 INTF("Error. Se
21ad0 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 ssion not active
21ae0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e .");......return
21af0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e (CKR_SESSION_HAN
21b00 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d DLE_INVALID);..}
21b10 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 ...if (!cackey_s
21b20 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
21b30 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 29 ].search_active)
21b40 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 {...cackey_mute
21b50 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
21b60 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 biglock);....CAC
21b70 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
21b80 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 ("Error. Search
21b90 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a not active.");.
21ba0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f .....return(CKR_
21bb0 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e OPERATION_NOT_IN
21bc0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
21bd0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 .cackey_sessions
21be0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 [hSession].searc
21bf0 68 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 h_active = 0;...
21c00 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 for (idx = 0; id
21c10 78 20 3c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 x < cackey_sessi
21c20 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 ons[hSession].se
21c30 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 arch_query_count
21c40 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 ; idx++) {...if
21c50 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 (cackey_sessions
21c60 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 [hSession].searc
21c70 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 h_query[idx].pVa
21c80 6c 75 65 29 20 7b 0a 09 09 09 66 72 65 65 28 63 lue) {....free(c
21c90 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
21ca0 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f Session].search_
21cb0 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 query[idx].pValu
21cc0 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 e);...}..}...if
21cd0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 (cackey_sessions
21ce0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 [hSession].searc
21cf0 68 5f 71 75 65 72 79 29 20 7b 0a 09 09 66 72 65 h_query) {...fre
21d00 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e e(cackey_session
21d10 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 s[hSession].sear
21d20 63 68 5f 71 75 65 72 79 29 3b 0a 09 7d 0a 0a 09 ch_query);..}...
21d30 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 mutex_retval = c
21d40 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f ackey_mutex_unlo
21d50 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
21d60 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 k);..if (mutex_r
21d70 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 etval != 0) {...
21d80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
21d90 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c NTF("Error. Unl
21da0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 ocking failed.")
21db0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
21dc0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a GENERAL_ERROR);.
21dd0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 .}...CACKEY_DEBU
21de0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
21df0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 ing CKR_OK (%i)"
21e00 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 , CKR_OK);...ret
21e10 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a urn(CKR_OK);.}..
21e20 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 CK_DEFINE_FUNCTI
21e30 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 ON(CK_RV, C_Encr
21e40 79 70 74 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 yptInit)(CK_SESS
21e50 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 ION_HANDLE hSess
21e60 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 ion, CK_MECHANIS
21e70 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d M_PTR pMechanism
21e80 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 , CK_OBJECT_HAND
21e90 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b LE hKey) {..CACK
21ea0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
21eb0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 "Called.");...if
21ec0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 (!cackey_initia
21ed0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 lized) {...CACKE
21ee0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
21ef0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 Error. Not init
21f00 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 ialized.");....r
21f10 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f eturn(CKR_CRYPTO
21f20 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a KI_NOT_INITIALIZ
21f30 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 ED);..}...CACKEY
21f40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 _DEBUG_PRINTF("R
21f50 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e eturning CKR_FUN
21f60 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
21f70 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 TED (%i)", CKR_F
21f80 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
21f90 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e ORTED);...return
21fa0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f (CKR_FUNCTION_NO
21fb0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a T_SUPPORTED);.}.
21fc0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 .CK_DEFINE_FUNCT
21fd0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 ION(CK_RV, C_Enc
21fe0 72 79 70 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e rypt)(CK_SESSION
21ff0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e _HANDLE hSession
22000 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 , CK_BYTE_PTR pD
22010 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c ata, CK_ULONG ul
22020 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 DataLen, CK_BYTE
22030 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 44 _PTR pEncryptedD
22040 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 ata, CK_ULONG_PT
22050 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64 44 61 R pulEncryptedDa
22060 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 taLen) {..CACKEY
22070 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 _DEBUG_PRINTF("C
22080 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 alled.");...if (
22090 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 !cackey_initiali
220a0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f zed) {...CACKEY_
220b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
220c0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 ror. Not initia
220d0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 lized.");....ret
220e0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 urn(CKR_CRYPTOKI
220f0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 _NOT_INITIALIZED
22100 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 );..}...CACKEY_D
22110 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
22120 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 urning CKR_FUNCT
22130 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
22140 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e D (%i)", CKR_FUN
22150 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
22160 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 TED);...return(C
22170 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
22180 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 SUPPORTED);.}..C
22190 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f K_DEFINE_FUNCTIO
221a0 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 N(CK_RV, C_Encry
221b0 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 ptUpdate)(CK_SES
221c0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 SION_HANDLE hSes
221d0 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 sion, CK_BYTE_PT
221e0 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e R pPart, CK_ULON
221f0 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f G ulPartLen, CK_
22200 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 BYTE_PTR pEncryp
22210 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e tedPart, CK_ULON
22220 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74 G_PTR pulEncrypt
22230 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 edPartLen) {..CA
22240 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
22250 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
22260 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 if (!cackey_init
22270 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 ialized) {...CAC
22280 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
22290 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e ("Error. Not in
222a0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 itialized.");...
222b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 .return(CKR_CRYP
222c0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c TOKI_NOT_INITIAL
222d0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b IZED);..}...CACK
222e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
222f0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 "Returning CKR_F
22300 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
22310 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 ORTED (%i)", CKR
22320 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
22330 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 PPORTED);...retu
22340 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f rn(CKR_FUNCTION_
22350 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
22360 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e }..CK_DEFINE_FUN
22370 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 CTION(CK_RV, C_E
22380 6e 63 72 79 70 74 46 69 6e 61 6c 29 28 43 4b 5f ncryptFinal)(CK_
22390 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 SESSION_HANDLE h
223a0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 Session, CK_BYTE
223b0 5f 50 54 52 20 70 4c 61 73 74 45 6e 63 72 79 70 _PTR pLastEncryp
223c0 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e tedPart, CK_ULON
223d0 47 5f 50 54 52 20 70 75 6c 4c 61 73 74 45 6e 63 G_PTR pulLastEnc
223e0 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b ryptedPartLen) {
223f0 0a 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 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
22410 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f ;...if (!cackey_
22420 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 initialized) {..
22430 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
22440 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f INTF("Error. No
22450 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 t initialized.")
22460 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
22470 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 CRYPTOKI_NOT_INI
22480 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 TIALIZED);..}...
22490 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
224a0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 NTF("Returning C
224b0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
224c0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c SUPPORTED (%i)",
224d0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f CKR_FUNCTION_NO
224e0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 T_SUPPORTED);...
224f0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 return(CKR_FUNCT
22500 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
22510 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 D);.}..CK_DEFINE
22520 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c _FUNCTION(CK_RV,
22530 20 43 5f 44 65 63 72 79 70 74 49 6e 69 74 29 28 C_DecryptInit)(
22540 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c CK_SESSION_HANDL
22550 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d E hSession, CK_M
22560 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 ECHANISM_PTR pMe
22570 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 chanism, CK_OBJE
22580 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 CT_HANDLE hKey)
22590 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 {..int mutex_ret
225a0 76 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a val;...hKey--;..
225b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
225c0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
225d0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 ...if (!cackey_i
225e0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 nitialized) {...
225f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
22600 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 NTF("Error. Not
22610 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b initialized.");
22620 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 ....return(CKR_C
22630 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 RYPTOKI_NOT_INIT
22640 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 IALIZED);..}...i
22650 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 20 3d 3d f (pMechanism ==
22660 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 NULL) {...CACKE
22670 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
22680 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 Error. pMechanis
22690 6d 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 m is NULL.");...
226a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 .return(CKR_ARGU
226b0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a MENTS_BAD);..}..
226c0 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 2d .if (pMechanism-
226d0 3e 6d 65 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b >mechanism != CK
226e0 4d 5f 52 53 41 5f 50 4b 43 53 29 20 7b 0a 09 09 M_RSA_PKCS) {...
226f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
22700 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 NTF("Error. pMec
22710 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 hanism->mechanis
22720 6d 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20 m not specified
22730 61 73 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 22 as CKM_RSA_PKCS"
22740 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
22750 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 41 52 41 4d _MECHANISM_PARAM
22760 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 _INVALID);..}...
22770 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 if (hSession ==
22780 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 0 || hSession >=
22790 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f (sizeof(cackey_
227a0 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 sessions) / size
227b0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f of(cackey_sessio
227c0 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 ns[0]))) {...CAC
227d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
227e0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f ("Error. Sessio
227f0 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 n out of range."
22800 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 );......return(C
22810 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c KR_SESSION_HANDL
22820 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a E_INVALID);..}..
22830 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 .mutex_retval =
22840 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 cackey_mutex_loc
22850 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
22860 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 );..if (mutex_re
22870 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 tval != 0) {...C
22880 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
22890 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b TF("Error. Lock
228a0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a ing failed.");..
228b0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e ..return(CKR_GEN
228c0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a ERAL_ERROR);..}.
228d0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 ..if (!cackey_se
228e0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
228f0 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 .active) {...cac
22900 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b key_mutex_unlock
22910 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 (cackey_biglock)
22920 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 ;....CACKEY_DEBU
22930 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e G_PRINTF("Error.
22940 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 Session not ac
22950 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 tive.");......re
22960 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e turn(CKR_SESSION
22970 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 _HANDLE_INVALID)
22980 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 ;..}...if (cacke
22990 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
229a0 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 ion].decrypt_act
229b0 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f ive) {...cackey_
229c0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 mutex_unlock(cac
229d0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 key_biglock);...
229e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
229f0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 INTF("Error. De
22a00 63 72 79 70 74 20 61 6c 72 65 61 64 79 20 69 6e crypt already in
22a10 20 70 72 6f 67 72 65 73 73 2e 22 29 3b 0a 09 09 progress.");...
22a20 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 ...return(CKR_OP
22a30 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 45 29 3b ERATION_ACTIVE);
22a40 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65 79 20 3e ..}...if (hKey >
22a50 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e = cackey_session
22a60 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e s[hSession].iden
22a70 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b 0a tities_count) {.
22a80 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 ..cackey_mutex_u
22a90 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 nlock(cackey_big
22aa0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 lock);....CACKEY
22ab0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
22ac0 72 72 6f 72 2e 20 20 4b 65 79 20 68 61 6e 64 6c rror. Key handl
22ad0 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 28 e out of range (
22ae0 72 65 71 75 65 73 74 65 64 20 6b 65 79 20 25 6c requested key %l
22af0 75 2c 20 6f 6e 6c 79 20 25 6c 75 20 69 64 65 6e u, only %lu iden
22b00 74 69 74 69 65 73 20 61 76 61 69 6c 61 62 6c 65 tities available
22b10 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c ).", (unsigned l
22b20 6f 6e 67 29 20 68 4b 65 79 2c 20 28 75 6e 73 69 ong) hKey, (unsi
22b30 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63 6b 65 gned long) cacke
22b40 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
22b50 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f ion].identities_
22b60 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72 count);....retur
22b70 6e 28 43 4b 52 5f 4b 45 59 5f 48 41 4e 44 4c 45 n(CKR_KEY_HANDLE
22b80 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 _INVALID);..}...
22b90 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
22ba0 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 hSession].decryp
22bb0 74 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a 09 t_active = 1;...
22bc0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
22bd0 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 hSession].decryp
22be0 74 5f 6d 65 63 68 61 6e 69 73 6d 20 3d 20 70 4d t_mechanism = pM
22bf0 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e echanism->mechan
22c00 69 73 6d 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 ism;..cackey_ses
22c10 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
22c20 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61 72 decrypt_mech_par
22c30 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e m = pMechanism->
22c40 70 50 61 72 61 6d 65 74 65 72 3b 0a 09 63 61 63 pParameter;..cac
22c50 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
22c60 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d ssion].decrypt_m
22c70 65 63 68 5f 70 61 72 6d 6c 65 6e 20 3d 20 70 4d ech_parmlen = pM
22c80 65 63 68 61 6e 69 73 6d 2d 3e 75 6c 50 61 72 61 echanism->ulPara
22c90 6d 65 74 65 72 4c 65 6e 3b 0a 09 63 61 63 6b 65 meterLen;..cacke
22ca0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
22cb0 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64 65 ion].decrypt_ide
22cc0 6e 74 69 74 79 20 3d 20 26 63 61 63 6b 65 79 5f ntity = &cackey_
22cd0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
22ce0 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 68 4b n].identities[hK
22cf0 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 ey];...mutex_ret
22d00 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 val = cackey_mut
22d10 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 ex_unlock(cackey
22d20 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 _biglock);..if (
22d30 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 mutex_retval !=
22d40 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 0) {...CACKEY_DE
22d50 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
22d60 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 r. Unlocking fa
22d70 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 iled.");....retu
22d80 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 rn(CKR_GENERAL_E
22d90 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b RROR);..}...CACK
22da0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
22db0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f "Returning CKR_O
22dc0 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 K (%i)", CKR_OK)
22dd0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f ;...return(CKR_O
22de0 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 K);.}..CK_DEFINE
22df0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c _FUNCTION(CK_RV,
22e00 20 43 5f 44 65 63 72 79 70 74 29 28 43 4b 5f 53 C_Decrypt)(CK_S
22e10 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 ESSION_HANDLE hS
22e20 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f ession, CK_BYTE_
22e30 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 44 61 PTR pEncryptedDa
22e40 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 ta, CK_ULONG ulE
22e50 6e 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e 2c ncryptedDataLen,
22e60 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 CK_BYTE_PTR pDa
22e70 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 ta, CK_ULONG_PTR
22e80 20 70 75 6c 44 61 74 61 4c 65 6e 29 20 7b 0a 09 pulDataLen) {..
22e90 43 4b 5f 55 4c 4f 4e 47 20 64 61 74 61 6c 65 6e CK_ULONG datalen
22ea0 5f 75 70 64 61 74 65 2c 20 64 61 74 61 6c 65 6e _update, datalen
22eb0 5f 66 69 6e 61 6c 3b 0a 09 43 4b 5f 52 56 20 64 _final;..CK_RV d
22ec0 65 63 72 79 70 74 5f 72 65 74 3b 0a 09 69 6e 74 ecrypt_ret;..int
22ed0 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a mutex_retval;..
22ee0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
22ef0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
22f00 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 ...if (!cackey_i
22f10 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 nitialized) {...
22f20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
22f30 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 NTF("Error. Not
22f40 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b initialized.");
22f50 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 ....return(CKR_C
22f60 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 RYPTOKI_NOT_INIT
22f70 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 IALIZED);..}...i
22f80 66 20 28 70 75 6c 44 61 74 61 4c 65 6e 20 3d 3d f (pulDataLen ==
22f90 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 NULL) {...CACKE
22fa0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
22fb0 45 72 72 6f 72 2e 20 70 75 6c 44 61 74 61 4c 65 Error. pulDataLe
22fc0 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 n is NULL.");...
22fd0 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 .return(CKR_ARGU
22fe0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a MENTS_BAD);..}..
22ff0 09 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 20 .datalen_update
23000 3d 20 2a 70 75 6c 44 61 74 61 4c 65 6e 3b 0a 0a = *pulDataLen;..
23010 09 64 65 63 72 79 70 74 5f 72 65 74 20 3d 20 43 .decrypt_ret = C
23020 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 28 68 _DecryptUpdate(h
23030 53 65 73 73 69 6f 6e 2c 20 70 45 6e 63 72 79 70 Session, pEncryp
23040 74 65 64 44 61 74 61 2c 20 75 6c 45 6e 63 72 79 tedData, ulEncry
23050 70 74 65 64 44 61 74 61 4c 65 6e 2c 20 70 44 61 ptedDataLen, pDa
23060 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f 75 70 64 ta, &datalen_upd
23070 61 74 65 29 3b 0a 09 69 66 20 28 64 65 63 72 79 ate);..if (decry
23080 70 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b pt_ret != CKR_OK
23090 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
230a0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
230b0 2e 20 20 44 65 63 72 79 70 74 55 70 64 61 74 65 . DecryptUpdate
230c0 28 29 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c () returned fail
230d0 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 ure (rv = %lu)."
230e0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
230f0 29 20 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a ) decrypt_ret);.
23100 0a 09 09 69 66 20 28 64 65 63 72 79 70 74 5f 72 ...if (decrypt_r
23110 65 74 20 21 3d 20 43 4b 52 5f 42 55 46 46 45 52 et != CKR_BUFFER
23120 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 _TOO_SMALL) {...
23130 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20 64 65 ./* Terminate de
23140 63 72 79 70 74 69 6f 6e 20 6f 70 65 72 61 74 69 cryption operati
23150 6f 6e 20 2a 2f 0a 0a 09 09 09 6d 75 74 65 78 5f on */.....mutex_
23160 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f retval = cackey_
23170 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 mutex_lock(cacke
23180 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 y_biglock);....i
23190 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 f (mutex_retval
231a0 21 3d 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b != 0) {.....CACK
231b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
231c0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 "Error. Locking
231d0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 failed.");.....
231e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 .return(CKR_GENE
231f0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d RAL_ERROR);....}
23200 0a 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 .....if (!cackey
23210 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
23220 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 on].active) {...
23230 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 ..cackey_mutex_u
23240 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 nlock(cackey_big
23250 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b lock);......CACK
23260 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
23270 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e "Error. Session
23280 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a not active.");.
23290 09 09 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b .......return(CK
232a0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 R_SESSION_HANDLE
232b0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 09 09 7d 0a _INVALID);....}.
232c0 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f ....if (!cackey_
232d0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
232e0 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 n].decrypt_activ
232f0 65 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f e) {.....cackey_
23300 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 mutex_unlock(cac
23310 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 key_biglock);...
23320 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
23330 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
23340 44 65 63 72 79 70 74 20 6e 6f 74 20 61 63 74 69 Decrypt not acti
23350 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72 65 ve.");........re
23360 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 turn(CKR_OPERATI
23370 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a ON_NOT_INITIALIZ
23380 45 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 ED);....}.....ca
23390 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
233a0 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f ession].decrypt_
233b0 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 active = 0;.....
233c0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 mutex_retval = c
233d0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f ackey_mutex_unlo
233e0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
233f0 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75 74 65 78 k);....if (mutex
23400 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a _retval != 0) {.
23410 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
23420 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
23430 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 Unlocking faile
23440 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 d.");......retur
23450 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 n(CKR_GENERAL_ER
23460 52 4f 52 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a ROR);....}...}..
23470 09 09 72 65 74 75 72 6e 28 64 65 63 72 79 70 74 ..return(decrypt
23480 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 _ret);..}...if (
23490 70 44 61 74 61 29 20 7b 0a 09 09 70 44 61 74 61 pData) {...pData
234a0 20 2b 3d 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 += datalen_upda
234b0 74 65 3b 0a 09 7d 0a 09 64 61 74 61 6c 65 6e 5f te;..}..datalen_
234c0 66 69 6e 61 6c 20 3d 20 2a 70 75 6c 44 61 74 61 final = *pulData
234d0 4c 65 6e 20 2d 20 64 61 74 61 6c 65 6e 5f 75 70 Len - datalen_up
234e0 64 61 74 65 3b 0a 0a 09 64 65 63 72 79 70 74 5f date;...decrypt_
234f0 72 65 74 20 3d 20 43 5f 44 65 63 72 79 70 74 46 ret = C_DecryptF
23500 69 6e 61 6c 28 68 53 65 73 73 69 6f 6e 2c 20 70 inal(hSession, p
23510 44 61 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f 66 Data, &datalen_f
23520 69 6e 61 6c 29 3b 0a 09 69 66 20 28 64 65 63 72 inal);..if (decr
23530 79 70 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f ypt_ret != CKR_O
23540 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 K) {...CACKEY_DE
23550 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
23560 72 2e 20 20 44 65 63 72 79 70 74 46 69 6e 61 6c r. DecryptFinal
23570 28 29 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c () returned fail
23580 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 ure (rv = %lu)."
23590 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
235a0 29 20 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a ) decrypt_ret);.
235b0 0a 09 09 72 65 74 75 72 6e 28 64 65 63 72 79 70 ...return(decryp
235c0 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 2a 70 75 t_ret);..}...*pu
235d0 6c 44 61 74 61 4c 65 6e 20 3d 20 64 61 74 61 6c lDataLen = datal
235e0 65 6e 5f 75 70 64 61 74 65 20 2b 20 64 61 74 61 en_update + data
235f0 6c 65 6e 5f 66 69 6e 61 6c 3b 0a 0a 09 43 41 43 len_final;...CAC
23600 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
23610 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f ("Returning CKR_
23620 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b OK (%i)", CKR_OK
23630 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f );...return(CKR_
23640 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e OK);.}..CK_DEFIN
23650 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 E_FUNCTION(CK_RV
23660 2c 20 43 5f 44 65 63 72 79 70 74 55 70 64 61 74 , C_DecryptUpdat
23670 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 e)(CK_SESSION_HA
23680 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 NDLE hSession, C
23690 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 K_BYTE_PTR pEncr
236a0 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c yptedPart, CK_UL
236b0 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64 50 ONG ulEncryptedP
236c0 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f artLen, CK_BYTE_
236d0 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c PTR pPart, CK_UL
236e0 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61 72 74 4c ONG_PTR pulPartL
236f0 65 6e 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b en) {..static CK
23700 5f 42 59 54 45 20 62 75 66 5b 31 36 33 38 34 5d _BYTE buf[16384]
23710 3b 0a 09 73 73 69 7a 65 5f 74 20 62 75 66 6c 65 ;..ssize_t bufle
23720 6e 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 n;..CK_SLOT_ID s
23730 6c 6f 74 49 44 3b 0a 09 43 4b 5f 52 56 20 72 65 lotID;..CK_RV re
23740 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 tval = CKR_GENER
23750 41 4c 5f 45 52 52 4f 52 3b 0a 09 69 6e 74 20 6d AL_ERROR;..int m
23760 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 utex_retval;...C
23770 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
23780 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
23790 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 .if (!cackey_ini
237a0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 tialized) {...CA
237b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
237c0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 F("Error. Not i
237d0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a nitialized.");..
237e0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 ..return(CKR_CRY
237f0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 PTOKI_NOT_INITIA
23800 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 LIZED);..}...if
23810 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c (hSession == 0 |
23820 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 | hSession >= (s
23830 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 izeof(cackey_ses
23840 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 sions) / sizeof(
23850 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
23860 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 0]))) {...CACKEY
23870 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
23880 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f rror. Session o
23890 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a ut of range.");.
238a0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f .....return(CKR_
238b0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 SESSION_HANDLE_I
238c0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 NVALID);..}...if
238d0 20 28 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 (pEncryptedPart
238e0 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 6c 45 6e == NULL && ulEn
238f0 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20 3d cryptedPartLen =
23900 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 = 0) {.../* Shor
23910 74 20 63 69 72 63 75 69 74 20 69 66 20 77 65 20 t circuit if we
23920 61 72 65 20 61 73 6b 65 64 20 74 6f 20 64 65 63 are asked to dec
23930 72 79 70 74 20 6e 6f 74 68 69 6e 67 2e 2e 2e 20 rypt nothing...
23940 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 */...CACKEY_DEBU
23950 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e G_PRINTF("Return
23960 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 ing CKR_OK (%i)
23970 28 73 68 6f 72 74 20 63 69 72 63 75 69 74 29 22 (short circuit)"
23980 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 , CKR_OK);....re
23990 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d turn(CKR_OK);..}
239a0 0a 0a 09 69 66 20 28 70 45 6e 63 72 79 70 74 65 ...if (pEncrypte
239b0 64 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b dPart == NULL) {
239c0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
239d0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 PRINTF("Error. p
239e0 45 6e 63 72 79 70 74 65 64 50 61 72 74 20 69 73 EncryptedPart is
239f0 20 4e 55 4c 4c 2c 20 62 75 74 20 75 6c 45 6e 63 NULL, but ulEnc
23a00 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20 69 73 ryptedPartLen is
23a10 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09 09 72 65 not 0.");....re
23a20 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e turn(CKR_ARGUMEN
23a30 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 TS_BAD);..}...if
23a40 20 28 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 (ulEncryptedPar
23a50 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 43 tLen == 0) {...C
23a60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
23a70 54 46 28 22 45 72 72 6f 72 2e 20 75 6c 45 6e 63 TF("Error. ulEnc
23a80 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20 69 73 ryptedPartLen is
23a90 20 30 2c 20 62 75 74 20 70 50 61 72 74 20 69 73 0, but pPart is
23aa0 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 not NULL.");...
23ab0 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 .return(CKR_ARGU
23ac0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a MENTS_BAD);..}..
23ad0 09 69 66 20 28 70 75 6c 50 61 72 74 4c 65 6e 20 .if (pulPartLen
23ae0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 == NULL) {...CAC
23af0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
23b00 28 22 45 72 72 6f 72 2e 20 70 75 6c 50 61 72 74 ("Error. pulPart
23b10 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a Len is NULL.");.
23b20 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 ...return(CKR_AR
23b30 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d GUMENTS_BAD);..}
23b40 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 ...mutex_retval
23b50 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c = cackey_mutex_l
23b60 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
23b70 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f ck);..if (mutex_
23b80 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 retval != 0) {..
23b90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
23ba0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f INTF("Error. Lo
23bb0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b cking failed.");
23bc0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 ....return(CKR_G
23bd0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 ENERAL_ERROR);..
23be0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f }...if (!cackey_
23bf0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
23c00 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 n].active) {...c
23c10 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f ackey_mutex_unlo
23c20 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 ck(cackey_bigloc
23c30 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 k);....CACKEY_DE
23c40 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
23c50 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 r. Session not
23c60 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 active.");......
23c70 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 return(CKR_SESSI
23c80 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 ON_HANDLE_INVALI
23c90 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 D);..}...if (!ca
23ca0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
23cb0 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f ession].decrypt_
23cc0 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b active) {...cack
23cd0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 ey_mutex_unlock(
23ce0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b cackey_biglock);
23cf0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
23d00 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
23d10 20 44 65 63 72 79 70 74 20 6e 6f 74 20 61 63 74 Decrypt not act
23d20 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 ive.");......ret
23d30 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f urn(CKR_OPERATIO
23d40 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 N_NOT_INITIALIZE
23d50 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 D);..}...slotID
23d60 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e = cackey_session
23d70 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 s[hSession].slot
23d80 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 ID;...if (slotID
23d90 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e < 0 || slotID >
23da0 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 = (sizeof(cackey
23db0 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 _slots) / sizeof
23dc0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d (cackey_slots[0]
23dd0 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ))) {...CACKEY_D
23de0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
23df0 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 or. Invalid slot
23e00 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 requested (%lu)
23e10 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c , outside of val
23e20 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 id range", slotI
23e30 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b D);....return(CK
23e40 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 R_GENERAL_ERROR)
23e50 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 ;..}...if (cacke
23e60 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e y_slots[slotID].
23e70 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 active == 0) {..
23e80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
23e90 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 INTF("Error. Inv
23ea0 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 alid slot reques
23eb0 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 ted (%lu), slot
23ec0 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 not currently ac
23ed0 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a tive", slotID);.
23ee0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f ...cackey_mutex_
23ef0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 unlock(cackey_bi
23f00 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 glock);....retur
23f10 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 n(CKR_GENERAL_ER
23f20 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 ROR);..}...switc
23f30 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f h (cackey_sessio
23f40 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 ns[hSession].dec
23f50 72 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d 29 20 rypt_mechanism)
23f60 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 {...case CKM_RSA
23f70 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 73 6b _PKCS:..../* Ask
23f80 20 63 61 72 64 20 74 6f 20 64 65 63 72 79 70 74 card to decrypt
23f90 20 2a 2f 0a 09 09 09 62 75 66 6c 65 6e 20 3d 20 */....buflen =
23fa0 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 cackey_signdecry
23fb0 70 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 pt(&cackey_slots
23fc0 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65 79 [slotID], cackey
23fd0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
23fe0 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64 65 6e on].decrypt_iden
23ff0 74 69 74 79 2c 20 70 45 6e 63 72 79 70 74 65 64 tity, pEncrypted
24000 50 61 72 74 2c 20 75 6c 45 6e 63 72 79 70 74 65 Part, ulEncrypte
24010 64 50 61 72 74 4c 65 6e 2c 20 62 75 66 2c 20 73 dPartLen, buf, s
24020 69 7a 65 6f 66 28 62 75 66 29 2c 20 30 2c 20 31 izeof(buf), 0, 1
24030 29 3b 0a 0a 09 09 09 69 66 20 28 62 75 66 6c 65 );.....if (bufle
24040 6e 20 3c 20 30 29 20 7b 0a 09 09 09 09 2f 2a 20 n < 0) {...../*
24050 44 65 63 72 79 70 74 69 6f 6e 20 66 61 69 6c 65 Decryption faile
24060 64 2e 20 2a 2f 0a 09 09 09 09 69 66 20 28 62 75 d. */.....if (bu
24070 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 flen == CACKEY_P
24080 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 CSC_E_NEEDLOGIN)
24090 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d {......retval =
240a0 20 43 4b 52 5f 55 53 45 52 5f 4e 4f 54 5f 4c 4f CKR_USER_NOT_LO
240b0 47 47 45 44 5f 49 4e 3b 0a 09 09 09 09 7d 20 65 GGED_IN;.....} e
240c0 6c 73 65 20 69 66 20 28 62 75 66 6c 65 6e 20 3d lse if (buflen =
240d0 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f = CACKEY_PCSC_E_
240e0 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b 0a 09 TOKENABSENT) {..
240f0 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 ....retval = CKR
24100 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 3b _DEVICE_REMOVED;
24110 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 .....} else {...
24120 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f ...retval = CKR_
24130 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 GENERAL_ERROR;..
24140 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 69 ...}....} else i
24150 66 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f f (((unsigned lo
24160 6e 67 29 20 62 75 66 6c 65 6e 29 20 3e 20 2a 70 ng) buflen) > *p
24170 75 6c 50 61 72 74 4c 65 6e 20 26 26 20 70 50 61 ulPartLen && pPa
24180 72 74 29 20 7b 0a 09 09 09 09 2f 2a 20 44 65 63 rt) {...../* Dec
24190 72 79 70 74 65 64 20 64 61 74 61 20 74 6f 6f 20 rypted data too
241a0 6c 61 72 67 65 20 2a 2f 0a 09 09 09 09 72 65 74 large */.....ret
241b0 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 val = CKR_BUFFER
241c0 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d _TOO_SMALL;....}
241d0 20 65 6c 73 65 20 7b 0a 09 09 09 09 69 66 20 28 else {.....if (
241e0 70 50 61 72 74 29 20 7b 0a 09 09 09 09 09 6d 65 pPart) {......me
241f0 6d 63 70 79 28 70 50 61 72 74 2c 20 62 75 66 2c mcpy(pPart, buf,
24200 20 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 7d 0a buflen);.....}.
24210 0a 09 09 09 09 2a 70 75 6c 50 61 72 74 4c 65 6e .....*pulPartLen
24220 20 3d 20 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09 = buflen;......
24230 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b retval = CKR_OK;
24240 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b ....}.....break;
24250 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 ..}...mutex_retv
24260 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 al = cackey_mute
24270 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
24280 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d biglock);..if (m
24290 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 utex_retval != 0
242a0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
242b0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
242c0 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 . Unlocking fai
242d0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 led.");....retur
242e0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 n(CKR_GENERAL_ER
242f0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 ROR);..}...CACKE
24300 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
24310 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 28 Returning %i", (
24320 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 int) retval);...
24330 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a return(retval);.
24340 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e }..CK_DEFINE_FUN
24350 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 CTION(CK_RV, C_D
24360 65 63 72 79 70 74 46 69 6e 61 6c 29 28 43 4b 5f ecryptFinal)(CK_
24370 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 SESSION_HANDLE h
24380 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 Session, CK_BYTE
24390 5f 50 54 52 20 70 4c 61 73 74 50 61 72 74 2c 20 _PTR pLastPart,
243a0 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c CK_ULONG_PTR pul
243b0 4c 61 73 74 50 61 72 74 4c 65 6e 29 20 7b 0a 09 LastPartLen) {..
243c0 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c int mutex_retval
243d0 3b 0a 09 69 6e 74 20 74 65 72 6d 69 6e 61 74 65 ;..int terminate
243e0 5f 64 65 63 72 79 70 74 20 3d 20 31 3b 0a 0a 09 _decrypt = 1;...
243f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
24400 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a NTF("Called.");.
24410 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e ..if (!cackey_in
24420 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 itialized) {...C
24430 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
24440 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 TF("Error. Not
24450 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a initialized.");.
24460 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 ...return(CKR_CR
24470 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 YPTOKI_NOT_INITI
24480 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 ALIZED);..}...if
24490 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 (hSession == 0
244a0 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 || hSession >= (
244b0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 sizeof(cackey_se
244c0 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 ssions) / sizeof
244d0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 (cackey_sessions
244e0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 [0]))) {...CACKE
244f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
24500 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 Error. Session
24510 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b out of range.");
24520 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 ......return(CKR
24530 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f _SESSION_HANDLE_
24540 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 INVALID);..}...i
24550 66 20 28 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 f (pulLastPartLe
24560 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 n == NULL) {...C
24570 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
24580 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 4c 61 TF("Error. pulLa
24590 73 74 50 61 72 74 4c 65 6e 20 69 73 20 4e 55 4c stPartLen is NUL
245a0 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 L.");....return(
245b0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 CKR_ARGUMENTS_BA
245c0 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 D);..}...mutex_r
245d0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d etval = cackey_m
245e0 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 utex_lock(cackey
245f0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 _biglock);..if (
24600 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 mutex_retval !=
24610 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 0) {...CACKEY_DE
24620 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
24630 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c r. Locking fail
24640 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e ed.");....return
24650 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 (CKR_GENERAL_ERR
24660 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 OR);..}...if (!c
24670 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
24680 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 Session].active)
24690 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 {...cackey_mute
246a0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
246b0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 biglock);....CAC
246c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
246d0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f ("Error. Sessio
246e0 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b n not active.");
246f0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 ......return(CKR
24700 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f _SESSION_HANDLE_
24710 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 INVALID);..}...i
24720 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 f (!cackey_sessi
24730 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 ons[hSession].de
24740 63 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b 0a crypt_active) {.
24750 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 ..cackey_mutex_u
24760 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 nlock(cackey_big
24770 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 lock);....CACKEY
24780 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
24790 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 20 6e rror. Decrypt n
247a0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 ot active.");...
247b0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 ...return(CKR_OP
247c0 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 ERATION_NOT_INIT
247d0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 2a IALIZED);..}...*
247e0 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20 3d pulLastPartLen =
247f0 20 30 3b 0a 0a 09 69 66 20 28 70 4c 61 73 74 50 0;...if (pLastP
24800 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 art == NULL) {..
24810 09 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79 .terminate_decry
24820 70 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 pt = 0;..}...if
24830 28 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79 (terminate_decry
24840 70 74 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 pt) {...cackey_s
24850 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
24860 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 ].decrypt_active
24870 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 = 0;..}...mutex
24880 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 _retval = cackey
24890 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 _mutex_unlock(ca
248a0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 ckey_biglock);..
248b0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c if (mutex_retval
248c0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 != 0) {...CACKE
248d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
248e0 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e Error. Unlockin
248f0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 g failed.");....
24900 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 return(CKR_GENER
24910 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 AL_ERROR);..}...
24920 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
24930 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 NTF("Returning C
24940 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 KR_OK (%i)", CKR
24950 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 _OK);...return(C
24960 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 KR_OK);.}..CK_DE
24970 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b FINE_FUNCTION(CK
24980 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 49 6e 69 _RV, C_DigestIni
24990 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 t)(CK_SESSION_HA
249a0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 NDLE hSession, C
249b0 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 K_MECHANISM_PTR
249c0 70 4d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 43 pMechanism) {..C
249d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
249e0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
249f0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 .if (!cackey_ini
24a00 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 tialized) {...CA
24a10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
24a20 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 F("Error. Not i
24a30 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a nitialized.");..
24a40 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 ..return(CKR_CRY
24a50 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 PTOKI_NOT_INITIA
24a60 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 LIZED);..}...CAC
24a70 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
24a80 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f ("Returning CKR_
24a90 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
24aa0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b PORTED (%i)", CK
24ab0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
24ac0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 UPPORTED);...ret
24ad0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e urn(CKR_FUNCTION
24ae0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
24af0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 .}..CK_DEFINE_FU
24b00 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f NCTION(CK_RV, C_
24b10 44 69 67 65 73 74 29 28 43 4b 5f 53 45 53 53 49 Digest)(CK_SESSI
24b20 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 ON_HANDLE hSessi
24b30 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 on, CK_BYTE_PTR
24b40 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 pData, CK_ULONG
24b50 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 ulDataLen, CK_BY
24b60 54 45 5f 50 54 52 20 70 44 69 67 65 73 74 2c 20 TE_PTR pDigest,
24b70 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c CK_ULONG_PTR pul
24b80 44 69 67 65 73 74 4c 65 6e 29 20 7b 0a 09 43 41 DigestLen) {..CA
24b90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
24ba0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
24bb0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 if (!cackey_init
24bc0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 ialized) {...CAC
24bd0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
24be0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e ("Error. Not in
24bf0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 itialized.");...
24c00 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 .return(CKR_CRYP
24c10 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c TOKI_NOT_INITIAL
24c20 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b IZED);..}...CACK
24c30 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
24c40 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 "Returning CKR_F
24c50 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
24c60 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 ORTED (%i)", CKR
24c70 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
24c80 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 PPORTED);...retu
24c90 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f rn(CKR_FUNCTION_
24ca0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
24cb0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e }..CK_DEFINE_FUN
24cc0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 CTION(CK_RV, C_D
24cd0 69 67 65 73 74 55 70 64 61 74 65 29 28 43 4b 5f igestUpdate)(CK_
24ce0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 SESSION_HANDLE h
24cf0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 Session, CK_BYTE
24d00 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 _PTR pPart, CK_U
24d10 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29 20 LONG ulPartLen)
24d20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f {..CACKEY_DEBUG_
24d30 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
24d40 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 );...if (!cackey
24d50 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
24d60 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
24d70 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e RINTF("Error. N
24d80 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 ot initialized."
24d90 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
24da0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e _CRYPTOKI_NOT_IN
24db0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
24dc0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
24dd0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
24de0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
24df0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 _SUPPORTED (%i)"
24e00 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e , CKR_FUNCTION_N
24e10 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a OT_SUPPORTED);..
24e20 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 .return(CKR_FUNC
24e30 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
24e40 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e ED);.}..CK_DEFIN
24e50 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 E_FUNCTION(CK_RV
24e60 2c 20 43 5f 44 69 67 65 73 74 4b 65 79 29 28 43 , C_DigestKey)(C
24e70 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 K_SESSION_HANDLE
24e80 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 hSession, CK_OB
24e90 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 JECT_HANDLE hKey
24ea0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 ) {..CACKEY_DEBU
24eb0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 G_PRINTF("Called
24ec0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b .");...if (!cack
24ed0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 ey_initialized)
24ee0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
24ef0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
24f00 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 Not initialized
24f10 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
24f20 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f KR_CRYPTOKI_NOT_
24f30 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d INITIALIZED);..}
24f40 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
24f50 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e PRINTF("Returnin
24f60 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e g CKR_FUNCTION_N
24f70 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 OT_SUPPORTED (%i
24f80 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e )", CKR_FUNCTION
24f90 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
24fa0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 ...return(CKR_FU
24fb0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
24fc0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 RTED);.}..CK_DEF
24fd0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f INE_FUNCTION(CK_
24fe0 52 56 2c 20 43 5f 44 69 67 65 73 74 46 69 6e 61 RV, C_DigestFina
24ff0 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 l)(CK_SESSION_HA
25000 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 NDLE hSession, C
25010 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 69 67 65 K_BYTE_PTR pDige
25020 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 st, CK_ULONG_PTR
25030 20 70 75 6c 44 69 67 65 73 74 4c 65 6e 29 20 7b pulDigestLen) {
25040 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
25050 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
25060 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f ;...if (!cackey_
25070 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 initialized) {..
25080 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
25090 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f INTF("Error. No
250a0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 t initialized.")
250b0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
250c0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 CRYPTOKI_NOT_INI
250d0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 TIALIZED);..}...
250e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
250f0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 NTF("Returning C
25100 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
25110 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c SUPPORTED (%i)",
25120 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f CKR_FUNCTION_NO
25130 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 T_SUPPORTED);...
25140 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 return(CKR_FUNCT
25150 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
25160 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 D);.}..CK_DEFINE
25170 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c _FUNCTION(CK_RV,
25180 20 43 5f 53 69 67 6e 49 6e 69 74 29 28 43 4b 5f C_SignInit)(CK_
25190 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 SESSION_HANDLE h
251a0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 Session, CK_MECH
251b0 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 ANISM_PTR pMecha
251c0 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f nism, CK_OBJECT_
251d0 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 HANDLE hKey) {..
251e0 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c int mutex_retval
251f0 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41 ;...hKey--;...CA
25200 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
25210 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
25220 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 if (!cackey_init
25230 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 ialized) {...CAC
25240 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
25250 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e ("Error. Not in
25260 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 itialized.");...
25270 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 .return(CKR_CRYP
25280 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c TOKI_NOT_INITIAL
25290 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 IZED);..}...if (
252a0 70 4d 65 63 68 61 6e 69 73 6d 20 3d 3d 20 4e 55 pMechanism == NU
252b0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 LL) {...CACKEY_D
252c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
252d0 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 20 69 or. pMechanism i
252e0 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 s NULL.");....re
252f0 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e turn(CKR_ARGUMEN
25300 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 TS_BAD);..}...if
25310 20 28 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 (pMechanism->me
25320 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f 52 chanism != CKM_R
25330 53 41 5f 50 4b 43 53 29 20 7b 0a 09 09 43 41 43 SA_PKCS) {...CAC
25340 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
25350 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e ("Error. pMechan
25360 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 6e ism->mechanism n
25370 6f 74 20 73 70 65 63 69 66 69 65 64 20 61 73 20 ot specified as
25380 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 22 29 3b 0a CKM_RSA_PKCS");.
25390 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4d 45 ...return(CKR_ME
253a0 43 48 41 4e 49 53 4d 5f 50 41 52 41 4d 5f 49 4e CHANISM_PARAM_IN
253b0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 VALID);..}...if
253c0 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c (hSession == 0 |
253d0 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 | hSession >= (s
253e0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 izeof(cackey_ses
253f0 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 sions) / sizeof(
25400 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
25410 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 0]))) {...CACKEY
25420 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
25430 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f rror. Session o
25440 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a ut of range.");.
25450 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f .....return(CKR_
25460 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 SESSION_HANDLE_I
25470 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 NVALID);..}...mu
25480 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 tex_retval = cac
25490 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 key_mutex_lock(c
254a0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
254b0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 .if (mutex_retva
254c0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b l != 0) {...CACK
254d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
254e0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 "Error. Locking
254f0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 failed.");....r
25500 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 eturn(CKR_GENERA
25510 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 L_ERROR);..}...i
25520 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 f (!cackey_sessi
25530 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 ons[hSession].ac
25540 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 tive) {...cackey
25550 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 _mutex_unlock(ca
25560 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a ckey_biglock);..
25570 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
25580 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 RINTF("Error. S
25590 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 ession not activ
255a0 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 e.");......retur
255b0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 n(CKR_SESSION_HA
255c0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 NDLE_INVALID);..
255d0 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 }...if (cackey_s
255e0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
255f0 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b ].sign_active) {
25600 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f ...cackey_mutex_
25610 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 unlock(cackey_bi
25620 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 glock);....CACKE
25630 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
25640 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 61 6c 72 Error. Sign alr
25650 65 61 64 79 20 69 6e 20 70 72 6f 67 72 65 73 73 eady in progress
25660 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e .");......return
25670 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 (CKR_OPERATION_A
25680 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 69 66 20 CTIVE);..}...if
25690 28 68 4b 65 79 20 3e 3d 20 63 61 63 6b 65 79 5f (hKey >= cackey_
256a0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
256b0 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f n].identities_co
256c0 75 6e 74 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f unt) {...cackey_
256d0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 mutex_unlock(cac
256e0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 key_biglock);...
256f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
25700 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4b 65 INTF("Error. Ke
25710 79 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 y handle out of
25720 72 61 6e 67 65 20 28 72 65 71 75 65 73 74 65 64 range (requested
25730 20 6b 65 79 20 25 6c 75 2c 20 6f 6e 6c 79 20 25 key %lu, only %
25740 6c 75 20 69 64 65 6e 74 69 74 69 65 73 20 61 76 lu identities av
25750 61 69 6c 61 62 6c 65 29 2e 22 2c 20 28 75 6e 73 ailable).", (uns
25760 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b 65 79 igned long) hKey
25770 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
25780 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e ) cackey_session
25790 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e s[hSession].iden
257a0 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a tities_count);..
257b0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4b 45 59 ..return(CKR_KEY
257c0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 _HANDLE_INVALID)
257d0 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 ;..}...cackey_se
257e0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
257f0 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 31 .sign_active = 1
25800 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 ;...cackey_sessi
25810 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 ons[hSession].si
25820 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 20 3d 20 70 gn_mechanism = p
25830 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 Mechanism->mecha
25840 6e 69 73 6d 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 nism;...cackey_s
25850 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
25860 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20 3d 20 ].sign_buflen =
25870 31 32 38 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 128;..cackey_ses
25880 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
25890 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d 20 30 sign_bufused = 0
258a0 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f ;..cackey_sessio
258b0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 ns[hSession].sig
258c0 6e 5f 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 73 n_buf = malloc(s
258d0 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f 73 65 izeof(*cackey_se
258e0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
258f0 2e 73 69 67 6e 5f 62 75 66 29 20 2a 20 63 61 63 .sign_buf) * cac
25900 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
25910 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c ssion].sign_bufl
25920 65 6e 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 en);...CACKEY_DE
25930 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 73 73 BUG_PRINTF("Sess
25940 69 6f 6e 20 25 6c 75 20 73 69 67 6e 5f 69 64 65 ion %lu sign_ide
25950 6e 74 69 74 79 20 69 73 20 25 70 20 28 69 64 65 ntity is %p (ide
25960 6e 74 69 74 79 20 23 25 6c 75 29 22 2c 20 28 75 ntity #%lu)", (u
25970 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 53 nsigned long) hS
25980 65 73 73 69 6f 6e 2c 20 26 63 61 63 6b 65 79 5f ession, &cackey_
25990 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
259a0 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 68 4b n].identities[hK
259b0 65 79 5d 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c ey], (unsigned l
259c0 6f 6e 67 29 20 68 4b 65 79 29 3b 0a 09 63 61 63 ong) hKey);..cac
259d0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
259e0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e ssion].sign_iden
259f0 74 69 74 79 20 3d 20 26 63 61 63 6b 65 79 5f 73 tity = &cackey_s
25a00 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
25a10 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 68 4b 65 ].identities[hKe
25a20 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 y];...mutex_retv
25a30 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 al = cackey_mute
25a40 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f x_unlock(cackey_
25a50 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d biglock);..if (m
25a60 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 utex_retval != 0
25a70 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 ) {...CACKEY_DEB
25a80 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 UG_PRINTF("Error
25a90 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 . Unlocking fai
25aa0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 led.");....retur
25ab0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 n(CKR_GENERAL_ER
25ac0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 ROR);..}...CACKE
25ad0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
25ae0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b Returning CKR_OK
25af0 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b (%i)", CKR_OK);
25b00 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b ...return(CKR_OK
25b10 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f );.}..CK_DEFINE_
25b20 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 FUNCTION(CK_RV,
25b30 43 5f 53 69 67 6e 29 28 43 4b 5f 53 45 53 53 49 C_Sign)(CK_SESSI
25b40 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 ON_HANDLE hSessi
25b50 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 on, CK_BYTE_PTR
25b60 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 pData, CK_ULONG
25b70 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 ulDataLen, CK_BY
25b80 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 TE_PTR pSignatur
25b90 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 e, CK_ULONG_PTR
25ba0 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 pulSignatureLen)
25bb0 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e {..unsigned lon
25bc0 67 20 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 66 g start_sign_buf
25bd0 75 73 65 64 3b 0a 09 43 4b 5f 52 56 20 73 69 67 used;..CK_RV sig
25be0 6e 5f 72 65 74 3b 0a 09 69 6e 74 20 6d 75 74 65 n_ret;..int mute
25bf0 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b x_retval;...CACK
25c00 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
25c10 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 "Called.");...if
25c20 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 (!cackey_initia
25c30 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 lized) {...CACKE
25c40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
25c50 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 Error. Not init
25c60 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 ialized.");....r
25c70 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f eturn(CKR_CRYPTO
25c80 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a KI_NOT_INITIALIZ
25c90 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 ED);..}...if (hS
25ca0 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 ession == 0 || h
25cb0 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 Session >= (size
25cc0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f of(cackey_sessio
25cd0 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 ns) / sizeof(cac
25ce0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 key_sessions[0])
25cf0 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 )) {...CACKEY_DE
25d00 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
25d10 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 r. Session out
25d20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a of range.");....
25d30 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 ..return(CKR_SES
25d40 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 SION_HANDLE_INVA
25d50 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 74 61 72 74 LID);..}...start
25d60 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d 20 _sign_bufused =
25d70 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
25d80 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 hSession].sign_b
25d90 75 66 75 73 65 64 3b 0a 0a 09 73 69 67 6e 5f 72 ufused;...sign_r
25da0 65 74 20 3d 20 43 5f 53 69 67 6e 55 70 64 61 74 et = C_SignUpdat
25db0 65 28 68 53 65 73 73 69 6f 6e 2c 20 70 44 61 74 e(hSession, pDat
25dc0 61 2c 20 75 6c 44 61 74 61 4c 65 6e 29 3b 0a 09 a, ulDataLen);..
25dd0 69 66 20 28 73 69 67 6e 5f 72 65 74 20 21 3d 20 if (sign_ret !=
25de0 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b CKR_OK) {...CACK
25df0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
25e00 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 55 70 64 "Error. SignUpd
25e10 61 74 65 28 29 20 72 65 74 75 72 6e 65 64 20 66 ate() returned f
25e20 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75 ailure (rv = %lu
25e30 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c ).", (unsigned l
25e40 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74 29 3b 0a ong) sign_ret);.
25e50 0a 09 09 69 66 20 28 73 69 67 6e 5f 72 65 74 20 ...if (sign_ret
25e60 21 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f != CKR_BUFFER_TO
25e70 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 09 6d 75 O_SMALL) {....mu
25e80 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 tex_retval = cac
25e90 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 key_mutex_lock(c
25ea0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
25eb0 09 09 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 ...if (mutex_ret
25ec0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 val != 0) {.....
25ed0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
25ee0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 NTF("Error. Loc
25ef0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a king failed.");.
25f00 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f .....return(CKR_
25f10 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a GENERAL_ERROR);.
25f20 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 21 63 61 ...}.....if (!ca
25f30 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
25f40 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 ession].active)
25f50 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 {.....cackey_mut
25f60 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 ex_unlock(cackey
25f70 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 _biglock);......
25f80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
25f90 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 NTF("Error. Ses
25fa0 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e sion not active.
25fb0 22 29 3b 0a 09 09 0a 09 09 09 09 72 65 74 75 72 ");........retur
25fc0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 n(CKR_SESSION_HA
25fd0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 NDLE_INVALID);..
25fe0 09 09 7d 0a 0a 09 09 09 69 66 20 28 21 63 61 63 ..}.....if (!cac
25ff0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
26000 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 ssion].sign_acti
26010 76 65 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 ve) {.....cackey
26020 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 _mutex_unlock(ca
26030 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a ckey_biglock);..
26040 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 ....CACKEY_DEBUG
26050 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
26060 20 53 69 67 6e 20 6e 6f 74 20 61 63 74 69 76 65 Sign not active
26070 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72 65 74 75 .");........retu
26080 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e rn(CKR_OPERATION
26090 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 _NOT_INITIALIZED
260a0 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b );....}.....cack
260b0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
260c0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 sion].sign_activ
260d0 65 20 3d 20 30 3b 0a 0a 09 09 09 6d 75 74 65 78 e = 0;.....mutex
260e0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 _retval = cackey
260f0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 _mutex_unlock(ca
26100 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 ckey_biglock);..
26110 09 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 ..if (mutex_retv
26120 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 43 al != 0) {.....C
26130 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
26140 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f TF("Error. Unlo
26150 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b cking failed.");
26160 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 ......return(CKR
26170 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b _GENERAL_ERROR);
26180 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 72 65 74 ....}...}....ret
26190 75 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 urn(sign_ret);..
261a0 7d 0a 0a 09 73 69 67 6e 5f 72 65 74 20 3d 20 43 }...sign_ret = C
261b0 5f 53 69 67 6e 46 69 6e 61 6c 28 68 53 65 73 73 _SignFinal(hSess
261c0 69 6f 6e 2c 20 70 53 69 67 6e 61 74 75 72 65 2c ion, pSignature,
261d0 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e pulSignatureLen
261e0 29 3b 0a 09 69 66 20 28 73 69 67 6e 5f 72 65 74 );..if (sign_ret
261f0 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 != CKR_OK) {...
26200 69 66 20 28 73 69 67 6e 5f 72 65 74 20 3d 3d 20 if (sign_ret ==
26210 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 CKR_BUFFER_TOO_S
26220 4d 41 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45 MALL) {....CACKE
26230 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
26240 53 69 67 6e 46 69 6e 61 6c 28 29 20 72 65 74 75 SignFinal() retu
26250 72 6e 65 64 20 43 4b 52 5f 42 55 46 46 45 52 5f rned CKR_BUFFER_
26260 54 4f 4f 5f 53 4d 41 4c 4c 20 28 72 76 20 3d 20 TOO_SMALL (rv =
26270 25 6c 75 29 2c 20 75 6e 64 6f 69 6e 67 20 43 5f %lu), undoing C_
26280 53 69 67 6e 55 70 64 61 74 65 28 29 22 2c 20 28 SignUpdate()", (
26290 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 unsigned long) s
262a0 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 09 63 61 ign_ret);.....ca
262b0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
262c0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 ession].sign_buf
262d0 75 73 65 64 20 3d 20 73 74 61 72 74 5f 73 69 67 used = start_sig
262e0 6e 5f 62 75 66 75 73 65 64 3b 0a 0a 09 09 09 72 n_bufused;.....r
262f0 65 74 75 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b eturn(sign_ret);
26300 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 ...}....CACKEY_D
26310 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
26320 6f 72 2e 20 20 53 69 67 6e 46 69 6e 61 6c 28 29 or. SignFinal()
26330 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72 returned failur
26340 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 e (rv = %lu).",
26350 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
26360 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 72 65 sign_ret);....re
26370 74 75 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a turn(sign_ret);.
26380 09 7d 0a 0a 09 69 66 20 28 70 53 69 67 6e 61 74 .}...if (pSignat
26390 75 72 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ure == NULL) {..
263a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
263b0 49 4e 54 46 28 22 70 53 69 67 6e 61 74 75 72 65 INTF("pSignature
263c0 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 specified as NU
263d0 4c 4c 2c 20 75 6e 64 6f 69 6e 67 20 43 5f 53 69 LL, undoing C_Si
263e0 67 6e 55 70 64 61 74 65 28 29 22 29 3b 0a 0a 09 gnUpdate()");...
263f0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 .cackey_sessions
26400 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f [hSession].sign_
26410 62 75 66 75 73 65 64 20 3d 20 73 74 61 72 74 5f bufused = start_
26420 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 0a 09 sign_bufused;...
26430 09 72 65 74 75 72 6e 28 73 69 67 6e 5f 72 65 74 .return(sign_ret
26440 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 );..}...CACKEY_D
26450 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
26460 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 urning CKR_OK (%
26470 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 i)", CKR_OK);...
26480 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a return(CKR_OK);.
26490 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e }..CK_DEFINE_FUN
264a0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 CTION(CK_RV, C_S
264b0 69 67 6e 55 70 64 61 74 65 29 28 43 4b 5f 53 45 ignUpdate)(CK_SE
264c0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 SSION_HANDLE hSe
264d0 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 ssion, CK_BYTE_P
264e0 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f TR pPart, CK_ULO
264f0 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a NG ulPartLen) {.
26500 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 .int mutex_retva
26510 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 l;...CACKEY_DEBU
26520 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 G_PRINTF("Called
26530 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b .");...if (!cack
26540 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 ey_initialized)
26550 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {...CACKEY_DEBUG
26560 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 _PRINTF("Error.
26570 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 Not initialized
26580 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 .");....return(C
26590 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f KR_CRYPTOKI_NOT_
265a0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d INITIALIZED);..}
265b0 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 ...if (hSession
265c0 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e == 0 || hSession
265d0 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b >= (sizeof(cack
265e0 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 ey_sessions) / s
265f0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 izeof(cackey_ses
26600 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 sions[0]))) {...
26610 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
26620 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 NTF("Error. Ses
26630 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 sion out of rang
26640 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 e.");......retur
26650 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 n(CKR_SESSION_HA
26660 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 NDLE_INVALID);..
26670 7d 0a 0a 09 69 66 20 28 70 50 61 72 74 20 3d 3d }...if (pPart ==
26680 20 4e 55 4c 4c 20 26 26 20 75 6c 50 61 72 74 4c NULL && ulPartL
26690 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 en == 0) {.../*
266a0 53 68 6f 72 74 20 63 69 72 63 75 69 74 20 69 66 Short circuit if
266b0 20 77 65 20 61 72 65 20 61 73 6b 65 64 20 74 6f we are asked to
266c0 20 73 69 67 6e 20 6e 6f 74 68 69 6e 67 2e 2e 2e sign nothing...
266d0 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 */...CACKEY_DEB
266e0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
266f0 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 ning CKR_OK (%i)
26700 20 28 73 68 6f 72 74 20 63 69 72 63 75 69 74 29 (short circuit)
26710 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 ", CKR_OK);....r
26720 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 eturn(CKR_OK);..
26730 7d 0a 0a 09 69 66 20 28 70 50 61 72 74 20 3d 3d }...if (pPart ==
26740 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 NULL) {...CACKE
26750 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
26760 45 72 72 6f 72 2e 20 70 50 61 72 74 20 69 73 20 Error. pPart is
26770 4e 55 4c 4c 2c 20 62 75 74 20 75 6c 50 61 72 74 NULL, but ulPart
26780 4c 65 6e 20 69 73 20 6e 6f 74 20 30 2e 22 29 3b Len is not 0.");
26790 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 ....return(CKR_A
267a0 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 RGUMENTS_BAD);..
267b0 7d 0a 0a 09 69 66 20 28 75 6c 50 61 72 74 4c 65 }...if (ulPartLe
267c0 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b n == 0) {...CACK
267d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
267e0 22 45 72 72 6f 72 2e 20 75 6c 50 61 72 74 4c 65 "Error. ulPartLe
267f0 6e 20 69 73 20 30 2c 20 62 75 74 20 70 50 61 72 n is 0, but pPar
26800 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 t is not NULL.")
26810 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
26820 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a ARGUMENTS_BAD);.
26830 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 .}...mutex_retva
26840 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 l = cackey_mutex
26850 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 _lock(cackey_big
26860 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 lock);..if (mute
26870 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b x_retval != 0) {
26880 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
26890 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
268a0 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 Locking failed."
268b0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
268c0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b _GENERAL_ERROR);
268d0 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ..}...if (!cacke
268e0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 y_sessions[hSess
268f0 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 ion].active) {..
26900 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e .cackey_mutex_un
26910 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
26920 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f ock);....CACKEY_
26930 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
26940 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f ror. Session no
26950 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a t active.");....
26960 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 ..return(CKR_SES
26970 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 SION_HANDLE_INVA
26980 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 LID);..}...if (!
26990 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
269a0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 hSession].sign_a
269b0 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 ctive) {...cacke
269c0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 y_mutex_unlock(c
269d0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a ackey_biglock);.
269e0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
269f0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
26a00 53 69 67 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e Sign not active.
26a10 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 ");......return(
26a20 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f CKR_OPERATION_NO
26a30 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a T_INITIALIZED);.
26a40 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 63 61 63 .}...switch (cac
26a50 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
26a60 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68 ssion].sign_mech
26a70 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61 73 65 20 anism) {...case
26a80 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 CKM_RSA_PKCS:...
26a90 09 2f 2a 20 41 63 63 75 6d 75 6c 61 74 65 20 64 ./* Accumulate d
26aa0 69 72 65 63 74 6c 79 20 2a 2f 0a 09 09 09 69 66 irectly */....if
26ab0 20 28 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f ((cackey_sessio
26ac0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 ns[hSession].sig
26ad0 6e 5f 62 75 66 75 73 65 64 20 2b 20 75 6c 50 61 n_bufused + ulPa
26ae0 72 74 4c 65 6e 29 20 3e 20 63 61 63 6b 65 79 5f rtLen) > cackey_
26af0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f sessions[hSessio
26b00 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29 20 n].sign_buflen)
26b10 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 65 73 {.....cackey_ses
26b20 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
26b30 73 69 67 6e 5f 62 75 66 6c 65 6e 20 2a 3d 20 32 sign_buflen *= 2
26b40 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 65 ;......cackey_se
26b50 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
26b60 2e 73 69 67 6e 5f 62 75 66 20 3d 20 72 65 61 6c .sign_buf = real
26b70 6c 6f 63 28 63 61 63 6b 65 79 5f 73 65 73 73 69 loc(cackey_sessi
26b80 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 ons[hSession].si
26b90 67 6e 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28 2a gn_buf, sizeof(*
26ba0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b cackey_sessions[
26bb0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 hSession].sign_b
26bc0 75 66 29 20 2a 20 63 61 63 6b 65 79 5f 73 65 73 uf) * cackey_ses
26bd0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e sions[hSession].
26be0 73 69 67 6e 5f 62 75 66 6c 65 6e 29 3b 0a 09 09 sign_buflen);...
26bf0 09 7d 0a 0a 09 09 09 6d 65 6d 63 70 79 28 63 61 .}.....memcpy(ca
26c00 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
26c10 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 ession].sign_buf
26c20 20 2b 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f + cackey_sessio
26c30 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 ns[hSession].sig
26c40 6e 5f 62 75 66 75 73 65 64 2c 20 70 50 61 72 74 n_bufused, pPart
26c50 2c 20 75 6c 50 61 72 74 4c 65 6e 29 3b 0a 0a 09 , ulPartLen);...
26c60 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e ..cackey_session
26c70 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e s[hSession].sign
26c80 5f 62 75 66 75 73 65 64 20 2b 3d 20 75 6c 50 61 _bufused += ulPa
26c90 72 74 4c 65 6e 3b 0a 0a 09 09 09 62 72 65 61 6b rtLen;.....break
26ca0 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 ;..}...mutex_ret
26cb0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 val = cackey_mut
26cc0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 ex_unlock(cackey
26cd0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 _biglock);..if (
26ce0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 mutex_retval !=
26cf0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 0) {...CACKEY_DE
26d00 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
26d10 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 r. Unlocking fa
26d20 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 iled.");....retu
26d30 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 rn(CKR_GENERAL_E
26d40 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b RROR);..}...CACK
26d50 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
26d60 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f "Returning CKR_O
26d70 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 K (%i)", CKR_OK)
26d80 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f ;...return(CKR_O
26d90 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 K);.}..CK_DEFINE
26da0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c _FUNCTION(CK_RV,
26db0 20 43 5f 53 69 67 6e 46 69 6e 61 6c 29 28 43 4b C_SignFinal)(CK
26dc0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 _SESSION_HANDLE
26dd0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 hSession, CK_BYT
26de0 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 E_PTR pSignature
26df0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 , CK_ULONG_PTR p
26e00 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 ulSignatureLen)
26e10 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 59 54 {..static CK_BYT
26e20 45 20 73 69 67 62 75 66 5b 31 30 32 34 5d 3b 0a E sigbuf[1024];.
26e30 09 73 73 69 7a 65 5f 74 20 73 69 67 62 75 66 6c .ssize_t sigbufl
26e40 65 6e 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 en;..CK_SLOT_ID
26e50 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 52 56 20 72 slotID;..CK_RV r
26e60 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 etval = CKR_GENE
26e70 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 69 6e 74 20 RAL_ERROR;..int
26e80 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d terminate_sign =
26e90 20 31 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 1;..int mutex_r
26ea0 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f etval;...CACKEY_
26eb0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 DEBUG_PRINTF("Ca
26ec0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 lled.");...if (!
26ed0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a cackey_initializ
26ee0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 ed) {...CACKEY_D
26ef0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
26f00 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c or. Not initial
26f10 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 ized.");....retu
26f20 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f rn(CKR_CRYPTOKI_
26f30 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 NOT_INITIALIZED)
26f40 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 53 69 ;..}...if (pulSi
26f50 67 6e 61 74 75 72 65 4c 65 6e 20 3d 3d 20 4e 55 gnatureLen == NU
26f60 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 LL) {...CACKEY_D
26f70 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
26f80 6f 72 2e 20 70 75 6c 53 69 67 6e 61 74 75 72 65 or. pulSignature
26f90 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a Len is NULL.");.
26fa0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 ...return(CKR_AR
26fb0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d GUMENTS_BAD);..}
26fc0 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 ...if (hSession
26fd0 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e == 0 || hSession
26fe0 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b >= (sizeof(cack
26ff0 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 ey_sessions) / s
27000 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 izeof(cackey_ses
27010 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 sions[0]))) {...
27020 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
27030 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 NTF("Error. Ses
27040 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 sion out of rang
27050 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 e.");......retur
27060 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 n(CKR_SESSION_HA
27070 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 NDLE_INVALID);..
27080 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c }...mutex_retval
27090 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f = cackey_mutex_
270a0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c lock(cackey_bigl
270b0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 ock);..if (mutex
270c0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a _retval != 0) {.
270d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
270e0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c RINTF("Error. L
270f0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 ocking failed.")
27100 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
27110 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a GENERAL_ERROR);.
27120 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 .}...if (!cackey
27130 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 _sessions[hSessi
27140 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 on].active) {...
27150 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c cackey_mutex_unl
27160 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
27170 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 ck);....CACKEY_D
27180 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 EBUG_PRINTF("Err
27190 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 or. Session not
271a0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 active.");.....
271b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 .return(CKR_SESS
271c0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c ION_HANDLE_INVAL
271d0 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 ID);..}...if (!c
271e0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
271f0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 Session].sign_ac
27200 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 tive) {...cackey
27210 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 _mutex_unlock(ca
27220 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a ckey_biglock);..
27230 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
27240 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 RINTF("Error. S
27250 69 67 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 ign not active."
27260 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 );......return(C
27270 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 KR_OPERATION_NOT
27280 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 _INITIALIZED);..
27290 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 }...slotID = cac
272a0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 key_sessions[hSe
272b0 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a ssion].slotID;..
272c0 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 .if (slotID < 0
272d0 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 || slotID >= (si
272e0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 zeof(cackey_slot
272f0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b s) / sizeof(cack
27300 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b ey_slots[0]))) {
27310 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
27320 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 PRINTF("Error. I
27330 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 nvalid slot requ
27340 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 ested (%lu), out
27350 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 side of valid ra
27360 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a nge", slotID);..
27370 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e ..return(CKR_GEN
27380 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a ERAL_ERROR);..}.
27390 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f ..if (cackey_slo
273a0 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 ts[slotID].activ
273b0 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b e == 0) {...CACK
273c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
273d0 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 "Error. Invalid
273e0 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 slot requested (
273f0 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 %lu), slot not c
27400 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 urrently active"
27410 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 , slotID);....ca
27420 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 ckey_mutex_unloc
27430 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b k(cackey_biglock
27440 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
27450 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b _GENERAL_ERROR);
27460 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 63 61 ..}...switch (ca
27470 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 ckey_sessions[hS
27480 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63 ession].sign_mec
27490 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61 73 65 hanism) {...case
274a0 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 CKM_RSA_PKCS:..
274b0 09 09 2f 2a 20 41 73 6b 20 63 61 72 64 20 74 6f ../* Ask card to
274c0 20 73 69 67 6e 20 2a 2f 0a 09 09 09 43 41 43 4b sign */....CACK
274d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
274e0 22 41 73 6b 69 6e 67 20 74 6f 20 73 69 67 6e 20 "Asking to sign
274f0 66 72 6f 6d 20 69 64 65 6e 74 69 74 79 20 25 70 from identity %p
27500 20 69 6e 20 73 65 73 73 69 6f 6e 20 25 6c 75 22 in session %lu"
27510 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e , cackey_session
27520 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e s[hSession].sign
27530 5f 69 64 65 6e 74 69 74 79 2c 20 28 75 6e 73 69 _identity, (unsi
27540 67 6e 65 64 20 6c 6f 6e 67 29 20 68 53 65 73 73 gned long) hSess
27550 69 6f 6e 29 3b 0a 09 09 09 73 69 67 62 75 66 6c ion);....sigbufl
27560 65 6e 20 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e en = cackey_sign
27570 64 65 63 72 79 70 74 28 26 63 61 63 6b 65 79 5f decrypt(&cackey_
27580 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 slots[slotID], c
27590 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 ackey_sessions[h
275a0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 Session].sign_id
275b0 65 6e 74 69 74 79 2c 20 63 61 63 6b 65 79 5f 73 entity, cackey_s
275c0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e essions[hSession
275d0 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 63 61 63 6b ].sign_buf, cack
275e0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 ey_sessions[hSes
275f0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 sion].sign_bufus
27600 65 64 2c 20 73 69 67 62 75 66 2c 20 73 69 7a 65 ed, sigbuf, size
27610 6f 66 28 73 69 67 62 75 66 29 2c 20 31 2c 20 30 of(sigbuf), 1, 0
27620 29 3b 0a 0a 09 09 09 69 66 20 28 73 69 67 62 75 );.....if (sigbu
27630 66 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 09 09 flen < 0) {.....
27640 2f 2a 20 53 69 67 6e 69 6e 67 20 66 61 69 6c 65 /* Signing faile
27650 64 2e 20 2a 2f 0a 09 09 09 09 69 66 20 28 73 69 d. */.....if (si
27660 67 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 gbuflen == CACKE
27670 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 Y_PCSC_E_NEEDLOG
27680 49 4e 29 20 7b 0a 09 09 09 09 09 72 65 74 76 61 IN) {......retva
27690 6c 20 3d 20 43 4b 52 5f 55 53 45 52 5f 4e 4f 54 l = CKR_USER_NOT
276a0 5f 4c 4f 47 47 45 44 5f 49 4e 3b 0a 09 09 09 09 _LOGGED_IN;.....
276b0 7d 20 65 6c 73 65 20 69 66 20 28 73 69 67 62 75 } else if (sigbu
276c0 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 flen == CACKEY_P
276d0 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e CSC_E_TOKENABSEN
276e0 54 29 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c T) {......retval
276f0 20 3d 20 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 = CKR_DEVICE_RE
27700 4d 4f 56 45 44 3b 0a 09 09 09 09 7d 20 65 6c 73 MOVED;.....} els
27710 65 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 e {......retval
27720 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 = CKR_GENERAL_ER
27730 52 4f 52 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 ROR;.....}....}
27740 65 6c 73 65 20 69 66 20 28 28 28 75 6e 73 69 67 else if (((unsig
27750 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 62 75 66 ned long) sigbuf
27760 6c 65 6e 29 20 3e 20 2a 70 75 6c 53 69 67 6e 61 len) > *pulSigna
27770 74 75 72 65 4c 65 6e 20 26 26 20 70 53 69 67 6e tureLen && pSign
27780 61 74 75 72 65 29 20 7b 0a 09 09 09 09 2f 2a 20 ature) {...../*
27790 53 69 67 6e 65 64 20 64 61 74 61 20 74 6f 6f 20 Signed data too
277a0 6c 61 72 67 65 20 2a 2f 0a 09 09 09 09 43 41 43 large */.....CAC
277b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
277c0 28 22 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 ("retval = CKR_B
277d0 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b UFFER_TOO_SMALL;
277e0 20 20 73 69 67 62 75 66 6c 65 6e 20 3d 20 25 6c sigbuflen = %l
277f0 75 2c 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c u, pulSignatureL
27800 65 6e 20 3d 20 25 6c 75 22 2c 20 28 75 6e 73 69 en = %lu", (unsi
27810 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 62 75 gned long) sigbu
27820 66 6c 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 flen, (unsigned
27830 6c 6f 6e 67 29 20 2a 70 75 6c 53 69 67 6e 61 74 long) *pulSignat
27840 75 72 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 72 65 ureLen);......re
27850 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 tval = CKR_BUFFE
27860 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 0a 09 09 R_TOO_SMALL;....
27870 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e ..terminate_sign
27880 20 3d 20 30 3b 0a 09 09 09 7d 20 65 6c 73 65 20 = 0;....} else
27890 7b 0a 09 09 09 09 74 65 72 6d 69 6e 61 74 65 5f {.....terminate_
278a0 73 69 67 6e 20 3d 20 30 3b 0a 0a 09 09 09 09 69 sign = 0;......i
278b0 66 20 28 70 53 69 67 6e 61 74 75 72 65 29 20 7b f (pSignature) {
278c0 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 70 53 69 ......memcpy(pSi
278d0 67 6e 61 74 75 72 65 2c 20 73 69 67 62 75 66 2c gnature, sigbuf,
278e0 20 73 69 67 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 sigbuflen);....
278f0 09 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 ...terminate_sig
27900 6e 20 3d 20 31 3b 0a 09 09 09 09 7d 0a 0a 09 09 n = 1;.....}....
27910 09 09 2a 70 75 6c 53 69 67 6e 61 74 75 72 65 4c ..*pulSignatureL
27920 65 6e 20 3d 20 73 69 67 62 75 66 6c 65 6e 3b 0a en = sigbuflen;.
27930 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b .....retval = CK
27940 52 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 R_OK;....}.....b
27950 72 65 61 6b 3b 0a 09 7d 0a 0a 09 69 66 20 28 74 reak;..}...if (t
27960 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 29 20 7b erminate_sign) {
27970 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 ...if (cackey_se
27980 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d ssions[hSession]
27990 2e 73 69 67 6e 5f 62 75 66 29 20 7b 0a 09 09 09 .sign_buf) {....
279a0 66 72 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73 free(cackey_sess
279b0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 ions[hSession].s
279c0 69 67 6e 5f 62 75 66 29 3b 0a 09 09 7d 0a 0a 09 ign_buf);...}...
279d0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 .cackey_sessions
279e0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f [hSession].sign_
279f0 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a active = 0;..}..
27a00 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 .mutex_retval =
27a10 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c cackey_mutex_unl
27a20 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f ock(cackey_biglo
27a30 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f ck);..if (mutex_
27a40 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 retval != 0) {..
27a50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
27a60 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e INTF("Error. Un
27a70 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 locking failed."
27a80 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
27a90 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b _GENERAL_ERROR);
27aa0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 ..}...CACKEY_DEB
27ab0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
27ac0 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e 74 29 20 ning %i", (int)
27ad0 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 retval);...retur
27ae0 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b n(retval);.}..CK
27af0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e _DEFINE_FUNCTION
27b00 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 52 65 (CK_RV, C_SignRe
27b10 63 6f 76 65 72 49 6e 69 74 29 28 43 4b 5f 53 45 coverInit)(CK_SE
27b20 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 SSION_HANDLE hSe
27b30 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e ssion, CK_MECHAN
27b40 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 ISM_PTR pMechani
27b50 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 sm, CK_OBJECT_HA
27b60 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 NDLE hKey) {..CA
27b70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
27b80 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
27b90 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 if (!cackey_init
27ba0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 ialized) {...CAC
27bb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
27bc0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e ("Error. Not in
27bd0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 itialized.");...
27be0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 .return(CKR_CRYP
27bf0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c TOKI_NOT_INITIAL
27c00 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b IZED);..}...CACK
27c10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
27c20 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 "Returning CKR_F
27c30 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
27c40 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 ORTED (%i)", CKR
27c50 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
27c60 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 PPORTED);...retu
27c70 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f rn(CKR_FUNCTION_
27c80 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
27c90 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e }..CK_DEFINE_FUN
27ca0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 CTION(CK_RV, C_S
27cb0 69 67 6e 52 65 63 6f 76 65 72 29 28 43 4b 5f 53 ignRecover)(CK_S
27cc0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 ESSION_HANDLE hS
27cd0 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f ession, CK_BYTE_
27ce0 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c PTR pData, CK_UL
27cf0 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 ONG ulDataLen, C
27d00 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e K_BYTE_PTR pSign
27d10 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f ature, CK_ULONG_
27d20 50 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72 65 PTR pulSignature
27d30 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 Len) {..CACKEY_D
27d40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
27d50 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 led.");...if (!c
27d60 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 ackey_initialize
27d70 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 d) {...CACKEY_DE
27d80 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
27d90 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 r. Not initiali
27da0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 zed.");....retur
27db0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e n(CKR_CRYPTOKI_N
27dc0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b OT_INITIALIZED);
27dd0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 ..}...CACKEY_DEB
27de0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
27df0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f ning CKR_FUNCTIO
27e00 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 N_NOT_SUPPORTED
27e10 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 (%i)", CKR_FUNCT
27e20 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
27e30 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 D);...return(CKR
27e40 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
27e50 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f PPORTED);.}..CK_
27e60 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 DEFINE_FUNCTION(
27e70 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 49 CK_RV, C_VerifyI
27e80 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f nit)(CK_SESSION_
27e90 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c HANDLE hSession,
27ea0 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 CK_MECHANISM_PT
27eb0 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b R pMechanism, CK
27ec0 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 _OBJECT_HANDLE h
27ed0 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 Key) {..CACKEY_D
27ee0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
27ef0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 led.");...if (!c
27f00 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 ackey_initialize
27f10 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 d) {...CACKEY_DE
27f20 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
27f30 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 r. Not initiali
27f40 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 zed.");....retur
27f50 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e n(CKR_CRYPTOKI_N
27f60 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b OT_INITIALIZED);
27f70 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 ..}...CACKEY_DEB
27f80 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
27f90 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f ning CKR_FUNCTIO
27fa0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 N_NOT_SUPPORTED
27fb0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 (%i)", CKR_FUNCT
27fc0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
27fd0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 D);...return(CKR
27fe0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
27ff0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f PPORTED);.}..CK_
28000 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 DEFINE_FUNCTION(
28010 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 29 CK_RV, C_Verify)
28020 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 (CK_SESSION_HAND
28030 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f LE hSession, CK_
28040 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 BYTE_PTR pData,
28050 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c CK_ULONG ulDataL
28060 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 en, CK_BYTE_PTR
28070 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 pSignature, CK_U
28080 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72 65 LONG ulSignature
28090 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 Len) {..CACKEY_D
280a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
280b0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 led.");...if (!c
280c0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 ackey_initialize
280d0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 d) {...CACKEY_DE
280e0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
280f0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 r. Not initiali
28100 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 zed.");....retur
28110 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e n(CKR_CRYPTOKI_N
28120 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b OT_INITIALIZED);
28130 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 ..}...CACKEY_DEB
28140 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
28150 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f ning CKR_FUNCTIO
28160 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 N_NOT_SUPPORTED
28170 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 (%i)", CKR_FUNCT
28180 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
28190 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 D);...return(CKR
281a0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
281b0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f PPORTED);.}..CK_
281c0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 DEFINE_FUNCTION(
281d0 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 55 CK_RV, C_VerifyU
281e0 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f pdate)(CK_SESSIO
281f0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f N_HANDLE hSessio
28200 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 n, CK_BYTE_PTR p
28210 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 Part, CK_ULONG u
28220 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 lPartLen) {..CAC
28230 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
28240 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 ("Called.");...i
28250 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 f (!cackey_initi
28260 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b alized) {...CACK
28270 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
28280 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 "Error. Not ini
28290 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 tialized.");....
282a0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 return(CKR_CRYPT
282b0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 OKI_NOT_INITIALI
282c0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 ZED);..}...CACKE
282d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
282e0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 Returning CKR_FU
282f0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
28300 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f RTED (%i)", CKR_
28310 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
28320 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 PORTED);...retur
28330 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e n(CKR_FUNCTION_N
28340 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d OT_SUPPORTED);.}
28350 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 ..CK_DEFINE_FUNC
28360 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 TION(CK_RV, C_Ve
28370 72 69 66 79 46 69 6e 61 6c 29 28 43 4b 5f 53 45 rifyFinal)(CK_SE
28380 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 SSION_HANDLE hSe
28390 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 ssion, CK_BYTE_P
283a0 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 TR pSignature, C
283b0 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 K_ULONG ulSignat
283c0 75 72 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 ureLen) {..CACKE
283d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
283e0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 Called.");...if
283f0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c (!cackey_initial
28400 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 ized) {...CACKEY
28410 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
28420 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 rror. Not initi
28430 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 alized.");....re
28440 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b turn(CKR_CRYPTOK
28450 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 I_NOT_INITIALIZE
28460 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f D);..}...CACKEY_
28470 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
28480 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 turning CKR_FUNC
28490 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
284a0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 ED (%i)", CKR_FU
284b0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
284c0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 RTED);...return(
284d0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
284e0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a _SUPPORTED);.}..
284f0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 CK_DEFINE_FUNCTI
28500 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 ON(CK_RV, C_Veri
28510 66 79 52 65 63 6f 76 65 72 49 6e 69 74 29 28 43 fyRecoverInit)(C
28520 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 K_SESSION_HANDLE
28530 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 hSession, CK_ME
28540 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 CHANISM_PTR pMec
28550 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 hanism, CK_OBJEC
28560 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b T_HANDLE hKey) {
28570 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
28580 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
28590 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f ;...if (!cackey_
285a0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 initialized) {..
285b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
285c0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f INTF("Error. No
285d0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 t initialized.")
285e0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
285f0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 CRYPTOKI_NOT_INI
28600 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 TIALIZED);..}...
28610 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
28620 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 NTF("Returning C
28630 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
28640 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c SUPPORTED (%i)",
28650 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f CKR_FUNCTION_NO
28660 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 T_SUPPORTED);...
28670 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 return(CKR_FUNCT
28680 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
28690 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 D);.}..CK_DEFINE
286a0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c _FUNCTION(CK_RV,
286b0 20 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 C_VerifyRecover
286c0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e )(CK_SESSION_HAN
286d0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b DLE hSession, CK
286e0 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 _BYTE_PTR pSigna
286f0 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 ture, CK_ULONG u
28700 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 2c 20 43 lSignatureLen, C
28710 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 K_BYTE_PTR pData
28720 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 , CK_ULONG_PTR p
28730 75 6c 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41 ulDataLen) {..CA
28740 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
28750 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 F("Called.");...
28760 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 if (!cackey_init
28770 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 ialized) {...CAC
28780 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
28790 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e ("Error. Not in
287a0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 itialized.");...
287b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 .return(CKR_CRYP
287c0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c TOKI_NOT_INITIAL
287d0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b IZED);..}...CACK
287e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 EY_DEBUG_PRINTF(
287f0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 "Returning CKR_F
28800 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 UNCTION_NOT_SUPP
28810 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 ORTED (%i)", CKR
28820 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
28830 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 PPORTED);...retu
28840 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f rn(CKR_FUNCTION_
28850 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
28860 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e }..CK_DEFINE_FUN
28870 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 CTION(CK_RV, C_D
28880 69 67 65 73 74 45 6e 63 72 79 70 74 55 70 64 61 igestEncryptUpda
28890 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 te)(CK_SESSION_H
288a0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 ANDLE hSession,
288b0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 CK_BYTE_PTR pPar
288c0 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 t, CK_ULONG ulPa
288d0 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 rtLen, CK_BYTE_P
288e0 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 TR pEncryptedPar
288f0 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 t, CK_ULONG_PTR
28900 70 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 pulEncryptedPart
28910 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 Len) {..CACKEY_D
28920 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
28930 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 led.");...if (!c
28940 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 ackey_initialize
28950 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 d) {...CACKEY_DE
28960 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
28970 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 r. Not initiali
28980 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 zed.");....retur
28990 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e n(CKR_CRYPTOKI_N
289a0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b OT_INITIALIZED);
289b0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 ..}...CACKEY_DEB
289c0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
289d0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f ning CKR_FUNCTIO
289e0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 N_NOT_SUPPORTED
289f0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 (%i)", CKR_FUNCT
28a00 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
28a10 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 D);...return(CKR
28a20 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
28a30 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f PPORTED);.}..CK_
28a40 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 DEFINE_FUNCTION(
28a50 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 CK_RV, C_Decrypt
28a60 44 69 67 65 73 74 55 70 64 61 74 65 29 28 43 4b DigestUpdate)(CK
28a70 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 _SESSION_HANDLE
28a80 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 hSession, CK_BYT
28a90 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 E_PTR pEncrypted
28aa0 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 Part, CK_ULONG u
28ab0 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 lEncryptedPartLe
28ac0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 n, CK_BYTE_PTR p
28ad0 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 Part, CK_ULONG_P
28ae0 54 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b TR pulPartLen) {
28af0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
28b00 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
28b10 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f ;...if (!cackey_
28b20 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 initialized) {..
28b30 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
28b40 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f INTF("Error. No
28b50 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 t initialized.")
28b60 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
28b70 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 CRYPTOKI_NOT_INI
28b80 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 TIALIZED);..}...
28b90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
28ba0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 NTF("Returning C
28bb0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
28bc0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c SUPPORTED (%i)",
28bd0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f CKR_FUNCTION_NO
28be0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 T_SUPPORTED);...
28bf0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 return(CKR_FUNCT
28c00 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
28c10 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 D);.}..CK_DEFINE
28c20 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c _FUNCTION(CK_RV,
28c30 20 43 5f 53 69 67 6e 45 6e 63 72 79 70 74 55 70 C_SignEncryptUp
28c40 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e date)(CK_SESSION
28c50 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e _HANDLE hSession
28c60 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 , CK_BYTE_PTR pP
28c70 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c art, CK_ULONG ul
28c80 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 PartLen, CK_BYTE
28c90 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 _PTR pEncryptedP
28ca0 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 art, CK_ULONG_PT
28cb0 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64 50 61 R pulEncryptedPa
28cc0 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 rtLen) {..CACKEY
28cd0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 _DEBUG_PRINTF("C
28ce0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 alled.");...if (
28cf0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 !cackey_initiali
28d00 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f zed) {...CACKEY_
28d10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
28d20 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 ror. Not initia
28d30 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 lized.");....ret
28d40 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 urn(CKR_CRYPTOKI
28d50 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 _NOT_INITIALIZED
28d60 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 );..}...CACKEY_D
28d70 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
28d80 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 urning CKR_FUNCT
28d90 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
28da0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e D (%i)", CKR_FUN
28db0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
28dc0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 TED);...return(C
28dd0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
28de0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 SUPPORTED);.}..C
28df0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f K_DEFINE_FUNCTIO
28e00 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 N(CK_RV, C_Decry
28e10 70 74 56 65 72 69 66 79 55 70 64 61 74 65 29 28 ptVerifyUpdate)(
28e20 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c CK_SESSION_HANDL
28e30 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 E hSession, CK_B
28e40 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 YTE_PTR pEncrypt
28e50 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 edPart, CK_ULONG
28e60 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 ulEncryptedPart
28e70 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 Len, CK_BYTE_PTR
28e80 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 pPart, CK_ULONG
28e90 5f 50 54 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 _PTR pulPartLen)
28ea0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 {..CACKEY_DEBUG
28eb0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e _PRINTF("Called.
28ec0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 ");...if (!cacke
28ed0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b y_initialized) {
28ee0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
28ef0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 PRINTF("Error.
28f00 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e Not initialized.
28f10 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b ");....return(CK
28f20 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 R_CRYPTOKI_NOT_I
28f30 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a NITIALIZED);..}.
28f40 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
28f50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 RINTF("Returning
28f60 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f CKR_FUNCTION_NO
28f70 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 T_SUPPORTED (%i)
28f80 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f ", CKR_FUNCTION_
28f90 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a NOT_SUPPORTED);.
28fa0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e ..return(CKR_FUN
28fb0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
28fc0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 TED);.}..CK_DEFI
28fd0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 NE_FUNCTION(CK_R
28fe0 56 2c 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 V, C_GenerateKey
28ff0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e )(CK_SESSION_HAN
29000 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b DLE hSession, CK
29010 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 _MECHANISM_PTR p
29020 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 41 54 Mechanism, CK_AT
29030 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d TRIBUTE_PTR pTem
29040 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 plate, CK_ULONG
29050 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 ulCount, CK_OBJE
29060 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 CT_HANDLE_PTR ph
29070 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 Key) {..CACKEY_D
29080 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
29090 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 led.");...if (!c
290a0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 ackey_initialize
290b0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 d) {...CACKEY_DE
290c0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
290d0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 r. Not initiali
290e0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 zed.");....retur
290f0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e n(CKR_CRYPTOKI_N
29100 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b OT_INITIALIZED);
29110 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 ..}...CACKEY_DEB
29120 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
29130 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f ning CKR_FUNCTIO
29140 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 N_NOT_SUPPORTED
29150 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 (%i)", CKR_FUNCT
29160 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
29170 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 D);...return(CKR
29180 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
29190 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f PPORTED);.}..CK_
291a0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 DEFINE_FUNCTION(
291b0 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61 74 CK_RV, C_Generat
291c0 65 4b 65 79 50 61 69 72 29 28 43 4b 5f 53 45 53 eKeyPair)(CK_SES
291d0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 SION_HANDLE hSes
291e0 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 sion, CK_MECHANI
291f0 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 SM_PTR pMechanis
29200 6d 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f m, CK_ATTRIBUTE_
29210 50 54 52 20 70 50 75 62 6c 69 63 4b 65 79 54 65 PTR pPublicKeyTe
29220 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 mplate, CK_ULONG
29230 20 75 6c 50 75 62 6c 69 63 4b 65 79 41 74 74 72 ulPublicKeyAttr
29240 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 41 ibuteCount, CK_A
29250 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 50 72 TTRIBUTE_PTR pPr
29260 69 76 61 74 65 4b 65 79 54 65 6d 70 6c 61 74 65 ivateKeyTemplate
29270 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 72 69 , CK_ULONG ulPri
29280 76 61 74 65 4b 65 79 41 74 74 72 69 62 75 74 65 vateKeyAttribute
29290 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 Count, CK_OBJECT
292a0 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 50 75 _HANDLE_PTR phPu
292b0 62 6c 69 63 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 blicKey, CK_OBJE
292c0 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 CT_HANDLE_PTR ph
292d0 50 72 69 76 61 74 65 4b 65 79 29 20 7b 0a 09 43 PrivateKey) {..C
292e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
292f0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
29300 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 .if (!cackey_ini
29310 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 tialized) {...CA
29320 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 CKEY_DEBUG_PRINT
29330 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 F("Error. Not i
29340 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a nitialized.");..
29350 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 ..return(CKR_CRY
29360 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 PTOKI_NOT_INITIA
29370 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 LIZED);..}...CAC
29380 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 KEY_DEBUG_PRINTF
29390 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f ("Returning CKR_
293a0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 FUNCTION_NOT_SUP
293b0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b PORTED (%i)", CK
293c0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 R_FUNCTION_NOT_S
293d0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 UPPORTED);...ret
293e0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e urn(CKR_FUNCTION
293f0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b _NOT_SUPPORTED);
29400 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 .}..CK_DEFINE_FU
29410 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f NCTION(CK_RV, C_
29420 57 72 61 70 4b 65 79 29 28 43 4b 5f 53 45 53 53 WrapKey)(CK_SESS
29430 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 ION_HANDLE hSess
29440 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 ion, CK_MECHANIS
29450 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d M_PTR pMechanism
29460 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 , CK_OBJECT_HAND
29470 4c 45 20 68 57 72 61 70 70 69 6e 67 4b 65 79 2c LE hWrappingKey,
29480 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c CK_OBJECT_HANDL
29490 45 20 68 4b 65 79 2c 20 43 4b 5f 42 59 54 45 5f E hKey, CK_BYTE_
294a0 50 54 52 20 70 57 72 61 70 70 65 64 4b 65 79 2c PTR pWrappedKey,
294b0 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 CK_ULONG_PTR pu
294c0 6c 57 72 61 70 70 65 64 4b 65 79 4c 65 6e 29 20 lWrappedKeyLen)
294d0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f {..CACKEY_DEBUG_
294e0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 PRINTF("Called."
294f0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 );...if (!cackey
29500 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a _initialized) {.
29510 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
29520 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e RINTF("Error. N
29530 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 ot initialized."
29540 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 );....return(CKR
29550 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e _CRYPTOKI_NOT_IN
29560 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a ITIALIZED);..}..
29570 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
29580 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
29590 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
295a0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 _SUPPORTED (%i)"
295b0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e , CKR_FUNCTION_N
295c0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a OT_SUPPORTED);..
295d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 .return(CKR_FUNC
295e0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
295f0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e ED);.}..CK_DEFIN
29600 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 E_FUNCTION(CK_RV
29610 2c 20 43 5f 55 6e 77 72 61 70 4b 65 79 29 28 43 , C_UnwrapKey)(C
29620 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 K_SESSION_HANDLE
29630 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 hSession, CK_ME
29640 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 CHANISM_PTR pMec
29650 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 hanism, CK_OBJEC
29660 54 5f 48 41 4e 44 4c 45 20 68 55 6e 77 72 61 70 T_HANDLE hUnwrap
29670 70 69 6e 67 4b 65 79 2c 20 43 4b 5f 42 59 54 45 pingKey, CK_BYTE
29680 5f 50 54 52 20 70 57 72 61 70 70 65 64 4b 65 79 _PTR pWrappedKey
29690 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 57 72 61 , CK_ULONG ulWra
296a0 70 70 65 64 4b 65 79 4c 65 6e 2c 20 43 4b 5f 41 ppedKeyLen, CK_A
296b0 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 TTRIBUTE_PTR pTe
296c0 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 mplate, CK_ULONG
296d0 20 75 6c 41 74 74 72 69 62 75 74 65 43 6f 75 6e ulAttributeCoun
296e0 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e t, CK_OBJECT_HAN
296f0 44 4c 45 5f 50 54 52 20 70 68 4b 65 79 29 20 7b DLE_PTR phKey) {
29700 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 ..CACKEY_DEBUG_P
29710 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 RINTF("Called.")
29720 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f ;...if (!cackey_
29730 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 initialized) {..
29740 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
29750 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f INTF("Error. No
29760 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 t initialized.")
29770 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f ;....return(CKR_
29780 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 CRYPTOKI_NOT_INI
29790 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 TIALIZED);..}...
297a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 CACKEY_DEBUG_PRI
297b0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 NTF("Returning C
297c0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
297d0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c SUPPORTED (%i)",
297e0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f CKR_FUNCTION_NO
297f0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 T_SUPPORTED);...
29800 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 return(CKR_FUNCT
29810 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
29820 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 D);.}..CK_DEFINE
29830 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c _FUNCTION(CK_RV,
29840 20 43 5f 44 65 72 69 76 65 4b 65 79 29 28 43 4b C_DeriveKey)(CK
29850 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 _SESSION_HANDLE
29860 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 hSession, CK_MEC
29870 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 HANISM_PTR pMech
29880 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 anism, CK_OBJECT
29890 5f 48 41 4e 44 4c 45 20 68 42 61 73 65 4b 65 79 _HANDLE hBaseKey
298a0 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 , CK_ATTRIBUTE_P
298b0 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b TR pTemplate, CK
298c0 5f 55 4c 4f 4e 47 20 75 6c 41 74 74 72 69 62 75 _ULONG ulAttribu
298d0 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 teCount, CK_OBJE
298e0 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 CT_HANDLE_PTR ph
298f0 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 Key) {..CACKEY_D
29900 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c EBUG_PRINTF("Cal
29910 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 led.");...if (!c
29920 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 ackey_initialize
29930 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 d) {...CACKEY_DE
29940 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f BUG_PRINTF("Erro
29950 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 r. Not initiali
29960 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 zed.");....retur
29970 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e n(CKR_CRYPTOKI_N
29980 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b OT_INITIALIZED);
29990 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 ..}...CACKEY_DEB
299a0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 UG_PRINTF("Retur
299b0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f ning CKR_FUNCTIO
299c0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 N_NOT_SUPPORTED
299d0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 (%i)", CKR_FUNCT
299e0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
299f0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 D);...return(CKR
29a00 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 _FUNCTION_NOT_SU
29a10 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f PPORTED);.}..CK_
29a20 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 DEFINE_FUNCTION(
29a30 43 4b 5f 52 56 2c 20 43 5f 53 65 65 64 52 61 6e CK_RV, C_SeedRan
29a40 64 6f 6d 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f dom)(CK_SESSION_
29a50 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c HANDLE hSession,
29a60 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 65 CK_BYTE_PTR pSe
29a70 65 64 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 ed, CK_ULONG ulS
29a80 65 65 64 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 eedLen) {..CACKE
29a90 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 Y_DEBUG_PRINTF("
29aa0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 Called.");...if
29ab0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c (!cackey_initial
29ac0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 ized) {...CACKEY
29ad0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 _DEBUG_PRINTF("E
29ae0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 rror. Not initi
29af0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 alized.");....re
29b00 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b turn(CKR_CRYPTOK
29b10 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 I_NOT_INITIALIZE
29b20 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f D);..}...CACKEY_
29b30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
29b40 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 turning CKR_FUNC
29b50 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 TION_NOT_SUPPORT
29b60 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 ED (%i)", CKR_FU
29b70 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f NCTION_NOT_SUPPO
29b80 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 RTED);...return(
29b90 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
29ba0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a _SUPPORTED);.}..
29bb0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 CK_DEFINE_FUNCTI
29bc0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 ON(CK_RV, C_Gene
29bd0 72 61 74 65 52 61 6e 64 6f 6d 29 28 43 4b 5f 53 rateRandom)(CK_S
29be0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 ESSION_HANDLE hS
29bf0 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f ession, CK_BYTE_
29c00 50 54 52 20 70 52 61 6e 64 6f 6d 44 61 74 61 2c PTR pRandomData,
29c10 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 52 61 6e 64 CK_ULONG ulRand
29c20 6f 6d 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 omLen) {..CACKEY
29c30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 _DEBUG_PRINTF("C
29c40 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 alled.");...if (
29c50 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 !cackey_initiali
29c60 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f zed) {...CACKEY_
29c70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 DEBUG_PRINTF("Er
29c80 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 ror. Not initia
29c90 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 lized.");....ret
29ca0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 urn(CKR_CRYPTOKI
29cb0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 _NOT_INITIALIZED
29cc0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 );..}...CACKEY_D
29cd0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 EBUG_PRINTF("Ret
29ce0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 urning CKR_FUNCT
29cf0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 ION_NOT_SUPPORTE
29d00 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e D (%i)", CKR_FUN
29d10 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 CTION_NOT_SUPPOR
29d20 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 TED);...return(C
29d30 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f KR_FUNCTION_NOT_
29d40 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 2f SUPPORTED);.}../
29d50 2a 20 44 65 70 72 65 63 61 74 65 64 20 46 75 6e * Deprecated Fun
29d60 63 74 69 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 46 49 ction */.CK_DEFI
29d70 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 NE_FUNCTION(CK_R
29d80 56 2c 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e V, C_GetFunction
29d90 53 74 61 74 75 73 29 28 43 4b 5f 53 45 53 53 49 Status)(CK_SESSI
29da0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 ON_HANDLE hSessi
29db0 6f 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 on) {..CACKEY_DE
29dc0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c BUG_PRINTF("Call
29dd0 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f ed.");...CACKEY_
29de0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 DEBUG_PRINTF("Re
29df0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 turning CKR_FUNC
29e00 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 TION_NOT_PARALLE
29e10 4c 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e L (%i)", CKR_FUN
29e20 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c CTION_NOT_PARALL
29e30 45 4c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b EL);...return(CK
29e40 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 R_FUNCTION_NOT_P
29e50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65 73 ARALLEL);...hSes
29e60 73 69 6f 6e 20 3d 20 68 53 65 73 73 69 6f 6e 3b sion = hSession;
29e70 20 2f 2a 20 53 75 70 72 65 73 73 20 75 6e 75 73 /* Supress unus
29e80 65 64 20 76 61 72 69 61 62 6c 65 20 77 61 72 6e ed variable warn
29e90 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 20 44 65 70 ing */.}../* Dep
29ea0 72 65 63 61 74 65 64 20 46 75 6e 63 74 69 6f 6e recated Function
29eb0 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 */.CK_DEFINE_FU
29ec0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f NCTION(CK_RV, C_
29ed0 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 29 28 CancelFunction)(
29ee0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c CK_SESSION_HANDL
29ef0 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 E hSession) {..C
29f00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e ACKEY_DEBUG_PRIN
29f10 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a TF("Called.");..
29f20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
29f30 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
29f40 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 CKR_FUNCTION_NOT
29f50 5f 50 41 52 41 4c 4c 45 4c 20 28 25 69 29 22 2c _PARALLEL (%i)",
29f60 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f CKR_FUNCTION_NO
29f70 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72 T_PARALLEL);...r
29f80 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 eturn(CKR_FUNCTI
29f90 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 ON_NOT_PARALLEL)
29fa0 3b 0a 0a 09 68 53 65 73 73 69 6f 6e 20 3d 20 68 ;...hSession = h
29fb0 53 65 73 73 69 6f 6e 3b 20 2f 2a 20 53 75 70 72 Session; /* Supr
29fc0 65 73 73 20 75 6e 75 73 65 64 20 76 61 72 69 61 ess unused varia
29fd0 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d ble warning */.}
29fe0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 ..CK_DEFINE_FUNC
29ff0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 TION(CK_RV, C_Ge
2a000 74 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 28 43 tFunctionList)(C
2a010 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f K_FUNCTION_LIST_
2a020 50 54 52 5f 50 54 52 20 70 70 46 75 6e 63 74 69 PTR_PTR ppFuncti
2a030 6f 6e 4c 69 73 74 29 20 7b 0a 09 43 4b 5f 46 55 onList) {..CK_FU
2a040 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 20 NCTION_LIST_PTR
2a050 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a pFunctionList;..
2a060 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
2a070 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b INTF("Called.");
2a080 0a 0a 09 69 66 20 28 70 70 46 75 6e 63 74 69 6f ...if (ppFunctio
2a090 6e 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b nList == NULL) {
2a0a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f ...CACKEY_DEBUG_
2a0b0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 PRINTF("Error. p
2a0c0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 69 73 pFunctionList is
2a0d0 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 NULL.");....ret
2a0e0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 urn(CKR_ARGUMENT
2a0f0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 70 46 75 S_BAD);..}...pFu
2a100 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 6d 61 6c nctionList = mal
2a110 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 46 75 6e loc(sizeof(*pFun
2a120 63 74 69 6f 6e 4c 69 73 74 29 29 3b 0a 0a 09 70 ctionList));...p
2a130 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 FunctionList->ve
2a140 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 rsion.major = ((
2a150 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f CACKEY_CRYPTOKI_
2a160 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e VERSION_CODE) >>
2a170 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70 46 16) & 0xff;..pF
2a180 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72 unctionList->ver
2a190 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 sion.minor = ((C
2a1a0 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 ACKEY_CRYPTOKI_V
2a1b0 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 ERSION_CODE) >>
2a1c0 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 46 75 8) & 0xff;...pFu
2a1d0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e nctionList->C_In
2a1e0 69 74 69 61 6c 69 7a 65 20 3d 20 43 5f 49 6e 69 itialize = C_Ini
2a1f0 74 69 61 6c 69 7a 65 3b 0a 09 70 46 75 6e 63 74 tialize;..pFunct
2a200 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 61 6c ionList->C_Final
2a210 69 7a 65 20 3d 20 43 5f 46 69 6e 61 6c 69 7a 65 ize = C_Finalize
2a220 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 ;..pFunctionList
2a230 2d 3e 43 5f 47 65 74 49 6e 66 6f 20 3d 20 43 5f ->C_GetInfo = C_
2a240 47 65 74 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 GetInfo;..pFunct
2a250 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c ionList->C_GetSl
2a260 6f 74 4c 69 73 74 20 3d 20 43 5f 47 65 74 53 6c otList = C_GetSl
2a270 6f 74 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74 69 otList;..pFuncti
2a280 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f onList->C_GetSlo
2a290 74 49 6e 66 6f 20 3d 20 43 5f 47 65 74 53 6c 6f tInfo = C_GetSlo
2a2a0 74 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f tInfo;..pFunctio
2a2b0 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 54 6f 6b 65 nList->C_GetToke
2a2c0 6e 49 6e 66 6f 20 3d 20 43 5f 47 65 74 54 6f 6b nInfo = C_GetTok
2a2d0 65 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 enInfo;..pFuncti
2a2e0 6f 6e 4c 69 73 74 2d 3e 43 5f 57 61 69 74 46 6f onList->C_WaitFo
2a2f0 72 53 6c 6f 74 45 76 65 6e 74 20 3d 20 43 5f 57 rSlotEvent = C_W
2a300 61 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74 3b aitForSlotEvent;
2a310 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d ..pFunctionList-
2a320 3e 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c >C_GetMechanismL
2a330 69 73 74 20 3d 20 43 5f 47 65 74 4d 65 63 68 61 ist = C_GetMecha
2a340 6e 69 73 6d 4c 69 73 74 3b 0a 09 70 46 75 6e 63 nismList;..pFunc
2a350 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4d tionList->C_GetM
2a360 65 63 68 61 6e 69 73 6d 49 6e 66 6f 20 3d 20 43 echanismInfo = C
2a370 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 _GetMechanismInf
2a380 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 o;..pFunctionLis
2a390 74 2d 3e 43 5f 49 6e 69 74 54 6f 6b 65 6e 20 3d t->C_InitToken =
2a3a0 20 43 5f 49 6e 69 74 54 6f 6b 65 6e 3b 0a 09 70 C_InitToken;..p
2a3b0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f FunctionList->C_
2a3c0 49 6e 69 74 50 49 4e 20 3d 20 43 5f 49 6e 69 74 InitPIN = C_Init
2a3d0 50 49 4e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c PIN;..pFunctionL
2a3e0 69 73 74 2d 3e 43 5f 53 65 74 50 49 4e 20 3d 20 ist->C_SetPIN =
2a3f0 43 5f 53 65 74 50 49 4e 3b 0a 09 70 46 75 6e 63 C_SetPIN;..pFunc
2a400 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4f 70 65 6e tionList->C_Open
2a410 53 65 73 73 69 6f 6e 20 3d 20 43 5f 4f 70 65 6e Session = C_Open
2a420 53 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 Session;..pFunct
2a430 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 ionList->C_Close
2a440 53 65 73 73 69 6f 6e 20 3d 20 43 5f 43 6c 6f 73 Session = C_Clos
2a450 65 53 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 eSession;..pFunc
2a460 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 tionList->C_Clos
2a470 65 41 6c 6c 53 65 73 73 69 6f 6e 73 20 3d 20 43 eAllSessions = C
2a480 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e _CloseAllSession
2a490 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 s;..pFunctionLis
2a4a0 74 2d 3e 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 t->C_GetSessionI
2a4b0 6e 66 6f 20 3d 20 43 5f 47 65 74 53 65 73 73 69 nfo = C_GetSessi
2a4c0 6f 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 onInfo;..pFuncti
2a4d0 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 70 65 onList->C_GetOpe
2a4e0 72 61 74 69 6f 6e 53 74 61 74 65 20 3d 20 43 5f rationState = C_
2a4f0 47 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 GetOperationStat
2a500 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 e;..pFunctionLis
2a510 74 2d 3e 43 5f 53 65 74 4f 70 65 72 61 74 69 6f t->C_SetOperatio
2a520 6e 53 74 61 74 65 20 3d 20 43 5f 53 65 74 4f 70 nState = C_SetOp
2a530 65 72 61 74 69 6f 6e 53 74 61 74 65 3b 0a 09 70 erationState;..p
2a540 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f FunctionList->C_
2a550 4c 6f 67 69 6e 20 3d 20 43 5f 4c 6f 67 69 6e 3b Login = C_Login;
2a560 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d ..pFunctionList-
2a570 3e 43 5f 4c 6f 67 6f 75 74 20 3d 20 43 5f 4c 6f >C_Logout = C_Lo
2a580 67 6f 75 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e gout;..pFunction
2a590 4c 69 73 74 2d 3e 43 5f 43 72 65 61 74 65 4f 62 List->C_CreateOb
2a5a0 6a 65 63 74 20 3d 20 43 5f 43 72 65 61 74 65 4f ject = C_CreateO
2a5b0 62 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f bject;..pFunctio
2a5c0 6e 4c 69 73 74 2d 3e 43 5f 43 6f 70 79 4f 62 6a nList->C_CopyObj
2a5d0 65 63 74 20 3d 20 43 5f 43 6f 70 79 4f 62 6a 65 ect = C_CopyObje
2a5e0 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 ct;..pFunctionLi
2a5f0 73 74 2d 3e 43 5f 44 65 73 74 72 6f 79 4f 62 6a st->C_DestroyObj
2a600 65 63 74 20 3d 20 43 5f 44 65 73 74 72 6f 79 4f ect = C_DestroyO
2a610 62 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f bject;..pFunctio
2a620 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 62 6a 65 nList->C_GetObje
2a630 63 74 53 69 7a 65 20 3d 20 43 5f 47 65 74 4f 62 ctSize = C_GetOb
2a640 6a 65 63 74 53 69 7a 65 3b 0a 09 70 46 75 6e 63 jectSize;..pFunc
2a650 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 41 tionList->C_GetA
2a660 74 74 72 69 62 75 74 65 56 61 6c 75 65 20 3d 20 ttributeValue =
2a670 43 5f 47 65 74 41 74 74 72 69 62 75 74 65 56 61 C_GetAttributeVa
2a680 6c 75 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c lue;..pFunctionL
2a690 69 73 74 2d 3e 43 5f 53 65 74 41 74 74 72 69 62 ist->C_SetAttrib
2a6a0 75 74 65 56 61 6c 75 65 20 3d 20 43 5f 53 65 74 uteValue = C_Set
2a6b0 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 3b 0a AttributeValue;.
2a6c0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e .pFunctionList->
2a6d0 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 C_FindObjectsIni
2a6e0 74 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 t = C_FindObject
2a6f0 73 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f sInit;..pFunctio
2a700 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a nList->C_FindObj
2a710 65 63 74 73 20 3d 20 43 5f 46 69 6e 64 4f 62 6a ects = C_FindObj
2a720 65 63 74 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e ects;..pFunction
2a730 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 List->C_FindObje
2a740 63 74 73 46 69 6e 61 6c 20 3d 20 43 5f 46 69 6e ctsFinal = C_Fin
2a750 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c 3b 0a 09 dObjectsFinal;..
2a760 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 pFunctionList->C
2a770 5f 45 6e 63 72 79 70 74 49 6e 69 74 20 3d 20 43 _EncryptInit = C
2a780 5f 45 6e 63 72 79 70 74 49 6e 69 74 3b 0a 09 70 _EncryptInit;..p
2a790 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f FunctionList->C_
2a7a0 45 6e 63 72 79 70 74 20 3d 20 43 5f 45 6e 63 72 Encrypt = C_Encr
2a7b0 79 70 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c ypt;..pFunctionL
2a7c0 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 55 70 ist->C_EncryptUp
2a7d0 64 61 74 65 20 3d 20 43 5f 45 6e 63 72 79 70 74 date = C_Encrypt
2a7e0 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 Update;..pFuncti
2a7f0 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 onList->C_Encryp
2a800 74 46 69 6e 61 6c 20 3d 20 43 5f 45 6e 63 72 79 tFinal = C_Encry
2a810 70 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 ptFinal;..pFunct
2a820 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 ionList->C_Decry
2a830 70 74 49 6e 69 74 20 3d 20 43 5f 44 65 63 72 79 ptInit = C_Decry
2a840 70 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 ptInit;..pFuncti
2a850 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 onList->C_Decryp
2a860 74 20 3d 20 43 5f 44 65 63 72 79 70 74 3b 0a 09 t = C_Decrypt;..
2a870 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 pFunctionList->C
2a880 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 20 3d _DecryptUpdate =
2a890 20 43 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 C_DecryptUpdate
2a8a0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 ;..pFunctionList
2a8b0 2d 3e 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c ->C_DecryptFinal
2a8c0 20 3d 20 43 5f 44 65 63 72 79 70 74 46 69 6e 61 = C_DecryptFina
2a8d0 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 l;..pFunctionLis
2a8e0 74 2d 3e 43 5f 44 69 67 65 73 74 49 6e 69 74 20 t->C_DigestInit
2a8f0 3d 20 43 5f 44 69 67 65 73 74 49 6e 69 74 3b 0a = C_DigestInit;.
2a900 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e .pFunctionList->
2a910 43 5f 44 69 67 65 73 74 20 3d 20 43 5f 44 69 67 C_Digest = C_Dig
2a920 65 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c est;..pFunctionL
2a930 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 55 70 64 ist->C_DigestUpd
2a940 61 74 65 20 3d 20 43 5f 44 69 67 65 73 74 55 70 ate = C_DigestUp
2a950 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e date;..pFunction
2a960 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 4b 65 List->C_DigestKe
2a970 79 20 3d 20 43 5f 44 69 67 65 73 74 4b 65 79 3b y = C_DigestKey;
2a980 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d ..pFunctionList-
2a990 3e 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 20 3d >C_DigestFinal =
2a9a0 20 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 3b 0a C_DigestFinal;.
2a9b0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e .pFunctionList->
2a9c0 43 5f 53 69 67 6e 49 6e 69 74 20 3d 20 43 5f 53 C_SignInit = C_S
2a9d0 69 67 6e 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 ignInit;..pFunct
2a9e0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 20 ionList->C_Sign
2a9f0 3d 20 43 5f 53 69 67 6e 3b 0a 09 70 46 75 6e 63 = C_Sign;..pFunc
2aa00 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e tionList->C_Sign
2aa10 55 70 64 61 74 65 20 3d 20 43 5f 53 69 67 6e 55 Update = C_SignU
2aa20 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f pdate;..pFunctio
2aa30 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 46 69 6e nList->C_SignFin
2aa40 61 6c 20 3d 20 43 5f 53 69 67 6e 46 69 6e 61 6c al = C_SignFinal
2aa50 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 ;..pFunctionList
2aa60 2d 3e 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 49 ->C_SignRecoverI
2aa70 6e 69 74 20 3d 20 43 5f 53 69 67 6e 52 65 63 6f nit = C_SignReco
2aa80 76 65 72 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 verInit;..pFunct
2aa90 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 52 ionList->C_SignR
2aaa0 65 63 6f 76 65 72 20 3d 20 43 5f 53 69 67 6e 52 ecover = C_SignR
2aab0 65 63 6f 76 65 72 3b 0a 09 70 46 75 6e 63 74 69 ecover;..pFuncti
2aac0 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 onList->C_Verify
2aad0 49 6e 69 74 20 3d 20 43 5f 56 65 72 69 66 79 49 Init = C_VerifyI
2aae0 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c nit;..pFunctionL
2aaf0 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 20 3d 20 ist->C_Verify =
2ab00 43 5f 56 65 72 69 66 79 3b 0a 09 70 46 75 6e 63 C_Verify;..pFunc
2ab10 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 tionList->C_Veri
2ab20 66 79 55 70 64 61 74 65 20 3d 20 43 5f 56 65 72 fyUpdate = C_Ver
2ab30 69 66 79 55 70 64 61 74 65 3b 0a 09 70 46 75 6e ifyUpdate;..pFun
2ab40 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 ctionList->C_Ver
2ab50 69 66 79 46 69 6e 61 6c 20 3d 20 43 5f 56 65 72 ifyFinal = C_Ver
2ab60 69 66 79 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 ifyFinal;..pFunc
2ab70 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 tionList->C_Veri
2ab80 66 79 52 65 63 6f 76 65 72 49 6e 69 74 20 3d 20 fyRecoverInit =
2ab90 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 49 C_VerifyRecoverI
2aba0 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c nit;..pFunctionL
2abb0 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 52 65 63 ist->C_VerifyRec
2abc0 6f 76 65 72 20 3d 20 43 5f 56 65 72 69 66 79 52 over = C_VerifyR
2abd0 65 63 6f 76 65 72 3b 0a 09 70 46 75 6e 63 74 69 ecover;..pFuncti
2abe0 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 onList->C_Digest
2abf0 45 6e 63 72 79 70 74 55 70 64 61 74 65 20 3d 20 EncryptUpdate =
2ac00 43 5f 44 69 67 65 73 74 45 6e 63 72 79 70 74 55 C_DigestEncryptU
2ac10 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f pdate;..pFunctio
2ac20 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 nList->C_Decrypt
2ac30 44 69 67 65 73 74 55 70 64 61 74 65 20 3d 20 43 DigestUpdate = C
2ac40 5f 44 65 63 72 79 70 74 44 69 67 65 73 74 55 70 _DecryptDigestUp
2ac50 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e date;..pFunction
2ac60 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 45 6e 63 72 List->C_SignEncr
2ac70 79 70 74 55 70 64 61 74 65 20 3d 20 43 5f 53 69 yptUpdate = C_Si
2ac80 67 6e 45 6e 63 72 79 70 74 55 70 64 61 74 65 3b gnEncryptUpdate;
2ac90 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d ..pFunctionList-
2aca0 3e 43 5f 44 65 63 72 79 70 74 56 65 72 69 66 79 >C_DecryptVerify
2acb0 55 70 64 61 74 65 20 3d 20 43 5f 44 65 63 72 79 Update = C_Decry
2acc0 70 74 56 65 72 69 66 79 55 70 64 61 74 65 3b 0a ptVerifyUpdate;.
2acd0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e .pFunctionList->
2ace0 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 20 3d 20 C_GenerateKey =
2acf0 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 3b 0a 09 C_GenerateKey;..
2ad00 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 pFunctionList->C
2ad10 5f 47 65 6e 65 72 61 74 65 4b 65 79 50 61 69 72 _GenerateKeyPair
2ad20 20 3d 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 = C_GenerateKey
2ad30 50 61 69 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e Pair;..pFunction
2ad40 4c 69 73 74 2d 3e 43 5f 57 72 61 70 4b 65 79 20 List->C_WrapKey
2ad50 3d 20 43 5f 57 72 61 70 4b 65 79 3b 0a 09 70 46 = C_WrapKey;..pF
2ad60 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 55 unctionList->C_U
2ad70 6e 77 72 61 70 4b 65 79 20 3d 20 43 5f 55 6e 77 nwrapKey = C_Unw
2ad80 72 61 70 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 rapKey;..pFuncti
2ad90 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 72 69 76 65 onList->C_Derive
2ada0 4b 65 79 20 3d 20 43 5f 44 65 72 69 76 65 4b 65 Key = C_DeriveKe
2adb0 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 y;..pFunctionLis
2adc0 74 2d 3e 43 5f 53 65 65 64 52 61 6e 64 6f 6d 20 t->C_SeedRandom
2add0 3d 20 43 5f 53 65 65 64 52 61 6e 64 6f 6d 3b 0a = C_SeedRandom;.
2ade0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e .pFunctionList->
2adf0 43 5f 47 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d C_GenerateRandom
2ae00 20 3d 20 43 5f 47 65 6e 65 72 61 74 65 52 61 6e = C_GenerateRan
2ae10 64 6f 6d 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c dom;..pFunctionL
2ae20 69 73 74 2d 3e 43 5f 47 65 74 46 75 6e 63 74 69 ist->C_GetFuncti
2ae30 6f 6e 53 74 61 74 75 73 20 3d 20 43 5f 47 65 74 onStatus = C_Get
2ae40 46 75 6e 63 74 69 6f 6e 53 74 61 74 75 73 3b 0a FunctionStatus;.
2ae50 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e .pFunctionList->
2ae60 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e C_CancelFunction
2ae70 20 3d 20 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74 = C_CancelFunct
2ae80 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c ion;..pFunctionL
2ae90 69 73 74 2d 3e 43 5f 47 65 74 46 75 6e 63 74 69 ist->C_GetFuncti
2aea0 6f 6e 4c 69 73 74 20 3d 20 43 5f 47 65 74 46 75 onList = C_GetFu
2aeb0 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 2a 70 nctionList;...*p
2aec0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 pFunctionList =
2aed0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a pFunctionList;..
2aee0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 .CACKEY_DEBUG_PR
2aef0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 INTF("Returning
2af00 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b CKR_OK (%i)", CK
2af10 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 R_OK);...return(
2af20 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a CKR_OK);.}..