blob: c6eef6423b9262fe88bd37306aef6bda8c322024 [file] [log] [blame]
Etienne Carriere9b7b70d2020-05-16 10:27:23 +02001// SPDX-License-Identifier: GPL-2.0
Etienne Carriere109c1d72019-01-09 11:02:02 +01002/*
3 * Copyright (c) 2018, Linaro Limited
Etienne Carriere109c1d72019-01-09 11:02:02 +01004 */
5
Vesa Jääskeläinen7b482a02021-05-02 13:52:07 +03006#include <assert.h>
Etienne Carrierefa7e34f2020-02-04 15:34:16 +01007#include <ck_debug.h>
Etienne Carriere109c1d72019-01-09 11:02:02 +01008#include <inttypes.h>
Vesa Jääskeläinenc95ee1e2021-03-06 12:20:12 +02009#ifdef OPENSSL_FOUND
10#include <openssl/evp.h>
11#endif
Etienne Carriere109c1d72019-01-09 11:02:02 +010012#include <pkcs11.h>
Etienne Carrierefa7e34f2020-02-04 15:34:16 +010013#include <stdio.h>
14#include <stdlib.h>
15#include <string.h>
Jens Wiklander5eac1932020-05-05 19:07:11 +020016#include <util.h>
Etienne Carriere109c1d72019-01-09 11:02:02 +010017
18#include "xtest_test.h"
19#include "xtest_helpers.h"
20
Ruchika Guptaab553aa2020-11-03 15:39:49 +053021#include <regression_4000_data.h>
22
Etienne Carriere3b5558a2020-03-12 09:55:26 +010023/*
Jens Wiklander5eac1932020-05-05 19:07:11 +020024 * Some PKCS#11 object resources used in the tests
25 */
26static const CK_BYTE cktest_aes128_key[16];
27
Jens Wiklander2d6dc932020-08-10 09:22:49 +020028static const CK_BYTE cktest_aes128_iv[16];
29
30static const CK_AES_CTR_PARAMS cktest_aes_ctr_params = {
31 .ulCounterBits = 1,
32};
33
34static CK_MECHANISM cktest_aes_ecb_mechanism = {
35 CKM_AES_ECB,
36 NULL, 0,
37};
38static CK_MECHANISM cktest_aes_cbc_mechanism = {
39 CKM_AES_CBC,
40 (CK_BYTE_PTR)cktest_aes128_iv, sizeof(cktest_aes128_iv),
41};
42static CK_MECHANISM cktest_aes_ctr_mechanism = {
43 CKM_AES_CTR,
44 (CK_BYTE_PTR)&cktest_aes_ctr_params, sizeof(cktest_aes_ctr_params),
45};
46static CK_MECHANISM cktest_aes_cts_mechanism = {
47 CKM_AES_CTS,
48 (CK_BYTE_PTR)cktest_aes128_iv, sizeof(cktest_aes128_iv),
49};
Ruchika Guptaab553aa2020-11-03 15:39:49 +053050static CK_MECHANISM cktest_hmac_md5_mechanism = {
51 CKM_MD5_HMAC, NULL, 0,
52};
53static CK_MECHANISM cktest_hmac_sha1_mechanism = {
54 CKM_SHA_1_HMAC, NULL, 0,
55};
56static CK_MECHANISM cktest_hmac_sha224_mechanism = {
57 CKM_SHA224_HMAC, NULL, 0,
58};
59static CK_MECHANISM cktest_hmac_sha256_mechanism = {
60 CKM_SHA256_HMAC, NULL, 0,
61};
62static CK_MECHANISM cktest_hmac_sha384_mechanism = {
63 CKM_SHA384_HMAC, NULL, 0,
64};
65static CK_MECHANISM cktest_hmac_sha512_mechanism = {
66 CKM_SHA512_HMAC, NULL, 0,
67};
Ruchika Gupta71bc7402020-12-11 18:17:27 +053068static CK_MECHANISM cktest_gensecret_keygen_mechanism = {
69 CKM_GENERIC_SECRET_KEY_GEN, NULL, 0,
70};
71static CK_MECHANISM cktest_aes_keygen_mechanism = {
72 CKM_AES_KEY_GEN, NULL, 0,
73};
Jens Wiklander2d6dc932020-08-10 09:22:49 +020074
Jens Wiklander5eac1932020-05-05 19:07:11 +020075/*
Etienne Carriere3b5558a2020-03-12 09:55:26 +010076 * Util to find a slot on which to open a session
77 */
78static CK_RV close_lib(void)
79{
80 return C_Finalize(0);
81}
82
83static CK_RV init_lib_and_find_token_slot(CK_SLOT_ID *slot)
84{
85 CK_RV rv = CKR_GENERAL_ERROR;
86 CK_SLOT_ID_PTR slots = NULL;
87 CK_ULONG count = 0;
88
89 rv = C_Initialize(0);
90 if (rv)
91 return rv;
92
93 rv = C_GetSlotList(CK_TRUE, NULL, &count);
94 if (rv != CKR_OK)
95 goto bail;
96
97 if (count < 1) {
98 rv = CKR_GENERAL_ERROR;
99 goto bail;
100 }
101
102 slots = malloc(count * sizeof(CK_SLOT_ID));
103 if (!slots) {
104 rv = CKR_HOST_MEMORY;
105 goto bail;
106 }
107
108 rv = C_GetSlotList(CK_TRUE, slots, &count);
109 if (rv)
110 goto bail;
111
112 /* Use the last slot */
113 *slot = slots[count - 1];
114
115bail:
116 free(slots);
117 if (rv)
118 close_lib();
119
120 return rv;
121}
122
Etienne Carriere61f89d82020-03-11 11:24:29 +0100123static void xtest_pkcs11_test_1000(ADBG_Case_t *c)
Etienne Carriere109c1d72019-01-09 11:02:02 +0100124{
125 CK_RV rv;
126
127 rv = C_Initialize(NULL);
128 if (!ADBG_EXPECT_CK_OK(c, rv))
129 return;
130
131 rv = C_Finalize(NULL);
132 if (!ADBG_EXPECT_CK_OK(c, rv))
133 return;
134
135 rv = C_Initialize(NULL);
136 if (!ADBG_EXPECT_CK_OK(c, rv))
137 return;
138
139 rv = C_Initialize(NULL);
140 ADBG_EXPECT_CK_RESULT(c, CKR_CRYPTOKI_ALREADY_INITIALIZED, rv);
141
142 rv = C_Finalize(NULL);
143 ADBG_EXPECT_CK_OK(c, rv);
Etienne Carriere21f4e3c2020-02-05 15:40:24 +0100144
145 rv = C_Finalize(NULL);
146 ADBG_EXPECT_CK_RESULT(c, CKR_CRYPTOKI_NOT_INITIALIZED, rv);
Etienne Carriere109c1d72019-01-09 11:02:02 +0100147}
148
Etienne Carriere61f89d82020-03-11 11:24:29 +0100149ADBG_CASE_DEFINE(pkcs11, 1000, xtest_pkcs11_test_1000,
150 "Initialize and close Cryptoki library");
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100151
Etienne Carriere61f89d82020-03-11 11:24:29 +0100152static void xtest_pkcs11_test_1001(ADBG_Case_t *c)
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100153{
154 CK_RV rv = CKR_GENERAL_ERROR;
155 CK_SLOT_ID_PTR slot_ids = NULL;
156 CK_ULONG slot_count = 0;
157 CK_ULONG present_slot_count = 0;
158 CK_INFO lib_info = { };
159 CK_SLOT_INFO slot_info = { };
Etienne Carriere6818d5f2020-03-04 15:34:50 +0100160 CK_TOKEN_INFO token_info = { };
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100161 CK_FUNCTION_LIST_PTR ckfunc_list = NULL;
162 size_t i = 0;
163 CK_SLOT_ID max_slot_id = 0;
Etienne Carriered3121292020-03-04 17:38:24 +0100164 CK_MECHANISM_TYPE_PTR mecha_types = NULL;
165 CK_ULONG mecha_count = 0;
166 CK_MECHANISM_INFO mecha_info = { };
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100167
168 rv = C_Initialize(NULL);
169 if (!ADBG_EXPECT_CK_OK(c, rv))
170 return;
171
Etienne Carrieree90a4e42020-03-02 12:04:08 +0100172 Do_ADBG_BeginSubCase(c, "Test C_GetFunctionList()");
173
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100174 rv = C_GetFunctionList(&ckfunc_list);
175 if (!ADBG_EXPECT_CK_OK(c, rv))
176 goto out;
177
178 if (!ADBG_EXPECT_NOT_NULL(c, ckfunc_list->C_GetInfo) ||
179 !ADBG_EXPECT_NOT_NULL(c, ckfunc_list->C_GetSlotList) ||
Etienne Carriere6818d5f2020-03-04 15:34:50 +0100180 !ADBG_EXPECT_NOT_NULL(c, ckfunc_list->C_GetSlotInfo) ||
Etienne Carriered3121292020-03-04 17:38:24 +0100181 !ADBG_EXPECT_NOT_NULL(c, ckfunc_list->C_GetTokenInfo) ||
182 !ADBG_EXPECT_NOT_NULL(c, ckfunc_list->C_GetMechanismList) ||
183 !ADBG_EXPECT_NOT_NULL(c, ckfunc_list->C_GetMechanismInfo))
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100184 goto out;
185
Etienne Carrieree90a4e42020-03-02 12:04:08 +0100186 Do_ADBG_EndSubCase(c, "Test C_GetFunctionList()");
187 Do_ADBG_BeginSubCase(c, "Test C_GetInfo()");
188
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100189 rv = C_GetInfo(&lib_info);
190 if (!ADBG_EXPECT_CK_OK(c, rv))
191 goto out;
192
Etienne Carrieree90a4e42020-03-02 12:04:08 +0100193 Do_ADBG_EndSubCase(c, "Test C_GetInfo()");
194 Do_ADBG_BeginSubCase(c, "Test C_GetSlotList()");
195
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100196 rv = C_GetSlotList(0, NULL, &slot_count);
197 if (!ADBG_EXPECT_CK_OK(c, rv))
198 goto out;
199
200 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, slot_count, !=, 0))
201 goto out;
202
Etienne Carrierede746332020-03-04 19:43:53 +0100203 if (slot_count > 1) {
204 /* Ensure case non-NULL-buffer and zero-count is tested */
205 CK_SLOT_ID id = 0;
206
207 slot_count = 0;
208 rv = C_GetSlotList(0, &id, &slot_count);
209 if (!ADBG_EXPECT_CK_RESULT(c, CKR_BUFFER_TOO_SMALL, rv))
210 goto out;
211 }
212
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100213 rv = C_GetSlotList(1, NULL, &present_slot_count);
214 if (!ADBG_EXPECT_CK_OK(c, rv))
215 goto out;
216
217 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, slot_count, ==,
218 present_slot_count))
219 goto out;
220
221 slot_ids = calloc(slot_count, sizeof(CK_SLOT_ID));
222 if (!ADBG_EXPECT_NOT_NULL(c, slot_ids))
223 goto out;
224
225 slot_count--;
226 rv = C_GetSlotList(1, slot_ids, &slot_count);
227 if (!ADBG_EXPECT_CK_RESULT(c, CKR_BUFFER_TOO_SMALL, rv))
228 goto out;
229
230 rv = C_GetSlotList(1, slot_ids, &slot_count);
231 if (!ADBG_EXPECT_CK_OK(c, rv))
232 goto out;
233
Etienne Carrieree90a4e42020-03-02 12:04:08 +0100234 Do_ADBG_EndSubCase(c, "Test C_GetSlotList()");
Etienne Carriere6818d5f2020-03-04 15:34:50 +0100235 Do_ADBG_BeginSubCase(c, "Test C_Get{Slot|Token}Info()");
Etienne Carrieree90a4e42020-03-02 12:04:08 +0100236
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100237 for (i = 0; i < slot_count; i++) {
238 CK_SLOT_ID slot = slot_ids[i];
239
240 rv = C_GetSlotInfo(slot, &slot_info);
241 if (!ADBG_EXPECT_CK_OK(c, rv))
242 goto out;
243
Etienne Carriere6818d5f2020-03-04 15:34:50 +0100244 rv = C_GetTokenInfo(slot, &token_info);
245 if (!ADBG_EXPECT_CK_OK(c, rv))
246 goto out;
247
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100248 if (max_slot_id < slot)
249 max_slot_id = slot;
250 }
251
Etienne Carriere6818d5f2020-03-04 15:34:50 +0100252 Do_ADBG_EndSubCase(c, "Test C_Get{Slot|Token}Info()");
Etienne Carriered3121292020-03-04 17:38:24 +0100253 Do_ADBG_BeginSubCase(c, "Test C_GetMechanism{List|Info}()");
254
255 for (i = 0; i < slot_count; i++) {
256 CK_SLOT_ID slot = slot_ids[i];
257 size_t j = 0;
258
259 mecha_count = 0;
260 rv = C_GetMechanismList(slot, NULL, &mecha_count);
261 if (!ADBG_EXPECT_CK_OK(c, rv))
262 goto out;
263
264 if (mecha_count == 0)
265 continue;
266
267 free(mecha_types);
268 mecha_types = calloc(mecha_count, sizeof(*mecha_types));
269 if (!ADBG_EXPECT_NOT_NULL(c, mecha_types))
270 goto out;
271
272 /* Test specific case: valid buffer reference with 0 count */
273 mecha_count = 0;
274 rv = C_GetMechanismList(slot, mecha_types, &mecha_count);
275 if (!ADBG_EXPECT_CK_RESULT(c, CKR_BUFFER_TOO_SMALL, rv))
276 goto out;
277
278 rv = C_GetMechanismList(slot, mecha_types, &mecha_count);
279 if (!ADBG_EXPECT_CK_OK(c, rv))
280 goto out;
281
282 for (j = 0; j < mecha_count; j++) {
283 rv = C_GetMechanismInfo(slot, mecha_types[j],
284 &mecha_info);
285 if (!ADBG_EXPECT_CK_OK(c, rv))
286 goto out;
287 }
288 }
289
290 Do_ADBG_EndSubCase(c, "Test C_GetMechanism{List|Info}()");
Vesa Jääskeläinen60298cc2021-01-19 09:06:00 +0200291 Do_ADBG_BeginSubCase(c, "Test C_GetMechanismList() with larger result buffer");
292
293 for (i = 0; i < slot_count; i++) {
294 CK_SLOT_ID slot = slot_ids[i];
295 CK_ULONG real_mecha_count = 0;
296 CK_ULONG alloc_mecha_count = 0;
297 uint8_t *data_ptr = NULL;
298 size_t j = 0;
299
300 rv = C_GetMechanismList(slot, NULL, &real_mecha_count);
301 if (!ADBG_EXPECT_CK_OK(c, rv))
302 goto out;
303
304 if (real_mecha_count == 0)
305 continue;
306
307 /* Allocate more memory for mechanisms than required */
308 alloc_mecha_count = real_mecha_count + 16;
309 mecha_count = alloc_mecha_count;
310
311 free(mecha_types);
312 mecha_types = calloc(mecha_count, sizeof(*mecha_types));
313 if (!ADBG_EXPECT_NOT_NULL(c, mecha_types))
314 goto out;
315 memset(mecha_types, 0xCC,
316 alloc_mecha_count * sizeof(*mecha_types));
317
318 rv = C_GetMechanismList(slot, mecha_types, &mecha_count);
319 if (!ADBG_EXPECT_CK_OK(c, rv))
320 goto out;
321
322 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, mecha_count, ==,
323 real_mecha_count))
324 goto out;
325
326 data_ptr = (uint8_t *)mecha_types;
327 for (j = real_mecha_count * sizeof(*mecha_types);
328 j < alloc_mecha_count * sizeof(*mecha_types); j++)
329 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, data_ptr[j], ==,
330 0xCC))
331 break;
332 }
333
334 Do_ADBG_EndSubCase(c, "Test C_GetMechanismList() with larger result buffer");
Etienne Carrieree90a4e42020-03-02 12:04:08 +0100335 Do_ADBG_BeginSubCase(c, "Test C_Get*Info() with invalid reference");
336
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100337 rv = C_GetSlotInfo(max_slot_id + 1, &slot_info);
338 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SLOT_ID_INVALID, rv))
339 goto out;
340
Etienne Carriere6818d5f2020-03-04 15:34:50 +0100341 rv = C_GetTokenInfo(max_slot_id + 1, &token_info);
342 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SLOT_ID_INVALID, rv))
343 goto out;
344
Etienne Carriered3121292020-03-04 17:38:24 +0100345 mecha_count = 1;
346 if (!mecha_types)
347 mecha_types = malloc(sizeof(*mecha_types));
348 if (!ADBG_EXPECT_NOT_NULL(c, mecha_types))
349 goto out;
350
351 rv = C_GetMechanismList(max_slot_id + 1, mecha_types, &mecha_count);
352 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SLOT_ID_INVALID, rv))
353 goto out;
354
355 rv = C_GetMechanismInfo(max_slot_id + 1, CKM_AES_KEY_GEN, &mecha_info);
356 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SLOT_ID_INVALID, rv))
357 goto out;
358
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100359 rv = C_GetSlotInfo(ULONG_MAX, &slot_info);
360 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SLOT_ID_INVALID, rv))
361 goto out;
362
Etienne Carriere6818d5f2020-03-04 15:34:50 +0100363 rv = C_GetTokenInfo(ULONG_MAX, &token_info);
364 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SLOT_ID_INVALID, rv))
365 goto out;
366
Etienne Carriered3121292020-03-04 17:38:24 +0100367 mecha_count = 1;
368 rv = C_GetMechanismList(ULONG_MAX, mecha_types, &mecha_count);
369 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SLOT_ID_INVALID, rv))
370 goto out;
371
372 rv = C_GetMechanismInfo(ULONG_MAX, CKM_AES_KEY_GEN, &mecha_info);
373 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SLOT_ID_INVALID, rv))
374 goto out;
375
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100376out:
Etienne Carrieree90a4e42020-03-02 12:04:08 +0100377 Do_ADBG_EndSubCase(c, NULL);
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100378 free(slot_ids);
Etienne Carriered3121292020-03-04 17:38:24 +0100379 free(mecha_types);
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100380
381 rv = C_Finalize(NULL);
382 ADBG_EXPECT_CK_OK(c, rv);
383}
384
Etienne Carriere61f89d82020-03-11 11:24:29 +0100385ADBG_CASE_DEFINE(pkcs11, 1001, xtest_pkcs11_test_1001,
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100386 "PKCS11: List PKCS#11 slots and get information from");
Etienne Carriere3b5558a2020-03-12 09:55:26 +0100387
388static void xtest_pkcs11_test_1002(ADBG_Case_t *c)
389{
390 CK_RV rv = CKR_GENERAL_ERROR;
391 CK_SLOT_ID slot = 0;
392 CK_SESSION_HANDLE session[3] = { 0 };
393 CK_FLAGS session_flags = 0;
394 CK_SESSION_INFO session_info = { };
395 CK_FUNCTION_LIST_PTR ckfunc_list = NULL;
396
397 rv = init_lib_and_find_token_slot(&slot);
398 if (!ADBG_EXPECT_CK_OK(c, rv))
399 return;
400
401 rv = C_GetFunctionList(&ckfunc_list);
402 if (!ADBG_EXPECT_CK_OK(c, rv) ||
403 !ADBG_EXPECT_NOT_NULL(c, ckfunc_list->C_OpenSession) ||
404 !ADBG_EXPECT_NOT_NULL(c, ckfunc_list->C_CloseSession) ||
405 !ADBG_EXPECT_NOT_NULL(c, ckfunc_list->C_CloseAllSessions) ||
406 !ADBG_EXPECT_NOT_NULL(c, ckfunc_list->C_GetSessionInfo))
407 goto bail;
408
409 Do_ADBG_BeginSubCase(c, "Test C_OpenSession()/C_GetSessionInfo()");
410
411 session_flags = CKF_RW_SESSION;
412
413 rv = C_OpenSession(slot, session_flags, NULL, 0, &session[0]);
Vesa Jääskeläinenc1378d92020-12-31 12:53:10 +0200414 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SESSION_PARALLEL_NOT_SUPPORTED, rv))
Etienne Carriere3b5558a2020-03-12 09:55:26 +0100415 goto bail;
416
417 session_flags = CKF_SERIAL_SESSION;
418
419 rv = C_OpenSession(slot, session_flags, NULL, 0, &session[0]);
420 if (!ADBG_EXPECT_CK_OK(c, rv))
421 goto bail;
422
423 rv = C_GetSessionInfo(session[0], &session_info);
424 if (!ADBG_EXPECT_CK_OK(c, rv) ||
425 !ADBG_EXPECT_COMPARE_UNSIGNED(c, session_info.slotID, ==, slot) ||
426 !ADBG_EXPECT_COMPARE_UNSIGNED(c, session_info.flags, ==,
427 session_flags) ||
428 !ADBG_EXPECT_COMPARE_UNSIGNED(c, session_info.state, ==,
429 CKS_RO_PUBLIC_SESSION) ||
430 !ADBG_EXPECT_COMPARE_UNSIGNED(c, session_info.ulDeviceError, ==, 0))
431 goto bail;
432
433 session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
434
435 rv = C_OpenSession(slot, session_flags, NULL, 0, &session[1]);
436 if (!ADBG_EXPECT_CK_OK(c, rv))
437 goto bail;
438
439 rv = C_GetSessionInfo(session[1], &session_info);
440 if (!ADBG_EXPECT_CK_OK(c, rv) ||
441 !ADBG_EXPECT_COMPARE_UNSIGNED(c, session_info.slotID, ==, slot) ||
442 !ADBG_EXPECT_COMPARE_UNSIGNED(c, session_info.flags, ==,
443 session_flags) ||
444 !ADBG_EXPECT_COMPARE_UNSIGNED(c, session_info.state, ==,
445 CKS_RW_PUBLIC_SESSION) ||
446 !ADBG_EXPECT_COMPARE_UNSIGNED(c, session_info.ulDeviceError, ==, 0))
447 goto bail;
448
449 rv = C_OpenSession(slot, session_flags, NULL, 0, &session[2]);
450 if (!ADBG_EXPECT_CK_OK(c, rv))
451 goto bail;
452
453 rv = C_GetSessionInfo(session[2], &session_info);
454 if (!ADBG_EXPECT_CK_OK(c, rv) ||
455 !ADBG_EXPECT_COMPARE_UNSIGNED(c, session_info.slotID, ==, slot) ||
456 !ADBG_EXPECT_COMPARE_UNSIGNED(c, session_info.flags, ==,
457 session_flags) ||
458 !ADBG_EXPECT_COMPARE_UNSIGNED(c, session_info.state, ==,
459 CKS_RW_PUBLIC_SESSION) ||
460 !ADBG_EXPECT_COMPARE_UNSIGNED(c, session_info.ulDeviceError, ==, 0))
461 goto bail;
462
463 Do_ADBG_EndSubCase(c, "Test C_OpenSession()/C_GetSessionInfo()");
464 Do_ADBG_BeginSubCase(c, "Test C_CloseSession()");
465
466 /* Close 2 of them */
467 rv = C_CloseSession(session[0]);
468 if (!ADBG_EXPECT_CK_OK(c, rv))
469 goto bail;
470
471 rv = C_GetSessionInfo(session[0], &session_info);
472 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SESSION_HANDLE_INVALID, rv))
473 goto bail;
474
475 rv = C_GetSessionInfo(session[1], &session_info);
476 if (!ADBG_EXPECT_CK_OK(c, rv))
477 goto bail;
478
479 rv = C_GetSessionInfo(session[2], &session_info);
480 if (!ADBG_EXPECT_CK_OK(c, rv))
481 goto bail;
482
483 /* Close all remaining sessions, later calls should failed on session */
484 rv = C_CloseAllSessions(slot);
485 if (!ADBG_EXPECT_CK_OK(c, rv))
486 goto bail;
487
488 rv = C_CloseSession(session[1]);
489 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SESSION_HANDLE_INVALID, rv))
490 goto bail;
491
492 rv = C_CloseSession(session[2]);
493 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SESSION_HANDLE_INVALID, rv))
494 goto bail;
495
496 rv = C_GetSessionInfo(session[1], &session_info);
497 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SESSION_HANDLE_INVALID, rv))
498 goto bail;
499
500 rv = C_GetSessionInfo(session[2], &session_info);
501 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SESSION_HANDLE_INVALID, rv))
502 goto bail;
503
504 /* Open a session, should be closed from library closure */
505 rv = C_OpenSession(slot, session_flags, NULL, 0, &session[0]);
506 if (!ADBG_EXPECT_CK_OK(c, rv))
507 goto bail;
508
509bail:
510 Do_ADBG_EndSubCase(c, NULL);
511 rv = close_lib();
512 ADBG_EXPECT_CK_OK(c, rv);
513}
514
515ADBG_CASE_DEFINE(pkcs11, 1002, xtest_pkcs11_test_1002,
516 "PKCS11: Open and close PKCS#11 sessions");
Jens Wiklander14f8e8d2020-04-14 17:01:24 +0200517
518/*
519 * Helpers for tests where we must log into the token.
520 * These define the genuine PINs and label to be used with the test token.
521 */
522static CK_UTF8CHAR test_token_so_pin[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8 , 9, 10, };
Jens Wiklander282a8a52020-04-14 17:01:36 +0200523static CK_UTF8CHAR test_token_user_pin[] = {
524 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
525};
Jens Wiklander14f8e8d2020-04-14 17:01:24 +0200526static CK_UTF8CHAR test_token_label[] = "PKCS11 TA test token";
527
528static CK_RV init_test_token(CK_SLOT_ID slot)
529{
530 return C_InitToken(slot, test_token_so_pin, sizeof(test_token_so_pin),
531 test_token_label);
532}
533
Jens Wiklander282a8a52020-04-14 17:01:36 +0200534/* Login as user, eventually reset user PIN if needed */
535static CK_RV init_user_test_token(CK_SLOT_ID slot)
536{
537 CK_FLAGS session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
538 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
539 CK_RV rv = CKR_GENERAL_ERROR;
540
541 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
542 if (rv)
543 return rv;
544
545 rv = C_Login(session, CKU_USER, test_token_user_pin,
546 sizeof(test_token_user_pin));
547 if (rv == CKR_OK) {
548 C_Logout(session);
549 C_CloseSession(session);
550 return rv;
551 }
552
553 rv = C_Login(session, CKU_SO, test_token_so_pin,
554 sizeof(test_token_so_pin));
555 if (rv) {
556 C_CloseSession(session);
557
558 rv = init_test_token(slot);
559 if (rv)
560 return rv;
561
562 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
563 if (rv)
564 return rv;
565
566 rv = C_Login(session, CKU_SO, test_token_so_pin,
567 sizeof(test_token_so_pin));
568 if (rv) {
569 C_CloseSession(session);
570 return rv;
571 }
572 }
573
574 rv = C_InitPIN(session, test_token_user_pin,
575 sizeof(test_token_user_pin));
576
577 C_Logout(session);
578 C_CloseSession(session);
579
580 return rv;
581}
582
Jens Wiklander14f8e8d2020-04-14 17:01:24 +0200583static CK_RV test_already_initialized_token(ADBG_Case_t *c, CK_SLOT_ID slot)
584{
585 CK_RV rv = CKR_GENERAL_ERROR;
586 CK_TOKEN_INFO token_info = { };
587 /* Same content as test_token_so_pin[] but 1 more byte */
588 CK_UTF8CHAR pin1[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, };
589 /* Same content as test_token_so_pin[] but 1 different byte */
590 CK_UTF8CHAR pin2[] = { 0, 1, 2, 3, 4, 5, 6, 6, 8, 9, 10, };
591 CK_FLAGS flags = 0;
592
593 Do_ADBG_BeginSubCase(c, "C_InitToken() on initialized token");
594
595 rv = C_GetTokenInfo(slot, &token_info);
596 if (!ADBG_EXPECT_CK_OK(c, rv))
597 goto out;
598
599 rv = C_InitToken(slot, test_token_so_pin,
600 sizeof(test_token_so_pin) - 1, test_token_label);
601 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, rv, !=, CKR_OK))
602 goto out;
603
604 rv = C_InitToken(slot, pin1, sizeof(pin1), test_token_label);
605 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, rv, !=, CKR_OK))
606 goto out;
607
608 rv = C_InitToken(slot, pin2, sizeof(pin2), test_token_label);
609 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, rv, !=, CKR_OK))
610 goto out;
611
612 rv = C_GetTokenInfo(slot, &token_info);
613 if (!ADBG_EXPECT_CK_OK(c, rv))
614 goto out;
615
616 flags = token_info.flags;
617
618 /* Token should have set CKF_SO_PIN_COUNT_LOW to 1 */
619 if (!ADBG_EXPECT_TRUE(c, !!(flags & CKF_SO_PIN_COUNT_LOW))) {
620 rv = CKR_GENERAL_ERROR;
621 goto out;
622 }
623
624 rv = init_test_token(slot);
625 if (!ADBG_EXPECT_CK_OK(c, rv))
626 goto out;
627
628 rv = C_GetTokenInfo(slot, &token_info);
629 if (!ADBG_EXPECT_CK_OK(c, rv))
630 goto out;
631
632 flags = token_info.flags;
633
634 /*
635 * Token should have reset CKF_SO_PIN_COUNT_LOW to 0.
636 * Other flags should show a sane initialized state.
637 */
638 if (!ADBG_EXPECT_TRUE(c, !(flags & CKF_SO_PIN_COUNT_LOW)) ||
639 !ADBG_EXPECT_TRUE(c, !!(flags & CKF_TOKEN_INITIALIZED)) ||
640 !ADBG_EXPECT_TRUE(c, !(flags & CKF_ERROR_STATE)) ||
641 !ADBG_EXPECT_TRUE(c, !(flags & CKF_USER_PIN_INITIALIZED))) {
642 rv = CKR_GENERAL_ERROR;
Jens Wiklander282a8a52020-04-14 17:01:36 +0200643 goto out;
644 }
645
646 rv = init_user_test_token(slot);
647 if (!ADBG_EXPECT_CK_OK(c, rv))
648 goto out;
649
650 rv = C_GetTokenInfo(slot, &token_info);
651 if (!ADBG_EXPECT_CK_OK(c, rv))
652 goto out;
653
654 flags = token_info.flags;
655
656 if (!ADBG_EXPECT_TRUE(c, !(flags & CKF_USER_PIN_COUNT_LOW)) ||
657 !ADBG_EXPECT_TRUE(c, !(flags & CKF_USER_PIN_FINAL_TRY)) ||
658 !ADBG_EXPECT_TRUE(c, !(flags & CKF_USER_PIN_LOCKED)) ||
659 !ADBG_EXPECT_TRUE(c, !(flags & CKF_USER_PIN_TO_BE_CHANGED)) ||
660 !ADBG_EXPECT_TRUE(c, !!(flags & CKF_USER_PIN_INITIALIZED)) ||
661 !ADBG_EXPECT_TRUE(c, !(flags & CKF_ERROR_STATE))) {
662 rv = CKR_GENERAL_ERROR;
663 goto out;
Jens Wiklander14f8e8d2020-04-14 17:01:24 +0200664 }
665
666out:
667 Do_ADBG_EndSubCase(c, "C_InitToken() on initialized token");
668
669 return rv;
670}
671
672static CK_RV test_uninitialized_token(ADBG_Case_t *c, CK_SLOT_ID slot)
673{
674 CK_RV rv = CKR_GENERAL_ERROR;
675 CK_TOKEN_INFO token_info = { };
676 CK_FLAGS flags = 0;
677
678 Do_ADBG_BeginSubCase(c, "C_InitToken() on uninitialized token");
679
680 rv = init_test_token(slot);
681 if (!ADBG_EXPECT_CK_OK(c, rv))
682 goto out;
683
684 rv = C_GetTokenInfo(slot, &token_info);
685 if (!ADBG_EXPECT_CK_OK(c, rv))
686 goto out;
687
688 flags = token_info.flags;
689
690 if (!ADBG_EXPECT_TRUE(c, !!(flags & CKF_TOKEN_INITIALIZED)) ||
691 !ADBG_EXPECT_TRUE(c, !(flags & CKF_ERROR_STATE)) ||
692 !ADBG_EXPECT_TRUE(c, !(flags & CKF_USER_PIN_INITIALIZED))) {
693 rv = CKR_GENERAL_ERROR;
Jens Wiklander282a8a52020-04-14 17:01:36 +0200694 goto out;
Jens Wiklander14f8e8d2020-04-14 17:01:24 +0200695 }
696
Jens Wiklander282a8a52020-04-14 17:01:36 +0200697 rv = init_user_test_token(slot);
698 if (!ADBG_EXPECT_CK_OK(c, rv))
699 goto out;
700
701 rv = C_GetTokenInfo(slot, &token_info);
702 if (!ADBG_EXPECT_CK_OK(c, rv))
703 goto out;
704
705 flags = token_info.flags;
706
707 if (!ADBG_EXPECT_TRUE(c, !!(flags & CKF_TOKEN_INITIALIZED)) ||
708 !ADBG_EXPECT_TRUE(c, !(flags & CKF_USER_PIN_COUNT_LOW)) ||
709 !ADBG_EXPECT_TRUE(c, !(flags & CKF_USER_PIN_FINAL_TRY)) ||
710 !ADBG_EXPECT_TRUE(c, !(flags & CKF_USER_PIN_LOCKED)) ||
711 !ADBG_EXPECT_TRUE(c, !(flags & CKF_USER_PIN_TO_BE_CHANGED)) ||
712 !ADBG_EXPECT_TRUE(c, !!(flags & CKF_USER_PIN_INITIALIZED)) ||
713 !ADBG_EXPECT_TRUE(c, !(flags & CKF_ERROR_STATE)))
714 rv = CKR_GENERAL_ERROR;
715
Jens Wiklander14f8e8d2020-04-14 17:01:24 +0200716out:
717 Do_ADBG_EndSubCase(c, "C_InitToken() on uninitialized token");
718
719 return rv;
720}
721
Jens Wiklanderaa741512020-04-14 17:01:46 +0200722static CK_RV test_login_logout(ADBG_Case_t *c, CK_SLOT_ID slot)
723{
724 CK_FLAGS session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
725 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
726 CK_RV rv = CKR_GENERAL_ERROR;
727
728 Do_ADBG_BeginSubCase(c, "Test C_Login()/C_Logout()");
729
730 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
731 if (!ADBG_EXPECT_CK_OK(c, rv))
732 goto out;
733
734 /* Logout: should fail as we did not log in yet */
735 rv = C_Logout(session);
736 ADBG_EXPECT_CK_RESULT(c, CKR_USER_NOT_LOGGED_IN, rv);
737
738 /* Login/re-log/logout user */
739 rv = C_Login(session, CKU_USER, test_token_user_pin,
740 sizeof(test_token_user_pin));
741 if (!ADBG_EXPECT_CK_OK(c, rv))
742 goto out;
743
744 rv = C_Login(session, CKU_USER, test_token_user_pin,
745 sizeof(test_token_user_pin));
746 ADBG_EXPECT_CK_RESULT(c, CKR_USER_ALREADY_LOGGED_IN, rv);
747
748 rv = C_Logout(session);
749 if (!ADBG_EXPECT_CK_OK(c, rv))
750 goto out;
751
752 /* Login/re-log/logout security officer */
753 rv = C_Login(session, CKU_SO, test_token_so_pin,
754 sizeof(test_token_so_pin));
755 if (!ADBG_EXPECT_CK_OK(c, rv))
756 goto out;
757
758 rv = C_Login(session, CKU_SO, test_token_so_pin,
759 sizeof(test_token_so_pin));
760 ADBG_EXPECT_CK_RESULT(c, CKR_USER_ALREADY_LOGGED_IN, rv);
761
762 rv = C_Logout(session);
763 if (!ADBG_EXPECT_CK_OK(c, rv))
764 goto out;
765
766 /* Login user then SO and reverse */
767 rv = C_Login(session, CKU_SO, test_token_so_pin,
768 sizeof(test_token_so_pin));
769 ADBG_EXPECT_CK_OK(c, rv);
770
771 rv = C_Login(session, CKU_USER, test_token_user_pin,
772 sizeof(test_token_user_pin));
773 ADBG_EXPECT_CK_RESULT(c, CKR_USER_ANOTHER_ALREADY_LOGGED_IN, rv);
774
775 rv = C_Logout(session);
776 if (!ADBG_EXPECT_CK_OK(c, rv))
777 goto out;
778
779 rv = C_Login(session, CKU_USER, test_token_user_pin,
780 sizeof(test_token_user_pin));
781 ADBG_EXPECT_CK_OK(c, rv);
782
783 rv = C_Login(session, CKU_SO, test_token_so_pin,
784 sizeof(test_token_so_pin));
785 ADBG_EXPECT_CK_RESULT(c, CKR_USER_ANOTHER_ALREADY_LOGGED_IN, rv);
786
787 rv = C_Logout(session);
788 ADBG_EXPECT_CK_OK(c, rv);
789
790 /* Login context specifc, in an invalid case (need an operation) */
791 rv = C_Login(session, CKU_CONTEXT_SPECIFIC, test_token_user_pin,
792 sizeof(test_token_user_pin));
793 ADBG_EXPECT_CK_RESULT(c, CKR_OPERATION_NOT_INITIALIZED, rv);
794
795 rv = C_CloseSession(session);
796 ADBG_EXPECT_CK_OK(c, rv);
797
798out:
799 Do_ADBG_EndSubCase(c, "Test C_Login()/C_Logout()");
800 return rv;
801}
802
Jens Wiklander6ce1e692020-04-14 17:02:09 +0200803static CK_RV test_set_pin(ADBG_Case_t *c, CK_SLOT_ID slot,
804 CK_USER_TYPE user_type)
805{
806 CK_FLAGS session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
807 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
808 CK_UTF8CHAR some_pin[] = { 7, 6, 5, 4, 3, 2, 1, 2, 3, 4, 5, 6, 7 };
809 CK_UTF8CHAR_PTR old_pin = NULL;
810 CK_USER_TYPE ut = user_type;
811 size_t old_pin_sz = 0;
812 CK_RV rv2 = CKR_OK;
813 CK_RV rv = CKR_OK;
814
815 Do_ADBG_BeginSubCase(c, "Test C_SetPIN() user_type %lu", user_type);
816
817 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
818 if (!ADBG_EXPECT_CK_OK(c, rv))
819 goto out;
820
821 if (user_type == CKU_SO) {
822 old_pin = (CK_UTF8CHAR_PTR)test_token_so_pin;
823 old_pin_sz = sizeof(test_token_so_pin);
824 } else {
825 old_pin = (CK_UTF8CHAR_PTR)test_token_user_pin;
826 old_pin_sz = sizeof(test_token_user_pin);
827 ut = CKU_USER;
828 }
829
830 if (ut == user_type) {
831 rv = C_Login(session, ut, old_pin, old_pin_sz);
832 if (!ADBG_EXPECT_CK_OK(c, rv))
833 goto out_session;
834 }
835
836 rv = C_SetPIN(session, old_pin, old_pin_sz, some_pin, sizeof(some_pin));
837 if (!ADBG_EXPECT_CK_OK(c, rv)) {
838 if (ut == user_type)
839 goto out_logout;
840 else
841 goto out_session;
842 }
843
844 if (ut == user_type) {
845 rv = C_Logout(session);
846 if (!ADBG_EXPECT_CK_OK(c, rv))
847 goto out_session;
848 }
849
850 rv = C_Login(session, ut, some_pin, sizeof(some_pin));
851 if (!ADBG_EXPECT_CK_OK(c, rv))
852 goto out_session;
853
854 rv = C_SetPIN(session, some_pin, sizeof(some_pin), old_pin, old_pin_sz);
855 ADBG_EXPECT_CK_OK(c, rv);
856
857out_logout:
858 rv2 = C_Logout(session);
859 if (!ADBG_EXPECT_CK_OK(c, rv2) && !rv)
860 rv = rv2;
861out_session:
862 rv2 = C_CloseSession(session);
863 if (!ADBG_EXPECT_CK_OK(c, rv2) && !rv)
864 rv = rv2;
865out:
866 Do_ADBG_EndSubCase(c, "Test C_SetPIN() user_type %lu", user_type);
867
868 return rv;
869}
870
Jens Wiklander14f8e8d2020-04-14 17:01:24 +0200871static void xtest_pkcs11_test_1003(ADBG_Case_t *c)
872{
873 CK_RV rv = CKR_GENERAL_ERROR;
874 CK_FUNCTION_LIST_PTR ckfunc_list = NULL;
875 CK_SLOT_ID slot = 0;
876 CK_TOKEN_INFO token_info = { };
877
878 rv = C_GetFunctionList(&ckfunc_list);
879 if (!ADBG_EXPECT_CK_OK(c, rv) ||
Jens Wiklander282a8a52020-04-14 17:01:36 +0200880 !ADBG_EXPECT_NOT_NULL(c, ckfunc_list->C_InitToken) ||
881 !ADBG_EXPECT_NOT_NULL(c, ckfunc_list->C_InitPIN) ||
Jens Wiklanderaa741512020-04-14 17:01:46 +0200882 !ADBG_EXPECT_NOT_NULL(c, ckfunc_list->C_SetPIN) ||
883 !ADBG_EXPECT_NOT_NULL(c, ckfunc_list->C_Login) ||
884 !ADBG_EXPECT_NOT_NULL(c, ckfunc_list->C_Logout))
Jens Wiklander14f8e8d2020-04-14 17:01:24 +0200885 goto out;
886
887 rv = init_lib_and_find_token_slot(&slot);
888 if (!ADBG_EXPECT_CK_OK(c, rv))
889 return;
890
891 rv = C_GetTokenInfo(slot, &token_info);
892 if (!ADBG_EXPECT_CK_OK(c, rv))
893 goto out;
894
895 /* Abort test if token is about to lock */
896 if (!ADBG_EXPECT_TRUE(c, !(token_info.flags & CKF_SO_PIN_FINAL_TRY)))
897 goto out;
898
899 if (!(token_info.flags & CKF_TOKEN_INITIALIZED)) {
900 rv = test_uninitialized_token(c, slot);
901 if (rv != CKR_OK)
902 goto out;
903 }
904
905 rv = test_already_initialized_token(c, slot);
906 if (rv != CKR_OK)
907 goto out;
908
Jens Wiklanderaa741512020-04-14 17:01:46 +0200909 rv = test_login_logout(c, slot);
910 if (rv != CKR_OK)
911 goto out;
912
Jens Wiklander6ce1e692020-04-14 17:02:09 +0200913 rv = test_set_pin(c, slot, CKU_USER);
914 if (rv != CKR_OK)
915 goto out;
Jens Wiklanderaa741512020-04-14 17:01:46 +0200916
Jens Wiklander6ce1e692020-04-14 17:02:09 +0200917 rv = test_set_pin(c, slot, CKU_SO);
918 if (rv != CKR_OK)
919 goto out;
Jens Wiklanderaa741512020-04-14 17:01:46 +0200920
Jens Wiklander6ce1e692020-04-14 17:02:09 +0200921 /*
922 * CKU_CONTEXT_SPECIFIC is anything not CKU_USER or CKU_SO in order
923 * to skip the initial login.
924 */
925 test_set_pin(c, slot, CKU_CONTEXT_SPECIFIC);
Jens Wiklander14f8e8d2020-04-14 17:01:24 +0200926out:
927 rv = close_lib();
928 ADBG_EXPECT_CK_OK(c, rv);
929}
930
931ADBG_CASE_DEFINE(pkcs11, 1003, xtest_pkcs11_test_1003,
932 "PKCS11: Login to PKCS#11 token");
Jens Wiklander5eac1932020-05-05 19:07:11 +0200933
934static CK_ATTRIBUTE cktest_token_object[] = {
935 { CKA_DECRYPT, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
936 { CKA_TOKEN, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
937 { CKA_MODIFIABLE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
938 { CKA_CLASS, &(CK_OBJECT_CLASS){CKO_SECRET_KEY},
939 sizeof(CK_OBJECT_CLASS) },
940 { CKA_KEY_TYPE, &(CK_KEY_TYPE){CKK_AES}, sizeof(CK_KEY_TYPE) },
941 { CKA_VALUE, (void *)cktest_aes128_key, sizeof(cktest_aes128_key) },
942};
943
944static CK_ATTRIBUTE cktest_session_object[] = {
945 { CKA_DECRYPT, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
946 { CKA_TOKEN, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
947 { CKA_MODIFIABLE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
948 { CKA_KEY_TYPE, &(CK_KEY_TYPE){CKK_AES}, sizeof(CK_KEY_TYPE) },
949 { CKA_CLASS, &(CK_OBJECT_CLASS){CKO_SECRET_KEY},
950 sizeof(CK_OBJECT_CLASS) },
951 { CKA_VALUE, (void *)cktest_aes128_key, sizeof(cktest_aes128_key) },
952};
953
954/* Create session object and token object from a session */
955static void test_create_destroy_single_object(ADBG_Case_t *c, bool persistent)
956{
957 CK_RV rv = CKR_GENERAL_ERROR;
958 CK_SLOT_ID slot = 0;
959 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
960 CK_OBJECT_HANDLE obj_hdl = CK_INVALID_HANDLE;
961 CK_FLAGS session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
962
963 rv = init_lib_and_find_token_slot(&slot);
964 if (!ADBG_EXPECT_CK_OK(c, rv))
965 return;
966
967 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
968 if (!ADBG_EXPECT_CK_OK(c, rv))
969 goto out;
970
971 if (persistent) {
972 rv = C_CreateObject(session, cktest_token_object,
973 ARRAY_SIZE(cktest_token_object),
974 &obj_hdl);
975 } else {
976 rv = C_CreateObject(session, cktest_session_object,
977 ARRAY_SIZE(cktest_session_object),
978 &obj_hdl);
979 }
980
981 if (!ADBG_EXPECT_CK_OK(c, rv))
982 goto out;
983
984 rv = C_DestroyObject(session, obj_hdl);
985 ADBG_EXPECT_CK_OK(c, rv);
986out:
987 rv = C_CloseSession(session);
988 ADBG_EXPECT_CK_OK(c, rv);
989
990 rv = close_lib();
991 ADBG_EXPECT_CK_OK(c, rv);
992}
993
994static void test_create_destroy_session_objects(ADBG_Case_t *c)
995{
996 CK_RV rv = CKR_GENERAL_ERROR;
997 CK_SLOT_ID slot = 0;
998 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
999 CK_OBJECT_HANDLE obj_hdl[512] = { 0 };
1000 CK_FLAGS session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
1001 size_t n = 0;
1002
1003 for (n = 0; n < ARRAY_SIZE(obj_hdl); n++)
1004 obj_hdl[n] = CK_INVALID_HANDLE;
1005
1006 rv = init_lib_and_find_token_slot(&slot);
1007 if (!ADBG_EXPECT_CK_OK(c, rv))
1008 return;
1009
1010 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
1011 if (!ADBG_EXPECT_CK_OK(c, rv))
1012 goto out;
1013
1014 for (n = 0; n < ARRAY_SIZE(obj_hdl); n++) {
1015 rv = C_CreateObject(session, cktest_session_object,
1016 ARRAY_SIZE(cktest_session_object),
1017 obj_hdl + n);
1018
1019 if (rv == CKR_DEVICE_MEMORY || !ADBG_EXPECT_CK_OK(c, rv))
1020 break;
1021 }
1022
1023 Do_ADBG_Log(" created object count: %zu", n);
1024
1025 rv = C_CloseSession(session);
1026 ADBG_EXPECT_CK_OK(c, rv);
1027
1028 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
1029 if (!ADBG_EXPECT_CK_OK(c, rv))
1030 goto out;
1031
1032 rv = C_CreateObject(session, cktest_session_object,
1033 ARRAY_SIZE(cktest_session_object),
1034 obj_hdl);
1035
1036 ADBG_EXPECT_CK_OK(c, rv);
1037
1038out:
1039 rv = C_CloseSession(session);
1040 ADBG_EXPECT_CK_OK(c, rv);
1041
1042 rv = close_lib();
1043 ADBG_EXPECT_CK_OK(c, rv);
1044}
1045
1046/* Create session object and token object from a session */
1047static void test_create_objects_in_session(ADBG_Case_t *c, bool readwrite)
1048{
1049 CK_RV rv = CKR_GENERAL_ERROR;
1050 CK_SLOT_ID slot = 0;
1051 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
1052 CK_OBJECT_HANDLE token_obj_hld = CK_INVALID_HANDLE;
1053 CK_OBJECT_HANDLE session_obj_hld = CK_INVALID_HANDLE;
1054 CK_FLAGS session_flags = CKF_SERIAL_SESSION;
1055
1056 rv = init_lib_and_find_token_slot(&slot);
1057 if (!ADBG_EXPECT_CK_OK(c, rv))
1058 return;
1059
1060 if (readwrite)
1061 session_flags |= CKF_RW_SESSION;
1062
1063 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
1064 if (!ADBG_EXPECT_CK_OK(c, rv))
1065 goto out;
1066
1067 rv = C_CreateObject(session, cktest_token_object,
1068 ARRAY_SIZE(cktest_token_object),
1069 &token_obj_hld);
1070
1071 if (readwrite) {
1072 if (!ADBG_EXPECT_CK_OK(c, rv))
1073 goto out;
1074 } else {
1075 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SESSION_READ_ONLY, rv))
1076 goto out;
1077 }
1078
1079 rv = C_CreateObject(session, cktest_session_object,
1080 ARRAY_SIZE(cktest_session_object),
1081 &session_obj_hld);
1082
1083 if (!ADBG_EXPECT_CK_OK(c, rv))
1084 goto out_tobj;
1085
1086 rv = C_DestroyObject(session, session_obj_hld);
1087 ADBG_EXPECT_CK_OK(c, rv);
1088
1089out_tobj:
1090 if (readwrite) {
1091 rv = C_DestroyObject(session, token_obj_hld);
1092 ADBG_EXPECT_CK_OK(c, rv);
1093 }
1094out:
1095 rv = C_CloseSession(session);
1096 ADBG_EXPECT_CK_OK(c, rv);
1097
1098 rv = close_lib();
1099 ADBG_EXPECT_CK_OK(c, rv);
1100}
1101
1102static void xtest_pkcs11_test_1004(ADBG_Case_t *c)
1103{
1104 Do_ADBG_BeginSubCase(c, "Create and destroy a volatile object");
1105 test_create_destroy_single_object(c, false /*!persistent*/);
1106 Do_ADBG_EndSubCase(c, "Create and destroy a volatile object");
1107
1108 Do_ADBG_BeginSubCase(c, "Create and destroy a persistent object");
1109 test_create_destroy_single_object(c, true /*persistent*/);
1110 Do_ADBG_EndSubCase(c, "Create and destroy a persistent object");
1111
1112 Do_ADBG_BeginSubCase(c, "Create and destroy many session objects");
1113 test_create_destroy_session_objects(c);
1114 Do_ADBG_EndSubCase(c, "Create and destroy many session objects");
1115
1116 Do_ADBG_BeginSubCase(c, "Create objects in a read-only session");
1117 test_create_objects_in_session(c, false /*!readwrite*/);
1118 Do_ADBG_EndSubCase(c, "Create objects in a read-only session");
1119
1120 Do_ADBG_BeginSubCase(c, "Create objects in a read/write session");
1121 test_create_objects_in_session(c, true /*readwrite*/);
1122 Do_ADBG_EndSubCase(c, "Create objects in a read/write session");
1123}
1124
1125ADBG_CASE_DEFINE(pkcs11, 1004, xtest_pkcs11_test_1004,
1126 "PKCS11: create/destroy PKCS#11 simple objects");
Jens Wiklander2d6dc932020-08-10 09:22:49 +02001127
1128
1129static const CK_MECHANISM_TYPE allowed_only_aes_ecb[] = {
1130 CKM_AES_ECB,
1131};
1132static const CK_MECHANISM_TYPE allowed_not_aes_ecb[] = {
1133 CKM_AES_CBC, CKM_AES_CBC_PAD, CKM_AES_CTR, CKM_AES_CTS,
1134 CKM_AES_GCM, CKM_AES_CCM,
1135};
1136static const CK_MECHANISM_TYPE allowed_only_aes_cbcnopad[] = {
1137 CKM_AES_CBC,
1138};
1139static const CK_MECHANISM_TYPE allowed_not_aes_cbcnopad[] = {
1140 CKM_AES_ECB, CKM_AES_CBC_PAD, CKM_AES_CTR, CKM_AES_CTS,
1141 CKM_AES_GCM, CKM_AES_CCM,
1142};
1143static const CK_MECHANISM_TYPE allowed_only_aes_ctr[] = {
1144 CKM_AES_CTR,
1145};
1146static const CK_MECHANISM_TYPE allowed_not_aes_ctr[] = {
1147 CKM_AES_ECB, CKM_AES_CBC, CKM_AES_CBC_PAD, CKM_AES_CTS,
1148 CKM_AES_GCM, CKM_AES_CCM,
1149};
1150static const CK_MECHANISM_TYPE allowed_only_aes_cts[] = {
1151 CKM_AES_CTS,
1152};
1153static const CK_MECHANISM_TYPE allowed_not_aes_cts[] = {
1154 CKM_AES_ECB, CKM_AES_CBC, CKM_AES_CBC_PAD, CKM_AES_CTR,
1155 CKM_AES_GCM, CKM_AES_CCM,
1156};
1157
1158#define CKTEST_AES_KEY \
1159 { CKA_CLASS, &(CK_OBJECT_CLASS){CKO_SECRET_KEY}, \
1160 sizeof(CK_OBJECT_CLASS) }, \
1161 { CKA_KEY_TYPE, &(CK_KEY_TYPE){CKK_AES}, \
1162 sizeof(CK_KEY_TYPE) }, \
1163 { CKA_VALUE, (void *)cktest_aes128_key, \
1164 sizeof(cktest_aes128_key) }
1165
1166#define CKTEST_AES_ALLOWED_KEY(_allowed) \
1167 { CKA_ALLOWED_MECHANISMS, (void *)_allowed, sizeof(_allowed), }
1168
1169#define CK_KEY_ALLOWED_AES_TEST(_label, _allowed) \
1170 static CK_ATTRIBUTE _label[] = { \
1171 CKTEST_AES_KEY, \
1172 { CKA_ENCRYPT, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) }, \
1173 { CKA_DECRYPT, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) }, \
1174 CKTEST_AES_ALLOWED_KEY(_allowed), \
1175 }
1176
1177#define CK_KEY_ALLOWED_AES_ENC_TEST(_label, _allowed) \
1178 static CK_ATTRIBUTE _label[] = { \
1179 CKTEST_AES_KEY, \
1180 { CKA_ENCRYPT, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) }, \
1181 CKTEST_AES_ALLOWED_KEY(_allowed), \
1182 }
1183#define CK_KEY_ALLOWED_AES_DEC_TEST(_label, _allowed) \
1184 static CK_ATTRIBUTE _label[] = { \
1185 CKTEST_AES_KEY, \
1186 { CKA_DECRYPT, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) }, \
1187 CKTEST_AES_ALLOWED_KEY(_allowed), \
1188 }
1189
1190CK_KEY_ALLOWED_AES_TEST(cktest_aes_only_ecb, allowed_only_aes_ecb);
1191CK_KEY_ALLOWED_AES_TEST(cktest_aes_not_ecb, allowed_not_aes_ecb);
1192CK_KEY_ALLOWED_AES_TEST(cktest_aes_only_cbcnopad, allowed_only_aes_cbcnopad);
1193CK_KEY_ALLOWED_AES_TEST(cktest_aes_not_cbcnopad, allowed_not_aes_cbcnopad);
1194CK_KEY_ALLOWED_AES_TEST(cktest_aes_only_cts, allowed_only_aes_cts);
1195CK_KEY_ALLOWED_AES_TEST(cktest_aes_not_cts, allowed_not_aes_cts);
1196CK_KEY_ALLOWED_AES_TEST(cktest_aes_only_ctr, allowed_only_aes_ctr);
1197CK_KEY_ALLOWED_AES_TEST(cktest_aes_not_ctr, allowed_not_aes_ctr);
1198
1199struct cktest_allowed_test {
1200 CK_ATTRIBUTE_PTR attr_key;
1201 CK_ULONG attr_count;
1202 CK_MECHANISM_PTR mechanism;
1203};
1204
1205#define CKTEST_KEY_MECHA(key, mecha) { \
1206 .attr_key = key, \
1207 .attr_count = ARRAY_SIZE(key), \
1208 .mechanism = mecha, \
1209 }
1210
1211static const struct cktest_allowed_test cktest_allowed_valid[] = {
1212 CKTEST_KEY_MECHA(cktest_aes_only_ecb, &cktest_aes_ecb_mechanism),
1213 CKTEST_KEY_MECHA(cktest_aes_only_cbcnopad, &cktest_aes_cbc_mechanism),
1214 CKTEST_KEY_MECHA(cktest_aes_only_cts, &cktest_aes_cts_mechanism),
1215 CKTEST_KEY_MECHA(cktest_aes_only_ctr, &cktest_aes_ctr_mechanism),
1216};
1217
1218static const struct cktest_allowed_test cktest_allowed_invalid[] = {
1219 CKTEST_KEY_MECHA(cktest_aes_not_ecb, &cktest_aes_ecb_mechanism),
1220 CKTEST_KEY_MECHA(cktest_aes_not_cbcnopad, &cktest_aes_cbc_mechanism),
1221 CKTEST_KEY_MECHA(cktest_aes_not_cts, &cktest_aes_cts_mechanism),
1222 CKTEST_KEY_MECHA(cktest_aes_not_ctr, &cktest_aes_ctr_mechanism),
1223};
1224
1225/* Create session object and token object from a session */
1226static CK_RV cipher_init_final(ADBG_Case_t *c, CK_SESSION_HANDLE session,
1227 CK_ATTRIBUTE_PTR attr_key, CK_ULONG attr_count,
1228 CK_MECHANISM_PTR mechanism, uint32_t mode,
1229 CK_RV expected_rc)
1230{
1231 CK_RV rv2 = CKR_GENERAL_ERROR;
1232 CK_RV rv = CKR_GENERAL_ERROR;
1233 CK_OBJECT_HANDLE object = CK_INVALID_HANDLE;
1234
1235 switch (mode) {
1236 case TEE_MODE_ENCRYPT:
1237 case TEE_MODE_DECRYPT:
1238 break;
1239 default:
1240 ADBG_EXPECT_TRUE(c, false);
1241 }
1242
1243 rv = C_CreateObject(session, attr_key, attr_count, &object);
1244 if (!ADBG_EXPECT_CK_OK(c, rv))
1245 return rv;
1246
1247 if (mode == TEE_MODE_ENCRYPT)
1248 rv = C_EncryptInit(session, mechanism, object);
1249 if (mode == TEE_MODE_DECRYPT)
1250 rv = C_DecryptInit(session, mechanism, object);
1251
1252 if (!ADBG_EXPECT_CK_RESULT(c, expected_rc, rv)) {
1253 rv = CKR_GENERAL_ERROR;
1254 goto out;
1255 }
1256
1257 if (rv) {
1258 /*
1259 * If we're here it was the expected error code above and
1260 * we're supposed to return OK below.
1261 */
1262 rv = CKR_OK;
1263 } else {
1264 if (mode == TEE_MODE_ENCRYPT)
1265 rv = C_EncryptFinal(session, NULL, NULL);
1266 if (mode == TEE_MODE_DECRYPT)
1267 rv = C_DecryptFinal(session, NULL, NULL);
1268
Vesa Jääskeläinen9e5867b2021-07-01 08:42:46 +03001269 /*
1270 * Check that return value is expected so that operation is
1271 * released
1272 */
1273 if (!ADBG_EXPECT_CK_RESULT(c, CKR_ARGUMENTS_BAD, rv)) {
Jens Wiklander2d6dc932020-08-10 09:22:49 +02001274 rv = CKR_GENERAL_ERROR;
Vesa Jääskeläinen9e5867b2021-07-01 08:42:46 +03001275 goto out;
1276 }
1277
1278 rv = CKR_OK;
Jens Wiklander2d6dc932020-08-10 09:22:49 +02001279 }
1280
1281out:
1282 rv2 = C_DestroyObject(session, object);
1283 ADBG_EXPECT_CK_OK(c, rv2);
1284
1285 if (rv)
1286 return rv;
1287 else
1288 return rv2;
1289}
1290
1291CK_KEY_ALLOWED_AES_ENC_TEST(cktest_aes_enc_only_cts, allowed_only_aes_cts);
1292
1293CK_KEY_ALLOWED_AES_DEC_TEST(cktest_aes_dec_only_ctr, allowed_only_aes_ctr);
1294
1295static void xtest_pkcs11_test_1005(ADBG_Case_t *c)
1296{
1297 CK_RV rv = CKR_GENERAL_ERROR;
1298 CK_SLOT_ID slot = 0;
1299 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
1300 CK_FLAGS session_flags = CKF_SERIAL_SESSION;
1301 size_t n = 0;
1302
1303 rv = init_lib_and_find_token_slot(&slot);
1304 if (!ADBG_EXPECT_CK_OK(c, rv))
1305 return;
1306
1307 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
1308 if (!ADBG_EXPECT_CK_OK(c, rv))
1309 goto out;
1310
1311 for (n = 0; n < ARRAY_SIZE(cktest_allowed_valid); n++) {
1312
1313 Do_ADBG_BeginSubCase(c, "valid usage #%zu", n);
1314
1315 rv = cipher_init_final(c, session,
1316 cktest_allowed_valid[n].attr_key,
1317 cktest_allowed_valid[n].attr_count,
1318 cktest_allowed_valid[n].mechanism,
1319 TEE_MODE_ENCRYPT,
1320 CKR_OK);
1321
1322 ADBG_EXPECT_CK_OK(c, rv);
1323
1324 Do_ADBG_EndSubCase(c, NULL);
1325 if (rv)
1326 goto out;
1327
1328 }
1329
1330 for (n = 0; n < ARRAY_SIZE(cktest_allowed_invalid); n++) {
1331 Do_ADBG_BeginSubCase(c, "invalid usage #%zu", n);
1332
1333 rv = cipher_init_final(c, session,
1334 cktest_allowed_invalid[n].attr_key,
1335 cktest_allowed_invalid[n].attr_count,
1336 cktest_allowed_invalid[n].mechanism,
1337 TEE_MODE_ENCRYPT,
1338 CKR_KEY_FUNCTION_NOT_PERMITTED);
1339
1340 ADBG_EXPECT_CK_OK(c, rv);
1341
1342 Do_ADBG_EndSubCase(c, NULL);
1343 if (rv)
1344 goto out;
1345
1346 }
1347
1348out:
1349 rv = C_CloseSession(session);
1350 ADBG_EXPECT_CK_OK(c, rv);
1351
1352 rv = close_lib();
1353 ADBG_EXPECT_CK_OK(c, rv);
1354}
1355
1356
1357ADBG_CASE_DEFINE(pkcs11, 1005, xtest_pkcs11_test_1005,
1358 "PKCS11: Check ciphering with valid and invalid keys #1");
1359
1360static void xtest_pkcs11_test_1006(ADBG_Case_t *c)
1361{
1362 CK_RV rv = CKR_GENERAL_ERROR;
1363 CK_SLOT_ID slot = 0;
1364 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
1365 CK_FLAGS session_flags = CKF_SERIAL_SESSION;
1366
1367 rv = init_lib_and_find_token_slot(&slot);
1368 if (!ADBG_EXPECT_CK_OK(c, rv))
1369 return;
1370
1371 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
1372 if (!ADBG_EXPECT_CK_OK(c, rv))
1373 goto out;
1374
1375 /* Encrypt only AES CTS key */
1376 rv = cipher_init_final(c, session,
1377 cktest_aes_enc_only_cts,
1378 ARRAY_SIZE(cktest_aes_enc_only_cts),
1379 &cktest_aes_cts_mechanism,
1380 TEE_MODE_ENCRYPT,
1381 CKR_OK);
1382 if (!ADBG_EXPECT_CK_OK(c, rv))
1383 goto out;
1384
1385 rv = cipher_init_final(c, session,
1386 cktest_aes_enc_only_cts,
1387 ARRAY_SIZE(cktest_aes_enc_only_cts),
1388 &cktest_aes_cts_mechanism,
1389 TEE_MODE_DECRYPT,
1390 CKR_KEY_FUNCTION_NOT_PERMITTED);
1391 if (!ADBG_EXPECT_CK_OK(c, rv))
1392 goto out;
1393
1394 /* Decrypt only AES CTR key */
1395 rv = cipher_init_final(c, session,
1396 cktest_aes_dec_only_ctr,
1397 ARRAY_SIZE(cktest_aes_dec_only_ctr),
1398 &cktest_aes_ctr_mechanism,
1399 TEE_MODE_ENCRYPT,
1400 CKR_KEY_FUNCTION_NOT_PERMITTED);
1401 if (!ADBG_EXPECT_CK_OK(c, rv))
1402 goto out;
1403
1404 rv = cipher_init_final(c, session,
1405 cktest_aes_dec_only_ctr,
1406 ARRAY_SIZE(cktest_aes_dec_only_ctr),
1407 &cktest_aes_ctr_mechanism,
1408 TEE_MODE_ENCRYPT,
1409 CKR_KEY_FUNCTION_NOT_PERMITTED);
1410 if (!ADBG_EXPECT_CK_OK(c, rv))
1411 goto out;
1412
1413out:
1414 rv = C_CloseSession(session);
1415 ADBG_EXPECT_CK_OK(c, rv);
1416
1417 rv = close_lib();
1418 ADBG_EXPECT_CK_OK(c, rv);
1419}
1420ADBG_CASE_DEFINE(pkcs11, 1006, xtest_pkcs11_test_1006,
1421 "PKCS11: Check ciphering with valid and invalid keys #2");
1422
1423static CK_RV open_cipher_session(ADBG_Case_t *c,
1424 CK_SLOT_ID slot, CK_SESSION_HANDLE_PTR session,
1425 CK_ATTRIBUTE_PTR attr_key, CK_ULONG attr_count,
1426 CK_MECHANISM_PTR mechanism, uint32_t mode)
1427{
1428 CK_RV rv = CKR_GENERAL_ERROR;
1429 CK_OBJECT_HANDLE object = CK_INVALID_HANDLE;
1430 CK_FLAGS session_flags = CKF_SERIAL_SESSION;
1431
1432 switch (mode) {
1433 case TEE_MODE_ENCRYPT:
1434 case TEE_MODE_DECRYPT:
1435 break;
1436 default:
1437 ADBG_EXPECT_TRUE(c, false);
1438 return CKR_GENERAL_ERROR;
1439 }
1440
1441 rv = C_OpenSession(slot, session_flags, NULL, 0, session);
1442 if (rv == CKR_DEVICE_MEMORY)
1443 return rv;
1444 if (!ADBG_EXPECT_CK_OK(c, rv))
1445 return rv;
1446
1447 rv = C_CreateObject(*session, attr_key, attr_count, &object);
1448 if (rv == CKR_DEVICE_MEMORY)
1449 return rv;
1450 if (!ADBG_EXPECT_CK_OK(c, rv))
1451 return rv;
1452
1453 if (mode == TEE_MODE_ENCRYPT)
1454 rv = C_EncryptInit(*session, mechanism, object);
1455 if (mode == TEE_MODE_DECRYPT)
1456 rv = C_DecryptInit(*session, mechanism, object);
1457
1458 if (rv == CKR_DEVICE_MEMORY)
1459 return rv;
1460 if (!ADBG_EXPECT_CK_OK(c, rv))
1461 return CKR_GENERAL_ERROR;
1462
1463 return rv;
1464}
1465
1466static void xtest_pkcs11_test_1007(ADBG_Case_t *c)
1467{
1468 CK_RV rv = CKR_GENERAL_ERROR;
1469 CK_SLOT_ID slot = 0;
1470 CK_SESSION_HANDLE sessions[128];
1471 size_t n = 0;
1472
1473 for (n = 0; n < ARRAY_SIZE(sessions); n++)
1474 sessions[n] = CK_INVALID_HANDLE;
1475
1476 rv = init_lib_and_find_token_slot(&slot);
1477 if (!ADBG_EXPECT_CK_OK(c, rv))
1478 return;
1479
1480 for (n = 0; n < ARRAY_SIZE(sessions); n++) {
1481
1482 rv = open_cipher_session(c, slot, &sessions[n],
1483 cktest_allowed_valid[0].attr_key,
1484 cktest_allowed_valid[0].attr_count,
1485 cktest_allowed_valid[0].mechanism,
1486 TEE_MODE_ENCRYPT);
1487
1488 /* Failure due to memory allocation is not a error case */
1489 if (rv == CKR_DEVICE_MEMORY)
1490 break;
1491
1492 if (!ADBG_EXPECT_CK_OK(c, rv))
1493 goto out;
1494 }
1495
1496 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, n, >, 0))
1497 goto out;
1498
1499 Do_ADBG_Log(" created sessions count: %zu", n);
1500
1501 /* Closing session with out bound and invalid IDs (or negative ID) */
1502 rv = C_CloseSession(sessions[n - 1] + 1024);
1503 ADBG_EXPECT_CK_RESULT(c, CKR_SESSION_HANDLE_INVALID, rv);
1504 rv = C_CloseSession(CK_INVALID_HANDLE);
1505 ADBG_EXPECT_CK_RESULT(c, CKR_SESSION_HANDLE_INVALID, rv);
1506 rv = C_CloseSession(~0);
1507 ADBG_EXPECT_CK_RESULT(c, CKR_SESSION_HANDLE_INVALID, rv);
1508
1509 /* Closing each session: all related resources shall be free */
1510 for (n = 0; n < ARRAY_SIZE(sessions); n++) {
1511 if (sessions[n] == CK_INVALID_HANDLE)
1512 continue;
1513
1514 rv = C_CloseSession(sessions[n]);
1515 ADBG_EXPECT_CK_OK(c, rv);
1516 sessions[n] = CK_INVALID_HANDLE;
1517 }
1518
1519 /* Open and close another session */
1520 rv = open_cipher_session(c, slot, &sessions[0],
1521 cktest_allowed_valid[0].attr_key,
1522 cktest_allowed_valid[0].attr_count,
1523 cktest_allowed_valid[0].mechanism,
1524 TEE_MODE_ENCRYPT);
1525
1526 if (!ADBG_EXPECT_CK_OK(c, rv))
1527 goto out;
1528
1529 rv = C_CloseSession(sessions[0]);
1530 ADBG_EXPECT_CK_OK(c, rv);
1531 sessions[0] = CK_INVALID_HANDLE;
1532
1533out:
1534 for (n = 0; n < ARRAY_SIZE(sessions); n++) {
1535 if (sessions[n] == CK_INVALID_HANDLE)
1536 continue;
1537
1538 rv = C_CloseSession(sessions[n]);
1539 ADBG_EXPECT_CK_OK(c, rv);
1540 }
1541
1542 rv = close_lib();
1543 ADBG_EXPECT_CK_OK(c, rv);
1544}
1545ADBG_CASE_DEFINE(pkcs11, 1007, xtest_pkcs11_test_1007,
1546 "PKCS11: Check operations release at session closure");
Ruchika Guptaab553aa2020-11-03 15:39:49 +05301547
1548#define CK_MAC_KEY_HMAC(_type, _key_array) \
1549 { \
1550 { CKA_SIGN, &(CK_BBOOL){CK_TRUE}, \
1551 sizeof(CK_BBOOL) }, \
1552 { CKA_VERIFY, &(CK_BBOOL){CK_TRUE}, \
1553 sizeof(CK_BBOOL) }, \
1554 { CKA_CLASS, &(CK_OBJECT_CLASS){CKO_SECRET_KEY}, \
1555 sizeof(CK_OBJECT_CLASS) }, \
1556 { CKA_KEY_TYPE, &(CK_KEY_TYPE){_type}, \
1557 sizeof(CK_KEY_TYPE) }, \
1558 { CKA_VALUE, (void *)(_key_array), \
1559 sizeof(_key_array) } \
1560 }
1561
1562static CK_ATTRIBUTE cktest_hmac_md5_key[] =
1563 CK_MAC_KEY_HMAC(CKK_MD5_HMAC, mac_data_md5_key1);
1564
1565static CK_ATTRIBUTE cktest_hmac_sha1_key[] =
1566 CK_MAC_KEY_HMAC(CKK_SHA_1_HMAC, mac_data_sha1_key1);
1567
1568static CK_ATTRIBUTE cktest_hmac_sha224_key[] =
1569 CK_MAC_KEY_HMAC(CKK_SHA224_HMAC, mac_data_sha224_key1);
1570
1571static CK_ATTRIBUTE cktest_hmac_sha256_key1[] =
1572 CK_MAC_KEY_HMAC(CKK_SHA256_HMAC, mac_data_sha256_key1);
1573
1574static CK_ATTRIBUTE cktest_hmac_sha256_key2[] =
1575 CK_MAC_KEY_HMAC(CKK_SHA256_HMAC, mac_data_sha256_key2);
1576
1577static CK_ATTRIBUTE cktest_hmac_sha384_key[] =
1578 CK_MAC_KEY_HMAC(CKK_SHA384_HMAC, mac_data_sha384_key1);
1579
1580static CK_ATTRIBUTE cktest_hmac_sha512_key[] =
1581 CK_MAC_KEY_HMAC(CKK_SHA512_HMAC, mac_data_sha512_key1);
1582
1583struct mac_test {
1584 CK_ATTRIBUTE_PTR attr_key;
1585 CK_ULONG attr_count;
1586 CK_MECHANISM_PTR mechanism;
1587 size_t in_incr;
1588 const uint8_t *in;
1589 size_t in_len;
1590 const uint8_t *out;
1591 size_t out_len;
1592 bool multiple_incr;
1593};
1594
1595#define CKTEST_MAC_TEST(key, mecha, input_incr, input, output, incr) { \
1596 .attr_key = key, \
1597 .attr_count = ARRAY_SIZE(key), \
1598 .mechanism = mecha, \
1599 .in_incr = input_incr, \
1600 .in = input, \
1601 .in_len = ARRAY_SIZE(input), \
1602 .out = output, \
1603 .out_len = ARRAY_SIZE(output), \
1604 .multiple_incr = incr \
1605 }
1606
1607static const struct mac_test cktest_mac_cases[] = {
1608 CKTEST_MAC_TEST(cktest_hmac_md5_key, &cktest_hmac_md5_mechanism,
1609 4, mac_data_md5_in1, mac_data_md5_out1, false),
1610 CKTEST_MAC_TEST(cktest_hmac_sha1_key, &cktest_hmac_sha1_mechanism,
1611 5, mac_data_sha1_in1, mac_data_sha1_out1, false),
1612 CKTEST_MAC_TEST(cktest_hmac_sha224_key, &cktest_hmac_sha224_mechanism,
1613 8, mac_data_sha224_in1, mac_data_sha224_out1, false),
1614 CKTEST_MAC_TEST(cktest_hmac_sha256_key1, &cktest_hmac_sha256_mechanism,
1615 1, mac_data_sha256_in1, mac_data_sha256_out1, false),
1616 CKTEST_MAC_TEST(cktest_hmac_sha256_key2, &cktest_hmac_sha256_mechanism,
1617 7, mac_data_sha256_in2, mac_data_sha256_out2, false),
1618 CKTEST_MAC_TEST(cktest_hmac_sha384_key, &cktest_hmac_sha384_mechanism,
1619 11, mac_data_sha384_in1, mac_data_sha384_out1, false),
1620 CKTEST_MAC_TEST(cktest_hmac_sha512_key, &cktest_hmac_sha512_mechanism,
1621 13, mac_data_sha512_in1, mac_data_sha512_out1, false),
1622};
1623
1624static void xtest_pkcs11_test_1008(ADBG_Case_t *c)
1625{
1626 CK_RV rv = CKR_GENERAL_ERROR;
1627 CK_SLOT_ID slot = 0;
1628 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
1629 CK_FLAGS session_flags = CKF_SERIAL_SESSION;
1630 CK_OBJECT_HANDLE key_handle = CK_INVALID_HANDLE;
1631 uint8_t out[512] = { 0 };
1632 CK_ULONG out_size = 0;
1633 struct mac_test const *test = NULL;
1634 size_t n = 0;
1635
1636 rv = init_lib_and_find_token_slot(&slot);
1637 if (!ADBG_EXPECT_CK_OK(c, rv))
1638 return;
1639
1640 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
1641 if (!ADBG_EXPECT_CK_OK(c, rv))
1642 goto err_close_lib;
1643
1644 for (n = 0; n < ARRAY_SIZE(cktest_mac_cases); n++) {
1645
1646 test = &cktest_mac_cases[n];
1647 Do_ADBG_BeginSubCase(c, "Sign case %zu algo (%s)", n,
1648 ckm2str(test->mechanism->mechanism));
1649
1650 rv = C_CreateObject(session, test->attr_key, test->attr_count,
1651 &key_handle);
1652 if (!ADBG_EXPECT_CK_OK(c, rv))
1653 goto err;
1654
1655 /* Test signature in 1 step */
1656 if (test->in != NULL) {
1657 rv = C_SignInit(session, test->mechanism, key_handle);
1658 if (!ADBG_EXPECT_CK_OK(c, rv))
1659 goto err_destr_obj;
1660
Ruchika Guptaa2fe4172020-11-30 17:30:35 +05301661 /* Pass input buffer of size 0 */
1662 rv = C_SignUpdate(session,
1663 (void *)test->in, 0);
1664 if (!ADBG_EXPECT_CK_OK(c, rv))
1665 goto err_destr_obj;
1666
Ruchika Guptaab553aa2020-11-03 15:39:49 +05301667 rv = C_SignUpdate(session,
1668 (void *)test->in, test->in_len);
1669 if (!ADBG_EXPECT_CK_OK(c, rv))
1670 goto err_destr_obj;
1671
1672 /* Test too short buffer case */
1673 out_size = 1;
1674 rv = C_SignFinal(session, out, &out_size);
1675 if (!ADBG_EXPECT_CK_RESULT(c, CKR_BUFFER_TOO_SMALL, rv))
1676 goto err_destr_obj;
1677
1678 /*
1679 * Test NULL buffer case with size as 0
1680 * to get the out_size
1681 */
1682 out_size = 0;
1683 rv = C_SignFinal(session, NULL, &out_size);
1684 if (!ADBG_EXPECT_CK_OK(c, rv))
1685 goto err_destr_obj;
1686
Vesa Jääskeläinenbbe78622021-06-27 16:03:13 +03001687 /*
1688 * Test NULL buffer case with size as non-zero
1689 * to get the out_size
1690 */
1691 out_size = 42;
1692 rv = C_SignFinal(session, NULL, &out_size);
1693 if (!ADBG_EXPECT_CK_OK(c, rv))
1694 goto err_destr_obj;
1695
Ruchika Guptaab553aa2020-11-03 15:39:49 +05301696 /* Get to full output */
1697 memset(out, 0, out_size);
1698 rv = C_SignFinal(session, out, &out_size);
1699 if (!ADBG_EXPECT_CK_OK(c, rv))
1700 goto err_destr_obj;
1701
1702 (void)ADBG_EXPECT_BUFFER(c, test->out,
1703 test->out_len,
1704 out, out_size);
1705 }
1706
1707 /* Test 2 step update signature */
1708 rv = C_SignInit(session, test->mechanism, key_handle);
1709 if (!ADBG_EXPECT_CK_OK(c, rv))
1710 goto err_destr_obj;
1711
1712 if (test->in != NULL) {
1713 rv = C_SignUpdate(session,
1714 (void *)test->in, test->in_incr);
1715 if (!ADBG_EXPECT_CK_OK(c, rv))
1716 goto err_destr_obj;
1717
1718 rv = C_SignUpdate(session,
1719 (void *)(test->in + test->in_incr),
1720 test->in_len - test->in_incr);
1721 if (!ADBG_EXPECT_CK_OK(c, rv))
1722 goto err_destr_obj;
1723 }
1724
1725 out_size = sizeof(out);
1726 memset(out, 0, sizeof(out));
1727
1728 rv = C_SignFinal(session, out, &out_size);
1729 if (!ADBG_EXPECT_CK_OK(c, rv))
1730 goto err_destr_obj;
1731
1732 (void)ADBG_EXPECT_BUFFER(c, test->out,
1733 test->out_len, out, out_size);
1734
1735 /* Test 3 signature in one shot */
1736 if (test->in != NULL) {
1737 rv = C_SignInit(session, test->mechanism, key_handle);
1738 if (!ADBG_EXPECT_CK_OK(c, rv))
1739 goto err_destr_obj;
1740
1741 /* Test too short buffer case */
1742 out_size = 1;
1743 rv = C_Sign(session,(void *)test->in, test->in_len,
1744 out, &out_size);
1745 if (!ADBG_EXPECT_CK_RESULT(c, CKR_BUFFER_TOO_SMALL, rv))
1746 goto err_destr_obj;
1747
1748 /*
1749 * Test NULL buffer case with size as 0
1750 * to get the out_size
1751 */
1752 out_size = 0;
1753 rv = C_Sign(session, (void *)test->in, test->in_len,
1754 NULL, &out_size);
1755 if (!ADBG_EXPECT_CK_OK(c, rv))
1756 goto err_destr_obj;
1757
Vesa Jääskeläinenbbe78622021-06-27 16:03:13 +03001758 /*
1759 * Test NULL buffer case with size as non-zero
1760 * to get the out_size
1761 */
1762 out_size = 42;
1763 rv = C_Sign(session, (void *)test->in, test->in_len,
1764 NULL, &out_size);
1765 if (!ADBG_EXPECT_CK_OK(c, rv))
1766 goto err_destr_obj;
1767
Ruchika Guptaab553aa2020-11-03 15:39:49 +05301768 /* Get to full output */
1769 memset(out, 0, out_size);
1770 rv = C_Sign(session,(void *)test->in, test->in_len,
1771 out, &out_size);
1772 if (!ADBG_EXPECT_CK_OK(c, rv))
1773 goto err_destr_obj;
1774
1775 (void)ADBG_EXPECT_BUFFER(c, test->out,
1776 test->out_len,
1777 out, out_size);
1778 }
1779
1780 rv = C_DestroyObject(session, key_handle);
1781 if (!ADBG_EXPECT_CK_OK(c, rv))
1782 goto err;
1783
1784 Do_ADBG_EndSubCase(c, NULL);
1785 }
1786 goto out;
1787
1788err_destr_obj:
1789 ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, key_handle));
1790err:
1791 Do_ADBG_EndSubCase(c, NULL);
1792out:
1793 ADBG_EXPECT_CK_OK(c, C_CloseSession(session));
1794err_close_lib:
1795 ADBG_EXPECT_CK_OK(c, close_lib());
1796}
1797ADBG_CASE_DEFINE(pkcs11, 1008, xtest_pkcs11_test_1008,
1798 "PKCS11: Check Compliance of C_Sign - HMAC algorithms");
1799
1800static void xtest_pkcs11_test_1009(ADBG_Case_t *c)
1801{
1802 CK_RV rv = CKR_GENERAL_ERROR;
1803 CK_SLOT_ID slot = 0;
1804 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
1805 CK_FLAGS session_flags = CKF_SERIAL_SESSION;
1806 CK_OBJECT_HANDLE key_handle = CK_INVALID_HANDLE;
1807 struct mac_test const *test = NULL;
1808 size_t n = 0;
1809
1810 rv = init_lib_and_find_token_slot(&slot);
1811 if (!ADBG_EXPECT_CK_OK(c, rv))
1812 return;
1813
1814 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
1815 if (!ADBG_EXPECT_CK_OK(c, rv))
1816 goto err_close_lib;
1817
1818 for (n = 0; n < ARRAY_SIZE(cktest_mac_cases); n++) {
1819
1820 test = &cktest_mac_cases[n];
1821 Do_ADBG_BeginSubCase(c, "Verify case %zu algo (%s)", n,
1822 ckm2str(test->mechanism->mechanism));
1823
1824 rv = C_CreateObject(session, test->attr_key, test->attr_count,
1825 &key_handle);
1826 if (!ADBG_EXPECT_CK_OK(c, rv))
1827 goto err;
1828
1829 /* Test Verification in 1 step */
1830 if (test->in != NULL) {
1831 rv = C_VerifyInit(session, test->mechanism, key_handle);
1832 if (!ADBG_EXPECT_CK_OK(c, rv))
1833 goto err_destr_obj;
1834
Ruchika Guptaa2fe4172020-11-30 17:30:35 +05301835 /* Pass input buffer with size 0 - No affect */
1836 rv = C_VerifyUpdate(session, (void *)test->in, 0);
1837 if (!ADBG_EXPECT_CK_OK(c, rv))
1838 goto err_destr_obj;
1839
Ruchika Guptaab553aa2020-11-03 15:39:49 +05301840 rv = C_VerifyUpdate(session, (void *)test->in,
1841 test->in_len);
1842 if (!ADBG_EXPECT_CK_OK(c, rv))
1843 goto err_destr_obj;
1844
1845 rv = C_VerifyFinal(session,
1846 (void *)test->out, test->out_len);
1847 if (!ADBG_EXPECT_CK_OK(c, rv))
1848 goto err_destr_obj;
1849
1850 }
1851
1852 /* Test 2 step update verification*/
1853 rv = C_VerifyInit(session, test->mechanism, key_handle);
1854 if (!ADBG_EXPECT_CK_OK(c, rv))
1855 goto err_destr_obj;
1856
1857 if (test->in != NULL) {
1858 rv = C_VerifyUpdate(session,
1859 (void *)test->in, test->in_incr);
1860 if (!ADBG_EXPECT_CK_OK(c, rv))
1861 goto err_destr_obj;
1862
1863 rv = C_VerifyUpdate(session,
1864 (void *)(test->in + test->in_incr),
1865 test->in_len - test->in_incr);
1866 if (!ADBG_EXPECT_CK_OK(c, rv))
1867 goto err_destr_obj;
1868 }
1869
1870 rv = C_VerifyFinal(session, (void *)test->out, test->out_len);
1871 if (!ADBG_EXPECT_CK_OK(c, rv))
1872 goto err_destr_obj;
1873
1874 /* Error as Operation has already completed */
1875 rv = C_Verify(session,
1876 (void *)test->in, test->in_len,
1877 (void *)test->out, test->out_len);
1878 if (!ADBG_EXPECT_CK_RESULT(c, CKR_OPERATION_NOT_INITIALIZED,
1879 rv))
1880 goto err_destr_obj;
1881
1882 /* Test 3 verification in one shot */
1883 if (test->in != NULL) {
1884 rv = C_VerifyInit(session, test->mechanism, key_handle);
1885 if (!ADBG_EXPECT_CK_OK(c, rv))
1886 goto err_destr_obj;
1887
1888 rv = C_Verify(session,
1889 (void *)test->in, test->in_len,
1890 (void *)test->out, test->out_len);
1891 if (!ADBG_EXPECT_CK_OK(c, rv))
1892 goto err_destr_obj;
1893
1894 /* Try calling Verify again */
1895 rv = C_Verify(session,
1896 (void *)test->in, test->in_len,
1897 (void *)test->out, test->out_len);
1898 if (!ADBG_EXPECT_CK_RESULT(c,
1899 CKR_OPERATION_NOT_INITIALIZED,
1900 rv))
1901 goto err_destr_obj;
1902 }
1903
1904 /*
1905 * Test 4 verification
1906 * Error - Signature Length Range with C_VerifyFinal
1907 */
1908 if (test->in != NULL) {
1909 rv = C_VerifyInit(session, test->mechanism, key_handle);
1910 if (!ADBG_EXPECT_CK_OK(c, rv))
1911 goto err_destr_obj;
1912
1913 rv = C_VerifyUpdate(session, (void *)test->in,
1914 test->in_len);
1915 if (!ADBG_EXPECT_CK_OK(c, rv))
1916 goto err_destr_obj;
1917
1918 rv = C_VerifyFinal(session, (void *)test->out, 3);
1919 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SIGNATURE_LEN_RANGE,
1920 rv))
1921 goto err_destr_obj;
1922 }
1923
1924 /*
1925 * Test 5 verification
1926 * Error - Signature Length Range with C_Verify
1927 */
1928 if (test->in != NULL) {
1929 rv = C_VerifyInit(session, test->mechanism, key_handle);
1930 if (!ADBG_EXPECT_CK_OK(c, rv))
1931 goto err_destr_obj;
1932
1933 rv = C_Verify(session,
1934 (void *)test->in, test->in_len,
1935 (void *)test->out, 0);
1936 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SIGNATURE_LEN_RANGE,
1937 rv))
1938 goto err_destr_obj;
1939 }
1940
1941 /* Test 6 verification - Invalid Operation sequence */
1942 if (test->in != NULL) {
1943 rv = C_VerifyInit(session, test->mechanism, key_handle);
1944 if (!ADBG_EXPECT_CK_OK(c, rv))
1945 goto err_destr_obj;
1946
1947 rv = C_Verify(session,
1948 (void *)test->in, test->in_len,
1949 (void *)test->out, test->out_len);
1950 if (!ADBG_EXPECT_CK_OK(c, rv))
1951 goto err_destr_obj;
1952
1953 /* Init session has already terminated with C_Verify */
1954 rv = C_VerifyUpdate(session, (void *)test->in,
1955 test->in_len);
1956 if (!ADBG_EXPECT_CK_RESULT(c,
1957 CKR_OPERATION_NOT_INITIALIZED,
1958 rv))
1959 goto err_destr_obj;
1960 }
1961
1962 rv = C_DestroyObject(session, key_handle);
1963 if (!ADBG_EXPECT_CK_OK(c, rv))
1964 goto err;
1965
1966 Do_ADBG_EndSubCase(c, NULL);
1967 }
1968 goto out;
1969
1970err_destr_obj:
1971 ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, key_handle));
1972err:
1973 Do_ADBG_EndSubCase(c, NULL);
1974out:
1975 ADBG_EXPECT_CK_OK(c, C_CloseSession(session));
1976err_close_lib:
1977 ADBG_EXPECT_CK_OK(c, close_lib());
1978}
1979ADBG_CASE_DEFINE(pkcs11, 1009, xtest_pkcs11_test_1009,
1980 "PKCS11: Check Compliance of C_Verify - HMAC Algorithms");
Ruchika Gupta71bc7402020-12-11 18:17:27 +05301981
1982/* Bad key type */
1983static CK_ATTRIBUTE cktest_generate_gensecret_object_error1[] = {
1984 { CKA_CLASS, &(CK_OBJECT_CLASS){CKO_SECRET_KEY},
1985 sizeof(CK_OBJECT_CLASS) },
1986 { CKA_KEY_TYPE, &(CK_KEY_TYPE){CKK_AES}, sizeof(CK_KEY_TYPE) },
1987 { CKA_VALUE_LEN, &(CK_ULONG){16}, sizeof(CK_ULONG) },
1988};
1989
1990/* Missing VALUE_LEN */
1991static CK_ATTRIBUTE cktest_generate_gensecret_object_error2[] = {
1992 { CKA_CLASS, &(CK_OBJECT_CLASS){CKO_SECRET_KEY},
1993 sizeof(CK_OBJECT_CLASS) },
1994 { CKA_KEY_TYPE, &(CK_KEY_TYPE){CKK_GENERIC_SECRET},
1995 sizeof(CK_KEY_TYPE) },
1996};
1997
1998/* Bad object class */
1999static CK_ATTRIBUTE cktest_generate_gensecret_object_error3[] = {
2000 { CKA_CLASS, &(CK_OBJECT_CLASS){CKO_DATA}, sizeof(CK_OBJECT_CLASS) },
2001 { CKA_KEY_TYPE, &(CK_KEY_TYPE){CKK_GENERIC_SECRET},
2002 sizeof(CK_KEY_TYPE) },
Ruchika Gupta4c9485f2021-02-16 11:57:47 +05302003 { CKA_VALUE_LEN, &(CK_ULONG){16}, sizeof(CK_ULONG) },
Ruchika Gupta71bc7402020-12-11 18:17:27 +05302004};
2005
2006/* Invalid template with CKA_LOCAL */
2007static CK_ATTRIBUTE cktest_generate_gensecret_object_error4[] = {
Ruchika Gupta4c9485f2021-02-16 11:57:47 +05302008 { CKA_VALUE_LEN, &(CK_ULONG){16}, sizeof(CK_ULONG) },
Ruchika Gupta71bc7402020-12-11 18:17:27 +05302009 { CKA_LOCAL, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
2010};
2011
2012/* Valid template to generate a generic secret */
2013static CK_ATTRIBUTE cktest_generate_gensecret_object_valid1[] = {
2014 { CKA_CLASS, &(CK_OBJECT_CLASS){CKO_SECRET_KEY},
2015 sizeof(CK_OBJECT_CLASS) },
2016 { CKA_KEY_TYPE, &(CK_KEY_TYPE){CKK_GENERIC_SECRET},
2017 sizeof(CK_KEY_TYPE) },
2018 { CKA_SIGN, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
2019 { CKA_VERIFY, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
Ruchika Gupta4c9485f2021-02-16 11:57:47 +05302020 { CKA_VALUE_LEN, &(CK_ULONG){16}, sizeof(CK_ULONG) },
Ruchika Gupta71bc7402020-12-11 18:17:27 +05302021};
2022
2023/* Valid template to generate a generic secret with only VALUE_LEN */
2024static CK_ATTRIBUTE cktest_generate_gensecret_object_valid2[] = {
Ruchika Gupta4c9485f2021-02-16 11:57:47 +05302025 { CKA_VALUE_LEN, &(CK_ULONG){16}, sizeof(CK_ULONG) },
Ruchika Gupta71bc7402020-12-11 18:17:27 +05302026 { CKA_SIGN, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
2027};
2028
2029
2030/* Valid template to generate an all AES purpose key */
2031static CK_ATTRIBUTE cktest_generate_aes_object[] = {
2032 { CKA_CLASS, &(CK_OBJECT_CLASS){CKO_SECRET_KEY},
2033 sizeof(CK_OBJECT_CLASS) },
2034 { CKA_KEY_TYPE, &(CK_KEY_TYPE){CKK_AES}, sizeof(CK_KEY_TYPE) },
2035 { CKA_ENCRYPT, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
2036 { CKA_DECRYPT, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
2037 { CKA_VALUE_LEN, &(CK_ULONG){16}, sizeof(CK_ULONG) },
2038};
2039
2040static void xtest_pkcs11_test_1010(ADBG_Case_t *c)
2041{
2042 CK_RV rv = CKR_GENERAL_ERROR;
2043 CK_SLOT_ID slot = 0;
2044 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
2045 CK_FLAGS session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
2046 CK_OBJECT_HANDLE key_handle = CK_INVALID_HANDLE;
2047 struct mac_test const *test = &cktest_mac_cases[0];
2048 uint8_t out[512] = { 0 };
2049 CK_ULONG out_len = 512;
2050
2051 rv = init_lib_and_find_token_slot(&slot);
2052 if (!ADBG_EXPECT_CK_OK(c, rv))
2053 return;
2054
2055 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
2056 if (!ADBG_EXPECT_CK_OK(c, rv))
2057 goto close_lib;
2058
2059 /*
2060 * Generate Generic Secret key using invalid templates
2061 */
2062 Do_ADBG_BeginSubCase(c, "Generate Secret Key with Invalid Templates");
2063
2064 /* NULL Template with !null template length */
2065 rv = C_GenerateKey(session, &cktest_gensecret_keygen_mechanism, NULL,
2066 3, &key_handle);
2067 if (!ADBG_EXPECT_CK_RESULT(c, CKR_ARGUMENTS_BAD, rv))
2068 goto err;
2069
2070 rv = C_GenerateKey(session, &cktest_gensecret_keygen_mechanism,
2071 cktest_generate_gensecret_object_error1,
2072 ARRAY_SIZE(cktest_generate_gensecret_object_error1),
2073 &key_handle);
2074 if (!ADBG_EXPECT_CK_RESULT(c, CKR_TEMPLATE_INCONSISTENT, rv))
2075 goto err;
2076
2077 rv = C_GenerateKey(session, &cktest_gensecret_keygen_mechanism,
2078 cktest_generate_gensecret_object_error2,
2079 ARRAY_SIZE(cktest_generate_gensecret_object_error2),
2080 &key_handle);
2081 if (!ADBG_EXPECT_CK_RESULT(c, CKR_TEMPLATE_INCOMPLETE, rv))
2082 goto err;
2083
2084 rv = C_GenerateKey(session, &cktest_gensecret_keygen_mechanism,
2085 cktest_generate_gensecret_object_error3,
2086 ARRAY_SIZE(cktest_generate_gensecret_object_error3),
2087 &key_handle);
2088 if (!ADBG_EXPECT_CK_RESULT(c, CKR_TEMPLATE_INCONSISTENT, rv))
2089 goto err;
2090
2091 rv = C_GenerateKey(session, &cktest_gensecret_keygen_mechanism,
2092 cktest_generate_gensecret_object_error4,
2093 ARRAY_SIZE(cktest_generate_gensecret_object_error4),
2094 &key_handle);
2095 if (!ADBG_EXPECT_CK_RESULT(c, CKR_TEMPLATE_INCONSISTENT, rv))
2096 goto err;
2097
2098 Do_ADBG_EndSubCase(c, NULL);
2099
2100 /*
2101 * Generate a Generic Secret object.
2102 * Try to encrypt with, it should fail...
2103 */
2104 Do_ADBG_BeginSubCase(c, "Generate Generic Secret Key - Try Encrypting");
2105
2106 rv = C_GenerateKey(session, &cktest_gensecret_keygen_mechanism,
2107 cktest_generate_gensecret_object_valid1,
2108 ARRAY_SIZE(cktest_generate_gensecret_object_valid1),
2109 &key_handle);
2110 if (!ADBG_EXPECT_CK_OK(c, rv))
2111 goto err;
2112
2113 rv = C_EncryptInit(session, &cktest_aes_cbc_mechanism, key_handle);
2114 if (!ADBG_EXPECT_CK_RESULT(c, CKR_KEY_FUNCTION_NOT_PERMITTED, rv))
2115 goto err_destr_obj;
2116
2117 rv = C_DestroyObject(session, key_handle);
2118 if (!ADBG_EXPECT_CK_OK(c, rv))
2119 goto err;
2120
2121 Do_ADBG_EndSubCase(c, NULL);
2122
2123 /*
2124 * Generate a Generic Secret object.
2125 * Try to sign with it, it should pass...
2126 */
2127 Do_ADBG_BeginSubCase(c, "Generate Generic Secret Key - Try Signing");
2128 rv = C_GenerateKey(session, &cktest_gensecret_keygen_mechanism,
2129 cktest_generate_gensecret_object_valid2,
2130 ARRAY_SIZE(cktest_generate_gensecret_object_valid2),
2131 &key_handle);
2132 if (!ADBG_EXPECT_CK_OK(c, rv))
2133 goto err;
2134
2135 rv = C_SignInit(session, test->mechanism, key_handle);
2136 if (!ADBG_EXPECT_CK_OK(c, rv))
2137 goto err_destr_obj;
2138
2139 rv = C_Sign(session, (void *)test->in, test->in_len,
2140 (void *)out, &out_len);
2141 if (!ADBG_EXPECT_CK_OK(c, rv))
2142 goto err_destr_obj;
2143
2144 rv = C_DestroyObject(session, key_handle);
2145 if (!ADBG_EXPECT_CK_OK(c, rv))
2146 goto err;
2147
2148 Do_ADBG_EndSubCase(c, NULL);
2149
2150 /*
2151 * Generate a 128 bit AES Secret Key.
2152 * Try to encrypt with, it should pass...
2153 */
2154 Do_ADBG_BeginSubCase(c, "Generate AES Key - Try Encrypting");
2155
2156 rv = C_GenerateKey(session, &cktest_aes_keygen_mechanism,
2157 cktest_generate_aes_object,
2158 ARRAY_SIZE(cktest_generate_aes_object),
2159 &key_handle);
2160 if (!ADBG_EXPECT_CK_OK(c, rv))
2161 goto err;
2162
2163 rv = C_EncryptInit(session, &cktest_aes_cbc_mechanism, key_handle);
2164 if (!ADBG_EXPECT_CK_OK(c, rv))
2165 goto err_destr_obj;
2166
2167 rv = C_EncryptFinal(session, NULL, NULL);
2168 /* Only check that the operation is no more active */
2169 if (!ADBG_EXPECT_TRUE(c, rv != CKR_BUFFER_TOO_SMALL))
2170 goto err;
2171
2172 rv = C_DestroyObject(session, key_handle);
2173 if (!ADBG_EXPECT_CK_OK(c, rv))
2174 goto err;
2175
2176 Do_ADBG_EndSubCase(c, NULL);
2177
2178 goto out;
2179
2180err_destr_obj:
2181 ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, key_handle));
2182err:
2183 Do_ADBG_EndSubCase(c, NULL);
2184out:
2185 ADBG_EXPECT_CK_OK(c, C_CloseSession(session));
2186close_lib:
2187 ADBG_EXPECT_CK_OK(c, close_lib());
2188}
2189ADBG_CASE_DEFINE(pkcs11, 1010, xtest_pkcs11_test_1010,
2190 "PKCS11: Key Generation");
Ruchika Guptaafe2b542020-12-24 15:51:31 +05302191
2192static CK_RV create_data_object(CK_SESSION_HANDLE session,
2193 CK_OBJECT_HANDLE *obj_handle,
2194 CK_BBOOL token, CK_BBOOL private,
2195 const char *label)
2196{
2197 CK_OBJECT_CLASS class = CKO_DATA;
2198 CK_ATTRIBUTE object_template[] = {
2199 { CKA_CLASS, &class, sizeof(CK_OBJECT_CLASS) },
2200 { CKA_TOKEN, &token, sizeof(CK_BBOOL) },
2201 { CKA_PRIVATE, &private, sizeof(CK_BBOOL) },
2202 { CKA_LABEL, (CK_UTF8CHAR_PTR)label, strlen(label) },
2203 };
2204
2205 return C_CreateObject(session, object_template,
2206 ARRAY_SIZE(object_template), obj_handle);
2207}
2208
2209static CK_RV test_find_objects(ADBG_Case_t *c, CK_SESSION_HANDLE session,
2210 CK_ATTRIBUTE_PTR find_template,
2211 CK_ULONG attr_count,
2212 CK_OBJECT_HANDLE_PTR obj_found,
2213 CK_ULONG obj_count,
2214 CK_ULONG expected_cnt)
2215{
2216 CK_RV rv = CKR_GENERAL_ERROR;
2217 CK_ULONG hdl_count = 0;
2218
2219 rv = C_FindObjectsInit(session, find_template, attr_count);
2220 if (!ADBG_EXPECT_CK_OK(c, rv))
2221 return rv;
2222
2223 rv = C_FindObjects(session, obj_found, obj_count, &hdl_count);
2224 if (!ADBG_EXPECT_CK_OK(c, rv))
2225 return rv;
2226 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, hdl_count, ==, expected_cnt))
2227 return CKR_GENERAL_ERROR;
2228
2229 rv = C_FindObjectsFinal(session);
2230 if (!ADBG_EXPECT_CK_OK(c, rv))
2231 return rv;
2232
2233 return rv;
2234}
2235
2236static void destroy_persistent_objects(ADBG_Case_t *c, CK_SLOT_ID slot)
2237{
2238 uint32_t rv = CKR_GENERAL_ERROR;
2239 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
2240 CK_FLAGS session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
2241 CK_OBJECT_HANDLE obj_hdl = CK_INVALID_HANDLE;
2242 CK_ULONG count = 1;
2243 CK_ATTRIBUTE cktest_find_all_token_objs[] = {
2244 { CKA_TOKEN, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
2245 };
2246
2247 rv = init_user_test_token(slot);
2248 if (!ADBG_EXPECT_CK_OK(c, rv))
2249 return;
2250
2251 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
2252 if (!ADBG_EXPECT_CK_OK(c, rv))
2253 return;
2254
2255 /* Login to destroy private objects */
2256 rv = C_Login(session, CKU_USER, test_token_user_pin,
2257 sizeof(test_token_user_pin));
2258 if (!ADBG_EXPECT_CK_OK(c, rv))
2259 goto bail;
2260
2261 rv = C_FindObjectsInit(session, cktest_find_all_token_objs,
2262 ARRAY_SIZE(cktest_find_all_token_objs));
2263 if (!ADBG_EXPECT_CK_OK(c, rv))
2264 goto bail;
2265
2266 while (1) {
2267 rv = C_FindObjects(session, &obj_hdl, 1, &count);
2268 if (!ADBG_EXPECT_CK_OK(c, rv))
2269 goto bail;
2270 if (!count)
2271 break;
2272
2273 rv = C_DestroyObject(session, obj_hdl);
2274 ADBG_EXPECT_CK_OK(c, rv);
2275 }
2276
2277 rv = C_FindObjectsFinal(session);
2278 ADBG_EXPECT_CK_OK(c, rv);
2279
2280 rv = C_Logout(session);
2281 ADBG_EXPECT_CK_OK(c, rv);
2282
2283bail:
2284 rv = C_CloseSession(session);
2285 ADBG_EXPECT_CK_OK(c, rv);
2286}
2287
2288static void xtest_pkcs11_test_1011(ADBG_Case_t *c)
2289{
2290 CK_RV rv = CKR_GENERAL_ERROR;
2291 CK_SLOT_ID slot = 0;
2292 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
2293 CK_FLAGS session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
2294 CK_OBJECT_HANDLE obj_hdl[10] = { };
2295 CK_OBJECT_HANDLE obj_found[10] = { };
2296 const char *label = "Common Label";
2297 CK_ULONG hdl_count = 0;
2298 size_t n = 0;
2299 uint32_t i = 0;
2300 uint32_t object_id = 0;
2301 bool logged_in = false;
2302 CK_ATTRIBUTE find_template[] = {
2303 { CKA_LABEL, (CK_UTF8CHAR_PTR)label, strlen(label) },
2304 };
2305 CK_ATTRIBUTE find_token_template[] = {
2306 { CKA_LABEL, (CK_UTF8CHAR_PTR)label, strlen(label) },
2307 { CKA_TOKEN, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
2308 };
2309 CK_ATTRIBUTE find_session_template[] = {
2310 { CKA_LABEL, (CK_UTF8CHAR_PTR)label, strlen(label) },
2311 { CKA_TOKEN, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
2312 };
2313 CK_BBOOL bToken = CK_FALSE;
2314 CK_ATTRIBUTE get_attr_template[] = {
2315 { CKA_TOKEN, &bToken, sizeof(bToken) },
2316 };
2317
2318 for (n = 0; n < ARRAY_SIZE(obj_hdl); n++)
2319 obj_hdl[n] = CK_INVALID_HANDLE;
2320 for (n = 0; n < ARRAY_SIZE(obj_found); n++)
2321 obj_found[n] = CK_INVALID_HANDLE;
2322
2323 rv = init_lib_and_find_token_slot(&slot);
2324 if (!ADBG_EXPECT_CK_OK(c, rv))
2325 return;
2326
2327 rv = init_test_token(slot);
2328 if (!ADBG_EXPECT_CK_OK(c, rv))
2329 return;
2330
2331 rv = init_user_test_token(slot);
2332 if (!ADBG_EXPECT_CK_OK(c, rv))
2333 return;
2334
2335 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
2336 if (!ADBG_EXPECT_CK_OK(c, rv))
2337 goto close_lib;
2338
2339 /*
2340 * Sub test: Create Session Public/Private,
2341 * Token Public/Private objects and find them
2342 */
2343 Do_ADBG_BeginSubCase(c, "Find created Data objects when logged in");
2344
2345 /* Session Public Obj CKA_TOKEN = CK_FALSE, CKA_PRIVATE = CK_FALSE */
2346 rv = create_data_object(session, &obj_hdl[object_id++], CK_FALSE,
2347 CK_FALSE, label);
2348 if (!ADBG_EXPECT_CK_OK(c, rv))
2349 goto out;
2350
2351 /* Token Public Obj CKA_TOKEN = CK_TRUE, CKA_PRIVATE = CK_FALSE */
2352 rv = create_data_object(session, &obj_hdl[object_id++], CK_TRUE,
2353 CK_FALSE, label);
2354 if (!ADBG_EXPECT_CK_OK(c, rv))
2355 goto out;
2356
2357 /*
2358 * Token Private Obj CKA_TOKEN = CK_TRUE, CKA_PRIVATE = CK_TRUE
2359 * Expected error as User not logged in
2360 */
2361 rv = create_data_object(session, &obj_hdl[object_id], CK_TRUE,
2362 CK_TRUE, label);
2363 if (!ADBG_EXPECT_CK_RESULT(c, CKR_USER_NOT_LOGGED_IN, rv))
2364 goto out;
2365
2366 /* Login to Test Token */
2367 rv = C_Login(session, CKU_USER, test_token_user_pin,
2368 sizeof(test_token_user_pin));
2369 if (!ADBG_EXPECT_CK_OK(c, rv))
2370 goto out;
2371
2372 logged_in = true;
2373
2374 /* Token Private Obj CKA_TOKEN = CK_TRUE, CKA_PRIVATE = CK_TRUE */
2375 rv = create_data_object(session, &obj_hdl[object_id++], CK_TRUE,
2376 CK_TRUE, label);
2377 if (!ADBG_EXPECT_CK_OK(c, rv))
2378 goto out;
2379
2380 /* Session Private Obj CKA_TOKEN = CK_FALSE, CKA_PRIVATE = CK_TRUE */
2381 rv = create_data_object(session, &obj_hdl[object_id++], CK_FALSE,
2382 CK_TRUE, label);
2383 if (!ADBG_EXPECT_CK_OK(c, rv))
2384 goto out;
2385
2386 rv = test_find_objects(c, session, find_template,
2387 ARRAY_SIZE(find_template),
2388 obj_found, ARRAY_SIZE(obj_found), 4);
2389 if (!ADBG_EXPECT_CK_OK(c, rv))
2390 goto out;
2391
2392 /*
2393 * Check if object handles returned when creating objects with this
2394 * session are still valid
2395 */
2396 for (i = 0; i < object_id; i++) {
2397 rv = C_GetAttributeValue(session, obj_hdl[i], get_attr_template,
2398 ARRAY_SIZE(get_attr_template));
2399 if (!ADBG_EXPECT_CK_OK(c, rv))
2400 goto out;
2401 }
2402
2403 Do_ADBG_EndSubCase(c, NULL);
2404
2405 /*
2406 * Sub test: Pass NULL template with count as 0. All objects should
2407 * get returned
2408 */
2409 Do_ADBG_BeginSubCase(c, "Find all objects by passing NULL template");
2410
2411 rv = test_find_objects(c, session, NULL, 0, obj_found,
2412 ARRAY_SIZE(obj_found), 4);
2413 if (!ADBG_EXPECT_CK_OK(c, rv))
2414 goto out;
2415
Ruchika Guptab8dac1c2021-01-14 12:37:58 +05302416 Do_ADBG_EndSubCase(c, NULL);
Ruchika Guptaafe2b542020-12-24 15:51:31 +05302417
Ruchika Guptab8dac1c2021-01-14 12:37:58 +05302418 /*
2419 * Sub test: finalize search without getting the handles found
2420 */
2421 Do_ADBG_BeginSubCase(c, "Initiate and finalize straight a search");
2422
2423 rv = C_FindObjectsInit(session, find_template,
2424 ARRAY_SIZE(find_template));
2425 if (!ADBG_EXPECT_CK_OK(c, rv))
2426 goto out;
2427
2428 rv = C_FindObjectsFinal(session);
2429 if (!ADBG_EXPECT_CK_OK(c, rv))
2430 goto out;
2431
2432 /*
2433 * Check if object handles returned when creating objects with this
2434 * session are still valid
2435 */
2436 for (i = 0; i < object_id; i++) {
2437 rv = C_GetAttributeValue(session, obj_hdl[i], get_attr_template,
2438 ARRAY_SIZE(get_attr_template));
2439 if (!ADBG_EXPECT_CK_OK(c, rv))
2440 goto out;
2441 }
Ruchika Guptaafe2b542020-12-24 15:51:31 +05302442 Do_ADBG_EndSubCase(c, NULL);
2443
2444 /*
2445 * Sub test: Logout and find objects. We will find only public
2446 * objects (2)
2447 */
2448 Do_ADBG_BeginSubCase(c, "Find created Data objects when logged out");
2449
Ruchika Guptab8dac1c2021-01-14 12:37:58 +05302450 rv = C_Logout(session);
2451 ADBG_EXPECT_CK_OK(c, rv);
2452
2453 logged_in = false;
2454
Ruchika Guptaafe2b542020-12-24 15:51:31 +05302455 rv = test_find_objects(c, session, find_template,
2456 ARRAY_SIZE(find_template),
2457 obj_found, ARRAY_SIZE(obj_found), 2);
2458 if (!ADBG_EXPECT_CK_OK(c, rv))
2459 goto out;
2460
2461 Do_ADBG_EndSubCase(c, NULL);
2462
2463 /*
2464 * Sub test
2465 */
2466 Do_ADBG_BeginSubCase(c, "Find objects 1 by 1 and match handles");
2467
2468 for (n = 0; n < ARRAY_SIZE(obj_found); n++)
2469 obj_found[n] = CK_INVALID_HANDLE;
2470
2471 rv = C_FindObjectsInit(session, find_template,
2472 ARRAY_SIZE(find_template));
2473 if (!ADBG_EXPECT_CK_OK(c, rv))
2474 goto out;
2475
2476 rv = C_FindObjects(session, obj_found, 1, &hdl_count);
2477 if (!ADBG_EXPECT_CK_OK(c, rv) ||
2478 !ADBG_EXPECT_COMPARE_UNSIGNED(c, hdl_count, ==, 1) ||
2479 !ADBG_EXPECT_TRUE(c, (obj_found[0] == obj_hdl[0]) ||
2480 (obj_found[0] == obj_hdl[1])))
2481 goto out;
2482
2483 rv = C_FindObjects(session, &obj_found[1], 1, &hdl_count);
2484 if (!ADBG_EXPECT_CK_OK(c, rv) ||
2485 !ADBG_EXPECT_COMPARE_UNSIGNED(c, hdl_count, ==, 1) ||
2486 !ADBG_EXPECT_TRUE(c, (obj_found[1] == obj_hdl[0]) ||
2487 (obj_found[1] == obj_hdl[1])) ||
2488 !ADBG_EXPECT_TRUE(c, (obj_found[1] != obj_found[0])))
2489 goto out;
2490
2491 rv = C_FindObjects(session, obj_found, 1, &hdl_count);
2492 if (!ADBG_EXPECT_CK_OK(c, rv) ||
2493 !ADBG_EXPECT_COMPARE_UNSIGNED(c, hdl_count, ==, 0))
2494 goto out;
2495
2496 rv = C_FindObjectsFinal(session);
2497 if (!ADBG_EXPECT_CK_OK(c, rv))
2498 goto out;
2499
2500 Do_ADBG_EndSubCase(c, NULL);
2501
2502 /*
2503 * Sub test: Find objects with CKA_TOKEN=TRUE
2504 */
2505 Do_ADBG_BeginSubCase(c, "Find persistent objects");
2506
2507 rv = test_find_objects(c, session, find_token_template,
2508 ARRAY_SIZE(find_token_template),
2509 obj_found, ARRAY_SIZE(obj_found), 1);
2510 if (!ADBG_EXPECT_CK_OK(c, rv))
2511 goto out;
2512
2513 Do_ADBG_EndSubCase(c, NULL);
2514
2515 /*
2516 * Sub test: Find only session objects
2517 */
2518 Do_ADBG_BeginSubCase(c, "Find session objects");
2519
2520 rv = test_find_objects(c, session, find_session_template,
2521 ARRAY_SIZE(find_session_template),
2522 obj_found, ARRAY_SIZE(obj_found), 1);
2523 if (!ADBG_EXPECT_CK_OK(c, rv))
2524 goto out;
2525
2526 Do_ADBG_EndSubCase(c, NULL);
2527
2528 /*
2529 * Sub test:
2530 */
2531 Do_ADBG_BeginSubCase(c, "Login again and find Data objects");
2532
2533 /* Login to Test Token */
2534 rv = C_Login(session, CKU_USER, test_token_user_pin,
2535 sizeof(test_token_user_pin));
2536 if (!ADBG_EXPECT_CK_OK(c, rv))
2537 goto out;
2538
2539 logged_in = true;
2540
2541 rv = test_find_objects(c, session, find_template,
2542 ARRAY_SIZE(find_template),
Ruchika Guptab8dac1c2021-01-14 12:37:58 +05302543 obj_found, ARRAY_SIZE(obj_found), 3);
Ruchika Guptaafe2b542020-12-24 15:51:31 +05302544 if (!ADBG_EXPECT_CK_OK(c, rv))
2545 goto out;
2546
Ruchika Guptaafe2b542020-12-24 15:51:31 +05302547 rv = C_Logout(session);
2548 ADBG_EXPECT_CK_OK(c, rv);
2549
2550 logged_in = false;
2551
2552 Do_ADBG_EndSubCase(c, NULL);
2553
2554 /*
2555 * Sub test: Close session and open new session, find objects
2556 * without logging and after logging
2557 */
2558 Do_ADBG_BeginSubCase(c, "Find objects from brand new session");
2559
2560 rv = C_CloseSession(session);
2561 if (!ADBG_EXPECT_CK_OK(c, rv))
2562 goto destr_obj;
2563
2564 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
2565 if (!ADBG_EXPECT_CK_OK(c, rv))
2566 goto destr_obj;
2567
2568 rv = test_find_objects(c, session, find_template,
2569 ARRAY_SIZE(find_template),
2570 obj_found, ARRAY_SIZE(obj_found), 1);
2571 if (!ADBG_EXPECT_CK_OK(c, rv))
2572 goto out;
2573
2574 /* Login to Test Token */
2575 rv = C_Login(session, CKU_USER, test_token_user_pin,
2576 sizeof(test_token_user_pin));
2577 if (!ADBG_EXPECT_CK_OK(c, rv))
2578 goto out;
2579
2580 logged_in = true;
2581
2582 rv = test_find_objects(c, session, find_template,
2583 ARRAY_SIZE(find_template),
2584 obj_found, ARRAY_SIZE(obj_found), 2);
2585 if (!ADBG_EXPECT_CK_OK(c, rv))
2586 goto out;
2587
2588 rv = C_Logout(session);
2589 ADBG_EXPECT_CK_OK(c, rv);
2590
2591 logged_in = false;
2592
2593 Do_ADBG_EndSubCase(c, NULL);
2594
2595 /*
2596 * Sub test: invalid call cases
2597 */
2598 Do_ADBG_BeginSubCase(c, "Invalid cases");
2599
2600 rv = C_FindObjectsFinal(session);
2601 ADBG_EXPECT_CK_RESULT(c, CKR_OPERATION_NOT_INITIALIZED, rv);
2602
2603 rv = C_FindObjects(session,
2604 obj_found, ARRAY_SIZE(obj_found), &hdl_count);
2605 ADBG_EXPECT_CK_RESULT(c, CKR_OPERATION_NOT_INITIALIZED, rv);
2606
2607 rv = C_FindObjectsInit(session, find_template,
2608 ARRAY_SIZE(find_template));
2609 if (!ADBG_EXPECT_CK_OK(c, rv))
2610 goto out;
2611
2612 rv = C_FindObjectsInit(session, find_template,
2613 ARRAY_SIZE(find_template));
2614 ADBG_EXPECT_COMPARE_UNSIGNED(c, rv, !=, CKR_OK);
2615
2616 rv = C_FindObjectsFinal(session);
2617 ADBG_EXPECT_CK_OK(c, rv);
2618
2619 rv = C_FindObjectsInit(session, find_template,
2620 ARRAY_SIZE(find_template));
2621 ADBG_EXPECT_CK_OK(c, rv);
2622
2623 /*
2624 * Intentionally do not finalize the active object search. It should be
2625 * released together with the session closure.
2626 */
2627 Do_ADBG_EndSubCase(c, NULL);
2628
2629out:
2630 if (logged_in)
2631 ADBG_EXPECT_CK_OK(c, C_Logout(session));
2632
2633 ADBG_EXPECT_CK_OK(c, C_CloseSession(session));
2634
2635destr_obj:
2636 destroy_persistent_objects(c, slot);
2637close_lib:
2638 ADBG_EXPECT_CK_OK(c, close_lib());
2639}
2640ADBG_CASE_DEFINE(pkcs11, 1011, xtest_pkcs11_test_1011,
2641 "PKCS11: Test Find Objects");
Vesa Jääskeläinen33ada292021-01-13 23:17:55 +02002642
2643static void xtest_pkcs11_test_1012(ADBG_Case_t *c)
2644{
2645 CK_RV rv = CKR_GENERAL_ERROR;
2646 CK_SLOT_ID slot = 0;
2647 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
2648 CK_FLAGS session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
2649 CK_OBJECT_HANDLE obj_hdl = CK_INVALID_HANDLE;
2650 CK_OBJECT_HANDLE key_hdl = CK_INVALID_HANDLE;
2651 size_t i = 0;
2652
2653 CK_OBJECT_CLASS obj_class = CKO_DATA;
2654 CK_BBOOL obj_token = CK_FALSE;
2655 CK_BBOOL obj_private = CK_FALSE;
2656 uint8_t obj_value[5] = { 1, 2, 3, 4, 5 };
2657 const char *obj_label = "Label";
2658
2659 CK_ATTRIBUTE object_template[] = {
2660 { CKA_CLASS, &obj_class, sizeof(obj_class) },
2661 { CKA_TOKEN, &obj_token, sizeof(obj_token) },
2662 { CKA_PRIVATE, &obj_private, sizeof(obj_private) },
2663 { CKA_VALUE, obj_value, sizeof(obj_value) },
2664 { CKA_LABEL, (CK_UTF8CHAR_PTR)obj_label, strlen(obj_label) },
2665 };
2666
2667 CK_OBJECT_CLASS secret_class = CKO_SECRET_KEY;
2668 CK_BBOOL secret_token = CK_FALSE;
2669 CK_BBOOL secret_private = CK_FALSE;
2670 CK_KEY_TYPE secret_key_type = CKK_GENERIC_SECRET;
2671 CK_ULONG secret_len = 32;
2672 CK_MECHANISM_TYPE secret_allowed_mecha[] = { CKM_SHA_1_HMAC,
2673 CKM_SHA224_HMAC,
2674 CKM_SHA256_HMAC };
2675
2676 CK_ATTRIBUTE secret_template[] = {
2677 { CKA_CLASS, &secret_class, sizeof(secret_class) },
2678 { CKA_TOKEN, &secret_token, sizeof(secret_token) },
2679 { CKA_PRIVATE, &secret_private, sizeof(secret_private) },
2680 { CKA_KEY_TYPE, &secret_key_type, sizeof(secret_key_type) },
2681 { CKA_VALUE_LEN, &secret_len, sizeof(secret_len) },
2682 { CKA_ALLOWED_MECHANISMS, secret_allowed_mecha,
2683 sizeof(secret_allowed_mecha) }
2684 };
2685
2686 CK_BBOOL g_token = CK_TRUE;
2687 CK_BBOOL g_private = CK_TRUE;
2688 CK_OBJECT_CLASS g_class = ~0;
2689 uint8_t g_value[128] = { 0 };
2690 CK_MECHANISM_TYPE g_mecha_list[10] = { 0 };
2691
2692 uint8_t *data_ptr = NULL;
2693
2694 CK_ATTRIBUTE get_attr_template_bc[] = {
2695 { CKA_TOKEN, &g_token, sizeof(g_token) },
2696 { CKA_CLASS, &g_class, sizeof(g_class) },
2697 };
2698
2699 CK_ATTRIBUTE get_attr_template_cb[] = {
2700 { CKA_CLASS, &g_class, sizeof(g_class) },
2701 { CKA_TOKEN, &g_token, sizeof(g_token) },
2702 };
2703
Vesa Jääskeläinen2f068b12021-06-27 17:46:53 +03002704 CK_ATTRIBUTE get_attr_template_query_bc[] = {
2705 { CKA_TOKEN, NULL, 0 },
2706 { CKA_CLASS, NULL, 0 },
2707 };
2708
2709 CK_ATTRIBUTE get_attr_template_query_cb[] = {
2710 { CKA_CLASS, NULL, 0 },
2711 { CKA_TOKEN, NULL, 0 },
2712 };
2713
Vesa Jääskeläinen33ada292021-01-13 23:17:55 +02002714 CK_ATTRIBUTE get_attr_template_ve[] = {
2715 { CKA_VALUE, &g_value, sizeof(obj_value) },
2716 };
2717
2718 CK_ATTRIBUTE get_attr_template_vl[] = {
2719 { CKA_VALUE, &g_value, sizeof(g_value) },
2720 };
2721
2722 CK_ATTRIBUTE get_attr_template_bvecb[] = {
2723 { CKA_TOKEN, &g_token, sizeof(g_token) },
2724 { CKA_VALUE, &g_value, sizeof(obj_value) },
2725 { CKA_CLASS, &g_class, sizeof(g_class) },
2726 { CKA_TOKEN, &g_private, sizeof(g_private) },
2727 };
2728
2729 CK_ATTRIBUTE get_attr_template_bvlcb[] = {
2730 { CKA_TOKEN, &g_token, sizeof(g_token) },
2731 { CKA_VALUE, &g_value, sizeof(g_value) },
2732 { CKA_CLASS, &g_class, sizeof(g_class) },
2733 { CKA_TOKEN, &g_private, sizeof(g_private) },
2734 };
2735
2736 CK_ATTRIBUTE get_attr_template_am[] = {
2737 { CKA_ALLOWED_MECHANISMS, &g_mecha_list, sizeof(g_mecha_list) },
2738 };
2739
2740 rv = init_lib_and_find_token_slot(&slot);
2741 if (!ADBG_EXPECT_CK_OK(c, rv))
2742 return;
2743
2744 rv = init_test_token(slot);
2745 if (!ADBG_EXPECT_CK_OK(c, rv))
2746 goto close_lib;
2747
2748 rv = init_user_test_token(slot);
2749 if (!ADBG_EXPECT_CK_OK(c, rv))
2750 goto close_lib;
2751
2752 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
2753 if (!ADBG_EXPECT_CK_OK(c, rv))
2754 goto close_lib;
2755
2756 /* Session Public Obj CKA_TOKEN = CK_FALSE, CKA_PRIVATE = CK_FALSE */
2757 rv = C_CreateObject(session, object_template,
2758 ARRAY_SIZE(object_template), &obj_hdl);
2759 if (!ADBG_EXPECT_CK_OK(c, rv))
2760 goto out;
2761
2762 /*
2763 * Sub test: Test Boolean (1 byte) + object class (CK_ULONG)
2764 */
2765 Do_ADBG_BeginSubCase(c, "Get Attribute - boolean + class");
2766 g_token = CK_TRUE;
2767 g_class = ~0;
2768
2769 rv = C_GetAttributeValue(session, obj_hdl, get_attr_template_bc,
2770 ARRAY_SIZE(get_attr_template_bc));
2771 if (!ADBG_EXPECT_CK_OK(c, rv))
2772 goto out;
2773
2774 ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_DATA);
2775 ADBG_EXPECT_COMPARE_UNSIGNED(c, g_token, ==, CK_FALSE);
2776
2777 Do_ADBG_EndSubCase(c, NULL);
2778
2779 /*
2780 * Sub test: object class (CK_ULONG) + Test Boolean (1 byte)
2781 */
2782 Do_ADBG_BeginSubCase(c, "Get Attribute - class + boolean");
2783 g_token = CK_TRUE;
2784 g_class = ~0;
2785
2786 rv = C_GetAttributeValue(session, obj_hdl, get_attr_template_cb,
2787 ARRAY_SIZE(get_attr_template_cb));
2788 if (!ADBG_EXPECT_CK_OK(c, rv))
2789 goto out;
2790
2791 ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_DATA);
2792 ADBG_EXPECT_COMPARE_UNSIGNED(c, g_token, ==, CK_FALSE);
2793
2794 Do_ADBG_EndSubCase(c, NULL);
2795
2796 /*
Vesa Jääskeläinen2f068b12021-06-27 17:46:53 +03002797 * Sub test: Query size boolean (1 byte) + object class (CK_ULONG)
2798 */
2799 Do_ADBG_BeginSubCase(c, "Get Attribute - query size boolean + class");
2800 g_token = CK_TRUE;
2801 g_class = ~0;
2802
2803 rv = C_GetAttributeValue(session, obj_hdl, get_attr_template_query_bc,
2804 ARRAY_SIZE(get_attr_template_query_bc));
2805 if (!ADBG_EXPECT_CK_OK(c, rv))
2806 goto out;
2807
2808 ADBG_EXPECT_COMPARE_UNSIGNED(c,
2809 get_attr_template_query_bc[0].ulValueLen, ==, 1);
2810 ADBG_EXPECT_COMPARE_UNSIGNED(c,
2811 get_attr_template_query_bc[1].ulValueLen, ==, sizeof(CK_ULONG));
2812
2813 Do_ADBG_EndSubCase(c, NULL);
2814
2815 /*
2816 * Sub test: Query size object class (CK_ULONG) + boolean (1 byte)
2817 */
2818 Do_ADBG_BeginSubCase(c, "Get Attribute - query size class + boolean");
2819 g_token = CK_TRUE;
2820 g_class = ~0;
2821
2822 rv = C_GetAttributeValue(session, obj_hdl, get_attr_template_query_cb,
2823 ARRAY_SIZE(get_attr_template_query_cb));
2824 if (!ADBG_EXPECT_CK_OK(c, rv))
2825 goto out;
2826
2827 ADBG_EXPECT_COMPARE_UNSIGNED(c,
2828 get_attr_template_query_cb[0].ulValueLen, ==, sizeof(CK_ULONG));
2829 ADBG_EXPECT_COMPARE_UNSIGNED(c,
2830 get_attr_template_query_cb[1].ulValueLen, ==, 1);
2831
2832 Do_ADBG_EndSubCase(c, NULL);
2833
2834 /*
Vesa Jääskeläinen33ada292021-01-13 23:17:55 +02002835 * Sub test: value with exact size
2836 */
2837 Do_ADBG_BeginSubCase(c, "Get Attribute - value with exact size buffer");
2838 memset(g_value, 0xCC, sizeof(g_value));
2839
2840 rv = C_GetAttributeValue(session, obj_hdl, get_attr_template_ve,
2841 ARRAY_SIZE(get_attr_template_ve));
2842 if (!ADBG_EXPECT_CK_OK(c, rv))
2843 goto out;
2844
2845 ADBG_EXPECT_COMPARE_UNSIGNED(c, get_attr_template_ve[0].ulValueLen, ==, sizeof(obj_value));
2846 ADBG_EXPECT_EQUAL(c, g_value, obj_value, sizeof(obj_value));
2847 for (i = sizeof(obj_value); i < sizeof(g_value); i++)
2848 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, g_value[i], ==, 0xCC))
2849 break;
2850
2851 Do_ADBG_EndSubCase(c, NULL);
2852
2853 /*
2854 * Sub test: value with larger buffer
2855 */
2856 Do_ADBG_BeginSubCase(c, "Get Attribute - value with larger buffer");
2857 memset(g_value, 0xCC, sizeof(g_value));
2858
2859 rv = C_GetAttributeValue(session, obj_hdl, get_attr_template_vl,
2860 ARRAY_SIZE(get_attr_template_vl));
2861 if (!ADBG_EXPECT_CK_OK(c, rv))
2862 goto out;
2863
2864 ADBG_EXPECT_COMPARE_UNSIGNED(c, get_attr_template_vl[0].ulValueLen, ==, sizeof(obj_value));
2865 ADBG_EXPECT_EQUAL(c, g_value, obj_value, sizeof(obj_value));
2866 for (i = sizeof(obj_value); i < sizeof(g_value); i++)
2867 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, g_value[i], ==, 0xCC))
2868 break;
2869
2870 Do_ADBG_EndSubCase(c, NULL);
2871
2872 /*
2873 * Sub test: bool + value with exact size + class + bool
2874 */
2875 Do_ADBG_BeginSubCase(c, "Get Attribute - bool + value with exact size + class + bool");
2876 memset(g_value, 0xCC, sizeof(g_value));
2877 g_token = CK_TRUE;
2878 g_private = CK_TRUE;
2879 g_class = ~0;
2880
2881 rv = C_GetAttributeValue(session, obj_hdl, get_attr_template_bvecb,
2882 ARRAY_SIZE(get_attr_template_bvecb));
2883 if (!ADBG_EXPECT_CK_OK(c, rv))
2884 goto out;
2885
2886 ADBG_EXPECT_COMPARE_UNSIGNED(c, get_attr_template_bvecb[1].ulValueLen,
2887 ==, sizeof(obj_value));
2888 ADBG_EXPECT_EQUAL(c, g_value, obj_value, sizeof(obj_value));
2889 for (i = sizeof(obj_value); i < sizeof(g_value); i++)
2890 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, g_value[i], ==, 0xCC))
2891 break;
2892
2893 ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_DATA);
2894 ADBG_EXPECT_COMPARE_UNSIGNED(c, g_token, ==, CK_FALSE);
2895 ADBG_EXPECT_COMPARE_UNSIGNED(c, g_private, ==, CK_FALSE);
2896
2897 Do_ADBG_EndSubCase(c, NULL);
2898
2899 /*
2900 * Sub test: bool + value with larger buffer + class + bool
2901 */
2902 Do_ADBG_BeginSubCase(c, "Get Attribute - bool + value with larger buffer + class + bool");
2903 memset(g_value, 0xCC, sizeof(g_value));
2904 g_token = CK_TRUE;
2905 g_private = CK_TRUE;
2906 g_class = ~0;
2907
2908 rv = C_GetAttributeValue(session, obj_hdl, get_attr_template_bvlcb,
2909 ARRAY_SIZE(get_attr_template_bvlcb));
2910 if (!ADBG_EXPECT_CK_OK(c, rv))
2911 goto out;
2912
2913 ADBG_EXPECT_COMPARE_UNSIGNED(c, get_attr_template_bvlcb[1].ulValueLen,
2914 ==, sizeof(obj_value));
2915 ADBG_EXPECT_EQUAL(c, g_value, obj_value, sizeof(obj_value));
2916 for (i = sizeof(obj_value); i < sizeof(g_value); i++)
2917 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, g_value[i], ==, 0xCC))
2918 break;
2919
2920 ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_DATA);
2921 ADBG_EXPECT_COMPARE_UNSIGNED(c, g_token, ==, CK_FALSE);
2922 ADBG_EXPECT_COMPARE_UNSIGNED(c, g_private, ==, CK_FALSE);
2923
2924 Do_ADBG_EndSubCase(c, NULL);
2925
2926 /*
2927 * Sub test: allowed mechanism list
2928 */
2929 Do_ADBG_BeginSubCase(c, "Get Attribute - allowed mechanism list");
2930 memset(g_mecha_list, 0xCC, sizeof(g_mecha_list));
2931
2932 rv = C_GenerateKey(session, &cktest_gensecret_keygen_mechanism,
2933 secret_template, ARRAY_SIZE(secret_template),
2934 &key_hdl);
2935 if (!ADBG_EXPECT_CK_OK(c, rv))
2936 goto out;
2937
2938 rv = C_GetAttributeValue(session, key_hdl, get_attr_template_am,
2939 ARRAY_SIZE(get_attr_template_am));
2940 if (!ADBG_EXPECT_CK_OK(c, rv))
2941 goto out;
2942
2943 ADBG_EXPECT_COMPARE_UNSIGNED(c, get_attr_template_am[0].ulValueLen, ==,
2944 sizeof(secret_allowed_mecha));
2945
2946 for (i = 0; i < sizeof(secret_allowed_mecha) / sizeof(*secret_allowed_mecha); i++)
2947 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, g_mecha_list[i], ==, secret_allowed_mecha[i]))
2948 break;
2949
2950 data_ptr = (uint8_t *)g_mecha_list;
2951 for (i = sizeof(secret_allowed_mecha); i < sizeof(g_mecha_list); i++)
2952 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, data_ptr[i], ==, 0xCC))
2953 break;
2954
2955 Do_ADBG_EndSubCase(c, NULL);
2956
2957out:
2958 ADBG_EXPECT_CK_OK(c, C_CloseSession(session));
2959
2960close_lib:
2961 ADBG_EXPECT_CK_OK(c, close_lib());
2962}
2963ADBG_CASE_DEFINE(pkcs11, 1012, xtest_pkcs11_test_1012,
2964 "PKCS11: Serializer tests");
Ruchika Guptafdabbfa2021-01-25 11:55:18 +05302965
2966static void xtest_pkcs11_test_1013(ADBG_Case_t *c)
2967{
2968 CK_RV rv = CKR_GENERAL_ERROR;
2969 CK_SLOT_ID slot = 0;
2970 CK_SESSION_HANDLE rw_session = CK_INVALID_HANDLE;
2971 CK_SESSION_HANDLE ro_session = CK_INVALID_HANDLE;
2972 CK_FLAGS rw_session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
2973 CK_FLAGS ro_session_flags = CKF_SERIAL_SESSION;
2974 CK_OBJECT_HANDLE obj_hdl = CK_INVALID_HANDLE;
2975 const char *label = "Dummy Objects";
2976 bool ro_logged_in = false;
2977
2978 rv = init_lib_and_find_token_slot(&slot);
2979 if (!ADBG_EXPECT_CK_OK(c, rv))
2980 return;
2981
2982 rv = init_test_token(slot);
2983 if (!ADBG_EXPECT_CK_OK(c, rv))
2984 goto close_lib;
2985
2986 rv = init_user_test_token(slot);
2987 if (!ADBG_EXPECT_CK_OK(c, rv))
2988 goto close_lib;
2989
2990 /* Open a RW session */
2991 rv = C_OpenSession(slot, rw_session_flags, NULL, 0, &rw_session);
2992 if (!ADBG_EXPECT_CK_OK(c, rv))
2993 goto close_lib;
2994
2995 /* Open a RO session */
2996 rv = C_OpenSession(slot, ro_session_flags, NULL, 0, &ro_session);
2997 if (!ADBG_EXPECT_CK_OK(c, rv))
2998 goto close_lib;
2999
3000 /*
3001 * Sub test: Check object creation from a R/O Public session
3002 */
3003 Do_ADBG_BeginSubCase(c, "Create objects in R/O Public Session");
3004
3005 /* Session Public Obj CKA_TOKEN = CK_FALSE, CKA_PRIVATE = CK_FALSE */
3006 rv = create_data_object(ro_session, &obj_hdl, CK_FALSE,
3007 CK_FALSE, label);
3008 if (!ADBG_EXPECT_CK_OK(c, rv))
3009 goto out;
3010
3011 /* Session Private Obj CKA_TOKEN = CK_FALSE, CKA_PRIVATE = CK_TRUE */
3012 rv = create_data_object(ro_session, &obj_hdl, CK_FALSE,
3013 CK_TRUE, label);
3014 if (!ADBG_EXPECT_CK_RESULT(c, CKR_USER_NOT_LOGGED_IN, rv))
3015 goto out;
3016
3017 /* Token Public Obj CKA_TOKEN = CK_TRUE, CKA_PRIVATE = CK_FALSE */
3018 rv = create_data_object(ro_session, &obj_hdl, CK_TRUE,
3019 CK_FALSE, label);
3020 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SESSION_READ_ONLY, rv))
3021 goto out;
3022
3023 /* Token Private Obj CKA_TOKEN = CK_TRUE, CKA_PRIVATE = CK_TRUE */
3024 rv = create_data_object(ro_session, &obj_hdl, CK_TRUE,
3025 CK_TRUE, label);
3026 /* For Token object creation, SESSION_READ_ONLY will take priority */
3027 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SESSION_READ_ONLY, rv))
3028 goto out;
3029
3030 Do_ADBG_EndSubCase(c, NULL);
3031
3032 /*
3033 * Sub test: Check access for a R/W Public session
3034 */
3035 Do_ADBG_BeginSubCase(c, "Create objects in R/O Public Session");
3036
3037 /* Session Public Obj CKA_TOKEN = CK_FALSE, CKA_PRIVATE = CK_FALSE */
3038 rv = create_data_object(rw_session, &obj_hdl, CK_FALSE,
3039 CK_FALSE, label);
3040 if (!ADBG_EXPECT_CK_OK(c, rv))
3041 goto out;
3042
3043 /* Session Private Obj CKA_TOKEN = CK_FALSE, CKA_PRIVATE = CK_TRUE */
3044 rv = create_data_object(rw_session, &obj_hdl, CK_FALSE,
3045 CK_TRUE, label);
3046 if (!ADBG_EXPECT_CK_RESULT(c, CKR_USER_NOT_LOGGED_IN, rv))
3047 goto out;
3048
3049 /* Token Public Obj CKA_TOKEN = CK_TRUE, CKA_PRIVATE = CK_FALSE */
3050 rv = create_data_object(rw_session, &obj_hdl, CK_TRUE,
3051 CK_FALSE, label);
3052 if (!ADBG_EXPECT_CK_OK(c, rv))
3053 goto out;
3054
3055 /* Token Private Obj CKA_TOKEN = CK_TRUE, CKA_PRIVATE = CK_TRUE */
3056 rv = create_data_object(rw_session, &obj_hdl, CK_TRUE,
3057 CK_TRUE, label);
3058 if (!ADBG_EXPECT_CK_RESULT(c, CKR_USER_NOT_LOGGED_IN, rv))
3059 goto out;
3060
3061 Do_ADBG_EndSubCase(c, NULL);
3062
3063 /*
3064 * Sub test: Check access for a R/O User session
3065 */
3066 Do_ADBG_BeginSubCase(c, "Create objects in R/O User Session");
3067
3068 /* Login to Test Token */
3069 rv = C_Login(ro_session, CKU_USER, test_token_user_pin,
3070 sizeof(test_token_user_pin));
3071 if (!ADBG_EXPECT_CK_OK(c, rv))
3072 goto out;
3073
3074 ro_logged_in = true;
3075
3076 /* Session Public Obj CKA_TOKEN = CK_FALSE, CKA_PRIVATE = CK_FALSE */
3077 rv = create_data_object(ro_session, &obj_hdl, CK_FALSE,
3078 CK_FALSE, label);
3079 if (!ADBG_EXPECT_CK_OK(c, rv))
3080 goto out;
3081
3082 /* Session Private Obj CKA_TOKEN = CK_FALSE, CKA_PRIVATE = CK_TRUE */
3083 rv = create_data_object(ro_session, &obj_hdl, CK_FALSE,
3084 CK_TRUE, label);
3085 if (!ADBG_EXPECT_CK_OK(c, rv))
3086 goto out;
3087
3088 /* Token Public Obj CKA_TOKEN = CK_TRUE, CKA_PRIVATE = CK_FALSE */
3089 rv = create_data_object(ro_session, &obj_hdl, CK_TRUE,
3090 CK_FALSE, label);
3091 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SESSION_READ_ONLY, rv))
3092 goto out;
3093
3094 /* Token Private Obj CKA_TOKEN = CK_TRUE, CKA_PRIVATE = CK_TRUE */
3095 rv = create_data_object(ro_session, &obj_hdl, CK_TRUE,
3096 CK_TRUE, label);
3097 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SESSION_READ_ONLY, rv))
3098 goto out;
3099
3100 Do_ADBG_EndSubCase(c, NULL);
3101
3102 /*
3103 * Sub test: Check access for a R/W User session
3104 */
3105 Do_ADBG_BeginSubCase(c, "Create objects in R/W User Session");
3106
3107 /* Session Public Obj CKA_TOKEN = CK_FALSE, CKA_PRIVATE = CK_FALSE */
3108 rv = create_data_object(rw_session, &obj_hdl, CK_FALSE,
3109 CK_FALSE, label);
3110 if (!ADBG_EXPECT_CK_OK(c, rv))
3111 goto out;
3112
3113 /* Session Private Obj CKA_TOKEN = CK_FALSE, CKA_PRIVATE = CK_TRUE */
3114 rv = create_data_object(rw_session, &obj_hdl, CK_FALSE,
3115 CK_TRUE, label);
3116 if (!ADBG_EXPECT_CK_OK(c, rv))
3117 goto out;
3118
3119 /* Token Public Obj CKA_TOKEN = CK_TRUE, CKA_PRIVATE = CK_FALSE */
3120 rv = create_data_object(rw_session, &obj_hdl, CK_TRUE,
3121 CK_FALSE, label);
3122 if (!ADBG_EXPECT_CK_OK(c, rv))
3123 goto out;
3124
3125 /* Token Private Obj CKA_TOKEN = CK_TRUE, CKA_PRIVATE = CK_TRUE */
3126 rv = create_data_object(rw_session, &obj_hdl, CK_TRUE,
3127 CK_TRUE, label);
3128 if (!ADBG_EXPECT_CK_OK(c, rv))
3129 goto out;
3130
3131 /* Log out */
3132 ADBG_EXPECT_CK_OK(c, C_Logout(ro_session));
3133 ro_logged_in = false;
3134
3135 /* Close RO session */
3136 ADBG_EXPECT_CK_OK(c, C_CloseSession(ro_session));
3137 ro_session = CK_INVALID_HANDLE;
3138
3139 Do_ADBG_EndSubCase(c, NULL);
3140
3141 /*
3142 * Sub test: Check access for a R/W SO session
3143 */
3144 Do_ADBG_BeginSubCase(c, "Create objects in R/W SO Session");
3145
3146 /* Login as security officer in RW session */
3147 rv = C_Login(rw_session, CKU_SO, test_token_so_pin,
3148 sizeof(test_token_so_pin));
3149 if (!ADBG_EXPECT_CK_OK(c, rv))
3150 goto out;
3151
3152 /* Session Public Obj CKA_TOKEN = CK_FALSE, CKA_PRIVATE = CK_FALSE */
3153 rv = create_data_object(rw_session, &obj_hdl, CK_FALSE,
3154 CK_FALSE, label);
3155 if (!ADBG_EXPECT_CK_OK(c, rv))
3156 goto logout;
3157
3158 /* Session Private Obj CKA_TOKEN = CK_FALSE, CKA_PRIVATE = CK_TRUE */
3159 rv = create_data_object(rw_session, &obj_hdl, CK_FALSE,
3160 CK_TRUE, label);
3161 if (!ADBG_EXPECT_CK_RESULT(c, CKR_USER_NOT_LOGGED_IN, rv))
3162 goto logout;
3163
3164 /* Token Public Obj CKA_TOKEN = CK_TRUE, CKA_PRIVATE = CK_FALSE */
3165 rv = create_data_object(rw_session, &obj_hdl, CK_TRUE,
3166 CK_FALSE, label);
3167 if (!ADBG_EXPECT_CK_OK(c, rv))
3168 goto logout;
3169
3170 /* Token Private Obj CKA_TOKEN = CK_TRUE, CKA_PRIVATE = CK_TRUE */
3171 rv = create_data_object(rw_session, &obj_hdl, CK_TRUE,
3172 CK_TRUE, label);
3173 if (!ADBG_EXPECT_CK_RESULT(c, CKR_USER_NOT_LOGGED_IN, rv))
3174 goto logout;
3175
3176logout:
3177 ADBG_EXPECT_CK_OK(c, C_Logout(rw_session));
3178out:
3179 if (ro_logged_in)
3180 ADBG_EXPECT_CK_OK(c, C_Logout(ro_session));
3181
3182 if (ro_session != CK_INVALID_HANDLE)
3183 ADBG_EXPECT_CK_OK(c, C_CloseSession(ro_session));
3184
3185 ADBG_EXPECT_CK_OK(c, C_CloseSession(rw_session));
3186
3187 Do_ADBG_EndSubCase(c, NULL);
3188
3189 destroy_persistent_objects(c, slot);
3190close_lib:
3191 ADBG_EXPECT_CK_OK(c, close_lib());
3192
3193}
3194ADBG_CASE_DEFINE(pkcs11, 1013, xtest_pkcs11_test_1013,
3195 "PKCS11: Object creation upon session type");
Ruchika Gupta1fe9d4e2021-01-28 13:52:27 +05303196
3197static void xtest_pkcs11_test_1014(ADBG_Case_t *c)
3198{
3199 CK_RV rv = CKR_GENERAL_ERROR;
3200 CK_SLOT_ID slot = 0;
3201 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
3202 CK_FLAGS session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
3203 CK_OBJECT_HANDLE obj_hdl = CK_INVALID_HANDLE;
3204 const char *id = "1";
3205 const char *label = "Dummy Objects";
3206 const char *new_label = "New Object lable";
3207 size_t n = 0;
3208 char *g_label[100] = { };
3209 char *g_id[100] = { };
3210 CK_MECHANISM_TYPE secret_allowed_mecha[] = { CKM_SHA_1_HMAC,
3211 CKM_SHA224_HMAC,
3212 CKM_SHA256_HMAC };
3213 CK_ATTRIBUTE secret_key_template[] = {
3214 { CKA_CLASS, &(CK_OBJECT_CLASS){CKO_SECRET_KEY},
3215 sizeof(CK_OBJECT_CLASS) },
3216 { CKA_TOKEN, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
3217 { CKA_PRIVATE, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
3218 { CKA_MODIFIABLE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3219 { CKA_COPYABLE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3220 { CKA_DESTROYABLE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3221 { CKA_EXTRACTABLE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3222 { CKA_KEY_TYPE, &(CK_KEY_TYPE){CKK_GENERIC_SECRET},
3223 sizeof(CK_KEY_TYPE) },
3224 { CKA_LABEL, (CK_UTF8CHAR_PTR)label, strlen(label) },
Ruchika Guptae86aba22021-03-11 00:36:01 +05303225 { CKA_VALUE, (void *)cktest_aes128_key, sizeof(cktest_aes128_key) },
Ruchika Gupta1fe9d4e2021-01-28 13:52:27 +05303226 { CKA_SIGN, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3227 { CKA_VERIFY, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3228 { CKA_ENCRYPT, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3229 { CKA_DECRYPT, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3230 { CKA_ALLOWED_MECHANISMS, secret_allowed_mecha,
3231 sizeof(secret_allowed_mecha) },
3232 };
3233 CK_BBOOL g_derive = CK_FALSE;
3234 CK_BBOOL g_sign = CK_FALSE;
3235 CK_BBOOL g_verify = CK_FALSE;
3236 CK_BBOOL g_encrypt = CK_FALSE;
3237 CK_BBOOL g_decrypt = CK_FALSE;
3238 CK_BBOOL g_wrap = CK_FALSE;
3239 CK_BBOOL g_unwrap = CK_FALSE;
Ruchika Guptae86aba22021-03-11 00:36:01 +05303240 uint32_t g_len = 0;
Ruchika Gupta1fe9d4e2021-01-28 13:52:27 +05303241 CK_ATTRIBUTE get_template[] = {
3242 { CKA_LABEL, (CK_UTF8CHAR_PTR)g_label, sizeof(g_label) },
3243 { CKA_ID, (CK_BYTE_PTR)g_id, sizeof(g_id) },
3244 { CKA_DERIVE, &g_derive, sizeof(CK_BBOOL) },
3245 { CKA_SIGN, &g_sign, sizeof(CK_BBOOL) },
3246 { CKA_VERIFY, &g_verify, sizeof(CK_BBOOL) },
3247 { CKA_ENCRYPT, &g_encrypt, sizeof(CK_BBOOL) },
3248 { CKA_DECRYPT, &g_decrypt, sizeof(CK_BBOOL) },
3249 { CKA_WRAP, &g_wrap, sizeof(CK_BBOOL) },
3250 { CKA_UNWRAP, &g_unwrap, sizeof(CK_BBOOL) },
Ruchika Guptae86aba22021-03-11 00:36:01 +05303251 { CKA_VALUE_LEN, &g_len, sizeof(CK_ULONG) },
Ruchika Gupta1fe9d4e2021-01-28 13:52:27 +05303252 };
3253 CK_ATTRIBUTE set_template[] = {
3254 { CKA_LABEL, (CK_UTF8CHAR_PTR)new_label, strlen(new_label) },
3255 { CKA_ID, (CK_BYTE_PTR)id, strlen(id) },
3256 { CKA_DERIVE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3257 { CKA_WRAP, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3258 { CKA_UNWRAP, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3259 { CKA_SIGN, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
3260 { CKA_VERIFY, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
3261 { CKA_ENCRYPT, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
3262 { CKA_DECRYPT, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
3263 /* CKA_SENSITIVE -> CK_FALSE to CK_TRUE is allowed */
3264 { CKA_SENSITIVE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3265 /* CKA_EXTRACTABLE -> CK_TRUE to CK_FALSE is allowed */
3266 { CKA_EXTRACTABLE, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
3267 /* CKA_COPYABLE -> CK_TRUE to CK_FALSE is allowed */
3268 { CKA_COPYABLE, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
3269 };
3270 CK_ATTRIBUTE set_inv_template1[] = {
3271 /* Attributes Not Modifiable */
3272 { CKA_CLASS, &(CK_OBJECT_CLASS){CKO_DATA},
3273 sizeof(CK_OBJECT_CLASS) },
3274 { CKA_LOCAL, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3275 { CKA_ALWAYS_SENSITIVE, &(CK_BBOOL){CK_FALSE},
3276 sizeof(CK_BBOOL) },
3277 { CKA_NEVER_EXTRACTABLE, &(CK_BBOOL){CK_FALSE},
3278 sizeof(CK_BBOOL) },
3279 { CKA_TOKEN, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3280 { CKA_PRIVATE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3281 { CKA_MODIFIABLE, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
3282 { CKA_DESTROYABLE, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
3283 /* Change not allowed from CK_TRUE -> CK_FALSE */
3284 { CKA_SENSITIVE, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
3285 /* Change not allowed from CK_FALSE -> CK_TRUE */
3286 { CKA_EXTRACTABLE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3287 { CKA_COPYABLE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3288 };
3289 CK_ATTRIBUTE set_inv_template2[] = {
3290 { CKA_APPLICATION, (CK_UTF8CHAR_PTR)label, sizeof(label) },
3291 };
3292 CK_ATTRIBUTE set_trusted_template[] = {
3293 { CKA_TRUSTED, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3294 };
3295
3296 rv = init_lib_and_find_token_slot(&slot);
3297 if (!ADBG_EXPECT_CK_OK(c, rv))
3298 return;
3299
3300 rv = init_test_token(slot);
3301 if (!ADBG_EXPECT_CK_OK(c, rv))
3302 goto close_lib;
3303
3304 rv = init_user_test_token(slot);
3305 if (!ADBG_EXPECT_CK_OK(c, rv))
3306 goto close_lib;
3307
3308 /* Open a RW session */
3309 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
3310 if (!ADBG_EXPECT_CK_OK(c, rv))
3311 goto close_lib;
3312
3313 /* Create a secret key object */
3314 rv = C_CreateObject(session, secret_key_template,
3315 ARRAY_SIZE(secret_key_template), &obj_hdl);
3316 if (!ADBG_EXPECT_CK_OK(c, rv))
3317 goto close_session;
3318
3319 Do_ADBG_BeginSubCase(c, "Set attributes on secret key object");
3320
3321 rv = C_GetAttributeValue(session, obj_hdl, get_template,
3322 ARRAY_SIZE(get_template));
3323 if (!ADBG_EXPECT_CK_OK(c, rv) ||
3324 !ADBG_EXPECT_BUFFER(c, label, strlen(label), g_label,
3325 get_template[0].ulValueLen) ||
3326 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_derive, ==, CK_FALSE) ||
3327 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_wrap, ==, CK_FALSE) ||
3328 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_unwrap, ==, CK_FALSE) ||
3329 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_encrypt, ==, CK_TRUE) ||
3330 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_decrypt, ==, CK_TRUE) ||
3331 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sign, ==, CK_TRUE) ||
3332 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_verify, ==, CK_TRUE) ||
Ruchika Guptae86aba22021-03-11 00:36:01 +05303333 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_len, ==, 16) ||
Ruchika Gupta1fe9d4e2021-01-28 13:52:27 +05303334 !ADBG_EXPECT_COMPARE_UNSIGNED(c, get_template[1].ulValueLen, ==, 0))
3335 goto out;
3336
3337 rv = C_SetAttributeValue(session, obj_hdl, set_template,
3338 ARRAY_SIZE(set_template));
3339 if (!ADBG_EXPECT_CK_OK(c, rv))
3340 goto out;
3341
3342 get_template[0].ulValueLen = sizeof(g_label);
3343 get_template[1].ulValueLen = sizeof(g_id);
3344 rv = C_GetAttributeValue(session, obj_hdl, get_template,
3345 ARRAY_SIZE(get_template));
3346 if (!ADBG_EXPECT_CK_OK(c, rv) ||
3347 !ADBG_EXPECT_BUFFER(c, new_label, strlen(new_label), g_label,
3348 get_template[0].ulValueLen) ||
3349 !ADBG_EXPECT_BUFFER(c, id, strlen(id), g_id,
3350 get_template[1].ulValueLen) ||
3351 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_derive, ==, CK_TRUE) ||
3352 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_wrap, ==, CK_TRUE) ||
3353 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_unwrap, ==, CK_TRUE) ||
3354 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_encrypt, ==, CK_FALSE) ||
3355 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_decrypt, ==, CK_FALSE) ||
3356 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sign, ==, CK_FALSE) ||
3357 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_verify, ==, CK_FALSE))
3358 goto out;
3359
3360 Do_ADBG_EndSubCase(c, NULL);
3361
3362 Do_ADBG_BeginSubCase(c, "Test Invalid template with R/O Attributes");
3363
3364 for (n = 0; n < ARRAY_SIZE(set_inv_template1); n++) {
3365 rv = C_SetAttributeValue(session, obj_hdl,
3366 &set_inv_template1[n], 1);
3367 if (!ADBG_EXPECT_CK_RESULT(c, CKR_ATTRIBUTE_READ_ONLY, rv))
3368 goto out;
3369 }
3370
3371 Do_ADBG_EndSubCase(c, NULL);
3372
3373 Do_ADBG_BeginSubCase(c, "Test Invalid template with Invalid Attribute");
3374
3375 rv = C_SetAttributeValue(session, obj_hdl, set_inv_template2,
3376 ARRAY_SIZE(set_inv_template2));
3377 if (!ADBG_EXPECT_CK_RESULT(c, CKR_ATTRIBUTE_TYPE_INVALID, rv))
3378 goto out;
3379
3380 Do_ADBG_EndSubCase(c, NULL);
3381
3382 Do_ADBG_BeginSubCase(c, "Set CKA_TRUSTED with and w/o SO Login");
3383
3384 rv = C_SetAttributeValue(session, obj_hdl, set_trusted_template,
3385 ARRAY_SIZE(set_trusted_template));
3386 if (!ADBG_EXPECT_CK_RESULT(c, CKR_ATTRIBUTE_READ_ONLY, rv))
3387 goto out;
3388
3389 /* Login as SO in RW session */
3390 rv = C_Login(session, CKU_SO, test_token_so_pin,
3391 sizeof(test_token_so_pin));
3392 if (!ADBG_EXPECT_CK_OK(c, rv))
3393 goto out;
3394
3395 rv = C_SetAttributeValue(session, obj_hdl, set_trusted_template,
3396 ARRAY_SIZE(set_trusted_template));
3397 ADBG_EXPECT_CK_OK(c, rv);
3398
3399 ADBG_EXPECT_CK_OK(c, C_Logout(session));
3400out:
3401 ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, obj_hdl));
3402
3403 Do_ADBG_EndSubCase(c, NULL);
3404
3405close_session:
3406 ADBG_EXPECT_CK_OK(c, C_CloseSession(session));
3407
3408close_lib:
3409 ADBG_EXPECT_CK_OK(c, close_lib());
3410}
3411ADBG_CASE_DEFINE(pkcs11, 1014, xtest_pkcs11_test_1014,
3412 "PKCS11: Test C_SetAttributeValue()");
Ruchika Gupta1f60ed42021-02-02 13:15:58 +05303413
3414static void xtest_pkcs11_test_1015(ADBG_Case_t *c)
3415{
3416 CK_RV rv = CKR_GENERAL_ERROR;
3417 CK_SLOT_ID slot = 0;
3418 CK_SESSION_HANDLE rw_session = CK_INVALID_HANDLE;
3419 CK_SESSION_HANDLE ro_session = CK_INVALID_HANDLE;
3420 CK_FLAGS rw_session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
3421 CK_FLAGS ro_session_flags = CKF_SERIAL_SESSION;
3422 CK_OBJECT_HANDLE obj_hdl = CK_INVALID_HANDLE;
3423 CK_OBJECT_HANDLE obj_hdl_ro = CK_INVALID_HANDLE;
3424 CK_OBJECT_HANDLE obj_hdl_cp = CK_INVALID_HANDLE;
3425 const char *label = "Dummy Objects";
Ruchika Guptae86aba22021-03-11 00:36:01 +05303426 CK_ATTRIBUTE secret_key_create_template[] = {
3427 { CKA_CLASS, &(CK_OBJECT_CLASS){CKO_SECRET_KEY},
3428 sizeof(CK_OBJECT_CLASS) },
3429 { CKA_KEY_TYPE, &(CK_KEY_TYPE){CKK_AES}, sizeof(CK_KEY_TYPE) },
3430 { CKA_TOKEN, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
3431 { CKA_PRIVATE, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
3432 { CKA_MODIFIABLE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3433 { CKA_COPYABLE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3434 { CKA_DESTROYABLE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3435 { CKA_EXTRACTABLE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3436 { CKA_VALUE, (void *)cktest_aes128_key, sizeof(cktest_aes128_key) },
3437 };
Ruchika Gupta1f60ed42021-02-02 13:15:58 +05303438 CK_ATTRIBUTE secret_key_template[] = {
3439 { CKA_CLASS, &(CK_OBJECT_CLASS){CKO_SECRET_KEY},
3440 sizeof(CK_OBJECT_CLASS) },
3441 { CKA_KEY_TYPE, &(CK_KEY_TYPE){CKK_AES}, sizeof(CK_KEY_TYPE) },
3442 { CKA_TOKEN, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
3443 { CKA_PRIVATE, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
3444 { CKA_MODIFIABLE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3445 { CKA_COPYABLE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3446 { CKA_DESTROYABLE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3447 { CKA_EXTRACTABLE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3448 { CKA_VALUE_LEN, &(CK_ULONG){16}, sizeof(CK_ULONG) },
3449 };
3450 CK_BBOOL g_token = CK_FALSE;
3451 CK_BBOOL g_private = CK_FALSE;
3452 CK_BBOOL g_modify = CK_FALSE;
3453 CK_BBOOL g_copy = CK_FALSE;
3454 CK_BBOOL g_destroy = CK_FALSE;
3455 CK_BBOOL g_extract = CK_FALSE;
3456 CK_BBOOL g_sensitive = CK_FALSE;
3457 CK_BBOOL g_nextract = CK_FALSE;
3458 CK_BBOOL g_asensitive = CK_FALSE;
3459 CK_BBOOL g_local = CK_FALSE;
Vesa Jääskeläinen06f428a2021-06-27 20:02:29 +03003460 CK_BYTE g_value[16] = { };
Ruchika Gupta1f60ed42021-02-02 13:15:58 +05303461 CK_ATTRIBUTE get_template[] = {
3462 { CKA_TOKEN, &g_token, sizeof(CK_BBOOL) },
3463 { CKA_PRIVATE, &g_private, sizeof(CK_BBOOL) },
3464 { CKA_MODIFIABLE, &g_modify, sizeof(CK_BBOOL) },
3465 { CKA_COPYABLE, &g_copy, sizeof(CK_BBOOL) },
3466 { CKA_DESTROYABLE, &g_destroy, sizeof(CK_BBOOL) },
3467 { CKA_EXTRACTABLE, &g_extract, sizeof(CK_BBOOL) },
3468 { CKA_SENSITIVE, &g_sensitive, sizeof(CK_BBOOL) },
3469 { CKA_NEVER_EXTRACTABLE, &g_nextract, sizeof(CK_BBOOL) },
3470 { CKA_ALWAYS_SENSITIVE, &g_asensitive, sizeof(CK_BBOOL) },
3471 { CKA_LOCAL, &g_local, sizeof(CK_BBOOL) },
3472 };
Vesa Jääskeläinen06f428a2021-06-27 20:02:29 +03003473 CK_ATTRIBUTE get_value_template[] = {
3474 { CKA_VALUE, &g_value, sizeof(g_value) }
3475 };
Ruchika Gupta1f60ed42021-02-02 13:15:58 +05303476 CK_ATTRIBUTE copy_template[] = {
3477 { CKA_TOKEN, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3478 { CKA_MODIFIABLE, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
3479 { CKA_EXTRACTABLE, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
3480 { CKA_SENSITIVE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3481 };
3482 CK_ATTRIBUTE copy_template_inv[] = {
3483 { CKA_APPLICATION, (CK_UTF8CHAR_PTR)label, sizeof(label) },
3484 };
3485 CK_ATTRIBUTE copy_template_priv[] = {
3486 { CKA_PRIVATE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3487 };
3488 CK_ATTRIBUTE set_template[] = {
3489 { CKA_COPYABLE, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
3490 };
3491
3492 rv = init_lib_and_find_token_slot(&slot);
3493 if (!ADBG_EXPECT_CK_OK(c, rv))
3494 return;
3495
3496 rv = init_test_token(slot);
3497 if (!ADBG_EXPECT_CK_OK(c, rv))
3498 goto close_lib;
3499
3500 rv = init_user_test_token(slot);
3501 if (!ADBG_EXPECT_CK_OK(c, rv))
3502 goto close_lib;
3503
3504 /* Open a RW session */
3505 rv = C_OpenSession(slot, rw_session_flags, NULL, 0, &rw_session);
3506 if (!ADBG_EXPECT_CK_OK(c, rv))
3507 goto close_lib;
3508
3509 /* Open a RO session */
3510 rv = C_OpenSession(slot, ro_session_flags, NULL, 0, &ro_session);
3511 if (!ADBG_EXPECT_CK_OK(c, rv))
3512 goto close_session;
3513
Ruchika Guptaf2eb88a2021-03-22 19:38:11 +05303514 /*
3515 * All objects in this test are session objects hence released at
3516 * session closure on test completion.
3517 */
3518
Ruchika Gupta1f60ed42021-02-02 13:15:58 +05303519 /* Generate a secret key object in rw session */
3520 rv = C_GenerateKey(rw_session, &cktest_aes_keygen_mechanism,
3521 secret_key_template,
3522 ARRAY_SIZE(secret_key_template), &obj_hdl);
3523 if (!ADBG_EXPECT_CK_OK(c, rv))
3524 goto close_session;
3525
3526 /* Check its attribute values */
3527 rv = C_GetAttributeValue(rw_session, obj_hdl, get_template,
3528 ARRAY_SIZE(get_template));
3529 if (!ADBG_EXPECT_CK_OK(c, rv) ||
3530 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_token, ==, CK_FALSE) ||
3531 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_private, ==, CK_FALSE) ||
3532 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_modify, ==, CK_TRUE) ||
3533 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_copy, ==, CK_TRUE) ||
3534 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_destroy, ==, CK_TRUE) ||
3535 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_TRUE) ||
3536 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_extract, ==, CK_TRUE) ||
3537 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_nextract, ==, CK_FALSE) ||
3538 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sensitive, ==, CK_FALSE) ||
3539 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_asensitive, ==, CK_FALSE))
3540 goto close_session;
3541
Vesa Jääskeläinen06f428a2021-06-27 20:02:29 +03003542 /* Check that we can get (secret) CKA_VALUE */
3543 get_value_template[0].ulValueLen = sizeof(g_value);
3544 rv = C_GetAttributeValue(rw_session, obj_hdl, get_value_template,
3545 ARRAY_SIZE(get_value_template));
3546 if (!ADBG_EXPECT_CK_OK(c, rv) ||
3547 !ADBG_EXPECT_COMPARE_UNSIGNED(c, get_value_template[0].ulValueLen,
3548 ==, sizeof(g_value)))
3549 goto close_session;
3550
Ruchika Gupta1f60ed42021-02-02 13:15:58 +05303551 /* Create a secret key object in ro session*/
Ruchika Guptae86aba22021-03-11 00:36:01 +05303552 rv = C_CreateObject(ro_session, secret_key_create_template,
3553 ARRAY_SIZE(secret_key_create_template), &obj_hdl_ro);
Ruchika Gupta1f60ed42021-02-02 13:15:58 +05303554 if (!ADBG_EXPECT_CK_OK(c, rv))
3555 goto close_session;
3556
3557 /*
3558 * Duplicate the object generated in RW session using C_GenerateKey() to
3559 * another object. Pass Template as NULL and test the attributes of
3560 * new created object.
3561 */
3562 Do_ADBG_BeginSubCase(c, "Copy Local Obj with NULL Template");
3563 rv = C_CopyObject(rw_session, obj_hdl, NULL, 0, &obj_hdl_cp);
3564 if (!ADBG_EXPECT_CK_OK(c, rv))
3565 goto out;
3566
3567 /*
3568 * Check its attribute values, should match the original object.
3569 * CKA_LOCAL shall be TRUE even in copied object as original object
3570 * was generated using C_GenerateKey()
3571 */
3572 rv = C_GetAttributeValue(rw_session, obj_hdl_cp, get_template,
3573 ARRAY_SIZE(get_template));
3574 if (!ADBG_EXPECT_CK_OK(c, rv) ||
3575 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_token, ==, CK_FALSE) ||
3576 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_private, ==, CK_FALSE) ||
3577 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_modify, ==, CK_TRUE) ||
3578 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_copy, ==, CK_TRUE) ||
3579 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_destroy, ==, CK_TRUE) ||
3580 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_TRUE) ||
3581 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_extract, ==, CK_TRUE) ||
3582 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_nextract, ==, CK_FALSE) ||
3583 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sensitive, ==, CK_FALSE) ||
3584 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_asensitive, ==, CK_FALSE))
3585 goto out;
3586
3587 rv = C_DestroyObject(rw_session, obj_hdl_cp);
3588 if (!ADBG_EXPECT_CK_OK(c, rv))
3589 goto out;
3590
3591 obj_hdl_cp = CK_INVALID_HANDLE;
3592
3593 Do_ADBG_EndSubCase(c, NULL);
3594
3595 /*
3596 * Duplicate the object generated in RO session using C_CreateObject()
3597 * to another object. Pass Template as NULL and test the attributes of
3598 * new created object.
3599 */
3600 Do_ADBG_BeginSubCase(c, "Copy a non-local object with NULL Template");
3601
3602 /* Copy ro session object */
3603 rv = C_CopyObject(ro_session, obj_hdl_ro, NULL, 0, &obj_hdl_cp);
3604 if (!ADBG_EXPECT_CK_OK(c, rv))
3605 goto out;
3606
3607 /*
3608 * Check its attribute values, should match the original object.
3609 * CKA_LOCAL shall be FALSE even in copied object as original object
3610 * was generated using C_CreateObject()
3611 */
3612 rv = C_GetAttributeValue(ro_session, obj_hdl_cp, get_template,
3613 ARRAY_SIZE(get_template));
3614 if (!ADBG_EXPECT_CK_OK(c, rv) ||
3615 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_token, ==, CK_FALSE) ||
3616 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_private, ==, CK_FALSE) ||
3617 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_modify, ==, CK_TRUE) ||
3618 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_copy, ==, CK_TRUE) ||
3619 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_destroy, ==, CK_TRUE) ||
3620 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_FALSE) ||
3621 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_extract, ==, CK_TRUE) ||
3622 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_nextract, ==, CK_FALSE) ||
3623 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sensitive, ==, CK_FALSE) ||
3624 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_asensitive, ==, CK_FALSE))
3625 goto out;
3626
3627 rv = C_DestroyObject(ro_session, obj_hdl_cp);
3628 if (!ADBG_EXPECT_CK_OK(c, rv))
3629 goto out;
3630
3631 obj_hdl_cp = CK_INVALID_HANDLE;
3632
3633 Do_ADBG_EndSubCase(c, NULL);
3634
3635 /*
3636 * Test copying object with a valid template and check if attributes
3637 * get modified as indicated in the template. Checks modification of
3638 * attributes like CKA_TOKEN, CKA_MODIFIABLE which were not modifiable
3639 * via C_SetAttributeValue(). Also modifies the CKA_SENSITIVE,
3640 * CKA_EXTRACTABLE and checks corresponding values of RO attributes
3641 * CKA_ALWAYS_SENSITIVE and CKA_NEVER_EXTRACTABLE.
3642 */
3643 Do_ADBG_BeginSubCase(c, "Copy Object with Valid Template");
3644
3645 /*
3646 * Copy Session Object as a Token object
3647 * Properties CKA_MODIFIABLE turned to FALSE
3648 * CKA_EXTRACTABLE changed from TRUE to FALSE
3649 * CKA_NEVER_EXTRACTABLE should be FALSE.
3650 * CKA_SENSITIVE set to TRUE
3651 * However CKA_ALWAYS_SENSITIVE should be FALSE
3652 */
3653 rv = C_CopyObject(rw_session, obj_hdl, copy_template,
3654 ARRAY_SIZE(copy_template), &obj_hdl_cp);
3655 if (!ADBG_EXPECT_CK_OK(c, rv))
3656 goto out;
3657
3658 /* Check the changed attribute values */
3659 rv = C_GetAttributeValue(rw_session, obj_hdl_cp, get_template,
3660 ARRAY_SIZE(get_template));
3661 if (!ADBG_EXPECT_CK_OK(c, rv) ||
3662 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_token, ==, CK_TRUE) ||
3663 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_modify, ==, CK_FALSE) ||
3664 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_extract, ==, CK_FALSE) ||
3665 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_nextract, ==, CK_FALSE) ||
3666 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sensitive, ==, CK_TRUE) ||
3667 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_asensitive, ==, CK_FALSE))
3668 goto out;
3669
Vesa Jääskeläinen06f428a2021-06-27 20:02:29 +03003670 /* Check that we cannot anymore get (secret) CKA_VALUE */
3671 get_value_template[0].ulValueLen = sizeof(g_value);
3672 rv = C_GetAttributeValue(rw_session, obj_hdl_cp, get_value_template,
3673 ARRAY_SIZE(get_value_template));
3674 if (!ADBG_EXPECT_CK_RESULT(c, CKR_ATTRIBUTE_SENSITIVE, rv) ||
3675 !(get_value_template[0].ulValueLen == CK_UNAVAILABLE_INFORMATION))
3676 goto close_session;
3677
Ruchika Gupta1f60ed42021-02-02 13:15:58 +05303678 /*
3679 * The copied object has CKA_MODIFIABLE set to FALSE. Check if
3680 * call to C_SetAttributeValue() returns CKR_ACTION_PROHIBITED
3681 */
3682 rv = C_SetAttributeValue(rw_session, obj_hdl_cp, set_template,
3683 ARRAY_SIZE(set_template));
3684 if (!ADBG_EXPECT_CK_RESULT(c, CKR_ACTION_PROHIBITED, rv))
3685 goto out;
3686
3687 rv = C_DestroyObject(rw_session, obj_hdl_cp);
3688 if (!ADBG_EXPECT_CK_OK(c, rv))
3689 goto out;
3690
3691 obj_hdl_cp = CK_INVALID_HANDLE;
3692
3693 Do_ADBG_EndSubCase(c, NULL);
3694
3695 /*
3696 * Test changing the CKA_PRIVATE to TRUE when copying object.
3697 * Fails when user is not logged in. Passes after user logs in
3698 */
3699 Do_ADBG_BeginSubCase(c, "Copy Object as a Private Object");
3700
3701 /* The first attempt will fail as user is not logged in */
3702 rv = C_CopyObject(rw_session, obj_hdl, copy_template_priv,
3703 ARRAY_SIZE(copy_template_priv), &obj_hdl_cp);
3704 if (!ADBG_EXPECT_CK_RESULT(c, CKR_USER_NOT_LOGGED_IN, rv))
3705 goto out;
3706
3707 /* Login to Test Token and repeat*/
3708 rv = C_Login(rw_session, CKU_USER, test_token_user_pin,
3709 sizeof(test_token_user_pin));
3710 if (!ADBG_EXPECT_CK_OK(c, rv))
3711 goto out;
3712
3713 /* Try copying a public object to a private object - should pass */
3714 rv = C_CopyObject(rw_session, obj_hdl, copy_template_priv,
3715 ARRAY_SIZE(copy_template_priv), &obj_hdl_cp);
3716 if (!ADBG_EXPECT_CK_OK(c, rv)) {
3717 ADBG_EXPECT_CK_OK(c, C_Logout(rw_session));
3718 goto out;
3719 }
3720
3721 if (!ADBG_EXPECT_CK_OK(c, C_Logout(rw_session)))
3722 goto out;
3723
3724 Do_ADBG_EndSubCase(c, NULL);
3725
3726 Do_ADBG_BeginSubCase(c, "Copy Object with Invalid Template");
3727
3728 rv = C_CopyObject(rw_session, obj_hdl, copy_template_inv,
3729 ARRAY_SIZE(copy_template_inv), &obj_hdl_cp);
3730 if (!ADBG_EXPECT_CK_RESULT(c, CKR_ATTRIBUTE_TYPE_INVALID, rv))
3731 goto out;
3732
3733 Do_ADBG_EndSubCase(c, NULL);
3734
3735 Do_ADBG_BeginSubCase(c, "Copy Object with COPYABLE false");
3736
3737 rv = C_SetAttributeValue(rw_session, obj_hdl, set_template,
3738 ARRAY_SIZE(set_template));
3739 if (!ADBG_EXPECT_CK_OK(c, rv))
3740 goto out;
3741
3742 rv = C_CopyObject(rw_session, obj_hdl, copy_template,
3743 ARRAY_SIZE(copy_template), &obj_hdl_cp);
3744 if (!ADBG_EXPECT_CK_RESULT(c, CKR_ACTION_PROHIBITED, rv))
3745 goto out;
3746
3747 Do_ADBG_EndSubCase(c, NULL);
3748
3749 Do_ADBG_BeginSubCase(c, "Copy session object to token in RO session");
3750
3751 rv = C_CopyObject(ro_session, obj_hdl_ro, copy_template,
3752 ARRAY_SIZE(copy_template), &obj_hdl_cp);
3753 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SESSION_READ_ONLY, rv))
3754 goto out;
3755
3756out:
3757 Do_ADBG_EndSubCase(c, NULL);
3758
3759 /* Destroy any token objects which may have been created */
3760 destroy_persistent_objects(c, slot);
3761
3762close_session:
3763 /* Closing session will also destroy all session objects */
3764 if (ro_session != CK_INVALID_HANDLE)
3765 ADBG_EXPECT_CK_OK(c, C_CloseSession(ro_session));
3766
3767 ADBG_EXPECT_CK_OK(c, C_CloseSession(rw_session));
3768
3769close_lib:
3770 ADBG_EXPECT_CK_OK(c, close_lib());
3771}
3772ADBG_CASE_DEFINE(pkcs11, 1015, xtest_pkcs11_test_1015,
3773 "PKCS11: Test C_CopyObject()");
Vesa Jääskeläinenf8687fe2021-02-06 20:58:22 +02003774
3775static void xtest_pkcs11_test_1016(ADBG_Case_t *c)
3776{
3777 CK_RV rv = CKR_GENERAL_ERROR;
3778 CK_SLOT_ID slot = 0;
3779 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
3780 CK_FLAGS session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
3781 uint8_t buffer[64] = { 0 };
3782 size_t i = 0;
3783
3784 rv = init_lib_and_find_token_slot(&slot);
3785 if (!ADBG_EXPECT_CK_OK(c, rv))
3786 return;
3787
3788 rv = init_test_token(slot);
3789 if (!ADBG_EXPECT_CK_OK(c, rv))
3790 goto close_lib;
3791
3792 rv = init_user_test_token(slot);
3793 if (!ADBG_EXPECT_CK_OK(c, rv))
3794 goto close_lib;
3795
3796 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
3797 if (!ADBG_EXPECT_CK_OK(c, rv))
3798 goto close_lib;
3799
3800 Do_ADBG_BeginSubCase(c, "Seed random bytes");
3801
3802 memset(buffer, 0xCC, sizeof(buffer));
3803
3804 rv = C_SeedRandom(session, buffer, sizeof(buffer));
3805 if (!ADBG_EXPECT_CK_OK(c, rv))
3806 goto out;
3807
3808 Do_ADBG_EndSubCase(c, NULL);
3809
3810 Do_ADBG_BeginSubCase(c, "Seed random bytes with zero length buffer");
3811
3812 rv = C_SeedRandom(session, buffer, 0);
3813 if (!ADBG_EXPECT_CK_OK(c, rv))
3814 goto out;
3815
3816 rv = C_SeedRandom(session, NULL, 0);
3817 if (!ADBG_EXPECT_CK_OK(c, rv))
3818 goto out;
3819
3820 Do_ADBG_EndSubCase(c, NULL);
3821
3822 Do_ADBG_BeginSubCase(c, "Generate random bytes");
3823
3824 memset(buffer, 0xCC, sizeof(buffer));
3825
3826 rv = C_GenerateRandom(session, buffer, 61);
3827 if (!ADBG_EXPECT_CK_OK(c, rv))
3828 goto out;
3829
3830 /* Verify that end of buffer is still 0xCC */
3831 for (i = 61; i < sizeof(buffer); i++)
3832 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, buffer[i], ==, 0xCC))
3833 break;
3834
3835 Do_ADBG_EndSubCase(c, NULL);
3836
3837 Do_ADBG_BeginSubCase(c, "Generate random bytes with zero length buffer");
3838
3839 memset(buffer, 0xCC, sizeof(buffer));
3840
3841 rv = C_GenerateRandom(session, buffer, 0);
3842 if (!ADBG_EXPECT_CK_OK(c, rv))
3843 goto out;
3844
3845 /* Verify that whole buffer is still 0xCC */
3846 for (i = 0; i < sizeof(buffer); i++)
3847 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, buffer[i], ==, 0xCC))
3848 break;
3849
3850 rv = C_GenerateRandom(session, NULL, 0);
3851 ADBG_EXPECT_CK_OK(c, rv);
3852
3853out:
3854 Do_ADBG_EndSubCase(c, NULL);
3855
3856 ADBG_EXPECT_CK_OK(c, C_CloseSession(session));
3857
3858close_lib:
3859 ADBG_EXPECT_CK_OK(c, close_lib());
3860}
3861ADBG_CASE_DEFINE(pkcs11, 1016, xtest_pkcs11_test_1016,
3862 "PKCS11: Random number generator tests");
Ruchika Gupta5f7717a2021-02-17 13:34:24 +05303863
3864static CK_RV derive_sym_key(CK_SESSION_HANDLE session,
3865 CK_OBJECT_HANDLE parent_key,
3866 CK_MECHANISM_TYPE mechanism, size_t data_len,
3867 CK_OBJECT_HANDLE_PTR derv_key_hdl, size_t key_len,
3868 CK_OBJECT_CLASS key_class, CK_KEY_TYPE key_type,
3869 CK_BBOOL sensitive, CK_BBOOL extble)
3870{
3871 CK_RV rv = CKR_GENERAL_ERROR;
3872 uint8_t buffer[512] = { 0 };
3873 uint8_t iv[16] = { 0 };
3874 CK_MECHANISM mech_derive = { 0 };
3875 CK_KEY_DERIVATION_STRING_DATA key_derv_param = { 0 };
Victor Chonge3a876d2021-05-04 18:03:07 +01003876 CK_AES_CBC_ENCRYPT_DATA_PARAMS aes_cbc_param = { };
Ruchika Gupta5f7717a2021-02-17 13:34:24 +05303877 CK_ATTRIBUTE derived_key_template[] = {
3878 { CKA_CLASS, &key_class, sizeof(key_class) },
3879 { CKA_KEY_TYPE, &key_type, sizeof(key_type) },
3880 { CKA_ENCRYPT, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3881 { CKA_DECRYPT, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3882 { CKA_SENSITIVE, &sensitive, sizeof(sensitive) },
3883 { CKA_EXTRACTABLE, &extble, sizeof(extble) },
3884 { CKA_VALUE_LEN, &key_len, sizeof(key_len) }
3885 };
3886
3887 if (data_len > sizeof(buffer))
3888 return rv;
3889
3890 switch (mechanism) {
3891 case CKM_AES_ECB_ENCRYPT_DATA:
3892 key_derv_param.pData = buffer;
3893 key_derv_param.ulLen = data_len;
3894 mech_derive.mechanism = mechanism;
3895 mech_derive.pParameter = &key_derv_param;
3896 mech_derive.ulParameterLen = sizeof(key_derv_param);
3897 break;
3898 case CKM_AES_CBC_ENCRYPT_DATA:
3899 memcpy(aes_cbc_param.iv, iv, 16);
3900 aes_cbc_param.pData = buffer;
3901 aes_cbc_param.length = data_len;
3902 mech_derive.mechanism = mechanism;
3903 mech_derive.pParameter = &aes_cbc_param;
3904 mech_derive.ulParameterLen = sizeof(aes_cbc_param);
3905 break;
3906 case CKM_AES_ECB:
3907 /* Not a derivation algorithm */
3908 mech_derive.mechanism = mechanism;
3909 mech_derive.pParameter = NULL;
3910 mech_derive.ulParameterLen = 0;
3911 break;
3912 default:
3913 return rv;
3914 }
3915
3916 /* Don't use VALUE_LEN parameter if key_len passed is 0 */
3917 if (key_len)
3918 rv = C_DeriveKey(session, &mech_derive, parent_key,
3919 derived_key_template,
3920 ARRAY_SIZE(derived_key_template),
3921 derv_key_hdl);
3922 else
3923 /* last attribute in template is the derived key size */
3924 rv = C_DeriveKey(session, &mech_derive, parent_key,
3925 derived_key_template,
3926 ARRAY_SIZE(derived_key_template) - 1,
3927 derv_key_hdl);
3928 return rv;
3929}
3930
3931static void xtest_pkcs11_test_1017(ADBG_Case_t *c)
3932{
3933 CK_RV rv = CKR_GENERAL_ERROR;
3934 CK_SLOT_ID slot = 0;
3935 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
3936 CK_FLAGS session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
3937 CK_OBJECT_HANDLE derv_key_hdl = CK_INVALID_HANDLE;
3938 CK_OBJECT_HANDLE aes_key1 = CK_INVALID_HANDLE;
3939 CK_OBJECT_HANDLE aes_key2 = CK_INVALID_HANDLE;
3940 CK_OBJECT_HANDLE aes_key_enc = CK_INVALID_HANDLE;
3941 size_t data_len = 0;
3942 size_t key_len = 0;
3943 CK_BBOOL g_extract = CK_FALSE;
3944 CK_BBOOL g_sensitive = CK_FALSE;
3945 CK_BBOOL g_nextract = CK_FALSE;
3946 CK_BBOOL g_asensitive = CK_FALSE;
3947 CK_BBOOL g_local = CK_FALSE;
3948 CK_OBJECT_CLASS g_class = CKO_VENDOR_DEFINED;
3949 CK_KEY_TYPE g_key_type = CKK_VENDOR_DEFINED;
3950 uint8_t g_val[516] = { 0 };
3951 CK_ULONG secret_len = 0;
3952 CK_ATTRIBUTE get_template[] = {
3953 { CKA_CLASS, &g_class, sizeof(CK_OBJECT_CLASS) },
3954 { CKA_KEY_TYPE, &g_key_type, sizeof(CK_KEY_TYPE) },
3955 { CKA_EXTRACTABLE, &g_extract, sizeof(CK_BBOOL) },
3956 { CKA_SENSITIVE, &g_sensitive, sizeof(CK_BBOOL) },
3957 { CKA_NEVER_EXTRACTABLE, &g_nextract, sizeof(CK_BBOOL) },
3958 { CKA_ALWAYS_SENSITIVE, &g_asensitive, sizeof(CK_BBOOL) },
3959 { CKA_LOCAL, &g_local, sizeof(CK_BBOOL) },
3960 { CKA_VALUE_LEN, &secret_len, sizeof(secret_len) },
3961 /*
3962 * CKA_VALUE should remain last attribute in template,
3963 * in this test case as we check the length returned
3964 * from last index of the get_template in this test.
3965 */
3966 { CKA_VALUE, g_val, sizeof(g_val) },
3967 };
3968 uint32_t idx = ARRAY_SIZE(get_template) - 1;
3969 CK_ATTRIBUTE parent_template1[] = {
3970 { CKA_SENSITIVE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3971 { CKA_EXTRACTABLE, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
3972 { CKA_VALUE_LEN, &(CK_ULONG){16}, sizeof(CK_ULONG) },
3973 { CKA_DERIVE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3974 };
3975 CK_ATTRIBUTE parent_template2[] = {
3976 { CKA_SENSITIVE, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
3977 { CKA_EXTRACTABLE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3978 { CKA_VALUE_LEN, &(CK_ULONG){16}, sizeof(CK_ULONG) },
3979 { CKA_ENCRYPT, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
3980 { CKA_DERIVE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3981 };
3982 CK_ATTRIBUTE parent_template_wo_derive[] = {
3983 { CKA_SENSITIVE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3984 { CKA_EXTRACTABLE, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
3985 { CKA_VALUE_LEN, &(CK_ULONG){16}, sizeof(CK_ULONG) },
3986 };
3987 CK_ATTRIBUTE parent_template_w_enc_der[] = {
3988 { CKA_VALUE_LEN, &(CK_ULONG){16}, sizeof(CK_ULONG) },
3989 { CKA_ENCRYPT, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3990 { CKA_DERIVE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3991 };
3992
3993 rv = init_lib_and_find_token_slot(&slot);
3994 if (!ADBG_EXPECT_CK_OK(c, rv))
3995 return;
3996
3997 rv = init_test_token(slot);
3998 if (!ADBG_EXPECT_CK_OK(c, rv))
3999 goto close_lib;
4000
4001 rv = init_user_test_token(slot);
4002 if (!ADBG_EXPECT_CK_OK(c, rv))
4003 goto close_lib;
4004
4005 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
4006 if (!ADBG_EXPECT_CK_OK(c, rv))
4007 goto close_lib;
4008
4009 /*
4010 * Parent AES Key 1
4011 * SENSITIVE = TRUE, EXTRACTABLE = FALSE
4012 * ALWAYS_SENSITIVE = TRUE, NEVER_EXTRACTABLE = TRUE
4013 */
4014 rv = C_GenerateKey(session, &cktest_aes_keygen_mechanism,
4015 parent_template1, ARRAY_SIZE(parent_template1),
4016 &aes_key1);
4017 if (!ADBG_EXPECT_CK_OK(c, rv))
4018 goto close_session;
4019
4020 /*
4021 * Parent AES Key 2
4022 * SENSITIVE = FALSE, EXTRACTABLE = TRUE
4023 * ALWAYS_SENSITIVE = FALSE, NEVER_EXTRACTABLE = FALSE
4024 */
4025 rv = C_GenerateKey(session, &cktest_aes_keygen_mechanism,
4026 parent_template2, ARRAY_SIZE(parent_template2),
4027 &aes_key2);
4028 if (!ADBG_EXPECT_CK_OK(c, rv))
4029 goto close_session;
4030
4031 Do_ADBG_BeginSubCase(c, "Derive Generic secret - AES-ECB Mechanism");
4032
4033 /*
4034 * Use AES key 1 as Parent key
4035 * 1. VALUE_LEN attribute not given in derivation template. Length
4036 * of key should be same as that of data length.
4037 * 2. Derivation template has SENSITIVE = TRUE, EXTRACTABLE = FALSE
4038 * Parent key has ALWAYS_SENSITIVE = TRUE, NEVER_EXTRACTABLE = TRUE
4039 * So derived key, ALWAYS_SENSITIVE will be same as SENSITIVE and
4040 * NEVER_EXTRACTABLE will be opposite of EXTRACTABLE
4041 * 3. LOCAL should be false
4042 */
4043 data_len = 512;
4044 key_len = 0;
4045 rv = derive_sym_key(session, aes_key1, CKM_AES_ECB_ENCRYPT_DATA,
4046 data_len, &derv_key_hdl, key_len, CKO_SECRET_KEY,
4047 CKK_GENERIC_SECRET, CK_TRUE, CK_FALSE);
4048 if (!ADBG_EXPECT_CK_OK(c, rv))
4049 goto out;
4050
4051 rv = C_GetAttributeValue(session, derv_key_hdl, get_template,
4052 ARRAY_SIZE(get_template) - 1);
4053 if (!ADBG_EXPECT_CK_OK(c, rv) ||
4054 !ADBG_EXPECT_COMPARE_UNSIGNED(c, secret_len, ==, data_len) ||
4055 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_SECRET_KEY) ||
4056 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_key_type, ==,
4057 CKK_GENERIC_SECRET) ||
4058 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_FALSE) ||
4059 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sensitive, ==, CK_TRUE) ||
4060 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_extract, ==, CK_FALSE) ||
4061 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_asensitive, ==, CK_TRUE) ||
4062 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_nextract, ==, CK_TRUE))
4063 goto out;
4064
4065 rv = C_DestroyObject(session, derv_key_hdl);
4066 if (!ADBG_EXPECT_CK_OK(c, rv))
4067 goto out;
4068
4069 Do_ADBG_EndSubCase(c, NULL);
4070
4071 Do_ADBG_BeginSubCase(c, "Derive AES key using AES-EBC");
4072
4073 /*
4074 * Use AES key 2 as Parent key
4075 * 1. VALUE_LEN < DATA_LEN, Derived key should have VALUE_LEN key size
4076 * 2. Derivation template has SENSITIVE = TRUE, EXTRACTABLE = FALSE
4077 * Parent key has ALWAYS_SENSITIVE = FALSE, NEVER_EXTRACTABLE = FALSE
4078 * So derived key, ALWAYS_SENSITIVE will be FALSE and
4079 * NEVER_EXTRACTABLE will be FALSE
4080 * 3. LOCAL should be false
4081 */
4082 data_len = 32;
4083 key_len = 16;
4084 rv = derive_sym_key(session, aes_key2, CKM_AES_ECB_ENCRYPT_DATA,
4085 data_len, &derv_key_hdl, key_len, CKO_SECRET_KEY,
4086 CKK_AES, CK_TRUE, CK_FALSE);
4087 if (!ADBG_EXPECT_CK_OK(c, rv))
4088 goto out;
4089
4090 /* This being a SENSITIVE object, we can't get the VALUE */
4091 rv = C_GetAttributeValue(session, derv_key_hdl, get_template,
4092 ARRAY_SIZE(get_template) - 1);
4093 if (!ADBG_EXPECT_CK_OK(c, rv) ||
4094 !ADBG_EXPECT_COMPARE_UNSIGNED(c, secret_len, ==, key_len) ||
4095 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_SECRET_KEY) ||
4096 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_key_type, ==, CKK_AES) ||
4097 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_FALSE) ||
4098 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sensitive, ==, CK_TRUE) ||
4099 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_extract, ==, CK_FALSE) ||
4100 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_asensitive, ==, CK_FALSE) ||
4101 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_nextract, ==, CK_FALSE))
4102 goto out;
4103
4104 rv = C_DestroyObject(session, derv_key_hdl);
4105 if (!ADBG_EXPECT_CK_OK(c, rv))
4106 goto out;
4107
4108 Do_ADBG_EndSubCase(c, NULL);
4109
4110 Do_ADBG_BeginSubCase(c, "Derive AES key using AES-CBC");
4111
4112 /*
4113 * Use AES key 1 as Parent key
4114 * 1. VALUE_LEN = DATA_LEN, Derived key should have VALUE_LEN key size
4115 * 2. Derivation template has SENSITIVE = FALSE, EXTRACTABLE = FALSE
4116 * Parent key has ALWAYS_SENSITIVE = TRUE, NEVER_EXTRACTABLE = TRUE
4117 * So derived key, ALWAYS_SENSITIVE will be same as SENSITIVE and
4118 * NEVER_EXTRACTABLE will be opposite of EXTRACTABLE
4119 * 3. LOCAL should be false
4120 */
4121 data_len = 32;
4122 key_len = 32;
4123 rv = derive_sym_key(session, aes_key1, CKM_AES_CBC_ENCRYPT_DATA,
4124 data_len, &derv_key_hdl, key_len, CKO_SECRET_KEY,
4125 CKK_AES, CK_FALSE, CK_FALSE);
4126 if (!ADBG_EXPECT_CK_OK(c, rv))
4127 goto out;
4128
4129 rv = C_GetAttributeValue(session, derv_key_hdl, get_template,
4130 ARRAY_SIZE(get_template) - 1);
4131 if (!ADBG_EXPECT_CK_OK(c, rv) ||
4132 !ADBG_EXPECT_COMPARE_UNSIGNED(c, secret_len, ==, key_len) ||
4133 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_SECRET_KEY) ||
4134 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_key_type, ==, CKK_AES) ||
4135 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_FALSE) ||
4136 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sensitive, ==, CK_FALSE) ||
4137 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_extract, ==, CK_FALSE) ||
4138 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_asensitive, ==, CK_FALSE) ||
4139 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_nextract, ==, CK_TRUE))
4140 goto out;
4141
4142 rv = C_DestroyObject(session, derv_key_hdl);
4143 if (!ADBG_EXPECT_CK_OK(c, rv))
4144 goto out;
4145
4146 Do_ADBG_EndSubCase(c, NULL);
4147
4148 Do_ADBG_BeginSubCase(c, "Derive Generic secret key using AES-CBC");
4149 /*
4150 * Use AES key 2 as Parent key
4151 * 1. VALUE_LEN < DATA_LEN, Derived key should have VALUE_LEN key size
4152 * 2. Derivation template has SENSITIVE = FALSE, EXTRACTABLE = TRUE
4153 * Parent key has ALWAYS_SENSITIVE = TRUE, NEVER_EXTRACTABLE = TRUE
4154 * So derived key, ALWAYS_SENSITIVE will be same as SENSITIVE and
4155 * NEVER_EXTRACTABLE will be opposite of EXTRACTABLE
4156 * 3. LOCAL should be false
4157 */
4158 data_len = 512;
4159 key_len = 256;
4160 rv = derive_sym_key(session, aes_key2, CKM_AES_CBC_ENCRYPT_DATA,
4161 data_len, &derv_key_hdl, key_len, CKO_SECRET_KEY,
4162 CKK_GENERIC_SECRET, CK_FALSE, CK_TRUE);
4163 if (!ADBG_EXPECT_CK_OK(c, rv))
4164 goto out;
4165
4166 rv = C_GetAttributeValue(session, derv_key_hdl, get_template,
4167 ARRAY_SIZE(get_template));
4168 if (!ADBG_EXPECT_CK_OK(c, rv) ||
4169 !ADBG_EXPECT_COMPARE_UNSIGNED(c, get_template[idx].ulValueLen, ==,
4170 key_len) ||
4171 !ADBG_EXPECT_COMPARE_UNSIGNED(c, secret_len, ==, key_len) ||
4172 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_SECRET_KEY) ||
4173 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_key_type, ==,
4174 CKK_GENERIC_SECRET) ||
4175 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_FALSE) ||
4176 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sensitive, ==, CK_FALSE) ||
4177 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_extract, ==, CK_TRUE) ||
4178 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_asensitive, ==, CK_FALSE) ||
4179 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_nextract, ==, CK_FALSE))
4180 goto out;
4181
4182 rv = C_DestroyObject(session, derv_key_hdl);
4183 if (!ADBG_EXPECT_CK_OK(c, rv))
4184 goto out;
4185
4186 Do_ADBG_EndSubCase(c, NULL);
4187
4188 Do_ADBG_BeginSubCase(c, "Invalid parameters during derivation");
4189
4190 /* Length of data used for derivation < key length */
4191 data_len = 16;
4192 key_len = 32;
4193 rv = derive_sym_key(session, aes_key1, CKM_AES_ECB_ENCRYPT_DATA,
4194 data_len, &derv_key_hdl, key_len, CKO_SECRET_KEY,
4195 CKK_AES, CK_FALSE, CK_TRUE);
4196 if (!ADBG_EXPECT_CK_RESULT(c, CKR_DATA_LEN_RANGE, rv))
4197 goto out;
4198
4199 /* Data is not multiple of 16 */
4200 data_len = 18;
4201 key_len = 32;
4202 rv = derive_sym_key(session, aes_key1, CKM_AES_ECB_ENCRYPT_DATA,
4203 data_len, &derv_key_hdl, key_len, CKO_SECRET_KEY,
4204 CKK_AES, CK_FALSE, CK_TRUE);
4205 if (!ADBG_EXPECT_CK_RESULT(c, CKR_DATA_LEN_RANGE, rv))
4206 goto out;
4207
4208 /* Wrong Mechanism */
4209 rv = derive_sym_key(session, aes_key1, CKM_AES_ECB,
4210 data_len, &derv_key_hdl, key_len, CKO_SECRET_KEY,
4211 CKK_AES, CK_FALSE, CK_TRUE);
4212 if (!ADBG_EXPECT_CK_RESULT(c, CKR_MECHANISM_INVALID, rv))
4213 goto out;
4214
4215 Do_ADBG_EndSubCase(c, NULL);
4216
4217 Do_ADBG_BeginSubCase(c, "Failure if operation already active");
4218
4219 /* Generate an AES key which can perform Encryption */
4220 rv = C_GenerateKey(session, &cktest_aes_keygen_mechanism,
4221 parent_template_w_enc_der,
4222 ARRAY_SIZE(parent_template_w_enc_der),
4223 &aes_key_enc);
4224 if (!ADBG_EXPECT_CK_OK(c, rv))
4225 goto out;
4226
4227 rv = C_EncryptInit(session, &cktest_aes_cbc_mechanism, aes_key_enc);
4228 if (!ADBG_EXPECT_CK_OK(c, rv))
4229 goto out;
4230
Vesa Jääskeläinene21f1dd2021-07-17 21:42:52 +03004231 /*
4232 * Initializing the encryption operation again should not alter or
4233 * terminate already started operation.
4234 */
4235 rv = C_EncryptInit(session, &cktest_aes_cbc_mechanism, aes_key_enc);
4236 if (!ADBG_EXPECT_CK_RESULT(c, CKR_OPERATION_ACTIVE, rv))
4237 goto out;
4238
Ruchika Gupta5f7717a2021-02-17 13:34:24 +05304239 data_len = 32;
4240 key_len = 32;
4241 rv = derive_sym_key(session, aes_key2, CKM_AES_ECB_ENCRYPT_DATA,
4242 data_len, &derv_key_hdl, key_len, CKO_SECRET_KEY,
4243 CKK_AES, CK_FALSE, CK_TRUE);
4244 if (!ADBG_EXPECT_CK_RESULT(c, CKR_OPERATION_ACTIVE, rv))
4245 goto out;
4246
4247 rv = C_EncryptFinal(session, NULL, NULL);
4248 /* Only check that the operation is no more active */
4249 if (!ADBG_EXPECT_TRUE(c, rv != CKR_BUFFER_TOO_SMALL))
4250 goto out;
4251
4252 Do_ADBG_EndSubCase(c, NULL);
4253
4254 Do_ADBG_BeginSubCase(c, "Failure if parent key CKA_ENCRYPT is TRUE");
4255
4256 data_len = 32;
4257 key_len = 32;
4258 rv = derive_sym_key(session, aes_key_enc, CKM_AES_ECB_ENCRYPT_DATA,
4259 data_len, &derv_key_hdl, key_len, CKO_SECRET_KEY,
4260 CKK_AES, CK_FALSE, CK_TRUE);
4261 /*
4262 * Not strictly expecting FUNCTION_FAILED but expecting a failure
4263 * as we have added a restriction that keys with attribute CKA_ENCRYPT
4264 * set can't be used for derivation.
4265 */
4266 if (!ADBG_EXPECT_CK_RESULT(c, CKR_FUNCTION_FAILED, rv))
4267 goto out;
4268
4269 Do_ADBG_EndSubCase(c, NULL);
4270
4271 Do_ADBG_BeginSubCase(c, "Failure if parent key CKA_DERIVE is FALSE");
4272
4273 rv = C_DestroyObject(session, aes_key1);
4274 if (!ADBG_EXPECT_CK_OK(c, rv))
4275 goto out;
4276
4277 rv = C_GenerateKey(session, &cktest_aes_keygen_mechanism,
4278 parent_template_wo_derive,
4279 ARRAY_SIZE(parent_template_wo_derive),
4280 &aes_key1);
4281 if (!ADBG_EXPECT_CK_OK(c, rv))
4282 goto out;
4283
4284 data_len = 32;
4285 key_len = 32;
4286 rv = derive_sym_key(session, aes_key1, CKM_AES_ECB_ENCRYPT_DATA,
4287 data_len, &derv_key_hdl, key_len, CKO_SECRET_KEY,
4288 CKK_AES, CK_FALSE, CK_TRUE);
4289 if (!ADBG_EXPECT_CK_RESULT(c, CKR_KEY_TYPE_INCONSISTENT, rv))
4290 goto out;
4291
4292out:
4293 Do_ADBG_EndSubCase(c, NULL);
4294
4295close_session:
4296 ADBG_EXPECT_CK_OK(c, C_CloseSession(session));
4297
4298close_lib:
4299 ADBG_EXPECT_CK_OK(c, close_lib());
4300}
4301ADBG_CASE_DEFINE(pkcs11, 1017, xtest_pkcs11_test_1017,
4302 "PKCS11: AES Key Derivation tests");
Vesa Jääskeläinenc95ee1e2021-03-06 12:20:12 +02004303
4304/* Digest test patterns */
4305static const char digest_test_pattern[] = "The quick brown fox jumps over the lazy dog";
4306static const char digest_test_pattern_empty[] = "";
4307
4308/* MD5 checksums for digest test patterns */
4309static const uint8_t digest_test_pattern_md5[] = {
4310 0x9e, 0x10, 0x7d, 0x9d, 0x37, 0x2b, 0xb6, 0x82, 0x6b, 0xd8, 0x1d, 0x35,
4311 0x42, 0xa4, 0x19, 0xd6
4312};
4313static const uint8_t digest_test_pattern_empty_md5[] = {
4314 0xd4, 0x1d, 0x8c, 0xd9, 0x8f, 0x00, 0xb2, 0x04, 0xe9, 0x80, 0x09, 0x98,
4315 0xec, 0xf8, 0x42, 0x7e
4316};
4317
4318/* SHA-1 checksums for digest test patterns */
4319static const uint8_t digest_test_pattern_sha1[] = {
4320 0x2f, 0xd4, 0xe1, 0xc6, 0x7a, 0x2d, 0x28, 0xfc, 0xed, 0x84, 0x9e, 0xe1,
4321 0xbb, 0x76, 0xe7, 0x39, 0x1b, 0x93, 0xeb, 0x12
4322};
4323static const uint8_t digest_test_pattern_empty_sha1[] = {
4324 0xda, 0x39, 0xa3, 0xee, 0x5e, 0x6b, 0x4b, 0x0d, 0x32, 0x55, 0xbf, 0xef,
4325 0x95, 0x60, 0x18, 0x90, 0xaf, 0xd8, 0x07, 0x09
4326};
4327
4328/* SHA-224 checksums for digest test patterns */
4329static const uint8_t digest_test_pattern_sha224[] = {
4330 0x73, 0x0e, 0x10, 0x9b, 0xd7, 0xa8, 0xa3, 0x2b, 0x1c, 0xb9, 0xd9, 0xa0,
4331 0x9a, 0xa2, 0x32, 0x5d, 0x24, 0x30, 0x58, 0x7d, 0xdb, 0xc0, 0xc3, 0x8b,
4332 0xad, 0x91, 0x15, 0x25
4333};
4334static const uint8_t digest_test_pattern_empty_sha224[] = {
4335 0xd1, 0x4a, 0x02, 0x8c, 0x2a, 0x3a, 0x2b, 0xc9, 0x47, 0x61, 0x02, 0xbb,
4336 0x28, 0x82, 0x34, 0xc4, 0x15, 0xa2, 0xb0, 0x1f, 0x82, 0x8e, 0xa6, 0x2a,
4337 0xc5, 0xb3, 0xe4, 0x2f
4338};
4339
4340/* SHA-256 checksums for digest test patterns */
4341static const uint8_t digest_test_pattern_sha256[] = {
4342 0xd7, 0xa8, 0xfb, 0xb3, 0x07, 0xd7, 0x80, 0x94, 0x69, 0xca, 0x9a, 0xbc,
4343 0xb0, 0x08, 0x2e, 0x4f, 0x8d, 0x56, 0x51, 0xe4, 0x6d, 0x3c, 0xdb, 0x76,
4344 0x2d, 0x02, 0xd0, 0xbf, 0x37, 0xc9, 0xe5, 0x92
4345};
4346static const uint8_t digest_test_pattern_empty_sha256[] = {
4347 0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4, 0xc8,
4348 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c,
4349 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55
4350};
4351
4352/* SHA-384 checksums for digest test patterns */
4353static const uint8_t digest_test_pattern_sha384[] = {
4354 0xca, 0x73, 0x7f, 0x10, 0x14, 0xa4, 0x8f, 0x4c, 0x0b, 0x6d, 0xd4, 0x3c,
4355 0xb1, 0x77, 0xb0, 0xaf, 0xd9, 0xe5, 0x16, 0x93, 0x67, 0x54, 0x4c, 0x49,
4356 0x40, 0x11, 0xe3, 0x31, 0x7d, 0xbf, 0x9a, 0x50, 0x9c, 0xb1, 0xe5, 0xdc,
4357 0x1e, 0x85, 0xa9, 0x41, 0xbb, 0xee, 0x3d, 0x7f, 0x2a, 0xfb, 0xc9, 0xb1
4358};
4359static const uint8_t digest_test_pattern_empty_sha384[] = {
4360 0x38, 0xb0, 0x60, 0xa7, 0x51, 0xac, 0x96, 0x38, 0x4c, 0xd9, 0x32, 0x7e,
4361 0xb1, 0xb1, 0xe3, 0x6a, 0x21, 0xfd, 0xb7, 0x11, 0x14, 0xbe, 0x07, 0x43,
4362 0x4c, 0x0c, 0xc7, 0xbf, 0x63, 0xf6, 0xe1, 0xda, 0x27, 0x4e, 0xde, 0xbf,
4363 0xe7, 0x6f, 0x65, 0xfb, 0xd5, 0x1a, 0xd2, 0xf1, 0x48, 0x98, 0xb9, 0x5b
4364};
4365
4366/* SHA-512 checksums for digest test patterns */
4367static const uint8_t digest_test_pattern_sha512[] = {
4368 0x07, 0xe5, 0x47, 0xd9, 0x58, 0x6f, 0x6a, 0x73, 0xf7, 0x3f, 0xba, 0xc0,
4369 0x43, 0x5e, 0xd7, 0x69, 0x51, 0x21, 0x8f, 0xb7, 0xd0, 0xc8, 0xd7, 0x88,
4370 0xa3, 0x09, 0xd7, 0x85, 0x43, 0x6b, 0xbb, 0x64, 0x2e, 0x93, 0xa2, 0x52,
4371 0xa9, 0x54, 0xf2, 0x39, 0x12, 0x54, 0x7d, 0x1e, 0x8a, 0x3b, 0x5e, 0xd6,
4372 0xe1, 0xbf, 0xd7, 0x09, 0x78, 0x21, 0x23, 0x3f, 0xa0, 0x53, 0x8f, 0x3d,
4373 0xb8, 0x54, 0xfe, 0xe6
4374};
4375static const uint8_t digest_test_pattern_empty_sha512[] = {
4376 0xcf, 0x83, 0xe1, 0x35, 0x7e, 0xef, 0xb8, 0xbd, 0xf1, 0x54, 0x28, 0x50,
4377 0xd6, 0x6d, 0x80, 0x07, 0xd6, 0x20, 0xe4, 0x05, 0x0b, 0x57, 0x15, 0xdc,
4378 0x83, 0xf4, 0xa9, 0x21, 0xd3, 0x6c, 0xe9, 0xce, 0x47, 0xd0, 0xd1, 0x3c,
4379 0x5d, 0x85, 0xf2, 0xb0, 0xff, 0x83, 0x18, 0xd2, 0x87, 0x7e, 0xec, 0x2f,
4380 0x63, 0xb9, 0x31, 0xbd, 0x47, 0x41, 0x7a, 0x81, 0xa5, 0x38, 0x32, 0x7a,
4381 0xf9, 0x27, 0xda, 0x3e
4382};
4383
4384#define DIGEST_TEST(_test_name, _mecha, _data, _digest) \
4385 { \
4386 .test_name = _test_name, \
4387 .mecha = _mecha, \
4388 .data = _data, \
4389 .data_size = sizeof(_data) - 1, \
4390 .digest = _digest, \
4391 .digest_size = sizeof(_digest) \
4392 }
4393
4394/* Digest simple test suite */
4395static struct {
4396 const char *test_name;
4397 CK_MECHANISM_TYPE mecha;
4398 const void *data;
4399 CK_ULONG data_size;
4400 const uint8_t *digest;
4401 CK_ULONG digest_size;
4402} digest_test_patterns[] = {
4403 DIGEST_TEST("CKM_MD5/empty", CKM_MD5, digest_test_pattern_empty,
4404 digest_test_pattern_empty_md5),
4405 DIGEST_TEST("CKM_MD5/test pattern", CKM_MD5, digest_test_pattern,
4406 digest_test_pattern_md5),
4407 DIGEST_TEST("CKM_SHA_1/empty", CKM_SHA_1, digest_test_pattern_empty,
4408 digest_test_pattern_empty_sha1),
4409 DIGEST_TEST("CKM_SHA_1/test pattern", CKM_SHA_1, digest_test_pattern,
4410 digest_test_pattern_sha1),
4411 DIGEST_TEST("CKM_SHA224/empty", CKM_SHA224, digest_test_pattern_empty,
4412 digest_test_pattern_empty_sha224),
4413 DIGEST_TEST("CKM_SHA224/test pattern", CKM_SHA224, digest_test_pattern,
4414 digest_test_pattern_sha224),
4415 DIGEST_TEST("CKM_SHA256/empty", CKM_SHA256, digest_test_pattern_empty,
4416 digest_test_pattern_empty_sha256),
4417 DIGEST_TEST("CKM_SHA256/test pattern", CKM_SHA256, digest_test_pattern,
4418 digest_test_pattern_sha256),
4419 DIGEST_TEST("CKM_SHA384/empty", CKM_SHA384, digest_test_pattern_empty,
4420 digest_test_pattern_empty_sha384),
4421 DIGEST_TEST("CKM_SHA384/test pattern", CKM_SHA384, digest_test_pattern,
4422 digest_test_pattern_sha384),
4423 DIGEST_TEST("CKM_SHA512/empty", CKM_SHA512, digest_test_pattern_empty,
4424 digest_test_pattern_empty_sha512),
4425 DIGEST_TEST("CKM_SHA512/test pattern", CKM_SHA512, digest_test_pattern,
4426 digest_test_pattern_sha512),
4427};
4428
4429static CK_ATTRIBUTE digest_generate_aes_object[] = {
4430 { CKA_CLASS, &(CK_OBJECT_CLASS){ CKO_SECRET_KEY },
4431 sizeof(CK_OBJECT_CLASS) },
4432 { CKA_KEY_TYPE, &(CK_KEY_TYPE){ CKK_AES }, sizeof(CK_KEY_TYPE) },
4433 { CKA_TOKEN, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
4434 { CKA_PRIVATE, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
4435 { CKA_SENSITIVE, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
4436 { CKA_EXTRACTABLE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
4437 { CKA_VALUE_LEN, &(CK_ULONG){ 16 }, sizeof(CK_ULONG) },
4438};
4439
4440static CK_ATTRIBUTE digest_generate_gensecret_object[] = {
4441 { CKA_CLASS, &(CK_OBJECT_CLASS){ CKO_SECRET_KEY },
4442 sizeof(CK_OBJECT_CLASS) },
4443 { CKA_KEY_TYPE, &(CK_KEY_TYPE){ CKK_GENERIC_SECRET },
4444 sizeof(CK_KEY_TYPE) },
4445 { CKA_TOKEN, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
4446 { CKA_PRIVATE, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
4447 { CKA_SENSITIVE, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
4448 { CKA_EXTRACTABLE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
Ruchika Guptae86aba22021-03-11 00:36:01 +05304449 { CKA_VALUE_LEN, &(CK_ULONG){ 32 }, sizeof(CK_ULONG) },
Vesa Jääskeläinenc95ee1e2021-03-06 12:20:12 +02004450};
4451
4452static CK_ATTRIBUTE digest_data_object[] = {
4453 { CKA_CLASS, &(CK_OBJECT_CLASS){ CKO_DATA },
4454 sizeof(CK_OBJECT_CLASS) },
4455 { CKA_TOKEN, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
4456 { CKA_PRIVATE, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
4457};
4458
4459static void xtest_pkcs11_test_1018(ADBG_Case_t *c)
4460{
4461 CK_RV rv = CKR_GENERAL_ERROR;
4462 CK_SLOT_ID slot = 0;
4463 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
4464 CK_FLAGS session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
4465 bool logged_in = false;
4466 uint8_t data[128] = { 0 };
4467 CK_ULONG data_size = 0;
4468 uint8_t digest[64] = { 0 };
4469 CK_ULONG digest_size = 0;
4470 const uint8_t *expect_digest = NULL;
4471 CK_ULONG expect_digest_size = 0;
4472 CK_MECHANISM mechanism = { CKM_MD5, NULL, 0 };
4473 uint8_t secret_data[128] = { 0 };
4474 CK_ULONG secret_data_size __maybe_unused = 0;
4475 CK_ATTRIBUTE digest_get_secret_value[] = {
4476 { CKA_VALUE, &secret_data, sizeof(secret_data) },
4477 };
4478 CK_OBJECT_HANDLE key_handle = CK_INVALID_HANDLE;
4479#ifdef OPENSSL_FOUND
4480 EVP_MD_CTX *mdctx = NULL;
4481 unsigned char hash[EVP_MAX_MD_SIZE] = { 0 };
4482 unsigned int md_len = 0;
4483 int ret = 0;
4484#endif
4485 size_t i = 0;
4486
4487 rv = init_lib_and_find_token_slot(&slot);
4488 if (!ADBG_EXPECT_CK_OK(c, rv))
4489 return;
4490
4491 rv = init_test_token(slot);
4492 if (!ADBG_EXPECT_CK_OK(c, rv))
4493 goto close_lib;
4494
4495 rv = init_user_test_token(slot);
4496 if (!ADBG_EXPECT_CK_OK(c, rv))
4497 goto close_lib;
4498
4499 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
4500 if (!ADBG_EXPECT_CK_OK(c, rv))
4501 goto close_lib;
4502
4503 /* Test out simple successful cases with init+update+final*/
4504 for (i = 0; i < ARRAY_SIZE(digest_test_patterns); i++) {
4505 Do_ADBG_BeginSubCase(c, "Simple digest tests - update - %s",
4506 digest_test_patterns[i].test_name);
4507
4508 mechanism.mechanism = digest_test_patterns[i].mecha;
4509 memset(data, 0xCC, sizeof(data));
4510 memset(digest, 0xCC, sizeof(digest));
4511 digest_size = sizeof(digest);
4512
4513 memcpy(data, digest_test_patterns[i].data,
4514 digest_test_patterns[i].data_size);
4515 data_size = digest_test_patterns[i].data_size;
4516
4517 expect_digest = digest_test_patterns[i].digest;
4518 expect_digest_size = digest_test_patterns[i].digest_size;
4519
4520 rv = C_DigestInit(session, &mechanism);
4521 if (!ADBG_EXPECT_CK_OK(c, rv))
4522 goto out;
4523
4524 rv = C_DigestUpdate(session, data, data_size);
4525 if (!ADBG_EXPECT_CK_OK(c, rv))
4526 goto out;
4527
4528 rv = C_DigestFinal(session, digest, &digest_size);
4529 if (!ADBG_EXPECT_CK_OK(c, rv))
4530 goto out;
4531
4532 if (!ADBG_EXPECT_BUFFER(c, expect_digest, expect_digest_size,
4533 digest, digest_size))
4534 goto out;
4535
4536 /* Verify that end of buffer is still 0xCC */
4537 for (i = expect_digest_size; i < sizeof(digest); i++)
4538 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, digest[i], ==,
4539 0xCC))
4540 goto out;
4541
4542 Do_ADBG_EndSubCase(c, NULL);
4543 }
4544
4545 /* Test out simple successful cases */
4546 for (i = 0; i < ARRAY_SIZE(digest_test_patterns); i++) {
4547 Do_ADBG_BeginSubCase(c, "Simple digest tests - oneshot - %s",
4548 digest_test_patterns[i].test_name);
4549
4550 mechanism.mechanism = digest_test_patterns[i].mecha;
4551 memset(data, 0xCC, sizeof(data));
4552 memset(digest, 0xCC, sizeof(digest));
4553 digest_size = sizeof(digest);
4554
4555 memcpy(data, digest_test_patterns[i].data,
4556 digest_test_patterns[i].data_size);
4557 data_size = digest_test_patterns[i].data_size;
4558
4559 expect_digest = digest_test_patterns[i].digest;
4560 expect_digest_size = digest_test_patterns[i].digest_size;
4561
4562 rv = C_DigestInit(session, &mechanism);
4563 if (!ADBG_EXPECT_CK_OK(c, rv))
4564 goto out;
4565
4566 rv = C_Digest(session, data, data_size, digest, &digest_size);
4567 if (!ADBG_EXPECT_CK_OK(c, rv))
4568 goto out;
4569
4570 if (!ADBG_EXPECT_BUFFER(c, expect_digest, expect_digest_size,
4571 digest, digest_size))
4572 goto out;
4573
4574 /* Verify that end of buffer is still 0xCC */
4575 for (i = expect_digest_size; i < sizeof(digest); i++)
4576 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, digest[i], ==,
4577 0xCC))
4578 goto out;
4579
4580 Do_ADBG_EndSubCase(c, NULL);
4581 }
4582
4583 /* Test out key updates */
4584
4585 Do_ADBG_BeginSubCase(c, "Simple digest tests - AES key update - SHA-256");
4586
4587 /* Login to Test Token */
4588 rv = C_Login(session, CKU_USER, test_token_user_pin,
4589 sizeof(test_token_user_pin));
4590 if (!ADBG_EXPECT_CK_OK(c, rv))
4591 goto out;
4592
4593 logged_in = true;
4594
4595 /* Generate AES key */
4596 rv = C_GenerateKey(session, &cktest_aes_keygen_mechanism,
4597 digest_generate_aes_object,
4598 ARRAY_SIZE(digest_generate_aes_object),
4599 &key_handle);
4600 if (!ADBG_EXPECT_CK_OK(c, rv))
4601 goto out;
4602
4603 memset(secret_data, 0xCC, sizeof(data));
4604 digest_get_secret_value[0].ulValueLen = sizeof(secret_data);
4605
4606 /* Get value of generated secret for verification purposes */
4607 rv = C_GetAttributeValue(session, key_handle, digest_get_secret_value,
4608 ARRAY_SIZE(digest_get_secret_value));
4609 if (!ADBG_EXPECT_CK_OK(c, rv))
4610 goto out;
4611
4612 secret_data_size = digest_get_secret_value[0].ulValueLen;
4613
4614 /* Calculate digest with PKCS11 */
4615 mechanism.mechanism = CKM_SHA256;
4616
4617 memset(data, 0xCC, sizeof(data));
4618 memset(digest, 0xCC, sizeof(digest));
4619 digest_size = sizeof(digest);
4620
4621 memcpy(data, digest_test_patterns[0].data,
4622 digest_test_patterns[0].data_size);
4623 data_size = digest_test_patterns[0].data_size;
4624
4625 rv = C_DigestInit(session, &mechanism);
4626 if (!ADBG_EXPECT_CK_OK(c, rv))
4627 goto out;
4628
4629 rv = C_DigestUpdate(session, data, data_size);
4630 if (!ADBG_EXPECT_CK_OK(c, rv))
4631 goto out;
4632
4633 rv = C_DigestKey(session, key_handle);
4634 if (!ADBG_EXPECT_CK_OK(c, rv))
4635 goto out;
4636
4637 rv = C_DigestFinal(session, digest, &digest_size);
4638 if (!ADBG_EXPECT_CK_OK(c, rv))
4639 goto out;
4640
4641 /* Verify digest with openssl */
4642#ifdef OPENSSL_FOUND
4643 mdctx = EVP_MD_CTX_create();
4644 if (!ADBG_EXPECT_NOT_NULL(c, mdctx))
4645 goto out;
4646 ret = EVP_DigestInit_ex(mdctx, EVP_sha256(), NULL);
4647 if (!ADBG_EXPECT_COMPARE_SIGNED(c, ret, ==, 1))
4648 goto out;
4649 ret = EVP_DigestUpdate(mdctx, data, data_size);
4650 if (!ADBG_EXPECT_COMPARE_SIGNED(c, ret, ==, 1))
4651 goto out;
4652 ret = EVP_DigestUpdate(mdctx, secret_data, secret_data_size);
4653 if (!ADBG_EXPECT_COMPARE_SIGNED(c, ret, ==, 1))
4654 goto out;
4655 ret = EVP_DigestFinal_ex(mdctx, hash, &md_len);
4656 if (!ADBG_EXPECT_COMPARE_SIGNED(c, ret, ==, 1))
4657 goto out;
4658 EVP_MD_CTX_destroy(mdctx);
4659 mdctx = NULL;
4660
4661 if (!ADBG_EXPECT_BUFFER(c, hash, md_len, digest, digest_size))
4662 goto out;
4663#else
4664 Do_ADBG_Log("OpenSSL not available, skipping C_DigestKey verification");
4665#endif
4666
4667 ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, key_handle));
4668 key_handle = CK_INVALID_HANDLE;
4669
4670 Do_ADBG_EndSubCase(c, NULL);
4671
4672 Do_ADBG_BeginSubCase(c, "Simple digest tests - generic secret key update - SHA-256");
4673
4674 /* Generate generic secret key */
4675 rv = C_GenerateKey(session, &cktest_gensecret_keygen_mechanism,
4676 digest_generate_gensecret_object,
4677 ARRAY_SIZE(digest_generate_gensecret_object),
4678 &key_handle);
4679 if (!ADBG_EXPECT_CK_OK(c, rv))
4680 goto out;
4681
4682 memset(secret_data, 0xCC, sizeof(data));
4683 digest_get_secret_value[0].ulValueLen = sizeof(secret_data);
4684
4685 /* Get value of generated secret for verification purposes */
4686 rv = C_GetAttributeValue(session, key_handle, digest_get_secret_value,
4687 ARRAY_SIZE(digest_get_secret_value));
4688 if (!ADBG_EXPECT_CK_OK(c, rv))
4689 goto out;
4690
4691 secret_data_size = digest_get_secret_value[0].ulValueLen;
4692
4693 /* Calculate digest with PKCS11 */
4694 mechanism.mechanism = CKM_SHA256;
4695
4696 memset(data, 0xCC, sizeof(data));
4697 memset(digest, 0xCC, sizeof(digest));
4698 digest_size = sizeof(digest);
4699
4700 memcpy(data, digest_test_patterns[0].data,
4701 digest_test_patterns[0].data_size);
4702 data_size = digest_test_patterns[0].data_size;
4703
4704 rv = C_DigestInit(session, &mechanism);
4705 if (!ADBG_EXPECT_CK_OK(c, rv))
4706 goto out;
4707
4708 rv = C_DigestUpdate(session, data, data_size);
4709 if (!ADBG_EXPECT_CK_OK(c, rv))
4710 goto out;
4711
4712 rv = C_DigestKey(session, key_handle);
4713 if (!ADBG_EXPECT_CK_OK(c, rv))
4714 goto out;
4715
4716 rv = C_DigestFinal(session, digest, &digest_size);
4717 if (!ADBG_EXPECT_CK_OK(c, rv))
4718 goto out;
4719
4720 /* Verify digest with openssl */
4721#ifdef OPENSSL_FOUND
4722 mdctx = EVP_MD_CTX_create();
4723 if (!ADBG_EXPECT_NOT_NULL(c, mdctx))
4724 goto out;
4725 ret = EVP_DigestInit_ex(mdctx, EVP_sha256(), NULL);
4726 if (!ADBG_EXPECT_COMPARE_SIGNED(c, ret, ==, 1))
4727 goto out;
4728 ret = EVP_DigestUpdate(mdctx, data, data_size);
4729 if (!ADBG_EXPECT_COMPARE_SIGNED(c, ret, ==, 1))
4730 goto out;
4731 ret = EVP_DigestUpdate(mdctx, secret_data, secret_data_size);
4732 if (!ADBG_EXPECT_COMPARE_SIGNED(c, ret, ==, 1))
4733 goto out;
4734 ret = EVP_DigestFinal_ex(mdctx, hash, &md_len);
4735 if (!ADBG_EXPECT_COMPARE_SIGNED(c, ret, ==, 1))
4736 goto out;
4737 EVP_MD_CTX_destroy(mdctx);
4738 mdctx = NULL;
4739
4740 if (!ADBG_EXPECT_BUFFER(c, hash, md_len, digest, digest_size))
4741 goto out;
4742#else
4743 Do_ADBG_Log("OpenSSL not available, skipping C_DigestKey verification");
4744#endif
4745
4746 ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, key_handle));
4747 key_handle = CK_INVALID_HANDLE;
4748
4749 Do_ADBG_EndSubCase(c, NULL);
4750
4751 Do_ADBG_BeginSubCase(c, "Query digest size - C_DigestFinal");
4752
4753 mechanism.mechanism = digest_test_patterns[0].mecha;
4754
4755 memset(data, 0xCC, sizeof(data));
4756 memset(digest, 0xCC, sizeof(digest));
4757 digest_size = 0;
4758
4759 memcpy(data, digest_test_patterns[0].data,
4760 digest_test_patterns[0].data_size);
4761 data_size = digest_test_patterns[0].data_size;
4762
4763 expect_digest = digest_test_patterns[0].digest;
4764 expect_digest_size = digest_test_patterns[0].digest_size;
4765
4766 rv = C_DigestInit(session, &mechanism);
4767 if (!ADBG_EXPECT_CK_OK(c, rv))
4768 goto out;
4769
4770 rv = C_DigestUpdate(session, data, data_size);
4771 if (!ADBG_EXPECT_CK_OK(c, rv))
4772 goto out;
4773
4774 rv = C_DigestFinal(session, NULL, &digest_size);
4775 if (!ADBG_EXPECT_CK_OK(c, rv))
4776 goto out;
4777
4778 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, digest_size, ==,
4779 expect_digest_size))
4780 goto out;
4781
4782 rv = C_DigestFinal(session, digest, &digest_size);
4783 if (!ADBG_EXPECT_CK_OK(c, rv))
4784 goto out;
4785
4786 if (!ADBG_EXPECT_BUFFER(c, expect_digest, expect_digest_size,
4787 digest, digest_size))
4788 goto out;
4789
4790 Do_ADBG_EndSubCase(c, NULL);
4791
4792 Do_ADBG_BeginSubCase(c, "Query digest size - C_Digest");
4793
4794 mechanism.mechanism = digest_test_patterns[0].mecha;
4795
4796 memset(data, 0xCC, sizeof(data));
4797 memset(digest, 0xCC, sizeof(digest));
4798 digest_size = 0;
4799
4800 memcpy(data, digest_test_patterns[0].data,
4801 digest_test_patterns[0].data_size);
4802 data_size = digest_test_patterns[0].data_size;
4803
4804 expect_digest = digest_test_patterns[0].digest;
4805 expect_digest_size = digest_test_patterns[0].digest_size;
4806
4807 rv = C_DigestInit(session, &mechanism);
4808 if (!ADBG_EXPECT_CK_OK(c, rv))
4809 goto out;
4810
4811 rv = C_Digest(session, data, data_size, NULL, &digest_size);
4812 if (!ADBG_EXPECT_CK_OK(c, rv))
4813 goto out;
4814
4815 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, digest_size, ==,
4816 expect_digest_size))
4817 goto out;
4818
4819 rv = C_Digest(session, data, data_size, digest, &digest_size);
4820 if (!ADBG_EXPECT_CK_OK(c, rv))
4821 goto out;
4822
4823 if (!ADBG_EXPECT_BUFFER(c, expect_digest, expect_digest_size,
4824 digest, digest_size))
4825 goto out;
4826
4827 Do_ADBG_EndSubCase(c, NULL);
4828
4829 Do_ADBG_BeginSubCase(c, "Query digest size - buffer too small");
4830
4831 mechanism.mechanism = CKM_SHA256;
4832
4833 memset(data, 0xCC, sizeof(data));
4834 memset(digest, 0xCC, sizeof(digest));
4835 digest_size = 0;
4836
4837 memcpy(data, digest_test_patterns[0].data,
4838 digest_test_patterns[0].data_size);
4839 data_size = digest_test_patterns[0].data_size;
4840
4841 rv = C_DigestInit(session, &mechanism);
4842 if (!ADBG_EXPECT_CK_OK(c, rv))
4843 goto out;
4844
4845 rv = C_DigestUpdate(session, data, data_size);
4846 if (!ADBG_EXPECT_CK_OK(c, rv))
4847 goto out;
4848
4849 rv = C_DigestFinal(session, digest, &digest_size);
4850 if (!ADBG_EXPECT_CK_RESULT(c, CKR_BUFFER_TOO_SMALL, rv))
4851 goto out;
4852
4853 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, digest_size, ==, 32))
4854 goto out;
4855
4856 rv = C_DigestFinal(session, digest, &digest_size);
4857 if (!ADBG_EXPECT_CK_OK(c, rv))
4858 goto out;
4859
4860 Do_ADBG_EndSubCase(c, NULL);
4861
4862 /* Test bad arguments & operation terminations */
4863
4864 Do_ADBG_BeginSubCase(c, "Test bad arguments - C_DigestUpdate");
4865
4866 mechanism.mechanism = CKM_SHA256;
4867
4868 memset(data, 0xCC, sizeof(data));
4869 memset(digest, 0xCC, sizeof(digest));
4870 digest_size = sizeof(digest);
4871
4872 memcpy(data, digest_test_patterns[0].data,
4873 digest_test_patterns[0].data_size);
4874 data_size = digest_test_patterns[0].data_size;
4875
4876 rv = C_DigestInit(session, &mechanism);
4877 if (!ADBG_EXPECT_CK_OK(c, rv))
4878 goto out;
4879
4880 rv = C_DigestUpdate(session, NULL, 10);
4881 if (!ADBG_EXPECT_CK_RESULT(c, CKR_ARGUMENTS_BAD, rv))
4882 goto out;
4883
4884 rv = C_DigestUpdate(session, data, data_size);
4885 if (!ADBG_EXPECT_CK_RESULT(c, CKR_OPERATION_NOT_INITIALIZED, rv))
4886 goto out;
4887
4888 Do_ADBG_EndSubCase(c, NULL);
4889
4890 Do_ADBG_BeginSubCase(c, "Test bad arguments - C_DigestFinal with NULL digest");
4891
4892 mechanism.mechanism = CKM_SHA256;
4893
4894 memset(data, 0xCC, sizeof(data));
4895 memset(digest, 0xCC, sizeof(digest));
4896 digest_size = sizeof(digest);
4897
4898 memcpy(data, digest_test_patterns[0].data,
4899 digest_test_patterns[0].data_size);
4900 data_size = digest_test_patterns[0].data_size;
4901
4902 rv = C_DigestInit(session, &mechanism);
4903 if (!ADBG_EXPECT_CK_OK(c, rv))
4904 goto out;
4905
4906 rv = C_DigestUpdate(session, data, data_size);
4907 if (!ADBG_EXPECT_CK_OK(c, rv))
4908 goto out;
4909
4910 rv = C_DigestFinal(session, NULL, NULL);
4911 if (!ADBG_EXPECT_CK_RESULT(c, CKR_ARGUMENTS_BAD, rv))
4912 goto out;
4913
4914 rv = C_DigestFinal(session, digest, &digest_size);
4915 if (!ADBG_EXPECT_CK_RESULT(c, CKR_OPERATION_NOT_INITIALIZED, rv))
4916 goto out;
4917
4918 Do_ADBG_EndSubCase(c, NULL);
4919
4920 Do_ADBG_BeginSubCase(c, "Test bad arguments - C_DigestFinal with digest but NULL size");
4921
4922 mechanism.mechanism = CKM_SHA256;
4923
4924 memset(data, 0xCC, sizeof(data));
4925 memset(digest, 0xCC, sizeof(digest));
4926 digest_size = sizeof(digest);
4927
4928 memcpy(data, digest_test_patterns[0].data,
4929 digest_test_patterns[0].data_size);
4930 data_size = digest_test_patterns[0].data_size;
4931
4932 rv = C_DigestInit(session, &mechanism);
4933 if (!ADBG_EXPECT_CK_OK(c, rv))
4934 goto out;
4935
4936 rv = C_DigestUpdate(session, data, data_size);
4937 if (!ADBG_EXPECT_CK_OK(c, rv))
4938 goto out;
4939
4940 rv = C_DigestFinal(session, digest, NULL);
4941 if (!ADBG_EXPECT_CK_RESULT(c, CKR_ARGUMENTS_BAD, rv))
4942 goto out;
4943
4944 rv = C_DigestFinal(session, digest, &digest_size);
4945 if (!ADBG_EXPECT_CK_RESULT(c, CKR_OPERATION_NOT_INITIALIZED, rv))
4946 goto out;
4947
4948 Do_ADBG_EndSubCase(c, NULL);
4949
4950 Do_ADBG_BeginSubCase(c, "Test bad arguments - C_Digest with NULL data but non-zero size");
4951
4952 mechanism.mechanism = CKM_SHA256;
4953
4954 memset(data, 0xCC, sizeof(data));
4955 memset(digest, 0xCC, sizeof(digest));
4956 digest_size = sizeof(digest);
4957
4958 memcpy(data, digest_test_patterns[0].data,
4959 digest_test_patterns[0].data_size);
4960 data_size = digest_test_patterns[0].data_size;
4961
4962 rv = C_DigestInit(session, &mechanism);
4963 if (!ADBG_EXPECT_CK_OK(c, rv))
4964 goto out;
4965
4966 rv = C_Digest(session, NULL, 10, digest, &digest_size);
4967 if (!ADBG_EXPECT_CK_RESULT(c, CKR_ARGUMENTS_BAD, rv))
4968 goto out;
4969
4970 rv = C_Digest(session, data, data_size, digest, &digest_size);
4971 if (!ADBG_EXPECT_CK_RESULT(c, CKR_OPERATION_NOT_INITIALIZED, rv))
4972 goto out;
4973
4974 Do_ADBG_EndSubCase(c, NULL);
4975
4976 Do_ADBG_BeginSubCase(c, "Test bad arguments - C_Digest with NULL digest");
4977
4978 mechanism.mechanism = CKM_SHA256;
4979
4980 memset(data, 0xCC, sizeof(data));
4981 memset(digest, 0xCC, sizeof(digest));
4982 digest_size = sizeof(digest);
4983
4984 memcpy(data, digest_test_patterns[0].data,
4985 digest_test_patterns[0].data_size);
4986 data_size = digest_test_patterns[0].data_size;
4987
4988 rv = C_DigestInit(session, &mechanism);
4989 if (!ADBG_EXPECT_CK_OK(c, rv))
4990 goto out;
4991
4992 rv = C_Digest(session, data, data_size, NULL, NULL);
4993 if (!ADBG_EXPECT_CK_RESULT(c, CKR_ARGUMENTS_BAD, rv))
4994 goto out;
4995
4996 rv = C_Digest(session, data, data_size, digest, &digest_size);
4997 if (!ADBG_EXPECT_CK_RESULT(c, CKR_OPERATION_NOT_INITIALIZED, rv))
4998 goto out;
4999
5000 Do_ADBG_EndSubCase(c, NULL);
5001
5002 Do_ADBG_BeginSubCase(c, "Test bad arguments - C_DigestFinal with digest but NULL size");
5003
5004 mechanism.mechanism = CKM_SHA256;
5005
5006 memset(data, 0xCC, sizeof(data));
5007 memset(digest, 0xCC, sizeof(digest));
5008 digest_size = sizeof(digest);
5009
5010 memcpy(data, digest_test_patterns[0].data,
5011 digest_test_patterns[0].data_size);
5012 data_size = digest_test_patterns[0].data_size;
5013
5014 rv = C_DigestInit(session, &mechanism);
5015 if (!ADBG_EXPECT_CK_OK(c, rv))
5016 goto out;
5017
5018 rv = C_Digest(session, data, data_size, digest, NULL);
5019 if (!ADBG_EXPECT_CK_RESULT(c, CKR_ARGUMENTS_BAD, rv))
5020 goto out;
5021
5022 rv = C_Digest(session, data, data_size, digest, &digest_size);
5023 if (!ADBG_EXPECT_CK_RESULT(c, CKR_OPERATION_NOT_INITIALIZED, rv))
5024 goto out;
5025
5026 Do_ADBG_EndSubCase(c, NULL);
5027
5028 Do_ADBG_BeginSubCase(c, "Test bad arguments - C_DigestKey with invalid key handle");
5029
5030 rv = C_CreateObject(session, digest_data_object,
5031 ARRAY_SIZE(digest_data_object), &key_handle);
5032 if (!ADBG_EXPECT_CK_OK(c, rv))
5033 goto out;
5034
5035 mechanism.mechanism = CKM_SHA256;
5036
5037 memset(data, 0xCC, sizeof(data));
5038 memset(digest, 0xCC, sizeof(digest));
5039 digest_size = sizeof(digest);
5040
5041 memcpy(data, digest_test_patterns[0].data,
5042 digest_test_patterns[0].data_size);
5043 data_size = digest_test_patterns[0].data_size;
5044
5045 rv = C_DigestInit(session, &mechanism);
5046 if (!ADBG_EXPECT_CK_OK(c, rv))
5047 goto out;
5048
5049 rv = C_DigestKey(session, 9999);
5050 if (!ADBG_EXPECT_CK_RESULT(c, CKR_KEY_HANDLE_INVALID, rv))
5051 goto out;
5052
5053 rv = C_DigestKey(session, key_handle);
5054 if (!ADBG_EXPECT_CK_RESULT(c, CKR_OPERATION_NOT_INITIALIZED, rv))
5055 goto out;
5056
5057 Do_ADBG_EndSubCase(c, NULL);
5058
5059 Do_ADBG_BeginSubCase(c, "Test bad arguments - C_DigestKey with non-secret key type");
5060
5061 mechanism.mechanism = CKM_SHA256;
5062
5063 memset(data, 0xCC, sizeof(data));
5064 memset(digest, 0xCC, sizeof(digest));
5065 digest_size = sizeof(digest);
5066
5067 memcpy(data, digest_test_patterns[0].data,
5068 digest_test_patterns[0].data_size);
5069 data_size = digest_test_patterns[0].data_size;
5070
5071 rv = C_DigestInit(session, &mechanism);
5072 if (!ADBG_EXPECT_CK_OK(c, rv))
5073 goto out;
5074
5075 rv = C_DigestKey(session, key_handle);
5076 if (!ADBG_EXPECT_CK_RESULT(c, CKR_KEY_INDIGESTIBLE, rv))
5077 goto out;
5078
5079 rv = C_DigestKey(session, key_handle);
5080 if (!ADBG_EXPECT_CK_RESULT(c, CKR_OPERATION_NOT_INITIALIZED, rv))
5081 goto out;
5082
5083 ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, key_handle));
5084 key_handle = CK_INVALID_HANDLE;
5085
5086out:
5087#ifdef OPENSSL_FOUND
5088 if (!ADBG_EXPECT_POINTER(c, NULL, mdctx)) {
5089 Do_ADBG_Log("Unexpected failure in openssl functions: %d",
5090 ret);
5091 EVP_MD_CTX_destroy(mdctx);
5092 }
5093#endif
5094
5095 Do_ADBG_EndSubCase(c, NULL);
5096
5097 if (logged_in)
5098 ADBG_EXPECT_CK_OK(c, C_Logout(session));
5099
5100 if (key_handle != CK_INVALID_HANDLE) {
5101 ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, key_handle));
5102 key_handle = CK_INVALID_HANDLE;
5103 }
5104
5105 ADBG_EXPECT_CK_OK(c, C_CloseSession(session));
5106
5107close_lib:
5108 ADBG_EXPECT_CK_OK(c, close_lib());
5109}
5110ADBG_CASE_DEFINE(pkcs11, 1018, xtest_pkcs11_test_1018,
5111 "PKCS11: Digest tests");
Vesa Jääskeläinena4ab9572021-04-07 12:50:06 +03005112
5113/**
5114 * 0:d=0 hl=2 l= 22 cons: SEQUENCE
5115 * 2:d=1 hl=2 l= 20 cons: SET
5116 * 4:d=2 hl=2 l= 18 cons: SEQUENCE
5117 * 6:d=3 hl=2 l= 3 prim: OBJECT :commonName
5118 * 11:d=3 hl=2 l= 11 prim: UTF8STRING :common name
5119 */
5120static uint8_t subject_common_name[] = {
5121 0x30, 0x16, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c,
5122 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x20, 0x6e, 0x61, 0x6d, 0x65
5123};
5124
5125/**
5126 * 0:d=0 hl=2 l= 8 prim: OBJECT :prime256v1
5127 */
5128static uint8_t ecdsa_nist_p256[] = {
5129 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03,
5130 0x01, 0x07
5131};
5132
5133/**
5134 * 0:d=0 hl=2 l= 5 prim: OBJECT :secp384r1
5135 */
5136static uint8_t ecdsa_nist_p384[] = {
5137 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22
5138};
5139
5140/**
5141 * 0:d=0 hl=2 l= 5 prim: OBJECT :secp521r1
5142 */
5143static uint8_t ecdsa_nist_p521[] = {
5144 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x23
5145};
5146
5147#define EC_SIGN_TEST(_test_name, _mecha, _data) \
5148 { \
5149 .test_name = _test_name, \
5150 .mecha = _mecha, \
5151 .data = _data, \
5152 .data_size = sizeof(_data) - 1, \
5153 }
5154
5155/* List of elliptic curve signing multi stage digest mechas */
5156static struct {
5157 const char *test_name;
5158 CK_MECHANISM_TYPE mecha;
5159 const void *data;
5160 CK_ULONG data_size;
5161} ec_sign_tests[] = {
5162 EC_SIGN_TEST("CKM_ECDSA_SHA1", CKM_ECDSA_SHA1, digest_test_pattern),
5163 EC_SIGN_TEST("CKM_ECDSA_SHA224", CKM_ECDSA_SHA224, digest_test_pattern),
5164 EC_SIGN_TEST("CKM_ECDSA_SHA256", CKM_ECDSA_SHA256, digest_test_pattern),
5165 EC_SIGN_TEST("CKM_ECDSA_SHA384", CKM_ECDSA_SHA384, digest_test_pattern),
5166 EC_SIGN_TEST("CKM_ECDSA_SHA512", CKM_ECDSA_SHA512, digest_test_pattern),
5167};
5168
5169static int test_ec_operations(ADBG_Case_t *c, CK_SESSION_HANDLE session,
5170 const char *curve_name, uint8_t *curve,
5171 size_t curve_size)
5172{
5173 CK_RV rv = CKR_GENERAL_ERROR;
5174
5175 CK_OBJECT_HANDLE public_key = CK_INVALID_HANDLE;
5176 CK_OBJECT_HANDLE private_key = CK_INVALID_HANDLE;
5177
5178 CK_MECHANISM mechanism = {
5179 CKM_EC_KEY_PAIR_GEN, NULL, 0
5180 };
5181 CK_MECHANISM sign_mechanism = {
5182 CKM_ECDSA, NULL, 0
5183 };
5184 CK_BYTE id[] = { 123 };
5185
5186 CK_ATTRIBUTE public_key_template[] = {
5187 { CKA_ENCRYPT, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
5188 { CKA_VERIFY, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5189 { CKA_WRAP, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
5190 { CKA_EC_PARAMS, ecdsa_nist_p256, sizeof(ecdsa_nist_p256) }
5191 };
5192
5193 CK_ATTRIBUTE private_key_template[] = {
5194 { CKA_TOKEN, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
5195 { CKA_PRIVATE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5196 { CKA_SUBJECT, subject_common_name,
5197 sizeof(subject_common_name) },
5198 { CKA_ID, id, sizeof(id) },
5199 { CKA_SENSITIVE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5200 { CKA_DECRYPT, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
5201 { CKA_SIGN, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5202 { CKA_UNWRAP, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) }
5203 };
5204
5205 CK_OBJECT_CLASS g_class = 0;
5206 CK_KEY_TYPE g_key_type = 0;
5207 CK_BYTE g_id[32] = { 0 };
5208 CK_DATE g_start_date = { 0 };
5209 CK_DATE g_end_date = { 0 };
5210 CK_BBOOL g_derive = CK_FALSE;
5211 CK_BBOOL g_local = CK_FALSE;
5212 CK_MECHANISM_TYPE g_keygen_mecha = 0;
5213 CK_BYTE g_subject[64] = { 0 };
5214 CK_BBOOL g_encrypt = CK_FALSE;
5215 CK_BBOOL g_verify = CK_FALSE;
5216 CK_BBOOL g_verify_recover = CK_FALSE;
5217 CK_BBOOL g_wrap = CK_FALSE;
5218 CK_BBOOL g_trusted = CK_FALSE;
5219 CK_BYTE g_public_key_info[1024] = { 0 };
5220 CK_BBOOL g_sensitive = CK_FALSE;
5221 CK_BBOOL g_decrypt = CK_FALSE;
5222 CK_BBOOL g_sign = CK_FALSE;
5223 CK_BBOOL g_sign_recover = CK_FALSE;
5224 CK_BBOOL g_unwrap = CK_FALSE;
5225 CK_BBOOL g_extract = CK_FALSE;
5226 CK_BBOOL g_asensitive = CK_FALSE;
5227 CK_BBOOL g_nextract = CK_FALSE;
5228 CK_BBOOL g_wrap_with_trusted = CK_FALSE;
5229 CK_BBOOL g_always_authenticate = CK_FALSE;
5230
5231 CK_ATTRIBUTE get_public_template[] = {
5232 { CKA_CLASS, &g_class, sizeof(CK_OBJECT_CLASS) },
5233 { CKA_KEY_TYPE, &g_key_type, sizeof(CK_KEY_TYPE) },
5234 { CKA_ID, g_id, sizeof(g_id) },
5235 { CKA_START_DATE, &g_start_date, sizeof(CK_DATE) },
5236 { CKA_END_DATE, &g_end_date, sizeof(CK_DATE) },
5237 { CKA_DERIVE, &g_derive, sizeof(CK_BBOOL) },
5238 { CKA_LOCAL, &g_local, sizeof(CK_BBOOL) },
5239 { CKA_KEY_GEN_MECHANISM, &g_keygen_mecha, sizeof(CK_MECHANISM_TYPE) },
5240 { CKA_SUBJECT, g_subject, sizeof(g_subject) },
5241 { CKA_ENCRYPT, &g_encrypt, sizeof(CK_BBOOL) },
5242 { CKA_VERIFY, &g_verify, sizeof(CK_BBOOL) },
5243 { CKA_VERIFY_RECOVER, &g_verify_recover, sizeof(CK_BBOOL) },
5244 { CKA_WRAP, &g_wrap, sizeof(CK_BBOOL) },
5245 { CKA_TRUSTED, &g_trusted, sizeof(CK_BBOOL) },
5246 { CKA_PUBLIC_KEY_INFO, g_public_key_info, sizeof(g_public_key_info) },
5247 };
5248
5249 CK_ATTRIBUTE get_private_template[] = {
5250 { CKA_CLASS, &g_class, sizeof(CK_OBJECT_CLASS) },
5251 { CKA_KEY_TYPE, &g_key_type, sizeof(CK_KEY_TYPE) },
5252 { CKA_ID, g_id, sizeof(g_id) },
5253 { CKA_START_DATE, &g_start_date, sizeof(CK_DATE) },
5254 { CKA_END_DATE, &g_end_date, sizeof(CK_DATE) },
5255 { CKA_DERIVE, &g_derive, sizeof(CK_BBOOL) },
5256 { CKA_LOCAL, &g_local, sizeof(CK_BBOOL) },
5257 { CKA_KEY_GEN_MECHANISM, &g_keygen_mecha, sizeof(CK_MECHANISM_TYPE) },
5258 { CKA_SUBJECT, g_subject, sizeof(g_subject) },
5259 { CKA_SENSITIVE, &g_sensitive, sizeof(CK_BBOOL) },
5260 { CKA_DECRYPT, &g_decrypt, sizeof(CK_BBOOL) },
5261 { CKA_SIGN, &g_sign, sizeof(CK_BBOOL) },
5262 { CKA_SIGN_RECOVER, &g_sign_recover, sizeof(CK_BBOOL) },
5263 { CKA_UNWRAP, &g_unwrap, sizeof(CK_BBOOL) },
5264 { CKA_EXTRACTABLE, &g_extract, sizeof(CK_BBOOL) },
5265 { CKA_ALWAYS_SENSITIVE, &g_asensitive, sizeof(CK_BBOOL) },
5266 { CKA_NEVER_EXTRACTABLE, &g_nextract, sizeof(CK_BBOOL) },
5267 { CKA_WRAP_WITH_TRUSTED, &g_wrap_with_trusted, sizeof(CK_BBOOL) },
5268 { CKA_ALWAYS_AUTHENTICATE, &g_always_authenticate, sizeof(CK_BBOOL) },
5269 { CKA_PUBLIC_KEY_INFO, g_public_key_info, sizeof(g_public_key_info) },
5270 };
5271
5272 uint8_t signature[512] = { 0 };
5273 CK_ULONG signature_len = 0;
5274
5275 size_t i = 0;
5276
5277 Do_ADBG_BeginSubCase(c, "%s: Generate key pair",
5278 curve_name);
5279
5280 public_key_template[3].pValue = curve;
5281 public_key_template[3].ulValueLen = curve_size;
5282
5283 rv = C_GenerateKeyPair(session, &mechanism, public_key_template,
5284 ARRAY_SIZE(public_key_template),
5285 private_key_template,
5286 ARRAY_SIZE(private_key_template),
5287 &public_key, &private_key);
5288 if (!ADBG_EXPECT_CK_OK(c, rv))
5289 goto err;
5290
5291 /* reset get public key template */
5292 memset(g_id, 0, sizeof(g_id));
5293 memset(g_subject, 0, sizeof(g_subject));
5294 memset(g_public_key_info, 0, sizeof(g_public_key_info));
5295 get_public_template[2].ulValueLen = sizeof(g_id);
5296 get_public_template[8].ulValueLen = sizeof(g_subject);
5297 get_public_template[14].ulValueLen = sizeof(g_public_key_info);
5298
5299 rv = C_GetAttributeValue(session, public_key, get_public_template,
5300 ARRAY_SIZE(get_public_template));
5301 if (!ADBG_EXPECT_CK_OK(c, rv) ||
5302 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_PUBLIC_KEY) ||
5303 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_key_type, ==, CKK_EC) ||
5304 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_derive, ==, CK_FALSE) ||
5305 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_TRUE) ||
5306 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_keygen_mecha, ==,
5307 CKM_EC_KEY_PAIR_GEN) ||
5308 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_encrypt, ==, CK_FALSE) ||
5309 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_verify, ==, CK_TRUE) ||
5310 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_verify_recover, ==, CK_FALSE) ||
5311 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_wrap, ==, CK_FALSE) ||
5312 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_trusted, ==, CK_FALSE))
5313 goto err_destr_obj;
5314
5315 /* reset get private key template */
5316 memset(g_id, 0, sizeof(g_id));
5317 memset(g_subject, 0, sizeof(g_subject));
5318 memset(g_public_key_info, 0, sizeof(g_public_key_info));
5319 get_private_template[2].ulValueLen = sizeof(g_id);
5320 get_private_template[8].ulValueLen = sizeof(g_subject);
5321 get_private_template[19].ulValueLen = sizeof(g_public_key_info);
5322
5323 rv = C_GetAttributeValue(session, private_key, get_private_template,
5324 ARRAY_SIZE(get_private_template));
5325 if (!ADBG_EXPECT_CK_OK(c, rv) ||
5326 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_PRIVATE_KEY) ||
5327 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_key_type, ==, CKK_EC) ||
5328 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_derive, ==, CK_FALSE) ||
5329 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_TRUE) ||
5330 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_keygen_mecha, ==,
5331 CKM_EC_KEY_PAIR_GEN) ||
5332 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sensitive, ==, CK_TRUE) ||
5333 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_decrypt, ==, CK_FALSE) ||
5334 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sign, ==, CK_TRUE) ||
5335 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sign_recover, ==, CK_FALSE) ||
5336 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_unwrap, ==, CK_FALSE) ||
5337 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_extract, ==, CK_FALSE) ||
5338 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_asensitive, ==, CK_TRUE) ||
5339 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_nextract, ==, CK_TRUE) ||
5340 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_wrap_with_trusted, ==, CK_FALSE) ||
5341 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_always_authenticate, ==, CK_FALSE))
5342 goto err_destr_obj;
5343
5344 Do_ADBG_EndSubCase(c, NULL);
5345
5346 Do_ADBG_BeginSubCase(c,
5347 "%s: Sign & verify tests - oneshot - CKM_ECDSA",
5348 curve_name);
5349
5350 sign_mechanism.mechanism = CKM_ECDSA;
5351 memset(signature, 0, sizeof(signature));
5352 signature_len = sizeof(signature);
5353
5354 rv = C_SignInit(session, &sign_mechanism, private_key);
5355 if (!ADBG_EXPECT_CK_OK(c, rv))
5356 goto err_destr_obj;
5357
5358 rv = C_Sign(session, (void *)digest_test_pattern_sha256,
5359 sizeof(digest_test_pattern_sha256), (void *)signature,
5360 &signature_len);
5361 if (!ADBG_EXPECT_CK_OK(c, rv))
5362 goto err_destr_obj;
5363
5364 rv = C_VerifyInit(session, &sign_mechanism, public_key);
5365 if (!ADBG_EXPECT_CK_OK(c, rv))
5366 goto err_destr_obj;
5367
5368 rv = C_Verify(session, (void *)digest_test_pattern_sha256,
5369 sizeof(digest_test_pattern_sha256), (void *)signature,
5370 signature_len);
5371 if (!ADBG_EXPECT_CK_OK(c, rv))
5372 goto err_destr_obj;
5373
5374 Do_ADBG_EndSubCase(c, NULL);
5375
5376 for (i = 0; i < ARRAY_SIZE(ec_sign_tests); i++) {
5377 Do_ADBG_BeginSubCase(c, "%s: Sign & verify - oneshot - %s",
5378 curve_name, ec_sign_tests[i].test_name);
5379
5380 sign_mechanism.mechanism = ec_sign_tests[i].mecha;
5381 memset(signature, 0, sizeof(signature));
5382 signature_len = sizeof(signature);
5383
5384 rv = C_SignInit(session, &sign_mechanism, private_key);
5385 if (!ADBG_EXPECT_CK_OK(c, rv))
5386 goto err_destr_obj;
5387
5388 rv = C_Sign(session, (void *)ec_sign_tests[i].data,
5389 ec_sign_tests[i].data_size,
5390 (void *)signature, &signature_len);
5391 if (!ADBG_EXPECT_CK_OK(c, rv))
5392 goto err_destr_obj;
5393
5394 rv = C_VerifyInit(session, &sign_mechanism, public_key);
5395 if (!ADBG_EXPECT_CK_OK(c, rv))
5396 goto err_destr_obj;
5397
5398 rv = C_Verify(session, (void *)ec_sign_tests[i].data,
5399 ec_sign_tests[i].data_size,
5400 (void *)signature, signature_len);
5401 if (!ADBG_EXPECT_CK_OK(c, rv))
5402 goto err_destr_obj;
5403
5404 Do_ADBG_EndSubCase(c, NULL);
5405 }
5406
5407 Do_ADBG_BeginSubCase(c, "%s: Destroy keys", curve_name);
5408
5409 rv = C_DestroyObject(session, private_key);
5410 if (!ADBG_EXPECT_CK_OK(c, rv))
5411 goto err_destr_obj;
5412
5413 rv = C_DestroyObject(session, public_key);
5414 if (!ADBG_EXPECT_CK_OK(c, rv))
5415 goto err;
5416
5417 Do_ADBG_EndSubCase(c, NULL);
5418
5419 return 1;
5420
5421err_destr_obj:
5422 ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, private_key));
5423 ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, public_key));
5424err:
5425 Do_ADBG_EndSubCase(c, NULL);
5426
5427 return 0;
5428}
5429
5430static void xtest_pkcs11_test_1019(ADBG_Case_t *c)
5431{
5432 CK_RV rv = CKR_GENERAL_ERROR;
5433 CK_SLOT_ID slot = 0;
5434 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
5435 CK_FLAGS session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
5436 int ret = 0;
5437
5438 rv = init_lib_and_find_token_slot(&slot);
5439 if (!ADBG_EXPECT_CK_OK(c, rv))
5440 return;
5441
5442 rv = init_test_token(slot);
5443 if (!ADBG_EXPECT_CK_OK(c, rv))
5444 goto close_lib;
5445
5446 rv = init_user_test_token(slot);
5447 if (!ADBG_EXPECT_CK_OK(c, rv))
5448 goto close_lib;
5449
5450 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
5451 if (!ADBG_EXPECT_CK_OK(c, rv))
5452 goto close_lib;
5453
5454 /* Login to Test Token */
5455 rv = C_Login(session, CKU_USER, test_token_user_pin,
5456 sizeof(test_token_user_pin));
5457 if (!ADBG_EXPECT_CK_OK(c, rv))
5458 goto out;
5459
5460 ret = test_ec_operations(c, session, "P-256", ecdsa_nist_p256,
5461 sizeof(ecdsa_nist_p256));
5462 if (!ret)
5463 goto out;
5464 ret = test_ec_operations(c, session, "P-384", ecdsa_nist_p384,
5465 sizeof(ecdsa_nist_p384));
5466 if (!ret)
5467 goto out;
5468
5469 if (level > 0) {
5470 ret = test_ec_operations(c, session, "P-521", ecdsa_nist_p521,
5471 sizeof(ecdsa_nist_p521));
5472 if (!ret)
5473 goto out;
5474 }
5475out:
5476 ADBG_EXPECT_CK_OK(c, C_CloseSession(session));
5477close_lib:
5478 ADBG_EXPECT_CK_OK(c, close_lib());
5479}
5480ADBG_CASE_DEFINE(pkcs11, 1019, xtest_pkcs11_test_1019,
5481 "PKCS11: Elliptic Curve key generation and signing");
Ruchika Guptaf2eb88a2021-03-22 19:38:11 +05305482
5483#define WRAPPED_TEST_KEY_SIZE 48
5484
5485static void xtest_pkcs11_test_1020(ADBG_Case_t *c)
5486{
5487 CK_RV rv = CKR_GENERAL_ERROR;
5488 CK_SLOT_ID slot = 0;
5489 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
5490 CK_FLAGS session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
5491 CK_OBJECT_HANDLE wrapping_key1 = CK_INVALID_HANDLE;
5492 CK_OBJECT_HANDLE wrapping_key2 = CK_INVALID_HANDLE;
5493 CK_OBJECT_HANDLE wrapping_key_inv = CK_INVALID_HANDLE;
5494 CK_OBJECT_HANDLE key = CK_INVALID_HANDLE;
5495 CK_OBJECT_HANDLE key_sz24 = CK_INVALID_HANDLE;
5496 CK_OBJECT_HANDLE key_sens = CK_INVALID_HANDLE;
5497 CK_OBJECT_HANDLE key_inv = CK_INVALID_HANDLE;
5498 CK_OBJECT_HANDLE unwrapped_key = CK_INVALID_HANDLE;
5499 CK_ATTRIBUTE set_w_unw_template[] = {
5500 { CKA_WRAP, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5501 { CKA_UNWRAP, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5502 };
5503 CK_ATTRIBUTE set_wwt_template[] = {
5504 { CKA_WRAP_WITH_TRUSTED, &(CK_BBOOL){ CK_TRUE },
5505 sizeof(CK_BBOOL) },
5506 };
5507 CK_ATTRIBUTE set_trusted_template[] = {
5508 { CKA_TRUSTED, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5509 };
5510 CK_ATTRIBUTE wrap_template[] = {
5511 { CKA_SENSITIVE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5512 };
5513 CK_ATTRIBUTE unwrap_template[] = {
5514 { CKA_SENSITIVE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5515 };
5516 CK_ATTRIBUTE wrapping_key_template[] = {
5517 { CKA_VALUE_LEN, &(CK_ULONG){ 16 }, sizeof(CK_ULONG) },
5518 { CKA_WRAP, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5519 { CKA_UNWRAP, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5520 { CKA_SENSITIVE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5521 { CKA_EXTRACTABLE, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
5522 };
5523 CK_ATTRIBUTE wrapping_key_temp_w_indirect[] = {
5524 { CKA_VALUE_LEN, &(CK_ULONG){ 16 }, sizeof(CK_ULONG) },
5525 { CKA_WRAP, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5526 { CKA_UNWRAP, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5527 { CKA_WRAP_TEMPLATE, &wrap_template, sizeof(wrap_template) },
5528 { CKA_UNWRAP_TEMPLATE, &unwrap_template,
5529 sizeof(unwrap_template) },
5530 };
5531 CK_ATTRIBUTE unwrap_template2[] = {
5532 { CKA_CLASS, &(CK_OBJECT_CLASS){ CKO_SECRET_KEY },
5533 sizeof(CK_OBJECT_CLASS) },
5534 { CKA_KEY_TYPE, &(CK_KEY_TYPE){ CKK_AES }, sizeof(CK_KEY_TYPE) },
5535 { CKA_TOKEN, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5536 { CKA_EXTRACTABLE, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
5537 { CKA_VALUE_LEN, &(CK_ULONG){ 16 }, sizeof(CK_ULONG) },
5538 };
5539 CK_ATTRIBUTE wrapping_key_temp_w_indirect2[] = {
5540 { CKA_VALUE_LEN, &(CK_ULONG){ 16 }, sizeof(CK_ULONG) },
5541 { CKA_WRAP, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5542 { CKA_UNWRAP, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5543 { CKA_UNWRAP_TEMPLATE, &unwrap_template2,
5544 sizeof(unwrap_template2) },
5545 };
5546 CK_ATTRIBUTE wrapping_key_template_inv1[] = {
5547 { CKA_VALUE_LEN, &(CK_ULONG){ 16 }, sizeof(CK_ULONG) },
5548 { CKA_WRAP, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
5549 };
5550 CK_ATTRIBUTE key_template[] = {
5551 { CKA_VALUE_LEN, &(CK_ULONG){ 16 }, sizeof(CK_ULONG) },
5552 { CKA_ENCRYPT, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5553 { CKA_DECRYPT, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5554 { CKA_EXTRACTABLE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5555 };
5556 CK_ATTRIBUTE key_template_sens[] = {
5557 { CKA_VALUE_LEN, &(CK_ULONG){ 16 }, sizeof(CK_ULONG) },
5558 { CKA_EXTRACTABLE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5559 { CKA_SENSITIVE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5560 };
5561 CK_ATTRIBUTE key_template_inv1[] = {
5562 { CKA_VALUE_LEN, &(CK_ULONG){ 16 }, sizeof(CK_ULONG) },
5563 { CKA_EXTRACTABLE, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
5564 };
5565 CK_ATTRIBUTE key_sz24_template[] = {
5566 { CKA_VALUE_LEN, &(CK_ULONG){ 24 }, sizeof(CK_ULONG) },
5567 { CKA_EXTRACTABLE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5568 };
5569 CK_ATTRIBUTE new_key_template[] = {
5570 { CKA_CLASS, &(CK_OBJECT_CLASS){ CKO_SECRET_KEY },
5571 sizeof(CK_OBJECT_CLASS) },
5572 { CKA_KEY_TYPE, &(CK_KEY_TYPE){ CKK_GENERIC_SECRET },
5573 sizeof(CK_KEY_TYPE) },
5574 { CKA_ENCRYPT, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5575 { CKA_DECRYPT, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5576 { CKA_EXTRACTABLE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5577 { CKA_SENSITIVE, &(CK_BBOOL){ CK_FALSE}, sizeof(CK_BBOOL) },
5578 };
5579 CK_ATTRIBUTE new_key_template_sens[] = {
5580 { CKA_CLASS, &(CK_OBJECT_CLASS){ CKO_SECRET_KEY },
5581 sizeof(CK_OBJECT_CLASS) },
5582 { CKA_KEY_TYPE, &(CK_KEY_TYPE){ CKK_AES }, sizeof(CK_KEY_TYPE) },
5583 { CKA_EXTRACTABLE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5584 { CKA_SENSITIVE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5585 };
5586 CK_ATTRIBUTE new_key_template2[] = {
5587 { CKA_DERIVE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5588 };
5589 CK_ATTRIBUTE new_key_template3[] = {
5590 { CKA_VALUE_LEN, &(CK_ULONG){ 16 }, sizeof(CK_ULONG) },
5591 { CKA_PRIVATE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5592 };
5593 CK_ATTRIBUTE new_key_template4[] = {
5594 { CKA_CLASS, &(CK_OBJECT_CLASS){ CKO_SECRET_KEY },
5595 sizeof(CK_OBJECT_CLASS) },
5596 { CKA_KEY_TYPE, &(CK_KEY_TYPE){ CKK_GENERIC_SECRET },
5597 sizeof(CK_KEY_TYPE) },
5598 { CKA_PRIVATE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5599 };
5600 CK_BBOOL g_extract = CK_FALSE;
5601 CK_BBOOL g_sensitive = CK_TRUE;
5602 CK_BBOOL g_nextract = CK_TRUE;
5603 CK_BBOOL g_asensitive = CK_TRUE;
5604 CK_BBOOL g_local = CK_TRUE;
5605 CK_BBOOL g_token = CK_FALSE;
5606 CK_BBOOL g_derive = CK_FALSE;
5607 CK_OBJECT_CLASS g_class = CKO_VENDOR_DEFINED;
5608 CK_KEY_TYPE g_key_type = CKK_VENDOR_DEFINED;
5609 uint8_t g_val[WRAPPED_TEST_KEY_SIZE] = { 0 };
5610 CK_ULONG key_len = 0;
5611 uint8_t g_unwrapped_val[WRAPPED_TEST_KEY_SIZE] = { 0 };
5612 CK_ULONG unwrapped_key_len = 0;
5613 /* Keep last attribute as CKA_VALUE */
5614 CK_ATTRIBUTE get_template_unwrapped[] = {
5615 { CKA_CLASS, &g_class, sizeof(CK_OBJECT_CLASS) },
5616 { CKA_KEY_TYPE, &g_key_type, sizeof(CK_KEY_TYPE) },
5617 { CKA_EXTRACTABLE, &g_extract, sizeof(CK_BBOOL) },
5618 { CKA_SENSITIVE, &g_sensitive, sizeof(CK_BBOOL) },
5619 { CKA_NEVER_EXTRACTABLE, &g_nextract, sizeof(CK_BBOOL) },
5620 { CKA_ALWAYS_SENSITIVE, &g_asensitive, sizeof(CK_BBOOL) },
5621 { CKA_LOCAL, &g_local, sizeof(CK_BBOOL) },
5622 { CKA_TOKEN, &g_token, sizeof(CK_BBOOL) },
5623 { CKA_DERIVE, &g_derive, sizeof(CK_BBOOL) },
5624 { CKA_VALUE_LEN, &unwrapped_key_len,
5625 sizeof(unwrapped_key_len) },
5626 { CKA_VALUE, g_unwrapped_val, sizeof(g_unwrapped_val) },
5627 };
5628 CK_ATTRIBUTE get_template[] = {
5629 { CKA_VALUE_LEN, &key_len, sizeof(key_len) },
5630 { CKA_VALUE, g_val, sizeof(g_val) },
5631 };
5632 uint8_t buf[WRAPPED_TEST_KEY_SIZE] = { 0 };
5633 CK_ULONG size = 0;
5634
5635 rv = init_lib_and_find_token_slot(&slot);
5636 if (!ADBG_EXPECT_CK_OK(c, rv))
5637 return;
5638
5639 rv = init_test_token(slot);
5640 if (!ADBG_EXPECT_CK_OK(c, rv))
5641 goto close_lib;
5642
5643 rv = init_user_test_token(slot);
5644 if (!ADBG_EXPECT_CK_OK(c, rv))
5645 goto close_lib;
5646
5647 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
5648 if (!ADBG_EXPECT_CK_OK(c, rv))
5649 goto close_lib;
5650
5651 /* Wrapping Key - AES Key */
5652 rv = C_GenerateKey(session, &cktest_aes_keygen_mechanism,
5653 wrapping_key_template,
5654 ARRAY_SIZE(wrapping_key_template), &wrapping_key1);
5655 if (!ADBG_EXPECT_CK_OK(c, rv))
5656 goto close_session;
5657
5658 /* Key to be wrapped - AES key */
5659 rv = C_GenerateKey(session, &cktest_aes_keygen_mechanism,
5660 key_template, ARRAY_SIZE(key_template),
5661 &key);
5662 if (!ADBG_EXPECT_CK_OK(c, rv))
5663 goto close_session;
5664
5665 Do_ADBG_BeginSubCase(c, "Test key wrap with AES ECB");
5666
5667 /*
5668 * Test NULL buffer and NULL out_size to verify bad argument processing
5669 */
5670 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1, key,
5671 NULL, NULL);
5672 if (!ADBG_EXPECT_CK_RESULT(c, CKR_ARGUMENTS_BAD, rv))
5673 goto out;
5674
5675 /*
5676 * Test NULL buffer case with size as 0 to get the out_size
5677 */
5678 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1, key,
5679 NULL, &size);
5680 if (!ADBG_EXPECT_CK_OK(c, rv) ||
5681 !ADBG_EXPECT_COMPARE_UNSIGNED(c, size, <=, sizeof(buf)))
5682 goto out;
5683
5684 /*
5685 * Test NULL buffer case with size non zero size to get the out_size
5686 */
5687 size = 1;
5688 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1, key,
5689 NULL, &size);
5690 if (!ADBG_EXPECT_CK_OK(c, rv) ||
5691 !ADBG_EXPECT_COMPARE_UNSIGNED(c, size, <=, sizeof(buf)))
5692 goto out;
5693
5694 /* Test short buffer */
5695 size = 12;
5696 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1, key,
5697 buf, &size);
5698 if (!ADBG_EXPECT_CK_RESULT(c, CKR_BUFFER_TOO_SMALL, rv) ||
5699 !ADBG_EXPECT_COMPARE_UNSIGNED(c, size, <=, sizeof(buf)))
5700 goto out;
5701
5702 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1, key,
5703 buf, &size);
5704 if (!ADBG_EXPECT_CK_OK(c, rv))
5705 goto out;
5706
5707 /*
5708 * Get the size of the original key which was wrapped in key_len.
5709 * This will be compared to the length of the key after unwrapping.
5710 */
5711 rv = C_GetAttributeValue(session, key, get_template,
5712 ARRAY_SIZE(get_template));
5713 if (!ADBG_EXPECT_CK_OK(c, rv))
5714 goto out;
5715
5716 Do_ADBG_EndSubCase(c, NULL);
5717
5718 Do_ADBG_BeginSubCase(c, "Test key unwrap with AES ECB");
5719
5720 rv = C_UnwrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1, buf,
5721 size, new_key_template, ARRAY_SIZE(new_key_template),
5722 &unwrapped_key);
5723 if (!ADBG_EXPECT_CK_OK(c, rv))
5724 goto out;
5725
5726 /*
5727 * The key created after unwrapping should have CKA_LOCAL = FALSE,
5728 * CKA_ALWAYS_SENSITIVE and CKA_NEVER_EXTRACTABLE as FALSE.
5729 * Default value of CKA_EXTRACTABLE if not specified in the template
5730 * is TRUE. We have deliberately set CKA_SENSITIVE to false for
5731 * both original key and unwrapped_key. This is done to be able to
5732 * extract the value of keys and compare them. This is done mainly
5733 * for testing. In actual examples, we expect CKA_SENSITIVE of keys
5734 * to be wrapped to be TRUE.
5735 */
5736 rv = C_GetAttributeValue(session, unwrapped_key, get_template_unwrapped,
5737 ARRAY_SIZE(get_template_unwrapped));
5738 if (!ADBG_EXPECT_CK_OK(c, rv) ||
5739 !ADBG_EXPECT_BUFFER(c, g_unwrapped_val, unwrapped_key_len, g_val,
5740 key_len) ||
5741 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_SECRET_KEY) ||
5742 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_key_type, ==,
5743 CKK_GENERIC_SECRET) ||
5744 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_FALSE) ||
5745 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sensitive, ==, CK_FALSE) ||
5746 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_extract, ==, CK_TRUE) ||
5747 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_asensitive, ==, CK_FALSE) ||
5748 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_nextract, ==, CK_FALSE))
5749 goto out;
5750
5751 rv = C_DestroyObject(session, unwrapped_key);
5752 if (!ADBG_EXPECT_CK_OK(c, rv))
5753 goto out;
5754
5755 Do_ADBG_EndSubCase(c, NULL);
5756
5757 Do_ADBG_BeginSubCase(c, "Invalid UnWrap cases");
5758
5759 /* Failure when unwrapping as a private session key */
5760 rv = C_UnwrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1, buf,
5761 size, new_key_template4, ARRAY_SIZE(new_key_template4),
5762 &unwrapped_key);
5763 if (!ADBG_EXPECT_CK_RESULT(c, CKR_USER_NOT_LOGGED_IN, rv))
5764 goto out;
5765
5766 /* Provide incomplete template */
5767 rv = C_UnwrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1, buf,
5768 size, new_key_template2, ARRAY_SIZE(new_key_template2),
5769 &unwrapped_key);
5770
5771 /*
5772 * The error code can also be CKR_TEMPLATE_INCOMPLETE. The
5773 * current implementation returns CKR_TEMPLATE_INCONSISTENT
5774 */
5775 if (!ADBG_EXPECT_TRUE(c, rv == CKR_TEMPLATE_INCOMPLETE ||
5776 rv == CKR_TEMPLATE_INCONSISTENT))
5777 goto out;
5778
5779 /* Try unwrapping with a key without CKA_UNWRAP */
5780 rv = C_UnwrapKey(session, &cktest_aes_ecb_mechanism, key, buf, size,
5781 new_key_template, ARRAY_SIZE(new_key_template),
5782 &unwrapped_key);
5783 if (!ADBG_EXPECT_CK_RESULT(c, CKR_UNWRAPPING_KEY_TYPE_INCONSISTENT, rv))
5784 goto out;
5785
5786 Do_ADBG_EndSubCase(c, NULL);
5787
5788 Do_ADBG_BeginSubCase(c, "Invalid Wrap cases");
5789
5790 rv = C_GenerateKey(session, &cktest_aes_keygen_mechanism,
5791 wrapping_key_template_inv1,
5792 ARRAY_SIZE(wrapping_key_template_inv1),
5793 &wrapping_key_inv);
5794 if (!ADBG_EXPECT_CK_OK(c, rv))
5795 goto out;
5796
5797 /* Wrapping key used without CKA_WRAP set */
5798 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key_inv,
5799 key, buf, &size);
5800 if (!ADBG_EXPECT_CK_RESULT(c, CKR_WRAPPING_KEY_TYPE_INCONSISTENT, rv))
5801 goto out;
5802
5803 rv = C_DestroyObject(session, wrapping_key_inv);
5804 ADBG_EXPECT_CK_OK(c, rv);
5805
5806 /* Use invalid wrapping key handle */
5807 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key_inv,
5808 key, buf, &size);
5809 if (!ADBG_EXPECT_CK_RESULT(c, CKR_WRAPPING_KEY_HANDLE_INVALID, rv))
5810 goto out;
5811
5812 /* CKA_EXTRACTABLE attribute of the key to be wrapped is CKA_FALSE */
5813 rv = C_GenerateKey(session, &cktest_aes_keygen_mechanism,
5814 key_template_inv1, ARRAY_SIZE(key_template_inv1),
5815 &key_inv);
5816 if (!ADBG_EXPECT_CK_OK(c, rv))
5817 goto out;
5818
5819 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1,
5820 key_inv, buf, &size);
5821 if (!ADBG_EXPECT_CK_RESULT(c, CKR_KEY_UNEXTRACTABLE, rv))
5822 goto out;
5823
5824 rv = C_DestroyObject(session, key_inv);
5825 ADBG_EXPECT_CK_OK(c, rv);
5826
5827 /* Use invalid key handle */
5828 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1,
5829 key_inv, buf, &size);
5830 if (!ADBG_EXPECT_CK_RESULT(c, CKR_KEY_HANDLE_INVALID, rv))
5831 goto out;
5832
5833 /* Try wrapping the wrapping key */
5834 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1,
5835 wrapping_key1, buf, &size);
5836 if (!ADBG_EXPECT_CK_RESULT(c, CKR_WRAPPING_KEY_HANDLE_INVALID, rv))
5837 goto out;
5838
5839 /* Use invalid mechanism */
5840 rv = C_WrapKey(session, &cktest_hmac_md5_mechanism, wrapping_key1, key,
5841 buf, &size);
5842 if (!ADBG_EXPECT_CK_RESULT(c, CKR_MECHANISM_INVALID, rv))
5843 goto out;
5844
5845 /* Try wrapping when an operation is already active */
5846 rv = C_EncryptInit(session, &cktest_aes_cbc_mechanism, key);
5847 if (!ADBG_EXPECT_CK_OK(c, rv))
5848 goto out;
5849
5850 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1, key,
5851 buf, &size);
5852 if (!ADBG_EXPECT_CK_RESULT(c, CKR_OPERATION_ACTIVE, rv))
5853 goto out;
5854
5855 rv = C_EncryptFinal(session, NULL, NULL);
5856 /* Only check that the operation is no more active */
5857 if (!ADBG_EXPECT_TRUE(c, rv != CKR_BUFFER_TOO_SMALL))
5858 goto out;
5859
5860 /*
5861 * Try wrapping using CKK_GENERIC_SECRET when mechanism used is
5862 * AES_ECB. Generate a secret key object in rw session.
5863 */
5864 rv = C_GenerateKey(session, &cktest_gensecret_keygen_mechanism,
5865 cktest_generate_gensecret_object_valid1,
5866 ARRAY_SIZE(cktest_generate_gensecret_object_valid1),
5867 &key_inv);
5868 if (!ADBG_EXPECT_CK_OK(c, rv))
5869 goto out;
5870
5871 /* Make the Generic secret key wrapping/unwrapping key */
5872 rv = C_SetAttributeValue(session, key_inv, set_w_unw_template,
5873 ARRAY_SIZE(set_w_unw_template));
5874 if (!ADBG_EXPECT_CK_OK(c, rv))
5875 goto out;
5876
5877 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, key_inv, key, buf,
5878 &size);
5879 if (!ADBG_EXPECT_CK_RESULT(c, CKR_WRAPPING_KEY_TYPE_INCONSISTENT, rv))
5880 goto out;
5881
5882 rv = C_DestroyObject(session, key_inv);
5883 ADBG_EXPECT_CK_OK(c, rv);
5884
5885 Do_ADBG_EndSubCase(c, NULL);
5886
5887 Do_ADBG_BeginSubCase(c, "Wrap with different length key");
5888
5889 /* Generate Key of size 192 bits */
5890 rv = C_GenerateKey(session, &cktest_aes_keygen_mechanism,
5891 key_sz24_template, ARRAY_SIZE(key_sz24_template),
5892 &key_sz24);
5893 if (!ADBG_EXPECT_CK_OK(c, rv))
5894 goto out;
5895
5896 size = 0;
5897 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1,
5898 key_sz24, buf, &size);
5899 if (!ADBG_EXPECT_CK_RESULT(c, CKR_BUFFER_TOO_SMALL, rv) ||
5900 !ADBG_EXPECT_COMPARE_UNSIGNED(c, size, ==, 32))
5901 goto out;
5902
5903 size = 24;
5904 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1,
5905 key_sz24, buf, &size);
5906 if (!ADBG_EXPECT_CK_RESULT(c, CKR_BUFFER_TOO_SMALL, rv) ||
5907 !ADBG_EXPECT_COMPARE_UNSIGNED(c, size, ==, 32))
5908 goto out;
5909
5910 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1,
5911 key_sz24, buf, &size);
5912 if (!ADBG_EXPECT_CK_OK(c, rv) ||
5913 !ADBG_EXPECT_COMPARE_UNSIGNED(c, size, ==, 32))
5914 goto out;
5915
5916 Do_ADBG_EndSubCase(c, NULL);
5917
5918 Do_ADBG_BeginSubCase(c, "Test Wrap/Unwrap with indirect template");
5919
5920 /* Wrapping Key with indirect templates - AES Key */
5921 rv = C_GenerateKey(session, &cktest_aes_keygen_mechanism,
5922 wrapping_key_temp_w_indirect,
5923 ARRAY_SIZE(wrapping_key_temp_w_indirect),
5924 &wrapping_key2);
5925 if (!ADBG_EXPECT_CK_OK(c, rv))
5926 goto out;
5927
5928 /*
5929 * Attribute mismatch with CKA_WRAP_TEMPLATE.
5930 * Error expected when wrapping a key whose template doesn't match with
5931 * the CKA_WRAP_TEMPLATE in the wrapping_key. In this example, the
5932 * CKA_WRAP_TEMPLATE expects CKA_SENSITIVE of the key to be wrapped to
5933 * be TRUE which is not the case here.
5934 */
5935 size = sizeof(buf);
5936 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key2, key,
5937 buf, &size);
5938 if (!ADBG_EXPECT_CK_RESULT(c, CKR_KEY_HANDLE_INVALID, rv))
5939 goto out;
5940
5941 /* Generate SENSITIVE Key */
5942 rv = C_GenerateKey(session, &cktest_aes_keygen_mechanism,
5943 key_template_sens, ARRAY_SIZE(key_template_sens),
5944 &key_sens);
5945 if (!ADBG_EXPECT_CK_OK(c, rv))
5946 goto out;
5947
5948 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key2,
5949 key_sens, buf, &size);
5950 if (!ADBG_EXPECT_CK_OK(c, rv))
5951 goto out;
5952
5953 /*
5954 * Unwrap to create key with SENSITIVE set as FALSE.
5955 * This should fail as indirect attribute CKA_UNWRAP_TEMPLATE restricts
5956 * creation of key with CKA_SENSITIVE as FALSE.
5957 */
5958 rv = C_UnwrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key2, buf,
5959 size, new_key_template, ARRAY_SIZE(new_key_template),
5960 &unwrapped_key);
5961 if (!ADBG_EXPECT_CK_RESULT(c, CKR_TEMPLATE_INCONSISTENT, rv))
5962 goto out;
5963
5964 /* Unwrap a wrapped sensitive key to create a SENSITIVE key */
5965 rv = C_UnwrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key2, buf,
5966 size, new_key_template_sens,
5967 ARRAY_SIZE(new_key_template_sens), &unwrapped_key);
5968 if (!ADBG_EXPECT_CK_OK(c, rv))
5969 goto out;
5970
5971 /*
5972 * Get the attributes of created. Skip last attribute in
5973 * get_template_wrapped as that is CKA_VALUE which would give an
5974 * error for a sensitive key
5975 */
5976 rv = C_GetAttributeValue(session, unwrapped_key, get_template_unwrapped,
5977 ARRAY_SIZE(get_template_unwrapped) - 1);
5978 if (!ADBG_EXPECT_CK_OK(c, rv) ||
5979 !ADBG_EXPECT_COMPARE_UNSIGNED(c, unwrapped_key_len, ==, key_len) ||
5980 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_SECRET_KEY) ||
5981 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_key_type, ==, CKK_AES) ||
5982 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_FALSE) ||
5983 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sensitive, ==, CK_TRUE) ||
5984 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_extract, ==, CK_TRUE) ||
5985 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_asensitive, ==, CK_FALSE) ||
5986 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_nextract, ==, CK_FALSE))
5987 goto out;
5988
5989 if (!ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, unwrapped_key)) ||
5990 !ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, wrapping_key2)) ||
5991 !ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, key_sens)))
5992 goto out;
5993
5994 /* Create wrapping key with indirect template specifying class & key */
5995 rv = C_GenerateKey(session, &cktest_aes_keygen_mechanism,
5996 wrapping_key_temp_w_indirect2,
5997 ARRAY_SIZE(wrapping_key_temp_w_indirect2),
5998 &wrapping_key2);
5999 if (!ADBG_EXPECT_CK_OK(c, rv))
6000 goto out;
6001
6002 size = sizeof(buf);
6003 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key2, key,
6004 buf, &size);
6005 if (!ADBG_EXPECT_CK_OK(c, rv))
6006 goto out;
6007
6008 /* Use minimal new key template just specifying attribute of key */
6009 rv = C_UnwrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key2, buf,
6010 size, new_key_template2, ARRAY_SIZE(new_key_template2),
6011 &unwrapped_key);
6012 if (!ADBG_EXPECT_CK_OK(c, rv))
6013 goto out;
6014
6015 rv = C_GetAttributeValue(session, unwrapped_key, get_template_unwrapped,
6016 ARRAY_SIZE(get_template_unwrapped) - 1);
6017
6018 /* Destroy created token object */
6019 if (!ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, unwrapped_key)))
6020 goto out;
6021
6022 if (!ADBG_EXPECT_CK_OK(c, rv) ||
6023 !ADBG_EXPECT_COMPARE_UNSIGNED(c, unwrapped_key_len, ==, key_len) ||
6024 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_SECRET_KEY) ||
6025 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_key_type, ==, CKK_AES) ||
6026 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_FALSE) ||
6027 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_token, ==, CK_TRUE) ||
6028 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_derive, ==, CK_TRUE) ||
6029 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sensitive, ==, CK_FALSE) ||
6030 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_extract, ==, CK_FALSE) ||
6031 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_asensitive, ==, CK_FALSE) ||
6032 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_nextract, ==, CK_FALSE))
6033 goto out;
6034
6035 /*
6036 * Unwrap with NULL template when CKA_UNWRAP_TEMPLATE has all
6037 * attributes to generate a key
6038 */
6039 rv = C_UnwrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key2, buf,
6040 size, NULL, 0, &unwrapped_key);
6041 if (!ADBG_EXPECT_CK_OK(c, rv))
6042 goto out;
6043
6044 rv = C_GetAttributeValue(session, unwrapped_key, get_template_unwrapped,
6045 ARRAY_SIZE(get_template_unwrapped) - 1);
6046
6047 /* Destroy created token object */
6048 if (!ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, unwrapped_key)))
6049 goto out;
6050
6051 if (!ADBG_EXPECT_CK_OK(c, rv) ||
6052 !ADBG_EXPECT_COMPARE_UNSIGNED(c, unwrapped_key_len, ==, key_len) ||
6053 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_SECRET_KEY) ||
6054 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_key_type, ==, CKK_AES) ||
6055 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_FALSE) ||
6056 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_token, ==, CK_TRUE) ||
6057 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_derive, ==, CK_FALSE) ||
6058 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sensitive, ==, CK_FALSE) ||
6059 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_extract, ==, CK_FALSE) ||
6060 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_asensitive, ==, CK_FALSE) ||
6061 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_nextract, ==, CK_FALSE)) {
6062 goto out;
6063 }
6064
6065 /* Unwrap and try create a Private token object */
6066 rv = C_UnwrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key2, buf,
6067 size, new_key_template3, ARRAY_SIZE(new_key_template3),
6068 &unwrapped_key);
6069 if (!ADBG_EXPECT_CK_RESULT(c, CKR_USER_NOT_LOGGED_IN, rv))
6070 goto out;
6071
6072 Do_ADBG_EndSubCase(c, NULL);
6073
6074 Do_ADBG_BeginSubCase(c, "Test usage of CKA_WRAP_WITH_TRUSTED");
6075
6076 /* Set Attribute WRAP_WITH_TRUSTED on the key */
6077 rv = C_SetAttributeValue(session, key, set_wwt_template,
6078 ARRAY_SIZE(set_wwt_template));
6079 if (!ADBG_EXPECT_CK_OK(c, rv))
6080 goto out;
6081
6082 /*
6083 * Try wrapping the key with attribute CKA_WRAP_WITH_TRUSTED with
6084 * normal wrapping key
6085 */
6086 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1, key,
6087 buf, &size);
6088 if (!ADBG_EXPECT_CK_RESULT(c, CKR_KEY_NOT_WRAPPABLE, rv))
6089 goto out;
6090
6091 /* Login as SO in RW session */
6092 rv = C_Login(session, CKU_SO, test_token_so_pin,
6093 sizeof(test_token_so_pin));
6094 if (!ADBG_EXPECT_CK_OK(c, rv))
6095 goto out;
6096
6097 rv = C_SetAttributeValue(session, wrapping_key1, set_trusted_template,
6098 ARRAY_SIZE(set_trusted_template));
6099 if (!ADBG_EXPECT_CK_OK(c, rv) ||
6100 !ADBG_EXPECT_CK_OK(c, C_Logout(session)))
6101 goto out;
6102
6103 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1, key,
6104 buf, &size);
6105 if (!ADBG_EXPECT_CK_OK(c, rv))
6106 goto out;
6107
6108out:
6109 Do_ADBG_EndSubCase(c, NULL);
6110close_session:
6111 ADBG_EXPECT_CK_OK(c, C_CloseSession(session));
6112
6113close_lib:
6114 ADBG_EXPECT_CK_OK(c, close_lib());
6115}
6116ADBG_CASE_DEFINE(pkcs11, 1020, xtest_pkcs11_test_1020,
6117 "PKCS11: AES Key Wrap/UnWrap tests");
Vesa Jääskeläinen7b482a02021-05-02 13:52:07 +03006118
6119#define RSA_SIGN_TEST(_test_name, _mecha, _data) \
6120 { \
6121 .test_name = _test_name, \
6122 .mecha = _mecha, \
6123 .data = _data, \
6124 .data_size = sizeof(_data) - 1, \
6125 }
6126
6127/* List of RSA PKCS signing multi stage digest mechanisms */
6128static struct {
6129 const char *test_name;
6130 CK_MECHANISM_TYPE mecha;
6131 const void *data;
6132 CK_ULONG data_size;
6133} rsa_pkcs_sign_tests[] = {
6134 RSA_SIGN_TEST("CKM_MD5_RSA_PKCS", CKM_MD5_RSA_PKCS,
6135 digest_test_pattern),
6136 RSA_SIGN_TEST("CKM_SHA1_RSA_PKCS", CKM_SHA1_RSA_PKCS,
6137 digest_test_pattern),
6138 RSA_SIGN_TEST("CKM_SHA224_RSA_PKCS", CKM_SHA224_RSA_PKCS,
6139 digest_test_pattern),
6140 RSA_SIGN_TEST("CKM_SHA256_RSA_PKCS", CKM_SHA256_RSA_PKCS,
6141 digest_test_pattern),
6142 RSA_SIGN_TEST("CKM_SHA384_RSA_PKCS", CKM_SHA384_RSA_PKCS,
6143 digest_test_pattern),
6144 RSA_SIGN_TEST("CKM_SHA512_RSA_PKCS", CKM_SHA512_RSA_PKCS,
6145 digest_test_pattern),
6146};
6147
6148static int test_rsa_pkcs_operations(ADBG_Case_t *c,
6149 CK_SESSION_HANDLE session,
6150 const char *rsa_name, uint32_t rsa_bits)
6151{
6152 CK_RV rv = CKR_GENERAL_ERROR;
6153
6154 CK_OBJECT_HANDLE public_key = CK_INVALID_HANDLE;
6155 CK_OBJECT_HANDLE private_key = CK_INVALID_HANDLE;
6156
6157 CK_MECHANISM mechanism = {
6158 CKM_RSA_PKCS_KEY_PAIR_GEN, NULL, 0
6159 };
6160 CK_MECHANISM sign_mechanism = {
6161 CKM_RSA_PKCS, NULL, 0
6162 };
6163 CK_ULONG modulus_bits = 0;
6164 CK_BYTE public_exponent[] = { 1, 0, 1 };
6165 CK_BYTE id[] = { 123 };
6166
6167 CK_ATTRIBUTE public_key_template[] = {
6168 { CKA_ENCRYPT, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
6169 { CKA_VERIFY, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
6170 { CKA_WRAP, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
6171 { CKA_MODULUS_BITS, &modulus_bits, sizeof(CK_ULONG) },
6172 { CKA_PUBLIC_EXPONENT, public_exponent,
6173 sizeof(public_exponent) }
6174 };
6175
6176 CK_ATTRIBUTE private_key_template[] = {
6177 { CKA_TOKEN, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
6178 { CKA_PRIVATE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
6179 { CKA_SUBJECT, subject_common_name,
6180 sizeof(subject_common_name) },
6181 { CKA_ID, id, sizeof(id) },
6182 { CKA_SENSITIVE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
6183 { CKA_DECRYPT, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
6184 { CKA_SIGN, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
6185 { CKA_UNWRAP, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) }
6186 };
6187
6188 CK_OBJECT_CLASS g_class = 0;
6189 CK_KEY_TYPE g_key_type = 0;
6190 CK_BYTE g_id[32] = { 0 };
6191 CK_DATE g_start_date = { 0 };
6192 CK_DATE g_end_date = { 0 };
6193 CK_BBOOL g_derive = CK_FALSE;
6194 CK_BBOOL g_local = CK_FALSE;
6195 CK_MECHANISM_TYPE g_keygen_mecha = 0;
6196 CK_BYTE g_subject[64] = { 0 };
6197 CK_BBOOL g_encrypt = CK_FALSE;
6198 CK_BBOOL g_verify = CK_FALSE;
6199 CK_BBOOL g_verify_recover = CK_FALSE;
6200 CK_BBOOL g_wrap = CK_FALSE;
6201 CK_BBOOL g_trusted = CK_FALSE;
6202 CK_BYTE g_public_key_info[1024] = { 0 };
6203 CK_BBOOL g_sensitive = CK_FALSE;
6204 CK_BBOOL g_decrypt = CK_FALSE;
6205 CK_BBOOL g_sign = CK_FALSE;
6206 CK_BBOOL g_sign_recover = CK_FALSE;
6207 CK_BBOOL g_unwrap = CK_FALSE;
6208 CK_BBOOL g_extract = CK_FALSE;
6209 CK_BBOOL g_asensitive = CK_FALSE;
6210 CK_BBOOL g_nextract = CK_FALSE;
6211 CK_BBOOL g_wrap_with_trusted = CK_FALSE;
6212 CK_BBOOL g_always_authenticate = CK_FALSE;
6213
6214 /* Note: Tests below expects specific order of elements */
6215 CK_ATTRIBUTE get_public_template[] = {
6216 { CKA_CLASS, &g_class, sizeof(CK_OBJECT_CLASS) },
6217 { CKA_KEY_TYPE, &g_key_type, sizeof(CK_KEY_TYPE) },
6218 { CKA_ID, g_id, sizeof(g_id) },
6219 { CKA_START_DATE, &g_start_date, sizeof(CK_DATE) },
6220 { CKA_END_DATE, &g_end_date, sizeof(CK_DATE) },
6221 { CKA_DERIVE, &g_derive, sizeof(CK_BBOOL) },
6222 { CKA_LOCAL, &g_local, sizeof(CK_BBOOL) },
6223 { CKA_KEY_GEN_MECHANISM, &g_keygen_mecha, sizeof(CK_MECHANISM_TYPE) },
6224 { CKA_SUBJECT, g_subject, sizeof(g_subject) },
6225 { CKA_ENCRYPT, &g_encrypt, sizeof(CK_BBOOL) },
6226 { CKA_VERIFY, &g_verify, sizeof(CK_BBOOL) },
6227 { CKA_VERIFY_RECOVER, &g_verify_recover, sizeof(CK_BBOOL) },
6228 { CKA_WRAP, &g_wrap, sizeof(CK_BBOOL) },
6229 { CKA_TRUSTED, &g_trusted, sizeof(CK_BBOOL) },
6230 { CKA_PUBLIC_KEY_INFO, g_public_key_info, sizeof(g_public_key_info) },
6231 };
6232
6233 /* Note: Tests below expects specific order of elements */
6234 CK_ATTRIBUTE get_private_template[] = {
6235 { CKA_CLASS, &g_class, sizeof(CK_OBJECT_CLASS) },
6236 { CKA_KEY_TYPE, &g_key_type, sizeof(CK_KEY_TYPE) },
6237 { CKA_ID, g_id, sizeof(g_id) },
6238 { CKA_START_DATE, &g_start_date, sizeof(CK_DATE) },
6239 { CKA_END_DATE, &g_end_date, sizeof(CK_DATE) },
6240 { CKA_DERIVE, &g_derive, sizeof(CK_BBOOL) },
6241 { CKA_LOCAL, &g_local, sizeof(CK_BBOOL) },
6242 { CKA_KEY_GEN_MECHANISM, &g_keygen_mecha, sizeof(CK_MECHANISM_TYPE) },
6243 { CKA_SUBJECT, g_subject, sizeof(g_subject) },
6244 { CKA_SENSITIVE, &g_sensitive, sizeof(CK_BBOOL) },
6245 { CKA_DECRYPT, &g_decrypt, sizeof(CK_BBOOL) },
6246 { CKA_SIGN, &g_sign, sizeof(CK_BBOOL) },
6247 { CKA_SIGN_RECOVER, &g_sign_recover, sizeof(CK_BBOOL) },
6248 { CKA_UNWRAP, &g_unwrap, sizeof(CK_BBOOL) },
6249 { CKA_EXTRACTABLE, &g_extract, sizeof(CK_BBOOL) },
6250 { CKA_ALWAYS_SENSITIVE, &g_asensitive, sizeof(CK_BBOOL) },
6251 { CKA_NEVER_EXTRACTABLE, &g_nextract, sizeof(CK_BBOOL) },
6252 { CKA_WRAP_WITH_TRUSTED, &g_wrap_with_trusted, sizeof(CK_BBOOL) },
6253 { CKA_ALWAYS_AUTHENTICATE, &g_always_authenticate, sizeof(CK_BBOOL) },
6254 { CKA_PUBLIC_KEY_INFO, g_public_key_info, sizeof(g_public_key_info) },
6255 };
6256
6257 uint8_t signature[512] = { 0 };
6258 CK_ULONG signature_len = 0;
6259
6260 size_t i = 0;
6261
6262 Do_ADBG_BeginSubCase(c, "%s: Generate key pair", rsa_name);
6263
6264 modulus_bits = rsa_bits;
6265
6266 rv = C_GenerateKeyPair(session, &mechanism, public_key_template,
6267 ARRAY_SIZE(public_key_template),
6268 private_key_template,
6269 ARRAY_SIZE(private_key_template),
6270 &public_key, &private_key);
6271 if (!ADBG_EXPECT_CK_OK(c, rv))
6272 goto err;
6273
6274 /* reset get public key template */
6275 memset(g_id, 0, sizeof(g_id));
6276 assert(get_public_template[2].type == CKA_ID);
6277 get_public_template[2].ulValueLen = sizeof(g_id);
6278
6279 memset(g_subject, 0, sizeof(g_subject));
6280 assert(get_public_template[8].type == CKA_SUBJECT);
6281 get_public_template[8].ulValueLen = sizeof(g_subject);
6282
6283 memset(g_public_key_info, 0, sizeof(g_public_key_info));
6284 assert(get_public_template[14].type == CKA_PUBLIC_KEY_INFO);
6285 get_public_template[14].ulValueLen = sizeof(g_public_key_info);
6286
6287 rv = C_GetAttributeValue(session, public_key, get_public_template,
6288 ARRAY_SIZE(get_public_template));
6289 if (!ADBG_EXPECT_CK_OK(c, rv) ||
6290 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_PUBLIC_KEY) ||
6291 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_key_type, ==, CKK_RSA) ||
6292 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_derive, ==, CK_FALSE) ||
6293 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_TRUE) ||
6294 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_keygen_mecha, ==,
6295 CKM_RSA_PKCS_KEY_PAIR_GEN) ||
6296 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_encrypt, ==, CK_FALSE) ||
6297 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_verify, ==, CK_TRUE) ||
6298 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_verify_recover, ==, CK_FALSE) ||
6299 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_wrap, ==, CK_FALSE) ||
6300 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_trusted, ==, CK_FALSE))
6301 goto err_destr_obj;
6302
6303 /* reset get private key template */
6304 memset(g_id, 0, sizeof(g_id));
6305 assert(get_private_template[2].type == CKA_ID);
6306 get_private_template[2].ulValueLen = sizeof(g_id);
6307
6308 memset(g_subject, 0, sizeof(g_subject));
6309 assert(get_private_template[8].type == CKA_SUBJECT);
6310 get_private_template[8].ulValueLen = sizeof(g_subject);
6311
6312 memset(g_public_key_info, 0, sizeof(g_public_key_info));
6313 assert(get_private_template[19].type == CKA_PUBLIC_KEY_INFO);
6314 get_private_template[19].ulValueLen = sizeof(g_public_key_info);
6315
6316 rv = C_GetAttributeValue(session, private_key, get_private_template,
6317 ARRAY_SIZE(get_private_template));
6318 if (!ADBG_EXPECT_CK_OK(c, rv) ||
6319 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_PRIVATE_KEY) ||
6320 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_key_type, ==, CKK_RSA) ||
6321 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_derive, ==, CK_FALSE) ||
6322 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_TRUE) ||
6323 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_keygen_mecha, ==,
6324 CKM_RSA_PKCS_KEY_PAIR_GEN) ||
6325 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sensitive, ==, CK_TRUE) ||
6326 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_decrypt, ==, CK_FALSE) ||
6327 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sign, ==, CK_TRUE) ||
6328 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sign_recover, ==, CK_FALSE) ||
6329 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_unwrap, ==, CK_FALSE) ||
6330 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_extract, ==, CK_FALSE) ||
6331 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_asensitive, ==, CK_TRUE) ||
6332 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_nextract, ==, CK_TRUE) ||
6333 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_wrap_with_trusted, ==, CK_FALSE) ||
6334 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_always_authenticate, ==, CK_FALSE))
6335 goto err_destr_obj;
6336
6337 Do_ADBG_EndSubCase(c, NULL);
6338
6339 Do_ADBG_BeginSubCase(c,
6340 "%s: Sign & verify tests - oneshot - CKM_RSA_PKCS",
6341 rsa_name);
6342
6343 sign_mechanism.mechanism = CKM_RSA_PKCS;
6344 memset(signature, 0, sizeof(signature));
6345 signature_len = sizeof(signature);
6346
6347 rv = C_SignInit(session, &sign_mechanism, private_key);
6348 if (!ADBG_EXPECT_CK_OK(c, rv))
6349 goto err_destr_obj;
6350
6351 rv = C_Sign(session, (void *)digest_test_pattern_sha256,
6352 sizeof(digest_test_pattern_sha256), (void *)signature,
6353 &signature_len);
6354 if (!ADBG_EXPECT_CK_OK(c, rv))
6355 goto err_destr_obj;
6356
6357 rv = C_VerifyInit(session, &sign_mechanism, public_key);
6358 if (!ADBG_EXPECT_CK_OK(c, rv))
6359 goto err_destr_obj;
6360
6361 rv = C_Verify(session, (void *)digest_test_pattern_sha256,
6362 sizeof(digest_test_pattern_sha256), (void *)signature,
6363 signature_len);
6364 if (!ADBG_EXPECT_CK_OK(c, rv))
6365 goto err_destr_obj;
6366
6367 for (i = 0; i < ARRAY_SIZE(rsa_pkcs_sign_tests); i++) {
6368 /*
6369 * Note: this order of end/begin here is just to get ADBG
6370 * SubCases in sync with error handling.
6371 */
6372 Do_ADBG_EndSubCase(c, NULL);
6373
6374 Do_ADBG_BeginSubCase(c, "%s: Sign & verify - oneshot - %s",
6375 rsa_name,
6376 rsa_pkcs_sign_tests[i].test_name);
6377
6378 sign_mechanism.mechanism = rsa_pkcs_sign_tests[i].mecha;
6379 memset(signature, 0, sizeof(signature));
6380 signature_len = sizeof(signature);
6381
6382 rv = C_SignInit(session, &sign_mechanism, private_key);
6383 if (!ADBG_EXPECT_CK_OK(c, rv))
6384 goto err_destr_obj;
6385
6386 rv = C_Sign(session, (void *)rsa_pkcs_sign_tests[i].data,
6387 rsa_pkcs_sign_tests[i].data_size,
6388 (void *)signature, &signature_len);
6389 if (!ADBG_EXPECT_CK_OK(c, rv))
6390 goto err_destr_obj;
6391
6392 rv = C_VerifyInit(session, &sign_mechanism, public_key);
6393 if (!ADBG_EXPECT_CK_OK(c, rv))
6394 goto err_destr_obj;
6395
6396 rv = C_Verify(session, (void *)rsa_pkcs_sign_tests[i].data,
6397 rsa_pkcs_sign_tests[i].data_size,
6398 (void *)signature, signature_len);
6399 if (!ADBG_EXPECT_CK_OK(c, rv))
6400 goto err_destr_obj;
6401 }
6402
6403 rv = C_DestroyObject(session, private_key);
6404 if (!ADBG_EXPECT_CK_OK(c, rv))
6405 goto err_destr_pub_obj;
6406
6407 rv = C_DestroyObject(session, public_key);
6408 if (!ADBG_EXPECT_CK_OK(c, rv))
6409 goto err;
6410
6411 Do_ADBG_EndSubCase(c, NULL);
6412
6413 return 1;
6414
6415err_destr_obj:
6416 ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, private_key));
6417err_destr_pub_obj:
6418 ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, public_key));
6419err:
6420 Do_ADBG_EndSubCase(c, NULL);
6421
6422 return 0;
6423}
6424
6425static void xtest_pkcs11_test_1021(ADBG_Case_t *c)
6426{
6427 CK_RV rv = CKR_GENERAL_ERROR;
6428 CK_SLOT_ID slot = 0;
6429 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
6430 CK_FLAGS session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
6431 int ret = 0;
6432
6433 rv = init_lib_and_find_token_slot(&slot);
6434 if (!ADBG_EXPECT_CK_OK(c, rv))
6435 return;
6436
6437 rv = init_test_token(slot);
6438 if (!ADBG_EXPECT_CK_OK(c, rv))
6439 goto close_lib;
6440
6441 rv = init_user_test_token(slot);
6442 if (!ADBG_EXPECT_CK_OK(c, rv))
6443 goto close_lib;
6444
6445 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
6446 if (!ADBG_EXPECT_CK_OK(c, rv))
6447 goto close_lib;
6448
6449 /* Login to Test Token */
6450 rv = C_Login(session, CKU_USER, test_token_user_pin,
6451 sizeof(test_token_user_pin));
6452 if (!ADBG_EXPECT_CK_OK(c, rv))
6453 goto out;
6454
6455 ret = test_rsa_pkcs_operations(c, session, "RSA-1024", 1024);
6456 if (!ret)
6457 goto out;
6458 ret = test_rsa_pkcs_operations(c, session, "RSA-2048", 2048);
6459 if (!ret)
6460 goto out;
6461 if (level > 0) {
6462 ret = test_rsa_pkcs_operations(c, session, "RSA-3072", 3072);
6463 if (!ret)
6464 goto out;
6465 ret = test_rsa_pkcs_operations(c, session, "RSA-4096", 4096);
6466 if (!ret)
6467 goto out;
6468 }
6469out:
6470 ADBG_EXPECT_CK_OK(c, C_CloseSession(session));
6471close_lib:
6472 ADBG_EXPECT_CK_OK(c, close_lib());
6473}
6474ADBG_CASE_DEFINE(pkcs11, 1021, xtest_pkcs11_test_1021,
6475 "PKCS11: RSA PKCS key generation and signing");
Vesa Jääskeläinen7f8456b2021-05-02 15:33:17 +03006476
6477#define RSA_PSS_HASH_SIGN_TEST(_test_name, _min_rsa_bits, _mecha, _hash_algo, _mgf_algo, \
6478 _salt_len, _data) \
6479 { \
6480 .test_name = _test_name, \
6481 .min_rsa_bits = _min_rsa_bits, \
6482 .mecha = _mecha, \
6483 .hash_algo = _hash_algo, \
6484 .mgf_algo = _mgf_algo, \
6485 .salt_len = _salt_len, \
6486 .data = _data, \
6487 .data_size = sizeof(_data), \
6488 }
6489
6490#define RSA_PSS_CSTR_SIGN_TEST(_test_name, _min_rsa_bits, _mecha, _hash_algo, \
6491 _mgf_algo, _salt_len, _data) \
6492 { \
6493 .test_name = _test_name, \
6494 .min_rsa_bits = _min_rsa_bits, \
6495 .mecha = _mecha, \
6496 .hash_algo = _hash_algo, \
6497 .mgf_algo = _mgf_algo, \
6498 .salt_len = _salt_len, \
6499 .data = _data, \
6500 .data_size = sizeof(_data) - 1, \
6501 }
6502
6503/* List of RSA PSS signing multi stage digest mechanisms */
6504static struct {
6505 const char *test_name;
6506 uint32_t min_rsa_bits;
6507 CK_MECHANISM_TYPE mecha;
6508 CK_MECHANISM_TYPE hash_algo;
6509 CK_RSA_PKCS_MGF_TYPE mgf_algo;
6510 CK_ULONG salt_len;
6511 const void *data;
6512 CK_ULONG data_size;
6513} rsa_pss_sign_tests[] = {
6514 RSA_PSS_HASH_SIGN_TEST("RSA-PSS/SHA1", 1024, CKM_RSA_PKCS_PSS,
6515 CKM_SHA_1, CKG_MGF1_SHA1, 20,
6516 digest_test_pattern_sha1),
6517 RSA_PSS_CSTR_SIGN_TEST("RSA-PSS/SHA1/mech", 1024,
6518 CKM_SHA1_RSA_PKCS_PSS, CKM_SHA_1, CKG_MGF1_SHA1,
6519 20, digest_test_pattern),
6520 RSA_PSS_HASH_SIGN_TEST("RSA-PSS/SHA224", 1024, CKM_RSA_PKCS_PSS,
6521 CKM_SHA224, CKG_MGF1_SHA224, 28,
6522 digest_test_pattern_sha224),
6523 RSA_PSS_CSTR_SIGN_TEST("RSA-PSS/SHA224/mech", 1024,
6524 CKM_SHA224_RSA_PKCS_PSS, CKM_SHA224,
6525 CKG_MGF1_SHA224, 28, digest_test_pattern),
6526 RSA_PSS_HASH_SIGN_TEST("RSA-PSS/SHA256", 1024, CKM_RSA_PKCS_PSS,
6527 CKM_SHA256, CKG_MGF1_SHA256, 32,
6528 digest_test_pattern_sha256),
6529 RSA_PSS_CSTR_SIGN_TEST("RSA-PSS/SHA256/mech", 1024,
6530 CKM_SHA256_RSA_PKCS_PSS, CKM_SHA256,
6531 CKG_MGF1_SHA256, 32, digest_test_pattern),
6532 RSA_PSS_HASH_SIGN_TEST("RSA-PSS/SHA384", 1024, CKM_RSA_PKCS_PSS,
6533 CKM_SHA384, CKG_MGF1_SHA384, 48,
6534 digest_test_pattern_sha384),
6535 RSA_PSS_CSTR_SIGN_TEST("RSA-PSS/SHA384/mech", 1024,
6536 CKM_SHA384_RSA_PKCS_PSS, CKM_SHA384,
6537 CKG_MGF1_SHA384, 48, digest_test_pattern),
6538 RSA_PSS_HASH_SIGN_TEST("RSA-PSS/SHA512", 2048, CKM_RSA_PKCS_PSS,
6539 CKM_SHA512, CKG_MGF1_SHA512, 64,
6540 digest_test_pattern_sha512),
6541 RSA_PSS_CSTR_SIGN_TEST("RSA-PSS/SHA512/mech", 2048,
6542 CKM_SHA512_RSA_PKCS_PSS, CKM_SHA512,
6543 CKG_MGF1_SHA512, 64, digest_test_pattern),
6544};
6545
6546static int test_rsa_pss_operations(ADBG_Case_t *c,
6547 CK_SESSION_HANDLE session,
6548 const char *rsa_name, uint32_t rsa_bits)
6549{
6550 CK_RV rv = CKR_GENERAL_ERROR;
6551
6552 CK_OBJECT_HANDLE public_key = CK_INVALID_HANDLE;
6553 CK_OBJECT_HANDLE private_key = CK_INVALID_HANDLE;
6554
6555 CK_MECHANISM mechanism = {
6556 CKM_RSA_PKCS_KEY_PAIR_GEN, NULL, 0
6557 };
6558 CK_MECHANISM sign_mechanism = {
6559 CKM_RSA_PKCS_PSS, NULL, 0
6560 };
6561 CK_RSA_PKCS_PSS_PARAMS pss_params = {
6562 CKM_SHA256, CKG_MGF1_SHA256, 32,
6563 };
6564 CK_ULONG modulus_bits = 0;
6565 CK_BYTE public_exponent[] = { 1, 0, 1 };
6566 CK_BYTE id[] = { 123 };
6567
6568 CK_ATTRIBUTE public_key_template[] = {
6569 { CKA_ENCRYPT, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
6570 { CKA_VERIFY, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
6571 { CKA_WRAP, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
6572 { CKA_MODULUS_BITS, &modulus_bits, sizeof(CK_ULONG) },
6573 { CKA_PUBLIC_EXPONENT, public_exponent,
6574 sizeof(public_exponent) }
6575 };
6576
6577 CK_ATTRIBUTE private_key_template[] = {
6578 { CKA_TOKEN, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
6579 { CKA_PRIVATE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
6580 { CKA_SUBJECT, subject_common_name,
6581 sizeof(subject_common_name) },
6582 { CKA_ID, id, sizeof(id) },
6583 { CKA_SENSITIVE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
6584 { CKA_DECRYPT, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
6585 { CKA_SIGN, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
6586 { CKA_UNWRAP, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) }
6587 };
6588
6589 CK_OBJECT_CLASS g_class = 0;
6590 CK_KEY_TYPE g_key_type = 0;
6591 CK_BYTE g_id[32] = { 0 };
6592 CK_DATE g_start_date = { 0 };
6593 CK_DATE g_end_date = { 0 };
6594 CK_BBOOL g_derive = CK_FALSE;
6595 CK_BBOOL g_local = CK_FALSE;
6596 CK_MECHANISM_TYPE g_keygen_mecha = 0;
6597 CK_BYTE g_subject[64] = { 0 };
6598 CK_BBOOL g_encrypt = CK_FALSE;
6599 CK_BBOOL g_verify = CK_FALSE;
6600 CK_BBOOL g_verify_recover = CK_FALSE;
6601 CK_BBOOL g_wrap = CK_FALSE;
6602 CK_BBOOL g_trusted = CK_FALSE;
6603 CK_BYTE g_public_key_info[1024] = { 0 };
6604 CK_BBOOL g_sensitive = CK_FALSE;
6605 CK_BBOOL g_decrypt = CK_FALSE;
6606 CK_BBOOL g_sign = CK_FALSE;
6607 CK_BBOOL g_sign_recover = CK_FALSE;
6608 CK_BBOOL g_unwrap = CK_FALSE;
6609 CK_BBOOL g_extract = CK_FALSE;
6610 CK_BBOOL g_asensitive = CK_FALSE;
6611 CK_BBOOL g_nextract = CK_FALSE;
6612 CK_BBOOL g_wrap_with_trusted = CK_FALSE;
6613 CK_BBOOL g_always_authenticate = CK_FALSE;
6614
6615 /* Note: Tests below expects specific order of elements */
6616 CK_ATTRIBUTE get_public_template[] = {
6617 { CKA_CLASS, &g_class, sizeof(CK_OBJECT_CLASS) },
6618 { CKA_KEY_TYPE, &g_key_type, sizeof(CK_KEY_TYPE) },
6619 { CKA_ID, g_id, sizeof(g_id) },
6620 { CKA_START_DATE, &g_start_date, sizeof(CK_DATE) },
6621 { CKA_END_DATE, &g_end_date, sizeof(CK_DATE) },
6622 { CKA_DERIVE, &g_derive, sizeof(CK_BBOOL) },
6623 { CKA_LOCAL, &g_local, sizeof(CK_BBOOL) },
6624 { CKA_KEY_GEN_MECHANISM, &g_keygen_mecha, sizeof(CK_MECHANISM_TYPE) },
6625 { CKA_SUBJECT, g_subject, sizeof(g_subject) },
6626 { CKA_ENCRYPT, &g_encrypt, sizeof(CK_BBOOL) },
6627 { CKA_VERIFY, &g_verify, sizeof(CK_BBOOL) },
6628 { CKA_VERIFY_RECOVER, &g_verify_recover, sizeof(CK_BBOOL) },
6629 { CKA_WRAP, &g_wrap, sizeof(CK_BBOOL) },
6630 { CKA_TRUSTED, &g_trusted, sizeof(CK_BBOOL) },
6631 { CKA_PUBLIC_KEY_INFO, g_public_key_info, sizeof(g_public_key_info) },
6632 };
6633
6634 /* Note: Tests below expects specific order of elements */
6635 CK_ATTRIBUTE get_private_template[] = {
6636 { CKA_CLASS, &g_class, sizeof(CK_OBJECT_CLASS) },
6637 { CKA_KEY_TYPE, &g_key_type, sizeof(CK_KEY_TYPE) },
6638 { CKA_ID, g_id, sizeof(g_id) },
6639 { CKA_START_DATE, &g_start_date, sizeof(CK_DATE) },
6640 { CKA_END_DATE, &g_end_date, sizeof(CK_DATE) },
6641 { CKA_DERIVE, &g_derive, sizeof(CK_BBOOL) },
6642 { CKA_LOCAL, &g_local, sizeof(CK_BBOOL) },
6643 { CKA_KEY_GEN_MECHANISM, &g_keygen_mecha, sizeof(CK_MECHANISM_TYPE) },
6644 { CKA_SUBJECT, g_subject, sizeof(g_subject) },
6645 { CKA_SENSITIVE, &g_sensitive, sizeof(CK_BBOOL) },
6646 { CKA_DECRYPT, &g_decrypt, sizeof(CK_BBOOL) },
6647 { CKA_SIGN, &g_sign, sizeof(CK_BBOOL) },
6648 { CKA_SIGN_RECOVER, &g_sign_recover, sizeof(CK_BBOOL) },
6649 { CKA_UNWRAP, &g_unwrap, sizeof(CK_BBOOL) },
6650 { CKA_EXTRACTABLE, &g_extract, sizeof(CK_BBOOL) },
6651 { CKA_ALWAYS_SENSITIVE, &g_asensitive, sizeof(CK_BBOOL) },
6652 { CKA_NEVER_EXTRACTABLE, &g_nextract, sizeof(CK_BBOOL) },
6653 { CKA_WRAP_WITH_TRUSTED, &g_wrap_with_trusted, sizeof(CK_BBOOL) },
6654 { CKA_ALWAYS_AUTHENTICATE, &g_always_authenticate, sizeof(CK_BBOOL) },
6655 { CKA_PUBLIC_KEY_INFO, g_public_key_info, sizeof(g_public_key_info) },
6656 };
6657
6658 uint8_t signature[512] = { 0 };
6659 CK_ULONG signature_len = 0;
6660
6661 size_t i = 0;
6662
6663 Do_ADBG_BeginSubCase(c, "%s: Generate key pair", rsa_name);
6664
6665 modulus_bits = rsa_bits;
6666
6667 rv = C_GenerateKeyPair(session, &mechanism, public_key_template,
6668 ARRAY_SIZE(public_key_template),
6669 private_key_template,
6670 ARRAY_SIZE(private_key_template),
6671 &public_key, &private_key);
6672 if (!ADBG_EXPECT_CK_OK(c, rv))
6673 goto err;
6674
6675 /* reset get public key template */
6676 memset(g_id, 0, sizeof(g_id));
6677 assert(get_public_template[2].type == CKA_ID);
6678 get_public_template[2].ulValueLen = sizeof(g_id);
6679
6680 memset(g_subject, 0, sizeof(g_subject));
6681 assert(get_public_template[8].type == CKA_SUBJECT);
6682 get_public_template[8].ulValueLen = sizeof(g_subject);
6683
6684 memset(g_public_key_info, 0, sizeof(g_public_key_info));
6685 assert(get_public_template[14].type == CKA_PUBLIC_KEY_INFO);
6686 get_public_template[14].ulValueLen = sizeof(g_public_key_info);
6687
6688 rv = C_GetAttributeValue(session, public_key, get_public_template,
6689 ARRAY_SIZE(get_public_template));
6690 if (!ADBG_EXPECT_CK_OK(c, rv) ||
6691 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_PUBLIC_KEY) ||
6692 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_key_type, ==, CKK_RSA) ||
6693 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_derive, ==, CK_FALSE) ||
6694 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_TRUE) ||
6695 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_keygen_mecha, ==,
6696 CKM_RSA_PKCS_KEY_PAIR_GEN) ||
6697 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_encrypt, ==, CK_FALSE) ||
6698 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_verify, ==, CK_TRUE) ||
6699 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_verify_recover, ==, CK_FALSE) ||
6700 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_wrap, ==, CK_FALSE) ||
6701 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_trusted, ==, CK_FALSE))
6702 goto err_destr_obj;
6703
6704 /* reset get private key template */
6705 memset(g_id, 0, sizeof(g_id));
6706 assert(get_private_template[2].type == CKA_ID);
6707 get_private_template[2].ulValueLen = sizeof(g_id);
6708
6709 memset(g_subject, 0, sizeof(g_subject));
6710 assert(get_private_template[8].type == CKA_SUBJECT);
6711 get_private_template[8].ulValueLen = sizeof(g_subject);
6712
6713 memset(g_public_key_info, 0, sizeof(g_public_key_info));
6714 assert(get_private_template[19].type == CKA_PUBLIC_KEY_INFO);
6715 get_private_template[19].ulValueLen = sizeof(g_public_key_info);
6716
6717 rv = C_GetAttributeValue(session, private_key, get_private_template,
6718 ARRAY_SIZE(get_private_template));
6719 if (!ADBG_EXPECT_CK_OK(c, rv) ||
6720 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_PRIVATE_KEY) ||
6721 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_key_type, ==, CKK_RSA) ||
6722 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_derive, ==, CK_FALSE) ||
6723 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_TRUE) ||
6724 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_keygen_mecha, ==,
6725 CKM_RSA_PKCS_KEY_PAIR_GEN) ||
6726 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sensitive, ==, CK_TRUE) ||
6727 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_decrypt, ==, CK_FALSE) ||
6728 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sign, ==, CK_TRUE) ||
6729 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sign_recover, ==, CK_FALSE) ||
6730 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_unwrap, ==, CK_FALSE) ||
6731 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_extract, ==, CK_FALSE) ||
6732 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_asensitive, ==, CK_TRUE) ||
6733 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_nextract, ==, CK_TRUE) ||
6734 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_wrap_with_trusted, ==, CK_FALSE) ||
6735 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_always_authenticate, ==, CK_FALSE))
6736 goto err_destr_obj;
6737
6738 for (i = 0; i < ARRAY_SIZE(rsa_pss_sign_tests); i++) {
6739 /*
6740 * Note: this order of end/begin here is just to get ADBG
6741 * SubCases in sync with error handling.
6742 */
6743 Do_ADBG_EndSubCase(c, NULL);
6744
6745 Do_ADBG_BeginSubCase(c, "%s: Sign & verify - oneshot - %s",
6746 rsa_name,
6747 rsa_pss_sign_tests[i].test_name);
6748
6749 sign_mechanism.mechanism = rsa_pss_sign_tests[i].mecha;
6750 sign_mechanism.pParameter = &pss_params;
6751 sign_mechanism.ulParameterLen = sizeof(pss_params);
6752 pss_params.hashAlg = rsa_pss_sign_tests[i].hash_algo;
6753 pss_params.mgf = rsa_pss_sign_tests[i].mgf_algo;
6754 pss_params.sLen = rsa_pss_sign_tests[i].salt_len;
6755
6756 memset(signature, 0, sizeof(signature));
6757 signature_len = sizeof(signature);
6758
6759 rv = C_SignInit(session, &sign_mechanism, private_key);
6760 if (rsa_bits >= rsa_pss_sign_tests[i].min_rsa_bits) {
6761 if (!ADBG_EXPECT_CK_OK(c, rv))
6762 goto err_destr_obj;
6763 } else {
6764 if (!ADBG_EXPECT_CK_RESULT(c, CKR_KEY_SIZE_RANGE, rv))
6765 goto err_destr_obj;
6766 continue;
6767 }
6768
6769 rv = C_Sign(session, (void *)rsa_pss_sign_tests[i].data,
6770 rsa_pss_sign_tests[i].data_size,
6771 (void *)signature, &signature_len);
6772 if (!ADBG_EXPECT_CK_OK(c, rv))
6773 goto err_destr_obj;
6774
6775 rv = C_VerifyInit(session, &sign_mechanism, public_key);
6776 if (!ADBG_EXPECT_CK_OK(c, rv))
6777 goto err_destr_obj;
6778
6779 rv = C_Verify(session, (void *)rsa_pss_sign_tests[i].data,
6780 rsa_pss_sign_tests[i].data_size,
6781 (void *)signature, signature_len);
6782 if (!ADBG_EXPECT_CK_OK(c, rv))
6783 goto err_destr_obj;
6784 }
6785
6786 rv = C_DestroyObject(session, private_key);
6787 if (!ADBG_EXPECT_CK_OK(c, rv))
6788 goto err_destr_pub_obj;
6789
6790 rv = C_DestroyObject(session, public_key);
6791 if (!ADBG_EXPECT_CK_OK(c, rv))
6792 goto err;
6793
6794 Do_ADBG_EndSubCase(c, NULL);
6795
6796 return 1;
6797
6798err_destr_obj:
6799 ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, private_key));
6800err_destr_pub_obj:
6801 ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, public_key));
6802err:
6803 Do_ADBG_EndSubCase(c, NULL);
6804
6805 return 0;
6806}
6807
6808static void xtest_pkcs11_test_1022(ADBG_Case_t *c)
6809{
6810 CK_RV rv = CKR_GENERAL_ERROR;
6811 CK_SLOT_ID slot = 0;
6812 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
6813 CK_FLAGS session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
6814 int ret = 0;
6815
6816 rv = init_lib_and_find_token_slot(&slot);
6817 if (!ADBG_EXPECT_CK_OK(c, rv))
6818 return;
6819
6820 rv = init_test_token(slot);
6821 if (!ADBG_EXPECT_CK_OK(c, rv))
6822 goto close_lib;
6823
6824 rv = init_user_test_token(slot);
6825 if (!ADBG_EXPECT_CK_OK(c, rv))
6826 goto close_lib;
6827
6828 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
6829 if (!ADBG_EXPECT_CK_OK(c, rv))
6830 goto close_lib;
6831
6832 /* Login to Test Token */
6833 rv = C_Login(session, CKU_USER, test_token_user_pin,
6834 sizeof(test_token_user_pin));
6835 if (!ADBG_EXPECT_CK_OK(c, rv))
6836 goto out;
6837
6838 ret = test_rsa_pss_operations(c, session, "RSA-1024", 1024);
6839 if (!ret)
6840 goto out;
6841 ret = test_rsa_pss_operations(c, session, "RSA-2048", 2048);
6842 if (!ret)
6843 goto out;
6844 if (level > 0) {
6845 ret = test_rsa_pss_operations(c, session, "RSA-3072", 3072);
6846 if (!ret)
6847 goto out;
6848 ret = test_rsa_pss_operations(c, session, "RSA-4096", 4096);
6849 if (!ret)
6850 goto out;
6851 }
6852out:
6853 ADBG_EXPECT_CK_OK(c, C_CloseSession(session));
6854close_lib:
6855 ADBG_EXPECT_CK_OK(c, close_lib());
6856}
6857ADBG_CASE_DEFINE(pkcs11, 1022, xtest_pkcs11_test_1022,
6858 "PKCS11: RSA PSS key generation and signing");
Vesa Jääskeläinena2a82392021-07-02 19:00:12 +03006859
6860static const char rsa_oaep_message[] = "Hello World";
6861static char rsa_oaep_label[] = "TestLabel";
6862
6863#define RSA_OAEP_CRYPT_TEST(_test_name, _min_rsa_bits, _hash_algo, _mgf_algo, \
6864 _source_data, _source_data_len) \
6865 { \
6866 .test_name = _test_name, \
6867 .min_rsa_bits = _min_rsa_bits, \
6868 .hash_algo = _hash_algo, \
6869 .mgf_algo = _mgf_algo, \
6870 .source_data = _source_data, \
6871 .source_data_len = _source_data_len, \
6872 }
6873
6874/* List of RSA OAEP crypto params to test out */
6875static struct {
6876 const char *test_name;
6877 uint32_t min_rsa_bits;
6878 CK_MECHANISM_TYPE hash_algo;
6879 CK_RSA_PKCS_MGF_TYPE mgf_algo;
6880 void *source_data;
6881 size_t source_data_len;
6882} rsa_oaep_crypt_tests[] = {
6883 RSA_OAEP_CRYPT_TEST("RSA-OAEP/SHA1", 1024, CKM_SHA_1, CKG_MGF1_SHA1,
6884 NULL, 0),
6885 RSA_OAEP_CRYPT_TEST("RSA-OAEP/SHA1/label", 1024, CKM_SHA_1,
6886 CKG_MGF1_SHA1, rsa_oaep_label,
6887 sizeof(rsa_oaep_label)),
6888 RSA_OAEP_CRYPT_TEST("RSA-OAEP/SHA224", 1024, CKM_SHA224,
6889 CKG_MGF1_SHA224, NULL, 0),
6890 RSA_OAEP_CRYPT_TEST("RSA-OAEP/SHA224/label", 1024, CKM_SHA224,
6891 CKG_MGF1_SHA224, rsa_oaep_label,
6892 sizeof(rsa_oaep_label)),
6893 RSA_OAEP_CRYPT_TEST("RSA-OAEP/SHA256", 1024, CKM_SHA256,
6894 CKG_MGF1_SHA256, NULL, 0),
6895 RSA_OAEP_CRYPT_TEST("RSA-OAEP/SHA256/label", 1024, CKM_SHA256,
6896 CKG_MGF1_SHA256, rsa_oaep_label,
6897 sizeof(rsa_oaep_label)),
6898 RSA_OAEP_CRYPT_TEST("RSA-OAEP/SHA384", 1024, CKM_SHA384,
6899 CKG_MGF1_SHA384, NULL, 0),
6900 RSA_OAEP_CRYPT_TEST("RSA-OAEP/SHA384/label", 1024, CKM_SHA384,
6901 CKG_MGF1_SHA384, rsa_oaep_label,
6902 sizeof(rsa_oaep_label)),
6903 RSA_OAEP_CRYPT_TEST("RSA-OAEP/SHA512", 2048, CKM_SHA512,
6904 CKG_MGF1_SHA512, NULL, 0),
6905 RSA_OAEP_CRYPT_TEST("RSA-OAEP/SHA512/label", 2048, CKM_SHA512,
6906 CKG_MGF1_SHA512, rsa_oaep_label,
6907 sizeof(rsa_oaep_label)),
6908};
6909
6910static int test_rsa_oaep_operations(ADBG_Case_t *c,
6911 CK_SESSION_HANDLE session,
6912 const char *rsa_name, uint32_t rsa_bits)
6913{
6914 CK_RV rv = CKR_GENERAL_ERROR;
6915 CK_OBJECT_HANDLE public_key = CK_INVALID_HANDLE;
6916 CK_OBJECT_HANDLE private_key = CK_INVALID_HANDLE;
6917
6918 CK_MECHANISM mechanism = {
6919 CKM_RSA_PKCS_KEY_PAIR_GEN, NULL, 0
6920 };
6921 CK_MECHANISM crypt_mechanism = {
6922 CKM_RSA_PKCS_OAEP, NULL, 0
6923 };
6924 CK_RSA_PKCS_OAEP_PARAMS oaep_params = {
6925 CKM_SHA256, CKG_MGF1_SHA256, CKZ_DATA_SPECIFIED, NULL, 0
6926 };
6927 CK_BYTE public_exponent[] = { 1, 0, 1 };
6928 CK_BYTE id[] = { 123 };
6929 CK_ULONG modulus_bits = 0;
6930 CK_ATTRIBUTE public_key_template[] = {
6931 { CKA_ENCRYPT, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
6932 { CKA_VERIFY, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
6933 { CKA_WRAP, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
6934 { CKA_MODULUS_BITS, &modulus_bits, sizeof(CK_ULONG) },
6935 { CKA_PUBLIC_EXPONENT, public_exponent,
6936 sizeof(public_exponent) }
6937 };
6938 CK_ATTRIBUTE private_key_template[] = {
6939 { CKA_TOKEN, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
6940 { CKA_PRIVATE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
6941 { CKA_SUBJECT, subject_common_name,
6942 sizeof(subject_common_name) },
6943 { CKA_ID, id, sizeof(id) },
6944 { CKA_SENSITIVE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
6945 { CKA_DECRYPT, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
6946 { CKA_SIGN, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
6947 { CKA_UNWRAP, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) }
6948 };
6949
6950 CK_OBJECT_CLASS g_class = 0;
6951 CK_KEY_TYPE g_key_type = 0;
6952 CK_BYTE g_id[32] = { 0 };
6953 CK_DATE g_start_date = { 0 };
6954 CK_DATE g_end_date = { 0 };
6955 CK_BBOOL g_derive = CK_FALSE;
6956 CK_BBOOL g_local = CK_FALSE;
6957 CK_MECHANISM_TYPE g_keygen_mecha = 0;
6958 CK_BYTE g_subject[64] = { 0 };
6959 CK_BBOOL g_encrypt = CK_FALSE;
6960 CK_BBOOL g_verify = CK_FALSE;
6961 CK_BBOOL g_verify_recover = CK_FALSE;
6962 CK_BBOOL g_wrap = CK_FALSE;
6963 CK_BBOOL g_trusted = CK_FALSE;
6964 CK_BYTE g_public_key_info[1024] = { 0 };
6965 CK_BBOOL g_sensitive = CK_FALSE;
6966 CK_BBOOL g_decrypt = CK_FALSE;
6967 CK_BBOOL g_sign = CK_FALSE;
6968 CK_BBOOL g_sign_recover = CK_FALSE;
6969 CK_BBOOL g_unwrap = CK_FALSE;
6970 CK_BBOOL g_extract = CK_FALSE;
6971 CK_BBOOL g_asensitive = CK_FALSE;
6972 CK_BBOOL g_nextract = CK_FALSE;
6973 CK_BBOOL g_wrap_with_trusted = CK_FALSE;
6974 CK_BBOOL g_always_authenticate = CK_FALSE;
6975
6976 /* Note: Tests below expects specific order of elements */
6977 CK_ATTRIBUTE get_public_template[] = {
6978 { CKA_CLASS, &g_class, sizeof(CK_OBJECT_CLASS) },
6979 { CKA_KEY_TYPE, &g_key_type, sizeof(CK_KEY_TYPE) },
6980 { CKA_ID, g_id, sizeof(g_id) },
6981 { CKA_START_DATE, &g_start_date, sizeof(CK_DATE) },
6982 { CKA_END_DATE, &g_end_date, sizeof(CK_DATE) },
6983 { CKA_DERIVE, &g_derive, sizeof(CK_BBOOL) },
6984 { CKA_LOCAL, &g_local, sizeof(CK_BBOOL) },
6985 { CKA_KEY_GEN_MECHANISM, &g_keygen_mecha, sizeof(CK_MECHANISM_TYPE) },
6986 { CKA_SUBJECT, g_subject, sizeof(g_subject) },
6987 { CKA_ENCRYPT, &g_encrypt, sizeof(CK_BBOOL) },
6988 { CKA_VERIFY, &g_verify, sizeof(CK_BBOOL) },
6989 { CKA_VERIFY_RECOVER, &g_verify_recover, sizeof(CK_BBOOL) },
6990 { CKA_WRAP, &g_wrap, sizeof(CK_BBOOL) },
6991 { CKA_TRUSTED, &g_trusted, sizeof(CK_BBOOL) },
6992 { CKA_PUBLIC_KEY_INFO, g_public_key_info, sizeof(g_public_key_info) },
6993 };
6994
6995 /* Note: Tests below expects specific order of elements */
6996 CK_ATTRIBUTE get_private_template[] = {
6997 { CKA_CLASS, &g_class, sizeof(CK_OBJECT_CLASS) },
6998 { CKA_KEY_TYPE, &g_key_type, sizeof(CK_KEY_TYPE) },
6999 { CKA_ID, g_id, sizeof(g_id) },
7000 { CKA_START_DATE, &g_start_date, sizeof(CK_DATE) },
7001 { CKA_END_DATE, &g_end_date, sizeof(CK_DATE) },
7002 { CKA_DERIVE, &g_derive, sizeof(CK_BBOOL) },
7003 { CKA_LOCAL, &g_local, sizeof(CK_BBOOL) },
7004 { CKA_KEY_GEN_MECHANISM, &g_keygen_mecha, sizeof(CK_MECHANISM_TYPE) },
7005 { CKA_SUBJECT, g_subject, sizeof(g_subject) },
7006 { CKA_SENSITIVE, &g_sensitive, sizeof(CK_BBOOL) },
7007 { CKA_DECRYPT, &g_decrypt, sizeof(CK_BBOOL) },
7008 { CKA_SIGN, &g_sign, sizeof(CK_BBOOL) },
7009 { CKA_SIGN_RECOVER, &g_sign_recover, sizeof(CK_BBOOL) },
7010 { CKA_UNWRAP, &g_unwrap, sizeof(CK_BBOOL) },
7011 { CKA_EXTRACTABLE, &g_extract, sizeof(CK_BBOOL) },
7012 { CKA_ALWAYS_SENSITIVE, &g_asensitive, sizeof(CK_BBOOL) },
7013 { CKA_NEVER_EXTRACTABLE, &g_nextract, sizeof(CK_BBOOL) },
7014 { CKA_WRAP_WITH_TRUSTED, &g_wrap_with_trusted, sizeof(CK_BBOOL) },
7015 { CKA_ALWAYS_AUTHENTICATE, &g_always_authenticate, sizeof(CK_BBOOL) },
7016 { CKA_PUBLIC_KEY_INFO, g_public_key_info, sizeof(g_public_key_info) },
7017 };
7018 uint8_t ciphertext[512] = { 0 };
7019 CK_ULONG ciphertext_len = 0;
7020 uint8_t plaintext[512] = { 0 };
7021 CK_ULONG plaintext_len = 0;
7022 size_t i = 0;
7023
7024 Do_ADBG_BeginSubCase(c, "%s: Generate key pair", rsa_name);
7025
7026 modulus_bits = rsa_bits;
7027
7028 rv = C_GenerateKeyPair(session, &mechanism, public_key_template,
7029 ARRAY_SIZE(public_key_template),
7030 private_key_template,
7031 ARRAY_SIZE(private_key_template),
7032 &public_key, &private_key);
7033 if (!ADBG_EXPECT_CK_OK(c, rv))
7034 goto err;
7035
7036 /* reset get public key template */
7037 memset(g_id, 0, sizeof(g_id));
7038 assert(get_public_template[2].type == CKA_ID);
7039 get_public_template[2].ulValueLen = sizeof(g_id);
7040
7041 memset(g_subject, 0, sizeof(g_subject));
7042 assert(get_public_template[8].type == CKA_SUBJECT);
7043 get_public_template[8].ulValueLen = sizeof(g_subject);
7044
7045 memset(g_public_key_info, 0, sizeof(g_public_key_info));
7046 assert(get_public_template[14].type == CKA_PUBLIC_KEY_INFO);
7047 get_public_template[14].ulValueLen = sizeof(g_public_key_info);
7048
7049 rv = C_GetAttributeValue(session, public_key,
7050 get_public_template,
7051 ARRAY_SIZE(get_public_template));
7052 if (!ADBG_EXPECT_CK_OK(c, rv) ||
7053 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_PUBLIC_KEY) ||
7054 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_key_type, ==, CKK_RSA) ||
7055 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_derive, ==, CK_FALSE) ||
7056 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_TRUE) ||
7057 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_keygen_mecha, ==,
7058 CKM_RSA_PKCS_KEY_PAIR_GEN) ||
7059 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_encrypt, ==, CK_TRUE) ||
7060 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_verify, ==, CK_TRUE) ||
7061 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_verify_recover, ==, CK_FALSE) ||
7062 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_wrap, ==, CK_FALSE) ||
7063 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_trusted, ==, CK_FALSE))
7064 goto err_destr_obj;
7065
7066 /* reset get private key template */
7067 memset(g_id, 0, sizeof(g_id));
7068 assert(get_private_template[2].type == CKA_ID);
7069 get_private_template[2].ulValueLen = sizeof(g_id);
7070
7071 memset(g_subject, 0, sizeof(g_subject));
7072 assert(get_private_template[8].type == CKA_SUBJECT);
7073 get_private_template[8].ulValueLen = sizeof(g_subject);
7074
7075 memset(g_public_key_info, 0, sizeof(g_public_key_info));
7076 assert(get_private_template[19].type == CKA_PUBLIC_KEY_INFO);
7077 get_private_template[19].ulValueLen = sizeof(g_public_key_info);
7078
7079 rv = C_GetAttributeValue(session, private_key,
7080 get_private_template,
7081 ARRAY_SIZE(get_private_template));
7082 if (!ADBG_EXPECT_CK_OK(c, rv) ||
7083 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_PRIVATE_KEY) ||
7084 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_key_type, ==, CKK_RSA) ||
7085 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_derive, ==, CK_FALSE) ||
7086 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_TRUE) ||
7087 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_keygen_mecha, ==,
7088 CKM_RSA_PKCS_KEY_PAIR_GEN) ||
7089 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sensitive, ==, CK_TRUE) ||
7090 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_decrypt, ==, CK_TRUE) ||
7091 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sign, ==, CK_TRUE) ||
7092 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sign_recover, ==, CK_FALSE) ||
7093 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_unwrap, ==, CK_FALSE) ||
7094 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_extract, ==, CK_FALSE) ||
7095 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_asensitive, ==, CK_TRUE) ||
7096 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_nextract, ==, CK_TRUE) ||
7097 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_wrap_with_trusted, ==, CK_FALSE) ||
7098 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_always_authenticate, ==, CK_FALSE))
7099 goto err_destr_obj;
7100
7101 for (i = 0; i < ARRAY_SIZE(rsa_oaep_crypt_tests); i++) {
7102 /*
7103 * Note: this order of end/begin here is just to get ADBG
7104 * SubCases in sync with error handling.
7105 */
7106 Do_ADBG_EndSubCase(c, NULL);
7107
7108 Do_ADBG_BeginSubCase(c, "%s: Encrypt & decrypt - oneshot - %s",
7109 rsa_name,
7110 rsa_oaep_crypt_tests[i].test_name);
7111
7112 crypt_mechanism.mechanism = CKM_RSA_PKCS_OAEP;
7113 crypt_mechanism.pParameter = &oaep_params;
7114 crypt_mechanism.ulParameterLen = sizeof(oaep_params);
7115 oaep_params.hashAlg = rsa_oaep_crypt_tests[i].hash_algo;
7116 oaep_params.mgf = rsa_oaep_crypt_tests[i].mgf_algo;
7117 oaep_params.pSourceData = rsa_oaep_crypt_tests[i].source_data;
7118 oaep_params.ulSourceDataLen = rsa_oaep_crypt_tests[i].source_data_len;
7119
7120 memset(ciphertext, 0, sizeof(ciphertext));
7121 memset(plaintext, 0, sizeof(plaintext));
7122
7123 ciphertext_len = 0;
7124
7125 memcpy(plaintext, rsa_oaep_message, sizeof(rsa_oaep_message));
7126 plaintext_len = sizeof(rsa_oaep_message);
7127
7128 rv = C_EncryptInit(session, &crypt_mechanism, public_key);
7129 if (!ADBG_EXPECT_CK_OK(c, rv))
7130 goto err_destr_obj;
7131
7132 rv = C_Encrypt(session, plaintext, plaintext_len, NULL,
7133 &ciphertext_len);
7134 if (!ADBG_EXPECT_CK_OK(c, rv))
7135 goto err_destr_obj;
7136
7137 rv = C_Encrypt(session, plaintext, plaintext_len, ciphertext,
7138 &ciphertext_len);
7139 if (rsa_bits >= rsa_oaep_crypt_tests[i].min_rsa_bits) {
7140 if (!ADBG_EXPECT_CK_OK(c, rv))
7141 goto err_destr_obj;
7142 } else {
7143 if (!ADBG_EXPECT_CK_RESULT(c, CKR_DATA_LEN_RANGE, rv))
7144 goto err_destr_obj;
7145 continue;
7146 }
7147
7148 memset(plaintext, 0, sizeof(plaintext));
7149 plaintext_len = 0;
7150
7151 rv = C_DecryptInit(session, &crypt_mechanism, private_key);
7152 if (!ADBG_EXPECT_CK_OK(c, rv))
7153 goto err_destr_obj;
7154
7155 rv = C_Decrypt(session, ciphertext, ciphertext_len, NULL,
7156 &plaintext_len);
7157 if (!ADBG_EXPECT_CK_OK(c, rv))
7158 goto err_destr_obj;
7159
7160 rv = C_Decrypt(session, ciphertext, ciphertext_len, plaintext,
7161 &plaintext_len);
7162 if (!ADBG_EXPECT_CK_OK(c, rv) ||
7163 !ADBG_EXPECT_BUFFER(c, rsa_oaep_message,
7164 sizeof(rsa_oaep_message), plaintext,
7165 plaintext_len))
7166 goto err_destr_obj;
7167 }
7168
7169 rv = C_DestroyObject(session, private_key);
7170 if (!ADBG_EXPECT_CK_OK(c, rv))
7171 goto err_destr_pub_obj;
7172
7173 rv = C_DestroyObject(session, public_key);
7174 if (!ADBG_EXPECT_CK_OK(c, rv))
7175 goto err;
7176
7177 Do_ADBG_EndSubCase(c, NULL);
7178
7179 return 1;
7180
7181err_destr_obj:
7182 ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, private_key));
7183err_destr_pub_obj:
7184 ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, public_key));
7185err:
7186 Do_ADBG_EndSubCase(c, NULL);
7187
7188 return 0;
7189}
7190
7191static void xtest_pkcs11_test_1023(ADBG_Case_t *c)
7192{
7193 CK_RV rv = CKR_GENERAL_ERROR;
7194 CK_SLOT_ID slot = 0;
7195 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
7196 CK_FLAGS session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
7197 int ret = 0;
7198
7199 rv = init_lib_and_find_token_slot(&slot);
7200 if (!ADBG_EXPECT_CK_OK(c, rv))
7201 return;
7202
7203 rv = init_test_token(slot);
7204 if (!ADBG_EXPECT_CK_OK(c, rv))
7205 goto close_lib;
7206
7207 rv = init_user_test_token(slot);
7208 if (!ADBG_EXPECT_CK_OK(c, rv))
7209 goto close_lib;
7210
7211 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
7212 if (!ADBG_EXPECT_CK_OK(c, rv))
7213 goto close_lib;
7214
7215 /* Login to Test Token */
7216 rv = C_Login(session, CKU_USER, test_token_user_pin,
7217 sizeof(test_token_user_pin));
7218 if (!ADBG_EXPECT_CK_OK(c, rv))
7219 goto out;
7220
7221 ret = test_rsa_oaep_operations(c, session, "RSA-1024", 1024);
7222 if (!ret)
7223 goto out;
7224 ret = test_rsa_oaep_operations(c, session, "RSA-2048", 2048);
7225 if (!ret)
7226 goto out;
7227 if (level > 0) {
7228 ret = test_rsa_oaep_operations(c, session, "RSA-3072", 3072);
7229 if (!ret)
7230 goto out;
7231 ret = test_rsa_oaep_operations(c, session, "RSA-4096", 4096);
7232 if (!ret)
7233 goto out;
7234 }
7235out:
7236 ADBG_EXPECT_CK_OK(c, C_CloseSession(session));
7237close_lib:
7238 ADBG_EXPECT_CK_OK(c, close_lib());
7239}
7240ADBG_CASE_DEFINE(pkcs11, 1023, xtest_pkcs11_test_1023,
7241 "PKCS11: RSA OAEP key generation and crypto operations");