blob: 0d23e487f3ca32309691ed1992df02000b560c3e [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
Olivier Massea40266a2023-07-19 10:34:03 +02005 * Copyright 2023 NXP
Pascal Brandc639ac82015-07-02 08:53:34 +02006 */
7
8#include <stdio.h>
9#include <string.h>
10#include <inttypes.h>
11#include <malloc.h>
Igor Opaniuk7ddaa782018-05-25 15:14:05 +030012#include <time.h>
Pascal Brandc639ac82015-07-02 08:53:34 +020013
14#include "xtest_test.h"
15#include "xtest_helpers.h"
16
17#include <tee_api_types.h>
Gabor Szekely2ad190f2018-09-14 14:05:06 +000018#include <tee_api_defines_extensions.h>
Jens Wiklandercbd8fd12022-11-26 20:38:47 +010019#include <tee_api_compat.h>
Pascal Brandc639ac82015-07-02 08:53:34 +020020#include <ta_crypt.h>
21#include <utee_defines.h>
22#include <util.h>
23
Jerome Forissier213ca8a2017-03-31 11:27:56 +020024#include <regression_4000_data.h>
Cedric Chaumontc7654962015-09-09 14:56:36 +020025#include <nist/186-2ecdsatestvectors.h>
Pascal Brandc639ac82015-07-02 08:53:34 +020026
27#include <assert.h>
28
Pascal Brandc639ac82015-07-02 08:53:34 +020029static TEEC_Result ta_crypt_cmd_reset_operation(ADBG_Case_t *c, TEEC_Session *s,
30 TEE_OperationHandle oph)
31{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010032 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +020033 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010034 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +020035
36 assert((uintptr_t)oph <= UINT32_MAX);
37 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
38 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE,
39 TEEC_NONE);
40 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_RESET_OPERATION, &op,
41 &ret_orig);
42 if (res != TEEC_SUCCESS) {
43 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
44 ret_orig);
45 }
46 return res;
47}
48
49static TEEC_Result ta_crypt_cmd_copy_operation(ADBG_Case_t *c,
50 TEEC_Session *s,
51 TEE_OperationHandle dst_oph,
52 TEE_OperationHandle src_oph)
53{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010054 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +020055 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010056 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +020057
58 assert((uintptr_t)dst_oph <= UINT32_MAX);
59 op.params[0].value.a = (uint32_t)(uintptr_t)dst_oph;
60
61 assert((uintptr_t)src_oph <= UINT32_MAX);
62 op.params[0].value.b = (uint32_t)(uintptr_t)src_oph;
63 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE,
64 TEEC_NONE);
65
66 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_COPY_OPERATION, &op,
67 &ret_orig);
68
69 if (res != TEEC_SUCCESS) {
70 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
71 ret_orig);
72 }
73 return res;
74}
75
76static TEEC_Result ta_crypt_cmd_digest_update(ADBG_Case_t *c, TEEC_Session *s,
77 TEE_OperationHandle oph,
78 const void *chunk,
79 size_t chunk_size)
80{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010081 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +020082 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010083 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +020084
85 assert((uintptr_t)oph <= UINT32_MAX);
86 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
87 op.params[1].tmpref.buffer = (void *)chunk;
88 op.params[1].tmpref.size = chunk_size;
89
90 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
91 TEEC_MEMREF_TEMP_INPUT, TEEC_NONE,
92 TEEC_NONE);
93
94 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_DIGEST_UPDATE, &op, &ret_orig);
95
96 if (res != TEEC_SUCCESS) {
97 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
98 ret_orig);
99 }
100
101 return res;
102}
103
104static TEEC_Result ta_crypt_cmd_digest_do_final(ADBG_Case_t *c, TEEC_Session *s,
105 TEE_OperationHandle oph,
106 const void *chunk,
107 size_t chunk_len, void *hash,
108 size_t *hash_len)
109{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100110 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200111 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100112 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200113
114 assert((uintptr_t)oph <= UINT32_MAX);
115 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
116
117 op.params[1].tmpref.buffer = (void *)chunk;
118 op.params[1].tmpref.size = chunk_len;
119
120 op.params[2].tmpref.buffer = (void *)hash;
121 op.params[2].tmpref.size = *hash_len;
122
123 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
124 TEEC_MEMREF_TEMP_INPUT,
125 TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE);
126
127 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_DIGEST_DO_FINAL, &op,
128 &ret_orig);
129
130 if (res != TEEC_SUCCESS) {
131 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
132 ret_orig);
133 }
134
135 if (res == TEEC_SUCCESS)
136 *hash_len = op.params[2].tmpref.size;
137
138 return res;
139}
140
Jens Wiklander92aded22022-12-07 09:43:56 +0100141static TEEC_Result ta_crypt_cmd_digest_extract(ADBG_Case_t *c, TEEC_Session *s,
142 TEE_OperationHandle oph,
143 void *hash, size_t *hash_len)
144{
145 TEEC_Result res = TEEC_ERROR_GENERIC;
146 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
147 uint32_t ret_orig = 0;
148
149 assert((uintptr_t)oph <= UINT32_MAX);
150 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
151
152 op.params[1].tmpref.buffer = (void *)hash;
153 op.params[1].tmpref.size = *hash_len;
154
155 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
156 TEEC_MEMREF_TEMP_OUTPUT,
157 TEEC_NONE, TEEC_NONE);
158
159 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_DIGEST_EXTRACT, &op,
160 &ret_orig);
161
162 if (res != TEEC_SUCCESS) {
163 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
164 ret_orig);
165 }
166
167 if (res == TEEC_SUCCESS)
168 *hash_len = op.params[1].tmpref.size;
169
170 return res;
171}
Pascal Brandc639ac82015-07-02 08:53:34 +0200172static TEE_Result ta_crypt_cmd_set_operation_key2(ADBG_Case_t *c,
173 TEEC_Session *s,
174 TEE_OperationHandle oph,
175 TEE_ObjectHandle key1,
176 TEE_ObjectHandle key2)
177{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100178 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200179 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100180 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200181
182 assert((uintptr_t)oph <= UINT32_MAX);
183 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
184
185 assert((uintptr_t)key1 <= UINT32_MAX);
186 op.params[0].value.b = (uint32_t)(uintptr_t)key1;
187
188 assert((uintptr_t)key2 <= UINT32_MAX);
189 op.params[1].value.a = (uint32_t)(uintptr_t)key2;
190 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_VALUE_INPUT,
191 TEEC_NONE, TEEC_NONE);
192
193 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_SET_OPERATION_KEY2, &op,
194 &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_init(ADBG_Case_t *c, TEEC_Session *s,
205 TEE_OperationHandle oph,
206 const void *iv, size_t iv_len)
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 if (iv != NULL) {
216 op.params[1].tmpref.buffer = (void *)iv;
217 op.params[1].tmpref.size = iv_len;
218 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
219 TEEC_MEMREF_TEMP_INPUT,
220 TEEC_NONE, TEEC_NONE);
221 } else {
222 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
223 TEEC_NONE, TEEC_NONE);
224 }
225
226 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_MAC_INIT, &op, &ret_orig);
227
228 if (res != TEEC_SUCCESS) {
229 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
230 ret_orig);
231 }
232
233 return res;
234}
235
236static TEEC_Result ta_crypt_cmd_mac_update(ADBG_Case_t *c, TEEC_Session *s,
237 TEE_OperationHandle oph,
238 const void *chunk, size_t chunk_size)
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_size;
249
250 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
251 TEEC_MEMREF_TEMP_INPUT, TEEC_NONE,
252 TEEC_NONE);
253
254 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_MAC_UPDATE, &op, &ret_orig);
255
256 if (res != TEEC_SUCCESS) {
257 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
258 ret_orig);
259 }
260
261 return res;
262}
263
264static TEEC_Result ta_crypt_cmd_mac_final_compute(ADBG_Case_t *c,
265 TEEC_Session *s,
266 TEE_OperationHandle oph,
267 const void *chunk,
268 size_t chunk_len,
269 void *hash,
270 size_t *hash_len)
271{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100272 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200273 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100274 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200275
276 assert((uintptr_t)oph <= UINT32_MAX);
277 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
278
279 op.params[1].tmpref.buffer = (void *)chunk;
280 op.params[1].tmpref.size = chunk_len;
281
282 op.params[2].tmpref.buffer = (void *)hash;
283 op.params[2].tmpref.size = *hash_len;
284
285 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
286 TEEC_MEMREF_TEMP_INPUT,
287 TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE);
288
289 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_MAC_FINAL_COMPUTE, &op,
290 &ret_orig);
291
292 if (res != TEEC_SUCCESS) {
293 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
294 ret_orig);
295 }
296
297 if (res == TEEC_SUCCESS)
298 *hash_len = op.params[2].tmpref.size;
299
300 return res;
301}
302
Jerome Forissier4f419512021-07-07 14:56:10 +0200303static TEEC_Result ta_crypt_cmd_mac_final_compare(ADBG_Case_t *c,
304 TEEC_Session *s,
305 TEE_OperationHandle oph,
306 const void *chunk,
307 size_t chunk_len,
308 const uint8_t *hash,
309 size_t hash_len)
310{
311 TEEC_Result res = TEEC_ERROR_GENERIC;
312 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
313 uint32_t ret_orig = 0;
314
315 assert((uintptr_t)oph <= UINT32_MAX);
316 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
317
318 op.params[1].tmpref.buffer = (void *)chunk;
319 op.params[1].tmpref.size = chunk_len;
320
321 op.params[2].tmpref.buffer = (void *)hash;
322 op.params[2].tmpref.size = hash_len;
323
324 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
325 TEEC_MEMREF_TEMP_INPUT,
326 TEEC_MEMREF_TEMP_INPUT, TEEC_NONE);
327
328 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_MAC_FINAL_COMPARE, &op,
329 &ret_orig);
330
331 if (res != TEEC_SUCCESS) {
332 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
333 ret_orig);
334 }
335
336 return res;
337}
338
Pascal Brandc639ac82015-07-02 08:53:34 +0200339static TEEC_Result ta_crypt_cmd_cipher_init(ADBG_Case_t *c, TEEC_Session *s,
340 TEE_OperationHandle oph,
341 const void *iv, size_t iv_len)
342{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100343 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200344 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100345 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200346
347 assert((uintptr_t)oph <= UINT32_MAX);
348 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
349
350 if (iv != NULL) {
351 op.params[1].tmpref.buffer = (void *)iv;
352 op.params[1].tmpref.size = iv_len;
353
354 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
355 TEEC_MEMREF_TEMP_INPUT,
356 TEEC_NONE, TEEC_NONE);
357 } else {
358 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
359 TEEC_NONE, TEEC_NONE);
360 }
361
362 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_CIPHER_INIT, &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 return res;
370}
371
372static TEEC_Result ta_crypt_cmd_cipher_update(ADBG_Case_t *c, TEEC_Session *s,
373 TEE_OperationHandle oph,
374 const void *src, size_t src_len,
375 void *dst, size_t *dst_len)
376{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100377 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200378 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100379 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200380
381 assert((uintptr_t)oph <= UINT32_MAX);
382 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
383
384 op.params[1].tmpref.buffer = (void *)src;
385 op.params[1].tmpref.size = src_len;
386
387 op.params[2].tmpref.buffer = dst;
388 op.params[2].tmpref.size = *dst_len;
389
390 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
391 TEEC_MEMREF_TEMP_INPUT,
392 TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE);
393
394 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_CIPHER_UPDATE, &op, &ret_orig);
395
396 if (res != TEEC_SUCCESS) {
397 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
398 ret_orig);
399 }
400
401 if (res == TEEC_SUCCESS)
402 *dst_len = op.params[2].tmpref.size;
403
404 return res;
405}
406
407static TEEC_Result ta_crypt_cmd_cipher_do_final(ADBG_Case_t *c,
408 TEEC_Session *s,
409 TEE_OperationHandle oph,
410 const void *src,
411 size_t src_len,
412 void *dst,
413 size_t *dst_len)
414{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100415 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200416 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100417 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200418
419 assert((uintptr_t)oph <= UINT32_MAX);
420 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
421
422 op.params[1].tmpref.buffer = (void *)src;
423 op.params[1].tmpref.size = src_len;
424
425 op.params[2].tmpref.buffer = (void *)dst;
426 op.params[2].tmpref.size = *dst_len;
427
428 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
429 TEEC_MEMREF_TEMP_INPUT,
430 TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE);
431
432 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_CIPHER_DO_FINAL, &op,
433 &ret_orig);
434
435 if (res != TEEC_SUCCESS) {
436 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
437 ret_orig);
438 }
439
440 if (res == TEEC_SUCCESS)
441 *dst_len = op.params[2].tmpref.size;
442
443 return res;
444}
445
446static TEEC_Result ta_crypt_cmd_random_number_generate(ADBG_Case_t *c,
447 TEEC_Session *s,
448 void *buf,
449 size_t blen)
450{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100451 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200452 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100453 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200454
455 op.params[0].tmpref.buffer = buf;
456 op.params[0].tmpref.size = blen;
457
458 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE,
459 TEEC_NONE, TEEC_NONE);
460
Joakim Bech81f97e32020-05-27 12:14:23 +0200461 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_RANDOM_NUMBER_GENERATE, &op,
Pascal Brandc639ac82015-07-02 08:53:34 +0200462 &ret_orig);
463
464 if (res != TEEC_SUCCESS) {
465 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
466 ret_orig);
467 }
468
469 (void)ADBG_EXPECT_COMPARE_UNSIGNED(c, blen, ==,
470 op.params[0].tmpref.size);
471 return res;
472}
473
474static TEEC_Result ta_crypt_cmd_ae_init(ADBG_Case_t *c, TEEC_Session *s,
475 TEE_OperationHandle oph,
476 const void *nonce, size_t nonce_len,
477 size_t tag_len, size_t aad_len,
478 size_t payload_len)
479{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100480 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200481 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100482 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200483
484 assert((uintptr_t)oph <= UINT32_MAX);
485 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
486 op.params[0].value.b = tag_len;
487
488 op.params[1].tmpref.buffer = (void *)nonce;
489 op.params[1].tmpref.size = nonce_len;
490
491 op.params[2].value.a = aad_len;
492 op.params[2].value.b = payload_len;
493
494 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
495 TEEC_MEMREF_TEMP_INPUT,
Jens Wiklander74a42302015-07-07 01:08:41 +0200496 TEEC_VALUE_INPUT, TEEC_NONE);
Pascal Brandc639ac82015-07-02 08:53:34 +0200497
498 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_AE_INIT, &op, &ret_orig);
499
500 if (res != TEEC_SUCCESS) {
501 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
502 ret_orig);
503 }
504 return res;
505}
506
507static TEEC_Result ta_crypt_cmd_ae_update_aad(ADBG_Case_t *c, TEEC_Session *s,
508 TEE_OperationHandle oph,
509 const void *aad, size_t aad_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 *)aad;
519 op.params[1].tmpref.size = aad_len;
520
521 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
522 TEEC_MEMREF_TEMP_INPUT, TEEC_NONE,
523 TEEC_NONE);
524
525 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_AE_UPDATE_AAD, &op, &ret_orig);
526
527 if (res != TEEC_SUCCESS) {
528 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
529 ret_orig);
530 }
531
532 return res;
533}
534
535static TEEC_Result ta_crypt_cmd_ae_update(ADBG_Case_t *c,
536 TEEC_Session *s,
537 TEE_OperationHandle oph,
538 const void *src,
539 size_t src_len,
540 void *dst,
541 size_t *dst_len)
542{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100543 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200544 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100545 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200546
547 assert((uintptr_t)oph <= UINT32_MAX);
548 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
549
550 op.params[1].tmpref.buffer = (void *)src;
551 op.params[1].tmpref.size = src_len;
552
553 op.params[2].tmpref.buffer = (void *)dst;
554 op.params[2].tmpref.size = *dst_len;
555
556 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
557 TEEC_MEMREF_TEMP_INPUT,
558 TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE);
559
560 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_AE_UPDATE, &op, &ret_orig);
561
562 if (res != TEEC_SUCCESS) {
563 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
564 ret_orig);
565 }
566
567 if (res == TEEC_SUCCESS)
568 *dst_len = op.params[2].tmpref.size;
569
570 return res;
571}
572
573static TEEC_Result ta_crypt_cmd_ae_encrypt_final(ADBG_Case_t *c,
574 TEEC_Session *s,
575 TEE_OperationHandle oph,
576 const void *src,
577 size_t src_len, void *dst,
578 size_t *dst_len, void *tag,
579 size_t *tag_len)
580{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100581 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200582 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100583 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200584
585 assert((uintptr_t)oph <= UINT32_MAX);
586 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
587
588 op.params[1].tmpref.buffer = (void *)src;
589 op.params[1].tmpref.size = src_len;
590
591 op.params[2].tmpref.buffer = (void *)dst;
592 op.params[2].tmpref.size = *dst_len;
593
594 op.params[3].tmpref.buffer = (void *)tag;
595 op.params[3].tmpref.size = *tag_len;
596
597 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
598 TEEC_MEMREF_TEMP_INPUT,
599 TEEC_MEMREF_TEMP_OUTPUT,
600 TEEC_MEMREF_TEMP_OUTPUT);
601
602 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_AE_ENCRYPT_FINAL, &op,
603 &ret_orig);
604
605 if (res != TEEC_SUCCESS) {
606 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
607 ret_orig);
608 }
609
610 if (res == TEEC_SUCCESS) {
611 *dst_len = op.params[2].tmpref.size;
612 *tag_len = op.params[3].tmpref.size;
613 }
614
615 return res;
616}
617
618static TEEC_Result ta_crypt_cmd_ae_decrypt_final(ADBG_Case_t *c,
619 TEEC_Session *s,
620 TEE_OperationHandle oph,
621 const void *src, size_t src_len,
622 void *dst, size_t *dst_len,
623 const void *tag, size_t tag_len)
624{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100625 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200626 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100627 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200628
629 assert((uintptr_t)oph <= UINT32_MAX);
630 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
631
632 op.params[1].tmpref.buffer = (void *)src;
633 op.params[1].tmpref.size = src_len;
634
635 op.params[2].tmpref.buffer = dst;
636 op.params[2].tmpref.size = *dst_len;
637
638 op.params[3].tmpref.buffer = (void *)tag;
639 op.params[3].tmpref.size = tag_len;
640
641 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
642 TEEC_MEMREF_TEMP_INPUT,
643 TEEC_MEMREF_TEMP_OUTPUT,
644 TEEC_MEMREF_TEMP_INPUT);
645
646 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_AE_DECRYPT_FINAL, &op,
647 &ret_orig);
648
649 if (res != TEEC_SUCCESS) {
650 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
651 ret_orig);
652 }
653
654 if (res == TEEC_SUCCESS)
655 *dst_len = op.params[2].tmpref.size;
656
657 return res;
658}
659
660static TEEC_Result ta_crypt_cmd_asymmetric_operate(ADBG_Case_t *c,
661 TEEC_Session *s,
662 TEE_OperationHandle oph,
663 uint32_t cmd,
664 const TEE_Attribute *params,
665 uint32_t paramCount,
666 const void *src,
667 size_t src_len,
668 void *dst,
669 size_t *dst_len)
670{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100671 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200672 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100673 uint32_t ret_orig = 0;
674 uint8_t *buf = NULL;
675 size_t blen = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200676
677 res = pack_attrs(params, paramCount, &buf, &blen);
678 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
679 return res;
680
681 assert((uintptr_t)oph <= UINT32_MAX);
682 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
683
684 op.params[1].tmpref.buffer = buf;
685 op.params[1].tmpref.size = blen;
686
687 op.params[2].tmpref.buffer = (void *)src;
688 op.params[2].tmpref.size = src_len;
689
690 op.params[3].tmpref.buffer = dst;
691 op.params[3].tmpref.size = *dst_len;
692
693 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
694 TEEC_MEMREF_TEMP_INPUT,
695 TEEC_MEMREF_TEMP_INPUT,
696 TEEC_MEMREF_TEMP_OUTPUT);
697
698 res = TEEC_InvokeCommand(s, cmd, &op, &ret_orig);
699
700 if (res != TEEC_SUCCESS) {
701 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
702 ret_orig);
703 }
704
705 if (res == TEEC_SUCCESS)
706 *dst_len = op.params[3].tmpref.size;
707
708 free(buf);
709 return res;
710}
711
712static TEEC_Result ta_crypt_cmd_asymmetric_encrypt(ADBG_Case_t *c,
713 TEEC_Session *s,
714 TEE_OperationHandle oph,
715 const TEE_Attribute *params,
716 uint32_t paramCount,
717 const void *src,
718 size_t src_len,
719 void *dst,
720 size_t *dst_len)
721{
722 return ta_crypt_cmd_asymmetric_operate(c, s, oph,
723 TA_CRYPT_CMD_ASYMMETRIC_ENCRYPT,
724 params, paramCount,
725 src, src_len, dst, dst_len);
726}
727
728static TEEC_Result ta_crypt_cmd_asymmetric_decrypt(ADBG_Case_t *c,
729 TEEC_Session *s,
730 TEE_OperationHandle oph,
731 const TEE_Attribute *params,
732 uint32_t paramCount,
733 const void *src,
734 size_t src_len,
735 void *dst,
736 size_t *dst_len)
737{
738 return ta_crypt_cmd_asymmetric_operate(c, s, oph,
739 TA_CRYPT_CMD_ASYMMETRIC_DECRYPT,
740 params, paramCount,
741 src, src_len, dst, dst_len);
742}
743
744static TEEC_Result ta_crypt_cmd_asymmetric_sign(ADBG_Case_t *c,
745 TEEC_Session *s,
746 TEE_OperationHandle oph,
747 const TEE_Attribute *params,
748 uint32_t paramCount,
749 const void *digest,
750 size_t digest_len,
751 void *signature,
752 size_t *signature_len)
753{
754 return ta_crypt_cmd_asymmetric_operate(c, s, oph,
755 TA_CRYPT_CMD_ASYMMETRIC_SIGN_DIGEST, params, paramCount,
756 digest, digest_len, signature, signature_len);
757}
758
759static TEEC_Result ta_crypt_cmd_asymmetric_verify(ADBG_Case_t *c,
760 TEEC_Session *s,
761 TEE_OperationHandle oph,
762 const TEE_Attribute *params,
763 uint32_t paramCount,
764 const void *digest,
765 size_t digest_len,
766 const void *signature,
767 size_t signature_len)
768{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100769 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200770 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100771 uint32_t ret_orig = 0;
772 uint8_t *buf = NULL;
773 size_t blen = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200774
775 res = pack_attrs(params, paramCount, &buf, &blen);
776 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
777 return res;
778
779 assert((uintptr_t)oph <= UINT32_MAX);
780 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
781
782 op.params[1].tmpref.buffer = buf;
783 op.params[1].tmpref.size = blen;
784
785 op.params[2].tmpref.buffer = (void *)digest;
786 op.params[2].tmpref.size = digest_len;
787
788 op.params[3].tmpref.buffer = (void *)signature;
789 op.params[3].tmpref.size = signature_len;
790
791 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
792 TEEC_MEMREF_TEMP_INPUT,
793 TEEC_MEMREF_TEMP_INPUT,
794 TEEC_MEMREF_TEMP_INPUT);
795
796 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_ASYMMETRIC_VERIFY_DIGEST,
797 &op, &ret_orig);
798
799 if (res != TEEC_SUCCESS) {
800 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
801 ret_orig);
802 }
803
804 free(buf);
805 return res;
806}
807
808static TEEC_Result ta_crypt_cmd_get_object_value_attribute(ADBG_Case_t *c,
809 TEEC_Session *s,
810 TEE_ObjectHandle o,
811 uint32_t attr_id,
812 uint32_t *valuea,
813 uint32_t *valueb)
814{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100815 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200816 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100817 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200818
819 assert((uintptr_t)o <= UINT32_MAX);
820 op.params[0].value.a = (uint32_t)(uintptr_t)o;
821 op.params[0].value.b = attr_id;
822 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_VALUE_OUTPUT,
823 TEEC_NONE, TEEC_NONE);
824
825 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_GET_OBJECT_VALUE_ATTRIBUTE,
826 &op, &ret_orig);
827
828 if (res != TEEC_SUCCESS) {
829 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
830 ret_orig);
831 }
832
833 if (res == TEEC_SUCCESS) {
834 *valuea = op.params[1].value.a;
835 *valueb = op.params[1].value.b;
836 }
837
838 return res;
839}
840
841static TEEC_Result ta_crypt_cmd_generate_key(ADBG_Case_t *c,
842 TEEC_Session *s,
843 TEE_ObjectHandle o,
844 uint32_t key_size,
845 const TEE_Attribute *params,
846 uint32_t paramCount)
847{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100848 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200849 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100850 uint32_t ret_orig = 0;
851 uint8_t *buf = NULL;
852 size_t blen = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200853
854 res = pack_attrs(params, paramCount, &buf, &blen);
855 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
856 return res;
857
858 assert((uintptr_t)o <= UINT32_MAX);
859 op.params[0].value.a = (uint32_t)(uintptr_t)o;
860 op.params[0].value.b = key_size;
861
862 op.params[1].tmpref.buffer = buf;
863 op.params[1].tmpref.size = blen;
864
865 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
866 TEEC_MEMREF_TEMP_INPUT, TEEC_NONE,
867 TEEC_NONE);
868
869 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_GENERATE_KEY, &op, &ret_orig);
870
871 if (res != TEEC_SUCCESS) {
872 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
873 ret_orig);
874 }
875
876 free(buf);
877 return res;
878}
879
880static const uint8_t hash_data_md5_in1[] = {
881 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'
882};
883
884static const uint8_t hash_data_md5_out1[] = {
885 0x61, 0x12, 0x71, 0x83, 0x70, 0x8d, 0x3a, 0xc7,
886 0xf1, 0x9b, 0x66, 0x06, 0xfc, 0xae, 0x7d, 0xf6
887};
888
889static const uint8_t hash_data_sha1_in1[] = {
890 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'
891};
892
893static const uint8_t hash_data_sha1_out1[] = {
894 0x4b, 0x98, 0x92, 0xb6, 0x52, 0x72, 0x14, 0xaf,
895 0xc6, 0x55, 0xb8, 0xaa, 0x52, 0xf4, 0xd2, 0x03,
896 0xc1, 0x5e, 0x7c, 0x9c
897};
898
899static const uint8_t hash_data_sha224_in1[] = {
900 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'
901};
902
903static const uint8_t hash_data_sha224_out1[] = {
904 0x08, 0x21, 0x69, 0xf9, 0x77, 0x1b, 0x80, 0x15,
905 0xf3, 0x97, 0xae, 0xde, 0x5b, 0xba, 0xa2, 0x72,
906 0x2d, 0x8f, 0x5c, 0x19, 0xfe, 0xd2, 0xe2, 0x68,
907 0x92, 0x49, 0xd8, 0x44
908};
909
910static const uint8_t hash_data_sha256_in1[] = { 'a', 'b', 'c' };
911
912static const uint8_t hash_data_sha256_out1[] = {
913 0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea,
914 0x41, 0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23,
915 0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c,
916 0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad
917};
918
919static const uint8_t hash_data_sha256_in2[] = { 'e', 'f', 'g' };
920
921static const uint8_t hash_data_sha256_out2[] = {
922 0xd4, 0xff, 0xe8, 0xe9, 0xee, 0x0b, 0x48, 0xeb,
923 0xa7, 0x16, 0x70, 0x61, 0x23, 0xa7, 0x18, 0x7f,
924 0x32, 0xea, 0xe3, 0xbd, 0xcb, 0x0e, 0x77, 0x63,
925 0xe4, 0x1e, 0x53, 0x32, 0x67, 0xbd, 0x8a, 0x53
926};
927
928
929static const uint8_t hash_data_sha384_in1[] = {
930 'a', 'b', 'c', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'
931};
932
933static const uint8_t hash_data_sha384_out1[] = {
934 0x4c, 0xab, 0x80, 0x9d, 0x96, 0x84, 0x01, 0x47,
935 0x67, 0x0a, 0xc1, 0x7a, 0xb6, 0xb9, 0xf7, 0x6e,
936 0x35, 0xa6, 0xb0, 0x8c, 0xf5, 0x2a, 0x3d, 0x64,
937 0x9a, 0x8c, 0x7e, 0x0c, 0x55, 0x45, 0xd3, 0x7d,
938 0x1f, 0x7f, 0x28, 0x34, 0x96, 0x14, 0x44, 0x2a,
939 0xf5, 0x98, 0xa2, 0x95, 0x24, 0x76, 0x53, 0x97
940};
941
942static const uint8_t hash_data_sha512_in1[] = {
943 'a', 'b', 'c', 'd', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'
944};
945
946static const uint8_t hash_data_sha512_out1[] = {
947 0x20, 0xd8, 0x64, 0x4f, 0x54, 0xa2, 0x5f, 0x6f,
948 0x0a, 0xf9, 0xd5, 0x27, 0x7d, 0x17, 0xa8, 0x99,
949 0x4c, 0x64, 0x3f, 0xd0, 0xf3, 0x83, 0x36, 0xee,
950 0x93, 0x12, 0x55, 0xcd, 0x2e, 0x12, 0x34, 0xa0,
951 0xc2, 0xaa, 0xf9, 0xbb, 0x15, 0xc5, 0xe9, 0xfa,
952 0xf7, 0xa7, 0xda, 0xb8, 0x2f, 0x72, 0xa0, 0x47,
953 0xe3, 0x02, 0x04, 0xe8, 0xa0, 0x35, 0x0c, 0x96,
954 0x26, 0xd1, 0xcb, 0x8b, 0x47, 0x45, 0x25, 0xd0
955};
956
Jens Wiklander72967ae2022-12-07 08:07:43 +0100957/* SHA-3 vectors from https://www.di-mgt.com.au/sha_testvectors.html */
958#define hash_data_sha3_in1 hash_data_sha256_in1
959
960static const uint8_t hash_data_sha3_224_out1[] = {
961 0xe6, 0x42, 0x82, 0x4c, 0x3f, 0x8c, 0xf2, 0x4a,
962 0xd0, 0x92, 0x34, 0xee, 0x7d, 0x3c, 0x76, 0x6f,
963 0xc9, 0xa3, 0xa5, 0x16, 0x8d, 0x0c, 0x94, 0xad,
964 0x73, 0xb4, 0x6f, 0xdf
965};
966
967static const uint8_t hash_data_sha3_256_out1[] = {
968 0x3a, 0x98, 0x5d, 0xa7, 0x4f, 0xe2, 0x25, 0xb2,
969 0x04, 0x5c, 0x17, 0x2d, 0x6b, 0xd3, 0x90, 0xbd,
970 0x85, 0x5f, 0x08, 0x6e, 0x3e, 0x9d, 0x52, 0x5b,
971 0x46, 0xbf, 0xe2, 0x45, 0x11, 0x43, 0x15, 0x32
972};
973
974static const uint8_t hash_data_sha3_384_out1[] = {
975 0xec, 0x01, 0x49, 0x82, 0x88, 0x51, 0x6f, 0xc9,
976 0x26, 0x45, 0x9f, 0x58, 0xe2, 0xc6, 0xad, 0x8d,
977 0xf9, 0xb4, 0x73, 0xcb, 0x0f, 0xc0, 0x8c, 0x25,
978 0x96, 0xda, 0x7c, 0xf0, 0xe4, 0x9b, 0xe4, 0xb2,
979 0x98, 0xd8, 0x8c, 0xea, 0x92, 0x7a, 0xc7, 0xf5,
980 0x39, 0xf1, 0xed, 0xf2, 0x28, 0x37, 0x6d, 0x25
981};
982
983static const uint8_t hash_data_sha3_512_out1[] = {
984 0xb7, 0x51, 0x85, 0x0b, 0x1a, 0x57, 0x16, 0x8a,
985 0x56, 0x93, 0xcd, 0x92, 0x4b, 0x6b, 0x09, 0x6e,
986 0x08, 0xf6, 0x21, 0x82, 0x74, 0x44, 0xf7, 0x0d,
987 0x88, 0x4f, 0x5d, 0x02, 0x40, 0xd2, 0x71, 0x2e,
988 0x10, 0xe1, 0x16, 0xe9, 0x19, 0x2a, 0xf3, 0xc9,
989 0x1a, 0x7e, 0xc5, 0x76, 0x47, 0xe3, 0x93, 0x40,
990 0x57, 0x34, 0x0b, 0x4c, 0xf4, 0x08, 0xd5, 0xa5,
991 0x65, 0x92, 0xf8, 0x27, 0x4e, 0xec, 0x53, 0xf0
992};
993
994/*
995 * SHAKE output generated with:
996 * https://asecuritysite.com/hash/shake?m=abc&l=54
997 */
998static const uint8_t hash_data_shake128_out1[] = {
999 0x58, 0x81, 0x09, 0x2d, 0xd8, 0x18, 0xbf, 0x5c,
1000 0xf8, 0xa3, 0xdd, 0xb7, 0x93, 0xfb, 0xcb, 0xa7,
1001 0x40, 0x97, 0xd5, 0xc5, 0x26, 0xa6, 0xd3, 0x5f,
1002 0x97, 0xb8, 0x33, 0x51, 0x94, 0x0f, 0x2c, 0xc8,
1003 0x44, 0xc5, 0x0a, 0xf3, 0x2a, 0xcd, 0x3f, 0x2c,
1004 0xdd, 0x06, 0x65, 0x68, 0x70, 0x6f, 0x50, 0x9b,
1005 0xc1, 0xbd, 0xde, 0x58, 0x29, 0x5d
1006};
1007
1008static const uint8_t hash_data_shake256_out1[] = {
1009 0x48, 0x33, 0x66, 0x60, 0x13, 0x60, 0xa8, 0x77,
1010 0x1c, 0x68, 0x63, 0x08, 0x0c, 0xc4, 0x11, 0x4d,
1011 0x8d, 0xb4, 0x45, 0x30, 0xf8, 0xf1, 0xe1, 0xee,
1012 0x4f, 0x94, 0xea, 0x37, 0xe7, 0x8b, 0x57, 0x39,
1013 0xd5, 0xa1, 0x5b, 0xef, 0x18, 0x6a, 0x53, 0x86,
1014 0xc7, 0x57, 0x44, 0xc0, 0x52, 0x7e, 0x1f, 0xaa,
1015 0x9f, 0x87, 0x26, 0xe4, 0x62, 0xa1
1016};
1017
Jerome Forissier3ed850a2019-12-13 10:58:23 +01001018/*
1019 * SM3
1020 * https://tools.ietf.org/html/draft-sca-cfrg-sm3-02
Jerome Forissier9f17e262019-12-13 14:12:41 +01001021 * Appendix A.1
Jerome Forissier3ed850a2019-12-13 10:58:23 +01001022 */
1023static const uint8_t hash_data_sm3_a1_in[3] = "abc";
1024
1025static const uint8_t hash_data_sm3_a1_out[] = {
1026 0x66, 0xc7, 0xf0, 0xf4, 0x62, 0xee, 0xed, 0xd9,
1027 0xd1, 0xf2, 0xd4, 0x6b, 0xdc, 0x10, 0xe4, 0xe2,
1028 0x41, 0x67, 0xc4, 0x87, 0x5c, 0xf2, 0xf7, 0xa2,
1029 0x29, 0x7d, 0xa0, 0x2b, 0x8f, 0x4b, 0xa8, 0xe0
1030};
1031
1032/*
1033 * SM3
1034 * https://tools.ietf.org/html/draft-sca-cfrg-sm3-02
Jerome Forissier9f17e262019-12-13 14:12:41 +01001035 * Appendix A.2
Jerome Forissier3ed850a2019-12-13 10:58:23 +01001036 */
1037static const uint8_t hash_data_sm3_a2_in[] = {
1038 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
1039 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
1040 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
1041 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
1042 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
1043 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
1044 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
1045 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64
1046};
1047
1048static const uint8_t hash_data_sm3_a2_out[] = {
1049 0xde, 0xbe, 0x9f, 0xf9, 0x22, 0x75, 0xb8, 0xa1,
1050 0x38, 0x60, 0x48, 0x89, 0xc1, 0x8e, 0x5a, 0x4d,
1051 0x6f, 0xdb, 0x70, 0xe5, 0x38, 0x7e, 0x57, 0x65,
1052 0x29, 0x3d, 0xcb, 0xa3, 0x9c, 0x0c, 0x57, 0x32
1053};
1054
Pascal Brandc639ac82015-07-02 08:53:34 +02001055struct xtest_hash_case {
1056 uint32_t algo;
1057 size_t in_incr;
1058 const uint8_t *in;
1059 size_t in_len;
1060 const uint8_t *out;
1061 size_t out_len;
1062};
1063
1064#define XTEST_HASH_CASE(algo, in_incr, in, out) \
1065 { (algo), (in_incr), (in), ARRAY_SIZE(in), (out), ARRAY_SIZE(out) }
1066
1067static const struct xtest_hash_case hash_cases[] = {
1068 XTEST_HASH_CASE(TEE_ALG_MD5, 6, hash_data_md5_in1,
1069 hash_data_md5_out1),
1070 XTEST_HASH_CASE(TEE_ALG_SHA1, 3, hash_data_sha1_in1,
1071 hash_data_sha1_out1),
1072 XTEST_HASH_CASE(TEE_ALG_SHA224, 7, hash_data_sha224_in1,
1073 hash_data_sha224_out1),
1074 XTEST_HASH_CASE(TEE_ALG_SHA256, 1, hash_data_sha256_in1,
1075 hash_data_sha256_out1),
1076 XTEST_HASH_CASE(TEE_ALG_SHA256, 1, hash_data_sha256_in2,
1077 hash_data_sha256_out2),
1078 XTEST_HASH_CASE(TEE_ALG_SHA384, 1, hash_data_sha384_in1,
1079 hash_data_sha384_out1),
1080 XTEST_HASH_CASE(TEE_ALG_SHA512, 1, hash_data_sha512_in1,
1081 hash_data_sha512_out1),
Jens Wiklander72967ae2022-12-07 08:07:43 +01001082 XTEST_HASH_CASE(TEE_ALG_SHA3_224, 1, hash_data_sha3_in1,
1083 hash_data_sha3_224_out1),
1084 XTEST_HASH_CASE(TEE_ALG_SHA3_256, 1, hash_data_sha3_in1,
1085 hash_data_sha3_256_out1),
1086 XTEST_HASH_CASE(TEE_ALG_SHA3_384, 1, hash_data_sha3_in1,
1087 hash_data_sha3_384_out1),
1088 XTEST_HASH_CASE(TEE_ALG_SHA3_512, 1, hash_data_sha3_in1,
1089 hash_data_sha3_512_out1),
1090 XTEST_HASH_CASE(TEE_ALG_SHAKE128, 1, hash_data_sha3_in1,
1091 hash_data_shake128_out1),
1092 XTEST_HASH_CASE(TEE_ALG_SHAKE256, 1, hash_data_sha3_in1,
1093 hash_data_shake256_out1),
Jerome Forissier3ed850a2019-12-13 10:58:23 +01001094 XTEST_HASH_CASE(TEE_ALG_SM3, 2, hash_data_sm3_a1_in,
1095 hash_data_sm3_a1_out),
1096 XTEST_HASH_CASE(TEE_ALG_SM3, 19, hash_data_sm3_a2_in,
1097 hash_data_sm3_a2_out),
Pascal Brandc639ac82015-07-02 08:53:34 +02001098};
1099
1100static void xtest_tee_test_4001(ADBG_Case_t *c)
1101{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001102 TEEC_Session session = { };
1103 uint32_t ret_orig = 0;
1104 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001105
1106 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1107 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
1108 &ret_orig)))
1109 return;
1110
1111
1112 for (n = 0; n < ARRAY_SIZE(hash_cases); n++) {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001113 TEE_OperationHandle op1 = TEE_HANDLE_NULL;
1114 TEE_OperationHandle op2 = TEE_HANDLE_NULL;
1115 uint8_t out[64] = { };
1116 size_t out_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001117
Jerome Forissier87b00c02020-01-22 16:33:12 +01001118 if (hash_cases[n].algo == TEE_ALG_SM3 &&
1119 !ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_SM3,
1120 TEE_CRYPTO_ELEMENT_NONE)) {
1121 Do_ADBG_Log("SM3 not supported: skip subcase");
1122 continue;
1123 }
1124
Pascal Brandc639ac82015-07-02 08:53:34 +02001125 Do_ADBG_BeginSubCase(c, "Hash case %d algo 0x%x",
1126 (int)n, (unsigned int)hash_cases[n].algo);
1127
1128 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1129 ta_crypt_cmd_allocate_operation(c, &session, &op1,
1130 hash_cases[n].algo,
1131 TEE_MODE_DIGEST, 0)))
1132 goto out;
1133
1134 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1135 ta_crypt_cmd_allocate_operation(c, &session, &op2,
1136 hash_cases[n].algo,
1137 TEE_MODE_DIGEST, 0)))
1138 goto out;
1139
1140 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1141 ta_crypt_cmd_digest_update(c, &session, op1,
1142 hash_cases[n].in,
1143 hash_cases[n].in_incr)))
1144 goto out;
1145
1146 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1147 ta_crypt_cmd_copy_operation(c, &session, op2, op1)))
1148 goto out;
1149
Jens Wiklander72967ae2022-12-07 08:07:43 +01001150 out_size = hash_cases[n].out_len;
Pascal Brandc639ac82015-07-02 08:53:34 +02001151 memset(out, 0, sizeof(out));
1152 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1153 ta_crypt_cmd_digest_do_final(c, &session, op2,
1154 hash_cases[n].in + hash_cases[n].in_incr,
1155 hash_cases[n].in_len - hash_cases[n].in_incr,
1156 out, &out_size)))
1157 goto out;
1158
1159 (void)ADBG_EXPECT_BUFFER(c, hash_cases[n].out,
1160 hash_cases[n].out_len, out, out_size);
1161
1162 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1163 ta_crypt_cmd_reset_operation(c, &session, op1)))
1164 goto out;
1165
Jens Wiklander72967ae2022-12-07 08:07:43 +01001166 out_size = hash_cases[n].out_len;
Pascal Brandc639ac82015-07-02 08:53:34 +02001167 memset(out, 0, sizeof(out));
1168 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1169 ta_crypt_cmd_digest_do_final(c, &session, op1,
1170 hash_cases[n].in,
1171 hash_cases[n].in_len, out,
1172 &out_size)))
1173 goto out;
1174
1175 (void)ADBG_EXPECT_BUFFER(c, hash_cases[n].out,
1176 hash_cases[n].out_len, out, out_size);
1177
Jerome Forissier1e05e262015-07-29 16:09:07 +02001178 /*
1179 * Invoke TEE_DigestDoFinal() a second time to check that state
1180 * was properly reset
1181 */
Jens Wiklander72967ae2022-12-07 08:07:43 +01001182 out_size = hash_cases[n].out_len;
Jerome Forissier1e05e262015-07-29 16:09:07 +02001183 memset(out, 0, sizeof(out));
1184 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1185 ta_crypt_cmd_digest_do_final(c, &session, op1,
1186 hash_cases[n].in,
1187 hash_cases[n].in_len, out,
1188 &out_size)))
1189 goto out;
1190
1191 (void)ADBG_EXPECT_BUFFER(c, hash_cases[n].out,
1192 hash_cases[n].out_len, out, out_size);
1193
Jens Wiklander92aded22022-12-07 09:43:56 +01001194 /*
1195 * Test that TEE_DigestExtract() and TEE_DigestDoFinal()
1196 * work together.
1197 */
1198
1199 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1200 ta_crypt_cmd_digest_update(c, &session, op1,
1201 hash_cases[n].in,
1202 hash_cases[n].in_len)))
1203 goto out;
1204
1205 out_size = hash_cases[n].in_incr;
1206 memset(out, 0, sizeof(out));
1207 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1208 ta_crypt_cmd_digest_extract(c, &session, op1,
1209 out, &out_size)))
1210 goto out;
1211 ADBG_EXPECT_BUFFER(c, hash_cases[n].out,
1212 hash_cases[n].in_incr, out, out_size);
1213
1214 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1215 ta_crypt_cmd_copy_operation(c, &session, op2, op1)))
1216 goto out;
1217
1218 out_size = hash_cases[n].out_len - hash_cases[n].in_incr;
1219 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1220 ta_crypt_cmd_digest_do_final(c, &session, op1,
1221 NULL, 0, out, &out_size)))
1222 goto out;
1223 ADBG_EXPECT_BUFFER(c, hash_cases[n].out + hash_cases[n].in_incr,
1224 hash_cases[n].out_len -
1225 hash_cases[n].in_incr, out, out_size);
1226
1227 out_size = hash_cases[n].out_len - hash_cases[n].in_incr;
1228 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1229 ta_crypt_cmd_digest_extract(c, &session, op2,
1230 out, &out_size)))
1231 goto out;
1232 ADBG_EXPECT_BUFFER(c, hash_cases[n].out + hash_cases[n].in_incr,
1233 hash_cases[n].out_len -
1234 hash_cases[n].in_incr, out, out_size);
1235
Pascal Brandc639ac82015-07-02 08:53:34 +02001236 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1237 ta_crypt_cmd_free_operation(c, &session, op1)))
1238 goto out;
1239
1240 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1241 ta_crypt_cmd_free_operation(c, &session, op2)))
1242 goto out;
1243
1244 Do_ADBG_EndSubCase(c, NULL);
1245 }
1246
1247out:
1248 TEEC_CloseSession(&session);
1249}
Jens Wiklander14f48872018-06-29 15:30:13 +02001250ADBG_CASE_DEFINE(regression, 4001, xtest_tee_test_4001,
1251 "Test TEE Internal API hash operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02001252
Pascal Brandc639ac82015-07-02 08:53:34 +02001253struct xtest_mac_case {
1254 uint32_t algo;
1255 uint32_t key_type;
1256 const uint8_t *key;
1257 size_t key_len;
1258 size_t in_incr;
1259 const uint8_t *in;
1260 size_t in_len;
1261 const uint8_t *out;
1262 size_t out_len;
Jerome Forissier3dec7442019-01-30 17:50:05 +01001263 bool multiple_incr;
Pascal Brandc639ac82015-07-02 08:53:34 +02001264};
1265
Jerome Forissier3dec7442019-01-30 17:50:05 +01001266#define XTEST_MAC_CASE_1(algo, key_type, key, in_incr, in, out) \
Pascal Brandc639ac82015-07-02 08:53:34 +02001267 { (algo), (key_type), (key), ARRAY_SIZE(key), \
Jerome Forissier3dec7442019-01-30 17:50:05 +01001268 (in_incr), (in), ARRAY_SIZE(in), (out), ARRAY_SIZE(out), false }
1269
1270#define XTEST_MAC_CASE_MULT(algo, key_type, key, in_incr, in, out) \
1271 { (algo), (key_type), (key), ARRAY_SIZE(key), \
1272 (in_incr), (in), ARRAY_SIZE(in), (out), ARRAY_SIZE(out), true }
1273
1274#define XTEST_MAC_CASE(algo, key_type, key, in_incr, in, out) \
1275 XTEST_MAC_CASE_1((algo), (key_type), (key), (in_incr), (in), (out)), \
1276 XTEST_MAC_CASE_MULT((algo), (key_type), (key), (in_incr), (in), (out))
Pascal Brandc639ac82015-07-02 08:53:34 +02001277
1278#define XTEST_MAC_CBC_CASE(algo, key_type, vect, in_incr) \
1279 XTEST_MAC_CASE((algo), (key_type), \
1280 mac_cbc_ ## vect ## _key, (in_incr), \
1281 mac_cbc_ ## vect ## _data, mac_cbc_ ## vect ## _out)
1282
1283#define XTEST_MAC_CMAC_CASE(vect, in_incr) \
1284 XTEST_MAC_CASE(TEE_ALG_AES_CMAC, TEE_TYPE_AES, \
1285 mac_cmac_ ## vect ## _key, (in_incr), \
1286 mac_cmac_ ## vect ## _data, mac_cmac_ ## vect ## _out)
1287
Alexander Zakharov0afe00c2021-02-10 19:06:48 +01001288#define XTEST_MAC_DES3_CMAC_CASE(vect, in_incr) \
1289 XTEST_MAC_CASE(TEE_ALG_DES3_CMAC, TEE_TYPE_DES3, \
1290 mac_des3_cmac_ ## vect ## _key, (in_incr), \
1291 mac_des3_cmac_ ## vect ## _data, mac_des3_cmac_ ## vect ## _out)
1292
Pascal Brandc639ac82015-07-02 08:53:34 +02001293static const struct xtest_mac_case mac_cases[] = {
1294 XTEST_MAC_CASE(TEE_ALG_HMAC_MD5, TEE_TYPE_HMAC_MD5,
1295 mac_data_md5_key1,
1296 4, mac_data_md5_in1, mac_data_md5_out1),
1297 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA1, TEE_TYPE_HMAC_SHA1,
1298 mac_data_sha1_key1,
1299 5, mac_data_sha1_in1, mac_data_sha1_out1),
1300 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA224, TEE_TYPE_HMAC_SHA224,
1301 mac_data_sha224_key1,
1302 8, mac_data_sha224_in1, mac_data_sha224_out1),
1303 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA256, TEE_TYPE_HMAC_SHA256,
1304 mac_data_sha256_key1,
1305 1, mac_data_sha256_in1, mac_data_sha256_out1),
1306 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA256, TEE_TYPE_HMAC_SHA256,
1307 mac_data_sha256_key2,
1308 7, mac_data_sha256_in2, mac_data_sha256_out2),
1309 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA384, TEE_TYPE_HMAC_SHA384,
1310 mac_data_sha384_key1,
1311 11, mac_data_sha384_in1, mac_data_sha384_out1),
1312 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA512, TEE_TYPE_HMAC_SHA512,
1313 mac_data_sha512_key1,
1314 13, mac_data_sha512_in1, mac_data_sha512_out1),
Jens Wiklander16de19d2022-12-09 18:00:08 +01001315 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA3_224, TEE_TYPE_HMAC_SHA3_224,
1316 mac_data_sha3_224_key1,
1317 13, mac_data_sha3_224_in1, mac_data_sha3_224_out1),
1318 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA3_256, TEE_TYPE_HMAC_SHA3_256,
1319 mac_data_sha3_256_key1,
1320 13, mac_data_sha3_256_in1, mac_data_sha3_256_out1),
1321 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA3_384, TEE_TYPE_HMAC_SHA3_384,
1322 mac_data_sha3_384_key1,
1323 13, mac_data_sha3_384_in1, mac_data_sha3_384_out1),
1324 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA3_512, TEE_TYPE_HMAC_SHA3_512,
1325 mac_data_sha3_512_key1,
1326 13, mac_data_sha3_512_in1, mac_data_sha3_512_out1),
Pascal Brandc639ac82015-07-02 08:53:34 +02001327
1328 XTEST_MAC_CBC_CASE(TEE_ALG_AES_CBC_MAC_NOPAD, TEE_TYPE_AES, vect1, 14),
1329 XTEST_MAC_CBC_CASE(TEE_ALG_DES_CBC_MAC_NOPAD, TEE_TYPE_DES, vect2, 16),
1330 XTEST_MAC_CBC_CASE(TEE_ALG_DES3_CBC_MAC_NOPAD, TEE_TYPE_DES3, vect3,
1331 17),
1332 XTEST_MAC_CBC_CASE(TEE_ALG_AES_CBC_MAC_PKCS5, TEE_TYPE_AES, vect4, 11),
1333 XTEST_MAC_CBC_CASE(TEE_ALG_DES_CBC_MAC_PKCS5, TEE_TYPE_DES, vect5, 9),
1334 XTEST_MAC_CBC_CASE(TEE_ALG_DES3_CBC_MAC_PKCS5, TEE_TYPE_DES3, vect6, 4),
1335 XTEST_MAC_CBC_CASE(TEE_ALG_AES_CBC_MAC_PKCS5, TEE_TYPE_AES, vect7, 3),
1336 XTEST_MAC_CBC_CASE(TEE_ALG_DES_CBC_MAC_PKCS5, TEE_TYPE_DES, vect8, 23),
1337 XTEST_MAC_CBC_CASE(TEE_ALG_DES3_CBC_MAC_PKCS5, TEE_TYPE_DES3, vect9,
1338 34),
Pascal Brand5c3d8092015-07-23 08:20:26 +02001339 XTEST_MAC_CBC_CASE(TEE_ALG_DES3_CBC_MAC_PKCS5, TEE_TYPE_DES3, vect10, 4),
Pascal Brandc639ac82015-07-02 08:53:34 +02001340
1341 { TEE_ALG_AES_CMAC, TEE_TYPE_AES, mac_cmac_vect1_key,
1342 ARRAY_SIZE(mac_cmac_vect1_key), 0, NULL, 0, mac_cmac_vect1_out,
1343 ARRAY_SIZE(mac_cmac_vect1_out) },
1344 XTEST_MAC_CMAC_CASE(vect2, 9),
1345 XTEST_MAC_CMAC_CASE(vect3, 9),
1346 XTEST_MAC_CMAC_CASE(vect4, 9),
1347 { TEE_ALG_AES_CMAC, TEE_TYPE_AES, mac_cmac_vect5_key,
1348 ARRAY_SIZE(mac_cmac_vect5_key), 0, NULL, 0, mac_cmac_vect5_out,
1349 ARRAY_SIZE(mac_cmac_vect5_out) },
1350 XTEST_MAC_CMAC_CASE(vect6, 9),
1351 XTEST_MAC_CMAC_CASE(vect7, 9),
1352 XTEST_MAC_CMAC_CASE(vect8, 9),
1353 { TEE_ALG_AES_CMAC, TEE_TYPE_AES, mac_cmac_vect9_key,
1354 ARRAY_SIZE(mac_cmac_vect9_key), 0, NULL, 0, mac_cmac_vect9_out,
1355 ARRAY_SIZE(mac_cmac_vect9_out) },
1356 XTEST_MAC_CMAC_CASE(vect10, 9),
1357 XTEST_MAC_CMAC_CASE(vect11, 9),
1358 XTEST_MAC_CMAC_CASE(vect12, 9),
Clement Faure21b347a2021-04-29 13:06:55 +02001359 XTEST_MAC_CMAC_CASE(vect12, 16),
Olivier Massea40266a2023-07-19 10:34:03 +02001360 XTEST_MAC_CMAC_CASE(vect13, 1),
Jerome Forissier9f17e262019-12-13 14:12:41 +01001361
Alexander Zakharov0afe00c2021-02-10 19:06:48 +01001362 { TEE_ALG_DES3_CMAC, TEE_TYPE_DES3, mac_des3_cmac_vect1_key,
1363 ARRAY_SIZE(mac_des3_cmac_vect1_key), 0, NULL, 0, mac_des3_cmac_vect1_out,
1364 ARRAY_SIZE(mac_des3_cmac_vect1_out) },
1365 XTEST_MAC_DES3_CMAC_CASE(vect2, 3),
1366 XTEST_MAC_DES3_CMAC_CASE(vect3, 9),
1367 XTEST_MAC_DES3_CMAC_CASE(vect4, 9),
1368 { TEE_ALG_DES3_CMAC, TEE_TYPE_DES3, mac_des3_cmac_vect5_key,
1369 ARRAY_SIZE(mac_des3_cmac_vect5_key), 0, NULL, 0, mac_des3_cmac_vect5_out,
1370 ARRAY_SIZE(mac_des3_cmac_vect5_out) },
1371 XTEST_MAC_DES3_CMAC_CASE(vect6, 3),
1372 XTEST_MAC_DES3_CMAC_CASE(vect7, 5),
1373 XTEST_MAC_DES3_CMAC_CASE(vect8, 9),
1374
Jerome Forissier9f17e262019-12-13 14:12:41 +01001375 XTEST_MAC_CASE(TEE_ALG_HMAC_SM3, TEE_TYPE_HMAC_SM3,
1376 mac_data_sm3_d31_key,
1377 13, mac_data_sm3_d31_in, mac_data_sm3_d31_out),
1378 XTEST_MAC_CASE(TEE_ALG_HMAC_SM3, TEE_TYPE_HMAC_SM3,
1379 mac_data_sm3_d32_key,
1380 13, mac_data_sm3_d32_in, mac_data_sm3_d32_out),
Pascal Brandc639ac82015-07-02 08:53:34 +02001381};
1382
1383static void xtest_tee_test_4002(ADBG_Case_t *c)
1384{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001385 TEEC_Session session = { };
1386 TEE_OperationHandle op1 = TEE_HANDLE_NULL;
1387 TEE_OperationHandle op2 = TEE_HANDLE_NULL;
Jerome Forissier4f419512021-07-07 14:56:10 +02001388 TEE_OperationHandle op3 = TEE_HANDLE_NULL;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001389 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
1390 uint8_t out[64] = { };
1391 size_t out_size = 0;
1392 uint32_t ret_orig = 0;
1393 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001394
1395 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1396 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
1397 &ret_orig)))
1398 return;
1399
1400 for (n = 0; n < ARRAY_SIZE(mac_cases); n++) {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001401 TEE_Attribute key_attr = { };
1402 size_t key_size = 0;
1403 size_t offs = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001404
1405 Do_ADBG_BeginSubCase(c, "MAC case %d algo 0x%x",
1406 (int)n, (unsigned int)mac_cases[n].algo);
1407
1408 key_attr.attributeID = TEE_ATTR_SECRET_VALUE;
1409 key_attr.content.ref.buffer = (void *)mac_cases[n].key;
1410 key_attr.content.ref.length = mac_cases[n].key_len;
1411
1412 key_size = key_attr.content.ref.length * 8;
1413 if (mac_cases[n].key_type == TEE_TYPE_DES ||
1414 mac_cases[n].key_type == TEE_TYPE_DES3)
1415 /* Exclude parity in bit size of key */
1416 key_size -= key_size / 8;
1417
1418 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1419 ta_crypt_cmd_allocate_operation(c, &session, &op1,
1420 mac_cases[n].algo, TEE_MODE_MAC, key_size)))
1421 goto out;
1422
1423 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1424 ta_crypt_cmd_allocate_operation(c, &session, &op2,
1425 mac_cases[n].algo, TEE_MODE_MAC, key_size)))
1426 goto out;
1427
1428 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jerome Forissier4f419512021-07-07 14:56:10 +02001429 ta_crypt_cmd_allocate_operation(c, &session, &op3,
1430 mac_cases[n].algo, TEE_MODE_MAC, key_size)))
1431 goto out;
1432
1433 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc639ac82015-07-02 08:53:34 +02001434 ta_crypt_cmd_allocate_transient_object(c, &session,
1435 mac_cases[n].key_type, key_size, &key_handle)))
1436 goto out;
1437
1438 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1439 ta_crypt_cmd_populate_transient_object(c, &session,
1440 key_handle, &key_attr, 1)))
1441 goto out;
1442
1443 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1444 ta_crypt_cmd_set_operation_key(c, &session, op1,
1445 key_handle)))
1446 goto out;
1447
1448 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1449 ta_crypt_cmd_free_transient_object(c, &session,
1450 key_handle)))
1451 goto out;
1452
1453 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1454 ta_crypt_cmd_mac_init(c, &session, op1, NULL, 0)))
1455 goto out;
1456
Jerome Forissier4f419512021-07-07 14:56:10 +02001457 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1458 ta_crypt_cmd_copy_operation(c, &session, op3, op1)))
1459 goto out;
1460
Jerome Forissier3dec7442019-01-30 17:50:05 +01001461 offs = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001462 if (mac_cases[n].in != NULL) {
Jerome Forissier3dec7442019-01-30 17:50:05 +01001463 while (offs + mac_cases[n].in_incr <
1464 mac_cases[n].in_len) {
1465 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1466 ta_crypt_cmd_mac_update(c, &session,
1467 op1, mac_cases[n].in + offs,
1468 mac_cases[n].in_incr)))
1469 goto out;
1470 offs += mac_cases[n].in_incr;
1471 if (!mac_cases[n].multiple_incr)
1472 break;
1473 }
Pascal Brandc639ac82015-07-02 08:53:34 +02001474 }
1475
1476 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1477 ta_crypt_cmd_copy_operation(c, &session, op2, op1)))
1478 goto out;
1479
1480 out_size = sizeof(out);
1481 memset(out, 0, sizeof(out));
1482 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1483 ta_crypt_cmd_mac_final_compute(c, &session, op2,
Jerome Forissier3dec7442019-01-30 17:50:05 +01001484 mac_cases[n].in + offs,
1485 mac_cases [n].in_len - offs,
Pascal Brandc639ac82015-07-02 08:53:34 +02001486 out, &out_size)))
1487 goto out;
1488
1489 (void)ADBG_EXPECT_BUFFER(c, mac_cases[n].out,
1490 mac_cases[n].out_len, out, out_size);
1491
1492 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1493 ta_crypt_cmd_mac_init(c, &session, op1, NULL, 0)))
1494 goto out;
1495
1496 out_size = sizeof(out);
1497 memset(out, 0, sizeof(out));
1498 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1499 ta_crypt_cmd_mac_final_compute(c, &session, op1,
1500 mac_cases[n].in, mac_cases[n].in_len, out,
1501 &out_size)))
1502 goto out;
1503
1504 (void)ADBG_EXPECT_BUFFER(c, mac_cases[n].out,
1505 mac_cases[n].out_len, out, out_size);
1506
1507 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jerome Forissier4f419512021-07-07 14:56:10 +02001508 ta_crypt_cmd_mac_final_compare(c, &session, op3,
1509 mac_cases[n].in, mac_cases[n].in_len,
1510 mac_cases[n].out, mac_cases[n].out_len)))
1511 goto out;
1512
1513 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc639ac82015-07-02 08:53:34 +02001514 ta_crypt_cmd_free_operation(c, &session, op1)))
1515 goto out;
1516
1517 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1518 ta_crypt_cmd_free_operation(c, &session, op2)))
1519 goto out;
1520
Jerome Forissier4f419512021-07-07 14:56:10 +02001521 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1522 ta_crypt_cmd_free_operation(c, &session, op3)))
1523 goto out;
1524
Pascal Brandc639ac82015-07-02 08:53:34 +02001525 Do_ADBG_EndSubCase(c, NULL);
1526 }
1527out:
1528 TEEC_CloseSession(&session);
1529}
Jens Wiklander14f48872018-06-29 15:30:13 +02001530ADBG_CASE_DEFINE(regression, 4002, xtest_tee_test_4002,
1531 "Test TEE Internal API MAC operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02001532
Pascal Brandc639ac82015-07-02 08:53:34 +02001533static const uint8_t ciph_data_aes_key1[] = {
1534 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1535 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1536};
1537
Jerome Forissier0780ad42018-06-05 15:02:37 +02001538static const uint8_t ciph_data_aes_key2[] = {
1539 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
1540 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
1541};
1542
Pascal Brandc639ac82015-07-02 08:53:34 +02001543static const uint8_t ciph_data_des_key1[] = {
1544 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37 /* 01234567 */
1545};
1546
1547static const uint8_t ciph_data_des_key2[] = {
1548 0x13, 0x34, 0x57, 0x79, 0x9B, 0xBC, 0xDF, 0xF1
1549};
1550
1551
1552static const uint8_t ciph_data_des3_key1[] = {
1553 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1554 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1555 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, /* 12345678 */
1556};
1557
1558static const uint8_t ciph_data_des3_key2[] = {
1559 0x13, 0x34, 0x57, 0x79, 0x9B, 0xBC, 0xDF, 0xF1,
1560 0x13, 0x34, 0x57, 0x79, 0x9B, 0xBC, 0xDF, 0xF1,
1561 0x13, 0x34, 0x57, 0x79, 0x9B, 0xBC, 0xDF, 0xF1
1562};
1563
1564static const uint8_t ciph_data_des2_key1[] = {
1565 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1566 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1567};
1568
1569static const uint8_t ciph_data_in1[] = {
1570 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, /* 23456789 */
1571 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, /* ABCDEF01 */
1572 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, /* 3456789A */
1573 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, /* BCDEF012 */
1574 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, /* 456789AB */
1575 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, 0x33, /* CDEF0123 */
1576};
1577
1578static const uint8_t ciph_data_in3[] = {
1579 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, /* 23456789 */
1580 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, /* ABCDEF01 */
1581 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, /* 3456789A */
1582 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, /* BCDEF012 */
1583 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, /* 456789AB */
1584 0x43, 0x44, 0x45, 0x46, 0x30, /* CDEF0 */
1585};
1586
Jerome Forissier45218eb2018-04-11 13:03:26 +02001587static const uint8_t ciph_data_in4[] = {
1588 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, /* 23456789 */
1589 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, /* ABCDEF01 */
1590 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, /* 3456789A */
1591 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, /* BCDEF012 */
1592 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, /* 456789AB */
1593 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, 0x33, /* CDEF0123 */
1594 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1595 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1596};
1597
Jerome Forissier0780ad42018-06-05 15:02:37 +02001598static const uint8_t ciph_data_in5[] = {
1599 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1600 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1601 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1602 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1603 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1604 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1605 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1606 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
Jerome Forissierbf9009e2018-06-05 18:44:42 +02001607 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1608 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
Jerome Forissier0780ad42018-06-05 15:02:37 +02001609 0x01, 0x01, 0x01
1610};
1611
Pascal Brandc639ac82015-07-02 08:53:34 +02001612static const uint8_t ciph_data_128_iv1[] = {
1613 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, /* 12345678 */
1614 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, /* 9ABCDEF0 */
1615};
1616
Jerome Forissier0780ad42018-06-05 15:02:37 +02001617static const uint8_t ciph_data_128_iv2[] = {
1618 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
1619 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
1620};
1621
Pascal Brandc639ac82015-07-02 08:53:34 +02001622static const uint8_t ciph_data_64_iv1[] = {
1623 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, /* 12345678 */
1624};
1625
1626static const uint8_t ciph_data_in2[] = {
1627 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef
1628};
1629
1630static const uint8_t ciph_data_aes_ecb_nopad_out1[] = {
1631 0xA5, 0xBE, 0x14, 0xD5, 0x01, 0x05, 0x24, 0x48, /* ......$H */
1632 0x58, 0x1A, 0x6B, 0x82, 0xD4, 0x41, 0xD2, 0xB3, /* X.k..A.. */
1633 0xBB, 0xF9, 0xAE, 0x37, 0x94, 0xAC, 0x18, 0x50, /* ...7...P */
1634 0x87, 0x09, 0xCC, 0x3F, 0x43, 0xD2, 0xC2, 0xB7, /* ...?C... */
1635 0xD7, 0x6F, 0x84, 0x07, 0xB4, 0x78, 0xCE, 0x34, /* .o...x.4 */
1636 0x48, 0xC9, 0x16, 0x86, 0x42, 0xB8, 0xFF, 0xCF, /* H...B... */
1637};
1638
1639static const uint8_t ciph_data_aes_cbc_nopad_out1[] = {
1640 0x8D, 0x9F, 0x88, 0xD8, 0xAF, 0x9F, 0xC1, 0x3B, /* .......; */
1641 0x02, 0x15, 0x43, 0x6A, 0x8C, 0x1E, 0x34, 0x5C, /* ..Cj..4\ */
1642 0x83, 0xF4, 0x85, 0x3E, 0x43, 0x0F, 0xE5, 0x5F, /* ...>C.._ */
1643 0x81, 0x4C, 0xC0, 0x28, 0x3F, 0xD9, 0x98, 0x53, /* .L.(?..S */
1644 0xB1, 0x44, 0x51, 0x38, 0x21, 0xAB, 0x10, 0xCE, /* .DQ8!... */
1645 0xC2, 0xEC, 0x65, 0x54, 0xDD, 0x5C, 0xEA, 0xDC, /* ..eT.\.. */
1646};
1647
1648static const uint8_t ciph_data_aes_ctr_out1[] = {
1649 0xD2, 0xDD, 0x11, 0xA8, 0xF7, 0xB0, 0xAE, 0x55, /* .......U */
1650 0xBE, 0x61, 0x7A, 0xE6, 0xA1, 0x6C, 0x79, 0xF4, /* .az..ly. */
1651 0x62, 0x51, 0x7B, 0xE9, 0x7C, 0xA0, 0x31, 0x0C, /* bQ{.|.1. */
1652 0x24, 0x15, 0x70, 0x7F, 0x47, 0x37, 0x69, 0xE0, /* $.p.G7i. */
1653 0x24, 0xC3, 0x29, 0xCD, 0xF2, 0x26, 0x69, 0xFF, /* $.)..&i. */
1654 0x72, 0x0E, 0x3C, 0xD1, 0xA1, 0x2F, 0x5D, 0x33, /* r.<../]3 */
1655};
1656
1657static const uint8_t ciph_data_aes_ctr_out2[] = {
1658 0xD2, 0xDD, 0x11, 0xA8, 0xF7, 0xB0, 0xAE, 0x55, /* .......U */
1659 0xBE, 0x61, 0x7A, 0xE6, 0xA1, 0x6C, 0x79, 0xF4, /* .az..ly. */
1660 0x62, 0x51, 0x7B, 0xE9, 0x7C, 0xA0, 0x31, 0x0C, /* bQ{.|.1. */
1661 0x24, 0x15, 0x70, 0x7F, 0x47, 0x37, 0x69, 0xE0, /* $.p.G7i. */
1662 0x24, 0xC3, 0x29, 0xCD, 0xF2, 0x26, 0x69, 0xFF, /* $.)..&i. */
1663 0x72, 0x0E, 0x3C, 0xD1, 0xA1, /* r.<.. */
1664};
1665
Jerome Forissier45218eb2018-04-11 13:03:26 +02001666static const uint8_t ciph_data_aes_ctr_out4[] = {
1667 0xD2, 0xDD, 0x11, 0xA8, 0xF7, 0xB0, 0xAE, 0x55, /* .......U */
1668 0xBE, 0x61, 0x7A, 0xE6, 0xA1, 0x6C, 0x79, 0xF4, /* .az..ly. */
1669 0x62, 0x51, 0x7B, 0xE9, 0x7C, 0xA0, 0x31, 0x0C, /* bQ{.|.1. */
1670 0x24, 0x15, 0x70, 0x7F, 0x47, 0x37, 0x69, 0xE0, /* $.p.G7i. */
1671 0x24, 0xC3, 0x29, 0xCD, 0xF2, 0x26, 0x69, 0xFF, /* $.)..&i. */
1672 0x72, 0x0E, 0x3C, 0xD1, 0xA1, 0x2F, 0x5D, 0x33, /* r.<../]3 */
1673 0x9F, 0xD7, 0x0C, 0x92, 0xD4, 0xA5, 0x9D, 0x06, /* ........ */
1674 0x01, 0x80, 0x38, 0xCD, 0xC2, 0x71, 0x5D, 0x4A, /* ..8..q]J */
1675};
1676
Jerome Forissier0780ad42018-06-05 15:02:37 +02001677static const uint8_t ciph_data_aes_ctr_out5[] = {
1678 0xbb, 0xfe, 0x07, 0x04, 0x1c, 0x8e, 0x09, 0x61,
1679 0xfb, 0xb1, 0x7c, 0xa5, 0x4d, 0x2b, 0x30, 0xf6,
1680 0x26, 0x9e, 0xff, 0x61, 0x18, 0x47, 0xc6, 0x06,
1681 0x81, 0x02, 0x84, 0xcd, 0x9c, 0x4b, 0x6d, 0x21,
1682 0xe2, 0x64, 0xa6, 0x50, 0x7f, 0x28, 0x81, 0x6f,
1683 0x29, 0xda, 0xd5, 0x56, 0x3f, 0x46, 0xac, 0xca,
1684 0x37, 0xe7, 0x77, 0x36, 0xbc, 0x76, 0x39, 0x57,
1685 0xaa, 0x67, 0x1b, 0x2a, 0xe6, 0x36, 0x57, 0x6d,
Jerome Forissierbf9009e2018-06-05 18:44:42 +02001686 0x2a, 0xb8, 0x77, 0x41, 0xc2, 0x4e, 0x4f, 0x27,
1687 0x4c, 0x34, 0x7a, 0x01, 0x6a, 0xda, 0x75, 0x75,
1688 0x3e, 0x68, 0xb2
Jerome Forissier0780ad42018-06-05 15:02:37 +02001689};
1690
Pascal Brandc639ac82015-07-02 08:53:34 +02001691static const uint8_t ciph_data_aes_cbc_vect1_key[] = {
1692 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1693 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1694};
1695
1696static const uint8_t ciph_data_aes_cbc_vect1_iv[] = {
1697 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
1698 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
1699};
1700
1701static const uint8_t ciph_data_aes_cbc_vect1_ptx[] = {
1702 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x20, 0x62, /* Cipher b */
1703 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x63, 0x68, 0x61, /* lock cha */
1704 0x69, 0x6E, 0x69, 0x6E, 0x67, 0x20, 0x28, 0x43, /* ining (C */
1705 0x42, 0x43, 0x29, 0x20, 0x69, 0x73, 0x20, 0x61, /* BC) is a */
1706 0x20, 0x63, 0x6F, 0x6D, 0x6D, 0x6F, 0x6E, 0x20, /* common */
1707 0x63, 0x68, 0x61, 0x69, 0x6E, 0x69, 0x6E, 0x67, /* chaining */
1708 0x20, 0x6D, 0x6F, 0x64, 0x65, 0x20, 0x69, 0x6E, /* mode in */
1709 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, /* which t */
1710 0x68, 0x65, 0x20, 0x70, 0x72, 0x65, 0x76, 0x69, /* he previ */
1711 0x6F, 0x75, 0x73, 0x20, 0x62, 0x6C, 0x6F, 0x63, /* ous bloc */
1712 0x6B, 0x27, 0x73, 0x20, 0x63, 0x69, 0x70, 0x68, /* k's ciph */
1713 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, 0x20, 0x69, /* ertext i */
1714 0x73, 0x20, 0x78, 0x6F, 0x72, 0x65, 0x64, 0x20, /* s xored */
1715 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, /* with the */
1716 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, /* current */
1717 0x20, 0x62, 0x6C, 0x6F, 0x63, 0x6B, 0x27, 0x73, /* block's */
1718 0x20, 0x70, 0x6C, 0x61, 0x69, 0x6E, 0x74, 0x65, /* plainte */
1719 0x78, 0x74, 0x20, 0x62, 0x65, 0x66, 0x6F, 0x72, /* xt befor */
1720 0x65, 0x20, 0x65, 0x6E, 0x63, 0x72, 0x79, 0x70, /* e encryp */
1721 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x2E, 0x2E, 0x2E, /* tion.... */
1722};
1723
1724static const uint8_t ciph_data_aes_cbc_vect1_ctx[] = {
1725 0xDD, 0x16, 0xC3, 0x47, 0x69, 0xEC, 0xF5, 0x86, /* ...Gi... */
1726 0x20, 0xB4, 0xF7, 0xE3, 0xB9, 0x36, 0xE8, 0xAC, /* ....6.. */
1727 0xC9, 0xA2, 0x11, 0x71, 0x3B, 0x10, 0x9D, 0x45, /* ...q;..E */
1728 0xCA, 0xE2, 0x49, 0xA6, 0x4E, 0x56, 0x07, 0xC5, /* ..I.NV.. */
1729 0xCE, 0xA3, 0x14, 0xB5, 0x30, 0x1B, 0x63, 0xBB, /* ....0.c. */
1730 0x2D, 0x6F, 0xE9, 0xCA, 0x0B, 0x00, 0x31, 0x3F, /* -o....1? */
1731 0xA4, 0x9A, 0x39, 0xE1, 0xC8, 0xD2, 0x24, 0x95, /* ..9...$. */
1732 0x14, 0xE9, 0xD2, 0x43, 0xE8, 0xA8, 0x1E, 0x0A, /* ...C.... */
1733 0xFE, 0x9D, 0x4F, 0xF5, 0xBB, 0x16, 0xB9, 0x54, /* ..O....T */
1734 0x78, 0x07, 0x94, 0x05, 0x8E, 0x47, 0xC3, 0xCB, /* x....G.. */
1735 0x7C, 0xEC, 0xF4, 0xF8, 0xF2, 0xA4, 0x59, 0x6E, /* |.....Yn */
1736 0xED, 0xAD, 0x7F, 0x62, 0xAF, 0x89, 0xA8, 0x5B, /* ...b...[ */
1737 0x75, 0xD4, 0x73, 0xE3, 0xBA, 0x9F, 0x9A, 0xD2, /* u.s..... */
1738 0x0F, 0xFD, 0x3C, 0xE6, 0xC6, 0xA4, 0xD6, 0x6C, /* ..<....l */
1739 0x6A, 0x09, 0xE2, 0x16, 0xB0, 0x8C, 0x69, 0x3C, /* j.....i< */
1740 0xC8, 0x1C, 0xE4, 0x3E, 0x86, 0x4D, 0xB0, 0x2B, /* ...>.M.+ */
1741 0x29, 0xA0, 0x5A, 0xA3, 0x67, 0xBA, 0xDC, 0x11, /* ).Z.g... */
1742 0x08, 0x5E, 0x69, 0xB4, 0x6F, 0xA5, 0xE2, 0xB8, /* .^i.o... */
1743 0xC9, 0x6E, 0x83, 0x7E, 0x35, 0xC8, 0xA7, 0xA0, /* .n.~5... */
1744 0x33, 0xA3, 0xB1, 0x4B, 0x5A, 0x92, 0x51, 0x2E, /* 3..KZ.Q. */
1745};
1746
1747/* AES-CTS test vectors from http://tools.ietf.org/html/rfc3962
1748 * and http://tools.ietf.org/html/draft-raeburn-krb-rijndael-krb-02 */
1749static const uint8_t ciph_data_aes_cts_vect1_key[] = {
1750 0x63, 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x20,
1751 0x74, 0x65, 0x72, 0x69, 0x79, 0x61, 0x6b, 0x69
1752};
1753
1754static const uint8_t ciph_data_aes_cts_vect1_iv[16] = {
1755 0x00
1756};
1757
1758static const uint8_t ciph_data_aes_cts_vect1_ptx[] = {
1759 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1760 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1761 0x20
1762};
1763
1764static const uint8_t ciph_data_aes_cts_vect1_ctx[] = {
1765 0xc6, 0x35, 0x35, 0x68, 0xf2, 0xbf, 0x8c, 0xb4,
1766 0xd8, 0xa5, 0x80, 0x36, 0x2d, 0xa7, 0xff, 0x7f,
1767 0x97
1768};
1769
1770#define ciph_data_aes_cts_vect2_key ciph_data_aes_cts_vect1_key
1771#define ciph_data_aes_cts_vect2_iv ciph_data_aes_cts_vect1_iv
1772static const uint8_t ciph_data_aes_cts_vect2_ptx[] = {
1773 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1774 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1775 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
1776 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20
1777};
1778
1779static const uint8_t ciph_data_aes_cts_vect2_ctx[] = {
1780 0xfc, 0x00, 0x78, 0x3e, 0x0e, 0xfd, 0xb2, 0xc1,
1781 0xd4, 0x45, 0xd4, 0xc8, 0xef, 0xf7, 0xed, 0x22,
1782 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
1783 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5
1784};
1785
1786#define ciph_data_aes_cts_vect3_key ciph_data_aes_cts_vect1_key
1787#define ciph_data_aes_cts_vect3_iv ciph_data_aes_cts_vect1_iv
1788static const uint8_t ciph_data_aes_cts_vect3_ptx[] = {
1789 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1790 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1791 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
1792 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43,
1793};
1794
1795static const uint8_t ciph_data_aes_cts_vect3_ctx[] = {
1796 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
1797 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8,
1798 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
1799 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
1800};
1801
1802#define ciph_data_aes_cts_vect4_key ciph_data_aes_cts_vect1_key
1803#define ciph_data_aes_cts_vect4_iv ciph_data_aes_cts_vect1_iv
1804static const uint8_t ciph_data_aes_cts_vect4_ptx[] = {
1805 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1806 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1807 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
1808 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43,
1809 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x2c, 0x20,
1810 0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2c,
1811};
1812
1813static const uint8_t ciph_data_aes_cts_vect4_ctx[] = {
1814 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
1815 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
1816 0xb3, 0xff, 0xfd, 0x94, 0x0c, 0x16, 0xa1, 0x8c,
1817 0x1b, 0x55, 0x49, 0xd2, 0xf8, 0x38, 0x02, 0x9e,
1818 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
1819 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5,
1820};
1821
1822#define ciph_data_aes_cts_vect5_key ciph_data_aes_cts_vect1_key
1823#define ciph_data_aes_cts_vect5_iv ciph_data_aes_cts_vect1_iv
1824static const uint8_t ciph_data_aes_cts_vect5_ptx[] = {
1825 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1826 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1827 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
1828 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43,
1829 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x2c, 0x20,
1830 0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2c, 0x20,
1831};
1832
1833static const uint8_t ciph_data_aes_cts_vect5_ctx[] = {
1834 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
1835 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
1836 0x9d, 0xad, 0x8b, 0xbb, 0x96, 0xc4, 0xcd, 0xc0,
1837 0x3b, 0xc1, 0x03, 0xe1, 0xa1, 0x94, 0xbb, 0xd8,
1838 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
1839 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8,
1840};
1841
1842#define ciph_data_aes_cts_vect6_key ciph_data_aes_cts_vect1_key
1843#define ciph_data_aes_cts_vect6_iv ciph_data_aes_cts_vect1_iv
1844static const uint8_t ciph_data_aes_cts_vect6_ptx[] = {
1845 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1846 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1847 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
1848 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43,
1849 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x2c, 0x20,
1850 0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2c, 0x20,
1851 0x61, 0x6e, 0x64, 0x20, 0x77, 0x6f, 0x6e, 0x74,
1852 0x6f, 0x6e, 0x20, 0x73, 0x6f, 0x75, 0x70, 0x2e,
1853};
1854
1855static const uint8_t ciph_data_aes_cts_vect6_ctx[] = {
1856 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
1857 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
1858 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
1859 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8,
1860 0x48, 0x07, 0xef, 0xe8, 0x36, 0xee, 0x89, 0xa5,
1861 0x26, 0x73, 0x0d, 0xbc, 0x2f, 0x7b, 0xc8, 0x40,
1862 0x9d, 0xad, 0x8b, 0xbb, 0x96, 0xc4, 0xcd, 0xc0,
1863 0x3b, 0xc1, 0x03, 0xe1, 0xa1, 0x94, 0xbb, 0xd8,
1864};
1865
Jerome Forissiered00e162017-01-20 09:22:52 +01001866/*
1867 * Test case for https://github.com/OP-TEE/optee_os/issues/1203
1868 * 80 bytes of data, processed in two steps (32 + 48).
1869 */
1870
1871#define ciph_data_aes_cts_issue1203_key ciph_data_aes_cts_vect1_key
1872
1873static const uint8_t ciph_data_aes_cts_issue1203_iv[] = {
1874 0x5b, 0x11, 0x7b, 0xf9, 0x83, 0x6a, 0x01, 0x27,
1875 0x1d, 0x2a, 0xae, 0x0a, 0xd3, 0x27, 0x35, 0x81,
1876};
1877
1878static const uint8_t ciph_data_aes_cts_issue1203_ptx[] = {
1879 0x33, 0x2a, 0xf4, 0x8c, 0x18, 0xa1, 0x30, 0x7c,
1880 0xa7, 0x52, 0x76, 0xca, 0xa6, 0x68, 0xad, 0xf6,
1881 0x1e, 0xba, 0xc9, 0x66, 0x66, 0x52, 0x1a, 0xe7,
1882 0x3e, 0xbc, 0xba, 0x60, 0x95, 0x71, 0x04, 0x5e,
1883 0xb4, 0xb7, 0x10, 0xd7, 0x93, 0x6d, 0x5f, 0x9a,
1884 0xb8, 0xbb, 0x6b, 0xb0, 0x6d, 0x47, 0x93, 0x41,
1885 0x29, 0x21, 0xf2, 0x84, 0xf5, 0xb2, 0xf2, 0x6d,
1886 0xbe, 0xe5, 0x8a, 0x2b, 0x58, 0x8d, 0x1b, 0x5e,
1887 0x41, 0x04, 0xba, 0x9e, 0x92, 0xe9, 0x52, 0xb6,
1888 0x8b, 0x1e, 0x36, 0x72, 0x91, 0xe4, 0x56, 0x66,
1889};
1890
1891/*
1892 * Ciphertext was generated by an online tool for AES CBC.
1893 * Since the input size is a multiple of the block size, and the ciphertext
1894 * format is CS3, the output is the same as plain AES CBC with the last
1895 * two blocks swapped.
1896 */
1897static const uint8_t ciph_data_aes_cts_issue1203_ctx[] = {
1898 0x6c, 0xfe, 0xef, 0x6a, 0x1c, 0x8f, 0xd3, 0xc3,
1899 0x66, 0xc4, 0xd9, 0x0e, 0xbe, 0x24, 0x17, 0x3f,
1900 0xcd, 0x19, 0xc9, 0xd2, 0x10, 0x3f, 0xcf, 0xdc,
1901 0xe9, 0x05, 0xab, 0xd5, 0x1a, 0x31, 0x41, 0x77,
1902 0x3b, 0xd7, 0x6a, 0x26, 0xae, 0x0d, 0xc9, 0x47,
1903 0x77, 0xd4, 0xa7, 0xd5, 0x73, 0x88, 0x9e, 0xde,
1904 0x72, 0x66, 0xe0, 0xe2, 0x3d, 0x62, 0x91, 0x22,
1905 0xae, 0x11, 0x01, 0x97, 0x22, 0x6a, 0x45, 0xa9,
1906 0xba, 0x56, 0xd2, 0xbc, 0x55, 0x2d, 0x99, 0x4d,
1907 0x3d, 0x22, 0x27, 0x9a, 0xac, 0x66, 0x2f, 0xf5,
1908};
1909
Pascal Brandc639ac82015-07-02 08:53:34 +02001910static const uint8_t ciph_data_des_ecb_nopad_out1[] = {
1911 0x46, 0x2B, 0x91, 0xA8, 0x55, 0xE6, 0x7E, 0x75, /* F+..U.~u */
1912 0x5E, 0x53, 0xF4, 0x8F, 0x29, 0x41, 0x4E, 0xEF, /* ^S..)AN. */
1913 0x32, 0x1B, 0x58, 0x42, 0x9B, 0xB4, 0x3A, 0x1F, /* 2.XB..:. */
1914 0x9A, 0xEA, 0xA4, 0xB4, 0xCD, 0xE9, 0x87, 0x7C, /* .......| */
1915 0xC0, 0x05, 0x34, 0xED, 0x86, 0x3C, 0x2A, 0x81, /* ..4..<.. */
1916 0x5E, 0x93, 0x0E, 0x86, 0xA9, 0xBB, 0x80, 0xFF, /* ^....... */
1917};
1918
1919static const uint8_t ciph_data_des_ecb_nopad_out2[] = {
1920 0x85, 0xE8, 0x13, 0x54, 0x0F, 0x0A, 0xB4, 0x05
1921};
1922
1923static const uint8_t ciph_data_des_cbc_nopad_out1[] = {
1924 0xAD, 0xD6, 0xD6, 0x3E, 0x88, 0xD0, 0xDD, 0xD4, /* ...>.... */
1925 0x9A, 0x93, 0x95, 0xA0, 0x86, 0x22, 0x5B, 0x9E, /* ....."[. */
1926 0x84, 0x0C, 0x6F, 0x12, 0x04, 0x11, 0x6F, 0xD4, /* ..o...o. */
1927 0x12, 0x29, 0xC6, 0x78, 0x0C, 0xFB, 0x58, 0x5B, /* .).x..X[ */
1928 0x66, 0x82, 0x0E, 0x52, 0xDC, 0x25, 0x16, 0x51, /* f..R.%.Q */
1929 0x69, 0xDF, 0xFE, 0x4E, 0x11, 0x1D, 0x9D, 0x08, /* i..N.... */
1930};
1931
1932static const uint8_t ciph_data_des3_ecb_nopad_out1[] = {
1933 0xA7, 0x46, 0xEC, 0xA8, 0x6A, 0x7F, 0x4A, 0xF1, /* .F..j.J. */
1934 0x44, 0x60, 0x37, 0x3B, 0x7F, 0x76, 0xE5, 0xFF, /* D`7;.v.. */
1935 0xC1, 0xE7, 0xA5, 0x04, 0x9C, 0x29, 0x5C, 0xA5, /* .....)\. */
1936 0xDD, 0xC8, 0xEE, 0x36, 0x1F, 0x48, 0xE0, 0xA9, /* ...6.H.. */
1937 0x82, 0x2D, 0x53, 0x84, 0x49, 0x69, 0x78, 0xFA, /* .-S.Iix. */
1938 0x23, 0x69, 0x1D, 0xF7, 0x08, 0x38, 0x44, 0x05, /* #i...8D. */
1939};
1940
1941static const uint8_t ciph_data_des3_cbc_nopad_out1[] = {
1942 0x18, 0x09, 0xEB, 0x98, 0xE4, 0x58, 0x72, 0x11, /* .....Xr. */
1943 0x30, 0x58, 0xAB, 0x38, 0xB0, 0xC9, 0x2B, 0xED, /* 0X.8..+. */
1944 0xDA, 0xC5, 0xE8, 0xA9, 0xF6, 0x8A, 0xA7, 0x80, /* ........ */
1945 0xBE, 0x54, 0x1F, 0x63, 0xF6, 0xEE, 0xA2, 0x4C, /* .T.c...L */
1946 0x7C, 0xEB, 0x84, 0x7D, 0xDA, 0xCA, 0x1E, 0xB2, /* |..}.... */
1947 0xED, 0x5E, 0x96, 0xB8, 0x01, 0x4B, 0x77, 0x02, /* .^...Kw. */
1948};
1949
1950static const uint8_t ciph_data_des2_ecb_nopad_out1[] = {
1951 0xAB, 0x12, 0xB6, 0xE2, 0x4A, 0x3A, 0x26, 0x14, /* ....J:&. */
1952 0xF0, 0x7D, 0x23, 0xD0, 0x55, 0xDF, 0x5C, 0x16, /* .}#.U.\. */
1953 0x43, 0x59, 0x1E, 0x44, 0x01, 0x76, 0xD7, 0x50, /* CY.D.v.P */
1954 0x44, 0xC0, 0x15, 0xDF, 0x2E, 0x7F, 0x8B, 0xC5, /* D....... */
1955 0xFF, 0x8B, 0x87, 0xFE, 0x33, 0xD7, 0xCB, 0x2C, /* ....3.., */
1956 0xDA, 0x79, 0x6F, 0xA4, 0x05, 0x2B, 0x30, 0xCE, /* .yo..+0. */
1957};
1958
1959static const uint8_t ciph_data_des2_cbc_nopad_out1[] = {
1960 0x47, 0x2F, 0xB1, 0x83, 0xC4, 0xBB, 0x93, 0x16, /* G/...... */
1961 0x73, 0xF9, 0xAD, 0x6F, 0x00, 0xF9, 0xCB, 0x4A, /* s..o...J */
1962 0x0F, 0x4F, 0x75, 0x75, 0xFB, 0x39, 0x0B, 0xFC, /* .Ouu.9.. */
1963 0x9F, 0x48, 0x52, 0xAD, 0xA2, 0x75, 0x2C, 0xF1, /* .HR..u, . */
1964 0x7D, 0xC3, 0x8F, 0x16, 0xCF, 0xC9, 0x76, 0x29, /* }.....v) */
1965 0x1A, 0xBF, 0xB3, 0xD9, 0x10, 0x7E, 0xAA, 0x49, /* .....~.I */
1966};
1967
Jerome Forissiere73e0fb2019-12-12 17:08:03 +01001968/* SM4 ECB */
1969
1970static const uint8_t ciph_data_sm4_key1[] = {
1971 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
1972 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
1973};
1974
1975static const uint8_t ciph_data_sm4_in1[] = {
1976 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
1977 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
1978};
1979
1980static const uint8_t ciph_data_sm4_ecb_nopad_out1[] = {
1981 0x68, 0x1e, 0xdf, 0x34, 0xd2, 0x06, 0x96, 0x5e,
1982 0x86, 0xb3, 0xe9, 0x4f, 0x53, 0x6e, 0x42, 0x46,
1983};
1984
1985/*
1986 * SM4 CBC
1987 * https://tools.ietf.org/html/draft-ribose-cfrg-sm4-10#appendix-A.2.2.1
1988 */
1989static const uint8_t ciph_data_sm4_cbc_a221_key[] = {
1990 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
1991 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
1992};
1993
1994static const uint8_t ciph_data_sm4_cbc_a221_iv[] = {
1995 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1996 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1997};
1998
1999static const uint8_t ciph_data_sm4_cbc_a221_in[] = {
2000 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb,
2001 0xcc, 0xcc, 0xcc, 0xcc, 0xdd, 0xdd, 0xdd, 0xdd,
2002 0xee, 0xee, 0xee, 0xee, 0xff, 0xff, 0xff, 0xff,
2003 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb,
2004};
2005
2006static const uint8_t ciph_data_sm4_cbc_a221_out[] = {
2007 0x78, 0xeb, 0xb1, 0x1c, 0xc4, 0x0b, 0x0a, 0x48,
2008 0x31, 0x2a, 0xae, 0xb2, 0x04, 0x02, 0x44, 0xcb,
2009 0x4c, 0xb7, 0x01, 0x69, 0x51, 0x90, 0x92, 0x26,
2010 0x97, 0x9b, 0x0d, 0x15, 0xdc, 0x6a, 0x8f, 0x6d,
2011};
2012
2013/*
2014 * SM4 CBC
2015 * https://tools.ietf.org/html/draft-ribose-cfrg-sm4-10#appendix-A.2.2.2
2016 */
2017static const uint8_t ciph_data_sm4_cbc_a222_key[] = {
2018 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
2019 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
2020};
2021
2022static const uint8_t ciph_data_sm4_cbc_a222_iv[] = {
2023 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2024 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
2025};
2026
2027static const uint8_t ciph_data_sm4_cbc_a222_in[] = {
2028 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb,
2029 0xcc, 0xcc, 0xcc, 0xcc, 0xdd, 0xdd, 0xdd, 0xdd,
2030 0xee, 0xee, 0xee, 0xee, 0xff, 0xff, 0xff, 0xff,
2031 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb,
2032};
2033
2034static const uint8_t ciph_data_sm4_cbc_a222_out[] = {
2035 0x0d, 0x3a, 0x6d, 0xdc, 0x2d, 0x21, 0xc6, 0x98,
2036 0x85, 0x72, 0x15, 0x58, 0x7b, 0x7b, 0xb5, 0x9a,
2037 0x91, 0xf2, 0xc1, 0x47, 0x91, 0x1a, 0x41, 0x44,
2038 0x66, 0x5e, 0x1f, 0xa1, 0xd4, 0x0b, 0xae, 0x38,
2039};
2040
2041/*
2042 * SM4 CTR
2043 * https://tools.ietf.org/html/draft-ribose-cfrg-sm4-10#appendix-A.2.5.1
2044 */
2045static const uint8_t ciph_data_sm4_ctr_a251_key[] = {
2046 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
2047 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
2048};
2049
2050static const uint8_t ciph_data_sm4_ctr_a251_iv[] = {
2051 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2052 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
2053};
2054
2055static const uint8_t ciph_data_sm4_ctr_a251_in[] = {
2056 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
2057 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
2058 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
2059 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
2060 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee,
2061 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2062 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
2063 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
2064};
2065
2066static const uint8_t ciph_data_sm4_ctr_a251_out[] = {
2067 0xac, 0x32, 0x36, 0xcb, 0x97, 0x0c, 0xc2, 0x07,
2068 0x91, 0x36, 0x4c, 0x39, 0x5a, 0x13, 0x42, 0xd1,
2069 0xa3, 0xcb, 0xc1, 0x87, 0x8c, 0x6f, 0x30, 0xcd,
2070 0x07, 0x4c, 0xce, 0x38, 0x5c, 0xdd, 0x70, 0xc7,
2071 0xf2, 0x34, 0xbc, 0x0e, 0x24, 0xc1, 0x19, 0x80,
2072 0xfd, 0x12, 0x86, 0x31, 0x0c, 0xe3, 0x7b, 0x92,
2073 0x6e, 0x02, 0xfc, 0xd0, 0xfa, 0xa0, 0xba, 0xf3,
2074 0x8b, 0x29, 0x33, 0x85, 0x1d, 0x82, 0x45, 0x14,
2075};
2076
2077/*
2078 * SM4 CTR
2079 * https://tools.ietf.org/html/draft-ribose-cfrg-sm4-10#appendix-A.2.5.2
2080 */
2081static const uint8_t ciph_data_sm4_ctr_a252_key[] = {
2082 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
2083 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
2084};
2085
2086static const uint8_t ciph_data_sm4_ctr_a252_iv[] = {
2087 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2088 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
2089};
2090
2091static const uint8_t ciph_data_sm4_ctr_a252_in[] = {
2092 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
2093 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
2094 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
2095 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
2096 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee,
2097 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2098 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
2099 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
2100};
2101
2102static const uint8_t ciph_data_sm4_ctr_a252_out[] = {
2103 0x5d, 0xcc, 0xcd, 0x25, 0xb9, 0x5a, 0xb0, 0x74,
2104 0x17, 0xa0, 0x85, 0x12, 0xee, 0x16, 0x0e, 0x2f,
2105 0x8f, 0x66, 0x15, 0x21, 0xcb, 0xba, 0xb4, 0x4c,
2106 0xc8, 0x71, 0x38, 0x44, 0x5b, 0xc2, 0x9e, 0x5c,
2107 0x0a, 0xe0, 0x29, 0x72, 0x05, 0xd6, 0x27, 0x04,
2108 0x17, 0x3b, 0x21, 0x23, 0x9b, 0x88, 0x7f, 0x6c,
2109 0x8c, 0xb5, 0xb8, 0x00, 0x91, 0x7a, 0x24, 0x88,
2110 0x28, 0x4b, 0xde, 0x9e, 0x16, 0xea, 0x29, 0x06,
2111};
2112
Pascal Brandc639ac82015-07-02 08:53:34 +02002113struct xtest_ciph_case {
2114 uint32_t algo;
2115 uint32_t mode;
2116 uint32_t key_type;
2117 const uint8_t *key1;
2118 size_t key1_len;
2119 const uint8_t *key2;
2120 size_t key2_len;
2121 const uint8_t *iv;
2122 size_t iv_len;
2123 size_t in_incr;
2124 const uint8_t *in;
2125 size_t in_len;
2126 const uint8_t *out;
2127 size_t out_len;
2128 size_t line;
2129};
2130
2131#define XTEST_CIPH_CASE_NO_IV(algo, key_type, key, in_incr, ptx, ctx) \
2132 { (algo), TEE_MODE_ENCRYPT, (key_type), (key), ARRAY_SIZE(key), \
2133 NULL, 0, NULL, 0, \
2134 (in_incr), (ptx), ARRAY_SIZE(ptx), (ctx), ARRAY_SIZE(ctx), \
2135 __LINE__ }, \
2136 { (algo), TEE_MODE_DECRYPT, (key_type), (key), ARRAY_SIZE(key), \
2137 NULL, 0, NULL, 0, \
2138 (in_incr), (ctx), ARRAY_SIZE(ctx), (ptx), ARRAY_SIZE(ptx), __LINE__ }
2139
2140#define XTEST_CIPH_CASE(algo, key_type, key, iv, in_incr, ptx, ctx) \
2141 { (algo), TEE_MODE_ENCRYPT, (key_type), (key), ARRAY_SIZE(key), \
2142 NULL, 0, iv, ARRAY_SIZE(iv), (in_incr), (ptx), ARRAY_SIZE(ptx), \
2143 (ctx), ARRAY_SIZE(ctx), __LINE__ }, \
2144 { (algo), TEE_MODE_DECRYPT, (key_type), (key), ARRAY_SIZE(key), \
2145 NULL, 0, iv, ARRAY_SIZE(iv), (in_incr), (ctx), ARRAY_SIZE(ctx), \
2146 (ptx), ARRAY_SIZE(ptx), __LINE__ }
2147
2148#define XTEST_CIPH_CASE_AES_XTS(vect, in_incr) \
2149 { TEE_ALG_AES_XTS, TEE_MODE_ENCRYPT, TEE_TYPE_AES, \
2150 ciph_data_aes_xts_ ## vect ## _key1, \
2151 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _key1), \
2152 ciph_data_aes_xts_ ## vect ## _key2, \
2153 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _key2), \
2154 ciph_data_aes_xts_ ## vect ## _iv, \
2155 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _iv), \
2156 (in_incr), \
2157 ciph_data_aes_xts_ ## vect ## _ptx, \
2158 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _ptx), \
2159 ciph_data_aes_xts_ ## vect ## _ctx, \
2160 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _ctx), __LINE__ }, \
2161 { TEE_ALG_AES_XTS, TEE_MODE_DECRYPT, TEE_TYPE_AES, \
2162 ciph_data_aes_xts_ ## vect ## _key1, \
2163 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _key1), \
2164 ciph_data_aes_xts_ ## vect ## _key2, \
2165 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _key2), \
2166 ciph_data_aes_xts_ ## vect ## _iv, \
2167 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _iv), \
2168 (in_incr), \
2169 ciph_data_aes_xts_ ## vect ## _ctx, \
2170 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _ctx), \
2171 ciph_data_aes_xts_ ## vect ## _ptx, \
2172 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _ptx), __LINE__ }
2173
2174#define XTEST_CIPH_CASE_AES_CBC(vect, in_incr) \
2175 XTEST_CIPH_CASE(TEE_ALG_AES_CBC_NOPAD, TEE_TYPE_AES, \
2176 ciph_data_aes_cbc_ ## vect ## _key, \
2177 ciph_data_aes_cbc_ ## vect ## _iv, \
2178 (in_incr), ciph_data_aes_cbc_ ## vect ## _ptx, \
2179 ciph_data_aes_cbc_ ## vect ## _ctx)
2180
2181#define XTEST_CIPH_CASE_AES_CTS(vect, in_incr) \
2182 XTEST_CIPH_CASE(TEE_ALG_AES_CTS, TEE_TYPE_AES, \
2183 ciph_data_aes_cts_ ## vect ## _key, \
2184 ciph_data_aes_cts_ ## vect ## _iv, \
2185 (in_incr), ciph_data_aes_cts_ ## vect ## _ptx, \
2186 ciph_data_aes_cts_ ## vect ## _ctx)
2187
2188static const struct xtest_ciph_case ciph_cases[] = {
2189 /* AES */
2190 XTEST_CIPH_CASE_NO_IV(TEE_ALG_AES_ECB_NOPAD, TEE_TYPE_AES,
2191 ciph_data_aes_key1, 11, ciph_data_in1,
2192 ciph_data_aes_ecb_nopad_out1),
2193 XTEST_CIPH_CASE(TEE_ALG_AES_CBC_NOPAD, TEE_TYPE_AES,
2194 ciph_data_aes_key1, ciph_data_128_iv1, 11,
2195 ciph_data_in1,
2196 ciph_data_aes_cbc_nopad_out1),
2197 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
2198 ciph_data_aes_key1, ciph_data_128_iv1, 13,
2199 ciph_data_in1,
2200 ciph_data_aes_ctr_out1),
2201 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
2202 ciph_data_aes_key1, ciph_data_128_iv1, 13,
2203 ciph_data_in3,
2204 ciph_data_aes_ctr_out2),
Jens Wiklander692efd12018-01-19 09:52:00 +01002205 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
2206 ciph_data_aes_key1, ciph_data_128_iv1, 16,
2207 ciph_data_in3,
2208 ciph_data_aes_ctr_out2),
Jerome Forissier45218eb2018-04-11 13:03:26 +02002209 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
2210 ciph_data_aes_key1, ciph_data_128_iv1, 16,
2211 ciph_data_in4,
2212 ciph_data_aes_ctr_out4),
Jerome Forissier0780ad42018-06-05 15:02:37 +02002213 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
2214 ciph_data_aes_key2, ciph_data_128_iv2, 11,
2215 ciph_data_in5,
2216 ciph_data_aes_ctr_out5),
Pascal Brandc639ac82015-07-02 08:53:34 +02002217
2218 XTEST_CIPH_CASE_AES_CBC(vect1, 11),
Jerome Forissierfc1bbc32018-06-12 10:13:04 +02002219 XTEST_CIPH_CASE_AES_CBC(vect1, 64),
Pascal Brandc639ac82015-07-02 08:53:34 +02002220
2221 /* AES-CTS */
2222 XTEST_CIPH_CASE_AES_CTS(vect1, 13),
2223 XTEST_CIPH_CASE_AES_CTS(vect2, 14),
2224 XTEST_CIPH_CASE_AES_CTS(vect3, 11),
2225 XTEST_CIPH_CASE_AES_CTS(vect4, 9),
2226 XTEST_CIPH_CASE_AES_CTS(vect5, 7),
2227 XTEST_CIPH_CASE_AES_CTS(vect6, 17),
2228 XTEST_CIPH_CASE_AES_CTS(vect6, 0x20),
Jerome Forissiered00e162017-01-20 09:22:52 +01002229 XTEST_CIPH_CASE_AES_CTS(issue1203, 32),
Pascal Brandc639ac82015-07-02 08:53:34 +02002230
2231 /* DES */
2232 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES_ECB_NOPAD, TEE_TYPE_DES,
2233 ciph_data_des_key1, 14, ciph_data_in1,
2234 ciph_data_des_ecb_nopad_out1),
2235 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES_ECB_NOPAD, TEE_TYPE_DES,
2236 ciph_data_des_key2, 3, ciph_data_in2,
2237 ciph_data_des_ecb_nopad_out2),
2238 XTEST_CIPH_CASE(TEE_ALG_DES_CBC_NOPAD, TEE_TYPE_DES,
2239 ciph_data_des_key1, ciph_data_64_iv1, 15, ciph_data_in1,
2240 ciph_data_des_cbc_nopad_out1),
2241
2242 /* DES3 */
2243 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES3_ECB_NOPAD, TEE_TYPE_DES3,
2244 ciph_data_des3_key1, 11, ciph_data_in1,
2245 ciph_data_des3_ecb_nopad_out1),
2246 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES3_ECB_NOPAD, TEE_TYPE_DES3,
2247 ciph_data_des3_key2, 3, ciph_data_in2,
2248 ciph_data_des_ecb_nopad_out2),
2249 XTEST_CIPH_CASE(TEE_ALG_DES3_CBC_NOPAD, TEE_TYPE_DES3,
2250 ciph_data_des3_key1, ciph_data_64_iv1, 11,
2251 ciph_data_in1,
2252 ciph_data_des3_cbc_nopad_out1),
2253
2254 /* DES2 */
2255 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES3_ECB_NOPAD, TEE_TYPE_DES3,
2256 ciph_data_des2_key1, 11, ciph_data_in1,
2257 ciph_data_des2_ecb_nopad_out1),
2258 XTEST_CIPH_CASE(TEE_ALG_DES3_CBC_NOPAD, TEE_TYPE_DES3,
2259 ciph_data_des2_key1, ciph_data_64_iv1, 11,
2260 ciph_data_in1,
2261 ciph_data_des2_cbc_nopad_out1),
Pascal Brandc639ac82015-07-02 08:53:34 +02002262
Pascal Brandc639ac82015-07-02 08:53:34 +02002263 /* AES-XTS */
2264 XTEST_CIPH_CASE_AES_XTS(vect1, 3),
2265 XTEST_CIPH_CASE_AES_XTS(vect2, 6),
2266 XTEST_CIPH_CASE_AES_XTS(vect3, 7),
2267 XTEST_CIPH_CASE_AES_XTS(vect4, 8),
2268 XTEST_CIPH_CASE_AES_XTS(vect5, 9),
2269 XTEST_CIPH_CASE_AES_XTS(vect6, 13),
2270 XTEST_CIPH_CASE_AES_XTS(vect7, 1),
2271 XTEST_CIPH_CASE_AES_XTS(vect8, 3),
2272 XTEST_CIPH_CASE_AES_XTS(vect9, 2),
2273 XTEST_CIPH_CASE_AES_XTS(vect10, 5),
2274 XTEST_CIPH_CASE_AES_XTS(vect11, 6),
2275 XTEST_CIPH_CASE_AES_XTS(vect12, 7),
2276 XTEST_CIPH_CASE_AES_XTS(vect13, 3),
2277 XTEST_CIPH_CASE_AES_XTS(vect14, 2),
2278 XTEST_CIPH_CASE_AES_XTS(vect15, 0),
2279 XTEST_CIPH_CASE_AES_XTS(vect16, 9),
2280 XTEST_CIPH_CASE_AES_XTS(vect17, 6),
2281 XTEST_CIPH_CASE_AES_XTS(vect18, 8),
2282 XTEST_CIPH_CASE_AES_XTS(vect19, 23),
Jerome Forissiere73e0fb2019-12-12 17:08:03 +01002283
2284 /* SM4 */
2285 XTEST_CIPH_CASE_NO_IV(TEE_ALG_SM4_ECB_NOPAD, TEE_TYPE_SM4,
2286 ciph_data_sm4_key1, 11, ciph_data_sm4_in1,
2287 ciph_data_sm4_ecb_nopad_out1),
2288 XTEST_CIPH_CASE(TEE_ALG_SM4_CBC_NOPAD, TEE_TYPE_SM4,
2289 ciph_data_sm4_cbc_a221_key, ciph_data_sm4_cbc_a221_iv,
2290 11, ciph_data_sm4_cbc_a221_in,
2291 ciph_data_sm4_cbc_a221_out),
2292 XTEST_CIPH_CASE(TEE_ALG_SM4_CBC_NOPAD, TEE_TYPE_SM4,
2293 ciph_data_sm4_cbc_a222_key, ciph_data_sm4_cbc_a222_iv,
2294 11, ciph_data_sm4_cbc_a222_in,
2295 ciph_data_sm4_cbc_a222_out),
2296 XTEST_CIPH_CASE(TEE_ALG_SM4_CTR, TEE_TYPE_SM4,
2297 ciph_data_sm4_ctr_a251_key, ciph_data_sm4_ctr_a251_iv,
2298 11, ciph_data_sm4_ctr_a251_in,
2299 ciph_data_sm4_ctr_a251_out),
2300 XTEST_CIPH_CASE(TEE_ALG_SM4_CTR, TEE_TYPE_SM4,
2301 ciph_data_sm4_ctr_a252_key, ciph_data_sm4_ctr_a252_iv,
2302 11, ciph_data_sm4_ctr_a252_in,
2303 ciph_data_sm4_ctr_a252_out),
Pascal Brandc639ac82015-07-02 08:53:34 +02002304};
2305
Jerome Forissier23256842018-02-16 09:25:35 +01002306static void xtest_tee_test_4003(ADBG_Case_t *c)
Pascal Brandc639ac82015-07-02 08:53:34 +02002307{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002308 TEEC_Session session = { };
2309 TEE_OperationHandle op = TEE_HANDLE_NULL;
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002310 TEE_OperationHandle op2 = TEE_HANDLE_NULL;
Pascal Brandc639ac82015-07-02 08:53:34 +02002311 TEE_ObjectHandle key1_handle = TEE_HANDLE_NULL;
2312 TEE_ObjectHandle key2_handle = TEE_HANDLE_NULL;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002313 uint8_t out[2048] = { };
2314 size_t out_size = 0;
2315 size_t out_offs = 0;
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002316 size_t out_offs2 = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002317 uint32_t ret_orig = 0;
2318 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02002319
2320 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2321 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
2322 &ret_orig)))
2323 return;
2324
2325 for (n = 0; n < ARRAY_SIZE(ciph_cases); n++) {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002326 TEE_Attribute key_attr = { };
2327 size_t key_size = 0;
2328 size_t op_key_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02002329
Jerome Forissier817d99f2020-01-22 16:33:12 +01002330 switch (ciph_cases[n].algo) {
2331 case TEE_ALG_SM4_CTR:
2332 case TEE_ALG_SM4_CBC_NOPAD:
2333 case TEE_ALG_SM4_ECB_NOPAD:
2334 if (!ta_crypt_cmd_is_algo_supported(c, &session,
2335 ciph_cases[n].algo, TEE_CRYPTO_ELEMENT_NONE)) {
2336 Do_ADBG_Log("SM4 not supported: skip subcase");
2337 continue;
2338 }
2339 break;
2340 default:
2341 break;
2342 }
2343
Pascal Brandc639ac82015-07-02 08:53:34 +02002344 Do_ADBG_BeginSubCase(c, "Cipher case %d algo 0x%x line %d",
2345 (int)n, (unsigned int)ciph_cases[n].algo,
2346 (int)ciph_cases[n].line);
2347
2348 key_attr.attributeID = TEE_ATTR_SECRET_VALUE;
2349 key_attr.content.ref.buffer = (void *)ciph_cases[n].key1;
2350 key_attr.content.ref.length = ciph_cases[n].key1_len;
2351
2352 key_size = key_attr.content.ref.length * 8;
2353 if (ciph_cases[n].key_type == TEE_TYPE_DES ||
2354 ciph_cases[n].key_type == TEE_TYPE_DES3)
2355 /* Exclude parity in bit size of key */
2356 key_size -= key_size / 8;
2357
2358 op_key_size = key_size;
2359 if (ciph_cases[n].key2 != NULL)
2360 op_key_size *= 2;
2361
2362 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2363 ta_crypt_cmd_allocate_operation(c, &session, &op,
2364 ciph_cases[n].algo, ciph_cases[n].mode,
2365 op_key_size)))
2366 goto out;
2367
2368 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002369 ta_crypt_cmd_allocate_operation(c, &session, &op2,
2370 ciph_cases[n].algo, ciph_cases[n].mode,
2371 op_key_size)))
2372 goto out;
2373
2374 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc639ac82015-07-02 08:53:34 +02002375 ta_crypt_cmd_allocate_transient_object(c, &session,
2376 ciph_cases[n].key_type, key_size,
2377 &key1_handle)))
2378 goto out;
2379
2380 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2381 ta_crypt_cmd_populate_transient_object(c, &session,
2382 key1_handle, &key_attr, 1)))
2383 goto out;
2384
2385 if (ciph_cases[n].key2 != NULL) {
2386 key_attr.content.ref.buffer =
2387 (void *)ciph_cases[n].key2;
2388 key_attr.content.ref.length = ciph_cases[n].key2_len;
2389
2390 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2391 ta_crypt_cmd_allocate_transient_object(c,
2392 &session, ciph_cases[n].key_type,
2393 key_attr.content.ref.length * 8,
2394 &key2_handle)))
2395 goto out;
2396
2397 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2398 ta_crypt_cmd_populate_transient_object(c,
2399 &session, key2_handle, &key_attr, 1)))
2400 goto out;
2401
2402 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2403 ta_crypt_cmd_set_operation_key2(c, &session, op,
2404 key1_handle, key2_handle)))
2405 goto out;
2406 } else {
2407 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2408 ta_crypt_cmd_set_operation_key(c, &session, op,
2409 key1_handle)))
2410 goto out;
2411 }
2412
2413 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2414 ta_crypt_cmd_free_transient_object(c, &session,
2415 key1_handle)))
2416 goto out;
2417 key1_handle = TEE_HANDLE_NULL;
2418
2419 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2420 ta_crypt_cmd_free_transient_object(c, &session,
2421 key2_handle)))
2422 goto out;
2423 key2_handle = TEE_HANDLE_NULL;
2424
2425 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2426 ta_crypt_cmd_cipher_init(c, &session, op,
2427 ciph_cases[n].iv, ciph_cases[n].iv_len)))
2428 goto out;
2429
2430 out_offs = 0;
2431 out_size = sizeof(out);
2432 memset(out, 0, sizeof(out));
2433 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2434 ta_crypt_cmd_cipher_update(c, &session, op,
2435 ciph_cases[n].in, ciph_cases[n].in_incr, out,
2436 &out_size)))
2437 goto out;
2438
Jerome Forissierd2d94b42017-06-02 16:39:34 +02002439 if (ciph_cases[n].algo == TEE_ALG_AES_CTR)
2440 ADBG_EXPECT_COMPARE_UNSIGNED(c, out_size, ==,
2441 ciph_cases[n].in_incr);
2442
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002443 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2444 ta_crypt_cmd_copy_operation(c, &session, op2, op)))
2445 goto out;
2446
Pascal Brandc639ac82015-07-02 08:53:34 +02002447 out_offs += out_size;
2448 out_size = sizeof(out) - out_offs;
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002449 out_offs2 = out_offs;
Pascal Brandc639ac82015-07-02 08:53:34 +02002450
2451 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2452 ta_crypt_cmd_cipher_do_final(c, &session, op,
2453 ciph_cases[n].in + ciph_cases[n].in_incr,
2454 ciph_cases[n].in_len - ciph_cases[n].in_incr,
2455 out + out_offs,
2456 &out_size)))
2457 goto out;
2458
2459 out_offs += out_size;
2460
2461 (void)ADBG_EXPECT_BUFFER(c, ciph_cases[n].out,
2462 ciph_cases[n].out_len, out, out_offs);
2463
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002464 /* test on the copied op2 */
2465 out_size = sizeof(out) - out_offs2;
2466
2467 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2468 ta_crypt_cmd_cipher_do_final(c, &session, op2,
2469 ciph_cases[n].in + ciph_cases[n].in_incr,
2470 ciph_cases[n].in_len - ciph_cases[n].in_incr,
2471 out + out_offs2,
2472 &out_size)))
2473 goto out;
2474
2475 out_offs2 += out_size;
2476
2477 ADBG_EXPECT_BUFFER(c, ciph_cases[n].out, ciph_cases[n].out_len,
2478 out, out_offs2);
2479
Pascal Brandc639ac82015-07-02 08:53:34 +02002480 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2481 ta_crypt_cmd_free_operation(c, &session, op)))
2482 goto out;
2483
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002484 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2485 ta_crypt_cmd_free_operation(c, &session, op2)))
2486 goto out;
2487
Pascal Brandc639ac82015-07-02 08:53:34 +02002488 Do_ADBG_EndSubCase(c, NULL);
2489 }
2490out:
2491 TEEC_CloseSession(&session);
2492}
Jens Wiklander14f48872018-06-29 15:30:13 +02002493ADBG_CASE_DEFINE(regression, 4003, xtest_tee_test_4003,
2494 "Test TEE Internal API cipher operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02002495
Pascal Brandc639ac82015-07-02 08:53:34 +02002496static void xtest_tee_test_4004(ADBG_Case_t *c)
2497{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002498 TEEC_Session session = { };
2499 uint32_t ret_orig = 0;
2500 uint8_t buf1[45] = { };
2501 uint8_t buf2[45] = { };
2502 static const uint8_t zeros[45];
Pascal Brandc639ac82015-07-02 08:53:34 +02002503
2504 Do_ADBG_BeginSubCase(c, "TEE get random");
2505 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2506 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
2507 &ret_orig)))
2508 return;
2509
2510 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2511 ta_crypt_cmd_random_number_generate(c, &session, buf1,
2512 sizeof(buf1))))
2513 goto out;
2514
2515 (void)ADBG_EXPECT_COMPARE_SIGNED(c,
2516 0, !=, memcmp(buf1, zeros, sizeof(buf1)));
2517
2518 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2519 ta_crypt_cmd_random_number_generate(c, &session, buf2,
2520 sizeof(buf2))))
2521 goto out;
2522
2523 (void)ADBG_EXPECT_COMPARE_SIGNED(c,
2524 0, !=, memcmp(buf2, zeros, sizeof(buf2)));
2525
2526 (void)ADBG_EXPECT_COMPARE_SIGNED(c,
2527 0, !=, memcmp(buf2, buf1, sizeof(buf1)));
2528out:
2529 TEEC_CloseSession(&session);
2530 Do_ADBG_EndSubCase(c, "TEE get random");
2531}
Jens Wiklander14f48872018-06-29 15:30:13 +02002532ADBG_CASE_DEFINE(regression, 4004, xtest_tee_test_4004,
2533 "Test TEE Internal API get random");
Pascal Brandc639ac82015-07-02 08:53:34 +02002534
2535struct xtest_ae_case {
2536 uint32_t algo;
2537 uint32_t mode;
2538 uint32_t key_type;
2539 const uint8_t *key;
2540 size_t key_len;
2541 const uint8_t *nonce;
2542 size_t nonce_len;
2543 size_t aad_incr;
2544 const uint8_t *aad;
2545 size_t aad_len;
2546 size_t in_incr;
2547 const uint8_t *ptx;
2548 size_t ptx_len;
2549 const uint8_t *ctx;
2550 size_t ctx_len;
2551 const uint8_t *tag;
2552 size_t tag_len;
2553 size_t line;
Olivier Masse9d566212024-01-30 09:18:34 +01002554 uint32_t id;
Pascal Brandc639ac82015-07-02 08:53:34 +02002555};
2556
2557
2558#define ARRAY(a) a, ARRAY_SIZE(a)
2559#define NULL_ARRAY(a) NULL, 0
2560
2561#define XTEST_AE_CASE(algo, vect, aad_incr, in_incr, \
2562 aad_array, ptx_array, ctx_array) \
2563 { (algo), TEE_MODE_ENCRYPT, TEE_TYPE_AES, ARRAY(vect ## _key), \
2564 ARRAY(vect ## _nonce), (aad_incr), \
2565 aad_array(vect ## _aad), (in_incr), \
2566 ptx_array(vect ## _ptx), ctx_array(vect ## _ctx), \
2567 ARRAY(vect ## _tag), \
Olivier Masse9d566212024-01-30 09:18:34 +01002568 __LINE__, 0 }, \
Pascal Brandc639ac82015-07-02 08:53:34 +02002569 { (algo), TEE_MODE_DECRYPT, TEE_TYPE_AES, ARRAY(vect ## _key), \
2570 ARRAY(vect ## _nonce), (aad_incr), \
2571 aad_array(vect ## _aad), (in_incr), \
2572 ptx_array(vect ## _ptx), ctx_array(vect ## _ctx), \
2573 ARRAY(vect ## _tag), \
Olivier Masse9d566212024-01-30 09:18:34 +01002574 __LINE__, 0 }
Pascal Brandc639ac82015-07-02 08:53:34 +02002575
2576#define XTEST_AE_CASE_AES_CCM(vect, aad_incr, in_incr) \
2577 XTEST_AE_CASE(TEE_ALG_AES_CCM, ae_data_aes_ccm_ ## vect, aad_incr, \
2578 in_incr, ARRAY, ARRAY, ARRAY)
2579
2580#define XTEST_AE_CASE_AES_GCM(vect, aad_incr, in_incr, \
2581 aad_array, ptx_array, ctx_array) \
2582 XTEST_AE_CASE(TEE_ALG_AES_GCM, ae_data_aes_gcm_ ## vect, aad_incr, \
2583 in_incr, aad_array, ptx_array, ctx_array)
2584
2585
2586
2587static const struct xtest_ae_case ae_cases[] = {
2588 XTEST_AE_CASE_AES_CCM(vect1, 3, 2),
2589 XTEST_AE_CASE_AES_CCM(vect2, 7, 13),
2590 XTEST_AE_CASE_AES_CCM(vect3, 5, 21),
2591
2592 XTEST_AE_CASE_AES_GCM(vect1, 0, 0, NULL_ARRAY, NULL_ARRAY, NULL_ARRAY),
2593 XTEST_AE_CASE_AES_GCM(vect2, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2594 XTEST_AE_CASE_AES_GCM(vect3, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
Jens Wiklander9fc63f52017-11-10 11:13:26 +01002595 XTEST_AE_CASE_AES_GCM(vect3, 0, 0x1F, NULL_ARRAY, ARRAY, ARRAY),
2596 XTEST_AE_CASE_AES_GCM(vect4, 5, 0x20, ARRAY, ARRAY, ARRAY),
Pascal Brandc639ac82015-07-02 08:53:34 +02002597 XTEST_AE_CASE_AES_GCM(vect5, 5, 9, ARRAY, ARRAY, ARRAY),
2598 XTEST_AE_CASE_AES_GCM(vect6, 5, 9, ARRAY, ARRAY, ARRAY),
2599 XTEST_AE_CASE_AES_GCM(vect7, 0, 0, NULL_ARRAY, NULL_ARRAY, NULL_ARRAY),
2600 XTEST_AE_CASE_AES_GCM(vect8, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2601 XTEST_AE_CASE_AES_GCM(vect9, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2602 XTEST_AE_CASE_AES_GCM(vect10, 5, 9, ARRAY, ARRAY, ARRAY),
2603 XTEST_AE_CASE_AES_GCM(vect11, 5, 9, ARRAY, ARRAY, ARRAY),
2604 XTEST_AE_CASE_AES_GCM(vect12, 5, 9, ARRAY, ARRAY, ARRAY),
2605 XTEST_AE_CASE_AES_GCM(vect13, 0, 0, NULL_ARRAY, NULL_ARRAY, NULL_ARRAY),
2606 XTEST_AE_CASE_AES_GCM(vect14, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2607 XTEST_AE_CASE_AES_GCM(vect15, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2608 XTEST_AE_CASE_AES_GCM(vect16, 5, 9, ARRAY, ARRAY, ARRAY),
2609 XTEST_AE_CASE_AES_GCM(vect17, 5, 9, ARRAY, ARRAY, ARRAY),
2610 XTEST_AE_CASE_AES_GCM(vect18, 5, 9, ARRAY, ARRAY, ARRAY),
Jens Wiklanderf6efe242017-11-06 13:16:43 +01002611#ifdef CFG_GCM_NIST_VECTORS
2612#include "gcmDecrypt128.h"
2613#include "gcmDecrypt192.h"
2614#include "gcmDecrypt256.h"
2615#include "gcmEncryptExtIV128.h"
2616#include "gcmEncryptExtIV192.h"
2617#include "gcmEncryptExtIV256.h"
2618#endif
Olivier Masse9d566212024-01-30 09:18:34 +01002619#include "aes_gcm_counter_overflow_test_encrypt.h"
2620#include "aes_gcm_counter_overflow_test_decrypt.h"
Pascal Brandc639ac82015-07-02 08:53:34 +02002621};
2622
2623static void xtest_tee_test_4005(ADBG_Case_t *c)
2624{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002625 TEEC_Session session = { };
2626 TEE_OperationHandle op = TEE_HANDLE_NULL;
Jens Wiklander7404c072020-12-15 08:06:32 +01002627 TEE_OperationHandle op2 = TEE_HANDLE_NULL;
Pascal Brandc639ac82015-07-02 08:53:34 +02002628 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002629 TEE_Attribute key_attr = { };
2630 uint8_t out[512] = { };
2631 size_t out_size = 0;
2632 size_t out_offs = 0;
Jens Wiklander7404c072020-12-15 08:06:32 +01002633 size_t out_offs2 = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002634 uint32_t ret_orig = 0;
2635 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02002636
2637 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2638 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
2639 &ret_orig)))
2640 return;
2641
2642 for (n = 0; n < ARRAY_SIZE(ae_cases); n++) {
Olivier Masse9d566212024-01-30 09:18:34 +01002643 if (ae_cases[n].id)
2644 Do_ADBG_BeginSubCase(c, "AE case %d algo 0x%x line %d id %d",
2645 (int)n, (unsigned int)ae_cases[n].algo,
2646 (int)ae_cases[n].line,
2647 (unsigned int)ae_cases[n].id);
2648 else
2649 Do_ADBG_BeginSubCase(c, "AE case %d algo 0x%x line %d",
2650 (int)n, (unsigned int)ae_cases[n].algo,
2651 (int)ae_cases[n].line);
Pascal Brandc639ac82015-07-02 08:53:34 +02002652
2653 key_attr.attributeID = TEE_ATTR_SECRET_VALUE;
2654 key_attr.content.ref.buffer = (void *)ae_cases[n].key;
2655 key_attr.content.ref.length = ae_cases[n].key_len;
2656
2657 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2658 ta_crypt_cmd_allocate_operation(c, &session, &op,
2659 ae_cases[n].algo, ae_cases[n].mode,
2660 key_attr.content.ref.length * 8)))
2661 goto out;
2662
2663 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jens Wiklander7404c072020-12-15 08:06:32 +01002664 ta_crypt_cmd_allocate_operation(c, &session, &op2,
2665 ae_cases[n].algo, ae_cases[n].mode,
2666 key_attr.content.ref.length * 8)))
2667 goto out;
2668
2669 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc639ac82015-07-02 08:53:34 +02002670 ta_crypt_cmd_allocate_transient_object(c, &session,
2671 ae_cases[n].key_type,
2672 key_attr.content.ref.length * 8,
2673 &key_handle)))
2674 goto out;
2675
2676 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2677 ta_crypt_cmd_populate_transient_object(c, &session,
2678 key_handle, &key_attr, 1)))
2679 goto out;
2680
2681 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2682 ta_crypt_cmd_set_operation_key(c, &session, op,
2683 key_handle)))
2684 goto out;
2685
2686 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2687 ta_crypt_cmd_free_transient_object(c, &session,
2688 key_handle)))
2689 goto out;
2690 key_handle = TEE_HANDLE_NULL;
2691
2692 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2693 ta_crypt_cmd_ae_init(c, &session, op, ae_cases[n].nonce,
2694 ae_cases[n].nonce_len, ae_cases[n].tag_len,
2695 ae_cases[n].aad_len, ae_cases[n].ptx_len)))
2696 goto out;
2697
2698 if (ae_cases[n].aad != NULL) {
2699 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2700 ta_crypt_cmd_ae_update_aad(c, &session, op,
2701 ae_cases[n].aad, ae_cases[n].aad_incr)))
2702 goto out;
2703
2704 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2705 ta_crypt_cmd_ae_update_aad(c, &session, op,
2706 ae_cases[n].aad + ae_cases[n].aad_incr,
2707 ae_cases [n].aad_len -
2708 ae_cases[n].aad_incr)))
2709 goto out;
2710 }
2711
2712 out_offs = 0;
2713 out_size = sizeof(out);
2714 memset(out, 0, sizeof(out));
2715 if (ae_cases[n].mode == TEE_MODE_ENCRYPT) {
2716 if (ae_cases[n].ptx != NULL) {
2717 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2718 ta_crypt_cmd_ae_update(c, &session, op,
2719 ae_cases[n].ptx,
2720 ae_cases[n].in_incr, out,
2721 &out_size)))
2722 goto out;
2723 out_offs += out_size;
Jerome Forissierc13fafa2017-06-01 15:49:07 +02002724 if (ae_cases[n].algo == TEE_ALG_AES_GCM)
2725 ADBG_EXPECT_COMPARE_UNSIGNED(c,
2726 out_size, ==, ae_cases[n].in_incr);
Pascal Brandc639ac82015-07-02 08:53:34 +02002727 }
2728 } else {
2729 if (ae_cases[n].ctx != NULL) {
2730 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2731 ta_crypt_cmd_ae_update(c, &session, op,
2732 ae_cases[n].ctx,
2733 ae_cases[n].in_incr, out,
2734 &out_size)))
2735 goto out;
2736 out_offs += out_size;
Jerome Forissierc13fafa2017-06-01 15:49:07 +02002737 if (ae_cases[n].algo == TEE_ALG_AES_GCM)
2738 ADBG_EXPECT_COMPARE_UNSIGNED(c,
2739 out_size, ==, ae_cases[n].in_incr);
Pascal Brandc639ac82015-07-02 08:53:34 +02002740 }
2741 }
2742
Jens Wiklander7404c072020-12-15 08:06:32 +01002743 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2744 ta_crypt_cmd_copy_operation(c, &session, op2, op)))
2745 goto out;
2746
Pascal Brandc639ac82015-07-02 08:53:34 +02002747 out_size = sizeof(out) - out_offs;
Jens Wiklander7404c072020-12-15 08:06:32 +01002748 out_offs2 = out_offs;
Pascal Brandc639ac82015-07-02 08:53:34 +02002749 if (ae_cases[n].mode == TEE_MODE_ENCRYPT) {
2750 uint8_t out_tag[64];
2751 size_t out_tag_len = MIN(sizeof(out_tag),
2752 ae_cases[n].tag_len);
2753
2754 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2755 ta_crypt_cmd_ae_encrypt_final(c, &session, op,
2756 ae_cases[n].ptx + ae_cases[n].in_incr,
2757 ae_cases[n].ptx_len -
2758 ae_cases[n].in_incr,
2759 out + out_offs,
2760 &out_size, out_tag, &out_tag_len)))
2761 goto out;
2762
2763 (void)ADBG_EXPECT_BUFFER(c,
2764 ae_cases[n].tag, ae_cases[n].tag_len, out_tag,
2765 out_tag_len);
2766
2767 out_offs += out_size;
2768
2769 (void)ADBG_EXPECT_BUFFER(c, ae_cases[n].ctx,
2770 ae_cases[n].ctx_len, out, out_offs);
2771 } else {
2772 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2773 ta_crypt_cmd_ae_decrypt_final(c, &session, op,
2774 ae_cases[n].ctx + ae_cases[n].in_incr,
2775 ae_cases[n].ctx_len -
2776 ae_cases[n].in_incr,
2777 out + out_offs,
2778 &out_size, ae_cases[n].tag,
2779 ae_cases[n].tag_len)))
2780 goto out;
2781
2782 out_offs += out_size;
2783
2784 (void)ADBG_EXPECT_BUFFER(c, ae_cases[n].ptx,
2785 ae_cases[n].ptx_len, out, out_offs);
2786 }
2787
Jens Wiklander7404c072020-12-15 08:06:32 +01002788 /* test on the copied op2 */
2789 out_size = sizeof(out) - out_offs2;
2790 memset(out + out_offs2, 0, out_size);
2791 if (ae_cases[n].mode == TEE_MODE_ENCRYPT) {
2792 uint8_t out_tag[64] = { 0 };
2793 size_t out_tag_len = MIN(sizeof(out_tag),
2794 ae_cases[n].tag_len);
2795
2796 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2797 ta_crypt_cmd_ae_encrypt_final(c, &session, op2,
2798 ae_cases[n].ptx + ae_cases[n].in_incr,
2799 ae_cases[n].ptx_len -
2800 ae_cases[n].in_incr,
2801 out + out_offs2,
2802 &out_size, out_tag, &out_tag_len)))
2803 goto out;
2804
2805 ADBG_EXPECT_BUFFER(c, ae_cases[n].tag,
2806 ae_cases[n].tag_len, out_tag,
2807 out_tag_len);
2808
2809 out_offs2 += out_size;
2810
2811 (void)ADBG_EXPECT_BUFFER(c, ae_cases[n].ctx,
2812 ae_cases[n].ctx_len, out, out_offs2);
2813 } else {
2814 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2815 ta_crypt_cmd_ae_decrypt_final(c, &session, op2,
2816 ae_cases[n].ctx + ae_cases[n].in_incr,
2817 ae_cases[n].ctx_len -
2818 ae_cases[n].in_incr,
2819 out + out_offs2,
2820 &out_size, ae_cases[n].tag,
2821 ae_cases[n].tag_len)))
2822 goto out;
2823
2824 out_offs2 += out_size;
2825
2826 (void)ADBG_EXPECT_BUFFER(c, ae_cases[n].ptx,
2827 ae_cases[n].ptx_len, out, out_offs2);
2828 }
2829
Pascal Brandc639ac82015-07-02 08:53:34 +02002830 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2831 ta_crypt_cmd_free_operation(c, &session, op)))
2832 goto out;
2833
Jens Wiklander7404c072020-12-15 08:06:32 +01002834 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2835 ta_crypt_cmd_free_operation(c, &session, op2)))
2836 goto out;
2837
Pascal Brandc639ac82015-07-02 08:53:34 +02002838 Do_ADBG_EndSubCase(c, NULL);
2839 }
2840out:
2841 TEEC_CloseSession(&session);
2842}
Jens Wiklander14f48872018-06-29 15:30:13 +02002843ADBG_CASE_DEFINE(regression, 4005, xtest_tee_test_4005,
2844 "Test TEE Internal API Authenticated Encryption operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02002845
2846struct xtest_ac_case {
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002847 unsigned int level;
Pascal Brandc639ac82015-07-02 08:53:34 +02002848 uint32_t algo;
2849 TEE_OperationMode mode;
2850
2851 union {
2852 struct {
2853 const uint8_t *modulus;
2854 size_t modulus_len;
2855
2856 const uint8_t *pub_exp;
2857 size_t pub_exp_len;
2858
2859 const uint8_t *priv_exp;
2860 size_t priv_exp_len;
2861
2862 const uint8_t *prime1; /* q */
2863 size_t prime1_len;
2864 const uint8_t *prime2; /* p */
2865 size_t prime2_len;
2866 const uint8_t *exp1; /* dp */
2867 size_t exp1_len;
2868 const uint8_t *exp2; /* dq */
2869 size_t exp2_len;
2870 const uint8_t *coeff; /* iq */
2871 size_t coeff_len;
2872
2873 int salt_len;
2874 } rsa;
2875 struct {
2876 const uint8_t *prime;
2877 size_t prime_len;
2878 const uint8_t *sub_prime;
2879 size_t sub_prime_len;
2880 const uint8_t *base;
2881 size_t base_len;
2882 const uint8_t *pub_val;
2883 size_t pub_val_len;
2884 const uint8_t *priv_val;
2885 size_t priv_val_len;
2886 } dsa;
Pascal Brand3e143ee2015-07-15 17:17:16 +02002887 struct {
2888 const uint8_t *private;
2889 size_t private_len;
2890 const uint8_t *public_x;
2891 size_t public_x_len;
2892 const uint8_t *public_y;
2893 size_t public_y_len;
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01002894 } ecc;
Valerii Chubarab9863c2022-08-12 07:42:29 +00002895 struct {
2896 const uint8_t *private;
2897 size_t private_len;
2898 const uint8_t *public;
2899 size_t public_len;
2900 const uint8_t flag;
2901 const uint8_t *context;
2902 size_t context_len;
2903 } eddsa;
Pascal Brandc639ac82015-07-02 08:53:34 +02002904 } params;
2905
2906 const uint8_t *ptx;
2907 size_t ptx_len;
2908 const uint8_t *ctx;
2909 size_t ctx_len;
2910 size_t line;
2911};
2912
2913#define WITHOUT_SALT(x) -1
2914#define WITH_SALT(x) x
2915
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002916#define XTEST_AC_CASE(level, algo, mode, vect, union_params) \
2917 { level, (algo), (mode), .params = union_params, \
Pascal Brandc639ac82015-07-02 08:53:34 +02002918 ARRAY(vect ## _ptx), \
2919 ARRAY(vect ## _out), \
2920 __LINE__ }
2921
2922#define XTEST_AC_RSA_UNION(vect, opt_crt_array, opt_salt) \
2923 { .rsa = { \
2924 ARRAY(vect ## _modulus), \
2925 ARRAY(vect ## _pub_exp), \
2926 ARRAY(vect ## _priv_exp), \
2927 opt_crt_array(vect ## _prime1), \
2928 opt_crt_array(vect ## _prime2), \
2929 opt_crt_array(vect ## _exp1), \
2930 opt_crt_array(vect ## _exp2), \
2931 opt_crt_array(vect ## _coeff), \
2932 opt_salt(vect ## _salt_len) \
2933 } }
2934
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002935#define XTEST_AC_RSA_CASE(level, algo, mode, vect, opt_crt_array, opt_salt) \
2936 XTEST_AC_CASE(level, algo, mode, vect, \
Pascal Brandc639ac82015-07-02 08:53:34 +02002937 XTEST_AC_RSA_UNION(vect, opt_crt_array, opt_salt))
2938
2939#define XTEST_AC_DSA_UNION(vect) \
2940 { .dsa = { \
2941 ARRAY(vect ## _prime), \
2942 ARRAY(vect ## _sub_prime), \
2943 ARRAY(vect ## _base), \
2944 ARRAY(vect ## _pub_val), \
2945 ARRAY(vect ## _priv_val), \
2946 } }
2947
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002948#define XTEST_AC_DSA_CASE(level, algo, mode, vect) \
2949 XTEST_AC_CASE(level, algo, mode, vect, XTEST_AC_DSA_UNION(vect))
Pascal Brandc639ac82015-07-02 08:53:34 +02002950
Pascal Brand3e143ee2015-07-15 17:17:16 +02002951#define XTEST_AC_ECDSA_UNION(vect) \
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01002952 { .ecc = { \
Pascal Brand3e143ee2015-07-15 17:17:16 +02002953 ARRAY(vect ## _private), \
2954 ARRAY(vect ## _public_x), \
2955 ARRAY(vect ## _public_y), \
2956 } }
2957
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01002958#define XTEST_AC_ECC_CASE(level, algo, mode, vect) \
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002959 XTEST_AC_CASE(level, algo, mode, vect, XTEST_AC_ECDSA_UNION(vect))
Pascal Brand3e143ee2015-07-15 17:17:16 +02002960
Valerii Chubarab9863c2022-08-12 07:42:29 +00002961#define XTEST_AC_EDDSA_UNION(vect, flag) \
2962 { .eddsa = { \
2963 ARRAY(vect ## _private), \
2964 ARRAY(vect ## _public), \
2965 flag, \
2966 } }
2967
2968#define XTEST_AC_EDDSA_CTX_UNION(vect, flag) \
2969 { .eddsa = { \
2970 ARRAY(vect ## _private), \
2971 ARRAY(vect ## _public), \
2972 flag, \
2973 ARRAY(vect ## _context), \
2974 } }
2975
2976#define XTEST_AC_EDDSA_CASE(level, algo, mode, vect, flag) \
2977 XTEST_AC_CASE(level, algo, mode, vect, XTEST_AC_EDDSA_UNION(vect, flag))
2978
2979#define XTEST_AC_EDDSA_CTX_CASE(level, algo, mode, vect, flag) \
2980 XTEST_AC_CASE(level, algo, mode, vect, XTEST_AC_EDDSA_CTX_UNION(vect, flag))
2981
Pascal Brandc639ac82015-07-02 08:53:34 +02002982static const struct xtest_ac_case xtest_ac_cases[] = {
2983 /* RSA test without crt parameters */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002984 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002985 ac_rsassa_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002986 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002987 ac_rsassa_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002988 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002989 ac_rsassa_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002990 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002991 ac_rsassa_vect2, NULL_ARRAY, WITHOUT_SALT),
Jerome Forissiere576f052018-03-23 21:24:21 +08002992 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
2993 ac_rsassa_vect18, NULL_ARRAY, WITHOUT_SALT),
2994 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
2995 ac_rsassa_vect18, NULL_ARRAY, WITHOUT_SALT),
Jerome Forissier0451e372018-03-27 00:10:23 +08002996 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
2997 ac_rsassa_vect19, NULL_ARRAY, WITHOUT_SALT),
2998 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
2999 ac_rsassa_vect19, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003000 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003001 ac_rsassa_vect3, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003002 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003003 ac_rsassa_vect3, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003004 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003005 ac_rsassa_vect4, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003006 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003007 ac_rsassa_vect4, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003008 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003009 ac_rsassa_vect5, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003010 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003011 ac_rsassa_vect5, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003012 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003013 ac_rsassa_vect6, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003014 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003015 ac_rsassa_vect6, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003016 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003017 ac_rsassa_vect7, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003018 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003019 ac_rsassa_vect7, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003020 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
3021 ac_rsassa_vect8, NULL_ARRAY, WITHOUT_SALT),
3022 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
3023 ac_rsassa_vect8, NULL_ARRAY, WITHOUT_SALT),
Pascal Brandc639ac82015-07-02 08:53:34 +02003024
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003025 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA224, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003026 ac_rsassa_vect16, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003027 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA224, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003028 ac_rsassa_vect16, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003029
Gabor Szekely2ad190f2018-09-14 14:05:06 +00003030#ifdef CFG_CRYPTO_RSASSA_NA1
3031 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5, TEE_MODE_SIGN,
3032 ac_rsassa_vect20, NULL_ARRAY, WITHOUT_SALT),
3033 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5, TEE_MODE_VERIFY,
3034 ac_rsassa_vect20, NULL_ARRAY, WITHOUT_SALT),
3035#endif
3036
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003037 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003038 ac_rsassa_vect9, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003039 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003040 ac_rsassa_vect9, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003041
3042 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003043 ac_rsassa_vect10, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003044 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003045 ac_rsassa_vect10, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003046
3047 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003048 ac_rsassa_vect11, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003049 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003050 ac_rsassa_vect11, NULL_ARRAY, WITHOUT_SALT),
3051
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003052 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1,
3053 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003054 ac_rsassa_vect12, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003055 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003056 ac_rsassa_vect12, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003057
3058 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
3059 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003060 ac_rsassa_vect17, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003061 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
3062 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003063 ac_rsassa_vect17, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003064
3065 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
3066 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003067 ac_rsassa_vect13, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003068 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
3069 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003070 ac_rsassa_vect13, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003071
3072 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
3073 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003074 ac_rsassa_vect14, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003075 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
3076 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003077 ac_rsassa_vect14, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003078
3079 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
3080 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003081 ac_rsassa_vect15, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003082 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
3083 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003084 ac_rsassa_vect15, NULL_ARRAY, WITH_SALT),
3085
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003086 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003087 ac_rsaes_pkcs1_v1_5_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003088 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003089 ac_rsaes_pkcs1_v1_5_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003090 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003091 ac_rsaes_pkcs1_v1_5_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003092 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003093 ac_rsaes_pkcs1_v1_5_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003094 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003095 ac_rsaes_pkcs1_v1_5_vect15, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003096 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003097 ac_rsaes_pkcs1_v1_5_vect15, NULL_ARRAY, WITHOUT_SALT),
3098
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003099 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3100 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003101 ac_rsaes_oaep_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003102 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3103 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003104 ac_rsaes_oaep_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003105 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3106 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003107 ac_rsaes_oaep_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003108 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3109 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003110 ac_rsaes_oaep_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003111 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3112 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003113 ac_rsaes_oaep_vect10, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003114 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3115 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003116 ac_rsaes_oaep_vect10, NULL_ARRAY, WITHOUT_SALT),
Sami Tolvanenf3e46d42024-04-09 21:50:41 +00003117 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA256,
3118 TEE_MODE_DECRYPT,
3119 ac_rsaes_oaep_vect3, NULL_ARRAY, WITHOUT_SALT),
3120 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA256,
3121 TEE_MODE_ENCRYPT,
3122 ac_rsaes_oaep_vect3, NULL_ARRAY, WITHOUT_SALT),
Pascal Brandc639ac82015-07-02 08:53:34 +02003123
3124 /* RSA test with crt parameters */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003125 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003126 ac_rsassa_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003127 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003128 ac_rsassa_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003129 XTEST_AC_RSA_CASE(1, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003130 ac_rsassa_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003131 XTEST_AC_RSA_CASE(1, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003132 ac_rsassa_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003133 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003134 ac_rsassa_vect3, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003135 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003136 ac_rsassa_vect3, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003137 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003138 ac_rsassa_vect4, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003139 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003140 ac_rsassa_vect4, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003141 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003142 ac_rsassa_vect5, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003143 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003144 ac_rsassa_vect5, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003145 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003146 ac_rsassa_vect6, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003147 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003148 ac_rsassa_vect6, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003149 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003150 ac_rsassa_vect7, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003151 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003152 ac_rsassa_vect7, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003153 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003154 ac_rsassa_vect8, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003155 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003156 ac_rsassa_vect8, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003157 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003158 ac_rsassa_vect9, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003159 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003160 ac_rsassa_vect9, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003161 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003162 ac_rsassa_vect10, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003163 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003164 ac_rsassa_vect10, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003165 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003166 ac_rsassa_vect11, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003167 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003168 ac_rsassa_vect11, ARRAY, WITHOUT_SALT),
3169
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003170 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1,
3171 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003172 ac_rsassa_vect12, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003173 XTEST_AC_RSA_CASE(1,TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003174 ac_rsassa_vect12, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003175 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
3176 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003177 ac_rsassa_vect17, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003178 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
3179 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003180 ac_rsassa_vect17, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003181 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
3182 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003183 ac_rsassa_vect13, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003184 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
3185 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003186 ac_rsassa_vect13, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003187 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
3188 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003189 ac_rsassa_vect14, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003190 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
3191 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003192 ac_rsassa_vect14, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003193 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
3194 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003195 ac_rsassa_vect15, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003196 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
3197 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003198 ac_rsassa_vect15, ARRAY, WITH_SALT),
3199
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003200 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003201 ac_rsaes_pkcs1_v1_5_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003202 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003203 ac_rsaes_pkcs1_v1_5_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003204 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003205 ac_rsaes_pkcs1_v1_5_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003206 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003207 ac_rsaes_pkcs1_v1_5_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003208 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003209 ac_rsaes_pkcs1_v1_5_vect15, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003210 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003211 ac_rsaes_pkcs1_v1_5_vect15, ARRAY, WITHOUT_SALT),
3212
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003213 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3214 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003215 ac_rsaes_oaep_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003216 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3217 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003218 ac_rsaes_oaep_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003219 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3220 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003221 ac_rsaes_oaep_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003222 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3223 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003224 ac_rsaes_oaep_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003225 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3226 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003227 ac_rsaes_oaep_vect10, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003228 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3229 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003230 ac_rsaes_oaep_vect10, ARRAY, WITHOUT_SALT),
Sami Tolvanenf3e46d42024-04-09 21:50:41 +00003231 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA256,
3232 TEE_MODE_DECRYPT,
3233 ac_rsaes_oaep_vect3, ARRAY, WITHOUT_SALT),
3234 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA256,
3235 TEE_MODE_ENCRYPT,
3236 ac_rsaes_oaep_vect3, ARRAY, WITHOUT_SALT),
Pascal Brandc639ac82015-07-02 08:53:34 +02003237
3238 /* DSA tests */
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003239 /* [mod = L=1024, N=160, SHA-1] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003240 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect1),
3241 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect1),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003242 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect2),
3243 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect2),
3244 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect3),
3245 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect3),
3246 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect4),
3247 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect4),
3248 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect5),
3249 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect5),
3250 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect6),
3251 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect6),
3252 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect7),
3253 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect7),
3254 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect8),
3255 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect8),
3256 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect9),
3257 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect9),
3258 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect10),
3259 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect10),
3260 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect11),
3261 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect11),
3262 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect12),
3263 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect12),
3264 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect13),
3265 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect13),
3266 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect14),
3267 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect14),
3268 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect15),
3269 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect15),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003270 /* [mod = L=1024, N=160, SHA-224] - GP NOT SUPPORTED */
3271 /* [mod = L=1024, N=160, SHA-256] - GP NOT SUPPORTED */
3272 /* [mod = L=1024, N=160, SHA-384] - GP NOT SUPPORTED */
3273 /* [mod = L=1024, N=160, SHA-512] - GP NOT SUPPORTED */
3274 /* [mod = L=2048, N=224, SHA-1] - GP NOT SUPPORTED */
3275 /* [mod = L=2048, N=224, SHA-224] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003276 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect91),
3277 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect91),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003278 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect92),
3279 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect92),
3280 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect93),
3281 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect93),
3282 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect94),
3283 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect94),
3284 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect95),
3285 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect95),
3286 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect96),
3287 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect96),
3288 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect97),
3289 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect97),
3290 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect98),
3291 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect98),
3292 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect99),
3293 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect99),
3294 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect100),
3295 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect100),
3296 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect101),
3297 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect101),
3298 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect102),
3299 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect102),
3300 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect103),
3301 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect103),
3302 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect104),
3303 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect104),
3304 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect105),
3305 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect105),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003306 /* [mod = L=2048, N=224, SHA-256] */
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003307 XTEST_AC_DSA_CASE(0, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect106),
3308 XTEST_AC_DSA_CASE(0, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect106),
3309 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect107),
3310 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect107),
3311 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect108),
3312 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect108),
3313 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect109),
3314 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect109),
3315 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect110),
3316 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect110),
3317 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect111),
3318 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect111),
3319 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect112),
3320 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect112),
3321 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect113),
3322 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect113),
3323 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect114),
3324 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect114),
3325 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect115),
3326 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect115),
3327 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect116),
3328 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect116),
3329 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect117),
3330 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect117),
3331 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect118),
3332 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect118),
3333 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect119),
3334 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect119),
3335 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect120),
3336 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect120),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003337 /* [mod = L=2048, N=224, SHA-384] - GP NOT SUPPORTED */
3338 /* [mod = L=2048, N=224, SHA-512] - GP NOT SUPPORTED */
3339 /* [mod = L=2048, N=256, SHA-1] - GP NOT SUPPORTED */
3340 /* [mod = L=2048, N=256, SHA-224] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003341 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect166),
3342 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect166),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003343 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect167),
3344 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect167),
3345 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect168),
3346 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect168),
3347 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect169),
3348 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect169),
3349 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect170),
3350 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect170),
3351 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect171),
3352 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect171),
3353 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect172),
3354 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect172),
3355 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect173),
3356 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect173),
3357 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect174),
3358 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect174),
3359 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect175),
3360 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect175),
3361 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect176),
3362 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect176),
3363 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect177),
3364 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect177),
3365 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect178),
3366 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect178),
3367 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect179),
3368 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect179),
3369 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect180),
3370 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect180),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003371 /* [mod = L=2048, N=256, SHA-256] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003372 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect181),
3373 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect181),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003374 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect182),
3375 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect182),
3376 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect183),
3377 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect183),
3378 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect184),
3379 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect184),
3380 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect185),
3381 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect185),
3382 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect186),
3383 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect186),
3384 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect187),
3385 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect187),
3386 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect188),
3387 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect188),
3388 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect189),
3389 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect189),
3390 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect190),
3391 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect190),
3392 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect191),
3393 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect191),
3394 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect192),
3395 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect192),
3396 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect193),
3397 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect193),
3398 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect194),
3399 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect194),
3400 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect195),
3401 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect195),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003402 /* [mod = L=2048, N=256, SHA-384] - GP NOT SUPPORTED */
3403 /* [mod = L=2048, N=256, SHA-512] - GP NOT SUPPORTED */
3404 /* [mod = L=3072, N=256, SHA-1] - GP NOT SUPPORTED */
3405 /* [mod = L=3072, N=256, SHA-224] - GP NOT SUPPORTED */
3406 /* [mod = L=3072, N=256, SHA-256] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003407 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect256),
3408 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect256),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003409 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect257),
3410 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect257),
3411 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect258),
3412 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect258),
3413 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect259),
3414 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect259),
3415 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect260),
3416 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect260),
3417 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect261),
3418 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect261),
3419 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect262),
3420 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect262),
3421 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect263),
3422 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect263),
3423 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect264),
3424 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect264),
3425 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect265),
3426 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect265),
3427 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect266),
3428 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect266),
3429 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect267),
3430 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect267),
3431 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect268),
3432 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect268),
3433 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect269),
3434 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect269),
3435 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect270),
3436 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect270),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003437 /* [mod = L=3072, N=256, SHA-384] - GP NOT SUPPORTED */
3438 /* [mod = L=3072, N=256, SHA-512] - GP NOT SUPPORTED */
Pascal Brand3e143ee2015-07-15 17:17:16 +02003439
3440 /* ECDSA tests */
Cedric Chaumontc7654962015-09-09 14:56:36 +02003441 /* [P-192] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003442 XTEST_AC_ECC_CASE(0, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3443 nist_186_2_ecdsa_testvector_1),
3444 XTEST_AC_ECC_CASE(0, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3445 nist_186_2_ecdsa_testvector_1),
3446 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3447 nist_186_2_ecdsa_testvector_2),
3448 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3449 nist_186_2_ecdsa_testvector_2),
3450 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3451 nist_186_2_ecdsa_testvector_3),
3452 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3453 nist_186_2_ecdsa_testvector_3),
3454 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3455 nist_186_2_ecdsa_testvector_4),
3456 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3457 nist_186_2_ecdsa_testvector_4),
3458 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3459 nist_186_2_ecdsa_testvector_5),
3460 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3461 nist_186_2_ecdsa_testvector_5),
3462 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3463 nist_186_2_ecdsa_testvector_6),
3464 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3465 nist_186_2_ecdsa_testvector_6),
3466 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3467 nist_186_2_ecdsa_testvector_7),
3468 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3469 nist_186_2_ecdsa_testvector_7),
3470 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3471 nist_186_2_ecdsa_testvector_8),
3472 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3473 nist_186_2_ecdsa_testvector_8),
3474 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3475 nist_186_2_ecdsa_testvector_9),
3476 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3477 nist_186_2_ecdsa_testvector_9),
3478 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3479 nist_186_2_ecdsa_testvector_10),
3480 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3481 nist_186_2_ecdsa_testvector_10),
3482 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3483 nist_186_2_ecdsa_testvector_11),
3484 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3485 nist_186_2_ecdsa_testvector_11),
3486 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3487 nist_186_2_ecdsa_testvector_12),
3488 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3489 nist_186_2_ecdsa_testvector_12),
3490 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3491 nist_186_2_ecdsa_testvector_13),
3492 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3493 nist_186_2_ecdsa_testvector_13),
3494 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3495 nist_186_2_ecdsa_testvector_14),
3496 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3497 nist_186_2_ecdsa_testvector_14),
3498 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3499 nist_186_2_ecdsa_testvector_15),
3500 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3501 nist_186_2_ecdsa_testvector_15),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003502 /* [P-224] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003503 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3504 nist_186_2_ecdsa_testvector_16),
3505 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3506 nist_186_2_ecdsa_testvector_16),
3507 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3508 nist_186_2_ecdsa_testvector_17),
3509 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3510 nist_186_2_ecdsa_testvector_17),
3511 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3512 nist_186_2_ecdsa_testvector_18),
3513 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3514 nist_186_2_ecdsa_testvector_18),
3515 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3516 nist_186_2_ecdsa_testvector_19),
3517 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3518 nist_186_2_ecdsa_testvector_19),
3519 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3520 nist_186_2_ecdsa_testvector_20),
3521 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3522 nist_186_2_ecdsa_testvector_20),
3523 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3524 nist_186_2_ecdsa_testvector_21),
3525 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3526 nist_186_2_ecdsa_testvector_21),
3527 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3528 nist_186_2_ecdsa_testvector_22),
3529 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3530 nist_186_2_ecdsa_testvector_22),
3531 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3532 nist_186_2_ecdsa_testvector_23),
3533 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3534 nist_186_2_ecdsa_testvector_23),
3535 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3536 nist_186_2_ecdsa_testvector_24),
3537 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3538 nist_186_2_ecdsa_testvector_24),
3539 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3540 nist_186_2_ecdsa_testvector_25),
3541 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3542 nist_186_2_ecdsa_testvector_25),
3543 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3544 nist_186_2_ecdsa_testvector_26),
3545 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3546 nist_186_2_ecdsa_testvector_26),
3547 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3548 nist_186_2_ecdsa_testvector_27),
3549 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3550 nist_186_2_ecdsa_testvector_27),
3551 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3552 nist_186_2_ecdsa_testvector_28),
3553 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3554 nist_186_2_ecdsa_testvector_28),
3555 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3556 nist_186_2_ecdsa_testvector_29),
3557 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3558 nist_186_2_ecdsa_testvector_29),
3559 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3560 nist_186_2_ecdsa_testvector_30),
3561 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3562 nist_186_2_ecdsa_testvector_30),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003563 /* [P-256] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003564 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3565 nist_186_2_ecdsa_testvector_31),
3566 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3567 nist_186_2_ecdsa_testvector_31),
3568 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3569 nist_186_2_ecdsa_testvector_32),
3570 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3571 nist_186_2_ecdsa_testvector_32),
3572 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3573 nist_186_2_ecdsa_testvector_33),
3574 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3575 nist_186_2_ecdsa_testvector_33),
3576 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3577 nist_186_2_ecdsa_testvector_34),
3578 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3579 nist_186_2_ecdsa_testvector_34),
3580 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3581 nist_186_2_ecdsa_testvector_35),
3582 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3583 nist_186_2_ecdsa_testvector_35),
3584 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3585 nist_186_2_ecdsa_testvector_36),
3586 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3587 nist_186_2_ecdsa_testvector_36),
3588 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3589 nist_186_2_ecdsa_testvector_37),
3590 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3591 nist_186_2_ecdsa_testvector_37),
3592 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3593 nist_186_2_ecdsa_testvector_38),
3594 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3595 nist_186_2_ecdsa_testvector_38),
3596 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3597 nist_186_2_ecdsa_testvector_39),
3598 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3599 nist_186_2_ecdsa_testvector_39),
3600 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3601 nist_186_2_ecdsa_testvector_40),
3602 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3603 nist_186_2_ecdsa_testvector_40),
3604 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3605 nist_186_2_ecdsa_testvector_41),
3606 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3607 nist_186_2_ecdsa_testvector_41),
3608 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3609 nist_186_2_ecdsa_testvector_42),
3610 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3611 nist_186_2_ecdsa_testvector_42),
3612 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3613 nist_186_2_ecdsa_testvector_43),
3614 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3615 nist_186_2_ecdsa_testvector_43),
3616 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3617 nist_186_2_ecdsa_testvector_44),
3618 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3619 nist_186_2_ecdsa_testvector_44),
3620 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3621 nist_186_2_ecdsa_testvector_45),
3622 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3623 nist_186_2_ecdsa_testvector_45),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003624 /* [P-384] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003625 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3626 nist_186_2_ecdsa_testvector_46),
3627 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3628 nist_186_2_ecdsa_testvector_46),
3629 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3630 nist_186_2_ecdsa_testvector_47),
3631 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3632 nist_186_2_ecdsa_testvector_47),
3633 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3634 nist_186_2_ecdsa_testvector_48),
3635 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3636 nist_186_2_ecdsa_testvector_48),
3637 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3638 nist_186_2_ecdsa_testvector_49),
3639 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3640 nist_186_2_ecdsa_testvector_49),
3641 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3642 nist_186_2_ecdsa_testvector_50),
3643 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3644 nist_186_2_ecdsa_testvector_50),
3645 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3646 nist_186_2_ecdsa_testvector_51),
3647 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3648 nist_186_2_ecdsa_testvector_51),
3649 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3650 nist_186_2_ecdsa_testvector_52),
3651 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3652 nist_186_2_ecdsa_testvector_52),
3653 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3654 nist_186_2_ecdsa_testvector_53),
3655 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3656 nist_186_2_ecdsa_testvector_53),
3657 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3658 nist_186_2_ecdsa_testvector_54),
3659 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3660 nist_186_2_ecdsa_testvector_54),
3661 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3662 nist_186_2_ecdsa_testvector_55),
3663 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3664 nist_186_2_ecdsa_testvector_55),
3665 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3666 nist_186_2_ecdsa_testvector_56),
3667 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3668 nist_186_2_ecdsa_testvector_56),
3669 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3670 nist_186_2_ecdsa_testvector_57),
3671 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3672 nist_186_2_ecdsa_testvector_57),
3673 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3674 nist_186_2_ecdsa_testvector_58),
3675 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3676 nist_186_2_ecdsa_testvector_58),
3677 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3678 nist_186_2_ecdsa_testvector_59),
3679 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3680 nist_186_2_ecdsa_testvector_59),
3681 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3682 nist_186_2_ecdsa_testvector_60),
3683 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3684 nist_186_2_ecdsa_testvector_60),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003685 /* [P-521] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003686 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3687 nist_186_2_ecdsa_testvector_61),
3688 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3689 nist_186_2_ecdsa_testvector_61),
3690 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3691 nist_186_2_ecdsa_testvector_62),
3692 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3693 nist_186_2_ecdsa_testvector_62),
3694 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3695 nist_186_2_ecdsa_testvector_63),
3696 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3697 nist_186_2_ecdsa_testvector_63),
3698 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3699 nist_186_2_ecdsa_testvector_64),
3700 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3701 nist_186_2_ecdsa_testvector_64),
3702 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3703 nist_186_2_ecdsa_testvector_65),
3704 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3705 nist_186_2_ecdsa_testvector_65),
3706 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3707 nist_186_2_ecdsa_testvector_66),
3708 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3709 nist_186_2_ecdsa_testvector_66),
3710 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3711 nist_186_2_ecdsa_testvector_67),
3712 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3713 nist_186_2_ecdsa_testvector_67),
3714 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3715 nist_186_2_ecdsa_testvector_68),
3716 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3717 nist_186_2_ecdsa_testvector_68),
3718 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3719 nist_186_2_ecdsa_testvector_69),
3720 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3721 nist_186_2_ecdsa_testvector_69),
3722 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3723 nist_186_2_ecdsa_testvector_70),
3724 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3725 nist_186_2_ecdsa_testvector_70),
3726 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3727 nist_186_2_ecdsa_testvector_71),
3728 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3729 nist_186_2_ecdsa_testvector_71),
3730 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3731 nist_186_2_ecdsa_testvector_72),
3732 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3733 nist_186_2_ecdsa_testvector_72),
3734 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3735 nist_186_2_ecdsa_testvector_73),
3736 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3737 nist_186_2_ecdsa_testvector_73),
3738 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3739 nist_186_2_ecdsa_testvector_74),
3740 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3741 nist_186_2_ecdsa_testvector_74),
3742 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3743 nist_186_2_ecdsa_testvector_75),
3744 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3745 nist_186_2_ecdsa_testvector_75),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003746 /* [K-163] - GP NOT SUPPORTED */
3747 /* [K-233] - GP NOT SUPPORTED */
3748 /* [K-283] - GP NOT SUPPORTED */
3749 /* [K-409] - GP NOT SUPPORTED */
3750 /* [K-571] - GP NOT SUPPORTED */
3751 /* [B-163] - GP NOT SUPPORTED */
3752 /* [B-233] - GP NOT SUPPORTED */
3753 /* [B-283] - GP NOT SUPPORTED */
3754 /* [B-409] - GP NOT SUPPORTED */
3755 /* [B-571] - GP NOT SUPPORTED */
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003756
3757 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_PKE, TEE_MODE_ENCRYPT,
3758 gmt_0003_part5_c2_sm2_testvector),
3759 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_PKE, TEE_MODE_DECRYPT,
3760 gmt_0003_part5_c2_sm2_testvector),
3761 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_PKE, TEE_MODE_ENCRYPT,
3762 sm2_testvector2),
Jerome Forissier849b57e2019-12-19 16:37:14 +01003763
3764 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_DSA_SM3, TEE_MODE_VERIFY,
3765 gmt_003_part5_a2),
3766 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_DSA_SM3, TEE_MODE_SIGN,
3767 gmt_003_part5_a2),
Pascal Brandc639ac82015-07-02 08:53:34 +02003768};
3769
Valerii Chubarab9863c2022-08-12 07:42:29 +00003770static const struct xtest_ac_case xtest_ac_eddsa_cases[] = {
3771
3772 XTEST_AC_EDDSA_CASE(0, TEE_ALG_ED25519, TEE_MODE_SIGN,
3773 ed25519_rfc_8032_7_1, 0),
3774 XTEST_AC_EDDSA_CASE(0, TEE_ALG_ED25519, TEE_MODE_VERIFY,
3775 ed25519_rfc_8032_7_1, 0),
3776
3777 XTEST_AC_EDDSA_CTX_CASE(0, TEE_ALG_ED25519, TEE_MODE_SIGN,
3778 ed25519ctx_rfc_8032_7_2, 0),
3779 XTEST_AC_EDDSA_CTX_CASE(0, TEE_ALG_ED25519, TEE_MODE_VERIFY,
3780 ed25519ctx_rfc_8032_7_2, 0),
3781
3782 XTEST_AC_EDDSA_CASE(0, TEE_ALG_ED25519, TEE_MODE_SIGN,
3783 ed25519ph_rfc_8032_7_3, 1),
3784 XTEST_AC_EDDSA_CASE(0, TEE_ALG_ED25519, TEE_MODE_VERIFY,
3785 ed25519ph_rfc_8032_7_3, 1),
3786};
3787
Pascal Brandc639ac82015-07-02 08:53:34 +02003788static bool create_key(ADBG_Case_t *c, TEEC_Session *s,
3789 uint32_t max_key_size, uint32_t key_type,
3790 TEE_Attribute *attrs, size_t num_attrs,
3791 TEE_ObjectHandle *handle)
3792{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003793 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02003794
3795 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3796 ta_crypt_cmd_allocate_transient_object(c, s, key_type,
3797 max_key_size, handle)))
3798 return false;
3799
3800 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3801 ta_crypt_cmd_populate_transient_object(c, s, *handle, attrs,
3802 num_attrs)))
3803 return false;
3804
3805 for (n = 0; n < num_attrs; n++) {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003806 uint8_t out[512] = { };
3807 size_t out_size = sizeof(out);
Pascal Brand3e143ee2015-07-15 17:17:16 +02003808
3809 if (attrs[n].attributeID == TEE_ATTR_ECC_CURVE)
3810 continue;
3811
Pascal Brandc639ac82015-07-02 08:53:34 +02003812 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3813 ta_crypt_cmd_get_object_buffer_attribute(c, s, *handle,
3814 attrs[n].attributeID, out, &out_size)))
3815 return false;
3816
Pascal Brand3e143ee2015-07-15 17:17:16 +02003817 if (out_size < attrs[n].content.ref.length) {
3818 memmove(out + (attrs[n].content.ref.length - out_size),
3819 out,
3820 attrs[n].content.ref.length);
3821 memset(out, 0, attrs[n].content.ref.length - out_size);
3822 out_size = attrs[n].content.ref.length;
3823 }
3824
Pascal Brandc639ac82015-07-02 08:53:34 +02003825 if (!ADBG_EXPECT_BUFFER(c, attrs[n].content.ref.buffer,
3826 attrs[n].content.ref.length, out, out_size))
3827 return false;
3828 }
3829
3830 return true;
3831}
3832
Jerome Forissier26393882022-03-09 21:22:30 +01003833#define XTEST_NO_CURVE 0xFFFFFFFF /* implementation-defined as per GP spec */
3834
Pascal Brandc639ac82015-07-02 08:53:34 +02003835static void xtest_tee_test_4006(ADBG_Case_t *c)
3836{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003837 TEEC_Session session = { };
Sami Tolvanenf3e46d42024-04-09 21:50:41 +00003838 TEEC_Result res = TEEC_ERROR_NOT_SUPPORTED;
Pascal Brandc639ac82015-07-02 08:53:34 +02003839 TEE_OperationHandle op = TEE_HANDLE_NULL;
3840 TEE_ObjectHandle priv_key_handle = TEE_HANDLE_NULL;
3841 TEE_ObjectHandle pub_key_handle = TEE_HANDLE_NULL;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003842 TEE_Attribute key_attrs[8] = { };
Jens Wiklander1f06b7d2022-12-02 21:49:57 +01003843 TEE_Attribute algo_params[2] = { };
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003844 size_t num_algo_params = 0;
3845 uint8_t out[512] = { };
3846 size_t out_size = 0;
3847 uint8_t out_enc[512] = { };
3848 size_t out_enc_size = 0;
3849 uint8_t ptx_hash[TEE_MAX_HASH_SIZE] = { };
Etienne Carriere481c6602019-01-22 13:27:26 +01003850 size_t ptx_hash_size = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003851 size_t max_key_size = 0;
3852 size_t num_key_attrs = 0;
3853 uint32_t ret_orig = 0;
3854 size_t n = 0;
3855 uint32_t curve = 0;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003856 uint32_t pub_key_type = 0;
3857 uint32_t priv_key_type = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003858 uint32_t hash_algo = 0;
Etienne Carrierea286b572023-06-28 14:30:19 +02003859 uint32_t sha1_algo_id = TEE_ALG_SHA1;
Pascal Brandc639ac82015-07-02 08:53:34 +02003860
3861 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3862 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
3863 &ret_orig)))
3864 return;
3865
3866 for (n = 0; n < ARRAY_SIZE(xtest_ac_cases); n++) {
3867 const struct xtest_ac_case *tv = xtest_ac_cases + n;
3868
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003869 if (tv->level > level)
3870 continue;
3871
Jerome Forissier4b03e282020-01-22 16:33:12 +01003872 if ((tv->algo == TEE_ALG_SM2_PKE ||
3873 tv->algo == TEE_ALG_SM2_DSA_SM3) &&
3874 !ta_crypt_cmd_is_algo_supported(c, &session, tv->algo,
3875 TEE_ECC_CURVE_SM2)) {
3876 Do_ADBG_Log("SM2 not supported: skip subcase");
3877 continue;
3878 }
3879
Pascal Brandc639ac82015-07-02 08:53:34 +02003880 Do_ADBG_BeginSubCase(c, "Asym Crypto case %d algo 0x%x line %d",
3881 (int)n, (unsigned int)tv->algo,
3882 (int)tv->line);
3883
3884 /*
3885 * When signing or verifying we're working with the hash of
3886 * the payload.
3887 */
3888 if (tv->mode == TEE_MODE_VERIFY || tv->mode == TEE_MODE_SIGN) {
Pascal Brand3e143ee2015-07-15 17:17:16 +02003889 if (TEE_ALG_GET_MAIN_ALG(tv->algo) == TEE_MAIN_ALGO_ECDSA)
3890 hash_algo = TEE_ALG_SHA1;
Gabor Szekely2ad190f2018-09-14 14:05:06 +00003891#if defined(CFG_CRYPTO_RSASSA_NA1)
3892 else if (tv->algo == TEE_ALG_RSASSA_PKCS1_V1_5)
3893 hash_algo = TEE_ALG_SHA256;
3894#endif
Pascal Brand3e143ee2015-07-15 17:17:16 +02003895 else
3896 hash_algo = TEE_ALG_HASH_ALGO(
3897 TEE_ALG_GET_DIGEST_HASH(tv->algo));
Pascal Brandc639ac82015-07-02 08:53:34 +02003898
3899 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3900 ta_crypt_cmd_allocate_operation(c, &session,
3901 &op, hash_algo, TEE_MODE_DIGEST, 0)))
3902 goto out;
3903
3904 ptx_hash_size = sizeof(ptx_hash);
3905 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3906 ta_crypt_cmd_digest_do_final(c, & session, op,
3907 tv->ptx, tv->ptx_len, ptx_hash,
3908 &ptx_hash_size)))
3909 goto out;
3910
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003911 /*
3912 * When we use DSA algorithms, the size of the hash we
3913 * consider equals the min between the size of the
3914 * "subprime" in the key and the size of the hash
3915 */
3916 if (TEE_ALG_GET_MAIN_ALG(tv->algo) ==
3917 TEE_MAIN_ALGO_DSA) {
3918 if (tv->params.dsa.sub_prime_len <=
3919 ptx_hash_size)
3920 ptx_hash_size =
3921 tv->params.dsa.sub_prime_len;
3922 }
3923
Pascal Brandc639ac82015-07-02 08:53:34 +02003924 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3925 ta_crypt_cmd_free_operation(c, &session, op)))
3926 goto out;
3927 }
3928
3929 num_algo_params = 0;
3930 num_key_attrs = 0;
3931 switch (TEE_ALG_GET_MAIN_ALG(tv->algo)) {
3932 case TEE_MAIN_ALGO_RSA:
3933 if (tv->params.rsa.salt_len > 0) {
3934 algo_params[0].attributeID =
3935 TEE_ATTR_RSA_PSS_SALT_LENGTH;
3936 algo_params[0].content.value.a =
3937 tv->params.rsa.salt_len;
3938 algo_params[0].content.value.b = 0;
3939 num_algo_params = 1;
3940 }
3941
3942 max_key_size = tv->params.rsa.modulus_len * 8;
3943
3944 xtest_add_attr(&num_key_attrs, key_attrs,
3945 TEE_ATTR_RSA_MODULUS,
3946 tv->params.rsa.modulus,
3947 tv->params.rsa.modulus_len);
3948 xtest_add_attr(&num_key_attrs, key_attrs,
3949 TEE_ATTR_RSA_PUBLIC_EXPONENT,
3950 tv->params.rsa.pub_exp,
3951 tv->params.rsa.pub_exp_len);
3952
3953 if (!ADBG_EXPECT_TRUE(c,
3954 create_key(c, &session,
3955 max_key_size,
3956 TEE_TYPE_RSA_PUBLIC_KEY,
3957 key_attrs,
3958 num_key_attrs,
3959 &pub_key_handle)))
3960 goto out;
3961
3962 xtest_add_attr(&num_key_attrs, key_attrs,
3963 TEE_ATTR_RSA_PRIVATE_EXPONENT,
3964 tv->params.rsa.priv_exp,
3965 tv->params.rsa.priv_exp_len);
3966
3967 if (tv->params.rsa.prime1_len != 0) {
3968 xtest_add_attr(&num_key_attrs, key_attrs,
3969 TEE_ATTR_RSA_PRIME1,
3970 tv->params.rsa.prime1,
3971 tv->params.rsa.prime1_len);
3972 }
3973
3974 if (tv->params.rsa.prime2_len != 0) {
3975 xtest_add_attr(&num_key_attrs, key_attrs,
3976 TEE_ATTR_RSA_PRIME2,
3977 tv->params.rsa.prime2,
3978 tv->params.rsa.prime2_len);
3979 }
3980
3981 if (tv->params.rsa.exp1_len != 0) {
3982 xtest_add_attr(&num_key_attrs, key_attrs,
3983 TEE_ATTR_RSA_EXPONENT1,
3984 tv->params.rsa.exp1,
3985 tv->params.rsa.exp1_len);
3986 }
3987
3988 if (tv->params.rsa.exp2_len != 0) {
3989 xtest_add_attr(&num_key_attrs, key_attrs,
3990 TEE_ATTR_RSA_EXPONENT2,
3991 tv->params.rsa.exp2,
3992 tv->params.rsa.exp2_len);
3993 }
3994
3995 if (tv->params.rsa.coeff_len != 0) {
3996 xtest_add_attr(&num_key_attrs, key_attrs,
3997 TEE_ATTR_RSA_COEFFICIENT,
3998 tv->params.rsa.coeff,
3999 tv->params.rsa.coeff_len);
4000 }
4001
4002 if (!ADBG_EXPECT_TRUE(c,
4003 create_key(c, &session,
4004 max_key_size,
4005 TEE_TYPE_RSA_KEYPAIR,
4006 key_attrs,
4007 num_key_attrs,
4008 &priv_key_handle)))
4009 goto out;
4010 break;
4011
4012 case TEE_MAIN_ALGO_DSA:
4013 max_key_size = tv->params.dsa.prime_len * 8;
4014
4015 xtest_add_attr(&num_key_attrs, key_attrs,
4016 TEE_ATTR_DSA_PRIME,
4017 tv->params.dsa.prime,
4018 tv->params.dsa.prime_len);
4019 xtest_add_attr(&num_key_attrs, key_attrs,
4020 TEE_ATTR_DSA_SUBPRIME,
4021 tv->params.dsa.sub_prime,
4022 tv->params.dsa.sub_prime_len);
4023 xtest_add_attr(&num_key_attrs, key_attrs,
4024 TEE_ATTR_DSA_BASE,
4025 tv->params.dsa.base,
4026 tv->params.dsa.base_len);
4027 xtest_add_attr(&num_key_attrs, key_attrs,
4028 TEE_ATTR_DSA_PUBLIC_VALUE,
4029 tv->params.dsa.pub_val,
4030 tv->params.dsa.pub_val_len);
4031
4032 if (!ADBG_EXPECT_TRUE(c,
4033 create_key(c, &session, max_key_size,
4034 TEE_TYPE_DSA_PUBLIC_KEY, key_attrs,
4035 num_key_attrs, &pub_key_handle)))
4036 goto out;
4037
4038 xtest_add_attr(&num_key_attrs, key_attrs,
4039 TEE_ATTR_DSA_PRIVATE_VALUE,
4040 tv->params.dsa.priv_val,
4041 tv->params.dsa.priv_val_len);
4042
4043 if (!ADBG_EXPECT_TRUE(c,
4044 create_key(c, &session, max_key_size,
4045 TEE_TYPE_DSA_KEYPAIR, key_attrs,
4046 num_key_attrs, &priv_key_handle)))
4047 goto out;
4048 break;
4049
Pascal Brand3e143ee2015-07-15 17:17:16 +02004050 case TEE_MAIN_ALGO_ECDSA:
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004051 case TEE_MAIN_ALGO_SM2_PKE:
Jerome Forissier849b57e2019-12-19 16:37:14 +01004052 case TEE_MAIN_ALGO_SM2_DSA_SM3:
Pascal Brand3e143ee2015-07-15 17:17:16 +02004053 switch (tv->algo) {
4054 case TEE_ALG_ECDSA_P192:
4055 curve = TEE_ECC_CURVE_NIST_P192;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004056 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
4057 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02004058 break;
4059 case TEE_ALG_ECDSA_P224:
4060 curve = TEE_ECC_CURVE_NIST_P224;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004061 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
4062 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02004063 break;
4064 case TEE_ALG_ECDSA_P256:
4065 curve = TEE_ECC_CURVE_NIST_P256;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004066 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
4067 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02004068 break;
4069 case TEE_ALG_ECDSA_P384:
4070 curve = TEE_ECC_CURVE_NIST_P384;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004071 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
4072 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02004073 break;
4074 case TEE_ALG_ECDSA_P521:
4075 curve = TEE_ECC_CURVE_NIST_P521;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004076 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
4077 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
4078 break;
4079 case TEE_ALG_SM2_PKE:
Jerome Forissier26393882022-03-09 21:22:30 +01004080 curve = XTEST_NO_CURVE;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004081 pub_key_type = TEE_TYPE_SM2_PKE_PUBLIC_KEY;
4082 priv_key_type = TEE_TYPE_SM2_PKE_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02004083 break;
Jerome Forissier849b57e2019-12-19 16:37:14 +01004084 case TEE_ALG_SM2_DSA_SM3:
Jerome Forissier26393882022-03-09 21:22:30 +01004085 curve = XTEST_NO_CURVE;
Jerome Forissier849b57e2019-12-19 16:37:14 +01004086 pub_key_type = TEE_TYPE_SM2_DSA_PUBLIC_KEY;
4087 priv_key_type = TEE_TYPE_SM2_DSA_KEYPAIR;
4088 break;
Pascal Brand3e143ee2015-07-15 17:17:16 +02004089 default:
4090 curve = 0xFF;
4091 break;
4092 }
4093
4094 if (tv->algo == TEE_ALG_ECDSA_P521)
4095 max_key_size = 521;
4096 else
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01004097 max_key_size = tv->params.ecc.private_len * 8;
Pascal Brand3e143ee2015-07-15 17:17:16 +02004098
Jerome Forissier26393882022-03-09 21:22:30 +01004099 if (curve != XTEST_NO_CURVE)
4100 xtest_add_attr_value(&num_key_attrs, key_attrs,
Pascal Brand3e143ee2015-07-15 17:17:16 +02004101 TEE_ATTR_ECC_CURVE, curve, 0);
4102 xtest_add_attr(&num_key_attrs, key_attrs,
4103 TEE_ATTR_ECC_PUBLIC_VALUE_X,
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01004104 tv->params.ecc.public_x,
4105 tv->params.ecc.public_x_len);
Pascal Brand3e143ee2015-07-15 17:17:16 +02004106 xtest_add_attr(&num_key_attrs, key_attrs,
4107 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01004108 tv->params.ecc.public_y,
4109 tv->params.ecc.public_y_len);
Pascal Brand3e143ee2015-07-15 17:17:16 +02004110
4111 if (!ADBG_EXPECT_TRUE(c,
4112 create_key(c, &session, max_key_size,
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004113 pub_key_type, key_attrs,
Pascal Brand3e143ee2015-07-15 17:17:16 +02004114 num_key_attrs, &pub_key_handle)))
4115 goto out;
4116
4117 xtest_add_attr(&num_key_attrs, key_attrs,
4118 TEE_ATTR_ECC_PRIVATE_VALUE,
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01004119 tv->params.ecc.private,
4120 tv->params.ecc.private_len);
Pascal Brand3e143ee2015-07-15 17:17:16 +02004121
4122 if (!ADBG_EXPECT_TRUE(c,
4123 create_key(c, &session, max_key_size,
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004124 priv_key_type, key_attrs,
Pascal Brand3e143ee2015-07-15 17:17:16 +02004125 num_key_attrs, &priv_key_handle)))
4126 goto out;
4127 break;
4128
Pascal Brandc639ac82015-07-02 08:53:34 +02004129 default:
4130 ADBG_EXPECT_TRUE(c, false);
4131 goto out;
4132 }
4133
4134 out_size = sizeof(out);
4135 memset(out, 0, sizeof(out));
4136 switch (tv->mode) {
4137 case TEE_MODE_ENCRYPT:
4138 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4139 ta_crypt_cmd_allocate_operation(c, &session,
Pascal Brand3e143ee2015-07-15 17:17:16 +02004140 &op, tv->algo, TEE_MODE_ENCRYPT,
4141 max_key_size)))
Pascal Brandc639ac82015-07-02 08:53:34 +02004142 goto out;
4143
4144 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4145 ta_crypt_cmd_set_operation_key(c, &session, op,
4146 pub_key_handle)))
4147 goto out;
4148
4149 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4150 ta_crypt_cmd_free_transient_object(c, &session,
4151 pub_key_handle)))
4152 goto out;
4153 pub_key_handle = TEE_HANDLE_NULL;
4154
Jens Wiklander1f06b7d2022-12-02 21:49:57 +01004155 num_algo_params = 0;
Sami Tolvanenf3e46d42024-04-09 21:50:41 +00004156 if (tv->algo == TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1 ||
4157 tv->algo == TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA256) {
Jens Wiklander1f06b7d2022-12-02 21:49:57 +01004158 algo_params[0].attributeID =
4159 TEE_ATTR_RSA_OAEP_MGF_HASH;
4160 algo_params[0].content.ref.length =
Etienne Carrierea286b572023-06-28 14:30:19 +02004161 sizeof(sha1_algo_id);
Jens Wiklander1f06b7d2022-12-02 21:49:57 +01004162 algo_params[0].content.ref.buffer =
Etienne Carrierea286b572023-06-28 14:30:19 +02004163 &sha1_algo_id;
Jens Wiklander1f06b7d2022-12-02 21:49:57 +01004164 num_algo_params = 1;
4165 }
4166
Pascal Brandc639ac82015-07-02 08:53:34 +02004167 out_enc_size = sizeof(out_enc);
Sami Tolvanenf3e46d42024-04-09 21:50:41 +00004168 res = ta_crypt_cmd_asymmetric_encrypt(c, &session, op,
Jens Wiklander1f06b7d2022-12-02 21:49:57 +01004169 algo_params, num_algo_params, tv->ptx,
Sami Tolvanenf3e46d42024-04-09 21:50:41 +00004170 tv->ptx_len, out_enc, &out_enc_size);
4171
4172 if (tv->algo == TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA256 &&
4173 res == TEEC_ERROR_NOT_SUPPORTED) {
4174 Do_ADBG_Log("RSA-OAEP with a different MGF1 hash not supported: skip subcase");
4175 break;
4176 }
4177
4178 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
Pascal Brandc639ac82015-07-02 08:53:34 +02004179 goto out;
4180
4181 /*
4182 * A PS which is random is added when formatting the
4183 * message internally of the algorithm so we can't
4184 * verify against precomputed values, instead we use the
4185 * decrypt operation to see that output is correct.
4186 */
4187
4188 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4189 ta_crypt_cmd_free_operation(c, &session, op)))
4190 goto out;
4191
4192 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4193 ta_crypt_cmd_allocate_operation(c, &session,
4194 &op, tv->algo, TEE_MODE_DECRYPT,
4195 max_key_size)))
4196 goto out;
4197
4198 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4199 ta_crypt_cmd_set_operation_key(c, &session, op,
4200 priv_key_handle)))
4201 goto out;
4202
4203 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4204 ta_crypt_cmd_free_transient_object(c, &session,
4205 priv_key_handle)))
4206 goto out;
4207
4208 priv_key_handle = TEE_HANDLE_NULL;
4209
4210 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4211 ta_crypt_cmd_asymmetric_decrypt(c, &session, op,
Sami Tolvanenf3e46d42024-04-09 21:50:41 +00004212 algo_params, num_algo_params, out_enc,
4213 out_enc_size, out, &out_size)))
Pascal Brandc639ac82015-07-02 08:53:34 +02004214 goto out;
4215
4216 (void)ADBG_EXPECT_BUFFER(c, tv->ptx, tv->ptx_len, out,
4217 out_size);
4218 break;
4219
4220 case TEE_MODE_DECRYPT:
4221 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4222 ta_crypt_cmd_allocate_operation(c, &session,
4223 &op, tv->algo, TEE_MODE_DECRYPT,
4224 max_key_size)))
4225 goto out;
4226
4227 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4228 ta_crypt_cmd_set_operation_key(c, &session, op,
4229 priv_key_handle)))
4230 goto out;
4231
4232 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4233 ta_crypt_cmd_free_transient_object(c, &session,
4234 priv_key_handle)))
4235 goto out;
4236
Sami Tolvanenf3e46d42024-04-09 21:50:41 +00004237 num_algo_params = 0;
4238 if (tv->algo == TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1 ||
4239 tv->algo == TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA256) {
4240 algo_params[0].attributeID =
4241 TEE_ATTR_RSA_OAEP_MGF_HASH;
4242 algo_params[0].content.ref.length =
4243 sizeof(sha1_algo_id);
4244 algo_params[0].content.ref.buffer =
4245 &sha1_algo_id;
4246 num_algo_params = 1;
4247 }
Pascal Brandc639ac82015-07-02 08:53:34 +02004248
Sami Tolvanenf3e46d42024-04-09 21:50:41 +00004249 priv_key_handle = TEE_HANDLE_NULL;
4250 res = ta_crypt_cmd_asymmetric_decrypt(c, &session, op,
4251 algo_params, num_algo_params, tv->ctx,
4252 tv->ctx_len, out, &out_size);
4253
4254 if (tv->algo == TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA256 &&
4255 res == TEEC_ERROR_NOT_SUPPORTED) {
4256 Do_ADBG_Log("RSA-OAEP with a different MGF1 hash not supported: skip subcase");
4257 break;
4258 }
4259
4260 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
Pascal Brandc639ac82015-07-02 08:53:34 +02004261 goto out;
4262
4263 (void)ADBG_EXPECT_BUFFER(c, tv->ptx, tv->ptx_len, out,
4264 out_size);
4265 break;
4266
4267 case TEE_MODE_VERIFY:
4268 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4269 ta_crypt_cmd_allocate_operation(c, &session,
4270 &op, tv->algo, TEE_MODE_VERIFY,
4271 max_key_size)))
4272 goto out;
4273
4274 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4275 ta_crypt_cmd_set_operation_key(c, &session, op,
4276 pub_key_handle)))
4277 goto out;
4278
4279 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4280 ta_crypt_cmd_free_transient_object(c, &session,
4281 pub_key_handle)))
4282 goto out;
4283
4284 pub_key_handle = TEE_HANDLE_NULL;
4285
4286 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4287 ta_crypt_cmd_asymmetric_verify(c, &session, op,
4288 algo_params, num_algo_params, ptx_hash,
4289 ptx_hash_size, tv->ctx, tv->ctx_len)))
4290 goto out;
4291 break;
4292
4293 case TEE_MODE_SIGN:
4294 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4295 ta_crypt_cmd_allocate_operation(c, &session,
4296 &op, tv->algo, TEE_MODE_SIGN,
4297 max_key_size)))
4298 goto out;
4299
4300 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4301 ta_crypt_cmd_set_operation_key(c, &session, op,
4302 priv_key_handle)))
4303 goto out;
4304
4305 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4306 ta_crypt_cmd_free_transient_object(c, &session,
4307 priv_key_handle)))
4308 goto out;
4309
4310 priv_key_handle = TEE_HANDLE_NULL;
4311
4312 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4313 ta_crypt_cmd_asymmetric_sign(c, &session, op,
4314 algo_params, num_algo_params, ptx_hash,
4315 ptx_hash_size, out, &out_size)))
4316 goto out;
4317
4318 if (TEE_ALG_GET_CHAIN_MODE(tv->algo) ==
4319 TEE_CHAIN_MODE_PKCS1_PSS_MGF1 ||
Pascal Brand3e143ee2015-07-15 17:17:16 +02004320 tv->algo == TEE_ALG_DSA_SHA1 ||
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02004321 tv->algo == TEE_ALG_DSA_SHA224 ||
4322 tv->algo == TEE_ALG_DSA_SHA256 ||
Pascal Brand3e143ee2015-07-15 17:17:16 +02004323 TEE_ALG_GET_MAIN_ALG(tv->algo) ==
Jerome Forissier849b57e2019-12-19 16:37:14 +01004324 TEE_MAIN_ALGO_ECDSA ||
4325 tv->algo == TEE_ALG_SM2_DSA_SM3) {
Pascal Brandc639ac82015-07-02 08:53:34 +02004326 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4327 ta_crypt_cmd_free_operation(c, &session,
4328 op)))
4329 goto out;
4330 /*
4331 * The salt or K is random so we can't verify
4332 * signing against precomputed values, instead
4333 * we use the verify operation to see that
4334 * output is correct.
4335 */
4336 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4337 ta_crypt_cmd_allocate_operation(c,
4338 &session, &op, tv->algo,
4339 TEE_MODE_VERIFY, max_key_size)))
4340 goto out;
4341
4342 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4343 ta_crypt_cmd_set_operation_key(c,
4344 &session, op, pub_key_handle)))
4345 goto out;
4346
4347 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4348 ta_crypt_cmd_free_transient_object(c,
4349 &session, pub_key_handle)))
4350 goto out;
4351
4352 pub_key_handle = TEE_HANDLE_NULL;
4353
4354 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4355 ta_crypt_cmd_asymmetric_verify(c,
4356 &session, op, algo_params,
4357 num_algo_params, ptx_hash,
4358 ptx_hash_size, out, out_size)))
4359 goto out;
4360 } else {
4361 (void)ADBG_EXPECT_BUFFER(c, tv->ctx,
4362 tv->ctx_len, out,
4363 out_size);
4364 }
4365 break;
4366
4367 default:
4368 break;
4369 }
4370
4371 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4372 ta_crypt_cmd_free_operation(c, &session, op)))
4373 goto out;
4374
4375 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4376 ta_crypt_cmd_free_transient_object(c, &session,
4377 pub_key_handle)))
4378 goto out;
4379 pub_key_handle = TEE_HANDLE_NULL;
4380
4381 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4382 ta_crypt_cmd_free_transient_object(c, &session,
4383 priv_key_handle)))
4384 goto out;
4385
4386 priv_key_handle = TEE_HANDLE_NULL;
4387
4388 Do_ADBG_EndSubCase(c, NULL);
4389 }
4390out:
4391 TEEC_CloseSession(&session);
4392}
Jens Wiklander14f48872018-06-29 15:30:13 +02004393ADBG_CASE_DEFINE(regression, 4006, xtest_tee_test_4006,
4394 "Test TEE Internal API Asymmetric Cipher operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02004395
4396#define KEY_ATTR(x, y) { #x, (x), y }
4397
4398struct key_attrs {
4399 const char *name;
4400 uint32_t attr;
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004401 /*
4402 * When keysize_check != 0: size of attribute is checked
4403 * Expected value is key_size bits except for DH in which case it is
4404 * the value of keysize_check.
4405 */
4406 uint32_t keysize_check;
Pascal Brandc639ac82015-07-02 08:53:34 +02004407};
4408
Clement Faure967368b2024-01-30 12:20:40 +01004409static bool is_caam_black_key(uint8_t *buf, size_t size)
4410{
4411 /*
4412 * This value is a magic number for the a CAAM Black key. This value
4413 * must match the value defined in optee-os
4414 * core/drivers/crypto/caam/caam_key.c
4415 */
4416 const uint8_t magic_number[4] = {0xFB, 0xBF, 0xAF, 0xCA};
4417
4418 if (size < sizeof(magic_number))
4419 return false;
4420
4421 return !memcmp(buf, magic_number, sizeof(magic_number));
4422}
4423
Pascal Brandc639ac82015-07-02 08:53:34 +02004424static bool test_keygen_attributes(ADBG_Case_t *c, TEEC_Session *s,
4425 TEE_ObjectHandle key, uint32_t key_size,
4426 struct key_attrs *attrs, size_t num_attrs)
4427{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004428 uint8_t out[2048] = { };
4429 size_t out_size = 0;
4430 size_t n = 0;
4431 size_t m = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004432
4433 for (m = 0; m < num_attrs; m++) {
4434 if ((attrs[m].attr & TEE_ATTR_BIT_VALUE) == 0) {
4435 out_size = sizeof(out);
4436 memset(out, 0, sizeof(out));
4437 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4438 ta_crypt_cmd_get_object_buffer_attribute(c, s,
4439 key, attrs[m].attr, out, &out_size)))
4440 return false;
4441
Clement Faure967368b2024-01-30 12:20:40 +01004442 /*
4443 * Check for CAAM black key header. If the buffer holds
4444 * a CAAM black key, do not check the key size as the
4445 * buffer size and the key size do not match.
4446 */
4447 if (attrs[m].keysize_check &&
4448 !is_caam_black_key(out, out_size))
Jerome Forissierfe94e562020-11-17 17:22:40 +01004449 ADBG_EXPECT_COMPARE_UNSIGNED(c, out_size, <=,
Pascal Brandc639ac82015-07-02 08:53:34 +02004450 key_size / 8);
4451
4452 if (out_size > 0) {
4453 /* Check that buffer isn't all zeroes */
4454 for (n = 0; n < out_size; n++)
4455 if (out[n] != 0)
4456 break;
4457 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, n, <,
4458 out_size))
4459 return false;
4460 }
4461 } else {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004462 uint32_t a = 0;
4463 uint32_t b = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004464
4465 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4466 ta_crypt_cmd_get_object_value_attribute(c, s, key,
4467 attrs[m].attr, &a, &b)))
4468 return false;
4469 }
4470 }
4471 return true;
4472}
4473
4474static bool test_secret_value(ADBG_Case_t *c, TEEC_Session *s,
4475 TEE_ObjectHandle key, uint32_t key_size)
4476{
4477 const struct key_attrs attrs[] = {
4478 KEY_ATTR(TEE_ATTR_SECRET_VALUE, true),
4479 };
4480
4481 return test_keygen_attributes(c, s, key, key_size,
4482 (struct key_attrs *)&attrs,
4483 ARRAY_SIZE(attrs));
4484}
4485
4486
4487static bool test_rsa_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4488 TEE_ObjectHandle key, uint32_t key_size)
4489{
4490 const struct key_attrs attrs[] = {
4491 KEY_ATTR(TEE_ATTR_RSA_MODULUS, true),
4492 KEY_ATTR(TEE_ATTR_RSA_PUBLIC_EXPONENT, false),
4493 KEY_ATTR(TEE_ATTR_RSA_PRIVATE_EXPONENT, false),
4494 KEY_ATTR(TEE_ATTR_RSA_PRIME1, false),
4495 KEY_ATTR(TEE_ATTR_RSA_PRIME2, false),
4496 KEY_ATTR(TEE_ATTR_RSA_EXPONENT1, false),
4497 KEY_ATTR(TEE_ATTR_RSA_EXPONENT2, false),
4498 KEY_ATTR(TEE_ATTR_RSA_COEFFICIENT, false),
4499 };
4500
4501 return test_keygen_attributes(c, s, key, key_size,
4502 (struct key_attrs *)&attrs,
4503 ARRAY_SIZE(attrs));
4504}
4505
Pascal Brande61133f2015-07-08 15:38:37 +02004506static bool test_ecc_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4507 TEE_ObjectHandle key, uint32_t key_size)
4508{
4509 const struct key_attrs attrs[] = {
4510 KEY_ATTR(TEE_ATTR_ECC_PRIVATE_VALUE, false),
4511 KEY_ATTR(TEE_ATTR_ECC_PUBLIC_VALUE_X , false),
4512 KEY_ATTR(TEE_ATTR_ECC_PUBLIC_VALUE_Y , false),
4513 /* KEY_ATTR(TEE_ATTR_ECC_CURVE, false), - do not test */
4514 };
4515
4516 return test_keygen_attributes(c, s, key, key_size,
4517 (struct key_attrs *)&attrs,
4518 ARRAY_SIZE(attrs));
4519}
4520
Pascal Brandc639ac82015-07-02 08:53:34 +02004521static bool test_dh_key_pair(ADBG_Case_t *c, TEEC_Session *s,
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004522 TEE_ObjectHandle key, uint32_t check_keysize)
Pascal Brandc639ac82015-07-02 08:53:34 +02004523{
4524 const struct key_attrs attrs[] = {
4525 KEY_ATTR(TEE_ATTR_DH_PRIME, false),
4526 KEY_ATTR(TEE_ATTR_DH_BASE, false),
4527 KEY_ATTR(TEE_ATTR_DH_PUBLIC_VALUE, false),
4528 KEY_ATTR(TEE_ATTR_DH_PRIVATE_VALUE, check_keysize),
4529 KEY_ATTR(TEE_ATTR_DH_X_BITS, false),
4530 };
4531
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004532 return test_keygen_attributes(c, s, key, check_keysize,
Pascal Brandc639ac82015-07-02 08:53:34 +02004533 (struct key_attrs *)&attrs,
4534 ARRAY_SIZE(attrs));
4535}
4536
4537static bool test_dsa_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4538 TEE_ObjectHandle key, uint32_t key_size)
4539{
4540 const struct key_attrs attrs[] = {
4541 KEY_ATTR(TEE_ATTR_DSA_PRIME, true),
4542 KEY_ATTR(TEE_ATTR_DSA_SUBPRIME, false),
4543 KEY_ATTR(TEE_ATTR_DSA_BASE, false),
4544 KEY_ATTR(TEE_ATTR_DSA_PUBLIC_VALUE, false),
4545 KEY_ATTR(TEE_ATTR_DSA_PRIVATE_VALUE, false),
4546 };
4547
4548 return test_keygen_attributes(c, s, key, key_size,
4549 (struct key_attrs *)&attrs,
4550 ARRAY_SIZE(attrs));
4551}
4552
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03004553static bool test_x25519_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4554 TEE_ObjectHandle key, uint32_t key_size)
4555{
4556 const struct key_attrs attrs[] = {
4557 KEY_ATTR(TEE_ATTR_X25519_PRIVATE_VALUE, false),
4558 KEY_ATTR(TEE_ATTR_X25519_PUBLIC_VALUE, false),
4559 };
4560
4561 return test_keygen_attributes(c, s, key, key_size,
4562 (struct key_attrs *)&attrs,
4563 ARRAY_SIZE(attrs));
4564}
4565
Valerii Chubarab9863c2022-08-12 07:42:29 +00004566static bool test_ed25519_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4567 TEE_ObjectHandle key, uint32_t key_size)
4568{
4569 const struct key_attrs attrs[] = {
4570 KEY_ATTR(TEE_ATTR_ED25519_PRIVATE_VALUE, false),
4571 KEY_ATTR(TEE_ATTR_ED25519_PUBLIC_VALUE, false),
4572 };
4573
4574 return test_keygen_attributes(c, s, key, key_size,
4575 (struct key_attrs *)&attrs,
4576 ARRAY_SIZE(attrs));
4577}
4578
Pascal Brandc639ac82015-07-02 08:53:34 +02004579static bool generate_and_test_key(ADBG_Case_t *c, TEEC_Session *s,
4580 uint32_t key_type, uint32_t check_keysize,
4581 uint32_t key_size,
4582 TEE_Attribute *params, size_t param_count)
4583{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004584 TEE_ObjectHandle key = TEE_HANDLE_NULL;
Pascal Brandc639ac82015-07-02 08:53:34 +02004585 bool ret_val = true;
4586
4587 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4588 ta_crypt_cmd_allocate_transient_object(c, s, key_type, key_size,
4589 &key)))
4590 return false;
4591
4592 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4593 ta_crypt_cmd_generate_key(c, s, key, key_size, params,
4594 param_count)))
4595 return false;
4596
4597 switch (key_type) {
4598 case TEE_TYPE_DES:
4599 case TEE_TYPE_DES3:
4600 ret_val = ADBG_EXPECT_TRUE(c,
4601 test_secret_value(c, s, key,
4602 key_size + key_size / 7));
4603 break;
4604 case TEE_TYPE_AES:
4605 case TEE_TYPE_HMAC_MD5:
4606 case TEE_TYPE_HMAC_SHA1:
4607 case TEE_TYPE_HMAC_SHA224:
4608 case TEE_TYPE_HMAC_SHA256:
4609 case TEE_TYPE_HMAC_SHA384:
4610 case TEE_TYPE_HMAC_SHA512:
4611 case TEE_TYPE_GENERIC_SECRET:
4612 ret_val = ADBG_EXPECT_TRUE(c,
4613 test_secret_value(c, s, key, key_size));
4614 break;
4615
4616 case TEE_TYPE_RSA_KEYPAIR:
4617 ret_val = ADBG_EXPECT_TRUE(c,
4618 test_rsa_key_pair(c, s, key, key_size));
4619 break;
4620
Pascal Brande61133f2015-07-08 15:38:37 +02004621 case TEE_TYPE_ECDSA_KEYPAIR:
4622 case TEE_TYPE_ECDH_KEYPAIR:
4623 ret_val = ADBG_EXPECT_TRUE(c,
4624 test_ecc_key_pair(c, s, key, key_size));
4625 break;
4626
Pascal Brandc639ac82015-07-02 08:53:34 +02004627 case TEE_TYPE_DH_KEYPAIR:
Pascal Brande61133f2015-07-08 15:38:37 +02004628 ret_val = ADBG_EXPECT_TRUE(c,
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004629 test_dh_key_pair(c, s, key, check_keysize));
Pascal Brandc639ac82015-07-02 08:53:34 +02004630 break;
4631
4632 case TEE_TYPE_DSA_KEYPAIR:
4633 ret_val = ADBG_EXPECT_TRUE(c,
4634 test_dsa_key_pair(c, s, key, key_size));
4635 break;
4636
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03004637 case TEE_TYPE_X25519_KEYPAIR:
4638 ret_val = ADBG_EXPECT_TRUE(c,
4639 test_x25519_key_pair(c, s, key, key_size));
4640 break;
4641
Valerii Chubarab9863c2022-08-12 07:42:29 +00004642 case TEE_TYPE_ED25519_KEYPAIR:
4643 ret_val = ADBG_EXPECT_TRUE(c,
4644 test_ed25519_key_pair(c, s, key, key_size));
4645 break;
4646
Pascal Brandc639ac82015-07-02 08:53:34 +02004647 default:
4648 ret_val = false;
4649 break;
4650 }
4651
4652 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4653 ta_crypt_cmd_free_transient_object(c, s, key)))
4654 return false;
4655
4656 return ret_val;
4657}
4658
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004659struct key_types_noparam {
4660 unsigned level;
4661 const char *name;
4662 uint32_t key_type;
4663 uint32_t quanta;
4664 uint32_t min_size;
4665 uint32_t max_size;
4666};
4667
4668static void keygen_noparams(ADBG_Case_t *c, TEEC_Session *session,
4669 const struct key_types_noparam *key_types,
4670 size_t num_key_types)
Pascal Brandc639ac82015-07-02 08:53:34 +02004671{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004672 size_t n = 0;
4673 uint32_t key_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004674
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004675 for (n = 0; n < num_key_types; n++) {
Pascal Brandc639ac82015-07-02 08:53:34 +02004676 uint32_t min_size = key_types[n].min_size;
4677 uint32_t max_size = key_types[n].max_size;
4678 uint32_t quanta = key_types[n].quanta;
4679
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004680 if (key_types[n].level > level)
4681 continue;
4682
Pascal Brandc639ac82015-07-02 08:53:34 +02004683 Do_ADBG_BeginSubCase(c, "Generate %s key", key_types[n].name);
4684
4685 for (key_size = min_size; key_size <= max_size;
4686 key_size += quanta) {
4687 if (!ADBG_EXPECT_TRUE(c,
4688 generate_and_test_key(c, session, key_types
4689 [n].key_type, 1, key_size, NULL, 0)))
4690 break;
4691 }
4692
4693 Do_ADBG_EndSubCase(c, "Generate %s key", key_types[n].name);
4694 }
4695}
4696
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004697static void xtest_tee_test_4007_symmetric(ADBG_Case_t *c)
Pascal Brandc639ac82015-07-02 08:53:34 +02004698{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004699 TEEC_Session session = { };
4700 uint32_t ret_orig = 0;
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004701 static const struct key_types_noparam key_types[] = {
4702 { 0, "AES", TEE_TYPE_AES, 64, 128,
4703 256 /* valid sizes 128, 192, 256 */ },
4704 { 0, "DES", TEE_TYPE_DES, 56, 56, 56 /* valid size 56 */ },
4705 { 0, "DES3", TEE_TYPE_DES3, 56, 112,
4706 168 /* valid sizes 112, 168 */ },
4707 { 0, "HMAC-MD5", TEE_TYPE_HMAC_MD5, 8, 64, 512 },
4708 { 0, "HMAC-SHA1", TEE_TYPE_HMAC_SHA1, 8, 80, 512 },
4709 { 0, "HMAC-SHA224", TEE_TYPE_HMAC_SHA224, 8, 112, 512 },
4710 { 0, "HMAC-SHA256", TEE_TYPE_HMAC_SHA256, 8, 192, 1024 },
4711 { 0, "HMAC-SHA384", TEE_TYPE_HMAC_SHA384, 8, 256, 1024 },
4712 { 0, "HMAC-SHA512", TEE_TYPE_HMAC_SHA512, 8, 256, 1024 },
4713 { 0, "Generic secret", TEE_TYPE_GENERIC_SECRET, 8, 128, 4096 },
4714 };
4715
4716 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4717 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4718 &ret_orig)))
4719 return;
4720
4721 keygen_noparams(c, &session, key_types, ARRAY_SIZE(key_types));
4722
4723 TEEC_CloseSession(&session);
4724}
4725ADBG_CASE_DEFINE(regression, 4007_symmetric, xtest_tee_test_4007_symmetric,
4726 "Test TEE Internal API Generate Symmetric key");
4727
4728static void xtest_tee_test_4007_rsa(ADBG_Case_t *c)
4729{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004730 TEEC_Session session = { };
4731 uint32_t ret_orig = 0;
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004732 static const struct key_types_noparam key_types[] = {
Jorge Ramirez-Ortizb657ea42022-02-17 10:15:25 +01004733#ifndef CFG_CRYPTO_SE05X
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004734 { 0, "RSA-256", TEE_TYPE_RSA_KEYPAIR, 1, 256, 256 },
4735 { 1, "RSA-384", TEE_TYPE_RSA_KEYPAIR, 1, 384, 384 },
Jorge Ramirez-Ortizb657ea42022-02-17 10:15:25 +01004736#endif
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004737 { 1, "RSA-512", TEE_TYPE_RSA_KEYPAIR, 1, 512, 512 },
Jorge Ramirez-Ortizb657ea42022-02-17 10:15:25 +01004738#ifndef CFG_CRYPTO_SE05X
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004739 { 1, "RSA-640", TEE_TYPE_RSA_KEYPAIR, 1, 640, 640 },
4740 { 1, "RSA-768", TEE_TYPE_RSA_KEYPAIR, 1, 768, 768 },
4741 { 1, "RSA-896", TEE_TYPE_RSA_KEYPAIR, 1, 896, 896 },
Jorge Ramirez-Ortizb657ea42022-02-17 10:15:25 +01004742#endif
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004743 { 1, "RSA-1024", TEE_TYPE_RSA_KEYPAIR, 1, 1024, 1024 },
4744 { 1, "RSA-2048", TEE_TYPE_RSA_KEYPAIR, 1, 2048, 2048 },
4745 { 1, "RSA-3072", TEE_TYPE_RSA_KEYPAIR, 1, 3072, 3072 },
4746 { 1, "RSA-4096", TEE_TYPE_RSA_KEYPAIR, 1, 4096, 4096 },
4747 };
4748
4749 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4750 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4751 &ret_orig)))
4752 return;
4753
4754 keygen_noparams(c, &session, key_types, ARRAY_SIZE(key_types));
4755
4756 TEEC_CloseSession(&session);
4757}
4758ADBG_CASE_DEFINE(regression, 4007_rsa, xtest_tee_test_4007_rsa,
4759 "Test TEE Internal API Generate RSA key");
4760
4761static void xtest_tee_test_4007_dh(ADBG_Case_t *c)
4762{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004763 TEEC_Session session = { };
4764 uint32_t ret_orig = 0;
4765 size_t n = 0;
4766 size_t param_count = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004767 /*
4768 * Note that the key size parameter is not used when creating the keys
4769 * but specifying these sizes make it possible to test the expected size
4770 * of the private value. This also means that the keysize must match the
4771 * size of p or what is specified in private_bits or the equvivalent
4772 * size of the subprime parameter.
4773 */
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004774 TEE_Attribute params[4] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02004775
4776#define XTEST_DH_GK_DATA(vect) \
4777 ARRAY(vect ## _p), \
4778 ARRAY(vect ## _g), \
4779 &vect ## _private_bits, \
4780 0, 0
4781#define XTEST_DH_GK_DATA_SUBPRIME(vect) \
4782 ARRAY(vect ## _p), \
4783 ARRAY(vect ## _g), \
4784 &vect ## _private_bits, \
4785 ARRAY(vect ## _subprime)
4786 static const struct {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004787 unsigned level;
Pascal Brandc639ac82015-07-02 08:53:34 +02004788 uint32_t key_size;
4789 const uint8_t *p;
4790 size_t p_len;
4791 const uint8_t *g;
4792 size_t g_len;
4793 const uint32_t *private_bits;
4794 const uint8_t *subprime;
4795 size_t subprime_len;
4796 } key_types[] = {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004797 { 0, 256, XTEST_DH_GK_DATA(keygen_dh256) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004798 { 0, 320, XTEST_DH_GK_DATA(keygen_dh320) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004799 { 1, 384, XTEST_DH_GK_DATA(keygen_dh384) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004800 { 1, 448, XTEST_DH_GK_DATA(keygen_dh448) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004801 { 1, 512, XTEST_DH_GK_DATA(keygen_dh512) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004802 { 1, 576, XTEST_DH_GK_DATA(keygen_dh576) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004803 { 1, 640, XTEST_DH_GK_DATA(keygen_dh640) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004804 { 1, 704, XTEST_DH_GK_DATA(keygen_dh704) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004805 { 1, 768, XTEST_DH_GK_DATA(keygen_dh768) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004806 { 1, 832, XTEST_DH_GK_DATA(keygen_dh832) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004807 { 1, 896, XTEST_DH_GK_DATA(keygen_dh896) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004808 { 1, 960, XTEST_DH_GK_DATA(keygen_dh960) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004809 { 1, 1024, XTEST_DH_GK_DATA(keygen_dh1024) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004810 { 1, 1088, XTEST_DH_GK_DATA(keygen_dh1088) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004811 { 1, 1152, XTEST_DH_GK_DATA(keygen_dh1152) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004812 { 1, 1216, XTEST_DH_GK_DATA(keygen_dh1216) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004813 { 1, 1280, XTEST_DH_GK_DATA(keygen_dh1280) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004814 { 1, 1344, XTEST_DH_GK_DATA(keygen_dh1344) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004815 { 1, 1408, XTEST_DH_GK_DATA(keygen_dh1408) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004816 { 1, 1472, XTEST_DH_GK_DATA(keygen_dh1472) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004817 { 1, 1536, XTEST_DH_GK_DATA(keygen_dh1536) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004818 { 1, 1600, XTEST_DH_GK_DATA(keygen_dh1600) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004819 { 1, 1664, XTEST_DH_GK_DATA(keygen_dh1664) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004820 { 1, 1728, XTEST_DH_GK_DATA(keygen_dh1728) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004821 { 1, 1792, XTEST_DH_GK_DATA(keygen_dh1792) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004822 { 1, 1856, XTEST_DH_GK_DATA(keygen_dh1856) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004823 { 1, 1920, XTEST_DH_GK_DATA(keygen_dh1920) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004824 { 1, 1984, XTEST_DH_GK_DATA(keygen_dh1984) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004825 { 1, 2048, XTEST_DH_GK_DATA(keygen_dh2048) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004826 { 1, 2048, XTEST_DH_GK_DATA_SUBPRIME(keygen_dh2048_subprime) }
Pascal Brandc639ac82015-07-02 08:53:34 +02004827 };
4828
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004829 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4830 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4831 &ret_orig)))
4832 return;
Pascal Brandc639ac82015-07-02 08:53:34 +02004833
4834 for (n = 0; n < ARRAY_SIZE(key_types); n++) {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004835 if (key_types[n].level > level)
4836 continue;
4837
Pascal Brandc639ac82015-07-02 08:53:34 +02004838 Do_ADBG_BeginSubCase(c,
4839 "Generate DH key %d bits - Private bits = %d",
4840 key_types[n].key_size,
4841 *key_types[n].private_bits);
4842 param_count = 0;
4843
4844 xtest_add_attr(&param_count, params,
4845 TEE_ATTR_DH_PRIME,
4846 key_types[n].p, key_types[n].p_len);
4847
4848 xtest_add_attr(&param_count, params, TEE_ATTR_DH_BASE,
4849 key_types[n].g, key_types[n].g_len);
4850
4851 if (key_types[n].private_bits != 0) {
4852 params[param_count].attributeID = TEE_ATTR_DH_X_BITS;
4853
4854 params[param_count].content.value.a =
4855 *key_types[n].private_bits;
4856
4857 params[param_count].content.value.b = 0;
4858 param_count++;
4859 }
4860
4861 if (key_types[n].subprime != 0) {
4862 xtest_add_attr(&param_count, params,
4863 TEE_ATTR_DH_SUBPRIME,
4864 key_types[n].subprime,
4865 key_types[n].subprime_len);
4866 }
4867
4868 if (!ADBG_EXPECT_TRUE(c,
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004869 generate_and_test_key(c, &session, TEE_TYPE_DH_KEYPAIR,
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004870 *key_types[n].private_bits,
Pascal Brandc639ac82015-07-02 08:53:34 +02004871 key_types[n]. key_size, params, param_count)))
4872 break;
4873
4874 Do_ADBG_EndSubCase(c,
4875 "Generate DH key %d bits - Private bits = %d",
4876 key_types[n].key_size,
4877 *key_types[n].private_bits);
4878 }
Pascal Brandc639ac82015-07-02 08:53:34 +02004879
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004880 TEEC_CloseSession(&session);
4881}
4882ADBG_CASE_DEFINE(regression, 4007_dh, xtest_tee_test_4007_dh,
4883 "Test TEE Internal API Generate DH key");
4884
4885static void xtest_tee_test_4007_dsa(ADBG_Case_t *c)
Pascal Brandc639ac82015-07-02 08:53:34 +02004886{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004887 TEEC_Session session = { };
4888 uint32_t ret_orig = 0;
4889 size_t n = 0;
4890 size_t param_count = 0;
4891 TEE_Attribute params[4] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02004892
4893#define XTEST_DSA_GK_DATA(vect) \
4894 ARRAY(vect ## _p), \
4895 ARRAY(vect ## _g), \
4896 ARRAY(vect ## _q)
4897 static const struct {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004898 unsigned level;
Pascal Brandc639ac82015-07-02 08:53:34 +02004899 uint32_t key_size;
4900 const uint8_t *prime;
4901 size_t prime_len;
4902 const uint8_t *base;
4903 size_t base_len;
4904 const uint8_t *sub_prime;
4905 size_t sub_prime_len;
4906 } key_types[] = {
Jerome Forissiereed7e652020-04-15 15:42:38 +02004907 { 0, 1024, XTEST_DSA_GK_DATA(keygen_dsa_test1) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004908 { 0, 512, XTEST_DSA_GK_DATA(keygen_dsa512) },
Jerome Forissiereed7e652020-04-15 15:42:38 +02004909 { 0, 576, XTEST_DSA_GK_DATA(keygen_dsa576) },
4910 { 0, 640, XTEST_DSA_GK_DATA(keygen_dsa640) },
4911 { 0, 704, XTEST_DSA_GK_DATA(keygen_dsa704) },
4912 { 0, 768, XTEST_DSA_GK_DATA(keygen_dsa768) },
4913 { 0, 832, XTEST_DSA_GK_DATA(keygen_dsa832) },
4914 { 0, 896, XTEST_DSA_GK_DATA(keygen_dsa896) },
4915 { 0, 960, XTEST_DSA_GK_DATA(keygen_dsa960) },
4916 { 0, 1024, XTEST_DSA_GK_DATA(keygen_dsa1024) },
Pascal Brandc639ac82015-07-02 08:53:34 +02004917 };
4918
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004919 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4920 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4921 &ret_orig)))
4922 return;
4923
Pascal Brandc639ac82015-07-02 08:53:34 +02004924 for (n = 0; n < ARRAY_SIZE(key_types); n++) {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004925 if (key_types[n].level > level)
4926 continue;
4927
Pascal Brandc639ac82015-07-02 08:53:34 +02004928 Do_ADBG_BeginSubCase(c, "Generate DSA key %d bits",
4929 key_types[n].key_size);
4930 param_count = 0;
4931
4932
4933 xtest_add_attr(&param_count, params, TEE_ATTR_DSA_PRIME,
4934 key_types[n].prime, key_types[n].prime_len);
4935
4936 xtest_add_attr(&param_count, params, TEE_ATTR_DSA_SUBPRIME,
4937 key_types[n].sub_prime,
4938 key_types[n].sub_prime_len);
4939
4940 xtest_add_attr(&param_count, params, TEE_ATTR_DSA_BASE,
4941 key_types[n].base, key_types[n].base_len);
4942
4943 if (!ADBG_EXPECT_TRUE(c,
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004944 generate_and_test_key(c, &session, TEE_TYPE_DSA_KEYPAIR,
Pascal Brandc639ac82015-07-02 08:53:34 +02004945 1, key_types[n]. key_size, params,
4946 param_count)))
4947 break;
4948
4949 Do_ADBG_EndSubCase(c, "Generate DSA key %d bits",
4950 key_types[n].key_size);
4951 }
Pascal Brandc639ac82015-07-02 08:53:34 +02004952
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004953 TEEC_CloseSession(&session);
4954}
4955ADBG_CASE_DEFINE(regression, 4007_dsa, xtest_tee_test_4007_dsa,
4956 "Test TEE Internal API Generate DSA key");
4957
4958static void xtest_tee_test_4007_ecc(ADBG_Case_t *c)
Pascal Brande61133f2015-07-08 15:38:37 +02004959{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004960 TEEC_Session session = { };
4961 uint32_t ret_orig = 0;
4962 size_t n = 0;
4963 size_t param_count = 0;
4964 TEE_Attribute params[4] = { };
Pascal Brande61133f2015-07-08 15:38:37 +02004965
4966 static const struct {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004967 unsigned level;
Pascal Brande61133f2015-07-08 15:38:37 +02004968 const char *name;
4969 uint32_t algo;
4970 uint32_t curve;
4971 uint32_t key_size;
4972 } key_types[] = {
4973 /* ECDSA */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004974 { 0, "ECDSA-192", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P192,
4975 192 },
4976 { 1, "ECDSA-224", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P224,
4977 224 },
4978 { 1, "ECDSA-256", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P256,
4979 256 },
4980 { 1, "ECDSA-384", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P384,
4981 384 },
4982 { 1, "ECDSA-521", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P521,
4983 521 },
Pascal Brande61133f2015-07-08 15:38:37 +02004984
4985 /* ECDH */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004986 { 0, "ECDH-192", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P192,
4987 192 },
4988 { 1, "ECDH-224", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P224,
4989 224 },
4990 { 1, "ECDH-256", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P256,
4991 256 },
4992 { 1, "ECDH-384", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P384,
4993 384 },
4994 { 1, "ECDH-521", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P521,
4995 521 },
Pascal Brande61133f2015-07-08 15:38:37 +02004996 };
4997
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004998 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4999 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5000 &ret_orig)))
5001 return;
5002
Pascal Brande61133f2015-07-08 15:38:37 +02005003 for (n = 0; n < ARRAY_SIZE(key_types); n++) {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01005004 if (key_types[n].level > level)
5005 continue;
5006
Pascal Brande61133f2015-07-08 15:38:37 +02005007 Do_ADBG_BeginSubCase(c, "Generate %s", key_types[n].name);
5008 param_count = 0;
5009
5010 xtest_add_attr_value(&param_count, params, TEE_ATTR_ECC_CURVE,
5011 key_types[n].curve, 0);
5012
5013 if (!ADBG_EXPECT_TRUE(c,
Jens Wiklandera8c8f872018-12-14 11:41:36 +01005014 generate_and_test_key(c, &session, key_types[n].algo,
Pascal Brande61133f2015-07-08 15:38:37 +02005015 0, key_types[n].key_size, params,
5016 param_count)))
5017 break;
5018
5019 Do_ADBG_EndSubCase(c, "Generate %s", key_types[n].name);
5020 }
Pascal Brande61133f2015-07-08 15:38:37 +02005021
Pascal Brandc639ac82015-07-02 08:53:34 +02005022 TEEC_CloseSession(&session);
5023}
Jens Wiklandera8c8f872018-12-14 11:41:36 +01005024ADBG_CASE_DEFINE(regression, 4007_ecc, xtest_tee_test_4007_ecc,
5025 "Test TEE Internal API Generate ECC key");
Pascal Brandc639ac82015-07-02 08:53:34 +02005026
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03005027static void xtest_tee_test_4007_x25519(ADBG_Case_t *c)
5028{
5029 TEEC_Session session = { };
5030 uint32_t ret_orig = 0;
5031
5032 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5033 xtest_teec_open_session(&session, &crypt_user_ta_uuid,
5034 NULL, &ret_orig)))
5035 return;
5036
Jerome Forissier366179c2022-06-28 10:12:58 +02005037 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_X25519,
5038 TEE_ECC_CURVE_25519)) {
5039 Do_ADBG_Log("X25519 not supported: skip subcase");
5040 goto out;
5041 }
5042
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03005043 Do_ADBG_BeginSubCase(c, "Generate X25519 key");
5044
5045 if (!ADBG_EXPECT_TRUE(c,
5046 generate_and_test_key(c, &session,
5047 TEE_TYPE_X25519_KEYPAIR, 0, 256,
5048 NULL, 0)))
5049 return;
5050
5051 Do_ADBG_EndSubCase(c, "Generate X25519 key");
Jerome Forissier366179c2022-06-28 10:12:58 +02005052out:
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03005053 TEEC_CloseSession(&session);
5054}
5055ADBG_CASE_DEFINE(regression, 4007_x25519, xtest_tee_test_4007_x25519,
5056 "Test TEE Internal API Generate X25519 key");
5057
Valerii Chubarab9863c2022-08-12 07:42:29 +00005058
5059static void xtest_tee_test_4007_ed25519(ADBG_Case_t *c)
5060{
5061 TEEC_Session session = { };
5062 uint32_t ret_orig = 0;
5063
5064 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5065 xtest_teec_open_session(&session, &crypt_user_ta_uuid,
5066 NULL, &ret_orig)))
5067 return;
5068
5069 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_ED25519,
5070 TEE_ECC_CURVE_25519)) {
5071 Do_ADBG_Log("ED25519 not supported: skip subcase");
5072 goto out;
5073 }
5074
5075 Do_ADBG_BeginSubCase(c, "Generate Ed25519 key");
5076
5077 ADBG_EXPECT_TRUE(c, generate_and_test_key(c, &session,
5078 TEE_TYPE_ED25519_KEYPAIR,
5079 0, 256, NULL, 0));
5080
5081 Do_ADBG_EndSubCase(c, "Generate Ed25519 key");
5082out:
5083 TEEC_CloseSession(&session);
5084}
5085ADBG_CASE_DEFINE(regression, 4007_ed25519, xtest_tee_test_4007_ed25519,
5086 "Test TEE Internal API Generate ed25519 key");
5087
Pascal Brandc639ac82015-07-02 08:53:34 +02005088static void xtest_tee_test_4008(ADBG_Case_t *c)
5089{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005090 TEEC_Session session = { };
5091 uint32_t ret_orig = 0;
5092 TEE_OperationHandle op = TEE_HANDLE_NULL;
5093 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
5094 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
5095 TEE_Attribute params[4] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02005096 size_t param_count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005097 uint8_t out[2048] = { };
5098 size_t out_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02005099
5100 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5101 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5102 &ret_orig)))
5103 return;
5104
5105 Do_ADBG_BeginSubCase(c, "Derive DH key success");
5106
5107 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5108 ta_crypt_cmd_allocate_operation(c, &session, &op,
5109 TEE_ALG_DH_DERIVE_SHARED_SECRET, TEE_MODE_DERIVE,
5110 derive_key_max_keysize)))
5111 goto out;
5112
5113 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5114 ta_crypt_cmd_allocate_transient_object(c, & session,
5115 TEE_TYPE_DH_KEYPAIR, derive_key_max_keysize,
5116 &key_handle)))
5117 goto out;
5118
5119 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PRIME,
5120 ARRAY(derive_key_dh_prime));
5121
5122 xtest_add_attr(&param_count, params, TEE_ATTR_DH_BASE,
5123 ARRAY(derive_key_dh_base));
5124
5125 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PUBLIC_VALUE,
5126 ARRAY(derive_key_dh_public_value));
5127
5128 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PRIVATE_VALUE,
5129 ARRAY(derive_key_dh_private_value));
5130
5131 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5132 ta_crypt_cmd_populate_transient_object(c, &session, key_handle,
5133 params, param_count)))
5134 goto out;
5135
5136 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5137 ta_crypt_cmd_set_operation_key(c, &session, op, key_handle)))
5138 goto out;
5139
5140 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5141 ta_crypt_cmd_free_transient_object(c, & session, key_handle)))
5142 goto out;
5143
5144 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5145 ta_crypt_cmd_allocate_transient_object(c, &session,
5146 TEE_TYPE_GENERIC_SECRET, derive_key_max_keysize,
5147 &sv_handle)))
5148 goto out;
5149
Pascal Brand2b92b642015-07-16 13:29:42 +02005150 /* reuse but reset params and param-count */
Pascal Brandc639ac82015-07-02 08:53:34 +02005151 param_count = 0;
5152
5153 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PUBLIC_VALUE,
5154 ARRAY(derive_key_dh_public_value_2));
5155
5156 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5157 ta_crypt_cmd_derive_key(c, &session, op, sv_handle, params,
5158 param_count)))
5159 goto out;
5160
5161 out_size = sizeof(out);
5162 memset(out, 0, sizeof(out));
5163 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5164 ta_crypt_cmd_get_object_buffer_attribute(c, &session, sv_handle,
5165 TEE_ATTR_SECRET_VALUE, out, &out_size)))
5166 goto out;
5167
5168 if (!ADBG_EXPECT_BUFFER(c, derive_key_dh_shared_secret,
5169 sizeof(derive_key_dh_shared_secret), out,
5170 out_size))
5171 goto out;
5172
5173 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5174 ta_crypt_cmd_free_operation(c, &session, op)))
5175 goto out;
5176
5177 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5178 ta_crypt_cmd_free_transient_object(c, &session, sv_handle)))
5179 goto out;
5180out:
5181 Do_ADBG_EndSubCase(c, "Derive DH key success");
5182 TEEC_CloseSession(&session);
5183}
Jens Wiklander14f48872018-06-29 15:30:13 +02005184ADBG_CASE_DEFINE(regression, 4008, xtest_tee_test_4008,
5185 "Test TEE Internal API Derive key");
Pascal Brand2b92b642015-07-16 13:29:42 +02005186
5187static void xtest_tee_test_4009(ADBG_Case_t *c)
5188{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005189 TEEC_Session session = { };
5190 uint32_t ret_orig = 0;
5191 TEE_OperationHandle op = TEE_HANDLE_NULL;
5192 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
5193 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
5194 TEE_Attribute params[4] = { };
Pascal Brand2b92b642015-07-16 13:29:42 +02005195 size_t param_count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005196 uint8_t out[2048] = { };
5197 size_t out_size = 0;
5198 uint32_t size_bytes = 0;
5199 uint32_t i = 0;
Ruchika Gupta454b0b62020-10-30 13:23:19 +05305200 struct derive_key_ecdh_t const *pt = NULL;
Pascal Brand2b92b642015-07-16 13:29:42 +02005201
5202 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5203 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5204 &ret_orig)))
5205 return;
5206
5207 for (i = 0; i < ARRAY_SIZE(derive_key_ecdh); i++) {
5208 pt = &derive_key_ecdh[i];
5209
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02005210 if (pt->level > level)
5211 continue;
5212
Pascal Brand2b92b642015-07-16 13:29:42 +02005213 Do_ADBG_BeginSubCase(c, "Derive ECDH key - algo = 0x%x",
5214 pt->algo);
5215 size_bytes = (pt->keysize + 7) / 8;
5216 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5217 ta_crypt_cmd_allocate_operation(c, &session, &op,
5218 pt->algo,
5219 TEE_MODE_DERIVE, pt->keysize)))
5220 goto out;
5221
5222 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5223 ta_crypt_cmd_allocate_transient_object(c, & session,
5224 TEE_TYPE_ECDH_KEYPAIR, pt->keysize,
5225 &key_handle)))
5226 goto out;
5227
5228 param_count = 0;
5229 xtest_add_attr_value(&param_count, params,
5230 TEE_ATTR_ECC_CURVE, pt->curve, 0);
5231 xtest_add_attr(&param_count, params,
5232 TEE_ATTR_ECC_PRIVATE_VALUE,
5233 pt->private, size_bytes);
5234 /*
Cedric Auger719047c2019-09-11 12:08:14 +02005235 * The public value is not used, but we should provide a valid
5236 * one to avoid rejection in case TEE_PopulateTransientObject()
5237 * checks for key validity.
Pascal Brand2b92b642015-07-16 13:29:42 +02005238 */
5239 xtest_add_attr(&param_count, params,
Cedric Auger719047c2019-09-11 12:08:14 +02005240 TEE_ATTR_ECC_PUBLIC_VALUE_X,
5241 pt->public_x, size_bytes);
Pascal Brand2b92b642015-07-16 13:29:42 +02005242 xtest_add_attr(&param_count, params,
Cedric Auger719047c2019-09-11 12:08:14 +02005243 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5244 pt->public_y, size_bytes);
Pascal Brand2b92b642015-07-16 13:29:42 +02005245
5246 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5247 ta_crypt_cmd_populate_transient_object(c,
5248 &session,
5249 key_handle, params, param_count)))
5250 goto out;
5251
5252 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5253 ta_crypt_cmd_set_operation_key(c, &session, op,
5254 key_handle)))
5255 goto out;
5256
5257 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5258 ta_crypt_cmd_free_transient_object(c, & session,
5259 key_handle)))
5260 goto out;
5261
5262 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5263 ta_crypt_cmd_allocate_transient_object(c, &session,
5264 TEE_TYPE_GENERIC_SECRET, size_bytes * 8,
5265 &sv_handle)))
5266 goto out;
5267
5268 /* reuse but reset params and param-count */
5269 param_count = 0;
5270
5271 xtest_add_attr(&param_count, params,
5272 TEE_ATTR_ECC_PUBLIC_VALUE_X,
5273 pt->public_x, size_bytes);
5274 xtest_add_attr(&param_count, params,
5275 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5276 pt->public_y, size_bytes);
5277
5278 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5279 ta_crypt_cmd_derive_key(c, &session, op, sv_handle,
5280 params, param_count)))
5281 goto out;
5282
5283 out_size = sizeof(out);
5284 memset(out, 0, sizeof(out));
5285 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5286 ta_crypt_cmd_get_object_buffer_attribute(c, &session,
5287 sv_handle,
5288 TEE_ATTR_SECRET_VALUE, out, &out_size)))
5289 goto out;
5290
5291 if (!ADBG_EXPECT_BUFFER(c, pt->out, size_bytes,
5292 out, out_size))
5293 goto out;
5294
5295 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5296 ta_crypt_cmd_free_operation(c, &session, op)))
5297 goto out;
5298
5299 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5300 ta_crypt_cmd_free_transient_object(c, &session,
5301 sv_handle)))
5302 goto out;
5303
5304 Do_ADBG_EndSubCase(c, "Derive ECDH key - algo = 0x%x",
5305 pt->algo);
5306 }
5307
5308 goto noerror;
5309
5310out:
5311 Do_ADBG_EndSubCase(c, "Derive ECDH key - algo = 0x%x", pt->algo);
5312
5313noerror:
5314 TEEC_CloseSession(&session);
5315}
Jens Wiklander14f48872018-06-29 15:30:13 +02005316ADBG_CASE_DEFINE(regression, 4009, xtest_tee_test_4009,
5317 "Test TEE Internal API Derive key ECDH");
Jens Wiklander70a0b2c2016-05-18 08:39:35 +02005318
5319static void xtest_tee_test_4010(ADBG_Case_t *c)
5320{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005321 TEEC_Session session = { };
5322 uint32_t ret_orig = 0;
5323 TEE_ObjectHandle o = TEE_HANDLE_NULL;
Jens Wiklander70a0b2c2016-05-18 08:39:35 +02005324 static const uint8_t large_key[1024] = { 1, 2, 3, 4, 5, 6 };
5325 static const TEE_Attribute attr = {
5326 .attributeID = TEE_ATTR_SECRET_VALUE,
5327 .content.ref.buffer = (void *)large_key,
5328 .content.ref.length = sizeof(large_key),
5329 };
5330
5331 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5332 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5333 &ret_orig)))
5334 return;
5335
5336 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5337 ta_crypt_cmd_allocate_transient_object(c, &session,
5338 TEE_TYPE_HMAC_SHA256, 1024, &o)))
5339 goto out;
5340
5341 ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_TARGET_DEAD,
5342 ta_crypt_cmd_populate_transient_object(c, &session, o,
5343 &attr, 1));
5344
5345out:
5346 TEEC_CloseSession(&session);
5347}
Jens Wiklander14f48872018-06-29 15:30:13 +02005348ADBG_CASE_DEFINE(regression, 4010, xtest_tee_test_4010,
5349 "Test TEE Internal API create transient object (negative)");
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005350
5351static void xtest_tee_test_4011(ADBG_Case_t *c)
5352{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005353 TEEC_Session s = { };
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005354 size_t key_size = 512;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005355 TEE_ObjectHandle key = TEE_HANDLE_NULL;
5356 TEE_OperationHandle ops = TEE_HANDLE_NULL;
5357 TEE_OperationHandle opv = TEE_HANDLE_NULL;
5358 TEE_OperationHandle ope = TEE_HANDLE_NULL;
5359 TEE_OperationHandle opd = TEE_HANDLE_NULL;
5360 uint32_t ret_orig = 0;
5361 uint8_t in[TEE_SHA1_HASH_SIZE] = { };
5362 uint8_t out[1024] = { };
5363 uint8_t tmp[1024] = { };
5364 size_t out_size = 0;
5365 size_t tmp_size = 0;
5366 size_t n = 0;
5367 size_t m = 0;
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005368 size_t i = 0;
5369
5370 /* Setup session, initialize message to sign, create a keypair */
5371 if (!ADBG_EXPECT_TEEC_SUCCESS(c, xtest_teec_open_session(&s,
5372 &crypt_user_ta_uuid, NULL, &ret_orig)))
5373 return;
5374 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_random_number_generate(c,
5375 &s, in, sizeof(in))))
5376 goto out;
5377 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_transient_object(
5378 c, &s, TEE_TYPE_RSA_KEYPAIR, key_size, &key)))
5379 goto out;
5380 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_generate_key(c, &s,
5381 key, key_size, NULL, 0)))
5382 goto out;
5383
5384 /* Allocate operations for sign, verify, encrypt and decrypt */
5385 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
5386 &ops, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
5387 key_size)))
5388 goto out;
5389 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
5390 &opv, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
5391 key_size)))
5392 goto out;
5393 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
5394 &ope, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT, key_size)))
5395 goto out;
5396 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
5397 &opd, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT, key_size)))
5398 goto out;
5399
5400 /* Assign the keypair to all operations */
5401 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5402 ta_crypt_cmd_set_operation_key(c, &s, ops, key)))
5403 goto out;
5404 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5405 ta_crypt_cmd_set_operation_key(c, &s, opv, key)))
5406 goto out;
5407 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5408 ta_crypt_cmd_set_operation_key(c, &s, ope, key)))
5409 goto out;
5410 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5411 ta_crypt_cmd_set_operation_key(c, &s, opd, key)))
5412 goto out;
5413
5414 /*
5415 * The core of the test case is inspired by the one in libtomcrypt:
5416 * https://github.com/libtom/libtomcrypt/blob/6ad52252688bb34f90b5e79da4830a927e87b81f/testprof/rsa_test.c#L398
5417 *
5418 * Testcase for Bleichenbacher attack
5419 *
5420 * (1) Create a valid signature
5421 * (2) Check that it can be verified
5422 * (3) Transform the package to fetch plain text (using the encrypt
5423 * operation in GP TEE Internal API)
5424 * (4) Forge the structure of PKCS#1-EMSA encoded data
5425 * (4.1) Search for start and end of the padding string
5426 * (4.2) Move the signature to the front of the padding string
5427 * (4.3) Zero the message until the end
5428 * (5) Transform the package back (using the decrypt operation in
5429 * GP TEE Internal API)
5430 * (6) The result should not be valid if the implementation is robust.
5431 */
5432
5433
5434 for (i = 0; i < 9; i++) {
5435 Do_ADBG_Log("Iteration %zu", i);
5436
5437 /* 1 */
5438 out_size = sizeof(out);
5439 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5440 ta_crypt_cmd_asymmetric_sign(c, &s, ops, NULL, 0,
5441 in, sizeof(in), out, &out_size)))
5442 goto out;
5443
5444 /* 2 */
5445 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5446 ta_crypt_cmd_asymmetric_verify(c, &s, opv, NULL, 0,
5447 in, sizeof(in), out, out_size)))
5448 goto out;
5449
5450 /* 3 */
5451 tmp_size = sizeof(tmp);
5452 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5453 ta_crypt_cmd_asymmetric_encrypt(c, &s, ope, NULL, 0,
5454 out, out_size, tmp, &tmp_size)))
5455 goto out;
5456
Etienne Carriere0953bf02018-12-21 15:36:25 +01005457 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, tmp_size, <=, sizeof(tmp)))
5458 goto out;
5459
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005460 /* 4.1 */
Etienne Carriere0953bf02018-12-21 15:36:25 +01005461 for (n = 0; n < tmp_size - i; n++)
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005462 if (tmp[n] == 0xff)
5463 break;
Etienne Carriere0953bf02018-12-21 15:36:25 +01005464
5465 /* Shall find at least a padding start before buffer end */
5466 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, n, <, tmp_size - i - 1))
5467 goto out;
5468
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005469 for (m = n + 1; m < tmp_size; m++)
5470 if (tmp[m] != 0xff)
5471 break;
Etienne Carriere0953bf02018-12-21 15:36:25 +01005472
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005473 /* 4.2 */
5474 memmove(tmp + n + i, tmp + m, tmp_size - m);
Etienne Carriere0953bf02018-12-21 15:36:25 +01005475
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005476 /* 4.3 */
Etienne Carriere0953bf02018-12-21 15:36:25 +01005477 n = n + i + tmp_size - m;
Etienne Carriereacb81c42020-04-24 14:58:58 +02005478
5479 /* Prevent overrun when zeroing buffer end */
5480 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, n, <=, tmp_size))
5481 goto out;
5482
Etienne Carriere0953bf02018-12-21 15:36:25 +01005483 memset(tmp + n, 0, tmp_size - n);
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005484
5485 /* 5 */
5486 out_size = sizeof(out);
5487 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5488 ta_crypt_cmd_asymmetric_decrypt(c, &s, opd, NULL, 0,
5489 tmp, tmp_size, out, &out_size)))
5490 goto out;
5491
5492 /* 6 */
5493 if (!ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_SIGNATURE_INVALID,
5494 ta_crypt_cmd_asymmetric_verify(c, &s, opv, NULL, 0,
5495 in, sizeof(in), out, out_size)))
5496 goto out;
5497 }
5498
5499out:
5500 TEEC_CloseSession(&s);
5501}
Jens Wiklander14f48872018-06-29 15:30:13 +02005502ADBG_CASE_DEFINE(regression, 4011, xtest_tee_test_4011,
5503 "Test TEE Internal API Bleichenbacher attack (negative)");
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005504
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005505static void xtest_tee_test_4012(ADBG_Case_t *c)
5506{
Jens Wiklanderc44350d2022-12-02 20:56:49 +01005507 TEEC_Result res = TEEC_SUCCESS;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005508 TEEC_Session session = { };
5509 uint32_t ret_orig = 0;
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005510 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
5511 /* Fortuna PRNG requires seed <= 32 bytes */
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005512 uint8_t pool_input[32] = { };
5513 time_t t = 0;
5514 struct tm tm_local = { };
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005515
5516 t = time(NULL);
5517 tm_local = *localtime(&t);
5518
5519 memcpy((void *)pool_input, (void *)&tm_local,
5520 sizeof(pool_input) < sizeof(tm_local) ?
5521 sizeof(pool_input) : sizeof(tm_local));
5522
5523
5524 op.params[0].tmpref.buffer = pool_input;
5525 op.params[0].tmpref.size = sizeof(pool_input);
5526 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
5527 TEEC_NONE,
5528 TEEC_NONE,
5529 TEEC_NONE);
5530 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5531 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5532 &ret_orig)))
5533 return;
5534
Jens Wiklanderc44350d2022-12-02 20:56:49 +01005535 res = TEEC_InvokeCommand(&session, TA_CRYPT_CMD_SEED_RNG_POOL,
5536 &op, &ret_orig);
5537 if (res == TEEC_ERROR_ITEM_NOT_FOUND &&
5538 ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, ret_orig,
5539 TEEC_ORIGIN_TRUSTED_APP))
5540 Do_ADBG_Log("System PTA not available, skipping test 4012");
5541 else
5542 ADBG_EXPECT_TEEC_SUCCESS(c, res);
5543
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005544 TEEC_CloseSession(&session);
5545}
Jens Wiklander14f48872018-06-29 15:30:13 +02005546ADBG_CASE_DEFINE(regression, 4012, xtest_tee_test_4012,
5547 "Test seeding RNG entropy");
Joakim Bech83a30ca2019-05-29 11:22:27 +02005548
5549static void xtest_tee_test_4013(ADBG_Case_t *c)
5550{
Jens Wiklanderc44350d2022-12-02 20:56:49 +01005551 TEEC_Result res = TEEC_SUCCESS;
Joakim Bech83a30ca2019-05-29 11:22:27 +02005552 TEEC_Session session = { };
5553 uint32_t ret_orig = 0;
5554 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
5555 uint8_t key[32] = { };
5556 uint8_t extra_data[32] = { };
5557
5558 op.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
5559 TEEC_NONE,
5560 TEEC_NONE,
5561 TEEC_NONE);
5562 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5563 xtest_teec_open_session(&session, &crypt_user_ta_uuid,
5564 NULL, &ret_orig)))
5565 return;
5566
Jens Wiklanderc44350d2022-12-02 20:56:49 +01005567 res = TEEC_InvokeCommand(&session, TA_CRYPT_CMD_DERIVE_TA_UNIQUE_KEY,
5568 &op, &ret_orig);
5569 if (res == TEEC_ERROR_ITEM_NOT_FOUND &&
5570 ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, ret_orig,
5571 TEEC_ORIGIN_TRUSTED_APP)) {
5572 Do_ADBG_Log("System PTA not available, skipping test 4013");
5573 goto out;
5574 }
5575 ADBG_EXPECT_TEEC_SUCCESS(c, res);
Joakim Bech83a30ca2019-05-29 11:22:27 +02005576
5577 /* Negative test using non-secure memory */
5578 memset(&op, 0, sizeof(op));
5579 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
5580 TEEC_MEMREF_TEMP_OUTPUT,
5581 TEEC_NONE,
5582 TEEC_NONE);
5583
5584 op.params[0].tmpref.buffer = extra_data;
5585 op.params[0].tmpref.size = sizeof(extra_data);
5586 op.params[1].tmpref.buffer = key;
5587 op.params[1].tmpref.size = sizeof(key);
5588 (void)ADBG_EXPECT_TEEC_RESULT(c,
5589 TEEC_ERROR_SECURITY,
5590 TEEC_InvokeCommand(&session,
5591 TA_CRYPT_CMD_DERIVE_TA_UNIQUE_KEY_SHM,
5592 &op,
5593 &ret_orig));
5594
Jens Wiklanderc44350d2022-12-02 20:56:49 +01005595out:
Joakim Bech83a30ca2019-05-29 11:22:27 +02005596 TEEC_CloseSession(&session);
5597}
5598ADBG_CASE_DEFINE(regression, 4013, xtest_tee_test_4013,
5599 "Test generation of device unique TA keys");
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005600
5601static void xtest_tee_test_4014(ADBG_Case_t *c)
5602{
5603 TEEC_Session session = { };
5604 uint32_t ret_orig = 0;
5605 TEE_OperationHandle op = TEE_HANDLE_NULL;
5606 TEE_ObjectHandle keyA = TEE_HANDLE_NULL;
5607 TEE_ObjectHandle eph_keyA = TEE_HANDLE_NULL;
5608 TEE_ObjectHandle keyB = TEE_HANDLE_NULL;
5609 TEE_ObjectHandle eph_keyB = TEE_HANDLE_NULL;
5610 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
5611 TEE_Attribute params[9] = { };
5612 size_t param_count = 0;
5613 uint8_t out[128] = { };
5614 size_t out_size = 0;
5615 uint8_t conf_A[32] = { };
5616 uint8_t conf_B[32] = { };
5617
5618 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5619 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5620 &ret_orig)))
5621 return;
5622
5623 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_SM2_KEP,
5624 TEE_ECC_CURVE_SM2)) {
5625 Do_ADBG_Log("SM2 KEP not supported: skip subcase");
5626 goto out;
5627 }
5628
5629 Do_ADBG_BeginSubCase(c, "Initiator side");
5630
5631 /*
5632 * Key exchange protocol running on user A's side. A is initiator.
5633 */
5634
5635 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5636 ta_crypt_cmd_allocate_operation(c, &session, &op,
5637 TEE_ALG_SM2_KEP, TEE_MODE_DERIVE, 512)))
5638 goto out;
5639
5640 /* Allocate and initialize keypair of user A */
5641
5642 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5643 ta_crypt_cmd_allocate_transient_object(c, &session,
5644 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &keyA)))
5645 goto out;
5646
5647 param_count = 0;
5648
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005649 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5650 ARRAY(gmt_003_part5_b2_public_xA));
5651
5652 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5653 ARRAY(gmt_003_part5_b2_public_yA));
5654
5655 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5656 ARRAY(gmt_003_part5_b2_private_A));
5657
5658 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5659 ta_crypt_cmd_populate_transient_object(c, &session, keyA,
5660 params, param_count)))
5661 goto out;
5662
5663 /*
5664 * Allocate and set ephemeral key of user A. Note: it is a regular ECC
5665 * key -- we don't use the *_EPHEMERAL_* attributes flags which are
5666 * reserved for use in TEE_DeriveKey() to pass the ephermeral key of
5667 * user B.
5668 */
5669
5670 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5671 ta_crypt_cmd_allocate_transient_object(c, &session,
5672 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &eph_keyA)))
5673 goto out;
5674
5675 param_count = 0;
5676
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005677 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5678 ARRAY(gmt_003_part5_b2_eph_public_xA));
5679
5680 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5681 ARRAY(gmt_003_part5_b2_eph_public_yA));
5682
5683 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5684 ARRAY(gmt_003_part5_b2_eph_private_A));
5685
5686 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5687 ta_crypt_cmd_populate_transient_object(c, &session, eph_keyA,
5688 params, param_count)))
5689 goto out;
5690
5691 /* Associate user A keys with operation */
5692
5693 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5694 ta_crypt_cmd_set_operation_key2(c, &session, op, keyA,
5695 eph_keyA)))
5696 goto out;
5697
5698 /* Keys have been set, free key objects */
5699
5700 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5701 ta_crypt_cmd_free_transient_object(c, &session, keyA)))
5702 goto out;
5703
5704 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5705 ta_crypt_cmd_free_transient_object(c, &session, eph_keyA)))
5706 goto out;
5707
5708 /* Allocate output object */
5709
5710 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5711 ta_crypt_cmd_allocate_transient_object(c, &session,
5712 TEE_TYPE_GENERIC_SECRET,
5713 sizeof(gmt_003_part5_b2_shared_secret),
5714 &sv_handle)))
5715 goto out;
5716
5717 /* Set key derivation parameters: user A role, user B information */
5718
5719 params[0].attributeID = TEE_ATTR_SM2_KEP_USER;
5720 params[0].content.value.a = 0; /* Initiator role */
5721 params[0].content.value.b = 0; /* Not used */
5722 param_count = 1;
5723
5724 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5725 ARRAY(gmt_003_part5_b2_public_xB));
5726
5727 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5728 ARRAY(gmt_003_part5_b2_public_yB));
5729
5730 xtest_add_attr(&param_count, params,
5731 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_X,
5732 ARRAY(gmt_003_part5_b2_eph_public_xB));
5733
5734 xtest_add_attr(&param_count, params,
5735 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_Y,
5736 ARRAY(gmt_003_part5_b2_eph_public_yB));
5737
5738 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_INITIATOR,
5739 ARRAY(gmt_003_part5_b2_id_A));
5740
5741 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_RESPONDER,
5742 ARRAY(gmt_003_part5_b2_id_B));
5743
5744 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_IN,
5745 ARRAY(gmt_003_part5_b2_conf_B));
5746
5747 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_OUT,
5748 ARRAY(conf_A));
5749
5750 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5751 ta_crypt_cmd_derive_key(c, &session, op, sv_handle, params,
5752 param_count)))
5753 goto out;
5754
5755 out_size = sizeof(out);
5756 memset(out, 0, sizeof(out));
5757 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5758 ta_crypt_cmd_get_object_buffer_attribute(c, &session, sv_handle,
5759 TEE_ATTR_SECRET_VALUE, out, &out_size)))
5760 goto out;
5761
5762 /* Check derived key */
5763 if (!ADBG_EXPECT_BUFFER(c, gmt_003_part5_b2_shared_secret,
5764 sizeof(gmt_003_part5_b2_shared_secret), out,
5765 out_size))
5766 goto out;
5767
5768 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5769 ta_crypt_cmd_free_operation(c, &session, op)))
5770 goto out;
5771
5772 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5773 ta_crypt_cmd_free_transient_object(c, &session, sv_handle)))
5774 goto out;
5775
5776 Do_ADBG_EndSubCase(c, "Initiator side");
5777
5778 Do_ADBG_BeginSubCase(c, "Responder side");
5779
5780 /*
5781 * Key derivation on user B's side
5782 */
5783
5784 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5785 ta_crypt_cmd_allocate_operation(c, &session, &op,
5786 TEE_ALG_SM2_KEP, TEE_MODE_DERIVE, 512)))
5787 goto out;
5788
5789 /* Allocate and initialize keypair of user B */
5790
5791 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5792 ta_crypt_cmd_allocate_transient_object(c, &session,
5793 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &keyB)))
5794 goto out;
5795
5796 param_count = 0;
5797
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005798 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5799 ARRAY(gmt_003_part5_b2_public_xB));
5800
5801 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5802 ARRAY(gmt_003_part5_b2_public_yB));
5803
5804 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5805 ARRAY(gmt_003_part5_b2_private_B));
5806
5807 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5808 ta_crypt_cmd_populate_transient_object(c, &session, keyB,
5809 params, param_count)))
5810 goto out;
5811
5812 /* Allocate and set ephemeral key of user B */
5813
5814 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5815 ta_crypt_cmd_allocate_transient_object(c, &session,
5816 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &eph_keyB)))
5817 goto out;
5818
5819 param_count = 0;
5820
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005821 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5822 ARRAY(gmt_003_part5_b2_eph_public_xB));
5823
5824 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5825 ARRAY(gmt_003_part5_b2_eph_public_yB));
5826
5827 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5828 ARRAY(gmt_003_part5_b2_eph_private_B));
5829
5830 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5831 ta_crypt_cmd_populate_transient_object(c, &session, eph_keyB,
5832 params, param_count)))
5833 goto out;
5834
5835 /* Associate user B keys with operation */
5836
5837 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5838 ta_crypt_cmd_set_operation_key2(c, &session, op, keyB,
5839 eph_keyB)))
5840 goto out;
5841
5842 /* Keys have been set, free key objects */
5843
5844 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5845 ta_crypt_cmd_free_transient_object(c, &session, keyB)))
5846 goto out;
5847
5848 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5849 ta_crypt_cmd_free_transient_object(c, &session, eph_keyB)))
5850 goto out;
5851
5852 /* Allocate output object */
5853
5854 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5855 ta_crypt_cmd_allocate_transient_object(c, &session,
5856 TEE_TYPE_GENERIC_SECRET,
5857 sizeof(gmt_003_part5_b2_shared_secret),
5858 &sv_handle)))
5859 goto out;
5860
5861 /* Set key derivation parameters: user B role, user A information */
5862
5863 params[0].attributeID = TEE_ATTR_SM2_KEP_USER;
5864 params[0].content.value.a = 1; /* Responder role */
5865 params[0].content.value.b = 0; /* Not used */
5866 param_count = 1;
5867
5868 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5869 ARRAY(gmt_003_part5_b2_public_xA));
5870
5871 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5872 ARRAY(gmt_003_part5_b2_public_yA));
5873
5874 xtest_add_attr(&param_count, params,
5875 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_X,
5876 ARRAY(gmt_003_part5_b2_eph_public_xA));
5877
5878 xtest_add_attr(&param_count, params,
5879 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_Y,
5880 ARRAY(gmt_003_part5_b2_eph_public_yA));
5881
5882 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_INITIATOR,
5883 ARRAY(gmt_003_part5_b2_id_A));
5884
5885 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_RESPONDER,
5886 ARRAY(gmt_003_part5_b2_id_B));
5887
5888 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_IN,
5889 ARRAY(gmt_003_part5_b2_conf_A));
5890
5891 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_OUT,
5892 ARRAY(conf_B));
5893
5894 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5895 ta_crypt_cmd_derive_key(c, &session, op, sv_handle, params,
5896 param_count)))
5897 goto out;
5898
5899 out_size = sizeof(out);
5900 memset(out, 0, sizeof(out));
5901 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5902 ta_crypt_cmd_get_object_buffer_attribute(c, &session, sv_handle,
5903 TEE_ATTR_SECRET_VALUE, out, &out_size)))
5904 goto out;
5905
5906 /* Check derived key */
5907 if (!ADBG_EXPECT_BUFFER(c, gmt_003_part5_b2_shared_secret,
5908 sizeof(gmt_003_part5_b2_shared_secret), out,
5909 out_size))
5910 goto out;
5911
5912 Do_ADBG_EndSubCase(c, "Responder side");
5913
5914out:
5915 TEEC_CloseSession(&session);
5916}
5917ADBG_CASE_DEFINE(regression, 4014, xtest_tee_test_4014,
5918 "Test SM2 KEP (key derivation)");
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03005919
5920static void xtest_tee_test_4015(ADBG_Case_t *c)
5921{
5922 TEEC_Session session = { };
5923 uint32_t ret_orig = 0;
5924 TEE_OperationHandle op = TEE_HANDLE_NULL;
5925 TEE_ObjectHandle key_alice = TEE_HANDLE_NULL;
5926 TEE_ObjectHandle key_bob = TEE_HANDLE_NULL;
5927 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
5928 TEE_Attribute params[2] = { };
5929 size_t param_count = 0;
5930 uint8_t out[32] = { };
5931 size_t out_size = 0;
5932 char case_str[40] = "Alice side computes shared secret";
5933
5934 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5935 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5936 &ret_orig)))
5937 return;
5938
5939 Do_ADBG_BeginSubCase(c, "%s", case_str);
5940
5941 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_X25519,
5942 TEE_ECC_CURVE_25519)) {
5943 Do_ADBG_Log("X25519 not supported: skip subcase");
5944 goto out;
5945 }
5946
5947 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5948 ta_crypt_cmd_allocate_operation(c, &session, &op,
5949 TEE_ALG_X25519, TEE_MODE_DERIVE, 256)))
5950 goto out;
5951
5952 /* Allocate and initialize keypair of Alice */
5953 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5954 ta_crypt_cmd_allocate_transient_object(c, &session,
5955 TEE_TYPE_X25519_KEYPAIR, 256, &key_alice)))
5956 goto out;
5957
5958 param_count = 0;
5959
5960 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PUBLIC_VALUE,
5961 ARRAY(x25519_alice_public));
5962
5963 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PRIVATE_VALUE,
5964 ARRAY(x25519_alice_private));
5965
5966 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5967 ta_crypt_cmd_populate_transient_object(c, &session,
5968 key_alice, params, param_count)))
5969 goto out;
5970
5971 /* Associate Alices's keys with operation */
5972 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5973 ta_crypt_cmd_set_operation_key(c, &session, op,
5974 key_alice)))
5975 goto out;
5976
5977 /* Keys have been set, free key objects */
5978 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5979 ta_crypt_cmd_free_transient_object(c, &session,
5980 key_alice)))
5981 goto out;
5982
5983 /* Allocate shared secret output object */
5984 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5985 ta_crypt_cmd_allocate_transient_object(c, &session,
5986 TEE_TYPE_GENERIC_SECRET,
5987 sizeof(x25519_shared_secret), &sv_handle)))
5988 goto out;
5989
5990 /* Reset params */
5991 param_count = 0;
5992
5993 /* Set Bob's public key for Alice side */
5994 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PUBLIC_VALUE,
5995 ARRAY(x25519_bob_public));
5996
5997 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5998 ta_crypt_cmd_derive_key(c, &session, op, sv_handle,
5999 params, param_count)))
6000 goto out;
6001
6002 out_size = sizeof(out);
6003 memset(out, 0, sizeof(out));
6004 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6005 ta_crypt_cmd_get_object_buffer_attribute(c, &session,
6006 sv_handle, TEE_ATTR_SECRET_VALUE, out,
6007 &out_size)))
6008 goto out;
6009
6010 /* Check derived key */
6011 if (!ADBG_EXPECT_BUFFER(c, x25519_shared_secret,
6012 sizeof(x25519_shared_secret), out,
6013 out_size))
6014 goto out;
6015
6016 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6017 ta_crypt_cmd_free_operation(c, &session, op)))
6018 goto out;
6019
6020 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6021 ta_crypt_cmd_free_transient_object(c, &session,
6022 sv_handle)))
6023 goto out;
6024
6025 Do_ADBG_EndSubCase(c, "%s", case_str);
6026
6027 strncpy(case_str, "Bob side computes shared secret",
6028 sizeof(case_str) - 1);
6029
6030 Do_ADBG_BeginSubCase(c, "%s", case_str);
6031
6032 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6033 ta_crypt_cmd_allocate_operation(c, &session, &op,
6034 TEE_ALG_X25519, TEE_MODE_DERIVE, 256)))
6035 goto out;
6036
6037 /* Allocate and initialize keypair of Bob */
6038 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6039 ta_crypt_cmd_allocate_transient_object(c, &session,
6040 TEE_TYPE_X25519_KEYPAIR, 256, &key_bob)))
6041 goto out;
6042
6043 /* Reset params */
6044 param_count = 0;
6045
6046 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PUBLIC_VALUE,
6047 ARRAY(x25519_bob_public));
6048
6049 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PRIVATE_VALUE,
6050 ARRAY(x25519_bob_private));
6051
6052 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6053 ta_crypt_cmd_populate_transient_object(c, &session,
6054 key_bob, params, param_count)))
6055 goto out;
6056
6057 /* Associate Bob's keys with operation */
6058 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6059 ta_crypt_cmd_set_operation_key(c, &session, op,
6060 key_bob)))
6061 goto out;
6062
6063 /* Keys have been set, free key objects */
6064 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6065 ta_crypt_cmd_free_transient_object(c, &session,
6066 key_bob)))
6067 goto out;
6068
6069 /* Allocate shared secret output object */
6070 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6071 ta_crypt_cmd_allocate_transient_object(c, &session,
6072 TEE_TYPE_GENERIC_SECRET,
6073 sizeof(x25519_shared_secret), &sv_handle)))
6074 goto out;
6075
6076 /* Reset params */
6077 param_count = 0;
6078
6079 /* Set Alice's public key for Bob side */
6080 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PUBLIC_VALUE,
6081 ARRAY(x25519_alice_public));
6082
6083 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6084 ta_crypt_cmd_derive_key(c, &session, op, sv_handle,
6085 params, param_count)))
6086 goto out;
6087
6088 out_size = sizeof(out);
6089 memset(out, 0, sizeof(out));
6090 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6091 ta_crypt_cmd_get_object_buffer_attribute(c, &session,
6092 sv_handle, TEE_ATTR_SECRET_VALUE, out,
6093 &out_size)))
6094 goto out;
6095
6096 /* Check derived key */
6097 if (!ADBG_EXPECT_BUFFER(c, x25519_shared_secret,
6098 sizeof(x25519_shared_secret), out,
6099 out_size))
6100 goto out;
6101
6102 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6103 ta_crypt_cmd_free_operation(c, &session, op)))
6104 goto out;
6105
6106 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6107 ta_crypt_cmd_free_transient_object(c, &session,
6108 sv_handle)))
6109 goto out;
6110
6111out:
6112 Do_ADBG_EndSubCase(c, "%s", case_str);
6113 TEEC_CloseSession(&session);
6114}
6115ADBG_CASE_DEFINE(regression, 4015, xtest_tee_test_4015,
6116 "Test TEE Internal API Derive key X25519");
Valerii Chubarab9863c2022-08-12 07:42:29 +00006117
6118static void xtest_tee_test_4016_ed25519(ADBG_Case_t *c)
6119{
6120 TEEC_Session session = { };
6121 TEE_OperationHandle op = TEE_HANDLE_NULL;
6122 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
6123 TEE_Attribute key_attrs[2] = { };
6124 size_t num_key_attrs = 0;
6125 TEE_Attribute attrs[2] = { };
6126 size_t num_attrs = 0;
6127 uint8_t out[64] = { };
6128 size_t out_size = sizeof(out);
6129 size_t n = 0;
6130 uint32_t ret_orig = 0;
6131 size_t max_key_size = 0;
6132
6133 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6134 xtest_teec_open_session(&session, &crypt_user_ta_uuid,
6135 NULL, &ret_orig)))
6136 return;
6137
6138 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_ED25519,
6139 TEE_ECC_CURVE_25519)) {
6140 Do_ADBG_Log("ED25519 not supported: skip subcase");
6141 goto out;
6142 }
6143
6144 for (n = 0; n < ARRAY_SIZE(xtest_ac_eddsa_cases); n++) {
6145 const struct xtest_ac_case *tv = xtest_ac_eddsa_cases + n;
6146
6147 if (tv->algo != TEE_ALG_ED25519)
6148 continue;
6149
6150 num_attrs = 0;
6151 num_key_attrs = 0;
6152 max_key_size = tv->params.eddsa.private_len * 8;
6153
6154 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6155 ta_crypt_cmd_allocate_operation(c, &session, &op,
6156 TEE_ALG_ED25519, tv->mode, max_key_size)))
6157 goto out;
6158
6159 xtest_add_attr(&num_key_attrs, key_attrs,
6160 TEE_ATTR_ED25519_PUBLIC_VALUE,
6161 tv->params.eddsa.public,
6162 tv->params.eddsa.public_len);
6163
6164 if (tv->params.eddsa.flag == 1)
Jens Wiklander7596bd32022-12-02 15:43:37 +01006165 xtest_add_attr_value(&num_attrs, attrs,
6166 TEE_ATTR_EDDSA_PREHASH, 1, 0);
Valerii Chubarab9863c2022-08-12 07:42:29 +00006167
6168 if (tv->params.eddsa.context_len > 0)
6169 xtest_add_attr(&num_attrs, attrs, TEE_ATTR_EDDSA_CTX,
6170 tv->params.eddsa.context,
6171 tv->params.eddsa.context_len);
6172
6173 switch (tv->mode) {
6174 case TEE_MODE_SIGN:
6175 xtest_add_attr(&num_key_attrs, key_attrs,
6176 TEE_ATTR_ED25519_PRIVATE_VALUE,
6177 tv->params.eddsa.private,
6178 tv->params.eddsa.private_len);
6179
6180 if (!ADBG_EXPECT_TRUE(c,
6181 create_key(c, &session, max_key_size,
6182 TEE_TYPE_ED25519_KEYPAIR,
6183 key_attrs, num_key_attrs,
6184 &key_handle)))
6185 goto out;
6186
6187 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6188 ta_crypt_cmd_set_operation_key(c,
6189 &session, op, key_handle)))
6190 goto out;
6191
6192 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6193 ta_crypt_cmd_asymmetric_sign(c,
6194 &session, op,
6195 attrs, num_attrs, tv->ptx,
6196 tv->ptx_len, out, &out_size)))
6197 goto out;
6198
6199 ADBG_EXPECT_BUFFER(c, tv->ctx, tv->ctx_len, out, out_size);
6200
6201 break;
6202
6203 case TEE_MODE_VERIFY:
6204 if (!ADBG_EXPECT_TRUE(c,
6205 create_key(c, &session, max_key_size,
6206 TEE_TYPE_ED25519_PUBLIC_KEY,
6207 key_attrs, num_key_attrs,
6208 &key_handle)))
6209 goto out;
6210
6211 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6212 ta_crypt_cmd_set_operation_key(c,
6213 &session, op, key_handle)))
6214 goto out;
6215
6216 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6217 ta_crypt_cmd_asymmetric_verify(c, &session, op,
6218 attrs, num_attrs,
6219 tv->ptx,
6220 tv->ptx_len,
6221 tv->ctx,
6222 tv->ctx_len)))
6223 goto out;
6224 break;
6225
6226 default:
6227 break;
6228 }
6229
6230 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6231 ta_crypt_cmd_free_operation(c, &session, op)))
6232 goto out;
6233 }
6234out:
6235 TEEC_CloseSession(&session);
6236}
Jens Wiklander7b70ff82022-12-02 20:59:32 +01006237ADBG_CASE_DEFINE(regression, 4016, xtest_tee_test_4016_ed25519,
Valerii Chubarab9863c2022-08-12 07:42:29 +00006238 "Test TEE Internal API ED25519 sign/verify");