blob: 833361aeba53903b94854d89d0ead191eae4836b [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
4231 data_len = 32;
4232 key_len = 32;
4233 rv = derive_sym_key(session, aes_key2, CKM_AES_ECB_ENCRYPT_DATA,
4234 data_len, &derv_key_hdl, key_len, CKO_SECRET_KEY,
4235 CKK_AES, CK_FALSE, CK_TRUE);
4236 if (!ADBG_EXPECT_CK_RESULT(c, CKR_OPERATION_ACTIVE, rv))
4237 goto out;
4238
4239 rv = C_EncryptFinal(session, NULL, NULL);
4240 /* Only check that the operation is no more active */
4241 if (!ADBG_EXPECT_TRUE(c, rv != CKR_BUFFER_TOO_SMALL))
4242 goto out;
4243
4244 Do_ADBG_EndSubCase(c, NULL);
4245
4246 Do_ADBG_BeginSubCase(c, "Failure if parent key CKA_ENCRYPT is TRUE");
4247
4248 data_len = 32;
4249 key_len = 32;
4250 rv = derive_sym_key(session, aes_key_enc, CKM_AES_ECB_ENCRYPT_DATA,
4251 data_len, &derv_key_hdl, key_len, CKO_SECRET_KEY,
4252 CKK_AES, CK_FALSE, CK_TRUE);
4253 /*
4254 * Not strictly expecting FUNCTION_FAILED but expecting a failure
4255 * as we have added a restriction that keys with attribute CKA_ENCRYPT
4256 * set can't be used for derivation.
4257 */
4258 if (!ADBG_EXPECT_CK_RESULT(c, CKR_FUNCTION_FAILED, rv))
4259 goto out;
4260
4261 Do_ADBG_EndSubCase(c, NULL);
4262
4263 Do_ADBG_BeginSubCase(c, "Failure if parent key CKA_DERIVE is FALSE");
4264
4265 rv = C_DestroyObject(session, aes_key1);
4266 if (!ADBG_EXPECT_CK_OK(c, rv))
4267 goto out;
4268
4269 rv = C_GenerateKey(session, &cktest_aes_keygen_mechanism,
4270 parent_template_wo_derive,
4271 ARRAY_SIZE(parent_template_wo_derive),
4272 &aes_key1);
4273 if (!ADBG_EXPECT_CK_OK(c, rv))
4274 goto out;
4275
4276 data_len = 32;
4277 key_len = 32;
4278 rv = derive_sym_key(session, aes_key1, CKM_AES_ECB_ENCRYPT_DATA,
4279 data_len, &derv_key_hdl, key_len, CKO_SECRET_KEY,
4280 CKK_AES, CK_FALSE, CK_TRUE);
4281 if (!ADBG_EXPECT_CK_RESULT(c, CKR_KEY_TYPE_INCONSISTENT, rv))
4282 goto out;
4283
4284out:
4285 Do_ADBG_EndSubCase(c, NULL);
4286
4287close_session:
4288 ADBG_EXPECT_CK_OK(c, C_CloseSession(session));
4289
4290close_lib:
4291 ADBG_EXPECT_CK_OK(c, close_lib());
4292}
4293ADBG_CASE_DEFINE(pkcs11, 1017, xtest_pkcs11_test_1017,
4294 "PKCS11: AES Key Derivation tests");
Vesa Jääskeläinenc95ee1e2021-03-06 12:20:12 +02004295
4296/* Digest test patterns */
4297static const char digest_test_pattern[] = "The quick brown fox jumps over the lazy dog";
4298static const char digest_test_pattern_empty[] = "";
4299
4300/* MD5 checksums for digest test patterns */
4301static const uint8_t digest_test_pattern_md5[] = {
4302 0x9e, 0x10, 0x7d, 0x9d, 0x37, 0x2b, 0xb6, 0x82, 0x6b, 0xd8, 0x1d, 0x35,
4303 0x42, 0xa4, 0x19, 0xd6
4304};
4305static const uint8_t digest_test_pattern_empty_md5[] = {
4306 0xd4, 0x1d, 0x8c, 0xd9, 0x8f, 0x00, 0xb2, 0x04, 0xe9, 0x80, 0x09, 0x98,
4307 0xec, 0xf8, 0x42, 0x7e
4308};
4309
4310/* SHA-1 checksums for digest test patterns */
4311static const uint8_t digest_test_pattern_sha1[] = {
4312 0x2f, 0xd4, 0xe1, 0xc6, 0x7a, 0x2d, 0x28, 0xfc, 0xed, 0x84, 0x9e, 0xe1,
4313 0xbb, 0x76, 0xe7, 0x39, 0x1b, 0x93, 0xeb, 0x12
4314};
4315static const uint8_t digest_test_pattern_empty_sha1[] = {
4316 0xda, 0x39, 0xa3, 0xee, 0x5e, 0x6b, 0x4b, 0x0d, 0x32, 0x55, 0xbf, 0xef,
4317 0x95, 0x60, 0x18, 0x90, 0xaf, 0xd8, 0x07, 0x09
4318};
4319
4320/* SHA-224 checksums for digest test patterns */
4321static const uint8_t digest_test_pattern_sha224[] = {
4322 0x73, 0x0e, 0x10, 0x9b, 0xd7, 0xa8, 0xa3, 0x2b, 0x1c, 0xb9, 0xd9, 0xa0,
4323 0x9a, 0xa2, 0x32, 0x5d, 0x24, 0x30, 0x58, 0x7d, 0xdb, 0xc0, 0xc3, 0x8b,
4324 0xad, 0x91, 0x15, 0x25
4325};
4326static const uint8_t digest_test_pattern_empty_sha224[] = {
4327 0xd1, 0x4a, 0x02, 0x8c, 0x2a, 0x3a, 0x2b, 0xc9, 0x47, 0x61, 0x02, 0xbb,
4328 0x28, 0x82, 0x34, 0xc4, 0x15, 0xa2, 0xb0, 0x1f, 0x82, 0x8e, 0xa6, 0x2a,
4329 0xc5, 0xb3, 0xe4, 0x2f
4330};
4331
4332/* SHA-256 checksums for digest test patterns */
4333static const uint8_t digest_test_pattern_sha256[] = {
4334 0xd7, 0xa8, 0xfb, 0xb3, 0x07, 0xd7, 0x80, 0x94, 0x69, 0xca, 0x9a, 0xbc,
4335 0xb0, 0x08, 0x2e, 0x4f, 0x8d, 0x56, 0x51, 0xe4, 0x6d, 0x3c, 0xdb, 0x76,
4336 0x2d, 0x02, 0xd0, 0xbf, 0x37, 0xc9, 0xe5, 0x92
4337};
4338static const uint8_t digest_test_pattern_empty_sha256[] = {
4339 0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4, 0xc8,
4340 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c,
4341 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55
4342};
4343
4344/* SHA-384 checksums for digest test patterns */
4345static const uint8_t digest_test_pattern_sha384[] = {
4346 0xca, 0x73, 0x7f, 0x10, 0x14, 0xa4, 0x8f, 0x4c, 0x0b, 0x6d, 0xd4, 0x3c,
4347 0xb1, 0x77, 0xb0, 0xaf, 0xd9, 0xe5, 0x16, 0x93, 0x67, 0x54, 0x4c, 0x49,
4348 0x40, 0x11, 0xe3, 0x31, 0x7d, 0xbf, 0x9a, 0x50, 0x9c, 0xb1, 0xe5, 0xdc,
4349 0x1e, 0x85, 0xa9, 0x41, 0xbb, 0xee, 0x3d, 0x7f, 0x2a, 0xfb, 0xc9, 0xb1
4350};
4351static const uint8_t digest_test_pattern_empty_sha384[] = {
4352 0x38, 0xb0, 0x60, 0xa7, 0x51, 0xac, 0x96, 0x38, 0x4c, 0xd9, 0x32, 0x7e,
4353 0xb1, 0xb1, 0xe3, 0x6a, 0x21, 0xfd, 0xb7, 0x11, 0x14, 0xbe, 0x07, 0x43,
4354 0x4c, 0x0c, 0xc7, 0xbf, 0x63, 0xf6, 0xe1, 0xda, 0x27, 0x4e, 0xde, 0xbf,
4355 0xe7, 0x6f, 0x65, 0xfb, 0xd5, 0x1a, 0xd2, 0xf1, 0x48, 0x98, 0xb9, 0x5b
4356};
4357
4358/* SHA-512 checksums for digest test patterns */
4359static const uint8_t digest_test_pattern_sha512[] = {
4360 0x07, 0xe5, 0x47, 0xd9, 0x58, 0x6f, 0x6a, 0x73, 0xf7, 0x3f, 0xba, 0xc0,
4361 0x43, 0x5e, 0xd7, 0x69, 0x51, 0x21, 0x8f, 0xb7, 0xd0, 0xc8, 0xd7, 0x88,
4362 0xa3, 0x09, 0xd7, 0x85, 0x43, 0x6b, 0xbb, 0x64, 0x2e, 0x93, 0xa2, 0x52,
4363 0xa9, 0x54, 0xf2, 0x39, 0x12, 0x54, 0x7d, 0x1e, 0x8a, 0x3b, 0x5e, 0xd6,
4364 0xe1, 0xbf, 0xd7, 0x09, 0x78, 0x21, 0x23, 0x3f, 0xa0, 0x53, 0x8f, 0x3d,
4365 0xb8, 0x54, 0xfe, 0xe6
4366};
4367static const uint8_t digest_test_pattern_empty_sha512[] = {
4368 0xcf, 0x83, 0xe1, 0x35, 0x7e, 0xef, 0xb8, 0xbd, 0xf1, 0x54, 0x28, 0x50,
4369 0xd6, 0x6d, 0x80, 0x07, 0xd6, 0x20, 0xe4, 0x05, 0x0b, 0x57, 0x15, 0xdc,
4370 0x83, 0xf4, 0xa9, 0x21, 0xd3, 0x6c, 0xe9, 0xce, 0x47, 0xd0, 0xd1, 0x3c,
4371 0x5d, 0x85, 0xf2, 0xb0, 0xff, 0x83, 0x18, 0xd2, 0x87, 0x7e, 0xec, 0x2f,
4372 0x63, 0xb9, 0x31, 0xbd, 0x47, 0x41, 0x7a, 0x81, 0xa5, 0x38, 0x32, 0x7a,
4373 0xf9, 0x27, 0xda, 0x3e
4374};
4375
4376#define DIGEST_TEST(_test_name, _mecha, _data, _digest) \
4377 { \
4378 .test_name = _test_name, \
4379 .mecha = _mecha, \
4380 .data = _data, \
4381 .data_size = sizeof(_data) - 1, \
4382 .digest = _digest, \
4383 .digest_size = sizeof(_digest) \
4384 }
4385
4386/* Digest simple test suite */
4387static struct {
4388 const char *test_name;
4389 CK_MECHANISM_TYPE mecha;
4390 const void *data;
4391 CK_ULONG data_size;
4392 const uint8_t *digest;
4393 CK_ULONG digest_size;
4394} digest_test_patterns[] = {
4395 DIGEST_TEST("CKM_MD5/empty", CKM_MD5, digest_test_pattern_empty,
4396 digest_test_pattern_empty_md5),
4397 DIGEST_TEST("CKM_MD5/test pattern", CKM_MD5, digest_test_pattern,
4398 digest_test_pattern_md5),
4399 DIGEST_TEST("CKM_SHA_1/empty", CKM_SHA_1, digest_test_pattern_empty,
4400 digest_test_pattern_empty_sha1),
4401 DIGEST_TEST("CKM_SHA_1/test pattern", CKM_SHA_1, digest_test_pattern,
4402 digest_test_pattern_sha1),
4403 DIGEST_TEST("CKM_SHA224/empty", CKM_SHA224, digest_test_pattern_empty,
4404 digest_test_pattern_empty_sha224),
4405 DIGEST_TEST("CKM_SHA224/test pattern", CKM_SHA224, digest_test_pattern,
4406 digest_test_pattern_sha224),
4407 DIGEST_TEST("CKM_SHA256/empty", CKM_SHA256, digest_test_pattern_empty,
4408 digest_test_pattern_empty_sha256),
4409 DIGEST_TEST("CKM_SHA256/test pattern", CKM_SHA256, digest_test_pattern,
4410 digest_test_pattern_sha256),
4411 DIGEST_TEST("CKM_SHA384/empty", CKM_SHA384, digest_test_pattern_empty,
4412 digest_test_pattern_empty_sha384),
4413 DIGEST_TEST("CKM_SHA384/test pattern", CKM_SHA384, digest_test_pattern,
4414 digest_test_pattern_sha384),
4415 DIGEST_TEST("CKM_SHA512/empty", CKM_SHA512, digest_test_pattern_empty,
4416 digest_test_pattern_empty_sha512),
4417 DIGEST_TEST("CKM_SHA512/test pattern", CKM_SHA512, digest_test_pattern,
4418 digest_test_pattern_sha512),
4419};
4420
4421static CK_ATTRIBUTE digest_generate_aes_object[] = {
4422 { CKA_CLASS, &(CK_OBJECT_CLASS){ CKO_SECRET_KEY },
4423 sizeof(CK_OBJECT_CLASS) },
4424 { CKA_KEY_TYPE, &(CK_KEY_TYPE){ CKK_AES }, sizeof(CK_KEY_TYPE) },
4425 { CKA_TOKEN, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
4426 { CKA_PRIVATE, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
4427 { CKA_SENSITIVE, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
4428 { CKA_EXTRACTABLE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
4429 { CKA_VALUE_LEN, &(CK_ULONG){ 16 }, sizeof(CK_ULONG) },
4430};
4431
4432static CK_ATTRIBUTE digest_generate_gensecret_object[] = {
4433 { CKA_CLASS, &(CK_OBJECT_CLASS){ CKO_SECRET_KEY },
4434 sizeof(CK_OBJECT_CLASS) },
4435 { CKA_KEY_TYPE, &(CK_KEY_TYPE){ CKK_GENERIC_SECRET },
4436 sizeof(CK_KEY_TYPE) },
4437 { CKA_TOKEN, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
4438 { CKA_PRIVATE, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
4439 { CKA_SENSITIVE, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
4440 { CKA_EXTRACTABLE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
Ruchika Guptae86aba22021-03-11 00:36:01 +05304441 { CKA_VALUE_LEN, &(CK_ULONG){ 32 }, sizeof(CK_ULONG) },
Vesa Jääskeläinenc95ee1e2021-03-06 12:20:12 +02004442};
4443
4444static CK_ATTRIBUTE digest_data_object[] = {
4445 { CKA_CLASS, &(CK_OBJECT_CLASS){ CKO_DATA },
4446 sizeof(CK_OBJECT_CLASS) },
4447 { CKA_TOKEN, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
4448 { CKA_PRIVATE, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
4449};
4450
4451static void xtest_pkcs11_test_1018(ADBG_Case_t *c)
4452{
4453 CK_RV rv = CKR_GENERAL_ERROR;
4454 CK_SLOT_ID slot = 0;
4455 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
4456 CK_FLAGS session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
4457 bool logged_in = false;
4458 uint8_t data[128] = { 0 };
4459 CK_ULONG data_size = 0;
4460 uint8_t digest[64] = { 0 };
4461 CK_ULONG digest_size = 0;
4462 const uint8_t *expect_digest = NULL;
4463 CK_ULONG expect_digest_size = 0;
4464 CK_MECHANISM mechanism = { CKM_MD5, NULL, 0 };
4465 uint8_t secret_data[128] = { 0 };
4466 CK_ULONG secret_data_size __maybe_unused = 0;
4467 CK_ATTRIBUTE digest_get_secret_value[] = {
4468 { CKA_VALUE, &secret_data, sizeof(secret_data) },
4469 };
4470 CK_OBJECT_HANDLE key_handle = CK_INVALID_HANDLE;
4471#ifdef OPENSSL_FOUND
4472 EVP_MD_CTX *mdctx = NULL;
4473 unsigned char hash[EVP_MAX_MD_SIZE] = { 0 };
4474 unsigned int md_len = 0;
4475 int ret = 0;
4476#endif
4477 size_t i = 0;
4478
4479 rv = init_lib_and_find_token_slot(&slot);
4480 if (!ADBG_EXPECT_CK_OK(c, rv))
4481 return;
4482
4483 rv = init_test_token(slot);
4484 if (!ADBG_EXPECT_CK_OK(c, rv))
4485 goto close_lib;
4486
4487 rv = init_user_test_token(slot);
4488 if (!ADBG_EXPECT_CK_OK(c, rv))
4489 goto close_lib;
4490
4491 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
4492 if (!ADBG_EXPECT_CK_OK(c, rv))
4493 goto close_lib;
4494
4495 /* Test out simple successful cases with init+update+final*/
4496 for (i = 0; i < ARRAY_SIZE(digest_test_patterns); i++) {
4497 Do_ADBG_BeginSubCase(c, "Simple digest tests - update - %s",
4498 digest_test_patterns[i].test_name);
4499
4500 mechanism.mechanism = digest_test_patterns[i].mecha;
4501 memset(data, 0xCC, sizeof(data));
4502 memset(digest, 0xCC, sizeof(digest));
4503 digest_size = sizeof(digest);
4504
4505 memcpy(data, digest_test_patterns[i].data,
4506 digest_test_patterns[i].data_size);
4507 data_size = digest_test_patterns[i].data_size;
4508
4509 expect_digest = digest_test_patterns[i].digest;
4510 expect_digest_size = digest_test_patterns[i].digest_size;
4511
4512 rv = C_DigestInit(session, &mechanism);
4513 if (!ADBG_EXPECT_CK_OK(c, rv))
4514 goto out;
4515
4516 rv = C_DigestUpdate(session, data, data_size);
4517 if (!ADBG_EXPECT_CK_OK(c, rv))
4518 goto out;
4519
4520 rv = C_DigestFinal(session, digest, &digest_size);
4521 if (!ADBG_EXPECT_CK_OK(c, rv))
4522 goto out;
4523
4524 if (!ADBG_EXPECT_BUFFER(c, expect_digest, expect_digest_size,
4525 digest, digest_size))
4526 goto out;
4527
4528 /* Verify that end of buffer is still 0xCC */
4529 for (i = expect_digest_size; i < sizeof(digest); i++)
4530 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, digest[i], ==,
4531 0xCC))
4532 goto out;
4533
4534 Do_ADBG_EndSubCase(c, NULL);
4535 }
4536
4537 /* Test out simple successful cases */
4538 for (i = 0; i < ARRAY_SIZE(digest_test_patterns); i++) {
4539 Do_ADBG_BeginSubCase(c, "Simple digest tests - oneshot - %s",
4540 digest_test_patterns[i].test_name);
4541
4542 mechanism.mechanism = digest_test_patterns[i].mecha;
4543 memset(data, 0xCC, sizeof(data));
4544 memset(digest, 0xCC, sizeof(digest));
4545 digest_size = sizeof(digest);
4546
4547 memcpy(data, digest_test_patterns[i].data,
4548 digest_test_patterns[i].data_size);
4549 data_size = digest_test_patterns[i].data_size;
4550
4551 expect_digest = digest_test_patterns[i].digest;
4552 expect_digest_size = digest_test_patterns[i].digest_size;
4553
4554 rv = C_DigestInit(session, &mechanism);
4555 if (!ADBG_EXPECT_CK_OK(c, rv))
4556 goto out;
4557
4558 rv = C_Digest(session, data, data_size, digest, &digest_size);
4559 if (!ADBG_EXPECT_CK_OK(c, rv))
4560 goto out;
4561
4562 if (!ADBG_EXPECT_BUFFER(c, expect_digest, expect_digest_size,
4563 digest, digest_size))
4564 goto out;
4565
4566 /* Verify that end of buffer is still 0xCC */
4567 for (i = expect_digest_size; i < sizeof(digest); i++)
4568 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, digest[i], ==,
4569 0xCC))
4570 goto out;
4571
4572 Do_ADBG_EndSubCase(c, NULL);
4573 }
4574
4575 /* Test out key updates */
4576
4577 Do_ADBG_BeginSubCase(c, "Simple digest tests - AES key update - SHA-256");
4578
4579 /* Login to Test Token */
4580 rv = C_Login(session, CKU_USER, test_token_user_pin,
4581 sizeof(test_token_user_pin));
4582 if (!ADBG_EXPECT_CK_OK(c, rv))
4583 goto out;
4584
4585 logged_in = true;
4586
4587 /* Generate AES key */
4588 rv = C_GenerateKey(session, &cktest_aes_keygen_mechanism,
4589 digest_generate_aes_object,
4590 ARRAY_SIZE(digest_generate_aes_object),
4591 &key_handle);
4592 if (!ADBG_EXPECT_CK_OK(c, rv))
4593 goto out;
4594
4595 memset(secret_data, 0xCC, sizeof(data));
4596 digest_get_secret_value[0].ulValueLen = sizeof(secret_data);
4597
4598 /* Get value of generated secret for verification purposes */
4599 rv = C_GetAttributeValue(session, key_handle, digest_get_secret_value,
4600 ARRAY_SIZE(digest_get_secret_value));
4601 if (!ADBG_EXPECT_CK_OK(c, rv))
4602 goto out;
4603
4604 secret_data_size = digest_get_secret_value[0].ulValueLen;
4605
4606 /* Calculate digest with PKCS11 */
4607 mechanism.mechanism = CKM_SHA256;
4608
4609 memset(data, 0xCC, sizeof(data));
4610 memset(digest, 0xCC, sizeof(digest));
4611 digest_size = sizeof(digest);
4612
4613 memcpy(data, digest_test_patterns[0].data,
4614 digest_test_patterns[0].data_size);
4615 data_size = digest_test_patterns[0].data_size;
4616
4617 rv = C_DigestInit(session, &mechanism);
4618 if (!ADBG_EXPECT_CK_OK(c, rv))
4619 goto out;
4620
4621 rv = C_DigestUpdate(session, data, data_size);
4622 if (!ADBG_EXPECT_CK_OK(c, rv))
4623 goto out;
4624
4625 rv = C_DigestKey(session, key_handle);
4626 if (!ADBG_EXPECT_CK_OK(c, rv))
4627 goto out;
4628
4629 rv = C_DigestFinal(session, digest, &digest_size);
4630 if (!ADBG_EXPECT_CK_OK(c, rv))
4631 goto out;
4632
4633 /* Verify digest with openssl */
4634#ifdef OPENSSL_FOUND
4635 mdctx = EVP_MD_CTX_create();
4636 if (!ADBG_EXPECT_NOT_NULL(c, mdctx))
4637 goto out;
4638 ret = EVP_DigestInit_ex(mdctx, EVP_sha256(), NULL);
4639 if (!ADBG_EXPECT_COMPARE_SIGNED(c, ret, ==, 1))
4640 goto out;
4641 ret = EVP_DigestUpdate(mdctx, data, data_size);
4642 if (!ADBG_EXPECT_COMPARE_SIGNED(c, ret, ==, 1))
4643 goto out;
4644 ret = EVP_DigestUpdate(mdctx, secret_data, secret_data_size);
4645 if (!ADBG_EXPECT_COMPARE_SIGNED(c, ret, ==, 1))
4646 goto out;
4647 ret = EVP_DigestFinal_ex(mdctx, hash, &md_len);
4648 if (!ADBG_EXPECT_COMPARE_SIGNED(c, ret, ==, 1))
4649 goto out;
4650 EVP_MD_CTX_destroy(mdctx);
4651 mdctx = NULL;
4652
4653 if (!ADBG_EXPECT_BUFFER(c, hash, md_len, digest, digest_size))
4654 goto out;
4655#else
4656 Do_ADBG_Log("OpenSSL not available, skipping C_DigestKey verification");
4657#endif
4658
4659 ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, key_handle));
4660 key_handle = CK_INVALID_HANDLE;
4661
4662 Do_ADBG_EndSubCase(c, NULL);
4663
4664 Do_ADBG_BeginSubCase(c, "Simple digest tests - generic secret key update - SHA-256");
4665
4666 /* Generate generic secret key */
4667 rv = C_GenerateKey(session, &cktest_gensecret_keygen_mechanism,
4668 digest_generate_gensecret_object,
4669 ARRAY_SIZE(digest_generate_gensecret_object),
4670 &key_handle);
4671 if (!ADBG_EXPECT_CK_OK(c, rv))
4672 goto out;
4673
4674 memset(secret_data, 0xCC, sizeof(data));
4675 digest_get_secret_value[0].ulValueLen = sizeof(secret_data);
4676
4677 /* Get value of generated secret for verification purposes */
4678 rv = C_GetAttributeValue(session, key_handle, digest_get_secret_value,
4679 ARRAY_SIZE(digest_get_secret_value));
4680 if (!ADBG_EXPECT_CK_OK(c, rv))
4681 goto out;
4682
4683 secret_data_size = digest_get_secret_value[0].ulValueLen;
4684
4685 /* Calculate digest with PKCS11 */
4686 mechanism.mechanism = CKM_SHA256;
4687
4688 memset(data, 0xCC, sizeof(data));
4689 memset(digest, 0xCC, sizeof(digest));
4690 digest_size = sizeof(digest);
4691
4692 memcpy(data, digest_test_patterns[0].data,
4693 digest_test_patterns[0].data_size);
4694 data_size = digest_test_patterns[0].data_size;
4695
4696 rv = C_DigestInit(session, &mechanism);
4697 if (!ADBG_EXPECT_CK_OK(c, rv))
4698 goto out;
4699
4700 rv = C_DigestUpdate(session, data, data_size);
4701 if (!ADBG_EXPECT_CK_OK(c, rv))
4702 goto out;
4703
4704 rv = C_DigestKey(session, key_handle);
4705 if (!ADBG_EXPECT_CK_OK(c, rv))
4706 goto out;
4707
4708 rv = C_DigestFinal(session, digest, &digest_size);
4709 if (!ADBG_EXPECT_CK_OK(c, rv))
4710 goto out;
4711
4712 /* Verify digest with openssl */
4713#ifdef OPENSSL_FOUND
4714 mdctx = EVP_MD_CTX_create();
4715 if (!ADBG_EXPECT_NOT_NULL(c, mdctx))
4716 goto out;
4717 ret = EVP_DigestInit_ex(mdctx, EVP_sha256(), NULL);
4718 if (!ADBG_EXPECT_COMPARE_SIGNED(c, ret, ==, 1))
4719 goto out;
4720 ret = EVP_DigestUpdate(mdctx, data, data_size);
4721 if (!ADBG_EXPECT_COMPARE_SIGNED(c, ret, ==, 1))
4722 goto out;
4723 ret = EVP_DigestUpdate(mdctx, secret_data, secret_data_size);
4724 if (!ADBG_EXPECT_COMPARE_SIGNED(c, ret, ==, 1))
4725 goto out;
4726 ret = EVP_DigestFinal_ex(mdctx, hash, &md_len);
4727 if (!ADBG_EXPECT_COMPARE_SIGNED(c, ret, ==, 1))
4728 goto out;
4729 EVP_MD_CTX_destroy(mdctx);
4730 mdctx = NULL;
4731
4732 if (!ADBG_EXPECT_BUFFER(c, hash, md_len, digest, digest_size))
4733 goto out;
4734#else
4735 Do_ADBG_Log("OpenSSL not available, skipping C_DigestKey verification");
4736#endif
4737
4738 ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, key_handle));
4739 key_handle = CK_INVALID_HANDLE;
4740
4741 Do_ADBG_EndSubCase(c, NULL);
4742
4743 Do_ADBG_BeginSubCase(c, "Query digest size - C_DigestFinal");
4744
4745 mechanism.mechanism = digest_test_patterns[0].mecha;
4746
4747 memset(data, 0xCC, sizeof(data));
4748 memset(digest, 0xCC, sizeof(digest));
4749 digest_size = 0;
4750
4751 memcpy(data, digest_test_patterns[0].data,
4752 digest_test_patterns[0].data_size);
4753 data_size = digest_test_patterns[0].data_size;
4754
4755 expect_digest = digest_test_patterns[0].digest;
4756 expect_digest_size = digest_test_patterns[0].digest_size;
4757
4758 rv = C_DigestInit(session, &mechanism);
4759 if (!ADBG_EXPECT_CK_OK(c, rv))
4760 goto out;
4761
4762 rv = C_DigestUpdate(session, data, data_size);
4763 if (!ADBG_EXPECT_CK_OK(c, rv))
4764 goto out;
4765
4766 rv = C_DigestFinal(session, NULL, &digest_size);
4767 if (!ADBG_EXPECT_CK_OK(c, rv))
4768 goto out;
4769
4770 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, digest_size, ==,
4771 expect_digest_size))
4772 goto out;
4773
4774 rv = C_DigestFinal(session, digest, &digest_size);
4775 if (!ADBG_EXPECT_CK_OK(c, rv))
4776 goto out;
4777
4778 if (!ADBG_EXPECT_BUFFER(c, expect_digest, expect_digest_size,
4779 digest, digest_size))
4780 goto out;
4781
4782 Do_ADBG_EndSubCase(c, NULL);
4783
4784 Do_ADBG_BeginSubCase(c, "Query digest size - C_Digest");
4785
4786 mechanism.mechanism = digest_test_patterns[0].mecha;
4787
4788 memset(data, 0xCC, sizeof(data));
4789 memset(digest, 0xCC, sizeof(digest));
4790 digest_size = 0;
4791
4792 memcpy(data, digest_test_patterns[0].data,
4793 digest_test_patterns[0].data_size);
4794 data_size = digest_test_patterns[0].data_size;
4795
4796 expect_digest = digest_test_patterns[0].digest;
4797 expect_digest_size = digest_test_patterns[0].digest_size;
4798
4799 rv = C_DigestInit(session, &mechanism);
4800 if (!ADBG_EXPECT_CK_OK(c, rv))
4801 goto out;
4802
4803 rv = C_Digest(session, data, data_size, NULL, &digest_size);
4804 if (!ADBG_EXPECT_CK_OK(c, rv))
4805 goto out;
4806
4807 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, digest_size, ==,
4808 expect_digest_size))
4809 goto out;
4810
4811 rv = C_Digest(session, data, data_size, digest, &digest_size);
4812 if (!ADBG_EXPECT_CK_OK(c, rv))
4813 goto out;
4814
4815 if (!ADBG_EXPECT_BUFFER(c, expect_digest, expect_digest_size,
4816 digest, digest_size))
4817 goto out;
4818
4819 Do_ADBG_EndSubCase(c, NULL);
4820
4821 Do_ADBG_BeginSubCase(c, "Query digest size - buffer too small");
4822
4823 mechanism.mechanism = CKM_SHA256;
4824
4825 memset(data, 0xCC, sizeof(data));
4826 memset(digest, 0xCC, sizeof(digest));
4827 digest_size = 0;
4828
4829 memcpy(data, digest_test_patterns[0].data,
4830 digest_test_patterns[0].data_size);
4831 data_size = digest_test_patterns[0].data_size;
4832
4833 rv = C_DigestInit(session, &mechanism);
4834 if (!ADBG_EXPECT_CK_OK(c, rv))
4835 goto out;
4836
4837 rv = C_DigestUpdate(session, data, data_size);
4838 if (!ADBG_EXPECT_CK_OK(c, rv))
4839 goto out;
4840
4841 rv = C_DigestFinal(session, digest, &digest_size);
4842 if (!ADBG_EXPECT_CK_RESULT(c, CKR_BUFFER_TOO_SMALL, rv))
4843 goto out;
4844
4845 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, digest_size, ==, 32))
4846 goto out;
4847
4848 rv = C_DigestFinal(session, digest, &digest_size);
4849 if (!ADBG_EXPECT_CK_OK(c, rv))
4850 goto out;
4851
4852 Do_ADBG_EndSubCase(c, NULL);
4853
4854 /* Test bad arguments & operation terminations */
4855
4856 Do_ADBG_BeginSubCase(c, "Test bad arguments - C_DigestUpdate");
4857
4858 mechanism.mechanism = CKM_SHA256;
4859
4860 memset(data, 0xCC, sizeof(data));
4861 memset(digest, 0xCC, sizeof(digest));
4862 digest_size = sizeof(digest);
4863
4864 memcpy(data, digest_test_patterns[0].data,
4865 digest_test_patterns[0].data_size);
4866 data_size = digest_test_patterns[0].data_size;
4867
4868 rv = C_DigestInit(session, &mechanism);
4869 if (!ADBG_EXPECT_CK_OK(c, rv))
4870 goto out;
4871
4872 rv = C_DigestUpdate(session, NULL, 10);
4873 if (!ADBG_EXPECT_CK_RESULT(c, CKR_ARGUMENTS_BAD, rv))
4874 goto out;
4875
4876 rv = C_DigestUpdate(session, data, data_size);
4877 if (!ADBG_EXPECT_CK_RESULT(c, CKR_OPERATION_NOT_INITIALIZED, rv))
4878 goto out;
4879
4880 Do_ADBG_EndSubCase(c, NULL);
4881
4882 Do_ADBG_BeginSubCase(c, "Test bad arguments - C_DigestFinal with NULL digest");
4883
4884 mechanism.mechanism = CKM_SHA256;
4885
4886 memset(data, 0xCC, sizeof(data));
4887 memset(digest, 0xCC, sizeof(digest));
4888 digest_size = sizeof(digest);
4889
4890 memcpy(data, digest_test_patterns[0].data,
4891 digest_test_patterns[0].data_size);
4892 data_size = digest_test_patterns[0].data_size;
4893
4894 rv = C_DigestInit(session, &mechanism);
4895 if (!ADBG_EXPECT_CK_OK(c, rv))
4896 goto out;
4897
4898 rv = C_DigestUpdate(session, data, data_size);
4899 if (!ADBG_EXPECT_CK_OK(c, rv))
4900 goto out;
4901
4902 rv = C_DigestFinal(session, NULL, NULL);
4903 if (!ADBG_EXPECT_CK_RESULT(c, CKR_ARGUMENTS_BAD, rv))
4904 goto out;
4905
4906 rv = C_DigestFinal(session, digest, &digest_size);
4907 if (!ADBG_EXPECT_CK_RESULT(c, CKR_OPERATION_NOT_INITIALIZED, rv))
4908 goto out;
4909
4910 Do_ADBG_EndSubCase(c, NULL);
4911
4912 Do_ADBG_BeginSubCase(c, "Test bad arguments - C_DigestFinal with digest but NULL size");
4913
4914 mechanism.mechanism = CKM_SHA256;
4915
4916 memset(data, 0xCC, sizeof(data));
4917 memset(digest, 0xCC, sizeof(digest));
4918 digest_size = sizeof(digest);
4919
4920 memcpy(data, digest_test_patterns[0].data,
4921 digest_test_patterns[0].data_size);
4922 data_size = digest_test_patterns[0].data_size;
4923
4924 rv = C_DigestInit(session, &mechanism);
4925 if (!ADBG_EXPECT_CK_OK(c, rv))
4926 goto out;
4927
4928 rv = C_DigestUpdate(session, data, data_size);
4929 if (!ADBG_EXPECT_CK_OK(c, rv))
4930 goto out;
4931
4932 rv = C_DigestFinal(session, digest, NULL);
4933 if (!ADBG_EXPECT_CK_RESULT(c, CKR_ARGUMENTS_BAD, rv))
4934 goto out;
4935
4936 rv = C_DigestFinal(session, digest, &digest_size);
4937 if (!ADBG_EXPECT_CK_RESULT(c, CKR_OPERATION_NOT_INITIALIZED, rv))
4938 goto out;
4939
4940 Do_ADBG_EndSubCase(c, NULL);
4941
4942 Do_ADBG_BeginSubCase(c, "Test bad arguments - C_Digest with NULL data but non-zero size");
4943
4944 mechanism.mechanism = CKM_SHA256;
4945
4946 memset(data, 0xCC, sizeof(data));
4947 memset(digest, 0xCC, sizeof(digest));
4948 digest_size = sizeof(digest);
4949
4950 memcpy(data, digest_test_patterns[0].data,
4951 digest_test_patterns[0].data_size);
4952 data_size = digest_test_patterns[0].data_size;
4953
4954 rv = C_DigestInit(session, &mechanism);
4955 if (!ADBG_EXPECT_CK_OK(c, rv))
4956 goto out;
4957
4958 rv = C_Digest(session, NULL, 10, digest, &digest_size);
4959 if (!ADBG_EXPECT_CK_RESULT(c, CKR_ARGUMENTS_BAD, rv))
4960 goto out;
4961
4962 rv = C_Digest(session, data, data_size, digest, &digest_size);
4963 if (!ADBG_EXPECT_CK_RESULT(c, CKR_OPERATION_NOT_INITIALIZED, rv))
4964 goto out;
4965
4966 Do_ADBG_EndSubCase(c, NULL);
4967
4968 Do_ADBG_BeginSubCase(c, "Test bad arguments - C_Digest with NULL digest");
4969
4970 mechanism.mechanism = CKM_SHA256;
4971
4972 memset(data, 0xCC, sizeof(data));
4973 memset(digest, 0xCC, sizeof(digest));
4974 digest_size = sizeof(digest);
4975
4976 memcpy(data, digest_test_patterns[0].data,
4977 digest_test_patterns[0].data_size);
4978 data_size = digest_test_patterns[0].data_size;
4979
4980 rv = C_DigestInit(session, &mechanism);
4981 if (!ADBG_EXPECT_CK_OK(c, rv))
4982 goto out;
4983
4984 rv = C_Digest(session, data, data_size, NULL, NULL);
4985 if (!ADBG_EXPECT_CK_RESULT(c, CKR_ARGUMENTS_BAD, rv))
4986 goto out;
4987
4988 rv = C_Digest(session, data, data_size, digest, &digest_size);
4989 if (!ADBG_EXPECT_CK_RESULT(c, CKR_OPERATION_NOT_INITIALIZED, rv))
4990 goto out;
4991
4992 Do_ADBG_EndSubCase(c, NULL);
4993
4994 Do_ADBG_BeginSubCase(c, "Test bad arguments - C_DigestFinal with digest but NULL size");
4995
4996 mechanism.mechanism = CKM_SHA256;
4997
4998 memset(data, 0xCC, sizeof(data));
4999 memset(digest, 0xCC, sizeof(digest));
5000 digest_size = sizeof(digest);
5001
5002 memcpy(data, digest_test_patterns[0].data,
5003 digest_test_patterns[0].data_size);
5004 data_size = digest_test_patterns[0].data_size;
5005
5006 rv = C_DigestInit(session, &mechanism);
5007 if (!ADBG_EXPECT_CK_OK(c, rv))
5008 goto out;
5009
5010 rv = C_Digest(session, data, data_size, digest, NULL);
5011 if (!ADBG_EXPECT_CK_RESULT(c, CKR_ARGUMENTS_BAD, rv))
5012 goto out;
5013
5014 rv = C_Digest(session, data, data_size, digest, &digest_size);
5015 if (!ADBG_EXPECT_CK_RESULT(c, CKR_OPERATION_NOT_INITIALIZED, rv))
5016 goto out;
5017
5018 Do_ADBG_EndSubCase(c, NULL);
5019
5020 Do_ADBG_BeginSubCase(c, "Test bad arguments - C_DigestKey with invalid key handle");
5021
5022 rv = C_CreateObject(session, digest_data_object,
5023 ARRAY_SIZE(digest_data_object), &key_handle);
5024 if (!ADBG_EXPECT_CK_OK(c, rv))
5025 goto out;
5026
5027 mechanism.mechanism = CKM_SHA256;
5028
5029 memset(data, 0xCC, sizeof(data));
5030 memset(digest, 0xCC, sizeof(digest));
5031 digest_size = sizeof(digest);
5032
5033 memcpy(data, digest_test_patterns[0].data,
5034 digest_test_patterns[0].data_size);
5035 data_size = digest_test_patterns[0].data_size;
5036
5037 rv = C_DigestInit(session, &mechanism);
5038 if (!ADBG_EXPECT_CK_OK(c, rv))
5039 goto out;
5040
5041 rv = C_DigestKey(session, 9999);
5042 if (!ADBG_EXPECT_CK_RESULT(c, CKR_KEY_HANDLE_INVALID, rv))
5043 goto out;
5044
5045 rv = C_DigestKey(session, key_handle);
5046 if (!ADBG_EXPECT_CK_RESULT(c, CKR_OPERATION_NOT_INITIALIZED, rv))
5047 goto out;
5048
5049 Do_ADBG_EndSubCase(c, NULL);
5050
5051 Do_ADBG_BeginSubCase(c, "Test bad arguments - C_DigestKey with non-secret key type");
5052
5053 mechanism.mechanism = CKM_SHA256;
5054
5055 memset(data, 0xCC, sizeof(data));
5056 memset(digest, 0xCC, sizeof(digest));
5057 digest_size = sizeof(digest);
5058
5059 memcpy(data, digest_test_patterns[0].data,
5060 digest_test_patterns[0].data_size);
5061 data_size = digest_test_patterns[0].data_size;
5062
5063 rv = C_DigestInit(session, &mechanism);
5064 if (!ADBG_EXPECT_CK_OK(c, rv))
5065 goto out;
5066
5067 rv = C_DigestKey(session, key_handle);
5068 if (!ADBG_EXPECT_CK_RESULT(c, CKR_KEY_INDIGESTIBLE, rv))
5069 goto out;
5070
5071 rv = C_DigestKey(session, key_handle);
5072 if (!ADBG_EXPECT_CK_RESULT(c, CKR_OPERATION_NOT_INITIALIZED, rv))
5073 goto out;
5074
5075 ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, key_handle));
5076 key_handle = CK_INVALID_HANDLE;
5077
5078out:
5079#ifdef OPENSSL_FOUND
5080 if (!ADBG_EXPECT_POINTER(c, NULL, mdctx)) {
5081 Do_ADBG_Log("Unexpected failure in openssl functions: %d",
5082 ret);
5083 EVP_MD_CTX_destroy(mdctx);
5084 }
5085#endif
5086
5087 Do_ADBG_EndSubCase(c, NULL);
5088
5089 if (logged_in)
5090 ADBG_EXPECT_CK_OK(c, C_Logout(session));
5091
5092 if (key_handle != CK_INVALID_HANDLE) {
5093 ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, key_handle));
5094 key_handle = CK_INVALID_HANDLE;
5095 }
5096
5097 ADBG_EXPECT_CK_OK(c, C_CloseSession(session));
5098
5099close_lib:
5100 ADBG_EXPECT_CK_OK(c, close_lib());
5101}
5102ADBG_CASE_DEFINE(pkcs11, 1018, xtest_pkcs11_test_1018,
5103 "PKCS11: Digest tests");
Vesa Jääskeläinena4ab9572021-04-07 12:50:06 +03005104
5105/**
5106 * 0:d=0 hl=2 l= 22 cons: SEQUENCE
5107 * 2:d=1 hl=2 l= 20 cons: SET
5108 * 4:d=2 hl=2 l= 18 cons: SEQUENCE
5109 * 6:d=3 hl=2 l= 3 prim: OBJECT :commonName
5110 * 11:d=3 hl=2 l= 11 prim: UTF8STRING :common name
5111 */
5112static uint8_t subject_common_name[] = {
5113 0x30, 0x16, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c,
5114 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x20, 0x6e, 0x61, 0x6d, 0x65
5115};
5116
5117/**
5118 * 0:d=0 hl=2 l= 8 prim: OBJECT :prime256v1
5119 */
5120static uint8_t ecdsa_nist_p256[] = {
5121 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03,
5122 0x01, 0x07
5123};
5124
5125/**
5126 * 0:d=0 hl=2 l= 5 prim: OBJECT :secp384r1
5127 */
5128static uint8_t ecdsa_nist_p384[] = {
5129 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22
5130};
5131
5132/**
5133 * 0:d=0 hl=2 l= 5 prim: OBJECT :secp521r1
5134 */
5135static uint8_t ecdsa_nist_p521[] = {
5136 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x23
5137};
5138
5139#define EC_SIGN_TEST(_test_name, _mecha, _data) \
5140 { \
5141 .test_name = _test_name, \
5142 .mecha = _mecha, \
5143 .data = _data, \
5144 .data_size = sizeof(_data) - 1, \
5145 }
5146
5147/* List of elliptic curve signing multi stage digest mechas */
5148static struct {
5149 const char *test_name;
5150 CK_MECHANISM_TYPE mecha;
5151 const void *data;
5152 CK_ULONG data_size;
5153} ec_sign_tests[] = {
5154 EC_SIGN_TEST("CKM_ECDSA_SHA1", CKM_ECDSA_SHA1, digest_test_pattern),
5155 EC_SIGN_TEST("CKM_ECDSA_SHA224", CKM_ECDSA_SHA224, digest_test_pattern),
5156 EC_SIGN_TEST("CKM_ECDSA_SHA256", CKM_ECDSA_SHA256, digest_test_pattern),
5157 EC_SIGN_TEST("CKM_ECDSA_SHA384", CKM_ECDSA_SHA384, digest_test_pattern),
5158 EC_SIGN_TEST("CKM_ECDSA_SHA512", CKM_ECDSA_SHA512, digest_test_pattern),
5159};
5160
5161static int test_ec_operations(ADBG_Case_t *c, CK_SESSION_HANDLE session,
5162 const char *curve_name, uint8_t *curve,
5163 size_t curve_size)
5164{
5165 CK_RV rv = CKR_GENERAL_ERROR;
5166
5167 CK_OBJECT_HANDLE public_key = CK_INVALID_HANDLE;
5168 CK_OBJECT_HANDLE private_key = CK_INVALID_HANDLE;
5169
5170 CK_MECHANISM mechanism = {
5171 CKM_EC_KEY_PAIR_GEN, NULL, 0
5172 };
5173 CK_MECHANISM sign_mechanism = {
5174 CKM_ECDSA, NULL, 0
5175 };
5176 CK_BYTE id[] = { 123 };
5177
5178 CK_ATTRIBUTE public_key_template[] = {
5179 { CKA_ENCRYPT, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
5180 { CKA_VERIFY, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5181 { CKA_WRAP, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
5182 { CKA_EC_PARAMS, ecdsa_nist_p256, sizeof(ecdsa_nist_p256) }
5183 };
5184
5185 CK_ATTRIBUTE private_key_template[] = {
5186 { CKA_TOKEN, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
5187 { CKA_PRIVATE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5188 { CKA_SUBJECT, subject_common_name,
5189 sizeof(subject_common_name) },
5190 { CKA_ID, id, sizeof(id) },
5191 { CKA_SENSITIVE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5192 { CKA_DECRYPT, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
5193 { CKA_SIGN, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5194 { CKA_UNWRAP, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) }
5195 };
5196
5197 CK_OBJECT_CLASS g_class = 0;
5198 CK_KEY_TYPE g_key_type = 0;
5199 CK_BYTE g_id[32] = { 0 };
5200 CK_DATE g_start_date = { 0 };
5201 CK_DATE g_end_date = { 0 };
5202 CK_BBOOL g_derive = CK_FALSE;
5203 CK_BBOOL g_local = CK_FALSE;
5204 CK_MECHANISM_TYPE g_keygen_mecha = 0;
5205 CK_BYTE g_subject[64] = { 0 };
5206 CK_BBOOL g_encrypt = CK_FALSE;
5207 CK_BBOOL g_verify = CK_FALSE;
5208 CK_BBOOL g_verify_recover = CK_FALSE;
5209 CK_BBOOL g_wrap = CK_FALSE;
5210 CK_BBOOL g_trusted = CK_FALSE;
5211 CK_BYTE g_public_key_info[1024] = { 0 };
5212 CK_BBOOL g_sensitive = CK_FALSE;
5213 CK_BBOOL g_decrypt = CK_FALSE;
5214 CK_BBOOL g_sign = CK_FALSE;
5215 CK_BBOOL g_sign_recover = CK_FALSE;
5216 CK_BBOOL g_unwrap = CK_FALSE;
5217 CK_BBOOL g_extract = CK_FALSE;
5218 CK_BBOOL g_asensitive = CK_FALSE;
5219 CK_BBOOL g_nextract = CK_FALSE;
5220 CK_BBOOL g_wrap_with_trusted = CK_FALSE;
5221 CK_BBOOL g_always_authenticate = CK_FALSE;
5222
5223 CK_ATTRIBUTE get_public_template[] = {
5224 { CKA_CLASS, &g_class, sizeof(CK_OBJECT_CLASS) },
5225 { CKA_KEY_TYPE, &g_key_type, sizeof(CK_KEY_TYPE) },
5226 { CKA_ID, g_id, sizeof(g_id) },
5227 { CKA_START_DATE, &g_start_date, sizeof(CK_DATE) },
5228 { CKA_END_DATE, &g_end_date, sizeof(CK_DATE) },
5229 { CKA_DERIVE, &g_derive, sizeof(CK_BBOOL) },
5230 { CKA_LOCAL, &g_local, sizeof(CK_BBOOL) },
5231 { CKA_KEY_GEN_MECHANISM, &g_keygen_mecha, sizeof(CK_MECHANISM_TYPE) },
5232 { CKA_SUBJECT, g_subject, sizeof(g_subject) },
5233 { CKA_ENCRYPT, &g_encrypt, sizeof(CK_BBOOL) },
5234 { CKA_VERIFY, &g_verify, sizeof(CK_BBOOL) },
5235 { CKA_VERIFY_RECOVER, &g_verify_recover, sizeof(CK_BBOOL) },
5236 { CKA_WRAP, &g_wrap, sizeof(CK_BBOOL) },
5237 { CKA_TRUSTED, &g_trusted, sizeof(CK_BBOOL) },
5238 { CKA_PUBLIC_KEY_INFO, g_public_key_info, sizeof(g_public_key_info) },
5239 };
5240
5241 CK_ATTRIBUTE get_private_template[] = {
5242 { CKA_CLASS, &g_class, sizeof(CK_OBJECT_CLASS) },
5243 { CKA_KEY_TYPE, &g_key_type, sizeof(CK_KEY_TYPE) },
5244 { CKA_ID, g_id, sizeof(g_id) },
5245 { CKA_START_DATE, &g_start_date, sizeof(CK_DATE) },
5246 { CKA_END_DATE, &g_end_date, sizeof(CK_DATE) },
5247 { CKA_DERIVE, &g_derive, sizeof(CK_BBOOL) },
5248 { CKA_LOCAL, &g_local, sizeof(CK_BBOOL) },
5249 { CKA_KEY_GEN_MECHANISM, &g_keygen_mecha, sizeof(CK_MECHANISM_TYPE) },
5250 { CKA_SUBJECT, g_subject, sizeof(g_subject) },
5251 { CKA_SENSITIVE, &g_sensitive, sizeof(CK_BBOOL) },
5252 { CKA_DECRYPT, &g_decrypt, sizeof(CK_BBOOL) },
5253 { CKA_SIGN, &g_sign, sizeof(CK_BBOOL) },
5254 { CKA_SIGN_RECOVER, &g_sign_recover, sizeof(CK_BBOOL) },
5255 { CKA_UNWRAP, &g_unwrap, sizeof(CK_BBOOL) },
5256 { CKA_EXTRACTABLE, &g_extract, sizeof(CK_BBOOL) },
5257 { CKA_ALWAYS_SENSITIVE, &g_asensitive, sizeof(CK_BBOOL) },
5258 { CKA_NEVER_EXTRACTABLE, &g_nextract, sizeof(CK_BBOOL) },
5259 { CKA_WRAP_WITH_TRUSTED, &g_wrap_with_trusted, sizeof(CK_BBOOL) },
5260 { CKA_ALWAYS_AUTHENTICATE, &g_always_authenticate, sizeof(CK_BBOOL) },
5261 { CKA_PUBLIC_KEY_INFO, g_public_key_info, sizeof(g_public_key_info) },
5262 };
5263
5264 uint8_t signature[512] = { 0 };
5265 CK_ULONG signature_len = 0;
5266
5267 size_t i = 0;
5268
5269 Do_ADBG_BeginSubCase(c, "%s: Generate key pair",
5270 curve_name);
5271
5272 public_key_template[3].pValue = curve;
5273 public_key_template[3].ulValueLen = curve_size;
5274
5275 rv = C_GenerateKeyPair(session, &mechanism, public_key_template,
5276 ARRAY_SIZE(public_key_template),
5277 private_key_template,
5278 ARRAY_SIZE(private_key_template),
5279 &public_key, &private_key);
5280 if (!ADBG_EXPECT_CK_OK(c, rv))
5281 goto err;
5282
5283 /* reset get public key template */
5284 memset(g_id, 0, sizeof(g_id));
5285 memset(g_subject, 0, sizeof(g_subject));
5286 memset(g_public_key_info, 0, sizeof(g_public_key_info));
5287 get_public_template[2].ulValueLen = sizeof(g_id);
5288 get_public_template[8].ulValueLen = sizeof(g_subject);
5289 get_public_template[14].ulValueLen = sizeof(g_public_key_info);
5290
5291 rv = C_GetAttributeValue(session, public_key, get_public_template,
5292 ARRAY_SIZE(get_public_template));
5293 if (!ADBG_EXPECT_CK_OK(c, rv) ||
5294 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_PUBLIC_KEY) ||
5295 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_key_type, ==, CKK_EC) ||
5296 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_derive, ==, CK_FALSE) ||
5297 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_TRUE) ||
5298 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_keygen_mecha, ==,
5299 CKM_EC_KEY_PAIR_GEN) ||
5300 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_encrypt, ==, CK_FALSE) ||
5301 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_verify, ==, CK_TRUE) ||
5302 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_verify_recover, ==, CK_FALSE) ||
5303 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_wrap, ==, CK_FALSE) ||
5304 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_trusted, ==, CK_FALSE))
5305 goto err_destr_obj;
5306
5307 /* reset get private key template */
5308 memset(g_id, 0, sizeof(g_id));
5309 memset(g_subject, 0, sizeof(g_subject));
5310 memset(g_public_key_info, 0, sizeof(g_public_key_info));
5311 get_private_template[2].ulValueLen = sizeof(g_id);
5312 get_private_template[8].ulValueLen = sizeof(g_subject);
5313 get_private_template[19].ulValueLen = sizeof(g_public_key_info);
5314
5315 rv = C_GetAttributeValue(session, private_key, get_private_template,
5316 ARRAY_SIZE(get_private_template));
5317 if (!ADBG_EXPECT_CK_OK(c, rv) ||
5318 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_PRIVATE_KEY) ||
5319 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_key_type, ==, CKK_EC) ||
5320 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_derive, ==, CK_FALSE) ||
5321 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_TRUE) ||
5322 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_keygen_mecha, ==,
5323 CKM_EC_KEY_PAIR_GEN) ||
5324 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sensitive, ==, CK_TRUE) ||
5325 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_decrypt, ==, CK_FALSE) ||
5326 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sign, ==, CK_TRUE) ||
5327 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sign_recover, ==, CK_FALSE) ||
5328 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_unwrap, ==, CK_FALSE) ||
5329 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_extract, ==, CK_FALSE) ||
5330 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_asensitive, ==, CK_TRUE) ||
5331 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_nextract, ==, CK_TRUE) ||
5332 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_wrap_with_trusted, ==, CK_FALSE) ||
5333 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_always_authenticate, ==, CK_FALSE))
5334 goto err_destr_obj;
5335
5336 Do_ADBG_EndSubCase(c, NULL);
5337
5338 Do_ADBG_BeginSubCase(c,
5339 "%s: Sign & verify tests - oneshot - CKM_ECDSA",
5340 curve_name);
5341
5342 sign_mechanism.mechanism = CKM_ECDSA;
5343 memset(signature, 0, sizeof(signature));
5344 signature_len = sizeof(signature);
5345
5346 rv = C_SignInit(session, &sign_mechanism, private_key);
5347 if (!ADBG_EXPECT_CK_OK(c, rv))
5348 goto err_destr_obj;
5349
5350 rv = C_Sign(session, (void *)digest_test_pattern_sha256,
5351 sizeof(digest_test_pattern_sha256), (void *)signature,
5352 &signature_len);
5353 if (!ADBG_EXPECT_CK_OK(c, rv))
5354 goto err_destr_obj;
5355
5356 rv = C_VerifyInit(session, &sign_mechanism, public_key);
5357 if (!ADBG_EXPECT_CK_OK(c, rv))
5358 goto err_destr_obj;
5359
5360 rv = C_Verify(session, (void *)digest_test_pattern_sha256,
5361 sizeof(digest_test_pattern_sha256), (void *)signature,
5362 signature_len);
5363 if (!ADBG_EXPECT_CK_OK(c, rv))
5364 goto err_destr_obj;
5365
5366 Do_ADBG_EndSubCase(c, NULL);
5367
5368 for (i = 0; i < ARRAY_SIZE(ec_sign_tests); i++) {
5369 Do_ADBG_BeginSubCase(c, "%s: Sign & verify - oneshot - %s",
5370 curve_name, ec_sign_tests[i].test_name);
5371
5372 sign_mechanism.mechanism = ec_sign_tests[i].mecha;
5373 memset(signature, 0, sizeof(signature));
5374 signature_len = sizeof(signature);
5375
5376 rv = C_SignInit(session, &sign_mechanism, private_key);
5377 if (!ADBG_EXPECT_CK_OK(c, rv))
5378 goto err_destr_obj;
5379
5380 rv = C_Sign(session, (void *)ec_sign_tests[i].data,
5381 ec_sign_tests[i].data_size,
5382 (void *)signature, &signature_len);
5383 if (!ADBG_EXPECT_CK_OK(c, rv))
5384 goto err_destr_obj;
5385
5386 rv = C_VerifyInit(session, &sign_mechanism, public_key);
5387 if (!ADBG_EXPECT_CK_OK(c, rv))
5388 goto err_destr_obj;
5389
5390 rv = C_Verify(session, (void *)ec_sign_tests[i].data,
5391 ec_sign_tests[i].data_size,
5392 (void *)signature, signature_len);
5393 if (!ADBG_EXPECT_CK_OK(c, rv))
5394 goto err_destr_obj;
5395
5396 Do_ADBG_EndSubCase(c, NULL);
5397 }
5398
5399 Do_ADBG_BeginSubCase(c, "%s: Destroy keys", curve_name);
5400
5401 rv = C_DestroyObject(session, private_key);
5402 if (!ADBG_EXPECT_CK_OK(c, rv))
5403 goto err_destr_obj;
5404
5405 rv = C_DestroyObject(session, public_key);
5406 if (!ADBG_EXPECT_CK_OK(c, rv))
5407 goto err;
5408
5409 Do_ADBG_EndSubCase(c, NULL);
5410
5411 return 1;
5412
5413err_destr_obj:
5414 ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, private_key));
5415 ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, public_key));
5416err:
5417 Do_ADBG_EndSubCase(c, NULL);
5418
5419 return 0;
5420}
5421
5422static void xtest_pkcs11_test_1019(ADBG_Case_t *c)
5423{
5424 CK_RV rv = CKR_GENERAL_ERROR;
5425 CK_SLOT_ID slot = 0;
5426 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
5427 CK_FLAGS session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
5428 int ret = 0;
5429
5430 rv = init_lib_and_find_token_slot(&slot);
5431 if (!ADBG_EXPECT_CK_OK(c, rv))
5432 return;
5433
5434 rv = init_test_token(slot);
5435 if (!ADBG_EXPECT_CK_OK(c, rv))
5436 goto close_lib;
5437
5438 rv = init_user_test_token(slot);
5439 if (!ADBG_EXPECT_CK_OK(c, rv))
5440 goto close_lib;
5441
5442 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
5443 if (!ADBG_EXPECT_CK_OK(c, rv))
5444 goto close_lib;
5445
5446 /* Login to Test Token */
5447 rv = C_Login(session, CKU_USER, test_token_user_pin,
5448 sizeof(test_token_user_pin));
5449 if (!ADBG_EXPECT_CK_OK(c, rv))
5450 goto out;
5451
5452 ret = test_ec_operations(c, session, "P-256", ecdsa_nist_p256,
5453 sizeof(ecdsa_nist_p256));
5454 if (!ret)
5455 goto out;
5456 ret = test_ec_operations(c, session, "P-384", ecdsa_nist_p384,
5457 sizeof(ecdsa_nist_p384));
5458 if (!ret)
5459 goto out;
5460
5461 if (level > 0) {
5462 ret = test_ec_operations(c, session, "P-521", ecdsa_nist_p521,
5463 sizeof(ecdsa_nist_p521));
5464 if (!ret)
5465 goto out;
5466 }
5467out:
5468 ADBG_EXPECT_CK_OK(c, C_CloseSession(session));
5469close_lib:
5470 ADBG_EXPECT_CK_OK(c, close_lib());
5471}
5472ADBG_CASE_DEFINE(pkcs11, 1019, xtest_pkcs11_test_1019,
5473 "PKCS11: Elliptic Curve key generation and signing");
Ruchika Guptaf2eb88a2021-03-22 19:38:11 +05305474
5475#define WRAPPED_TEST_KEY_SIZE 48
5476
5477static void xtest_pkcs11_test_1020(ADBG_Case_t *c)
5478{
5479 CK_RV rv = CKR_GENERAL_ERROR;
5480 CK_SLOT_ID slot = 0;
5481 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
5482 CK_FLAGS session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
5483 CK_OBJECT_HANDLE wrapping_key1 = CK_INVALID_HANDLE;
5484 CK_OBJECT_HANDLE wrapping_key2 = CK_INVALID_HANDLE;
5485 CK_OBJECT_HANDLE wrapping_key_inv = CK_INVALID_HANDLE;
5486 CK_OBJECT_HANDLE key = CK_INVALID_HANDLE;
5487 CK_OBJECT_HANDLE key_sz24 = CK_INVALID_HANDLE;
5488 CK_OBJECT_HANDLE key_sens = CK_INVALID_HANDLE;
5489 CK_OBJECT_HANDLE key_inv = CK_INVALID_HANDLE;
5490 CK_OBJECT_HANDLE unwrapped_key = CK_INVALID_HANDLE;
5491 CK_ATTRIBUTE set_w_unw_template[] = {
5492 { CKA_WRAP, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5493 { CKA_UNWRAP, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5494 };
5495 CK_ATTRIBUTE set_wwt_template[] = {
5496 { CKA_WRAP_WITH_TRUSTED, &(CK_BBOOL){ CK_TRUE },
5497 sizeof(CK_BBOOL) },
5498 };
5499 CK_ATTRIBUTE set_trusted_template[] = {
5500 { CKA_TRUSTED, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5501 };
5502 CK_ATTRIBUTE wrap_template[] = {
5503 { CKA_SENSITIVE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5504 };
5505 CK_ATTRIBUTE unwrap_template[] = {
5506 { CKA_SENSITIVE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5507 };
5508 CK_ATTRIBUTE wrapping_key_template[] = {
5509 { CKA_VALUE_LEN, &(CK_ULONG){ 16 }, sizeof(CK_ULONG) },
5510 { CKA_WRAP, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5511 { CKA_UNWRAP, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5512 { CKA_SENSITIVE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5513 { CKA_EXTRACTABLE, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
5514 };
5515 CK_ATTRIBUTE wrapping_key_temp_w_indirect[] = {
5516 { CKA_VALUE_LEN, &(CK_ULONG){ 16 }, sizeof(CK_ULONG) },
5517 { CKA_WRAP, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5518 { CKA_UNWRAP, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5519 { CKA_WRAP_TEMPLATE, &wrap_template, sizeof(wrap_template) },
5520 { CKA_UNWRAP_TEMPLATE, &unwrap_template,
5521 sizeof(unwrap_template) },
5522 };
5523 CK_ATTRIBUTE unwrap_template2[] = {
5524 { CKA_CLASS, &(CK_OBJECT_CLASS){ CKO_SECRET_KEY },
5525 sizeof(CK_OBJECT_CLASS) },
5526 { CKA_KEY_TYPE, &(CK_KEY_TYPE){ CKK_AES }, sizeof(CK_KEY_TYPE) },
5527 { CKA_TOKEN, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5528 { CKA_EXTRACTABLE, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
5529 { CKA_VALUE_LEN, &(CK_ULONG){ 16 }, sizeof(CK_ULONG) },
5530 };
5531 CK_ATTRIBUTE wrapping_key_temp_w_indirect2[] = {
5532 { CKA_VALUE_LEN, &(CK_ULONG){ 16 }, sizeof(CK_ULONG) },
5533 { CKA_WRAP, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5534 { CKA_UNWRAP, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5535 { CKA_UNWRAP_TEMPLATE, &unwrap_template2,
5536 sizeof(unwrap_template2) },
5537 };
5538 CK_ATTRIBUTE wrapping_key_template_inv1[] = {
5539 { CKA_VALUE_LEN, &(CK_ULONG){ 16 }, sizeof(CK_ULONG) },
5540 { CKA_WRAP, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
5541 };
5542 CK_ATTRIBUTE key_template[] = {
5543 { CKA_VALUE_LEN, &(CK_ULONG){ 16 }, sizeof(CK_ULONG) },
5544 { CKA_ENCRYPT, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5545 { CKA_DECRYPT, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5546 { CKA_EXTRACTABLE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5547 };
5548 CK_ATTRIBUTE key_template_sens[] = {
5549 { CKA_VALUE_LEN, &(CK_ULONG){ 16 }, sizeof(CK_ULONG) },
5550 { CKA_EXTRACTABLE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5551 { CKA_SENSITIVE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5552 };
5553 CK_ATTRIBUTE key_template_inv1[] = {
5554 { CKA_VALUE_LEN, &(CK_ULONG){ 16 }, sizeof(CK_ULONG) },
5555 { CKA_EXTRACTABLE, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
5556 };
5557 CK_ATTRIBUTE key_sz24_template[] = {
5558 { CKA_VALUE_LEN, &(CK_ULONG){ 24 }, sizeof(CK_ULONG) },
5559 { CKA_EXTRACTABLE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5560 };
5561 CK_ATTRIBUTE new_key_template[] = {
5562 { CKA_CLASS, &(CK_OBJECT_CLASS){ CKO_SECRET_KEY },
5563 sizeof(CK_OBJECT_CLASS) },
5564 { CKA_KEY_TYPE, &(CK_KEY_TYPE){ CKK_GENERIC_SECRET },
5565 sizeof(CK_KEY_TYPE) },
5566 { CKA_ENCRYPT, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5567 { CKA_DECRYPT, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5568 { CKA_EXTRACTABLE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5569 { CKA_SENSITIVE, &(CK_BBOOL){ CK_FALSE}, sizeof(CK_BBOOL) },
5570 };
5571 CK_ATTRIBUTE new_key_template_sens[] = {
5572 { CKA_CLASS, &(CK_OBJECT_CLASS){ CKO_SECRET_KEY },
5573 sizeof(CK_OBJECT_CLASS) },
5574 { CKA_KEY_TYPE, &(CK_KEY_TYPE){ CKK_AES }, sizeof(CK_KEY_TYPE) },
5575 { CKA_EXTRACTABLE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5576 { CKA_SENSITIVE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5577 };
5578 CK_ATTRIBUTE new_key_template2[] = {
5579 { CKA_DERIVE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5580 };
5581 CK_ATTRIBUTE new_key_template3[] = {
5582 { CKA_VALUE_LEN, &(CK_ULONG){ 16 }, sizeof(CK_ULONG) },
5583 { CKA_PRIVATE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5584 };
5585 CK_ATTRIBUTE new_key_template4[] = {
5586 { CKA_CLASS, &(CK_OBJECT_CLASS){ CKO_SECRET_KEY },
5587 sizeof(CK_OBJECT_CLASS) },
5588 { CKA_KEY_TYPE, &(CK_KEY_TYPE){ CKK_GENERIC_SECRET },
5589 sizeof(CK_KEY_TYPE) },
5590 { CKA_PRIVATE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5591 };
5592 CK_BBOOL g_extract = CK_FALSE;
5593 CK_BBOOL g_sensitive = CK_TRUE;
5594 CK_BBOOL g_nextract = CK_TRUE;
5595 CK_BBOOL g_asensitive = CK_TRUE;
5596 CK_BBOOL g_local = CK_TRUE;
5597 CK_BBOOL g_token = CK_FALSE;
5598 CK_BBOOL g_derive = CK_FALSE;
5599 CK_OBJECT_CLASS g_class = CKO_VENDOR_DEFINED;
5600 CK_KEY_TYPE g_key_type = CKK_VENDOR_DEFINED;
5601 uint8_t g_val[WRAPPED_TEST_KEY_SIZE] = { 0 };
5602 CK_ULONG key_len = 0;
5603 uint8_t g_unwrapped_val[WRAPPED_TEST_KEY_SIZE] = { 0 };
5604 CK_ULONG unwrapped_key_len = 0;
5605 /* Keep last attribute as CKA_VALUE */
5606 CK_ATTRIBUTE get_template_unwrapped[] = {
5607 { CKA_CLASS, &g_class, sizeof(CK_OBJECT_CLASS) },
5608 { CKA_KEY_TYPE, &g_key_type, sizeof(CK_KEY_TYPE) },
5609 { CKA_EXTRACTABLE, &g_extract, sizeof(CK_BBOOL) },
5610 { CKA_SENSITIVE, &g_sensitive, sizeof(CK_BBOOL) },
5611 { CKA_NEVER_EXTRACTABLE, &g_nextract, sizeof(CK_BBOOL) },
5612 { CKA_ALWAYS_SENSITIVE, &g_asensitive, sizeof(CK_BBOOL) },
5613 { CKA_LOCAL, &g_local, sizeof(CK_BBOOL) },
5614 { CKA_TOKEN, &g_token, sizeof(CK_BBOOL) },
5615 { CKA_DERIVE, &g_derive, sizeof(CK_BBOOL) },
5616 { CKA_VALUE_LEN, &unwrapped_key_len,
5617 sizeof(unwrapped_key_len) },
5618 { CKA_VALUE, g_unwrapped_val, sizeof(g_unwrapped_val) },
5619 };
5620 CK_ATTRIBUTE get_template[] = {
5621 { CKA_VALUE_LEN, &key_len, sizeof(key_len) },
5622 { CKA_VALUE, g_val, sizeof(g_val) },
5623 };
5624 uint8_t buf[WRAPPED_TEST_KEY_SIZE] = { 0 };
5625 CK_ULONG size = 0;
5626
5627 rv = init_lib_and_find_token_slot(&slot);
5628 if (!ADBG_EXPECT_CK_OK(c, rv))
5629 return;
5630
5631 rv = init_test_token(slot);
5632 if (!ADBG_EXPECT_CK_OK(c, rv))
5633 goto close_lib;
5634
5635 rv = init_user_test_token(slot);
5636 if (!ADBG_EXPECT_CK_OK(c, rv))
5637 goto close_lib;
5638
5639 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
5640 if (!ADBG_EXPECT_CK_OK(c, rv))
5641 goto close_lib;
5642
5643 /* Wrapping Key - AES Key */
5644 rv = C_GenerateKey(session, &cktest_aes_keygen_mechanism,
5645 wrapping_key_template,
5646 ARRAY_SIZE(wrapping_key_template), &wrapping_key1);
5647 if (!ADBG_EXPECT_CK_OK(c, rv))
5648 goto close_session;
5649
5650 /* Key to be wrapped - AES key */
5651 rv = C_GenerateKey(session, &cktest_aes_keygen_mechanism,
5652 key_template, ARRAY_SIZE(key_template),
5653 &key);
5654 if (!ADBG_EXPECT_CK_OK(c, rv))
5655 goto close_session;
5656
5657 Do_ADBG_BeginSubCase(c, "Test key wrap with AES ECB");
5658
5659 /*
5660 * Test NULL buffer and NULL out_size to verify bad argument processing
5661 */
5662 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1, key,
5663 NULL, NULL);
5664 if (!ADBG_EXPECT_CK_RESULT(c, CKR_ARGUMENTS_BAD, rv))
5665 goto out;
5666
5667 /*
5668 * Test NULL buffer case with size as 0 to get the out_size
5669 */
5670 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1, key,
5671 NULL, &size);
5672 if (!ADBG_EXPECT_CK_OK(c, rv) ||
5673 !ADBG_EXPECT_COMPARE_UNSIGNED(c, size, <=, sizeof(buf)))
5674 goto out;
5675
5676 /*
5677 * Test NULL buffer case with size non zero size to get the out_size
5678 */
5679 size = 1;
5680 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1, key,
5681 NULL, &size);
5682 if (!ADBG_EXPECT_CK_OK(c, rv) ||
5683 !ADBG_EXPECT_COMPARE_UNSIGNED(c, size, <=, sizeof(buf)))
5684 goto out;
5685
5686 /* Test short buffer */
5687 size = 12;
5688 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1, key,
5689 buf, &size);
5690 if (!ADBG_EXPECT_CK_RESULT(c, CKR_BUFFER_TOO_SMALL, rv) ||
5691 !ADBG_EXPECT_COMPARE_UNSIGNED(c, size, <=, sizeof(buf)))
5692 goto out;
5693
5694 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1, key,
5695 buf, &size);
5696 if (!ADBG_EXPECT_CK_OK(c, rv))
5697 goto out;
5698
5699 /*
5700 * Get the size of the original key which was wrapped in key_len.
5701 * This will be compared to the length of the key after unwrapping.
5702 */
5703 rv = C_GetAttributeValue(session, key, get_template,
5704 ARRAY_SIZE(get_template));
5705 if (!ADBG_EXPECT_CK_OK(c, rv))
5706 goto out;
5707
5708 Do_ADBG_EndSubCase(c, NULL);
5709
5710 Do_ADBG_BeginSubCase(c, "Test key unwrap with AES ECB");
5711
5712 rv = C_UnwrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1, buf,
5713 size, new_key_template, ARRAY_SIZE(new_key_template),
5714 &unwrapped_key);
5715 if (!ADBG_EXPECT_CK_OK(c, rv))
5716 goto out;
5717
5718 /*
5719 * The key created after unwrapping should have CKA_LOCAL = FALSE,
5720 * CKA_ALWAYS_SENSITIVE and CKA_NEVER_EXTRACTABLE as FALSE.
5721 * Default value of CKA_EXTRACTABLE if not specified in the template
5722 * is TRUE. We have deliberately set CKA_SENSITIVE to false for
5723 * both original key and unwrapped_key. This is done to be able to
5724 * extract the value of keys and compare them. This is done mainly
5725 * for testing. In actual examples, we expect CKA_SENSITIVE of keys
5726 * to be wrapped to be TRUE.
5727 */
5728 rv = C_GetAttributeValue(session, unwrapped_key, get_template_unwrapped,
5729 ARRAY_SIZE(get_template_unwrapped));
5730 if (!ADBG_EXPECT_CK_OK(c, rv) ||
5731 !ADBG_EXPECT_BUFFER(c, g_unwrapped_val, unwrapped_key_len, g_val,
5732 key_len) ||
5733 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_SECRET_KEY) ||
5734 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_key_type, ==,
5735 CKK_GENERIC_SECRET) ||
5736 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_FALSE) ||
5737 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sensitive, ==, CK_FALSE) ||
5738 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_extract, ==, CK_TRUE) ||
5739 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_asensitive, ==, CK_FALSE) ||
5740 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_nextract, ==, CK_FALSE))
5741 goto out;
5742
5743 rv = C_DestroyObject(session, unwrapped_key);
5744 if (!ADBG_EXPECT_CK_OK(c, rv))
5745 goto out;
5746
5747 Do_ADBG_EndSubCase(c, NULL);
5748
5749 Do_ADBG_BeginSubCase(c, "Invalid UnWrap cases");
5750
5751 /* Failure when unwrapping as a private session key */
5752 rv = C_UnwrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1, buf,
5753 size, new_key_template4, ARRAY_SIZE(new_key_template4),
5754 &unwrapped_key);
5755 if (!ADBG_EXPECT_CK_RESULT(c, CKR_USER_NOT_LOGGED_IN, rv))
5756 goto out;
5757
5758 /* Provide incomplete template */
5759 rv = C_UnwrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1, buf,
5760 size, new_key_template2, ARRAY_SIZE(new_key_template2),
5761 &unwrapped_key);
5762
5763 /*
5764 * The error code can also be CKR_TEMPLATE_INCOMPLETE. The
5765 * current implementation returns CKR_TEMPLATE_INCONSISTENT
5766 */
5767 if (!ADBG_EXPECT_TRUE(c, rv == CKR_TEMPLATE_INCOMPLETE ||
5768 rv == CKR_TEMPLATE_INCONSISTENT))
5769 goto out;
5770
5771 /* Try unwrapping with a key without CKA_UNWRAP */
5772 rv = C_UnwrapKey(session, &cktest_aes_ecb_mechanism, key, buf, size,
5773 new_key_template, ARRAY_SIZE(new_key_template),
5774 &unwrapped_key);
5775 if (!ADBG_EXPECT_CK_RESULT(c, CKR_UNWRAPPING_KEY_TYPE_INCONSISTENT, rv))
5776 goto out;
5777
5778 Do_ADBG_EndSubCase(c, NULL);
5779
5780 Do_ADBG_BeginSubCase(c, "Invalid Wrap cases");
5781
5782 rv = C_GenerateKey(session, &cktest_aes_keygen_mechanism,
5783 wrapping_key_template_inv1,
5784 ARRAY_SIZE(wrapping_key_template_inv1),
5785 &wrapping_key_inv);
5786 if (!ADBG_EXPECT_CK_OK(c, rv))
5787 goto out;
5788
5789 /* Wrapping key used without CKA_WRAP set */
5790 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key_inv,
5791 key, buf, &size);
5792 if (!ADBG_EXPECT_CK_RESULT(c, CKR_WRAPPING_KEY_TYPE_INCONSISTENT, rv))
5793 goto out;
5794
5795 rv = C_DestroyObject(session, wrapping_key_inv);
5796 ADBG_EXPECT_CK_OK(c, rv);
5797
5798 /* Use invalid wrapping key handle */
5799 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key_inv,
5800 key, buf, &size);
5801 if (!ADBG_EXPECT_CK_RESULT(c, CKR_WRAPPING_KEY_HANDLE_INVALID, rv))
5802 goto out;
5803
5804 /* CKA_EXTRACTABLE attribute of the key to be wrapped is CKA_FALSE */
5805 rv = C_GenerateKey(session, &cktest_aes_keygen_mechanism,
5806 key_template_inv1, ARRAY_SIZE(key_template_inv1),
5807 &key_inv);
5808 if (!ADBG_EXPECT_CK_OK(c, rv))
5809 goto out;
5810
5811 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1,
5812 key_inv, buf, &size);
5813 if (!ADBG_EXPECT_CK_RESULT(c, CKR_KEY_UNEXTRACTABLE, rv))
5814 goto out;
5815
5816 rv = C_DestroyObject(session, key_inv);
5817 ADBG_EXPECT_CK_OK(c, rv);
5818
5819 /* Use invalid key handle */
5820 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1,
5821 key_inv, buf, &size);
5822 if (!ADBG_EXPECT_CK_RESULT(c, CKR_KEY_HANDLE_INVALID, rv))
5823 goto out;
5824
5825 /* Try wrapping the wrapping key */
5826 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1,
5827 wrapping_key1, buf, &size);
5828 if (!ADBG_EXPECT_CK_RESULT(c, CKR_WRAPPING_KEY_HANDLE_INVALID, rv))
5829 goto out;
5830
5831 /* Use invalid mechanism */
5832 rv = C_WrapKey(session, &cktest_hmac_md5_mechanism, wrapping_key1, key,
5833 buf, &size);
5834 if (!ADBG_EXPECT_CK_RESULT(c, CKR_MECHANISM_INVALID, rv))
5835 goto out;
5836
5837 /* Try wrapping when an operation is already active */
5838 rv = C_EncryptInit(session, &cktest_aes_cbc_mechanism, key);
5839 if (!ADBG_EXPECT_CK_OK(c, rv))
5840 goto out;
5841
5842 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1, key,
5843 buf, &size);
5844 if (!ADBG_EXPECT_CK_RESULT(c, CKR_OPERATION_ACTIVE, rv))
5845 goto out;
5846
5847 rv = C_EncryptFinal(session, NULL, NULL);
5848 /* Only check that the operation is no more active */
5849 if (!ADBG_EXPECT_TRUE(c, rv != CKR_BUFFER_TOO_SMALL))
5850 goto out;
5851
5852 /*
5853 * Try wrapping using CKK_GENERIC_SECRET when mechanism used is
5854 * AES_ECB. Generate a secret key object in rw session.
5855 */
5856 rv = C_GenerateKey(session, &cktest_gensecret_keygen_mechanism,
5857 cktest_generate_gensecret_object_valid1,
5858 ARRAY_SIZE(cktest_generate_gensecret_object_valid1),
5859 &key_inv);
5860 if (!ADBG_EXPECT_CK_OK(c, rv))
5861 goto out;
5862
5863 /* Make the Generic secret key wrapping/unwrapping key */
5864 rv = C_SetAttributeValue(session, key_inv, set_w_unw_template,
5865 ARRAY_SIZE(set_w_unw_template));
5866 if (!ADBG_EXPECT_CK_OK(c, rv))
5867 goto out;
5868
5869 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, key_inv, key, buf,
5870 &size);
5871 if (!ADBG_EXPECT_CK_RESULT(c, CKR_WRAPPING_KEY_TYPE_INCONSISTENT, rv))
5872 goto out;
5873
5874 rv = C_DestroyObject(session, key_inv);
5875 ADBG_EXPECT_CK_OK(c, rv);
5876
5877 Do_ADBG_EndSubCase(c, NULL);
5878
5879 Do_ADBG_BeginSubCase(c, "Wrap with different length key");
5880
5881 /* Generate Key of size 192 bits */
5882 rv = C_GenerateKey(session, &cktest_aes_keygen_mechanism,
5883 key_sz24_template, ARRAY_SIZE(key_sz24_template),
5884 &key_sz24);
5885 if (!ADBG_EXPECT_CK_OK(c, rv))
5886 goto out;
5887
5888 size = 0;
5889 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1,
5890 key_sz24, buf, &size);
5891 if (!ADBG_EXPECT_CK_RESULT(c, CKR_BUFFER_TOO_SMALL, rv) ||
5892 !ADBG_EXPECT_COMPARE_UNSIGNED(c, size, ==, 32))
5893 goto out;
5894
5895 size = 24;
5896 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1,
5897 key_sz24, buf, &size);
5898 if (!ADBG_EXPECT_CK_RESULT(c, CKR_BUFFER_TOO_SMALL, rv) ||
5899 !ADBG_EXPECT_COMPARE_UNSIGNED(c, size, ==, 32))
5900 goto out;
5901
5902 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1,
5903 key_sz24, buf, &size);
5904 if (!ADBG_EXPECT_CK_OK(c, rv) ||
5905 !ADBG_EXPECT_COMPARE_UNSIGNED(c, size, ==, 32))
5906 goto out;
5907
5908 Do_ADBG_EndSubCase(c, NULL);
5909
5910 Do_ADBG_BeginSubCase(c, "Test Wrap/Unwrap with indirect template");
5911
5912 /* Wrapping Key with indirect templates - AES Key */
5913 rv = C_GenerateKey(session, &cktest_aes_keygen_mechanism,
5914 wrapping_key_temp_w_indirect,
5915 ARRAY_SIZE(wrapping_key_temp_w_indirect),
5916 &wrapping_key2);
5917 if (!ADBG_EXPECT_CK_OK(c, rv))
5918 goto out;
5919
5920 /*
5921 * Attribute mismatch with CKA_WRAP_TEMPLATE.
5922 * Error expected when wrapping a key whose template doesn't match with
5923 * the CKA_WRAP_TEMPLATE in the wrapping_key. In this example, the
5924 * CKA_WRAP_TEMPLATE expects CKA_SENSITIVE of the key to be wrapped to
5925 * be TRUE which is not the case here.
5926 */
5927 size = sizeof(buf);
5928 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key2, key,
5929 buf, &size);
5930 if (!ADBG_EXPECT_CK_RESULT(c, CKR_KEY_HANDLE_INVALID, rv))
5931 goto out;
5932
5933 /* Generate SENSITIVE Key */
5934 rv = C_GenerateKey(session, &cktest_aes_keygen_mechanism,
5935 key_template_sens, ARRAY_SIZE(key_template_sens),
5936 &key_sens);
5937 if (!ADBG_EXPECT_CK_OK(c, rv))
5938 goto out;
5939
5940 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key2,
5941 key_sens, buf, &size);
5942 if (!ADBG_EXPECT_CK_OK(c, rv))
5943 goto out;
5944
5945 /*
5946 * Unwrap to create key with SENSITIVE set as FALSE.
5947 * This should fail as indirect attribute CKA_UNWRAP_TEMPLATE restricts
5948 * creation of key with CKA_SENSITIVE as FALSE.
5949 */
5950 rv = C_UnwrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key2, buf,
5951 size, new_key_template, ARRAY_SIZE(new_key_template),
5952 &unwrapped_key);
5953 if (!ADBG_EXPECT_CK_RESULT(c, CKR_TEMPLATE_INCONSISTENT, rv))
5954 goto out;
5955
5956 /* Unwrap a wrapped sensitive key to create a SENSITIVE key */
5957 rv = C_UnwrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key2, buf,
5958 size, new_key_template_sens,
5959 ARRAY_SIZE(new_key_template_sens), &unwrapped_key);
5960 if (!ADBG_EXPECT_CK_OK(c, rv))
5961 goto out;
5962
5963 /*
5964 * Get the attributes of created. Skip last attribute in
5965 * get_template_wrapped as that is CKA_VALUE which would give an
5966 * error for a sensitive key
5967 */
5968 rv = C_GetAttributeValue(session, unwrapped_key, get_template_unwrapped,
5969 ARRAY_SIZE(get_template_unwrapped) - 1);
5970 if (!ADBG_EXPECT_CK_OK(c, rv) ||
5971 !ADBG_EXPECT_COMPARE_UNSIGNED(c, unwrapped_key_len, ==, key_len) ||
5972 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_SECRET_KEY) ||
5973 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_key_type, ==, CKK_AES) ||
5974 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_FALSE) ||
5975 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sensitive, ==, CK_TRUE) ||
5976 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_extract, ==, CK_TRUE) ||
5977 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_asensitive, ==, CK_FALSE) ||
5978 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_nextract, ==, CK_FALSE))
5979 goto out;
5980
5981 if (!ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, unwrapped_key)) ||
5982 !ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, wrapping_key2)) ||
5983 !ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, key_sens)))
5984 goto out;
5985
5986 /* Create wrapping key with indirect template specifying class & key */
5987 rv = C_GenerateKey(session, &cktest_aes_keygen_mechanism,
5988 wrapping_key_temp_w_indirect2,
5989 ARRAY_SIZE(wrapping_key_temp_w_indirect2),
5990 &wrapping_key2);
5991 if (!ADBG_EXPECT_CK_OK(c, rv))
5992 goto out;
5993
5994 size = sizeof(buf);
5995 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key2, key,
5996 buf, &size);
5997 if (!ADBG_EXPECT_CK_OK(c, rv))
5998 goto out;
5999
6000 /* Use minimal new key template just specifying attribute of key */
6001 rv = C_UnwrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key2, buf,
6002 size, new_key_template2, ARRAY_SIZE(new_key_template2),
6003 &unwrapped_key);
6004 if (!ADBG_EXPECT_CK_OK(c, rv))
6005 goto out;
6006
6007 rv = C_GetAttributeValue(session, unwrapped_key, get_template_unwrapped,
6008 ARRAY_SIZE(get_template_unwrapped) - 1);
6009
6010 /* Destroy created token object */
6011 if (!ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, unwrapped_key)))
6012 goto out;
6013
6014 if (!ADBG_EXPECT_CK_OK(c, rv) ||
6015 !ADBG_EXPECT_COMPARE_UNSIGNED(c, unwrapped_key_len, ==, key_len) ||
6016 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_SECRET_KEY) ||
6017 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_key_type, ==, CKK_AES) ||
6018 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_FALSE) ||
6019 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_token, ==, CK_TRUE) ||
6020 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_derive, ==, CK_TRUE) ||
6021 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sensitive, ==, CK_FALSE) ||
6022 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_extract, ==, CK_FALSE) ||
6023 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_asensitive, ==, CK_FALSE) ||
6024 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_nextract, ==, CK_FALSE))
6025 goto out;
6026
6027 /*
6028 * Unwrap with NULL template when CKA_UNWRAP_TEMPLATE has all
6029 * attributes to generate a key
6030 */
6031 rv = C_UnwrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key2, buf,
6032 size, NULL, 0, &unwrapped_key);
6033 if (!ADBG_EXPECT_CK_OK(c, rv))
6034 goto out;
6035
6036 rv = C_GetAttributeValue(session, unwrapped_key, get_template_unwrapped,
6037 ARRAY_SIZE(get_template_unwrapped) - 1);
6038
6039 /* Destroy created token object */
6040 if (!ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, unwrapped_key)))
6041 goto out;
6042
6043 if (!ADBG_EXPECT_CK_OK(c, rv) ||
6044 !ADBG_EXPECT_COMPARE_UNSIGNED(c, unwrapped_key_len, ==, key_len) ||
6045 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_SECRET_KEY) ||
6046 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_key_type, ==, CKK_AES) ||
6047 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_FALSE) ||
6048 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_token, ==, CK_TRUE) ||
6049 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_derive, ==, CK_FALSE) ||
6050 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sensitive, ==, CK_FALSE) ||
6051 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_extract, ==, CK_FALSE) ||
6052 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_asensitive, ==, CK_FALSE) ||
6053 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_nextract, ==, CK_FALSE)) {
6054 goto out;
6055 }
6056
6057 /* Unwrap and try create a Private token object */
6058 rv = C_UnwrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key2, buf,
6059 size, new_key_template3, ARRAY_SIZE(new_key_template3),
6060 &unwrapped_key);
6061 if (!ADBG_EXPECT_CK_RESULT(c, CKR_USER_NOT_LOGGED_IN, rv))
6062 goto out;
6063
6064 Do_ADBG_EndSubCase(c, NULL);
6065
6066 Do_ADBG_BeginSubCase(c, "Test usage of CKA_WRAP_WITH_TRUSTED");
6067
6068 /* Set Attribute WRAP_WITH_TRUSTED on the key */
6069 rv = C_SetAttributeValue(session, key, set_wwt_template,
6070 ARRAY_SIZE(set_wwt_template));
6071 if (!ADBG_EXPECT_CK_OK(c, rv))
6072 goto out;
6073
6074 /*
6075 * Try wrapping the key with attribute CKA_WRAP_WITH_TRUSTED with
6076 * normal wrapping key
6077 */
6078 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1, key,
6079 buf, &size);
6080 if (!ADBG_EXPECT_CK_RESULT(c, CKR_KEY_NOT_WRAPPABLE, rv))
6081 goto out;
6082
6083 /* Login as SO in RW session */
6084 rv = C_Login(session, CKU_SO, test_token_so_pin,
6085 sizeof(test_token_so_pin));
6086 if (!ADBG_EXPECT_CK_OK(c, rv))
6087 goto out;
6088
6089 rv = C_SetAttributeValue(session, wrapping_key1, set_trusted_template,
6090 ARRAY_SIZE(set_trusted_template));
6091 if (!ADBG_EXPECT_CK_OK(c, rv) ||
6092 !ADBG_EXPECT_CK_OK(c, C_Logout(session)))
6093 goto out;
6094
6095 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1, key,
6096 buf, &size);
6097 if (!ADBG_EXPECT_CK_OK(c, rv))
6098 goto out;
6099
6100out:
6101 Do_ADBG_EndSubCase(c, NULL);
6102close_session:
6103 ADBG_EXPECT_CK_OK(c, C_CloseSession(session));
6104
6105close_lib:
6106 ADBG_EXPECT_CK_OK(c, close_lib());
6107}
6108ADBG_CASE_DEFINE(pkcs11, 1020, xtest_pkcs11_test_1020,
6109 "PKCS11: AES Key Wrap/UnWrap tests");
Vesa Jääskeläinen7b482a02021-05-02 13:52:07 +03006110
6111#define RSA_SIGN_TEST(_test_name, _mecha, _data) \
6112 { \
6113 .test_name = _test_name, \
6114 .mecha = _mecha, \
6115 .data = _data, \
6116 .data_size = sizeof(_data) - 1, \
6117 }
6118
6119/* List of RSA PKCS signing multi stage digest mechanisms */
6120static struct {
6121 const char *test_name;
6122 CK_MECHANISM_TYPE mecha;
6123 const void *data;
6124 CK_ULONG data_size;
6125} rsa_pkcs_sign_tests[] = {
6126 RSA_SIGN_TEST("CKM_MD5_RSA_PKCS", CKM_MD5_RSA_PKCS,
6127 digest_test_pattern),
6128 RSA_SIGN_TEST("CKM_SHA1_RSA_PKCS", CKM_SHA1_RSA_PKCS,
6129 digest_test_pattern),
6130 RSA_SIGN_TEST("CKM_SHA224_RSA_PKCS", CKM_SHA224_RSA_PKCS,
6131 digest_test_pattern),
6132 RSA_SIGN_TEST("CKM_SHA256_RSA_PKCS", CKM_SHA256_RSA_PKCS,
6133 digest_test_pattern),
6134 RSA_SIGN_TEST("CKM_SHA384_RSA_PKCS", CKM_SHA384_RSA_PKCS,
6135 digest_test_pattern),
6136 RSA_SIGN_TEST("CKM_SHA512_RSA_PKCS", CKM_SHA512_RSA_PKCS,
6137 digest_test_pattern),
6138};
6139
6140static int test_rsa_pkcs_operations(ADBG_Case_t *c,
6141 CK_SESSION_HANDLE session,
6142 const char *rsa_name, uint32_t rsa_bits)
6143{
6144 CK_RV rv = CKR_GENERAL_ERROR;
6145
6146 CK_OBJECT_HANDLE public_key = CK_INVALID_HANDLE;
6147 CK_OBJECT_HANDLE private_key = CK_INVALID_HANDLE;
6148
6149 CK_MECHANISM mechanism = {
6150 CKM_RSA_PKCS_KEY_PAIR_GEN, NULL, 0
6151 };
6152 CK_MECHANISM sign_mechanism = {
6153 CKM_RSA_PKCS, NULL, 0
6154 };
6155 CK_ULONG modulus_bits = 0;
6156 CK_BYTE public_exponent[] = { 1, 0, 1 };
6157 CK_BYTE id[] = { 123 };
6158
6159 CK_ATTRIBUTE public_key_template[] = {
6160 { CKA_ENCRYPT, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
6161 { CKA_VERIFY, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
6162 { CKA_WRAP, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
6163 { CKA_MODULUS_BITS, &modulus_bits, sizeof(CK_ULONG) },
6164 { CKA_PUBLIC_EXPONENT, public_exponent,
6165 sizeof(public_exponent) }
6166 };
6167
6168 CK_ATTRIBUTE private_key_template[] = {
6169 { CKA_TOKEN, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
6170 { CKA_PRIVATE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
6171 { CKA_SUBJECT, subject_common_name,
6172 sizeof(subject_common_name) },
6173 { CKA_ID, id, sizeof(id) },
6174 { CKA_SENSITIVE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
6175 { CKA_DECRYPT, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
6176 { CKA_SIGN, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
6177 { CKA_UNWRAP, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) }
6178 };
6179
6180 CK_OBJECT_CLASS g_class = 0;
6181 CK_KEY_TYPE g_key_type = 0;
6182 CK_BYTE g_id[32] = { 0 };
6183 CK_DATE g_start_date = { 0 };
6184 CK_DATE g_end_date = { 0 };
6185 CK_BBOOL g_derive = CK_FALSE;
6186 CK_BBOOL g_local = CK_FALSE;
6187 CK_MECHANISM_TYPE g_keygen_mecha = 0;
6188 CK_BYTE g_subject[64] = { 0 };
6189 CK_BBOOL g_encrypt = CK_FALSE;
6190 CK_BBOOL g_verify = CK_FALSE;
6191 CK_BBOOL g_verify_recover = CK_FALSE;
6192 CK_BBOOL g_wrap = CK_FALSE;
6193 CK_BBOOL g_trusted = CK_FALSE;
6194 CK_BYTE g_public_key_info[1024] = { 0 };
6195 CK_BBOOL g_sensitive = CK_FALSE;
6196 CK_BBOOL g_decrypt = CK_FALSE;
6197 CK_BBOOL g_sign = CK_FALSE;
6198 CK_BBOOL g_sign_recover = CK_FALSE;
6199 CK_BBOOL g_unwrap = CK_FALSE;
6200 CK_BBOOL g_extract = CK_FALSE;
6201 CK_BBOOL g_asensitive = CK_FALSE;
6202 CK_BBOOL g_nextract = CK_FALSE;
6203 CK_BBOOL g_wrap_with_trusted = CK_FALSE;
6204 CK_BBOOL g_always_authenticate = CK_FALSE;
6205
6206 /* Note: Tests below expects specific order of elements */
6207 CK_ATTRIBUTE get_public_template[] = {
6208 { CKA_CLASS, &g_class, sizeof(CK_OBJECT_CLASS) },
6209 { CKA_KEY_TYPE, &g_key_type, sizeof(CK_KEY_TYPE) },
6210 { CKA_ID, g_id, sizeof(g_id) },
6211 { CKA_START_DATE, &g_start_date, sizeof(CK_DATE) },
6212 { CKA_END_DATE, &g_end_date, sizeof(CK_DATE) },
6213 { CKA_DERIVE, &g_derive, sizeof(CK_BBOOL) },
6214 { CKA_LOCAL, &g_local, sizeof(CK_BBOOL) },
6215 { CKA_KEY_GEN_MECHANISM, &g_keygen_mecha, sizeof(CK_MECHANISM_TYPE) },
6216 { CKA_SUBJECT, g_subject, sizeof(g_subject) },
6217 { CKA_ENCRYPT, &g_encrypt, sizeof(CK_BBOOL) },
6218 { CKA_VERIFY, &g_verify, sizeof(CK_BBOOL) },
6219 { CKA_VERIFY_RECOVER, &g_verify_recover, sizeof(CK_BBOOL) },
6220 { CKA_WRAP, &g_wrap, sizeof(CK_BBOOL) },
6221 { CKA_TRUSTED, &g_trusted, sizeof(CK_BBOOL) },
6222 { CKA_PUBLIC_KEY_INFO, g_public_key_info, sizeof(g_public_key_info) },
6223 };
6224
6225 /* Note: Tests below expects specific order of elements */
6226 CK_ATTRIBUTE get_private_template[] = {
6227 { CKA_CLASS, &g_class, sizeof(CK_OBJECT_CLASS) },
6228 { CKA_KEY_TYPE, &g_key_type, sizeof(CK_KEY_TYPE) },
6229 { CKA_ID, g_id, sizeof(g_id) },
6230 { CKA_START_DATE, &g_start_date, sizeof(CK_DATE) },
6231 { CKA_END_DATE, &g_end_date, sizeof(CK_DATE) },
6232 { CKA_DERIVE, &g_derive, sizeof(CK_BBOOL) },
6233 { CKA_LOCAL, &g_local, sizeof(CK_BBOOL) },
6234 { CKA_KEY_GEN_MECHANISM, &g_keygen_mecha, sizeof(CK_MECHANISM_TYPE) },
6235 { CKA_SUBJECT, g_subject, sizeof(g_subject) },
6236 { CKA_SENSITIVE, &g_sensitive, sizeof(CK_BBOOL) },
6237 { CKA_DECRYPT, &g_decrypt, sizeof(CK_BBOOL) },
6238 { CKA_SIGN, &g_sign, sizeof(CK_BBOOL) },
6239 { CKA_SIGN_RECOVER, &g_sign_recover, sizeof(CK_BBOOL) },
6240 { CKA_UNWRAP, &g_unwrap, sizeof(CK_BBOOL) },
6241 { CKA_EXTRACTABLE, &g_extract, sizeof(CK_BBOOL) },
6242 { CKA_ALWAYS_SENSITIVE, &g_asensitive, sizeof(CK_BBOOL) },
6243 { CKA_NEVER_EXTRACTABLE, &g_nextract, sizeof(CK_BBOOL) },
6244 { CKA_WRAP_WITH_TRUSTED, &g_wrap_with_trusted, sizeof(CK_BBOOL) },
6245 { CKA_ALWAYS_AUTHENTICATE, &g_always_authenticate, sizeof(CK_BBOOL) },
6246 { CKA_PUBLIC_KEY_INFO, g_public_key_info, sizeof(g_public_key_info) },
6247 };
6248
6249 uint8_t signature[512] = { 0 };
6250 CK_ULONG signature_len = 0;
6251
6252 size_t i = 0;
6253
6254 Do_ADBG_BeginSubCase(c, "%s: Generate key pair", rsa_name);
6255
6256 modulus_bits = rsa_bits;
6257
6258 rv = C_GenerateKeyPair(session, &mechanism, public_key_template,
6259 ARRAY_SIZE(public_key_template),
6260 private_key_template,
6261 ARRAY_SIZE(private_key_template),
6262 &public_key, &private_key);
6263 if (!ADBG_EXPECT_CK_OK(c, rv))
6264 goto err;
6265
6266 /* reset get public key template */
6267 memset(g_id, 0, sizeof(g_id));
6268 assert(get_public_template[2].type == CKA_ID);
6269 get_public_template[2].ulValueLen = sizeof(g_id);
6270
6271 memset(g_subject, 0, sizeof(g_subject));
6272 assert(get_public_template[8].type == CKA_SUBJECT);
6273 get_public_template[8].ulValueLen = sizeof(g_subject);
6274
6275 memset(g_public_key_info, 0, sizeof(g_public_key_info));
6276 assert(get_public_template[14].type == CKA_PUBLIC_KEY_INFO);
6277 get_public_template[14].ulValueLen = sizeof(g_public_key_info);
6278
6279 rv = C_GetAttributeValue(session, public_key, get_public_template,
6280 ARRAY_SIZE(get_public_template));
6281 if (!ADBG_EXPECT_CK_OK(c, rv) ||
6282 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_PUBLIC_KEY) ||
6283 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_key_type, ==, CKK_RSA) ||
6284 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_derive, ==, CK_FALSE) ||
6285 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_TRUE) ||
6286 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_keygen_mecha, ==,
6287 CKM_RSA_PKCS_KEY_PAIR_GEN) ||
6288 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_encrypt, ==, CK_FALSE) ||
6289 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_verify, ==, CK_TRUE) ||
6290 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_verify_recover, ==, CK_FALSE) ||
6291 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_wrap, ==, CK_FALSE) ||
6292 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_trusted, ==, CK_FALSE))
6293 goto err_destr_obj;
6294
6295 /* reset get private key template */
6296 memset(g_id, 0, sizeof(g_id));
6297 assert(get_private_template[2].type == CKA_ID);
6298 get_private_template[2].ulValueLen = sizeof(g_id);
6299
6300 memset(g_subject, 0, sizeof(g_subject));
6301 assert(get_private_template[8].type == CKA_SUBJECT);
6302 get_private_template[8].ulValueLen = sizeof(g_subject);
6303
6304 memset(g_public_key_info, 0, sizeof(g_public_key_info));
6305 assert(get_private_template[19].type == CKA_PUBLIC_KEY_INFO);
6306 get_private_template[19].ulValueLen = sizeof(g_public_key_info);
6307
6308 rv = C_GetAttributeValue(session, private_key, get_private_template,
6309 ARRAY_SIZE(get_private_template));
6310 if (!ADBG_EXPECT_CK_OK(c, rv) ||
6311 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_PRIVATE_KEY) ||
6312 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_key_type, ==, CKK_RSA) ||
6313 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_derive, ==, CK_FALSE) ||
6314 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_TRUE) ||
6315 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_keygen_mecha, ==,
6316 CKM_RSA_PKCS_KEY_PAIR_GEN) ||
6317 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sensitive, ==, CK_TRUE) ||
6318 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_decrypt, ==, CK_FALSE) ||
6319 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sign, ==, CK_TRUE) ||
6320 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sign_recover, ==, CK_FALSE) ||
6321 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_unwrap, ==, CK_FALSE) ||
6322 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_extract, ==, CK_FALSE) ||
6323 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_asensitive, ==, CK_TRUE) ||
6324 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_nextract, ==, CK_TRUE) ||
6325 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_wrap_with_trusted, ==, CK_FALSE) ||
6326 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_always_authenticate, ==, CK_FALSE))
6327 goto err_destr_obj;
6328
6329 Do_ADBG_EndSubCase(c, NULL);
6330
6331 Do_ADBG_BeginSubCase(c,
6332 "%s: Sign & verify tests - oneshot - CKM_RSA_PKCS",
6333 rsa_name);
6334
6335 sign_mechanism.mechanism = CKM_RSA_PKCS;
6336 memset(signature, 0, sizeof(signature));
6337 signature_len = sizeof(signature);
6338
6339 rv = C_SignInit(session, &sign_mechanism, private_key);
6340 if (!ADBG_EXPECT_CK_OK(c, rv))
6341 goto err_destr_obj;
6342
6343 rv = C_Sign(session, (void *)digest_test_pattern_sha256,
6344 sizeof(digest_test_pattern_sha256), (void *)signature,
6345 &signature_len);
6346 if (!ADBG_EXPECT_CK_OK(c, rv))
6347 goto err_destr_obj;
6348
6349 rv = C_VerifyInit(session, &sign_mechanism, public_key);
6350 if (!ADBG_EXPECT_CK_OK(c, rv))
6351 goto err_destr_obj;
6352
6353 rv = C_Verify(session, (void *)digest_test_pattern_sha256,
6354 sizeof(digest_test_pattern_sha256), (void *)signature,
6355 signature_len);
6356 if (!ADBG_EXPECT_CK_OK(c, rv))
6357 goto err_destr_obj;
6358
6359 for (i = 0; i < ARRAY_SIZE(rsa_pkcs_sign_tests); i++) {
6360 /*
6361 * Note: this order of end/begin here is just to get ADBG
6362 * SubCases in sync with error handling.
6363 */
6364 Do_ADBG_EndSubCase(c, NULL);
6365
6366 Do_ADBG_BeginSubCase(c, "%s: Sign & verify - oneshot - %s",
6367 rsa_name,
6368 rsa_pkcs_sign_tests[i].test_name);
6369
6370 sign_mechanism.mechanism = rsa_pkcs_sign_tests[i].mecha;
6371 memset(signature, 0, sizeof(signature));
6372 signature_len = sizeof(signature);
6373
6374 rv = C_SignInit(session, &sign_mechanism, private_key);
6375 if (!ADBG_EXPECT_CK_OK(c, rv))
6376 goto err_destr_obj;
6377
6378 rv = C_Sign(session, (void *)rsa_pkcs_sign_tests[i].data,
6379 rsa_pkcs_sign_tests[i].data_size,
6380 (void *)signature, &signature_len);
6381 if (!ADBG_EXPECT_CK_OK(c, rv))
6382 goto err_destr_obj;
6383
6384 rv = C_VerifyInit(session, &sign_mechanism, public_key);
6385 if (!ADBG_EXPECT_CK_OK(c, rv))
6386 goto err_destr_obj;
6387
6388 rv = C_Verify(session, (void *)rsa_pkcs_sign_tests[i].data,
6389 rsa_pkcs_sign_tests[i].data_size,
6390 (void *)signature, signature_len);
6391 if (!ADBG_EXPECT_CK_OK(c, rv))
6392 goto err_destr_obj;
6393 }
6394
6395 rv = C_DestroyObject(session, private_key);
6396 if (!ADBG_EXPECT_CK_OK(c, rv))
6397 goto err_destr_pub_obj;
6398
6399 rv = C_DestroyObject(session, public_key);
6400 if (!ADBG_EXPECT_CK_OK(c, rv))
6401 goto err;
6402
6403 Do_ADBG_EndSubCase(c, NULL);
6404
6405 return 1;
6406
6407err_destr_obj:
6408 ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, private_key));
6409err_destr_pub_obj:
6410 ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, public_key));
6411err:
6412 Do_ADBG_EndSubCase(c, NULL);
6413
6414 return 0;
6415}
6416
6417static void xtest_pkcs11_test_1021(ADBG_Case_t *c)
6418{
6419 CK_RV rv = CKR_GENERAL_ERROR;
6420 CK_SLOT_ID slot = 0;
6421 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
6422 CK_FLAGS session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
6423 int ret = 0;
6424
6425 rv = init_lib_and_find_token_slot(&slot);
6426 if (!ADBG_EXPECT_CK_OK(c, rv))
6427 return;
6428
6429 rv = init_test_token(slot);
6430 if (!ADBG_EXPECT_CK_OK(c, rv))
6431 goto close_lib;
6432
6433 rv = init_user_test_token(slot);
6434 if (!ADBG_EXPECT_CK_OK(c, rv))
6435 goto close_lib;
6436
6437 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
6438 if (!ADBG_EXPECT_CK_OK(c, rv))
6439 goto close_lib;
6440
6441 /* Login to Test Token */
6442 rv = C_Login(session, CKU_USER, test_token_user_pin,
6443 sizeof(test_token_user_pin));
6444 if (!ADBG_EXPECT_CK_OK(c, rv))
6445 goto out;
6446
6447 ret = test_rsa_pkcs_operations(c, session, "RSA-1024", 1024);
6448 if (!ret)
6449 goto out;
6450 ret = test_rsa_pkcs_operations(c, session, "RSA-2048", 2048);
6451 if (!ret)
6452 goto out;
6453 if (level > 0) {
6454 ret = test_rsa_pkcs_operations(c, session, "RSA-3072", 3072);
6455 if (!ret)
6456 goto out;
6457 ret = test_rsa_pkcs_operations(c, session, "RSA-4096", 4096);
6458 if (!ret)
6459 goto out;
6460 }
6461out:
6462 ADBG_EXPECT_CK_OK(c, C_CloseSession(session));
6463close_lib:
6464 ADBG_EXPECT_CK_OK(c, close_lib());
6465}
6466ADBG_CASE_DEFINE(pkcs11, 1021, xtest_pkcs11_test_1021,
6467 "PKCS11: RSA PKCS key generation and signing");
Vesa Jääskeläinen7f8456b2021-05-02 15:33:17 +03006468
6469#define RSA_PSS_HASH_SIGN_TEST(_test_name, _min_rsa_bits, _mecha, _hash_algo, _mgf_algo, \
6470 _salt_len, _data) \
6471 { \
6472 .test_name = _test_name, \
6473 .min_rsa_bits = _min_rsa_bits, \
6474 .mecha = _mecha, \
6475 .hash_algo = _hash_algo, \
6476 .mgf_algo = _mgf_algo, \
6477 .salt_len = _salt_len, \
6478 .data = _data, \
6479 .data_size = sizeof(_data), \
6480 }
6481
6482#define RSA_PSS_CSTR_SIGN_TEST(_test_name, _min_rsa_bits, _mecha, _hash_algo, \
6483 _mgf_algo, _salt_len, _data) \
6484 { \
6485 .test_name = _test_name, \
6486 .min_rsa_bits = _min_rsa_bits, \
6487 .mecha = _mecha, \
6488 .hash_algo = _hash_algo, \
6489 .mgf_algo = _mgf_algo, \
6490 .salt_len = _salt_len, \
6491 .data = _data, \
6492 .data_size = sizeof(_data) - 1, \
6493 }
6494
6495/* List of RSA PSS signing multi stage digest mechanisms */
6496static struct {
6497 const char *test_name;
6498 uint32_t min_rsa_bits;
6499 CK_MECHANISM_TYPE mecha;
6500 CK_MECHANISM_TYPE hash_algo;
6501 CK_RSA_PKCS_MGF_TYPE mgf_algo;
6502 CK_ULONG salt_len;
6503 const void *data;
6504 CK_ULONG data_size;
6505} rsa_pss_sign_tests[] = {
6506 RSA_PSS_HASH_SIGN_TEST("RSA-PSS/SHA1", 1024, CKM_RSA_PKCS_PSS,
6507 CKM_SHA_1, CKG_MGF1_SHA1, 20,
6508 digest_test_pattern_sha1),
6509 RSA_PSS_CSTR_SIGN_TEST("RSA-PSS/SHA1/mech", 1024,
6510 CKM_SHA1_RSA_PKCS_PSS, CKM_SHA_1, CKG_MGF1_SHA1,
6511 20, digest_test_pattern),
6512 RSA_PSS_HASH_SIGN_TEST("RSA-PSS/SHA224", 1024, CKM_RSA_PKCS_PSS,
6513 CKM_SHA224, CKG_MGF1_SHA224, 28,
6514 digest_test_pattern_sha224),
6515 RSA_PSS_CSTR_SIGN_TEST("RSA-PSS/SHA224/mech", 1024,
6516 CKM_SHA224_RSA_PKCS_PSS, CKM_SHA224,
6517 CKG_MGF1_SHA224, 28, digest_test_pattern),
6518 RSA_PSS_HASH_SIGN_TEST("RSA-PSS/SHA256", 1024, CKM_RSA_PKCS_PSS,
6519 CKM_SHA256, CKG_MGF1_SHA256, 32,
6520 digest_test_pattern_sha256),
6521 RSA_PSS_CSTR_SIGN_TEST("RSA-PSS/SHA256/mech", 1024,
6522 CKM_SHA256_RSA_PKCS_PSS, CKM_SHA256,
6523 CKG_MGF1_SHA256, 32, digest_test_pattern),
6524 RSA_PSS_HASH_SIGN_TEST("RSA-PSS/SHA384", 1024, CKM_RSA_PKCS_PSS,
6525 CKM_SHA384, CKG_MGF1_SHA384, 48,
6526 digest_test_pattern_sha384),
6527 RSA_PSS_CSTR_SIGN_TEST("RSA-PSS/SHA384/mech", 1024,
6528 CKM_SHA384_RSA_PKCS_PSS, CKM_SHA384,
6529 CKG_MGF1_SHA384, 48, digest_test_pattern),
6530 RSA_PSS_HASH_SIGN_TEST("RSA-PSS/SHA512", 2048, CKM_RSA_PKCS_PSS,
6531 CKM_SHA512, CKG_MGF1_SHA512, 64,
6532 digest_test_pattern_sha512),
6533 RSA_PSS_CSTR_SIGN_TEST("RSA-PSS/SHA512/mech", 2048,
6534 CKM_SHA512_RSA_PKCS_PSS, CKM_SHA512,
6535 CKG_MGF1_SHA512, 64, digest_test_pattern),
6536};
6537
6538static int test_rsa_pss_operations(ADBG_Case_t *c,
6539 CK_SESSION_HANDLE session,
6540 const char *rsa_name, uint32_t rsa_bits)
6541{
6542 CK_RV rv = CKR_GENERAL_ERROR;
6543
6544 CK_OBJECT_HANDLE public_key = CK_INVALID_HANDLE;
6545 CK_OBJECT_HANDLE private_key = CK_INVALID_HANDLE;
6546
6547 CK_MECHANISM mechanism = {
6548 CKM_RSA_PKCS_KEY_PAIR_GEN, NULL, 0
6549 };
6550 CK_MECHANISM sign_mechanism = {
6551 CKM_RSA_PKCS_PSS, NULL, 0
6552 };
6553 CK_RSA_PKCS_PSS_PARAMS pss_params = {
6554 CKM_SHA256, CKG_MGF1_SHA256, 32,
6555 };
6556 CK_ULONG modulus_bits = 0;
6557 CK_BYTE public_exponent[] = { 1, 0, 1 };
6558 CK_BYTE id[] = { 123 };
6559
6560 CK_ATTRIBUTE public_key_template[] = {
6561 { CKA_ENCRYPT, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
6562 { CKA_VERIFY, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
6563 { CKA_WRAP, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
6564 { CKA_MODULUS_BITS, &modulus_bits, sizeof(CK_ULONG) },
6565 { CKA_PUBLIC_EXPONENT, public_exponent,
6566 sizeof(public_exponent) }
6567 };
6568
6569 CK_ATTRIBUTE private_key_template[] = {
6570 { CKA_TOKEN, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
6571 { CKA_PRIVATE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
6572 { CKA_SUBJECT, subject_common_name,
6573 sizeof(subject_common_name) },
6574 { CKA_ID, id, sizeof(id) },
6575 { CKA_SENSITIVE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
6576 { CKA_DECRYPT, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
6577 { CKA_SIGN, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
6578 { CKA_UNWRAP, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) }
6579 };
6580
6581 CK_OBJECT_CLASS g_class = 0;
6582 CK_KEY_TYPE g_key_type = 0;
6583 CK_BYTE g_id[32] = { 0 };
6584 CK_DATE g_start_date = { 0 };
6585 CK_DATE g_end_date = { 0 };
6586 CK_BBOOL g_derive = CK_FALSE;
6587 CK_BBOOL g_local = CK_FALSE;
6588 CK_MECHANISM_TYPE g_keygen_mecha = 0;
6589 CK_BYTE g_subject[64] = { 0 };
6590 CK_BBOOL g_encrypt = CK_FALSE;
6591 CK_BBOOL g_verify = CK_FALSE;
6592 CK_BBOOL g_verify_recover = CK_FALSE;
6593 CK_BBOOL g_wrap = CK_FALSE;
6594 CK_BBOOL g_trusted = CK_FALSE;
6595 CK_BYTE g_public_key_info[1024] = { 0 };
6596 CK_BBOOL g_sensitive = CK_FALSE;
6597 CK_BBOOL g_decrypt = CK_FALSE;
6598 CK_BBOOL g_sign = CK_FALSE;
6599 CK_BBOOL g_sign_recover = CK_FALSE;
6600 CK_BBOOL g_unwrap = CK_FALSE;
6601 CK_BBOOL g_extract = CK_FALSE;
6602 CK_BBOOL g_asensitive = CK_FALSE;
6603 CK_BBOOL g_nextract = CK_FALSE;
6604 CK_BBOOL g_wrap_with_trusted = CK_FALSE;
6605 CK_BBOOL g_always_authenticate = CK_FALSE;
6606
6607 /* Note: Tests below expects specific order of elements */
6608 CK_ATTRIBUTE get_public_template[] = {
6609 { CKA_CLASS, &g_class, sizeof(CK_OBJECT_CLASS) },
6610 { CKA_KEY_TYPE, &g_key_type, sizeof(CK_KEY_TYPE) },
6611 { CKA_ID, g_id, sizeof(g_id) },
6612 { CKA_START_DATE, &g_start_date, sizeof(CK_DATE) },
6613 { CKA_END_DATE, &g_end_date, sizeof(CK_DATE) },
6614 { CKA_DERIVE, &g_derive, sizeof(CK_BBOOL) },
6615 { CKA_LOCAL, &g_local, sizeof(CK_BBOOL) },
6616 { CKA_KEY_GEN_MECHANISM, &g_keygen_mecha, sizeof(CK_MECHANISM_TYPE) },
6617 { CKA_SUBJECT, g_subject, sizeof(g_subject) },
6618 { CKA_ENCRYPT, &g_encrypt, sizeof(CK_BBOOL) },
6619 { CKA_VERIFY, &g_verify, sizeof(CK_BBOOL) },
6620 { CKA_VERIFY_RECOVER, &g_verify_recover, sizeof(CK_BBOOL) },
6621 { CKA_WRAP, &g_wrap, sizeof(CK_BBOOL) },
6622 { CKA_TRUSTED, &g_trusted, sizeof(CK_BBOOL) },
6623 { CKA_PUBLIC_KEY_INFO, g_public_key_info, sizeof(g_public_key_info) },
6624 };
6625
6626 /* Note: Tests below expects specific order of elements */
6627 CK_ATTRIBUTE get_private_template[] = {
6628 { CKA_CLASS, &g_class, sizeof(CK_OBJECT_CLASS) },
6629 { CKA_KEY_TYPE, &g_key_type, sizeof(CK_KEY_TYPE) },
6630 { CKA_ID, g_id, sizeof(g_id) },
6631 { CKA_START_DATE, &g_start_date, sizeof(CK_DATE) },
6632 { CKA_END_DATE, &g_end_date, sizeof(CK_DATE) },
6633 { CKA_DERIVE, &g_derive, sizeof(CK_BBOOL) },
6634 { CKA_LOCAL, &g_local, sizeof(CK_BBOOL) },
6635 { CKA_KEY_GEN_MECHANISM, &g_keygen_mecha, sizeof(CK_MECHANISM_TYPE) },
6636 { CKA_SUBJECT, g_subject, sizeof(g_subject) },
6637 { CKA_SENSITIVE, &g_sensitive, sizeof(CK_BBOOL) },
6638 { CKA_DECRYPT, &g_decrypt, sizeof(CK_BBOOL) },
6639 { CKA_SIGN, &g_sign, sizeof(CK_BBOOL) },
6640 { CKA_SIGN_RECOVER, &g_sign_recover, sizeof(CK_BBOOL) },
6641 { CKA_UNWRAP, &g_unwrap, sizeof(CK_BBOOL) },
6642 { CKA_EXTRACTABLE, &g_extract, sizeof(CK_BBOOL) },
6643 { CKA_ALWAYS_SENSITIVE, &g_asensitive, sizeof(CK_BBOOL) },
6644 { CKA_NEVER_EXTRACTABLE, &g_nextract, sizeof(CK_BBOOL) },
6645 { CKA_WRAP_WITH_TRUSTED, &g_wrap_with_trusted, sizeof(CK_BBOOL) },
6646 { CKA_ALWAYS_AUTHENTICATE, &g_always_authenticate, sizeof(CK_BBOOL) },
6647 { CKA_PUBLIC_KEY_INFO, g_public_key_info, sizeof(g_public_key_info) },
6648 };
6649
6650 uint8_t signature[512] = { 0 };
6651 CK_ULONG signature_len = 0;
6652
6653 size_t i = 0;
6654
6655 Do_ADBG_BeginSubCase(c, "%s: Generate key pair", rsa_name);
6656
6657 modulus_bits = rsa_bits;
6658
6659 rv = C_GenerateKeyPair(session, &mechanism, public_key_template,
6660 ARRAY_SIZE(public_key_template),
6661 private_key_template,
6662 ARRAY_SIZE(private_key_template),
6663 &public_key, &private_key);
6664 if (!ADBG_EXPECT_CK_OK(c, rv))
6665 goto err;
6666
6667 /* reset get public key template */
6668 memset(g_id, 0, sizeof(g_id));
6669 assert(get_public_template[2].type == CKA_ID);
6670 get_public_template[2].ulValueLen = sizeof(g_id);
6671
6672 memset(g_subject, 0, sizeof(g_subject));
6673 assert(get_public_template[8].type == CKA_SUBJECT);
6674 get_public_template[8].ulValueLen = sizeof(g_subject);
6675
6676 memset(g_public_key_info, 0, sizeof(g_public_key_info));
6677 assert(get_public_template[14].type == CKA_PUBLIC_KEY_INFO);
6678 get_public_template[14].ulValueLen = sizeof(g_public_key_info);
6679
6680 rv = C_GetAttributeValue(session, public_key, get_public_template,
6681 ARRAY_SIZE(get_public_template));
6682 if (!ADBG_EXPECT_CK_OK(c, rv) ||
6683 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_PUBLIC_KEY) ||
6684 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_key_type, ==, CKK_RSA) ||
6685 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_derive, ==, CK_FALSE) ||
6686 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_TRUE) ||
6687 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_keygen_mecha, ==,
6688 CKM_RSA_PKCS_KEY_PAIR_GEN) ||
6689 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_encrypt, ==, CK_FALSE) ||
6690 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_verify, ==, CK_TRUE) ||
6691 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_verify_recover, ==, CK_FALSE) ||
6692 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_wrap, ==, CK_FALSE) ||
6693 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_trusted, ==, CK_FALSE))
6694 goto err_destr_obj;
6695
6696 /* reset get private key template */
6697 memset(g_id, 0, sizeof(g_id));
6698 assert(get_private_template[2].type == CKA_ID);
6699 get_private_template[2].ulValueLen = sizeof(g_id);
6700
6701 memset(g_subject, 0, sizeof(g_subject));
6702 assert(get_private_template[8].type == CKA_SUBJECT);
6703 get_private_template[8].ulValueLen = sizeof(g_subject);
6704
6705 memset(g_public_key_info, 0, sizeof(g_public_key_info));
6706 assert(get_private_template[19].type == CKA_PUBLIC_KEY_INFO);
6707 get_private_template[19].ulValueLen = sizeof(g_public_key_info);
6708
6709 rv = C_GetAttributeValue(session, private_key, get_private_template,
6710 ARRAY_SIZE(get_private_template));
6711 if (!ADBG_EXPECT_CK_OK(c, rv) ||
6712 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_PRIVATE_KEY) ||
6713 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_key_type, ==, CKK_RSA) ||
6714 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_derive, ==, CK_FALSE) ||
6715 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_TRUE) ||
6716 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_keygen_mecha, ==,
6717 CKM_RSA_PKCS_KEY_PAIR_GEN) ||
6718 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sensitive, ==, CK_TRUE) ||
6719 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_decrypt, ==, CK_FALSE) ||
6720 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sign, ==, CK_TRUE) ||
6721 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sign_recover, ==, CK_FALSE) ||
6722 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_unwrap, ==, CK_FALSE) ||
6723 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_extract, ==, CK_FALSE) ||
6724 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_asensitive, ==, CK_TRUE) ||
6725 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_nextract, ==, CK_TRUE) ||
6726 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_wrap_with_trusted, ==, CK_FALSE) ||
6727 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_always_authenticate, ==, CK_FALSE))
6728 goto err_destr_obj;
6729
6730 for (i = 0; i < ARRAY_SIZE(rsa_pss_sign_tests); i++) {
6731 /*
6732 * Note: this order of end/begin here is just to get ADBG
6733 * SubCases in sync with error handling.
6734 */
6735 Do_ADBG_EndSubCase(c, NULL);
6736
6737 Do_ADBG_BeginSubCase(c, "%s: Sign & verify - oneshot - %s",
6738 rsa_name,
6739 rsa_pss_sign_tests[i].test_name);
6740
6741 sign_mechanism.mechanism = rsa_pss_sign_tests[i].mecha;
6742 sign_mechanism.pParameter = &pss_params;
6743 sign_mechanism.ulParameterLen = sizeof(pss_params);
6744 pss_params.hashAlg = rsa_pss_sign_tests[i].hash_algo;
6745 pss_params.mgf = rsa_pss_sign_tests[i].mgf_algo;
6746 pss_params.sLen = rsa_pss_sign_tests[i].salt_len;
6747
6748 memset(signature, 0, sizeof(signature));
6749 signature_len = sizeof(signature);
6750
6751 rv = C_SignInit(session, &sign_mechanism, private_key);
6752 if (rsa_bits >= rsa_pss_sign_tests[i].min_rsa_bits) {
6753 if (!ADBG_EXPECT_CK_OK(c, rv))
6754 goto err_destr_obj;
6755 } else {
6756 if (!ADBG_EXPECT_CK_RESULT(c, CKR_KEY_SIZE_RANGE, rv))
6757 goto err_destr_obj;
6758 continue;
6759 }
6760
6761 rv = C_Sign(session, (void *)rsa_pss_sign_tests[i].data,
6762 rsa_pss_sign_tests[i].data_size,
6763 (void *)signature, &signature_len);
6764 if (!ADBG_EXPECT_CK_OK(c, rv))
6765 goto err_destr_obj;
6766
6767 rv = C_VerifyInit(session, &sign_mechanism, public_key);
6768 if (!ADBG_EXPECT_CK_OK(c, rv))
6769 goto err_destr_obj;
6770
6771 rv = C_Verify(session, (void *)rsa_pss_sign_tests[i].data,
6772 rsa_pss_sign_tests[i].data_size,
6773 (void *)signature, signature_len);
6774 if (!ADBG_EXPECT_CK_OK(c, rv))
6775 goto err_destr_obj;
6776 }
6777
6778 rv = C_DestroyObject(session, private_key);
6779 if (!ADBG_EXPECT_CK_OK(c, rv))
6780 goto err_destr_pub_obj;
6781
6782 rv = C_DestroyObject(session, public_key);
6783 if (!ADBG_EXPECT_CK_OK(c, rv))
6784 goto err;
6785
6786 Do_ADBG_EndSubCase(c, NULL);
6787
6788 return 1;
6789
6790err_destr_obj:
6791 ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, private_key));
6792err_destr_pub_obj:
6793 ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, public_key));
6794err:
6795 Do_ADBG_EndSubCase(c, NULL);
6796
6797 return 0;
6798}
6799
6800static void xtest_pkcs11_test_1022(ADBG_Case_t *c)
6801{
6802 CK_RV rv = CKR_GENERAL_ERROR;
6803 CK_SLOT_ID slot = 0;
6804 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
6805 CK_FLAGS session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
6806 int ret = 0;
6807
6808 rv = init_lib_and_find_token_slot(&slot);
6809 if (!ADBG_EXPECT_CK_OK(c, rv))
6810 return;
6811
6812 rv = init_test_token(slot);
6813 if (!ADBG_EXPECT_CK_OK(c, rv))
6814 goto close_lib;
6815
6816 rv = init_user_test_token(slot);
6817 if (!ADBG_EXPECT_CK_OK(c, rv))
6818 goto close_lib;
6819
6820 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
6821 if (!ADBG_EXPECT_CK_OK(c, rv))
6822 goto close_lib;
6823
6824 /* Login to Test Token */
6825 rv = C_Login(session, CKU_USER, test_token_user_pin,
6826 sizeof(test_token_user_pin));
6827 if (!ADBG_EXPECT_CK_OK(c, rv))
6828 goto out;
6829
6830 ret = test_rsa_pss_operations(c, session, "RSA-1024", 1024);
6831 if (!ret)
6832 goto out;
6833 ret = test_rsa_pss_operations(c, session, "RSA-2048", 2048);
6834 if (!ret)
6835 goto out;
6836 if (level > 0) {
6837 ret = test_rsa_pss_operations(c, session, "RSA-3072", 3072);
6838 if (!ret)
6839 goto out;
6840 ret = test_rsa_pss_operations(c, session, "RSA-4096", 4096);
6841 if (!ret)
6842 goto out;
6843 }
6844out:
6845 ADBG_EXPECT_CK_OK(c, C_CloseSession(session));
6846close_lib:
6847 ADBG_EXPECT_CK_OK(c, close_lib());
6848}
6849ADBG_CASE_DEFINE(pkcs11, 1022, xtest_pkcs11_test_1022,
6850 "PKCS11: RSA PSS key generation and signing");
Vesa Jääskeläinena2a82392021-07-02 19:00:12 +03006851
6852static const char rsa_oaep_message[] = "Hello World";
6853static char rsa_oaep_label[] = "TestLabel";
6854
6855#define RSA_OAEP_CRYPT_TEST(_test_name, _min_rsa_bits, _hash_algo, _mgf_algo, \
6856 _source_data, _source_data_len) \
6857 { \
6858 .test_name = _test_name, \
6859 .min_rsa_bits = _min_rsa_bits, \
6860 .hash_algo = _hash_algo, \
6861 .mgf_algo = _mgf_algo, \
6862 .source_data = _source_data, \
6863 .source_data_len = _source_data_len, \
6864 }
6865
6866/* List of RSA OAEP crypto params to test out */
6867static struct {
6868 const char *test_name;
6869 uint32_t min_rsa_bits;
6870 CK_MECHANISM_TYPE hash_algo;
6871 CK_RSA_PKCS_MGF_TYPE mgf_algo;
6872 void *source_data;
6873 size_t source_data_len;
6874} rsa_oaep_crypt_tests[] = {
6875 RSA_OAEP_CRYPT_TEST("RSA-OAEP/SHA1", 1024, CKM_SHA_1, CKG_MGF1_SHA1,
6876 NULL, 0),
6877 RSA_OAEP_CRYPT_TEST("RSA-OAEP/SHA1/label", 1024, CKM_SHA_1,
6878 CKG_MGF1_SHA1, rsa_oaep_label,
6879 sizeof(rsa_oaep_label)),
6880 RSA_OAEP_CRYPT_TEST("RSA-OAEP/SHA224", 1024, CKM_SHA224,
6881 CKG_MGF1_SHA224, NULL, 0),
6882 RSA_OAEP_CRYPT_TEST("RSA-OAEP/SHA224/label", 1024, CKM_SHA224,
6883 CKG_MGF1_SHA224, rsa_oaep_label,
6884 sizeof(rsa_oaep_label)),
6885 RSA_OAEP_CRYPT_TEST("RSA-OAEP/SHA256", 1024, CKM_SHA256,
6886 CKG_MGF1_SHA256, NULL, 0),
6887 RSA_OAEP_CRYPT_TEST("RSA-OAEP/SHA256/label", 1024, CKM_SHA256,
6888 CKG_MGF1_SHA256, rsa_oaep_label,
6889 sizeof(rsa_oaep_label)),
6890 RSA_OAEP_CRYPT_TEST("RSA-OAEP/SHA384", 1024, CKM_SHA384,
6891 CKG_MGF1_SHA384, NULL, 0),
6892 RSA_OAEP_CRYPT_TEST("RSA-OAEP/SHA384/label", 1024, CKM_SHA384,
6893 CKG_MGF1_SHA384, rsa_oaep_label,
6894 sizeof(rsa_oaep_label)),
6895 RSA_OAEP_CRYPT_TEST("RSA-OAEP/SHA512", 2048, CKM_SHA512,
6896 CKG_MGF1_SHA512, NULL, 0),
6897 RSA_OAEP_CRYPT_TEST("RSA-OAEP/SHA512/label", 2048, CKM_SHA512,
6898 CKG_MGF1_SHA512, rsa_oaep_label,
6899 sizeof(rsa_oaep_label)),
6900};
6901
6902static int test_rsa_oaep_operations(ADBG_Case_t *c,
6903 CK_SESSION_HANDLE session,
6904 const char *rsa_name, uint32_t rsa_bits)
6905{
6906 CK_RV rv = CKR_GENERAL_ERROR;
6907 CK_OBJECT_HANDLE public_key = CK_INVALID_HANDLE;
6908 CK_OBJECT_HANDLE private_key = CK_INVALID_HANDLE;
6909
6910 CK_MECHANISM mechanism = {
6911 CKM_RSA_PKCS_KEY_PAIR_GEN, NULL, 0
6912 };
6913 CK_MECHANISM crypt_mechanism = {
6914 CKM_RSA_PKCS_OAEP, NULL, 0
6915 };
6916 CK_RSA_PKCS_OAEP_PARAMS oaep_params = {
6917 CKM_SHA256, CKG_MGF1_SHA256, CKZ_DATA_SPECIFIED, NULL, 0
6918 };
6919 CK_BYTE public_exponent[] = { 1, 0, 1 };
6920 CK_BYTE id[] = { 123 };
6921 CK_ULONG modulus_bits = 0;
6922 CK_ATTRIBUTE public_key_template[] = {
6923 { CKA_ENCRYPT, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
6924 { CKA_VERIFY, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
6925 { CKA_WRAP, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
6926 { CKA_MODULUS_BITS, &modulus_bits, sizeof(CK_ULONG) },
6927 { CKA_PUBLIC_EXPONENT, public_exponent,
6928 sizeof(public_exponent) }
6929 };
6930 CK_ATTRIBUTE private_key_template[] = {
6931 { CKA_TOKEN, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
6932 { CKA_PRIVATE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
6933 { CKA_SUBJECT, subject_common_name,
6934 sizeof(subject_common_name) },
6935 { CKA_ID, id, sizeof(id) },
6936 { CKA_SENSITIVE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
6937 { CKA_DECRYPT, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
6938 { CKA_SIGN, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
6939 { CKA_UNWRAP, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) }
6940 };
6941
6942 CK_OBJECT_CLASS g_class = 0;
6943 CK_KEY_TYPE g_key_type = 0;
6944 CK_BYTE g_id[32] = { 0 };
6945 CK_DATE g_start_date = { 0 };
6946 CK_DATE g_end_date = { 0 };
6947 CK_BBOOL g_derive = CK_FALSE;
6948 CK_BBOOL g_local = CK_FALSE;
6949 CK_MECHANISM_TYPE g_keygen_mecha = 0;
6950 CK_BYTE g_subject[64] = { 0 };
6951 CK_BBOOL g_encrypt = CK_FALSE;
6952 CK_BBOOL g_verify = CK_FALSE;
6953 CK_BBOOL g_verify_recover = CK_FALSE;
6954 CK_BBOOL g_wrap = CK_FALSE;
6955 CK_BBOOL g_trusted = CK_FALSE;
6956 CK_BYTE g_public_key_info[1024] = { 0 };
6957 CK_BBOOL g_sensitive = CK_FALSE;
6958 CK_BBOOL g_decrypt = CK_FALSE;
6959 CK_BBOOL g_sign = CK_FALSE;
6960 CK_BBOOL g_sign_recover = CK_FALSE;
6961 CK_BBOOL g_unwrap = CK_FALSE;
6962 CK_BBOOL g_extract = CK_FALSE;
6963 CK_BBOOL g_asensitive = CK_FALSE;
6964 CK_BBOOL g_nextract = CK_FALSE;
6965 CK_BBOOL g_wrap_with_trusted = CK_FALSE;
6966 CK_BBOOL g_always_authenticate = CK_FALSE;
6967
6968 /* Note: Tests below expects specific order of elements */
6969 CK_ATTRIBUTE get_public_template[] = {
6970 { CKA_CLASS, &g_class, sizeof(CK_OBJECT_CLASS) },
6971 { CKA_KEY_TYPE, &g_key_type, sizeof(CK_KEY_TYPE) },
6972 { CKA_ID, g_id, sizeof(g_id) },
6973 { CKA_START_DATE, &g_start_date, sizeof(CK_DATE) },
6974 { CKA_END_DATE, &g_end_date, sizeof(CK_DATE) },
6975 { CKA_DERIVE, &g_derive, sizeof(CK_BBOOL) },
6976 { CKA_LOCAL, &g_local, sizeof(CK_BBOOL) },
6977 { CKA_KEY_GEN_MECHANISM, &g_keygen_mecha, sizeof(CK_MECHANISM_TYPE) },
6978 { CKA_SUBJECT, g_subject, sizeof(g_subject) },
6979 { CKA_ENCRYPT, &g_encrypt, sizeof(CK_BBOOL) },
6980 { CKA_VERIFY, &g_verify, sizeof(CK_BBOOL) },
6981 { CKA_VERIFY_RECOVER, &g_verify_recover, sizeof(CK_BBOOL) },
6982 { CKA_WRAP, &g_wrap, sizeof(CK_BBOOL) },
6983 { CKA_TRUSTED, &g_trusted, sizeof(CK_BBOOL) },
6984 { CKA_PUBLIC_KEY_INFO, g_public_key_info, sizeof(g_public_key_info) },
6985 };
6986
6987 /* Note: Tests below expects specific order of elements */
6988 CK_ATTRIBUTE get_private_template[] = {
6989 { CKA_CLASS, &g_class, sizeof(CK_OBJECT_CLASS) },
6990 { CKA_KEY_TYPE, &g_key_type, sizeof(CK_KEY_TYPE) },
6991 { CKA_ID, g_id, sizeof(g_id) },
6992 { CKA_START_DATE, &g_start_date, sizeof(CK_DATE) },
6993 { CKA_END_DATE, &g_end_date, sizeof(CK_DATE) },
6994 { CKA_DERIVE, &g_derive, sizeof(CK_BBOOL) },
6995 { CKA_LOCAL, &g_local, sizeof(CK_BBOOL) },
6996 { CKA_KEY_GEN_MECHANISM, &g_keygen_mecha, sizeof(CK_MECHANISM_TYPE) },
6997 { CKA_SUBJECT, g_subject, sizeof(g_subject) },
6998 { CKA_SENSITIVE, &g_sensitive, sizeof(CK_BBOOL) },
6999 { CKA_DECRYPT, &g_decrypt, sizeof(CK_BBOOL) },
7000 { CKA_SIGN, &g_sign, sizeof(CK_BBOOL) },
7001 { CKA_SIGN_RECOVER, &g_sign_recover, sizeof(CK_BBOOL) },
7002 { CKA_UNWRAP, &g_unwrap, sizeof(CK_BBOOL) },
7003 { CKA_EXTRACTABLE, &g_extract, sizeof(CK_BBOOL) },
7004 { CKA_ALWAYS_SENSITIVE, &g_asensitive, sizeof(CK_BBOOL) },
7005 { CKA_NEVER_EXTRACTABLE, &g_nextract, sizeof(CK_BBOOL) },
7006 { CKA_WRAP_WITH_TRUSTED, &g_wrap_with_trusted, sizeof(CK_BBOOL) },
7007 { CKA_ALWAYS_AUTHENTICATE, &g_always_authenticate, sizeof(CK_BBOOL) },
7008 { CKA_PUBLIC_KEY_INFO, g_public_key_info, sizeof(g_public_key_info) },
7009 };
7010 uint8_t ciphertext[512] = { 0 };
7011 CK_ULONG ciphertext_len = 0;
7012 uint8_t plaintext[512] = { 0 };
7013 CK_ULONG plaintext_len = 0;
7014 size_t i = 0;
7015
7016 Do_ADBG_BeginSubCase(c, "%s: Generate key pair", rsa_name);
7017
7018 modulus_bits = rsa_bits;
7019
7020 rv = C_GenerateKeyPair(session, &mechanism, public_key_template,
7021 ARRAY_SIZE(public_key_template),
7022 private_key_template,
7023 ARRAY_SIZE(private_key_template),
7024 &public_key, &private_key);
7025 if (!ADBG_EXPECT_CK_OK(c, rv))
7026 goto err;
7027
7028 /* reset get public key template */
7029 memset(g_id, 0, sizeof(g_id));
7030 assert(get_public_template[2].type == CKA_ID);
7031 get_public_template[2].ulValueLen = sizeof(g_id);
7032
7033 memset(g_subject, 0, sizeof(g_subject));
7034 assert(get_public_template[8].type == CKA_SUBJECT);
7035 get_public_template[8].ulValueLen = sizeof(g_subject);
7036
7037 memset(g_public_key_info, 0, sizeof(g_public_key_info));
7038 assert(get_public_template[14].type == CKA_PUBLIC_KEY_INFO);
7039 get_public_template[14].ulValueLen = sizeof(g_public_key_info);
7040
7041 rv = C_GetAttributeValue(session, public_key,
7042 get_public_template,
7043 ARRAY_SIZE(get_public_template));
7044 if (!ADBG_EXPECT_CK_OK(c, rv) ||
7045 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_PUBLIC_KEY) ||
7046 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_key_type, ==, CKK_RSA) ||
7047 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_derive, ==, CK_FALSE) ||
7048 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_TRUE) ||
7049 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_keygen_mecha, ==,
7050 CKM_RSA_PKCS_KEY_PAIR_GEN) ||
7051 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_encrypt, ==, CK_TRUE) ||
7052 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_verify, ==, CK_TRUE) ||
7053 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_verify_recover, ==, CK_FALSE) ||
7054 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_wrap, ==, CK_FALSE) ||
7055 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_trusted, ==, CK_FALSE))
7056 goto err_destr_obj;
7057
7058 /* reset get private key template */
7059 memset(g_id, 0, sizeof(g_id));
7060 assert(get_private_template[2].type == CKA_ID);
7061 get_private_template[2].ulValueLen = sizeof(g_id);
7062
7063 memset(g_subject, 0, sizeof(g_subject));
7064 assert(get_private_template[8].type == CKA_SUBJECT);
7065 get_private_template[8].ulValueLen = sizeof(g_subject);
7066
7067 memset(g_public_key_info, 0, sizeof(g_public_key_info));
7068 assert(get_private_template[19].type == CKA_PUBLIC_KEY_INFO);
7069 get_private_template[19].ulValueLen = sizeof(g_public_key_info);
7070
7071 rv = C_GetAttributeValue(session, private_key,
7072 get_private_template,
7073 ARRAY_SIZE(get_private_template));
7074 if (!ADBG_EXPECT_CK_OK(c, rv) ||
7075 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_PRIVATE_KEY) ||
7076 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_key_type, ==, CKK_RSA) ||
7077 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_derive, ==, CK_FALSE) ||
7078 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_TRUE) ||
7079 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_keygen_mecha, ==,
7080 CKM_RSA_PKCS_KEY_PAIR_GEN) ||
7081 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sensitive, ==, CK_TRUE) ||
7082 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_decrypt, ==, CK_TRUE) ||
7083 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sign, ==, CK_TRUE) ||
7084 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sign_recover, ==, CK_FALSE) ||
7085 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_unwrap, ==, CK_FALSE) ||
7086 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_extract, ==, CK_FALSE) ||
7087 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_asensitive, ==, CK_TRUE) ||
7088 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_nextract, ==, CK_TRUE) ||
7089 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_wrap_with_trusted, ==, CK_FALSE) ||
7090 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_always_authenticate, ==, CK_FALSE))
7091 goto err_destr_obj;
7092
7093 for (i = 0; i < ARRAY_SIZE(rsa_oaep_crypt_tests); i++) {
7094 /*
7095 * Note: this order of end/begin here is just to get ADBG
7096 * SubCases in sync with error handling.
7097 */
7098 Do_ADBG_EndSubCase(c, NULL);
7099
7100 Do_ADBG_BeginSubCase(c, "%s: Encrypt & decrypt - oneshot - %s",
7101 rsa_name,
7102 rsa_oaep_crypt_tests[i].test_name);
7103
7104 crypt_mechanism.mechanism = CKM_RSA_PKCS_OAEP;
7105 crypt_mechanism.pParameter = &oaep_params;
7106 crypt_mechanism.ulParameterLen = sizeof(oaep_params);
7107 oaep_params.hashAlg = rsa_oaep_crypt_tests[i].hash_algo;
7108 oaep_params.mgf = rsa_oaep_crypt_tests[i].mgf_algo;
7109 oaep_params.pSourceData = rsa_oaep_crypt_tests[i].source_data;
7110 oaep_params.ulSourceDataLen = rsa_oaep_crypt_tests[i].source_data_len;
7111
7112 memset(ciphertext, 0, sizeof(ciphertext));
7113 memset(plaintext, 0, sizeof(plaintext));
7114
7115 ciphertext_len = 0;
7116
7117 memcpy(plaintext, rsa_oaep_message, sizeof(rsa_oaep_message));
7118 plaintext_len = sizeof(rsa_oaep_message);
7119
7120 rv = C_EncryptInit(session, &crypt_mechanism, public_key);
7121 if (!ADBG_EXPECT_CK_OK(c, rv))
7122 goto err_destr_obj;
7123
7124 rv = C_Encrypt(session, plaintext, plaintext_len, NULL,
7125 &ciphertext_len);
7126 if (!ADBG_EXPECT_CK_OK(c, rv))
7127 goto err_destr_obj;
7128
7129 rv = C_Encrypt(session, plaintext, plaintext_len, ciphertext,
7130 &ciphertext_len);
7131 if (rsa_bits >= rsa_oaep_crypt_tests[i].min_rsa_bits) {
7132 if (!ADBG_EXPECT_CK_OK(c, rv))
7133 goto err_destr_obj;
7134 } else {
7135 if (!ADBG_EXPECT_CK_RESULT(c, CKR_DATA_LEN_RANGE, rv))
7136 goto err_destr_obj;
7137 continue;
7138 }
7139
7140 memset(plaintext, 0, sizeof(plaintext));
7141 plaintext_len = 0;
7142
7143 rv = C_DecryptInit(session, &crypt_mechanism, private_key);
7144 if (!ADBG_EXPECT_CK_OK(c, rv))
7145 goto err_destr_obj;
7146
7147 rv = C_Decrypt(session, ciphertext, ciphertext_len, NULL,
7148 &plaintext_len);
7149 if (!ADBG_EXPECT_CK_OK(c, rv))
7150 goto err_destr_obj;
7151
7152 rv = C_Decrypt(session, ciphertext, ciphertext_len, plaintext,
7153 &plaintext_len);
7154 if (!ADBG_EXPECT_CK_OK(c, rv) ||
7155 !ADBG_EXPECT_BUFFER(c, rsa_oaep_message,
7156 sizeof(rsa_oaep_message), plaintext,
7157 plaintext_len))
7158 goto err_destr_obj;
7159 }
7160
7161 rv = C_DestroyObject(session, private_key);
7162 if (!ADBG_EXPECT_CK_OK(c, rv))
7163 goto err_destr_pub_obj;
7164
7165 rv = C_DestroyObject(session, public_key);
7166 if (!ADBG_EXPECT_CK_OK(c, rv))
7167 goto err;
7168
7169 Do_ADBG_EndSubCase(c, NULL);
7170
7171 return 1;
7172
7173err_destr_obj:
7174 ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, private_key));
7175err_destr_pub_obj:
7176 ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, public_key));
7177err:
7178 Do_ADBG_EndSubCase(c, NULL);
7179
7180 return 0;
7181}
7182
7183static void xtest_pkcs11_test_1023(ADBG_Case_t *c)
7184{
7185 CK_RV rv = CKR_GENERAL_ERROR;
7186 CK_SLOT_ID slot = 0;
7187 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
7188 CK_FLAGS session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
7189 int ret = 0;
7190
7191 rv = init_lib_and_find_token_slot(&slot);
7192 if (!ADBG_EXPECT_CK_OK(c, rv))
7193 return;
7194
7195 rv = init_test_token(slot);
7196 if (!ADBG_EXPECT_CK_OK(c, rv))
7197 goto close_lib;
7198
7199 rv = init_user_test_token(slot);
7200 if (!ADBG_EXPECT_CK_OK(c, rv))
7201 goto close_lib;
7202
7203 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
7204 if (!ADBG_EXPECT_CK_OK(c, rv))
7205 goto close_lib;
7206
7207 /* Login to Test Token */
7208 rv = C_Login(session, CKU_USER, test_token_user_pin,
7209 sizeof(test_token_user_pin));
7210 if (!ADBG_EXPECT_CK_OK(c, rv))
7211 goto out;
7212
7213 ret = test_rsa_oaep_operations(c, session, "RSA-1024", 1024);
7214 if (!ret)
7215 goto out;
7216 ret = test_rsa_oaep_operations(c, session, "RSA-2048", 2048);
7217 if (!ret)
7218 goto out;
7219 if (level > 0) {
7220 ret = test_rsa_oaep_operations(c, session, "RSA-3072", 3072);
7221 if (!ret)
7222 goto out;
7223 ret = test_rsa_oaep_operations(c, session, "RSA-4096", 4096);
7224 if (!ret)
7225 goto out;
7226 }
7227out:
7228 ADBG_EXPECT_CK_OK(c, C_CloseSession(session));
7229close_lib:
7230 ADBG_EXPECT_CK_OK(c, close_lib());
7231}
7232ADBG_CASE_DEFINE(pkcs11, 1023, xtest_pkcs11_test_1023,
7233 "PKCS11: RSA OAEP key generation and crypto operations");