blob: ad300e64b0896d762dc58af9c8ea80c0dad125c7 [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
Etienne Carrierefa7e34f2020-02-04 15:34:16 +01006#include <ck_debug.h>
Etienne Carriere109c1d72019-01-09 11:02:02 +01007#include <inttypes.h>
Etienne Carriere109c1d72019-01-09 11:02:02 +01008#include <pkcs11.h>
Etienne Carrierefa7e34f2020-02-04 15:34:16 +01009#include <stdio.h>
10#include <stdlib.h>
11#include <string.h>
Jens Wiklander5eac1932020-05-05 19:07:11 +020012#include <util.h>
Etienne Carriere109c1d72019-01-09 11:02:02 +010013
14#include "xtest_test.h"
15#include "xtest_helpers.h"
16
Etienne Carriere3b5558a2020-03-12 09:55:26 +010017/*
Jens Wiklander5eac1932020-05-05 19:07:11 +020018 * Some PKCS#11 object resources used in the tests
19 */
20static const CK_BYTE cktest_aes128_key[16];
21
22/*
Etienne Carriere3b5558a2020-03-12 09:55:26 +010023 * Util to find a slot on which to open a session
24 */
25static CK_RV close_lib(void)
26{
27 return C_Finalize(0);
28}
29
30static CK_RV init_lib_and_find_token_slot(CK_SLOT_ID *slot)
31{
32 CK_RV rv = CKR_GENERAL_ERROR;
33 CK_SLOT_ID_PTR slots = NULL;
34 CK_ULONG count = 0;
35
36 rv = C_Initialize(0);
37 if (rv)
38 return rv;
39
40 rv = C_GetSlotList(CK_TRUE, NULL, &count);
41 if (rv != CKR_OK)
42 goto bail;
43
44 if (count < 1) {
45 rv = CKR_GENERAL_ERROR;
46 goto bail;
47 }
48
49 slots = malloc(count * sizeof(CK_SLOT_ID));
50 if (!slots) {
51 rv = CKR_HOST_MEMORY;
52 goto bail;
53 }
54
55 rv = C_GetSlotList(CK_TRUE, slots, &count);
56 if (rv)
57 goto bail;
58
59 /* Use the last slot */
60 *slot = slots[count - 1];
61
62bail:
63 free(slots);
64 if (rv)
65 close_lib();
66
67 return rv;
68}
69
Etienne Carriere61f89d82020-03-11 11:24:29 +010070static void xtest_pkcs11_test_1000(ADBG_Case_t *c)
Etienne Carriere109c1d72019-01-09 11:02:02 +010071{
72 CK_RV rv;
73
74 rv = C_Initialize(NULL);
75 if (!ADBG_EXPECT_CK_OK(c, rv))
76 return;
77
78 rv = C_Finalize(NULL);
79 if (!ADBG_EXPECT_CK_OK(c, rv))
80 return;
81
82 rv = C_Initialize(NULL);
83 if (!ADBG_EXPECT_CK_OK(c, rv))
84 return;
85
86 rv = C_Initialize(NULL);
87 ADBG_EXPECT_CK_RESULT(c, CKR_CRYPTOKI_ALREADY_INITIALIZED, rv);
88
89 rv = C_Finalize(NULL);
90 ADBG_EXPECT_CK_OK(c, rv);
Etienne Carriere21f4e3c2020-02-05 15:40:24 +010091
92 rv = C_Finalize(NULL);
93 ADBG_EXPECT_CK_RESULT(c, CKR_CRYPTOKI_NOT_INITIALIZED, rv);
Etienne Carriere109c1d72019-01-09 11:02:02 +010094}
95
Etienne Carriere61f89d82020-03-11 11:24:29 +010096ADBG_CASE_DEFINE(pkcs11, 1000, xtest_pkcs11_test_1000,
97 "Initialize and close Cryptoki library");
Etienne Carrierefa7e34f2020-02-04 15:34:16 +010098
Etienne Carriere61f89d82020-03-11 11:24:29 +010099static void xtest_pkcs11_test_1001(ADBG_Case_t *c)
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100100{
101 CK_RV rv = CKR_GENERAL_ERROR;
102 CK_SLOT_ID_PTR slot_ids = NULL;
103 CK_ULONG slot_count = 0;
104 CK_ULONG present_slot_count = 0;
105 CK_INFO lib_info = { };
106 CK_SLOT_INFO slot_info = { };
Etienne Carriere6818d5f2020-03-04 15:34:50 +0100107 CK_TOKEN_INFO token_info = { };
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100108 CK_FUNCTION_LIST_PTR ckfunc_list = NULL;
109 size_t i = 0;
110 CK_SLOT_ID max_slot_id = 0;
Etienne Carriered3121292020-03-04 17:38:24 +0100111 CK_MECHANISM_TYPE_PTR mecha_types = NULL;
112 CK_ULONG mecha_count = 0;
113 CK_MECHANISM_INFO mecha_info = { };
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100114
115 rv = C_Initialize(NULL);
116 if (!ADBG_EXPECT_CK_OK(c, rv))
117 return;
118
Etienne Carrieree90a4e42020-03-02 12:04:08 +0100119 Do_ADBG_BeginSubCase(c, "Test C_GetFunctionList()");
120
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100121 rv = C_GetFunctionList(&ckfunc_list);
122 if (!ADBG_EXPECT_CK_OK(c, rv))
123 goto out;
124
125 if (!ADBG_EXPECT_NOT_NULL(c, ckfunc_list->C_GetInfo) ||
126 !ADBG_EXPECT_NOT_NULL(c, ckfunc_list->C_GetSlotList) ||
Etienne Carriere6818d5f2020-03-04 15:34:50 +0100127 !ADBG_EXPECT_NOT_NULL(c, ckfunc_list->C_GetSlotInfo) ||
Etienne Carriered3121292020-03-04 17:38:24 +0100128 !ADBG_EXPECT_NOT_NULL(c, ckfunc_list->C_GetTokenInfo) ||
129 !ADBG_EXPECT_NOT_NULL(c, ckfunc_list->C_GetMechanismList) ||
130 !ADBG_EXPECT_NOT_NULL(c, ckfunc_list->C_GetMechanismInfo))
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100131 goto out;
132
Etienne Carrieree90a4e42020-03-02 12:04:08 +0100133 Do_ADBG_EndSubCase(c, "Test C_GetFunctionList()");
134 Do_ADBG_BeginSubCase(c, "Test C_GetInfo()");
135
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100136 rv = C_GetInfo(&lib_info);
137 if (!ADBG_EXPECT_CK_OK(c, rv))
138 goto out;
139
Etienne Carrieree90a4e42020-03-02 12:04:08 +0100140 Do_ADBG_EndSubCase(c, "Test C_GetInfo()");
141 Do_ADBG_BeginSubCase(c, "Test C_GetSlotList()");
142
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100143 rv = C_GetSlotList(0, NULL, &slot_count);
144 if (!ADBG_EXPECT_CK_OK(c, rv))
145 goto out;
146
147 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, slot_count, !=, 0))
148 goto out;
149
Etienne Carrierede746332020-03-04 19:43:53 +0100150 if (slot_count > 1) {
151 /* Ensure case non-NULL-buffer and zero-count is tested */
152 CK_SLOT_ID id = 0;
153
154 slot_count = 0;
155 rv = C_GetSlotList(0, &id, &slot_count);
156 if (!ADBG_EXPECT_CK_RESULT(c, CKR_BUFFER_TOO_SMALL, rv))
157 goto out;
158 }
159
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100160 rv = C_GetSlotList(1, NULL, &present_slot_count);
161 if (!ADBG_EXPECT_CK_OK(c, rv))
162 goto out;
163
164 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, slot_count, ==,
165 present_slot_count))
166 goto out;
167
168 slot_ids = calloc(slot_count, sizeof(CK_SLOT_ID));
169 if (!ADBG_EXPECT_NOT_NULL(c, slot_ids))
170 goto out;
171
172 slot_count--;
173 rv = C_GetSlotList(1, slot_ids, &slot_count);
174 if (!ADBG_EXPECT_CK_RESULT(c, CKR_BUFFER_TOO_SMALL, rv))
175 goto out;
176
177 rv = C_GetSlotList(1, slot_ids, &slot_count);
178 if (!ADBG_EXPECT_CK_OK(c, rv))
179 goto out;
180
Etienne Carrieree90a4e42020-03-02 12:04:08 +0100181 Do_ADBG_EndSubCase(c, "Test C_GetSlotList()");
Etienne Carriere6818d5f2020-03-04 15:34:50 +0100182 Do_ADBG_BeginSubCase(c, "Test C_Get{Slot|Token}Info()");
Etienne Carrieree90a4e42020-03-02 12:04:08 +0100183
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100184 for (i = 0; i < slot_count; i++) {
185 CK_SLOT_ID slot = slot_ids[i];
186
187 rv = C_GetSlotInfo(slot, &slot_info);
188 if (!ADBG_EXPECT_CK_OK(c, rv))
189 goto out;
190
Etienne Carriere6818d5f2020-03-04 15:34:50 +0100191 rv = C_GetTokenInfo(slot, &token_info);
192 if (!ADBG_EXPECT_CK_OK(c, rv))
193 goto out;
194
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100195 if (max_slot_id < slot)
196 max_slot_id = slot;
197 }
198
Etienne Carriere6818d5f2020-03-04 15:34:50 +0100199 Do_ADBG_EndSubCase(c, "Test C_Get{Slot|Token}Info()");
Etienne Carriered3121292020-03-04 17:38:24 +0100200 Do_ADBG_BeginSubCase(c, "Test C_GetMechanism{List|Info}()");
201
202 for (i = 0; i < slot_count; i++) {
203 CK_SLOT_ID slot = slot_ids[i];
204 size_t j = 0;
205
206 mecha_count = 0;
207 rv = C_GetMechanismList(slot, NULL, &mecha_count);
208 if (!ADBG_EXPECT_CK_OK(c, rv))
209 goto out;
210
211 if (mecha_count == 0)
212 continue;
213
214 free(mecha_types);
215 mecha_types = calloc(mecha_count, sizeof(*mecha_types));
216 if (!ADBG_EXPECT_NOT_NULL(c, mecha_types))
217 goto out;
218
219 /* Test specific case: valid buffer reference with 0 count */
220 mecha_count = 0;
221 rv = C_GetMechanismList(slot, mecha_types, &mecha_count);
222 if (!ADBG_EXPECT_CK_RESULT(c, CKR_BUFFER_TOO_SMALL, rv))
223 goto out;
224
225 rv = C_GetMechanismList(slot, mecha_types, &mecha_count);
226 if (!ADBG_EXPECT_CK_OK(c, rv))
227 goto out;
228
229 for (j = 0; j < mecha_count; j++) {
230 rv = C_GetMechanismInfo(slot, mecha_types[j],
231 &mecha_info);
232 if (!ADBG_EXPECT_CK_OK(c, rv))
233 goto out;
234 }
235 }
236
237 Do_ADBG_EndSubCase(c, "Test C_GetMechanism{List|Info}()");
Etienne Carrieree90a4e42020-03-02 12:04:08 +0100238 Do_ADBG_BeginSubCase(c, "Test C_Get*Info() with invalid reference");
239
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100240 rv = C_GetSlotInfo(max_slot_id + 1, &slot_info);
241 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SLOT_ID_INVALID, rv))
242 goto out;
243
Etienne Carriere6818d5f2020-03-04 15:34:50 +0100244 rv = C_GetTokenInfo(max_slot_id + 1, &token_info);
245 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SLOT_ID_INVALID, rv))
246 goto out;
247
Etienne Carriered3121292020-03-04 17:38:24 +0100248 mecha_count = 1;
249 if (!mecha_types)
250 mecha_types = malloc(sizeof(*mecha_types));
251 if (!ADBG_EXPECT_NOT_NULL(c, mecha_types))
252 goto out;
253
254 rv = C_GetMechanismList(max_slot_id + 1, mecha_types, &mecha_count);
255 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SLOT_ID_INVALID, rv))
256 goto out;
257
258 rv = C_GetMechanismInfo(max_slot_id + 1, CKM_AES_KEY_GEN, &mecha_info);
259 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SLOT_ID_INVALID, rv))
260 goto out;
261
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100262 rv = C_GetSlotInfo(ULONG_MAX, &slot_info);
263 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SLOT_ID_INVALID, rv))
264 goto out;
265
Etienne Carriere6818d5f2020-03-04 15:34:50 +0100266 rv = C_GetTokenInfo(ULONG_MAX, &token_info);
267 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SLOT_ID_INVALID, rv))
268 goto out;
269
Etienne Carriered3121292020-03-04 17:38:24 +0100270 mecha_count = 1;
271 rv = C_GetMechanismList(ULONG_MAX, mecha_types, &mecha_count);
272 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SLOT_ID_INVALID, rv))
273 goto out;
274
275 rv = C_GetMechanismInfo(ULONG_MAX, CKM_AES_KEY_GEN, &mecha_info);
276 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SLOT_ID_INVALID, rv))
277 goto out;
278
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100279out:
Etienne Carrieree90a4e42020-03-02 12:04:08 +0100280 Do_ADBG_EndSubCase(c, NULL);
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100281 free(slot_ids);
Etienne Carriered3121292020-03-04 17:38:24 +0100282 free(mecha_types);
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100283
284 rv = C_Finalize(NULL);
285 ADBG_EXPECT_CK_OK(c, rv);
286}
287
Etienne Carriere61f89d82020-03-11 11:24:29 +0100288ADBG_CASE_DEFINE(pkcs11, 1001, xtest_pkcs11_test_1001,
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100289 "PKCS11: List PKCS#11 slots and get information from");
Etienne Carriere3b5558a2020-03-12 09:55:26 +0100290
291static void xtest_pkcs11_test_1002(ADBG_Case_t *c)
292{
293 CK_RV rv = CKR_GENERAL_ERROR;
294 CK_SLOT_ID slot = 0;
295 CK_SESSION_HANDLE session[3] = { 0 };
296 CK_FLAGS session_flags = 0;
297 CK_SESSION_INFO session_info = { };
298 CK_FUNCTION_LIST_PTR ckfunc_list = NULL;
299
300 rv = init_lib_and_find_token_slot(&slot);
301 if (!ADBG_EXPECT_CK_OK(c, rv))
302 return;
303
304 rv = C_GetFunctionList(&ckfunc_list);
305 if (!ADBG_EXPECT_CK_OK(c, rv) ||
306 !ADBG_EXPECT_NOT_NULL(c, ckfunc_list->C_OpenSession) ||
307 !ADBG_EXPECT_NOT_NULL(c, ckfunc_list->C_CloseSession) ||
308 !ADBG_EXPECT_NOT_NULL(c, ckfunc_list->C_CloseAllSessions) ||
309 !ADBG_EXPECT_NOT_NULL(c, ckfunc_list->C_GetSessionInfo))
310 goto bail;
311
312 Do_ADBG_BeginSubCase(c, "Test C_OpenSession()/C_GetSessionInfo()");
313
314 session_flags = CKF_RW_SESSION;
315
316 rv = C_OpenSession(slot, session_flags, NULL, 0, &session[0]);
317 if (!ADBG_EXPECT_CK_RESULT(c, CKR_ARGUMENTS_BAD, rv))
318 goto bail;
319
320 session_flags = CKF_SERIAL_SESSION;
321
322 rv = C_OpenSession(slot, session_flags, NULL, 0, &session[0]);
323 if (!ADBG_EXPECT_CK_OK(c, rv))
324 goto bail;
325
326 rv = C_GetSessionInfo(session[0], &session_info);
327 if (!ADBG_EXPECT_CK_OK(c, rv) ||
328 !ADBG_EXPECT_COMPARE_UNSIGNED(c, session_info.slotID, ==, slot) ||
329 !ADBG_EXPECT_COMPARE_UNSIGNED(c, session_info.flags, ==,
330 session_flags) ||
331 !ADBG_EXPECT_COMPARE_UNSIGNED(c, session_info.state, ==,
332 CKS_RO_PUBLIC_SESSION) ||
333 !ADBG_EXPECT_COMPARE_UNSIGNED(c, session_info.ulDeviceError, ==, 0))
334 goto bail;
335
336 session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
337
338 rv = C_OpenSession(slot, session_flags, NULL, 0, &session[1]);
339 if (!ADBG_EXPECT_CK_OK(c, rv))
340 goto bail;
341
342 rv = C_GetSessionInfo(session[1], &session_info);
343 if (!ADBG_EXPECT_CK_OK(c, rv) ||
344 !ADBG_EXPECT_COMPARE_UNSIGNED(c, session_info.slotID, ==, slot) ||
345 !ADBG_EXPECT_COMPARE_UNSIGNED(c, session_info.flags, ==,
346 session_flags) ||
347 !ADBG_EXPECT_COMPARE_UNSIGNED(c, session_info.state, ==,
348 CKS_RW_PUBLIC_SESSION) ||
349 !ADBG_EXPECT_COMPARE_UNSIGNED(c, session_info.ulDeviceError, ==, 0))
350 goto bail;
351
352 rv = C_OpenSession(slot, session_flags, NULL, 0, &session[2]);
353 if (!ADBG_EXPECT_CK_OK(c, rv))
354 goto bail;
355
356 rv = C_GetSessionInfo(session[2], &session_info);
357 if (!ADBG_EXPECT_CK_OK(c, rv) ||
358 !ADBG_EXPECT_COMPARE_UNSIGNED(c, session_info.slotID, ==, slot) ||
359 !ADBG_EXPECT_COMPARE_UNSIGNED(c, session_info.flags, ==,
360 session_flags) ||
361 !ADBG_EXPECT_COMPARE_UNSIGNED(c, session_info.state, ==,
362 CKS_RW_PUBLIC_SESSION) ||
363 !ADBG_EXPECT_COMPARE_UNSIGNED(c, session_info.ulDeviceError, ==, 0))
364 goto bail;
365
366 Do_ADBG_EndSubCase(c, "Test C_OpenSession()/C_GetSessionInfo()");
367 Do_ADBG_BeginSubCase(c, "Test C_CloseSession()");
368
369 /* Close 2 of them */
370 rv = C_CloseSession(session[0]);
371 if (!ADBG_EXPECT_CK_OK(c, rv))
372 goto bail;
373
374 rv = C_GetSessionInfo(session[0], &session_info);
375 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SESSION_HANDLE_INVALID, rv))
376 goto bail;
377
378 rv = C_GetSessionInfo(session[1], &session_info);
379 if (!ADBG_EXPECT_CK_OK(c, rv))
380 goto bail;
381
382 rv = C_GetSessionInfo(session[2], &session_info);
383 if (!ADBG_EXPECT_CK_OK(c, rv))
384 goto bail;
385
386 /* Close all remaining sessions, later calls should failed on session */
387 rv = C_CloseAllSessions(slot);
388 if (!ADBG_EXPECT_CK_OK(c, rv))
389 goto bail;
390
391 rv = C_CloseSession(session[1]);
392 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SESSION_HANDLE_INVALID, rv))
393 goto bail;
394
395 rv = C_CloseSession(session[2]);
396 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SESSION_HANDLE_INVALID, rv))
397 goto bail;
398
399 rv = C_GetSessionInfo(session[1], &session_info);
400 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SESSION_HANDLE_INVALID, rv))
401 goto bail;
402
403 rv = C_GetSessionInfo(session[2], &session_info);
404 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SESSION_HANDLE_INVALID, rv))
405 goto bail;
406
407 /* Open a session, should be closed from library closure */
408 rv = C_OpenSession(slot, session_flags, NULL, 0, &session[0]);
409 if (!ADBG_EXPECT_CK_OK(c, rv))
410 goto bail;
411
412bail:
413 Do_ADBG_EndSubCase(c, NULL);
414 rv = close_lib();
415 ADBG_EXPECT_CK_OK(c, rv);
416}
417
418ADBG_CASE_DEFINE(pkcs11, 1002, xtest_pkcs11_test_1002,
419 "PKCS11: Open and close PKCS#11 sessions");
Jens Wiklander14f8e8d2020-04-14 17:01:24 +0200420
421/*
422 * Helpers for tests where we must log into the token.
423 * These define the genuine PINs and label to be used with the test token.
424 */
425static CK_UTF8CHAR test_token_so_pin[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8 , 9, 10, };
Jens Wiklander282a8a52020-04-14 17:01:36 +0200426static CK_UTF8CHAR test_token_user_pin[] = {
427 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
428};
Jens Wiklander14f8e8d2020-04-14 17:01:24 +0200429static CK_UTF8CHAR test_token_label[] = "PKCS11 TA test token";
430
431static CK_RV init_test_token(CK_SLOT_ID slot)
432{
433 return C_InitToken(slot, test_token_so_pin, sizeof(test_token_so_pin),
434 test_token_label);
435}
436
Jens Wiklander282a8a52020-04-14 17:01:36 +0200437/* Login as user, eventually reset user PIN if needed */
438static CK_RV init_user_test_token(CK_SLOT_ID slot)
439{
440 CK_FLAGS session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
441 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
442 CK_RV rv = CKR_GENERAL_ERROR;
443
444 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
445 if (rv)
446 return rv;
447
448 rv = C_Login(session, CKU_USER, test_token_user_pin,
449 sizeof(test_token_user_pin));
450 if (rv == CKR_OK) {
451 C_Logout(session);
452 C_CloseSession(session);
453 return rv;
454 }
455
456 rv = C_Login(session, CKU_SO, test_token_so_pin,
457 sizeof(test_token_so_pin));
458 if (rv) {
459 C_CloseSession(session);
460
461 rv = init_test_token(slot);
462 if (rv)
463 return rv;
464
465 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
466 if (rv)
467 return rv;
468
469 rv = C_Login(session, CKU_SO, test_token_so_pin,
470 sizeof(test_token_so_pin));
471 if (rv) {
472 C_CloseSession(session);
473 return rv;
474 }
475 }
476
477 rv = C_InitPIN(session, test_token_user_pin,
478 sizeof(test_token_user_pin));
479
480 C_Logout(session);
481 C_CloseSession(session);
482
483 return rv;
484}
485
Jens Wiklander14f8e8d2020-04-14 17:01:24 +0200486static CK_RV test_already_initialized_token(ADBG_Case_t *c, CK_SLOT_ID slot)
487{
488 CK_RV rv = CKR_GENERAL_ERROR;
489 CK_TOKEN_INFO token_info = { };
490 /* Same content as test_token_so_pin[] but 1 more byte */
491 CK_UTF8CHAR pin1[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, };
492 /* Same content as test_token_so_pin[] but 1 different byte */
493 CK_UTF8CHAR pin2[] = { 0, 1, 2, 3, 4, 5, 6, 6, 8, 9, 10, };
494 CK_FLAGS flags = 0;
495
496 Do_ADBG_BeginSubCase(c, "C_InitToken() on initialized token");
497
498 rv = C_GetTokenInfo(slot, &token_info);
499 if (!ADBG_EXPECT_CK_OK(c, rv))
500 goto out;
501
502 rv = C_InitToken(slot, test_token_so_pin,
503 sizeof(test_token_so_pin) - 1, test_token_label);
504 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, rv, !=, CKR_OK))
505 goto out;
506
507 rv = C_InitToken(slot, pin1, sizeof(pin1), test_token_label);
508 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, rv, !=, CKR_OK))
509 goto out;
510
511 rv = C_InitToken(slot, pin2, sizeof(pin2), test_token_label);
512 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, rv, !=, CKR_OK))
513 goto out;
514
515 rv = C_GetTokenInfo(slot, &token_info);
516 if (!ADBG_EXPECT_CK_OK(c, rv))
517 goto out;
518
519 flags = token_info.flags;
520
521 /* Token should have set CKF_SO_PIN_COUNT_LOW to 1 */
522 if (!ADBG_EXPECT_TRUE(c, !!(flags & CKF_SO_PIN_COUNT_LOW))) {
523 rv = CKR_GENERAL_ERROR;
524 goto out;
525 }
526
527 rv = init_test_token(slot);
528 if (!ADBG_EXPECT_CK_OK(c, rv))
529 goto out;
530
531 rv = C_GetTokenInfo(slot, &token_info);
532 if (!ADBG_EXPECT_CK_OK(c, rv))
533 goto out;
534
535 flags = token_info.flags;
536
537 /*
538 * Token should have reset CKF_SO_PIN_COUNT_LOW to 0.
539 * Other flags should show a sane initialized state.
540 */
541 if (!ADBG_EXPECT_TRUE(c, !(flags & CKF_SO_PIN_COUNT_LOW)) ||
542 !ADBG_EXPECT_TRUE(c, !!(flags & CKF_TOKEN_INITIALIZED)) ||
543 !ADBG_EXPECT_TRUE(c, !(flags & CKF_ERROR_STATE)) ||
544 !ADBG_EXPECT_TRUE(c, !(flags & CKF_USER_PIN_INITIALIZED))) {
545 rv = CKR_GENERAL_ERROR;
Jens Wiklander282a8a52020-04-14 17:01:36 +0200546 goto out;
547 }
548
549 rv = init_user_test_token(slot);
550 if (!ADBG_EXPECT_CK_OK(c, rv))
551 goto out;
552
553 rv = C_GetTokenInfo(slot, &token_info);
554 if (!ADBG_EXPECT_CK_OK(c, rv))
555 goto out;
556
557 flags = token_info.flags;
558
559 if (!ADBG_EXPECT_TRUE(c, !(flags & CKF_USER_PIN_COUNT_LOW)) ||
560 !ADBG_EXPECT_TRUE(c, !(flags & CKF_USER_PIN_FINAL_TRY)) ||
561 !ADBG_EXPECT_TRUE(c, !(flags & CKF_USER_PIN_LOCKED)) ||
562 !ADBG_EXPECT_TRUE(c, !(flags & CKF_USER_PIN_TO_BE_CHANGED)) ||
563 !ADBG_EXPECT_TRUE(c, !!(flags & CKF_USER_PIN_INITIALIZED)) ||
564 !ADBG_EXPECT_TRUE(c, !(flags & CKF_ERROR_STATE))) {
565 rv = CKR_GENERAL_ERROR;
566 goto out;
Jens Wiklander14f8e8d2020-04-14 17:01:24 +0200567 }
568
569out:
570 Do_ADBG_EndSubCase(c, "C_InitToken() on initialized token");
571
572 return rv;
573}
574
575static CK_RV test_uninitialized_token(ADBG_Case_t *c, CK_SLOT_ID slot)
576{
577 CK_RV rv = CKR_GENERAL_ERROR;
578 CK_TOKEN_INFO token_info = { };
579 CK_FLAGS flags = 0;
580
581 Do_ADBG_BeginSubCase(c, "C_InitToken() on uninitialized token");
582
583 rv = init_test_token(slot);
584 if (!ADBG_EXPECT_CK_OK(c, rv))
585 goto out;
586
587 rv = C_GetTokenInfo(slot, &token_info);
588 if (!ADBG_EXPECT_CK_OK(c, rv))
589 goto out;
590
591 flags = token_info.flags;
592
593 if (!ADBG_EXPECT_TRUE(c, !!(flags & CKF_TOKEN_INITIALIZED)) ||
594 !ADBG_EXPECT_TRUE(c, !(flags & CKF_ERROR_STATE)) ||
595 !ADBG_EXPECT_TRUE(c, !(flags & CKF_USER_PIN_INITIALIZED))) {
596 rv = CKR_GENERAL_ERROR;
Jens Wiklander282a8a52020-04-14 17:01:36 +0200597 goto out;
Jens Wiklander14f8e8d2020-04-14 17:01:24 +0200598 }
599
Jens Wiklander282a8a52020-04-14 17:01:36 +0200600 rv = init_user_test_token(slot);
601 if (!ADBG_EXPECT_CK_OK(c, rv))
602 goto out;
603
604 rv = C_GetTokenInfo(slot, &token_info);
605 if (!ADBG_EXPECT_CK_OK(c, rv))
606 goto out;
607
608 flags = token_info.flags;
609
610 if (!ADBG_EXPECT_TRUE(c, !!(flags & CKF_TOKEN_INITIALIZED)) ||
611 !ADBG_EXPECT_TRUE(c, !(flags & CKF_USER_PIN_COUNT_LOW)) ||
612 !ADBG_EXPECT_TRUE(c, !(flags & CKF_USER_PIN_FINAL_TRY)) ||
613 !ADBG_EXPECT_TRUE(c, !(flags & CKF_USER_PIN_LOCKED)) ||
614 !ADBG_EXPECT_TRUE(c, !(flags & CKF_USER_PIN_TO_BE_CHANGED)) ||
615 !ADBG_EXPECT_TRUE(c, !!(flags & CKF_USER_PIN_INITIALIZED)) ||
616 !ADBG_EXPECT_TRUE(c, !(flags & CKF_ERROR_STATE)))
617 rv = CKR_GENERAL_ERROR;
618
Jens Wiklander14f8e8d2020-04-14 17:01:24 +0200619out:
620 Do_ADBG_EndSubCase(c, "C_InitToken() on uninitialized token");
621
622 return rv;
623}
624
Jens Wiklanderaa741512020-04-14 17:01:46 +0200625static CK_RV test_login_logout(ADBG_Case_t *c, CK_SLOT_ID slot)
626{
627 CK_FLAGS session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
628 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
629 CK_RV rv = CKR_GENERAL_ERROR;
630
631 Do_ADBG_BeginSubCase(c, "Test C_Login()/C_Logout()");
632
633 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
634 if (!ADBG_EXPECT_CK_OK(c, rv))
635 goto out;
636
637 /* Logout: should fail as we did not log in yet */
638 rv = C_Logout(session);
639 ADBG_EXPECT_CK_RESULT(c, CKR_USER_NOT_LOGGED_IN, rv);
640
641 /* Login/re-log/logout user */
642 rv = C_Login(session, CKU_USER, test_token_user_pin,
643 sizeof(test_token_user_pin));
644 if (!ADBG_EXPECT_CK_OK(c, rv))
645 goto out;
646
647 rv = C_Login(session, CKU_USER, test_token_user_pin,
648 sizeof(test_token_user_pin));
649 ADBG_EXPECT_CK_RESULT(c, CKR_USER_ALREADY_LOGGED_IN, rv);
650
651 rv = C_Logout(session);
652 if (!ADBG_EXPECT_CK_OK(c, rv))
653 goto out;
654
655 /* Login/re-log/logout security officer */
656 rv = C_Login(session, CKU_SO, test_token_so_pin,
657 sizeof(test_token_so_pin));
658 if (!ADBG_EXPECT_CK_OK(c, rv))
659 goto out;
660
661 rv = C_Login(session, CKU_SO, test_token_so_pin,
662 sizeof(test_token_so_pin));
663 ADBG_EXPECT_CK_RESULT(c, CKR_USER_ALREADY_LOGGED_IN, rv);
664
665 rv = C_Logout(session);
666 if (!ADBG_EXPECT_CK_OK(c, rv))
667 goto out;
668
669 /* Login user then SO and reverse */
670 rv = C_Login(session, CKU_SO, test_token_so_pin,
671 sizeof(test_token_so_pin));
672 ADBG_EXPECT_CK_OK(c, rv);
673
674 rv = C_Login(session, CKU_USER, test_token_user_pin,
675 sizeof(test_token_user_pin));
676 ADBG_EXPECT_CK_RESULT(c, CKR_USER_ANOTHER_ALREADY_LOGGED_IN, rv);
677
678 rv = C_Logout(session);
679 if (!ADBG_EXPECT_CK_OK(c, rv))
680 goto out;
681
682 rv = C_Login(session, CKU_USER, test_token_user_pin,
683 sizeof(test_token_user_pin));
684 ADBG_EXPECT_CK_OK(c, rv);
685
686 rv = C_Login(session, CKU_SO, test_token_so_pin,
687 sizeof(test_token_so_pin));
688 ADBG_EXPECT_CK_RESULT(c, CKR_USER_ANOTHER_ALREADY_LOGGED_IN, rv);
689
690 rv = C_Logout(session);
691 ADBG_EXPECT_CK_OK(c, rv);
692
693 /* Login context specifc, in an invalid case (need an operation) */
694 rv = C_Login(session, CKU_CONTEXT_SPECIFIC, test_token_user_pin,
695 sizeof(test_token_user_pin));
696 ADBG_EXPECT_CK_RESULT(c, CKR_OPERATION_NOT_INITIALIZED, rv);
697
698 rv = C_CloseSession(session);
699 ADBG_EXPECT_CK_OK(c, rv);
700
701out:
702 Do_ADBG_EndSubCase(c, "Test C_Login()/C_Logout()");
703 return rv;
704}
705
Jens Wiklander6ce1e692020-04-14 17:02:09 +0200706static CK_RV test_set_pin(ADBG_Case_t *c, CK_SLOT_ID slot,
707 CK_USER_TYPE user_type)
708{
709 CK_FLAGS session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
710 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
711 CK_UTF8CHAR some_pin[] = { 7, 6, 5, 4, 3, 2, 1, 2, 3, 4, 5, 6, 7 };
712 CK_UTF8CHAR_PTR old_pin = NULL;
713 CK_USER_TYPE ut = user_type;
714 size_t old_pin_sz = 0;
715 CK_RV rv2 = CKR_OK;
716 CK_RV rv = CKR_OK;
717
718 Do_ADBG_BeginSubCase(c, "Test C_SetPIN() user_type %lu", user_type);
719
720 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
721 if (!ADBG_EXPECT_CK_OK(c, rv))
722 goto out;
723
724 if (user_type == CKU_SO) {
725 old_pin = (CK_UTF8CHAR_PTR)test_token_so_pin;
726 old_pin_sz = sizeof(test_token_so_pin);
727 } else {
728 old_pin = (CK_UTF8CHAR_PTR)test_token_user_pin;
729 old_pin_sz = sizeof(test_token_user_pin);
730 ut = CKU_USER;
731 }
732
733 if (ut == user_type) {
734 rv = C_Login(session, ut, old_pin, old_pin_sz);
735 if (!ADBG_EXPECT_CK_OK(c, rv))
736 goto out_session;
737 }
738
739 rv = C_SetPIN(session, old_pin, old_pin_sz, some_pin, sizeof(some_pin));
740 if (!ADBG_EXPECT_CK_OK(c, rv)) {
741 if (ut == user_type)
742 goto out_logout;
743 else
744 goto out_session;
745 }
746
747 if (ut == user_type) {
748 rv = C_Logout(session);
749 if (!ADBG_EXPECT_CK_OK(c, rv))
750 goto out_session;
751 }
752
753 rv = C_Login(session, ut, some_pin, sizeof(some_pin));
754 if (!ADBG_EXPECT_CK_OK(c, rv))
755 goto out_session;
756
757 rv = C_SetPIN(session, some_pin, sizeof(some_pin), old_pin, old_pin_sz);
758 ADBG_EXPECT_CK_OK(c, rv);
759
760out_logout:
761 rv2 = C_Logout(session);
762 if (!ADBG_EXPECT_CK_OK(c, rv2) && !rv)
763 rv = rv2;
764out_session:
765 rv2 = C_CloseSession(session);
766 if (!ADBG_EXPECT_CK_OK(c, rv2) && !rv)
767 rv = rv2;
768out:
769 Do_ADBG_EndSubCase(c, "Test C_SetPIN() user_type %lu", user_type);
770
771 return rv;
772}
773
Jens Wiklander14f8e8d2020-04-14 17:01:24 +0200774static void xtest_pkcs11_test_1003(ADBG_Case_t *c)
775{
776 CK_RV rv = CKR_GENERAL_ERROR;
777 CK_FUNCTION_LIST_PTR ckfunc_list = NULL;
778 CK_SLOT_ID slot = 0;
779 CK_TOKEN_INFO token_info = { };
780
781 rv = C_GetFunctionList(&ckfunc_list);
782 if (!ADBG_EXPECT_CK_OK(c, rv) ||
Jens Wiklander282a8a52020-04-14 17:01:36 +0200783 !ADBG_EXPECT_NOT_NULL(c, ckfunc_list->C_InitToken) ||
784 !ADBG_EXPECT_NOT_NULL(c, ckfunc_list->C_InitPIN) ||
Jens Wiklanderaa741512020-04-14 17:01:46 +0200785 !ADBG_EXPECT_NOT_NULL(c, ckfunc_list->C_SetPIN) ||
786 !ADBG_EXPECT_NOT_NULL(c, ckfunc_list->C_Login) ||
787 !ADBG_EXPECT_NOT_NULL(c, ckfunc_list->C_Logout))
Jens Wiklander14f8e8d2020-04-14 17:01:24 +0200788 goto out;
789
790 rv = init_lib_and_find_token_slot(&slot);
791 if (!ADBG_EXPECT_CK_OK(c, rv))
792 return;
793
794 rv = C_GetTokenInfo(slot, &token_info);
795 if (!ADBG_EXPECT_CK_OK(c, rv))
796 goto out;
797
798 /* Abort test if token is about to lock */
799 if (!ADBG_EXPECT_TRUE(c, !(token_info.flags & CKF_SO_PIN_FINAL_TRY)))
800 goto out;
801
802 if (!(token_info.flags & CKF_TOKEN_INITIALIZED)) {
803 rv = test_uninitialized_token(c, slot);
804 if (rv != CKR_OK)
805 goto out;
806 }
807
808 rv = test_already_initialized_token(c, slot);
809 if (rv != CKR_OK)
810 goto out;
811
Jens Wiklanderaa741512020-04-14 17:01:46 +0200812 rv = test_login_logout(c, slot);
813 if (rv != CKR_OK)
814 goto out;
815
Jens Wiklander6ce1e692020-04-14 17:02:09 +0200816 rv = test_set_pin(c, slot, CKU_USER);
817 if (rv != CKR_OK)
818 goto out;
Jens Wiklanderaa741512020-04-14 17:01:46 +0200819
Jens Wiklander6ce1e692020-04-14 17:02:09 +0200820 rv = test_set_pin(c, slot, CKU_SO);
821 if (rv != CKR_OK)
822 goto out;
Jens Wiklanderaa741512020-04-14 17:01:46 +0200823
Jens Wiklander6ce1e692020-04-14 17:02:09 +0200824 /*
825 * CKU_CONTEXT_SPECIFIC is anything not CKU_USER or CKU_SO in order
826 * to skip the initial login.
827 */
828 test_set_pin(c, slot, CKU_CONTEXT_SPECIFIC);
Jens Wiklander14f8e8d2020-04-14 17:01:24 +0200829out:
830 rv = close_lib();
831 ADBG_EXPECT_CK_OK(c, rv);
832}
833
834ADBG_CASE_DEFINE(pkcs11, 1003, xtest_pkcs11_test_1003,
835 "PKCS11: Login to PKCS#11 token");
Jens Wiklander5eac1932020-05-05 19:07:11 +0200836
837static CK_ATTRIBUTE cktest_token_object[] = {
838 { CKA_DECRYPT, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
839 { CKA_TOKEN, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
840 { CKA_MODIFIABLE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
841 { CKA_CLASS, &(CK_OBJECT_CLASS){CKO_SECRET_KEY},
842 sizeof(CK_OBJECT_CLASS) },
843 { CKA_KEY_TYPE, &(CK_KEY_TYPE){CKK_AES}, sizeof(CK_KEY_TYPE) },
844 { CKA_VALUE, (void *)cktest_aes128_key, sizeof(cktest_aes128_key) },
845};
846
847static CK_ATTRIBUTE cktest_session_object[] = {
848 { CKA_DECRYPT, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
849 { CKA_TOKEN, &(CK_BBOOL){CK_FALSE}, sizeof(CK_BBOOL) },
850 { CKA_MODIFIABLE, &(CK_BBOOL){CK_TRUE}, sizeof(CK_BBOOL) },
851 { CKA_KEY_TYPE, &(CK_KEY_TYPE){CKK_AES}, sizeof(CK_KEY_TYPE) },
852 { CKA_CLASS, &(CK_OBJECT_CLASS){CKO_SECRET_KEY},
853 sizeof(CK_OBJECT_CLASS) },
854 { CKA_VALUE, (void *)cktest_aes128_key, sizeof(cktest_aes128_key) },
855};
856
857/* Create session object and token object from a session */
858static void test_create_destroy_single_object(ADBG_Case_t *c, bool persistent)
859{
860 CK_RV rv = CKR_GENERAL_ERROR;
861 CK_SLOT_ID slot = 0;
862 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
863 CK_OBJECT_HANDLE obj_hdl = CK_INVALID_HANDLE;
864 CK_FLAGS session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
865
866 rv = init_lib_and_find_token_slot(&slot);
867 if (!ADBG_EXPECT_CK_OK(c, rv))
868 return;
869
870 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
871 if (!ADBG_EXPECT_CK_OK(c, rv))
872 goto out;
873
874 if (persistent) {
875 rv = C_CreateObject(session, cktest_token_object,
876 ARRAY_SIZE(cktest_token_object),
877 &obj_hdl);
878 } else {
879 rv = C_CreateObject(session, cktest_session_object,
880 ARRAY_SIZE(cktest_session_object),
881 &obj_hdl);
882 }
883
884 if (!ADBG_EXPECT_CK_OK(c, rv))
885 goto out;
886
887 rv = C_DestroyObject(session, obj_hdl);
888 ADBG_EXPECT_CK_OK(c, rv);
889out:
890 rv = C_CloseSession(session);
891 ADBG_EXPECT_CK_OK(c, rv);
892
893 rv = close_lib();
894 ADBG_EXPECT_CK_OK(c, rv);
895}
896
897static void test_create_destroy_session_objects(ADBG_Case_t *c)
898{
899 CK_RV rv = CKR_GENERAL_ERROR;
900 CK_SLOT_ID slot = 0;
901 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
902 CK_OBJECT_HANDLE obj_hdl[512] = { 0 };
903 CK_FLAGS session_flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
904 size_t n = 0;
905
906 for (n = 0; n < ARRAY_SIZE(obj_hdl); n++)
907 obj_hdl[n] = CK_INVALID_HANDLE;
908
909 rv = init_lib_and_find_token_slot(&slot);
910 if (!ADBG_EXPECT_CK_OK(c, rv))
911 return;
912
913 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
914 if (!ADBG_EXPECT_CK_OK(c, rv))
915 goto out;
916
917 for (n = 0; n < ARRAY_SIZE(obj_hdl); n++) {
918 rv = C_CreateObject(session, cktest_session_object,
919 ARRAY_SIZE(cktest_session_object),
920 obj_hdl + n);
921
922 if (rv == CKR_DEVICE_MEMORY || !ADBG_EXPECT_CK_OK(c, rv))
923 break;
924 }
925
926 Do_ADBG_Log(" created object count: %zu", n);
927
928 rv = C_CloseSession(session);
929 ADBG_EXPECT_CK_OK(c, rv);
930
931 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
932 if (!ADBG_EXPECT_CK_OK(c, rv))
933 goto out;
934
935 rv = C_CreateObject(session, cktest_session_object,
936 ARRAY_SIZE(cktest_session_object),
937 obj_hdl);
938
939 ADBG_EXPECT_CK_OK(c, rv);
940
941out:
942 rv = C_CloseSession(session);
943 ADBG_EXPECT_CK_OK(c, rv);
944
945 rv = close_lib();
946 ADBG_EXPECT_CK_OK(c, rv);
947}
948
949/* Create session object and token object from a session */
950static void test_create_objects_in_session(ADBG_Case_t *c, bool readwrite)
951{
952 CK_RV rv = CKR_GENERAL_ERROR;
953 CK_SLOT_ID slot = 0;
954 CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
955 CK_OBJECT_HANDLE token_obj_hld = CK_INVALID_HANDLE;
956 CK_OBJECT_HANDLE session_obj_hld = CK_INVALID_HANDLE;
957 CK_FLAGS session_flags = CKF_SERIAL_SESSION;
958
959 rv = init_lib_and_find_token_slot(&slot);
960 if (!ADBG_EXPECT_CK_OK(c, rv))
961 return;
962
963 if (readwrite)
964 session_flags |= CKF_RW_SESSION;
965
966 rv = C_OpenSession(slot, session_flags, NULL, 0, &session);
967 if (!ADBG_EXPECT_CK_OK(c, rv))
968 goto out;
969
970 rv = C_CreateObject(session, cktest_token_object,
971 ARRAY_SIZE(cktest_token_object),
972 &token_obj_hld);
973
974 if (readwrite) {
975 if (!ADBG_EXPECT_CK_OK(c, rv))
976 goto out;
977 } else {
978 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SESSION_READ_ONLY, rv))
979 goto out;
980 }
981
982 rv = C_CreateObject(session, cktest_session_object,
983 ARRAY_SIZE(cktest_session_object),
984 &session_obj_hld);
985
986 if (!ADBG_EXPECT_CK_OK(c, rv))
987 goto out_tobj;
988
989 rv = C_DestroyObject(session, session_obj_hld);
990 ADBG_EXPECT_CK_OK(c, rv);
991
992out_tobj:
993 if (readwrite) {
994 rv = C_DestroyObject(session, token_obj_hld);
995 ADBG_EXPECT_CK_OK(c, rv);
996 }
997out:
998 rv = C_CloseSession(session);
999 ADBG_EXPECT_CK_OK(c, rv);
1000
1001 rv = close_lib();
1002 ADBG_EXPECT_CK_OK(c, rv);
1003}
1004
1005static void xtest_pkcs11_test_1004(ADBG_Case_t *c)
1006{
1007 Do_ADBG_BeginSubCase(c, "Create and destroy a volatile object");
1008 test_create_destroy_single_object(c, false /*!persistent*/);
1009 Do_ADBG_EndSubCase(c, "Create and destroy a volatile object");
1010
1011 Do_ADBG_BeginSubCase(c, "Create and destroy a persistent object");
1012 test_create_destroy_single_object(c, true /*persistent*/);
1013 Do_ADBG_EndSubCase(c, "Create and destroy a persistent object");
1014
1015 Do_ADBG_BeginSubCase(c, "Create and destroy many session objects");
1016 test_create_destroy_session_objects(c);
1017 Do_ADBG_EndSubCase(c, "Create and destroy many session objects");
1018
1019 Do_ADBG_BeginSubCase(c, "Create objects in a read-only session");
1020 test_create_objects_in_session(c, false /*!readwrite*/);
1021 Do_ADBG_EndSubCase(c, "Create objects in a read-only session");
1022
1023 Do_ADBG_BeginSubCase(c, "Create objects in a read/write session");
1024 test_create_objects_in_session(c, true /*readwrite*/);
1025 Do_ADBG_EndSubCase(c, "Create objects in a read/write session");
1026}
1027
1028ADBG_CASE_DEFINE(pkcs11, 1004, xtest_pkcs11_test_1004,
1029 "PKCS11: create/destroy PKCS#11 simple objects");