blob: 203483028c63b387a092f3d4bf6e78417bad07f8 [file] [log] [blame]
Etienne Carriere9b7b70d2020-05-16 10:27:23 +02001// SPDX-License-Identifier: GPL-2.0
Pascal Brandc639ac82015-07-02 08:53:34 +02002/*
3 * Copyright (c) 2014, STMicroelectronics International N.V.
Alexander Zakharov0afe00c2021-02-10 19:06:48 +01004 * Copyright (c) 2021, SumUp Services GmbH
Pascal Brandc639ac82015-07-02 08:53:34 +02005 */
6
7#include <stdio.h>
8#include <string.h>
9#include <inttypes.h>
10#include <malloc.h>
Igor Opaniuk7ddaa782018-05-25 15:14:05 +030011#include <time.h>
Pascal Brandc639ac82015-07-02 08:53:34 +020012
13#include "xtest_test.h"
14#include "xtest_helpers.h"
15
16#include <tee_api_types.h>
Gabor Szekely2ad190f2018-09-14 14:05:06 +000017#include <tee_api_defines_extensions.h>
Jens Wiklandercbd8fd12022-11-26 20:38:47 +010018#include <tee_api_compat.h>
Pascal Brandc639ac82015-07-02 08:53:34 +020019#include <ta_crypt.h>
20#include <utee_defines.h>
21#include <util.h>
22
Jerome Forissier213ca8a2017-03-31 11:27:56 +020023#include <regression_4000_data.h>
Cedric Chaumontc7654962015-09-09 14:56:36 +020024#include <nist/186-2ecdsatestvectors.h>
Pascal Brandc639ac82015-07-02 08:53:34 +020025
26#include <assert.h>
27
Pascal Brandc639ac82015-07-02 08:53:34 +020028static TEEC_Result ta_crypt_cmd_reset_operation(ADBG_Case_t *c, TEEC_Session *s,
29 TEE_OperationHandle oph)
30{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010031 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +020032 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010033 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +020034
35 assert((uintptr_t)oph <= UINT32_MAX);
36 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
37 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE,
38 TEEC_NONE);
39 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_RESET_OPERATION, &op,
40 &ret_orig);
41 if (res != TEEC_SUCCESS) {
42 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
43 ret_orig);
44 }
45 return res;
46}
47
48static TEEC_Result ta_crypt_cmd_copy_operation(ADBG_Case_t *c,
49 TEEC_Session *s,
50 TEE_OperationHandle dst_oph,
51 TEE_OperationHandle src_oph)
52{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010053 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +020054 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010055 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +020056
57 assert((uintptr_t)dst_oph <= UINT32_MAX);
58 op.params[0].value.a = (uint32_t)(uintptr_t)dst_oph;
59
60 assert((uintptr_t)src_oph <= UINT32_MAX);
61 op.params[0].value.b = (uint32_t)(uintptr_t)src_oph;
62 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE,
63 TEEC_NONE);
64
65 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_COPY_OPERATION, &op,
66 &ret_orig);
67
68 if (res != TEEC_SUCCESS) {
69 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
70 ret_orig);
71 }
72 return res;
73}
74
75static TEEC_Result ta_crypt_cmd_digest_update(ADBG_Case_t *c, TEEC_Session *s,
76 TEE_OperationHandle oph,
77 const void *chunk,
78 size_t chunk_size)
79{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010080 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +020081 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010082 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +020083
84 assert((uintptr_t)oph <= UINT32_MAX);
85 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
86 op.params[1].tmpref.buffer = (void *)chunk;
87 op.params[1].tmpref.size = chunk_size;
88
89 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
90 TEEC_MEMREF_TEMP_INPUT, TEEC_NONE,
91 TEEC_NONE);
92
93 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_DIGEST_UPDATE, &op, &ret_orig);
94
95 if (res != TEEC_SUCCESS) {
96 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
97 ret_orig);
98 }
99
100 return res;
101}
102
103static TEEC_Result ta_crypt_cmd_digest_do_final(ADBG_Case_t *c, TEEC_Session *s,
104 TEE_OperationHandle oph,
105 const void *chunk,
106 size_t chunk_len, void *hash,
107 size_t *hash_len)
108{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100109 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200110 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100111 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200112
113 assert((uintptr_t)oph <= UINT32_MAX);
114 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
115
116 op.params[1].tmpref.buffer = (void *)chunk;
117 op.params[1].tmpref.size = chunk_len;
118
119 op.params[2].tmpref.buffer = (void *)hash;
120 op.params[2].tmpref.size = *hash_len;
121
122 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
123 TEEC_MEMREF_TEMP_INPUT,
124 TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE);
125
126 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_DIGEST_DO_FINAL, &op,
127 &ret_orig);
128
129 if (res != TEEC_SUCCESS) {
130 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
131 ret_orig);
132 }
133
134 if (res == TEEC_SUCCESS)
135 *hash_len = op.params[2].tmpref.size;
136
137 return res;
138}
139
140static TEE_Result ta_crypt_cmd_set_operation_key2(ADBG_Case_t *c,
141 TEEC_Session *s,
142 TEE_OperationHandle oph,
143 TEE_ObjectHandle key1,
144 TEE_ObjectHandle key2)
145{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100146 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200147 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100148 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200149
150 assert((uintptr_t)oph <= UINT32_MAX);
151 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
152
153 assert((uintptr_t)key1 <= UINT32_MAX);
154 op.params[0].value.b = (uint32_t)(uintptr_t)key1;
155
156 assert((uintptr_t)key2 <= UINT32_MAX);
157 op.params[1].value.a = (uint32_t)(uintptr_t)key2;
158 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_VALUE_INPUT,
159 TEEC_NONE, TEEC_NONE);
160
161 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_SET_OPERATION_KEY2, &op,
162 &ret_orig);
163
164 if (res != TEEC_SUCCESS) {
165 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
166 ret_orig);
167 }
168
169 return res;
170}
171
172static TEEC_Result ta_crypt_cmd_mac_init(ADBG_Case_t *c, TEEC_Session *s,
173 TEE_OperationHandle oph,
174 const void *iv, size_t iv_len)
175{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100176 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200177 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100178 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200179
180 assert((uintptr_t)oph <= UINT32_MAX);
181 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
182
183 if (iv != NULL) {
184 op.params[1].tmpref.buffer = (void *)iv;
185 op.params[1].tmpref.size = iv_len;
186 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
187 TEEC_MEMREF_TEMP_INPUT,
188 TEEC_NONE, TEEC_NONE);
189 } else {
190 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
191 TEEC_NONE, TEEC_NONE);
192 }
193
194 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_MAC_INIT, &op, &ret_orig);
195
196 if (res != TEEC_SUCCESS) {
197 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
198 ret_orig);
199 }
200
201 return res;
202}
203
204static TEEC_Result ta_crypt_cmd_mac_update(ADBG_Case_t *c, TEEC_Session *s,
205 TEE_OperationHandle oph,
206 const void *chunk, size_t chunk_size)
207{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100208 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200209 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100210 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200211
212 assert((uintptr_t)oph <= UINT32_MAX);
213 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
214
215 op.params[1].tmpref.buffer = (void *)chunk;
216 op.params[1].tmpref.size = chunk_size;
217
218 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
219 TEEC_MEMREF_TEMP_INPUT, TEEC_NONE,
220 TEEC_NONE);
221
222 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_MAC_UPDATE, &op, &ret_orig);
223
224 if (res != TEEC_SUCCESS) {
225 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
226 ret_orig);
227 }
228
229 return res;
230}
231
232static TEEC_Result ta_crypt_cmd_mac_final_compute(ADBG_Case_t *c,
233 TEEC_Session *s,
234 TEE_OperationHandle oph,
235 const void *chunk,
236 size_t chunk_len,
237 void *hash,
238 size_t *hash_len)
239{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100240 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200241 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100242 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200243
244 assert((uintptr_t)oph <= UINT32_MAX);
245 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
246
247 op.params[1].tmpref.buffer = (void *)chunk;
248 op.params[1].tmpref.size = chunk_len;
249
250 op.params[2].tmpref.buffer = (void *)hash;
251 op.params[2].tmpref.size = *hash_len;
252
253 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
254 TEEC_MEMREF_TEMP_INPUT,
255 TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE);
256
257 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_MAC_FINAL_COMPUTE, &op,
258 &ret_orig);
259
260 if (res != TEEC_SUCCESS) {
261 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
262 ret_orig);
263 }
264
265 if (res == TEEC_SUCCESS)
266 *hash_len = op.params[2].tmpref.size;
267
268 return res;
269}
270
Jerome Forissier4f419512021-07-07 14:56:10 +0200271static TEEC_Result ta_crypt_cmd_mac_final_compare(ADBG_Case_t *c,
272 TEEC_Session *s,
273 TEE_OperationHandle oph,
274 const void *chunk,
275 size_t chunk_len,
276 const uint8_t *hash,
277 size_t hash_len)
278{
279 TEEC_Result res = TEEC_ERROR_GENERIC;
280 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
281 uint32_t ret_orig = 0;
282
283 assert((uintptr_t)oph <= UINT32_MAX);
284 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
285
286 op.params[1].tmpref.buffer = (void *)chunk;
287 op.params[1].tmpref.size = chunk_len;
288
289 op.params[2].tmpref.buffer = (void *)hash;
290 op.params[2].tmpref.size = hash_len;
291
292 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
293 TEEC_MEMREF_TEMP_INPUT,
294 TEEC_MEMREF_TEMP_INPUT, TEEC_NONE);
295
296 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_MAC_FINAL_COMPARE, &op,
297 &ret_orig);
298
299 if (res != TEEC_SUCCESS) {
300 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
301 ret_orig);
302 }
303
304 return res;
305}
306
Pascal Brandc639ac82015-07-02 08:53:34 +0200307static TEEC_Result ta_crypt_cmd_cipher_init(ADBG_Case_t *c, TEEC_Session *s,
308 TEE_OperationHandle oph,
309 const void *iv, size_t iv_len)
310{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100311 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200312 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100313 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200314
315 assert((uintptr_t)oph <= UINT32_MAX);
316 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
317
318 if (iv != NULL) {
319 op.params[1].tmpref.buffer = (void *)iv;
320 op.params[1].tmpref.size = iv_len;
321
322 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
323 TEEC_MEMREF_TEMP_INPUT,
324 TEEC_NONE, TEEC_NONE);
325 } else {
326 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
327 TEEC_NONE, TEEC_NONE);
328 }
329
330 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_CIPHER_INIT, &op, &ret_orig);
331
332 if (res != TEEC_SUCCESS) {
333 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
334 ret_orig);
335 }
336
337 return res;
338}
339
340static TEEC_Result ta_crypt_cmd_cipher_update(ADBG_Case_t *c, TEEC_Session *s,
341 TEE_OperationHandle oph,
342 const void *src, size_t src_len,
343 void *dst, size_t *dst_len)
344{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100345 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200346 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100347 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200348
349 assert((uintptr_t)oph <= UINT32_MAX);
350 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
351
352 op.params[1].tmpref.buffer = (void *)src;
353 op.params[1].tmpref.size = src_len;
354
355 op.params[2].tmpref.buffer = dst;
356 op.params[2].tmpref.size = *dst_len;
357
358 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
359 TEEC_MEMREF_TEMP_INPUT,
360 TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE);
361
362 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_CIPHER_UPDATE, &op, &ret_orig);
363
364 if (res != TEEC_SUCCESS) {
365 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
366 ret_orig);
367 }
368
369 if (res == TEEC_SUCCESS)
370 *dst_len = op.params[2].tmpref.size;
371
372 return res;
373}
374
375static TEEC_Result ta_crypt_cmd_cipher_do_final(ADBG_Case_t *c,
376 TEEC_Session *s,
377 TEE_OperationHandle oph,
378 const void *src,
379 size_t src_len,
380 void *dst,
381 size_t *dst_len)
382{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100383 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200384 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100385 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200386
387 assert((uintptr_t)oph <= UINT32_MAX);
388 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
389
390 op.params[1].tmpref.buffer = (void *)src;
391 op.params[1].tmpref.size = src_len;
392
393 op.params[2].tmpref.buffer = (void *)dst;
394 op.params[2].tmpref.size = *dst_len;
395
396 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
397 TEEC_MEMREF_TEMP_INPUT,
398 TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE);
399
400 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_CIPHER_DO_FINAL, &op,
401 &ret_orig);
402
403 if (res != TEEC_SUCCESS) {
404 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
405 ret_orig);
406 }
407
408 if (res == TEEC_SUCCESS)
409 *dst_len = op.params[2].tmpref.size;
410
411 return res;
412}
413
414static TEEC_Result ta_crypt_cmd_random_number_generate(ADBG_Case_t *c,
415 TEEC_Session *s,
416 void *buf,
417 size_t blen)
418{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100419 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200420 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100421 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200422
423 op.params[0].tmpref.buffer = buf;
424 op.params[0].tmpref.size = blen;
425
426 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE,
427 TEEC_NONE, TEEC_NONE);
428
Joakim Bech81f97e32020-05-27 12:14:23 +0200429 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_RANDOM_NUMBER_GENERATE, &op,
Pascal Brandc639ac82015-07-02 08:53:34 +0200430 &ret_orig);
431
432 if (res != TEEC_SUCCESS) {
433 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
434 ret_orig);
435 }
436
437 (void)ADBG_EXPECT_COMPARE_UNSIGNED(c, blen, ==,
438 op.params[0].tmpref.size);
439 return res;
440}
441
442static TEEC_Result ta_crypt_cmd_ae_init(ADBG_Case_t *c, TEEC_Session *s,
443 TEE_OperationHandle oph,
444 const void *nonce, size_t nonce_len,
445 size_t tag_len, size_t aad_len,
446 size_t payload_len)
447{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100448 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200449 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100450 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200451
452 assert((uintptr_t)oph <= UINT32_MAX);
453 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
454 op.params[0].value.b = tag_len;
455
456 op.params[1].tmpref.buffer = (void *)nonce;
457 op.params[1].tmpref.size = nonce_len;
458
459 op.params[2].value.a = aad_len;
460 op.params[2].value.b = payload_len;
461
462 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
463 TEEC_MEMREF_TEMP_INPUT,
Jens Wiklander74a42302015-07-07 01:08:41 +0200464 TEEC_VALUE_INPUT, TEEC_NONE);
Pascal Brandc639ac82015-07-02 08:53:34 +0200465
466 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_AE_INIT, &op, &ret_orig);
467
468 if (res != TEEC_SUCCESS) {
469 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
470 ret_orig);
471 }
472 return res;
473}
474
475static TEEC_Result ta_crypt_cmd_ae_update_aad(ADBG_Case_t *c, TEEC_Session *s,
476 TEE_OperationHandle oph,
477 const void *aad, size_t aad_len)
478{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100479 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200480 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100481 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200482
483 assert((uintptr_t)oph <= UINT32_MAX);
484 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
485
486 op.params[1].tmpref.buffer = (void *)aad;
487 op.params[1].tmpref.size = aad_len;
488
489 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
490 TEEC_MEMREF_TEMP_INPUT, TEEC_NONE,
491 TEEC_NONE);
492
493 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_AE_UPDATE_AAD, &op, &ret_orig);
494
495 if (res != TEEC_SUCCESS) {
496 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
497 ret_orig);
498 }
499
500 return res;
501}
502
503static TEEC_Result ta_crypt_cmd_ae_update(ADBG_Case_t *c,
504 TEEC_Session *s,
505 TEE_OperationHandle oph,
506 const void *src,
507 size_t src_len,
508 void *dst,
509 size_t *dst_len)
510{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100511 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200512 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100513 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200514
515 assert((uintptr_t)oph <= UINT32_MAX);
516 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
517
518 op.params[1].tmpref.buffer = (void *)src;
519 op.params[1].tmpref.size = src_len;
520
521 op.params[2].tmpref.buffer = (void *)dst;
522 op.params[2].tmpref.size = *dst_len;
523
524 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
525 TEEC_MEMREF_TEMP_INPUT,
526 TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE);
527
528 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_AE_UPDATE, &op, &ret_orig);
529
530 if (res != TEEC_SUCCESS) {
531 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
532 ret_orig);
533 }
534
535 if (res == TEEC_SUCCESS)
536 *dst_len = op.params[2].tmpref.size;
537
538 return res;
539}
540
541static TEEC_Result ta_crypt_cmd_ae_encrypt_final(ADBG_Case_t *c,
542 TEEC_Session *s,
543 TEE_OperationHandle oph,
544 const void *src,
545 size_t src_len, void *dst,
546 size_t *dst_len, void *tag,
547 size_t *tag_len)
548{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100549 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200550 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100551 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200552
553 assert((uintptr_t)oph <= UINT32_MAX);
554 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
555
556 op.params[1].tmpref.buffer = (void *)src;
557 op.params[1].tmpref.size = src_len;
558
559 op.params[2].tmpref.buffer = (void *)dst;
560 op.params[2].tmpref.size = *dst_len;
561
562 op.params[3].tmpref.buffer = (void *)tag;
563 op.params[3].tmpref.size = *tag_len;
564
565 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
566 TEEC_MEMREF_TEMP_INPUT,
567 TEEC_MEMREF_TEMP_OUTPUT,
568 TEEC_MEMREF_TEMP_OUTPUT);
569
570 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_AE_ENCRYPT_FINAL, &op,
571 &ret_orig);
572
573 if (res != TEEC_SUCCESS) {
574 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
575 ret_orig);
576 }
577
578 if (res == TEEC_SUCCESS) {
579 *dst_len = op.params[2].tmpref.size;
580 *tag_len = op.params[3].tmpref.size;
581 }
582
583 return res;
584}
585
586static TEEC_Result ta_crypt_cmd_ae_decrypt_final(ADBG_Case_t *c,
587 TEEC_Session *s,
588 TEE_OperationHandle oph,
589 const void *src, size_t src_len,
590 void *dst, size_t *dst_len,
591 const void *tag, size_t tag_len)
592{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100593 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200594 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100595 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200596
597 assert((uintptr_t)oph <= UINT32_MAX);
598 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
599
600 op.params[1].tmpref.buffer = (void *)src;
601 op.params[1].tmpref.size = src_len;
602
603 op.params[2].tmpref.buffer = dst;
604 op.params[2].tmpref.size = *dst_len;
605
606 op.params[3].tmpref.buffer = (void *)tag;
607 op.params[3].tmpref.size = tag_len;
608
609 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
610 TEEC_MEMREF_TEMP_INPUT,
611 TEEC_MEMREF_TEMP_OUTPUT,
612 TEEC_MEMREF_TEMP_INPUT);
613
614 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_AE_DECRYPT_FINAL, &op,
615 &ret_orig);
616
617 if (res != TEEC_SUCCESS) {
618 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
619 ret_orig);
620 }
621
622 if (res == TEEC_SUCCESS)
623 *dst_len = op.params[2].tmpref.size;
624
625 return res;
626}
627
628static TEEC_Result ta_crypt_cmd_asymmetric_operate(ADBG_Case_t *c,
629 TEEC_Session *s,
630 TEE_OperationHandle oph,
631 uint32_t cmd,
632 const TEE_Attribute *params,
633 uint32_t paramCount,
634 const void *src,
635 size_t src_len,
636 void *dst,
637 size_t *dst_len)
638{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100639 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200640 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100641 uint32_t ret_orig = 0;
642 uint8_t *buf = NULL;
643 size_t blen = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200644
645 res = pack_attrs(params, paramCount, &buf, &blen);
646 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
647 return res;
648
649 assert((uintptr_t)oph <= UINT32_MAX);
650 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
651
652 op.params[1].tmpref.buffer = buf;
653 op.params[1].tmpref.size = blen;
654
655 op.params[2].tmpref.buffer = (void *)src;
656 op.params[2].tmpref.size = src_len;
657
658 op.params[3].tmpref.buffer = dst;
659 op.params[3].tmpref.size = *dst_len;
660
661 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
662 TEEC_MEMREF_TEMP_INPUT,
663 TEEC_MEMREF_TEMP_INPUT,
664 TEEC_MEMREF_TEMP_OUTPUT);
665
666 res = TEEC_InvokeCommand(s, cmd, &op, &ret_orig);
667
668 if (res != TEEC_SUCCESS) {
669 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
670 ret_orig);
671 }
672
673 if (res == TEEC_SUCCESS)
674 *dst_len = op.params[3].tmpref.size;
675
676 free(buf);
677 return res;
678}
679
680static TEEC_Result ta_crypt_cmd_asymmetric_encrypt(ADBG_Case_t *c,
681 TEEC_Session *s,
682 TEE_OperationHandle oph,
683 const TEE_Attribute *params,
684 uint32_t paramCount,
685 const void *src,
686 size_t src_len,
687 void *dst,
688 size_t *dst_len)
689{
690 return ta_crypt_cmd_asymmetric_operate(c, s, oph,
691 TA_CRYPT_CMD_ASYMMETRIC_ENCRYPT,
692 params, paramCount,
693 src, src_len, dst, dst_len);
694}
695
696static TEEC_Result ta_crypt_cmd_asymmetric_decrypt(ADBG_Case_t *c,
697 TEEC_Session *s,
698 TEE_OperationHandle oph,
699 const TEE_Attribute *params,
700 uint32_t paramCount,
701 const void *src,
702 size_t src_len,
703 void *dst,
704 size_t *dst_len)
705{
706 return ta_crypt_cmd_asymmetric_operate(c, s, oph,
707 TA_CRYPT_CMD_ASYMMETRIC_DECRYPT,
708 params, paramCount,
709 src, src_len, dst, dst_len);
710}
711
712static TEEC_Result ta_crypt_cmd_asymmetric_sign(ADBG_Case_t *c,
713 TEEC_Session *s,
714 TEE_OperationHandle oph,
715 const TEE_Attribute *params,
716 uint32_t paramCount,
717 const void *digest,
718 size_t digest_len,
719 void *signature,
720 size_t *signature_len)
721{
722 return ta_crypt_cmd_asymmetric_operate(c, s, oph,
723 TA_CRYPT_CMD_ASYMMETRIC_SIGN_DIGEST, params, paramCount,
724 digest, digest_len, signature, signature_len);
725}
726
727static TEEC_Result ta_crypt_cmd_asymmetric_verify(ADBG_Case_t *c,
728 TEEC_Session *s,
729 TEE_OperationHandle oph,
730 const TEE_Attribute *params,
731 uint32_t paramCount,
732 const void *digest,
733 size_t digest_len,
734 const void *signature,
735 size_t signature_len)
736{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100737 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200738 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100739 uint32_t ret_orig = 0;
740 uint8_t *buf = NULL;
741 size_t blen = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200742
743 res = pack_attrs(params, paramCount, &buf, &blen);
744 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
745 return res;
746
747 assert((uintptr_t)oph <= UINT32_MAX);
748 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
749
750 op.params[1].tmpref.buffer = buf;
751 op.params[1].tmpref.size = blen;
752
753 op.params[2].tmpref.buffer = (void *)digest;
754 op.params[2].tmpref.size = digest_len;
755
756 op.params[3].tmpref.buffer = (void *)signature;
757 op.params[3].tmpref.size = signature_len;
758
759 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
760 TEEC_MEMREF_TEMP_INPUT,
761 TEEC_MEMREF_TEMP_INPUT,
762 TEEC_MEMREF_TEMP_INPUT);
763
764 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_ASYMMETRIC_VERIFY_DIGEST,
765 &op, &ret_orig);
766
767 if (res != TEEC_SUCCESS) {
768 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
769 ret_orig);
770 }
771
772 free(buf);
773 return res;
774}
775
776static TEEC_Result ta_crypt_cmd_get_object_value_attribute(ADBG_Case_t *c,
777 TEEC_Session *s,
778 TEE_ObjectHandle o,
779 uint32_t attr_id,
780 uint32_t *valuea,
781 uint32_t *valueb)
782{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100783 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200784 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100785 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200786
787 assert((uintptr_t)o <= UINT32_MAX);
788 op.params[0].value.a = (uint32_t)(uintptr_t)o;
789 op.params[0].value.b = attr_id;
790 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_VALUE_OUTPUT,
791 TEEC_NONE, TEEC_NONE);
792
793 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_GET_OBJECT_VALUE_ATTRIBUTE,
794 &op, &ret_orig);
795
796 if (res != TEEC_SUCCESS) {
797 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
798 ret_orig);
799 }
800
801 if (res == TEEC_SUCCESS) {
802 *valuea = op.params[1].value.a;
803 *valueb = op.params[1].value.b;
804 }
805
806 return res;
807}
808
809static TEEC_Result ta_crypt_cmd_generate_key(ADBG_Case_t *c,
810 TEEC_Session *s,
811 TEE_ObjectHandle o,
812 uint32_t key_size,
813 const TEE_Attribute *params,
814 uint32_t paramCount)
815{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100816 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200817 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100818 uint32_t ret_orig = 0;
819 uint8_t *buf = NULL;
820 size_t blen = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200821
822 res = pack_attrs(params, paramCount, &buf, &blen);
823 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
824 return res;
825
826 assert((uintptr_t)o <= UINT32_MAX);
827 op.params[0].value.a = (uint32_t)(uintptr_t)o;
828 op.params[0].value.b = key_size;
829
830 op.params[1].tmpref.buffer = buf;
831 op.params[1].tmpref.size = blen;
832
833 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
834 TEEC_MEMREF_TEMP_INPUT, TEEC_NONE,
835 TEEC_NONE);
836
837 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_GENERATE_KEY, &op, &ret_orig);
838
839 if (res != TEEC_SUCCESS) {
840 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
841 ret_orig);
842 }
843
844 free(buf);
845 return res;
846}
847
848static const uint8_t hash_data_md5_in1[] = {
849 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'
850};
851
852static const uint8_t hash_data_md5_out1[] = {
853 0x61, 0x12, 0x71, 0x83, 0x70, 0x8d, 0x3a, 0xc7,
854 0xf1, 0x9b, 0x66, 0x06, 0xfc, 0xae, 0x7d, 0xf6
855};
856
857static const uint8_t hash_data_sha1_in1[] = {
858 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'
859};
860
861static const uint8_t hash_data_sha1_out1[] = {
862 0x4b, 0x98, 0x92, 0xb6, 0x52, 0x72, 0x14, 0xaf,
863 0xc6, 0x55, 0xb8, 0xaa, 0x52, 0xf4, 0xd2, 0x03,
864 0xc1, 0x5e, 0x7c, 0x9c
865};
866
867static const uint8_t hash_data_sha224_in1[] = {
868 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'
869};
870
871static const uint8_t hash_data_sha224_out1[] = {
872 0x08, 0x21, 0x69, 0xf9, 0x77, 0x1b, 0x80, 0x15,
873 0xf3, 0x97, 0xae, 0xde, 0x5b, 0xba, 0xa2, 0x72,
874 0x2d, 0x8f, 0x5c, 0x19, 0xfe, 0xd2, 0xe2, 0x68,
875 0x92, 0x49, 0xd8, 0x44
876};
877
878static const uint8_t hash_data_sha256_in1[] = { 'a', 'b', 'c' };
879
880static const uint8_t hash_data_sha256_out1[] = {
881 0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea,
882 0x41, 0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23,
883 0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c,
884 0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad
885};
886
887static const uint8_t hash_data_sha256_in2[] = { 'e', 'f', 'g' };
888
889static const uint8_t hash_data_sha256_out2[] = {
890 0xd4, 0xff, 0xe8, 0xe9, 0xee, 0x0b, 0x48, 0xeb,
891 0xa7, 0x16, 0x70, 0x61, 0x23, 0xa7, 0x18, 0x7f,
892 0x32, 0xea, 0xe3, 0xbd, 0xcb, 0x0e, 0x77, 0x63,
893 0xe4, 0x1e, 0x53, 0x32, 0x67, 0xbd, 0x8a, 0x53
894};
895
896
897static const uint8_t hash_data_sha384_in1[] = {
898 'a', 'b', 'c', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'
899};
900
901static const uint8_t hash_data_sha384_out1[] = {
902 0x4c, 0xab, 0x80, 0x9d, 0x96, 0x84, 0x01, 0x47,
903 0x67, 0x0a, 0xc1, 0x7a, 0xb6, 0xb9, 0xf7, 0x6e,
904 0x35, 0xa6, 0xb0, 0x8c, 0xf5, 0x2a, 0x3d, 0x64,
905 0x9a, 0x8c, 0x7e, 0x0c, 0x55, 0x45, 0xd3, 0x7d,
906 0x1f, 0x7f, 0x28, 0x34, 0x96, 0x14, 0x44, 0x2a,
907 0xf5, 0x98, 0xa2, 0x95, 0x24, 0x76, 0x53, 0x97
908};
909
910static const uint8_t hash_data_sha512_in1[] = {
911 'a', 'b', 'c', 'd', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'
912};
913
914static const uint8_t hash_data_sha512_out1[] = {
915 0x20, 0xd8, 0x64, 0x4f, 0x54, 0xa2, 0x5f, 0x6f,
916 0x0a, 0xf9, 0xd5, 0x27, 0x7d, 0x17, 0xa8, 0x99,
917 0x4c, 0x64, 0x3f, 0xd0, 0xf3, 0x83, 0x36, 0xee,
918 0x93, 0x12, 0x55, 0xcd, 0x2e, 0x12, 0x34, 0xa0,
919 0xc2, 0xaa, 0xf9, 0xbb, 0x15, 0xc5, 0xe9, 0xfa,
920 0xf7, 0xa7, 0xda, 0xb8, 0x2f, 0x72, 0xa0, 0x47,
921 0xe3, 0x02, 0x04, 0xe8, 0xa0, 0x35, 0x0c, 0x96,
922 0x26, 0xd1, 0xcb, 0x8b, 0x47, 0x45, 0x25, 0xd0
923};
924
Jerome Forissier3ed850a2019-12-13 10:58:23 +0100925/*
926 * SM3
927 * https://tools.ietf.org/html/draft-sca-cfrg-sm3-02
Jerome Forissier9f17e262019-12-13 14:12:41 +0100928 * Appendix A.1
Jerome Forissier3ed850a2019-12-13 10:58:23 +0100929 */
930static const uint8_t hash_data_sm3_a1_in[3] = "abc";
931
932static const uint8_t hash_data_sm3_a1_out[] = {
933 0x66, 0xc7, 0xf0, 0xf4, 0x62, 0xee, 0xed, 0xd9,
934 0xd1, 0xf2, 0xd4, 0x6b, 0xdc, 0x10, 0xe4, 0xe2,
935 0x41, 0x67, 0xc4, 0x87, 0x5c, 0xf2, 0xf7, 0xa2,
936 0x29, 0x7d, 0xa0, 0x2b, 0x8f, 0x4b, 0xa8, 0xe0
937};
938
939/*
940 * SM3
941 * https://tools.ietf.org/html/draft-sca-cfrg-sm3-02
Jerome Forissier9f17e262019-12-13 14:12:41 +0100942 * Appendix A.2
Jerome Forissier3ed850a2019-12-13 10:58:23 +0100943 */
944static const uint8_t hash_data_sm3_a2_in[] = {
945 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
946 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
947 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
948 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
949 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
950 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
951 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
952 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64
953};
954
955static const uint8_t hash_data_sm3_a2_out[] = {
956 0xde, 0xbe, 0x9f, 0xf9, 0x22, 0x75, 0xb8, 0xa1,
957 0x38, 0x60, 0x48, 0x89, 0xc1, 0x8e, 0x5a, 0x4d,
958 0x6f, 0xdb, 0x70, 0xe5, 0x38, 0x7e, 0x57, 0x65,
959 0x29, 0x3d, 0xcb, 0xa3, 0x9c, 0x0c, 0x57, 0x32
960};
961
Pascal Brandc639ac82015-07-02 08:53:34 +0200962struct xtest_hash_case {
963 uint32_t algo;
964 size_t in_incr;
965 const uint8_t *in;
966 size_t in_len;
967 const uint8_t *out;
968 size_t out_len;
969};
970
971#define XTEST_HASH_CASE(algo, in_incr, in, out) \
972 { (algo), (in_incr), (in), ARRAY_SIZE(in), (out), ARRAY_SIZE(out) }
973
974static const struct xtest_hash_case hash_cases[] = {
975 XTEST_HASH_CASE(TEE_ALG_MD5, 6, hash_data_md5_in1,
976 hash_data_md5_out1),
977 XTEST_HASH_CASE(TEE_ALG_SHA1, 3, hash_data_sha1_in1,
978 hash_data_sha1_out1),
979 XTEST_HASH_CASE(TEE_ALG_SHA224, 7, hash_data_sha224_in1,
980 hash_data_sha224_out1),
981 XTEST_HASH_CASE(TEE_ALG_SHA256, 1, hash_data_sha256_in1,
982 hash_data_sha256_out1),
983 XTEST_HASH_CASE(TEE_ALG_SHA256, 1, hash_data_sha256_in2,
984 hash_data_sha256_out2),
985 XTEST_HASH_CASE(TEE_ALG_SHA384, 1, hash_data_sha384_in1,
986 hash_data_sha384_out1),
987 XTEST_HASH_CASE(TEE_ALG_SHA512, 1, hash_data_sha512_in1,
988 hash_data_sha512_out1),
Jerome Forissier3ed850a2019-12-13 10:58:23 +0100989 XTEST_HASH_CASE(TEE_ALG_SM3, 2, hash_data_sm3_a1_in,
990 hash_data_sm3_a1_out),
991 XTEST_HASH_CASE(TEE_ALG_SM3, 19, hash_data_sm3_a2_in,
992 hash_data_sm3_a2_out),
Pascal Brandc639ac82015-07-02 08:53:34 +0200993};
994
995static void xtest_tee_test_4001(ADBG_Case_t *c)
996{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100997 TEEC_Session session = { };
998 uint32_t ret_orig = 0;
999 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001000
1001 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1002 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
1003 &ret_orig)))
1004 return;
1005
1006
1007 for (n = 0; n < ARRAY_SIZE(hash_cases); n++) {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001008 TEE_OperationHandle op1 = TEE_HANDLE_NULL;
1009 TEE_OperationHandle op2 = TEE_HANDLE_NULL;
1010 uint8_t out[64] = { };
1011 size_t out_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001012
Jerome Forissier87b00c02020-01-22 16:33:12 +01001013 if (hash_cases[n].algo == TEE_ALG_SM3 &&
1014 !ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_SM3,
1015 TEE_CRYPTO_ELEMENT_NONE)) {
1016 Do_ADBG_Log("SM3 not supported: skip subcase");
1017 continue;
1018 }
1019
Pascal Brandc639ac82015-07-02 08:53:34 +02001020 Do_ADBG_BeginSubCase(c, "Hash case %d algo 0x%x",
1021 (int)n, (unsigned int)hash_cases[n].algo);
1022
1023 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1024 ta_crypt_cmd_allocate_operation(c, &session, &op1,
1025 hash_cases[n].algo,
1026 TEE_MODE_DIGEST, 0)))
1027 goto out;
1028
1029 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1030 ta_crypt_cmd_allocate_operation(c, &session, &op2,
1031 hash_cases[n].algo,
1032 TEE_MODE_DIGEST, 0)))
1033 goto out;
1034
1035 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1036 ta_crypt_cmd_digest_update(c, &session, op1,
1037 hash_cases[n].in,
1038 hash_cases[n].in_incr)))
1039 goto out;
1040
1041 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1042 ta_crypt_cmd_copy_operation(c, &session, op2, op1)))
1043 goto out;
1044
1045 out_size = sizeof(out);
1046 memset(out, 0, sizeof(out));
1047 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1048 ta_crypt_cmd_digest_do_final(c, &session, op2,
1049 hash_cases[n].in + hash_cases[n].in_incr,
1050 hash_cases[n].in_len - hash_cases[n].in_incr,
1051 out, &out_size)))
1052 goto out;
1053
1054 (void)ADBG_EXPECT_BUFFER(c, hash_cases[n].out,
1055 hash_cases[n].out_len, out, out_size);
1056
1057 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1058 ta_crypt_cmd_reset_operation(c, &session, op1)))
1059 goto out;
1060
1061 out_size = sizeof(out);
1062 memset(out, 0, sizeof(out));
1063 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1064 ta_crypt_cmd_digest_do_final(c, &session, op1,
1065 hash_cases[n].in,
1066 hash_cases[n].in_len, out,
1067 &out_size)))
1068 goto out;
1069
1070 (void)ADBG_EXPECT_BUFFER(c, hash_cases[n].out,
1071 hash_cases[n].out_len, out, out_size);
1072
Jerome Forissier1e05e262015-07-29 16:09:07 +02001073 /*
1074 * Invoke TEE_DigestDoFinal() a second time to check that state
1075 * was properly reset
1076 */
1077 out_size = sizeof(out);
1078 memset(out, 0, sizeof(out));
1079 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1080 ta_crypt_cmd_digest_do_final(c, &session, op1,
1081 hash_cases[n].in,
1082 hash_cases[n].in_len, out,
1083 &out_size)))
1084 goto out;
1085
1086 (void)ADBG_EXPECT_BUFFER(c, hash_cases[n].out,
1087 hash_cases[n].out_len, out, out_size);
1088
Pascal Brandc639ac82015-07-02 08:53:34 +02001089 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1090 ta_crypt_cmd_free_operation(c, &session, op1)))
1091 goto out;
1092
1093 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1094 ta_crypt_cmd_free_operation(c, &session, op2)))
1095 goto out;
1096
1097 Do_ADBG_EndSubCase(c, NULL);
1098 }
1099
1100out:
1101 TEEC_CloseSession(&session);
1102}
Jens Wiklander14f48872018-06-29 15:30:13 +02001103ADBG_CASE_DEFINE(regression, 4001, xtest_tee_test_4001,
1104 "Test TEE Internal API hash operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02001105
Pascal Brandc639ac82015-07-02 08:53:34 +02001106struct xtest_mac_case {
1107 uint32_t algo;
1108 uint32_t key_type;
1109 const uint8_t *key;
1110 size_t key_len;
1111 size_t in_incr;
1112 const uint8_t *in;
1113 size_t in_len;
1114 const uint8_t *out;
1115 size_t out_len;
Jerome Forissier3dec7442019-01-30 17:50:05 +01001116 bool multiple_incr;
Pascal Brandc639ac82015-07-02 08:53:34 +02001117};
1118
Jerome Forissier3dec7442019-01-30 17:50:05 +01001119#define XTEST_MAC_CASE_1(algo, key_type, key, in_incr, in, out) \
Pascal Brandc639ac82015-07-02 08:53:34 +02001120 { (algo), (key_type), (key), ARRAY_SIZE(key), \
Jerome Forissier3dec7442019-01-30 17:50:05 +01001121 (in_incr), (in), ARRAY_SIZE(in), (out), ARRAY_SIZE(out), false }
1122
1123#define XTEST_MAC_CASE_MULT(algo, key_type, key, in_incr, in, out) \
1124 { (algo), (key_type), (key), ARRAY_SIZE(key), \
1125 (in_incr), (in), ARRAY_SIZE(in), (out), ARRAY_SIZE(out), true }
1126
1127#define XTEST_MAC_CASE(algo, key_type, key, in_incr, in, out) \
1128 XTEST_MAC_CASE_1((algo), (key_type), (key), (in_incr), (in), (out)), \
1129 XTEST_MAC_CASE_MULT((algo), (key_type), (key), (in_incr), (in), (out))
Pascal Brandc639ac82015-07-02 08:53:34 +02001130
1131#define XTEST_MAC_CBC_CASE(algo, key_type, vect, in_incr) \
1132 XTEST_MAC_CASE((algo), (key_type), \
1133 mac_cbc_ ## vect ## _key, (in_incr), \
1134 mac_cbc_ ## vect ## _data, mac_cbc_ ## vect ## _out)
1135
1136#define XTEST_MAC_CMAC_CASE(vect, in_incr) \
1137 XTEST_MAC_CASE(TEE_ALG_AES_CMAC, TEE_TYPE_AES, \
1138 mac_cmac_ ## vect ## _key, (in_incr), \
1139 mac_cmac_ ## vect ## _data, mac_cmac_ ## vect ## _out)
1140
Alexander Zakharov0afe00c2021-02-10 19:06:48 +01001141#define XTEST_MAC_DES3_CMAC_CASE(vect, in_incr) \
1142 XTEST_MAC_CASE(TEE_ALG_DES3_CMAC, TEE_TYPE_DES3, \
1143 mac_des3_cmac_ ## vect ## _key, (in_incr), \
1144 mac_des3_cmac_ ## vect ## _data, mac_des3_cmac_ ## vect ## _out)
1145
Pascal Brandc639ac82015-07-02 08:53:34 +02001146static const struct xtest_mac_case mac_cases[] = {
1147 XTEST_MAC_CASE(TEE_ALG_HMAC_MD5, TEE_TYPE_HMAC_MD5,
1148 mac_data_md5_key1,
1149 4, mac_data_md5_in1, mac_data_md5_out1),
1150 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA1, TEE_TYPE_HMAC_SHA1,
1151 mac_data_sha1_key1,
1152 5, mac_data_sha1_in1, mac_data_sha1_out1),
1153 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA224, TEE_TYPE_HMAC_SHA224,
1154 mac_data_sha224_key1,
1155 8, mac_data_sha224_in1, mac_data_sha224_out1),
1156 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA256, TEE_TYPE_HMAC_SHA256,
1157 mac_data_sha256_key1,
1158 1, mac_data_sha256_in1, mac_data_sha256_out1),
1159 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA256, TEE_TYPE_HMAC_SHA256,
1160 mac_data_sha256_key2,
1161 7, mac_data_sha256_in2, mac_data_sha256_out2),
1162 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA384, TEE_TYPE_HMAC_SHA384,
1163 mac_data_sha384_key1,
1164 11, mac_data_sha384_in1, mac_data_sha384_out1),
1165 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA512, TEE_TYPE_HMAC_SHA512,
1166 mac_data_sha512_key1,
1167 13, mac_data_sha512_in1, mac_data_sha512_out1),
1168
1169 XTEST_MAC_CBC_CASE(TEE_ALG_AES_CBC_MAC_NOPAD, TEE_TYPE_AES, vect1, 14),
1170 XTEST_MAC_CBC_CASE(TEE_ALG_DES_CBC_MAC_NOPAD, TEE_TYPE_DES, vect2, 16),
1171 XTEST_MAC_CBC_CASE(TEE_ALG_DES3_CBC_MAC_NOPAD, TEE_TYPE_DES3, vect3,
1172 17),
1173 XTEST_MAC_CBC_CASE(TEE_ALG_AES_CBC_MAC_PKCS5, TEE_TYPE_AES, vect4, 11),
1174 XTEST_MAC_CBC_CASE(TEE_ALG_DES_CBC_MAC_PKCS5, TEE_TYPE_DES, vect5, 9),
1175 XTEST_MAC_CBC_CASE(TEE_ALG_DES3_CBC_MAC_PKCS5, TEE_TYPE_DES3, vect6, 4),
1176 XTEST_MAC_CBC_CASE(TEE_ALG_AES_CBC_MAC_PKCS5, TEE_TYPE_AES, vect7, 3),
1177 XTEST_MAC_CBC_CASE(TEE_ALG_DES_CBC_MAC_PKCS5, TEE_TYPE_DES, vect8, 23),
1178 XTEST_MAC_CBC_CASE(TEE_ALG_DES3_CBC_MAC_PKCS5, TEE_TYPE_DES3, vect9,
1179 34),
Pascal Brand5c3d8092015-07-23 08:20:26 +02001180 XTEST_MAC_CBC_CASE(TEE_ALG_DES3_CBC_MAC_PKCS5, TEE_TYPE_DES3, vect10, 4),
Pascal Brandc639ac82015-07-02 08:53:34 +02001181
1182 { TEE_ALG_AES_CMAC, TEE_TYPE_AES, mac_cmac_vect1_key,
1183 ARRAY_SIZE(mac_cmac_vect1_key), 0, NULL, 0, mac_cmac_vect1_out,
1184 ARRAY_SIZE(mac_cmac_vect1_out) },
1185 XTEST_MAC_CMAC_CASE(vect2, 9),
1186 XTEST_MAC_CMAC_CASE(vect3, 9),
1187 XTEST_MAC_CMAC_CASE(vect4, 9),
1188 { TEE_ALG_AES_CMAC, TEE_TYPE_AES, mac_cmac_vect5_key,
1189 ARRAY_SIZE(mac_cmac_vect5_key), 0, NULL, 0, mac_cmac_vect5_out,
1190 ARRAY_SIZE(mac_cmac_vect5_out) },
1191 XTEST_MAC_CMAC_CASE(vect6, 9),
1192 XTEST_MAC_CMAC_CASE(vect7, 9),
1193 XTEST_MAC_CMAC_CASE(vect8, 9),
1194 { TEE_ALG_AES_CMAC, TEE_TYPE_AES, mac_cmac_vect9_key,
1195 ARRAY_SIZE(mac_cmac_vect9_key), 0, NULL, 0, mac_cmac_vect9_out,
1196 ARRAY_SIZE(mac_cmac_vect9_out) },
1197 XTEST_MAC_CMAC_CASE(vect10, 9),
1198 XTEST_MAC_CMAC_CASE(vect11, 9),
1199 XTEST_MAC_CMAC_CASE(vect12, 9),
Clement Faure21b347a2021-04-29 13:06:55 +02001200 XTEST_MAC_CMAC_CASE(vect12, 16),
Jerome Forissier9f17e262019-12-13 14:12:41 +01001201
Alexander Zakharov0afe00c2021-02-10 19:06:48 +01001202 { TEE_ALG_DES3_CMAC, TEE_TYPE_DES3, mac_des3_cmac_vect1_key,
1203 ARRAY_SIZE(mac_des3_cmac_vect1_key), 0, NULL, 0, mac_des3_cmac_vect1_out,
1204 ARRAY_SIZE(mac_des3_cmac_vect1_out) },
1205 XTEST_MAC_DES3_CMAC_CASE(vect2, 3),
1206 XTEST_MAC_DES3_CMAC_CASE(vect3, 9),
1207 XTEST_MAC_DES3_CMAC_CASE(vect4, 9),
1208 { TEE_ALG_DES3_CMAC, TEE_TYPE_DES3, mac_des3_cmac_vect5_key,
1209 ARRAY_SIZE(mac_des3_cmac_vect5_key), 0, NULL, 0, mac_des3_cmac_vect5_out,
1210 ARRAY_SIZE(mac_des3_cmac_vect5_out) },
1211 XTEST_MAC_DES3_CMAC_CASE(vect6, 3),
1212 XTEST_MAC_DES3_CMAC_CASE(vect7, 5),
1213 XTEST_MAC_DES3_CMAC_CASE(vect8, 9),
1214
Jerome Forissier9f17e262019-12-13 14:12:41 +01001215 XTEST_MAC_CASE(TEE_ALG_HMAC_SM3, TEE_TYPE_HMAC_SM3,
1216 mac_data_sm3_d31_key,
1217 13, mac_data_sm3_d31_in, mac_data_sm3_d31_out),
1218 XTEST_MAC_CASE(TEE_ALG_HMAC_SM3, TEE_TYPE_HMAC_SM3,
1219 mac_data_sm3_d32_key,
1220 13, mac_data_sm3_d32_in, mac_data_sm3_d32_out),
Pascal Brandc639ac82015-07-02 08:53:34 +02001221};
1222
1223static void xtest_tee_test_4002(ADBG_Case_t *c)
1224{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001225 TEEC_Session session = { };
1226 TEE_OperationHandle op1 = TEE_HANDLE_NULL;
1227 TEE_OperationHandle op2 = TEE_HANDLE_NULL;
Jerome Forissier4f419512021-07-07 14:56:10 +02001228 TEE_OperationHandle op3 = TEE_HANDLE_NULL;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001229 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
1230 uint8_t out[64] = { };
1231 size_t out_size = 0;
1232 uint32_t ret_orig = 0;
1233 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001234
1235 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1236 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
1237 &ret_orig)))
1238 return;
1239
1240 for (n = 0; n < ARRAY_SIZE(mac_cases); n++) {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001241 TEE_Attribute key_attr = { };
1242 size_t key_size = 0;
1243 size_t offs = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001244
1245 Do_ADBG_BeginSubCase(c, "MAC case %d algo 0x%x",
1246 (int)n, (unsigned int)mac_cases[n].algo);
1247
1248 key_attr.attributeID = TEE_ATTR_SECRET_VALUE;
1249 key_attr.content.ref.buffer = (void *)mac_cases[n].key;
1250 key_attr.content.ref.length = mac_cases[n].key_len;
1251
1252 key_size = key_attr.content.ref.length * 8;
1253 if (mac_cases[n].key_type == TEE_TYPE_DES ||
1254 mac_cases[n].key_type == TEE_TYPE_DES3)
1255 /* Exclude parity in bit size of key */
1256 key_size -= key_size / 8;
1257
1258 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1259 ta_crypt_cmd_allocate_operation(c, &session, &op1,
1260 mac_cases[n].algo, TEE_MODE_MAC, key_size)))
1261 goto out;
1262
1263 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1264 ta_crypt_cmd_allocate_operation(c, &session, &op2,
1265 mac_cases[n].algo, TEE_MODE_MAC, key_size)))
1266 goto out;
1267
1268 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jerome Forissier4f419512021-07-07 14:56:10 +02001269 ta_crypt_cmd_allocate_operation(c, &session, &op3,
1270 mac_cases[n].algo, TEE_MODE_MAC, key_size)))
1271 goto out;
1272
1273 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc639ac82015-07-02 08:53:34 +02001274 ta_crypt_cmd_allocate_transient_object(c, &session,
1275 mac_cases[n].key_type, key_size, &key_handle)))
1276 goto out;
1277
1278 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1279 ta_crypt_cmd_populate_transient_object(c, &session,
1280 key_handle, &key_attr, 1)))
1281 goto out;
1282
1283 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1284 ta_crypt_cmd_set_operation_key(c, &session, op1,
1285 key_handle)))
1286 goto out;
1287
1288 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1289 ta_crypt_cmd_free_transient_object(c, &session,
1290 key_handle)))
1291 goto out;
1292
1293 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1294 ta_crypt_cmd_mac_init(c, &session, op1, NULL, 0)))
1295 goto out;
1296
Jerome Forissier4f419512021-07-07 14:56:10 +02001297 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1298 ta_crypt_cmd_copy_operation(c, &session, op3, op1)))
1299 goto out;
1300
Jerome Forissier3dec7442019-01-30 17:50:05 +01001301 offs = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001302 if (mac_cases[n].in != NULL) {
Jerome Forissier3dec7442019-01-30 17:50:05 +01001303 while (offs + mac_cases[n].in_incr <
1304 mac_cases[n].in_len) {
1305 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1306 ta_crypt_cmd_mac_update(c, &session,
1307 op1, mac_cases[n].in + offs,
1308 mac_cases[n].in_incr)))
1309 goto out;
1310 offs += mac_cases[n].in_incr;
1311 if (!mac_cases[n].multiple_incr)
1312 break;
1313 }
Pascal Brandc639ac82015-07-02 08:53:34 +02001314 }
1315
1316 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1317 ta_crypt_cmd_copy_operation(c, &session, op2, op1)))
1318 goto out;
1319
1320 out_size = sizeof(out);
1321 memset(out, 0, sizeof(out));
1322 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1323 ta_crypt_cmd_mac_final_compute(c, &session, op2,
Jerome Forissier3dec7442019-01-30 17:50:05 +01001324 mac_cases[n].in + offs,
1325 mac_cases [n].in_len - offs,
Pascal Brandc639ac82015-07-02 08:53:34 +02001326 out, &out_size)))
1327 goto out;
1328
1329 (void)ADBG_EXPECT_BUFFER(c, mac_cases[n].out,
1330 mac_cases[n].out_len, out, out_size);
1331
1332 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1333 ta_crypt_cmd_mac_init(c, &session, op1, NULL, 0)))
1334 goto out;
1335
1336 out_size = sizeof(out);
1337 memset(out, 0, sizeof(out));
1338 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1339 ta_crypt_cmd_mac_final_compute(c, &session, op1,
1340 mac_cases[n].in, mac_cases[n].in_len, out,
1341 &out_size)))
1342 goto out;
1343
1344 (void)ADBG_EXPECT_BUFFER(c, mac_cases[n].out,
1345 mac_cases[n].out_len, out, out_size);
1346
1347 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jerome Forissier4f419512021-07-07 14:56:10 +02001348 ta_crypt_cmd_mac_final_compare(c, &session, op3,
1349 mac_cases[n].in, mac_cases[n].in_len,
1350 mac_cases[n].out, mac_cases[n].out_len)))
1351 goto out;
1352
1353 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc639ac82015-07-02 08:53:34 +02001354 ta_crypt_cmd_free_operation(c, &session, op1)))
1355 goto out;
1356
1357 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1358 ta_crypt_cmd_free_operation(c, &session, op2)))
1359 goto out;
1360
Jerome Forissier4f419512021-07-07 14:56:10 +02001361 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1362 ta_crypt_cmd_free_operation(c, &session, op3)))
1363 goto out;
1364
Pascal Brandc639ac82015-07-02 08:53:34 +02001365 Do_ADBG_EndSubCase(c, NULL);
1366 }
1367out:
1368 TEEC_CloseSession(&session);
1369}
Jens Wiklander14f48872018-06-29 15:30:13 +02001370ADBG_CASE_DEFINE(regression, 4002, xtest_tee_test_4002,
1371 "Test TEE Internal API MAC operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02001372
Pascal Brandc639ac82015-07-02 08:53:34 +02001373static const uint8_t ciph_data_aes_key1[] = {
1374 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1375 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1376};
1377
Jerome Forissier0780ad42018-06-05 15:02:37 +02001378static const uint8_t ciph_data_aes_key2[] = {
1379 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
1380 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
1381};
1382
Pascal Brandc639ac82015-07-02 08:53:34 +02001383static const uint8_t ciph_data_des_key1[] = {
1384 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37 /* 01234567 */
1385};
1386
1387static const uint8_t ciph_data_des_key2[] = {
1388 0x13, 0x34, 0x57, 0x79, 0x9B, 0xBC, 0xDF, 0xF1
1389};
1390
1391
1392static const uint8_t ciph_data_des3_key1[] = {
1393 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1394 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1395 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, /* 12345678 */
1396};
1397
1398static const uint8_t ciph_data_des3_key2[] = {
1399 0x13, 0x34, 0x57, 0x79, 0x9B, 0xBC, 0xDF, 0xF1,
1400 0x13, 0x34, 0x57, 0x79, 0x9B, 0xBC, 0xDF, 0xF1,
1401 0x13, 0x34, 0x57, 0x79, 0x9B, 0xBC, 0xDF, 0xF1
1402};
1403
1404static const uint8_t ciph_data_des2_key1[] = {
1405 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1406 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1407};
1408
1409static const uint8_t ciph_data_in1[] = {
1410 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, /* 23456789 */
1411 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, /* ABCDEF01 */
1412 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, /* 3456789A */
1413 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, /* BCDEF012 */
1414 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, /* 456789AB */
1415 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, 0x33, /* CDEF0123 */
1416};
1417
1418static const uint8_t ciph_data_in3[] = {
1419 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, /* 23456789 */
1420 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, /* ABCDEF01 */
1421 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, /* 3456789A */
1422 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, /* BCDEF012 */
1423 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, /* 456789AB */
1424 0x43, 0x44, 0x45, 0x46, 0x30, /* CDEF0 */
1425};
1426
Jerome Forissier45218eb2018-04-11 13:03:26 +02001427static const uint8_t ciph_data_in4[] = {
1428 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, /* 23456789 */
1429 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, /* ABCDEF01 */
1430 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, /* 3456789A */
1431 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, /* BCDEF012 */
1432 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, /* 456789AB */
1433 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, 0x33, /* CDEF0123 */
1434 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1435 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1436};
1437
Jerome Forissier0780ad42018-06-05 15:02:37 +02001438static const uint8_t ciph_data_in5[] = {
1439 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1440 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1441 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1442 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1443 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1444 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1445 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1446 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
Jerome Forissierbf9009e2018-06-05 18:44:42 +02001447 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1448 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
Jerome Forissier0780ad42018-06-05 15:02:37 +02001449 0x01, 0x01, 0x01
1450};
1451
Pascal Brandc639ac82015-07-02 08:53:34 +02001452static const uint8_t ciph_data_128_iv1[] = {
1453 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, /* 12345678 */
1454 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, /* 9ABCDEF0 */
1455};
1456
Jerome Forissier0780ad42018-06-05 15:02:37 +02001457static const uint8_t ciph_data_128_iv2[] = {
1458 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
1459 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
1460};
1461
Pascal Brandc639ac82015-07-02 08:53:34 +02001462static const uint8_t ciph_data_64_iv1[] = {
1463 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, /* 12345678 */
1464};
1465
1466static const uint8_t ciph_data_in2[] = {
1467 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef
1468};
1469
1470static const uint8_t ciph_data_aes_ecb_nopad_out1[] = {
1471 0xA5, 0xBE, 0x14, 0xD5, 0x01, 0x05, 0x24, 0x48, /* ......$H */
1472 0x58, 0x1A, 0x6B, 0x82, 0xD4, 0x41, 0xD2, 0xB3, /* X.k..A.. */
1473 0xBB, 0xF9, 0xAE, 0x37, 0x94, 0xAC, 0x18, 0x50, /* ...7...P */
1474 0x87, 0x09, 0xCC, 0x3F, 0x43, 0xD2, 0xC2, 0xB7, /* ...?C... */
1475 0xD7, 0x6F, 0x84, 0x07, 0xB4, 0x78, 0xCE, 0x34, /* .o...x.4 */
1476 0x48, 0xC9, 0x16, 0x86, 0x42, 0xB8, 0xFF, 0xCF, /* H...B... */
1477};
1478
1479static const uint8_t ciph_data_aes_cbc_nopad_out1[] = {
1480 0x8D, 0x9F, 0x88, 0xD8, 0xAF, 0x9F, 0xC1, 0x3B, /* .......; */
1481 0x02, 0x15, 0x43, 0x6A, 0x8C, 0x1E, 0x34, 0x5C, /* ..Cj..4\ */
1482 0x83, 0xF4, 0x85, 0x3E, 0x43, 0x0F, 0xE5, 0x5F, /* ...>C.._ */
1483 0x81, 0x4C, 0xC0, 0x28, 0x3F, 0xD9, 0x98, 0x53, /* .L.(?..S */
1484 0xB1, 0x44, 0x51, 0x38, 0x21, 0xAB, 0x10, 0xCE, /* .DQ8!... */
1485 0xC2, 0xEC, 0x65, 0x54, 0xDD, 0x5C, 0xEA, 0xDC, /* ..eT.\.. */
1486};
1487
1488static const uint8_t ciph_data_aes_ctr_out1[] = {
1489 0xD2, 0xDD, 0x11, 0xA8, 0xF7, 0xB0, 0xAE, 0x55, /* .......U */
1490 0xBE, 0x61, 0x7A, 0xE6, 0xA1, 0x6C, 0x79, 0xF4, /* .az..ly. */
1491 0x62, 0x51, 0x7B, 0xE9, 0x7C, 0xA0, 0x31, 0x0C, /* bQ{.|.1. */
1492 0x24, 0x15, 0x70, 0x7F, 0x47, 0x37, 0x69, 0xE0, /* $.p.G7i. */
1493 0x24, 0xC3, 0x29, 0xCD, 0xF2, 0x26, 0x69, 0xFF, /* $.)..&i. */
1494 0x72, 0x0E, 0x3C, 0xD1, 0xA1, 0x2F, 0x5D, 0x33, /* r.<../]3 */
1495};
1496
1497static const uint8_t ciph_data_aes_ctr_out2[] = {
1498 0xD2, 0xDD, 0x11, 0xA8, 0xF7, 0xB0, 0xAE, 0x55, /* .......U */
1499 0xBE, 0x61, 0x7A, 0xE6, 0xA1, 0x6C, 0x79, 0xF4, /* .az..ly. */
1500 0x62, 0x51, 0x7B, 0xE9, 0x7C, 0xA0, 0x31, 0x0C, /* bQ{.|.1. */
1501 0x24, 0x15, 0x70, 0x7F, 0x47, 0x37, 0x69, 0xE0, /* $.p.G7i. */
1502 0x24, 0xC3, 0x29, 0xCD, 0xF2, 0x26, 0x69, 0xFF, /* $.)..&i. */
1503 0x72, 0x0E, 0x3C, 0xD1, 0xA1, /* r.<.. */
1504};
1505
Jerome Forissier45218eb2018-04-11 13:03:26 +02001506static const uint8_t ciph_data_aes_ctr_out4[] = {
1507 0xD2, 0xDD, 0x11, 0xA8, 0xF7, 0xB0, 0xAE, 0x55, /* .......U */
1508 0xBE, 0x61, 0x7A, 0xE6, 0xA1, 0x6C, 0x79, 0xF4, /* .az..ly. */
1509 0x62, 0x51, 0x7B, 0xE9, 0x7C, 0xA0, 0x31, 0x0C, /* bQ{.|.1. */
1510 0x24, 0x15, 0x70, 0x7F, 0x47, 0x37, 0x69, 0xE0, /* $.p.G7i. */
1511 0x24, 0xC3, 0x29, 0xCD, 0xF2, 0x26, 0x69, 0xFF, /* $.)..&i. */
1512 0x72, 0x0E, 0x3C, 0xD1, 0xA1, 0x2F, 0x5D, 0x33, /* r.<../]3 */
1513 0x9F, 0xD7, 0x0C, 0x92, 0xD4, 0xA5, 0x9D, 0x06, /* ........ */
1514 0x01, 0x80, 0x38, 0xCD, 0xC2, 0x71, 0x5D, 0x4A, /* ..8..q]J */
1515};
1516
Jerome Forissier0780ad42018-06-05 15:02:37 +02001517static const uint8_t ciph_data_aes_ctr_out5[] = {
1518 0xbb, 0xfe, 0x07, 0x04, 0x1c, 0x8e, 0x09, 0x61,
1519 0xfb, 0xb1, 0x7c, 0xa5, 0x4d, 0x2b, 0x30, 0xf6,
1520 0x26, 0x9e, 0xff, 0x61, 0x18, 0x47, 0xc6, 0x06,
1521 0x81, 0x02, 0x84, 0xcd, 0x9c, 0x4b, 0x6d, 0x21,
1522 0xe2, 0x64, 0xa6, 0x50, 0x7f, 0x28, 0x81, 0x6f,
1523 0x29, 0xda, 0xd5, 0x56, 0x3f, 0x46, 0xac, 0xca,
1524 0x37, 0xe7, 0x77, 0x36, 0xbc, 0x76, 0x39, 0x57,
1525 0xaa, 0x67, 0x1b, 0x2a, 0xe6, 0x36, 0x57, 0x6d,
Jerome Forissierbf9009e2018-06-05 18:44:42 +02001526 0x2a, 0xb8, 0x77, 0x41, 0xc2, 0x4e, 0x4f, 0x27,
1527 0x4c, 0x34, 0x7a, 0x01, 0x6a, 0xda, 0x75, 0x75,
1528 0x3e, 0x68, 0xb2
Jerome Forissier0780ad42018-06-05 15:02:37 +02001529};
1530
Pascal Brandc639ac82015-07-02 08:53:34 +02001531static const uint8_t ciph_data_aes_cbc_vect1_key[] = {
1532 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1533 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1534};
1535
1536static const uint8_t ciph_data_aes_cbc_vect1_iv[] = {
1537 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
1538 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
1539};
1540
1541static const uint8_t ciph_data_aes_cbc_vect1_ptx[] = {
1542 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x20, 0x62, /* Cipher b */
1543 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x63, 0x68, 0x61, /* lock cha */
1544 0x69, 0x6E, 0x69, 0x6E, 0x67, 0x20, 0x28, 0x43, /* ining (C */
1545 0x42, 0x43, 0x29, 0x20, 0x69, 0x73, 0x20, 0x61, /* BC) is a */
1546 0x20, 0x63, 0x6F, 0x6D, 0x6D, 0x6F, 0x6E, 0x20, /* common */
1547 0x63, 0x68, 0x61, 0x69, 0x6E, 0x69, 0x6E, 0x67, /* chaining */
1548 0x20, 0x6D, 0x6F, 0x64, 0x65, 0x20, 0x69, 0x6E, /* mode in */
1549 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, /* which t */
1550 0x68, 0x65, 0x20, 0x70, 0x72, 0x65, 0x76, 0x69, /* he previ */
1551 0x6F, 0x75, 0x73, 0x20, 0x62, 0x6C, 0x6F, 0x63, /* ous bloc */
1552 0x6B, 0x27, 0x73, 0x20, 0x63, 0x69, 0x70, 0x68, /* k's ciph */
1553 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, 0x20, 0x69, /* ertext i */
1554 0x73, 0x20, 0x78, 0x6F, 0x72, 0x65, 0x64, 0x20, /* s xored */
1555 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, /* with the */
1556 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, /* current */
1557 0x20, 0x62, 0x6C, 0x6F, 0x63, 0x6B, 0x27, 0x73, /* block's */
1558 0x20, 0x70, 0x6C, 0x61, 0x69, 0x6E, 0x74, 0x65, /* plainte */
1559 0x78, 0x74, 0x20, 0x62, 0x65, 0x66, 0x6F, 0x72, /* xt befor */
1560 0x65, 0x20, 0x65, 0x6E, 0x63, 0x72, 0x79, 0x70, /* e encryp */
1561 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x2E, 0x2E, 0x2E, /* tion.... */
1562};
1563
1564static const uint8_t ciph_data_aes_cbc_vect1_ctx[] = {
1565 0xDD, 0x16, 0xC3, 0x47, 0x69, 0xEC, 0xF5, 0x86, /* ...Gi... */
1566 0x20, 0xB4, 0xF7, 0xE3, 0xB9, 0x36, 0xE8, 0xAC, /* ....6.. */
1567 0xC9, 0xA2, 0x11, 0x71, 0x3B, 0x10, 0x9D, 0x45, /* ...q;..E */
1568 0xCA, 0xE2, 0x49, 0xA6, 0x4E, 0x56, 0x07, 0xC5, /* ..I.NV.. */
1569 0xCE, 0xA3, 0x14, 0xB5, 0x30, 0x1B, 0x63, 0xBB, /* ....0.c. */
1570 0x2D, 0x6F, 0xE9, 0xCA, 0x0B, 0x00, 0x31, 0x3F, /* -o....1? */
1571 0xA4, 0x9A, 0x39, 0xE1, 0xC8, 0xD2, 0x24, 0x95, /* ..9...$. */
1572 0x14, 0xE9, 0xD2, 0x43, 0xE8, 0xA8, 0x1E, 0x0A, /* ...C.... */
1573 0xFE, 0x9D, 0x4F, 0xF5, 0xBB, 0x16, 0xB9, 0x54, /* ..O....T */
1574 0x78, 0x07, 0x94, 0x05, 0x8E, 0x47, 0xC3, 0xCB, /* x....G.. */
1575 0x7C, 0xEC, 0xF4, 0xF8, 0xF2, 0xA4, 0x59, 0x6E, /* |.....Yn */
1576 0xED, 0xAD, 0x7F, 0x62, 0xAF, 0x89, 0xA8, 0x5B, /* ...b...[ */
1577 0x75, 0xD4, 0x73, 0xE3, 0xBA, 0x9F, 0x9A, 0xD2, /* u.s..... */
1578 0x0F, 0xFD, 0x3C, 0xE6, 0xC6, 0xA4, 0xD6, 0x6C, /* ..<....l */
1579 0x6A, 0x09, 0xE2, 0x16, 0xB0, 0x8C, 0x69, 0x3C, /* j.....i< */
1580 0xC8, 0x1C, 0xE4, 0x3E, 0x86, 0x4D, 0xB0, 0x2B, /* ...>.M.+ */
1581 0x29, 0xA0, 0x5A, 0xA3, 0x67, 0xBA, 0xDC, 0x11, /* ).Z.g... */
1582 0x08, 0x5E, 0x69, 0xB4, 0x6F, 0xA5, 0xE2, 0xB8, /* .^i.o... */
1583 0xC9, 0x6E, 0x83, 0x7E, 0x35, 0xC8, 0xA7, 0xA0, /* .n.~5... */
1584 0x33, 0xA3, 0xB1, 0x4B, 0x5A, 0x92, 0x51, 0x2E, /* 3..KZ.Q. */
1585};
1586
1587/* AES-CTS test vectors from http://tools.ietf.org/html/rfc3962
1588 * and http://tools.ietf.org/html/draft-raeburn-krb-rijndael-krb-02 */
1589static const uint8_t ciph_data_aes_cts_vect1_key[] = {
1590 0x63, 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x20,
1591 0x74, 0x65, 0x72, 0x69, 0x79, 0x61, 0x6b, 0x69
1592};
1593
1594static const uint8_t ciph_data_aes_cts_vect1_iv[16] = {
1595 0x00
1596};
1597
1598static const uint8_t ciph_data_aes_cts_vect1_ptx[] = {
1599 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1600 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1601 0x20
1602};
1603
1604static const uint8_t ciph_data_aes_cts_vect1_ctx[] = {
1605 0xc6, 0x35, 0x35, 0x68, 0xf2, 0xbf, 0x8c, 0xb4,
1606 0xd8, 0xa5, 0x80, 0x36, 0x2d, 0xa7, 0xff, 0x7f,
1607 0x97
1608};
1609
1610#define ciph_data_aes_cts_vect2_key ciph_data_aes_cts_vect1_key
1611#define ciph_data_aes_cts_vect2_iv ciph_data_aes_cts_vect1_iv
1612static const uint8_t ciph_data_aes_cts_vect2_ptx[] = {
1613 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1614 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1615 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
1616 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20
1617};
1618
1619static const uint8_t ciph_data_aes_cts_vect2_ctx[] = {
1620 0xfc, 0x00, 0x78, 0x3e, 0x0e, 0xfd, 0xb2, 0xc1,
1621 0xd4, 0x45, 0xd4, 0xc8, 0xef, 0xf7, 0xed, 0x22,
1622 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
1623 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5
1624};
1625
1626#define ciph_data_aes_cts_vect3_key ciph_data_aes_cts_vect1_key
1627#define ciph_data_aes_cts_vect3_iv ciph_data_aes_cts_vect1_iv
1628static const uint8_t ciph_data_aes_cts_vect3_ptx[] = {
1629 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1630 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1631 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
1632 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43,
1633};
1634
1635static const uint8_t ciph_data_aes_cts_vect3_ctx[] = {
1636 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
1637 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8,
1638 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
1639 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
1640};
1641
1642#define ciph_data_aes_cts_vect4_key ciph_data_aes_cts_vect1_key
1643#define ciph_data_aes_cts_vect4_iv ciph_data_aes_cts_vect1_iv
1644static const uint8_t ciph_data_aes_cts_vect4_ptx[] = {
1645 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1646 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1647 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
1648 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43,
1649 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x2c, 0x20,
1650 0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2c,
1651};
1652
1653static const uint8_t ciph_data_aes_cts_vect4_ctx[] = {
1654 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
1655 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
1656 0xb3, 0xff, 0xfd, 0x94, 0x0c, 0x16, 0xa1, 0x8c,
1657 0x1b, 0x55, 0x49, 0xd2, 0xf8, 0x38, 0x02, 0x9e,
1658 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
1659 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5,
1660};
1661
1662#define ciph_data_aes_cts_vect5_key ciph_data_aes_cts_vect1_key
1663#define ciph_data_aes_cts_vect5_iv ciph_data_aes_cts_vect1_iv
1664static const uint8_t ciph_data_aes_cts_vect5_ptx[] = {
1665 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1666 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1667 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
1668 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43,
1669 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x2c, 0x20,
1670 0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2c, 0x20,
1671};
1672
1673static const uint8_t ciph_data_aes_cts_vect5_ctx[] = {
1674 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
1675 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
1676 0x9d, 0xad, 0x8b, 0xbb, 0x96, 0xc4, 0xcd, 0xc0,
1677 0x3b, 0xc1, 0x03, 0xe1, 0xa1, 0x94, 0xbb, 0xd8,
1678 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
1679 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8,
1680};
1681
1682#define ciph_data_aes_cts_vect6_key ciph_data_aes_cts_vect1_key
1683#define ciph_data_aes_cts_vect6_iv ciph_data_aes_cts_vect1_iv
1684static const uint8_t ciph_data_aes_cts_vect6_ptx[] = {
1685 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1686 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1687 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
1688 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43,
1689 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x2c, 0x20,
1690 0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2c, 0x20,
1691 0x61, 0x6e, 0x64, 0x20, 0x77, 0x6f, 0x6e, 0x74,
1692 0x6f, 0x6e, 0x20, 0x73, 0x6f, 0x75, 0x70, 0x2e,
1693};
1694
1695static const uint8_t ciph_data_aes_cts_vect6_ctx[] = {
1696 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
1697 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
1698 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
1699 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8,
1700 0x48, 0x07, 0xef, 0xe8, 0x36, 0xee, 0x89, 0xa5,
1701 0x26, 0x73, 0x0d, 0xbc, 0x2f, 0x7b, 0xc8, 0x40,
1702 0x9d, 0xad, 0x8b, 0xbb, 0x96, 0xc4, 0xcd, 0xc0,
1703 0x3b, 0xc1, 0x03, 0xe1, 0xa1, 0x94, 0xbb, 0xd8,
1704};
1705
Jerome Forissiered00e162017-01-20 09:22:52 +01001706/*
1707 * Test case for https://github.com/OP-TEE/optee_os/issues/1203
1708 * 80 bytes of data, processed in two steps (32 + 48).
1709 */
1710
1711#define ciph_data_aes_cts_issue1203_key ciph_data_aes_cts_vect1_key
1712
1713static const uint8_t ciph_data_aes_cts_issue1203_iv[] = {
1714 0x5b, 0x11, 0x7b, 0xf9, 0x83, 0x6a, 0x01, 0x27,
1715 0x1d, 0x2a, 0xae, 0x0a, 0xd3, 0x27, 0x35, 0x81,
1716};
1717
1718static const uint8_t ciph_data_aes_cts_issue1203_ptx[] = {
1719 0x33, 0x2a, 0xf4, 0x8c, 0x18, 0xa1, 0x30, 0x7c,
1720 0xa7, 0x52, 0x76, 0xca, 0xa6, 0x68, 0xad, 0xf6,
1721 0x1e, 0xba, 0xc9, 0x66, 0x66, 0x52, 0x1a, 0xe7,
1722 0x3e, 0xbc, 0xba, 0x60, 0x95, 0x71, 0x04, 0x5e,
1723 0xb4, 0xb7, 0x10, 0xd7, 0x93, 0x6d, 0x5f, 0x9a,
1724 0xb8, 0xbb, 0x6b, 0xb0, 0x6d, 0x47, 0x93, 0x41,
1725 0x29, 0x21, 0xf2, 0x84, 0xf5, 0xb2, 0xf2, 0x6d,
1726 0xbe, 0xe5, 0x8a, 0x2b, 0x58, 0x8d, 0x1b, 0x5e,
1727 0x41, 0x04, 0xba, 0x9e, 0x92, 0xe9, 0x52, 0xb6,
1728 0x8b, 0x1e, 0x36, 0x72, 0x91, 0xe4, 0x56, 0x66,
1729};
1730
1731/*
1732 * Ciphertext was generated by an online tool for AES CBC.
1733 * Since the input size is a multiple of the block size, and the ciphertext
1734 * format is CS3, the output is the same as plain AES CBC with the last
1735 * two blocks swapped.
1736 */
1737static const uint8_t ciph_data_aes_cts_issue1203_ctx[] = {
1738 0x6c, 0xfe, 0xef, 0x6a, 0x1c, 0x8f, 0xd3, 0xc3,
1739 0x66, 0xc4, 0xd9, 0x0e, 0xbe, 0x24, 0x17, 0x3f,
1740 0xcd, 0x19, 0xc9, 0xd2, 0x10, 0x3f, 0xcf, 0xdc,
1741 0xe9, 0x05, 0xab, 0xd5, 0x1a, 0x31, 0x41, 0x77,
1742 0x3b, 0xd7, 0x6a, 0x26, 0xae, 0x0d, 0xc9, 0x47,
1743 0x77, 0xd4, 0xa7, 0xd5, 0x73, 0x88, 0x9e, 0xde,
1744 0x72, 0x66, 0xe0, 0xe2, 0x3d, 0x62, 0x91, 0x22,
1745 0xae, 0x11, 0x01, 0x97, 0x22, 0x6a, 0x45, 0xa9,
1746 0xba, 0x56, 0xd2, 0xbc, 0x55, 0x2d, 0x99, 0x4d,
1747 0x3d, 0x22, 0x27, 0x9a, 0xac, 0x66, 0x2f, 0xf5,
1748};
1749
Pascal Brandc639ac82015-07-02 08:53:34 +02001750static const uint8_t ciph_data_des_ecb_nopad_out1[] = {
1751 0x46, 0x2B, 0x91, 0xA8, 0x55, 0xE6, 0x7E, 0x75, /* F+..U.~u */
1752 0x5E, 0x53, 0xF4, 0x8F, 0x29, 0x41, 0x4E, 0xEF, /* ^S..)AN. */
1753 0x32, 0x1B, 0x58, 0x42, 0x9B, 0xB4, 0x3A, 0x1F, /* 2.XB..:. */
1754 0x9A, 0xEA, 0xA4, 0xB4, 0xCD, 0xE9, 0x87, 0x7C, /* .......| */
1755 0xC0, 0x05, 0x34, 0xED, 0x86, 0x3C, 0x2A, 0x81, /* ..4..<.. */
1756 0x5E, 0x93, 0x0E, 0x86, 0xA9, 0xBB, 0x80, 0xFF, /* ^....... */
1757};
1758
1759static const uint8_t ciph_data_des_ecb_nopad_out2[] = {
1760 0x85, 0xE8, 0x13, 0x54, 0x0F, 0x0A, 0xB4, 0x05
1761};
1762
1763static const uint8_t ciph_data_des_cbc_nopad_out1[] = {
1764 0xAD, 0xD6, 0xD6, 0x3E, 0x88, 0xD0, 0xDD, 0xD4, /* ...>.... */
1765 0x9A, 0x93, 0x95, 0xA0, 0x86, 0x22, 0x5B, 0x9E, /* ....."[. */
1766 0x84, 0x0C, 0x6F, 0x12, 0x04, 0x11, 0x6F, 0xD4, /* ..o...o. */
1767 0x12, 0x29, 0xC6, 0x78, 0x0C, 0xFB, 0x58, 0x5B, /* .).x..X[ */
1768 0x66, 0x82, 0x0E, 0x52, 0xDC, 0x25, 0x16, 0x51, /* f..R.%.Q */
1769 0x69, 0xDF, 0xFE, 0x4E, 0x11, 0x1D, 0x9D, 0x08, /* i..N.... */
1770};
1771
1772static const uint8_t ciph_data_des3_ecb_nopad_out1[] = {
1773 0xA7, 0x46, 0xEC, 0xA8, 0x6A, 0x7F, 0x4A, 0xF1, /* .F..j.J. */
1774 0x44, 0x60, 0x37, 0x3B, 0x7F, 0x76, 0xE5, 0xFF, /* D`7;.v.. */
1775 0xC1, 0xE7, 0xA5, 0x04, 0x9C, 0x29, 0x5C, 0xA5, /* .....)\. */
1776 0xDD, 0xC8, 0xEE, 0x36, 0x1F, 0x48, 0xE0, 0xA9, /* ...6.H.. */
1777 0x82, 0x2D, 0x53, 0x84, 0x49, 0x69, 0x78, 0xFA, /* .-S.Iix. */
1778 0x23, 0x69, 0x1D, 0xF7, 0x08, 0x38, 0x44, 0x05, /* #i...8D. */
1779};
1780
1781static const uint8_t ciph_data_des3_cbc_nopad_out1[] = {
1782 0x18, 0x09, 0xEB, 0x98, 0xE4, 0x58, 0x72, 0x11, /* .....Xr. */
1783 0x30, 0x58, 0xAB, 0x38, 0xB0, 0xC9, 0x2B, 0xED, /* 0X.8..+. */
1784 0xDA, 0xC5, 0xE8, 0xA9, 0xF6, 0x8A, 0xA7, 0x80, /* ........ */
1785 0xBE, 0x54, 0x1F, 0x63, 0xF6, 0xEE, 0xA2, 0x4C, /* .T.c...L */
1786 0x7C, 0xEB, 0x84, 0x7D, 0xDA, 0xCA, 0x1E, 0xB2, /* |..}.... */
1787 0xED, 0x5E, 0x96, 0xB8, 0x01, 0x4B, 0x77, 0x02, /* .^...Kw. */
1788};
1789
1790static const uint8_t ciph_data_des2_ecb_nopad_out1[] = {
1791 0xAB, 0x12, 0xB6, 0xE2, 0x4A, 0x3A, 0x26, 0x14, /* ....J:&. */
1792 0xF0, 0x7D, 0x23, 0xD0, 0x55, 0xDF, 0x5C, 0x16, /* .}#.U.\. */
1793 0x43, 0x59, 0x1E, 0x44, 0x01, 0x76, 0xD7, 0x50, /* CY.D.v.P */
1794 0x44, 0xC0, 0x15, 0xDF, 0x2E, 0x7F, 0x8B, 0xC5, /* D....... */
1795 0xFF, 0x8B, 0x87, 0xFE, 0x33, 0xD7, 0xCB, 0x2C, /* ....3.., */
1796 0xDA, 0x79, 0x6F, 0xA4, 0x05, 0x2B, 0x30, 0xCE, /* .yo..+0. */
1797};
1798
1799static const uint8_t ciph_data_des2_cbc_nopad_out1[] = {
1800 0x47, 0x2F, 0xB1, 0x83, 0xC4, 0xBB, 0x93, 0x16, /* G/...... */
1801 0x73, 0xF9, 0xAD, 0x6F, 0x00, 0xF9, 0xCB, 0x4A, /* s..o...J */
1802 0x0F, 0x4F, 0x75, 0x75, 0xFB, 0x39, 0x0B, 0xFC, /* .Ouu.9.. */
1803 0x9F, 0x48, 0x52, 0xAD, 0xA2, 0x75, 0x2C, 0xF1, /* .HR..u, . */
1804 0x7D, 0xC3, 0x8F, 0x16, 0xCF, 0xC9, 0x76, 0x29, /* }.....v) */
1805 0x1A, 0xBF, 0xB3, 0xD9, 0x10, 0x7E, 0xAA, 0x49, /* .....~.I */
1806};
1807
Jerome Forissiere73e0fb2019-12-12 17:08:03 +01001808/* SM4 ECB */
1809
1810static const uint8_t ciph_data_sm4_key1[] = {
1811 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
1812 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
1813};
1814
1815static const uint8_t ciph_data_sm4_in1[] = {
1816 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
1817 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
1818};
1819
1820static const uint8_t ciph_data_sm4_ecb_nopad_out1[] = {
1821 0x68, 0x1e, 0xdf, 0x34, 0xd2, 0x06, 0x96, 0x5e,
1822 0x86, 0xb3, 0xe9, 0x4f, 0x53, 0x6e, 0x42, 0x46,
1823};
1824
1825/*
1826 * SM4 CBC
1827 * https://tools.ietf.org/html/draft-ribose-cfrg-sm4-10#appendix-A.2.2.1
1828 */
1829static const uint8_t ciph_data_sm4_cbc_a221_key[] = {
1830 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
1831 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
1832};
1833
1834static const uint8_t ciph_data_sm4_cbc_a221_iv[] = {
1835 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1836 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1837};
1838
1839static const uint8_t ciph_data_sm4_cbc_a221_in[] = {
1840 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb,
1841 0xcc, 0xcc, 0xcc, 0xcc, 0xdd, 0xdd, 0xdd, 0xdd,
1842 0xee, 0xee, 0xee, 0xee, 0xff, 0xff, 0xff, 0xff,
1843 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb,
1844};
1845
1846static const uint8_t ciph_data_sm4_cbc_a221_out[] = {
1847 0x78, 0xeb, 0xb1, 0x1c, 0xc4, 0x0b, 0x0a, 0x48,
1848 0x31, 0x2a, 0xae, 0xb2, 0x04, 0x02, 0x44, 0xcb,
1849 0x4c, 0xb7, 0x01, 0x69, 0x51, 0x90, 0x92, 0x26,
1850 0x97, 0x9b, 0x0d, 0x15, 0xdc, 0x6a, 0x8f, 0x6d,
1851};
1852
1853/*
1854 * SM4 CBC
1855 * https://tools.ietf.org/html/draft-ribose-cfrg-sm4-10#appendix-A.2.2.2
1856 */
1857static const uint8_t ciph_data_sm4_cbc_a222_key[] = {
1858 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
1859 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
1860};
1861
1862static const uint8_t ciph_data_sm4_cbc_a222_iv[] = {
1863 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1864 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1865};
1866
1867static const uint8_t ciph_data_sm4_cbc_a222_in[] = {
1868 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb,
1869 0xcc, 0xcc, 0xcc, 0xcc, 0xdd, 0xdd, 0xdd, 0xdd,
1870 0xee, 0xee, 0xee, 0xee, 0xff, 0xff, 0xff, 0xff,
1871 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb,
1872};
1873
1874static const uint8_t ciph_data_sm4_cbc_a222_out[] = {
1875 0x0d, 0x3a, 0x6d, 0xdc, 0x2d, 0x21, 0xc6, 0x98,
1876 0x85, 0x72, 0x15, 0x58, 0x7b, 0x7b, 0xb5, 0x9a,
1877 0x91, 0xf2, 0xc1, 0x47, 0x91, 0x1a, 0x41, 0x44,
1878 0x66, 0x5e, 0x1f, 0xa1, 0xd4, 0x0b, 0xae, 0x38,
1879};
1880
1881/*
1882 * SM4 CTR
1883 * https://tools.ietf.org/html/draft-ribose-cfrg-sm4-10#appendix-A.2.5.1
1884 */
1885static const uint8_t ciph_data_sm4_ctr_a251_key[] = {
1886 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
1887 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
1888};
1889
1890static const uint8_t ciph_data_sm4_ctr_a251_iv[] = {
1891 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1892 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1893};
1894
1895static const uint8_t ciph_data_sm4_ctr_a251_in[] = {
1896 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1897 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
1898 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
1899 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1900 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee,
1901 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1902 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1903 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
1904};
1905
1906static const uint8_t ciph_data_sm4_ctr_a251_out[] = {
1907 0xac, 0x32, 0x36, 0xcb, 0x97, 0x0c, 0xc2, 0x07,
1908 0x91, 0x36, 0x4c, 0x39, 0x5a, 0x13, 0x42, 0xd1,
1909 0xa3, 0xcb, 0xc1, 0x87, 0x8c, 0x6f, 0x30, 0xcd,
1910 0x07, 0x4c, 0xce, 0x38, 0x5c, 0xdd, 0x70, 0xc7,
1911 0xf2, 0x34, 0xbc, 0x0e, 0x24, 0xc1, 0x19, 0x80,
1912 0xfd, 0x12, 0x86, 0x31, 0x0c, 0xe3, 0x7b, 0x92,
1913 0x6e, 0x02, 0xfc, 0xd0, 0xfa, 0xa0, 0xba, 0xf3,
1914 0x8b, 0x29, 0x33, 0x85, 0x1d, 0x82, 0x45, 0x14,
1915};
1916
1917/*
1918 * SM4 CTR
1919 * https://tools.ietf.org/html/draft-ribose-cfrg-sm4-10#appendix-A.2.5.2
1920 */
1921static const uint8_t ciph_data_sm4_ctr_a252_key[] = {
1922 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
1923 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
1924};
1925
1926static const uint8_t ciph_data_sm4_ctr_a252_iv[] = {
1927 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1928 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1929};
1930
1931static const uint8_t ciph_data_sm4_ctr_a252_in[] = {
1932 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1933 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
1934 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
1935 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1936 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee,
1937 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1938 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1939 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
1940};
1941
1942static const uint8_t ciph_data_sm4_ctr_a252_out[] = {
1943 0x5d, 0xcc, 0xcd, 0x25, 0xb9, 0x5a, 0xb0, 0x74,
1944 0x17, 0xa0, 0x85, 0x12, 0xee, 0x16, 0x0e, 0x2f,
1945 0x8f, 0x66, 0x15, 0x21, 0xcb, 0xba, 0xb4, 0x4c,
1946 0xc8, 0x71, 0x38, 0x44, 0x5b, 0xc2, 0x9e, 0x5c,
1947 0x0a, 0xe0, 0x29, 0x72, 0x05, 0xd6, 0x27, 0x04,
1948 0x17, 0x3b, 0x21, 0x23, 0x9b, 0x88, 0x7f, 0x6c,
1949 0x8c, 0xb5, 0xb8, 0x00, 0x91, 0x7a, 0x24, 0x88,
1950 0x28, 0x4b, 0xde, 0x9e, 0x16, 0xea, 0x29, 0x06,
1951};
1952
Pascal Brandc639ac82015-07-02 08:53:34 +02001953struct xtest_ciph_case {
1954 uint32_t algo;
1955 uint32_t mode;
1956 uint32_t key_type;
1957 const uint8_t *key1;
1958 size_t key1_len;
1959 const uint8_t *key2;
1960 size_t key2_len;
1961 const uint8_t *iv;
1962 size_t iv_len;
1963 size_t in_incr;
1964 const uint8_t *in;
1965 size_t in_len;
1966 const uint8_t *out;
1967 size_t out_len;
1968 size_t line;
1969};
1970
1971#define XTEST_CIPH_CASE_NO_IV(algo, key_type, key, in_incr, ptx, ctx) \
1972 { (algo), TEE_MODE_ENCRYPT, (key_type), (key), ARRAY_SIZE(key), \
1973 NULL, 0, NULL, 0, \
1974 (in_incr), (ptx), ARRAY_SIZE(ptx), (ctx), ARRAY_SIZE(ctx), \
1975 __LINE__ }, \
1976 { (algo), TEE_MODE_DECRYPT, (key_type), (key), ARRAY_SIZE(key), \
1977 NULL, 0, NULL, 0, \
1978 (in_incr), (ctx), ARRAY_SIZE(ctx), (ptx), ARRAY_SIZE(ptx), __LINE__ }
1979
1980#define XTEST_CIPH_CASE(algo, key_type, key, iv, in_incr, ptx, ctx) \
1981 { (algo), TEE_MODE_ENCRYPT, (key_type), (key), ARRAY_SIZE(key), \
1982 NULL, 0, iv, ARRAY_SIZE(iv), (in_incr), (ptx), ARRAY_SIZE(ptx), \
1983 (ctx), ARRAY_SIZE(ctx), __LINE__ }, \
1984 { (algo), TEE_MODE_DECRYPT, (key_type), (key), ARRAY_SIZE(key), \
1985 NULL, 0, iv, ARRAY_SIZE(iv), (in_incr), (ctx), ARRAY_SIZE(ctx), \
1986 (ptx), ARRAY_SIZE(ptx), __LINE__ }
1987
1988#define XTEST_CIPH_CASE_AES_XTS(vect, in_incr) \
1989 { TEE_ALG_AES_XTS, TEE_MODE_ENCRYPT, TEE_TYPE_AES, \
1990 ciph_data_aes_xts_ ## vect ## _key1, \
1991 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _key1), \
1992 ciph_data_aes_xts_ ## vect ## _key2, \
1993 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _key2), \
1994 ciph_data_aes_xts_ ## vect ## _iv, \
1995 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _iv), \
1996 (in_incr), \
1997 ciph_data_aes_xts_ ## vect ## _ptx, \
1998 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _ptx), \
1999 ciph_data_aes_xts_ ## vect ## _ctx, \
2000 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _ctx), __LINE__ }, \
2001 { TEE_ALG_AES_XTS, TEE_MODE_DECRYPT, TEE_TYPE_AES, \
2002 ciph_data_aes_xts_ ## vect ## _key1, \
2003 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _key1), \
2004 ciph_data_aes_xts_ ## vect ## _key2, \
2005 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _key2), \
2006 ciph_data_aes_xts_ ## vect ## _iv, \
2007 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _iv), \
2008 (in_incr), \
2009 ciph_data_aes_xts_ ## vect ## _ctx, \
2010 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _ctx), \
2011 ciph_data_aes_xts_ ## vect ## _ptx, \
2012 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _ptx), __LINE__ }
2013
2014#define XTEST_CIPH_CASE_AES_CBC(vect, in_incr) \
2015 XTEST_CIPH_CASE(TEE_ALG_AES_CBC_NOPAD, TEE_TYPE_AES, \
2016 ciph_data_aes_cbc_ ## vect ## _key, \
2017 ciph_data_aes_cbc_ ## vect ## _iv, \
2018 (in_incr), ciph_data_aes_cbc_ ## vect ## _ptx, \
2019 ciph_data_aes_cbc_ ## vect ## _ctx)
2020
2021#define XTEST_CIPH_CASE_AES_CTS(vect, in_incr) \
2022 XTEST_CIPH_CASE(TEE_ALG_AES_CTS, TEE_TYPE_AES, \
2023 ciph_data_aes_cts_ ## vect ## _key, \
2024 ciph_data_aes_cts_ ## vect ## _iv, \
2025 (in_incr), ciph_data_aes_cts_ ## vect ## _ptx, \
2026 ciph_data_aes_cts_ ## vect ## _ctx)
2027
2028static const struct xtest_ciph_case ciph_cases[] = {
2029 /* AES */
2030 XTEST_CIPH_CASE_NO_IV(TEE_ALG_AES_ECB_NOPAD, TEE_TYPE_AES,
2031 ciph_data_aes_key1, 11, ciph_data_in1,
2032 ciph_data_aes_ecb_nopad_out1),
2033 XTEST_CIPH_CASE(TEE_ALG_AES_CBC_NOPAD, TEE_TYPE_AES,
2034 ciph_data_aes_key1, ciph_data_128_iv1, 11,
2035 ciph_data_in1,
2036 ciph_data_aes_cbc_nopad_out1),
2037 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
2038 ciph_data_aes_key1, ciph_data_128_iv1, 13,
2039 ciph_data_in1,
2040 ciph_data_aes_ctr_out1),
2041 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
2042 ciph_data_aes_key1, ciph_data_128_iv1, 13,
2043 ciph_data_in3,
2044 ciph_data_aes_ctr_out2),
Jens Wiklander692efd12018-01-19 09:52:00 +01002045 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
2046 ciph_data_aes_key1, ciph_data_128_iv1, 16,
2047 ciph_data_in3,
2048 ciph_data_aes_ctr_out2),
Jerome Forissier45218eb2018-04-11 13:03:26 +02002049 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
2050 ciph_data_aes_key1, ciph_data_128_iv1, 16,
2051 ciph_data_in4,
2052 ciph_data_aes_ctr_out4),
Jerome Forissier0780ad42018-06-05 15:02:37 +02002053 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
2054 ciph_data_aes_key2, ciph_data_128_iv2, 11,
2055 ciph_data_in5,
2056 ciph_data_aes_ctr_out5),
Pascal Brandc639ac82015-07-02 08:53:34 +02002057
2058 XTEST_CIPH_CASE_AES_CBC(vect1, 11),
Jerome Forissierfc1bbc32018-06-12 10:13:04 +02002059 XTEST_CIPH_CASE_AES_CBC(vect1, 64),
Pascal Brandc639ac82015-07-02 08:53:34 +02002060
2061 /* AES-CTS */
2062 XTEST_CIPH_CASE_AES_CTS(vect1, 13),
2063 XTEST_CIPH_CASE_AES_CTS(vect2, 14),
2064 XTEST_CIPH_CASE_AES_CTS(vect3, 11),
2065 XTEST_CIPH_CASE_AES_CTS(vect4, 9),
2066 XTEST_CIPH_CASE_AES_CTS(vect5, 7),
2067 XTEST_CIPH_CASE_AES_CTS(vect6, 17),
2068 XTEST_CIPH_CASE_AES_CTS(vect6, 0x20),
Jerome Forissiered00e162017-01-20 09:22:52 +01002069 XTEST_CIPH_CASE_AES_CTS(issue1203, 32),
Pascal Brandc639ac82015-07-02 08:53:34 +02002070
2071 /* DES */
2072 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES_ECB_NOPAD, TEE_TYPE_DES,
2073 ciph_data_des_key1, 14, ciph_data_in1,
2074 ciph_data_des_ecb_nopad_out1),
2075 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES_ECB_NOPAD, TEE_TYPE_DES,
2076 ciph_data_des_key2, 3, ciph_data_in2,
2077 ciph_data_des_ecb_nopad_out2),
2078 XTEST_CIPH_CASE(TEE_ALG_DES_CBC_NOPAD, TEE_TYPE_DES,
2079 ciph_data_des_key1, ciph_data_64_iv1, 15, ciph_data_in1,
2080 ciph_data_des_cbc_nopad_out1),
2081
2082 /* DES3 */
2083 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES3_ECB_NOPAD, TEE_TYPE_DES3,
2084 ciph_data_des3_key1, 11, ciph_data_in1,
2085 ciph_data_des3_ecb_nopad_out1),
2086 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES3_ECB_NOPAD, TEE_TYPE_DES3,
2087 ciph_data_des3_key2, 3, ciph_data_in2,
2088 ciph_data_des_ecb_nopad_out2),
2089 XTEST_CIPH_CASE(TEE_ALG_DES3_CBC_NOPAD, TEE_TYPE_DES3,
2090 ciph_data_des3_key1, ciph_data_64_iv1, 11,
2091 ciph_data_in1,
2092 ciph_data_des3_cbc_nopad_out1),
2093
2094 /* DES2 */
2095 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES3_ECB_NOPAD, TEE_TYPE_DES3,
2096 ciph_data_des2_key1, 11, ciph_data_in1,
2097 ciph_data_des2_ecb_nopad_out1),
2098 XTEST_CIPH_CASE(TEE_ALG_DES3_CBC_NOPAD, TEE_TYPE_DES3,
2099 ciph_data_des2_key1, ciph_data_64_iv1, 11,
2100 ciph_data_in1,
2101 ciph_data_des2_cbc_nopad_out1),
Pascal Brandc639ac82015-07-02 08:53:34 +02002102
Pascal Brandc639ac82015-07-02 08:53:34 +02002103 /* AES-XTS */
2104 XTEST_CIPH_CASE_AES_XTS(vect1, 3),
2105 XTEST_CIPH_CASE_AES_XTS(vect2, 6),
2106 XTEST_CIPH_CASE_AES_XTS(vect3, 7),
2107 XTEST_CIPH_CASE_AES_XTS(vect4, 8),
2108 XTEST_CIPH_CASE_AES_XTS(vect5, 9),
2109 XTEST_CIPH_CASE_AES_XTS(vect6, 13),
2110 XTEST_CIPH_CASE_AES_XTS(vect7, 1),
2111 XTEST_CIPH_CASE_AES_XTS(vect8, 3),
2112 XTEST_CIPH_CASE_AES_XTS(vect9, 2),
2113 XTEST_CIPH_CASE_AES_XTS(vect10, 5),
2114 XTEST_CIPH_CASE_AES_XTS(vect11, 6),
2115 XTEST_CIPH_CASE_AES_XTS(vect12, 7),
2116 XTEST_CIPH_CASE_AES_XTS(vect13, 3),
2117 XTEST_CIPH_CASE_AES_XTS(vect14, 2),
2118 XTEST_CIPH_CASE_AES_XTS(vect15, 0),
2119 XTEST_CIPH_CASE_AES_XTS(vect16, 9),
2120 XTEST_CIPH_CASE_AES_XTS(vect17, 6),
2121 XTEST_CIPH_CASE_AES_XTS(vect18, 8),
2122 XTEST_CIPH_CASE_AES_XTS(vect19, 23),
Jerome Forissiere73e0fb2019-12-12 17:08:03 +01002123
2124 /* SM4 */
2125 XTEST_CIPH_CASE_NO_IV(TEE_ALG_SM4_ECB_NOPAD, TEE_TYPE_SM4,
2126 ciph_data_sm4_key1, 11, ciph_data_sm4_in1,
2127 ciph_data_sm4_ecb_nopad_out1),
2128 XTEST_CIPH_CASE(TEE_ALG_SM4_CBC_NOPAD, TEE_TYPE_SM4,
2129 ciph_data_sm4_cbc_a221_key, ciph_data_sm4_cbc_a221_iv,
2130 11, ciph_data_sm4_cbc_a221_in,
2131 ciph_data_sm4_cbc_a221_out),
2132 XTEST_CIPH_CASE(TEE_ALG_SM4_CBC_NOPAD, TEE_TYPE_SM4,
2133 ciph_data_sm4_cbc_a222_key, ciph_data_sm4_cbc_a222_iv,
2134 11, ciph_data_sm4_cbc_a222_in,
2135 ciph_data_sm4_cbc_a222_out),
2136 XTEST_CIPH_CASE(TEE_ALG_SM4_CTR, TEE_TYPE_SM4,
2137 ciph_data_sm4_ctr_a251_key, ciph_data_sm4_ctr_a251_iv,
2138 11, ciph_data_sm4_ctr_a251_in,
2139 ciph_data_sm4_ctr_a251_out),
2140 XTEST_CIPH_CASE(TEE_ALG_SM4_CTR, TEE_TYPE_SM4,
2141 ciph_data_sm4_ctr_a252_key, ciph_data_sm4_ctr_a252_iv,
2142 11, ciph_data_sm4_ctr_a252_in,
2143 ciph_data_sm4_ctr_a252_out),
Pascal Brandc639ac82015-07-02 08:53:34 +02002144};
2145
Jerome Forissier23256842018-02-16 09:25:35 +01002146static void xtest_tee_test_4003(ADBG_Case_t *c)
Pascal Brandc639ac82015-07-02 08:53:34 +02002147{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002148 TEEC_Session session = { };
2149 TEE_OperationHandle op = TEE_HANDLE_NULL;
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002150 TEE_OperationHandle op2 = TEE_HANDLE_NULL;
Pascal Brandc639ac82015-07-02 08:53:34 +02002151 TEE_ObjectHandle key1_handle = TEE_HANDLE_NULL;
2152 TEE_ObjectHandle key2_handle = TEE_HANDLE_NULL;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002153 uint8_t out[2048] = { };
2154 size_t out_size = 0;
2155 size_t out_offs = 0;
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002156 size_t out_offs2 = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002157 uint32_t ret_orig = 0;
2158 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02002159
2160 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2161 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
2162 &ret_orig)))
2163 return;
2164
2165 for (n = 0; n < ARRAY_SIZE(ciph_cases); n++) {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002166 TEE_Attribute key_attr = { };
2167 size_t key_size = 0;
2168 size_t op_key_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02002169
Jerome Forissier817d99f2020-01-22 16:33:12 +01002170 switch (ciph_cases[n].algo) {
2171 case TEE_ALG_SM4_CTR:
2172 case TEE_ALG_SM4_CBC_NOPAD:
2173 case TEE_ALG_SM4_ECB_NOPAD:
2174 if (!ta_crypt_cmd_is_algo_supported(c, &session,
2175 ciph_cases[n].algo, TEE_CRYPTO_ELEMENT_NONE)) {
2176 Do_ADBG_Log("SM4 not supported: skip subcase");
2177 continue;
2178 }
2179 break;
2180 default:
2181 break;
2182 }
2183
Pascal Brandc639ac82015-07-02 08:53:34 +02002184 Do_ADBG_BeginSubCase(c, "Cipher case %d algo 0x%x line %d",
2185 (int)n, (unsigned int)ciph_cases[n].algo,
2186 (int)ciph_cases[n].line);
2187
2188 key_attr.attributeID = TEE_ATTR_SECRET_VALUE;
2189 key_attr.content.ref.buffer = (void *)ciph_cases[n].key1;
2190 key_attr.content.ref.length = ciph_cases[n].key1_len;
2191
2192 key_size = key_attr.content.ref.length * 8;
2193 if (ciph_cases[n].key_type == TEE_TYPE_DES ||
2194 ciph_cases[n].key_type == TEE_TYPE_DES3)
2195 /* Exclude parity in bit size of key */
2196 key_size -= key_size / 8;
2197
2198 op_key_size = key_size;
2199 if (ciph_cases[n].key2 != NULL)
2200 op_key_size *= 2;
2201
2202 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2203 ta_crypt_cmd_allocate_operation(c, &session, &op,
2204 ciph_cases[n].algo, ciph_cases[n].mode,
2205 op_key_size)))
2206 goto out;
2207
2208 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002209 ta_crypt_cmd_allocate_operation(c, &session, &op2,
2210 ciph_cases[n].algo, ciph_cases[n].mode,
2211 op_key_size)))
2212 goto out;
2213
2214 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc639ac82015-07-02 08:53:34 +02002215 ta_crypt_cmd_allocate_transient_object(c, &session,
2216 ciph_cases[n].key_type, key_size,
2217 &key1_handle)))
2218 goto out;
2219
2220 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2221 ta_crypt_cmd_populate_transient_object(c, &session,
2222 key1_handle, &key_attr, 1)))
2223 goto out;
2224
2225 if (ciph_cases[n].key2 != NULL) {
2226 key_attr.content.ref.buffer =
2227 (void *)ciph_cases[n].key2;
2228 key_attr.content.ref.length = ciph_cases[n].key2_len;
2229
2230 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2231 ta_crypt_cmd_allocate_transient_object(c,
2232 &session, ciph_cases[n].key_type,
2233 key_attr.content.ref.length * 8,
2234 &key2_handle)))
2235 goto out;
2236
2237 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2238 ta_crypt_cmd_populate_transient_object(c,
2239 &session, key2_handle, &key_attr, 1)))
2240 goto out;
2241
2242 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2243 ta_crypt_cmd_set_operation_key2(c, &session, op,
2244 key1_handle, key2_handle)))
2245 goto out;
2246 } else {
2247 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2248 ta_crypt_cmd_set_operation_key(c, &session, op,
2249 key1_handle)))
2250 goto out;
2251 }
2252
2253 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2254 ta_crypt_cmd_free_transient_object(c, &session,
2255 key1_handle)))
2256 goto out;
2257 key1_handle = TEE_HANDLE_NULL;
2258
2259 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2260 ta_crypt_cmd_free_transient_object(c, &session,
2261 key2_handle)))
2262 goto out;
2263 key2_handle = TEE_HANDLE_NULL;
2264
2265 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2266 ta_crypt_cmd_cipher_init(c, &session, op,
2267 ciph_cases[n].iv, ciph_cases[n].iv_len)))
2268 goto out;
2269
2270 out_offs = 0;
2271 out_size = sizeof(out);
2272 memset(out, 0, sizeof(out));
2273 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2274 ta_crypt_cmd_cipher_update(c, &session, op,
2275 ciph_cases[n].in, ciph_cases[n].in_incr, out,
2276 &out_size)))
2277 goto out;
2278
Jerome Forissierd2d94b42017-06-02 16:39:34 +02002279 if (ciph_cases[n].algo == TEE_ALG_AES_CTR)
2280 ADBG_EXPECT_COMPARE_UNSIGNED(c, out_size, ==,
2281 ciph_cases[n].in_incr);
2282
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002283 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2284 ta_crypt_cmd_copy_operation(c, &session, op2, op)))
2285 goto out;
2286
Pascal Brandc639ac82015-07-02 08:53:34 +02002287 out_offs += out_size;
2288 out_size = sizeof(out) - out_offs;
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002289 out_offs2 = out_offs;
Pascal Brandc639ac82015-07-02 08:53:34 +02002290
2291 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2292 ta_crypt_cmd_cipher_do_final(c, &session, op,
2293 ciph_cases[n].in + ciph_cases[n].in_incr,
2294 ciph_cases[n].in_len - ciph_cases[n].in_incr,
2295 out + out_offs,
2296 &out_size)))
2297 goto out;
2298
2299 out_offs += out_size;
2300
2301 (void)ADBG_EXPECT_BUFFER(c, ciph_cases[n].out,
2302 ciph_cases[n].out_len, out, out_offs);
2303
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002304 /* test on the copied op2 */
2305 out_size = sizeof(out) - out_offs2;
2306
2307 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2308 ta_crypt_cmd_cipher_do_final(c, &session, op2,
2309 ciph_cases[n].in + ciph_cases[n].in_incr,
2310 ciph_cases[n].in_len - ciph_cases[n].in_incr,
2311 out + out_offs2,
2312 &out_size)))
2313 goto out;
2314
2315 out_offs2 += out_size;
2316
2317 ADBG_EXPECT_BUFFER(c, ciph_cases[n].out, ciph_cases[n].out_len,
2318 out, out_offs2);
2319
Pascal Brandc639ac82015-07-02 08:53:34 +02002320 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2321 ta_crypt_cmd_free_operation(c, &session, op)))
2322 goto out;
2323
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002324 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2325 ta_crypt_cmd_free_operation(c, &session, op2)))
2326 goto out;
2327
Pascal Brandc639ac82015-07-02 08:53:34 +02002328 Do_ADBG_EndSubCase(c, NULL);
2329 }
2330out:
2331 TEEC_CloseSession(&session);
2332}
Jens Wiklander14f48872018-06-29 15:30:13 +02002333ADBG_CASE_DEFINE(regression, 4003, xtest_tee_test_4003,
2334 "Test TEE Internal API cipher operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02002335
Pascal Brandc639ac82015-07-02 08:53:34 +02002336static void xtest_tee_test_4004(ADBG_Case_t *c)
2337{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002338 TEEC_Session session = { };
2339 uint32_t ret_orig = 0;
2340 uint8_t buf1[45] = { };
2341 uint8_t buf2[45] = { };
2342 static const uint8_t zeros[45];
Pascal Brandc639ac82015-07-02 08:53:34 +02002343
2344 Do_ADBG_BeginSubCase(c, "TEE get random");
2345 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2346 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
2347 &ret_orig)))
2348 return;
2349
2350 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2351 ta_crypt_cmd_random_number_generate(c, &session, buf1,
2352 sizeof(buf1))))
2353 goto out;
2354
2355 (void)ADBG_EXPECT_COMPARE_SIGNED(c,
2356 0, !=, memcmp(buf1, zeros, sizeof(buf1)));
2357
2358 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2359 ta_crypt_cmd_random_number_generate(c, &session, buf2,
2360 sizeof(buf2))))
2361 goto out;
2362
2363 (void)ADBG_EXPECT_COMPARE_SIGNED(c,
2364 0, !=, memcmp(buf2, zeros, sizeof(buf2)));
2365
2366 (void)ADBG_EXPECT_COMPARE_SIGNED(c,
2367 0, !=, memcmp(buf2, buf1, sizeof(buf1)));
2368out:
2369 TEEC_CloseSession(&session);
2370 Do_ADBG_EndSubCase(c, "TEE get random");
2371}
Jens Wiklander14f48872018-06-29 15:30:13 +02002372ADBG_CASE_DEFINE(regression, 4004, xtest_tee_test_4004,
2373 "Test TEE Internal API get random");
Pascal Brandc639ac82015-07-02 08:53:34 +02002374
2375struct xtest_ae_case {
2376 uint32_t algo;
2377 uint32_t mode;
2378 uint32_t key_type;
2379 const uint8_t *key;
2380 size_t key_len;
2381 const uint8_t *nonce;
2382 size_t nonce_len;
2383 size_t aad_incr;
2384 const uint8_t *aad;
2385 size_t aad_len;
2386 size_t in_incr;
2387 const uint8_t *ptx;
2388 size_t ptx_len;
2389 const uint8_t *ctx;
2390 size_t ctx_len;
2391 const uint8_t *tag;
2392 size_t tag_len;
2393 size_t line;
2394};
2395
2396
2397#define ARRAY(a) a, ARRAY_SIZE(a)
2398#define NULL_ARRAY(a) NULL, 0
2399
2400#define XTEST_AE_CASE(algo, vect, aad_incr, in_incr, \
2401 aad_array, ptx_array, ctx_array) \
2402 { (algo), TEE_MODE_ENCRYPT, TEE_TYPE_AES, ARRAY(vect ## _key), \
2403 ARRAY(vect ## _nonce), (aad_incr), \
2404 aad_array(vect ## _aad), (in_incr), \
2405 ptx_array(vect ## _ptx), ctx_array(vect ## _ctx), \
2406 ARRAY(vect ## _tag), \
2407 __LINE__ }, \
2408 { (algo), TEE_MODE_DECRYPT, TEE_TYPE_AES, ARRAY(vect ## _key), \
2409 ARRAY(vect ## _nonce), (aad_incr), \
2410 aad_array(vect ## _aad), (in_incr), \
2411 ptx_array(vect ## _ptx), ctx_array(vect ## _ctx), \
2412 ARRAY(vect ## _tag), \
2413 __LINE__ }
2414
2415#define XTEST_AE_CASE_AES_CCM(vect, aad_incr, in_incr) \
2416 XTEST_AE_CASE(TEE_ALG_AES_CCM, ae_data_aes_ccm_ ## vect, aad_incr, \
2417 in_incr, ARRAY, ARRAY, ARRAY)
2418
2419#define XTEST_AE_CASE_AES_GCM(vect, aad_incr, in_incr, \
2420 aad_array, ptx_array, ctx_array) \
2421 XTEST_AE_CASE(TEE_ALG_AES_GCM, ae_data_aes_gcm_ ## vect, aad_incr, \
2422 in_incr, aad_array, ptx_array, ctx_array)
2423
2424
2425
2426static const struct xtest_ae_case ae_cases[] = {
2427 XTEST_AE_CASE_AES_CCM(vect1, 3, 2),
2428 XTEST_AE_CASE_AES_CCM(vect2, 7, 13),
2429 XTEST_AE_CASE_AES_CCM(vect3, 5, 21),
2430
2431 XTEST_AE_CASE_AES_GCM(vect1, 0, 0, NULL_ARRAY, NULL_ARRAY, NULL_ARRAY),
2432 XTEST_AE_CASE_AES_GCM(vect2, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2433 XTEST_AE_CASE_AES_GCM(vect3, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
Jens Wiklander9fc63f52017-11-10 11:13:26 +01002434 XTEST_AE_CASE_AES_GCM(vect3, 0, 0x1F, NULL_ARRAY, ARRAY, ARRAY),
2435 XTEST_AE_CASE_AES_GCM(vect4, 5, 0x20, ARRAY, ARRAY, ARRAY),
Pascal Brandc639ac82015-07-02 08:53:34 +02002436 XTEST_AE_CASE_AES_GCM(vect5, 5, 9, ARRAY, ARRAY, ARRAY),
2437 XTEST_AE_CASE_AES_GCM(vect6, 5, 9, ARRAY, ARRAY, ARRAY),
2438 XTEST_AE_CASE_AES_GCM(vect7, 0, 0, NULL_ARRAY, NULL_ARRAY, NULL_ARRAY),
2439 XTEST_AE_CASE_AES_GCM(vect8, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2440 XTEST_AE_CASE_AES_GCM(vect9, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2441 XTEST_AE_CASE_AES_GCM(vect10, 5, 9, ARRAY, ARRAY, ARRAY),
2442 XTEST_AE_CASE_AES_GCM(vect11, 5, 9, ARRAY, ARRAY, ARRAY),
2443 XTEST_AE_CASE_AES_GCM(vect12, 5, 9, ARRAY, ARRAY, ARRAY),
2444 XTEST_AE_CASE_AES_GCM(vect13, 0, 0, NULL_ARRAY, NULL_ARRAY, NULL_ARRAY),
2445 XTEST_AE_CASE_AES_GCM(vect14, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2446 XTEST_AE_CASE_AES_GCM(vect15, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2447 XTEST_AE_CASE_AES_GCM(vect16, 5, 9, ARRAY, ARRAY, ARRAY),
2448 XTEST_AE_CASE_AES_GCM(vect17, 5, 9, ARRAY, ARRAY, ARRAY),
2449 XTEST_AE_CASE_AES_GCM(vect18, 5, 9, ARRAY, ARRAY, ARRAY),
Jens Wiklanderf6efe242017-11-06 13:16:43 +01002450#ifdef CFG_GCM_NIST_VECTORS
2451#include "gcmDecrypt128.h"
2452#include "gcmDecrypt192.h"
2453#include "gcmDecrypt256.h"
2454#include "gcmEncryptExtIV128.h"
2455#include "gcmEncryptExtIV192.h"
2456#include "gcmEncryptExtIV256.h"
2457#endif
Pascal Brandc639ac82015-07-02 08:53:34 +02002458};
2459
2460static void xtest_tee_test_4005(ADBG_Case_t *c)
2461{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002462 TEEC_Session session = { };
2463 TEE_OperationHandle op = TEE_HANDLE_NULL;
Jens Wiklander7404c072020-12-15 08:06:32 +01002464 TEE_OperationHandle op2 = TEE_HANDLE_NULL;
Pascal Brandc639ac82015-07-02 08:53:34 +02002465 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002466 TEE_Attribute key_attr = { };
2467 uint8_t out[512] = { };
2468 size_t out_size = 0;
2469 size_t out_offs = 0;
Jens Wiklander7404c072020-12-15 08:06:32 +01002470 size_t out_offs2 = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002471 uint32_t ret_orig = 0;
2472 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02002473
2474 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2475 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
2476 &ret_orig)))
2477 return;
2478
2479 for (n = 0; n < ARRAY_SIZE(ae_cases); n++) {
2480 Do_ADBG_BeginSubCase(c, "AE case %d algo 0x%x line %d",
2481 (int)n, (unsigned int)ae_cases[n].algo,
2482 (int)ae_cases[n].line);
2483
2484 key_attr.attributeID = TEE_ATTR_SECRET_VALUE;
2485 key_attr.content.ref.buffer = (void *)ae_cases[n].key;
2486 key_attr.content.ref.length = ae_cases[n].key_len;
2487
2488 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2489 ta_crypt_cmd_allocate_operation(c, &session, &op,
2490 ae_cases[n].algo, ae_cases[n].mode,
2491 key_attr.content.ref.length * 8)))
2492 goto out;
2493
2494 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jens Wiklander7404c072020-12-15 08:06:32 +01002495 ta_crypt_cmd_allocate_operation(c, &session, &op2,
2496 ae_cases[n].algo, ae_cases[n].mode,
2497 key_attr.content.ref.length * 8)))
2498 goto out;
2499
2500 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc639ac82015-07-02 08:53:34 +02002501 ta_crypt_cmd_allocate_transient_object(c, &session,
2502 ae_cases[n].key_type,
2503 key_attr.content.ref.length * 8,
2504 &key_handle)))
2505 goto out;
2506
2507 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2508 ta_crypt_cmd_populate_transient_object(c, &session,
2509 key_handle, &key_attr, 1)))
2510 goto out;
2511
2512 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2513 ta_crypt_cmd_set_operation_key(c, &session, op,
2514 key_handle)))
2515 goto out;
2516
2517 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2518 ta_crypt_cmd_free_transient_object(c, &session,
2519 key_handle)))
2520 goto out;
2521 key_handle = TEE_HANDLE_NULL;
2522
2523 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2524 ta_crypt_cmd_ae_init(c, &session, op, ae_cases[n].nonce,
2525 ae_cases[n].nonce_len, ae_cases[n].tag_len,
2526 ae_cases[n].aad_len, ae_cases[n].ptx_len)))
2527 goto out;
2528
2529 if (ae_cases[n].aad != NULL) {
2530 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2531 ta_crypt_cmd_ae_update_aad(c, &session, op,
2532 ae_cases[n].aad, ae_cases[n].aad_incr)))
2533 goto out;
2534
2535 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2536 ta_crypt_cmd_ae_update_aad(c, &session, op,
2537 ae_cases[n].aad + ae_cases[n].aad_incr,
2538 ae_cases [n].aad_len -
2539 ae_cases[n].aad_incr)))
2540 goto out;
2541 }
2542
2543 out_offs = 0;
2544 out_size = sizeof(out);
2545 memset(out, 0, sizeof(out));
2546 if (ae_cases[n].mode == TEE_MODE_ENCRYPT) {
2547 if (ae_cases[n].ptx != NULL) {
2548 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2549 ta_crypt_cmd_ae_update(c, &session, op,
2550 ae_cases[n].ptx,
2551 ae_cases[n].in_incr, out,
2552 &out_size)))
2553 goto out;
2554 out_offs += out_size;
Jerome Forissierc13fafa2017-06-01 15:49:07 +02002555 if (ae_cases[n].algo == TEE_ALG_AES_GCM)
2556 ADBG_EXPECT_COMPARE_UNSIGNED(c,
2557 out_size, ==, ae_cases[n].in_incr);
Pascal Brandc639ac82015-07-02 08:53:34 +02002558 }
2559 } else {
2560 if (ae_cases[n].ctx != NULL) {
2561 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2562 ta_crypt_cmd_ae_update(c, &session, op,
2563 ae_cases[n].ctx,
2564 ae_cases[n].in_incr, out,
2565 &out_size)))
2566 goto out;
2567 out_offs += out_size;
Jerome Forissierc13fafa2017-06-01 15:49:07 +02002568 if (ae_cases[n].algo == TEE_ALG_AES_GCM)
2569 ADBG_EXPECT_COMPARE_UNSIGNED(c,
2570 out_size, ==, ae_cases[n].in_incr);
Pascal Brandc639ac82015-07-02 08:53:34 +02002571 }
2572 }
2573
Jens Wiklander7404c072020-12-15 08:06:32 +01002574 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2575 ta_crypt_cmd_copy_operation(c, &session, op2, op)))
2576 goto out;
2577
Pascal Brandc639ac82015-07-02 08:53:34 +02002578 out_size = sizeof(out) - out_offs;
Jens Wiklander7404c072020-12-15 08:06:32 +01002579 out_offs2 = out_offs;
Pascal Brandc639ac82015-07-02 08:53:34 +02002580 if (ae_cases[n].mode == TEE_MODE_ENCRYPT) {
2581 uint8_t out_tag[64];
2582 size_t out_tag_len = MIN(sizeof(out_tag),
2583 ae_cases[n].tag_len);
2584
2585 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2586 ta_crypt_cmd_ae_encrypt_final(c, &session, op,
2587 ae_cases[n].ptx + ae_cases[n].in_incr,
2588 ae_cases[n].ptx_len -
2589 ae_cases[n].in_incr,
2590 out + out_offs,
2591 &out_size, out_tag, &out_tag_len)))
2592 goto out;
2593
2594 (void)ADBG_EXPECT_BUFFER(c,
2595 ae_cases[n].tag, ae_cases[n].tag_len, out_tag,
2596 out_tag_len);
2597
2598 out_offs += out_size;
2599
2600 (void)ADBG_EXPECT_BUFFER(c, ae_cases[n].ctx,
2601 ae_cases[n].ctx_len, out, out_offs);
2602 } else {
2603 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2604 ta_crypt_cmd_ae_decrypt_final(c, &session, op,
2605 ae_cases[n].ctx + ae_cases[n].in_incr,
2606 ae_cases[n].ctx_len -
2607 ae_cases[n].in_incr,
2608 out + out_offs,
2609 &out_size, ae_cases[n].tag,
2610 ae_cases[n].tag_len)))
2611 goto out;
2612
2613 out_offs += out_size;
2614
2615 (void)ADBG_EXPECT_BUFFER(c, ae_cases[n].ptx,
2616 ae_cases[n].ptx_len, out, out_offs);
2617 }
2618
Jens Wiklander7404c072020-12-15 08:06:32 +01002619 /* test on the copied op2 */
2620 out_size = sizeof(out) - out_offs2;
2621 memset(out + out_offs2, 0, out_size);
2622 if (ae_cases[n].mode == TEE_MODE_ENCRYPT) {
2623 uint8_t out_tag[64] = { 0 };
2624 size_t out_tag_len = MIN(sizeof(out_tag),
2625 ae_cases[n].tag_len);
2626
2627 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2628 ta_crypt_cmd_ae_encrypt_final(c, &session, op2,
2629 ae_cases[n].ptx + ae_cases[n].in_incr,
2630 ae_cases[n].ptx_len -
2631 ae_cases[n].in_incr,
2632 out + out_offs2,
2633 &out_size, out_tag, &out_tag_len)))
2634 goto out;
2635
2636 ADBG_EXPECT_BUFFER(c, ae_cases[n].tag,
2637 ae_cases[n].tag_len, out_tag,
2638 out_tag_len);
2639
2640 out_offs2 += out_size;
2641
2642 (void)ADBG_EXPECT_BUFFER(c, ae_cases[n].ctx,
2643 ae_cases[n].ctx_len, out, out_offs2);
2644 } else {
2645 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2646 ta_crypt_cmd_ae_decrypt_final(c, &session, op2,
2647 ae_cases[n].ctx + ae_cases[n].in_incr,
2648 ae_cases[n].ctx_len -
2649 ae_cases[n].in_incr,
2650 out + out_offs2,
2651 &out_size, ae_cases[n].tag,
2652 ae_cases[n].tag_len)))
2653 goto out;
2654
2655 out_offs2 += out_size;
2656
2657 (void)ADBG_EXPECT_BUFFER(c, ae_cases[n].ptx,
2658 ae_cases[n].ptx_len, out, out_offs2);
2659 }
2660
Pascal Brandc639ac82015-07-02 08:53:34 +02002661 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2662 ta_crypt_cmd_free_operation(c, &session, op)))
2663 goto out;
2664
Jens Wiklander7404c072020-12-15 08:06:32 +01002665 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2666 ta_crypt_cmd_free_operation(c, &session, op2)))
2667 goto out;
2668
Pascal Brandc639ac82015-07-02 08:53:34 +02002669 Do_ADBG_EndSubCase(c, NULL);
2670 }
2671out:
2672 TEEC_CloseSession(&session);
2673}
Jens Wiklander14f48872018-06-29 15:30:13 +02002674ADBG_CASE_DEFINE(regression, 4005, xtest_tee_test_4005,
2675 "Test TEE Internal API Authenticated Encryption operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02002676
2677struct xtest_ac_case {
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002678 unsigned int level;
Pascal Brandc639ac82015-07-02 08:53:34 +02002679 uint32_t algo;
2680 TEE_OperationMode mode;
2681
2682 union {
2683 struct {
2684 const uint8_t *modulus;
2685 size_t modulus_len;
2686
2687 const uint8_t *pub_exp;
2688 size_t pub_exp_len;
2689
2690 const uint8_t *priv_exp;
2691 size_t priv_exp_len;
2692
2693 const uint8_t *prime1; /* q */
2694 size_t prime1_len;
2695 const uint8_t *prime2; /* p */
2696 size_t prime2_len;
2697 const uint8_t *exp1; /* dp */
2698 size_t exp1_len;
2699 const uint8_t *exp2; /* dq */
2700 size_t exp2_len;
2701 const uint8_t *coeff; /* iq */
2702 size_t coeff_len;
2703
2704 int salt_len;
2705 } rsa;
2706 struct {
2707 const uint8_t *prime;
2708 size_t prime_len;
2709 const uint8_t *sub_prime;
2710 size_t sub_prime_len;
2711 const uint8_t *base;
2712 size_t base_len;
2713 const uint8_t *pub_val;
2714 size_t pub_val_len;
2715 const uint8_t *priv_val;
2716 size_t priv_val_len;
2717 } dsa;
Pascal Brand3e143ee2015-07-15 17:17:16 +02002718 struct {
2719 const uint8_t *private;
2720 size_t private_len;
2721 const uint8_t *public_x;
2722 size_t public_x_len;
2723 const uint8_t *public_y;
2724 size_t public_y_len;
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01002725 } ecc;
Valerii Chubarab9863c2022-08-12 07:42:29 +00002726 struct {
2727 const uint8_t *private;
2728 size_t private_len;
2729 const uint8_t *public;
2730 size_t public_len;
2731 const uint8_t flag;
2732 const uint8_t *context;
2733 size_t context_len;
2734 } eddsa;
Pascal Brandc639ac82015-07-02 08:53:34 +02002735 } params;
2736
2737 const uint8_t *ptx;
2738 size_t ptx_len;
2739 const uint8_t *ctx;
2740 size_t ctx_len;
2741 size_t line;
2742};
2743
2744#define WITHOUT_SALT(x) -1
2745#define WITH_SALT(x) x
2746
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002747#define XTEST_AC_CASE(level, algo, mode, vect, union_params) \
2748 { level, (algo), (mode), .params = union_params, \
Pascal Brandc639ac82015-07-02 08:53:34 +02002749 ARRAY(vect ## _ptx), \
2750 ARRAY(vect ## _out), \
2751 __LINE__ }
2752
2753#define XTEST_AC_RSA_UNION(vect, opt_crt_array, opt_salt) \
2754 { .rsa = { \
2755 ARRAY(vect ## _modulus), \
2756 ARRAY(vect ## _pub_exp), \
2757 ARRAY(vect ## _priv_exp), \
2758 opt_crt_array(vect ## _prime1), \
2759 opt_crt_array(vect ## _prime2), \
2760 opt_crt_array(vect ## _exp1), \
2761 opt_crt_array(vect ## _exp2), \
2762 opt_crt_array(vect ## _coeff), \
2763 opt_salt(vect ## _salt_len) \
2764 } }
2765
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002766#define XTEST_AC_RSA_CASE(level, algo, mode, vect, opt_crt_array, opt_salt) \
2767 XTEST_AC_CASE(level, algo, mode, vect, \
Pascal Brandc639ac82015-07-02 08:53:34 +02002768 XTEST_AC_RSA_UNION(vect, opt_crt_array, opt_salt))
2769
2770#define XTEST_AC_DSA_UNION(vect) \
2771 { .dsa = { \
2772 ARRAY(vect ## _prime), \
2773 ARRAY(vect ## _sub_prime), \
2774 ARRAY(vect ## _base), \
2775 ARRAY(vect ## _pub_val), \
2776 ARRAY(vect ## _priv_val), \
2777 } }
2778
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002779#define XTEST_AC_DSA_CASE(level, algo, mode, vect) \
2780 XTEST_AC_CASE(level, algo, mode, vect, XTEST_AC_DSA_UNION(vect))
Pascal Brandc639ac82015-07-02 08:53:34 +02002781
Pascal Brand3e143ee2015-07-15 17:17:16 +02002782#define XTEST_AC_ECDSA_UNION(vect) \
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01002783 { .ecc = { \
Pascal Brand3e143ee2015-07-15 17:17:16 +02002784 ARRAY(vect ## _private), \
2785 ARRAY(vect ## _public_x), \
2786 ARRAY(vect ## _public_y), \
2787 } }
2788
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01002789#define XTEST_AC_ECC_CASE(level, algo, mode, vect) \
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002790 XTEST_AC_CASE(level, algo, mode, vect, XTEST_AC_ECDSA_UNION(vect))
Pascal Brand3e143ee2015-07-15 17:17:16 +02002791
Valerii Chubarab9863c2022-08-12 07:42:29 +00002792#define XTEST_AC_EDDSA_UNION(vect, flag) \
2793 { .eddsa = { \
2794 ARRAY(vect ## _private), \
2795 ARRAY(vect ## _public), \
2796 flag, \
2797 } }
2798
2799#define XTEST_AC_EDDSA_CTX_UNION(vect, flag) \
2800 { .eddsa = { \
2801 ARRAY(vect ## _private), \
2802 ARRAY(vect ## _public), \
2803 flag, \
2804 ARRAY(vect ## _context), \
2805 } }
2806
2807#define XTEST_AC_EDDSA_CASE(level, algo, mode, vect, flag) \
2808 XTEST_AC_CASE(level, algo, mode, vect, XTEST_AC_EDDSA_UNION(vect, flag))
2809
2810#define XTEST_AC_EDDSA_CTX_CASE(level, algo, mode, vect, flag) \
2811 XTEST_AC_CASE(level, algo, mode, vect, XTEST_AC_EDDSA_CTX_UNION(vect, flag))
2812
Pascal Brandc639ac82015-07-02 08:53:34 +02002813static const struct xtest_ac_case xtest_ac_cases[] = {
2814 /* RSA test without crt parameters */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002815 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002816 ac_rsassa_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002817 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002818 ac_rsassa_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002819 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002820 ac_rsassa_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002821 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002822 ac_rsassa_vect2, NULL_ARRAY, WITHOUT_SALT),
Jerome Forissiere576f052018-03-23 21:24:21 +08002823 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
2824 ac_rsassa_vect18, NULL_ARRAY, WITHOUT_SALT),
2825 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
2826 ac_rsassa_vect18, NULL_ARRAY, WITHOUT_SALT),
Jerome Forissier0451e372018-03-27 00:10:23 +08002827 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
2828 ac_rsassa_vect19, NULL_ARRAY, WITHOUT_SALT),
2829 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
2830 ac_rsassa_vect19, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002831 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002832 ac_rsassa_vect3, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002833 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002834 ac_rsassa_vect3, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002835 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002836 ac_rsassa_vect4, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002837 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002838 ac_rsassa_vect4, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002839 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002840 ac_rsassa_vect5, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002841 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002842 ac_rsassa_vect5, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002843 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002844 ac_rsassa_vect6, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002845 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002846 ac_rsassa_vect6, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002847 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002848 ac_rsassa_vect7, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002849 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002850 ac_rsassa_vect7, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002851 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
2852 ac_rsassa_vect8, NULL_ARRAY, WITHOUT_SALT),
2853 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
2854 ac_rsassa_vect8, NULL_ARRAY, WITHOUT_SALT),
Pascal Brandc639ac82015-07-02 08:53:34 +02002855
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002856 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA224, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002857 ac_rsassa_vect16, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002858 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA224, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002859 ac_rsassa_vect16, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002860
Gabor Szekely2ad190f2018-09-14 14:05:06 +00002861#ifdef CFG_CRYPTO_RSASSA_NA1
2862 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5, TEE_MODE_SIGN,
2863 ac_rsassa_vect20, NULL_ARRAY, WITHOUT_SALT),
2864 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5, TEE_MODE_VERIFY,
2865 ac_rsassa_vect20, NULL_ARRAY, WITHOUT_SALT),
2866#endif
2867
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002868 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002869 ac_rsassa_vect9, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002870 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002871 ac_rsassa_vect9, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002872
2873 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002874 ac_rsassa_vect10, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002875 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002876 ac_rsassa_vect10, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002877
2878 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002879 ac_rsassa_vect11, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002880 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002881 ac_rsassa_vect11, NULL_ARRAY, WITHOUT_SALT),
2882
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002883 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1,
2884 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002885 ac_rsassa_vect12, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002886 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002887 ac_rsassa_vect12, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002888
2889 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
2890 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002891 ac_rsassa_vect17, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002892 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
2893 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002894 ac_rsassa_vect17, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002895
2896 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
2897 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002898 ac_rsassa_vect13, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002899 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
2900 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002901 ac_rsassa_vect13, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002902
2903 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
2904 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002905 ac_rsassa_vect14, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002906 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
2907 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002908 ac_rsassa_vect14, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002909
2910 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
2911 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002912 ac_rsassa_vect15, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002913 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
2914 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002915 ac_rsassa_vect15, NULL_ARRAY, WITH_SALT),
2916
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002917 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002918 ac_rsaes_pkcs1_v1_5_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002919 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002920 ac_rsaes_pkcs1_v1_5_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002921 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002922 ac_rsaes_pkcs1_v1_5_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002923 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002924 ac_rsaes_pkcs1_v1_5_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002925 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002926 ac_rsaes_pkcs1_v1_5_vect15, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002927 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002928 ac_rsaes_pkcs1_v1_5_vect15, NULL_ARRAY, WITHOUT_SALT),
2929
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002930 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2931 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002932 ac_rsaes_oaep_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002933 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2934 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002935 ac_rsaes_oaep_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002936 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2937 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002938 ac_rsaes_oaep_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002939 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2940 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002941 ac_rsaes_oaep_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002942 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2943 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002944 ac_rsaes_oaep_vect10, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002945 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2946 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002947 ac_rsaes_oaep_vect10, NULL_ARRAY, WITHOUT_SALT),
2948
2949 /* RSA test with crt parameters */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002950 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002951 ac_rsassa_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002952 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002953 ac_rsassa_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002954 XTEST_AC_RSA_CASE(1, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002955 ac_rsassa_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002956 XTEST_AC_RSA_CASE(1, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002957 ac_rsassa_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002958 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002959 ac_rsassa_vect3, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002960 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002961 ac_rsassa_vect3, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002962 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002963 ac_rsassa_vect4, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002964 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002965 ac_rsassa_vect4, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002966 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002967 ac_rsassa_vect5, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002968 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002969 ac_rsassa_vect5, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002970 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002971 ac_rsassa_vect6, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002972 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002973 ac_rsassa_vect6, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002974 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002975 ac_rsassa_vect7, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002976 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002977 ac_rsassa_vect7, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002978 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002979 ac_rsassa_vect8, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002980 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002981 ac_rsassa_vect8, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002982 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002983 ac_rsassa_vect9, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002984 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002985 ac_rsassa_vect9, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002986 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002987 ac_rsassa_vect10, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002988 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002989 ac_rsassa_vect10, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002990 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002991 ac_rsassa_vect11, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002992 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002993 ac_rsassa_vect11, ARRAY, WITHOUT_SALT),
2994
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002995 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1,
2996 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002997 ac_rsassa_vect12, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002998 XTEST_AC_RSA_CASE(1,TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002999 ac_rsassa_vect12, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003000 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
3001 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003002 ac_rsassa_vect17, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003003 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
3004 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003005 ac_rsassa_vect17, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003006 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
3007 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003008 ac_rsassa_vect13, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003009 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
3010 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003011 ac_rsassa_vect13, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003012 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
3013 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003014 ac_rsassa_vect14, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003015 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
3016 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003017 ac_rsassa_vect14, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003018 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
3019 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003020 ac_rsassa_vect15, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003021 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
3022 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003023 ac_rsassa_vect15, ARRAY, WITH_SALT),
3024
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003025 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003026 ac_rsaes_pkcs1_v1_5_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003027 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003028 ac_rsaes_pkcs1_v1_5_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003029 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003030 ac_rsaes_pkcs1_v1_5_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003031 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003032 ac_rsaes_pkcs1_v1_5_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003033 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003034 ac_rsaes_pkcs1_v1_5_vect15, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003035 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003036 ac_rsaes_pkcs1_v1_5_vect15, ARRAY, WITHOUT_SALT),
3037
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003038 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3039 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003040 ac_rsaes_oaep_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003041 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3042 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003043 ac_rsaes_oaep_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003044 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3045 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003046 ac_rsaes_oaep_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003047 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3048 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003049 ac_rsaes_oaep_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003050 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3051 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003052 ac_rsaes_oaep_vect10, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003053 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3054 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003055 ac_rsaes_oaep_vect10, ARRAY, WITHOUT_SALT),
3056
3057 /* DSA tests */
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003058 /* [mod = L=1024, N=160, SHA-1] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003059 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect1),
3060 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect1),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003061 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect2),
3062 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect2),
3063 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect3),
3064 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect3),
3065 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect4),
3066 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect4),
3067 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect5),
3068 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect5),
3069 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect6),
3070 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect6),
3071 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect7),
3072 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect7),
3073 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect8),
3074 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect8),
3075 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect9),
3076 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect9),
3077 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect10),
3078 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect10),
3079 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect11),
3080 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect11),
3081 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect12),
3082 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect12),
3083 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect13),
3084 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect13),
3085 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect14),
3086 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect14),
3087 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect15),
3088 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect15),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003089 /* [mod = L=1024, N=160, SHA-224] - GP NOT SUPPORTED */
3090 /* [mod = L=1024, N=160, SHA-256] - GP NOT SUPPORTED */
3091 /* [mod = L=1024, N=160, SHA-384] - GP NOT SUPPORTED */
3092 /* [mod = L=1024, N=160, SHA-512] - GP NOT SUPPORTED */
3093 /* [mod = L=2048, N=224, SHA-1] - GP NOT SUPPORTED */
3094 /* [mod = L=2048, N=224, SHA-224] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003095 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect91),
3096 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect91),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003097 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect92),
3098 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect92),
3099 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect93),
3100 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect93),
3101 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect94),
3102 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect94),
3103 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect95),
3104 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect95),
3105 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect96),
3106 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect96),
3107 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect97),
3108 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect97),
3109 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect98),
3110 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect98),
3111 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect99),
3112 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect99),
3113 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect100),
3114 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect100),
3115 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect101),
3116 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect101),
3117 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect102),
3118 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect102),
3119 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect103),
3120 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect103),
3121 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect104),
3122 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect104),
3123 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect105),
3124 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect105),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003125 /* [mod = L=2048, N=224, SHA-256] */
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003126 XTEST_AC_DSA_CASE(0, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect106),
3127 XTEST_AC_DSA_CASE(0, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect106),
3128 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect107),
3129 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect107),
3130 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect108),
3131 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect108),
3132 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect109),
3133 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect109),
3134 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect110),
3135 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect110),
3136 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect111),
3137 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect111),
3138 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect112),
3139 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect112),
3140 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect113),
3141 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect113),
3142 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect114),
3143 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect114),
3144 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect115),
3145 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect115),
3146 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect116),
3147 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect116),
3148 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect117),
3149 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect117),
3150 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect118),
3151 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect118),
3152 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect119),
3153 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect119),
3154 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect120),
3155 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect120),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003156 /* [mod = L=2048, N=224, SHA-384] - GP NOT SUPPORTED */
3157 /* [mod = L=2048, N=224, SHA-512] - GP NOT SUPPORTED */
3158 /* [mod = L=2048, N=256, SHA-1] - GP NOT SUPPORTED */
3159 /* [mod = L=2048, N=256, SHA-224] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003160 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect166),
3161 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect166),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003162 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect167),
3163 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect167),
3164 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect168),
3165 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect168),
3166 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect169),
3167 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect169),
3168 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect170),
3169 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect170),
3170 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect171),
3171 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect171),
3172 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect172),
3173 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect172),
3174 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect173),
3175 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect173),
3176 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect174),
3177 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect174),
3178 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect175),
3179 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect175),
3180 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect176),
3181 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect176),
3182 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect177),
3183 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect177),
3184 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect178),
3185 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect178),
3186 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect179),
3187 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect179),
3188 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect180),
3189 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect180),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003190 /* [mod = L=2048, N=256, SHA-256] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003191 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect181),
3192 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect181),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003193 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect182),
3194 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect182),
3195 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect183),
3196 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect183),
3197 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect184),
3198 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect184),
3199 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect185),
3200 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect185),
3201 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect186),
3202 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect186),
3203 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect187),
3204 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect187),
3205 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect188),
3206 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect188),
3207 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect189),
3208 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect189),
3209 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect190),
3210 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect190),
3211 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect191),
3212 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect191),
3213 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect192),
3214 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect192),
3215 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect193),
3216 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect193),
3217 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect194),
3218 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect194),
3219 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect195),
3220 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect195),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003221 /* [mod = L=2048, N=256, SHA-384] - GP NOT SUPPORTED */
3222 /* [mod = L=2048, N=256, SHA-512] - GP NOT SUPPORTED */
3223 /* [mod = L=3072, N=256, SHA-1] - GP NOT SUPPORTED */
3224 /* [mod = L=3072, N=256, SHA-224] - GP NOT SUPPORTED */
3225 /* [mod = L=3072, N=256, SHA-256] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003226 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect256),
3227 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect256),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003228 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect257),
3229 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect257),
3230 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect258),
3231 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect258),
3232 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect259),
3233 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect259),
3234 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect260),
3235 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect260),
3236 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect261),
3237 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect261),
3238 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect262),
3239 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect262),
3240 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect263),
3241 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect263),
3242 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect264),
3243 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect264),
3244 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect265),
3245 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect265),
3246 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect266),
3247 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect266),
3248 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect267),
3249 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect267),
3250 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect268),
3251 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect268),
3252 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect269),
3253 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect269),
3254 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect270),
3255 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect270),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003256 /* [mod = L=3072, N=256, SHA-384] - GP NOT SUPPORTED */
3257 /* [mod = L=3072, N=256, SHA-512] - GP NOT SUPPORTED */
Pascal Brand3e143ee2015-07-15 17:17:16 +02003258
3259 /* ECDSA tests */
Cedric Chaumontc7654962015-09-09 14:56:36 +02003260 /* [P-192] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003261 XTEST_AC_ECC_CASE(0, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3262 nist_186_2_ecdsa_testvector_1),
3263 XTEST_AC_ECC_CASE(0, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3264 nist_186_2_ecdsa_testvector_1),
3265 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3266 nist_186_2_ecdsa_testvector_2),
3267 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3268 nist_186_2_ecdsa_testvector_2),
3269 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3270 nist_186_2_ecdsa_testvector_3),
3271 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3272 nist_186_2_ecdsa_testvector_3),
3273 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3274 nist_186_2_ecdsa_testvector_4),
3275 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3276 nist_186_2_ecdsa_testvector_4),
3277 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3278 nist_186_2_ecdsa_testvector_5),
3279 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3280 nist_186_2_ecdsa_testvector_5),
3281 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3282 nist_186_2_ecdsa_testvector_6),
3283 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3284 nist_186_2_ecdsa_testvector_6),
3285 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3286 nist_186_2_ecdsa_testvector_7),
3287 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3288 nist_186_2_ecdsa_testvector_7),
3289 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3290 nist_186_2_ecdsa_testvector_8),
3291 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3292 nist_186_2_ecdsa_testvector_8),
3293 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3294 nist_186_2_ecdsa_testvector_9),
3295 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3296 nist_186_2_ecdsa_testvector_9),
3297 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3298 nist_186_2_ecdsa_testvector_10),
3299 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3300 nist_186_2_ecdsa_testvector_10),
3301 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3302 nist_186_2_ecdsa_testvector_11),
3303 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3304 nist_186_2_ecdsa_testvector_11),
3305 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3306 nist_186_2_ecdsa_testvector_12),
3307 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3308 nist_186_2_ecdsa_testvector_12),
3309 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3310 nist_186_2_ecdsa_testvector_13),
3311 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3312 nist_186_2_ecdsa_testvector_13),
3313 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3314 nist_186_2_ecdsa_testvector_14),
3315 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3316 nist_186_2_ecdsa_testvector_14),
3317 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3318 nist_186_2_ecdsa_testvector_15),
3319 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3320 nist_186_2_ecdsa_testvector_15),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003321 /* [P-224] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003322 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3323 nist_186_2_ecdsa_testvector_16),
3324 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3325 nist_186_2_ecdsa_testvector_16),
3326 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3327 nist_186_2_ecdsa_testvector_17),
3328 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3329 nist_186_2_ecdsa_testvector_17),
3330 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3331 nist_186_2_ecdsa_testvector_18),
3332 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3333 nist_186_2_ecdsa_testvector_18),
3334 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3335 nist_186_2_ecdsa_testvector_19),
3336 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3337 nist_186_2_ecdsa_testvector_19),
3338 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3339 nist_186_2_ecdsa_testvector_20),
3340 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3341 nist_186_2_ecdsa_testvector_20),
3342 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3343 nist_186_2_ecdsa_testvector_21),
3344 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3345 nist_186_2_ecdsa_testvector_21),
3346 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3347 nist_186_2_ecdsa_testvector_22),
3348 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3349 nist_186_2_ecdsa_testvector_22),
3350 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3351 nist_186_2_ecdsa_testvector_23),
3352 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3353 nist_186_2_ecdsa_testvector_23),
3354 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3355 nist_186_2_ecdsa_testvector_24),
3356 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3357 nist_186_2_ecdsa_testvector_24),
3358 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3359 nist_186_2_ecdsa_testvector_25),
3360 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3361 nist_186_2_ecdsa_testvector_25),
3362 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3363 nist_186_2_ecdsa_testvector_26),
3364 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3365 nist_186_2_ecdsa_testvector_26),
3366 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3367 nist_186_2_ecdsa_testvector_27),
3368 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3369 nist_186_2_ecdsa_testvector_27),
3370 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3371 nist_186_2_ecdsa_testvector_28),
3372 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3373 nist_186_2_ecdsa_testvector_28),
3374 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3375 nist_186_2_ecdsa_testvector_29),
3376 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3377 nist_186_2_ecdsa_testvector_29),
3378 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3379 nist_186_2_ecdsa_testvector_30),
3380 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3381 nist_186_2_ecdsa_testvector_30),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003382 /* [P-256] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003383 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3384 nist_186_2_ecdsa_testvector_31),
3385 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3386 nist_186_2_ecdsa_testvector_31),
3387 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3388 nist_186_2_ecdsa_testvector_32),
3389 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3390 nist_186_2_ecdsa_testvector_32),
3391 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3392 nist_186_2_ecdsa_testvector_33),
3393 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3394 nist_186_2_ecdsa_testvector_33),
3395 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3396 nist_186_2_ecdsa_testvector_34),
3397 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3398 nist_186_2_ecdsa_testvector_34),
3399 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3400 nist_186_2_ecdsa_testvector_35),
3401 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3402 nist_186_2_ecdsa_testvector_35),
3403 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3404 nist_186_2_ecdsa_testvector_36),
3405 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3406 nist_186_2_ecdsa_testvector_36),
3407 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3408 nist_186_2_ecdsa_testvector_37),
3409 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3410 nist_186_2_ecdsa_testvector_37),
3411 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3412 nist_186_2_ecdsa_testvector_38),
3413 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3414 nist_186_2_ecdsa_testvector_38),
3415 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3416 nist_186_2_ecdsa_testvector_39),
3417 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3418 nist_186_2_ecdsa_testvector_39),
3419 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3420 nist_186_2_ecdsa_testvector_40),
3421 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3422 nist_186_2_ecdsa_testvector_40),
3423 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3424 nist_186_2_ecdsa_testvector_41),
3425 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3426 nist_186_2_ecdsa_testvector_41),
3427 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3428 nist_186_2_ecdsa_testvector_42),
3429 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3430 nist_186_2_ecdsa_testvector_42),
3431 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3432 nist_186_2_ecdsa_testvector_43),
3433 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3434 nist_186_2_ecdsa_testvector_43),
3435 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3436 nist_186_2_ecdsa_testvector_44),
3437 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3438 nist_186_2_ecdsa_testvector_44),
3439 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3440 nist_186_2_ecdsa_testvector_45),
3441 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3442 nist_186_2_ecdsa_testvector_45),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003443 /* [P-384] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003444 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3445 nist_186_2_ecdsa_testvector_46),
3446 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3447 nist_186_2_ecdsa_testvector_46),
3448 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3449 nist_186_2_ecdsa_testvector_47),
3450 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3451 nist_186_2_ecdsa_testvector_47),
3452 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3453 nist_186_2_ecdsa_testvector_48),
3454 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3455 nist_186_2_ecdsa_testvector_48),
3456 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3457 nist_186_2_ecdsa_testvector_49),
3458 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3459 nist_186_2_ecdsa_testvector_49),
3460 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3461 nist_186_2_ecdsa_testvector_50),
3462 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3463 nist_186_2_ecdsa_testvector_50),
3464 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3465 nist_186_2_ecdsa_testvector_51),
3466 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3467 nist_186_2_ecdsa_testvector_51),
3468 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3469 nist_186_2_ecdsa_testvector_52),
3470 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3471 nist_186_2_ecdsa_testvector_52),
3472 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3473 nist_186_2_ecdsa_testvector_53),
3474 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3475 nist_186_2_ecdsa_testvector_53),
3476 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3477 nist_186_2_ecdsa_testvector_54),
3478 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3479 nist_186_2_ecdsa_testvector_54),
3480 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3481 nist_186_2_ecdsa_testvector_55),
3482 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3483 nist_186_2_ecdsa_testvector_55),
3484 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3485 nist_186_2_ecdsa_testvector_56),
3486 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3487 nist_186_2_ecdsa_testvector_56),
3488 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3489 nist_186_2_ecdsa_testvector_57),
3490 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3491 nist_186_2_ecdsa_testvector_57),
3492 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3493 nist_186_2_ecdsa_testvector_58),
3494 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3495 nist_186_2_ecdsa_testvector_58),
3496 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3497 nist_186_2_ecdsa_testvector_59),
3498 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3499 nist_186_2_ecdsa_testvector_59),
3500 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3501 nist_186_2_ecdsa_testvector_60),
3502 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3503 nist_186_2_ecdsa_testvector_60),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003504 /* [P-521] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003505 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3506 nist_186_2_ecdsa_testvector_61),
3507 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3508 nist_186_2_ecdsa_testvector_61),
3509 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3510 nist_186_2_ecdsa_testvector_62),
3511 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3512 nist_186_2_ecdsa_testvector_62),
3513 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3514 nist_186_2_ecdsa_testvector_63),
3515 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3516 nist_186_2_ecdsa_testvector_63),
3517 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3518 nist_186_2_ecdsa_testvector_64),
3519 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3520 nist_186_2_ecdsa_testvector_64),
3521 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3522 nist_186_2_ecdsa_testvector_65),
3523 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3524 nist_186_2_ecdsa_testvector_65),
3525 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3526 nist_186_2_ecdsa_testvector_66),
3527 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3528 nist_186_2_ecdsa_testvector_66),
3529 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3530 nist_186_2_ecdsa_testvector_67),
3531 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3532 nist_186_2_ecdsa_testvector_67),
3533 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3534 nist_186_2_ecdsa_testvector_68),
3535 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3536 nist_186_2_ecdsa_testvector_68),
3537 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3538 nist_186_2_ecdsa_testvector_69),
3539 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3540 nist_186_2_ecdsa_testvector_69),
3541 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3542 nist_186_2_ecdsa_testvector_70),
3543 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3544 nist_186_2_ecdsa_testvector_70),
3545 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3546 nist_186_2_ecdsa_testvector_71),
3547 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3548 nist_186_2_ecdsa_testvector_71),
3549 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3550 nist_186_2_ecdsa_testvector_72),
3551 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3552 nist_186_2_ecdsa_testvector_72),
3553 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3554 nist_186_2_ecdsa_testvector_73),
3555 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3556 nist_186_2_ecdsa_testvector_73),
3557 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3558 nist_186_2_ecdsa_testvector_74),
3559 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3560 nist_186_2_ecdsa_testvector_74),
3561 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3562 nist_186_2_ecdsa_testvector_75),
3563 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3564 nist_186_2_ecdsa_testvector_75),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003565 /* [K-163] - GP NOT SUPPORTED */
3566 /* [K-233] - GP NOT SUPPORTED */
3567 /* [K-283] - GP NOT SUPPORTED */
3568 /* [K-409] - GP NOT SUPPORTED */
3569 /* [K-571] - GP NOT SUPPORTED */
3570 /* [B-163] - GP NOT SUPPORTED */
3571 /* [B-233] - GP NOT SUPPORTED */
3572 /* [B-283] - GP NOT SUPPORTED */
3573 /* [B-409] - GP NOT SUPPORTED */
3574 /* [B-571] - GP NOT SUPPORTED */
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003575
3576 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_PKE, TEE_MODE_ENCRYPT,
3577 gmt_0003_part5_c2_sm2_testvector),
3578 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_PKE, TEE_MODE_DECRYPT,
3579 gmt_0003_part5_c2_sm2_testvector),
3580 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_PKE, TEE_MODE_ENCRYPT,
3581 sm2_testvector2),
Jerome Forissier849b57e2019-12-19 16:37:14 +01003582
3583 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_DSA_SM3, TEE_MODE_VERIFY,
3584 gmt_003_part5_a2),
3585 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_DSA_SM3, TEE_MODE_SIGN,
3586 gmt_003_part5_a2),
Pascal Brandc639ac82015-07-02 08:53:34 +02003587};
3588
Valerii Chubarab9863c2022-08-12 07:42:29 +00003589static const struct xtest_ac_case xtest_ac_eddsa_cases[] = {
3590
3591 XTEST_AC_EDDSA_CASE(0, TEE_ALG_ED25519, TEE_MODE_SIGN,
3592 ed25519_rfc_8032_7_1, 0),
3593 XTEST_AC_EDDSA_CASE(0, TEE_ALG_ED25519, TEE_MODE_VERIFY,
3594 ed25519_rfc_8032_7_1, 0),
3595
3596 XTEST_AC_EDDSA_CTX_CASE(0, TEE_ALG_ED25519, TEE_MODE_SIGN,
3597 ed25519ctx_rfc_8032_7_2, 0),
3598 XTEST_AC_EDDSA_CTX_CASE(0, TEE_ALG_ED25519, TEE_MODE_VERIFY,
3599 ed25519ctx_rfc_8032_7_2, 0),
3600
3601 XTEST_AC_EDDSA_CASE(0, TEE_ALG_ED25519, TEE_MODE_SIGN,
3602 ed25519ph_rfc_8032_7_3, 1),
3603 XTEST_AC_EDDSA_CASE(0, TEE_ALG_ED25519, TEE_MODE_VERIFY,
3604 ed25519ph_rfc_8032_7_3, 1),
3605};
3606
Pascal Brandc639ac82015-07-02 08:53:34 +02003607static bool create_key(ADBG_Case_t *c, TEEC_Session *s,
3608 uint32_t max_key_size, uint32_t key_type,
3609 TEE_Attribute *attrs, size_t num_attrs,
3610 TEE_ObjectHandle *handle)
3611{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003612 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02003613
3614 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3615 ta_crypt_cmd_allocate_transient_object(c, s, key_type,
3616 max_key_size, handle)))
3617 return false;
3618
3619 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3620 ta_crypt_cmd_populate_transient_object(c, s, *handle, attrs,
3621 num_attrs)))
3622 return false;
3623
3624 for (n = 0; n < num_attrs; n++) {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003625 uint8_t out[512] = { };
3626 size_t out_size = sizeof(out);
Pascal Brand3e143ee2015-07-15 17:17:16 +02003627
3628 if (attrs[n].attributeID == TEE_ATTR_ECC_CURVE)
3629 continue;
3630
Pascal Brandc639ac82015-07-02 08:53:34 +02003631 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3632 ta_crypt_cmd_get_object_buffer_attribute(c, s, *handle,
3633 attrs[n].attributeID, out, &out_size)))
3634 return false;
3635
Pascal Brand3e143ee2015-07-15 17:17:16 +02003636 if (out_size < attrs[n].content.ref.length) {
3637 memmove(out + (attrs[n].content.ref.length - out_size),
3638 out,
3639 attrs[n].content.ref.length);
3640 memset(out, 0, attrs[n].content.ref.length - out_size);
3641 out_size = attrs[n].content.ref.length;
3642 }
3643
Pascal Brandc639ac82015-07-02 08:53:34 +02003644 if (!ADBG_EXPECT_BUFFER(c, attrs[n].content.ref.buffer,
3645 attrs[n].content.ref.length, out, out_size))
3646 return false;
3647 }
3648
3649 return true;
3650}
3651
Jerome Forissier26393882022-03-09 21:22:30 +01003652#define XTEST_NO_CURVE 0xFFFFFFFF /* implementation-defined as per GP spec */
3653
Pascal Brandc639ac82015-07-02 08:53:34 +02003654static void xtest_tee_test_4006(ADBG_Case_t *c)
3655{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003656 TEEC_Session session = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02003657 TEE_OperationHandle op = TEE_HANDLE_NULL;
3658 TEE_ObjectHandle priv_key_handle = TEE_HANDLE_NULL;
3659 TEE_ObjectHandle pub_key_handle = TEE_HANDLE_NULL;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003660 TEE_Attribute key_attrs[8] = { };
Jens Wiklander1f06b7d2022-12-02 21:49:57 +01003661 TEE_Attribute algo_params[2] = { };
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003662 size_t num_algo_params = 0;
3663 uint8_t out[512] = { };
3664 size_t out_size = 0;
3665 uint8_t out_enc[512] = { };
3666 size_t out_enc_size = 0;
3667 uint8_t ptx_hash[TEE_MAX_HASH_SIZE] = { };
Etienne Carriere481c6602019-01-22 13:27:26 +01003668 size_t ptx_hash_size = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003669 size_t max_key_size = 0;
3670 size_t num_key_attrs = 0;
3671 uint32_t ret_orig = 0;
3672 size_t n = 0;
3673 uint32_t curve = 0;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003674 uint32_t pub_key_type = 0;
3675 uint32_t priv_key_type = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003676 uint32_t hash_algo = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02003677
3678 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3679 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
3680 &ret_orig)))
3681 return;
3682
3683 for (n = 0; n < ARRAY_SIZE(xtest_ac_cases); n++) {
3684 const struct xtest_ac_case *tv = xtest_ac_cases + n;
3685
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003686 if (tv->level > level)
3687 continue;
3688
Jerome Forissier4b03e282020-01-22 16:33:12 +01003689 if ((tv->algo == TEE_ALG_SM2_PKE ||
3690 tv->algo == TEE_ALG_SM2_DSA_SM3) &&
3691 !ta_crypt_cmd_is_algo_supported(c, &session, tv->algo,
3692 TEE_ECC_CURVE_SM2)) {
3693 Do_ADBG_Log("SM2 not supported: skip subcase");
3694 continue;
3695 }
3696
Pascal Brandc639ac82015-07-02 08:53:34 +02003697 Do_ADBG_BeginSubCase(c, "Asym Crypto case %d algo 0x%x line %d",
3698 (int)n, (unsigned int)tv->algo,
3699 (int)tv->line);
3700
3701 /*
3702 * When signing or verifying we're working with the hash of
3703 * the payload.
3704 */
3705 if (tv->mode == TEE_MODE_VERIFY || tv->mode == TEE_MODE_SIGN) {
Pascal Brand3e143ee2015-07-15 17:17:16 +02003706 if (TEE_ALG_GET_MAIN_ALG(tv->algo) == TEE_MAIN_ALGO_ECDSA)
3707 hash_algo = TEE_ALG_SHA1;
Gabor Szekely2ad190f2018-09-14 14:05:06 +00003708#if defined(CFG_CRYPTO_RSASSA_NA1)
3709 else if (tv->algo == TEE_ALG_RSASSA_PKCS1_V1_5)
3710 hash_algo = TEE_ALG_SHA256;
3711#endif
Pascal Brand3e143ee2015-07-15 17:17:16 +02003712 else
3713 hash_algo = TEE_ALG_HASH_ALGO(
3714 TEE_ALG_GET_DIGEST_HASH(tv->algo));
Pascal Brandc639ac82015-07-02 08:53:34 +02003715
3716 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3717 ta_crypt_cmd_allocate_operation(c, &session,
3718 &op, hash_algo, TEE_MODE_DIGEST, 0)))
3719 goto out;
3720
3721 ptx_hash_size = sizeof(ptx_hash);
3722 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3723 ta_crypt_cmd_digest_do_final(c, & session, op,
3724 tv->ptx, tv->ptx_len, ptx_hash,
3725 &ptx_hash_size)))
3726 goto out;
3727
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003728 /*
3729 * When we use DSA algorithms, the size of the hash we
3730 * consider equals the min between the size of the
3731 * "subprime" in the key and the size of the hash
3732 */
3733 if (TEE_ALG_GET_MAIN_ALG(tv->algo) ==
3734 TEE_MAIN_ALGO_DSA) {
3735 if (tv->params.dsa.sub_prime_len <=
3736 ptx_hash_size)
3737 ptx_hash_size =
3738 tv->params.dsa.sub_prime_len;
3739 }
3740
Pascal Brandc639ac82015-07-02 08:53:34 +02003741 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3742 ta_crypt_cmd_free_operation(c, &session, op)))
3743 goto out;
3744 }
3745
3746 num_algo_params = 0;
3747 num_key_attrs = 0;
3748 switch (TEE_ALG_GET_MAIN_ALG(tv->algo)) {
3749 case TEE_MAIN_ALGO_RSA:
3750 if (tv->params.rsa.salt_len > 0) {
3751 algo_params[0].attributeID =
3752 TEE_ATTR_RSA_PSS_SALT_LENGTH;
3753 algo_params[0].content.value.a =
3754 tv->params.rsa.salt_len;
3755 algo_params[0].content.value.b = 0;
3756 num_algo_params = 1;
3757 }
3758
3759 max_key_size = tv->params.rsa.modulus_len * 8;
3760
3761 xtest_add_attr(&num_key_attrs, key_attrs,
3762 TEE_ATTR_RSA_MODULUS,
3763 tv->params.rsa.modulus,
3764 tv->params.rsa.modulus_len);
3765 xtest_add_attr(&num_key_attrs, key_attrs,
3766 TEE_ATTR_RSA_PUBLIC_EXPONENT,
3767 tv->params.rsa.pub_exp,
3768 tv->params.rsa.pub_exp_len);
3769
3770 if (!ADBG_EXPECT_TRUE(c,
3771 create_key(c, &session,
3772 max_key_size,
3773 TEE_TYPE_RSA_PUBLIC_KEY,
3774 key_attrs,
3775 num_key_attrs,
3776 &pub_key_handle)))
3777 goto out;
3778
3779 xtest_add_attr(&num_key_attrs, key_attrs,
3780 TEE_ATTR_RSA_PRIVATE_EXPONENT,
3781 tv->params.rsa.priv_exp,
3782 tv->params.rsa.priv_exp_len);
3783
3784 if (tv->params.rsa.prime1_len != 0) {
3785 xtest_add_attr(&num_key_attrs, key_attrs,
3786 TEE_ATTR_RSA_PRIME1,
3787 tv->params.rsa.prime1,
3788 tv->params.rsa.prime1_len);
3789 }
3790
3791 if (tv->params.rsa.prime2_len != 0) {
3792 xtest_add_attr(&num_key_attrs, key_attrs,
3793 TEE_ATTR_RSA_PRIME2,
3794 tv->params.rsa.prime2,
3795 tv->params.rsa.prime2_len);
3796 }
3797
3798 if (tv->params.rsa.exp1_len != 0) {
3799 xtest_add_attr(&num_key_attrs, key_attrs,
3800 TEE_ATTR_RSA_EXPONENT1,
3801 tv->params.rsa.exp1,
3802 tv->params.rsa.exp1_len);
3803 }
3804
3805 if (tv->params.rsa.exp2_len != 0) {
3806 xtest_add_attr(&num_key_attrs, key_attrs,
3807 TEE_ATTR_RSA_EXPONENT2,
3808 tv->params.rsa.exp2,
3809 tv->params.rsa.exp2_len);
3810 }
3811
3812 if (tv->params.rsa.coeff_len != 0) {
3813 xtest_add_attr(&num_key_attrs, key_attrs,
3814 TEE_ATTR_RSA_COEFFICIENT,
3815 tv->params.rsa.coeff,
3816 tv->params.rsa.coeff_len);
3817 }
3818
3819 if (!ADBG_EXPECT_TRUE(c,
3820 create_key(c, &session,
3821 max_key_size,
3822 TEE_TYPE_RSA_KEYPAIR,
3823 key_attrs,
3824 num_key_attrs,
3825 &priv_key_handle)))
3826 goto out;
3827 break;
3828
3829 case TEE_MAIN_ALGO_DSA:
3830 max_key_size = tv->params.dsa.prime_len * 8;
3831
3832 xtest_add_attr(&num_key_attrs, key_attrs,
3833 TEE_ATTR_DSA_PRIME,
3834 tv->params.dsa.prime,
3835 tv->params.dsa.prime_len);
3836 xtest_add_attr(&num_key_attrs, key_attrs,
3837 TEE_ATTR_DSA_SUBPRIME,
3838 tv->params.dsa.sub_prime,
3839 tv->params.dsa.sub_prime_len);
3840 xtest_add_attr(&num_key_attrs, key_attrs,
3841 TEE_ATTR_DSA_BASE,
3842 tv->params.dsa.base,
3843 tv->params.dsa.base_len);
3844 xtest_add_attr(&num_key_attrs, key_attrs,
3845 TEE_ATTR_DSA_PUBLIC_VALUE,
3846 tv->params.dsa.pub_val,
3847 tv->params.dsa.pub_val_len);
3848
3849 if (!ADBG_EXPECT_TRUE(c,
3850 create_key(c, &session, max_key_size,
3851 TEE_TYPE_DSA_PUBLIC_KEY, key_attrs,
3852 num_key_attrs, &pub_key_handle)))
3853 goto out;
3854
3855 xtest_add_attr(&num_key_attrs, key_attrs,
3856 TEE_ATTR_DSA_PRIVATE_VALUE,
3857 tv->params.dsa.priv_val,
3858 tv->params.dsa.priv_val_len);
3859
3860 if (!ADBG_EXPECT_TRUE(c,
3861 create_key(c, &session, max_key_size,
3862 TEE_TYPE_DSA_KEYPAIR, key_attrs,
3863 num_key_attrs, &priv_key_handle)))
3864 goto out;
3865 break;
3866
Pascal Brand3e143ee2015-07-15 17:17:16 +02003867 case TEE_MAIN_ALGO_ECDSA:
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003868 case TEE_MAIN_ALGO_SM2_PKE:
Jerome Forissier849b57e2019-12-19 16:37:14 +01003869 case TEE_MAIN_ALGO_SM2_DSA_SM3:
Pascal Brand3e143ee2015-07-15 17:17:16 +02003870 switch (tv->algo) {
3871 case TEE_ALG_ECDSA_P192:
3872 curve = TEE_ECC_CURVE_NIST_P192;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003873 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
3874 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003875 break;
3876 case TEE_ALG_ECDSA_P224:
3877 curve = TEE_ECC_CURVE_NIST_P224;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003878 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
3879 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003880 break;
3881 case TEE_ALG_ECDSA_P256:
3882 curve = TEE_ECC_CURVE_NIST_P256;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003883 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
3884 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003885 break;
3886 case TEE_ALG_ECDSA_P384:
3887 curve = TEE_ECC_CURVE_NIST_P384;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003888 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
3889 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003890 break;
3891 case TEE_ALG_ECDSA_P521:
3892 curve = TEE_ECC_CURVE_NIST_P521;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003893 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
3894 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
3895 break;
3896 case TEE_ALG_SM2_PKE:
Jerome Forissier26393882022-03-09 21:22:30 +01003897 curve = XTEST_NO_CURVE;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003898 pub_key_type = TEE_TYPE_SM2_PKE_PUBLIC_KEY;
3899 priv_key_type = TEE_TYPE_SM2_PKE_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003900 break;
Jerome Forissier849b57e2019-12-19 16:37:14 +01003901 case TEE_ALG_SM2_DSA_SM3:
Jerome Forissier26393882022-03-09 21:22:30 +01003902 curve = XTEST_NO_CURVE;
Jerome Forissier849b57e2019-12-19 16:37:14 +01003903 pub_key_type = TEE_TYPE_SM2_DSA_PUBLIC_KEY;
3904 priv_key_type = TEE_TYPE_SM2_DSA_KEYPAIR;
3905 break;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003906 default:
3907 curve = 0xFF;
3908 break;
3909 }
3910
3911 if (tv->algo == TEE_ALG_ECDSA_P521)
3912 max_key_size = 521;
3913 else
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003914 max_key_size = tv->params.ecc.private_len * 8;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003915
Jerome Forissier26393882022-03-09 21:22:30 +01003916 if (curve != XTEST_NO_CURVE)
3917 xtest_add_attr_value(&num_key_attrs, key_attrs,
Pascal Brand3e143ee2015-07-15 17:17:16 +02003918 TEE_ATTR_ECC_CURVE, curve, 0);
3919 xtest_add_attr(&num_key_attrs, key_attrs,
3920 TEE_ATTR_ECC_PUBLIC_VALUE_X,
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003921 tv->params.ecc.public_x,
3922 tv->params.ecc.public_x_len);
Pascal Brand3e143ee2015-07-15 17:17:16 +02003923 xtest_add_attr(&num_key_attrs, key_attrs,
3924 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003925 tv->params.ecc.public_y,
3926 tv->params.ecc.public_y_len);
Pascal Brand3e143ee2015-07-15 17:17:16 +02003927
3928 if (!ADBG_EXPECT_TRUE(c,
3929 create_key(c, &session, max_key_size,
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003930 pub_key_type, key_attrs,
Pascal Brand3e143ee2015-07-15 17:17:16 +02003931 num_key_attrs, &pub_key_handle)))
3932 goto out;
3933
3934 xtest_add_attr(&num_key_attrs, key_attrs,
3935 TEE_ATTR_ECC_PRIVATE_VALUE,
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003936 tv->params.ecc.private,
3937 tv->params.ecc.private_len);
Pascal Brand3e143ee2015-07-15 17:17:16 +02003938
3939 if (!ADBG_EXPECT_TRUE(c,
3940 create_key(c, &session, max_key_size,
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003941 priv_key_type, key_attrs,
Pascal Brand3e143ee2015-07-15 17:17:16 +02003942 num_key_attrs, &priv_key_handle)))
3943 goto out;
3944 break;
3945
Pascal Brandc639ac82015-07-02 08:53:34 +02003946 default:
3947 ADBG_EXPECT_TRUE(c, false);
3948 goto out;
3949 }
3950
3951 out_size = sizeof(out);
3952 memset(out, 0, sizeof(out));
3953 switch (tv->mode) {
3954 case TEE_MODE_ENCRYPT:
3955 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3956 ta_crypt_cmd_allocate_operation(c, &session,
Pascal Brand3e143ee2015-07-15 17:17:16 +02003957 &op, tv->algo, TEE_MODE_ENCRYPT,
3958 max_key_size)))
Pascal Brandc639ac82015-07-02 08:53:34 +02003959 goto out;
3960
3961 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3962 ta_crypt_cmd_set_operation_key(c, &session, op,
3963 pub_key_handle)))
3964 goto out;
3965
3966 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3967 ta_crypt_cmd_free_transient_object(c, &session,
3968 pub_key_handle)))
3969 goto out;
3970 pub_key_handle = TEE_HANDLE_NULL;
3971
Jens Wiklander1f06b7d2022-12-02 21:49:57 +01003972 num_algo_params = 0;
3973 if (tv->algo == TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1) {
3974 algo_params[0].attributeID =
3975 TEE_ATTR_RSA_OAEP_MGF_HASH;
3976 algo_params[0].content.ref.length =
3977 sizeof(uint32_t);
3978 algo_params[0].content.ref.buffer =
3979 &(uint32_t){TEE_ALG_SHA1};
3980 num_algo_params = 1;
3981 }
3982
3983
Pascal Brandc639ac82015-07-02 08:53:34 +02003984 out_enc_size = sizeof(out_enc);
3985 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3986 ta_crypt_cmd_asymmetric_encrypt(c, &session, op,
Jens Wiklander1f06b7d2022-12-02 21:49:57 +01003987 algo_params, num_algo_params, tv->ptx,
3988 tv->ptx_len, out_enc, &out_enc_size)))
Pascal Brandc639ac82015-07-02 08:53:34 +02003989 goto out;
3990
3991 /*
3992 * A PS which is random is added when formatting the
3993 * message internally of the algorithm so we can't
3994 * verify against precomputed values, instead we use the
3995 * decrypt operation to see that output is correct.
3996 */
3997
3998 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3999 ta_crypt_cmd_free_operation(c, &session, op)))
4000 goto out;
4001
4002 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4003 ta_crypt_cmd_allocate_operation(c, &session,
4004 &op, tv->algo, TEE_MODE_DECRYPT,
4005 max_key_size)))
4006 goto out;
4007
4008 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4009 ta_crypt_cmd_set_operation_key(c, &session, op,
4010 priv_key_handle)))
4011 goto out;
4012
4013 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4014 ta_crypt_cmd_free_transient_object(c, &session,
4015 priv_key_handle)))
4016 goto out;
4017
4018 priv_key_handle = TEE_HANDLE_NULL;
4019
4020 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4021 ta_crypt_cmd_asymmetric_decrypt(c, &session, op,
4022 NULL, 0, out_enc, out_enc_size, out,
4023 &out_size)))
4024 goto out;
4025
4026 (void)ADBG_EXPECT_BUFFER(c, tv->ptx, tv->ptx_len, out,
4027 out_size);
4028 break;
4029
4030 case TEE_MODE_DECRYPT:
4031 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4032 ta_crypt_cmd_allocate_operation(c, &session,
4033 &op, tv->algo, TEE_MODE_DECRYPT,
4034 max_key_size)))
4035 goto out;
4036
4037 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4038 ta_crypt_cmd_set_operation_key(c, &session, op,
4039 priv_key_handle)))
4040 goto out;
4041
4042 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4043 ta_crypt_cmd_free_transient_object(c, &session,
4044 priv_key_handle)))
4045 goto out;
4046
4047 priv_key_handle = TEE_HANDLE_NULL;
4048
4049 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4050 ta_crypt_cmd_asymmetric_decrypt(c, &session, op,
4051 NULL, 0, tv->ctx, tv->ctx_len, out,
4052 &out_size)))
4053 goto out;
4054
4055 (void)ADBG_EXPECT_BUFFER(c, tv->ptx, tv->ptx_len, out,
4056 out_size);
4057 break;
4058
4059 case TEE_MODE_VERIFY:
4060 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4061 ta_crypt_cmd_allocate_operation(c, &session,
4062 &op, tv->algo, TEE_MODE_VERIFY,
4063 max_key_size)))
4064 goto out;
4065
4066 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4067 ta_crypt_cmd_set_operation_key(c, &session, op,
4068 pub_key_handle)))
4069 goto out;
4070
4071 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4072 ta_crypt_cmd_free_transient_object(c, &session,
4073 pub_key_handle)))
4074 goto out;
4075
4076 pub_key_handle = TEE_HANDLE_NULL;
4077
4078 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4079 ta_crypt_cmd_asymmetric_verify(c, &session, op,
4080 algo_params, num_algo_params, ptx_hash,
4081 ptx_hash_size, tv->ctx, tv->ctx_len)))
4082 goto out;
4083 break;
4084
4085 case TEE_MODE_SIGN:
4086 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4087 ta_crypt_cmd_allocate_operation(c, &session,
4088 &op, tv->algo, TEE_MODE_SIGN,
4089 max_key_size)))
4090 goto out;
4091
4092 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4093 ta_crypt_cmd_set_operation_key(c, &session, op,
4094 priv_key_handle)))
4095 goto out;
4096
4097 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4098 ta_crypt_cmd_free_transient_object(c, &session,
4099 priv_key_handle)))
4100 goto out;
4101
4102 priv_key_handle = TEE_HANDLE_NULL;
4103
4104 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4105 ta_crypt_cmd_asymmetric_sign(c, &session, op,
4106 algo_params, num_algo_params, ptx_hash,
4107 ptx_hash_size, out, &out_size)))
4108 goto out;
4109
4110 if (TEE_ALG_GET_CHAIN_MODE(tv->algo) ==
4111 TEE_CHAIN_MODE_PKCS1_PSS_MGF1 ||
Pascal Brand3e143ee2015-07-15 17:17:16 +02004112 tv->algo == TEE_ALG_DSA_SHA1 ||
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02004113 tv->algo == TEE_ALG_DSA_SHA224 ||
4114 tv->algo == TEE_ALG_DSA_SHA256 ||
Pascal Brand3e143ee2015-07-15 17:17:16 +02004115 TEE_ALG_GET_MAIN_ALG(tv->algo) ==
Jerome Forissier849b57e2019-12-19 16:37:14 +01004116 TEE_MAIN_ALGO_ECDSA ||
4117 tv->algo == TEE_ALG_SM2_DSA_SM3) {
Pascal Brandc639ac82015-07-02 08:53:34 +02004118 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4119 ta_crypt_cmd_free_operation(c, &session,
4120 op)))
4121 goto out;
4122 /*
4123 * The salt or K is random so we can't verify
4124 * signing against precomputed values, instead
4125 * we use the verify operation to see that
4126 * output is correct.
4127 */
4128 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4129 ta_crypt_cmd_allocate_operation(c,
4130 &session, &op, tv->algo,
4131 TEE_MODE_VERIFY, max_key_size)))
4132 goto out;
4133
4134 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4135 ta_crypt_cmd_set_operation_key(c,
4136 &session, op, pub_key_handle)))
4137 goto out;
4138
4139 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4140 ta_crypt_cmd_free_transient_object(c,
4141 &session, pub_key_handle)))
4142 goto out;
4143
4144 pub_key_handle = TEE_HANDLE_NULL;
4145
4146 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4147 ta_crypt_cmd_asymmetric_verify(c,
4148 &session, op, algo_params,
4149 num_algo_params, ptx_hash,
4150 ptx_hash_size, out, out_size)))
4151 goto out;
4152 } else {
4153 (void)ADBG_EXPECT_BUFFER(c, tv->ctx,
4154 tv->ctx_len, out,
4155 out_size);
4156 }
4157 break;
4158
4159 default:
4160 break;
4161 }
4162
4163 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4164 ta_crypt_cmd_free_operation(c, &session, op)))
4165 goto out;
4166
4167 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4168 ta_crypt_cmd_free_transient_object(c, &session,
4169 pub_key_handle)))
4170 goto out;
4171 pub_key_handle = TEE_HANDLE_NULL;
4172
4173 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4174 ta_crypt_cmd_free_transient_object(c, &session,
4175 priv_key_handle)))
4176 goto out;
4177
4178 priv_key_handle = TEE_HANDLE_NULL;
4179
4180 Do_ADBG_EndSubCase(c, NULL);
4181 }
4182out:
4183 TEEC_CloseSession(&session);
4184}
Jens Wiklander14f48872018-06-29 15:30:13 +02004185ADBG_CASE_DEFINE(regression, 4006, xtest_tee_test_4006,
4186 "Test TEE Internal API Asymmetric Cipher operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02004187
4188#define KEY_ATTR(x, y) { #x, (x), y }
4189
4190struct key_attrs {
4191 const char *name;
4192 uint32_t attr;
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004193 /*
4194 * When keysize_check != 0: size of attribute is checked
4195 * Expected value is key_size bits except for DH in which case it is
4196 * the value of keysize_check.
4197 */
4198 uint32_t keysize_check;
Pascal Brandc639ac82015-07-02 08:53:34 +02004199};
4200
4201static bool test_keygen_attributes(ADBG_Case_t *c, TEEC_Session *s,
4202 TEE_ObjectHandle key, uint32_t key_size,
4203 struct key_attrs *attrs, size_t num_attrs)
4204{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004205 uint8_t out[2048] = { };
4206 size_t out_size = 0;
4207 size_t n = 0;
4208 size_t m = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004209
4210 for (m = 0; m < num_attrs; m++) {
4211 if ((attrs[m].attr & TEE_ATTR_BIT_VALUE) == 0) {
4212 out_size = sizeof(out);
4213 memset(out, 0, sizeof(out));
4214 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4215 ta_crypt_cmd_get_object_buffer_attribute(c, s,
4216 key, attrs[m].attr, out, &out_size)))
4217 return false;
4218
4219 if (attrs[m].keysize_check)
Jerome Forissierfe94e562020-11-17 17:22:40 +01004220 ADBG_EXPECT_COMPARE_UNSIGNED(c, out_size, <=,
Pascal Brandc639ac82015-07-02 08:53:34 +02004221 key_size / 8);
4222
4223 if (out_size > 0) {
4224 /* Check that buffer isn't all zeroes */
4225 for (n = 0; n < out_size; n++)
4226 if (out[n] != 0)
4227 break;
4228 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, n, <,
4229 out_size))
4230 return false;
4231 }
4232 } else {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004233 uint32_t a = 0;
4234 uint32_t b = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004235
4236 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4237 ta_crypt_cmd_get_object_value_attribute(c, s, key,
4238 attrs[m].attr, &a, &b)))
4239 return false;
4240 }
4241 }
4242 return true;
4243}
4244
4245static bool test_secret_value(ADBG_Case_t *c, TEEC_Session *s,
4246 TEE_ObjectHandle key, uint32_t key_size)
4247{
4248 const struct key_attrs attrs[] = {
4249 KEY_ATTR(TEE_ATTR_SECRET_VALUE, true),
4250 };
4251
4252 return test_keygen_attributes(c, s, key, key_size,
4253 (struct key_attrs *)&attrs,
4254 ARRAY_SIZE(attrs));
4255}
4256
4257
4258static bool test_rsa_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4259 TEE_ObjectHandle key, uint32_t key_size)
4260{
4261 const struct key_attrs attrs[] = {
4262 KEY_ATTR(TEE_ATTR_RSA_MODULUS, true),
4263 KEY_ATTR(TEE_ATTR_RSA_PUBLIC_EXPONENT, false),
4264 KEY_ATTR(TEE_ATTR_RSA_PRIVATE_EXPONENT, false),
4265 KEY_ATTR(TEE_ATTR_RSA_PRIME1, false),
4266 KEY_ATTR(TEE_ATTR_RSA_PRIME2, false),
4267 KEY_ATTR(TEE_ATTR_RSA_EXPONENT1, false),
4268 KEY_ATTR(TEE_ATTR_RSA_EXPONENT2, false),
4269 KEY_ATTR(TEE_ATTR_RSA_COEFFICIENT, false),
4270 };
4271
4272 return test_keygen_attributes(c, s, key, key_size,
4273 (struct key_attrs *)&attrs,
4274 ARRAY_SIZE(attrs));
4275}
4276
Pascal Brande61133f2015-07-08 15:38:37 +02004277static bool test_ecc_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4278 TEE_ObjectHandle key, uint32_t key_size)
4279{
4280 const struct key_attrs attrs[] = {
4281 KEY_ATTR(TEE_ATTR_ECC_PRIVATE_VALUE, false),
4282 KEY_ATTR(TEE_ATTR_ECC_PUBLIC_VALUE_X , false),
4283 KEY_ATTR(TEE_ATTR_ECC_PUBLIC_VALUE_Y , false),
4284 /* KEY_ATTR(TEE_ATTR_ECC_CURVE, false), - do not test */
4285 };
4286
4287 return test_keygen_attributes(c, s, key, key_size,
4288 (struct key_attrs *)&attrs,
4289 ARRAY_SIZE(attrs));
4290}
4291
Pascal Brandc639ac82015-07-02 08:53:34 +02004292static bool test_dh_key_pair(ADBG_Case_t *c, TEEC_Session *s,
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004293 TEE_ObjectHandle key, uint32_t check_keysize)
Pascal Brandc639ac82015-07-02 08:53:34 +02004294{
4295 const struct key_attrs attrs[] = {
4296 KEY_ATTR(TEE_ATTR_DH_PRIME, false),
4297 KEY_ATTR(TEE_ATTR_DH_BASE, false),
4298 KEY_ATTR(TEE_ATTR_DH_PUBLIC_VALUE, false),
4299 KEY_ATTR(TEE_ATTR_DH_PRIVATE_VALUE, check_keysize),
4300 KEY_ATTR(TEE_ATTR_DH_X_BITS, false),
4301 };
4302
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004303 return test_keygen_attributes(c, s, key, check_keysize,
Pascal Brandc639ac82015-07-02 08:53:34 +02004304 (struct key_attrs *)&attrs,
4305 ARRAY_SIZE(attrs));
4306}
4307
4308static bool test_dsa_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4309 TEE_ObjectHandle key, uint32_t key_size)
4310{
4311 const struct key_attrs attrs[] = {
4312 KEY_ATTR(TEE_ATTR_DSA_PRIME, true),
4313 KEY_ATTR(TEE_ATTR_DSA_SUBPRIME, false),
4314 KEY_ATTR(TEE_ATTR_DSA_BASE, false),
4315 KEY_ATTR(TEE_ATTR_DSA_PUBLIC_VALUE, false),
4316 KEY_ATTR(TEE_ATTR_DSA_PRIVATE_VALUE, false),
4317 };
4318
4319 return test_keygen_attributes(c, s, key, key_size,
4320 (struct key_attrs *)&attrs,
4321 ARRAY_SIZE(attrs));
4322}
4323
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03004324static bool test_x25519_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4325 TEE_ObjectHandle key, uint32_t key_size)
4326{
4327 const struct key_attrs attrs[] = {
4328 KEY_ATTR(TEE_ATTR_X25519_PRIVATE_VALUE, false),
4329 KEY_ATTR(TEE_ATTR_X25519_PUBLIC_VALUE, false),
4330 };
4331
4332 return test_keygen_attributes(c, s, key, key_size,
4333 (struct key_attrs *)&attrs,
4334 ARRAY_SIZE(attrs));
4335}
4336
Valerii Chubarab9863c2022-08-12 07:42:29 +00004337static bool test_ed25519_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4338 TEE_ObjectHandle key, uint32_t key_size)
4339{
4340 const struct key_attrs attrs[] = {
4341 KEY_ATTR(TEE_ATTR_ED25519_PRIVATE_VALUE, false),
4342 KEY_ATTR(TEE_ATTR_ED25519_PUBLIC_VALUE, false),
4343 };
4344
4345 return test_keygen_attributes(c, s, key, key_size,
4346 (struct key_attrs *)&attrs,
4347 ARRAY_SIZE(attrs));
4348}
4349
Pascal Brandc639ac82015-07-02 08:53:34 +02004350static bool generate_and_test_key(ADBG_Case_t *c, TEEC_Session *s,
4351 uint32_t key_type, uint32_t check_keysize,
4352 uint32_t key_size,
4353 TEE_Attribute *params, size_t param_count)
4354{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004355 TEE_ObjectHandle key = TEE_HANDLE_NULL;
Pascal Brandc639ac82015-07-02 08:53:34 +02004356 bool ret_val = true;
4357
4358 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4359 ta_crypt_cmd_allocate_transient_object(c, s, key_type, key_size,
4360 &key)))
4361 return false;
4362
4363 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4364 ta_crypt_cmd_generate_key(c, s, key, key_size, params,
4365 param_count)))
4366 return false;
4367
4368 switch (key_type) {
4369 case TEE_TYPE_DES:
4370 case TEE_TYPE_DES3:
4371 ret_val = ADBG_EXPECT_TRUE(c,
4372 test_secret_value(c, s, key,
4373 key_size + key_size / 7));
4374 break;
4375 case TEE_TYPE_AES:
4376 case TEE_TYPE_HMAC_MD5:
4377 case TEE_TYPE_HMAC_SHA1:
4378 case TEE_TYPE_HMAC_SHA224:
4379 case TEE_TYPE_HMAC_SHA256:
4380 case TEE_TYPE_HMAC_SHA384:
4381 case TEE_TYPE_HMAC_SHA512:
4382 case TEE_TYPE_GENERIC_SECRET:
4383 ret_val = ADBG_EXPECT_TRUE(c,
4384 test_secret_value(c, s, key, key_size));
4385 break;
4386
4387 case TEE_TYPE_RSA_KEYPAIR:
4388 ret_val = ADBG_EXPECT_TRUE(c,
4389 test_rsa_key_pair(c, s, key, key_size));
4390 break;
4391
Pascal Brande61133f2015-07-08 15:38:37 +02004392 case TEE_TYPE_ECDSA_KEYPAIR:
4393 case TEE_TYPE_ECDH_KEYPAIR:
4394 ret_val = ADBG_EXPECT_TRUE(c,
4395 test_ecc_key_pair(c, s, key, key_size));
4396 break;
4397
Pascal Brandc639ac82015-07-02 08:53:34 +02004398 case TEE_TYPE_DH_KEYPAIR:
Pascal Brande61133f2015-07-08 15:38:37 +02004399 ret_val = ADBG_EXPECT_TRUE(c,
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004400 test_dh_key_pair(c, s, key, check_keysize));
Pascal Brandc639ac82015-07-02 08:53:34 +02004401 break;
4402
4403 case TEE_TYPE_DSA_KEYPAIR:
4404 ret_val = ADBG_EXPECT_TRUE(c,
4405 test_dsa_key_pair(c, s, key, key_size));
4406 break;
4407
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03004408 case TEE_TYPE_X25519_KEYPAIR:
4409 ret_val = ADBG_EXPECT_TRUE(c,
4410 test_x25519_key_pair(c, s, key, key_size));
4411 break;
4412
Valerii Chubarab9863c2022-08-12 07:42:29 +00004413 case TEE_TYPE_ED25519_KEYPAIR:
4414 ret_val = ADBG_EXPECT_TRUE(c,
4415 test_ed25519_key_pair(c, s, key, key_size));
4416 break;
4417
Pascal Brandc639ac82015-07-02 08:53:34 +02004418 default:
4419 ret_val = false;
4420 break;
4421 }
4422
4423 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4424 ta_crypt_cmd_free_transient_object(c, s, key)))
4425 return false;
4426
4427 return ret_val;
4428}
4429
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004430struct key_types_noparam {
4431 unsigned level;
4432 const char *name;
4433 uint32_t key_type;
4434 uint32_t quanta;
4435 uint32_t min_size;
4436 uint32_t max_size;
4437};
4438
4439static void keygen_noparams(ADBG_Case_t *c, TEEC_Session *session,
4440 const struct key_types_noparam *key_types,
4441 size_t num_key_types)
Pascal Brandc639ac82015-07-02 08:53:34 +02004442{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004443 size_t n = 0;
4444 uint32_t key_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004445
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004446 for (n = 0; n < num_key_types; n++) {
Pascal Brandc639ac82015-07-02 08:53:34 +02004447 uint32_t min_size = key_types[n].min_size;
4448 uint32_t max_size = key_types[n].max_size;
4449 uint32_t quanta = key_types[n].quanta;
4450
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004451 if (key_types[n].level > level)
4452 continue;
4453
Pascal Brandc639ac82015-07-02 08:53:34 +02004454 Do_ADBG_BeginSubCase(c, "Generate %s key", key_types[n].name);
4455
4456 for (key_size = min_size; key_size <= max_size;
4457 key_size += quanta) {
4458 if (!ADBG_EXPECT_TRUE(c,
4459 generate_and_test_key(c, session, key_types
4460 [n].key_type, 1, key_size, NULL, 0)))
4461 break;
4462 }
4463
4464 Do_ADBG_EndSubCase(c, "Generate %s key", key_types[n].name);
4465 }
4466}
4467
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004468static void xtest_tee_test_4007_symmetric(ADBG_Case_t *c)
Pascal Brandc639ac82015-07-02 08:53:34 +02004469{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004470 TEEC_Session session = { };
4471 uint32_t ret_orig = 0;
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004472 static const struct key_types_noparam key_types[] = {
4473 { 0, "AES", TEE_TYPE_AES, 64, 128,
4474 256 /* valid sizes 128, 192, 256 */ },
4475 { 0, "DES", TEE_TYPE_DES, 56, 56, 56 /* valid size 56 */ },
4476 { 0, "DES3", TEE_TYPE_DES3, 56, 112,
4477 168 /* valid sizes 112, 168 */ },
4478 { 0, "HMAC-MD5", TEE_TYPE_HMAC_MD5, 8, 64, 512 },
4479 { 0, "HMAC-SHA1", TEE_TYPE_HMAC_SHA1, 8, 80, 512 },
4480 { 0, "HMAC-SHA224", TEE_TYPE_HMAC_SHA224, 8, 112, 512 },
4481 { 0, "HMAC-SHA256", TEE_TYPE_HMAC_SHA256, 8, 192, 1024 },
4482 { 0, "HMAC-SHA384", TEE_TYPE_HMAC_SHA384, 8, 256, 1024 },
4483 { 0, "HMAC-SHA512", TEE_TYPE_HMAC_SHA512, 8, 256, 1024 },
4484 { 0, "Generic secret", TEE_TYPE_GENERIC_SECRET, 8, 128, 4096 },
4485 };
4486
4487 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4488 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4489 &ret_orig)))
4490 return;
4491
4492 keygen_noparams(c, &session, key_types, ARRAY_SIZE(key_types));
4493
4494 TEEC_CloseSession(&session);
4495}
4496ADBG_CASE_DEFINE(regression, 4007_symmetric, xtest_tee_test_4007_symmetric,
4497 "Test TEE Internal API Generate Symmetric key");
4498
4499static void xtest_tee_test_4007_rsa(ADBG_Case_t *c)
4500{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004501 TEEC_Session session = { };
4502 uint32_t ret_orig = 0;
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004503 static const struct key_types_noparam key_types[] = {
Jorge Ramirez-Ortizb657ea42022-02-17 10:15:25 +01004504#ifndef CFG_CRYPTO_SE05X
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004505 { 0, "RSA-256", TEE_TYPE_RSA_KEYPAIR, 1, 256, 256 },
4506 { 1, "RSA-384", TEE_TYPE_RSA_KEYPAIR, 1, 384, 384 },
Jorge Ramirez-Ortizb657ea42022-02-17 10:15:25 +01004507#endif
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004508 { 1, "RSA-512", TEE_TYPE_RSA_KEYPAIR, 1, 512, 512 },
Jorge Ramirez-Ortizb657ea42022-02-17 10:15:25 +01004509#ifndef CFG_CRYPTO_SE05X
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004510 { 1, "RSA-640", TEE_TYPE_RSA_KEYPAIR, 1, 640, 640 },
4511 { 1, "RSA-768", TEE_TYPE_RSA_KEYPAIR, 1, 768, 768 },
4512 { 1, "RSA-896", TEE_TYPE_RSA_KEYPAIR, 1, 896, 896 },
Jorge Ramirez-Ortizb657ea42022-02-17 10:15:25 +01004513#endif
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004514 { 1, "RSA-1024", TEE_TYPE_RSA_KEYPAIR, 1, 1024, 1024 },
4515 { 1, "RSA-2048", TEE_TYPE_RSA_KEYPAIR, 1, 2048, 2048 },
4516 { 1, "RSA-3072", TEE_TYPE_RSA_KEYPAIR, 1, 3072, 3072 },
4517 { 1, "RSA-4096", TEE_TYPE_RSA_KEYPAIR, 1, 4096, 4096 },
4518 };
4519
4520 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4521 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4522 &ret_orig)))
4523 return;
4524
4525 keygen_noparams(c, &session, key_types, ARRAY_SIZE(key_types));
4526
4527 TEEC_CloseSession(&session);
4528}
4529ADBG_CASE_DEFINE(regression, 4007_rsa, xtest_tee_test_4007_rsa,
4530 "Test TEE Internal API Generate RSA key");
4531
4532static void xtest_tee_test_4007_dh(ADBG_Case_t *c)
4533{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004534 TEEC_Session session = { };
4535 uint32_t ret_orig = 0;
4536 size_t n = 0;
4537 size_t param_count = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004538 /*
4539 * Note that the key size parameter is not used when creating the keys
4540 * but specifying these sizes make it possible to test the expected size
4541 * of the private value. This also means that the keysize must match the
4542 * size of p or what is specified in private_bits or the equvivalent
4543 * size of the subprime parameter.
4544 */
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004545 TEE_Attribute params[4] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02004546
4547#define XTEST_DH_GK_DATA(vect) \
4548 ARRAY(vect ## _p), \
4549 ARRAY(vect ## _g), \
4550 &vect ## _private_bits, \
4551 0, 0
4552#define XTEST_DH_GK_DATA_SUBPRIME(vect) \
4553 ARRAY(vect ## _p), \
4554 ARRAY(vect ## _g), \
4555 &vect ## _private_bits, \
4556 ARRAY(vect ## _subprime)
4557 static const struct {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004558 unsigned level;
Pascal Brandc639ac82015-07-02 08:53:34 +02004559 uint32_t key_size;
4560 const uint8_t *p;
4561 size_t p_len;
4562 const uint8_t *g;
4563 size_t g_len;
4564 const uint32_t *private_bits;
4565 const uint8_t *subprime;
4566 size_t subprime_len;
4567 } key_types[] = {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004568 { 0, 256, XTEST_DH_GK_DATA(keygen_dh256) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004569 { 0, 320, XTEST_DH_GK_DATA(keygen_dh320) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004570 { 1, 384, XTEST_DH_GK_DATA(keygen_dh384) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004571 { 1, 448, XTEST_DH_GK_DATA(keygen_dh448) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004572 { 1, 512, XTEST_DH_GK_DATA(keygen_dh512) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004573 { 1, 576, XTEST_DH_GK_DATA(keygen_dh576) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004574 { 1, 640, XTEST_DH_GK_DATA(keygen_dh640) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004575 { 1, 704, XTEST_DH_GK_DATA(keygen_dh704) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004576 { 1, 768, XTEST_DH_GK_DATA(keygen_dh768) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004577 { 1, 832, XTEST_DH_GK_DATA(keygen_dh832) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004578 { 1, 896, XTEST_DH_GK_DATA(keygen_dh896) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004579 { 1, 960, XTEST_DH_GK_DATA(keygen_dh960) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004580 { 1, 1024, XTEST_DH_GK_DATA(keygen_dh1024) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004581 { 1, 1088, XTEST_DH_GK_DATA(keygen_dh1088) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004582 { 1, 1152, XTEST_DH_GK_DATA(keygen_dh1152) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004583 { 1, 1216, XTEST_DH_GK_DATA(keygen_dh1216) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004584 { 1, 1280, XTEST_DH_GK_DATA(keygen_dh1280) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004585 { 1, 1344, XTEST_DH_GK_DATA(keygen_dh1344) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004586 { 1, 1408, XTEST_DH_GK_DATA(keygen_dh1408) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004587 { 1, 1472, XTEST_DH_GK_DATA(keygen_dh1472) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004588 { 1, 1536, XTEST_DH_GK_DATA(keygen_dh1536) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004589 { 1, 1600, XTEST_DH_GK_DATA(keygen_dh1600) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004590 { 1, 1664, XTEST_DH_GK_DATA(keygen_dh1664) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004591 { 1, 1728, XTEST_DH_GK_DATA(keygen_dh1728) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004592 { 1, 1792, XTEST_DH_GK_DATA(keygen_dh1792) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004593 { 1, 1856, XTEST_DH_GK_DATA(keygen_dh1856) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004594 { 1, 1920, XTEST_DH_GK_DATA(keygen_dh1920) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004595 { 1, 1984, XTEST_DH_GK_DATA(keygen_dh1984) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004596 { 1, 2048, XTEST_DH_GK_DATA(keygen_dh2048) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004597 { 1, 2048, XTEST_DH_GK_DATA_SUBPRIME(keygen_dh2048_subprime) }
Pascal Brandc639ac82015-07-02 08:53:34 +02004598 };
4599
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004600 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4601 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4602 &ret_orig)))
4603 return;
Pascal Brandc639ac82015-07-02 08:53:34 +02004604
4605 for (n = 0; n < ARRAY_SIZE(key_types); n++) {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004606 if (key_types[n].level > level)
4607 continue;
4608
Pascal Brandc639ac82015-07-02 08:53:34 +02004609 Do_ADBG_BeginSubCase(c,
4610 "Generate DH key %d bits - Private bits = %d",
4611 key_types[n].key_size,
4612 *key_types[n].private_bits);
4613 param_count = 0;
4614
4615 xtest_add_attr(&param_count, params,
4616 TEE_ATTR_DH_PRIME,
4617 key_types[n].p, key_types[n].p_len);
4618
4619 xtest_add_attr(&param_count, params, TEE_ATTR_DH_BASE,
4620 key_types[n].g, key_types[n].g_len);
4621
4622 if (key_types[n].private_bits != 0) {
4623 params[param_count].attributeID = TEE_ATTR_DH_X_BITS;
4624
4625 params[param_count].content.value.a =
4626 *key_types[n].private_bits;
4627
4628 params[param_count].content.value.b = 0;
4629 param_count++;
4630 }
4631
4632 if (key_types[n].subprime != 0) {
4633 xtest_add_attr(&param_count, params,
4634 TEE_ATTR_DH_SUBPRIME,
4635 key_types[n].subprime,
4636 key_types[n].subprime_len);
4637 }
4638
4639 if (!ADBG_EXPECT_TRUE(c,
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004640 generate_and_test_key(c, &session, TEE_TYPE_DH_KEYPAIR,
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004641 *key_types[n].private_bits,
Pascal Brandc639ac82015-07-02 08:53:34 +02004642 key_types[n]. key_size, params, param_count)))
4643 break;
4644
4645 Do_ADBG_EndSubCase(c,
4646 "Generate DH key %d bits - Private bits = %d",
4647 key_types[n].key_size,
4648 *key_types[n].private_bits);
4649 }
Pascal Brandc639ac82015-07-02 08:53:34 +02004650
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004651 TEEC_CloseSession(&session);
4652}
4653ADBG_CASE_DEFINE(regression, 4007_dh, xtest_tee_test_4007_dh,
4654 "Test TEE Internal API Generate DH key");
4655
4656static void xtest_tee_test_4007_dsa(ADBG_Case_t *c)
Pascal Brandc639ac82015-07-02 08:53:34 +02004657{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004658 TEEC_Session session = { };
4659 uint32_t ret_orig = 0;
4660 size_t n = 0;
4661 size_t param_count = 0;
4662 TEE_Attribute params[4] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02004663
4664#define XTEST_DSA_GK_DATA(vect) \
4665 ARRAY(vect ## _p), \
4666 ARRAY(vect ## _g), \
4667 ARRAY(vect ## _q)
4668 static const struct {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004669 unsigned level;
Pascal Brandc639ac82015-07-02 08:53:34 +02004670 uint32_t key_size;
4671 const uint8_t *prime;
4672 size_t prime_len;
4673 const uint8_t *base;
4674 size_t base_len;
4675 const uint8_t *sub_prime;
4676 size_t sub_prime_len;
4677 } key_types[] = {
Jerome Forissiereed7e652020-04-15 15:42:38 +02004678 { 0, 1024, XTEST_DSA_GK_DATA(keygen_dsa_test1) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004679 { 0, 512, XTEST_DSA_GK_DATA(keygen_dsa512) },
Jerome Forissiereed7e652020-04-15 15:42:38 +02004680 { 0, 576, XTEST_DSA_GK_DATA(keygen_dsa576) },
4681 { 0, 640, XTEST_DSA_GK_DATA(keygen_dsa640) },
4682 { 0, 704, XTEST_DSA_GK_DATA(keygen_dsa704) },
4683 { 0, 768, XTEST_DSA_GK_DATA(keygen_dsa768) },
4684 { 0, 832, XTEST_DSA_GK_DATA(keygen_dsa832) },
4685 { 0, 896, XTEST_DSA_GK_DATA(keygen_dsa896) },
4686 { 0, 960, XTEST_DSA_GK_DATA(keygen_dsa960) },
4687 { 0, 1024, XTEST_DSA_GK_DATA(keygen_dsa1024) },
Pascal Brandc639ac82015-07-02 08:53:34 +02004688 };
4689
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004690 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4691 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4692 &ret_orig)))
4693 return;
4694
Pascal Brandc639ac82015-07-02 08:53:34 +02004695 for (n = 0; n < ARRAY_SIZE(key_types); n++) {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004696 if (key_types[n].level > level)
4697 continue;
4698
Pascal Brandc639ac82015-07-02 08:53:34 +02004699 Do_ADBG_BeginSubCase(c, "Generate DSA key %d bits",
4700 key_types[n].key_size);
4701 param_count = 0;
4702
4703
4704 xtest_add_attr(&param_count, params, TEE_ATTR_DSA_PRIME,
4705 key_types[n].prime, key_types[n].prime_len);
4706
4707 xtest_add_attr(&param_count, params, TEE_ATTR_DSA_SUBPRIME,
4708 key_types[n].sub_prime,
4709 key_types[n].sub_prime_len);
4710
4711 xtest_add_attr(&param_count, params, TEE_ATTR_DSA_BASE,
4712 key_types[n].base, key_types[n].base_len);
4713
4714 if (!ADBG_EXPECT_TRUE(c,
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004715 generate_and_test_key(c, &session, TEE_TYPE_DSA_KEYPAIR,
Pascal Brandc639ac82015-07-02 08:53:34 +02004716 1, key_types[n]. key_size, params,
4717 param_count)))
4718 break;
4719
4720 Do_ADBG_EndSubCase(c, "Generate DSA key %d bits",
4721 key_types[n].key_size);
4722 }
Pascal Brandc639ac82015-07-02 08:53:34 +02004723
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004724 TEEC_CloseSession(&session);
4725}
4726ADBG_CASE_DEFINE(regression, 4007_dsa, xtest_tee_test_4007_dsa,
4727 "Test TEE Internal API Generate DSA key");
4728
4729static void xtest_tee_test_4007_ecc(ADBG_Case_t *c)
Pascal Brande61133f2015-07-08 15:38:37 +02004730{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004731 TEEC_Session session = { };
4732 uint32_t ret_orig = 0;
4733 size_t n = 0;
4734 size_t param_count = 0;
4735 TEE_Attribute params[4] = { };
Pascal Brande61133f2015-07-08 15:38:37 +02004736
4737 static const struct {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004738 unsigned level;
Pascal Brande61133f2015-07-08 15:38:37 +02004739 const char *name;
4740 uint32_t algo;
4741 uint32_t curve;
4742 uint32_t key_size;
4743 } key_types[] = {
4744 /* ECDSA */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004745 { 0, "ECDSA-192", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P192,
4746 192 },
4747 { 1, "ECDSA-224", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P224,
4748 224 },
4749 { 1, "ECDSA-256", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P256,
4750 256 },
4751 { 1, "ECDSA-384", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P384,
4752 384 },
4753 { 1, "ECDSA-521", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P521,
4754 521 },
Pascal Brande61133f2015-07-08 15:38:37 +02004755
4756 /* ECDH */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004757 { 0, "ECDH-192", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P192,
4758 192 },
4759 { 1, "ECDH-224", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P224,
4760 224 },
4761 { 1, "ECDH-256", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P256,
4762 256 },
4763 { 1, "ECDH-384", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P384,
4764 384 },
4765 { 1, "ECDH-521", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P521,
4766 521 },
Pascal Brande61133f2015-07-08 15:38:37 +02004767 };
4768
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004769 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4770 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4771 &ret_orig)))
4772 return;
4773
Pascal Brande61133f2015-07-08 15:38:37 +02004774 for (n = 0; n < ARRAY_SIZE(key_types); n++) {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004775 if (key_types[n].level > level)
4776 continue;
4777
Pascal Brande61133f2015-07-08 15:38:37 +02004778 Do_ADBG_BeginSubCase(c, "Generate %s", key_types[n].name);
4779 param_count = 0;
4780
4781 xtest_add_attr_value(&param_count, params, TEE_ATTR_ECC_CURVE,
4782 key_types[n].curve, 0);
4783
4784 if (!ADBG_EXPECT_TRUE(c,
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004785 generate_and_test_key(c, &session, key_types[n].algo,
Pascal Brande61133f2015-07-08 15:38:37 +02004786 0, key_types[n].key_size, params,
4787 param_count)))
4788 break;
4789
4790 Do_ADBG_EndSubCase(c, "Generate %s", key_types[n].name);
4791 }
Pascal Brande61133f2015-07-08 15:38:37 +02004792
Pascal Brandc639ac82015-07-02 08:53:34 +02004793 TEEC_CloseSession(&session);
4794}
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004795ADBG_CASE_DEFINE(regression, 4007_ecc, xtest_tee_test_4007_ecc,
4796 "Test TEE Internal API Generate ECC key");
Pascal Brandc639ac82015-07-02 08:53:34 +02004797
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03004798static void xtest_tee_test_4007_x25519(ADBG_Case_t *c)
4799{
4800 TEEC_Session session = { };
4801 uint32_t ret_orig = 0;
4802
4803 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4804 xtest_teec_open_session(&session, &crypt_user_ta_uuid,
4805 NULL, &ret_orig)))
4806 return;
4807
Jerome Forissier366179c2022-06-28 10:12:58 +02004808 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_X25519,
4809 TEE_ECC_CURVE_25519)) {
4810 Do_ADBG_Log("X25519 not supported: skip subcase");
4811 goto out;
4812 }
4813
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03004814 Do_ADBG_BeginSubCase(c, "Generate X25519 key");
4815
4816 if (!ADBG_EXPECT_TRUE(c,
4817 generate_and_test_key(c, &session,
4818 TEE_TYPE_X25519_KEYPAIR, 0, 256,
4819 NULL, 0)))
4820 return;
4821
4822 Do_ADBG_EndSubCase(c, "Generate X25519 key");
Jerome Forissier366179c2022-06-28 10:12:58 +02004823out:
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03004824 TEEC_CloseSession(&session);
4825}
4826ADBG_CASE_DEFINE(regression, 4007_x25519, xtest_tee_test_4007_x25519,
4827 "Test TEE Internal API Generate X25519 key");
4828
Valerii Chubarab9863c2022-08-12 07:42:29 +00004829
4830static void xtest_tee_test_4007_ed25519(ADBG_Case_t *c)
4831{
4832 TEEC_Session session = { };
4833 uint32_t ret_orig = 0;
4834
4835 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4836 xtest_teec_open_session(&session, &crypt_user_ta_uuid,
4837 NULL, &ret_orig)))
4838 return;
4839
4840 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_ED25519,
4841 TEE_ECC_CURVE_25519)) {
4842 Do_ADBG_Log("ED25519 not supported: skip subcase");
4843 goto out;
4844 }
4845
4846 Do_ADBG_BeginSubCase(c, "Generate Ed25519 key");
4847
4848 ADBG_EXPECT_TRUE(c, generate_and_test_key(c, &session,
4849 TEE_TYPE_ED25519_KEYPAIR,
4850 0, 256, NULL, 0));
4851
4852 Do_ADBG_EndSubCase(c, "Generate Ed25519 key");
4853out:
4854 TEEC_CloseSession(&session);
4855}
4856ADBG_CASE_DEFINE(regression, 4007_ed25519, xtest_tee_test_4007_ed25519,
4857 "Test TEE Internal API Generate ed25519 key");
4858
Pascal Brandc639ac82015-07-02 08:53:34 +02004859static void xtest_tee_test_4008(ADBG_Case_t *c)
4860{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004861 TEEC_Session session = { };
4862 uint32_t ret_orig = 0;
4863 TEE_OperationHandle op = TEE_HANDLE_NULL;
4864 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
4865 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
4866 TEE_Attribute params[4] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02004867 size_t param_count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004868 uint8_t out[2048] = { };
4869 size_t out_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004870
4871 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4872 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4873 &ret_orig)))
4874 return;
4875
4876 Do_ADBG_BeginSubCase(c, "Derive DH key success");
4877
4878 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4879 ta_crypt_cmd_allocate_operation(c, &session, &op,
4880 TEE_ALG_DH_DERIVE_SHARED_SECRET, TEE_MODE_DERIVE,
4881 derive_key_max_keysize)))
4882 goto out;
4883
4884 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4885 ta_crypt_cmd_allocate_transient_object(c, & session,
4886 TEE_TYPE_DH_KEYPAIR, derive_key_max_keysize,
4887 &key_handle)))
4888 goto out;
4889
4890 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PRIME,
4891 ARRAY(derive_key_dh_prime));
4892
4893 xtest_add_attr(&param_count, params, TEE_ATTR_DH_BASE,
4894 ARRAY(derive_key_dh_base));
4895
4896 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PUBLIC_VALUE,
4897 ARRAY(derive_key_dh_public_value));
4898
4899 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PRIVATE_VALUE,
4900 ARRAY(derive_key_dh_private_value));
4901
4902 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4903 ta_crypt_cmd_populate_transient_object(c, &session, key_handle,
4904 params, param_count)))
4905 goto out;
4906
4907 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4908 ta_crypt_cmd_set_operation_key(c, &session, op, key_handle)))
4909 goto out;
4910
4911 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4912 ta_crypt_cmd_free_transient_object(c, & session, key_handle)))
4913 goto out;
4914
4915 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4916 ta_crypt_cmd_allocate_transient_object(c, &session,
4917 TEE_TYPE_GENERIC_SECRET, derive_key_max_keysize,
4918 &sv_handle)))
4919 goto out;
4920
Pascal Brand2b92b642015-07-16 13:29:42 +02004921 /* reuse but reset params and param-count */
Pascal Brandc639ac82015-07-02 08:53:34 +02004922 param_count = 0;
4923
4924 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PUBLIC_VALUE,
4925 ARRAY(derive_key_dh_public_value_2));
4926
4927 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4928 ta_crypt_cmd_derive_key(c, &session, op, sv_handle, params,
4929 param_count)))
4930 goto out;
4931
4932 out_size = sizeof(out);
4933 memset(out, 0, sizeof(out));
4934 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4935 ta_crypt_cmd_get_object_buffer_attribute(c, &session, sv_handle,
4936 TEE_ATTR_SECRET_VALUE, out, &out_size)))
4937 goto out;
4938
4939 if (!ADBG_EXPECT_BUFFER(c, derive_key_dh_shared_secret,
4940 sizeof(derive_key_dh_shared_secret), out,
4941 out_size))
4942 goto out;
4943
4944 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4945 ta_crypt_cmd_free_operation(c, &session, op)))
4946 goto out;
4947
4948 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4949 ta_crypt_cmd_free_transient_object(c, &session, sv_handle)))
4950 goto out;
4951out:
4952 Do_ADBG_EndSubCase(c, "Derive DH key success");
4953 TEEC_CloseSession(&session);
4954}
Jens Wiklander14f48872018-06-29 15:30:13 +02004955ADBG_CASE_DEFINE(regression, 4008, xtest_tee_test_4008,
4956 "Test TEE Internal API Derive key");
Pascal Brand2b92b642015-07-16 13:29:42 +02004957
4958static void xtest_tee_test_4009(ADBG_Case_t *c)
4959{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004960 TEEC_Session session = { };
4961 uint32_t ret_orig = 0;
4962 TEE_OperationHandle op = TEE_HANDLE_NULL;
4963 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
4964 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
4965 TEE_Attribute params[4] = { };
Pascal Brand2b92b642015-07-16 13:29:42 +02004966 size_t param_count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004967 uint8_t out[2048] = { };
4968 size_t out_size = 0;
4969 uint32_t size_bytes = 0;
4970 uint32_t i = 0;
Ruchika Gupta454b0b62020-10-30 13:23:19 +05304971 struct derive_key_ecdh_t const *pt = NULL;
Pascal Brand2b92b642015-07-16 13:29:42 +02004972
4973 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4974 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4975 &ret_orig)))
4976 return;
4977
4978 for (i = 0; i < ARRAY_SIZE(derive_key_ecdh); i++) {
4979 pt = &derive_key_ecdh[i];
4980
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02004981 if (pt->level > level)
4982 continue;
4983
Pascal Brand2b92b642015-07-16 13:29:42 +02004984 Do_ADBG_BeginSubCase(c, "Derive ECDH key - algo = 0x%x",
4985 pt->algo);
4986 size_bytes = (pt->keysize + 7) / 8;
4987 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4988 ta_crypt_cmd_allocate_operation(c, &session, &op,
4989 pt->algo,
4990 TEE_MODE_DERIVE, pt->keysize)))
4991 goto out;
4992
4993 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4994 ta_crypt_cmd_allocate_transient_object(c, & session,
4995 TEE_TYPE_ECDH_KEYPAIR, pt->keysize,
4996 &key_handle)))
4997 goto out;
4998
4999 param_count = 0;
5000 xtest_add_attr_value(&param_count, params,
5001 TEE_ATTR_ECC_CURVE, pt->curve, 0);
5002 xtest_add_attr(&param_count, params,
5003 TEE_ATTR_ECC_PRIVATE_VALUE,
5004 pt->private, size_bytes);
5005 /*
Cedric Auger719047c2019-09-11 12:08:14 +02005006 * The public value is not used, but we should provide a valid
5007 * one to avoid rejection in case TEE_PopulateTransientObject()
5008 * checks for key validity.
Pascal Brand2b92b642015-07-16 13:29:42 +02005009 */
5010 xtest_add_attr(&param_count, params,
Cedric Auger719047c2019-09-11 12:08:14 +02005011 TEE_ATTR_ECC_PUBLIC_VALUE_X,
5012 pt->public_x, size_bytes);
Pascal Brand2b92b642015-07-16 13:29:42 +02005013 xtest_add_attr(&param_count, params,
Cedric Auger719047c2019-09-11 12:08:14 +02005014 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5015 pt->public_y, size_bytes);
Pascal Brand2b92b642015-07-16 13:29:42 +02005016
5017 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5018 ta_crypt_cmd_populate_transient_object(c,
5019 &session,
5020 key_handle, params, param_count)))
5021 goto out;
5022
5023 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5024 ta_crypt_cmd_set_operation_key(c, &session, op,
5025 key_handle)))
5026 goto out;
5027
5028 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5029 ta_crypt_cmd_free_transient_object(c, & session,
5030 key_handle)))
5031 goto out;
5032
5033 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5034 ta_crypt_cmd_allocate_transient_object(c, &session,
5035 TEE_TYPE_GENERIC_SECRET, size_bytes * 8,
5036 &sv_handle)))
5037 goto out;
5038
5039 /* reuse but reset params and param-count */
5040 param_count = 0;
5041
5042 xtest_add_attr(&param_count, params,
5043 TEE_ATTR_ECC_PUBLIC_VALUE_X,
5044 pt->public_x, size_bytes);
5045 xtest_add_attr(&param_count, params,
5046 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5047 pt->public_y, size_bytes);
5048
5049 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5050 ta_crypt_cmd_derive_key(c, &session, op, sv_handle,
5051 params, param_count)))
5052 goto out;
5053
5054 out_size = sizeof(out);
5055 memset(out, 0, sizeof(out));
5056 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5057 ta_crypt_cmd_get_object_buffer_attribute(c, &session,
5058 sv_handle,
5059 TEE_ATTR_SECRET_VALUE, out, &out_size)))
5060 goto out;
5061
5062 if (!ADBG_EXPECT_BUFFER(c, pt->out, size_bytes,
5063 out, out_size))
5064 goto out;
5065
5066 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5067 ta_crypt_cmd_free_operation(c, &session, op)))
5068 goto out;
5069
5070 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5071 ta_crypt_cmd_free_transient_object(c, &session,
5072 sv_handle)))
5073 goto out;
5074
5075 Do_ADBG_EndSubCase(c, "Derive ECDH key - algo = 0x%x",
5076 pt->algo);
5077 }
5078
5079 goto noerror;
5080
5081out:
5082 Do_ADBG_EndSubCase(c, "Derive ECDH key - algo = 0x%x", pt->algo);
5083
5084noerror:
5085 TEEC_CloseSession(&session);
5086}
Jens Wiklander14f48872018-06-29 15:30:13 +02005087ADBG_CASE_DEFINE(regression, 4009, xtest_tee_test_4009,
5088 "Test TEE Internal API Derive key ECDH");
Jens Wiklander70a0b2c2016-05-18 08:39:35 +02005089
5090static void xtest_tee_test_4010(ADBG_Case_t *c)
5091{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005092 TEEC_Session session = { };
5093 uint32_t ret_orig = 0;
5094 TEE_ObjectHandle o = TEE_HANDLE_NULL;
Jens Wiklander70a0b2c2016-05-18 08:39:35 +02005095 static const uint8_t large_key[1024] = { 1, 2, 3, 4, 5, 6 };
5096 static const TEE_Attribute attr = {
5097 .attributeID = TEE_ATTR_SECRET_VALUE,
5098 .content.ref.buffer = (void *)large_key,
5099 .content.ref.length = sizeof(large_key),
5100 };
5101
5102 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5103 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5104 &ret_orig)))
5105 return;
5106
5107 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5108 ta_crypt_cmd_allocate_transient_object(c, &session,
5109 TEE_TYPE_HMAC_SHA256, 1024, &o)))
5110 goto out;
5111
5112 ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_TARGET_DEAD,
5113 ta_crypt_cmd_populate_transient_object(c, &session, o,
5114 &attr, 1));
5115
5116out:
5117 TEEC_CloseSession(&session);
5118}
Jens Wiklander14f48872018-06-29 15:30:13 +02005119ADBG_CASE_DEFINE(regression, 4010, xtest_tee_test_4010,
5120 "Test TEE Internal API create transient object (negative)");
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005121
5122static void xtest_tee_test_4011(ADBG_Case_t *c)
5123{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005124 TEEC_Session s = { };
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005125 size_t key_size = 512;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005126 TEE_ObjectHandle key = TEE_HANDLE_NULL;
5127 TEE_OperationHandle ops = TEE_HANDLE_NULL;
5128 TEE_OperationHandle opv = TEE_HANDLE_NULL;
5129 TEE_OperationHandle ope = TEE_HANDLE_NULL;
5130 TEE_OperationHandle opd = TEE_HANDLE_NULL;
5131 uint32_t ret_orig = 0;
5132 uint8_t in[TEE_SHA1_HASH_SIZE] = { };
5133 uint8_t out[1024] = { };
5134 uint8_t tmp[1024] = { };
5135 size_t out_size = 0;
5136 size_t tmp_size = 0;
5137 size_t n = 0;
5138 size_t m = 0;
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005139 size_t i = 0;
5140
5141 /* Setup session, initialize message to sign, create a keypair */
5142 if (!ADBG_EXPECT_TEEC_SUCCESS(c, xtest_teec_open_session(&s,
5143 &crypt_user_ta_uuid, NULL, &ret_orig)))
5144 return;
5145 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_random_number_generate(c,
5146 &s, in, sizeof(in))))
5147 goto out;
5148 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_transient_object(
5149 c, &s, TEE_TYPE_RSA_KEYPAIR, key_size, &key)))
5150 goto out;
5151 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_generate_key(c, &s,
5152 key, key_size, NULL, 0)))
5153 goto out;
5154
5155 /* Allocate operations for sign, verify, encrypt and decrypt */
5156 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
5157 &ops, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
5158 key_size)))
5159 goto out;
5160 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
5161 &opv, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
5162 key_size)))
5163 goto out;
5164 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
5165 &ope, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT, key_size)))
5166 goto out;
5167 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
5168 &opd, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT, key_size)))
5169 goto out;
5170
5171 /* Assign the keypair to all operations */
5172 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5173 ta_crypt_cmd_set_operation_key(c, &s, ops, key)))
5174 goto out;
5175 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5176 ta_crypt_cmd_set_operation_key(c, &s, opv, key)))
5177 goto out;
5178 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5179 ta_crypt_cmd_set_operation_key(c, &s, ope, key)))
5180 goto out;
5181 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5182 ta_crypt_cmd_set_operation_key(c, &s, opd, key)))
5183 goto out;
5184
5185 /*
5186 * The core of the test case is inspired by the one in libtomcrypt:
5187 * https://github.com/libtom/libtomcrypt/blob/6ad52252688bb34f90b5e79da4830a927e87b81f/testprof/rsa_test.c#L398
5188 *
5189 * Testcase for Bleichenbacher attack
5190 *
5191 * (1) Create a valid signature
5192 * (2) Check that it can be verified
5193 * (3) Transform the package to fetch plain text (using the encrypt
5194 * operation in GP TEE Internal API)
5195 * (4) Forge the structure of PKCS#1-EMSA encoded data
5196 * (4.1) Search for start and end of the padding string
5197 * (4.2) Move the signature to the front of the padding string
5198 * (4.3) Zero the message until the end
5199 * (5) Transform the package back (using the decrypt operation in
5200 * GP TEE Internal API)
5201 * (6) The result should not be valid if the implementation is robust.
5202 */
5203
5204
5205 for (i = 0; i < 9; i++) {
5206 Do_ADBG_Log("Iteration %zu", i);
5207
5208 /* 1 */
5209 out_size = sizeof(out);
5210 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5211 ta_crypt_cmd_asymmetric_sign(c, &s, ops, NULL, 0,
5212 in, sizeof(in), out, &out_size)))
5213 goto out;
5214
5215 /* 2 */
5216 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5217 ta_crypt_cmd_asymmetric_verify(c, &s, opv, NULL, 0,
5218 in, sizeof(in), out, out_size)))
5219 goto out;
5220
5221 /* 3 */
5222 tmp_size = sizeof(tmp);
5223 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5224 ta_crypt_cmd_asymmetric_encrypt(c, &s, ope, NULL, 0,
5225 out, out_size, tmp, &tmp_size)))
5226 goto out;
5227
Etienne Carriere0953bf02018-12-21 15:36:25 +01005228 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, tmp_size, <=, sizeof(tmp)))
5229 goto out;
5230
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005231 /* 4.1 */
Etienne Carriere0953bf02018-12-21 15:36:25 +01005232 for (n = 0; n < tmp_size - i; n++)
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005233 if (tmp[n] == 0xff)
5234 break;
Etienne Carriere0953bf02018-12-21 15:36:25 +01005235
5236 /* Shall find at least a padding start before buffer end */
5237 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, n, <, tmp_size - i - 1))
5238 goto out;
5239
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005240 for (m = n + 1; m < tmp_size; m++)
5241 if (tmp[m] != 0xff)
5242 break;
Etienne Carriere0953bf02018-12-21 15:36:25 +01005243
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005244 /* 4.2 */
5245 memmove(tmp + n + i, tmp + m, tmp_size - m);
Etienne Carriere0953bf02018-12-21 15:36:25 +01005246
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005247 /* 4.3 */
Etienne Carriere0953bf02018-12-21 15:36:25 +01005248 n = n + i + tmp_size - m;
Etienne Carriereacb81c42020-04-24 14:58:58 +02005249
5250 /* Prevent overrun when zeroing buffer end */
5251 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, n, <=, tmp_size))
5252 goto out;
5253
Etienne Carriere0953bf02018-12-21 15:36:25 +01005254 memset(tmp + n, 0, tmp_size - n);
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005255
5256 /* 5 */
5257 out_size = sizeof(out);
5258 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5259 ta_crypt_cmd_asymmetric_decrypt(c, &s, opd, NULL, 0,
5260 tmp, tmp_size, out, &out_size)))
5261 goto out;
5262
5263 /* 6 */
5264 if (!ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_SIGNATURE_INVALID,
5265 ta_crypt_cmd_asymmetric_verify(c, &s, opv, NULL, 0,
5266 in, sizeof(in), out, out_size)))
5267 goto out;
5268 }
5269
5270out:
5271 TEEC_CloseSession(&s);
5272}
Jens Wiklander14f48872018-06-29 15:30:13 +02005273ADBG_CASE_DEFINE(regression, 4011, xtest_tee_test_4011,
5274 "Test TEE Internal API Bleichenbacher attack (negative)");
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005275
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005276static void xtest_tee_test_4012(ADBG_Case_t *c)
5277{
Jens Wiklanderc44350d2022-12-02 20:56:49 +01005278 TEEC_Result res = TEEC_SUCCESS;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005279 TEEC_Session session = { };
5280 uint32_t ret_orig = 0;
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005281 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
5282 /* Fortuna PRNG requires seed <= 32 bytes */
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005283 uint8_t pool_input[32] = { };
5284 time_t t = 0;
5285 struct tm tm_local = { };
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005286
5287 t = time(NULL);
5288 tm_local = *localtime(&t);
5289
5290 memcpy((void *)pool_input, (void *)&tm_local,
5291 sizeof(pool_input) < sizeof(tm_local) ?
5292 sizeof(pool_input) : sizeof(tm_local));
5293
5294
5295 op.params[0].tmpref.buffer = pool_input;
5296 op.params[0].tmpref.size = sizeof(pool_input);
5297 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
5298 TEEC_NONE,
5299 TEEC_NONE,
5300 TEEC_NONE);
5301 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5302 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5303 &ret_orig)))
5304 return;
5305
Jens Wiklanderc44350d2022-12-02 20:56:49 +01005306 res = TEEC_InvokeCommand(&session, TA_CRYPT_CMD_SEED_RNG_POOL,
5307 &op, &ret_orig);
5308 if (res == TEEC_ERROR_ITEM_NOT_FOUND &&
5309 ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, ret_orig,
5310 TEEC_ORIGIN_TRUSTED_APP))
5311 Do_ADBG_Log("System PTA not available, skipping test 4012");
5312 else
5313 ADBG_EXPECT_TEEC_SUCCESS(c, res);
5314
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005315 TEEC_CloseSession(&session);
5316}
Jens Wiklander14f48872018-06-29 15:30:13 +02005317ADBG_CASE_DEFINE(regression, 4012, xtest_tee_test_4012,
5318 "Test seeding RNG entropy");
Joakim Bech83a30ca2019-05-29 11:22:27 +02005319
5320static void xtest_tee_test_4013(ADBG_Case_t *c)
5321{
Jens Wiklanderc44350d2022-12-02 20:56:49 +01005322 TEEC_Result res = TEEC_SUCCESS;
Joakim Bech83a30ca2019-05-29 11:22:27 +02005323 TEEC_Session session = { };
5324 uint32_t ret_orig = 0;
5325 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
5326 uint8_t key[32] = { };
5327 uint8_t extra_data[32] = { };
5328
5329 op.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
5330 TEEC_NONE,
5331 TEEC_NONE,
5332 TEEC_NONE);
5333 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5334 xtest_teec_open_session(&session, &crypt_user_ta_uuid,
5335 NULL, &ret_orig)))
5336 return;
5337
Jens Wiklanderc44350d2022-12-02 20:56:49 +01005338 res = TEEC_InvokeCommand(&session, TA_CRYPT_CMD_DERIVE_TA_UNIQUE_KEY,
5339 &op, &ret_orig);
5340 if (res == TEEC_ERROR_ITEM_NOT_FOUND &&
5341 ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, ret_orig,
5342 TEEC_ORIGIN_TRUSTED_APP)) {
5343 Do_ADBG_Log("System PTA not available, skipping test 4013");
5344 goto out;
5345 }
5346 ADBG_EXPECT_TEEC_SUCCESS(c, res);
Joakim Bech83a30ca2019-05-29 11:22:27 +02005347
5348 /* Negative test using non-secure memory */
5349 memset(&op, 0, sizeof(op));
5350 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
5351 TEEC_MEMREF_TEMP_OUTPUT,
5352 TEEC_NONE,
5353 TEEC_NONE);
5354
5355 op.params[0].tmpref.buffer = extra_data;
5356 op.params[0].tmpref.size = sizeof(extra_data);
5357 op.params[1].tmpref.buffer = key;
5358 op.params[1].tmpref.size = sizeof(key);
5359 (void)ADBG_EXPECT_TEEC_RESULT(c,
5360 TEEC_ERROR_SECURITY,
5361 TEEC_InvokeCommand(&session,
5362 TA_CRYPT_CMD_DERIVE_TA_UNIQUE_KEY_SHM,
5363 &op,
5364 &ret_orig));
5365
Jens Wiklanderc44350d2022-12-02 20:56:49 +01005366out:
Joakim Bech83a30ca2019-05-29 11:22:27 +02005367 TEEC_CloseSession(&session);
5368}
5369ADBG_CASE_DEFINE(regression, 4013, xtest_tee_test_4013,
5370 "Test generation of device unique TA keys");
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005371
5372static void xtest_tee_test_4014(ADBG_Case_t *c)
5373{
5374 TEEC_Session session = { };
5375 uint32_t ret_orig = 0;
5376 TEE_OperationHandle op = TEE_HANDLE_NULL;
5377 TEE_ObjectHandle keyA = TEE_HANDLE_NULL;
5378 TEE_ObjectHandle eph_keyA = TEE_HANDLE_NULL;
5379 TEE_ObjectHandle keyB = TEE_HANDLE_NULL;
5380 TEE_ObjectHandle eph_keyB = TEE_HANDLE_NULL;
5381 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
5382 TEE_Attribute params[9] = { };
5383 size_t param_count = 0;
5384 uint8_t out[128] = { };
5385 size_t out_size = 0;
5386 uint8_t conf_A[32] = { };
5387 uint8_t conf_B[32] = { };
5388
5389 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5390 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5391 &ret_orig)))
5392 return;
5393
5394 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_SM2_KEP,
5395 TEE_ECC_CURVE_SM2)) {
5396 Do_ADBG_Log("SM2 KEP not supported: skip subcase");
5397 goto out;
5398 }
5399
5400 Do_ADBG_BeginSubCase(c, "Initiator side");
5401
5402 /*
5403 * Key exchange protocol running on user A's side. A is initiator.
5404 */
5405
5406 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5407 ta_crypt_cmd_allocate_operation(c, &session, &op,
5408 TEE_ALG_SM2_KEP, TEE_MODE_DERIVE, 512)))
5409 goto out;
5410
5411 /* Allocate and initialize keypair of user A */
5412
5413 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5414 ta_crypt_cmd_allocate_transient_object(c, &session,
5415 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &keyA)))
5416 goto out;
5417
5418 param_count = 0;
5419
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005420 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5421 ARRAY(gmt_003_part5_b2_public_xA));
5422
5423 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5424 ARRAY(gmt_003_part5_b2_public_yA));
5425
5426 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5427 ARRAY(gmt_003_part5_b2_private_A));
5428
5429 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5430 ta_crypt_cmd_populate_transient_object(c, &session, keyA,
5431 params, param_count)))
5432 goto out;
5433
5434 /*
5435 * Allocate and set ephemeral key of user A. Note: it is a regular ECC
5436 * key -- we don't use the *_EPHEMERAL_* attributes flags which are
5437 * reserved for use in TEE_DeriveKey() to pass the ephermeral key of
5438 * user B.
5439 */
5440
5441 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5442 ta_crypt_cmd_allocate_transient_object(c, &session,
5443 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &eph_keyA)))
5444 goto out;
5445
5446 param_count = 0;
5447
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005448 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5449 ARRAY(gmt_003_part5_b2_eph_public_xA));
5450
5451 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5452 ARRAY(gmt_003_part5_b2_eph_public_yA));
5453
5454 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5455 ARRAY(gmt_003_part5_b2_eph_private_A));
5456
5457 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5458 ta_crypt_cmd_populate_transient_object(c, &session, eph_keyA,
5459 params, param_count)))
5460 goto out;
5461
5462 /* Associate user A keys with operation */
5463
5464 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5465 ta_crypt_cmd_set_operation_key2(c, &session, op, keyA,
5466 eph_keyA)))
5467 goto out;
5468
5469 /* Keys have been set, free key objects */
5470
5471 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5472 ta_crypt_cmd_free_transient_object(c, &session, keyA)))
5473 goto out;
5474
5475 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5476 ta_crypt_cmd_free_transient_object(c, &session, eph_keyA)))
5477 goto out;
5478
5479 /* Allocate output object */
5480
5481 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5482 ta_crypt_cmd_allocate_transient_object(c, &session,
5483 TEE_TYPE_GENERIC_SECRET,
5484 sizeof(gmt_003_part5_b2_shared_secret),
5485 &sv_handle)))
5486 goto out;
5487
5488 /* Set key derivation parameters: user A role, user B information */
5489
5490 params[0].attributeID = TEE_ATTR_SM2_KEP_USER;
5491 params[0].content.value.a = 0; /* Initiator role */
5492 params[0].content.value.b = 0; /* Not used */
5493 param_count = 1;
5494
5495 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5496 ARRAY(gmt_003_part5_b2_public_xB));
5497
5498 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5499 ARRAY(gmt_003_part5_b2_public_yB));
5500
5501 xtest_add_attr(&param_count, params,
5502 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_X,
5503 ARRAY(gmt_003_part5_b2_eph_public_xB));
5504
5505 xtest_add_attr(&param_count, params,
5506 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_Y,
5507 ARRAY(gmt_003_part5_b2_eph_public_yB));
5508
5509 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_INITIATOR,
5510 ARRAY(gmt_003_part5_b2_id_A));
5511
5512 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_RESPONDER,
5513 ARRAY(gmt_003_part5_b2_id_B));
5514
5515 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_IN,
5516 ARRAY(gmt_003_part5_b2_conf_B));
5517
5518 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_OUT,
5519 ARRAY(conf_A));
5520
5521 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5522 ta_crypt_cmd_derive_key(c, &session, op, sv_handle, params,
5523 param_count)))
5524 goto out;
5525
5526 out_size = sizeof(out);
5527 memset(out, 0, sizeof(out));
5528 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5529 ta_crypt_cmd_get_object_buffer_attribute(c, &session, sv_handle,
5530 TEE_ATTR_SECRET_VALUE, out, &out_size)))
5531 goto out;
5532
5533 /* Check derived key */
5534 if (!ADBG_EXPECT_BUFFER(c, gmt_003_part5_b2_shared_secret,
5535 sizeof(gmt_003_part5_b2_shared_secret), out,
5536 out_size))
5537 goto out;
5538
5539 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5540 ta_crypt_cmd_free_operation(c, &session, op)))
5541 goto out;
5542
5543 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5544 ta_crypt_cmd_free_transient_object(c, &session, sv_handle)))
5545 goto out;
5546
5547 Do_ADBG_EndSubCase(c, "Initiator side");
5548
5549 Do_ADBG_BeginSubCase(c, "Responder side");
5550
5551 /*
5552 * Key derivation on user B's side
5553 */
5554
5555 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5556 ta_crypt_cmd_allocate_operation(c, &session, &op,
5557 TEE_ALG_SM2_KEP, TEE_MODE_DERIVE, 512)))
5558 goto out;
5559
5560 /* Allocate and initialize keypair of user B */
5561
5562 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5563 ta_crypt_cmd_allocate_transient_object(c, &session,
5564 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &keyB)))
5565 goto out;
5566
5567 param_count = 0;
5568
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005569 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5570 ARRAY(gmt_003_part5_b2_public_xB));
5571
5572 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5573 ARRAY(gmt_003_part5_b2_public_yB));
5574
5575 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5576 ARRAY(gmt_003_part5_b2_private_B));
5577
5578 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5579 ta_crypt_cmd_populate_transient_object(c, &session, keyB,
5580 params, param_count)))
5581 goto out;
5582
5583 /* Allocate and set ephemeral key of user B */
5584
5585 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5586 ta_crypt_cmd_allocate_transient_object(c, &session,
5587 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &eph_keyB)))
5588 goto out;
5589
5590 param_count = 0;
5591
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005592 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5593 ARRAY(gmt_003_part5_b2_eph_public_xB));
5594
5595 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5596 ARRAY(gmt_003_part5_b2_eph_public_yB));
5597
5598 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5599 ARRAY(gmt_003_part5_b2_eph_private_B));
5600
5601 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5602 ta_crypt_cmd_populate_transient_object(c, &session, eph_keyB,
5603 params, param_count)))
5604 goto out;
5605
5606 /* Associate user B keys with operation */
5607
5608 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5609 ta_crypt_cmd_set_operation_key2(c, &session, op, keyB,
5610 eph_keyB)))
5611 goto out;
5612
5613 /* Keys have been set, free key objects */
5614
5615 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5616 ta_crypt_cmd_free_transient_object(c, &session, keyB)))
5617 goto out;
5618
5619 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5620 ta_crypt_cmd_free_transient_object(c, &session, eph_keyB)))
5621 goto out;
5622
5623 /* Allocate output object */
5624
5625 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5626 ta_crypt_cmd_allocate_transient_object(c, &session,
5627 TEE_TYPE_GENERIC_SECRET,
5628 sizeof(gmt_003_part5_b2_shared_secret),
5629 &sv_handle)))
5630 goto out;
5631
5632 /* Set key derivation parameters: user B role, user A information */
5633
5634 params[0].attributeID = TEE_ATTR_SM2_KEP_USER;
5635 params[0].content.value.a = 1; /* Responder role */
5636 params[0].content.value.b = 0; /* Not used */
5637 param_count = 1;
5638
5639 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5640 ARRAY(gmt_003_part5_b2_public_xA));
5641
5642 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5643 ARRAY(gmt_003_part5_b2_public_yA));
5644
5645 xtest_add_attr(&param_count, params,
5646 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_X,
5647 ARRAY(gmt_003_part5_b2_eph_public_xA));
5648
5649 xtest_add_attr(&param_count, params,
5650 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_Y,
5651 ARRAY(gmt_003_part5_b2_eph_public_yA));
5652
5653 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_INITIATOR,
5654 ARRAY(gmt_003_part5_b2_id_A));
5655
5656 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_RESPONDER,
5657 ARRAY(gmt_003_part5_b2_id_B));
5658
5659 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_IN,
5660 ARRAY(gmt_003_part5_b2_conf_A));
5661
5662 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_OUT,
5663 ARRAY(conf_B));
5664
5665 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5666 ta_crypt_cmd_derive_key(c, &session, op, sv_handle, params,
5667 param_count)))
5668 goto out;
5669
5670 out_size = sizeof(out);
5671 memset(out, 0, sizeof(out));
5672 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5673 ta_crypt_cmd_get_object_buffer_attribute(c, &session, sv_handle,
5674 TEE_ATTR_SECRET_VALUE, out, &out_size)))
5675 goto out;
5676
5677 /* Check derived key */
5678 if (!ADBG_EXPECT_BUFFER(c, gmt_003_part5_b2_shared_secret,
5679 sizeof(gmt_003_part5_b2_shared_secret), out,
5680 out_size))
5681 goto out;
5682
5683 Do_ADBG_EndSubCase(c, "Responder side");
5684
5685out:
5686 TEEC_CloseSession(&session);
5687}
5688ADBG_CASE_DEFINE(regression, 4014, xtest_tee_test_4014,
5689 "Test SM2 KEP (key derivation)");
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03005690
5691static void xtest_tee_test_4015(ADBG_Case_t *c)
5692{
5693 TEEC_Session session = { };
5694 uint32_t ret_orig = 0;
5695 TEE_OperationHandle op = TEE_HANDLE_NULL;
5696 TEE_ObjectHandle key_alice = TEE_HANDLE_NULL;
5697 TEE_ObjectHandle key_bob = TEE_HANDLE_NULL;
5698 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
5699 TEE_Attribute params[2] = { };
5700 size_t param_count = 0;
5701 uint8_t out[32] = { };
5702 size_t out_size = 0;
5703 char case_str[40] = "Alice side computes shared secret";
5704
5705 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5706 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5707 &ret_orig)))
5708 return;
5709
5710 Do_ADBG_BeginSubCase(c, "%s", case_str);
5711
5712 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_X25519,
5713 TEE_ECC_CURVE_25519)) {
5714 Do_ADBG_Log("X25519 not supported: skip subcase");
5715 goto out;
5716 }
5717
5718 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5719 ta_crypt_cmd_allocate_operation(c, &session, &op,
5720 TEE_ALG_X25519, TEE_MODE_DERIVE, 256)))
5721 goto out;
5722
5723 /* Allocate and initialize keypair of Alice */
5724 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5725 ta_crypt_cmd_allocate_transient_object(c, &session,
5726 TEE_TYPE_X25519_KEYPAIR, 256, &key_alice)))
5727 goto out;
5728
5729 param_count = 0;
5730
5731 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PUBLIC_VALUE,
5732 ARRAY(x25519_alice_public));
5733
5734 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PRIVATE_VALUE,
5735 ARRAY(x25519_alice_private));
5736
5737 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5738 ta_crypt_cmd_populate_transient_object(c, &session,
5739 key_alice, params, param_count)))
5740 goto out;
5741
5742 /* Associate Alices's keys with operation */
5743 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5744 ta_crypt_cmd_set_operation_key(c, &session, op,
5745 key_alice)))
5746 goto out;
5747
5748 /* Keys have been set, free key objects */
5749 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5750 ta_crypt_cmd_free_transient_object(c, &session,
5751 key_alice)))
5752 goto out;
5753
5754 /* Allocate shared secret output object */
5755 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5756 ta_crypt_cmd_allocate_transient_object(c, &session,
5757 TEE_TYPE_GENERIC_SECRET,
5758 sizeof(x25519_shared_secret), &sv_handle)))
5759 goto out;
5760
5761 /* Reset params */
5762 param_count = 0;
5763
5764 /* Set Bob's public key for Alice side */
5765 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PUBLIC_VALUE,
5766 ARRAY(x25519_bob_public));
5767
5768 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5769 ta_crypt_cmd_derive_key(c, &session, op, sv_handle,
5770 params, param_count)))
5771 goto out;
5772
5773 out_size = sizeof(out);
5774 memset(out, 0, sizeof(out));
5775 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5776 ta_crypt_cmd_get_object_buffer_attribute(c, &session,
5777 sv_handle, TEE_ATTR_SECRET_VALUE, out,
5778 &out_size)))
5779 goto out;
5780
5781 /* Check derived key */
5782 if (!ADBG_EXPECT_BUFFER(c, x25519_shared_secret,
5783 sizeof(x25519_shared_secret), out,
5784 out_size))
5785 goto out;
5786
5787 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5788 ta_crypt_cmd_free_operation(c, &session, op)))
5789 goto out;
5790
5791 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5792 ta_crypt_cmd_free_transient_object(c, &session,
5793 sv_handle)))
5794 goto out;
5795
5796 Do_ADBG_EndSubCase(c, "%s", case_str);
5797
5798 strncpy(case_str, "Bob side computes shared secret",
5799 sizeof(case_str) - 1);
5800
5801 Do_ADBG_BeginSubCase(c, "%s", case_str);
5802
5803 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5804 ta_crypt_cmd_allocate_operation(c, &session, &op,
5805 TEE_ALG_X25519, TEE_MODE_DERIVE, 256)))
5806 goto out;
5807
5808 /* Allocate and initialize keypair of Bob */
5809 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5810 ta_crypt_cmd_allocate_transient_object(c, &session,
5811 TEE_TYPE_X25519_KEYPAIR, 256, &key_bob)))
5812 goto out;
5813
5814 /* Reset params */
5815 param_count = 0;
5816
5817 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PUBLIC_VALUE,
5818 ARRAY(x25519_bob_public));
5819
5820 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PRIVATE_VALUE,
5821 ARRAY(x25519_bob_private));
5822
5823 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5824 ta_crypt_cmd_populate_transient_object(c, &session,
5825 key_bob, params, param_count)))
5826 goto out;
5827
5828 /* Associate Bob's keys with operation */
5829 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5830 ta_crypt_cmd_set_operation_key(c, &session, op,
5831 key_bob)))
5832 goto out;
5833
5834 /* Keys have been set, free key objects */
5835 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5836 ta_crypt_cmd_free_transient_object(c, &session,
5837 key_bob)))
5838 goto out;
5839
5840 /* Allocate shared secret output object */
5841 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5842 ta_crypt_cmd_allocate_transient_object(c, &session,
5843 TEE_TYPE_GENERIC_SECRET,
5844 sizeof(x25519_shared_secret), &sv_handle)))
5845 goto out;
5846
5847 /* Reset params */
5848 param_count = 0;
5849
5850 /* Set Alice's public key for Bob side */
5851 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PUBLIC_VALUE,
5852 ARRAY(x25519_alice_public));
5853
5854 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5855 ta_crypt_cmd_derive_key(c, &session, op, sv_handle,
5856 params, param_count)))
5857 goto out;
5858
5859 out_size = sizeof(out);
5860 memset(out, 0, sizeof(out));
5861 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5862 ta_crypt_cmd_get_object_buffer_attribute(c, &session,
5863 sv_handle, TEE_ATTR_SECRET_VALUE, out,
5864 &out_size)))
5865 goto out;
5866
5867 /* Check derived key */
5868 if (!ADBG_EXPECT_BUFFER(c, x25519_shared_secret,
5869 sizeof(x25519_shared_secret), out,
5870 out_size))
5871 goto out;
5872
5873 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5874 ta_crypt_cmd_free_operation(c, &session, op)))
5875 goto out;
5876
5877 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5878 ta_crypt_cmd_free_transient_object(c, &session,
5879 sv_handle)))
5880 goto out;
5881
5882out:
5883 Do_ADBG_EndSubCase(c, "%s", case_str);
5884 TEEC_CloseSession(&session);
5885}
5886ADBG_CASE_DEFINE(regression, 4015, xtest_tee_test_4015,
5887 "Test TEE Internal API Derive key X25519");
Valerii Chubarab9863c2022-08-12 07:42:29 +00005888
5889static void xtest_tee_test_4016_ed25519(ADBG_Case_t *c)
5890{
5891 TEEC_Session session = { };
5892 TEE_OperationHandle op = TEE_HANDLE_NULL;
5893 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
5894 TEE_Attribute key_attrs[2] = { };
5895 size_t num_key_attrs = 0;
5896 TEE_Attribute attrs[2] = { };
5897 size_t num_attrs = 0;
5898 uint8_t out[64] = { };
5899 size_t out_size = sizeof(out);
5900 size_t n = 0;
5901 uint32_t ret_orig = 0;
5902 size_t max_key_size = 0;
5903
5904 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5905 xtest_teec_open_session(&session, &crypt_user_ta_uuid,
5906 NULL, &ret_orig)))
5907 return;
5908
5909 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_ED25519,
5910 TEE_ECC_CURVE_25519)) {
5911 Do_ADBG_Log("ED25519 not supported: skip subcase");
5912 goto out;
5913 }
5914
5915 for (n = 0; n < ARRAY_SIZE(xtest_ac_eddsa_cases); n++) {
5916 const struct xtest_ac_case *tv = xtest_ac_eddsa_cases + n;
5917
5918 if (tv->algo != TEE_ALG_ED25519)
5919 continue;
5920
5921 num_attrs = 0;
5922 num_key_attrs = 0;
5923 max_key_size = tv->params.eddsa.private_len * 8;
5924
5925 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5926 ta_crypt_cmd_allocate_operation(c, &session, &op,
5927 TEE_ALG_ED25519, tv->mode, max_key_size)))
5928 goto out;
5929
5930 xtest_add_attr(&num_key_attrs, key_attrs,
5931 TEE_ATTR_ED25519_PUBLIC_VALUE,
5932 tv->params.eddsa.public,
5933 tv->params.eddsa.public_len);
5934
5935 if (tv->params.eddsa.flag == 1)
Jens Wiklander7596bd32022-12-02 15:43:37 +01005936 xtest_add_attr_value(&num_attrs, attrs,
5937 TEE_ATTR_EDDSA_PREHASH, 1, 0);
Valerii Chubarab9863c2022-08-12 07:42:29 +00005938
5939 if (tv->params.eddsa.context_len > 0)
5940 xtest_add_attr(&num_attrs, attrs, TEE_ATTR_EDDSA_CTX,
5941 tv->params.eddsa.context,
5942 tv->params.eddsa.context_len);
5943
5944 switch (tv->mode) {
5945 case TEE_MODE_SIGN:
5946 xtest_add_attr(&num_key_attrs, key_attrs,
5947 TEE_ATTR_ED25519_PRIVATE_VALUE,
5948 tv->params.eddsa.private,
5949 tv->params.eddsa.private_len);
5950
5951 if (!ADBG_EXPECT_TRUE(c,
5952 create_key(c, &session, max_key_size,
5953 TEE_TYPE_ED25519_KEYPAIR,
5954 key_attrs, num_key_attrs,
5955 &key_handle)))
5956 goto out;
5957
5958 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5959 ta_crypt_cmd_set_operation_key(c,
5960 &session, op, key_handle)))
5961 goto out;
5962
5963 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5964 ta_crypt_cmd_asymmetric_sign(c,
5965 &session, op,
5966 attrs, num_attrs, tv->ptx,
5967 tv->ptx_len, out, &out_size)))
5968 goto out;
5969
5970 ADBG_EXPECT_BUFFER(c, tv->ctx, tv->ctx_len, out, out_size);
5971
5972 break;
5973
5974 case TEE_MODE_VERIFY:
5975 if (!ADBG_EXPECT_TRUE(c,
5976 create_key(c, &session, max_key_size,
5977 TEE_TYPE_ED25519_PUBLIC_KEY,
5978 key_attrs, num_key_attrs,
5979 &key_handle)))
5980 goto out;
5981
5982 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5983 ta_crypt_cmd_set_operation_key(c,
5984 &session, op, key_handle)))
5985 goto out;
5986
5987 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5988 ta_crypt_cmd_asymmetric_verify(c, &session, op,
5989 attrs, num_attrs,
5990 tv->ptx,
5991 tv->ptx_len,
5992 tv->ctx,
5993 tv->ctx_len)))
5994 goto out;
5995 break;
5996
5997 default:
5998 break;
5999 }
6000
6001 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6002 ta_crypt_cmd_free_operation(c, &session, op)))
6003 goto out;
6004 }
6005out:
6006 TEEC_CloseSession(&session);
6007}
Jens Wiklander7b70ff82022-12-02 20:59:32 +01006008ADBG_CASE_DEFINE(regression, 4016, xtest_tee_test_4016_ed25519,
Valerii Chubarab9863c2022-08-12 07:42:29 +00006009 "Test TEE Internal API ED25519 sign/verify");