blob: e6188e3bfc487e3769479aed756f2920f45fa013 [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;
Etienne Carriere1399f0d2021-10-05 14:08:15 +02002210 struct mac_test test_sign = CKTEST_MAC_TEST(cktest_hmac_md5_key,
2211 &cktest_hmac_md5_mechanism,
2212 4, mac_data_md5_in1,
2213 mac_data_md5_out1, false);
Ruchika Gupta71bc7402020-12-11 18:17:27 +05302214 uint8_t out[512] = { 0 };
2215 CK_ULONG out_len = 512;
2216
2217 rv = init_lib_and_find_token_slot(&slot);
2218 if (!ADBG_EXPECT_CK_OK(c, rv))
2219 return;
2220
2221 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
2222 if (!ADBG_EXPECT_CK_OK(c, rv))
2223 goto close_lib;
2224
2225 /*
2226 * Generate Generic Secret key using invalid templates
2227 */
2228 Do_ADBG_BeginSubCase(c, "Generate Secret Key with Invalid Templates");
2229
2230 /* NULL Template with !null template length */
2231 rv = C_GenerateKey(session, &cktest_gensecret_keygen_mechanism, NULL,
2232 3, &key_handle);
2233 if (!ADBG_EXPECT_CK_RESULT(c, CKR_ARGUMENTS_BAD, rv))
2234 goto err;
2235
2236 rv = C_GenerateKey(session, &cktest_gensecret_keygen_mechanism,
2237 cktest_generate_gensecret_object_error1,
2238 ARRAY_SIZE(cktest_generate_gensecret_object_error1),
2239 &key_handle);
2240 if (!ADBG_EXPECT_CK_RESULT(c, CKR_TEMPLATE_INCONSISTENT, rv))
2241 goto err;
2242
2243 rv = C_GenerateKey(session, &cktest_gensecret_keygen_mechanism,
2244 cktest_generate_gensecret_object_error2,
2245 ARRAY_SIZE(cktest_generate_gensecret_object_error2),
2246 &key_handle);
2247 if (!ADBG_EXPECT_CK_RESULT(c, CKR_TEMPLATE_INCOMPLETE, rv))
2248 goto err;
2249
2250 rv = C_GenerateKey(session, &cktest_gensecret_keygen_mechanism,
2251 cktest_generate_gensecret_object_error3,
2252 ARRAY_SIZE(cktest_generate_gensecret_object_error3),
2253 &key_handle);
2254 if (!ADBG_EXPECT_CK_RESULT(c, CKR_TEMPLATE_INCONSISTENT, rv))
2255 goto err;
2256
2257 rv = C_GenerateKey(session, &cktest_gensecret_keygen_mechanism,
2258 cktest_generate_gensecret_object_error4,
2259 ARRAY_SIZE(cktest_generate_gensecret_object_error4),
2260 &key_handle);
2261 if (!ADBG_EXPECT_CK_RESULT(c, CKR_TEMPLATE_INCONSISTENT, rv))
2262 goto err;
2263
2264 Do_ADBG_EndSubCase(c, NULL);
2265
2266 /*
2267 * Generate a Generic Secret object.
2268 * Try to encrypt with, it should fail...
2269 */
2270 Do_ADBG_BeginSubCase(c, "Generate Generic Secret Key - Try Encrypting");
2271
2272 rv = C_GenerateKey(session, &cktest_gensecret_keygen_mechanism,
2273 cktest_generate_gensecret_object_valid1,
2274 ARRAY_SIZE(cktest_generate_gensecret_object_valid1),
2275 &key_handle);
2276 if (!ADBG_EXPECT_CK_OK(c, rv))
2277 goto err;
2278
2279 rv = C_EncryptInit(session, &cktest_aes_cbc_mechanism, key_handle);
2280 if (!ADBG_EXPECT_CK_RESULT(c, CKR_KEY_FUNCTION_NOT_PERMITTED, rv))
2281 goto err_destr_obj;
2282
2283 rv = C_DestroyObject(session, key_handle);
2284 if (!ADBG_EXPECT_CK_OK(c, rv))
2285 goto err;
2286
2287 Do_ADBG_EndSubCase(c, NULL);
2288
2289 /*
2290 * Generate a Generic Secret object.
2291 * Try to sign with it, it should pass...
2292 */
2293 Do_ADBG_BeginSubCase(c, "Generate Generic Secret Key - Try Signing");
2294 rv = C_GenerateKey(session, &cktest_gensecret_keygen_mechanism,
2295 cktest_generate_gensecret_object_valid2,
2296 ARRAY_SIZE(cktest_generate_gensecret_object_valid2),
2297 &key_handle);
2298 if (!ADBG_EXPECT_CK_OK(c, rv))
2299 goto err;
2300
Etienne Carriere1399f0d2021-10-05 14:08:15 +02002301 rv = C_SignInit(session, test_sign.mechanism, key_handle);
Ruchika Gupta71bc7402020-12-11 18:17:27 +05302302 if (!ADBG_EXPECT_CK_OK(c, rv))
2303 goto err_destr_obj;
2304
Etienne Carriere1399f0d2021-10-05 14:08:15 +02002305 rv = C_Sign(session, (void *)test_sign.in, test_sign.in_len,
2306 (void *)out, &out_len);
Ruchika Gupta71bc7402020-12-11 18:17:27 +05302307 if (!ADBG_EXPECT_CK_OK(c, rv))
2308 goto err_destr_obj;
2309
2310 rv = C_DestroyObject(session, key_handle);
2311 if (!ADBG_EXPECT_CK_OK(c, rv))
2312 goto err;
2313
2314 Do_ADBG_EndSubCase(c, NULL);
2315
2316 /*
2317 * Generate a 128 bit AES Secret Key.
2318 * Try to encrypt with, it should pass...
2319 */
2320 Do_ADBG_BeginSubCase(c, "Generate AES Key - Try Encrypting");
2321
2322 rv = C_GenerateKey(session, &cktest_aes_keygen_mechanism,
2323 cktest_generate_aes_object,
2324 ARRAY_SIZE(cktest_generate_aes_object),
2325 &key_handle);
2326 if (!ADBG_EXPECT_CK_OK(c, rv))
2327 goto err;
2328
2329 rv = C_EncryptInit(session, &cktest_aes_cbc_mechanism, key_handle);
2330 if (!ADBG_EXPECT_CK_OK(c, rv))
2331 goto err_destr_obj;
2332
2333 rv = C_EncryptFinal(session, NULL, NULL);
2334 /* Only check that the operation is no more active */
2335 if (!ADBG_EXPECT_TRUE(c, rv != CKR_BUFFER_TOO_SMALL))
2336 goto err;
2337
2338 rv = C_DestroyObject(session, key_handle);
2339 if (!ADBG_EXPECT_CK_OK(c, rv))
2340 goto err;
2341
2342 Do_ADBG_EndSubCase(c, NULL);
2343
2344 goto out;
2345
2346err_destr_obj:
2347 ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, key_handle));
2348err:
2349 Do_ADBG_EndSubCase(c, NULL);
2350out:
2351 ADBG_EXPECT_CK_OK(c, C_CloseSession(session));
2352close_lib:
2353 ADBG_EXPECT_CK_OK(c, close_lib());
2354}
2355ADBG_CASE_DEFINE(pkcs11, 1010, xtest_pkcs11_test_1010,
2356 "PKCS11: Key Generation");
Ruchika Guptaafe2b542020-12-24 15:51:31 +05302357
2358static CK_RV create_data_object(CK_SESSION_HANDLE session,
2359 CK_OBJECT_HANDLE *obj_handle,
2360 CK_BBOOL token, CK_BBOOL private,
2361 const char *label)
2362{
2363 CK_OBJECT_CLASS class = CKO_DATA;
2364 CK_ATTRIBUTE object_template[] = {
2365 { CKA_CLASS, &class, sizeof(CK_OBJECT_CLASS) },
2366 { CKA_TOKEN, &token, sizeof(CK_BBOOL) },
2367 { CKA_PRIVATE, &private, sizeof(CK_BBOOL) },
2368 { CKA_LABEL, (CK_UTF8CHAR_PTR)label, strlen(label) },
2369 };
2370
2371 return C_CreateObject(session, object_template,
2372 ARRAY_SIZE(object_template), obj_handle);
2373}
2374
2375static CK_RV test_find_objects(ADBG_Case_t *c, CK_SESSION_HANDLE session,
2376 CK_ATTRIBUTE_PTR find_template,
2377 CK_ULONG attr_count,
2378 CK_OBJECT_HANDLE_PTR obj_found,
2379 CK_ULONG obj_count,
2380 CK_ULONG expected_cnt)
2381{
2382 CK_RV rv = CKR_GENERAL_ERROR;
2383 CK_ULONG hdl_count = 0;
2384
2385 rv = C_FindObjectsInit(session, find_template, attr_count);
2386 if (!ADBG_EXPECT_CK_OK(c, rv))
2387 return rv;
2388
2389 rv = C_FindObjects(session, obj_found, obj_count, &hdl_count);
2390 if (!ADBG_EXPECT_CK_OK(c, rv))
2391 return rv;
2392 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, hdl_count, ==, expected_cnt))
2393 return CKR_GENERAL_ERROR;
2394
2395 rv = C_FindObjectsFinal(session);
2396 if (!ADBG_EXPECT_CK_OK(c, rv))
2397 return rv;
2398
2399 return rv;
2400}
2401
2402static void destroy_persistent_objects(ADBG_Case_t *c, CK_SLOT_ID slot)
2403{
2404 uint32_t rv = CKR_GENERAL_ERROR;
2405 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
2406 CK_FLAGS session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
2407 CK_OBJECT_HANDLE obj_hdl = CK_INVALID_HANDLE;
2408 CK_ULONG count = 1;
2409 CK_ATTRIBUTE cktest_find_all_token_objs[] = {
2410 { CKA_TOKEN, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
2411 };
2412
2413 rv = init_user_test_token(slot);
2414 if (!ADBG_EXPECT_CK_OK(c, rv))
2415 return;
2416
2417 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
2418 if (!ADBG_EXPECT_CK_OK(c, rv))
2419 return;
2420
2421 /* Login to destroy private objects */
2422 rv = C_Login(session, CKU_USER, test_token_user_pin,
2423 sizeof(test_token_user_pin));
2424 if (!ADBG_EXPECT_CK_OK(c, rv))
2425 goto bail;
2426
2427 rv = C_FindObjectsInit(session, cktest_find_all_token_objs,
2428 ARRAY_SIZE(cktest_find_all_token_objs));
2429 if (!ADBG_EXPECT_CK_OK(c, rv))
2430 goto bail;
2431
2432 while (1) {
2433 rv = C_FindObjects(session, &obj_hdl, 1, &count);
2434 if (!ADBG_EXPECT_CK_OK(c, rv))
2435 goto bail;
2436 if (!count)
2437 break;
2438
2439 rv = C_DestroyObject(session, obj_hdl);
2440 ADBG_EXPECT_CK_OK(c, rv);
2441 }
2442
2443 rv = C_FindObjectsFinal(session);
2444 ADBG_EXPECT_CK_OK(c, rv);
2445
2446 rv = C_Logout(session);
2447 ADBG_EXPECT_CK_OK(c, rv);
2448
2449bail:
2450 rv = C_CloseSession(session);
2451 ADBG_EXPECT_CK_OK(c, rv);
2452}
2453
2454static void xtest_pkcs11_test_1011(ADBG_Case_t *c)
2455{
2456 CK_RV rv = CKR_GENERAL_ERROR;
2457 CK_SLOT_ID slot = 0;
2458 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
2459 CK_FLAGS session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
2460 CK_OBJECT_HANDLE obj_hdl[10] = { };
2461 CK_OBJECT_HANDLE obj_found[10] = { };
2462 const char *label = "Common Label";
2463 CK_ULONG hdl_count = 0;
2464 size_t n = 0;
2465 uint32_t i = 0;
2466 uint32_t object_id = 0;
2467 bool logged_in = false;
2468 CK_ATTRIBUTE find_template[] = {
2469 { CKA_LABEL, (CK_UTF8CHAR_PTR)label, strlen(label) },
2470 };
2471 CK_ATTRIBUTE find_token_template[] = {
2472 { CKA_LABEL, (CK_UTF8CHAR_PTR)label, strlen(label) },
2473 { CKA_TOKEN, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
2474 };
2475 CK_ATTRIBUTE find_session_template[] = {
2476 { CKA_LABEL, (CK_UTF8CHAR_PTR)label, strlen(label) },
2477 { CKA_TOKEN, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
2478 };
2479 CK_BBOOL bToken = CK_FALSE;
2480 CK_ATTRIBUTE get_attr_template[] = {
2481 { CKA_TOKEN, &bToken, sizeof(bToken) },
2482 };
2483
2484 for (n = 0; n < ARRAY_SIZE(obj_hdl); n++)
2485 obj_hdl[n] = CK_INVALID_HANDLE;
2486 for (n = 0; n < ARRAY_SIZE(obj_found); n++)
2487 obj_found[n] = CK_INVALID_HANDLE;
2488
2489 rv = init_lib_and_find_token_slot(&slot);
2490 if (!ADBG_EXPECT_CK_OK(c, rv))
2491 return;
2492
2493 rv = init_test_token(slot);
2494 if (!ADBG_EXPECT_CK_OK(c, rv))
2495 return;
2496
2497 rv = init_user_test_token(slot);
2498 if (!ADBG_EXPECT_CK_OK(c, rv))
2499 return;
2500
2501 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
2502 if (!ADBG_EXPECT_CK_OK(c, rv))
2503 goto close_lib;
2504
2505 /*
2506 * Sub test: Create Session Public/Private,
2507 * Token Public/Private objects and find them
2508 */
2509 Do_ADBG_BeginSubCase(c, "Find created Data objects when logged in");
2510
2511 /* Session Public Obj CKA_TOKEN = CK_FALSE, CKA_PRIVATE = CK_FALSE */
2512 rv = create_data_object(session, &obj_hdl[object_id++], CK_FALSE,
2513 CK_FALSE, label);
2514 if (!ADBG_EXPECT_CK_OK(c, rv))
2515 goto out;
2516
2517 /* Token Public Obj CKA_TOKEN = CK_TRUE, CKA_PRIVATE = CK_FALSE */
2518 rv = create_data_object(session, &obj_hdl[object_id++], CK_TRUE,
2519 CK_FALSE, label);
2520 if (!ADBG_EXPECT_CK_OK(c, rv))
2521 goto out;
2522
2523 /*
2524 * Token Private Obj CKA_TOKEN = CK_TRUE, CKA_PRIVATE = CK_TRUE
2525 * Expected error as User not logged in
2526 */
2527 rv = create_data_object(session, &obj_hdl[object_id], CK_TRUE,
2528 CK_TRUE, label);
2529 if (!ADBG_EXPECT_CK_RESULT(c, CKR_USER_NOT_LOGGED_IN, rv))
2530 goto out;
2531
2532 /* Login to Test Token */
2533 rv = C_Login(session, CKU_USER, test_token_user_pin,
2534 sizeof(test_token_user_pin));
2535 if (!ADBG_EXPECT_CK_OK(c, rv))
2536 goto out;
2537
2538 logged_in = true;
2539
2540 /* Token Private Obj CKA_TOKEN = CK_TRUE, CKA_PRIVATE = CK_TRUE */
2541 rv = create_data_object(session, &obj_hdl[object_id++], CK_TRUE,
2542 CK_TRUE, label);
2543 if (!ADBG_EXPECT_CK_OK(c, rv))
2544 goto out;
2545
2546 /* Session Private Obj CKA_TOKEN = CK_FALSE, CKA_PRIVATE = CK_TRUE */
2547 rv = create_data_object(session, &obj_hdl[object_id++], CK_FALSE,
2548 CK_TRUE, label);
2549 if (!ADBG_EXPECT_CK_OK(c, rv))
2550 goto out;
2551
2552 rv = test_find_objects(c, session, find_template,
2553 ARRAY_SIZE(find_template),
2554 obj_found, ARRAY_SIZE(obj_found), 4);
2555 if (!ADBG_EXPECT_CK_OK(c, rv))
2556 goto out;
2557
2558 /*
2559 * Check if object handles returned when creating objects with this
2560 * session are still valid
2561 */
2562 for (i = 0; i < object_id; i++) {
2563 rv = C_GetAttributeValue(session, obj_hdl[i], get_attr_template,
2564 ARRAY_SIZE(get_attr_template));
2565 if (!ADBG_EXPECT_CK_OK(c, rv))
2566 goto out;
2567 }
2568
2569 Do_ADBG_EndSubCase(c, NULL);
2570
2571 /*
2572 * Sub test: Pass NULL template with count as 0. All objects should
2573 * get returned
2574 */
2575 Do_ADBG_BeginSubCase(c, "Find all objects by passing NULL template");
2576
2577 rv = test_find_objects(c, session, NULL, 0, obj_found,
2578 ARRAY_SIZE(obj_found), 4);
2579 if (!ADBG_EXPECT_CK_OK(c, rv))
2580 goto out;
2581
Ruchika Guptab8dac1c2021-01-14 12:37:58 +05302582 Do_ADBG_EndSubCase(c, NULL);
Ruchika Guptaafe2b542020-12-24 15:51:31 +05302583
Ruchika Guptab8dac1c2021-01-14 12:37:58 +05302584 /*
2585 * Sub test: finalize search without getting the handles found
2586 */
2587 Do_ADBG_BeginSubCase(c, "Initiate and finalize straight a search");
2588
2589 rv = C_FindObjectsInit(session, find_template,
2590 ARRAY_SIZE(find_template));
2591 if (!ADBG_EXPECT_CK_OK(c, rv))
2592 goto out;
2593
2594 rv = C_FindObjectsFinal(session);
2595 if (!ADBG_EXPECT_CK_OK(c, rv))
2596 goto out;
2597
2598 /*
2599 * Check if object handles returned when creating objects with this
2600 * session are still valid
2601 */
2602 for (i = 0; i < object_id; i++) {
2603 rv = C_GetAttributeValue(session, obj_hdl[i], get_attr_template,
2604 ARRAY_SIZE(get_attr_template));
2605 if (!ADBG_EXPECT_CK_OK(c, rv))
2606 goto out;
2607 }
Ruchika Guptaafe2b542020-12-24 15:51:31 +05302608 Do_ADBG_EndSubCase(c, NULL);
2609
2610 /*
2611 * Sub test: Logout and find objects. We will find only public
2612 * objects (2)
2613 */
2614 Do_ADBG_BeginSubCase(c, "Find created Data objects when logged out");
2615
Ruchika Guptab8dac1c2021-01-14 12:37:58 +05302616 rv = C_Logout(session);
2617 ADBG_EXPECT_CK_OK(c, rv);
2618
2619 logged_in = false;
2620
Ruchika Guptaafe2b542020-12-24 15:51:31 +05302621 rv = test_find_objects(c, session, find_template,
2622 ARRAY_SIZE(find_template),
2623 obj_found, ARRAY_SIZE(obj_found), 2);
2624 if (!ADBG_EXPECT_CK_OK(c, rv))
2625 goto out;
2626
2627 Do_ADBG_EndSubCase(c, NULL);
2628
2629 /*
2630 * Sub test
2631 */
2632 Do_ADBG_BeginSubCase(c, "Find objects 1 by 1 and match handles");
2633
2634 for (n = 0; n < ARRAY_SIZE(obj_found); n++)
2635 obj_found[n] = CK_INVALID_HANDLE;
2636
2637 rv = C_FindObjectsInit(session, find_template,
2638 ARRAY_SIZE(find_template));
2639 if (!ADBG_EXPECT_CK_OK(c, rv))
2640 goto out;
2641
2642 rv = C_FindObjects(session, obj_found, 1, &hdl_count);
2643 if (!ADBG_EXPECT_CK_OK(c, rv) ||
2644 !ADBG_EXPECT_COMPARE_UNSIGNED(c, hdl_count, ==, 1) ||
2645 !ADBG_EXPECT_TRUE(c, (obj_found[0] == obj_hdl[0]) ||
2646 (obj_found[0] == obj_hdl[1])))
2647 goto out;
2648
2649 rv = C_FindObjects(session, &obj_found[1], 1, &hdl_count);
2650 if (!ADBG_EXPECT_CK_OK(c, rv) ||
2651 !ADBG_EXPECT_COMPARE_UNSIGNED(c, hdl_count, ==, 1) ||
2652 !ADBG_EXPECT_TRUE(c, (obj_found[1] == obj_hdl[0]) ||
2653 (obj_found[1] == obj_hdl[1])) ||
2654 !ADBG_EXPECT_TRUE(c, (obj_found[1] != obj_found[0])))
2655 goto out;
2656
2657 rv = C_FindObjects(session, obj_found, 1, &hdl_count);
2658 if (!ADBG_EXPECT_CK_OK(c, rv) ||
2659 !ADBG_EXPECT_COMPARE_UNSIGNED(c, hdl_count, ==, 0))
2660 goto out;
2661
2662 rv = C_FindObjectsFinal(session);
2663 if (!ADBG_EXPECT_CK_OK(c, rv))
2664 goto out;
2665
2666 Do_ADBG_EndSubCase(c, NULL);
2667
2668 /*
2669 * Sub test: Find objects with CKA_TOKEN=TRUE
2670 */
2671 Do_ADBG_BeginSubCase(c, "Find persistent objects");
2672
2673 rv = test_find_objects(c, session, find_token_template,
2674 ARRAY_SIZE(find_token_template),
2675 obj_found, ARRAY_SIZE(obj_found), 1);
2676 if (!ADBG_EXPECT_CK_OK(c, rv))
2677 goto out;
2678
2679 Do_ADBG_EndSubCase(c, NULL);
2680
2681 /*
2682 * Sub test: Find only session objects
2683 */
2684 Do_ADBG_BeginSubCase(c, "Find session objects");
2685
2686 rv = test_find_objects(c, session, find_session_template,
2687 ARRAY_SIZE(find_session_template),
2688 obj_found, ARRAY_SIZE(obj_found), 1);
2689 if (!ADBG_EXPECT_CK_OK(c, rv))
2690 goto out;
2691
2692 Do_ADBG_EndSubCase(c, NULL);
2693
2694 /*
2695 * Sub test:
2696 */
2697 Do_ADBG_BeginSubCase(c, "Login again and find Data objects");
2698
2699 /* Login to Test Token */
2700 rv = C_Login(session, CKU_USER, test_token_user_pin,
2701 sizeof(test_token_user_pin));
2702 if (!ADBG_EXPECT_CK_OK(c, rv))
2703 goto out;
2704
2705 logged_in = true;
2706
2707 rv = test_find_objects(c, session, find_template,
2708 ARRAY_SIZE(find_template),
Ruchika Guptab8dac1c2021-01-14 12:37:58 +05302709 obj_found, ARRAY_SIZE(obj_found), 3);
Ruchika Guptaafe2b542020-12-24 15:51:31 +05302710 if (!ADBG_EXPECT_CK_OK(c, rv))
2711 goto out;
2712
Ruchika Guptaafe2b542020-12-24 15:51:31 +05302713 rv = C_Logout(session);
2714 ADBG_EXPECT_CK_OK(c, rv);
2715
2716 logged_in = false;
2717
2718 Do_ADBG_EndSubCase(c, NULL);
2719
2720 /*
2721 * Sub test: Close session and open new session, find objects
2722 * without logging and after logging
2723 */
2724 Do_ADBG_BeginSubCase(c, "Find objects from brand new session");
2725
2726 rv = C_CloseSession(session);
2727 if (!ADBG_EXPECT_CK_OK(c, rv))
2728 goto destr_obj;
2729
2730 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
2731 if (!ADBG_EXPECT_CK_OK(c, rv))
2732 goto destr_obj;
2733
2734 rv = test_find_objects(c, session, find_template,
2735 ARRAY_SIZE(find_template),
2736 obj_found, ARRAY_SIZE(obj_found), 1);
2737 if (!ADBG_EXPECT_CK_OK(c, rv))
2738 goto out;
2739
2740 /* Login to Test Token */
2741 rv = C_Login(session, CKU_USER, test_token_user_pin,
2742 sizeof(test_token_user_pin));
2743 if (!ADBG_EXPECT_CK_OK(c, rv))
2744 goto out;
2745
2746 logged_in = true;
2747
2748 rv = test_find_objects(c, session, find_template,
2749 ARRAY_SIZE(find_template),
2750 obj_found, ARRAY_SIZE(obj_found), 2);
2751 if (!ADBG_EXPECT_CK_OK(c, rv))
2752 goto out;
2753
2754 rv = C_Logout(session);
2755 ADBG_EXPECT_CK_OK(c, rv);
2756
2757 logged_in = false;
2758
2759 Do_ADBG_EndSubCase(c, NULL);
2760
2761 /*
2762 * Sub test: invalid call cases
2763 */
2764 Do_ADBG_BeginSubCase(c, "Invalid cases");
2765
2766 rv = C_FindObjectsFinal(session);
2767 ADBG_EXPECT_CK_RESULT(c, CKR_OPERATION_NOT_INITIALIZED, rv);
2768
2769 rv = C_FindObjects(session,
2770 obj_found, ARRAY_SIZE(obj_found), &hdl_count);
2771 ADBG_EXPECT_CK_RESULT(c, CKR_OPERATION_NOT_INITIALIZED, rv);
2772
2773 rv = C_FindObjectsInit(session, find_template,
2774 ARRAY_SIZE(find_template));
2775 if (!ADBG_EXPECT_CK_OK(c, rv))
2776 goto out;
2777
2778 rv = C_FindObjectsInit(session, find_template,
2779 ARRAY_SIZE(find_template));
2780 ADBG_EXPECT_COMPARE_UNSIGNED(c, rv, !=, CKR_OK);
2781
2782 rv = C_FindObjectsFinal(session);
2783 ADBG_EXPECT_CK_OK(c, rv);
2784
2785 rv = C_FindObjectsInit(session, find_template,
2786 ARRAY_SIZE(find_template));
2787 ADBG_EXPECT_CK_OK(c, rv);
2788
2789 /*
2790 * Intentionally do not finalize the active object search. It should be
2791 * released together with the session closure.
2792 */
2793 Do_ADBG_EndSubCase(c, NULL);
2794
2795out:
2796 if (logged_in)
2797 ADBG_EXPECT_CK_OK(c, C_Logout(session));
2798
2799 ADBG_EXPECT_CK_OK(c, C_CloseSession(session));
2800
2801destr_obj:
2802 destroy_persistent_objects(c, slot);
2803close_lib:
2804 ADBG_EXPECT_CK_OK(c, close_lib());
2805}
2806ADBG_CASE_DEFINE(pkcs11, 1011, xtest_pkcs11_test_1011,
2807 "PKCS11: Test Find Objects");
Vesa Jääskeläinen33ada292021-01-13 23:17:55 +02002808
2809static void xtest_pkcs11_test_1012(ADBG_Case_t *c)
2810{
2811 CK_RV rv = CKR_GENERAL_ERROR;
2812 CK_SLOT_ID slot = 0;
2813 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
2814 CK_FLAGS session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
2815 CK_OBJECT_HANDLE obj_hdl = CK_INVALID_HANDLE;
2816 CK_OBJECT_HANDLE key_hdl = CK_INVALID_HANDLE;
2817 size_t i = 0;
2818
2819 CK_OBJECT_CLASS obj_class = CKO_DATA;
2820 CK_BBOOL obj_token = CK_FALSE;
2821 CK_BBOOL obj_private = CK_FALSE;
2822 uint8_t obj_value[5] = { 1, 2, 3, 4, 5 };
2823 const char *obj_label = "Label";
2824
2825 CK_ATTRIBUTE object_template[] = {
2826 { CKA_CLASS, &obj_class, sizeof(obj_class) },
2827 { CKA_TOKEN, &obj_token, sizeof(obj_token) },
2828 { CKA_PRIVATE, &obj_private, sizeof(obj_private) },
2829 { CKA_VALUE, obj_value, sizeof(obj_value) },
2830 { CKA_LABEL, (CK_UTF8CHAR_PTR)obj_label, strlen(obj_label) },
2831 };
2832
2833 CK_OBJECT_CLASS secret_class = CKO_SECRET_KEY;
2834 CK_BBOOL secret_token = CK_FALSE;
2835 CK_BBOOL secret_private = CK_FALSE;
2836 CK_KEY_TYPE secret_key_type = CKK_GENERIC_SECRET;
2837 CK_ULONG secret_len = 32;
2838 CK_MECHANISM_TYPE secret_allowed_mecha[] = { CKM_SHA_1_HMAC,
2839 CKM_SHA224_HMAC,
2840 CKM_SHA256_HMAC };
2841
2842 CK_ATTRIBUTE secret_template[] = {
2843 { CKA_CLASS, &secret_class, sizeof(secret_class) },
2844 { CKA_TOKEN, &secret_token, sizeof(secret_token) },
2845 { CKA_PRIVATE, &secret_private, sizeof(secret_private) },
2846 { CKA_KEY_TYPE, &secret_key_type, sizeof(secret_key_type) },
2847 { CKA_VALUE_LEN, &secret_len, sizeof(secret_len) },
2848 { CKA_ALLOWED_MECHANISMS, secret_allowed_mecha,
2849 sizeof(secret_allowed_mecha) }
2850 };
2851
2852 CK_BBOOL g_token = CK_TRUE;
2853 CK_BBOOL g_private = CK_TRUE;
2854 CK_OBJECT_CLASS g_class = ~0;
2855 uint8_t g_value[128] = { 0 };
2856 CK_MECHANISM_TYPE g_mecha_list[10] = { 0 };
2857
2858 uint8_t *data_ptr = NULL;
2859
2860 CK_ATTRIBUTE get_attr_template_bc[] = {
2861 { CKA_TOKEN, &g_token, sizeof(g_token) },
2862 { CKA_CLASS, &g_class, sizeof(g_class) },
2863 };
2864
2865 CK_ATTRIBUTE get_attr_template_cb[] = {
2866 { CKA_CLASS, &g_class, sizeof(g_class) },
2867 { CKA_TOKEN, &g_token, sizeof(g_token) },
2868 };
2869
Vesa Jääskeläinen2f068b12021-06-27 17:46:53 +03002870 CK_ATTRIBUTE get_attr_template_query_bc[] = {
2871 { CKA_TOKEN, NULL, 0 },
2872 { CKA_CLASS, NULL, 0 },
2873 };
2874
2875 CK_ATTRIBUTE get_attr_template_query_cb[] = {
2876 { CKA_CLASS, NULL, 0 },
2877 { CKA_TOKEN, NULL, 0 },
2878 };
2879
Vesa Jääskeläinen33ada292021-01-13 23:17:55 +02002880 CK_ATTRIBUTE get_attr_template_ve[] = {
2881 { CKA_VALUE, &g_value, sizeof(obj_value) },
2882 };
2883
2884 CK_ATTRIBUTE get_attr_template_vl[] = {
2885 { CKA_VALUE, &g_value, sizeof(g_value) },
2886 };
2887
2888 CK_ATTRIBUTE get_attr_template_bvecb[] = {
2889 { CKA_TOKEN, &g_token, sizeof(g_token) },
2890 { CKA_VALUE, &g_value, sizeof(obj_value) },
2891 { CKA_CLASS, &g_class, sizeof(g_class) },
2892 { CKA_TOKEN, &g_private, sizeof(g_private) },
2893 };
2894
2895 CK_ATTRIBUTE get_attr_template_bvlcb[] = {
2896 { CKA_TOKEN, &g_token, sizeof(g_token) },
2897 { CKA_VALUE, &g_value, sizeof(g_value) },
2898 { CKA_CLASS, &g_class, sizeof(g_class) },
2899 { CKA_TOKEN, &g_private, sizeof(g_private) },
2900 };
2901
2902 CK_ATTRIBUTE get_attr_template_am[] = {
2903 { CKA_ALLOWED_MECHANISMS, &g_mecha_list, sizeof(g_mecha_list) },
2904 };
2905
2906 rv = init_lib_and_find_token_slot(&slot);
2907 if (!ADBG_EXPECT_CK_OK(c, rv))
2908 return;
2909
2910 rv = init_test_token(slot);
2911 if (!ADBG_EXPECT_CK_OK(c, rv))
2912 goto close_lib;
2913
2914 rv = init_user_test_token(slot);
2915 if (!ADBG_EXPECT_CK_OK(c, rv))
2916 goto close_lib;
2917
2918 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
2919 if (!ADBG_EXPECT_CK_OK(c, rv))
2920 goto close_lib;
2921
2922 /* Session Public Obj CKA_TOKEN = CK_FALSE, CKA_PRIVATE = CK_FALSE */
2923 rv = C_CreateObject(session, object_template,
2924 ARRAY_SIZE(object_template), &obj_hdl);
2925 if (!ADBG_EXPECT_CK_OK(c, rv))
2926 goto out;
2927
2928 /*
2929 * Sub test: Test Boolean (1 byte) + object class (CK_ULONG)
2930 */
2931 Do_ADBG_BeginSubCase(c, "Get Attribute - boolean + class");
2932 g_token = CK_TRUE;
2933 g_class = ~0;
2934
2935 rv = C_GetAttributeValue(session, obj_hdl, get_attr_template_bc,
2936 ARRAY_SIZE(get_attr_template_bc));
2937 if (!ADBG_EXPECT_CK_OK(c, rv))
2938 goto out;
2939
2940 ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_DATA);
2941 ADBG_EXPECT_COMPARE_UNSIGNED(c, g_token, ==, CK_FALSE);
2942
2943 Do_ADBG_EndSubCase(c, NULL);
2944
2945 /*
2946 * Sub test: object class (CK_ULONG) + Test Boolean (1 byte)
2947 */
2948 Do_ADBG_BeginSubCase(c, "Get Attribute - class + boolean");
2949 g_token = CK_TRUE;
2950 g_class = ~0;
2951
2952 rv = C_GetAttributeValue(session, obj_hdl, get_attr_template_cb,
2953 ARRAY_SIZE(get_attr_template_cb));
2954 if (!ADBG_EXPECT_CK_OK(c, rv))
2955 goto out;
2956
2957 ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_DATA);
2958 ADBG_EXPECT_COMPARE_UNSIGNED(c, g_token, ==, CK_FALSE);
2959
2960 Do_ADBG_EndSubCase(c, NULL);
2961
2962 /*
Vesa Jääskeläinen2f068b12021-06-27 17:46:53 +03002963 * Sub test: Query size boolean (1 byte) + object class (CK_ULONG)
2964 */
2965 Do_ADBG_BeginSubCase(c, "Get Attribute - query size boolean + class");
2966 g_token = CK_TRUE;
2967 g_class = ~0;
2968
2969 rv = C_GetAttributeValue(session, obj_hdl, get_attr_template_query_bc,
2970 ARRAY_SIZE(get_attr_template_query_bc));
2971 if (!ADBG_EXPECT_CK_OK(c, rv))
2972 goto out;
2973
2974 ADBG_EXPECT_COMPARE_UNSIGNED(c,
2975 get_attr_template_query_bc[0].ulValueLen, ==, 1);
2976 ADBG_EXPECT_COMPARE_UNSIGNED(c,
2977 get_attr_template_query_bc[1].ulValueLen, ==, sizeof(CK_ULONG));
2978
2979 Do_ADBG_EndSubCase(c, NULL);
2980
2981 /*
2982 * Sub test: Query size object class (CK_ULONG) + boolean (1 byte)
2983 */
2984 Do_ADBG_BeginSubCase(c, "Get Attribute - query size class + boolean");
2985 g_token = CK_TRUE;
2986 g_class = ~0;
2987
2988 rv = C_GetAttributeValue(session, obj_hdl, get_attr_template_query_cb,
2989 ARRAY_SIZE(get_attr_template_query_cb));
2990 if (!ADBG_EXPECT_CK_OK(c, rv))
2991 goto out;
2992
2993 ADBG_EXPECT_COMPARE_UNSIGNED(c,
2994 get_attr_template_query_cb[0].ulValueLen, ==, sizeof(CK_ULONG));
2995 ADBG_EXPECT_COMPARE_UNSIGNED(c,
2996 get_attr_template_query_cb[1].ulValueLen, ==, 1);
2997
2998 Do_ADBG_EndSubCase(c, NULL);
2999
3000 /*
Vesa Jääskeläinen33ada292021-01-13 23:17:55 +02003001 * Sub test: value with exact size
3002 */
3003 Do_ADBG_BeginSubCase(c, "Get Attribute - value with exact size buffer");
3004 memset(g_value, 0xCC, sizeof(g_value));
3005
3006 rv = C_GetAttributeValue(session, obj_hdl, get_attr_template_ve,
3007 ARRAY_SIZE(get_attr_template_ve));
3008 if (!ADBG_EXPECT_CK_OK(c, rv))
3009 goto out;
3010
3011 ADBG_EXPECT_COMPARE_UNSIGNED(c, get_attr_template_ve[0].ulValueLen, ==, sizeof(obj_value));
3012 ADBG_EXPECT_EQUAL(c, g_value, obj_value, sizeof(obj_value));
3013 for (i = sizeof(obj_value); i < sizeof(g_value); i++)
3014 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, g_value[i], ==, 0xCC))
3015 break;
3016
3017 Do_ADBG_EndSubCase(c, NULL);
3018
3019 /*
3020 * Sub test: value with larger buffer
3021 */
3022 Do_ADBG_BeginSubCase(c, "Get Attribute - value with larger buffer");
3023 memset(g_value, 0xCC, sizeof(g_value));
3024
3025 rv = C_GetAttributeValue(session, obj_hdl, get_attr_template_vl,
3026 ARRAY_SIZE(get_attr_template_vl));
3027 if (!ADBG_EXPECT_CK_OK(c, rv))
3028 goto out;
3029
3030 ADBG_EXPECT_COMPARE_UNSIGNED(c, get_attr_template_vl[0].ulValueLen, ==, sizeof(obj_value));
3031 ADBG_EXPECT_EQUAL(c, g_value, obj_value, sizeof(obj_value));
3032 for (i = sizeof(obj_value); i < sizeof(g_value); i++)
3033 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, g_value[i], ==, 0xCC))
3034 break;
3035
3036 Do_ADBG_EndSubCase(c, NULL);
3037
3038 /*
3039 * Sub test: bool + value with exact size + class + bool
3040 */
3041 Do_ADBG_BeginSubCase(c, "Get Attribute - bool + value with exact size + class + bool");
3042 memset(g_value, 0xCC, sizeof(g_value));
3043 g_token = CK_TRUE;
3044 g_private = CK_TRUE;
3045 g_class = ~0;
3046
3047 rv = C_GetAttributeValue(session, obj_hdl, get_attr_template_bvecb,
3048 ARRAY_SIZE(get_attr_template_bvecb));
3049 if (!ADBG_EXPECT_CK_OK(c, rv))
3050 goto out;
3051
3052 ADBG_EXPECT_COMPARE_UNSIGNED(c, get_attr_template_bvecb[1].ulValueLen,
3053 ==, sizeof(obj_value));
3054 ADBG_EXPECT_EQUAL(c, g_value, obj_value, sizeof(obj_value));
3055 for (i = sizeof(obj_value); i < sizeof(g_value); i++)
3056 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, g_value[i], ==, 0xCC))
3057 break;
3058
3059 ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_DATA);
3060 ADBG_EXPECT_COMPARE_UNSIGNED(c, g_token, ==, CK_FALSE);
3061 ADBG_EXPECT_COMPARE_UNSIGNED(c, g_private, ==, CK_FALSE);
3062
3063 Do_ADBG_EndSubCase(c, NULL);
3064
3065 /*
3066 * Sub test: bool + value with larger buffer + class + bool
3067 */
3068 Do_ADBG_BeginSubCase(c, "Get Attribute - bool + value with larger buffer + class + bool");
3069 memset(g_value, 0xCC, sizeof(g_value));
3070 g_token = CK_TRUE;
3071 g_private = CK_TRUE;
3072 g_class = ~0;
3073
3074 rv = C_GetAttributeValue(session, obj_hdl, get_attr_template_bvlcb,
3075 ARRAY_SIZE(get_attr_template_bvlcb));
3076 if (!ADBG_EXPECT_CK_OK(c, rv))
3077 goto out;
3078
3079 ADBG_EXPECT_COMPARE_UNSIGNED(c, get_attr_template_bvlcb[1].ulValueLen,
3080 ==, sizeof(obj_value));
3081 ADBG_EXPECT_EQUAL(c, g_value, obj_value, sizeof(obj_value));
3082 for (i = sizeof(obj_value); i < sizeof(g_value); i++)
3083 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, g_value[i], ==, 0xCC))
3084 break;
3085
3086 ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_DATA);
3087 ADBG_EXPECT_COMPARE_UNSIGNED(c, g_token, ==, CK_FALSE);
3088 ADBG_EXPECT_COMPARE_UNSIGNED(c, g_private, ==, CK_FALSE);
3089
3090 Do_ADBG_EndSubCase(c, NULL);
3091
3092 /*
3093 * Sub test: allowed mechanism list
3094 */
3095 Do_ADBG_BeginSubCase(c, "Get Attribute - allowed mechanism list");
3096 memset(g_mecha_list, 0xCC, sizeof(g_mecha_list));
3097
3098 rv = C_GenerateKey(session, &cktest_gensecret_keygen_mechanism,
3099 secret_template, ARRAY_SIZE(secret_template),
3100 &key_hdl);
3101 if (!ADBG_EXPECT_CK_OK(c, rv))
3102 goto out;
3103
3104 rv = C_GetAttributeValue(session, key_hdl, get_attr_template_am,
3105 ARRAY_SIZE(get_attr_template_am));
3106 if (!ADBG_EXPECT_CK_OK(c, rv))
3107 goto out;
3108
3109 ADBG_EXPECT_COMPARE_UNSIGNED(c, get_attr_template_am[0].ulValueLen, ==,
3110 sizeof(secret_allowed_mecha));
3111
3112 for (i = 0; i < sizeof(secret_allowed_mecha) / sizeof(*secret_allowed_mecha); i++)
3113 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, g_mecha_list[i], ==, secret_allowed_mecha[i]))
3114 break;
3115
3116 data_ptr = (uint8_t *)g_mecha_list;
3117 for (i = sizeof(secret_allowed_mecha); i < sizeof(g_mecha_list); i++)
3118 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, data_ptr[i], ==, 0xCC))
3119 break;
3120
3121 Do_ADBG_EndSubCase(c, NULL);
3122
3123out:
3124 ADBG_EXPECT_CK_OK(c, C_CloseSession(session));
3125
3126close_lib:
3127 ADBG_EXPECT_CK_OK(c, close_lib());
3128}
3129ADBG_CASE_DEFINE(pkcs11, 1012, xtest_pkcs11_test_1012,
3130 "PKCS11: Serializer tests");
Ruchika Guptafdabbfa2021-01-25 11:55:18 +05303131
3132static void xtest_pkcs11_test_1013(ADBG_Case_t *c)
3133{
3134 CK_RV rv = CKR_GENERAL_ERROR;
3135 CK_SLOT_ID slot = 0;
3136 CK_SESSION_HANDLE rw_session = CK_INVALID_HANDLE;
3137 CK_SESSION_HANDLE ro_session = CK_INVALID_HANDLE;
3138 CK_FLAGS rw_session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
3139 CK_FLAGS ro_session_flags = CKF_SERIAL_SESSION;
3140 CK_OBJECT_HANDLE obj_hdl = CK_INVALID_HANDLE;
3141 const char *label = "Dummy Objects";
3142 bool ro_logged_in = false;
3143
3144 rv = init_lib_and_find_token_slot(&slot);
3145 if (!ADBG_EXPECT_CK_OK(c, rv))
3146 return;
3147
3148 rv = init_test_token(slot);
3149 if (!ADBG_EXPECT_CK_OK(c, rv))
3150 goto close_lib;
3151
3152 rv = init_user_test_token(slot);
3153 if (!ADBG_EXPECT_CK_OK(c, rv))
3154 goto close_lib;
3155
3156 /* Open a RW session */
3157 rv = C_OpenSession(slot, rw_session_flags, NULL, 0, &rw_session);
3158 if (!ADBG_EXPECT_CK_OK(c, rv))
3159 goto close_lib;
3160
3161 /* Open a RO session */
3162 rv = C_OpenSession(slot, ro_session_flags, NULL, 0, &ro_session);
3163 if (!ADBG_EXPECT_CK_OK(c, rv))
3164 goto close_lib;
3165
3166 /*
3167 * Sub test: Check object creation from a R/O Public session
3168 */
3169 Do_ADBG_BeginSubCase(c, "Create objects in R/O Public Session");
3170
3171 /* Session Public Obj CKA_TOKEN = CK_FALSE, CKA_PRIVATE = CK_FALSE */
3172 rv = create_data_object(ro_session, &obj_hdl, CK_FALSE,
3173 CK_FALSE, label);
3174 if (!ADBG_EXPECT_CK_OK(c, rv))
3175 goto out;
3176
3177 /* Session Private Obj CKA_TOKEN = CK_FALSE, CKA_PRIVATE = CK_TRUE */
3178 rv = create_data_object(ro_session, &obj_hdl, CK_FALSE,
3179 CK_TRUE, label);
3180 if (!ADBG_EXPECT_CK_RESULT(c, CKR_USER_NOT_LOGGED_IN, rv))
3181 goto out;
3182
3183 /* Token Public Obj CKA_TOKEN = CK_TRUE, CKA_PRIVATE = CK_FALSE */
3184 rv = create_data_object(ro_session, &obj_hdl, CK_TRUE,
3185 CK_FALSE, label);
3186 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SESSION_READ_ONLY, rv))
3187 goto out;
3188
3189 /* Token Private Obj CKA_TOKEN = CK_TRUE, CKA_PRIVATE = CK_TRUE */
3190 rv = create_data_object(ro_session, &obj_hdl, CK_TRUE,
3191 CK_TRUE, label);
3192 /* For Token object creation, SESSION_READ_ONLY will take priority */
3193 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SESSION_READ_ONLY, rv))
3194 goto out;
3195
3196 Do_ADBG_EndSubCase(c, NULL);
3197
3198 /*
3199 * Sub test: Check access for a R/W Public session
3200 */
3201 Do_ADBG_BeginSubCase(c, "Create objects in R/O Public Session");
3202
3203 /* Session Public Obj CKA_TOKEN = CK_FALSE, CKA_PRIVATE = CK_FALSE */
3204 rv = create_data_object(rw_session, &obj_hdl, CK_FALSE,
3205 CK_FALSE, label);
3206 if (!ADBG_EXPECT_CK_OK(c, rv))
3207 goto out;
3208
3209 /* Session Private Obj CKA_TOKEN = CK_FALSE, CKA_PRIVATE = CK_TRUE */
3210 rv = create_data_object(rw_session, &obj_hdl, CK_FALSE,
3211 CK_TRUE, label);
3212 if (!ADBG_EXPECT_CK_RESULT(c, CKR_USER_NOT_LOGGED_IN, rv))
3213 goto out;
3214
3215 /* Token Public Obj CKA_TOKEN = CK_TRUE, CKA_PRIVATE = CK_FALSE */
3216 rv = create_data_object(rw_session, &obj_hdl, CK_TRUE,
3217 CK_FALSE, label);
3218 if (!ADBG_EXPECT_CK_OK(c, rv))
3219 goto out;
3220
3221 /* Token Private Obj CKA_TOKEN = CK_TRUE, CKA_PRIVATE = CK_TRUE */
3222 rv = create_data_object(rw_session, &obj_hdl, CK_TRUE,
3223 CK_TRUE, label);
3224 if (!ADBG_EXPECT_CK_RESULT(c, CKR_USER_NOT_LOGGED_IN, rv))
3225 goto out;
3226
3227 Do_ADBG_EndSubCase(c, NULL);
3228
3229 /*
3230 * Sub test: Check access for a R/O User session
3231 */
3232 Do_ADBG_BeginSubCase(c, "Create objects in R/O User Session");
3233
3234 /* Login to Test Token */
3235 rv = C_Login(ro_session, CKU_USER, test_token_user_pin,
3236 sizeof(test_token_user_pin));
3237 if (!ADBG_EXPECT_CK_OK(c, rv))
3238 goto out;
3239
3240 ro_logged_in = true;
3241
3242 /* Session Public Obj CKA_TOKEN = CK_FALSE, CKA_PRIVATE = CK_FALSE */
3243 rv = create_data_object(ro_session, &obj_hdl, CK_FALSE,
3244 CK_FALSE, label);
3245 if (!ADBG_EXPECT_CK_OK(c, rv))
3246 goto out;
3247
3248 /* Session Private Obj CKA_TOKEN = CK_FALSE, CKA_PRIVATE = CK_TRUE */
3249 rv = create_data_object(ro_session, &obj_hdl, CK_FALSE,
3250 CK_TRUE, label);
3251 if (!ADBG_EXPECT_CK_OK(c, rv))
3252 goto out;
3253
3254 /* Token Public Obj CKA_TOKEN = CK_TRUE, CKA_PRIVATE = CK_FALSE */
3255 rv = create_data_object(ro_session, &obj_hdl, CK_TRUE,
3256 CK_FALSE, label);
3257 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SESSION_READ_ONLY, rv))
3258 goto out;
3259
3260 /* Token Private Obj CKA_TOKEN = CK_TRUE, CKA_PRIVATE = CK_TRUE */
3261 rv = create_data_object(ro_session, &obj_hdl, CK_TRUE,
3262 CK_TRUE, label);
3263 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SESSION_READ_ONLY, rv))
3264 goto out;
3265
3266 Do_ADBG_EndSubCase(c, NULL);
3267
3268 /*
3269 * Sub test: Check access for a R/W User session
3270 */
3271 Do_ADBG_BeginSubCase(c, "Create objects in R/W User Session");
3272
3273 /* Session Public Obj CKA_TOKEN = CK_FALSE, CKA_PRIVATE = CK_FALSE */
3274 rv = create_data_object(rw_session, &obj_hdl, CK_FALSE,
3275 CK_FALSE, label);
3276 if (!ADBG_EXPECT_CK_OK(c, rv))
3277 goto out;
3278
3279 /* Session Private Obj CKA_TOKEN = CK_FALSE, CKA_PRIVATE = CK_TRUE */
3280 rv = create_data_object(rw_session, &obj_hdl, CK_FALSE,
3281 CK_TRUE, label);
3282 if (!ADBG_EXPECT_CK_OK(c, rv))
3283 goto out;
3284
3285 /* Token Public Obj CKA_TOKEN = CK_TRUE, CKA_PRIVATE = CK_FALSE */
3286 rv = create_data_object(rw_session, &obj_hdl, CK_TRUE,
3287 CK_FALSE, label);
3288 if (!ADBG_EXPECT_CK_OK(c, rv))
3289 goto out;
3290
3291 /* Token Private Obj CKA_TOKEN = CK_TRUE, CKA_PRIVATE = CK_TRUE */
3292 rv = create_data_object(rw_session, &obj_hdl, CK_TRUE,
3293 CK_TRUE, label);
3294 if (!ADBG_EXPECT_CK_OK(c, rv))
3295 goto out;
3296
3297 /* Log out */
3298 ADBG_EXPECT_CK_OK(c, C_Logout(ro_session));
3299 ro_logged_in = false;
3300
3301 /* Close RO session */
3302 ADBG_EXPECT_CK_OK(c, C_CloseSession(ro_session));
3303 ro_session = CK_INVALID_HANDLE;
3304
3305 Do_ADBG_EndSubCase(c, NULL);
3306
3307 /*
3308 * Sub test: Check access for a R/W SO session
3309 */
3310 Do_ADBG_BeginSubCase(c, "Create objects in R/W SO Session");
3311
3312 /* Login as security officer in RW session */
3313 rv = C_Login(rw_session, CKU_SO, test_token_so_pin,
3314 sizeof(test_token_so_pin));
3315 if (!ADBG_EXPECT_CK_OK(c, rv))
3316 goto out;
3317
3318 /* Session Public Obj CKA_TOKEN = CK_FALSE, CKA_PRIVATE = CK_FALSE */
3319 rv = create_data_object(rw_session, &obj_hdl, CK_FALSE,
3320 CK_FALSE, label);
3321 if (!ADBG_EXPECT_CK_OK(c, rv))
3322 goto logout;
3323
3324 /* Session Private Obj CKA_TOKEN = CK_FALSE, CKA_PRIVATE = CK_TRUE */
3325 rv = create_data_object(rw_session, &obj_hdl, CK_FALSE,
3326 CK_TRUE, label);
3327 if (!ADBG_EXPECT_CK_RESULT(c, CKR_USER_NOT_LOGGED_IN, rv))
3328 goto logout;
3329
3330 /* Token Public Obj CKA_TOKEN = CK_TRUE, CKA_PRIVATE = CK_FALSE */
3331 rv = create_data_object(rw_session, &obj_hdl, CK_TRUE,
3332 CK_FALSE, label);
3333 if (!ADBG_EXPECT_CK_OK(c, rv))
3334 goto logout;
3335
3336 /* Token Private Obj CKA_TOKEN = CK_TRUE, CKA_PRIVATE = CK_TRUE */
3337 rv = create_data_object(rw_session, &obj_hdl, CK_TRUE,
3338 CK_TRUE, label);
3339 if (!ADBG_EXPECT_CK_RESULT(c, CKR_USER_NOT_LOGGED_IN, rv))
3340 goto logout;
3341
3342logout:
3343 ADBG_EXPECT_CK_OK(c, C_Logout(rw_session));
3344out:
3345 if (ro_logged_in)
3346 ADBG_EXPECT_CK_OK(c, C_Logout(ro_session));
3347
3348 if (ro_session != CK_INVALID_HANDLE)
3349 ADBG_EXPECT_CK_OK(c, C_CloseSession(ro_session));
3350
3351 ADBG_EXPECT_CK_OK(c, C_CloseSession(rw_session));
3352
3353 Do_ADBG_EndSubCase(c, NULL);
3354
3355 destroy_persistent_objects(c, slot);
3356close_lib:
3357 ADBG_EXPECT_CK_OK(c, close_lib());
3358
3359}
3360ADBG_CASE_DEFINE(pkcs11, 1013, xtest_pkcs11_test_1013,
3361 "PKCS11: Object creation upon session type");
Ruchika Gupta1fe9d4e2021-01-28 13:52:27 +05303362
3363static void xtest_pkcs11_test_1014(ADBG_Case_t *c)
3364{
3365 CK_RV rv = CKR_GENERAL_ERROR;
3366 CK_SLOT_ID slot = 0;
3367 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
3368 CK_FLAGS session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
3369 CK_OBJECT_HANDLE obj_hdl = CK_INVALID_HANDLE;
3370 const char *id = "1";
3371 const char *label = "Dummy Objects";
3372 const char *new_label = "New Object lable";
3373 size_t n = 0;
3374 char *g_label[100] = { };
3375 char *g_id[100] = { };
3376 CK_MECHANISM_TYPE secret_allowed_mecha[] = { CKM_SHA_1_HMAC,
3377 CKM_SHA224_HMAC,
3378 CKM_SHA256_HMAC };
3379 CK_ATTRIBUTE secret_key_template[] = {
3380 { CKA_CLASS, &(CK_OBJECT_CLASS){CKO_SECRET_KEY},
3381 sizeof(CK_OBJECT_CLASS) },
3382 { CKA_TOKEN, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
3383 { CKA_PRIVATE, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
3384 { CKA_MODIFIABLE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3385 { CKA_COPYABLE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3386 { CKA_DESTROYABLE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3387 { CKA_EXTRACTABLE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3388 { CKA_KEY_TYPE, &(CK_KEY_TYPE){CKK_GENERIC_SECRET},
3389 sizeof(CK_KEY_TYPE) },
3390 { CKA_LABEL, (CK_UTF8CHAR_PTR)label, strlen(label) },
Ruchika Guptae86aba22021-03-11 00:36:01 +05303391 { CKA_VALUE, (void *)cktest_aes128_key, sizeof(cktest_aes128_key) },
Ruchika Gupta1fe9d4e2021-01-28 13:52:27 +05303392 { CKA_SIGN, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3393 { CKA_VERIFY, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3394 { CKA_ENCRYPT, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3395 { CKA_DECRYPT, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3396 { CKA_ALLOWED_MECHANISMS, secret_allowed_mecha,
3397 sizeof(secret_allowed_mecha) },
3398 };
3399 CK_BBOOL g_derive = CK_FALSE;
3400 CK_BBOOL g_sign = CK_FALSE;
3401 CK_BBOOL g_verify = CK_FALSE;
3402 CK_BBOOL g_encrypt = CK_FALSE;
3403 CK_BBOOL g_decrypt = CK_FALSE;
3404 CK_BBOOL g_wrap = CK_FALSE;
3405 CK_BBOOL g_unwrap = CK_FALSE;
Ruchika Guptae86aba22021-03-11 00:36:01 +05303406 uint32_t g_len = 0;
Ruchika Gupta1fe9d4e2021-01-28 13:52:27 +05303407 CK_ATTRIBUTE get_template[] = {
3408 { CKA_LABEL, (CK_UTF8CHAR_PTR)g_label, sizeof(g_label) },
3409 { CKA_ID, (CK_BYTE_PTR)g_id, sizeof(g_id) },
3410 { CKA_DERIVE, &g_derive, sizeof(CK_BBOOL) },
3411 { CKA_SIGN, &g_sign, sizeof(CK_BBOOL) },
3412 { CKA_VERIFY, &g_verify, sizeof(CK_BBOOL) },
3413 { CKA_ENCRYPT, &g_encrypt, sizeof(CK_BBOOL) },
3414 { CKA_DECRYPT, &g_decrypt, sizeof(CK_BBOOL) },
3415 { CKA_WRAP, &g_wrap, sizeof(CK_BBOOL) },
3416 { CKA_UNWRAP, &g_unwrap, sizeof(CK_BBOOL) },
Ruchika Guptae86aba22021-03-11 00:36:01 +05303417 { CKA_VALUE_LEN, &g_len, sizeof(CK_ULONG) },
Ruchika Gupta1fe9d4e2021-01-28 13:52:27 +05303418 };
3419 CK_ATTRIBUTE set_template[] = {
3420 { CKA_LABEL, (CK_UTF8CHAR_PTR)new_label, strlen(new_label) },
3421 { CKA_ID, (CK_BYTE_PTR)id, strlen(id) },
3422 { CKA_DERIVE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3423 { CKA_WRAP, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3424 { CKA_UNWRAP, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3425 { CKA_SIGN, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
3426 { CKA_VERIFY, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
3427 { CKA_ENCRYPT, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
3428 { CKA_DECRYPT, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
3429 /* CKA_SENSITIVE -> CK_FALSE to CK_TRUE is allowed */
3430 { CKA_SENSITIVE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3431 /* CKA_EXTRACTABLE -> CK_TRUE to CK_FALSE is allowed */
3432 { CKA_EXTRACTABLE, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
3433 /* CKA_COPYABLE -> CK_TRUE to CK_FALSE is allowed */
3434 { CKA_COPYABLE, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
3435 };
3436 CK_ATTRIBUTE set_inv_template1[] = {
3437 /* Attributes Not Modifiable */
3438 { CKA_CLASS, &(CK_OBJECT_CLASS){CKO_DATA},
3439 sizeof(CK_OBJECT_CLASS) },
3440 { CKA_LOCAL, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3441 { CKA_ALWAYS_SENSITIVE, &(CK_BBOOL){CK_FALSE},
3442 sizeof(CK_BBOOL) },
3443 { CKA_NEVER_EXTRACTABLE, &(CK_BBOOL){CK_FALSE},
3444 sizeof(CK_BBOOL) },
3445 { CKA_TOKEN, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3446 { CKA_PRIVATE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3447 { CKA_MODIFIABLE, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
3448 { CKA_DESTROYABLE, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
3449 /* Change not allowed from CK_TRUE -> CK_FALSE */
3450 { CKA_SENSITIVE, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
3451 /* Change not allowed from CK_FALSE -> CK_TRUE */
3452 { CKA_EXTRACTABLE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3453 { CKA_COPYABLE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3454 };
3455 CK_ATTRIBUTE set_inv_template2[] = {
3456 { CKA_APPLICATION, (CK_UTF8CHAR_PTR)label, sizeof(label) },
3457 };
3458 CK_ATTRIBUTE set_trusted_template[] = {
3459 { CKA_TRUSTED, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3460 };
3461
3462 rv = init_lib_and_find_token_slot(&slot);
3463 if (!ADBG_EXPECT_CK_OK(c, rv))
3464 return;
3465
3466 rv = init_test_token(slot);
3467 if (!ADBG_EXPECT_CK_OK(c, rv))
3468 goto close_lib;
3469
3470 rv = init_user_test_token(slot);
3471 if (!ADBG_EXPECT_CK_OK(c, rv))
3472 goto close_lib;
3473
3474 /* Open a RW session */
3475 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
3476 if (!ADBG_EXPECT_CK_OK(c, rv))
3477 goto close_lib;
3478
3479 /* Create a secret key object */
3480 rv = C_CreateObject(session, secret_key_template,
3481 ARRAY_SIZE(secret_key_template), &obj_hdl);
3482 if (!ADBG_EXPECT_CK_OK(c, rv))
3483 goto close_session;
3484
3485 Do_ADBG_BeginSubCase(c, "Set attributes on secret key object");
3486
3487 rv = C_GetAttributeValue(session, obj_hdl, get_template,
3488 ARRAY_SIZE(get_template));
3489 if (!ADBG_EXPECT_CK_OK(c, rv) ||
3490 !ADBG_EXPECT_BUFFER(c, label, strlen(label), g_label,
3491 get_template[0].ulValueLen) ||
3492 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_derive, ==, CK_FALSE) ||
3493 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_wrap, ==, CK_FALSE) ||
3494 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_unwrap, ==, CK_FALSE) ||
3495 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_encrypt, ==, CK_TRUE) ||
3496 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_decrypt, ==, CK_TRUE) ||
3497 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sign, ==, CK_TRUE) ||
3498 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_verify, ==, CK_TRUE) ||
Ruchika Guptae86aba22021-03-11 00:36:01 +05303499 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_len, ==, 16) ||
Ruchika Gupta1fe9d4e2021-01-28 13:52:27 +05303500 !ADBG_EXPECT_COMPARE_UNSIGNED(c, get_template[1].ulValueLen, ==, 0))
3501 goto out;
3502
3503 rv = C_SetAttributeValue(session, obj_hdl, set_template,
3504 ARRAY_SIZE(set_template));
3505 if (!ADBG_EXPECT_CK_OK(c, rv))
3506 goto out;
3507
3508 get_template[0].ulValueLen = sizeof(g_label);
3509 get_template[1].ulValueLen = sizeof(g_id);
3510 rv = C_GetAttributeValue(session, obj_hdl, get_template,
3511 ARRAY_SIZE(get_template));
3512 if (!ADBG_EXPECT_CK_OK(c, rv) ||
3513 !ADBG_EXPECT_BUFFER(c, new_label, strlen(new_label), g_label,
3514 get_template[0].ulValueLen) ||
3515 !ADBG_EXPECT_BUFFER(c, id, strlen(id), g_id,
3516 get_template[1].ulValueLen) ||
3517 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_derive, ==, CK_TRUE) ||
3518 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_wrap, ==, CK_TRUE) ||
3519 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_unwrap, ==, CK_TRUE) ||
3520 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_encrypt, ==, CK_FALSE) ||
3521 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_decrypt, ==, CK_FALSE) ||
3522 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sign, ==, CK_FALSE) ||
3523 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_verify, ==, CK_FALSE))
3524 goto out;
3525
3526 Do_ADBG_EndSubCase(c, NULL);
3527
3528 Do_ADBG_BeginSubCase(c, "Test Invalid template with R/O Attributes");
3529
3530 for (n = 0; n < ARRAY_SIZE(set_inv_template1); n++) {
3531 rv = C_SetAttributeValue(session, obj_hdl,
3532 &set_inv_template1[n], 1);
3533 if (!ADBG_EXPECT_CK_RESULT(c, CKR_ATTRIBUTE_READ_ONLY, rv))
3534 goto out;
3535 }
3536
3537 Do_ADBG_EndSubCase(c, NULL);
3538
3539 Do_ADBG_BeginSubCase(c, "Test Invalid template with Invalid Attribute");
3540
3541 rv = C_SetAttributeValue(session, obj_hdl, set_inv_template2,
3542 ARRAY_SIZE(set_inv_template2));
3543 if (!ADBG_EXPECT_CK_RESULT(c, CKR_ATTRIBUTE_TYPE_INVALID, rv))
3544 goto out;
3545
3546 Do_ADBG_EndSubCase(c, NULL);
3547
3548 Do_ADBG_BeginSubCase(c, "Set CKA_TRUSTED with and w/o SO Login");
3549
3550 rv = C_SetAttributeValue(session, obj_hdl, set_trusted_template,
3551 ARRAY_SIZE(set_trusted_template));
3552 if (!ADBG_EXPECT_CK_RESULT(c, CKR_ATTRIBUTE_READ_ONLY, rv))
3553 goto out;
3554
3555 /* Login as SO in RW session */
3556 rv = C_Login(session, CKU_SO, test_token_so_pin,
3557 sizeof(test_token_so_pin));
3558 if (!ADBG_EXPECT_CK_OK(c, rv))
3559 goto out;
3560
3561 rv = C_SetAttributeValue(session, obj_hdl, set_trusted_template,
3562 ARRAY_SIZE(set_trusted_template));
3563 ADBG_EXPECT_CK_OK(c, rv);
3564
3565 ADBG_EXPECT_CK_OK(c, C_Logout(session));
3566out:
3567 ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, obj_hdl));
3568
3569 Do_ADBG_EndSubCase(c, NULL);
3570
3571close_session:
3572 ADBG_EXPECT_CK_OK(c, C_CloseSession(session));
3573
3574close_lib:
3575 ADBG_EXPECT_CK_OK(c, close_lib());
3576}
3577ADBG_CASE_DEFINE(pkcs11, 1014, xtest_pkcs11_test_1014,
3578 "PKCS11: Test C_SetAttributeValue()");
Ruchika Gupta1f60ed42021-02-02 13:15:58 +05303579
3580static void xtest_pkcs11_test_1015(ADBG_Case_t *c)
3581{
3582 CK_RV rv = CKR_GENERAL_ERROR;
3583 CK_SLOT_ID slot = 0;
3584 CK_SESSION_HANDLE rw_session = CK_INVALID_HANDLE;
3585 CK_SESSION_HANDLE ro_session = CK_INVALID_HANDLE;
3586 CK_FLAGS rw_session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
3587 CK_FLAGS ro_session_flags = CKF_SERIAL_SESSION;
3588 CK_OBJECT_HANDLE obj_hdl = CK_INVALID_HANDLE;
3589 CK_OBJECT_HANDLE obj_hdl_ro = CK_INVALID_HANDLE;
3590 CK_OBJECT_HANDLE obj_hdl_cp = CK_INVALID_HANDLE;
3591 const char *label = "Dummy Objects";
Ruchika Guptae86aba22021-03-11 00:36:01 +05303592 CK_ATTRIBUTE secret_key_create_template[] = {
3593 { CKA_CLASS, &(CK_OBJECT_CLASS){CKO_SECRET_KEY},
3594 sizeof(CK_OBJECT_CLASS) },
3595 { CKA_KEY_TYPE, &(CK_KEY_TYPE){CKK_AES}, sizeof(CK_KEY_TYPE) },
3596 { CKA_TOKEN, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
3597 { CKA_PRIVATE, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
3598 { CKA_MODIFIABLE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3599 { CKA_COPYABLE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3600 { CKA_DESTROYABLE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3601 { CKA_EXTRACTABLE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3602 { CKA_VALUE, (void *)cktest_aes128_key, sizeof(cktest_aes128_key) },
3603 };
Ruchika Gupta1f60ed42021-02-02 13:15:58 +05303604 CK_ATTRIBUTE secret_key_template[] = {
3605 { CKA_CLASS, &(CK_OBJECT_CLASS){CKO_SECRET_KEY},
3606 sizeof(CK_OBJECT_CLASS) },
3607 { CKA_KEY_TYPE, &(CK_KEY_TYPE){CKK_AES}, sizeof(CK_KEY_TYPE) },
3608 { CKA_TOKEN, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
3609 { CKA_PRIVATE, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
3610 { CKA_MODIFIABLE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3611 { CKA_COPYABLE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3612 { CKA_DESTROYABLE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3613 { CKA_EXTRACTABLE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3614 { CKA_VALUE_LEN, &(CK_ULONG){16}, sizeof(CK_ULONG) },
3615 };
3616 CK_BBOOL g_token = CK_FALSE;
3617 CK_BBOOL g_private = CK_FALSE;
3618 CK_BBOOL g_modify = CK_FALSE;
3619 CK_BBOOL g_copy = CK_FALSE;
3620 CK_BBOOL g_destroy = CK_FALSE;
3621 CK_BBOOL g_extract = CK_FALSE;
3622 CK_BBOOL g_sensitive = CK_FALSE;
3623 CK_BBOOL g_nextract = CK_FALSE;
3624 CK_BBOOL g_asensitive = CK_FALSE;
3625 CK_BBOOL g_local = CK_FALSE;
Vesa Jääskeläinen06f428a2021-06-27 20:02:29 +03003626 CK_BYTE g_value[16] = { };
Ruchika Gupta1f60ed42021-02-02 13:15:58 +05303627 CK_ATTRIBUTE get_template[] = {
3628 { CKA_TOKEN, &g_token, sizeof(CK_BBOOL) },
3629 { CKA_PRIVATE, &g_private, sizeof(CK_BBOOL) },
3630 { CKA_MODIFIABLE, &g_modify, sizeof(CK_BBOOL) },
3631 { CKA_COPYABLE, &g_copy, sizeof(CK_BBOOL) },
3632 { CKA_DESTROYABLE, &g_destroy, sizeof(CK_BBOOL) },
3633 { CKA_EXTRACTABLE, &g_extract, sizeof(CK_BBOOL) },
3634 { CKA_SENSITIVE, &g_sensitive, sizeof(CK_BBOOL) },
3635 { CKA_NEVER_EXTRACTABLE, &g_nextract, sizeof(CK_BBOOL) },
3636 { CKA_ALWAYS_SENSITIVE, &g_asensitive, sizeof(CK_BBOOL) },
3637 { CKA_LOCAL, &g_local, sizeof(CK_BBOOL) },
3638 };
Vesa Jääskeläinen06f428a2021-06-27 20:02:29 +03003639 CK_ATTRIBUTE get_value_template[] = {
3640 { CKA_VALUE, &g_value, sizeof(g_value) }
3641 };
Ruchika Gupta1f60ed42021-02-02 13:15:58 +05303642 CK_ATTRIBUTE copy_template[] = {
3643 { CKA_TOKEN, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3644 { CKA_MODIFIABLE, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
3645 { CKA_EXTRACTABLE, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
3646 { CKA_SENSITIVE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3647 };
3648 CK_ATTRIBUTE copy_template_inv[] = {
3649 { CKA_APPLICATION, (CK_UTF8CHAR_PTR)label, sizeof(label) },
3650 };
3651 CK_ATTRIBUTE copy_template_priv[] = {
3652 { CKA_PRIVATE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
3653 };
3654 CK_ATTRIBUTE set_template[] = {
3655 { CKA_COPYABLE, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
3656 };
3657
3658 rv = init_lib_and_find_token_slot(&slot);
3659 if (!ADBG_EXPECT_CK_OK(c, rv))
3660 return;
3661
3662 rv = init_test_token(slot);
3663 if (!ADBG_EXPECT_CK_OK(c, rv))
3664 goto close_lib;
3665
3666 rv = init_user_test_token(slot);
3667 if (!ADBG_EXPECT_CK_OK(c, rv))
3668 goto close_lib;
3669
3670 /* Open a RW session */
3671 rv = C_OpenSession(slot, rw_session_flags, NULL, 0, &rw_session);
3672 if (!ADBG_EXPECT_CK_OK(c, rv))
3673 goto close_lib;
3674
3675 /* Open a RO session */
3676 rv = C_OpenSession(slot, ro_session_flags, NULL, 0, &ro_session);
3677 if (!ADBG_EXPECT_CK_OK(c, rv))
3678 goto close_session;
3679
Ruchika Guptaf2eb88a2021-03-22 19:38:11 +05303680 /*
3681 * All objects in this test are session objects hence released at
3682 * session closure on test completion.
3683 */
3684
Ruchika Gupta1f60ed42021-02-02 13:15:58 +05303685 /* Generate a secret key object in rw session */
3686 rv = C_GenerateKey(rw_session, &cktest_aes_keygen_mechanism,
3687 secret_key_template,
3688 ARRAY_SIZE(secret_key_template), &obj_hdl);
3689 if (!ADBG_EXPECT_CK_OK(c, rv))
3690 goto close_session;
3691
3692 /* Check its attribute values */
3693 rv = C_GetAttributeValue(rw_session, obj_hdl, get_template,
3694 ARRAY_SIZE(get_template));
3695 if (!ADBG_EXPECT_CK_OK(c, rv) ||
3696 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_token, ==, CK_FALSE) ||
3697 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_private, ==, CK_FALSE) ||
3698 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_modify, ==, CK_TRUE) ||
3699 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_copy, ==, CK_TRUE) ||
3700 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_destroy, ==, CK_TRUE) ||
3701 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_TRUE) ||
3702 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_extract, ==, CK_TRUE) ||
3703 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_nextract, ==, CK_FALSE) ||
3704 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sensitive, ==, CK_FALSE) ||
3705 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_asensitive, ==, CK_FALSE))
3706 goto close_session;
3707
Vesa Jääskeläinen06f428a2021-06-27 20:02:29 +03003708 /* Check that we can get (secret) CKA_VALUE */
3709 get_value_template[0].ulValueLen = sizeof(g_value);
3710 rv = C_GetAttributeValue(rw_session, obj_hdl, get_value_template,
3711 ARRAY_SIZE(get_value_template));
3712 if (!ADBG_EXPECT_CK_OK(c, rv) ||
3713 !ADBG_EXPECT_COMPARE_UNSIGNED(c, get_value_template[0].ulValueLen,
3714 ==, sizeof(g_value)))
3715 goto close_session;
3716
Ruchika Gupta1f60ed42021-02-02 13:15:58 +05303717 /* Create a secret key object in ro session*/
Ruchika Guptae86aba22021-03-11 00:36:01 +05303718 rv = C_CreateObject(ro_session, secret_key_create_template,
3719 ARRAY_SIZE(secret_key_create_template), &obj_hdl_ro);
Ruchika Gupta1f60ed42021-02-02 13:15:58 +05303720 if (!ADBG_EXPECT_CK_OK(c, rv))
3721 goto close_session;
3722
3723 /*
3724 * Duplicate the object generated in RW session using C_GenerateKey() to
3725 * another object. Pass Template as NULL and test the attributes of
3726 * new created object.
3727 */
3728 Do_ADBG_BeginSubCase(c, "Copy Local Obj with NULL Template");
3729 rv = C_CopyObject(rw_session, obj_hdl, NULL, 0, &obj_hdl_cp);
3730 if (!ADBG_EXPECT_CK_OK(c, rv))
3731 goto out;
3732
3733 /*
3734 * Check its attribute values, should match the original object.
3735 * CKA_LOCAL shall be TRUE even in copied object as original object
3736 * was generated using C_GenerateKey()
3737 */
3738 rv = C_GetAttributeValue(rw_session, obj_hdl_cp, get_template,
3739 ARRAY_SIZE(get_template));
3740 if (!ADBG_EXPECT_CK_OK(c, rv) ||
3741 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_token, ==, CK_FALSE) ||
3742 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_private, ==, CK_FALSE) ||
3743 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_modify, ==, CK_TRUE) ||
3744 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_copy, ==, CK_TRUE) ||
3745 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_destroy, ==, CK_TRUE) ||
3746 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_TRUE) ||
3747 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_extract, ==, CK_TRUE) ||
3748 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_nextract, ==, CK_FALSE) ||
3749 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sensitive, ==, CK_FALSE) ||
3750 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_asensitive, ==, CK_FALSE))
3751 goto out;
3752
3753 rv = C_DestroyObject(rw_session, obj_hdl_cp);
3754 if (!ADBG_EXPECT_CK_OK(c, rv))
3755 goto out;
3756
3757 obj_hdl_cp = CK_INVALID_HANDLE;
3758
3759 Do_ADBG_EndSubCase(c, NULL);
3760
3761 /*
3762 * Duplicate the object generated in RO session using C_CreateObject()
3763 * to another object. Pass Template as NULL and test the attributes of
3764 * new created object.
3765 */
3766 Do_ADBG_BeginSubCase(c, "Copy a non-local object with NULL Template");
3767
3768 /* Copy ro session object */
3769 rv = C_CopyObject(ro_session, obj_hdl_ro, NULL, 0, &obj_hdl_cp);
3770 if (!ADBG_EXPECT_CK_OK(c, rv))
3771 goto out;
3772
3773 /*
3774 * Check its attribute values, should match the original object.
3775 * CKA_LOCAL shall be FALSE even in copied object as original object
3776 * was generated using C_CreateObject()
3777 */
3778 rv = C_GetAttributeValue(ro_session, obj_hdl_cp, get_template,
3779 ARRAY_SIZE(get_template));
3780 if (!ADBG_EXPECT_CK_OK(c, rv) ||
3781 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_token, ==, CK_FALSE) ||
3782 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_private, ==, CK_FALSE) ||
3783 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_modify, ==, CK_TRUE) ||
3784 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_copy, ==, CK_TRUE) ||
3785 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_destroy, ==, CK_TRUE) ||
3786 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_FALSE) ||
3787 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_extract, ==, CK_TRUE) ||
3788 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_nextract, ==, CK_FALSE) ||
3789 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sensitive, ==, CK_FALSE) ||
3790 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_asensitive, ==, CK_FALSE))
3791 goto out;
3792
3793 rv = C_DestroyObject(ro_session, obj_hdl_cp);
3794 if (!ADBG_EXPECT_CK_OK(c, rv))
3795 goto out;
3796
3797 obj_hdl_cp = CK_INVALID_HANDLE;
3798
3799 Do_ADBG_EndSubCase(c, NULL);
3800
3801 /*
3802 * Test copying object with a valid template and check if attributes
3803 * get modified as indicated in the template. Checks modification of
3804 * attributes like CKA_TOKEN, CKA_MODIFIABLE which were not modifiable
3805 * via C_SetAttributeValue(). Also modifies the CKA_SENSITIVE,
3806 * CKA_EXTRACTABLE and checks corresponding values of RO attributes
3807 * CKA_ALWAYS_SENSITIVE and CKA_NEVER_EXTRACTABLE.
3808 */
3809 Do_ADBG_BeginSubCase(c, "Copy Object with Valid Template");
3810
3811 /*
3812 * Copy Session Object as a Token object
3813 * Properties CKA_MODIFIABLE turned to FALSE
3814 * CKA_EXTRACTABLE changed from TRUE to FALSE
3815 * CKA_NEVER_EXTRACTABLE should be FALSE.
3816 * CKA_SENSITIVE set to TRUE
3817 * However CKA_ALWAYS_SENSITIVE should be FALSE
3818 */
3819 rv = C_CopyObject(rw_session, obj_hdl, copy_template,
3820 ARRAY_SIZE(copy_template), &obj_hdl_cp);
3821 if (!ADBG_EXPECT_CK_OK(c, rv))
3822 goto out;
3823
3824 /* Check the changed attribute values */
3825 rv = C_GetAttributeValue(rw_session, obj_hdl_cp, get_template,
3826 ARRAY_SIZE(get_template));
3827 if (!ADBG_EXPECT_CK_OK(c, rv) ||
3828 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_token, ==, CK_TRUE) ||
3829 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_modify, ==, CK_FALSE) ||
3830 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_extract, ==, CK_FALSE) ||
3831 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_nextract, ==, CK_FALSE) ||
3832 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sensitive, ==, CK_TRUE) ||
3833 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_asensitive, ==, CK_FALSE))
3834 goto out;
3835
Vesa Jääskeläinen06f428a2021-06-27 20:02:29 +03003836 /* Check that we cannot anymore get (secret) CKA_VALUE */
3837 get_value_template[0].ulValueLen = sizeof(g_value);
3838 rv = C_GetAttributeValue(rw_session, obj_hdl_cp, get_value_template,
3839 ARRAY_SIZE(get_value_template));
3840 if (!ADBG_EXPECT_CK_RESULT(c, CKR_ATTRIBUTE_SENSITIVE, rv) ||
3841 !(get_value_template[0].ulValueLen == CK_UNAVAILABLE_INFORMATION))
3842 goto close_session;
3843
Ruchika Gupta1f60ed42021-02-02 13:15:58 +05303844 /*
3845 * The copied object has CKA_MODIFIABLE set to FALSE. Check if
3846 * call to C_SetAttributeValue() returns CKR_ACTION_PROHIBITED
3847 */
3848 rv = C_SetAttributeValue(rw_session, obj_hdl_cp, set_template,
3849 ARRAY_SIZE(set_template));
3850 if (!ADBG_EXPECT_CK_RESULT(c, CKR_ACTION_PROHIBITED, rv))
3851 goto out;
3852
3853 rv = C_DestroyObject(rw_session, obj_hdl_cp);
3854 if (!ADBG_EXPECT_CK_OK(c, rv))
3855 goto out;
3856
3857 obj_hdl_cp = CK_INVALID_HANDLE;
3858
3859 Do_ADBG_EndSubCase(c, NULL);
3860
3861 /*
3862 * Test changing the CKA_PRIVATE to TRUE when copying object.
3863 * Fails when user is not logged in. Passes after user logs in
3864 */
3865 Do_ADBG_BeginSubCase(c, "Copy Object as a Private Object");
3866
3867 /* The first attempt will fail as user is not logged in */
3868 rv = C_CopyObject(rw_session, obj_hdl, copy_template_priv,
3869 ARRAY_SIZE(copy_template_priv), &obj_hdl_cp);
3870 if (!ADBG_EXPECT_CK_RESULT(c, CKR_USER_NOT_LOGGED_IN, rv))
3871 goto out;
3872
3873 /* Login to Test Token and repeat*/
3874 rv = C_Login(rw_session, CKU_USER, test_token_user_pin,
3875 sizeof(test_token_user_pin));
3876 if (!ADBG_EXPECT_CK_OK(c, rv))
3877 goto out;
3878
3879 /* Try copying a public object to a private object - should pass */
3880 rv = C_CopyObject(rw_session, obj_hdl, copy_template_priv,
3881 ARRAY_SIZE(copy_template_priv), &obj_hdl_cp);
3882 if (!ADBG_EXPECT_CK_OK(c, rv)) {
3883 ADBG_EXPECT_CK_OK(c, C_Logout(rw_session));
3884 goto out;
3885 }
3886
3887 if (!ADBG_EXPECT_CK_OK(c, C_Logout(rw_session)))
3888 goto out;
3889
3890 Do_ADBG_EndSubCase(c, NULL);
3891
3892 Do_ADBG_BeginSubCase(c, "Copy Object with Invalid Template");
3893
3894 rv = C_CopyObject(rw_session, obj_hdl, copy_template_inv,
3895 ARRAY_SIZE(copy_template_inv), &obj_hdl_cp);
3896 if (!ADBG_EXPECT_CK_RESULT(c, CKR_ATTRIBUTE_TYPE_INVALID, rv))
3897 goto out;
3898
3899 Do_ADBG_EndSubCase(c, NULL);
3900
3901 Do_ADBG_BeginSubCase(c, "Copy Object with COPYABLE false");
3902
3903 rv = C_SetAttributeValue(rw_session, obj_hdl, set_template,
3904 ARRAY_SIZE(set_template));
3905 if (!ADBG_EXPECT_CK_OK(c, rv))
3906 goto out;
3907
3908 rv = C_CopyObject(rw_session, obj_hdl, copy_template,
3909 ARRAY_SIZE(copy_template), &obj_hdl_cp);
3910 if (!ADBG_EXPECT_CK_RESULT(c, CKR_ACTION_PROHIBITED, rv))
3911 goto out;
3912
3913 Do_ADBG_EndSubCase(c, NULL);
3914
3915 Do_ADBG_BeginSubCase(c, "Copy session object to token in RO session");
3916
3917 rv = C_CopyObject(ro_session, obj_hdl_ro, copy_template,
3918 ARRAY_SIZE(copy_template), &obj_hdl_cp);
3919 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SESSION_READ_ONLY, rv))
3920 goto out;
3921
3922out:
3923 Do_ADBG_EndSubCase(c, NULL);
3924
3925 /* Destroy any token objects which may have been created */
3926 destroy_persistent_objects(c, slot);
3927
3928close_session:
3929 /* Closing session will also destroy all session objects */
3930 if (ro_session != CK_INVALID_HANDLE)
3931 ADBG_EXPECT_CK_OK(c, C_CloseSession(ro_session));
3932
3933 ADBG_EXPECT_CK_OK(c, C_CloseSession(rw_session));
3934
3935close_lib:
3936 ADBG_EXPECT_CK_OK(c, close_lib());
3937}
3938ADBG_CASE_DEFINE(pkcs11, 1015, xtest_pkcs11_test_1015,
3939 "PKCS11: Test C_CopyObject()");
Vesa Jääskeläinenf8687fe2021-02-06 20:58:22 +02003940
3941static void xtest_pkcs11_test_1016(ADBG_Case_t *c)
3942{
3943 CK_RV rv = CKR_GENERAL_ERROR;
3944 CK_SLOT_ID slot = 0;
3945 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
3946 CK_FLAGS session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
3947 uint8_t buffer[64] = { 0 };
3948 size_t i = 0;
3949
3950 rv = init_lib_and_find_token_slot(&slot);
3951 if (!ADBG_EXPECT_CK_OK(c, rv))
3952 return;
3953
3954 rv = init_test_token(slot);
3955 if (!ADBG_EXPECT_CK_OK(c, rv))
3956 goto close_lib;
3957
3958 rv = init_user_test_token(slot);
3959 if (!ADBG_EXPECT_CK_OK(c, rv))
3960 goto close_lib;
3961
3962 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
3963 if (!ADBG_EXPECT_CK_OK(c, rv))
3964 goto close_lib;
3965
3966 Do_ADBG_BeginSubCase(c, "Seed random bytes");
3967
3968 memset(buffer, 0xCC, sizeof(buffer));
3969
3970 rv = C_SeedRandom(session, buffer, sizeof(buffer));
3971 if (!ADBG_EXPECT_CK_OK(c, rv))
3972 goto out;
3973
3974 Do_ADBG_EndSubCase(c, NULL);
3975
3976 Do_ADBG_BeginSubCase(c, "Seed random bytes with zero length buffer");
3977
3978 rv = C_SeedRandom(session, buffer, 0);
3979 if (!ADBG_EXPECT_CK_OK(c, rv))
3980 goto out;
3981
3982 rv = C_SeedRandom(session, NULL, 0);
3983 if (!ADBG_EXPECT_CK_OK(c, rv))
3984 goto out;
3985
3986 Do_ADBG_EndSubCase(c, NULL);
3987
3988 Do_ADBG_BeginSubCase(c, "Generate random bytes");
3989
3990 memset(buffer, 0xCC, sizeof(buffer));
3991
3992 rv = C_GenerateRandom(session, buffer, 61);
3993 if (!ADBG_EXPECT_CK_OK(c, rv))
3994 goto out;
3995
3996 /* Verify that end of buffer is still 0xCC */
3997 for (i = 61; i < sizeof(buffer); i++)
3998 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, buffer[i], ==, 0xCC))
3999 break;
4000
4001 Do_ADBG_EndSubCase(c, NULL);
4002
4003 Do_ADBG_BeginSubCase(c, "Generate random bytes with zero length buffer");
4004
4005 memset(buffer, 0xCC, sizeof(buffer));
4006
4007 rv = C_GenerateRandom(session, buffer, 0);
4008 if (!ADBG_EXPECT_CK_OK(c, rv))
4009 goto out;
4010
4011 /* Verify that whole buffer is still 0xCC */
4012 for (i = 0; i < sizeof(buffer); i++)
4013 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, buffer[i], ==, 0xCC))
4014 break;
4015
4016 rv = C_GenerateRandom(session, NULL, 0);
4017 ADBG_EXPECT_CK_OK(c, rv);
4018
4019out:
4020 Do_ADBG_EndSubCase(c, NULL);
4021
4022 ADBG_EXPECT_CK_OK(c, C_CloseSession(session));
4023
4024close_lib:
4025 ADBG_EXPECT_CK_OK(c, close_lib());
4026}
4027ADBG_CASE_DEFINE(pkcs11, 1016, xtest_pkcs11_test_1016,
4028 "PKCS11: Random number generator tests");
Ruchika Gupta5f7717a2021-02-17 13:34:24 +05304029
4030static CK_RV derive_sym_key(CK_SESSION_HANDLE session,
4031 CK_OBJECT_HANDLE parent_key,
4032 CK_MECHANISM_TYPE mechanism, size_t data_len,
4033 CK_OBJECT_HANDLE_PTR derv_key_hdl, size_t key_len,
4034 CK_OBJECT_CLASS key_class, CK_KEY_TYPE key_type,
4035 CK_BBOOL sensitive, CK_BBOOL extble)
4036{
4037 CK_RV rv = CKR_GENERAL_ERROR;
4038 uint8_t buffer[512] = { 0 };
4039 uint8_t iv[16] = { 0 };
4040 CK_MECHANISM mech_derive = { 0 };
4041 CK_KEY_DERIVATION_STRING_DATA key_derv_param = { 0 };
Victor Chonge3a876d2021-05-04 18:03:07 +01004042 CK_AES_CBC_ENCRYPT_DATA_PARAMS aes_cbc_param = { };
Ruchika Gupta5f7717a2021-02-17 13:34:24 +05304043 CK_ATTRIBUTE derived_key_template[] = {
4044 { CKA_CLASS, &key_class, sizeof(key_class) },
4045 { CKA_KEY_TYPE, &key_type, sizeof(key_type) },
4046 { CKA_ENCRYPT, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
4047 { CKA_DECRYPT, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
4048 { CKA_SENSITIVE, &sensitive, sizeof(sensitive) },
4049 { CKA_EXTRACTABLE, &extble, sizeof(extble) },
4050 { CKA_VALUE_LEN, &key_len, sizeof(key_len) }
4051 };
4052
4053 if (data_len > sizeof(buffer))
4054 return rv;
4055
4056 switch (mechanism) {
4057 case CKM_AES_ECB_ENCRYPT_DATA:
4058 key_derv_param.pData = buffer;
4059 key_derv_param.ulLen = data_len;
4060 mech_derive.mechanism = mechanism;
4061 mech_derive.pParameter = &key_derv_param;
4062 mech_derive.ulParameterLen = sizeof(key_derv_param);
4063 break;
4064 case CKM_AES_CBC_ENCRYPT_DATA:
4065 memcpy(aes_cbc_param.iv, iv, 16);
4066 aes_cbc_param.pData = buffer;
4067 aes_cbc_param.length = data_len;
4068 mech_derive.mechanism = mechanism;
4069 mech_derive.pParameter = &aes_cbc_param;
4070 mech_derive.ulParameterLen = sizeof(aes_cbc_param);
4071 break;
4072 case CKM_AES_ECB:
4073 /* Not a derivation algorithm */
4074 mech_derive.mechanism = mechanism;
4075 mech_derive.pParameter = NULL;
4076 mech_derive.ulParameterLen = 0;
4077 break;
4078 default:
4079 return rv;
4080 }
4081
4082 /* Don't use VALUE_LEN parameter if key_len passed is 0 */
4083 if (key_len)
4084 rv = C_DeriveKey(session, &mech_derive, parent_key,
4085 derived_key_template,
4086 ARRAY_SIZE(derived_key_template),
4087 derv_key_hdl);
4088 else
4089 /* last attribute in template is the derived key size */
4090 rv = C_DeriveKey(session, &mech_derive, parent_key,
4091 derived_key_template,
4092 ARRAY_SIZE(derived_key_template) - 1,
4093 derv_key_hdl);
4094 return rv;
4095}
4096
4097static void xtest_pkcs11_test_1017(ADBG_Case_t *c)
4098{
4099 CK_RV rv = CKR_GENERAL_ERROR;
4100 CK_SLOT_ID slot = 0;
4101 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
4102 CK_FLAGS session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
4103 CK_OBJECT_HANDLE derv_key_hdl = CK_INVALID_HANDLE;
4104 CK_OBJECT_HANDLE aes_key1 = CK_INVALID_HANDLE;
4105 CK_OBJECT_HANDLE aes_key2 = CK_INVALID_HANDLE;
4106 CK_OBJECT_HANDLE aes_key_enc = CK_INVALID_HANDLE;
4107 size_t data_len = 0;
4108 size_t key_len = 0;
4109 CK_BBOOL g_extract = CK_FALSE;
4110 CK_BBOOL g_sensitive = CK_FALSE;
4111 CK_BBOOL g_nextract = CK_FALSE;
4112 CK_BBOOL g_asensitive = CK_FALSE;
4113 CK_BBOOL g_local = CK_FALSE;
4114 CK_OBJECT_CLASS g_class = CKO_VENDOR_DEFINED;
4115 CK_KEY_TYPE g_key_type = CKK_VENDOR_DEFINED;
4116 uint8_t g_val[516] = { 0 };
4117 CK_ULONG secret_len = 0;
4118 CK_ATTRIBUTE get_template[] = {
4119 { CKA_CLASS, &g_class, sizeof(CK_OBJECT_CLASS) },
4120 { CKA_KEY_TYPE, &g_key_type, sizeof(CK_KEY_TYPE) },
4121 { CKA_EXTRACTABLE, &g_extract, sizeof(CK_BBOOL) },
4122 { CKA_SENSITIVE, &g_sensitive, sizeof(CK_BBOOL) },
4123 { CKA_NEVER_EXTRACTABLE, &g_nextract, sizeof(CK_BBOOL) },
4124 { CKA_ALWAYS_SENSITIVE, &g_asensitive, sizeof(CK_BBOOL) },
4125 { CKA_LOCAL, &g_local, sizeof(CK_BBOOL) },
4126 { CKA_VALUE_LEN, &secret_len, sizeof(secret_len) },
4127 /*
4128 * CKA_VALUE should remain last attribute in template,
4129 * in this test case as we check the length returned
4130 * from last index of the get_template in this test.
4131 */
4132 { CKA_VALUE, g_val, sizeof(g_val) },
4133 };
4134 uint32_t idx = ARRAY_SIZE(get_template) - 1;
4135 CK_ATTRIBUTE parent_template1[] = {
4136 { CKA_SENSITIVE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
4137 { CKA_EXTRACTABLE, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
4138 { CKA_VALUE_LEN, &(CK_ULONG){16}, sizeof(CK_ULONG) },
4139 { CKA_DERIVE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
4140 };
4141 CK_ATTRIBUTE parent_template2[] = {
4142 { CKA_SENSITIVE, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
4143 { CKA_EXTRACTABLE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
4144 { CKA_VALUE_LEN, &(CK_ULONG){16}, sizeof(CK_ULONG) },
4145 { CKA_ENCRYPT, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
4146 { CKA_DERIVE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
4147 };
4148 CK_ATTRIBUTE parent_template_wo_derive[] = {
4149 { CKA_SENSITIVE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
4150 { CKA_EXTRACTABLE, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
4151 { CKA_VALUE_LEN, &(CK_ULONG){16}, sizeof(CK_ULONG) },
4152 };
4153 CK_ATTRIBUTE parent_template_w_enc_der[] = {
4154 { CKA_VALUE_LEN, &(CK_ULONG){16}, sizeof(CK_ULONG) },
4155 { CKA_ENCRYPT, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
4156 { CKA_DERIVE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
4157 };
4158
4159 rv = init_lib_and_find_token_slot(&slot);
4160 if (!ADBG_EXPECT_CK_OK(c, rv))
4161 return;
4162
4163 rv = init_test_token(slot);
4164 if (!ADBG_EXPECT_CK_OK(c, rv))
4165 goto close_lib;
4166
4167 rv = init_user_test_token(slot);
4168 if (!ADBG_EXPECT_CK_OK(c, rv))
4169 goto close_lib;
4170
4171 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
4172 if (!ADBG_EXPECT_CK_OK(c, rv))
4173 goto close_lib;
4174
4175 /*
4176 * Parent AES Key 1
4177 * SENSITIVE = TRUE, EXTRACTABLE = FALSE
4178 * ALWAYS_SENSITIVE = TRUE, NEVER_EXTRACTABLE = TRUE
4179 */
4180 rv = C_GenerateKey(session, &cktest_aes_keygen_mechanism,
4181 parent_template1, ARRAY_SIZE(parent_template1),
4182 &aes_key1);
4183 if (!ADBG_EXPECT_CK_OK(c, rv))
4184 goto close_session;
4185
4186 /*
4187 * Parent AES Key 2
4188 * SENSITIVE = FALSE, EXTRACTABLE = TRUE
4189 * ALWAYS_SENSITIVE = FALSE, NEVER_EXTRACTABLE = FALSE
4190 */
4191 rv = C_GenerateKey(session, &cktest_aes_keygen_mechanism,
4192 parent_template2, ARRAY_SIZE(parent_template2),
4193 &aes_key2);
4194 if (!ADBG_EXPECT_CK_OK(c, rv))
4195 goto close_session;
4196
4197 Do_ADBG_BeginSubCase(c, "Derive Generic secret - AES-ECB Mechanism");
4198
4199 /*
4200 * Use AES key 1 as Parent key
4201 * 1. VALUE_LEN attribute not given in derivation template. Length
4202 * of key should be same as that of data length.
4203 * 2. Derivation template has SENSITIVE = TRUE, EXTRACTABLE = FALSE
4204 * Parent key has ALWAYS_SENSITIVE = TRUE, NEVER_EXTRACTABLE = TRUE
4205 * So derived key, ALWAYS_SENSITIVE will be same as SENSITIVE and
4206 * NEVER_EXTRACTABLE will be opposite of EXTRACTABLE
4207 * 3. LOCAL should be false
4208 */
4209 data_len = 512;
4210 key_len = 0;
4211 rv = derive_sym_key(session, aes_key1, CKM_AES_ECB_ENCRYPT_DATA,
4212 data_len, &derv_key_hdl, key_len, CKO_SECRET_KEY,
4213 CKK_GENERIC_SECRET, CK_TRUE, CK_FALSE);
4214 if (!ADBG_EXPECT_CK_OK(c, rv))
4215 goto out;
4216
4217 rv = C_GetAttributeValue(session, derv_key_hdl, get_template,
4218 ARRAY_SIZE(get_template) - 1);
4219 if (!ADBG_EXPECT_CK_OK(c, rv) ||
4220 !ADBG_EXPECT_COMPARE_UNSIGNED(c, secret_len, ==, data_len) ||
4221 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_SECRET_KEY) ||
4222 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_key_type, ==,
4223 CKK_GENERIC_SECRET) ||
4224 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_FALSE) ||
4225 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sensitive, ==, CK_TRUE) ||
4226 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_extract, ==, CK_FALSE) ||
4227 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_asensitive, ==, CK_TRUE) ||
4228 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_nextract, ==, CK_TRUE))
4229 goto out;
4230
4231 rv = C_DestroyObject(session, derv_key_hdl);
4232 if (!ADBG_EXPECT_CK_OK(c, rv))
4233 goto out;
4234
4235 Do_ADBG_EndSubCase(c, NULL);
4236
4237 Do_ADBG_BeginSubCase(c, "Derive AES key using AES-EBC");
4238
4239 /*
4240 * Use AES key 2 as Parent key
4241 * 1. VALUE_LEN < DATA_LEN, Derived key should have VALUE_LEN key size
4242 * 2. Derivation template has SENSITIVE = TRUE, EXTRACTABLE = FALSE
4243 * Parent key has ALWAYS_SENSITIVE = FALSE, NEVER_EXTRACTABLE = FALSE
4244 * So derived key, ALWAYS_SENSITIVE will be FALSE and
4245 * NEVER_EXTRACTABLE will be FALSE
4246 * 3. LOCAL should be false
4247 */
4248 data_len = 32;
4249 key_len = 16;
4250 rv = derive_sym_key(session, aes_key2, CKM_AES_ECB_ENCRYPT_DATA,
4251 data_len, &derv_key_hdl, key_len, CKO_SECRET_KEY,
4252 CKK_AES, CK_TRUE, CK_FALSE);
4253 if (!ADBG_EXPECT_CK_OK(c, rv))
4254 goto out;
4255
4256 /* This being a SENSITIVE object, we can't get the VALUE */
4257 rv = C_GetAttributeValue(session, derv_key_hdl, get_template,
4258 ARRAY_SIZE(get_template) - 1);
4259 if (!ADBG_EXPECT_CK_OK(c, rv) ||
4260 !ADBG_EXPECT_COMPARE_UNSIGNED(c, secret_len, ==, key_len) ||
4261 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_SECRET_KEY) ||
4262 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_key_type, ==, CKK_AES) ||
4263 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_FALSE) ||
4264 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sensitive, ==, CK_TRUE) ||
4265 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_extract, ==, CK_FALSE) ||
4266 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_asensitive, ==, CK_FALSE) ||
4267 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_nextract, ==, CK_FALSE))
4268 goto out;
4269
4270 rv = C_DestroyObject(session, derv_key_hdl);
4271 if (!ADBG_EXPECT_CK_OK(c, rv))
4272 goto out;
4273
4274 Do_ADBG_EndSubCase(c, NULL);
4275
4276 Do_ADBG_BeginSubCase(c, "Derive AES key using AES-CBC");
4277
4278 /*
4279 * Use AES key 1 as Parent key
4280 * 1. VALUE_LEN = DATA_LEN, Derived key should have VALUE_LEN key size
4281 * 2. Derivation template has SENSITIVE = FALSE, EXTRACTABLE = FALSE
4282 * Parent key has ALWAYS_SENSITIVE = TRUE, NEVER_EXTRACTABLE = TRUE
4283 * So derived key, ALWAYS_SENSITIVE will be same as SENSITIVE and
4284 * NEVER_EXTRACTABLE will be opposite of EXTRACTABLE
4285 * 3. LOCAL should be false
4286 */
4287 data_len = 32;
4288 key_len = 32;
4289 rv = derive_sym_key(session, aes_key1, CKM_AES_CBC_ENCRYPT_DATA,
4290 data_len, &derv_key_hdl, key_len, CKO_SECRET_KEY,
4291 CKK_AES, CK_FALSE, CK_FALSE);
4292 if (!ADBG_EXPECT_CK_OK(c, rv))
4293 goto out;
4294
4295 rv = C_GetAttributeValue(session, derv_key_hdl, get_template,
4296 ARRAY_SIZE(get_template) - 1);
4297 if (!ADBG_EXPECT_CK_OK(c, rv) ||
4298 !ADBG_EXPECT_COMPARE_UNSIGNED(c, secret_len, ==, key_len) ||
4299 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_SECRET_KEY) ||
4300 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_key_type, ==, CKK_AES) ||
4301 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_FALSE) ||
4302 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sensitive, ==, CK_FALSE) ||
4303 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_extract, ==, CK_FALSE) ||
4304 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_asensitive, ==, CK_FALSE) ||
4305 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_nextract, ==, CK_TRUE))
4306 goto out;
4307
4308 rv = C_DestroyObject(session, derv_key_hdl);
4309 if (!ADBG_EXPECT_CK_OK(c, rv))
4310 goto out;
4311
4312 Do_ADBG_EndSubCase(c, NULL);
4313
4314 Do_ADBG_BeginSubCase(c, "Derive Generic secret key using AES-CBC");
4315 /*
4316 * Use AES key 2 as Parent key
4317 * 1. VALUE_LEN < DATA_LEN, Derived key should have VALUE_LEN key size
4318 * 2. Derivation template has SENSITIVE = FALSE, EXTRACTABLE = TRUE
4319 * Parent key has ALWAYS_SENSITIVE = TRUE, NEVER_EXTRACTABLE = TRUE
4320 * So derived key, ALWAYS_SENSITIVE will be same as SENSITIVE and
4321 * NEVER_EXTRACTABLE will be opposite of EXTRACTABLE
4322 * 3. LOCAL should be false
4323 */
4324 data_len = 512;
4325 key_len = 256;
4326 rv = derive_sym_key(session, aes_key2, CKM_AES_CBC_ENCRYPT_DATA,
4327 data_len, &derv_key_hdl, key_len, CKO_SECRET_KEY,
4328 CKK_GENERIC_SECRET, CK_FALSE, CK_TRUE);
4329 if (!ADBG_EXPECT_CK_OK(c, rv))
4330 goto out;
4331
4332 rv = C_GetAttributeValue(session, derv_key_hdl, get_template,
4333 ARRAY_SIZE(get_template));
4334 if (!ADBG_EXPECT_CK_OK(c, rv) ||
4335 !ADBG_EXPECT_COMPARE_UNSIGNED(c, get_template[idx].ulValueLen, ==,
4336 key_len) ||
4337 !ADBG_EXPECT_COMPARE_UNSIGNED(c, secret_len, ==, key_len) ||
4338 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_SECRET_KEY) ||
4339 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_key_type, ==,
4340 CKK_GENERIC_SECRET) ||
4341 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_FALSE) ||
4342 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sensitive, ==, CK_FALSE) ||
4343 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_extract, ==, CK_TRUE) ||
4344 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_asensitive, ==, CK_FALSE) ||
4345 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_nextract, ==, CK_FALSE))
4346 goto out;
4347
4348 rv = C_DestroyObject(session, derv_key_hdl);
4349 if (!ADBG_EXPECT_CK_OK(c, rv))
4350 goto out;
4351
4352 Do_ADBG_EndSubCase(c, NULL);
4353
4354 Do_ADBG_BeginSubCase(c, "Invalid parameters during derivation");
4355
4356 /* Length of data used for derivation < key length */
4357 data_len = 16;
4358 key_len = 32;
4359 rv = derive_sym_key(session, aes_key1, CKM_AES_ECB_ENCRYPT_DATA,
4360 data_len, &derv_key_hdl, key_len, CKO_SECRET_KEY,
4361 CKK_AES, CK_FALSE, CK_TRUE);
4362 if (!ADBG_EXPECT_CK_RESULT(c, CKR_DATA_LEN_RANGE, rv))
4363 goto out;
4364
4365 /* Data is not multiple of 16 */
4366 data_len = 18;
4367 key_len = 32;
4368 rv = derive_sym_key(session, aes_key1, CKM_AES_ECB_ENCRYPT_DATA,
4369 data_len, &derv_key_hdl, key_len, CKO_SECRET_KEY,
4370 CKK_AES, CK_FALSE, CK_TRUE);
4371 if (!ADBG_EXPECT_CK_RESULT(c, CKR_DATA_LEN_RANGE, rv))
4372 goto out;
4373
4374 /* Wrong Mechanism */
4375 rv = derive_sym_key(session, aes_key1, CKM_AES_ECB,
4376 data_len, &derv_key_hdl, key_len, CKO_SECRET_KEY,
4377 CKK_AES, CK_FALSE, CK_TRUE);
4378 if (!ADBG_EXPECT_CK_RESULT(c, CKR_MECHANISM_INVALID, rv))
4379 goto out;
4380
4381 Do_ADBG_EndSubCase(c, NULL);
4382
4383 Do_ADBG_BeginSubCase(c, "Failure if operation already active");
4384
4385 /* Generate an AES key which can perform Encryption */
4386 rv = C_GenerateKey(session, &cktest_aes_keygen_mechanism,
4387 parent_template_w_enc_der,
4388 ARRAY_SIZE(parent_template_w_enc_der),
4389 &aes_key_enc);
4390 if (!ADBG_EXPECT_CK_OK(c, rv))
4391 goto out;
4392
4393 rv = C_EncryptInit(session, &cktest_aes_cbc_mechanism, aes_key_enc);
4394 if (!ADBG_EXPECT_CK_OK(c, rv))
4395 goto out;
4396
Vesa Jääskeläinene21f1dd2021-07-17 21:42:52 +03004397 /*
4398 * Initializing the encryption operation again should not alter or
4399 * terminate already started operation.
4400 */
4401 rv = C_EncryptInit(session, &cktest_aes_cbc_mechanism, aes_key_enc);
4402 if (!ADBG_EXPECT_CK_RESULT(c, CKR_OPERATION_ACTIVE, rv))
4403 goto out;
4404
Ruchika Gupta5f7717a2021-02-17 13:34:24 +05304405 data_len = 32;
4406 key_len = 32;
4407 rv = derive_sym_key(session, aes_key2, CKM_AES_ECB_ENCRYPT_DATA,
4408 data_len, &derv_key_hdl, key_len, CKO_SECRET_KEY,
4409 CKK_AES, CK_FALSE, CK_TRUE);
4410 if (!ADBG_EXPECT_CK_RESULT(c, CKR_OPERATION_ACTIVE, rv))
4411 goto out;
4412
4413 rv = C_EncryptFinal(session, NULL, NULL);
4414 /* Only check that the operation is no more active */
4415 if (!ADBG_EXPECT_TRUE(c, rv != CKR_BUFFER_TOO_SMALL))
4416 goto out;
4417
4418 Do_ADBG_EndSubCase(c, NULL);
4419
4420 Do_ADBG_BeginSubCase(c, "Failure if parent key CKA_ENCRYPT is TRUE");
4421
4422 data_len = 32;
4423 key_len = 32;
4424 rv = derive_sym_key(session, aes_key_enc, CKM_AES_ECB_ENCRYPT_DATA,
4425 data_len, &derv_key_hdl, key_len, CKO_SECRET_KEY,
4426 CKK_AES, CK_FALSE, CK_TRUE);
4427 /*
4428 * Not strictly expecting FUNCTION_FAILED but expecting a failure
4429 * as we have added a restriction that keys with attribute CKA_ENCRYPT
4430 * set can't be used for derivation.
4431 */
4432 if (!ADBG_EXPECT_CK_RESULT(c, CKR_FUNCTION_FAILED, rv))
4433 goto out;
4434
4435 Do_ADBG_EndSubCase(c, NULL);
4436
4437 Do_ADBG_BeginSubCase(c, "Failure if parent key CKA_DERIVE is FALSE");
4438
4439 rv = C_DestroyObject(session, aes_key1);
4440 if (!ADBG_EXPECT_CK_OK(c, rv))
4441 goto out;
4442
4443 rv = C_GenerateKey(session, &cktest_aes_keygen_mechanism,
4444 parent_template_wo_derive,
4445 ARRAY_SIZE(parent_template_wo_derive),
4446 &aes_key1);
4447 if (!ADBG_EXPECT_CK_OK(c, rv))
4448 goto out;
4449
4450 data_len = 32;
4451 key_len = 32;
4452 rv = derive_sym_key(session, aes_key1, CKM_AES_ECB_ENCRYPT_DATA,
4453 data_len, &derv_key_hdl, key_len, CKO_SECRET_KEY,
4454 CKK_AES, CK_FALSE, CK_TRUE);
4455 if (!ADBG_EXPECT_CK_RESULT(c, CKR_KEY_TYPE_INCONSISTENT, rv))
4456 goto out;
4457
4458out:
4459 Do_ADBG_EndSubCase(c, NULL);
4460
4461close_session:
4462 ADBG_EXPECT_CK_OK(c, C_CloseSession(session));
4463
4464close_lib:
4465 ADBG_EXPECT_CK_OK(c, close_lib());
4466}
4467ADBG_CASE_DEFINE(pkcs11, 1017, xtest_pkcs11_test_1017,
4468 "PKCS11: AES Key Derivation tests");
Vesa Jääskeläinenc95ee1e2021-03-06 12:20:12 +02004469
4470/* Digest test patterns */
4471static const char digest_test_pattern[] = "The quick brown fox jumps over the lazy dog";
4472static const char digest_test_pattern_empty[] = "";
4473
4474/* MD5 checksums for digest test patterns */
4475static const uint8_t digest_test_pattern_md5[] = {
4476 0x9e, 0x10, 0x7d, 0x9d, 0x37, 0x2b, 0xb6, 0x82, 0x6b, 0xd8, 0x1d, 0x35,
4477 0x42, 0xa4, 0x19, 0xd6
4478};
4479static const uint8_t digest_test_pattern_empty_md5[] = {
4480 0xd4, 0x1d, 0x8c, 0xd9, 0x8f, 0x00, 0xb2, 0x04, 0xe9, 0x80, 0x09, 0x98,
4481 0xec, 0xf8, 0x42, 0x7e
4482};
4483
4484/* SHA-1 checksums for digest test patterns */
4485static const uint8_t digest_test_pattern_sha1[] = {
4486 0x2f, 0xd4, 0xe1, 0xc6, 0x7a, 0x2d, 0x28, 0xfc, 0xed, 0x84, 0x9e, 0xe1,
4487 0xbb, 0x76, 0xe7, 0x39, 0x1b, 0x93, 0xeb, 0x12
4488};
4489static const uint8_t digest_test_pattern_empty_sha1[] = {
4490 0xda, 0x39, 0xa3, 0xee, 0x5e, 0x6b, 0x4b, 0x0d, 0x32, 0x55, 0xbf, 0xef,
4491 0x95, 0x60, 0x18, 0x90, 0xaf, 0xd8, 0x07, 0x09
4492};
4493
4494/* SHA-224 checksums for digest test patterns */
4495static const uint8_t digest_test_pattern_sha224[] = {
4496 0x73, 0x0e, 0x10, 0x9b, 0xd7, 0xa8, 0xa3, 0x2b, 0x1c, 0xb9, 0xd9, 0xa0,
4497 0x9a, 0xa2, 0x32, 0x5d, 0x24, 0x30, 0x58, 0x7d, 0xdb, 0xc0, 0xc3, 0x8b,
4498 0xad, 0x91, 0x15, 0x25
4499};
4500static const uint8_t digest_test_pattern_empty_sha224[] = {
4501 0xd1, 0x4a, 0x02, 0x8c, 0x2a, 0x3a, 0x2b, 0xc9, 0x47, 0x61, 0x02, 0xbb,
4502 0x28, 0x82, 0x34, 0xc4, 0x15, 0xa2, 0xb0, 0x1f, 0x82, 0x8e, 0xa6, 0x2a,
4503 0xc5, 0xb3, 0xe4, 0x2f
4504};
4505
4506/* SHA-256 checksums for digest test patterns */
4507static const uint8_t digest_test_pattern_sha256[] = {
4508 0xd7, 0xa8, 0xfb, 0xb3, 0x07, 0xd7, 0x80, 0x94, 0x69, 0xca, 0x9a, 0xbc,
4509 0xb0, 0x08, 0x2e, 0x4f, 0x8d, 0x56, 0x51, 0xe4, 0x6d, 0x3c, 0xdb, 0x76,
4510 0x2d, 0x02, 0xd0, 0xbf, 0x37, 0xc9, 0xe5, 0x92
4511};
4512static const uint8_t digest_test_pattern_empty_sha256[] = {
4513 0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4, 0xc8,
4514 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c,
4515 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55
4516};
4517
4518/* SHA-384 checksums for digest test patterns */
4519static const uint8_t digest_test_pattern_sha384[] = {
4520 0xca, 0x73, 0x7f, 0x10, 0x14, 0xa4, 0x8f, 0x4c, 0x0b, 0x6d, 0xd4, 0x3c,
4521 0xb1, 0x77, 0xb0, 0xaf, 0xd9, 0xe5, 0x16, 0x93, 0x67, 0x54, 0x4c, 0x49,
4522 0x40, 0x11, 0xe3, 0x31, 0x7d, 0xbf, 0x9a, 0x50, 0x9c, 0xb1, 0xe5, 0xdc,
4523 0x1e, 0x85, 0xa9, 0x41, 0xbb, 0xee, 0x3d, 0x7f, 0x2a, 0xfb, 0xc9, 0xb1
4524};
4525static const uint8_t digest_test_pattern_empty_sha384[] = {
4526 0x38, 0xb0, 0x60, 0xa7, 0x51, 0xac, 0x96, 0x38, 0x4c, 0xd9, 0x32, 0x7e,
4527 0xb1, 0xb1, 0xe3, 0x6a, 0x21, 0xfd, 0xb7, 0x11, 0x14, 0xbe, 0x07, 0x43,
4528 0x4c, 0x0c, 0xc7, 0xbf, 0x63, 0xf6, 0xe1, 0xda, 0x27, 0x4e, 0xde, 0xbf,
4529 0xe7, 0x6f, 0x65, 0xfb, 0xd5, 0x1a, 0xd2, 0xf1, 0x48, 0x98, 0xb9, 0x5b
4530};
4531
4532/* SHA-512 checksums for digest test patterns */
4533static const uint8_t digest_test_pattern_sha512[] = {
4534 0x07, 0xe5, 0x47, 0xd9, 0x58, 0x6f, 0x6a, 0x73, 0xf7, 0x3f, 0xba, 0xc0,
4535 0x43, 0x5e, 0xd7, 0x69, 0x51, 0x21, 0x8f, 0xb7, 0xd0, 0xc8, 0xd7, 0x88,
4536 0xa3, 0x09, 0xd7, 0x85, 0x43, 0x6b, 0xbb, 0x64, 0x2e, 0x93, 0xa2, 0x52,
4537 0xa9, 0x54, 0xf2, 0x39, 0x12, 0x54, 0x7d, 0x1e, 0x8a, 0x3b, 0x5e, 0xd6,
4538 0xe1, 0xbf, 0xd7, 0x09, 0x78, 0x21, 0x23, 0x3f, 0xa0, 0x53, 0x8f, 0x3d,
4539 0xb8, 0x54, 0xfe, 0xe6
4540};
4541static const uint8_t digest_test_pattern_empty_sha512[] = {
4542 0xcf, 0x83, 0xe1, 0x35, 0x7e, 0xef, 0xb8, 0xbd, 0xf1, 0x54, 0x28, 0x50,
4543 0xd6, 0x6d, 0x80, 0x07, 0xd6, 0x20, 0xe4, 0x05, 0x0b, 0x57, 0x15, 0xdc,
4544 0x83, 0xf4, 0xa9, 0x21, 0xd3, 0x6c, 0xe9, 0xce, 0x47, 0xd0, 0xd1, 0x3c,
4545 0x5d, 0x85, 0xf2, 0xb0, 0xff, 0x83, 0x18, 0xd2, 0x87, 0x7e, 0xec, 0x2f,
4546 0x63, 0xb9, 0x31, 0xbd, 0x47, 0x41, 0x7a, 0x81, 0xa5, 0x38, 0x32, 0x7a,
4547 0xf9, 0x27, 0xda, 0x3e
4548};
4549
4550#define DIGEST_TEST(_test_name, _mecha, _data, _digest) \
4551 { \
4552 .test_name = _test_name, \
4553 .mecha = _mecha, \
4554 .data = _data, \
4555 .data_size = sizeof(_data) - 1, \
4556 .digest = _digest, \
4557 .digest_size = sizeof(_digest) \
4558 }
4559
4560/* Digest simple test suite */
4561static struct {
4562 const char *test_name;
4563 CK_MECHANISM_TYPE mecha;
4564 const void *data;
4565 CK_ULONG data_size;
4566 const uint8_t *digest;
4567 CK_ULONG digest_size;
4568} digest_test_patterns[] = {
4569 DIGEST_TEST("CKM_MD5/empty", CKM_MD5, digest_test_pattern_empty,
4570 digest_test_pattern_empty_md5),
4571 DIGEST_TEST("CKM_MD5/test pattern", CKM_MD5, digest_test_pattern,
4572 digest_test_pattern_md5),
4573 DIGEST_TEST("CKM_SHA_1/empty", CKM_SHA_1, digest_test_pattern_empty,
4574 digest_test_pattern_empty_sha1),
4575 DIGEST_TEST("CKM_SHA_1/test pattern", CKM_SHA_1, digest_test_pattern,
4576 digest_test_pattern_sha1),
4577 DIGEST_TEST("CKM_SHA224/empty", CKM_SHA224, digest_test_pattern_empty,
4578 digest_test_pattern_empty_sha224),
4579 DIGEST_TEST("CKM_SHA224/test pattern", CKM_SHA224, digest_test_pattern,
4580 digest_test_pattern_sha224),
4581 DIGEST_TEST("CKM_SHA256/empty", CKM_SHA256, digest_test_pattern_empty,
4582 digest_test_pattern_empty_sha256),
4583 DIGEST_TEST("CKM_SHA256/test pattern", CKM_SHA256, digest_test_pattern,
4584 digest_test_pattern_sha256),
4585 DIGEST_TEST("CKM_SHA384/empty", CKM_SHA384, digest_test_pattern_empty,
4586 digest_test_pattern_empty_sha384),
4587 DIGEST_TEST("CKM_SHA384/test pattern", CKM_SHA384, digest_test_pattern,
4588 digest_test_pattern_sha384),
4589 DIGEST_TEST("CKM_SHA512/empty", CKM_SHA512, digest_test_pattern_empty,
4590 digest_test_pattern_empty_sha512),
4591 DIGEST_TEST("CKM_SHA512/test pattern", CKM_SHA512, digest_test_pattern,
4592 digest_test_pattern_sha512),
4593};
4594
4595static CK_ATTRIBUTE digest_generate_aes_object[] = {
4596 { CKA_CLASS, &(CK_OBJECT_CLASS){ CKO_SECRET_KEY },
4597 sizeof(CK_OBJECT_CLASS) },
4598 { CKA_KEY_TYPE, &(CK_KEY_TYPE){ CKK_AES }, sizeof(CK_KEY_TYPE) },
4599 { CKA_TOKEN, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
4600 { CKA_PRIVATE, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
4601 { CKA_SENSITIVE, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
4602 { CKA_EXTRACTABLE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
4603 { CKA_VALUE_LEN, &(CK_ULONG){ 16 }, sizeof(CK_ULONG) },
4604};
4605
4606static CK_ATTRIBUTE digest_generate_gensecret_object[] = {
4607 { CKA_CLASS, &(CK_OBJECT_CLASS){ CKO_SECRET_KEY },
4608 sizeof(CK_OBJECT_CLASS) },
4609 { CKA_KEY_TYPE, &(CK_KEY_TYPE){ CKK_GENERIC_SECRET },
4610 sizeof(CK_KEY_TYPE) },
4611 { CKA_TOKEN, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
4612 { CKA_PRIVATE, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
4613 { CKA_SENSITIVE, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
4614 { CKA_EXTRACTABLE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
Ruchika Guptae86aba22021-03-11 00:36:01 +05304615 { CKA_VALUE_LEN, &(CK_ULONG){ 32 }, sizeof(CK_ULONG) },
Vesa Jääskeläinenc95ee1e2021-03-06 12:20:12 +02004616};
4617
4618static CK_ATTRIBUTE digest_data_object[] = {
4619 { CKA_CLASS, &(CK_OBJECT_CLASS){ CKO_DATA },
4620 sizeof(CK_OBJECT_CLASS) },
4621 { CKA_TOKEN, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
4622 { CKA_PRIVATE, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
4623};
4624
4625static void xtest_pkcs11_test_1018(ADBG_Case_t *c)
4626{
4627 CK_RV rv = CKR_GENERAL_ERROR;
4628 CK_SLOT_ID slot = 0;
4629 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
4630 CK_FLAGS session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
4631 bool logged_in = false;
4632 uint8_t data[128] = { 0 };
4633 CK_ULONG data_size = 0;
4634 uint8_t digest[64] = { 0 };
4635 CK_ULONG digest_size = 0;
4636 const uint8_t *expect_digest = NULL;
4637 CK_ULONG expect_digest_size = 0;
4638 CK_MECHANISM mechanism = { CKM_MD5, NULL, 0 };
4639 uint8_t secret_data[128] = { 0 };
4640 CK_ULONG secret_data_size __maybe_unused = 0;
4641 CK_ATTRIBUTE digest_get_secret_value[] = {
4642 { CKA_VALUE, &secret_data, sizeof(secret_data) },
4643 };
4644 CK_OBJECT_HANDLE key_handle = CK_INVALID_HANDLE;
4645#ifdef OPENSSL_FOUND
4646 EVP_MD_CTX *mdctx = NULL;
4647 unsigned char hash[EVP_MAX_MD_SIZE] = { 0 };
4648 unsigned int md_len = 0;
4649 int ret = 0;
4650#endif
4651 size_t i = 0;
4652
4653 rv = init_lib_and_find_token_slot(&slot);
4654 if (!ADBG_EXPECT_CK_OK(c, rv))
4655 return;
4656
4657 rv = init_test_token(slot);
4658 if (!ADBG_EXPECT_CK_OK(c, rv))
4659 goto close_lib;
4660
4661 rv = init_user_test_token(slot);
4662 if (!ADBG_EXPECT_CK_OK(c, rv))
4663 goto close_lib;
4664
4665 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
4666 if (!ADBG_EXPECT_CK_OK(c, rv))
4667 goto close_lib;
4668
4669 /* Test out simple successful cases with init+update+final*/
4670 for (i = 0; i < ARRAY_SIZE(digest_test_patterns); i++) {
4671 Do_ADBG_BeginSubCase(c, "Simple digest tests - update - %s",
4672 digest_test_patterns[i].test_name);
4673
4674 mechanism.mechanism = digest_test_patterns[i].mecha;
4675 memset(data, 0xCC, sizeof(data));
4676 memset(digest, 0xCC, sizeof(digest));
4677 digest_size = sizeof(digest);
4678
4679 memcpy(data, digest_test_patterns[i].data,
4680 digest_test_patterns[i].data_size);
4681 data_size = digest_test_patterns[i].data_size;
4682
4683 expect_digest = digest_test_patterns[i].digest;
4684 expect_digest_size = digest_test_patterns[i].digest_size;
4685
4686 rv = C_DigestInit(session, &mechanism);
4687 if (!ADBG_EXPECT_CK_OK(c, rv))
4688 goto out;
4689
4690 rv = C_DigestUpdate(session, data, data_size);
4691 if (!ADBG_EXPECT_CK_OK(c, rv))
4692 goto out;
4693
4694 rv = C_DigestFinal(session, digest, &digest_size);
4695 if (!ADBG_EXPECT_CK_OK(c, rv))
4696 goto out;
4697
4698 if (!ADBG_EXPECT_BUFFER(c, expect_digest, expect_digest_size,
4699 digest, digest_size))
4700 goto out;
4701
4702 /* Verify that end of buffer is still 0xCC */
4703 for (i = expect_digest_size; i < sizeof(digest); i++)
4704 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, digest[i], ==,
4705 0xCC))
4706 goto out;
4707
4708 Do_ADBG_EndSubCase(c, NULL);
4709 }
4710
4711 /* Test out simple successful cases */
4712 for (i = 0; i < ARRAY_SIZE(digest_test_patterns); i++) {
4713 Do_ADBG_BeginSubCase(c, "Simple digest tests - oneshot - %s",
4714 digest_test_patterns[i].test_name);
4715
4716 mechanism.mechanism = digest_test_patterns[i].mecha;
4717 memset(data, 0xCC, sizeof(data));
4718 memset(digest, 0xCC, sizeof(digest));
4719 digest_size = sizeof(digest);
4720
4721 memcpy(data, digest_test_patterns[i].data,
4722 digest_test_patterns[i].data_size);
4723 data_size = digest_test_patterns[i].data_size;
4724
4725 expect_digest = digest_test_patterns[i].digest;
4726 expect_digest_size = digest_test_patterns[i].digest_size;
4727
4728 rv = C_DigestInit(session, &mechanism);
4729 if (!ADBG_EXPECT_CK_OK(c, rv))
4730 goto out;
4731
4732 rv = C_Digest(session, data, data_size, digest, &digest_size);
4733 if (!ADBG_EXPECT_CK_OK(c, rv))
4734 goto out;
4735
4736 if (!ADBG_EXPECT_BUFFER(c, expect_digest, expect_digest_size,
4737 digest, digest_size))
4738 goto out;
4739
4740 /* Verify that end of buffer is still 0xCC */
4741 for (i = expect_digest_size; i < sizeof(digest); i++)
4742 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, digest[i], ==,
4743 0xCC))
4744 goto out;
4745
4746 Do_ADBG_EndSubCase(c, NULL);
4747 }
4748
4749 /* Test out key updates */
4750
4751 Do_ADBG_BeginSubCase(c, "Simple digest tests - AES key update - SHA-256");
4752
4753 /* Login to Test Token */
4754 rv = C_Login(session, CKU_USER, test_token_user_pin,
4755 sizeof(test_token_user_pin));
4756 if (!ADBG_EXPECT_CK_OK(c, rv))
4757 goto out;
4758
4759 logged_in = true;
4760
4761 /* Generate AES key */
4762 rv = C_GenerateKey(session, &cktest_aes_keygen_mechanism,
4763 digest_generate_aes_object,
4764 ARRAY_SIZE(digest_generate_aes_object),
4765 &key_handle);
4766 if (!ADBG_EXPECT_CK_OK(c, rv))
4767 goto out;
4768
4769 memset(secret_data, 0xCC, sizeof(data));
4770 digest_get_secret_value[0].ulValueLen = sizeof(secret_data);
4771
4772 /* Get value of generated secret for verification purposes */
4773 rv = C_GetAttributeValue(session, key_handle, digest_get_secret_value,
4774 ARRAY_SIZE(digest_get_secret_value));
4775 if (!ADBG_EXPECT_CK_OK(c, rv))
4776 goto out;
4777
4778 secret_data_size = digest_get_secret_value[0].ulValueLen;
4779
4780 /* Calculate digest with PKCS11 */
4781 mechanism.mechanism = CKM_SHA256;
4782
4783 memset(data, 0xCC, sizeof(data));
4784 memset(digest, 0xCC, sizeof(digest));
4785 digest_size = sizeof(digest);
4786
4787 memcpy(data, digest_test_patterns[0].data,
4788 digest_test_patterns[0].data_size);
4789 data_size = digest_test_patterns[0].data_size;
4790
4791 rv = C_DigestInit(session, &mechanism);
4792 if (!ADBG_EXPECT_CK_OK(c, rv))
4793 goto out;
4794
4795 rv = C_DigestUpdate(session, data, data_size);
4796 if (!ADBG_EXPECT_CK_OK(c, rv))
4797 goto out;
4798
4799 rv = C_DigestKey(session, key_handle);
4800 if (!ADBG_EXPECT_CK_OK(c, rv))
4801 goto out;
4802
4803 rv = C_DigestFinal(session, digest, &digest_size);
4804 if (!ADBG_EXPECT_CK_OK(c, rv))
4805 goto out;
4806
4807 /* Verify digest with openssl */
4808#ifdef OPENSSL_FOUND
4809 mdctx = EVP_MD_CTX_create();
4810 if (!ADBG_EXPECT_NOT_NULL(c, mdctx))
4811 goto out;
4812 ret = EVP_DigestInit_ex(mdctx, EVP_sha256(), NULL);
4813 if (!ADBG_EXPECT_COMPARE_SIGNED(c, ret, ==, 1))
4814 goto out;
4815 ret = EVP_DigestUpdate(mdctx, data, data_size);
4816 if (!ADBG_EXPECT_COMPARE_SIGNED(c, ret, ==, 1))
4817 goto out;
4818 ret = EVP_DigestUpdate(mdctx, secret_data, secret_data_size);
4819 if (!ADBG_EXPECT_COMPARE_SIGNED(c, ret, ==, 1))
4820 goto out;
4821 ret = EVP_DigestFinal_ex(mdctx, hash, &md_len);
4822 if (!ADBG_EXPECT_COMPARE_SIGNED(c, ret, ==, 1))
4823 goto out;
4824 EVP_MD_CTX_destroy(mdctx);
4825 mdctx = NULL;
4826
4827 if (!ADBG_EXPECT_BUFFER(c, hash, md_len, digest, digest_size))
4828 goto out;
4829#else
4830 Do_ADBG_Log("OpenSSL not available, skipping C_DigestKey verification");
4831#endif
4832
4833 ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, key_handle));
4834 key_handle = CK_INVALID_HANDLE;
4835
4836 Do_ADBG_EndSubCase(c, NULL);
4837
4838 Do_ADBG_BeginSubCase(c, "Simple digest tests - generic secret key update - SHA-256");
4839
4840 /* Generate generic secret key */
4841 rv = C_GenerateKey(session, &cktest_gensecret_keygen_mechanism,
4842 digest_generate_gensecret_object,
4843 ARRAY_SIZE(digest_generate_gensecret_object),
4844 &key_handle);
4845 if (!ADBG_EXPECT_CK_OK(c, rv))
4846 goto out;
4847
4848 memset(secret_data, 0xCC, sizeof(data));
4849 digest_get_secret_value[0].ulValueLen = sizeof(secret_data);
4850
4851 /* Get value of generated secret for verification purposes */
4852 rv = C_GetAttributeValue(session, key_handle, digest_get_secret_value,
4853 ARRAY_SIZE(digest_get_secret_value));
4854 if (!ADBG_EXPECT_CK_OK(c, rv))
4855 goto out;
4856
4857 secret_data_size = digest_get_secret_value[0].ulValueLen;
4858
4859 /* Calculate digest with PKCS11 */
4860 mechanism.mechanism = CKM_SHA256;
4861
4862 memset(data, 0xCC, sizeof(data));
4863 memset(digest, 0xCC, sizeof(digest));
4864 digest_size = sizeof(digest);
4865
4866 memcpy(data, digest_test_patterns[0].data,
4867 digest_test_patterns[0].data_size);
4868 data_size = digest_test_patterns[0].data_size;
4869
4870 rv = C_DigestInit(session, &mechanism);
4871 if (!ADBG_EXPECT_CK_OK(c, rv))
4872 goto out;
4873
4874 rv = C_DigestUpdate(session, data, data_size);
4875 if (!ADBG_EXPECT_CK_OK(c, rv))
4876 goto out;
4877
4878 rv = C_DigestKey(session, key_handle);
4879 if (!ADBG_EXPECT_CK_OK(c, rv))
4880 goto out;
4881
4882 rv = C_DigestFinal(session, digest, &digest_size);
4883 if (!ADBG_EXPECT_CK_OK(c, rv))
4884 goto out;
4885
4886 /* Verify digest with openssl */
4887#ifdef OPENSSL_FOUND
4888 mdctx = EVP_MD_CTX_create();
4889 if (!ADBG_EXPECT_NOT_NULL(c, mdctx))
4890 goto out;
4891 ret = EVP_DigestInit_ex(mdctx, EVP_sha256(), NULL);
4892 if (!ADBG_EXPECT_COMPARE_SIGNED(c, ret, ==, 1))
4893 goto out;
4894 ret = EVP_DigestUpdate(mdctx, data, data_size);
4895 if (!ADBG_EXPECT_COMPARE_SIGNED(c, ret, ==, 1))
4896 goto out;
4897 ret = EVP_DigestUpdate(mdctx, secret_data, secret_data_size);
4898 if (!ADBG_EXPECT_COMPARE_SIGNED(c, ret, ==, 1))
4899 goto out;
4900 ret = EVP_DigestFinal_ex(mdctx, hash, &md_len);
4901 if (!ADBG_EXPECT_COMPARE_SIGNED(c, ret, ==, 1))
4902 goto out;
4903 EVP_MD_CTX_destroy(mdctx);
4904 mdctx = NULL;
4905
4906 if (!ADBG_EXPECT_BUFFER(c, hash, md_len, digest, digest_size))
4907 goto out;
4908#else
4909 Do_ADBG_Log("OpenSSL not available, skipping C_DigestKey verification");
4910#endif
4911
4912 ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, key_handle));
4913 key_handle = CK_INVALID_HANDLE;
4914
4915 Do_ADBG_EndSubCase(c, NULL);
4916
4917 Do_ADBG_BeginSubCase(c, "Query digest size - C_DigestFinal");
4918
4919 mechanism.mechanism = digest_test_patterns[0].mecha;
4920
4921 memset(data, 0xCC, sizeof(data));
4922 memset(digest, 0xCC, sizeof(digest));
4923 digest_size = 0;
4924
4925 memcpy(data, digest_test_patterns[0].data,
4926 digest_test_patterns[0].data_size);
4927 data_size = digest_test_patterns[0].data_size;
4928
4929 expect_digest = digest_test_patterns[0].digest;
4930 expect_digest_size = digest_test_patterns[0].digest_size;
4931
4932 rv = C_DigestInit(session, &mechanism);
4933 if (!ADBG_EXPECT_CK_OK(c, rv))
4934 goto out;
4935
4936 rv = C_DigestUpdate(session, data, data_size);
4937 if (!ADBG_EXPECT_CK_OK(c, rv))
4938 goto out;
4939
4940 rv = C_DigestFinal(session, NULL, &digest_size);
4941 if (!ADBG_EXPECT_CK_OK(c, rv))
4942 goto out;
4943
4944 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, digest_size, ==,
4945 expect_digest_size))
4946 goto out;
4947
4948 rv = C_DigestFinal(session, digest, &digest_size);
4949 if (!ADBG_EXPECT_CK_OK(c, rv))
4950 goto out;
4951
4952 if (!ADBG_EXPECT_BUFFER(c, expect_digest, expect_digest_size,
4953 digest, digest_size))
4954 goto out;
4955
4956 Do_ADBG_EndSubCase(c, NULL);
4957
4958 Do_ADBG_BeginSubCase(c, "Query digest size - C_Digest");
4959
4960 mechanism.mechanism = digest_test_patterns[0].mecha;
4961
4962 memset(data, 0xCC, sizeof(data));
4963 memset(digest, 0xCC, sizeof(digest));
4964 digest_size = 0;
4965
4966 memcpy(data, digest_test_patterns[0].data,
4967 digest_test_patterns[0].data_size);
4968 data_size = digest_test_patterns[0].data_size;
4969
4970 expect_digest = digest_test_patterns[0].digest;
4971 expect_digest_size = digest_test_patterns[0].digest_size;
4972
4973 rv = C_DigestInit(session, &mechanism);
4974 if (!ADBG_EXPECT_CK_OK(c, rv))
4975 goto out;
4976
4977 rv = C_Digest(session, data, data_size, NULL, &digest_size);
4978 if (!ADBG_EXPECT_CK_OK(c, rv))
4979 goto out;
4980
4981 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, digest_size, ==,
4982 expect_digest_size))
4983 goto out;
4984
4985 rv = C_Digest(session, data, data_size, digest, &digest_size);
4986 if (!ADBG_EXPECT_CK_OK(c, rv))
4987 goto out;
4988
4989 if (!ADBG_EXPECT_BUFFER(c, expect_digest, expect_digest_size,
4990 digest, digest_size))
4991 goto out;
4992
4993 Do_ADBG_EndSubCase(c, NULL);
4994
4995 Do_ADBG_BeginSubCase(c, "Query digest size - buffer too small");
4996
4997 mechanism.mechanism = CKM_SHA256;
4998
4999 memset(data, 0xCC, sizeof(data));
5000 memset(digest, 0xCC, sizeof(digest));
5001 digest_size = 0;
5002
5003 memcpy(data, digest_test_patterns[0].data,
5004 digest_test_patterns[0].data_size);
5005 data_size = digest_test_patterns[0].data_size;
5006
5007 rv = C_DigestInit(session, &mechanism);
5008 if (!ADBG_EXPECT_CK_OK(c, rv))
5009 goto out;
5010
5011 rv = C_DigestUpdate(session, data, data_size);
5012 if (!ADBG_EXPECT_CK_OK(c, rv))
5013 goto out;
5014
5015 rv = C_DigestFinal(session, digest, &digest_size);
5016 if (!ADBG_EXPECT_CK_RESULT(c, CKR_BUFFER_TOO_SMALL, rv))
5017 goto out;
5018
5019 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, digest_size, ==, 32))
5020 goto out;
5021
5022 rv = C_DigestFinal(session, digest, &digest_size);
5023 if (!ADBG_EXPECT_CK_OK(c, rv))
5024 goto out;
5025
5026 Do_ADBG_EndSubCase(c, NULL);
5027
5028 /* Test bad arguments & operation terminations */
5029
5030 Do_ADBG_BeginSubCase(c, "Test bad arguments - C_DigestUpdate");
5031
5032 mechanism.mechanism = CKM_SHA256;
5033
5034 memset(data, 0xCC, sizeof(data));
5035 memset(digest, 0xCC, sizeof(digest));
5036 digest_size = sizeof(digest);
5037
5038 memcpy(data, digest_test_patterns[0].data,
5039 digest_test_patterns[0].data_size);
5040 data_size = digest_test_patterns[0].data_size;
5041
5042 rv = C_DigestInit(session, &mechanism);
5043 if (!ADBG_EXPECT_CK_OK(c, rv))
5044 goto out;
5045
5046 rv = C_DigestUpdate(session, NULL, 10);
5047 if (!ADBG_EXPECT_CK_RESULT(c, CKR_ARGUMENTS_BAD, rv))
5048 goto out;
5049
5050 rv = C_DigestUpdate(session, data, data_size);
5051 if (!ADBG_EXPECT_CK_RESULT(c, CKR_OPERATION_NOT_INITIALIZED, rv))
5052 goto out;
5053
5054 Do_ADBG_EndSubCase(c, NULL);
5055
5056 Do_ADBG_BeginSubCase(c, "Test bad arguments - C_DigestFinal with NULL digest");
5057
5058 mechanism.mechanism = CKM_SHA256;
5059
5060 memset(data, 0xCC, sizeof(data));
5061 memset(digest, 0xCC, sizeof(digest));
5062 digest_size = sizeof(digest);
5063
5064 memcpy(data, digest_test_patterns[0].data,
5065 digest_test_patterns[0].data_size);
5066 data_size = digest_test_patterns[0].data_size;
5067
5068 rv = C_DigestInit(session, &mechanism);
5069 if (!ADBG_EXPECT_CK_OK(c, rv))
5070 goto out;
5071
5072 rv = C_DigestUpdate(session, data, data_size);
5073 if (!ADBG_EXPECT_CK_OK(c, rv))
5074 goto out;
5075
5076 rv = C_DigestFinal(session, NULL, NULL);
5077 if (!ADBG_EXPECT_CK_RESULT(c, CKR_ARGUMENTS_BAD, rv))
5078 goto out;
5079
5080 rv = C_DigestFinal(session, digest, &digest_size);
5081 if (!ADBG_EXPECT_CK_RESULT(c, CKR_OPERATION_NOT_INITIALIZED, rv))
5082 goto out;
5083
5084 Do_ADBG_EndSubCase(c, NULL);
5085
5086 Do_ADBG_BeginSubCase(c, "Test bad arguments - C_DigestFinal with digest but NULL size");
5087
5088 mechanism.mechanism = CKM_SHA256;
5089
5090 memset(data, 0xCC, sizeof(data));
5091 memset(digest, 0xCC, sizeof(digest));
5092 digest_size = sizeof(digest);
5093
5094 memcpy(data, digest_test_patterns[0].data,
5095 digest_test_patterns[0].data_size);
5096 data_size = digest_test_patterns[0].data_size;
5097
5098 rv = C_DigestInit(session, &mechanism);
5099 if (!ADBG_EXPECT_CK_OK(c, rv))
5100 goto out;
5101
5102 rv = C_DigestUpdate(session, data, data_size);
5103 if (!ADBG_EXPECT_CK_OK(c, rv))
5104 goto out;
5105
5106 rv = C_DigestFinal(session, digest, NULL);
5107 if (!ADBG_EXPECT_CK_RESULT(c, CKR_ARGUMENTS_BAD, rv))
5108 goto out;
5109
5110 rv = C_DigestFinal(session, digest, &digest_size);
5111 if (!ADBG_EXPECT_CK_RESULT(c, CKR_OPERATION_NOT_INITIALIZED, rv))
5112 goto out;
5113
5114 Do_ADBG_EndSubCase(c, NULL);
5115
5116 Do_ADBG_BeginSubCase(c, "Test bad arguments - C_Digest with NULL data but non-zero size");
5117
5118 mechanism.mechanism = CKM_SHA256;
5119
5120 memset(data, 0xCC, sizeof(data));
5121 memset(digest, 0xCC, sizeof(digest));
5122 digest_size = sizeof(digest);
5123
5124 memcpy(data, digest_test_patterns[0].data,
5125 digest_test_patterns[0].data_size);
5126 data_size = digest_test_patterns[0].data_size;
5127
5128 rv = C_DigestInit(session, &mechanism);
5129 if (!ADBG_EXPECT_CK_OK(c, rv))
5130 goto out;
5131
5132 rv = C_Digest(session, NULL, 10, digest, &digest_size);
5133 if (!ADBG_EXPECT_CK_RESULT(c, CKR_ARGUMENTS_BAD, rv))
5134 goto out;
5135
5136 rv = C_Digest(session, data, data_size, digest, &digest_size);
5137 if (!ADBG_EXPECT_CK_RESULT(c, CKR_OPERATION_NOT_INITIALIZED, rv))
5138 goto out;
5139
5140 Do_ADBG_EndSubCase(c, NULL);
5141
5142 Do_ADBG_BeginSubCase(c, "Test bad arguments - C_Digest with NULL digest");
5143
5144 mechanism.mechanism = CKM_SHA256;
5145
5146 memset(data, 0xCC, sizeof(data));
5147 memset(digest, 0xCC, sizeof(digest));
5148 digest_size = sizeof(digest);
5149
5150 memcpy(data, digest_test_patterns[0].data,
5151 digest_test_patterns[0].data_size);
5152 data_size = digest_test_patterns[0].data_size;
5153
5154 rv = C_DigestInit(session, &mechanism);
5155 if (!ADBG_EXPECT_CK_OK(c, rv))
5156 goto out;
5157
5158 rv = C_Digest(session, data, data_size, NULL, NULL);
5159 if (!ADBG_EXPECT_CK_RESULT(c, CKR_ARGUMENTS_BAD, rv))
5160 goto out;
5161
5162 rv = C_Digest(session, data, data_size, digest, &digest_size);
5163 if (!ADBG_EXPECT_CK_RESULT(c, CKR_OPERATION_NOT_INITIALIZED, rv))
5164 goto out;
5165
5166 Do_ADBG_EndSubCase(c, NULL);
5167
5168 Do_ADBG_BeginSubCase(c, "Test bad arguments - C_DigestFinal with digest but NULL size");
5169
5170 mechanism.mechanism = CKM_SHA256;
5171
5172 memset(data, 0xCC, sizeof(data));
5173 memset(digest, 0xCC, sizeof(digest));
5174 digest_size = sizeof(digest);
5175
5176 memcpy(data, digest_test_patterns[0].data,
5177 digest_test_patterns[0].data_size);
5178 data_size = digest_test_patterns[0].data_size;
5179
5180 rv = C_DigestInit(session, &mechanism);
5181 if (!ADBG_EXPECT_CK_OK(c, rv))
5182 goto out;
5183
5184 rv = C_Digest(session, data, data_size, digest, NULL);
5185 if (!ADBG_EXPECT_CK_RESULT(c, CKR_ARGUMENTS_BAD, rv))
5186 goto out;
5187
5188 rv = C_Digest(session, data, data_size, digest, &digest_size);
5189 if (!ADBG_EXPECT_CK_RESULT(c, CKR_OPERATION_NOT_INITIALIZED, rv))
5190 goto out;
5191
5192 Do_ADBG_EndSubCase(c, NULL);
5193
5194 Do_ADBG_BeginSubCase(c, "Test bad arguments - C_DigestKey with invalid key handle");
5195
5196 rv = C_CreateObject(session, digest_data_object,
5197 ARRAY_SIZE(digest_data_object), &key_handle);
5198 if (!ADBG_EXPECT_CK_OK(c, rv))
5199 goto out;
5200
5201 mechanism.mechanism = CKM_SHA256;
5202
5203 memset(data, 0xCC, sizeof(data));
5204 memset(digest, 0xCC, sizeof(digest));
5205 digest_size = sizeof(digest);
5206
5207 memcpy(data, digest_test_patterns[0].data,
5208 digest_test_patterns[0].data_size);
5209 data_size = digest_test_patterns[0].data_size;
5210
5211 rv = C_DigestInit(session, &mechanism);
5212 if (!ADBG_EXPECT_CK_OK(c, rv))
5213 goto out;
5214
5215 rv = C_DigestKey(session, 9999);
5216 if (!ADBG_EXPECT_CK_RESULT(c, CKR_KEY_HANDLE_INVALID, rv))
5217 goto out;
5218
5219 rv = C_DigestKey(session, key_handle);
5220 if (!ADBG_EXPECT_CK_RESULT(c, CKR_OPERATION_NOT_INITIALIZED, rv))
5221 goto out;
5222
5223 Do_ADBG_EndSubCase(c, NULL);
5224
5225 Do_ADBG_BeginSubCase(c, "Test bad arguments - C_DigestKey with non-secret key type");
5226
5227 mechanism.mechanism = CKM_SHA256;
5228
5229 memset(data, 0xCC, sizeof(data));
5230 memset(digest, 0xCC, sizeof(digest));
5231 digest_size = sizeof(digest);
5232
5233 memcpy(data, digest_test_patterns[0].data,
5234 digest_test_patterns[0].data_size);
5235 data_size = digest_test_patterns[0].data_size;
5236
5237 rv = C_DigestInit(session, &mechanism);
5238 if (!ADBG_EXPECT_CK_OK(c, rv))
5239 goto out;
5240
5241 rv = C_DigestKey(session, key_handle);
5242 if (!ADBG_EXPECT_CK_RESULT(c, CKR_KEY_INDIGESTIBLE, rv))
5243 goto out;
5244
5245 rv = C_DigestKey(session, key_handle);
5246 if (!ADBG_EXPECT_CK_RESULT(c, CKR_OPERATION_NOT_INITIALIZED, rv))
5247 goto out;
5248
5249 ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, key_handle));
5250 key_handle = CK_INVALID_HANDLE;
5251
5252out:
5253#ifdef OPENSSL_FOUND
5254 if (!ADBG_EXPECT_POINTER(c, NULL, mdctx)) {
5255 Do_ADBG_Log("Unexpected failure in openssl functions: %d",
5256 ret);
5257 EVP_MD_CTX_destroy(mdctx);
5258 }
5259#endif
5260
5261 Do_ADBG_EndSubCase(c, NULL);
5262
5263 if (logged_in)
5264 ADBG_EXPECT_CK_OK(c, C_Logout(session));
5265
5266 if (key_handle != CK_INVALID_HANDLE) {
5267 ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, key_handle));
5268 key_handle = CK_INVALID_HANDLE;
5269 }
5270
5271 ADBG_EXPECT_CK_OK(c, C_CloseSession(session));
5272
5273close_lib:
5274 ADBG_EXPECT_CK_OK(c, close_lib());
5275}
5276ADBG_CASE_DEFINE(pkcs11, 1018, xtest_pkcs11_test_1018,
5277 "PKCS11: Digest tests");
Vesa Jääskeläinena4ab9572021-04-07 12:50:06 +03005278
5279/**
5280 * 0:d=0 hl=2 l= 22 cons: SEQUENCE
5281 * 2:d=1 hl=2 l= 20 cons: SET
5282 * 4:d=2 hl=2 l= 18 cons: SEQUENCE
5283 * 6:d=3 hl=2 l= 3 prim: OBJECT :commonName
5284 * 11:d=3 hl=2 l= 11 prim: UTF8STRING :common name
5285 */
5286static uint8_t subject_common_name[] = {
5287 0x30, 0x16, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c,
5288 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x20, 0x6e, 0x61, 0x6d, 0x65
5289};
5290
5291/**
5292 * 0:d=0 hl=2 l= 8 prim: OBJECT :prime256v1
5293 */
5294static uint8_t ecdsa_nist_p256[] = {
5295 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03,
5296 0x01, 0x07
5297};
5298
5299/**
5300 * 0:d=0 hl=2 l= 5 prim: OBJECT :secp384r1
5301 */
5302static uint8_t ecdsa_nist_p384[] = {
5303 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22
5304};
5305
5306/**
5307 * 0:d=0 hl=2 l= 5 prim: OBJECT :secp521r1
5308 */
5309static uint8_t ecdsa_nist_p521[] = {
5310 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x23
5311};
5312
5313#define EC_SIGN_TEST(_test_name, _mecha, _data) \
5314 { \
5315 .test_name = _test_name, \
5316 .mecha = _mecha, \
5317 .data = _data, \
5318 .data_size = sizeof(_data) - 1, \
5319 }
5320
5321/* List of elliptic curve signing multi stage digest mechas */
5322static struct {
5323 const char *test_name;
5324 CK_MECHANISM_TYPE mecha;
5325 const void *data;
5326 CK_ULONG data_size;
5327} ec_sign_tests[] = {
5328 EC_SIGN_TEST("CKM_ECDSA_SHA1", CKM_ECDSA_SHA1, digest_test_pattern),
5329 EC_SIGN_TEST("CKM_ECDSA_SHA224", CKM_ECDSA_SHA224, digest_test_pattern),
5330 EC_SIGN_TEST("CKM_ECDSA_SHA256", CKM_ECDSA_SHA256, digest_test_pattern),
5331 EC_SIGN_TEST("CKM_ECDSA_SHA384", CKM_ECDSA_SHA384, digest_test_pattern),
5332 EC_SIGN_TEST("CKM_ECDSA_SHA512", CKM_ECDSA_SHA512, digest_test_pattern),
5333};
5334
5335static int test_ec_operations(ADBG_Case_t *c, CK_SESSION_HANDLE session,
5336 const char *curve_name, uint8_t *curve,
5337 size_t curve_size)
5338{
5339 CK_RV rv = CKR_GENERAL_ERROR;
5340
5341 CK_OBJECT_HANDLE public_key = CK_INVALID_HANDLE;
5342 CK_OBJECT_HANDLE private_key = CK_INVALID_HANDLE;
5343
5344 CK_MECHANISM mechanism = {
5345 CKM_EC_KEY_PAIR_GEN, NULL, 0
5346 };
5347 CK_MECHANISM sign_mechanism = {
5348 CKM_ECDSA, NULL, 0
5349 };
5350 CK_BYTE id[] = { 123 };
5351
5352 CK_ATTRIBUTE public_key_template[] = {
5353 { CKA_ENCRYPT, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
5354 { CKA_VERIFY, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5355 { CKA_WRAP, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
5356 { CKA_EC_PARAMS, ecdsa_nist_p256, sizeof(ecdsa_nist_p256) }
5357 };
5358
5359 CK_ATTRIBUTE private_key_template[] = {
5360 { CKA_TOKEN, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
5361 { CKA_PRIVATE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5362 { CKA_SUBJECT, subject_common_name,
5363 sizeof(subject_common_name) },
5364 { CKA_ID, id, sizeof(id) },
5365 { CKA_SENSITIVE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5366 { CKA_DECRYPT, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
5367 { CKA_SIGN, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5368 { CKA_UNWRAP, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) }
5369 };
5370
5371 CK_OBJECT_CLASS g_class = 0;
5372 CK_KEY_TYPE g_key_type = 0;
5373 CK_BYTE g_id[32] = { 0 };
5374 CK_DATE g_start_date = { 0 };
5375 CK_DATE g_end_date = { 0 };
5376 CK_BBOOL g_derive = CK_FALSE;
5377 CK_BBOOL g_local = CK_FALSE;
5378 CK_MECHANISM_TYPE g_keygen_mecha = 0;
5379 CK_BYTE g_subject[64] = { 0 };
5380 CK_BBOOL g_encrypt = CK_FALSE;
5381 CK_BBOOL g_verify = CK_FALSE;
5382 CK_BBOOL g_verify_recover = CK_FALSE;
5383 CK_BBOOL g_wrap = CK_FALSE;
5384 CK_BBOOL g_trusted = CK_FALSE;
5385 CK_BYTE g_public_key_info[1024] = { 0 };
5386 CK_BBOOL g_sensitive = CK_FALSE;
5387 CK_BBOOL g_decrypt = CK_FALSE;
5388 CK_BBOOL g_sign = CK_FALSE;
5389 CK_BBOOL g_sign_recover = CK_FALSE;
5390 CK_BBOOL g_unwrap = CK_FALSE;
5391 CK_BBOOL g_extract = CK_FALSE;
5392 CK_BBOOL g_asensitive = CK_FALSE;
5393 CK_BBOOL g_nextract = CK_FALSE;
5394 CK_BBOOL g_wrap_with_trusted = CK_FALSE;
5395 CK_BBOOL g_always_authenticate = CK_FALSE;
5396
5397 CK_ATTRIBUTE get_public_template[] = {
5398 { CKA_CLASS, &g_class, sizeof(CK_OBJECT_CLASS) },
5399 { CKA_KEY_TYPE, &g_key_type, sizeof(CK_KEY_TYPE) },
5400 { CKA_ID, g_id, sizeof(g_id) },
5401 { CKA_START_DATE, &g_start_date, sizeof(CK_DATE) },
5402 { CKA_END_DATE, &g_end_date, sizeof(CK_DATE) },
5403 { CKA_DERIVE, &g_derive, sizeof(CK_BBOOL) },
5404 { CKA_LOCAL, &g_local, sizeof(CK_BBOOL) },
5405 { CKA_KEY_GEN_MECHANISM, &g_keygen_mecha, sizeof(CK_MECHANISM_TYPE) },
5406 { CKA_SUBJECT, g_subject, sizeof(g_subject) },
5407 { CKA_ENCRYPT, &g_encrypt, sizeof(CK_BBOOL) },
5408 { CKA_VERIFY, &g_verify, sizeof(CK_BBOOL) },
5409 { CKA_VERIFY_RECOVER, &g_verify_recover, sizeof(CK_BBOOL) },
5410 { CKA_WRAP, &g_wrap, sizeof(CK_BBOOL) },
5411 { CKA_TRUSTED, &g_trusted, sizeof(CK_BBOOL) },
5412 { CKA_PUBLIC_KEY_INFO, g_public_key_info, sizeof(g_public_key_info) },
5413 };
5414
5415 CK_ATTRIBUTE get_private_template[] = {
5416 { CKA_CLASS, &g_class, sizeof(CK_OBJECT_CLASS) },
5417 { CKA_KEY_TYPE, &g_key_type, sizeof(CK_KEY_TYPE) },
5418 { CKA_ID, g_id, sizeof(g_id) },
5419 { CKA_START_DATE, &g_start_date, sizeof(CK_DATE) },
5420 { CKA_END_DATE, &g_end_date, sizeof(CK_DATE) },
5421 { CKA_DERIVE, &g_derive, sizeof(CK_BBOOL) },
5422 { CKA_LOCAL, &g_local, sizeof(CK_BBOOL) },
5423 { CKA_KEY_GEN_MECHANISM, &g_keygen_mecha, sizeof(CK_MECHANISM_TYPE) },
5424 { CKA_SUBJECT, g_subject, sizeof(g_subject) },
5425 { CKA_SENSITIVE, &g_sensitive, sizeof(CK_BBOOL) },
5426 { CKA_DECRYPT, &g_decrypt, sizeof(CK_BBOOL) },
5427 { CKA_SIGN, &g_sign, sizeof(CK_BBOOL) },
5428 { CKA_SIGN_RECOVER, &g_sign_recover, sizeof(CK_BBOOL) },
5429 { CKA_UNWRAP, &g_unwrap, sizeof(CK_BBOOL) },
5430 { CKA_EXTRACTABLE, &g_extract, sizeof(CK_BBOOL) },
5431 { CKA_ALWAYS_SENSITIVE, &g_asensitive, sizeof(CK_BBOOL) },
5432 { CKA_NEVER_EXTRACTABLE, &g_nextract, sizeof(CK_BBOOL) },
5433 { CKA_WRAP_WITH_TRUSTED, &g_wrap_with_trusted, sizeof(CK_BBOOL) },
5434 { CKA_ALWAYS_AUTHENTICATE, &g_always_authenticate, sizeof(CK_BBOOL) },
5435 { CKA_PUBLIC_KEY_INFO, g_public_key_info, sizeof(g_public_key_info) },
5436 };
5437
5438 uint8_t signature[512] = { 0 };
5439 CK_ULONG signature_len = 0;
5440
5441 size_t i = 0;
5442
5443 Do_ADBG_BeginSubCase(c, "%s: Generate key pair",
5444 curve_name);
5445
5446 public_key_template[3].pValue = curve;
5447 public_key_template[3].ulValueLen = curve_size;
5448
5449 rv = C_GenerateKeyPair(session, &mechanism, public_key_template,
5450 ARRAY_SIZE(public_key_template),
5451 private_key_template,
5452 ARRAY_SIZE(private_key_template),
5453 &public_key, &private_key);
5454 if (!ADBG_EXPECT_CK_OK(c, rv))
5455 goto err;
5456
5457 /* reset get public key template */
5458 memset(g_id, 0, sizeof(g_id));
5459 memset(g_subject, 0, sizeof(g_subject));
5460 memset(g_public_key_info, 0, sizeof(g_public_key_info));
5461 get_public_template[2].ulValueLen = sizeof(g_id);
5462 get_public_template[8].ulValueLen = sizeof(g_subject);
5463 get_public_template[14].ulValueLen = sizeof(g_public_key_info);
5464
5465 rv = C_GetAttributeValue(session, public_key, get_public_template,
5466 ARRAY_SIZE(get_public_template));
5467 if (!ADBG_EXPECT_CK_OK(c, rv) ||
5468 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_PUBLIC_KEY) ||
5469 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_key_type, ==, CKK_EC) ||
5470 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_derive, ==, CK_FALSE) ||
5471 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_TRUE) ||
5472 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_keygen_mecha, ==,
5473 CKM_EC_KEY_PAIR_GEN) ||
5474 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_encrypt, ==, CK_FALSE) ||
5475 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_verify, ==, CK_TRUE) ||
5476 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_verify_recover, ==, CK_FALSE) ||
5477 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_wrap, ==, CK_FALSE) ||
5478 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_trusted, ==, CK_FALSE))
5479 goto err_destr_obj;
5480
5481 /* reset get private key template */
5482 memset(g_id, 0, sizeof(g_id));
5483 memset(g_subject, 0, sizeof(g_subject));
5484 memset(g_public_key_info, 0, sizeof(g_public_key_info));
5485 get_private_template[2].ulValueLen = sizeof(g_id);
5486 get_private_template[8].ulValueLen = sizeof(g_subject);
5487 get_private_template[19].ulValueLen = sizeof(g_public_key_info);
5488
5489 rv = C_GetAttributeValue(session, private_key, get_private_template,
5490 ARRAY_SIZE(get_private_template));
5491 if (!ADBG_EXPECT_CK_OK(c, rv) ||
5492 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_PRIVATE_KEY) ||
5493 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_key_type, ==, CKK_EC) ||
5494 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_derive, ==, CK_FALSE) ||
5495 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_TRUE) ||
5496 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_keygen_mecha, ==,
5497 CKM_EC_KEY_PAIR_GEN) ||
5498 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sensitive, ==, CK_TRUE) ||
5499 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_decrypt, ==, CK_FALSE) ||
5500 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sign, ==, CK_TRUE) ||
5501 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sign_recover, ==, CK_FALSE) ||
5502 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_unwrap, ==, CK_FALSE) ||
5503 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_extract, ==, CK_FALSE) ||
5504 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_asensitive, ==, CK_TRUE) ||
5505 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_nextract, ==, CK_TRUE) ||
5506 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_wrap_with_trusted, ==, CK_FALSE) ||
5507 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_always_authenticate, ==, CK_FALSE))
5508 goto err_destr_obj;
5509
5510 Do_ADBG_EndSubCase(c, NULL);
5511
5512 Do_ADBG_BeginSubCase(c,
5513 "%s: Sign & verify tests - oneshot - CKM_ECDSA",
5514 curve_name);
5515
5516 sign_mechanism.mechanism = CKM_ECDSA;
5517 memset(signature, 0, sizeof(signature));
5518 signature_len = sizeof(signature);
5519
5520 rv = C_SignInit(session, &sign_mechanism, private_key);
5521 if (!ADBG_EXPECT_CK_OK(c, rv))
5522 goto err_destr_obj;
5523
5524 rv = C_Sign(session, (void *)digest_test_pattern_sha256,
5525 sizeof(digest_test_pattern_sha256), (void *)signature,
5526 &signature_len);
5527 if (!ADBG_EXPECT_CK_OK(c, rv))
5528 goto err_destr_obj;
5529
5530 rv = C_VerifyInit(session, &sign_mechanism, public_key);
5531 if (!ADBG_EXPECT_CK_OK(c, rv))
5532 goto err_destr_obj;
5533
5534 rv = C_Verify(session, (void *)digest_test_pattern_sha256,
5535 sizeof(digest_test_pattern_sha256), (void *)signature,
5536 signature_len);
5537 if (!ADBG_EXPECT_CK_OK(c, rv))
5538 goto err_destr_obj;
5539
5540 Do_ADBG_EndSubCase(c, NULL);
5541
5542 for (i = 0; i < ARRAY_SIZE(ec_sign_tests); i++) {
5543 Do_ADBG_BeginSubCase(c, "%s: Sign & verify - oneshot - %s",
5544 curve_name, ec_sign_tests[i].test_name);
5545
5546 sign_mechanism.mechanism = ec_sign_tests[i].mecha;
5547 memset(signature, 0, sizeof(signature));
5548 signature_len = sizeof(signature);
5549
5550 rv = C_SignInit(session, &sign_mechanism, private_key);
5551 if (!ADBG_EXPECT_CK_OK(c, rv))
5552 goto err_destr_obj;
5553
5554 rv = C_Sign(session, (void *)ec_sign_tests[i].data,
5555 ec_sign_tests[i].data_size,
5556 (void *)signature, &signature_len);
5557 if (!ADBG_EXPECT_CK_OK(c, rv))
5558 goto err_destr_obj;
5559
5560 rv = C_VerifyInit(session, &sign_mechanism, public_key);
5561 if (!ADBG_EXPECT_CK_OK(c, rv))
5562 goto err_destr_obj;
5563
5564 rv = C_Verify(session, (void *)ec_sign_tests[i].data,
5565 ec_sign_tests[i].data_size,
5566 (void *)signature, signature_len);
5567 if (!ADBG_EXPECT_CK_OK(c, rv))
5568 goto err_destr_obj;
5569
5570 Do_ADBG_EndSubCase(c, NULL);
5571 }
5572
5573 Do_ADBG_BeginSubCase(c, "%s: Destroy keys", curve_name);
5574
5575 rv = C_DestroyObject(session, private_key);
5576 if (!ADBG_EXPECT_CK_OK(c, rv))
5577 goto err_destr_obj;
5578
5579 rv = C_DestroyObject(session, public_key);
5580 if (!ADBG_EXPECT_CK_OK(c, rv))
5581 goto err;
5582
5583 Do_ADBG_EndSubCase(c, NULL);
5584
5585 return 1;
5586
5587err_destr_obj:
5588 ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, private_key));
5589 ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, public_key));
5590err:
5591 Do_ADBG_EndSubCase(c, NULL);
5592
5593 return 0;
5594}
5595
5596static void xtest_pkcs11_test_1019(ADBG_Case_t *c)
5597{
5598 CK_RV rv = CKR_GENERAL_ERROR;
5599 CK_SLOT_ID slot = 0;
5600 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
5601 CK_FLAGS session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
5602 int ret = 0;
5603
5604 rv = init_lib_and_find_token_slot(&slot);
5605 if (!ADBG_EXPECT_CK_OK(c, rv))
5606 return;
5607
5608 rv = init_test_token(slot);
5609 if (!ADBG_EXPECT_CK_OK(c, rv))
5610 goto close_lib;
5611
5612 rv = init_user_test_token(slot);
5613 if (!ADBG_EXPECT_CK_OK(c, rv))
5614 goto close_lib;
5615
5616 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
5617 if (!ADBG_EXPECT_CK_OK(c, rv))
5618 goto close_lib;
5619
5620 /* Login to Test Token */
5621 rv = C_Login(session, CKU_USER, test_token_user_pin,
5622 sizeof(test_token_user_pin));
5623 if (!ADBG_EXPECT_CK_OK(c, rv))
5624 goto out;
5625
5626 ret = test_ec_operations(c, session, "P-256", ecdsa_nist_p256,
5627 sizeof(ecdsa_nist_p256));
5628 if (!ret)
5629 goto out;
5630 ret = test_ec_operations(c, session, "P-384", ecdsa_nist_p384,
5631 sizeof(ecdsa_nist_p384));
5632 if (!ret)
5633 goto out;
5634
5635 if (level > 0) {
5636 ret = test_ec_operations(c, session, "P-521", ecdsa_nist_p521,
5637 sizeof(ecdsa_nist_p521));
5638 if (!ret)
5639 goto out;
5640 }
5641out:
5642 ADBG_EXPECT_CK_OK(c, C_CloseSession(session));
5643close_lib:
5644 ADBG_EXPECT_CK_OK(c, close_lib());
5645}
5646ADBG_CASE_DEFINE(pkcs11, 1019, xtest_pkcs11_test_1019,
5647 "PKCS11: Elliptic Curve key generation and signing");
Ruchika Guptaf2eb88a2021-03-22 19:38:11 +05305648
5649#define WRAPPED_TEST_KEY_SIZE 48
5650
5651static void xtest_pkcs11_test_1020(ADBG_Case_t *c)
5652{
5653 CK_RV rv = CKR_GENERAL_ERROR;
5654 CK_SLOT_ID slot = 0;
5655 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
5656 CK_FLAGS session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
5657 CK_OBJECT_HANDLE wrapping_key1 = CK_INVALID_HANDLE;
5658 CK_OBJECT_HANDLE wrapping_key2 = CK_INVALID_HANDLE;
5659 CK_OBJECT_HANDLE wrapping_key_inv = CK_INVALID_HANDLE;
5660 CK_OBJECT_HANDLE key = CK_INVALID_HANDLE;
5661 CK_OBJECT_HANDLE key_sz24 = CK_INVALID_HANDLE;
5662 CK_OBJECT_HANDLE key_sens = CK_INVALID_HANDLE;
5663 CK_OBJECT_HANDLE key_inv = CK_INVALID_HANDLE;
5664 CK_OBJECT_HANDLE unwrapped_key = CK_INVALID_HANDLE;
5665 CK_ATTRIBUTE set_w_unw_template[] = {
5666 { CKA_WRAP, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5667 { CKA_UNWRAP, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5668 };
5669 CK_ATTRIBUTE set_wwt_template[] = {
5670 { CKA_WRAP_WITH_TRUSTED, &(CK_BBOOL){ CK_TRUE },
5671 sizeof(CK_BBOOL) },
5672 };
5673 CK_ATTRIBUTE set_trusted_template[] = {
5674 { CKA_TRUSTED, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5675 };
5676 CK_ATTRIBUTE wrap_template[] = {
5677 { CKA_SENSITIVE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5678 };
5679 CK_ATTRIBUTE unwrap_template[] = {
5680 { CKA_SENSITIVE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5681 };
5682 CK_ATTRIBUTE wrapping_key_template[] = {
5683 { CKA_VALUE_LEN, &(CK_ULONG){ 16 }, sizeof(CK_ULONG) },
5684 { CKA_WRAP, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5685 { CKA_UNWRAP, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5686 { CKA_SENSITIVE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5687 { CKA_EXTRACTABLE, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
5688 };
5689 CK_ATTRIBUTE wrapping_key_temp_w_indirect[] = {
5690 { CKA_VALUE_LEN, &(CK_ULONG){ 16 }, sizeof(CK_ULONG) },
5691 { CKA_WRAP, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5692 { CKA_UNWRAP, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5693 { CKA_WRAP_TEMPLATE, &wrap_template, sizeof(wrap_template) },
5694 { CKA_UNWRAP_TEMPLATE, &unwrap_template,
5695 sizeof(unwrap_template) },
5696 };
5697 CK_ATTRIBUTE unwrap_template2[] = {
5698 { CKA_CLASS, &(CK_OBJECT_CLASS){ CKO_SECRET_KEY },
5699 sizeof(CK_OBJECT_CLASS) },
5700 { CKA_KEY_TYPE, &(CK_KEY_TYPE){ CKK_AES }, sizeof(CK_KEY_TYPE) },
5701 { CKA_TOKEN, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5702 { CKA_EXTRACTABLE, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
5703 { CKA_VALUE_LEN, &(CK_ULONG){ 16 }, sizeof(CK_ULONG) },
5704 };
5705 CK_ATTRIBUTE wrapping_key_temp_w_indirect2[] = {
5706 { CKA_VALUE_LEN, &(CK_ULONG){ 16 }, sizeof(CK_ULONG) },
5707 { CKA_WRAP, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5708 { CKA_UNWRAP, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5709 { CKA_UNWRAP_TEMPLATE, &unwrap_template2,
5710 sizeof(unwrap_template2) },
5711 };
5712 CK_ATTRIBUTE wrapping_key_template_inv1[] = {
5713 { CKA_VALUE_LEN, &(CK_ULONG){ 16 }, sizeof(CK_ULONG) },
5714 { CKA_WRAP, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
5715 };
5716 CK_ATTRIBUTE key_template[] = {
5717 { CKA_VALUE_LEN, &(CK_ULONG){ 16 }, sizeof(CK_ULONG) },
5718 { CKA_ENCRYPT, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5719 { CKA_DECRYPT, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5720 { CKA_EXTRACTABLE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5721 };
5722 CK_ATTRIBUTE key_template_sens[] = {
5723 { CKA_VALUE_LEN, &(CK_ULONG){ 16 }, sizeof(CK_ULONG) },
5724 { CKA_EXTRACTABLE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5725 { CKA_SENSITIVE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5726 };
5727 CK_ATTRIBUTE key_template_inv1[] = {
5728 { CKA_VALUE_LEN, &(CK_ULONG){ 16 }, sizeof(CK_ULONG) },
5729 { CKA_EXTRACTABLE, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
5730 };
5731 CK_ATTRIBUTE key_sz24_template[] = {
5732 { CKA_VALUE_LEN, &(CK_ULONG){ 24 }, sizeof(CK_ULONG) },
5733 { CKA_EXTRACTABLE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5734 };
5735 CK_ATTRIBUTE new_key_template[] = {
5736 { CKA_CLASS, &(CK_OBJECT_CLASS){ CKO_SECRET_KEY },
5737 sizeof(CK_OBJECT_CLASS) },
5738 { CKA_KEY_TYPE, &(CK_KEY_TYPE){ CKK_GENERIC_SECRET },
5739 sizeof(CK_KEY_TYPE) },
5740 { CKA_ENCRYPT, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5741 { CKA_DECRYPT, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5742 { CKA_EXTRACTABLE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5743 { CKA_SENSITIVE, &(CK_BBOOL){ CK_FALSE}, sizeof(CK_BBOOL) },
5744 };
5745 CK_ATTRIBUTE new_key_template_sens[] = {
5746 { CKA_CLASS, &(CK_OBJECT_CLASS){ CKO_SECRET_KEY },
5747 sizeof(CK_OBJECT_CLASS) },
5748 { CKA_KEY_TYPE, &(CK_KEY_TYPE){ CKK_AES }, sizeof(CK_KEY_TYPE) },
5749 { CKA_EXTRACTABLE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5750 { CKA_SENSITIVE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5751 };
5752 CK_ATTRIBUTE new_key_template2[] = {
5753 { CKA_DERIVE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5754 };
5755 CK_ATTRIBUTE new_key_template3[] = {
5756 { CKA_VALUE_LEN, &(CK_ULONG){ 16 }, sizeof(CK_ULONG) },
5757 { CKA_PRIVATE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5758 };
5759 CK_ATTRIBUTE new_key_template4[] = {
5760 { CKA_CLASS, &(CK_OBJECT_CLASS){ CKO_SECRET_KEY },
5761 sizeof(CK_OBJECT_CLASS) },
5762 { CKA_KEY_TYPE, &(CK_KEY_TYPE){ CKK_GENERIC_SECRET },
5763 sizeof(CK_KEY_TYPE) },
5764 { CKA_PRIVATE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
5765 };
5766 CK_BBOOL g_extract = CK_FALSE;
5767 CK_BBOOL g_sensitive = CK_TRUE;
5768 CK_BBOOL g_nextract = CK_TRUE;
5769 CK_BBOOL g_asensitive = CK_TRUE;
5770 CK_BBOOL g_local = CK_TRUE;
5771 CK_BBOOL g_token = CK_FALSE;
5772 CK_BBOOL g_derive = CK_FALSE;
5773 CK_OBJECT_CLASS g_class = CKO_VENDOR_DEFINED;
5774 CK_KEY_TYPE g_key_type = CKK_VENDOR_DEFINED;
5775 uint8_t g_val[WRAPPED_TEST_KEY_SIZE] = { 0 };
5776 CK_ULONG key_len = 0;
5777 uint8_t g_unwrapped_val[WRAPPED_TEST_KEY_SIZE] = { 0 };
5778 CK_ULONG unwrapped_key_len = 0;
5779 /* Keep last attribute as CKA_VALUE */
5780 CK_ATTRIBUTE get_template_unwrapped[] = {
5781 { CKA_CLASS, &g_class, sizeof(CK_OBJECT_CLASS) },
5782 { CKA_KEY_TYPE, &g_key_type, sizeof(CK_KEY_TYPE) },
5783 { CKA_EXTRACTABLE, &g_extract, sizeof(CK_BBOOL) },
5784 { CKA_SENSITIVE, &g_sensitive, sizeof(CK_BBOOL) },
5785 { CKA_NEVER_EXTRACTABLE, &g_nextract, sizeof(CK_BBOOL) },
5786 { CKA_ALWAYS_SENSITIVE, &g_asensitive, sizeof(CK_BBOOL) },
5787 { CKA_LOCAL, &g_local, sizeof(CK_BBOOL) },
5788 { CKA_TOKEN, &g_token, sizeof(CK_BBOOL) },
5789 { CKA_DERIVE, &g_derive, sizeof(CK_BBOOL) },
5790 { CKA_VALUE_LEN, &unwrapped_key_len,
5791 sizeof(unwrapped_key_len) },
5792 { CKA_VALUE, g_unwrapped_val, sizeof(g_unwrapped_val) },
5793 };
5794 CK_ATTRIBUTE get_template[] = {
5795 { CKA_VALUE_LEN, &key_len, sizeof(key_len) },
5796 { CKA_VALUE, g_val, sizeof(g_val) },
5797 };
5798 uint8_t buf[WRAPPED_TEST_KEY_SIZE] = { 0 };
5799 CK_ULONG size = 0;
5800
5801 rv = init_lib_and_find_token_slot(&slot);
5802 if (!ADBG_EXPECT_CK_OK(c, rv))
5803 return;
5804
5805 rv = init_test_token(slot);
5806 if (!ADBG_EXPECT_CK_OK(c, rv))
5807 goto close_lib;
5808
5809 rv = init_user_test_token(slot);
5810 if (!ADBG_EXPECT_CK_OK(c, rv))
5811 goto close_lib;
5812
5813 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
5814 if (!ADBG_EXPECT_CK_OK(c, rv))
5815 goto close_lib;
5816
5817 /* Wrapping Key - AES Key */
5818 rv = C_GenerateKey(session, &cktest_aes_keygen_mechanism,
5819 wrapping_key_template,
5820 ARRAY_SIZE(wrapping_key_template), &wrapping_key1);
5821 if (!ADBG_EXPECT_CK_OK(c, rv))
5822 goto close_session;
5823
5824 /* Key to be wrapped - AES key */
5825 rv = C_GenerateKey(session, &cktest_aes_keygen_mechanism,
5826 key_template, ARRAY_SIZE(key_template),
5827 &key);
5828 if (!ADBG_EXPECT_CK_OK(c, rv))
5829 goto close_session;
5830
5831 Do_ADBG_BeginSubCase(c, "Test key wrap with AES ECB");
5832
5833 /*
5834 * Test NULL buffer and NULL out_size to verify bad argument processing
5835 */
5836 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1, key,
5837 NULL, NULL);
5838 if (!ADBG_EXPECT_CK_RESULT(c, CKR_ARGUMENTS_BAD, rv))
5839 goto out;
5840
5841 /*
5842 * Test NULL buffer case with size as 0 to get the out_size
5843 */
5844 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1, key,
5845 NULL, &size);
5846 if (!ADBG_EXPECT_CK_OK(c, rv) ||
5847 !ADBG_EXPECT_COMPARE_UNSIGNED(c, size, <=, sizeof(buf)))
5848 goto out;
5849
5850 /*
5851 * Test NULL buffer case with size non zero size to get the out_size
5852 */
5853 size = 1;
5854 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1, key,
5855 NULL, &size);
5856 if (!ADBG_EXPECT_CK_OK(c, rv) ||
5857 !ADBG_EXPECT_COMPARE_UNSIGNED(c, size, <=, sizeof(buf)))
5858 goto out;
5859
5860 /* Test short buffer */
5861 size = 12;
5862 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1, key,
5863 buf, &size);
5864 if (!ADBG_EXPECT_CK_RESULT(c, CKR_BUFFER_TOO_SMALL, rv) ||
5865 !ADBG_EXPECT_COMPARE_UNSIGNED(c, size, <=, sizeof(buf)))
5866 goto out;
5867
5868 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1, key,
5869 buf, &size);
5870 if (!ADBG_EXPECT_CK_OK(c, rv))
5871 goto out;
5872
5873 /*
5874 * Get the size of the original key which was wrapped in key_len.
5875 * This will be compared to the length of the key after unwrapping.
5876 */
5877 rv = C_GetAttributeValue(session, key, get_template,
5878 ARRAY_SIZE(get_template));
5879 if (!ADBG_EXPECT_CK_OK(c, rv))
5880 goto out;
5881
5882 Do_ADBG_EndSubCase(c, NULL);
5883
5884 Do_ADBG_BeginSubCase(c, "Test key unwrap with AES ECB");
5885
5886 rv = C_UnwrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1, buf,
5887 size, new_key_template, ARRAY_SIZE(new_key_template),
5888 &unwrapped_key);
5889 if (!ADBG_EXPECT_CK_OK(c, rv))
5890 goto out;
5891
5892 /*
5893 * The key created after unwrapping should have CKA_LOCAL = FALSE,
5894 * CKA_ALWAYS_SENSITIVE and CKA_NEVER_EXTRACTABLE as FALSE.
5895 * Default value of CKA_EXTRACTABLE if not specified in the template
5896 * is TRUE. We have deliberately set CKA_SENSITIVE to false for
5897 * both original key and unwrapped_key. This is done to be able to
5898 * extract the value of keys and compare them. This is done mainly
5899 * for testing. In actual examples, we expect CKA_SENSITIVE of keys
5900 * to be wrapped to be TRUE.
5901 */
5902 rv = C_GetAttributeValue(session, unwrapped_key, get_template_unwrapped,
5903 ARRAY_SIZE(get_template_unwrapped));
5904 if (!ADBG_EXPECT_CK_OK(c, rv) ||
5905 !ADBG_EXPECT_BUFFER(c, g_unwrapped_val, unwrapped_key_len, g_val,
5906 key_len) ||
5907 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_SECRET_KEY) ||
5908 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_key_type, ==,
5909 CKK_GENERIC_SECRET) ||
5910 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_FALSE) ||
5911 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sensitive, ==, CK_FALSE) ||
5912 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_extract, ==, CK_TRUE) ||
5913 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_asensitive, ==, CK_FALSE) ||
5914 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_nextract, ==, CK_FALSE))
5915 goto out;
5916
5917 rv = C_DestroyObject(session, unwrapped_key);
5918 if (!ADBG_EXPECT_CK_OK(c, rv))
5919 goto out;
5920
5921 Do_ADBG_EndSubCase(c, NULL);
5922
5923 Do_ADBG_BeginSubCase(c, "Invalid UnWrap cases");
5924
5925 /* Failure when unwrapping as a private session key */
5926 rv = C_UnwrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1, buf,
5927 size, new_key_template4, ARRAY_SIZE(new_key_template4),
5928 &unwrapped_key);
5929 if (!ADBG_EXPECT_CK_RESULT(c, CKR_USER_NOT_LOGGED_IN, rv))
5930 goto out;
5931
5932 /* Provide incomplete template */
5933 rv = C_UnwrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1, buf,
5934 size, new_key_template2, ARRAY_SIZE(new_key_template2),
5935 &unwrapped_key);
5936
5937 /*
5938 * The error code can also be CKR_TEMPLATE_INCOMPLETE. The
5939 * current implementation returns CKR_TEMPLATE_INCONSISTENT
5940 */
5941 if (!ADBG_EXPECT_TRUE(c, rv == CKR_TEMPLATE_INCOMPLETE ||
5942 rv == CKR_TEMPLATE_INCONSISTENT))
5943 goto out;
5944
5945 /* Try unwrapping with a key without CKA_UNWRAP */
5946 rv = C_UnwrapKey(session, &cktest_aes_ecb_mechanism, key, buf, size,
5947 new_key_template, ARRAY_SIZE(new_key_template),
5948 &unwrapped_key);
5949 if (!ADBG_EXPECT_CK_RESULT(c, CKR_UNWRAPPING_KEY_TYPE_INCONSISTENT, rv))
5950 goto out;
5951
5952 Do_ADBG_EndSubCase(c, NULL);
5953
5954 Do_ADBG_BeginSubCase(c, "Invalid Wrap cases");
5955
5956 rv = C_GenerateKey(session, &cktest_aes_keygen_mechanism,
5957 wrapping_key_template_inv1,
5958 ARRAY_SIZE(wrapping_key_template_inv1),
5959 &wrapping_key_inv);
5960 if (!ADBG_EXPECT_CK_OK(c, rv))
5961 goto out;
5962
5963 /* Wrapping key used without CKA_WRAP set */
5964 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key_inv,
5965 key, buf, &size);
5966 if (!ADBG_EXPECT_CK_RESULT(c, CKR_WRAPPING_KEY_TYPE_INCONSISTENT, rv))
5967 goto out;
5968
5969 rv = C_DestroyObject(session, wrapping_key_inv);
5970 ADBG_EXPECT_CK_OK(c, rv);
5971
5972 /* Use invalid wrapping key handle */
5973 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key_inv,
5974 key, buf, &size);
5975 if (!ADBG_EXPECT_CK_RESULT(c, CKR_WRAPPING_KEY_HANDLE_INVALID, rv))
5976 goto out;
5977
5978 /* CKA_EXTRACTABLE attribute of the key to be wrapped is CKA_FALSE */
5979 rv = C_GenerateKey(session, &cktest_aes_keygen_mechanism,
5980 key_template_inv1, ARRAY_SIZE(key_template_inv1),
5981 &key_inv);
5982 if (!ADBG_EXPECT_CK_OK(c, rv))
5983 goto out;
5984
5985 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1,
5986 key_inv, buf, &size);
5987 if (!ADBG_EXPECT_CK_RESULT(c, CKR_KEY_UNEXTRACTABLE, rv))
5988 goto out;
5989
5990 rv = C_DestroyObject(session, key_inv);
5991 ADBG_EXPECT_CK_OK(c, rv);
5992
5993 /* Use invalid key handle */
5994 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1,
5995 key_inv, buf, &size);
5996 if (!ADBG_EXPECT_CK_RESULT(c, CKR_KEY_HANDLE_INVALID, rv))
5997 goto out;
5998
5999 /* Try wrapping the wrapping key */
6000 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1,
6001 wrapping_key1, buf, &size);
6002 if (!ADBG_EXPECT_CK_RESULT(c, CKR_WRAPPING_KEY_HANDLE_INVALID, rv))
6003 goto out;
6004
6005 /* Use invalid mechanism */
6006 rv = C_WrapKey(session, &cktest_hmac_md5_mechanism, wrapping_key1, key,
6007 buf, &size);
6008 if (!ADBG_EXPECT_CK_RESULT(c, CKR_MECHANISM_INVALID, rv))
6009 goto out;
6010
6011 /* Try wrapping when an operation is already active */
6012 rv = C_EncryptInit(session, &cktest_aes_cbc_mechanism, key);
6013 if (!ADBG_EXPECT_CK_OK(c, rv))
6014 goto out;
6015
6016 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1, key,
6017 buf, &size);
6018 if (!ADBG_EXPECT_CK_RESULT(c, CKR_OPERATION_ACTIVE, rv))
6019 goto out;
6020
6021 rv = C_EncryptFinal(session, NULL, NULL);
6022 /* Only check that the operation is no more active */
6023 if (!ADBG_EXPECT_TRUE(c, rv != CKR_BUFFER_TOO_SMALL))
6024 goto out;
6025
6026 /*
6027 * Try wrapping using CKK_GENERIC_SECRET when mechanism used is
6028 * AES_ECB. Generate a secret key object in rw session.
6029 */
6030 rv = C_GenerateKey(session, &cktest_gensecret_keygen_mechanism,
6031 cktest_generate_gensecret_object_valid1,
6032 ARRAY_SIZE(cktest_generate_gensecret_object_valid1),
6033 &key_inv);
6034 if (!ADBG_EXPECT_CK_OK(c, rv))
6035 goto out;
6036
6037 /* Make the Generic secret key wrapping/unwrapping key */
6038 rv = C_SetAttributeValue(session, key_inv, set_w_unw_template,
6039 ARRAY_SIZE(set_w_unw_template));
6040 if (!ADBG_EXPECT_CK_OK(c, rv))
6041 goto out;
6042
6043 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, key_inv, key, buf,
6044 &size);
6045 if (!ADBG_EXPECT_CK_RESULT(c, CKR_WRAPPING_KEY_TYPE_INCONSISTENT, rv))
6046 goto out;
6047
6048 rv = C_DestroyObject(session, key_inv);
6049 ADBG_EXPECT_CK_OK(c, rv);
6050
6051 Do_ADBG_EndSubCase(c, NULL);
6052
6053 Do_ADBG_BeginSubCase(c, "Wrap with different length key");
6054
6055 /* Generate Key of size 192 bits */
6056 rv = C_GenerateKey(session, &cktest_aes_keygen_mechanism,
6057 key_sz24_template, ARRAY_SIZE(key_sz24_template),
6058 &key_sz24);
6059 if (!ADBG_EXPECT_CK_OK(c, rv))
6060 goto out;
6061
6062 size = 0;
6063 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1,
6064 key_sz24, buf, &size);
6065 if (!ADBG_EXPECT_CK_RESULT(c, CKR_BUFFER_TOO_SMALL, rv) ||
6066 !ADBG_EXPECT_COMPARE_UNSIGNED(c, size, ==, 32))
6067 goto out;
6068
6069 size = 24;
6070 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1,
6071 key_sz24, buf, &size);
6072 if (!ADBG_EXPECT_CK_RESULT(c, CKR_BUFFER_TOO_SMALL, rv) ||
6073 !ADBG_EXPECT_COMPARE_UNSIGNED(c, size, ==, 32))
6074 goto out;
6075
6076 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1,
6077 key_sz24, buf, &size);
6078 if (!ADBG_EXPECT_CK_OK(c, rv) ||
6079 !ADBG_EXPECT_COMPARE_UNSIGNED(c, size, ==, 32))
6080 goto out;
6081
6082 Do_ADBG_EndSubCase(c, NULL);
6083
6084 Do_ADBG_BeginSubCase(c, "Test Wrap/Unwrap with indirect template");
6085
6086 /* Wrapping Key with indirect templates - AES Key */
6087 rv = C_GenerateKey(session, &cktest_aes_keygen_mechanism,
6088 wrapping_key_temp_w_indirect,
6089 ARRAY_SIZE(wrapping_key_temp_w_indirect),
6090 &wrapping_key2);
6091 if (!ADBG_EXPECT_CK_OK(c, rv))
6092 goto out;
6093
6094 /*
6095 * Attribute mismatch with CKA_WRAP_TEMPLATE.
6096 * Error expected when wrapping a key whose template doesn't match with
6097 * the CKA_WRAP_TEMPLATE in the wrapping_key. In this example, the
6098 * CKA_WRAP_TEMPLATE expects CKA_SENSITIVE of the key to be wrapped to
6099 * be TRUE which is not the case here.
6100 */
6101 size = sizeof(buf);
6102 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key2, key,
6103 buf, &size);
6104 if (!ADBG_EXPECT_CK_RESULT(c, CKR_KEY_HANDLE_INVALID, rv))
6105 goto out;
6106
6107 /* Generate SENSITIVE Key */
6108 rv = C_GenerateKey(session, &cktest_aes_keygen_mechanism,
6109 key_template_sens, ARRAY_SIZE(key_template_sens),
6110 &key_sens);
6111 if (!ADBG_EXPECT_CK_OK(c, rv))
6112 goto out;
6113
6114 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key2,
6115 key_sens, buf, &size);
6116 if (!ADBG_EXPECT_CK_OK(c, rv))
6117 goto out;
6118
6119 /*
6120 * Unwrap to create key with SENSITIVE set as FALSE.
6121 * This should fail as indirect attribute CKA_UNWRAP_TEMPLATE restricts
6122 * creation of key with CKA_SENSITIVE as FALSE.
6123 */
6124 rv = C_UnwrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key2, buf,
6125 size, new_key_template, ARRAY_SIZE(new_key_template),
6126 &unwrapped_key);
6127 if (!ADBG_EXPECT_CK_RESULT(c, CKR_TEMPLATE_INCONSISTENT, rv))
6128 goto out;
6129
6130 /* Unwrap a wrapped sensitive key to create a SENSITIVE key */
6131 rv = C_UnwrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key2, buf,
6132 size, new_key_template_sens,
6133 ARRAY_SIZE(new_key_template_sens), &unwrapped_key);
6134 if (!ADBG_EXPECT_CK_OK(c, rv))
6135 goto out;
6136
6137 /*
6138 * Get the attributes of created. Skip last attribute in
6139 * get_template_wrapped as that is CKA_VALUE which would give an
6140 * error for a sensitive key
6141 */
6142 rv = C_GetAttributeValue(session, unwrapped_key, get_template_unwrapped,
6143 ARRAY_SIZE(get_template_unwrapped) - 1);
6144 if (!ADBG_EXPECT_CK_OK(c, rv) ||
6145 !ADBG_EXPECT_COMPARE_UNSIGNED(c, unwrapped_key_len, ==, key_len) ||
6146 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_SECRET_KEY) ||
6147 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_key_type, ==, CKK_AES) ||
6148 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_FALSE) ||
6149 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sensitive, ==, CK_TRUE) ||
6150 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_extract, ==, CK_TRUE) ||
6151 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_asensitive, ==, CK_FALSE) ||
6152 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_nextract, ==, CK_FALSE))
6153 goto out;
6154
6155 if (!ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, unwrapped_key)) ||
6156 !ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, wrapping_key2)) ||
6157 !ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, key_sens)))
6158 goto out;
6159
6160 /* Create wrapping key with indirect template specifying class & key */
6161 rv = C_GenerateKey(session, &cktest_aes_keygen_mechanism,
6162 wrapping_key_temp_w_indirect2,
6163 ARRAY_SIZE(wrapping_key_temp_w_indirect2),
6164 &wrapping_key2);
6165 if (!ADBG_EXPECT_CK_OK(c, rv))
6166 goto out;
6167
6168 size = sizeof(buf);
6169 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key2, key,
6170 buf, &size);
6171 if (!ADBG_EXPECT_CK_OK(c, rv))
6172 goto out;
6173
6174 /* Use minimal new key template just specifying attribute of key */
6175 rv = C_UnwrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key2, buf,
6176 size, new_key_template2, ARRAY_SIZE(new_key_template2),
6177 &unwrapped_key);
6178 if (!ADBG_EXPECT_CK_OK(c, rv))
6179 goto out;
6180
6181 rv = C_GetAttributeValue(session, unwrapped_key, get_template_unwrapped,
6182 ARRAY_SIZE(get_template_unwrapped) - 1);
6183
6184 /* Destroy created token object */
6185 if (!ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, unwrapped_key)))
6186 goto out;
6187
6188 if (!ADBG_EXPECT_CK_OK(c, rv) ||
6189 !ADBG_EXPECT_COMPARE_UNSIGNED(c, unwrapped_key_len, ==, key_len) ||
6190 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_SECRET_KEY) ||
6191 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_key_type, ==, CKK_AES) ||
6192 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_FALSE) ||
6193 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_token, ==, CK_TRUE) ||
6194 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_derive, ==, CK_TRUE) ||
6195 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sensitive, ==, CK_FALSE) ||
6196 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_extract, ==, CK_FALSE) ||
6197 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_asensitive, ==, CK_FALSE) ||
6198 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_nextract, ==, CK_FALSE))
6199 goto out;
6200
6201 /*
6202 * Unwrap with NULL template when CKA_UNWRAP_TEMPLATE has all
6203 * attributes to generate a key
6204 */
6205 rv = C_UnwrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key2, buf,
6206 size, NULL, 0, &unwrapped_key);
6207 if (!ADBG_EXPECT_CK_OK(c, rv))
6208 goto out;
6209
6210 rv = C_GetAttributeValue(session, unwrapped_key, get_template_unwrapped,
6211 ARRAY_SIZE(get_template_unwrapped) - 1);
6212
6213 /* Destroy created token object */
6214 if (!ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, unwrapped_key)))
6215 goto out;
6216
6217 if (!ADBG_EXPECT_CK_OK(c, rv) ||
6218 !ADBG_EXPECT_COMPARE_UNSIGNED(c, unwrapped_key_len, ==, key_len) ||
6219 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_SECRET_KEY) ||
6220 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_key_type, ==, CKK_AES) ||
6221 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_FALSE) ||
6222 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_token, ==, CK_TRUE) ||
6223 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_derive, ==, CK_FALSE) ||
6224 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sensitive, ==, CK_FALSE) ||
6225 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_extract, ==, CK_FALSE) ||
6226 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_asensitive, ==, CK_FALSE) ||
6227 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_nextract, ==, CK_FALSE)) {
6228 goto out;
6229 }
6230
6231 /* Unwrap and try create a Private token object */
6232 rv = C_UnwrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key2, buf,
6233 size, new_key_template3, ARRAY_SIZE(new_key_template3),
6234 &unwrapped_key);
6235 if (!ADBG_EXPECT_CK_RESULT(c, CKR_USER_NOT_LOGGED_IN, rv))
6236 goto out;
6237
6238 Do_ADBG_EndSubCase(c, NULL);
6239
6240 Do_ADBG_BeginSubCase(c, "Test usage of CKA_WRAP_WITH_TRUSTED");
6241
6242 /* Set Attribute WRAP_WITH_TRUSTED on the key */
6243 rv = C_SetAttributeValue(session, key, set_wwt_template,
6244 ARRAY_SIZE(set_wwt_template));
6245 if (!ADBG_EXPECT_CK_OK(c, rv))
6246 goto out;
6247
6248 /*
6249 * Try wrapping the key with attribute CKA_WRAP_WITH_TRUSTED with
6250 * normal wrapping key
6251 */
6252 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1, key,
6253 buf, &size);
6254 if (!ADBG_EXPECT_CK_RESULT(c, CKR_KEY_NOT_WRAPPABLE, rv))
6255 goto out;
6256
6257 /* Login as SO in RW session */
6258 rv = C_Login(session, CKU_SO, test_token_so_pin,
6259 sizeof(test_token_so_pin));
6260 if (!ADBG_EXPECT_CK_OK(c, rv))
6261 goto out;
6262
6263 rv = C_SetAttributeValue(session, wrapping_key1, set_trusted_template,
6264 ARRAY_SIZE(set_trusted_template));
6265 if (!ADBG_EXPECT_CK_OK(c, rv) ||
6266 !ADBG_EXPECT_CK_OK(c, C_Logout(session)))
6267 goto out;
6268
6269 rv = C_WrapKey(session, &cktest_aes_ecb_mechanism, wrapping_key1, key,
6270 buf, &size);
6271 if (!ADBG_EXPECT_CK_OK(c, rv))
6272 goto out;
6273
6274out:
6275 Do_ADBG_EndSubCase(c, NULL);
6276close_session:
6277 ADBG_EXPECT_CK_OK(c, C_CloseSession(session));
6278
6279close_lib:
6280 ADBG_EXPECT_CK_OK(c, close_lib());
6281}
6282ADBG_CASE_DEFINE(pkcs11, 1020, xtest_pkcs11_test_1020,
6283 "PKCS11: AES Key Wrap/UnWrap tests");
Vesa Jääskeläinen7b482a02021-05-02 13:52:07 +03006284
6285#define RSA_SIGN_TEST(_test_name, _mecha, _data) \
6286 { \
6287 .test_name = _test_name, \
6288 .mecha = _mecha, \
6289 .data = _data, \
6290 .data_size = sizeof(_data) - 1, \
6291 }
6292
6293/* List of RSA PKCS signing multi stage digest mechanisms */
6294static struct {
6295 const char *test_name;
6296 CK_MECHANISM_TYPE mecha;
6297 const void *data;
6298 CK_ULONG data_size;
6299} rsa_pkcs_sign_tests[] = {
6300 RSA_SIGN_TEST("CKM_MD5_RSA_PKCS", CKM_MD5_RSA_PKCS,
6301 digest_test_pattern),
6302 RSA_SIGN_TEST("CKM_SHA1_RSA_PKCS", CKM_SHA1_RSA_PKCS,
6303 digest_test_pattern),
6304 RSA_SIGN_TEST("CKM_SHA224_RSA_PKCS", CKM_SHA224_RSA_PKCS,
6305 digest_test_pattern),
6306 RSA_SIGN_TEST("CKM_SHA256_RSA_PKCS", CKM_SHA256_RSA_PKCS,
6307 digest_test_pattern),
6308 RSA_SIGN_TEST("CKM_SHA384_RSA_PKCS", CKM_SHA384_RSA_PKCS,
6309 digest_test_pattern),
6310 RSA_SIGN_TEST("CKM_SHA512_RSA_PKCS", CKM_SHA512_RSA_PKCS,
6311 digest_test_pattern),
6312};
6313
6314static int test_rsa_pkcs_operations(ADBG_Case_t *c,
6315 CK_SESSION_HANDLE session,
6316 const char *rsa_name, uint32_t rsa_bits)
6317{
6318 CK_RV rv = CKR_GENERAL_ERROR;
6319
6320 CK_OBJECT_HANDLE public_key = CK_INVALID_HANDLE;
6321 CK_OBJECT_HANDLE private_key = CK_INVALID_HANDLE;
6322
6323 CK_MECHANISM mechanism = {
6324 CKM_RSA_PKCS_KEY_PAIR_GEN, NULL, 0
6325 };
6326 CK_MECHANISM sign_mechanism = {
6327 CKM_RSA_PKCS, NULL, 0
6328 };
6329 CK_ULONG modulus_bits = 0;
6330 CK_BYTE public_exponent[] = { 1, 0, 1 };
6331 CK_BYTE id[] = { 123 };
6332
6333 CK_ATTRIBUTE public_key_template[] = {
6334 { CKA_ENCRYPT, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
6335 { CKA_VERIFY, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
6336 { CKA_WRAP, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
6337 { CKA_MODULUS_BITS, &modulus_bits, sizeof(CK_ULONG) },
6338 { CKA_PUBLIC_EXPONENT, public_exponent,
6339 sizeof(public_exponent) }
6340 };
6341
6342 CK_ATTRIBUTE private_key_template[] = {
6343 { CKA_TOKEN, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
6344 { CKA_PRIVATE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
6345 { CKA_SUBJECT, subject_common_name,
6346 sizeof(subject_common_name) },
6347 { CKA_ID, id, sizeof(id) },
6348 { CKA_SENSITIVE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
6349 { CKA_DECRYPT, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
6350 { CKA_SIGN, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
6351 { CKA_UNWRAP, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) }
6352 };
6353
6354 CK_OBJECT_CLASS g_class = 0;
6355 CK_KEY_TYPE g_key_type = 0;
6356 CK_BYTE g_id[32] = { 0 };
6357 CK_DATE g_start_date = { 0 };
6358 CK_DATE g_end_date = { 0 };
6359 CK_BBOOL g_derive = CK_FALSE;
6360 CK_BBOOL g_local = CK_FALSE;
6361 CK_MECHANISM_TYPE g_keygen_mecha = 0;
6362 CK_BYTE g_subject[64] = { 0 };
6363 CK_BBOOL g_encrypt = CK_FALSE;
6364 CK_BBOOL g_verify = CK_FALSE;
6365 CK_BBOOL g_verify_recover = CK_FALSE;
6366 CK_BBOOL g_wrap = CK_FALSE;
6367 CK_BBOOL g_trusted = CK_FALSE;
6368 CK_BYTE g_public_key_info[1024] = { 0 };
6369 CK_BBOOL g_sensitive = CK_FALSE;
6370 CK_BBOOL g_decrypt = CK_FALSE;
6371 CK_BBOOL g_sign = CK_FALSE;
6372 CK_BBOOL g_sign_recover = CK_FALSE;
6373 CK_BBOOL g_unwrap = CK_FALSE;
6374 CK_BBOOL g_extract = CK_FALSE;
6375 CK_BBOOL g_asensitive = CK_FALSE;
6376 CK_BBOOL g_nextract = CK_FALSE;
6377 CK_BBOOL g_wrap_with_trusted = CK_FALSE;
6378 CK_BBOOL g_always_authenticate = CK_FALSE;
6379
6380 /* Note: Tests below expects specific order of elements */
6381 CK_ATTRIBUTE get_public_template[] = {
6382 { CKA_CLASS, &g_class, sizeof(CK_OBJECT_CLASS) },
6383 { CKA_KEY_TYPE, &g_key_type, sizeof(CK_KEY_TYPE) },
6384 { CKA_ID, g_id, sizeof(g_id) },
6385 { CKA_START_DATE, &g_start_date, sizeof(CK_DATE) },
6386 { CKA_END_DATE, &g_end_date, sizeof(CK_DATE) },
6387 { CKA_DERIVE, &g_derive, sizeof(CK_BBOOL) },
6388 { CKA_LOCAL, &g_local, sizeof(CK_BBOOL) },
6389 { CKA_KEY_GEN_MECHANISM, &g_keygen_mecha, sizeof(CK_MECHANISM_TYPE) },
6390 { CKA_SUBJECT, g_subject, sizeof(g_subject) },
6391 { CKA_ENCRYPT, &g_encrypt, sizeof(CK_BBOOL) },
6392 { CKA_VERIFY, &g_verify, sizeof(CK_BBOOL) },
6393 { CKA_VERIFY_RECOVER, &g_verify_recover, sizeof(CK_BBOOL) },
6394 { CKA_WRAP, &g_wrap, sizeof(CK_BBOOL) },
6395 { CKA_TRUSTED, &g_trusted, sizeof(CK_BBOOL) },
6396 { CKA_PUBLIC_KEY_INFO, g_public_key_info, sizeof(g_public_key_info) },
6397 };
6398
6399 /* Note: Tests below expects specific order of elements */
6400 CK_ATTRIBUTE get_private_template[] = {
6401 { CKA_CLASS, &g_class, sizeof(CK_OBJECT_CLASS) },
6402 { CKA_KEY_TYPE, &g_key_type, sizeof(CK_KEY_TYPE) },
6403 { CKA_ID, g_id, sizeof(g_id) },
6404 { CKA_START_DATE, &g_start_date, sizeof(CK_DATE) },
6405 { CKA_END_DATE, &g_end_date, sizeof(CK_DATE) },
6406 { CKA_DERIVE, &g_derive, sizeof(CK_BBOOL) },
6407 { CKA_LOCAL, &g_local, sizeof(CK_BBOOL) },
6408 { CKA_KEY_GEN_MECHANISM, &g_keygen_mecha, sizeof(CK_MECHANISM_TYPE) },
6409 { CKA_SUBJECT, g_subject, sizeof(g_subject) },
6410 { CKA_SENSITIVE, &g_sensitive, sizeof(CK_BBOOL) },
6411 { CKA_DECRYPT, &g_decrypt, sizeof(CK_BBOOL) },
6412 { CKA_SIGN, &g_sign, sizeof(CK_BBOOL) },
6413 { CKA_SIGN_RECOVER, &g_sign_recover, sizeof(CK_BBOOL) },
6414 { CKA_UNWRAP, &g_unwrap, sizeof(CK_BBOOL) },
6415 { CKA_EXTRACTABLE, &g_extract, sizeof(CK_BBOOL) },
6416 { CKA_ALWAYS_SENSITIVE, &g_asensitive, sizeof(CK_BBOOL) },
6417 { CKA_NEVER_EXTRACTABLE, &g_nextract, sizeof(CK_BBOOL) },
6418 { CKA_WRAP_WITH_TRUSTED, &g_wrap_with_trusted, sizeof(CK_BBOOL) },
6419 { CKA_ALWAYS_AUTHENTICATE, &g_always_authenticate, sizeof(CK_BBOOL) },
6420 { CKA_PUBLIC_KEY_INFO, g_public_key_info, sizeof(g_public_key_info) },
6421 };
6422
6423 uint8_t signature[512] = { 0 };
6424 CK_ULONG signature_len = 0;
6425
6426 size_t i = 0;
6427
6428 Do_ADBG_BeginSubCase(c, "%s: Generate key pair", rsa_name);
6429
6430 modulus_bits = rsa_bits;
6431
6432 rv = C_GenerateKeyPair(session, &mechanism, public_key_template,
6433 ARRAY_SIZE(public_key_template),
6434 private_key_template,
6435 ARRAY_SIZE(private_key_template),
6436 &public_key, &private_key);
6437 if (!ADBG_EXPECT_CK_OK(c, rv))
6438 goto err;
6439
6440 /* reset get public key template */
6441 memset(g_id, 0, sizeof(g_id));
6442 assert(get_public_template[2].type == CKA_ID);
6443 get_public_template[2].ulValueLen = sizeof(g_id);
6444
6445 memset(g_subject, 0, sizeof(g_subject));
6446 assert(get_public_template[8].type == CKA_SUBJECT);
6447 get_public_template[8].ulValueLen = sizeof(g_subject);
6448
6449 memset(g_public_key_info, 0, sizeof(g_public_key_info));
6450 assert(get_public_template[14].type == CKA_PUBLIC_KEY_INFO);
6451 get_public_template[14].ulValueLen = sizeof(g_public_key_info);
6452
6453 rv = C_GetAttributeValue(session, public_key, get_public_template,
6454 ARRAY_SIZE(get_public_template));
6455 if (!ADBG_EXPECT_CK_OK(c, rv) ||
6456 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_PUBLIC_KEY) ||
6457 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_key_type, ==, CKK_RSA) ||
6458 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_derive, ==, CK_FALSE) ||
6459 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_TRUE) ||
6460 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_keygen_mecha, ==,
6461 CKM_RSA_PKCS_KEY_PAIR_GEN) ||
6462 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_encrypt, ==, CK_FALSE) ||
6463 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_verify, ==, CK_TRUE) ||
6464 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_verify_recover, ==, CK_FALSE) ||
6465 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_wrap, ==, CK_FALSE) ||
6466 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_trusted, ==, CK_FALSE))
6467 goto err_destr_obj;
6468
6469 /* reset get private key template */
6470 memset(g_id, 0, sizeof(g_id));
6471 assert(get_private_template[2].type == CKA_ID);
6472 get_private_template[2].ulValueLen = sizeof(g_id);
6473
6474 memset(g_subject, 0, sizeof(g_subject));
6475 assert(get_private_template[8].type == CKA_SUBJECT);
6476 get_private_template[8].ulValueLen = sizeof(g_subject);
6477
6478 memset(g_public_key_info, 0, sizeof(g_public_key_info));
6479 assert(get_private_template[19].type == CKA_PUBLIC_KEY_INFO);
6480 get_private_template[19].ulValueLen = sizeof(g_public_key_info);
6481
6482 rv = C_GetAttributeValue(session, private_key, get_private_template,
6483 ARRAY_SIZE(get_private_template));
6484 if (!ADBG_EXPECT_CK_OK(c, rv) ||
6485 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_PRIVATE_KEY) ||
6486 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_key_type, ==, CKK_RSA) ||
6487 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_derive, ==, CK_FALSE) ||
6488 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_TRUE) ||
6489 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_keygen_mecha, ==,
6490 CKM_RSA_PKCS_KEY_PAIR_GEN) ||
6491 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sensitive, ==, CK_TRUE) ||
6492 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_decrypt, ==, CK_FALSE) ||
6493 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sign, ==, CK_TRUE) ||
6494 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sign_recover, ==, CK_FALSE) ||
6495 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_unwrap, ==, CK_FALSE) ||
6496 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_extract, ==, CK_FALSE) ||
6497 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_asensitive, ==, CK_TRUE) ||
6498 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_nextract, ==, CK_TRUE) ||
6499 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_wrap_with_trusted, ==, CK_FALSE) ||
6500 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_always_authenticate, ==, CK_FALSE))
6501 goto err_destr_obj;
6502
6503 Do_ADBG_EndSubCase(c, NULL);
6504
6505 Do_ADBG_BeginSubCase(c,
6506 "%s: Sign & verify tests - oneshot - CKM_RSA_PKCS",
6507 rsa_name);
6508
6509 sign_mechanism.mechanism = CKM_RSA_PKCS;
6510 memset(signature, 0, sizeof(signature));
6511 signature_len = sizeof(signature);
6512
6513 rv = C_SignInit(session, &sign_mechanism, private_key);
6514 if (!ADBG_EXPECT_CK_OK(c, rv))
6515 goto err_destr_obj;
6516
6517 rv = C_Sign(session, (void *)digest_test_pattern_sha256,
6518 sizeof(digest_test_pattern_sha256), (void *)signature,
6519 &signature_len);
6520 if (!ADBG_EXPECT_CK_OK(c, rv))
6521 goto err_destr_obj;
6522
6523 rv = C_VerifyInit(session, &sign_mechanism, public_key);
6524 if (!ADBG_EXPECT_CK_OK(c, rv))
6525 goto err_destr_obj;
6526
6527 rv = C_Verify(session, (void *)digest_test_pattern_sha256,
6528 sizeof(digest_test_pattern_sha256), (void *)signature,
6529 signature_len);
6530 if (!ADBG_EXPECT_CK_OK(c, rv))
6531 goto err_destr_obj;
6532
6533 for (i = 0; i < ARRAY_SIZE(rsa_pkcs_sign_tests); i++) {
6534 /*
6535 * Note: this order of end/begin here is just to get ADBG
6536 * SubCases in sync with error handling.
6537 */
6538 Do_ADBG_EndSubCase(c, NULL);
6539
6540 Do_ADBG_BeginSubCase(c, "%s: Sign & verify - oneshot - %s",
6541 rsa_name,
6542 rsa_pkcs_sign_tests[i].test_name);
6543
6544 sign_mechanism.mechanism = rsa_pkcs_sign_tests[i].mecha;
6545 memset(signature, 0, sizeof(signature));
6546 signature_len = sizeof(signature);
6547
6548 rv = C_SignInit(session, &sign_mechanism, private_key);
6549 if (!ADBG_EXPECT_CK_OK(c, rv))
6550 goto err_destr_obj;
6551
6552 rv = C_Sign(session, (void *)rsa_pkcs_sign_tests[i].data,
6553 rsa_pkcs_sign_tests[i].data_size,
6554 (void *)signature, &signature_len);
6555 if (!ADBG_EXPECT_CK_OK(c, rv))
6556 goto err_destr_obj;
6557
6558 rv = C_VerifyInit(session, &sign_mechanism, public_key);
6559 if (!ADBG_EXPECT_CK_OK(c, rv))
6560 goto err_destr_obj;
6561
6562 rv = C_Verify(session, (void *)rsa_pkcs_sign_tests[i].data,
6563 rsa_pkcs_sign_tests[i].data_size,
6564 (void *)signature, signature_len);
6565 if (!ADBG_EXPECT_CK_OK(c, rv))
6566 goto err_destr_obj;
6567 }
6568
6569 rv = C_DestroyObject(session, private_key);
6570 if (!ADBG_EXPECT_CK_OK(c, rv))
6571 goto err_destr_pub_obj;
6572
6573 rv = C_DestroyObject(session, public_key);
6574 if (!ADBG_EXPECT_CK_OK(c, rv))
6575 goto err;
6576
6577 Do_ADBG_EndSubCase(c, NULL);
6578
6579 return 1;
6580
6581err_destr_obj:
6582 ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, private_key));
6583err_destr_pub_obj:
6584 ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, public_key));
6585err:
6586 Do_ADBG_EndSubCase(c, NULL);
6587
6588 return 0;
6589}
6590
6591static void xtest_pkcs11_test_1021(ADBG_Case_t *c)
6592{
6593 CK_RV rv = CKR_GENERAL_ERROR;
6594 CK_SLOT_ID slot = 0;
6595 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
6596 CK_FLAGS session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
6597 int ret = 0;
6598
6599 rv = init_lib_and_find_token_slot(&slot);
6600 if (!ADBG_EXPECT_CK_OK(c, rv))
6601 return;
6602
6603 rv = init_test_token(slot);
6604 if (!ADBG_EXPECT_CK_OK(c, rv))
6605 goto close_lib;
6606
6607 rv = init_user_test_token(slot);
6608 if (!ADBG_EXPECT_CK_OK(c, rv))
6609 goto close_lib;
6610
6611 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
6612 if (!ADBG_EXPECT_CK_OK(c, rv))
6613 goto close_lib;
6614
6615 /* Login to Test Token */
6616 rv = C_Login(session, CKU_USER, test_token_user_pin,
6617 sizeof(test_token_user_pin));
6618 if (!ADBG_EXPECT_CK_OK(c, rv))
6619 goto out;
6620
6621 ret = test_rsa_pkcs_operations(c, session, "RSA-1024", 1024);
6622 if (!ret)
6623 goto out;
6624 ret = test_rsa_pkcs_operations(c, session, "RSA-2048", 2048);
6625 if (!ret)
6626 goto out;
6627 if (level > 0) {
6628 ret = test_rsa_pkcs_operations(c, session, "RSA-3072", 3072);
6629 if (!ret)
6630 goto out;
6631 ret = test_rsa_pkcs_operations(c, session, "RSA-4096", 4096);
6632 if (!ret)
6633 goto out;
6634 }
6635out:
6636 ADBG_EXPECT_CK_OK(c, C_CloseSession(session));
6637close_lib:
6638 ADBG_EXPECT_CK_OK(c, close_lib());
6639}
6640ADBG_CASE_DEFINE(pkcs11, 1021, xtest_pkcs11_test_1021,
6641 "PKCS11: RSA PKCS key generation and signing");
Vesa Jääskeläinen7f8456b2021-05-02 15:33:17 +03006642
6643#define RSA_PSS_HASH_SIGN_TEST(_test_name, _min_rsa_bits, _mecha, _hash_algo, _mgf_algo, \
6644 _salt_len, _data) \
6645 { \
6646 .test_name = _test_name, \
6647 .min_rsa_bits = _min_rsa_bits, \
6648 .mecha = _mecha, \
6649 .hash_algo = _hash_algo, \
6650 .mgf_algo = _mgf_algo, \
6651 .salt_len = _salt_len, \
6652 .data = _data, \
6653 .data_size = sizeof(_data), \
6654 }
6655
6656#define RSA_PSS_CSTR_SIGN_TEST(_test_name, _min_rsa_bits, _mecha, _hash_algo, \
6657 _mgf_algo, _salt_len, _data) \
6658 { \
6659 .test_name = _test_name, \
6660 .min_rsa_bits = _min_rsa_bits, \
6661 .mecha = _mecha, \
6662 .hash_algo = _hash_algo, \
6663 .mgf_algo = _mgf_algo, \
6664 .salt_len = _salt_len, \
6665 .data = _data, \
6666 .data_size = sizeof(_data) - 1, \
6667 }
6668
6669/* List of RSA PSS signing multi stage digest mechanisms */
6670static struct {
6671 const char *test_name;
6672 uint32_t min_rsa_bits;
6673 CK_MECHANISM_TYPE mecha;
6674 CK_MECHANISM_TYPE hash_algo;
6675 CK_RSA_PKCS_MGF_TYPE mgf_algo;
6676 CK_ULONG salt_len;
6677 const void *data;
6678 CK_ULONG data_size;
6679} rsa_pss_sign_tests[] = {
6680 RSA_PSS_HASH_SIGN_TEST("RSA-PSS/SHA1", 1024, CKM_RSA_PKCS_PSS,
6681 CKM_SHA_1, CKG_MGF1_SHA1, 20,
6682 digest_test_pattern_sha1),
6683 RSA_PSS_CSTR_SIGN_TEST("RSA-PSS/SHA1/mech", 1024,
6684 CKM_SHA1_RSA_PKCS_PSS, CKM_SHA_1, CKG_MGF1_SHA1,
6685 20, digest_test_pattern),
6686 RSA_PSS_HASH_SIGN_TEST("RSA-PSS/SHA224", 1024, CKM_RSA_PKCS_PSS,
6687 CKM_SHA224, CKG_MGF1_SHA224, 28,
6688 digest_test_pattern_sha224),
6689 RSA_PSS_CSTR_SIGN_TEST("RSA-PSS/SHA224/mech", 1024,
6690 CKM_SHA224_RSA_PKCS_PSS, CKM_SHA224,
6691 CKG_MGF1_SHA224, 28, digest_test_pattern),
6692 RSA_PSS_HASH_SIGN_TEST("RSA-PSS/SHA256", 1024, CKM_RSA_PKCS_PSS,
6693 CKM_SHA256, CKG_MGF1_SHA256, 32,
6694 digest_test_pattern_sha256),
6695 RSA_PSS_CSTR_SIGN_TEST("RSA-PSS/SHA256/mech", 1024,
6696 CKM_SHA256_RSA_PKCS_PSS, CKM_SHA256,
6697 CKG_MGF1_SHA256, 32, digest_test_pattern),
6698 RSA_PSS_HASH_SIGN_TEST("RSA-PSS/SHA384", 1024, CKM_RSA_PKCS_PSS,
6699 CKM_SHA384, CKG_MGF1_SHA384, 48,
6700 digest_test_pattern_sha384),
6701 RSA_PSS_CSTR_SIGN_TEST("RSA-PSS/SHA384/mech", 1024,
6702 CKM_SHA384_RSA_PKCS_PSS, CKM_SHA384,
6703 CKG_MGF1_SHA384, 48, digest_test_pattern),
6704 RSA_PSS_HASH_SIGN_TEST("RSA-PSS/SHA512", 2048, CKM_RSA_PKCS_PSS,
6705 CKM_SHA512, CKG_MGF1_SHA512, 64,
6706 digest_test_pattern_sha512),
6707 RSA_PSS_CSTR_SIGN_TEST("RSA-PSS/SHA512/mech", 2048,
6708 CKM_SHA512_RSA_PKCS_PSS, CKM_SHA512,
6709 CKG_MGF1_SHA512, 64, digest_test_pattern),
6710};
6711
6712static int test_rsa_pss_operations(ADBG_Case_t *c,
6713 CK_SESSION_HANDLE session,
6714 const char *rsa_name, uint32_t rsa_bits)
6715{
6716 CK_RV rv = CKR_GENERAL_ERROR;
6717
6718 CK_OBJECT_HANDLE public_key = CK_INVALID_HANDLE;
6719 CK_OBJECT_HANDLE private_key = CK_INVALID_HANDLE;
6720
6721 CK_MECHANISM mechanism = {
6722 CKM_RSA_PKCS_KEY_PAIR_GEN, NULL, 0
6723 };
6724 CK_MECHANISM sign_mechanism = {
6725 CKM_RSA_PKCS_PSS, NULL, 0
6726 };
6727 CK_RSA_PKCS_PSS_PARAMS pss_params = {
6728 CKM_SHA256, CKG_MGF1_SHA256, 32,
6729 };
6730 CK_ULONG modulus_bits = 0;
6731 CK_BYTE public_exponent[] = { 1, 0, 1 };
6732 CK_BYTE id[] = { 123 };
6733
6734 CK_ATTRIBUTE public_key_template[] = {
6735 { CKA_ENCRYPT, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
6736 { CKA_VERIFY, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
6737 { CKA_WRAP, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
6738 { CKA_MODULUS_BITS, &modulus_bits, sizeof(CK_ULONG) },
6739 { CKA_PUBLIC_EXPONENT, public_exponent,
6740 sizeof(public_exponent) }
6741 };
6742
6743 CK_ATTRIBUTE private_key_template[] = {
6744 { CKA_TOKEN, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
6745 { CKA_PRIVATE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
6746 { CKA_SUBJECT, subject_common_name,
6747 sizeof(subject_common_name) },
6748 { CKA_ID, id, sizeof(id) },
6749 { CKA_SENSITIVE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
6750 { CKA_DECRYPT, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
6751 { CKA_SIGN, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
6752 { CKA_UNWRAP, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) }
6753 };
6754
6755 CK_OBJECT_CLASS g_class = 0;
6756 CK_KEY_TYPE g_key_type = 0;
6757 CK_BYTE g_id[32] = { 0 };
6758 CK_DATE g_start_date = { 0 };
6759 CK_DATE g_end_date = { 0 };
6760 CK_BBOOL g_derive = CK_FALSE;
6761 CK_BBOOL g_local = CK_FALSE;
6762 CK_MECHANISM_TYPE g_keygen_mecha = 0;
6763 CK_BYTE g_subject[64] = { 0 };
6764 CK_BBOOL g_encrypt = CK_FALSE;
6765 CK_BBOOL g_verify = CK_FALSE;
6766 CK_BBOOL g_verify_recover = CK_FALSE;
6767 CK_BBOOL g_wrap = CK_FALSE;
6768 CK_BBOOL g_trusted = CK_FALSE;
6769 CK_BYTE g_public_key_info[1024] = { 0 };
6770 CK_BBOOL g_sensitive = CK_FALSE;
6771 CK_BBOOL g_decrypt = CK_FALSE;
6772 CK_BBOOL g_sign = CK_FALSE;
6773 CK_BBOOL g_sign_recover = CK_FALSE;
6774 CK_BBOOL g_unwrap = CK_FALSE;
6775 CK_BBOOL g_extract = CK_FALSE;
6776 CK_BBOOL g_asensitive = CK_FALSE;
6777 CK_BBOOL g_nextract = CK_FALSE;
6778 CK_BBOOL g_wrap_with_trusted = CK_FALSE;
6779 CK_BBOOL g_always_authenticate = CK_FALSE;
6780
6781 /* Note: Tests below expects specific order of elements */
6782 CK_ATTRIBUTE get_public_template[] = {
6783 { CKA_CLASS, &g_class, sizeof(CK_OBJECT_CLASS) },
6784 { CKA_KEY_TYPE, &g_key_type, sizeof(CK_KEY_TYPE) },
6785 { CKA_ID, g_id, sizeof(g_id) },
6786 { CKA_START_DATE, &g_start_date, sizeof(CK_DATE) },
6787 { CKA_END_DATE, &g_end_date, sizeof(CK_DATE) },
6788 { CKA_DERIVE, &g_derive, sizeof(CK_BBOOL) },
6789 { CKA_LOCAL, &g_local, sizeof(CK_BBOOL) },
6790 { CKA_KEY_GEN_MECHANISM, &g_keygen_mecha, sizeof(CK_MECHANISM_TYPE) },
6791 { CKA_SUBJECT, g_subject, sizeof(g_subject) },
6792 { CKA_ENCRYPT, &g_encrypt, sizeof(CK_BBOOL) },
6793 { CKA_VERIFY, &g_verify, sizeof(CK_BBOOL) },
6794 { CKA_VERIFY_RECOVER, &g_verify_recover, sizeof(CK_BBOOL) },
6795 { CKA_WRAP, &g_wrap, sizeof(CK_BBOOL) },
6796 { CKA_TRUSTED, &g_trusted, sizeof(CK_BBOOL) },
6797 { CKA_PUBLIC_KEY_INFO, g_public_key_info, sizeof(g_public_key_info) },
6798 };
6799
6800 /* Note: Tests below expects specific order of elements */
6801 CK_ATTRIBUTE get_private_template[] = {
6802 { CKA_CLASS, &g_class, sizeof(CK_OBJECT_CLASS) },
6803 { CKA_KEY_TYPE, &g_key_type, sizeof(CK_KEY_TYPE) },
6804 { CKA_ID, g_id, sizeof(g_id) },
6805 { CKA_START_DATE, &g_start_date, sizeof(CK_DATE) },
6806 { CKA_END_DATE, &g_end_date, sizeof(CK_DATE) },
6807 { CKA_DERIVE, &g_derive, sizeof(CK_BBOOL) },
6808 { CKA_LOCAL, &g_local, sizeof(CK_BBOOL) },
6809 { CKA_KEY_GEN_MECHANISM, &g_keygen_mecha, sizeof(CK_MECHANISM_TYPE) },
6810 { CKA_SUBJECT, g_subject, sizeof(g_subject) },
6811 { CKA_SENSITIVE, &g_sensitive, sizeof(CK_BBOOL) },
6812 { CKA_DECRYPT, &g_decrypt, sizeof(CK_BBOOL) },
6813 { CKA_SIGN, &g_sign, sizeof(CK_BBOOL) },
6814 { CKA_SIGN_RECOVER, &g_sign_recover, sizeof(CK_BBOOL) },
6815 { CKA_UNWRAP, &g_unwrap, sizeof(CK_BBOOL) },
6816 { CKA_EXTRACTABLE, &g_extract, sizeof(CK_BBOOL) },
6817 { CKA_ALWAYS_SENSITIVE, &g_asensitive, sizeof(CK_BBOOL) },
6818 { CKA_NEVER_EXTRACTABLE, &g_nextract, sizeof(CK_BBOOL) },
6819 { CKA_WRAP_WITH_TRUSTED, &g_wrap_with_trusted, sizeof(CK_BBOOL) },
6820 { CKA_ALWAYS_AUTHENTICATE, &g_always_authenticate, sizeof(CK_BBOOL) },
6821 { CKA_PUBLIC_KEY_INFO, g_public_key_info, sizeof(g_public_key_info) },
6822 };
6823
6824 uint8_t signature[512] = { 0 };
6825 CK_ULONG signature_len = 0;
6826
6827 size_t i = 0;
6828
6829 Do_ADBG_BeginSubCase(c, "%s: Generate key pair", rsa_name);
6830
6831 modulus_bits = rsa_bits;
6832
6833 rv = C_GenerateKeyPair(session, &mechanism, public_key_template,
6834 ARRAY_SIZE(public_key_template),
6835 private_key_template,
6836 ARRAY_SIZE(private_key_template),
6837 &public_key, &private_key);
6838 if (!ADBG_EXPECT_CK_OK(c, rv))
6839 goto err;
6840
6841 /* reset get public key template */
6842 memset(g_id, 0, sizeof(g_id));
6843 assert(get_public_template[2].type == CKA_ID);
6844 get_public_template[2].ulValueLen = sizeof(g_id);
6845
6846 memset(g_subject, 0, sizeof(g_subject));
6847 assert(get_public_template[8].type == CKA_SUBJECT);
6848 get_public_template[8].ulValueLen = sizeof(g_subject);
6849
6850 memset(g_public_key_info, 0, sizeof(g_public_key_info));
6851 assert(get_public_template[14].type == CKA_PUBLIC_KEY_INFO);
6852 get_public_template[14].ulValueLen = sizeof(g_public_key_info);
6853
6854 rv = C_GetAttributeValue(session, public_key, get_public_template,
6855 ARRAY_SIZE(get_public_template));
6856 if (!ADBG_EXPECT_CK_OK(c, rv) ||
6857 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_PUBLIC_KEY) ||
6858 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_key_type, ==, CKK_RSA) ||
6859 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_derive, ==, CK_FALSE) ||
6860 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_TRUE) ||
6861 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_keygen_mecha, ==,
6862 CKM_RSA_PKCS_KEY_PAIR_GEN) ||
6863 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_encrypt, ==, CK_FALSE) ||
6864 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_verify, ==, CK_TRUE) ||
6865 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_verify_recover, ==, CK_FALSE) ||
6866 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_wrap, ==, CK_FALSE) ||
6867 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_trusted, ==, CK_FALSE))
6868 goto err_destr_obj;
6869
6870 /* reset get private key template */
6871 memset(g_id, 0, sizeof(g_id));
6872 assert(get_private_template[2].type == CKA_ID);
6873 get_private_template[2].ulValueLen = sizeof(g_id);
6874
6875 memset(g_subject, 0, sizeof(g_subject));
6876 assert(get_private_template[8].type == CKA_SUBJECT);
6877 get_private_template[8].ulValueLen = sizeof(g_subject);
6878
6879 memset(g_public_key_info, 0, sizeof(g_public_key_info));
6880 assert(get_private_template[19].type == CKA_PUBLIC_KEY_INFO);
6881 get_private_template[19].ulValueLen = sizeof(g_public_key_info);
6882
6883 rv = C_GetAttributeValue(session, private_key, get_private_template,
6884 ARRAY_SIZE(get_private_template));
6885 if (!ADBG_EXPECT_CK_OK(c, rv) ||
6886 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_PRIVATE_KEY) ||
6887 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_key_type, ==, CKK_RSA) ||
6888 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_derive, ==, CK_FALSE) ||
6889 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_TRUE) ||
6890 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_keygen_mecha, ==,
6891 CKM_RSA_PKCS_KEY_PAIR_GEN) ||
6892 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sensitive, ==, CK_TRUE) ||
6893 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_decrypt, ==, CK_FALSE) ||
6894 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sign, ==, CK_TRUE) ||
6895 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sign_recover, ==, CK_FALSE) ||
6896 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_unwrap, ==, CK_FALSE) ||
6897 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_extract, ==, CK_FALSE) ||
6898 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_asensitive, ==, CK_TRUE) ||
6899 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_nextract, ==, CK_TRUE) ||
6900 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_wrap_with_trusted, ==, CK_FALSE) ||
6901 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_always_authenticate, ==, CK_FALSE))
6902 goto err_destr_obj;
6903
6904 for (i = 0; i < ARRAY_SIZE(rsa_pss_sign_tests); i++) {
6905 /*
6906 * Note: this order of end/begin here is just to get ADBG
6907 * SubCases in sync with error handling.
6908 */
6909 Do_ADBG_EndSubCase(c, NULL);
6910
6911 Do_ADBG_BeginSubCase(c, "%s: Sign & verify - oneshot - %s",
6912 rsa_name,
6913 rsa_pss_sign_tests[i].test_name);
6914
6915 sign_mechanism.mechanism = rsa_pss_sign_tests[i].mecha;
6916 sign_mechanism.pParameter = &pss_params;
6917 sign_mechanism.ulParameterLen = sizeof(pss_params);
6918 pss_params.hashAlg = rsa_pss_sign_tests[i].hash_algo;
6919 pss_params.mgf = rsa_pss_sign_tests[i].mgf_algo;
6920 pss_params.sLen = rsa_pss_sign_tests[i].salt_len;
6921
6922 memset(signature, 0, sizeof(signature));
6923 signature_len = sizeof(signature);
6924
6925 rv = C_SignInit(session, &sign_mechanism, private_key);
6926 if (rsa_bits >= rsa_pss_sign_tests[i].min_rsa_bits) {
6927 if (!ADBG_EXPECT_CK_OK(c, rv))
6928 goto err_destr_obj;
6929 } else {
6930 if (!ADBG_EXPECT_CK_RESULT(c, CKR_KEY_SIZE_RANGE, rv))
6931 goto err_destr_obj;
6932 continue;
6933 }
6934
6935 rv = C_Sign(session, (void *)rsa_pss_sign_tests[i].data,
6936 rsa_pss_sign_tests[i].data_size,
6937 (void *)signature, &signature_len);
6938 if (!ADBG_EXPECT_CK_OK(c, rv))
6939 goto err_destr_obj;
6940
6941 rv = C_VerifyInit(session, &sign_mechanism, public_key);
6942 if (!ADBG_EXPECT_CK_OK(c, rv))
6943 goto err_destr_obj;
6944
6945 rv = C_Verify(session, (void *)rsa_pss_sign_tests[i].data,
6946 rsa_pss_sign_tests[i].data_size,
6947 (void *)signature, signature_len);
6948 if (!ADBG_EXPECT_CK_OK(c, rv))
6949 goto err_destr_obj;
6950 }
6951
6952 rv = C_DestroyObject(session, private_key);
6953 if (!ADBG_EXPECT_CK_OK(c, rv))
6954 goto err_destr_pub_obj;
6955
6956 rv = C_DestroyObject(session, public_key);
6957 if (!ADBG_EXPECT_CK_OK(c, rv))
6958 goto err;
6959
6960 Do_ADBG_EndSubCase(c, NULL);
6961
6962 return 1;
6963
6964err_destr_obj:
6965 ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, private_key));
6966err_destr_pub_obj:
6967 ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, public_key));
6968err:
6969 Do_ADBG_EndSubCase(c, NULL);
6970
6971 return 0;
6972}
6973
6974static void xtest_pkcs11_test_1022(ADBG_Case_t *c)
6975{
6976 CK_RV rv = CKR_GENERAL_ERROR;
6977 CK_SLOT_ID slot = 0;
6978 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
6979 CK_FLAGS session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
6980 int ret = 0;
6981
6982 rv = init_lib_and_find_token_slot(&slot);
6983 if (!ADBG_EXPECT_CK_OK(c, rv))
6984 return;
6985
6986 rv = init_test_token(slot);
6987 if (!ADBG_EXPECT_CK_OK(c, rv))
6988 goto close_lib;
6989
6990 rv = init_user_test_token(slot);
6991 if (!ADBG_EXPECT_CK_OK(c, rv))
6992 goto close_lib;
6993
6994 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
6995 if (!ADBG_EXPECT_CK_OK(c, rv))
6996 goto close_lib;
6997
6998 /* Login to Test Token */
6999 rv = C_Login(session, CKU_USER, test_token_user_pin,
7000 sizeof(test_token_user_pin));
7001 if (!ADBG_EXPECT_CK_OK(c, rv))
7002 goto out;
7003
7004 ret = test_rsa_pss_operations(c, session, "RSA-1024", 1024);
7005 if (!ret)
7006 goto out;
7007 ret = test_rsa_pss_operations(c, session, "RSA-2048", 2048);
7008 if (!ret)
7009 goto out;
7010 if (level > 0) {
7011 ret = test_rsa_pss_operations(c, session, "RSA-3072", 3072);
7012 if (!ret)
7013 goto out;
7014 ret = test_rsa_pss_operations(c, session, "RSA-4096", 4096);
7015 if (!ret)
7016 goto out;
7017 }
7018out:
7019 ADBG_EXPECT_CK_OK(c, C_CloseSession(session));
7020close_lib:
7021 ADBG_EXPECT_CK_OK(c, close_lib());
7022}
7023ADBG_CASE_DEFINE(pkcs11, 1022, xtest_pkcs11_test_1022,
7024 "PKCS11: RSA PSS key generation and signing");
Vesa Jääskeläinena2a82392021-07-02 19:00:12 +03007025
7026static const char rsa_oaep_message[] = "Hello World";
7027static char rsa_oaep_label[] = "TestLabel";
7028
7029#define RSA_OAEP_CRYPT_TEST(_test_name, _min_rsa_bits, _hash_algo, _mgf_algo, \
7030 _source_data, _source_data_len) \
7031 { \
7032 .test_name = _test_name, \
7033 .min_rsa_bits = _min_rsa_bits, \
7034 .hash_algo = _hash_algo, \
7035 .mgf_algo = _mgf_algo, \
7036 .source_data = _source_data, \
7037 .source_data_len = _source_data_len, \
7038 }
7039
7040/* List of RSA OAEP crypto params to test out */
7041static struct {
7042 const char *test_name;
7043 uint32_t min_rsa_bits;
7044 CK_MECHANISM_TYPE hash_algo;
7045 CK_RSA_PKCS_MGF_TYPE mgf_algo;
7046 void *source_data;
7047 size_t source_data_len;
7048} rsa_oaep_crypt_tests[] = {
7049 RSA_OAEP_CRYPT_TEST("RSA-OAEP/SHA1", 1024, CKM_SHA_1, CKG_MGF1_SHA1,
7050 NULL, 0),
7051 RSA_OAEP_CRYPT_TEST("RSA-OAEP/SHA1/label", 1024, CKM_SHA_1,
7052 CKG_MGF1_SHA1, rsa_oaep_label,
7053 sizeof(rsa_oaep_label)),
7054 RSA_OAEP_CRYPT_TEST("RSA-OAEP/SHA224", 1024, CKM_SHA224,
7055 CKG_MGF1_SHA224, NULL, 0),
7056 RSA_OAEP_CRYPT_TEST("RSA-OAEP/SHA224/label", 1024, CKM_SHA224,
7057 CKG_MGF1_SHA224, rsa_oaep_label,
7058 sizeof(rsa_oaep_label)),
7059 RSA_OAEP_CRYPT_TEST("RSA-OAEP/SHA256", 1024, CKM_SHA256,
7060 CKG_MGF1_SHA256, NULL, 0),
7061 RSA_OAEP_CRYPT_TEST("RSA-OAEP/SHA256/label", 1024, CKM_SHA256,
7062 CKG_MGF1_SHA256, rsa_oaep_label,
7063 sizeof(rsa_oaep_label)),
7064 RSA_OAEP_CRYPT_TEST("RSA-OAEP/SHA384", 1024, CKM_SHA384,
7065 CKG_MGF1_SHA384, NULL, 0),
7066 RSA_OAEP_CRYPT_TEST("RSA-OAEP/SHA384/label", 1024, CKM_SHA384,
7067 CKG_MGF1_SHA384, rsa_oaep_label,
7068 sizeof(rsa_oaep_label)),
7069 RSA_OAEP_CRYPT_TEST("RSA-OAEP/SHA512", 2048, CKM_SHA512,
7070 CKG_MGF1_SHA512, NULL, 0),
7071 RSA_OAEP_CRYPT_TEST("RSA-OAEP/SHA512/label", 2048, CKM_SHA512,
7072 CKG_MGF1_SHA512, rsa_oaep_label,
7073 sizeof(rsa_oaep_label)),
7074};
7075
7076static int test_rsa_oaep_operations(ADBG_Case_t *c,
7077 CK_SESSION_HANDLE session,
7078 const char *rsa_name, uint32_t rsa_bits)
7079{
7080 CK_RV rv = CKR_GENERAL_ERROR;
7081 CK_OBJECT_HANDLE public_key = CK_INVALID_HANDLE;
7082 CK_OBJECT_HANDLE private_key = CK_INVALID_HANDLE;
7083
7084 CK_MECHANISM mechanism = {
7085 CKM_RSA_PKCS_KEY_PAIR_GEN, NULL, 0
7086 };
7087 CK_MECHANISM crypt_mechanism = {
7088 CKM_RSA_PKCS_OAEP, NULL, 0
7089 };
7090 CK_RSA_PKCS_OAEP_PARAMS oaep_params = {
7091 CKM_SHA256, CKG_MGF1_SHA256, CKZ_DATA_SPECIFIED, NULL, 0
7092 };
7093 CK_BYTE public_exponent[] = { 1, 0, 1 };
7094 CK_BYTE id[] = { 123 };
7095 CK_ULONG modulus_bits = 0;
7096 CK_ATTRIBUTE public_key_template[] = {
7097 { CKA_ENCRYPT, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
7098 { CKA_VERIFY, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
7099 { CKA_WRAP, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
7100 { CKA_MODULUS_BITS, &modulus_bits, sizeof(CK_ULONG) },
7101 { CKA_PUBLIC_EXPONENT, public_exponent,
7102 sizeof(public_exponent) }
7103 };
7104 CK_ATTRIBUTE private_key_template[] = {
7105 { CKA_TOKEN, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
7106 { CKA_PRIVATE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
7107 { CKA_SUBJECT, subject_common_name,
7108 sizeof(subject_common_name) },
7109 { CKA_ID, id, sizeof(id) },
7110 { CKA_SENSITIVE, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
7111 { CKA_DECRYPT, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
7112 { CKA_SIGN, &(CK_BBOOL){ CK_TRUE }, sizeof(CK_BBOOL) },
7113 { CKA_UNWRAP, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) }
7114 };
7115
7116 CK_OBJECT_CLASS g_class = 0;
7117 CK_KEY_TYPE g_key_type = 0;
7118 CK_BYTE g_id[32] = { 0 };
7119 CK_DATE g_start_date = { 0 };
7120 CK_DATE g_end_date = { 0 };
7121 CK_BBOOL g_derive = CK_FALSE;
7122 CK_BBOOL g_local = CK_FALSE;
7123 CK_MECHANISM_TYPE g_keygen_mecha = 0;
7124 CK_BYTE g_subject[64] = { 0 };
7125 CK_BBOOL g_encrypt = CK_FALSE;
7126 CK_BBOOL g_verify = CK_FALSE;
7127 CK_BBOOL g_verify_recover = CK_FALSE;
7128 CK_BBOOL g_wrap = CK_FALSE;
7129 CK_BBOOL g_trusted = CK_FALSE;
7130 CK_BYTE g_public_key_info[1024] = { 0 };
7131 CK_BBOOL g_sensitive = CK_FALSE;
7132 CK_BBOOL g_decrypt = CK_FALSE;
7133 CK_BBOOL g_sign = CK_FALSE;
7134 CK_BBOOL g_sign_recover = CK_FALSE;
7135 CK_BBOOL g_unwrap = CK_FALSE;
7136 CK_BBOOL g_extract = CK_FALSE;
7137 CK_BBOOL g_asensitive = CK_FALSE;
7138 CK_BBOOL g_nextract = CK_FALSE;
7139 CK_BBOOL g_wrap_with_trusted = CK_FALSE;
7140 CK_BBOOL g_always_authenticate = CK_FALSE;
7141
7142 /* Note: Tests below expects specific order of elements */
7143 CK_ATTRIBUTE get_public_template[] = {
7144 { CKA_CLASS, &g_class, sizeof(CK_OBJECT_CLASS) },
7145 { CKA_KEY_TYPE, &g_key_type, sizeof(CK_KEY_TYPE) },
7146 { CKA_ID, g_id, sizeof(g_id) },
7147 { CKA_START_DATE, &g_start_date, sizeof(CK_DATE) },
7148 { CKA_END_DATE, &g_end_date, sizeof(CK_DATE) },
7149 { CKA_DERIVE, &g_derive, sizeof(CK_BBOOL) },
7150 { CKA_LOCAL, &g_local, sizeof(CK_BBOOL) },
7151 { CKA_KEY_GEN_MECHANISM, &g_keygen_mecha, sizeof(CK_MECHANISM_TYPE) },
7152 { CKA_SUBJECT, g_subject, sizeof(g_subject) },
7153 { CKA_ENCRYPT, &g_encrypt, sizeof(CK_BBOOL) },
7154 { CKA_VERIFY, &g_verify, sizeof(CK_BBOOL) },
7155 { CKA_VERIFY_RECOVER, &g_verify_recover, sizeof(CK_BBOOL) },
7156 { CKA_WRAP, &g_wrap, sizeof(CK_BBOOL) },
7157 { CKA_TRUSTED, &g_trusted, sizeof(CK_BBOOL) },
7158 { CKA_PUBLIC_KEY_INFO, g_public_key_info, sizeof(g_public_key_info) },
7159 };
7160
7161 /* Note: Tests below expects specific order of elements */
7162 CK_ATTRIBUTE get_private_template[] = {
7163 { CKA_CLASS, &g_class, sizeof(CK_OBJECT_CLASS) },
7164 { CKA_KEY_TYPE, &g_key_type, sizeof(CK_KEY_TYPE) },
7165 { CKA_ID, g_id, sizeof(g_id) },
7166 { CKA_START_DATE, &g_start_date, sizeof(CK_DATE) },
7167 { CKA_END_DATE, &g_end_date, sizeof(CK_DATE) },
7168 { CKA_DERIVE, &g_derive, sizeof(CK_BBOOL) },
7169 { CKA_LOCAL, &g_local, sizeof(CK_BBOOL) },
7170 { CKA_KEY_GEN_MECHANISM, &g_keygen_mecha, sizeof(CK_MECHANISM_TYPE) },
7171 { CKA_SUBJECT, g_subject, sizeof(g_subject) },
7172 { CKA_SENSITIVE, &g_sensitive, sizeof(CK_BBOOL) },
7173 { CKA_DECRYPT, &g_decrypt, sizeof(CK_BBOOL) },
7174 { CKA_SIGN, &g_sign, sizeof(CK_BBOOL) },
7175 { CKA_SIGN_RECOVER, &g_sign_recover, sizeof(CK_BBOOL) },
7176 { CKA_UNWRAP, &g_unwrap, sizeof(CK_BBOOL) },
7177 { CKA_EXTRACTABLE, &g_extract, sizeof(CK_BBOOL) },
7178 { CKA_ALWAYS_SENSITIVE, &g_asensitive, sizeof(CK_BBOOL) },
7179 { CKA_NEVER_EXTRACTABLE, &g_nextract, sizeof(CK_BBOOL) },
7180 { CKA_WRAP_WITH_TRUSTED, &g_wrap_with_trusted, sizeof(CK_BBOOL) },
7181 { CKA_ALWAYS_AUTHENTICATE, &g_always_authenticate, sizeof(CK_BBOOL) },
7182 { CKA_PUBLIC_KEY_INFO, g_public_key_info, sizeof(g_public_key_info) },
7183 };
7184 uint8_t ciphertext[512] = { 0 };
7185 CK_ULONG ciphertext_len = 0;
7186 uint8_t plaintext[512] = { 0 };
7187 CK_ULONG plaintext_len = 0;
7188 size_t i = 0;
7189
7190 Do_ADBG_BeginSubCase(c, "%s: Generate key pair", rsa_name);
7191
7192 modulus_bits = rsa_bits;
7193
7194 rv = C_GenerateKeyPair(session, &mechanism, public_key_template,
7195 ARRAY_SIZE(public_key_template),
7196 private_key_template,
7197 ARRAY_SIZE(private_key_template),
7198 &public_key, &private_key);
7199 if (!ADBG_EXPECT_CK_OK(c, rv))
7200 goto err;
7201
7202 /* reset get public key template */
7203 memset(g_id, 0, sizeof(g_id));
7204 assert(get_public_template[2].type == CKA_ID);
7205 get_public_template[2].ulValueLen = sizeof(g_id);
7206
7207 memset(g_subject, 0, sizeof(g_subject));
7208 assert(get_public_template[8].type == CKA_SUBJECT);
7209 get_public_template[8].ulValueLen = sizeof(g_subject);
7210
7211 memset(g_public_key_info, 0, sizeof(g_public_key_info));
7212 assert(get_public_template[14].type == CKA_PUBLIC_KEY_INFO);
7213 get_public_template[14].ulValueLen = sizeof(g_public_key_info);
7214
7215 rv = C_GetAttributeValue(session, public_key,
7216 get_public_template,
7217 ARRAY_SIZE(get_public_template));
7218 if (!ADBG_EXPECT_CK_OK(c, rv) ||
7219 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_PUBLIC_KEY) ||
7220 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_key_type, ==, CKK_RSA) ||
7221 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_derive, ==, CK_FALSE) ||
7222 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_TRUE) ||
7223 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_keygen_mecha, ==,
7224 CKM_RSA_PKCS_KEY_PAIR_GEN) ||
7225 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_encrypt, ==, CK_TRUE) ||
7226 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_verify, ==, CK_TRUE) ||
7227 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_verify_recover, ==, CK_FALSE) ||
7228 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_wrap, ==, CK_FALSE) ||
7229 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_trusted, ==, CK_FALSE))
7230 goto err_destr_obj;
7231
7232 /* reset get private key template */
7233 memset(g_id, 0, sizeof(g_id));
7234 assert(get_private_template[2].type == CKA_ID);
7235 get_private_template[2].ulValueLen = sizeof(g_id);
7236
7237 memset(g_subject, 0, sizeof(g_subject));
7238 assert(get_private_template[8].type == CKA_SUBJECT);
7239 get_private_template[8].ulValueLen = sizeof(g_subject);
7240
7241 memset(g_public_key_info, 0, sizeof(g_public_key_info));
7242 assert(get_private_template[19].type == CKA_PUBLIC_KEY_INFO);
7243 get_private_template[19].ulValueLen = sizeof(g_public_key_info);
7244
7245 rv = C_GetAttributeValue(session, private_key,
7246 get_private_template,
7247 ARRAY_SIZE(get_private_template));
7248 if (!ADBG_EXPECT_CK_OK(c, rv) ||
7249 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_class, ==, CKO_PRIVATE_KEY) ||
7250 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_key_type, ==, CKK_RSA) ||
7251 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_derive, ==, CK_FALSE) ||
7252 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_local, ==, CK_TRUE) ||
7253 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_keygen_mecha, ==,
7254 CKM_RSA_PKCS_KEY_PAIR_GEN) ||
7255 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sensitive, ==, CK_TRUE) ||
7256 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_decrypt, ==, CK_TRUE) ||
7257 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sign, ==, CK_TRUE) ||
7258 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_sign_recover, ==, CK_FALSE) ||
7259 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_unwrap, ==, CK_FALSE) ||
7260 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_extract, ==, CK_FALSE) ||
7261 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_asensitive, ==, CK_TRUE) ||
7262 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_nextract, ==, CK_TRUE) ||
7263 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_wrap_with_trusted, ==, CK_FALSE) ||
7264 !ADBG_EXPECT_COMPARE_UNSIGNED(c, g_always_authenticate, ==, CK_FALSE))
7265 goto err_destr_obj;
7266
7267 for (i = 0; i < ARRAY_SIZE(rsa_oaep_crypt_tests); i++) {
7268 /*
7269 * Note: this order of end/begin here is just to get ADBG
7270 * SubCases in sync with error handling.
7271 */
7272 Do_ADBG_EndSubCase(c, NULL);
7273
7274 Do_ADBG_BeginSubCase(c, "%s: Encrypt & decrypt - oneshot - %s",
7275 rsa_name,
7276 rsa_oaep_crypt_tests[i].test_name);
7277
7278 crypt_mechanism.mechanism = CKM_RSA_PKCS_OAEP;
7279 crypt_mechanism.pParameter = &oaep_params;
7280 crypt_mechanism.ulParameterLen = sizeof(oaep_params);
7281 oaep_params.hashAlg = rsa_oaep_crypt_tests[i].hash_algo;
7282 oaep_params.mgf = rsa_oaep_crypt_tests[i].mgf_algo;
7283 oaep_params.pSourceData = rsa_oaep_crypt_tests[i].source_data;
7284 oaep_params.ulSourceDataLen = rsa_oaep_crypt_tests[i].source_data_len;
7285
7286 memset(ciphertext, 0, sizeof(ciphertext));
7287 memset(plaintext, 0, sizeof(plaintext));
7288
7289 ciphertext_len = 0;
7290
7291 memcpy(plaintext, rsa_oaep_message, sizeof(rsa_oaep_message));
7292 plaintext_len = sizeof(rsa_oaep_message);
7293
7294 rv = C_EncryptInit(session, &crypt_mechanism, public_key);
7295 if (!ADBG_EXPECT_CK_OK(c, rv))
7296 goto err_destr_obj;
7297
7298 rv = C_Encrypt(session, plaintext, plaintext_len, NULL,
7299 &ciphertext_len);
7300 if (!ADBG_EXPECT_CK_OK(c, rv))
7301 goto err_destr_obj;
7302
7303 rv = C_Encrypt(session, plaintext, plaintext_len, ciphertext,
7304 &ciphertext_len);
7305 if (rsa_bits >= rsa_oaep_crypt_tests[i].min_rsa_bits) {
7306 if (!ADBG_EXPECT_CK_OK(c, rv))
7307 goto err_destr_obj;
7308 } else {
7309 if (!ADBG_EXPECT_CK_RESULT(c, CKR_DATA_LEN_RANGE, rv))
7310 goto err_destr_obj;
7311 continue;
7312 }
7313
7314 memset(plaintext, 0, sizeof(plaintext));
7315 plaintext_len = 0;
7316
7317 rv = C_DecryptInit(session, &crypt_mechanism, private_key);
7318 if (!ADBG_EXPECT_CK_OK(c, rv))
7319 goto err_destr_obj;
7320
7321 rv = C_Decrypt(session, ciphertext, ciphertext_len, NULL,
7322 &plaintext_len);
7323 if (!ADBG_EXPECT_CK_OK(c, rv))
7324 goto err_destr_obj;
7325
7326 rv = C_Decrypt(session, ciphertext, ciphertext_len, plaintext,
7327 &plaintext_len);
7328 if (!ADBG_EXPECT_CK_OK(c, rv) ||
7329 !ADBG_EXPECT_BUFFER(c, rsa_oaep_message,
7330 sizeof(rsa_oaep_message), plaintext,
7331 plaintext_len))
7332 goto err_destr_obj;
7333 }
7334
7335 rv = C_DestroyObject(session, private_key);
7336 if (!ADBG_EXPECT_CK_OK(c, rv))
7337 goto err_destr_pub_obj;
7338
7339 rv = C_DestroyObject(session, public_key);
7340 if (!ADBG_EXPECT_CK_OK(c, rv))
7341 goto err;
7342
7343 Do_ADBG_EndSubCase(c, NULL);
7344
7345 return 1;
7346
7347err_destr_obj:
7348 ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, private_key));
7349err_destr_pub_obj:
7350 ADBG_EXPECT_CK_OK(c, C_DestroyObject(session, public_key));
7351err:
7352 Do_ADBG_EndSubCase(c, NULL);
7353
7354 return 0;
7355}
7356
7357static void xtest_pkcs11_test_1023(ADBG_Case_t *c)
7358{
7359 CK_RV rv = CKR_GENERAL_ERROR;
7360 CK_SLOT_ID slot = 0;
7361 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
7362 CK_FLAGS session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
7363 int ret = 0;
7364
7365 rv = init_lib_and_find_token_slot(&slot);
7366 if (!ADBG_EXPECT_CK_OK(c, rv))
7367 return;
7368
7369 rv = init_test_token(slot);
7370 if (!ADBG_EXPECT_CK_OK(c, rv))
7371 goto close_lib;
7372
7373 rv = init_user_test_token(slot);
7374 if (!ADBG_EXPECT_CK_OK(c, rv))
7375 goto close_lib;
7376
7377 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
7378 if (!ADBG_EXPECT_CK_OK(c, rv))
7379 goto close_lib;
7380
7381 /* Login to Test Token */
7382 rv = C_Login(session, CKU_USER, test_token_user_pin,
7383 sizeof(test_token_user_pin));
7384 if (!ADBG_EXPECT_CK_OK(c, rv))
7385 goto out;
7386
7387 ret = test_rsa_oaep_operations(c, session, "RSA-1024", 1024);
7388 if (!ret)
7389 goto out;
7390 ret = test_rsa_oaep_operations(c, session, "RSA-2048", 2048);
7391 if (!ret)
7392 goto out;
7393 if (level > 0) {
7394 ret = test_rsa_oaep_operations(c, session, "RSA-3072", 3072);
7395 if (!ret)
7396 goto out;
7397 ret = test_rsa_oaep_operations(c, session, "RSA-4096", 4096);
7398 if (!ret)
7399 goto out;
7400 }
7401out:
7402 ADBG_EXPECT_CK_OK(c, C_CloseSession(session));
7403close_lib:
7404 ADBG_EXPECT_CK_OK(c, close_lib());
7405}
7406ADBG_CASE_DEFINE(pkcs11, 1023, xtest_pkcs11_test_1023,
7407 "PKCS11: RSA OAEP key generation and crypto operations");
Vesa Jääskeläinenbcedd372021-08-14 12:06:12 +03007408
7409static const char x509_example_root_ca[] =
7410 "-----BEGIN CERTIFICATE-----\n"
7411 "MIICDTCCAZOgAwIBAgIBATAKBggqhkjOPQQDAzA+MQswCQYDVQQGEwJGSTEVMBMG\n"
7412 "A1UECgwMTWFudWZhY3R1cmVyMRgwFgYDVQQDDA9FeGFtcGxlIFJvb3QgQ0EwIBcN\n"
7413 "MjEwODE0MDc1NTU1WhgPOTk5OTEyMzEyMzU5NTlaMD4xCzAJBgNVBAYTAkZJMRUw\n"
7414 "EwYDVQQKDAxNYW51ZmFjdHVyZXIxGDAWBgNVBAMMD0V4YW1wbGUgUm9vdCBDQTB2\n"
7415 "MBAGByqGSM49AgEGBSuBBAAiA2IABP6jFf4PuIo0t78AeONf2ENbip4GdG9rfstp\n"
7416 "bWMvH/0BIn2ioMbapYSK1WcVlOKUaZRrbRzoYWD7ZpwSYFwtd1XmMQkLJ1baIdrt\n"
7417 "jibL9yBCYRJJLsmTHn5UiLCoA2EiFaNjMGEwHQYDVR0OBBYEFApC6125F2th+ujZ\n"
7418 "PVxTtsI8llA1MB8GA1UdIwQYMBaAFApC6125F2th+ujZPVxTtsI8llA1MA8GA1Ud\n"
7419 "EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2gAMGUCMACW\n"
7420 "r0/EpTD1uJ9JLsyC8aGP2rSr44J50K6fT0h3LZWMhL5fGkkNTCdmuWbWZznTswIx\n"
7421 "APjyNm4f///vWUN3XFd+BRhS2YHR43c0K4oNVyLqigoMoSqu0zXt9Xm+Lsu5iqgJ\n"
7422 "NQ==\n"
7423 "-----END CERTIFICATE-----\n";
7424
7425static void xtest_pkcs11_test_1024(ADBG_Case_t *c)
7426{
7427#ifndef OPENSSL_FOUND
7428 Do_ADBG_Log("OpenSSL not available, skipping X.509 Certificate tests");
7429#else
7430 CK_RV rv = CKR_GENERAL_ERROR;
7431 CK_SLOT_ID slot = 0;
7432 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
7433 CK_FLAGS session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
7434 BIO *x509_bio = NULL;
7435 X509 *x509_cert = NULL;
7436 uint8_t *x509_cert_der = NULL;
7437 int x509_cert_der_size = 0;
7438 X509_NAME *x509_subject_name = NULL;
7439 uint8_t *x509_subject_name_der = NULL;
7440 int x509_subject_name_der_size = 0;
7441 X509_NAME *x509_issuer_name = NULL;
7442 uint8_t *x509_issuer_name_der = NULL;
7443 int x509_issuer_name_der_size = 0;
7444 ASN1_INTEGER *x509_serial_number = NULL;
7445 uint8_t *x509_serial_number_der = NULL;
7446 int x509_serial_number_der_size = 0;
7447 uint8_t *p = NULL;
7448 CK_BYTE id[] = { 123 };
7449 const char *label = "example-root-ca";
7450 /* Note: Tests below expects specific order of elements */
7451 CK_ATTRIBUTE certificate_object[] = {
7452 { CKA_TOKEN, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
7453 { CKA_CLASS, &(CK_OBJECT_CLASS){ CKO_CERTIFICATE },
7454 sizeof(CK_OBJECT_CLASS) },
7455 { CKA_CERTIFICATE_TYPE, &(CK_CERTIFICATE_TYPE){ CKC_X_509 },
7456 sizeof(CK_CERTIFICATE_TYPE) },
7457 { CKA_CERTIFICATE_CATEGORY,
7458 &(CK_ULONG){ CK_CERTIFICATE_CATEGORY_UNSPECIFIED },
7459 sizeof(CK_ULONG) },
7460 { CKA_NAME_HASH_ALGORITHM, &(CK_MECHANISM_TYPE){ CKM_SHA_1 },
7461 sizeof(CK_MECHANISM_TYPE) },
7462 { CKA_ID, id, sizeof(id) },
7463 { CKA_LABEL, (CK_UTF8CHAR_PTR)label, strlen(label) },
7464 { CKA_VALUE, NULL, 0 },
7465 { CKA_ISSUER, NULL, 0 },
7466 { CKA_SUBJECT, NULL, 0 },
7467 { CKA_SERIAL_NUMBER, NULL, 0 },
7468 };
7469 /* Note: Tests below expects specific order of elements */
7470 CK_ATTRIBUTE certificate_object2[] = {
7471 { CKA_TOKEN, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
7472 { CKA_CLASS, &(CK_OBJECT_CLASS){ CKO_CERTIFICATE },
7473 sizeof(CK_OBJECT_CLASS) },
7474 { CKA_CERTIFICATE_TYPE, &(CK_CERTIFICATE_TYPE){ CKC_X_509 },
7475 sizeof(CK_CERTIFICATE_TYPE) },
7476 { CKA_ID, id, sizeof(id) },
7477 { CKA_LABEL, (CK_UTF8CHAR_PTR)label, strlen(label) },
7478 { CKA_VALUE, NULL, 0 },
7479 { CKA_ISSUER, NULL, 0 },
7480 { CKA_SUBJECT, NULL, 0 },
7481 { CKA_SERIAL_NUMBER, NULL, 0 },
7482 };
7483 /* Note: Tests below expects specific order of elements */
7484 /* CKA_CERTIFICATE_CATEGORY is specified below with invalid ID */
7485 CK_ATTRIBUTE invalid_category_object[] = {
7486 { CKA_TOKEN, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
7487 { CKA_CLASS, &(CK_OBJECT_CLASS){ CKO_CERTIFICATE },
7488 sizeof(CK_OBJECT_CLASS) },
7489 { CKA_CERTIFICATE_TYPE, &(CK_CERTIFICATE_TYPE){ CKC_X_509 },
7490 sizeof(CK_CERTIFICATE_TYPE) },
7491 { CKA_CERTIFICATE_CATEGORY, &(CK_ULONG){ -1 },
7492 sizeof(CK_ULONG) },
7493 { CKA_ID, id, sizeof(id) },
7494 { CKA_LABEL, (CK_UTF8CHAR_PTR)label, strlen(label) },
7495 { CKA_VALUE, NULL, 0 },
7496 { CKA_ISSUER, NULL, 0 },
7497 { CKA_SUBJECT, NULL, 0 },
7498 { CKA_SERIAL_NUMBER, NULL, 0 },
7499 };
7500 /* Note: Tests below expects specific order of elements */
7501 /* CKA_CERTIFICATE_CATEGORY is specified below with invalid size */
7502 CK_ATTRIBUTE invalid_category_object2[] = {
7503 { CKA_TOKEN, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
7504 { CKA_CLASS, &(CK_OBJECT_CLASS){ CKO_CERTIFICATE },
7505 sizeof(CK_OBJECT_CLASS) },
7506 { CKA_CERTIFICATE_TYPE, &(CK_CERTIFICATE_TYPE){ CKC_X_509 },
7507 sizeof(CK_CERTIFICATE_TYPE) },
7508 { CKA_CERTIFICATE_CATEGORY,
7509 &(CK_ULONG){ CK_CERTIFICATE_CATEGORY_UNSPECIFIED }, 0 },
7510 { CKA_ID, id, sizeof(id) },
7511 { CKA_LABEL, (CK_UTF8CHAR_PTR)label, strlen(label) },
7512 { CKA_VALUE, NULL, 0 },
7513 { CKA_ISSUER, NULL, 0 },
7514 { CKA_SUBJECT, NULL, 0 },
7515 { CKA_SERIAL_NUMBER, NULL, 0 },
7516 };
7517 /* Note: Tests below expects specific order of elements */
7518 /* CKA_NAME_HASH_ALGORITHM is specified below with invalid size */
7519 CK_ATTRIBUTE invalid_name_hash_alg_size[] = {
7520 { CKA_TOKEN, &(CK_BBOOL){ CK_FALSE }, sizeof(CK_BBOOL) },
7521 { CKA_CLASS, &(CK_OBJECT_CLASS){ CKO_CERTIFICATE },
7522 sizeof(CK_OBJECT_CLASS) },
7523 { CKA_CERTIFICATE_TYPE, &(CK_CERTIFICATE_TYPE){ CKC_X_509 },
7524 sizeof(CK_CERTIFICATE_TYPE) },
7525 { CKA_NAME_HASH_ALGORITHM, &(CK_MECHANISM_TYPE){ CKM_SHA_1 },
7526 sizeof(CK_MECHANISM_TYPE) - 1 },
7527 { CKA_ID, id, sizeof(id) },
7528 { CKA_LABEL, (CK_UTF8CHAR_PTR)label, strlen(label) },
7529 { CKA_VALUE, NULL, 0 },
7530 { CKA_ISSUER, NULL, 0 },
7531 { CKA_SUBJECT, NULL, 0 },
7532 { CKA_SERIAL_NUMBER, NULL, 0 },
7533 };
7534 CK_OBJECT_HANDLE obj_hdl = CK_INVALID_HANDLE;
7535
7536 rv = init_lib_and_find_token_slot(&slot);
7537 if (!ADBG_EXPECT_CK_OK(c, rv))
7538 return;
7539
7540 rv = init_test_token(slot);
7541 if (!ADBG_EXPECT_CK_OK(c, rv))
7542 goto close_lib;
7543
7544 rv = init_user_test_token(slot);
7545 if (!ADBG_EXPECT_CK_OK(c, rv))
7546 goto close_lib;
7547
7548 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
7549 if (!ADBG_EXPECT_CK_OK(c, rv))
7550 goto close_lib;
7551
7552 /* Login to Test Token */
7553 rv = C_Login(session, CKU_USER, test_token_user_pin,
7554 sizeof(test_token_user_pin));
7555 if (!ADBG_EXPECT_CK_OK(c, rv))
7556 goto close_session;
7557
7558 Do_ADBG_BeginSubCase(c, "Import X.509 Certificate");
7559
7560 /* Parse PEM to OpenSSL's internal X509 format */
7561 x509_bio = BIO_new_mem_buf(x509_example_root_ca, -1);
7562 if (!ADBG_EXPECT_NOT_NULL(c, x509_bio))
7563 goto out;
7564
7565 x509_cert = PEM_read_bio_X509(x509_bio, NULL, 0, NULL);
7566 if (!ADBG_EXPECT_NOT_NULL(c, x509_cert))
7567 goto out;
7568
7569 BIO_free(x509_bio);
7570 x509_bio = NULL;
7571
7572 /* Make DER version for storing it in token */
7573 x509_cert_der_size = i2d_X509(x509_cert, NULL);
7574 if (!ADBG_EXPECT_COMPARE_SIGNED(c, x509_cert_der_size, >, 0))
7575 goto out;
7576
7577 x509_cert_der = OPENSSL_malloc(x509_cert_der_size);
7578 if (!ADBG_EXPECT_NOT_NULL(c, x509_cert_der))
7579 goto out;
7580
7581 p = x509_cert_der;
7582 x509_cert_der_size = i2d_X509(x509_cert, &p);
7583 if (!ADBG_EXPECT_COMPARE_SIGNED(c, x509_cert_der_size, >, 0))
7584 goto out;
7585
7586 /* Extract needed details from certificate */
7587
7588 /* Extract subject name */
7589 x509_subject_name = X509_get_subject_name(x509_cert);
7590 if (!ADBG_EXPECT_NOT_NULL(c, x509_subject_name))
7591 goto out;
7592
7593 x509_subject_name_der_size = i2d_X509_NAME(x509_subject_name, NULL);
7594 if (!ADBG_EXPECT_COMPARE_SIGNED(c, x509_subject_name_der_size, >, 0))
7595 goto out;
7596
7597 x509_subject_name_der = OPENSSL_malloc(x509_subject_name_der_size);
7598 if (!ADBG_EXPECT_NOT_NULL(c, x509_subject_name_der))
7599 goto out;
7600
7601 p = x509_subject_name_der;
7602 x509_subject_name_der_size = i2d_X509_NAME(x509_subject_name, &p);
7603 if (!ADBG_EXPECT_COMPARE_SIGNED(c, x509_subject_name_der_size, >, 0))
7604 goto out;
7605
7606 /* Extract issuer's name */
7607 x509_issuer_name = X509_get_issuer_name(x509_cert);
7608 if (!ADBG_EXPECT_NOT_NULL(c, x509_issuer_name))
7609 goto out;
7610
7611 x509_issuer_name_der_size = i2d_X509_NAME(x509_issuer_name, NULL);
7612 if (!ADBG_EXPECT_COMPARE_SIGNED(c, x509_issuer_name_der_size, >, 0))
7613 goto out;
7614
7615 x509_issuer_name_der = OPENSSL_malloc(x509_issuer_name_der_size);
7616 if (!ADBG_EXPECT_NOT_NULL(c, x509_issuer_name_der))
7617 goto out;
7618
7619 p = x509_issuer_name_der;
7620 x509_issuer_name_der_size = i2d_X509_NAME(x509_issuer_name, &p);
7621 if (!ADBG_EXPECT_COMPARE_SIGNED(c, x509_issuer_name_der_size, >, 0))
7622 goto out;
7623
7624 /* Extract certificate's serial number */
7625 x509_serial_number = X509_get_serialNumber(x509_cert);
7626 if (!ADBG_EXPECT_NOT_NULL(c, x509_serial_number))
7627 goto out;
7628
7629 x509_serial_number_der_size = i2d_ASN1_INTEGER(x509_serial_number, NULL);
7630 if (!ADBG_EXPECT_COMPARE_SIGNED(c, x509_serial_number_der_size, >, 0))
7631 goto out;
7632
7633 x509_serial_number_der = OPENSSL_malloc(x509_serial_number_der_size);
7634 if (!ADBG_EXPECT_NOT_NULL(c, x509_serial_number_der))
7635 goto out;
7636
7637 p = x509_serial_number_der;
7638 x509_serial_number_der_size = i2d_ASN1_INTEGER(x509_serial_number, &p);
7639 if (!ADBG_EXPECT_COMPARE_SIGNED(c, x509_serial_number_der_size, >, 0))
7640 goto out;
7641
7642 /* Create the actual object in session */
7643 assert(certificate_object[7].type == CKA_VALUE);
7644 certificate_object[7].pValue = x509_cert_der;
7645 certificate_object[7].ulValueLen = x509_cert_der_size;
7646
7647 assert(certificate_object[8].type == CKA_ISSUER);
7648 certificate_object[8].pValue = x509_issuer_name_der;
7649 certificate_object[8].ulValueLen = x509_issuer_name_der_size;
7650
7651 assert(certificate_object[9].type == CKA_SUBJECT);
7652 certificate_object[9].pValue = x509_subject_name_der;
7653 certificate_object[9].ulValueLen = x509_subject_name_der_size;
7654
7655 assert(certificate_object[10].type == CKA_SERIAL_NUMBER);
7656 certificate_object[10].pValue = x509_serial_number_der;
7657 certificate_object[10].ulValueLen = x509_serial_number_der_size;
7658
7659 rv = C_CreateObject(session, certificate_object,
7660 ARRAY_SIZE(certificate_object), &obj_hdl);
7661 if (!ADBG_EXPECT_CK_OK(c, rv))
7662 goto out;
7663
7664 rv = C_DestroyObject(session, obj_hdl);
7665 if (!ADBG_EXPECT_CK_OK(c, rv))
7666 goto out;
7667
7668 Do_ADBG_EndSubCase(c, NULL);
7669
7670 Do_ADBG_BeginSubCase(c, "Import X.509 Certificate with default values");
7671
7672 /* Create the actual object in session */
7673 assert(certificate_object2[5].type == CKA_VALUE);
7674 certificate_object2[5].pValue = x509_cert_der;
7675 certificate_object2[5].ulValueLen = x509_cert_der_size;
7676
7677 assert(certificate_object2[6].type == CKA_ISSUER);
7678 certificate_object2[6].pValue = x509_issuer_name_der;
7679 certificate_object2[6].ulValueLen = x509_issuer_name_der_size;
7680
7681 assert(certificate_object2[7].type == CKA_SUBJECT);
7682 certificate_object2[7].pValue = x509_subject_name_der;
7683 certificate_object2[7].ulValueLen = x509_subject_name_der_size;
7684
7685 assert(certificate_object2[8].type == CKA_SERIAL_NUMBER);
7686 certificate_object2[8].pValue = x509_serial_number_der;
7687 certificate_object2[8].ulValueLen = x509_serial_number_der_size;
7688
7689 rv = C_CreateObject(session, certificate_object2,
7690 ARRAY_SIZE(certificate_object2), &obj_hdl);
7691 if (!ADBG_EXPECT_CK_OK(c, rv))
7692 goto out;
7693
7694 rv = C_DestroyObject(session, obj_hdl);
7695 if (!ADBG_EXPECT_CK_OK(c, rv))
7696 goto out;
7697
7698 Do_ADBG_EndSubCase(c, NULL);
7699
7700 Do_ADBG_BeginSubCase(c, "Try import with invalid category");
7701
7702 /* Create the actual object in session */
7703 assert(invalid_category_object[6].type == CKA_VALUE);
7704 invalid_category_object[6].pValue = x509_cert_der;
7705 invalid_category_object[6].ulValueLen = x509_cert_der_size;
7706
7707 assert(invalid_category_object[7].type == CKA_ISSUER);
7708 invalid_category_object[7].pValue = x509_issuer_name_der;
7709 invalid_category_object[7].ulValueLen = x509_issuer_name_der_size;
7710
7711 assert(invalid_category_object[8].type == CKA_SUBJECT);
7712 invalid_category_object[8].pValue = x509_subject_name_der;
7713 invalid_category_object[8].ulValueLen = x509_subject_name_der_size;
7714
7715 assert(invalid_category_object[9].type == CKA_SERIAL_NUMBER);
7716 invalid_category_object[9].pValue = x509_serial_number_der;
7717 invalid_category_object[9].ulValueLen = x509_serial_number_der_size;
7718
7719 rv = C_CreateObject(session, invalid_category_object,
7720 ARRAY_SIZE(invalid_category_object), &obj_hdl);
7721 if (!ADBG_EXPECT_CK_RESULT(c, CKR_ATTRIBUTE_VALUE_INVALID, rv))
7722 goto out;
7723
7724 Do_ADBG_EndSubCase(c, NULL);
7725
7726 Do_ADBG_BeginSubCase(c, "Try import with invalid category size");
7727
7728 /* Create the actual object in session */
7729 assert(invalid_category_object2[6].type == CKA_VALUE);
7730 invalid_category_object2[6].pValue = x509_cert_der;
7731 invalid_category_object2[6].ulValueLen = x509_cert_der_size;
7732
7733 assert(invalid_category_object2[7].type == CKA_ISSUER);
7734 invalid_category_object2[7].pValue = x509_issuer_name_der;
7735 invalid_category_object2[7].ulValueLen = x509_issuer_name_der_size;
7736
7737 assert(invalid_category_object2[8].type == CKA_SUBJECT);
7738 invalid_category_object2[8].pValue = x509_subject_name_der;
7739 invalid_category_object2[8].ulValueLen = x509_subject_name_der_size;
7740
7741 assert(invalid_category_object2[9].type == CKA_SERIAL_NUMBER);
7742 invalid_category_object2[9].pValue = x509_serial_number_der;
7743 invalid_category_object2[9].ulValueLen = x509_serial_number_der_size;
7744
7745 rv = C_CreateObject(session, invalid_category_object2,
7746 ARRAY_SIZE(invalid_category_object2), &obj_hdl);
7747 if (!ADBG_EXPECT_CK_RESULT(c, CKR_ATTRIBUTE_VALUE_INVALID, rv))
7748 goto out;
7749
7750 Do_ADBG_EndSubCase(c, NULL);
7751
7752 Do_ADBG_BeginSubCase(c, "Try import with invalid name hash alg size");
7753
7754 /* Create the actual object in session */
7755 assert(invalid_name_hash_alg_size[6].type == CKA_VALUE);
7756 invalid_name_hash_alg_size[6].pValue = x509_cert_der;
7757 invalid_name_hash_alg_size[6].ulValueLen = x509_cert_der_size;
7758
7759 assert(invalid_name_hash_alg_size[7].type == CKA_ISSUER);
7760 invalid_name_hash_alg_size[7].pValue = x509_issuer_name_der;
7761 invalid_name_hash_alg_size[7].ulValueLen = x509_issuer_name_der_size;
7762
7763 assert(invalid_name_hash_alg_size[8].type == CKA_SUBJECT);
7764 invalid_name_hash_alg_size[8].pValue = x509_subject_name_der;
7765 invalid_name_hash_alg_size[8].ulValueLen = x509_subject_name_der_size;
7766
7767 assert(invalid_name_hash_alg_size[9].type == CKA_SERIAL_NUMBER);
7768 invalid_name_hash_alg_size[9].pValue = x509_serial_number_der;
7769 invalid_name_hash_alg_size[9].ulValueLen = x509_serial_number_der_size;
7770
7771 rv = C_CreateObject(session, invalid_name_hash_alg_size,
7772 ARRAY_SIZE(invalid_name_hash_alg_size), &obj_hdl);
7773 if (!ADBG_EXPECT_CK_RESULT(c, CKR_ATTRIBUTE_VALUE_INVALID, rv))
7774 goto out;
7775
7776out:
7777 OPENSSL_free(x509_serial_number_der);
7778 OPENSSL_free(x509_issuer_name_der);
7779 OPENSSL_free(x509_subject_name_der);
7780 OPENSSL_free(x509_cert_der);
7781 X509_free(x509_cert);
7782 BIO_free(x509_bio);
7783
7784 Do_ADBG_EndSubCase(c, NULL);
7785close_session:
7786 ADBG_EXPECT_CK_OK(c, C_CloseSession(session));
7787close_lib:
7788 ADBG_EXPECT_CK_OK(c, close_lib());
7789#endif
7790}
7791ADBG_CASE_DEFINE(pkcs11, 1024, xtest_pkcs11_test_1024,
7792 "PKCS11: X509 Certificate operations");