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