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