blob: eed72255a14f427247a8794cee262351b4dddfe1 [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;
Etienne Carriered3121292020-03-04 17:38:24 +010065 CK_MECHANISM_TYPE_PTR mecha_types = NULL;
66 CK_ULONG mecha_count = 0;
67 CK_MECHANISM_INFO mecha_info = { };
Etienne Carrierefa7e34f2020-02-04 15:34:16 +010068
69 rv = C_Initialize(NULL);
70 if (!ADBG_EXPECT_CK_OK(c, rv))
71 return;
72
Etienne Carrieree90a4e42020-03-02 12:04:08 +010073 Do_ADBG_BeginSubCase(c, "Test C_GetFunctionList()");
74
Etienne Carrierefa7e34f2020-02-04 15:34:16 +010075 rv = C_GetFunctionList(&ckfunc_list);
76 if (!ADBG_EXPECT_CK_OK(c, rv))
77 goto out;
78
79 if (!ADBG_EXPECT_NOT_NULL(c, ckfunc_list->C_GetInfo) ||
80 !ADBG_EXPECT_NOT_NULL(c, ckfunc_list->C_GetSlotList) ||
Etienne Carriere6818d5f2020-03-04 15:34:50 +010081 !ADBG_EXPECT_NOT_NULL(c, ckfunc_list->C_GetSlotInfo) ||
Etienne Carriered3121292020-03-04 17:38:24 +010082 !ADBG_EXPECT_NOT_NULL(c, ckfunc_list->C_GetTokenInfo) ||
83 !ADBG_EXPECT_NOT_NULL(c, ckfunc_list->C_GetMechanismList) ||
84 !ADBG_EXPECT_NOT_NULL(c, ckfunc_list->C_GetMechanismInfo))
Etienne Carrierefa7e34f2020-02-04 15:34:16 +010085 goto out;
86
Etienne Carrieree90a4e42020-03-02 12:04:08 +010087 Do_ADBG_EndSubCase(c, "Test C_GetFunctionList()");
88 Do_ADBG_BeginSubCase(c, "Test C_GetInfo()");
89
Etienne Carrierefa7e34f2020-02-04 15:34:16 +010090 rv = C_GetInfo(&lib_info);
91 if (!ADBG_EXPECT_CK_OK(c, rv))
92 goto out;
93
Etienne Carrieree90a4e42020-03-02 12:04:08 +010094 Do_ADBG_EndSubCase(c, "Test C_GetInfo()");
95 Do_ADBG_BeginSubCase(c, "Test C_GetSlotList()");
96
Etienne Carrierefa7e34f2020-02-04 15:34:16 +010097 rv = C_GetSlotList(0, NULL, &slot_count);
98 if (!ADBG_EXPECT_CK_OK(c, rv))
99 goto out;
100
101 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, slot_count, !=, 0))
102 goto out;
103
Etienne Carrierede746332020-03-04 19:43:53 +0100104 if (slot_count > 1) {
105 /* Ensure case non-NULL-buffer and zero-count is tested */
106 CK_SLOT_ID id = 0;
107
108 slot_count = 0;
109 rv = C_GetSlotList(0, &id, &slot_count);
110 if (!ADBG_EXPECT_CK_RESULT(c, CKR_BUFFER_TOO_SMALL, rv))
111 goto out;
112 }
113
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100114 rv = C_GetSlotList(1, NULL, &present_slot_count);
115 if (!ADBG_EXPECT_CK_OK(c, rv))
116 goto out;
117
118 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, slot_count, ==,
119 present_slot_count))
120 goto out;
121
122 slot_ids = calloc(slot_count, sizeof(CK_SLOT_ID));
123 if (!ADBG_EXPECT_NOT_NULL(c, slot_ids))
124 goto out;
125
126 slot_count--;
127 rv = C_GetSlotList(1, slot_ids, &slot_count);
128 if (!ADBG_EXPECT_CK_RESULT(c, CKR_BUFFER_TOO_SMALL, rv))
129 goto out;
130
131 rv = C_GetSlotList(1, slot_ids, &slot_count);
132 if (!ADBG_EXPECT_CK_OK(c, rv))
133 goto out;
134
Etienne Carrieree90a4e42020-03-02 12:04:08 +0100135 Do_ADBG_EndSubCase(c, "Test C_GetSlotList()");
Etienne Carriere6818d5f2020-03-04 15:34:50 +0100136 Do_ADBG_BeginSubCase(c, "Test C_Get{Slot|Token}Info()");
Etienne Carrieree90a4e42020-03-02 12:04:08 +0100137
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100138 for (i = 0; i < slot_count; i++) {
139 CK_SLOT_ID slot = slot_ids[i];
140
141 rv = C_GetSlotInfo(slot, &slot_info);
142 if (!ADBG_EXPECT_CK_OK(c, rv))
143 goto out;
144
Etienne Carriere6818d5f2020-03-04 15:34:50 +0100145 rv = C_GetTokenInfo(slot, &token_info);
146 if (!ADBG_EXPECT_CK_OK(c, rv))
147 goto out;
148
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100149 if (max_slot_id < slot)
150 max_slot_id = slot;
151 }
152
Etienne Carriere6818d5f2020-03-04 15:34:50 +0100153 Do_ADBG_EndSubCase(c, "Test C_Get{Slot|Token}Info()");
Etienne Carriered3121292020-03-04 17:38:24 +0100154 Do_ADBG_BeginSubCase(c, "Test C_GetMechanism{List|Info}()");
155
156 for (i = 0; i < slot_count; i++) {
157 CK_SLOT_ID slot = slot_ids[i];
158 size_t j = 0;
159
160 mecha_count = 0;
161 rv = C_GetMechanismList(slot, NULL, &mecha_count);
162 if (!ADBG_EXPECT_CK_OK(c, rv))
163 goto out;
164
165 if (mecha_count == 0)
166 continue;
167
168 free(mecha_types);
169 mecha_types = calloc(mecha_count, sizeof(*mecha_types));
170 if (!ADBG_EXPECT_NOT_NULL(c, mecha_types))
171 goto out;
172
173 /* Test specific case: valid buffer reference with 0 count */
174 mecha_count = 0;
175 rv = C_GetMechanismList(slot, mecha_types, &mecha_count);
176 if (!ADBG_EXPECT_CK_RESULT(c, CKR_BUFFER_TOO_SMALL, rv))
177 goto out;
178
179 rv = C_GetMechanismList(slot, mecha_types, &mecha_count);
180 if (!ADBG_EXPECT_CK_OK(c, rv))
181 goto out;
182
183 for (j = 0; j < mecha_count; j++) {
184 rv = C_GetMechanismInfo(slot, mecha_types[j],
185 &mecha_info);
186 if (!ADBG_EXPECT_CK_OK(c, rv))
187 goto out;
188 }
189 }
190
191 Do_ADBG_EndSubCase(c, "Test C_GetMechanism{List|Info}()");
Etienne Carrieree90a4e42020-03-02 12:04:08 +0100192 Do_ADBG_BeginSubCase(c, "Test C_Get*Info() with invalid reference");
193
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100194 rv = C_GetSlotInfo(max_slot_id + 1, &slot_info);
195 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SLOT_ID_INVALID, rv))
196 goto out;
197
Etienne Carriere6818d5f2020-03-04 15:34:50 +0100198 rv = C_GetTokenInfo(max_slot_id + 1, &token_info);
199 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SLOT_ID_INVALID, rv))
200 goto out;
201
Etienne Carriered3121292020-03-04 17:38:24 +0100202 mecha_count = 1;
203 if (!mecha_types)
204 mecha_types = malloc(sizeof(*mecha_types));
205 if (!ADBG_EXPECT_NOT_NULL(c, mecha_types))
206 goto out;
207
208 rv = C_GetMechanismList(max_slot_id + 1, mecha_types, &mecha_count);
209 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SLOT_ID_INVALID, rv))
210 goto out;
211
212 rv = C_GetMechanismInfo(max_slot_id + 1, CKM_AES_KEY_GEN, &mecha_info);
213 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SLOT_ID_INVALID, rv))
214 goto out;
215
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100216 rv = C_GetSlotInfo(ULONG_MAX, &slot_info);
217 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SLOT_ID_INVALID, rv))
218 goto out;
219
Etienne Carriere6818d5f2020-03-04 15:34:50 +0100220 rv = C_GetTokenInfo(ULONG_MAX, &token_info);
221 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SLOT_ID_INVALID, rv))
222 goto out;
223
Etienne Carriered3121292020-03-04 17:38:24 +0100224 mecha_count = 1;
225 rv = C_GetMechanismList(ULONG_MAX, mecha_types, &mecha_count);
226 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SLOT_ID_INVALID, rv))
227 goto out;
228
229 rv = C_GetMechanismInfo(ULONG_MAX, CKM_AES_KEY_GEN, &mecha_info);
230 if (!ADBG_EXPECT_CK_RESULT(c, CKR_SLOT_ID_INVALID, rv))
231 goto out;
232
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100233out:
Etienne Carrieree90a4e42020-03-02 12:04:08 +0100234 Do_ADBG_EndSubCase(c, NULL);
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100235 free(slot_ids);
Etienne Carriered3121292020-03-04 17:38:24 +0100236 free(mecha_types);
Etienne Carrierefa7e34f2020-02-04 15:34:16 +0100237
238 rv = C_Finalize(NULL);
239 ADBG_EXPECT_CK_OK(c, rv);
240}
241
242ADBG_CASE_DEFINE(pkcs11, 1001, xtest_tee_test_1001,
243 "PKCS11: List PKCS#11 slots and get information from");