blob: 329f4045340e564b8737d35ef013968f50ce82d2 [file] [log] [blame]
Etienne Carriere109c1d72019-01-09 11:02:02 +01001/*
2 * Copyright (c) 2018, Linaro Limited
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License Version 2 as
6 * published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 */
13
Etienne Carrierefa7e34f2020-02-04 15:34:16 +010014#include <ck_debug.h>
Etienne Carriere109c1d72019-01-09 11:02:02 +010015#include <inttypes.h>
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>
Etienne Carriere109c1d72019-01-09 11:02:02 +010020
21#include "xtest_test.h"
22#include "xtest_helpers.h"
23
24static void xtest_tee_test_1000(ADBG_Case_t *c)
25{
26 CK_RV rv;
27
28 rv = C_Initialize(NULL);
29 if (!ADBG_EXPECT_CK_OK(c, rv))
30 return;
31
32 rv = C_Finalize(NULL);
33 if (!ADBG_EXPECT_CK_OK(c, rv))
34 return;
35
36 rv = C_Initialize(NULL);
37 if (!ADBG_EXPECT_CK_OK(c, rv))
38 return;
39
40 rv = C_Initialize(NULL);
41 ADBG_EXPECT_CK_RESULT(c, CKR_CRYPTOKI_ALREADY_INITIALIZED, rv);
42
43 rv = C_Finalize(NULL);
44 ADBG_EXPECT_CK_OK(c, rv);
Etienne Carriere21f4e3c2020-02-05 15:40:24 +010045
46 rv = C_Finalize(NULL);
47 ADBG_EXPECT_CK_RESULT(c, CKR_CRYPTOKI_NOT_INITIALIZED, rv);
Etienne Carriere109c1d72019-01-09 11:02:02 +010048}
49
50ADBG_CASE_DEFINE(pkcs11, 1000, xtest_tee_test_1000,
51 "Initialize and close Cryptoki library");
Etienne Carrierefa7e34f2020-02-04 15:34:16 +010052
53static void xtest_tee_test_1001(ADBG_Case_t *c)
54{
55 CK_RV rv = CKR_GENERAL_ERROR;
56 CK_SLOT_ID_PTR slot_ids = NULL;
57 CK_ULONG slot_count = 0;
58 CK_ULONG present_slot_count = 0;
59 CK_INFO lib_info = { };
60 CK_SLOT_INFO slot_info = { };
Etienne Carriere6818d5f2020-03-04 15:34:50 +010061 CK_TOKEN_INFO token_info = { };
Etienne Carrierefa7e34f2020-02-04 15:34:16 +010062 CK_FUNCTION_LIST_PTR ckfunc_list = NULL;
63 size_t i = 0;
64 CK_SLOT_ID max_slot_id = 0;
65
66 rv = C_Initialize(NULL);
67 if (!ADBG_EXPECT_CK_OK(c, rv))
68 return;
69
Etienne Carrieree90a4e42020-03-02 12:04:08 +010070 Do_ADBG_BeginSubCase(c, "Test C_GetFunctionList()");
71
Etienne Carrierefa7e34f2020-02-04 15:34:16 +010072 rv = C_GetFunctionList(&ckfunc_list);
73 if (!ADBG_EXPECT_CK_OK(c, rv))
74 goto out;
75
76 if (!ADBG_EXPECT_NOT_NULL(c, ckfunc_list->C_GetInfo) ||
77 !ADBG_EXPECT_NOT_NULL(c, ckfunc_list->C_GetSlotList) ||
Etienne Carriere6818d5f2020-03-04 15:34:50 +010078 !ADBG_EXPECT_NOT_NULL(c, ckfunc_list->C_GetSlotInfo) ||
79 !ADBG_EXPECT_NOT_NULL(c, ckfunc_list->C_GetTokenInfo))
Etienne Carrierefa7e34f2020-02-04 15:34:16 +010080 goto out;
81
Etienne Carrieree90a4e42020-03-02 12:04:08 +010082 Do_ADBG_EndSubCase(c, "Test C_GetFunctionList()");
83 Do_ADBG_BeginSubCase(c, "Test C_GetInfo()");
84
Etienne Carrierefa7e34f2020-02-04 15:34:16 +010085 rv = C_GetInfo(&lib_info);
86 if (!ADBG_EXPECT_CK_OK(c, rv))
87 goto out;
88
Etienne Carrieree90a4e42020-03-02 12:04:08 +010089 Do_ADBG_EndSubCase(c, "Test C_GetInfo()");
90 Do_ADBG_BeginSubCase(c, "Test C_GetSlotList()");
91
Etienne Carrierefa7e34f2020-02-04 15:34:16 +010092 rv = C_GetSlotList(0, NULL, &slot_count);
93 if (!ADBG_EXPECT_CK_OK(c, rv))
94 goto out;
95
96 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, slot_count, !=, 0))
97 goto out;
98
Etienne Carrierede746332020-03-04 19:43:53 +010099 if (slot_count > 1) {
100 /* Ensure case non-NULL-buffer and zero-count is tested */
101 CK_SLOT_ID id = 0;
102
103 slot_count = 0;
104 rv = C_GetSlotList(0, &id, &slot_count);
105 if (!ADBG_EXPECT_CK_RESULT(c, CKR_BUFFER_TOO_SMALL, rv))
106 goto out;
107 }
108
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100109 rv = C_GetSlotList(1, NULL, &present_slot_count);
110 if (!ADBG_EXPECT_CK_OK(c, rv))
111 goto out;
112
113 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, slot_count, ==,
114 present_slot_count))
115 goto out;
116
117 slot_ids = calloc(slot_count, sizeof(CK_SLOT_ID));
118 if (!ADBG_EXPECT_NOT_NULL(c, slot_ids))
119 goto out;
120
121 slot_count--;
122 rv = C_GetSlotList(1, slot_ids, &slot_count);
123 if (!ADBG_EXPECT_CK_RESULT(c, CKR_BUFFER_TOO_SMALL, rv))
124 goto out;
125
126 rv = C_GetSlotList(1, slot_ids, &slot_count);
127 if (!ADBG_EXPECT_CK_OK(c, rv))
128 goto out;
129
Etienne Carrieree90a4e42020-03-02 12:04:08 +0100130 Do_ADBG_EndSubCase(c, "Test C_GetSlotList()");
Etienne Carriere6818d5f2020-03-04 15:34:50 +0100131 Do_ADBG_BeginSubCase(c, "Test C_Get{Slot|Token}Info()");
Etienne Carrieree90a4e42020-03-02 12:04:08 +0100132
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100133 for (i = 0; i < slot_count; i++) {
134 CK_SLOT_ID slot = slot_ids[i];
135
136 rv = C_GetSlotInfo(slot, &slot_info);
137 if (!ADBG_EXPECT_CK_OK(c, rv))
138 goto out;
139
Etienne Carriere6818d5f2020-03-04 15:34:50 +0100140 rv = C_GetTokenInfo(slot, &token_info);
141 if (!ADBG_EXPECT_CK_OK(c, rv))
142 goto out;
143
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100144 if (max_slot_id < slot)
145 max_slot_id = slot;
146 }
147
Etienne Carriere6818d5f2020-03-04 15:34:50 +0100148 Do_ADBG_EndSubCase(c, "Test C_Get{Slot|Token}Info()");
Etienne Carrieree90a4e42020-03-02 12:04:08 +0100149 Do_ADBG_BeginSubCase(c, "Test C_Get*Info() with invalid reference");
150
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100151 rv = C_GetSlotInfo(max_slot_id + 1, &slot_info);
152 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SLOT_ID_INVALID, rv))
153 goto out;
154
Etienne Carriere6818d5f2020-03-04 15:34:50 +0100155 rv = C_GetTokenInfo(max_slot_id + 1, &token_info);
156 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SLOT_ID_INVALID, rv))
157 goto out;
158
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100159 rv = C_GetSlotInfo(ULONG_MAX, &slot_info);
160 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SLOT_ID_INVALID, rv))
161 goto out;
162
Etienne Carriere6818d5f2020-03-04 15:34:50 +0100163 rv = C_GetTokenInfo(ULONG_MAX, &token_info);
164 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SLOT_ID_INVALID, rv))
165 goto out;
166
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100167out:
Etienne Carrieree90a4e42020-03-02 12:04:08 +0100168 Do_ADBG_EndSubCase(c, NULL);
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100169 free(slot_ids);
170
171 rv = C_Finalize(NULL);
172 ADBG_EXPECT_CK_OK(c, rv);
173}
174
175ADBG_CASE_DEFINE(pkcs11, 1001, xtest_tee_test_1001,
176 "PKCS11: List PKCS#11 slots and get information from");