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