blob: 8a9050333042baafb6dd7c7f2fb5e9b356631497 [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
Jens Wiklander8281d642024-04-22 18:23:45 +0200401 *dst_len = op.params[2].tmpref.size;
Pascal Brandc639ac82015-07-02 08:53:34 +0200402
403 return res;
404}
405
406static TEEC_Result ta_crypt_cmd_cipher_do_final(ADBG_Case_t *c,
407 TEEC_Session *s,
408 TEE_OperationHandle oph,
409 const void *src,
410 size_t src_len,
411 void *dst,
412 size_t *dst_len)
413{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100414 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200415 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100416 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200417
418 assert((uintptr_t)oph <= UINT32_MAX);
419 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
420
421 op.params[1].tmpref.buffer = (void *)src;
422 op.params[1].tmpref.size = src_len;
423
424 op.params[2].tmpref.buffer = (void *)dst;
425 op.params[2].tmpref.size = *dst_len;
426
427 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
428 TEEC_MEMREF_TEMP_INPUT,
429 TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE);
430
431 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_CIPHER_DO_FINAL, &op,
432 &ret_orig);
433
434 if (res != TEEC_SUCCESS) {
435 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
436 ret_orig);
437 }
438
Jens Wiklander8281d642024-04-22 18:23:45 +0200439 *dst_len = op.params[2].tmpref.size;
Pascal Brandc639ac82015-07-02 08:53:34 +0200440
441 return res;
442}
443
444static TEEC_Result ta_crypt_cmd_random_number_generate(ADBG_Case_t *c,
445 TEEC_Session *s,
446 void *buf,
447 size_t blen)
448{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100449 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200450 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100451 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200452
453 op.params[0].tmpref.buffer = buf;
454 op.params[0].tmpref.size = blen;
455
456 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE,
457 TEEC_NONE, TEEC_NONE);
458
Joakim Bech81f97e32020-05-27 12:14:23 +0200459 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_RANDOM_NUMBER_GENERATE, &op,
Pascal Brandc639ac82015-07-02 08:53:34 +0200460 &ret_orig);
461
462 if (res != TEEC_SUCCESS) {
463 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
464 ret_orig);
465 }
466
467 (void)ADBG_EXPECT_COMPARE_UNSIGNED(c, blen, ==,
468 op.params[0].tmpref.size);
469 return res;
470}
471
472static TEEC_Result ta_crypt_cmd_ae_init(ADBG_Case_t *c, TEEC_Session *s,
473 TEE_OperationHandle oph,
474 const void *nonce, size_t nonce_len,
475 size_t tag_len, size_t aad_len,
476 size_t payload_len)
477{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100478 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200479 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100480 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200481
482 assert((uintptr_t)oph <= UINT32_MAX);
483 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
484 op.params[0].value.b = tag_len;
485
486 op.params[1].tmpref.buffer = (void *)nonce;
487 op.params[1].tmpref.size = nonce_len;
488
489 op.params[2].value.a = aad_len;
490 op.params[2].value.b = payload_len;
491
492 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
493 TEEC_MEMREF_TEMP_INPUT,
Jens Wiklander74a42302015-07-07 01:08:41 +0200494 TEEC_VALUE_INPUT, TEEC_NONE);
Pascal Brandc639ac82015-07-02 08:53:34 +0200495
496 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_AE_INIT, &op, &ret_orig);
497
498 if (res != TEEC_SUCCESS) {
499 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
500 ret_orig);
501 }
502 return res;
503}
504
505static TEEC_Result ta_crypt_cmd_ae_update_aad(ADBG_Case_t *c, TEEC_Session *s,
506 TEE_OperationHandle oph,
507 const void *aad, size_t aad_len)
508{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100509 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200510 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100511 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200512
513 assert((uintptr_t)oph <= UINT32_MAX);
514 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
515
516 op.params[1].tmpref.buffer = (void *)aad;
517 op.params[1].tmpref.size = aad_len;
518
519 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
520 TEEC_MEMREF_TEMP_INPUT, TEEC_NONE,
521 TEEC_NONE);
522
523 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_AE_UPDATE_AAD, &op, &ret_orig);
524
525 if (res != TEEC_SUCCESS) {
526 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
527 ret_orig);
528 }
529
530 return res;
531}
532
533static TEEC_Result ta_crypt_cmd_ae_update(ADBG_Case_t *c,
534 TEEC_Session *s,
535 TEE_OperationHandle oph,
536 const void *src,
537 size_t src_len,
538 void *dst,
539 size_t *dst_len)
540{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100541 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200542 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100543 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200544
545 assert((uintptr_t)oph <= UINT32_MAX);
546 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
547
548 op.params[1].tmpref.buffer = (void *)src;
549 op.params[1].tmpref.size = src_len;
550
551 op.params[2].tmpref.buffer = (void *)dst;
552 op.params[2].tmpref.size = *dst_len;
553
554 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
555 TEEC_MEMREF_TEMP_INPUT,
556 TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE);
557
558 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_AE_UPDATE, &op, &ret_orig);
559
560 if (res != TEEC_SUCCESS) {
561 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
562 ret_orig);
563 }
564
Jens Wiklander8281d642024-04-22 18:23:45 +0200565 *dst_len = op.params[2].tmpref.size;
Pascal Brandc639ac82015-07-02 08:53:34 +0200566
567 return res;
568}
569
570static TEEC_Result ta_crypt_cmd_ae_encrypt_final(ADBG_Case_t *c,
571 TEEC_Session *s,
572 TEE_OperationHandle oph,
573 const void *src,
574 size_t src_len, void *dst,
575 size_t *dst_len, void *tag,
576 size_t *tag_len)
577{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100578 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200579 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100580 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200581
582 assert((uintptr_t)oph <= UINT32_MAX);
583 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
584
585 op.params[1].tmpref.buffer = (void *)src;
586 op.params[1].tmpref.size = src_len;
587
588 op.params[2].tmpref.buffer = (void *)dst;
589 op.params[2].tmpref.size = *dst_len;
590
591 op.params[3].tmpref.buffer = (void *)tag;
592 op.params[3].tmpref.size = *tag_len;
593
594 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
595 TEEC_MEMREF_TEMP_INPUT,
596 TEEC_MEMREF_TEMP_OUTPUT,
597 TEEC_MEMREF_TEMP_OUTPUT);
598
599 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_AE_ENCRYPT_FINAL, &op,
600 &ret_orig);
601
602 if (res != TEEC_SUCCESS) {
603 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
604 ret_orig);
605 }
606
Jens Wiklander8281d642024-04-22 18:23:45 +0200607 *dst_len = op.params[2].tmpref.size;
608 *tag_len = op.params[3].tmpref.size;
Pascal Brandc639ac82015-07-02 08:53:34 +0200609
610 return res;
611}
612
613static TEEC_Result ta_crypt_cmd_ae_decrypt_final(ADBG_Case_t *c,
614 TEEC_Session *s,
615 TEE_OperationHandle oph,
616 const void *src, size_t src_len,
617 void *dst, size_t *dst_len,
618 const void *tag, size_t tag_len)
619{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100620 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200621 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100622 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200623
624 assert((uintptr_t)oph <= UINT32_MAX);
625 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
626
627 op.params[1].tmpref.buffer = (void *)src;
628 op.params[1].tmpref.size = src_len;
629
630 op.params[2].tmpref.buffer = dst;
631 op.params[2].tmpref.size = *dst_len;
632
633 op.params[3].tmpref.buffer = (void *)tag;
634 op.params[3].tmpref.size = tag_len;
635
636 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
637 TEEC_MEMREF_TEMP_INPUT,
638 TEEC_MEMREF_TEMP_OUTPUT,
639 TEEC_MEMREF_TEMP_INPUT);
640
641 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_AE_DECRYPT_FINAL, &op,
642 &ret_orig);
643
644 if (res != TEEC_SUCCESS) {
645 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
646 ret_orig);
647 }
648
Jens Wiklander8281d642024-04-22 18:23:45 +0200649 *dst_len = op.params[2].tmpref.size;
Pascal Brandc639ac82015-07-02 08:53:34 +0200650
651 return res;
652}
653
654static TEEC_Result ta_crypt_cmd_asymmetric_operate(ADBG_Case_t *c,
655 TEEC_Session *s,
656 TEE_OperationHandle oph,
657 uint32_t cmd,
658 const TEE_Attribute *params,
659 uint32_t paramCount,
660 const void *src,
661 size_t src_len,
662 void *dst,
663 size_t *dst_len)
664{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100665 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200666 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100667 uint32_t ret_orig = 0;
668 uint8_t *buf = NULL;
669 size_t blen = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200670
671 res = pack_attrs(params, paramCount, &buf, &blen);
672 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
673 return res;
674
675 assert((uintptr_t)oph <= UINT32_MAX);
676 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
677
678 op.params[1].tmpref.buffer = buf;
679 op.params[1].tmpref.size = blen;
680
681 op.params[2].tmpref.buffer = (void *)src;
682 op.params[2].tmpref.size = src_len;
683
684 op.params[3].tmpref.buffer = dst;
685 op.params[3].tmpref.size = *dst_len;
686
687 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
688 TEEC_MEMREF_TEMP_INPUT,
689 TEEC_MEMREF_TEMP_INPUT,
690 TEEC_MEMREF_TEMP_OUTPUT);
691
692 res = TEEC_InvokeCommand(s, cmd, &op, &ret_orig);
693
694 if (res != TEEC_SUCCESS) {
695 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
696 ret_orig);
697 }
698
699 if (res == TEEC_SUCCESS)
700 *dst_len = op.params[3].tmpref.size;
701
702 free(buf);
703 return res;
704}
705
706static TEEC_Result ta_crypt_cmd_asymmetric_encrypt(ADBG_Case_t *c,
707 TEEC_Session *s,
708 TEE_OperationHandle oph,
709 const TEE_Attribute *params,
710 uint32_t paramCount,
711 const void *src,
712 size_t src_len,
713 void *dst,
714 size_t *dst_len)
715{
716 return ta_crypt_cmd_asymmetric_operate(c, s, oph,
717 TA_CRYPT_CMD_ASYMMETRIC_ENCRYPT,
718 params, paramCount,
719 src, src_len, dst, dst_len);
720}
721
722static TEEC_Result ta_crypt_cmd_asymmetric_decrypt(ADBG_Case_t *c,
723 TEEC_Session *s,
724 TEE_OperationHandle oph,
725 const TEE_Attribute *params,
726 uint32_t paramCount,
727 const void *src,
728 size_t src_len,
729 void *dst,
730 size_t *dst_len)
731{
732 return ta_crypt_cmd_asymmetric_operate(c, s, oph,
733 TA_CRYPT_CMD_ASYMMETRIC_DECRYPT,
734 params, paramCount,
735 src, src_len, dst, dst_len);
736}
737
738static TEEC_Result ta_crypt_cmd_asymmetric_sign(ADBG_Case_t *c,
739 TEEC_Session *s,
740 TEE_OperationHandle oph,
741 const TEE_Attribute *params,
742 uint32_t paramCount,
743 const void *digest,
744 size_t digest_len,
745 void *signature,
746 size_t *signature_len)
747{
748 return ta_crypt_cmd_asymmetric_operate(c, s, oph,
749 TA_CRYPT_CMD_ASYMMETRIC_SIGN_DIGEST, params, paramCount,
750 digest, digest_len, signature, signature_len);
751}
752
753static TEEC_Result ta_crypt_cmd_asymmetric_verify(ADBG_Case_t *c,
754 TEEC_Session *s,
755 TEE_OperationHandle oph,
756 const TEE_Attribute *params,
757 uint32_t paramCount,
758 const void *digest,
759 size_t digest_len,
760 const void *signature,
761 size_t signature_len)
762{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100763 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200764 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100765 uint32_t ret_orig = 0;
766 uint8_t *buf = NULL;
767 size_t blen = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200768
769 res = pack_attrs(params, paramCount, &buf, &blen);
770 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
771 return res;
772
773 assert((uintptr_t)oph <= UINT32_MAX);
774 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
775
776 op.params[1].tmpref.buffer = buf;
777 op.params[1].tmpref.size = blen;
778
779 op.params[2].tmpref.buffer = (void *)digest;
780 op.params[2].tmpref.size = digest_len;
781
782 op.params[3].tmpref.buffer = (void *)signature;
783 op.params[3].tmpref.size = signature_len;
784
785 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
786 TEEC_MEMREF_TEMP_INPUT,
787 TEEC_MEMREF_TEMP_INPUT,
788 TEEC_MEMREF_TEMP_INPUT);
789
790 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_ASYMMETRIC_VERIFY_DIGEST,
791 &op, &ret_orig);
792
793 if (res != TEEC_SUCCESS) {
794 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
795 ret_orig);
796 }
797
798 free(buf);
799 return res;
800}
801
802static TEEC_Result ta_crypt_cmd_get_object_value_attribute(ADBG_Case_t *c,
803 TEEC_Session *s,
804 TEE_ObjectHandle o,
805 uint32_t attr_id,
806 uint32_t *valuea,
807 uint32_t *valueb)
808{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100809 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200810 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100811 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200812
813 assert((uintptr_t)o <= UINT32_MAX);
814 op.params[0].value.a = (uint32_t)(uintptr_t)o;
815 op.params[0].value.b = attr_id;
816 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_VALUE_OUTPUT,
817 TEEC_NONE, TEEC_NONE);
818
819 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_GET_OBJECT_VALUE_ATTRIBUTE,
820 &op, &ret_orig);
821
822 if (res != TEEC_SUCCESS) {
823 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
824 ret_orig);
825 }
826
827 if (res == TEEC_SUCCESS) {
828 *valuea = op.params[1].value.a;
829 *valueb = op.params[1].value.b;
830 }
831
832 return res;
833}
834
835static TEEC_Result ta_crypt_cmd_generate_key(ADBG_Case_t *c,
836 TEEC_Session *s,
837 TEE_ObjectHandle o,
838 uint32_t key_size,
839 const TEE_Attribute *params,
840 uint32_t paramCount)
841{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100842 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200843 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100844 uint32_t ret_orig = 0;
845 uint8_t *buf = NULL;
846 size_t blen = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200847
848 res = pack_attrs(params, paramCount, &buf, &blen);
849 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
850 return res;
851
852 assert((uintptr_t)o <= UINT32_MAX);
853 op.params[0].value.a = (uint32_t)(uintptr_t)o;
854 op.params[0].value.b = key_size;
855
856 op.params[1].tmpref.buffer = buf;
857 op.params[1].tmpref.size = blen;
858
859 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
860 TEEC_MEMREF_TEMP_INPUT, TEEC_NONE,
861 TEEC_NONE);
862
863 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_GENERATE_KEY, &op, &ret_orig);
864
865 if (res != TEEC_SUCCESS) {
866 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
867 ret_orig);
868 }
869
870 free(buf);
871 return res;
872}
873
874static const uint8_t hash_data_md5_in1[] = {
875 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'
876};
877
878static const uint8_t hash_data_md5_out1[] = {
879 0x61, 0x12, 0x71, 0x83, 0x70, 0x8d, 0x3a, 0xc7,
880 0xf1, 0x9b, 0x66, 0x06, 0xfc, 0xae, 0x7d, 0xf6
881};
882
883static const uint8_t hash_data_sha1_in1[] = {
884 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'
885};
886
887static const uint8_t hash_data_sha1_out1[] = {
888 0x4b, 0x98, 0x92, 0xb6, 0x52, 0x72, 0x14, 0xaf,
889 0xc6, 0x55, 0xb8, 0xaa, 0x52, 0xf4, 0xd2, 0x03,
890 0xc1, 0x5e, 0x7c, 0x9c
891};
892
893static const uint8_t hash_data_sha224_in1[] = {
894 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'
895};
896
897static const uint8_t hash_data_sha224_out1[] = {
898 0x08, 0x21, 0x69, 0xf9, 0x77, 0x1b, 0x80, 0x15,
899 0xf3, 0x97, 0xae, 0xde, 0x5b, 0xba, 0xa2, 0x72,
900 0x2d, 0x8f, 0x5c, 0x19, 0xfe, 0xd2, 0xe2, 0x68,
901 0x92, 0x49, 0xd8, 0x44
902};
903
904static const uint8_t hash_data_sha256_in1[] = { 'a', 'b', 'c' };
905
906static const uint8_t hash_data_sha256_out1[] = {
907 0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea,
908 0x41, 0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23,
909 0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c,
910 0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad
911};
912
913static const uint8_t hash_data_sha256_in2[] = { 'e', 'f', 'g' };
914
915static const uint8_t hash_data_sha256_out2[] = {
916 0xd4, 0xff, 0xe8, 0xe9, 0xee, 0x0b, 0x48, 0xeb,
917 0xa7, 0x16, 0x70, 0x61, 0x23, 0xa7, 0x18, 0x7f,
918 0x32, 0xea, 0xe3, 0xbd, 0xcb, 0x0e, 0x77, 0x63,
919 0xe4, 0x1e, 0x53, 0x32, 0x67, 0xbd, 0x8a, 0x53
920};
921
922
923static const uint8_t hash_data_sha384_in1[] = {
924 'a', 'b', 'c', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'
925};
926
927static const uint8_t hash_data_sha384_out1[] = {
928 0x4c, 0xab, 0x80, 0x9d, 0x96, 0x84, 0x01, 0x47,
929 0x67, 0x0a, 0xc1, 0x7a, 0xb6, 0xb9, 0xf7, 0x6e,
930 0x35, 0xa6, 0xb0, 0x8c, 0xf5, 0x2a, 0x3d, 0x64,
931 0x9a, 0x8c, 0x7e, 0x0c, 0x55, 0x45, 0xd3, 0x7d,
932 0x1f, 0x7f, 0x28, 0x34, 0x96, 0x14, 0x44, 0x2a,
933 0xf5, 0x98, 0xa2, 0x95, 0x24, 0x76, 0x53, 0x97
934};
935
936static const uint8_t hash_data_sha512_in1[] = {
937 'a', 'b', 'c', 'd', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'
938};
939
940static const uint8_t hash_data_sha512_out1[] = {
941 0x20, 0xd8, 0x64, 0x4f, 0x54, 0xa2, 0x5f, 0x6f,
942 0x0a, 0xf9, 0xd5, 0x27, 0x7d, 0x17, 0xa8, 0x99,
943 0x4c, 0x64, 0x3f, 0xd0, 0xf3, 0x83, 0x36, 0xee,
944 0x93, 0x12, 0x55, 0xcd, 0x2e, 0x12, 0x34, 0xa0,
945 0xc2, 0xaa, 0xf9, 0xbb, 0x15, 0xc5, 0xe9, 0xfa,
946 0xf7, 0xa7, 0xda, 0xb8, 0x2f, 0x72, 0xa0, 0x47,
947 0xe3, 0x02, 0x04, 0xe8, 0xa0, 0x35, 0x0c, 0x96,
948 0x26, 0xd1, 0xcb, 0x8b, 0x47, 0x45, 0x25, 0xd0
949};
950
Jens Wiklander72967ae2022-12-07 08:07:43 +0100951/* SHA-3 vectors from https://www.di-mgt.com.au/sha_testvectors.html */
952#define hash_data_sha3_in1 hash_data_sha256_in1
953
954static const uint8_t hash_data_sha3_224_out1[] = {
955 0xe6, 0x42, 0x82, 0x4c, 0x3f, 0x8c, 0xf2, 0x4a,
956 0xd0, 0x92, 0x34, 0xee, 0x7d, 0x3c, 0x76, 0x6f,
957 0xc9, 0xa3, 0xa5, 0x16, 0x8d, 0x0c, 0x94, 0xad,
958 0x73, 0xb4, 0x6f, 0xdf
959};
960
961static const uint8_t hash_data_sha3_256_out1[] = {
962 0x3a, 0x98, 0x5d, 0xa7, 0x4f, 0xe2, 0x25, 0xb2,
963 0x04, 0x5c, 0x17, 0x2d, 0x6b, 0xd3, 0x90, 0xbd,
964 0x85, 0x5f, 0x08, 0x6e, 0x3e, 0x9d, 0x52, 0x5b,
965 0x46, 0xbf, 0xe2, 0x45, 0x11, 0x43, 0x15, 0x32
966};
967
968static const uint8_t hash_data_sha3_384_out1[] = {
969 0xec, 0x01, 0x49, 0x82, 0x88, 0x51, 0x6f, 0xc9,
970 0x26, 0x45, 0x9f, 0x58, 0xe2, 0xc6, 0xad, 0x8d,
971 0xf9, 0xb4, 0x73, 0xcb, 0x0f, 0xc0, 0x8c, 0x25,
972 0x96, 0xda, 0x7c, 0xf0, 0xe4, 0x9b, 0xe4, 0xb2,
973 0x98, 0xd8, 0x8c, 0xea, 0x92, 0x7a, 0xc7, 0xf5,
974 0x39, 0xf1, 0xed, 0xf2, 0x28, 0x37, 0x6d, 0x25
975};
976
977static const uint8_t hash_data_sha3_512_out1[] = {
978 0xb7, 0x51, 0x85, 0x0b, 0x1a, 0x57, 0x16, 0x8a,
979 0x56, 0x93, 0xcd, 0x92, 0x4b, 0x6b, 0x09, 0x6e,
980 0x08, 0xf6, 0x21, 0x82, 0x74, 0x44, 0xf7, 0x0d,
981 0x88, 0x4f, 0x5d, 0x02, 0x40, 0xd2, 0x71, 0x2e,
982 0x10, 0xe1, 0x16, 0xe9, 0x19, 0x2a, 0xf3, 0xc9,
983 0x1a, 0x7e, 0xc5, 0x76, 0x47, 0xe3, 0x93, 0x40,
984 0x57, 0x34, 0x0b, 0x4c, 0xf4, 0x08, 0xd5, 0xa5,
985 0x65, 0x92, 0xf8, 0x27, 0x4e, 0xec, 0x53, 0xf0
986};
987
988/*
989 * SHAKE output generated with:
990 * https://asecuritysite.com/hash/shake?m=abc&l=54
991 */
992static const uint8_t hash_data_shake128_out1[] = {
993 0x58, 0x81, 0x09, 0x2d, 0xd8, 0x18, 0xbf, 0x5c,
994 0xf8, 0xa3, 0xdd, 0xb7, 0x93, 0xfb, 0xcb, 0xa7,
995 0x40, 0x97, 0xd5, 0xc5, 0x26, 0xa6, 0xd3, 0x5f,
996 0x97, 0xb8, 0x33, 0x51, 0x94, 0x0f, 0x2c, 0xc8,
997 0x44, 0xc5, 0x0a, 0xf3, 0x2a, 0xcd, 0x3f, 0x2c,
998 0xdd, 0x06, 0x65, 0x68, 0x70, 0x6f, 0x50, 0x9b,
999 0xc1, 0xbd, 0xde, 0x58, 0x29, 0x5d
1000};
1001
1002static const uint8_t hash_data_shake256_out1[] = {
1003 0x48, 0x33, 0x66, 0x60, 0x13, 0x60, 0xa8, 0x77,
1004 0x1c, 0x68, 0x63, 0x08, 0x0c, 0xc4, 0x11, 0x4d,
1005 0x8d, 0xb4, 0x45, 0x30, 0xf8, 0xf1, 0xe1, 0xee,
1006 0x4f, 0x94, 0xea, 0x37, 0xe7, 0x8b, 0x57, 0x39,
1007 0xd5, 0xa1, 0x5b, 0xef, 0x18, 0x6a, 0x53, 0x86,
1008 0xc7, 0x57, 0x44, 0xc0, 0x52, 0x7e, 0x1f, 0xaa,
1009 0x9f, 0x87, 0x26, 0xe4, 0x62, 0xa1
1010};
1011
Jerome Forissier3ed850a2019-12-13 10:58:23 +01001012/*
1013 * SM3
1014 * https://tools.ietf.org/html/draft-sca-cfrg-sm3-02
Jerome Forissier9f17e262019-12-13 14:12:41 +01001015 * Appendix A.1
Jerome Forissier3ed850a2019-12-13 10:58:23 +01001016 */
1017static const uint8_t hash_data_sm3_a1_in[3] = "abc";
1018
1019static const uint8_t hash_data_sm3_a1_out[] = {
1020 0x66, 0xc7, 0xf0, 0xf4, 0x62, 0xee, 0xed, 0xd9,
1021 0xd1, 0xf2, 0xd4, 0x6b, 0xdc, 0x10, 0xe4, 0xe2,
1022 0x41, 0x67, 0xc4, 0x87, 0x5c, 0xf2, 0xf7, 0xa2,
1023 0x29, 0x7d, 0xa0, 0x2b, 0x8f, 0x4b, 0xa8, 0xe0
1024};
1025
1026/*
1027 * SM3
1028 * https://tools.ietf.org/html/draft-sca-cfrg-sm3-02
Jerome Forissier9f17e262019-12-13 14:12:41 +01001029 * Appendix A.2
Jerome Forissier3ed850a2019-12-13 10:58:23 +01001030 */
1031static const uint8_t hash_data_sm3_a2_in[] = {
1032 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
1033 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
1034 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
1035 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
1036 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
1037 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
1038 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
1039 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64
1040};
1041
1042static const uint8_t hash_data_sm3_a2_out[] = {
1043 0xde, 0xbe, 0x9f, 0xf9, 0x22, 0x75, 0xb8, 0xa1,
1044 0x38, 0x60, 0x48, 0x89, 0xc1, 0x8e, 0x5a, 0x4d,
1045 0x6f, 0xdb, 0x70, 0xe5, 0x38, 0x7e, 0x57, 0x65,
1046 0x29, 0x3d, 0xcb, 0xa3, 0x9c, 0x0c, 0x57, 0x32
1047};
1048
Pascal Brandc639ac82015-07-02 08:53:34 +02001049struct xtest_hash_case {
1050 uint32_t algo;
1051 size_t in_incr;
1052 const uint8_t *in;
1053 size_t in_len;
1054 const uint8_t *out;
1055 size_t out_len;
1056};
1057
1058#define XTEST_HASH_CASE(algo, in_incr, in, out) \
1059 { (algo), (in_incr), (in), ARRAY_SIZE(in), (out), ARRAY_SIZE(out) }
1060
1061static const struct xtest_hash_case hash_cases[] = {
1062 XTEST_HASH_CASE(TEE_ALG_MD5, 6, hash_data_md5_in1,
1063 hash_data_md5_out1),
1064 XTEST_HASH_CASE(TEE_ALG_SHA1, 3, hash_data_sha1_in1,
1065 hash_data_sha1_out1),
1066 XTEST_HASH_CASE(TEE_ALG_SHA224, 7, hash_data_sha224_in1,
1067 hash_data_sha224_out1),
1068 XTEST_HASH_CASE(TEE_ALG_SHA256, 1, hash_data_sha256_in1,
1069 hash_data_sha256_out1),
1070 XTEST_HASH_CASE(TEE_ALG_SHA256, 1, hash_data_sha256_in2,
1071 hash_data_sha256_out2),
1072 XTEST_HASH_CASE(TEE_ALG_SHA384, 1, hash_data_sha384_in1,
1073 hash_data_sha384_out1),
1074 XTEST_HASH_CASE(TEE_ALG_SHA512, 1, hash_data_sha512_in1,
1075 hash_data_sha512_out1),
Jens Wiklander72967ae2022-12-07 08:07:43 +01001076 XTEST_HASH_CASE(TEE_ALG_SHA3_224, 1, hash_data_sha3_in1,
1077 hash_data_sha3_224_out1),
1078 XTEST_HASH_CASE(TEE_ALG_SHA3_256, 1, hash_data_sha3_in1,
1079 hash_data_sha3_256_out1),
1080 XTEST_HASH_CASE(TEE_ALG_SHA3_384, 1, hash_data_sha3_in1,
1081 hash_data_sha3_384_out1),
1082 XTEST_HASH_CASE(TEE_ALG_SHA3_512, 1, hash_data_sha3_in1,
1083 hash_data_sha3_512_out1),
1084 XTEST_HASH_CASE(TEE_ALG_SHAKE128, 1, hash_data_sha3_in1,
1085 hash_data_shake128_out1),
1086 XTEST_HASH_CASE(TEE_ALG_SHAKE256, 1, hash_data_sha3_in1,
1087 hash_data_shake256_out1),
Jerome Forissier3ed850a2019-12-13 10:58:23 +01001088 XTEST_HASH_CASE(TEE_ALG_SM3, 2, hash_data_sm3_a1_in,
1089 hash_data_sm3_a1_out),
1090 XTEST_HASH_CASE(TEE_ALG_SM3, 19, hash_data_sm3_a2_in,
1091 hash_data_sm3_a2_out),
Pascal Brandc639ac82015-07-02 08:53:34 +02001092};
1093
1094static void xtest_tee_test_4001(ADBG_Case_t *c)
1095{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001096 TEEC_Session session = { };
1097 uint32_t ret_orig = 0;
1098 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001099
1100 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1101 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
1102 &ret_orig)))
1103 return;
1104
1105
1106 for (n = 0; n < ARRAY_SIZE(hash_cases); n++) {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001107 TEE_OperationHandle op1 = TEE_HANDLE_NULL;
1108 TEE_OperationHandle op2 = TEE_HANDLE_NULL;
1109 uint8_t out[64] = { };
1110 size_t out_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001111
Jerome Forissier87b00c02020-01-22 16:33:12 +01001112 if (hash_cases[n].algo == TEE_ALG_SM3 &&
1113 !ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_SM3,
1114 TEE_CRYPTO_ELEMENT_NONE)) {
1115 Do_ADBG_Log("SM3 not supported: skip subcase");
1116 continue;
1117 }
1118
Pascal Brandc639ac82015-07-02 08:53:34 +02001119 Do_ADBG_BeginSubCase(c, "Hash case %d algo 0x%x",
1120 (int)n, (unsigned int)hash_cases[n].algo);
1121
1122 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1123 ta_crypt_cmd_allocate_operation(c, &session, &op1,
1124 hash_cases[n].algo,
1125 TEE_MODE_DIGEST, 0)))
1126 goto out;
1127
1128 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1129 ta_crypt_cmd_allocate_operation(c, &session, &op2,
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_digest_update(c, &session, op1,
1136 hash_cases[n].in,
1137 hash_cases[n].in_incr)))
1138 goto out;
1139
1140 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1141 ta_crypt_cmd_copy_operation(c, &session, op2, op1)))
1142 goto out;
1143
Jens Wiklander72967ae2022-12-07 08:07:43 +01001144 out_size = hash_cases[n].out_len;
Pascal Brandc639ac82015-07-02 08:53:34 +02001145 memset(out, 0, sizeof(out));
1146 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1147 ta_crypt_cmd_digest_do_final(c, &session, op2,
1148 hash_cases[n].in + hash_cases[n].in_incr,
1149 hash_cases[n].in_len - hash_cases[n].in_incr,
1150 out, &out_size)))
1151 goto out;
1152
1153 (void)ADBG_EXPECT_BUFFER(c, hash_cases[n].out,
1154 hash_cases[n].out_len, out, out_size);
1155
1156 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1157 ta_crypt_cmd_reset_operation(c, &session, op1)))
1158 goto out;
1159
Jens Wiklander72967ae2022-12-07 08:07:43 +01001160 out_size = hash_cases[n].out_len;
Pascal Brandc639ac82015-07-02 08:53:34 +02001161 memset(out, 0, sizeof(out));
1162 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1163 ta_crypt_cmd_digest_do_final(c, &session, op1,
1164 hash_cases[n].in,
1165 hash_cases[n].in_len, out,
1166 &out_size)))
1167 goto out;
1168
1169 (void)ADBG_EXPECT_BUFFER(c, hash_cases[n].out,
1170 hash_cases[n].out_len, out, out_size);
1171
Jerome Forissier1e05e262015-07-29 16:09:07 +02001172 /*
1173 * Invoke TEE_DigestDoFinal() a second time to check that state
1174 * was properly reset
1175 */
Jens Wiklander72967ae2022-12-07 08:07:43 +01001176 out_size = hash_cases[n].out_len;
Jerome Forissier1e05e262015-07-29 16:09:07 +02001177 memset(out, 0, sizeof(out));
1178 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1179 ta_crypt_cmd_digest_do_final(c, &session, op1,
1180 hash_cases[n].in,
1181 hash_cases[n].in_len, out,
1182 &out_size)))
1183 goto out;
1184
1185 (void)ADBG_EXPECT_BUFFER(c, hash_cases[n].out,
1186 hash_cases[n].out_len, out, out_size);
1187
Jens Wiklander92aded22022-12-07 09:43:56 +01001188 /*
1189 * Test that TEE_DigestExtract() and TEE_DigestDoFinal()
1190 * work together.
1191 */
1192
1193 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1194 ta_crypt_cmd_digest_update(c, &session, op1,
1195 hash_cases[n].in,
1196 hash_cases[n].in_len)))
1197 goto out;
1198
1199 out_size = hash_cases[n].in_incr;
1200 memset(out, 0, sizeof(out));
1201 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1202 ta_crypt_cmd_digest_extract(c, &session, op1,
1203 out, &out_size)))
1204 goto out;
1205 ADBG_EXPECT_BUFFER(c, hash_cases[n].out,
1206 hash_cases[n].in_incr, out, out_size);
1207
1208 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1209 ta_crypt_cmd_copy_operation(c, &session, op2, op1)))
1210 goto out;
1211
1212 out_size = hash_cases[n].out_len - hash_cases[n].in_incr;
1213 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1214 ta_crypt_cmd_digest_do_final(c, &session, op1,
1215 NULL, 0, out, &out_size)))
1216 goto out;
1217 ADBG_EXPECT_BUFFER(c, hash_cases[n].out + hash_cases[n].in_incr,
1218 hash_cases[n].out_len -
1219 hash_cases[n].in_incr, out, out_size);
1220
1221 out_size = hash_cases[n].out_len - hash_cases[n].in_incr;
1222 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1223 ta_crypt_cmd_digest_extract(c, &session, op2,
1224 out, &out_size)))
1225 goto out;
1226 ADBG_EXPECT_BUFFER(c, hash_cases[n].out + hash_cases[n].in_incr,
1227 hash_cases[n].out_len -
1228 hash_cases[n].in_incr, out, out_size);
1229
Pascal Brandc639ac82015-07-02 08:53:34 +02001230 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1231 ta_crypt_cmd_free_operation(c, &session, op1)))
1232 goto out;
1233
1234 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1235 ta_crypt_cmd_free_operation(c, &session, op2)))
1236 goto out;
1237
1238 Do_ADBG_EndSubCase(c, NULL);
1239 }
1240
1241out:
1242 TEEC_CloseSession(&session);
1243}
Jens Wiklander14f48872018-06-29 15:30:13 +02001244ADBG_CASE_DEFINE(regression, 4001, xtest_tee_test_4001,
1245 "Test TEE Internal API hash operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02001246
Pascal Brandc639ac82015-07-02 08:53:34 +02001247struct xtest_mac_case {
1248 uint32_t algo;
1249 uint32_t key_type;
1250 const uint8_t *key;
1251 size_t key_len;
1252 size_t in_incr;
1253 const uint8_t *in;
1254 size_t in_len;
1255 const uint8_t *out;
1256 size_t out_len;
Jerome Forissier3dec7442019-01-30 17:50:05 +01001257 bool multiple_incr;
Pascal Brandc639ac82015-07-02 08:53:34 +02001258};
1259
Jerome Forissier3dec7442019-01-30 17:50:05 +01001260#define XTEST_MAC_CASE_1(algo, key_type, key, in_incr, in, out) \
Pascal Brandc639ac82015-07-02 08:53:34 +02001261 { (algo), (key_type), (key), ARRAY_SIZE(key), \
Jerome Forissier3dec7442019-01-30 17:50:05 +01001262 (in_incr), (in), ARRAY_SIZE(in), (out), ARRAY_SIZE(out), false }
1263
1264#define XTEST_MAC_CASE_MULT(algo, key_type, key, in_incr, in, out) \
1265 { (algo), (key_type), (key), ARRAY_SIZE(key), \
1266 (in_incr), (in), ARRAY_SIZE(in), (out), ARRAY_SIZE(out), true }
1267
1268#define XTEST_MAC_CASE(algo, key_type, key, in_incr, in, out) \
1269 XTEST_MAC_CASE_1((algo), (key_type), (key), (in_incr), (in), (out)), \
1270 XTEST_MAC_CASE_MULT((algo), (key_type), (key), (in_incr), (in), (out))
Pascal Brandc639ac82015-07-02 08:53:34 +02001271
1272#define XTEST_MAC_CBC_CASE(algo, key_type, vect, in_incr) \
1273 XTEST_MAC_CASE((algo), (key_type), \
1274 mac_cbc_ ## vect ## _key, (in_incr), \
1275 mac_cbc_ ## vect ## _data, mac_cbc_ ## vect ## _out)
1276
1277#define XTEST_MAC_CMAC_CASE(vect, in_incr) \
1278 XTEST_MAC_CASE(TEE_ALG_AES_CMAC, TEE_TYPE_AES, \
1279 mac_cmac_ ## vect ## _key, (in_incr), \
1280 mac_cmac_ ## vect ## _data, mac_cmac_ ## vect ## _out)
1281
Alexander Zakharov0afe00c2021-02-10 19:06:48 +01001282#define XTEST_MAC_DES3_CMAC_CASE(vect, in_incr) \
1283 XTEST_MAC_CASE(TEE_ALG_DES3_CMAC, TEE_TYPE_DES3, \
1284 mac_des3_cmac_ ## vect ## _key, (in_incr), \
1285 mac_des3_cmac_ ## vect ## _data, mac_des3_cmac_ ## vect ## _out)
1286
Pascal Brandc639ac82015-07-02 08:53:34 +02001287static const struct xtest_mac_case mac_cases[] = {
1288 XTEST_MAC_CASE(TEE_ALG_HMAC_MD5, TEE_TYPE_HMAC_MD5,
1289 mac_data_md5_key1,
1290 4, mac_data_md5_in1, mac_data_md5_out1),
1291 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA1, TEE_TYPE_HMAC_SHA1,
1292 mac_data_sha1_key1,
1293 5, mac_data_sha1_in1, mac_data_sha1_out1),
1294 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA224, TEE_TYPE_HMAC_SHA224,
1295 mac_data_sha224_key1,
1296 8, mac_data_sha224_in1, mac_data_sha224_out1),
1297 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA256, TEE_TYPE_HMAC_SHA256,
1298 mac_data_sha256_key1,
1299 1, mac_data_sha256_in1, mac_data_sha256_out1),
1300 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA256, TEE_TYPE_HMAC_SHA256,
1301 mac_data_sha256_key2,
1302 7, mac_data_sha256_in2, mac_data_sha256_out2),
1303 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA384, TEE_TYPE_HMAC_SHA384,
1304 mac_data_sha384_key1,
1305 11, mac_data_sha384_in1, mac_data_sha384_out1),
1306 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA512, TEE_TYPE_HMAC_SHA512,
1307 mac_data_sha512_key1,
1308 13, mac_data_sha512_in1, mac_data_sha512_out1),
Jens Wiklander16de19d2022-12-09 18:00:08 +01001309 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA3_224, TEE_TYPE_HMAC_SHA3_224,
1310 mac_data_sha3_224_key1,
1311 13, mac_data_sha3_224_in1, mac_data_sha3_224_out1),
1312 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA3_256, TEE_TYPE_HMAC_SHA3_256,
1313 mac_data_sha3_256_key1,
1314 13, mac_data_sha3_256_in1, mac_data_sha3_256_out1),
1315 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA3_384, TEE_TYPE_HMAC_SHA3_384,
1316 mac_data_sha3_384_key1,
1317 13, mac_data_sha3_384_in1, mac_data_sha3_384_out1),
1318 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA3_512, TEE_TYPE_HMAC_SHA3_512,
1319 mac_data_sha3_512_key1,
1320 13, mac_data_sha3_512_in1, mac_data_sha3_512_out1),
Pascal Brandc639ac82015-07-02 08:53:34 +02001321
1322 XTEST_MAC_CBC_CASE(TEE_ALG_AES_CBC_MAC_NOPAD, TEE_TYPE_AES, vect1, 14),
1323 XTEST_MAC_CBC_CASE(TEE_ALG_DES_CBC_MAC_NOPAD, TEE_TYPE_DES, vect2, 16),
1324 XTEST_MAC_CBC_CASE(TEE_ALG_DES3_CBC_MAC_NOPAD, TEE_TYPE_DES3, vect3,
1325 17),
1326 XTEST_MAC_CBC_CASE(TEE_ALG_AES_CBC_MAC_PKCS5, TEE_TYPE_AES, vect4, 11),
1327 XTEST_MAC_CBC_CASE(TEE_ALG_DES_CBC_MAC_PKCS5, TEE_TYPE_DES, vect5, 9),
1328 XTEST_MAC_CBC_CASE(TEE_ALG_DES3_CBC_MAC_PKCS5, TEE_TYPE_DES3, vect6, 4),
1329 XTEST_MAC_CBC_CASE(TEE_ALG_AES_CBC_MAC_PKCS5, TEE_TYPE_AES, vect7, 3),
1330 XTEST_MAC_CBC_CASE(TEE_ALG_DES_CBC_MAC_PKCS5, TEE_TYPE_DES, vect8, 23),
1331 XTEST_MAC_CBC_CASE(TEE_ALG_DES3_CBC_MAC_PKCS5, TEE_TYPE_DES3, vect9,
1332 34),
Pascal Brand5c3d8092015-07-23 08:20:26 +02001333 XTEST_MAC_CBC_CASE(TEE_ALG_DES3_CBC_MAC_PKCS5, TEE_TYPE_DES3, vect10, 4),
Pascal Brandc639ac82015-07-02 08:53:34 +02001334
1335 { TEE_ALG_AES_CMAC, TEE_TYPE_AES, mac_cmac_vect1_key,
1336 ARRAY_SIZE(mac_cmac_vect1_key), 0, NULL, 0, mac_cmac_vect1_out,
1337 ARRAY_SIZE(mac_cmac_vect1_out) },
1338 XTEST_MAC_CMAC_CASE(vect2, 9),
1339 XTEST_MAC_CMAC_CASE(vect3, 9),
1340 XTEST_MAC_CMAC_CASE(vect4, 9),
1341 { TEE_ALG_AES_CMAC, TEE_TYPE_AES, mac_cmac_vect5_key,
1342 ARRAY_SIZE(mac_cmac_vect5_key), 0, NULL, 0, mac_cmac_vect5_out,
1343 ARRAY_SIZE(mac_cmac_vect5_out) },
1344 XTEST_MAC_CMAC_CASE(vect6, 9),
1345 XTEST_MAC_CMAC_CASE(vect7, 9),
1346 XTEST_MAC_CMAC_CASE(vect8, 9),
1347 { TEE_ALG_AES_CMAC, TEE_TYPE_AES, mac_cmac_vect9_key,
1348 ARRAY_SIZE(mac_cmac_vect9_key), 0, NULL, 0, mac_cmac_vect9_out,
1349 ARRAY_SIZE(mac_cmac_vect9_out) },
1350 XTEST_MAC_CMAC_CASE(vect10, 9),
1351 XTEST_MAC_CMAC_CASE(vect11, 9),
1352 XTEST_MAC_CMAC_CASE(vect12, 9),
Clement Faure21b347a2021-04-29 13:06:55 +02001353 XTEST_MAC_CMAC_CASE(vect12, 16),
Olivier Massea40266a2023-07-19 10:34:03 +02001354 XTEST_MAC_CMAC_CASE(vect13, 1),
Jerome Forissier9f17e262019-12-13 14:12:41 +01001355
Alexander Zakharov0afe00c2021-02-10 19:06:48 +01001356 { TEE_ALG_DES3_CMAC, TEE_TYPE_DES3, mac_des3_cmac_vect1_key,
1357 ARRAY_SIZE(mac_des3_cmac_vect1_key), 0, NULL, 0, mac_des3_cmac_vect1_out,
1358 ARRAY_SIZE(mac_des3_cmac_vect1_out) },
1359 XTEST_MAC_DES3_CMAC_CASE(vect2, 3),
1360 XTEST_MAC_DES3_CMAC_CASE(vect3, 9),
1361 XTEST_MAC_DES3_CMAC_CASE(vect4, 9),
1362 { TEE_ALG_DES3_CMAC, TEE_TYPE_DES3, mac_des3_cmac_vect5_key,
1363 ARRAY_SIZE(mac_des3_cmac_vect5_key), 0, NULL, 0, mac_des3_cmac_vect5_out,
1364 ARRAY_SIZE(mac_des3_cmac_vect5_out) },
1365 XTEST_MAC_DES3_CMAC_CASE(vect6, 3),
1366 XTEST_MAC_DES3_CMAC_CASE(vect7, 5),
1367 XTEST_MAC_DES3_CMAC_CASE(vect8, 9),
1368
Jerome Forissier9f17e262019-12-13 14:12:41 +01001369 XTEST_MAC_CASE(TEE_ALG_HMAC_SM3, TEE_TYPE_HMAC_SM3,
1370 mac_data_sm3_d31_key,
1371 13, mac_data_sm3_d31_in, mac_data_sm3_d31_out),
1372 XTEST_MAC_CASE(TEE_ALG_HMAC_SM3, TEE_TYPE_HMAC_SM3,
1373 mac_data_sm3_d32_key,
1374 13, mac_data_sm3_d32_in, mac_data_sm3_d32_out),
Pascal Brandc639ac82015-07-02 08:53:34 +02001375};
1376
1377static void xtest_tee_test_4002(ADBG_Case_t *c)
1378{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001379 TEEC_Session session = { };
1380 TEE_OperationHandle op1 = TEE_HANDLE_NULL;
1381 TEE_OperationHandle op2 = TEE_HANDLE_NULL;
Jerome Forissier4f419512021-07-07 14:56:10 +02001382 TEE_OperationHandle op3 = TEE_HANDLE_NULL;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001383 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
1384 uint8_t out[64] = { };
1385 size_t out_size = 0;
1386 uint32_t ret_orig = 0;
1387 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001388
1389 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1390 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
1391 &ret_orig)))
1392 return;
1393
1394 for (n = 0; n < ARRAY_SIZE(mac_cases); n++) {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001395 TEE_Attribute key_attr = { };
1396 size_t key_size = 0;
1397 size_t offs = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001398
1399 Do_ADBG_BeginSubCase(c, "MAC case %d algo 0x%x",
1400 (int)n, (unsigned int)mac_cases[n].algo);
1401
1402 key_attr.attributeID = TEE_ATTR_SECRET_VALUE;
1403 key_attr.content.ref.buffer = (void *)mac_cases[n].key;
1404 key_attr.content.ref.length = mac_cases[n].key_len;
1405
1406 key_size = key_attr.content.ref.length * 8;
1407 if (mac_cases[n].key_type == TEE_TYPE_DES ||
1408 mac_cases[n].key_type == TEE_TYPE_DES3)
1409 /* Exclude parity in bit size of key */
1410 key_size -= key_size / 8;
1411
1412 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1413 ta_crypt_cmd_allocate_operation(c, &session, &op1,
1414 mac_cases[n].algo, TEE_MODE_MAC, key_size)))
1415 goto out;
1416
1417 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1418 ta_crypt_cmd_allocate_operation(c, &session, &op2,
1419 mac_cases[n].algo, TEE_MODE_MAC, key_size)))
1420 goto out;
1421
1422 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jerome Forissier4f419512021-07-07 14:56:10 +02001423 ta_crypt_cmd_allocate_operation(c, &session, &op3,
1424 mac_cases[n].algo, TEE_MODE_MAC, key_size)))
1425 goto out;
1426
1427 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc639ac82015-07-02 08:53:34 +02001428 ta_crypt_cmd_allocate_transient_object(c, &session,
1429 mac_cases[n].key_type, key_size, &key_handle)))
1430 goto out;
1431
1432 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1433 ta_crypt_cmd_populate_transient_object(c, &session,
1434 key_handle, &key_attr, 1)))
1435 goto out;
1436
1437 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1438 ta_crypt_cmd_set_operation_key(c, &session, op1,
1439 key_handle)))
1440 goto out;
1441
1442 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1443 ta_crypt_cmd_free_transient_object(c, &session,
1444 key_handle)))
1445 goto out;
1446
1447 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1448 ta_crypt_cmd_mac_init(c, &session, op1, NULL, 0)))
1449 goto out;
1450
Jerome Forissier4f419512021-07-07 14:56:10 +02001451 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1452 ta_crypt_cmd_copy_operation(c, &session, op3, op1)))
1453 goto out;
1454
Jerome Forissier3dec7442019-01-30 17:50:05 +01001455 offs = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001456 if (mac_cases[n].in != NULL) {
Jerome Forissier3dec7442019-01-30 17:50:05 +01001457 while (offs + mac_cases[n].in_incr <
1458 mac_cases[n].in_len) {
1459 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1460 ta_crypt_cmd_mac_update(c, &session,
1461 op1, mac_cases[n].in + offs,
1462 mac_cases[n].in_incr)))
1463 goto out;
1464 offs += mac_cases[n].in_incr;
1465 if (!mac_cases[n].multiple_incr)
1466 break;
1467 }
Pascal Brandc639ac82015-07-02 08:53:34 +02001468 }
1469
1470 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1471 ta_crypt_cmd_copy_operation(c, &session, op2, op1)))
1472 goto out;
1473
1474 out_size = sizeof(out);
1475 memset(out, 0, sizeof(out));
1476 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1477 ta_crypt_cmd_mac_final_compute(c, &session, op2,
Jerome Forissier3dec7442019-01-30 17:50:05 +01001478 mac_cases[n].in + offs,
1479 mac_cases [n].in_len - offs,
Pascal Brandc639ac82015-07-02 08:53:34 +02001480 out, &out_size)))
1481 goto out;
1482
1483 (void)ADBG_EXPECT_BUFFER(c, mac_cases[n].out,
1484 mac_cases[n].out_len, out, out_size);
1485
1486 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1487 ta_crypt_cmd_mac_init(c, &session, op1, NULL, 0)))
1488 goto out;
1489
1490 out_size = sizeof(out);
1491 memset(out, 0, sizeof(out));
1492 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1493 ta_crypt_cmd_mac_final_compute(c, &session, op1,
1494 mac_cases[n].in, mac_cases[n].in_len, out,
1495 &out_size)))
1496 goto out;
1497
1498 (void)ADBG_EXPECT_BUFFER(c, mac_cases[n].out,
1499 mac_cases[n].out_len, out, out_size);
1500
1501 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jerome Forissier4f419512021-07-07 14:56:10 +02001502 ta_crypt_cmd_mac_final_compare(c, &session, op3,
1503 mac_cases[n].in, mac_cases[n].in_len,
1504 mac_cases[n].out, mac_cases[n].out_len)))
1505 goto out;
1506
1507 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc639ac82015-07-02 08:53:34 +02001508 ta_crypt_cmd_free_operation(c, &session, op1)))
1509 goto out;
1510
1511 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1512 ta_crypt_cmd_free_operation(c, &session, op2)))
1513 goto out;
1514
Jerome Forissier4f419512021-07-07 14:56:10 +02001515 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1516 ta_crypt_cmd_free_operation(c, &session, op3)))
1517 goto out;
1518
Pascal Brandc639ac82015-07-02 08:53:34 +02001519 Do_ADBG_EndSubCase(c, NULL);
1520 }
1521out:
1522 TEEC_CloseSession(&session);
1523}
Jens Wiklander14f48872018-06-29 15:30:13 +02001524ADBG_CASE_DEFINE(regression, 4002, xtest_tee_test_4002,
1525 "Test TEE Internal API MAC operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02001526
Pascal Brandc639ac82015-07-02 08:53:34 +02001527static const uint8_t ciph_data_aes_key1[] = {
1528 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1529 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1530};
1531
Jerome Forissier0780ad42018-06-05 15:02:37 +02001532static const uint8_t ciph_data_aes_key2[] = {
1533 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
1534 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
1535};
1536
Pascal Brandc639ac82015-07-02 08:53:34 +02001537static const uint8_t ciph_data_des_key1[] = {
1538 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37 /* 01234567 */
1539};
1540
1541static const uint8_t ciph_data_des_key2[] = {
1542 0x13, 0x34, 0x57, 0x79, 0x9B, 0xBC, 0xDF, 0xF1
1543};
1544
1545
1546static const uint8_t ciph_data_des3_key1[] = {
1547 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1548 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1549 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, /* 12345678 */
1550};
1551
1552static const uint8_t ciph_data_des3_key2[] = {
1553 0x13, 0x34, 0x57, 0x79, 0x9B, 0xBC, 0xDF, 0xF1,
1554 0x13, 0x34, 0x57, 0x79, 0x9B, 0xBC, 0xDF, 0xF1,
1555 0x13, 0x34, 0x57, 0x79, 0x9B, 0xBC, 0xDF, 0xF1
1556};
1557
1558static const uint8_t ciph_data_des2_key1[] = {
1559 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1560 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1561};
1562
1563static const uint8_t ciph_data_in1[] = {
1564 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, /* 23456789 */
1565 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, /* ABCDEF01 */
1566 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, /* 3456789A */
1567 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, /* BCDEF012 */
1568 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, /* 456789AB */
1569 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, 0x33, /* CDEF0123 */
1570};
1571
1572static const uint8_t ciph_data_in3[] = {
1573 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, /* 23456789 */
1574 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, /* ABCDEF01 */
1575 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, /* 3456789A */
1576 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, /* BCDEF012 */
1577 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, /* 456789AB */
1578 0x43, 0x44, 0x45, 0x46, 0x30, /* CDEF0 */
1579};
1580
Jerome Forissier45218eb2018-04-11 13:03:26 +02001581static const uint8_t ciph_data_in4[] = {
1582 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, /* 23456789 */
1583 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, /* ABCDEF01 */
1584 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, /* 3456789A */
1585 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, /* BCDEF012 */
1586 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, /* 456789AB */
1587 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, 0x33, /* CDEF0123 */
1588 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1589 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1590};
1591
Jerome Forissier0780ad42018-06-05 15:02:37 +02001592static const uint8_t ciph_data_in5[] = {
1593 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1594 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1595 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1596 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1597 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1598 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1599 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1600 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
Jerome Forissierbf9009e2018-06-05 18:44:42 +02001601 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1602 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
Jerome Forissier0780ad42018-06-05 15:02:37 +02001603 0x01, 0x01, 0x01
1604};
1605
Pascal Brandc639ac82015-07-02 08:53:34 +02001606static const uint8_t ciph_data_128_iv1[] = {
1607 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, /* 12345678 */
1608 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, /* 9ABCDEF0 */
1609};
1610
Jerome Forissier0780ad42018-06-05 15:02:37 +02001611static const uint8_t ciph_data_128_iv2[] = {
1612 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
1613 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
1614};
1615
Pascal Brandc639ac82015-07-02 08:53:34 +02001616static const uint8_t ciph_data_64_iv1[] = {
1617 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, /* 12345678 */
1618};
1619
1620static const uint8_t ciph_data_in2[] = {
1621 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef
1622};
1623
1624static const uint8_t ciph_data_aes_ecb_nopad_out1[] = {
1625 0xA5, 0xBE, 0x14, 0xD5, 0x01, 0x05, 0x24, 0x48, /* ......$H */
1626 0x58, 0x1A, 0x6B, 0x82, 0xD4, 0x41, 0xD2, 0xB3, /* X.k..A.. */
1627 0xBB, 0xF9, 0xAE, 0x37, 0x94, 0xAC, 0x18, 0x50, /* ...7...P */
1628 0x87, 0x09, 0xCC, 0x3F, 0x43, 0xD2, 0xC2, 0xB7, /* ...?C... */
1629 0xD7, 0x6F, 0x84, 0x07, 0xB4, 0x78, 0xCE, 0x34, /* .o...x.4 */
1630 0x48, 0xC9, 0x16, 0x86, 0x42, 0xB8, 0xFF, 0xCF, /* H...B... */
1631};
1632
1633static const uint8_t ciph_data_aes_cbc_nopad_out1[] = {
1634 0x8D, 0x9F, 0x88, 0xD8, 0xAF, 0x9F, 0xC1, 0x3B, /* .......; */
1635 0x02, 0x15, 0x43, 0x6A, 0x8C, 0x1E, 0x34, 0x5C, /* ..Cj..4\ */
1636 0x83, 0xF4, 0x85, 0x3E, 0x43, 0x0F, 0xE5, 0x5F, /* ...>C.._ */
1637 0x81, 0x4C, 0xC0, 0x28, 0x3F, 0xD9, 0x98, 0x53, /* .L.(?..S */
1638 0xB1, 0x44, 0x51, 0x38, 0x21, 0xAB, 0x10, 0xCE, /* .DQ8!... */
1639 0xC2, 0xEC, 0x65, 0x54, 0xDD, 0x5C, 0xEA, 0xDC, /* ..eT.\.. */
1640};
1641
1642static const uint8_t ciph_data_aes_ctr_out1[] = {
1643 0xD2, 0xDD, 0x11, 0xA8, 0xF7, 0xB0, 0xAE, 0x55, /* .......U */
1644 0xBE, 0x61, 0x7A, 0xE6, 0xA1, 0x6C, 0x79, 0xF4, /* .az..ly. */
1645 0x62, 0x51, 0x7B, 0xE9, 0x7C, 0xA0, 0x31, 0x0C, /* bQ{.|.1. */
1646 0x24, 0x15, 0x70, 0x7F, 0x47, 0x37, 0x69, 0xE0, /* $.p.G7i. */
1647 0x24, 0xC3, 0x29, 0xCD, 0xF2, 0x26, 0x69, 0xFF, /* $.)..&i. */
1648 0x72, 0x0E, 0x3C, 0xD1, 0xA1, 0x2F, 0x5D, 0x33, /* r.<../]3 */
1649};
1650
1651static const uint8_t ciph_data_aes_ctr_out2[] = {
1652 0xD2, 0xDD, 0x11, 0xA8, 0xF7, 0xB0, 0xAE, 0x55, /* .......U */
1653 0xBE, 0x61, 0x7A, 0xE6, 0xA1, 0x6C, 0x79, 0xF4, /* .az..ly. */
1654 0x62, 0x51, 0x7B, 0xE9, 0x7C, 0xA0, 0x31, 0x0C, /* bQ{.|.1. */
1655 0x24, 0x15, 0x70, 0x7F, 0x47, 0x37, 0x69, 0xE0, /* $.p.G7i. */
1656 0x24, 0xC3, 0x29, 0xCD, 0xF2, 0x26, 0x69, 0xFF, /* $.)..&i. */
1657 0x72, 0x0E, 0x3C, 0xD1, 0xA1, /* r.<.. */
1658};
1659
Jerome Forissier45218eb2018-04-11 13:03:26 +02001660static const uint8_t ciph_data_aes_ctr_out4[] = {
1661 0xD2, 0xDD, 0x11, 0xA8, 0xF7, 0xB0, 0xAE, 0x55, /* .......U */
1662 0xBE, 0x61, 0x7A, 0xE6, 0xA1, 0x6C, 0x79, 0xF4, /* .az..ly. */
1663 0x62, 0x51, 0x7B, 0xE9, 0x7C, 0xA0, 0x31, 0x0C, /* bQ{.|.1. */
1664 0x24, 0x15, 0x70, 0x7F, 0x47, 0x37, 0x69, 0xE0, /* $.p.G7i. */
1665 0x24, 0xC3, 0x29, 0xCD, 0xF2, 0x26, 0x69, 0xFF, /* $.)..&i. */
1666 0x72, 0x0E, 0x3C, 0xD1, 0xA1, 0x2F, 0x5D, 0x33, /* r.<../]3 */
1667 0x9F, 0xD7, 0x0C, 0x92, 0xD4, 0xA5, 0x9D, 0x06, /* ........ */
1668 0x01, 0x80, 0x38, 0xCD, 0xC2, 0x71, 0x5D, 0x4A, /* ..8..q]J */
1669};
1670
Jerome Forissier0780ad42018-06-05 15:02:37 +02001671static const uint8_t ciph_data_aes_ctr_out5[] = {
1672 0xbb, 0xfe, 0x07, 0x04, 0x1c, 0x8e, 0x09, 0x61,
1673 0xfb, 0xb1, 0x7c, 0xa5, 0x4d, 0x2b, 0x30, 0xf6,
1674 0x26, 0x9e, 0xff, 0x61, 0x18, 0x47, 0xc6, 0x06,
1675 0x81, 0x02, 0x84, 0xcd, 0x9c, 0x4b, 0x6d, 0x21,
1676 0xe2, 0x64, 0xa6, 0x50, 0x7f, 0x28, 0x81, 0x6f,
1677 0x29, 0xda, 0xd5, 0x56, 0x3f, 0x46, 0xac, 0xca,
1678 0x37, 0xe7, 0x77, 0x36, 0xbc, 0x76, 0x39, 0x57,
1679 0xaa, 0x67, 0x1b, 0x2a, 0xe6, 0x36, 0x57, 0x6d,
Jerome Forissierbf9009e2018-06-05 18:44:42 +02001680 0x2a, 0xb8, 0x77, 0x41, 0xc2, 0x4e, 0x4f, 0x27,
1681 0x4c, 0x34, 0x7a, 0x01, 0x6a, 0xda, 0x75, 0x75,
1682 0x3e, 0x68, 0xb2
Jerome Forissier0780ad42018-06-05 15:02:37 +02001683};
1684
Pascal Brandc639ac82015-07-02 08:53:34 +02001685static const uint8_t ciph_data_aes_cbc_vect1_key[] = {
1686 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1687 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1688};
1689
1690static const uint8_t ciph_data_aes_cbc_vect1_iv[] = {
1691 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
1692 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
1693};
1694
1695static const uint8_t ciph_data_aes_cbc_vect1_ptx[] = {
1696 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x20, 0x62, /* Cipher b */
1697 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x63, 0x68, 0x61, /* lock cha */
1698 0x69, 0x6E, 0x69, 0x6E, 0x67, 0x20, 0x28, 0x43, /* ining (C */
1699 0x42, 0x43, 0x29, 0x20, 0x69, 0x73, 0x20, 0x61, /* BC) is a */
1700 0x20, 0x63, 0x6F, 0x6D, 0x6D, 0x6F, 0x6E, 0x20, /* common */
1701 0x63, 0x68, 0x61, 0x69, 0x6E, 0x69, 0x6E, 0x67, /* chaining */
1702 0x20, 0x6D, 0x6F, 0x64, 0x65, 0x20, 0x69, 0x6E, /* mode in */
1703 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, /* which t */
1704 0x68, 0x65, 0x20, 0x70, 0x72, 0x65, 0x76, 0x69, /* he previ */
1705 0x6F, 0x75, 0x73, 0x20, 0x62, 0x6C, 0x6F, 0x63, /* ous bloc */
1706 0x6B, 0x27, 0x73, 0x20, 0x63, 0x69, 0x70, 0x68, /* k's ciph */
1707 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, 0x20, 0x69, /* ertext i */
1708 0x73, 0x20, 0x78, 0x6F, 0x72, 0x65, 0x64, 0x20, /* s xored */
1709 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, /* with the */
1710 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, /* current */
1711 0x20, 0x62, 0x6C, 0x6F, 0x63, 0x6B, 0x27, 0x73, /* block's */
1712 0x20, 0x70, 0x6C, 0x61, 0x69, 0x6E, 0x74, 0x65, /* plainte */
1713 0x78, 0x74, 0x20, 0x62, 0x65, 0x66, 0x6F, 0x72, /* xt befor */
1714 0x65, 0x20, 0x65, 0x6E, 0x63, 0x72, 0x79, 0x70, /* e encryp */
1715 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x2E, 0x2E, 0x2E, /* tion.... */
1716};
1717
1718static const uint8_t ciph_data_aes_cbc_vect1_ctx[] = {
1719 0xDD, 0x16, 0xC3, 0x47, 0x69, 0xEC, 0xF5, 0x86, /* ...Gi... */
1720 0x20, 0xB4, 0xF7, 0xE3, 0xB9, 0x36, 0xE8, 0xAC, /* ....6.. */
1721 0xC9, 0xA2, 0x11, 0x71, 0x3B, 0x10, 0x9D, 0x45, /* ...q;..E */
1722 0xCA, 0xE2, 0x49, 0xA6, 0x4E, 0x56, 0x07, 0xC5, /* ..I.NV.. */
1723 0xCE, 0xA3, 0x14, 0xB5, 0x30, 0x1B, 0x63, 0xBB, /* ....0.c. */
1724 0x2D, 0x6F, 0xE9, 0xCA, 0x0B, 0x00, 0x31, 0x3F, /* -o....1? */
1725 0xA4, 0x9A, 0x39, 0xE1, 0xC8, 0xD2, 0x24, 0x95, /* ..9...$. */
1726 0x14, 0xE9, 0xD2, 0x43, 0xE8, 0xA8, 0x1E, 0x0A, /* ...C.... */
1727 0xFE, 0x9D, 0x4F, 0xF5, 0xBB, 0x16, 0xB9, 0x54, /* ..O....T */
1728 0x78, 0x07, 0x94, 0x05, 0x8E, 0x47, 0xC3, 0xCB, /* x....G.. */
1729 0x7C, 0xEC, 0xF4, 0xF8, 0xF2, 0xA4, 0x59, 0x6E, /* |.....Yn */
1730 0xED, 0xAD, 0x7F, 0x62, 0xAF, 0x89, 0xA8, 0x5B, /* ...b...[ */
1731 0x75, 0xD4, 0x73, 0xE3, 0xBA, 0x9F, 0x9A, 0xD2, /* u.s..... */
1732 0x0F, 0xFD, 0x3C, 0xE6, 0xC6, 0xA4, 0xD6, 0x6C, /* ..<....l */
1733 0x6A, 0x09, 0xE2, 0x16, 0xB0, 0x8C, 0x69, 0x3C, /* j.....i< */
1734 0xC8, 0x1C, 0xE4, 0x3E, 0x86, 0x4D, 0xB0, 0x2B, /* ...>.M.+ */
1735 0x29, 0xA0, 0x5A, 0xA3, 0x67, 0xBA, 0xDC, 0x11, /* ).Z.g... */
1736 0x08, 0x5E, 0x69, 0xB4, 0x6F, 0xA5, 0xE2, 0xB8, /* .^i.o... */
1737 0xC9, 0x6E, 0x83, 0x7E, 0x35, 0xC8, 0xA7, 0xA0, /* .n.~5... */
1738 0x33, 0xA3, 0xB1, 0x4B, 0x5A, 0x92, 0x51, 0x2E, /* 3..KZ.Q. */
1739};
1740
1741/* AES-CTS test vectors from http://tools.ietf.org/html/rfc3962
1742 * and http://tools.ietf.org/html/draft-raeburn-krb-rijndael-krb-02 */
1743static const uint8_t ciph_data_aes_cts_vect1_key[] = {
1744 0x63, 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x20,
1745 0x74, 0x65, 0x72, 0x69, 0x79, 0x61, 0x6b, 0x69
1746};
1747
1748static const uint8_t ciph_data_aes_cts_vect1_iv[16] = {
1749 0x00
1750};
1751
1752static const uint8_t ciph_data_aes_cts_vect1_ptx[] = {
1753 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1754 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1755 0x20
1756};
1757
1758static const uint8_t ciph_data_aes_cts_vect1_ctx[] = {
1759 0xc6, 0x35, 0x35, 0x68, 0xf2, 0xbf, 0x8c, 0xb4,
1760 0xd8, 0xa5, 0x80, 0x36, 0x2d, 0xa7, 0xff, 0x7f,
1761 0x97
1762};
1763
1764#define ciph_data_aes_cts_vect2_key ciph_data_aes_cts_vect1_key
1765#define ciph_data_aes_cts_vect2_iv ciph_data_aes_cts_vect1_iv
1766static const uint8_t ciph_data_aes_cts_vect2_ptx[] = {
1767 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1768 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1769 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
1770 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20
1771};
1772
1773static const uint8_t ciph_data_aes_cts_vect2_ctx[] = {
1774 0xfc, 0x00, 0x78, 0x3e, 0x0e, 0xfd, 0xb2, 0xc1,
1775 0xd4, 0x45, 0xd4, 0xc8, 0xef, 0xf7, 0xed, 0x22,
1776 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
1777 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5
1778};
1779
1780#define ciph_data_aes_cts_vect3_key ciph_data_aes_cts_vect1_key
1781#define ciph_data_aes_cts_vect3_iv ciph_data_aes_cts_vect1_iv
1782static const uint8_t ciph_data_aes_cts_vect3_ptx[] = {
1783 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1784 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1785 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
1786 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43,
1787};
1788
1789static const uint8_t ciph_data_aes_cts_vect3_ctx[] = {
1790 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
1791 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8,
1792 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
1793 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
1794};
1795
1796#define ciph_data_aes_cts_vect4_key ciph_data_aes_cts_vect1_key
1797#define ciph_data_aes_cts_vect4_iv ciph_data_aes_cts_vect1_iv
1798static const uint8_t ciph_data_aes_cts_vect4_ptx[] = {
1799 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1800 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1801 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
1802 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43,
1803 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x2c, 0x20,
1804 0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2c,
1805};
1806
1807static const uint8_t ciph_data_aes_cts_vect4_ctx[] = {
1808 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
1809 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
1810 0xb3, 0xff, 0xfd, 0x94, 0x0c, 0x16, 0xa1, 0x8c,
1811 0x1b, 0x55, 0x49, 0xd2, 0xf8, 0x38, 0x02, 0x9e,
1812 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
1813 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5,
1814};
1815
1816#define ciph_data_aes_cts_vect5_key ciph_data_aes_cts_vect1_key
1817#define ciph_data_aes_cts_vect5_iv ciph_data_aes_cts_vect1_iv
1818static const uint8_t ciph_data_aes_cts_vect5_ptx[] = {
1819 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1820 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1821 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
1822 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43,
1823 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x2c, 0x20,
1824 0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2c, 0x20,
1825};
1826
1827static const uint8_t ciph_data_aes_cts_vect5_ctx[] = {
1828 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
1829 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
1830 0x9d, 0xad, 0x8b, 0xbb, 0x96, 0xc4, 0xcd, 0xc0,
1831 0x3b, 0xc1, 0x03, 0xe1, 0xa1, 0x94, 0xbb, 0xd8,
1832 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
1833 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8,
1834};
1835
1836#define ciph_data_aes_cts_vect6_key ciph_data_aes_cts_vect1_key
1837#define ciph_data_aes_cts_vect6_iv ciph_data_aes_cts_vect1_iv
1838static const uint8_t ciph_data_aes_cts_vect6_ptx[] = {
1839 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1840 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1841 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
1842 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43,
1843 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x2c, 0x20,
1844 0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2c, 0x20,
1845 0x61, 0x6e, 0x64, 0x20, 0x77, 0x6f, 0x6e, 0x74,
1846 0x6f, 0x6e, 0x20, 0x73, 0x6f, 0x75, 0x70, 0x2e,
1847};
1848
1849static const uint8_t ciph_data_aes_cts_vect6_ctx[] = {
1850 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
1851 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
1852 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
1853 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8,
1854 0x48, 0x07, 0xef, 0xe8, 0x36, 0xee, 0x89, 0xa5,
1855 0x26, 0x73, 0x0d, 0xbc, 0x2f, 0x7b, 0xc8, 0x40,
1856 0x9d, 0xad, 0x8b, 0xbb, 0x96, 0xc4, 0xcd, 0xc0,
1857 0x3b, 0xc1, 0x03, 0xe1, 0xa1, 0x94, 0xbb, 0xd8,
1858};
1859
Jerome Forissiered00e162017-01-20 09:22:52 +01001860/*
1861 * Test case for https://github.com/OP-TEE/optee_os/issues/1203
1862 * 80 bytes of data, processed in two steps (32 + 48).
1863 */
1864
1865#define ciph_data_aes_cts_issue1203_key ciph_data_aes_cts_vect1_key
1866
1867static const uint8_t ciph_data_aes_cts_issue1203_iv[] = {
1868 0x5b, 0x11, 0x7b, 0xf9, 0x83, 0x6a, 0x01, 0x27,
1869 0x1d, 0x2a, 0xae, 0x0a, 0xd3, 0x27, 0x35, 0x81,
1870};
1871
1872static const uint8_t ciph_data_aes_cts_issue1203_ptx[] = {
1873 0x33, 0x2a, 0xf4, 0x8c, 0x18, 0xa1, 0x30, 0x7c,
1874 0xa7, 0x52, 0x76, 0xca, 0xa6, 0x68, 0xad, 0xf6,
1875 0x1e, 0xba, 0xc9, 0x66, 0x66, 0x52, 0x1a, 0xe7,
1876 0x3e, 0xbc, 0xba, 0x60, 0x95, 0x71, 0x04, 0x5e,
1877 0xb4, 0xb7, 0x10, 0xd7, 0x93, 0x6d, 0x5f, 0x9a,
1878 0xb8, 0xbb, 0x6b, 0xb0, 0x6d, 0x47, 0x93, 0x41,
1879 0x29, 0x21, 0xf2, 0x84, 0xf5, 0xb2, 0xf2, 0x6d,
1880 0xbe, 0xe5, 0x8a, 0x2b, 0x58, 0x8d, 0x1b, 0x5e,
1881 0x41, 0x04, 0xba, 0x9e, 0x92, 0xe9, 0x52, 0xb6,
1882 0x8b, 0x1e, 0x36, 0x72, 0x91, 0xe4, 0x56, 0x66,
1883};
1884
1885/*
1886 * Ciphertext was generated by an online tool for AES CBC.
1887 * Since the input size is a multiple of the block size, and the ciphertext
1888 * format is CS3, the output is the same as plain AES CBC with the last
1889 * two blocks swapped.
1890 */
1891static const uint8_t ciph_data_aes_cts_issue1203_ctx[] = {
1892 0x6c, 0xfe, 0xef, 0x6a, 0x1c, 0x8f, 0xd3, 0xc3,
1893 0x66, 0xc4, 0xd9, 0x0e, 0xbe, 0x24, 0x17, 0x3f,
1894 0xcd, 0x19, 0xc9, 0xd2, 0x10, 0x3f, 0xcf, 0xdc,
1895 0xe9, 0x05, 0xab, 0xd5, 0x1a, 0x31, 0x41, 0x77,
1896 0x3b, 0xd7, 0x6a, 0x26, 0xae, 0x0d, 0xc9, 0x47,
1897 0x77, 0xd4, 0xa7, 0xd5, 0x73, 0x88, 0x9e, 0xde,
1898 0x72, 0x66, 0xe0, 0xe2, 0x3d, 0x62, 0x91, 0x22,
1899 0xae, 0x11, 0x01, 0x97, 0x22, 0x6a, 0x45, 0xa9,
1900 0xba, 0x56, 0xd2, 0xbc, 0x55, 0x2d, 0x99, 0x4d,
1901 0x3d, 0x22, 0x27, 0x9a, 0xac, 0x66, 0x2f, 0xf5,
1902};
1903
Pascal Brandc639ac82015-07-02 08:53:34 +02001904static const uint8_t ciph_data_des_ecb_nopad_out1[] = {
1905 0x46, 0x2B, 0x91, 0xA8, 0x55, 0xE6, 0x7E, 0x75, /* F+..U.~u */
1906 0x5E, 0x53, 0xF4, 0x8F, 0x29, 0x41, 0x4E, 0xEF, /* ^S..)AN. */
1907 0x32, 0x1B, 0x58, 0x42, 0x9B, 0xB4, 0x3A, 0x1F, /* 2.XB..:. */
1908 0x9A, 0xEA, 0xA4, 0xB4, 0xCD, 0xE9, 0x87, 0x7C, /* .......| */
1909 0xC0, 0x05, 0x34, 0xED, 0x86, 0x3C, 0x2A, 0x81, /* ..4..<.. */
1910 0x5E, 0x93, 0x0E, 0x86, 0xA9, 0xBB, 0x80, 0xFF, /* ^....... */
1911};
1912
1913static const uint8_t ciph_data_des_ecb_nopad_out2[] = {
1914 0x85, 0xE8, 0x13, 0x54, 0x0F, 0x0A, 0xB4, 0x05
1915};
1916
1917static const uint8_t ciph_data_des_cbc_nopad_out1[] = {
1918 0xAD, 0xD6, 0xD6, 0x3E, 0x88, 0xD0, 0xDD, 0xD4, /* ...>.... */
1919 0x9A, 0x93, 0x95, 0xA0, 0x86, 0x22, 0x5B, 0x9E, /* ....."[. */
1920 0x84, 0x0C, 0x6F, 0x12, 0x04, 0x11, 0x6F, 0xD4, /* ..o...o. */
1921 0x12, 0x29, 0xC6, 0x78, 0x0C, 0xFB, 0x58, 0x5B, /* .).x..X[ */
1922 0x66, 0x82, 0x0E, 0x52, 0xDC, 0x25, 0x16, 0x51, /* f..R.%.Q */
1923 0x69, 0xDF, 0xFE, 0x4E, 0x11, 0x1D, 0x9D, 0x08, /* i..N.... */
1924};
1925
1926static const uint8_t ciph_data_des3_ecb_nopad_out1[] = {
1927 0xA7, 0x46, 0xEC, 0xA8, 0x6A, 0x7F, 0x4A, 0xF1, /* .F..j.J. */
1928 0x44, 0x60, 0x37, 0x3B, 0x7F, 0x76, 0xE5, 0xFF, /* D`7;.v.. */
1929 0xC1, 0xE7, 0xA5, 0x04, 0x9C, 0x29, 0x5C, 0xA5, /* .....)\. */
1930 0xDD, 0xC8, 0xEE, 0x36, 0x1F, 0x48, 0xE0, 0xA9, /* ...6.H.. */
1931 0x82, 0x2D, 0x53, 0x84, 0x49, 0x69, 0x78, 0xFA, /* .-S.Iix. */
1932 0x23, 0x69, 0x1D, 0xF7, 0x08, 0x38, 0x44, 0x05, /* #i...8D. */
1933};
1934
1935static const uint8_t ciph_data_des3_cbc_nopad_out1[] = {
1936 0x18, 0x09, 0xEB, 0x98, 0xE4, 0x58, 0x72, 0x11, /* .....Xr. */
1937 0x30, 0x58, 0xAB, 0x38, 0xB0, 0xC9, 0x2B, 0xED, /* 0X.8..+. */
1938 0xDA, 0xC5, 0xE8, 0xA9, 0xF6, 0x8A, 0xA7, 0x80, /* ........ */
1939 0xBE, 0x54, 0x1F, 0x63, 0xF6, 0xEE, 0xA2, 0x4C, /* .T.c...L */
1940 0x7C, 0xEB, 0x84, 0x7D, 0xDA, 0xCA, 0x1E, 0xB2, /* |..}.... */
1941 0xED, 0x5E, 0x96, 0xB8, 0x01, 0x4B, 0x77, 0x02, /* .^...Kw. */
1942};
1943
1944static const uint8_t ciph_data_des2_ecb_nopad_out1[] = {
1945 0xAB, 0x12, 0xB6, 0xE2, 0x4A, 0x3A, 0x26, 0x14, /* ....J:&. */
1946 0xF0, 0x7D, 0x23, 0xD0, 0x55, 0xDF, 0x5C, 0x16, /* .}#.U.\. */
1947 0x43, 0x59, 0x1E, 0x44, 0x01, 0x76, 0xD7, 0x50, /* CY.D.v.P */
1948 0x44, 0xC0, 0x15, 0xDF, 0x2E, 0x7F, 0x8B, 0xC5, /* D....... */
1949 0xFF, 0x8B, 0x87, 0xFE, 0x33, 0xD7, 0xCB, 0x2C, /* ....3.., */
1950 0xDA, 0x79, 0x6F, 0xA4, 0x05, 0x2B, 0x30, 0xCE, /* .yo..+0. */
1951};
1952
1953static const uint8_t ciph_data_des2_cbc_nopad_out1[] = {
1954 0x47, 0x2F, 0xB1, 0x83, 0xC4, 0xBB, 0x93, 0x16, /* G/...... */
1955 0x73, 0xF9, 0xAD, 0x6F, 0x00, 0xF9, 0xCB, 0x4A, /* s..o...J */
1956 0x0F, 0x4F, 0x75, 0x75, 0xFB, 0x39, 0x0B, 0xFC, /* .Ouu.9.. */
1957 0x9F, 0x48, 0x52, 0xAD, 0xA2, 0x75, 0x2C, 0xF1, /* .HR..u, . */
1958 0x7D, 0xC3, 0x8F, 0x16, 0xCF, 0xC9, 0x76, 0x29, /* }.....v) */
1959 0x1A, 0xBF, 0xB3, 0xD9, 0x10, 0x7E, 0xAA, 0x49, /* .....~.I */
1960};
1961
Jerome Forissiere73e0fb2019-12-12 17:08:03 +01001962/* SM4 ECB */
1963
1964static const uint8_t ciph_data_sm4_key1[] = {
1965 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
1966 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
1967};
1968
1969static const uint8_t ciph_data_sm4_in1[] = {
1970 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
1971 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
1972};
1973
1974static const uint8_t ciph_data_sm4_ecb_nopad_out1[] = {
1975 0x68, 0x1e, 0xdf, 0x34, 0xd2, 0x06, 0x96, 0x5e,
1976 0x86, 0xb3, 0xe9, 0x4f, 0x53, 0x6e, 0x42, 0x46,
1977};
1978
1979/*
1980 * SM4 CBC
1981 * https://tools.ietf.org/html/draft-ribose-cfrg-sm4-10#appendix-A.2.2.1
1982 */
1983static const uint8_t ciph_data_sm4_cbc_a221_key[] = {
1984 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
1985 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
1986};
1987
1988static const uint8_t ciph_data_sm4_cbc_a221_iv[] = {
1989 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1990 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1991};
1992
1993static const uint8_t ciph_data_sm4_cbc_a221_in[] = {
1994 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb,
1995 0xcc, 0xcc, 0xcc, 0xcc, 0xdd, 0xdd, 0xdd, 0xdd,
1996 0xee, 0xee, 0xee, 0xee, 0xff, 0xff, 0xff, 0xff,
1997 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb,
1998};
1999
2000static const uint8_t ciph_data_sm4_cbc_a221_out[] = {
2001 0x78, 0xeb, 0xb1, 0x1c, 0xc4, 0x0b, 0x0a, 0x48,
2002 0x31, 0x2a, 0xae, 0xb2, 0x04, 0x02, 0x44, 0xcb,
2003 0x4c, 0xb7, 0x01, 0x69, 0x51, 0x90, 0x92, 0x26,
2004 0x97, 0x9b, 0x0d, 0x15, 0xdc, 0x6a, 0x8f, 0x6d,
2005};
2006
2007/*
2008 * SM4 CBC
2009 * https://tools.ietf.org/html/draft-ribose-cfrg-sm4-10#appendix-A.2.2.2
2010 */
2011static const uint8_t ciph_data_sm4_cbc_a222_key[] = {
2012 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
2013 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
2014};
2015
2016static const uint8_t ciph_data_sm4_cbc_a222_iv[] = {
2017 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2018 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
2019};
2020
2021static const uint8_t ciph_data_sm4_cbc_a222_in[] = {
2022 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb,
2023 0xcc, 0xcc, 0xcc, 0xcc, 0xdd, 0xdd, 0xdd, 0xdd,
2024 0xee, 0xee, 0xee, 0xee, 0xff, 0xff, 0xff, 0xff,
2025 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb,
2026};
2027
2028static const uint8_t ciph_data_sm4_cbc_a222_out[] = {
2029 0x0d, 0x3a, 0x6d, 0xdc, 0x2d, 0x21, 0xc6, 0x98,
2030 0x85, 0x72, 0x15, 0x58, 0x7b, 0x7b, 0xb5, 0x9a,
2031 0x91, 0xf2, 0xc1, 0x47, 0x91, 0x1a, 0x41, 0x44,
2032 0x66, 0x5e, 0x1f, 0xa1, 0xd4, 0x0b, 0xae, 0x38,
2033};
2034
2035/*
2036 * SM4 CTR
2037 * https://tools.ietf.org/html/draft-ribose-cfrg-sm4-10#appendix-A.2.5.1
2038 */
2039static const uint8_t ciph_data_sm4_ctr_a251_key[] = {
2040 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
2041 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
2042};
2043
2044static const uint8_t ciph_data_sm4_ctr_a251_iv[] = {
2045 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2046 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
2047};
2048
2049static const uint8_t ciph_data_sm4_ctr_a251_in[] = {
2050 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
2051 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
2052 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
2053 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
2054 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee,
2055 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2056 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
2057 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
2058};
2059
2060static const uint8_t ciph_data_sm4_ctr_a251_out[] = {
2061 0xac, 0x32, 0x36, 0xcb, 0x97, 0x0c, 0xc2, 0x07,
2062 0x91, 0x36, 0x4c, 0x39, 0x5a, 0x13, 0x42, 0xd1,
2063 0xa3, 0xcb, 0xc1, 0x87, 0x8c, 0x6f, 0x30, 0xcd,
2064 0x07, 0x4c, 0xce, 0x38, 0x5c, 0xdd, 0x70, 0xc7,
2065 0xf2, 0x34, 0xbc, 0x0e, 0x24, 0xc1, 0x19, 0x80,
2066 0xfd, 0x12, 0x86, 0x31, 0x0c, 0xe3, 0x7b, 0x92,
2067 0x6e, 0x02, 0xfc, 0xd0, 0xfa, 0xa0, 0xba, 0xf3,
2068 0x8b, 0x29, 0x33, 0x85, 0x1d, 0x82, 0x45, 0x14,
2069};
2070
2071/*
2072 * SM4 CTR
2073 * https://tools.ietf.org/html/draft-ribose-cfrg-sm4-10#appendix-A.2.5.2
2074 */
2075static const uint8_t ciph_data_sm4_ctr_a252_key[] = {
2076 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
2077 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
2078};
2079
2080static const uint8_t ciph_data_sm4_ctr_a252_iv[] = {
2081 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2082 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
2083};
2084
2085static const uint8_t ciph_data_sm4_ctr_a252_in[] = {
2086 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
2087 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
2088 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
2089 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
2090 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee,
2091 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2092 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
2093 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
2094};
2095
2096static const uint8_t ciph_data_sm4_ctr_a252_out[] = {
2097 0x5d, 0xcc, 0xcd, 0x25, 0xb9, 0x5a, 0xb0, 0x74,
2098 0x17, 0xa0, 0x85, 0x12, 0xee, 0x16, 0x0e, 0x2f,
2099 0x8f, 0x66, 0x15, 0x21, 0xcb, 0xba, 0xb4, 0x4c,
2100 0xc8, 0x71, 0x38, 0x44, 0x5b, 0xc2, 0x9e, 0x5c,
2101 0x0a, 0xe0, 0x29, 0x72, 0x05, 0xd6, 0x27, 0x04,
2102 0x17, 0x3b, 0x21, 0x23, 0x9b, 0x88, 0x7f, 0x6c,
2103 0x8c, 0xb5, 0xb8, 0x00, 0x91, 0x7a, 0x24, 0x88,
2104 0x28, 0x4b, 0xde, 0x9e, 0x16, 0xea, 0x29, 0x06,
2105};
2106
Pascal Brandc639ac82015-07-02 08:53:34 +02002107struct xtest_ciph_case {
2108 uint32_t algo;
2109 uint32_t mode;
2110 uint32_t key_type;
2111 const uint8_t *key1;
2112 size_t key1_len;
2113 const uint8_t *key2;
2114 size_t key2_len;
2115 const uint8_t *iv;
2116 size_t iv_len;
2117 size_t in_incr;
2118 const uint8_t *in;
2119 size_t in_len;
2120 const uint8_t *out;
2121 size_t out_len;
2122 size_t line;
2123};
2124
2125#define XTEST_CIPH_CASE_NO_IV(algo, key_type, key, in_incr, ptx, ctx) \
2126 { (algo), TEE_MODE_ENCRYPT, (key_type), (key), ARRAY_SIZE(key), \
2127 NULL, 0, NULL, 0, \
2128 (in_incr), (ptx), ARRAY_SIZE(ptx), (ctx), ARRAY_SIZE(ctx), \
2129 __LINE__ }, \
2130 { (algo), TEE_MODE_DECRYPT, (key_type), (key), ARRAY_SIZE(key), \
2131 NULL, 0, NULL, 0, \
2132 (in_incr), (ctx), ARRAY_SIZE(ctx), (ptx), ARRAY_SIZE(ptx), __LINE__ }
2133
2134#define XTEST_CIPH_CASE(algo, key_type, key, iv, in_incr, ptx, ctx) \
2135 { (algo), TEE_MODE_ENCRYPT, (key_type), (key), ARRAY_SIZE(key), \
2136 NULL, 0, iv, ARRAY_SIZE(iv), (in_incr), (ptx), ARRAY_SIZE(ptx), \
2137 (ctx), ARRAY_SIZE(ctx), __LINE__ }, \
2138 { (algo), TEE_MODE_DECRYPT, (key_type), (key), ARRAY_SIZE(key), \
2139 NULL, 0, iv, ARRAY_SIZE(iv), (in_incr), (ctx), ARRAY_SIZE(ctx), \
2140 (ptx), ARRAY_SIZE(ptx), __LINE__ }
2141
2142#define XTEST_CIPH_CASE_AES_XTS(vect, in_incr) \
2143 { TEE_ALG_AES_XTS, TEE_MODE_ENCRYPT, TEE_TYPE_AES, \
2144 ciph_data_aes_xts_ ## vect ## _key1, \
2145 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _key1), \
2146 ciph_data_aes_xts_ ## vect ## _key2, \
2147 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _key2), \
2148 ciph_data_aes_xts_ ## vect ## _iv, \
2149 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _iv), \
2150 (in_incr), \
2151 ciph_data_aes_xts_ ## vect ## _ptx, \
2152 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _ptx), \
2153 ciph_data_aes_xts_ ## vect ## _ctx, \
2154 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _ctx), __LINE__ }, \
2155 { TEE_ALG_AES_XTS, TEE_MODE_DECRYPT, TEE_TYPE_AES, \
2156 ciph_data_aes_xts_ ## vect ## _key1, \
2157 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _key1), \
2158 ciph_data_aes_xts_ ## vect ## _key2, \
2159 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _key2), \
2160 ciph_data_aes_xts_ ## vect ## _iv, \
2161 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _iv), \
2162 (in_incr), \
2163 ciph_data_aes_xts_ ## vect ## _ctx, \
2164 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _ctx), \
2165 ciph_data_aes_xts_ ## vect ## _ptx, \
2166 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _ptx), __LINE__ }
2167
2168#define XTEST_CIPH_CASE_AES_CBC(vect, in_incr) \
2169 XTEST_CIPH_CASE(TEE_ALG_AES_CBC_NOPAD, TEE_TYPE_AES, \
2170 ciph_data_aes_cbc_ ## vect ## _key, \
2171 ciph_data_aes_cbc_ ## vect ## _iv, \
2172 (in_incr), ciph_data_aes_cbc_ ## vect ## _ptx, \
2173 ciph_data_aes_cbc_ ## vect ## _ctx)
2174
2175#define XTEST_CIPH_CASE_AES_CTS(vect, in_incr) \
2176 XTEST_CIPH_CASE(TEE_ALG_AES_CTS, TEE_TYPE_AES, \
2177 ciph_data_aes_cts_ ## vect ## _key, \
2178 ciph_data_aes_cts_ ## vect ## _iv, \
2179 (in_incr), ciph_data_aes_cts_ ## vect ## _ptx, \
2180 ciph_data_aes_cts_ ## vect ## _ctx)
2181
2182static const struct xtest_ciph_case ciph_cases[] = {
2183 /* AES */
2184 XTEST_CIPH_CASE_NO_IV(TEE_ALG_AES_ECB_NOPAD, TEE_TYPE_AES,
2185 ciph_data_aes_key1, 11, ciph_data_in1,
2186 ciph_data_aes_ecb_nopad_out1),
2187 XTEST_CIPH_CASE(TEE_ALG_AES_CBC_NOPAD, TEE_TYPE_AES,
2188 ciph_data_aes_key1, ciph_data_128_iv1, 11,
2189 ciph_data_in1,
2190 ciph_data_aes_cbc_nopad_out1),
2191 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
2192 ciph_data_aes_key1, ciph_data_128_iv1, 13,
2193 ciph_data_in1,
2194 ciph_data_aes_ctr_out1),
2195 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
2196 ciph_data_aes_key1, ciph_data_128_iv1, 13,
2197 ciph_data_in3,
2198 ciph_data_aes_ctr_out2),
Jens Wiklander692efd12018-01-19 09:52:00 +01002199 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
2200 ciph_data_aes_key1, ciph_data_128_iv1, 16,
2201 ciph_data_in3,
2202 ciph_data_aes_ctr_out2),
Jerome Forissier45218eb2018-04-11 13:03:26 +02002203 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
2204 ciph_data_aes_key1, ciph_data_128_iv1, 16,
2205 ciph_data_in4,
2206 ciph_data_aes_ctr_out4),
Jerome Forissier0780ad42018-06-05 15:02:37 +02002207 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
2208 ciph_data_aes_key2, ciph_data_128_iv2, 11,
2209 ciph_data_in5,
2210 ciph_data_aes_ctr_out5),
Pascal Brandc639ac82015-07-02 08:53:34 +02002211
2212 XTEST_CIPH_CASE_AES_CBC(vect1, 11),
Jerome Forissierfc1bbc32018-06-12 10:13:04 +02002213 XTEST_CIPH_CASE_AES_CBC(vect1, 64),
Pascal Brandc639ac82015-07-02 08:53:34 +02002214
2215 /* AES-CTS */
2216 XTEST_CIPH_CASE_AES_CTS(vect1, 13),
2217 XTEST_CIPH_CASE_AES_CTS(vect2, 14),
2218 XTEST_CIPH_CASE_AES_CTS(vect3, 11),
2219 XTEST_CIPH_CASE_AES_CTS(vect4, 9),
2220 XTEST_CIPH_CASE_AES_CTS(vect5, 7),
2221 XTEST_CIPH_CASE_AES_CTS(vect6, 17),
2222 XTEST_CIPH_CASE_AES_CTS(vect6, 0x20),
Jerome Forissiered00e162017-01-20 09:22:52 +01002223 XTEST_CIPH_CASE_AES_CTS(issue1203, 32),
Pascal Brandc639ac82015-07-02 08:53:34 +02002224
2225 /* DES */
2226 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES_ECB_NOPAD, TEE_TYPE_DES,
2227 ciph_data_des_key1, 14, ciph_data_in1,
2228 ciph_data_des_ecb_nopad_out1),
2229 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES_ECB_NOPAD, TEE_TYPE_DES,
2230 ciph_data_des_key2, 3, ciph_data_in2,
2231 ciph_data_des_ecb_nopad_out2),
2232 XTEST_CIPH_CASE(TEE_ALG_DES_CBC_NOPAD, TEE_TYPE_DES,
2233 ciph_data_des_key1, ciph_data_64_iv1, 15, ciph_data_in1,
2234 ciph_data_des_cbc_nopad_out1),
2235
2236 /* DES3 */
2237 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES3_ECB_NOPAD, TEE_TYPE_DES3,
2238 ciph_data_des3_key1, 11, ciph_data_in1,
2239 ciph_data_des3_ecb_nopad_out1),
2240 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES3_ECB_NOPAD, TEE_TYPE_DES3,
2241 ciph_data_des3_key2, 3, ciph_data_in2,
2242 ciph_data_des_ecb_nopad_out2),
2243 XTEST_CIPH_CASE(TEE_ALG_DES3_CBC_NOPAD, TEE_TYPE_DES3,
2244 ciph_data_des3_key1, ciph_data_64_iv1, 11,
2245 ciph_data_in1,
2246 ciph_data_des3_cbc_nopad_out1),
2247
2248 /* DES2 */
2249 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES3_ECB_NOPAD, TEE_TYPE_DES3,
2250 ciph_data_des2_key1, 11, ciph_data_in1,
2251 ciph_data_des2_ecb_nopad_out1),
2252 XTEST_CIPH_CASE(TEE_ALG_DES3_CBC_NOPAD, TEE_TYPE_DES3,
2253 ciph_data_des2_key1, ciph_data_64_iv1, 11,
2254 ciph_data_in1,
2255 ciph_data_des2_cbc_nopad_out1),
Pascal Brandc639ac82015-07-02 08:53:34 +02002256
Pascal Brandc639ac82015-07-02 08:53:34 +02002257 /* AES-XTS */
2258 XTEST_CIPH_CASE_AES_XTS(vect1, 3),
2259 XTEST_CIPH_CASE_AES_XTS(vect2, 6),
2260 XTEST_CIPH_CASE_AES_XTS(vect3, 7),
2261 XTEST_CIPH_CASE_AES_XTS(vect4, 8),
2262 XTEST_CIPH_CASE_AES_XTS(vect5, 9),
2263 XTEST_CIPH_CASE_AES_XTS(vect6, 13),
2264 XTEST_CIPH_CASE_AES_XTS(vect7, 1),
2265 XTEST_CIPH_CASE_AES_XTS(vect8, 3),
2266 XTEST_CIPH_CASE_AES_XTS(vect9, 2),
2267 XTEST_CIPH_CASE_AES_XTS(vect10, 5),
2268 XTEST_CIPH_CASE_AES_XTS(vect11, 6),
2269 XTEST_CIPH_CASE_AES_XTS(vect12, 7),
2270 XTEST_CIPH_CASE_AES_XTS(vect13, 3),
2271 XTEST_CIPH_CASE_AES_XTS(vect14, 2),
2272 XTEST_CIPH_CASE_AES_XTS(vect15, 0),
2273 XTEST_CIPH_CASE_AES_XTS(vect16, 9),
2274 XTEST_CIPH_CASE_AES_XTS(vect17, 6),
2275 XTEST_CIPH_CASE_AES_XTS(vect18, 8),
2276 XTEST_CIPH_CASE_AES_XTS(vect19, 23),
Jerome Forissiere73e0fb2019-12-12 17:08:03 +01002277
2278 /* SM4 */
2279 XTEST_CIPH_CASE_NO_IV(TEE_ALG_SM4_ECB_NOPAD, TEE_TYPE_SM4,
2280 ciph_data_sm4_key1, 11, ciph_data_sm4_in1,
2281 ciph_data_sm4_ecb_nopad_out1),
2282 XTEST_CIPH_CASE(TEE_ALG_SM4_CBC_NOPAD, TEE_TYPE_SM4,
2283 ciph_data_sm4_cbc_a221_key, ciph_data_sm4_cbc_a221_iv,
2284 11, ciph_data_sm4_cbc_a221_in,
2285 ciph_data_sm4_cbc_a221_out),
2286 XTEST_CIPH_CASE(TEE_ALG_SM4_CBC_NOPAD, TEE_TYPE_SM4,
2287 ciph_data_sm4_cbc_a222_key, ciph_data_sm4_cbc_a222_iv,
2288 11, ciph_data_sm4_cbc_a222_in,
2289 ciph_data_sm4_cbc_a222_out),
2290 XTEST_CIPH_CASE(TEE_ALG_SM4_CTR, TEE_TYPE_SM4,
2291 ciph_data_sm4_ctr_a251_key, ciph_data_sm4_ctr_a251_iv,
2292 11, ciph_data_sm4_ctr_a251_in,
2293 ciph_data_sm4_ctr_a251_out),
2294 XTEST_CIPH_CASE(TEE_ALG_SM4_CTR, TEE_TYPE_SM4,
2295 ciph_data_sm4_ctr_a252_key, ciph_data_sm4_ctr_a252_iv,
2296 11, ciph_data_sm4_ctr_a252_in,
2297 ciph_data_sm4_ctr_a252_out),
Pascal Brandc639ac82015-07-02 08:53:34 +02002298};
2299
Jerome Forissier23256842018-02-16 09:25:35 +01002300static void xtest_tee_test_4003(ADBG_Case_t *c)
Pascal Brandc639ac82015-07-02 08:53:34 +02002301{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002302 TEEC_Session session = { };
2303 TEE_OperationHandle op = TEE_HANDLE_NULL;
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002304 TEE_OperationHandle op2 = TEE_HANDLE_NULL;
Pascal Brandc639ac82015-07-02 08:53:34 +02002305 TEE_ObjectHandle key1_handle = TEE_HANDLE_NULL;
2306 TEE_ObjectHandle key2_handle = TEE_HANDLE_NULL;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002307 uint8_t out[2048] = { };
2308 size_t out_size = 0;
2309 size_t out_offs = 0;
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002310 size_t out_offs2 = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002311 uint32_t ret_orig = 0;
2312 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02002313
2314 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2315 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
2316 &ret_orig)))
2317 return;
2318
2319 for (n = 0; n < ARRAY_SIZE(ciph_cases); n++) {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002320 TEE_Attribute key_attr = { };
2321 size_t key_size = 0;
2322 size_t op_key_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02002323
Jerome Forissier817d99f2020-01-22 16:33:12 +01002324 switch (ciph_cases[n].algo) {
2325 case TEE_ALG_SM4_CTR:
2326 case TEE_ALG_SM4_CBC_NOPAD:
2327 case TEE_ALG_SM4_ECB_NOPAD:
2328 if (!ta_crypt_cmd_is_algo_supported(c, &session,
2329 ciph_cases[n].algo, TEE_CRYPTO_ELEMENT_NONE)) {
2330 Do_ADBG_Log("SM4 not supported: skip subcase");
2331 continue;
2332 }
2333 break;
2334 default:
2335 break;
2336 }
2337
Pascal Brandc639ac82015-07-02 08:53:34 +02002338 Do_ADBG_BeginSubCase(c, "Cipher case %d algo 0x%x line %d",
2339 (int)n, (unsigned int)ciph_cases[n].algo,
2340 (int)ciph_cases[n].line);
2341
2342 key_attr.attributeID = TEE_ATTR_SECRET_VALUE;
2343 key_attr.content.ref.buffer = (void *)ciph_cases[n].key1;
2344 key_attr.content.ref.length = ciph_cases[n].key1_len;
2345
2346 key_size = key_attr.content.ref.length * 8;
2347 if (ciph_cases[n].key_type == TEE_TYPE_DES ||
2348 ciph_cases[n].key_type == TEE_TYPE_DES3)
2349 /* Exclude parity in bit size of key */
2350 key_size -= key_size / 8;
2351
2352 op_key_size = key_size;
2353 if (ciph_cases[n].key2 != NULL)
2354 op_key_size *= 2;
2355
2356 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2357 ta_crypt_cmd_allocate_operation(c, &session, &op,
2358 ciph_cases[n].algo, ciph_cases[n].mode,
2359 op_key_size)))
2360 goto out;
2361
2362 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002363 ta_crypt_cmd_allocate_operation(c, &session, &op2,
2364 ciph_cases[n].algo, ciph_cases[n].mode,
2365 op_key_size)))
2366 goto out;
2367
2368 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc639ac82015-07-02 08:53:34 +02002369 ta_crypt_cmd_allocate_transient_object(c, &session,
2370 ciph_cases[n].key_type, key_size,
2371 &key1_handle)))
2372 goto out;
2373
2374 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2375 ta_crypt_cmd_populate_transient_object(c, &session,
2376 key1_handle, &key_attr, 1)))
2377 goto out;
2378
2379 if (ciph_cases[n].key2 != NULL) {
2380 key_attr.content.ref.buffer =
2381 (void *)ciph_cases[n].key2;
2382 key_attr.content.ref.length = ciph_cases[n].key2_len;
2383
2384 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2385 ta_crypt_cmd_allocate_transient_object(c,
2386 &session, ciph_cases[n].key_type,
2387 key_attr.content.ref.length * 8,
2388 &key2_handle)))
2389 goto out;
2390
2391 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2392 ta_crypt_cmd_populate_transient_object(c,
2393 &session, key2_handle, &key_attr, 1)))
2394 goto out;
2395
2396 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2397 ta_crypt_cmd_set_operation_key2(c, &session, op,
2398 key1_handle, key2_handle)))
2399 goto out;
2400 } else {
2401 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2402 ta_crypt_cmd_set_operation_key(c, &session, op,
2403 key1_handle)))
2404 goto out;
2405 }
2406
2407 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2408 ta_crypt_cmd_free_transient_object(c, &session,
2409 key1_handle)))
2410 goto out;
2411 key1_handle = TEE_HANDLE_NULL;
2412
2413 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2414 ta_crypt_cmd_free_transient_object(c, &session,
2415 key2_handle)))
2416 goto out;
2417 key2_handle = TEE_HANDLE_NULL;
2418
2419 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2420 ta_crypt_cmd_cipher_init(c, &session, op,
2421 ciph_cases[n].iv, ciph_cases[n].iv_len)))
2422 goto out;
2423
2424 out_offs = 0;
2425 out_size = sizeof(out);
2426 memset(out, 0, sizeof(out));
2427 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2428 ta_crypt_cmd_cipher_update(c, &session, op,
2429 ciph_cases[n].in, ciph_cases[n].in_incr, out,
2430 &out_size)))
2431 goto out;
2432
Jerome Forissierd2d94b42017-06-02 16:39:34 +02002433 if (ciph_cases[n].algo == TEE_ALG_AES_CTR)
2434 ADBG_EXPECT_COMPARE_UNSIGNED(c, out_size, ==,
2435 ciph_cases[n].in_incr);
2436
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002437 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2438 ta_crypt_cmd_copy_operation(c, &session, op2, op)))
2439 goto out;
2440
Pascal Brandc639ac82015-07-02 08:53:34 +02002441 out_offs += out_size;
2442 out_size = sizeof(out) - out_offs;
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002443 out_offs2 = out_offs;
Pascal Brandc639ac82015-07-02 08:53:34 +02002444
2445 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2446 ta_crypt_cmd_cipher_do_final(c, &session, op,
2447 ciph_cases[n].in + ciph_cases[n].in_incr,
2448 ciph_cases[n].in_len - ciph_cases[n].in_incr,
2449 out + out_offs,
2450 &out_size)))
2451 goto out;
2452
2453 out_offs += out_size;
2454
2455 (void)ADBG_EXPECT_BUFFER(c, ciph_cases[n].out,
2456 ciph_cases[n].out_len, out, out_offs);
2457
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002458 /* test on the copied op2 */
2459 out_size = sizeof(out) - out_offs2;
2460
2461 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2462 ta_crypt_cmd_cipher_do_final(c, &session, op2,
2463 ciph_cases[n].in + ciph_cases[n].in_incr,
2464 ciph_cases[n].in_len - ciph_cases[n].in_incr,
2465 out + out_offs2,
2466 &out_size)))
2467 goto out;
2468
2469 out_offs2 += out_size;
2470
2471 ADBG_EXPECT_BUFFER(c, ciph_cases[n].out, ciph_cases[n].out_len,
2472 out, out_offs2);
2473
Pascal Brandc639ac82015-07-02 08:53:34 +02002474 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2475 ta_crypt_cmd_free_operation(c, &session, op)))
2476 goto out;
2477
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002478 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2479 ta_crypt_cmd_free_operation(c, &session, op2)))
2480 goto out;
2481
Pascal Brandc639ac82015-07-02 08:53:34 +02002482 Do_ADBG_EndSubCase(c, NULL);
2483 }
2484out:
2485 TEEC_CloseSession(&session);
2486}
Jens Wiklander14f48872018-06-29 15:30:13 +02002487ADBG_CASE_DEFINE(regression, 4003, xtest_tee_test_4003,
2488 "Test TEE Internal API cipher operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02002489
Pascal Brandc639ac82015-07-02 08:53:34 +02002490static void xtest_tee_test_4004(ADBG_Case_t *c)
2491{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002492 TEEC_Session session = { };
2493 uint32_t ret_orig = 0;
2494 uint8_t buf1[45] = { };
2495 uint8_t buf2[45] = { };
2496 static const uint8_t zeros[45];
Pascal Brandc639ac82015-07-02 08:53:34 +02002497
2498 Do_ADBG_BeginSubCase(c, "TEE get random");
2499 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2500 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
2501 &ret_orig)))
2502 return;
2503
2504 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2505 ta_crypt_cmd_random_number_generate(c, &session, buf1,
2506 sizeof(buf1))))
2507 goto out;
2508
2509 (void)ADBG_EXPECT_COMPARE_SIGNED(c,
2510 0, !=, memcmp(buf1, zeros, sizeof(buf1)));
2511
2512 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2513 ta_crypt_cmd_random_number_generate(c, &session, buf2,
2514 sizeof(buf2))))
2515 goto out;
2516
2517 (void)ADBG_EXPECT_COMPARE_SIGNED(c,
2518 0, !=, memcmp(buf2, zeros, sizeof(buf2)));
2519
2520 (void)ADBG_EXPECT_COMPARE_SIGNED(c,
2521 0, !=, memcmp(buf2, buf1, sizeof(buf1)));
2522out:
2523 TEEC_CloseSession(&session);
2524 Do_ADBG_EndSubCase(c, "TEE get random");
2525}
Jens Wiklander14f48872018-06-29 15:30:13 +02002526ADBG_CASE_DEFINE(regression, 4004, xtest_tee_test_4004,
2527 "Test TEE Internal API get random");
Pascal Brandc639ac82015-07-02 08:53:34 +02002528
2529struct xtest_ae_case {
2530 uint32_t algo;
2531 uint32_t mode;
2532 uint32_t key_type;
2533 const uint8_t *key;
2534 size_t key_len;
2535 const uint8_t *nonce;
2536 size_t nonce_len;
2537 size_t aad_incr;
2538 const uint8_t *aad;
2539 size_t aad_len;
2540 size_t in_incr;
2541 const uint8_t *ptx;
2542 size_t ptx_len;
2543 const uint8_t *ctx;
2544 size_t ctx_len;
2545 const uint8_t *tag;
2546 size_t tag_len;
2547 size_t line;
Olivier Masse9d566212024-01-30 09:18:34 +01002548 uint32_t id;
Pascal Brandc639ac82015-07-02 08:53:34 +02002549};
2550
2551
2552#define ARRAY(a) a, ARRAY_SIZE(a)
2553#define NULL_ARRAY(a) NULL, 0
2554
2555#define XTEST_AE_CASE(algo, vect, aad_incr, in_incr, \
2556 aad_array, ptx_array, ctx_array) \
2557 { (algo), TEE_MODE_ENCRYPT, TEE_TYPE_AES, ARRAY(vect ## _key), \
2558 ARRAY(vect ## _nonce), (aad_incr), \
2559 aad_array(vect ## _aad), (in_incr), \
2560 ptx_array(vect ## _ptx), ctx_array(vect ## _ctx), \
2561 ARRAY(vect ## _tag), \
Olivier Masse9d566212024-01-30 09:18:34 +01002562 __LINE__, 0 }, \
Pascal Brandc639ac82015-07-02 08:53:34 +02002563 { (algo), TEE_MODE_DECRYPT, 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
2570#define XTEST_AE_CASE_AES_CCM(vect, aad_incr, in_incr) \
2571 XTEST_AE_CASE(TEE_ALG_AES_CCM, ae_data_aes_ccm_ ## vect, aad_incr, \
2572 in_incr, ARRAY, ARRAY, ARRAY)
2573
2574#define XTEST_AE_CASE_AES_GCM(vect, aad_incr, in_incr, \
2575 aad_array, ptx_array, ctx_array) \
2576 XTEST_AE_CASE(TEE_ALG_AES_GCM, ae_data_aes_gcm_ ## vect, aad_incr, \
2577 in_incr, aad_array, ptx_array, ctx_array)
2578
2579
2580
2581static const struct xtest_ae_case ae_cases[] = {
2582 XTEST_AE_CASE_AES_CCM(vect1, 3, 2),
2583 XTEST_AE_CASE_AES_CCM(vect2, 7, 13),
2584 XTEST_AE_CASE_AES_CCM(vect3, 5, 21),
2585
2586 XTEST_AE_CASE_AES_GCM(vect1, 0, 0, NULL_ARRAY, NULL_ARRAY, NULL_ARRAY),
2587 XTEST_AE_CASE_AES_GCM(vect2, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2588 XTEST_AE_CASE_AES_GCM(vect3, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
Jens Wiklander9fc63f52017-11-10 11:13:26 +01002589 XTEST_AE_CASE_AES_GCM(vect3, 0, 0x1F, NULL_ARRAY, ARRAY, ARRAY),
2590 XTEST_AE_CASE_AES_GCM(vect4, 5, 0x20, ARRAY, ARRAY, ARRAY),
Pascal Brandc639ac82015-07-02 08:53:34 +02002591 XTEST_AE_CASE_AES_GCM(vect5, 5, 9, ARRAY, ARRAY, ARRAY),
2592 XTEST_AE_CASE_AES_GCM(vect6, 5, 9, ARRAY, ARRAY, ARRAY),
2593 XTEST_AE_CASE_AES_GCM(vect7, 0, 0, NULL_ARRAY, NULL_ARRAY, NULL_ARRAY),
2594 XTEST_AE_CASE_AES_GCM(vect8, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2595 XTEST_AE_CASE_AES_GCM(vect9, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2596 XTEST_AE_CASE_AES_GCM(vect10, 5, 9, ARRAY, ARRAY, ARRAY),
2597 XTEST_AE_CASE_AES_GCM(vect11, 5, 9, ARRAY, ARRAY, ARRAY),
2598 XTEST_AE_CASE_AES_GCM(vect12, 5, 9, ARRAY, ARRAY, ARRAY),
2599 XTEST_AE_CASE_AES_GCM(vect13, 0, 0, NULL_ARRAY, NULL_ARRAY, NULL_ARRAY),
2600 XTEST_AE_CASE_AES_GCM(vect14, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2601 XTEST_AE_CASE_AES_GCM(vect15, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2602 XTEST_AE_CASE_AES_GCM(vect16, 5, 9, ARRAY, ARRAY, ARRAY),
2603 XTEST_AE_CASE_AES_GCM(vect17, 5, 9, ARRAY, ARRAY, ARRAY),
2604 XTEST_AE_CASE_AES_GCM(vect18, 5, 9, ARRAY, ARRAY, ARRAY),
Jens Wiklanderf6efe242017-11-06 13:16:43 +01002605#ifdef CFG_GCM_NIST_VECTORS
2606#include "gcmDecrypt128.h"
2607#include "gcmDecrypt192.h"
2608#include "gcmDecrypt256.h"
2609#include "gcmEncryptExtIV128.h"
2610#include "gcmEncryptExtIV192.h"
2611#include "gcmEncryptExtIV256.h"
2612#endif
Olivier Masse9d566212024-01-30 09:18:34 +01002613#include "aes_gcm_counter_overflow_test_encrypt.h"
2614#include "aes_gcm_counter_overflow_test_decrypt.h"
Pascal Brandc639ac82015-07-02 08:53:34 +02002615};
2616
2617static void xtest_tee_test_4005(ADBG_Case_t *c)
2618{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002619 TEEC_Session session = { };
2620 TEE_OperationHandle op = TEE_HANDLE_NULL;
Jens Wiklander7404c072020-12-15 08:06:32 +01002621 TEE_OperationHandle op2 = TEE_HANDLE_NULL;
Pascal Brandc639ac82015-07-02 08:53:34 +02002622 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002623 TEE_Attribute key_attr = { };
2624 uint8_t out[512] = { };
2625 size_t out_size = 0;
2626 size_t out_offs = 0;
Jens Wiklander7404c072020-12-15 08:06:32 +01002627 size_t out_offs2 = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002628 uint32_t ret_orig = 0;
2629 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02002630
2631 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2632 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
2633 &ret_orig)))
2634 return;
2635
2636 for (n = 0; n < ARRAY_SIZE(ae_cases); n++) {
Olivier Masse9d566212024-01-30 09:18:34 +01002637 if (ae_cases[n].id)
2638 Do_ADBG_BeginSubCase(c, "AE case %d algo 0x%x line %d id %d",
2639 (int)n, (unsigned int)ae_cases[n].algo,
2640 (int)ae_cases[n].line,
2641 (unsigned int)ae_cases[n].id);
2642 else
2643 Do_ADBG_BeginSubCase(c, "AE case %d algo 0x%x line %d",
2644 (int)n, (unsigned int)ae_cases[n].algo,
2645 (int)ae_cases[n].line);
Pascal Brandc639ac82015-07-02 08:53:34 +02002646
2647 key_attr.attributeID = TEE_ATTR_SECRET_VALUE;
2648 key_attr.content.ref.buffer = (void *)ae_cases[n].key;
2649 key_attr.content.ref.length = ae_cases[n].key_len;
2650
2651 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2652 ta_crypt_cmd_allocate_operation(c, &session, &op,
2653 ae_cases[n].algo, ae_cases[n].mode,
2654 key_attr.content.ref.length * 8)))
2655 goto out;
2656
2657 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jens Wiklander7404c072020-12-15 08:06:32 +01002658 ta_crypt_cmd_allocate_operation(c, &session, &op2,
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,
Pascal Brandc639ac82015-07-02 08:53:34 +02002664 ta_crypt_cmd_allocate_transient_object(c, &session,
2665 ae_cases[n].key_type,
2666 key_attr.content.ref.length * 8,
2667 &key_handle)))
2668 goto out;
2669
2670 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2671 ta_crypt_cmd_populate_transient_object(c, &session,
2672 key_handle, &key_attr, 1)))
2673 goto out;
2674
2675 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2676 ta_crypt_cmd_set_operation_key(c, &session, op,
2677 key_handle)))
2678 goto out;
2679
2680 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2681 ta_crypt_cmd_free_transient_object(c, &session,
2682 key_handle)))
2683 goto out;
2684 key_handle = TEE_HANDLE_NULL;
2685
2686 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2687 ta_crypt_cmd_ae_init(c, &session, op, ae_cases[n].nonce,
2688 ae_cases[n].nonce_len, ae_cases[n].tag_len,
2689 ae_cases[n].aad_len, ae_cases[n].ptx_len)))
2690 goto out;
2691
2692 if (ae_cases[n].aad != NULL) {
2693 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2694 ta_crypt_cmd_ae_update_aad(c, &session, op,
2695 ae_cases[n].aad, ae_cases[n].aad_incr)))
2696 goto out;
2697
2698 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2699 ta_crypt_cmd_ae_update_aad(c, &session, op,
2700 ae_cases[n].aad + ae_cases[n].aad_incr,
2701 ae_cases [n].aad_len -
2702 ae_cases[n].aad_incr)))
2703 goto out;
2704 }
2705
2706 out_offs = 0;
2707 out_size = sizeof(out);
2708 memset(out, 0, sizeof(out));
2709 if (ae_cases[n].mode == TEE_MODE_ENCRYPT) {
2710 if (ae_cases[n].ptx != NULL) {
2711 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2712 ta_crypt_cmd_ae_update(c, &session, op,
2713 ae_cases[n].ptx,
2714 ae_cases[n].in_incr, out,
2715 &out_size)))
2716 goto out;
2717 out_offs += out_size;
Jerome Forissierc13fafa2017-06-01 15:49:07 +02002718 if (ae_cases[n].algo == TEE_ALG_AES_GCM)
2719 ADBG_EXPECT_COMPARE_UNSIGNED(c,
2720 out_size, ==, ae_cases[n].in_incr);
Pascal Brandc639ac82015-07-02 08:53:34 +02002721 }
2722 } else {
2723 if (ae_cases[n].ctx != NULL) {
2724 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2725 ta_crypt_cmd_ae_update(c, &session, op,
2726 ae_cases[n].ctx,
2727 ae_cases[n].in_incr, out,
2728 &out_size)))
2729 goto out;
2730 out_offs += out_size;
Jerome Forissierc13fafa2017-06-01 15:49:07 +02002731 if (ae_cases[n].algo == TEE_ALG_AES_GCM)
2732 ADBG_EXPECT_COMPARE_UNSIGNED(c,
2733 out_size, ==, ae_cases[n].in_incr);
Pascal Brandc639ac82015-07-02 08:53:34 +02002734 }
2735 }
2736
Jens Wiklander7404c072020-12-15 08:06:32 +01002737 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2738 ta_crypt_cmd_copy_operation(c, &session, op2, op)))
2739 goto out;
2740
Pascal Brandc639ac82015-07-02 08:53:34 +02002741 out_size = sizeof(out) - out_offs;
Jens Wiklander7404c072020-12-15 08:06:32 +01002742 out_offs2 = out_offs;
Pascal Brandc639ac82015-07-02 08:53:34 +02002743 if (ae_cases[n].mode == TEE_MODE_ENCRYPT) {
2744 uint8_t out_tag[64];
2745 size_t out_tag_len = MIN(sizeof(out_tag),
2746 ae_cases[n].tag_len);
2747
2748 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2749 ta_crypt_cmd_ae_encrypt_final(c, &session, op,
2750 ae_cases[n].ptx + ae_cases[n].in_incr,
2751 ae_cases[n].ptx_len -
2752 ae_cases[n].in_incr,
2753 out + out_offs,
2754 &out_size, out_tag, &out_tag_len)))
2755 goto out;
2756
2757 (void)ADBG_EXPECT_BUFFER(c,
2758 ae_cases[n].tag, ae_cases[n].tag_len, out_tag,
2759 out_tag_len);
2760
2761 out_offs += out_size;
2762
2763 (void)ADBG_EXPECT_BUFFER(c, ae_cases[n].ctx,
2764 ae_cases[n].ctx_len, out, out_offs);
2765 } else {
2766 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2767 ta_crypt_cmd_ae_decrypt_final(c, &session, op,
2768 ae_cases[n].ctx + ae_cases[n].in_incr,
2769 ae_cases[n].ctx_len -
2770 ae_cases[n].in_incr,
2771 out + out_offs,
2772 &out_size, ae_cases[n].tag,
2773 ae_cases[n].tag_len)))
2774 goto out;
2775
2776 out_offs += out_size;
2777
2778 (void)ADBG_EXPECT_BUFFER(c, ae_cases[n].ptx,
2779 ae_cases[n].ptx_len, out, out_offs);
2780 }
2781
Jens Wiklander7404c072020-12-15 08:06:32 +01002782 /* test on the copied op2 */
2783 out_size = sizeof(out) - out_offs2;
2784 memset(out + out_offs2, 0, out_size);
2785 if (ae_cases[n].mode == TEE_MODE_ENCRYPT) {
2786 uint8_t out_tag[64] = { 0 };
2787 size_t out_tag_len = MIN(sizeof(out_tag),
2788 ae_cases[n].tag_len);
2789
2790 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2791 ta_crypt_cmd_ae_encrypt_final(c, &session, op2,
2792 ae_cases[n].ptx + ae_cases[n].in_incr,
2793 ae_cases[n].ptx_len -
2794 ae_cases[n].in_incr,
2795 out + out_offs2,
2796 &out_size, out_tag, &out_tag_len)))
2797 goto out;
2798
2799 ADBG_EXPECT_BUFFER(c, ae_cases[n].tag,
2800 ae_cases[n].tag_len, out_tag,
2801 out_tag_len);
2802
2803 out_offs2 += out_size;
2804
2805 (void)ADBG_EXPECT_BUFFER(c, ae_cases[n].ctx,
2806 ae_cases[n].ctx_len, out, out_offs2);
2807 } else {
2808 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2809 ta_crypt_cmd_ae_decrypt_final(c, &session, op2,
2810 ae_cases[n].ctx + ae_cases[n].in_incr,
2811 ae_cases[n].ctx_len -
2812 ae_cases[n].in_incr,
2813 out + out_offs2,
2814 &out_size, ae_cases[n].tag,
2815 ae_cases[n].tag_len)))
2816 goto out;
2817
2818 out_offs2 += out_size;
2819
2820 (void)ADBG_EXPECT_BUFFER(c, ae_cases[n].ptx,
2821 ae_cases[n].ptx_len, out, out_offs2);
2822 }
2823
Pascal Brandc639ac82015-07-02 08:53:34 +02002824 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2825 ta_crypt_cmd_free_operation(c, &session, op)))
2826 goto out;
2827
Jens Wiklander7404c072020-12-15 08:06:32 +01002828 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2829 ta_crypt_cmd_free_operation(c, &session, op2)))
2830 goto out;
2831
Pascal Brandc639ac82015-07-02 08:53:34 +02002832 Do_ADBG_EndSubCase(c, NULL);
2833 }
2834out:
2835 TEEC_CloseSession(&session);
2836}
Jens Wiklander14f48872018-06-29 15:30:13 +02002837ADBG_CASE_DEFINE(regression, 4005, xtest_tee_test_4005,
2838 "Test TEE Internal API Authenticated Encryption operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02002839
2840struct xtest_ac_case {
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002841 unsigned int level;
Pascal Brandc639ac82015-07-02 08:53:34 +02002842 uint32_t algo;
2843 TEE_OperationMode mode;
2844
2845 union {
2846 struct {
2847 const uint8_t *modulus;
2848 size_t modulus_len;
2849
2850 const uint8_t *pub_exp;
2851 size_t pub_exp_len;
2852
2853 const uint8_t *priv_exp;
2854 size_t priv_exp_len;
2855
2856 const uint8_t *prime1; /* q */
2857 size_t prime1_len;
2858 const uint8_t *prime2; /* p */
2859 size_t prime2_len;
2860 const uint8_t *exp1; /* dp */
2861 size_t exp1_len;
2862 const uint8_t *exp2; /* dq */
2863 size_t exp2_len;
2864 const uint8_t *coeff; /* iq */
2865 size_t coeff_len;
2866
2867 int salt_len;
2868 } rsa;
2869 struct {
2870 const uint8_t *prime;
2871 size_t prime_len;
2872 const uint8_t *sub_prime;
2873 size_t sub_prime_len;
2874 const uint8_t *base;
2875 size_t base_len;
2876 const uint8_t *pub_val;
2877 size_t pub_val_len;
2878 const uint8_t *priv_val;
2879 size_t priv_val_len;
2880 } dsa;
Pascal Brand3e143ee2015-07-15 17:17:16 +02002881 struct {
2882 const uint8_t *private;
2883 size_t private_len;
2884 const uint8_t *public_x;
2885 size_t public_x_len;
2886 const uint8_t *public_y;
2887 size_t public_y_len;
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01002888 } ecc;
Valerii Chubarab9863c2022-08-12 07:42:29 +00002889 struct {
2890 const uint8_t *private;
2891 size_t private_len;
2892 const uint8_t *public;
2893 size_t public_len;
2894 const uint8_t flag;
2895 const uint8_t *context;
2896 size_t context_len;
2897 } eddsa;
Pascal Brandc639ac82015-07-02 08:53:34 +02002898 } params;
2899
2900 const uint8_t *ptx;
2901 size_t ptx_len;
2902 const uint8_t *ctx;
2903 size_t ctx_len;
2904 size_t line;
2905};
2906
2907#define WITHOUT_SALT(x) -1
2908#define WITH_SALT(x) x
2909
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002910#define XTEST_AC_CASE(level, algo, mode, vect, union_params) \
2911 { level, (algo), (mode), .params = union_params, \
Pascal Brandc639ac82015-07-02 08:53:34 +02002912 ARRAY(vect ## _ptx), \
2913 ARRAY(vect ## _out), \
2914 __LINE__ }
2915
2916#define XTEST_AC_RSA_UNION(vect, opt_crt_array, opt_salt) \
2917 { .rsa = { \
2918 ARRAY(vect ## _modulus), \
2919 ARRAY(vect ## _pub_exp), \
2920 ARRAY(vect ## _priv_exp), \
2921 opt_crt_array(vect ## _prime1), \
2922 opt_crt_array(vect ## _prime2), \
2923 opt_crt_array(vect ## _exp1), \
2924 opt_crt_array(vect ## _exp2), \
2925 opt_crt_array(vect ## _coeff), \
2926 opt_salt(vect ## _salt_len) \
2927 } }
2928
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002929#define XTEST_AC_RSA_CASE(level, algo, mode, vect, opt_crt_array, opt_salt) \
2930 XTEST_AC_CASE(level, algo, mode, vect, \
Pascal Brandc639ac82015-07-02 08:53:34 +02002931 XTEST_AC_RSA_UNION(vect, opt_crt_array, opt_salt))
2932
2933#define XTEST_AC_DSA_UNION(vect) \
2934 { .dsa = { \
2935 ARRAY(vect ## _prime), \
2936 ARRAY(vect ## _sub_prime), \
2937 ARRAY(vect ## _base), \
2938 ARRAY(vect ## _pub_val), \
2939 ARRAY(vect ## _priv_val), \
2940 } }
2941
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002942#define XTEST_AC_DSA_CASE(level, algo, mode, vect) \
2943 XTEST_AC_CASE(level, algo, mode, vect, XTEST_AC_DSA_UNION(vect))
Pascal Brandc639ac82015-07-02 08:53:34 +02002944
Pascal Brand3e143ee2015-07-15 17:17:16 +02002945#define XTEST_AC_ECDSA_UNION(vect) \
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01002946 { .ecc = { \
Pascal Brand3e143ee2015-07-15 17:17:16 +02002947 ARRAY(vect ## _private), \
2948 ARRAY(vect ## _public_x), \
2949 ARRAY(vect ## _public_y), \
2950 } }
2951
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01002952#define XTEST_AC_ECC_CASE(level, algo, mode, vect) \
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002953 XTEST_AC_CASE(level, algo, mode, vect, XTEST_AC_ECDSA_UNION(vect))
Pascal Brand3e143ee2015-07-15 17:17:16 +02002954
Valerii Chubarab9863c2022-08-12 07:42:29 +00002955#define XTEST_AC_EDDSA_UNION(vect, flag) \
2956 { .eddsa = { \
2957 ARRAY(vect ## _private), \
2958 ARRAY(vect ## _public), \
2959 flag, \
2960 } }
2961
2962#define XTEST_AC_EDDSA_CTX_UNION(vect, flag) \
2963 { .eddsa = { \
2964 ARRAY(vect ## _private), \
2965 ARRAY(vect ## _public), \
2966 flag, \
2967 ARRAY(vect ## _context), \
2968 } }
2969
2970#define XTEST_AC_EDDSA_CASE(level, algo, mode, vect, flag) \
2971 XTEST_AC_CASE(level, algo, mode, vect, XTEST_AC_EDDSA_UNION(vect, flag))
2972
2973#define XTEST_AC_EDDSA_CTX_CASE(level, algo, mode, vect, flag) \
2974 XTEST_AC_CASE(level, algo, mode, vect, XTEST_AC_EDDSA_CTX_UNION(vect, flag))
2975
Pascal Brandc639ac82015-07-02 08:53:34 +02002976static const struct xtest_ac_case xtest_ac_cases[] = {
2977 /* RSA test without crt parameters */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002978 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002979 ac_rsassa_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002980 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002981 ac_rsassa_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002982 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002983 ac_rsassa_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002984 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002985 ac_rsassa_vect2, NULL_ARRAY, WITHOUT_SALT),
Jerome Forissiere576f052018-03-23 21:24:21 +08002986 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
2987 ac_rsassa_vect18, NULL_ARRAY, WITHOUT_SALT),
2988 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
2989 ac_rsassa_vect18, NULL_ARRAY, WITHOUT_SALT),
Jerome Forissier0451e372018-03-27 00:10:23 +08002990 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
2991 ac_rsassa_vect19, NULL_ARRAY, WITHOUT_SALT),
2992 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
2993 ac_rsassa_vect19, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002994 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002995 ac_rsassa_vect3, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002996 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002997 ac_rsassa_vect3, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002998 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002999 ac_rsassa_vect4, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003000 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003001 ac_rsassa_vect4, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003002 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003003 ac_rsassa_vect5, 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_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003005 ac_rsassa_vect5, 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_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003007 ac_rsassa_vect6, 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_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003009 ac_rsassa_vect6, 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_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003011 ac_rsassa_vect7, 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_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003013 ac_rsassa_vect7, 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_SIGN,
3015 ac_rsassa_vect8, NULL_ARRAY, WITHOUT_SALT),
3016 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
3017 ac_rsassa_vect8, NULL_ARRAY, WITHOUT_SALT),
Pascal Brandc639ac82015-07-02 08:53:34 +02003018
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003019 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA224, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003020 ac_rsassa_vect16, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003021 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA224, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003022 ac_rsassa_vect16, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003023
Gabor Szekely2ad190f2018-09-14 14:05:06 +00003024#ifdef CFG_CRYPTO_RSASSA_NA1
3025 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5, TEE_MODE_SIGN,
3026 ac_rsassa_vect20, NULL_ARRAY, WITHOUT_SALT),
3027 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5, TEE_MODE_VERIFY,
3028 ac_rsassa_vect20, NULL_ARRAY, WITHOUT_SALT),
3029#endif
3030
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003031 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003032 ac_rsassa_vect9, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003033 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003034 ac_rsassa_vect9, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003035
3036 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003037 ac_rsassa_vect10, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003038 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003039 ac_rsassa_vect10, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003040
3041 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003042 ac_rsassa_vect11, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003043 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003044 ac_rsassa_vect11, NULL_ARRAY, WITHOUT_SALT),
3045
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003046 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1,
3047 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003048 ac_rsassa_vect12, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003049 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003050 ac_rsassa_vect12, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003051
3052 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
3053 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003054 ac_rsassa_vect17, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003055 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
3056 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003057 ac_rsassa_vect17, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003058
3059 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
3060 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003061 ac_rsassa_vect13, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003062 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
3063 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003064 ac_rsassa_vect13, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003065
3066 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
3067 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003068 ac_rsassa_vect14, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003069 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
3070 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003071 ac_rsassa_vect14, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003072
3073 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
3074 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003075 ac_rsassa_vect15, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003076 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
3077 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003078 ac_rsassa_vect15, NULL_ARRAY, WITH_SALT),
3079
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003080 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003081 ac_rsaes_pkcs1_v1_5_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003082 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003083 ac_rsaes_pkcs1_v1_5_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003084 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003085 ac_rsaes_pkcs1_v1_5_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003086 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003087 ac_rsaes_pkcs1_v1_5_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003088 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003089 ac_rsaes_pkcs1_v1_5_vect15, 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_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003091 ac_rsaes_pkcs1_v1_5_vect15, NULL_ARRAY, WITHOUT_SALT),
3092
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003093 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3094 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003095 ac_rsaes_oaep_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003096 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3097 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003098 ac_rsaes_oaep_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003099 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3100 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003101 ac_rsaes_oaep_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003102 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3103 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003104 ac_rsaes_oaep_vect2, 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_vect10, 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_vect10, NULL_ARRAY, WITHOUT_SALT),
Sami Tolvanenf3e46d42024-04-09 21:50:41 +00003111 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA256,
3112 TEE_MODE_DECRYPT,
3113 ac_rsaes_oaep_vect3, NULL_ARRAY, WITHOUT_SALT),
3114 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA256,
3115 TEE_MODE_ENCRYPT,
3116 ac_rsaes_oaep_vect3, NULL_ARRAY, WITHOUT_SALT),
Pascal Brandc639ac82015-07-02 08:53:34 +02003117
3118 /* RSA test with crt parameters */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003119 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003120 ac_rsassa_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003121 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003122 ac_rsassa_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003123 XTEST_AC_RSA_CASE(1, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003124 ac_rsassa_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003125 XTEST_AC_RSA_CASE(1, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003126 ac_rsassa_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003127 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003128 ac_rsassa_vect3, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003129 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003130 ac_rsassa_vect3, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003131 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003132 ac_rsassa_vect4, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003133 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003134 ac_rsassa_vect4, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003135 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003136 ac_rsassa_vect5, 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_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003138 ac_rsassa_vect5, 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_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003140 ac_rsassa_vect6, 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_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003142 ac_rsassa_vect6, 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_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003144 ac_rsassa_vect7, 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_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003146 ac_rsassa_vect7, 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_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003148 ac_rsassa_vect8, 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_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003150 ac_rsassa_vect8, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003151 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003152 ac_rsassa_vect9, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003153 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003154 ac_rsassa_vect9, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003155 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003156 ac_rsassa_vect10, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003157 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003158 ac_rsassa_vect10, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003159 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003160 ac_rsassa_vect11, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003161 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003162 ac_rsassa_vect11, ARRAY, WITHOUT_SALT),
3163
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003164 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1,
3165 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003166 ac_rsassa_vect12, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003167 XTEST_AC_RSA_CASE(1,TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003168 ac_rsassa_vect12, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003169 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
3170 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003171 ac_rsassa_vect17, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003172 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
3173 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003174 ac_rsassa_vect17, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003175 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
3176 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003177 ac_rsassa_vect13, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003178 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
3179 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003180 ac_rsassa_vect13, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003181 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
3182 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003183 ac_rsassa_vect14, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003184 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
3185 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003186 ac_rsassa_vect14, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003187 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
3188 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003189 ac_rsassa_vect15, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003190 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
3191 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003192 ac_rsassa_vect15, ARRAY, WITH_SALT),
3193
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003194 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003195 ac_rsaes_pkcs1_v1_5_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003196 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003197 ac_rsaes_pkcs1_v1_5_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003198 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003199 ac_rsaes_pkcs1_v1_5_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003200 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003201 ac_rsaes_pkcs1_v1_5_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003202 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003203 ac_rsaes_pkcs1_v1_5_vect15, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003204 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003205 ac_rsaes_pkcs1_v1_5_vect15, ARRAY, WITHOUT_SALT),
3206
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003207 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3208 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003209 ac_rsaes_oaep_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003210 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3211 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003212 ac_rsaes_oaep_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003213 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3214 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003215 ac_rsaes_oaep_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003216 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3217 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003218 ac_rsaes_oaep_vect2, 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_vect10, 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_vect10, ARRAY, WITHOUT_SALT),
Sami Tolvanenf3e46d42024-04-09 21:50:41 +00003225 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA256,
3226 TEE_MODE_DECRYPT,
3227 ac_rsaes_oaep_vect3, ARRAY, WITHOUT_SALT),
3228 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA256,
3229 TEE_MODE_ENCRYPT,
3230 ac_rsaes_oaep_vect3, ARRAY, WITHOUT_SALT),
Pascal Brandc639ac82015-07-02 08:53:34 +02003231
3232 /* DSA tests */
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003233 /* [mod = L=1024, N=160, SHA-1] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003234 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect1),
3235 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect1),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003236 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect2),
3237 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect2),
3238 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect3),
3239 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect3),
3240 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect4),
3241 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect4),
3242 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect5),
3243 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect5),
3244 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect6),
3245 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect6),
3246 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect7),
3247 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect7),
3248 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect8),
3249 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect8),
3250 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect9),
3251 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect9),
3252 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect10),
3253 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect10),
3254 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect11),
3255 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect11),
3256 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect12),
3257 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect12),
3258 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect13),
3259 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect13),
3260 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect14),
3261 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect14),
3262 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect15),
3263 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect15),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003264 /* [mod = L=1024, N=160, SHA-224] - GP NOT SUPPORTED */
3265 /* [mod = L=1024, N=160, SHA-256] - GP NOT SUPPORTED */
3266 /* [mod = L=1024, N=160, SHA-384] - GP NOT SUPPORTED */
3267 /* [mod = L=1024, N=160, SHA-512] - GP NOT SUPPORTED */
3268 /* [mod = L=2048, N=224, SHA-1] - GP NOT SUPPORTED */
3269 /* [mod = L=2048, N=224, SHA-224] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003270 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect91),
3271 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect91),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003272 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect92),
3273 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect92),
3274 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect93),
3275 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect93),
3276 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect94),
3277 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect94),
3278 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect95),
3279 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect95),
3280 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect96),
3281 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect96),
3282 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect97),
3283 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect97),
3284 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect98),
3285 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect98),
3286 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect99),
3287 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect99),
3288 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect100),
3289 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect100),
3290 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect101),
3291 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect101),
3292 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect102),
3293 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect102),
3294 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect103),
3295 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect103),
3296 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect104),
3297 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect104),
3298 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect105),
3299 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect105),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003300 /* [mod = L=2048, N=224, SHA-256] */
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003301 XTEST_AC_DSA_CASE(0, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect106),
3302 XTEST_AC_DSA_CASE(0, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect106),
3303 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect107),
3304 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect107),
3305 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect108),
3306 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect108),
3307 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect109),
3308 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect109),
3309 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect110),
3310 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect110),
3311 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect111),
3312 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect111),
3313 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect112),
3314 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect112),
3315 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect113),
3316 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect113),
3317 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect114),
3318 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect114),
3319 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect115),
3320 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect115),
3321 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect116),
3322 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect116),
3323 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect117),
3324 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect117),
3325 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect118),
3326 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect118),
3327 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect119),
3328 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect119),
3329 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect120),
3330 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect120),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003331 /* [mod = L=2048, N=224, SHA-384] - GP NOT SUPPORTED */
3332 /* [mod = L=2048, N=224, SHA-512] - GP NOT SUPPORTED */
3333 /* [mod = L=2048, N=256, SHA-1] - GP NOT SUPPORTED */
3334 /* [mod = L=2048, N=256, SHA-224] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003335 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect166),
3336 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect166),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003337 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect167),
3338 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect167),
3339 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect168),
3340 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect168),
3341 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect169),
3342 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect169),
3343 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect170),
3344 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect170),
3345 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect171),
3346 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect171),
3347 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect172),
3348 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect172),
3349 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect173),
3350 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect173),
3351 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect174),
3352 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect174),
3353 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect175),
3354 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect175),
3355 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect176),
3356 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect176),
3357 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect177),
3358 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect177),
3359 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect178),
3360 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect178),
3361 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect179),
3362 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect179),
3363 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect180),
3364 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect180),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003365 /* [mod = L=2048, N=256, SHA-256] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003366 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect181),
3367 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect181),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003368 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect182),
3369 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect182),
3370 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect183),
3371 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect183),
3372 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect184),
3373 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect184),
3374 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect185),
3375 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect185),
3376 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect186),
3377 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect186),
3378 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect187),
3379 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect187),
3380 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect188),
3381 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect188),
3382 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect189),
3383 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect189),
3384 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect190),
3385 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect190),
3386 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect191),
3387 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect191),
3388 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect192),
3389 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect192),
3390 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect193),
3391 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect193),
3392 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect194),
3393 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect194),
3394 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect195),
3395 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect195),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003396 /* [mod = L=2048, N=256, SHA-384] - GP NOT SUPPORTED */
3397 /* [mod = L=2048, N=256, SHA-512] - GP NOT SUPPORTED */
3398 /* [mod = L=3072, N=256, SHA-1] - GP NOT SUPPORTED */
3399 /* [mod = L=3072, N=256, SHA-224] - GP NOT SUPPORTED */
3400 /* [mod = L=3072, N=256, SHA-256] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003401 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect256),
3402 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect256),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003403 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect257),
3404 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect257),
3405 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect258),
3406 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect258),
3407 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect259),
3408 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect259),
3409 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect260),
3410 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect260),
3411 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect261),
3412 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect261),
3413 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect262),
3414 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect262),
3415 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect263),
3416 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect263),
3417 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect264),
3418 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect264),
3419 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect265),
3420 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect265),
3421 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect266),
3422 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect266),
3423 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect267),
3424 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect267),
3425 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect268),
3426 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect268),
3427 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect269),
3428 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect269),
3429 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect270),
3430 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect270),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003431 /* [mod = L=3072, N=256, SHA-384] - GP NOT SUPPORTED */
3432 /* [mod = L=3072, N=256, SHA-512] - GP NOT SUPPORTED */
Pascal Brand3e143ee2015-07-15 17:17:16 +02003433
3434 /* ECDSA tests */
Cedric Chaumontc7654962015-09-09 14:56:36 +02003435 /* [P-192] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003436 XTEST_AC_ECC_CASE(0, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3437 nist_186_2_ecdsa_testvector_1),
3438 XTEST_AC_ECC_CASE(0, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3439 nist_186_2_ecdsa_testvector_1),
3440 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3441 nist_186_2_ecdsa_testvector_2),
3442 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3443 nist_186_2_ecdsa_testvector_2),
3444 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3445 nist_186_2_ecdsa_testvector_3),
3446 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3447 nist_186_2_ecdsa_testvector_3),
3448 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3449 nist_186_2_ecdsa_testvector_4),
3450 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3451 nist_186_2_ecdsa_testvector_4),
3452 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3453 nist_186_2_ecdsa_testvector_5),
3454 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3455 nist_186_2_ecdsa_testvector_5),
3456 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3457 nist_186_2_ecdsa_testvector_6),
3458 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3459 nist_186_2_ecdsa_testvector_6),
3460 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3461 nist_186_2_ecdsa_testvector_7),
3462 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3463 nist_186_2_ecdsa_testvector_7),
3464 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3465 nist_186_2_ecdsa_testvector_8),
3466 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3467 nist_186_2_ecdsa_testvector_8),
3468 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3469 nist_186_2_ecdsa_testvector_9),
3470 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3471 nist_186_2_ecdsa_testvector_9),
3472 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3473 nist_186_2_ecdsa_testvector_10),
3474 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3475 nist_186_2_ecdsa_testvector_10),
3476 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3477 nist_186_2_ecdsa_testvector_11),
3478 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3479 nist_186_2_ecdsa_testvector_11),
3480 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3481 nist_186_2_ecdsa_testvector_12),
3482 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3483 nist_186_2_ecdsa_testvector_12),
3484 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3485 nist_186_2_ecdsa_testvector_13),
3486 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3487 nist_186_2_ecdsa_testvector_13),
3488 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3489 nist_186_2_ecdsa_testvector_14),
3490 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3491 nist_186_2_ecdsa_testvector_14),
3492 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3493 nist_186_2_ecdsa_testvector_15),
3494 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3495 nist_186_2_ecdsa_testvector_15),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003496 /* [P-224] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003497 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3498 nist_186_2_ecdsa_testvector_16),
3499 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3500 nist_186_2_ecdsa_testvector_16),
3501 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3502 nist_186_2_ecdsa_testvector_17),
3503 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3504 nist_186_2_ecdsa_testvector_17),
3505 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3506 nist_186_2_ecdsa_testvector_18),
3507 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3508 nist_186_2_ecdsa_testvector_18),
3509 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3510 nist_186_2_ecdsa_testvector_19),
3511 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3512 nist_186_2_ecdsa_testvector_19),
3513 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3514 nist_186_2_ecdsa_testvector_20),
3515 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3516 nist_186_2_ecdsa_testvector_20),
3517 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3518 nist_186_2_ecdsa_testvector_21),
3519 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3520 nist_186_2_ecdsa_testvector_21),
3521 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3522 nist_186_2_ecdsa_testvector_22),
3523 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3524 nist_186_2_ecdsa_testvector_22),
3525 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3526 nist_186_2_ecdsa_testvector_23),
3527 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3528 nist_186_2_ecdsa_testvector_23),
3529 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3530 nist_186_2_ecdsa_testvector_24),
3531 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3532 nist_186_2_ecdsa_testvector_24),
3533 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3534 nist_186_2_ecdsa_testvector_25),
3535 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3536 nist_186_2_ecdsa_testvector_25),
3537 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3538 nist_186_2_ecdsa_testvector_26),
3539 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3540 nist_186_2_ecdsa_testvector_26),
3541 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3542 nist_186_2_ecdsa_testvector_27),
3543 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3544 nist_186_2_ecdsa_testvector_27),
3545 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3546 nist_186_2_ecdsa_testvector_28),
3547 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3548 nist_186_2_ecdsa_testvector_28),
3549 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3550 nist_186_2_ecdsa_testvector_29),
3551 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3552 nist_186_2_ecdsa_testvector_29),
3553 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3554 nist_186_2_ecdsa_testvector_30),
3555 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3556 nist_186_2_ecdsa_testvector_30),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003557 /* [P-256] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003558 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3559 nist_186_2_ecdsa_testvector_31),
3560 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3561 nist_186_2_ecdsa_testvector_31),
3562 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3563 nist_186_2_ecdsa_testvector_32),
3564 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3565 nist_186_2_ecdsa_testvector_32),
3566 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3567 nist_186_2_ecdsa_testvector_33),
3568 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3569 nist_186_2_ecdsa_testvector_33),
3570 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3571 nist_186_2_ecdsa_testvector_34),
3572 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3573 nist_186_2_ecdsa_testvector_34),
3574 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3575 nist_186_2_ecdsa_testvector_35),
3576 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3577 nist_186_2_ecdsa_testvector_35),
3578 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3579 nist_186_2_ecdsa_testvector_36),
3580 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3581 nist_186_2_ecdsa_testvector_36),
3582 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3583 nist_186_2_ecdsa_testvector_37),
3584 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3585 nist_186_2_ecdsa_testvector_37),
3586 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3587 nist_186_2_ecdsa_testvector_38),
3588 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3589 nist_186_2_ecdsa_testvector_38),
3590 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3591 nist_186_2_ecdsa_testvector_39),
3592 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3593 nist_186_2_ecdsa_testvector_39),
3594 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3595 nist_186_2_ecdsa_testvector_40),
3596 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3597 nist_186_2_ecdsa_testvector_40),
3598 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3599 nist_186_2_ecdsa_testvector_41),
3600 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3601 nist_186_2_ecdsa_testvector_41),
3602 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3603 nist_186_2_ecdsa_testvector_42),
3604 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3605 nist_186_2_ecdsa_testvector_42),
3606 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3607 nist_186_2_ecdsa_testvector_43),
3608 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3609 nist_186_2_ecdsa_testvector_43),
3610 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3611 nist_186_2_ecdsa_testvector_44),
3612 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3613 nist_186_2_ecdsa_testvector_44),
3614 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3615 nist_186_2_ecdsa_testvector_45),
3616 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3617 nist_186_2_ecdsa_testvector_45),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003618 /* [P-384] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003619 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3620 nist_186_2_ecdsa_testvector_46),
3621 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3622 nist_186_2_ecdsa_testvector_46),
3623 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3624 nist_186_2_ecdsa_testvector_47),
3625 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3626 nist_186_2_ecdsa_testvector_47),
3627 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3628 nist_186_2_ecdsa_testvector_48),
3629 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3630 nist_186_2_ecdsa_testvector_48),
3631 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3632 nist_186_2_ecdsa_testvector_49),
3633 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3634 nist_186_2_ecdsa_testvector_49),
3635 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3636 nist_186_2_ecdsa_testvector_50),
3637 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3638 nist_186_2_ecdsa_testvector_50),
3639 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3640 nist_186_2_ecdsa_testvector_51),
3641 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3642 nist_186_2_ecdsa_testvector_51),
3643 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3644 nist_186_2_ecdsa_testvector_52),
3645 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3646 nist_186_2_ecdsa_testvector_52),
3647 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3648 nist_186_2_ecdsa_testvector_53),
3649 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3650 nist_186_2_ecdsa_testvector_53),
3651 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3652 nist_186_2_ecdsa_testvector_54),
3653 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3654 nist_186_2_ecdsa_testvector_54),
3655 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3656 nist_186_2_ecdsa_testvector_55),
3657 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3658 nist_186_2_ecdsa_testvector_55),
3659 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3660 nist_186_2_ecdsa_testvector_56),
3661 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3662 nist_186_2_ecdsa_testvector_56),
3663 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3664 nist_186_2_ecdsa_testvector_57),
3665 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3666 nist_186_2_ecdsa_testvector_57),
3667 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3668 nist_186_2_ecdsa_testvector_58),
3669 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3670 nist_186_2_ecdsa_testvector_58),
3671 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3672 nist_186_2_ecdsa_testvector_59),
3673 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3674 nist_186_2_ecdsa_testvector_59),
3675 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3676 nist_186_2_ecdsa_testvector_60),
3677 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3678 nist_186_2_ecdsa_testvector_60),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003679 /* [P-521] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003680 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3681 nist_186_2_ecdsa_testvector_61),
3682 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3683 nist_186_2_ecdsa_testvector_61),
3684 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3685 nist_186_2_ecdsa_testvector_62),
3686 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3687 nist_186_2_ecdsa_testvector_62),
3688 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3689 nist_186_2_ecdsa_testvector_63),
3690 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3691 nist_186_2_ecdsa_testvector_63),
3692 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3693 nist_186_2_ecdsa_testvector_64),
3694 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3695 nist_186_2_ecdsa_testvector_64),
3696 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3697 nist_186_2_ecdsa_testvector_65),
3698 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3699 nist_186_2_ecdsa_testvector_65),
3700 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3701 nist_186_2_ecdsa_testvector_66),
3702 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3703 nist_186_2_ecdsa_testvector_66),
3704 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3705 nist_186_2_ecdsa_testvector_67),
3706 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3707 nist_186_2_ecdsa_testvector_67),
3708 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3709 nist_186_2_ecdsa_testvector_68),
3710 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3711 nist_186_2_ecdsa_testvector_68),
3712 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3713 nist_186_2_ecdsa_testvector_69),
3714 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3715 nist_186_2_ecdsa_testvector_69),
3716 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3717 nist_186_2_ecdsa_testvector_70),
3718 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3719 nist_186_2_ecdsa_testvector_70),
3720 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3721 nist_186_2_ecdsa_testvector_71),
3722 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3723 nist_186_2_ecdsa_testvector_71),
3724 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3725 nist_186_2_ecdsa_testvector_72),
3726 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3727 nist_186_2_ecdsa_testvector_72),
3728 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3729 nist_186_2_ecdsa_testvector_73),
3730 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3731 nist_186_2_ecdsa_testvector_73),
3732 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3733 nist_186_2_ecdsa_testvector_74),
3734 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3735 nist_186_2_ecdsa_testvector_74),
3736 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3737 nist_186_2_ecdsa_testvector_75),
3738 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3739 nist_186_2_ecdsa_testvector_75),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003740 /* [K-163] - GP NOT SUPPORTED */
3741 /* [K-233] - GP NOT SUPPORTED */
3742 /* [K-283] - GP NOT SUPPORTED */
3743 /* [K-409] - GP NOT SUPPORTED */
3744 /* [K-571] - GP NOT SUPPORTED */
3745 /* [B-163] - GP NOT SUPPORTED */
3746 /* [B-233] - GP NOT SUPPORTED */
3747 /* [B-283] - GP NOT SUPPORTED */
3748 /* [B-409] - GP NOT SUPPORTED */
3749 /* [B-571] - GP NOT SUPPORTED */
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003750
3751 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_PKE, TEE_MODE_ENCRYPT,
3752 gmt_0003_part5_c2_sm2_testvector),
3753 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_PKE, TEE_MODE_DECRYPT,
3754 gmt_0003_part5_c2_sm2_testvector),
3755 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_PKE, TEE_MODE_ENCRYPT,
3756 sm2_testvector2),
Jerome Forissier849b57e2019-12-19 16:37:14 +01003757
3758 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_DSA_SM3, TEE_MODE_VERIFY,
3759 gmt_003_part5_a2),
3760 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_DSA_SM3, TEE_MODE_SIGN,
3761 gmt_003_part5_a2),
Pascal Brandc639ac82015-07-02 08:53:34 +02003762};
3763
Valerii Chubarab9863c2022-08-12 07:42:29 +00003764static const struct xtest_ac_case xtest_ac_eddsa_cases[] = {
3765
3766 XTEST_AC_EDDSA_CASE(0, TEE_ALG_ED25519, TEE_MODE_SIGN,
3767 ed25519_rfc_8032_7_1, 0),
3768 XTEST_AC_EDDSA_CASE(0, TEE_ALG_ED25519, TEE_MODE_VERIFY,
3769 ed25519_rfc_8032_7_1, 0),
3770
3771 XTEST_AC_EDDSA_CTX_CASE(0, TEE_ALG_ED25519, TEE_MODE_SIGN,
3772 ed25519ctx_rfc_8032_7_2, 0),
3773 XTEST_AC_EDDSA_CTX_CASE(0, TEE_ALG_ED25519, TEE_MODE_VERIFY,
3774 ed25519ctx_rfc_8032_7_2, 0),
3775
3776 XTEST_AC_EDDSA_CASE(0, TEE_ALG_ED25519, TEE_MODE_SIGN,
3777 ed25519ph_rfc_8032_7_3, 1),
3778 XTEST_AC_EDDSA_CASE(0, TEE_ALG_ED25519, TEE_MODE_VERIFY,
3779 ed25519ph_rfc_8032_7_3, 1),
3780};
3781
Pascal Brandc639ac82015-07-02 08:53:34 +02003782static bool create_key(ADBG_Case_t *c, TEEC_Session *s,
3783 uint32_t max_key_size, uint32_t key_type,
3784 TEE_Attribute *attrs, size_t num_attrs,
3785 TEE_ObjectHandle *handle)
3786{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003787 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02003788
3789 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3790 ta_crypt_cmd_allocate_transient_object(c, s, key_type,
3791 max_key_size, handle)))
3792 return false;
3793
3794 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3795 ta_crypt_cmd_populate_transient_object(c, s, *handle, attrs,
3796 num_attrs)))
3797 return false;
3798
3799 for (n = 0; n < num_attrs; n++) {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003800 uint8_t out[512] = { };
3801 size_t out_size = sizeof(out);
Pascal Brand3e143ee2015-07-15 17:17:16 +02003802
3803 if (attrs[n].attributeID == TEE_ATTR_ECC_CURVE)
3804 continue;
3805
Pascal Brandc639ac82015-07-02 08:53:34 +02003806 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3807 ta_crypt_cmd_get_object_buffer_attribute(c, s, *handle,
3808 attrs[n].attributeID, out, &out_size)))
3809 return false;
3810
Pascal Brand3e143ee2015-07-15 17:17:16 +02003811 if (out_size < attrs[n].content.ref.length) {
3812 memmove(out + (attrs[n].content.ref.length - out_size),
3813 out,
3814 attrs[n].content.ref.length);
3815 memset(out, 0, attrs[n].content.ref.length - out_size);
3816 out_size = attrs[n].content.ref.length;
3817 }
3818
Pascal Brandc639ac82015-07-02 08:53:34 +02003819 if (!ADBG_EXPECT_BUFFER(c, attrs[n].content.ref.buffer,
3820 attrs[n].content.ref.length, out, out_size))
3821 return false;
3822 }
3823
3824 return true;
3825}
3826
Jerome Forissier26393882022-03-09 21:22:30 +01003827#define XTEST_NO_CURVE 0xFFFFFFFF /* implementation-defined as per GP spec */
3828
Pascal Brandc639ac82015-07-02 08:53:34 +02003829static void xtest_tee_test_4006(ADBG_Case_t *c)
3830{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003831 TEEC_Session session = { };
Sami Tolvanenf3e46d42024-04-09 21:50:41 +00003832 TEEC_Result res = TEEC_ERROR_NOT_SUPPORTED;
Pascal Brandc639ac82015-07-02 08:53:34 +02003833 TEE_OperationHandle op = TEE_HANDLE_NULL;
3834 TEE_ObjectHandle priv_key_handle = TEE_HANDLE_NULL;
3835 TEE_ObjectHandle pub_key_handle = TEE_HANDLE_NULL;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003836 TEE_Attribute key_attrs[8] = { };
Jens Wiklander1f06b7d2022-12-02 21:49:57 +01003837 TEE_Attribute algo_params[2] = { };
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003838 size_t num_algo_params = 0;
3839 uint8_t out[512] = { };
3840 size_t out_size = 0;
3841 uint8_t out_enc[512] = { };
3842 size_t out_enc_size = 0;
3843 uint8_t ptx_hash[TEE_MAX_HASH_SIZE] = { };
Etienne Carriere481c6602019-01-22 13:27:26 +01003844 size_t ptx_hash_size = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003845 size_t max_key_size = 0;
3846 size_t num_key_attrs = 0;
3847 uint32_t ret_orig = 0;
3848 size_t n = 0;
3849 uint32_t curve = 0;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003850 uint32_t pub_key_type = 0;
3851 uint32_t priv_key_type = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003852 uint32_t hash_algo = 0;
Etienne Carrierea286b572023-06-28 14:30:19 +02003853 uint32_t sha1_algo_id = TEE_ALG_SHA1;
Pascal Brandc639ac82015-07-02 08:53:34 +02003854
3855 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3856 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
3857 &ret_orig)))
3858 return;
3859
3860 for (n = 0; n < ARRAY_SIZE(xtest_ac_cases); n++) {
3861 const struct xtest_ac_case *tv = xtest_ac_cases + n;
3862
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003863 if (tv->level > level)
3864 continue;
3865
Jerome Forissier4b03e282020-01-22 16:33:12 +01003866 if ((tv->algo == TEE_ALG_SM2_PKE ||
3867 tv->algo == TEE_ALG_SM2_DSA_SM3) &&
3868 !ta_crypt_cmd_is_algo_supported(c, &session, tv->algo,
3869 TEE_ECC_CURVE_SM2)) {
3870 Do_ADBG_Log("SM2 not supported: skip subcase");
3871 continue;
3872 }
3873
Pascal Brandc639ac82015-07-02 08:53:34 +02003874 Do_ADBG_BeginSubCase(c, "Asym Crypto case %d algo 0x%x line %d",
3875 (int)n, (unsigned int)tv->algo,
3876 (int)tv->line);
3877
3878 /*
3879 * When signing or verifying we're working with the hash of
3880 * the payload.
3881 */
3882 if (tv->mode == TEE_MODE_VERIFY || tv->mode == TEE_MODE_SIGN) {
Pascal Brand3e143ee2015-07-15 17:17:16 +02003883 if (TEE_ALG_GET_MAIN_ALG(tv->algo) == TEE_MAIN_ALGO_ECDSA)
3884 hash_algo = TEE_ALG_SHA1;
Gabor Szekely2ad190f2018-09-14 14:05:06 +00003885#if defined(CFG_CRYPTO_RSASSA_NA1)
3886 else if (tv->algo == TEE_ALG_RSASSA_PKCS1_V1_5)
3887 hash_algo = TEE_ALG_SHA256;
3888#endif
Pascal Brand3e143ee2015-07-15 17:17:16 +02003889 else
3890 hash_algo = TEE_ALG_HASH_ALGO(
3891 TEE_ALG_GET_DIGEST_HASH(tv->algo));
Pascal Brandc639ac82015-07-02 08:53:34 +02003892
3893 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3894 ta_crypt_cmd_allocate_operation(c, &session,
3895 &op, hash_algo, TEE_MODE_DIGEST, 0)))
3896 goto out;
3897
3898 ptx_hash_size = sizeof(ptx_hash);
3899 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3900 ta_crypt_cmd_digest_do_final(c, & session, op,
3901 tv->ptx, tv->ptx_len, ptx_hash,
3902 &ptx_hash_size)))
3903 goto out;
3904
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003905 /*
3906 * When we use DSA algorithms, the size of the hash we
3907 * consider equals the min between the size of the
3908 * "subprime" in the key and the size of the hash
3909 */
3910 if (TEE_ALG_GET_MAIN_ALG(tv->algo) ==
3911 TEE_MAIN_ALGO_DSA) {
3912 if (tv->params.dsa.sub_prime_len <=
3913 ptx_hash_size)
3914 ptx_hash_size =
3915 tv->params.dsa.sub_prime_len;
3916 }
3917
Pascal Brandc639ac82015-07-02 08:53:34 +02003918 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3919 ta_crypt_cmd_free_operation(c, &session, op)))
3920 goto out;
3921 }
3922
3923 num_algo_params = 0;
3924 num_key_attrs = 0;
3925 switch (TEE_ALG_GET_MAIN_ALG(tv->algo)) {
3926 case TEE_MAIN_ALGO_RSA:
3927 if (tv->params.rsa.salt_len > 0) {
3928 algo_params[0].attributeID =
3929 TEE_ATTR_RSA_PSS_SALT_LENGTH;
3930 algo_params[0].content.value.a =
3931 tv->params.rsa.salt_len;
3932 algo_params[0].content.value.b = 0;
3933 num_algo_params = 1;
3934 }
3935
3936 max_key_size = tv->params.rsa.modulus_len * 8;
3937
3938 xtest_add_attr(&num_key_attrs, key_attrs,
3939 TEE_ATTR_RSA_MODULUS,
3940 tv->params.rsa.modulus,
3941 tv->params.rsa.modulus_len);
3942 xtest_add_attr(&num_key_attrs, key_attrs,
3943 TEE_ATTR_RSA_PUBLIC_EXPONENT,
3944 tv->params.rsa.pub_exp,
3945 tv->params.rsa.pub_exp_len);
3946
3947 if (!ADBG_EXPECT_TRUE(c,
3948 create_key(c, &session,
3949 max_key_size,
3950 TEE_TYPE_RSA_PUBLIC_KEY,
3951 key_attrs,
3952 num_key_attrs,
3953 &pub_key_handle)))
3954 goto out;
3955
3956 xtest_add_attr(&num_key_attrs, key_attrs,
3957 TEE_ATTR_RSA_PRIVATE_EXPONENT,
3958 tv->params.rsa.priv_exp,
3959 tv->params.rsa.priv_exp_len);
3960
3961 if (tv->params.rsa.prime1_len != 0) {
3962 xtest_add_attr(&num_key_attrs, key_attrs,
3963 TEE_ATTR_RSA_PRIME1,
3964 tv->params.rsa.prime1,
3965 tv->params.rsa.prime1_len);
3966 }
3967
3968 if (tv->params.rsa.prime2_len != 0) {
3969 xtest_add_attr(&num_key_attrs, key_attrs,
3970 TEE_ATTR_RSA_PRIME2,
3971 tv->params.rsa.prime2,
3972 tv->params.rsa.prime2_len);
3973 }
3974
3975 if (tv->params.rsa.exp1_len != 0) {
3976 xtest_add_attr(&num_key_attrs, key_attrs,
3977 TEE_ATTR_RSA_EXPONENT1,
3978 tv->params.rsa.exp1,
3979 tv->params.rsa.exp1_len);
3980 }
3981
3982 if (tv->params.rsa.exp2_len != 0) {
3983 xtest_add_attr(&num_key_attrs, key_attrs,
3984 TEE_ATTR_RSA_EXPONENT2,
3985 tv->params.rsa.exp2,
3986 tv->params.rsa.exp2_len);
3987 }
3988
3989 if (tv->params.rsa.coeff_len != 0) {
3990 xtest_add_attr(&num_key_attrs, key_attrs,
3991 TEE_ATTR_RSA_COEFFICIENT,
3992 tv->params.rsa.coeff,
3993 tv->params.rsa.coeff_len);
3994 }
3995
3996 if (!ADBG_EXPECT_TRUE(c,
3997 create_key(c, &session,
3998 max_key_size,
3999 TEE_TYPE_RSA_KEYPAIR,
4000 key_attrs,
4001 num_key_attrs,
4002 &priv_key_handle)))
4003 goto out;
4004 break;
4005
4006 case TEE_MAIN_ALGO_DSA:
4007 max_key_size = tv->params.dsa.prime_len * 8;
4008
4009 xtest_add_attr(&num_key_attrs, key_attrs,
4010 TEE_ATTR_DSA_PRIME,
4011 tv->params.dsa.prime,
4012 tv->params.dsa.prime_len);
4013 xtest_add_attr(&num_key_attrs, key_attrs,
4014 TEE_ATTR_DSA_SUBPRIME,
4015 tv->params.dsa.sub_prime,
4016 tv->params.dsa.sub_prime_len);
4017 xtest_add_attr(&num_key_attrs, key_attrs,
4018 TEE_ATTR_DSA_BASE,
4019 tv->params.dsa.base,
4020 tv->params.dsa.base_len);
4021 xtest_add_attr(&num_key_attrs, key_attrs,
4022 TEE_ATTR_DSA_PUBLIC_VALUE,
4023 tv->params.dsa.pub_val,
4024 tv->params.dsa.pub_val_len);
4025
4026 if (!ADBG_EXPECT_TRUE(c,
4027 create_key(c, &session, max_key_size,
4028 TEE_TYPE_DSA_PUBLIC_KEY, key_attrs,
4029 num_key_attrs, &pub_key_handle)))
4030 goto out;
4031
4032 xtest_add_attr(&num_key_attrs, key_attrs,
4033 TEE_ATTR_DSA_PRIVATE_VALUE,
4034 tv->params.dsa.priv_val,
4035 tv->params.dsa.priv_val_len);
4036
4037 if (!ADBG_EXPECT_TRUE(c,
4038 create_key(c, &session, max_key_size,
4039 TEE_TYPE_DSA_KEYPAIR, key_attrs,
4040 num_key_attrs, &priv_key_handle)))
4041 goto out;
4042 break;
4043
Pascal Brand3e143ee2015-07-15 17:17:16 +02004044 case TEE_MAIN_ALGO_ECDSA:
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004045 case TEE_MAIN_ALGO_SM2_PKE:
Jerome Forissier849b57e2019-12-19 16:37:14 +01004046 case TEE_MAIN_ALGO_SM2_DSA_SM3:
Pascal Brand3e143ee2015-07-15 17:17:16 +02004047 switch (tv->algo) {
4048 case TEE_ALG_ECDSA_P192:
4049 curve = TEE_ECC_CURVE_NIST_P192;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004050 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
4051 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02004052 break;
4053 case TEE_ALG_ECDSA_P224:
4054 curve = TEE_ECC_CURVE_NIST_P224;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004055 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
4056 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02004057 break;
4058 case TEE_ALG_ECDSA_P256:
4059 curve = TEE_ECC_CURVE_NIST_P256;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004060 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
4061 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02004062 break;
4063 case TEE_ALG_ECDSA_P384:
4064 curve = TEE_ECC_CURVE_NIST_P384;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004065 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
4066 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02004067 break;
4068 case TEE_ALG_ECDSA_P521:
4069 curve = TEE_ECC_CURVE_NIST_P521;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004070 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
4071 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
4072 break;
4073 case TEE_ALG_SM2_PKE:
Jerome Forissier26393882022-03-09 21:22:30 +01004074 curve = XTEST_NO_CURVE;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004075 pub_key_type = TEE_TYPE_SM2_PKE_PUBLIC_KEY;
4076 priv_key_type = TEE_TYPE_SM2_PKE_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02004077 break;
Jerome Forissier849b57e2019-12-19 16:37:14 +01004078 case TEE_ALG_SM2_DSA_SM3:
Jerome Forissier26393882022-03-09 21:22:30 +01004079 curve = XTEST_NO_CURVE;
Jerome Forissier849b57e2019-12-19 16:37:14 +01004080 pub_key_type = TEE_TYPE_SM2_DSA_PUBLIC_KEY;
4081 priv_key_type = TEE_TYPE_SM2_DSA_KEYPAIR;
4082 break;
Pascal Brand3e143ee2015-07-15 17:17:16 +02004083 default:
4084 curve = 0xFF;
4085 break;
4086 }
4087
4088 if (tv->algo == TEE_ALG_ECDSA_P521)
4089 max_key_size = 521;
4090 else
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01004091 max_key_size = tv->params.ecc.private_len * 8;
Pascal Brand3e143ee2015-07-15 17:17:16 +02004092
Jerome Forissier26393882022-03-09 21:22:30 +01004093 if (curve != XTEST_NO_CURVE)
4094 xtest_add_attr_value(&num_key_attrs, key_attrs,
Pascal Brand3e143ee2015-07-15 17:17:16 +02004095 TEE_ATTR_ECC_CURVE, curve, 0);
4096 xtest_add_attr(&num_key_attrs, key_attrs,
4097 TEE_ATTR_ECC_PUBLIC_VALUE_X,
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01004098 tv->params.ecc.public_x,
4099 tv->params.ecc.public_x_len);
Pascal Brand3e143ee2015-07-15 17:17:16 +02004100 xtest_add_attr(&num_key_attrs, key_attrs,
4101 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01004102 tv->params.ecc.public_y,
4103 tv->params.ecc.public_y_len);
Pascal Brand3e143ee2015-07-15 17:17:16 +02004104
4105 if (!ADBG_EXPECT_TRUE(c,
4106 create_key(c, &session, max_key_size,
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004107 pub_key_type, key_attrs,
Pascal Brand3e143ee2015-07-15 17:17:16 +02004108 num_key_attrs, &pub_key_handle)))
4109 goto out;
4110
4111 xtest_add_attr(&num_key_attrs, key_attrs,
4112 TEE_ATTR_ECC_PRIVATE_VALUE,
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01004113 tv->params.ecc.private,
4114 tv->params.ecc.private_len);
Pascal Brand3e143ee2015-07-15 17:17:16 +02004115
4116 if (!ADBG_EXPECT_TRUE(c,
4117 create_key(c, &session, max_key_size,
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004118 priv_key_type, key_attrs,
Pascal Brand3e143ee2015-07-15 17:17:16 +02004119 num_key_attrs, &priv_key_handle)))
4120 goto out;
4121 break;
4122
Pascal Brandc639ac82015-07-02 08:53:34 +02004123 default:
4124 ADBG_EXPECT_TRUE(c, false);
4125 goto out;
4126 }
4127
4128 out_size = sizeof(out);
4129 memset(out, 0, sizeof(out));
4130 switch (tv->mode) {
4131 case TEE_MODE_ENCRYPT:
4132 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4133 ta_crypt_cmd_allocate_operation(c, &session,
Pascal Brand3e143ee2015-07-15 17:17:16 +02004134 &op, tv->algo, TEE_MODE_ENCRYPT,
4135 max_key_size)))
Pascal Brandc639ac82015-07-02 08:53:34 +02004136 goto out;
4137
4138 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4139 ta_crypt_cmd_set_operation_key(c, &session, op,
4140 pub_key_handle)))
4141 goto out;
4142
4143 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4144 ta_crypt_cmd_free_transient_object(c, &session,
4145 pub_key_handle)))
4146 goto out;
4147 pub_key_handle = TEE_HANDLE_NULL;
4148
Jens Wiklander1f06b7d2022-12-02 21:49:57 +01004149 num_algo_params = 0;
Sami Tolvanenf3e46d42024-04-09 21:50:41 +00004150 if (tv->algo == TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1 ||
4151 tv->algo == TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA256) {
Jens Wiklander1f06b7d2022-12-02 21:49:57 +01004152 algo_params[0].attributeID =
4153 TEE_ATTR_RSA_OAEP_MGF_HASH;
4154 algo_params[0].content.ref.length =
Etienne Carrierea286b572023-06-28 14:30:19 +02004155 sizeof(sha1_algo_id);
Jens Wiklander1f06b7d2022-12-02 21:49:57 +01004156 algo_params[0].content.ref.buffer =
Etienne Carrierea286b572023-06-28 14:30:19 +02004157 &sha1_algo_id;
Jens Wiklander1f06b7d2022-12-02 21:49:57 +01004158 num_algo_params = 1;
4159 }
4160
Pascal Brandc639ac82015-07-02 08:53:34 +02004161 out_enc_size = sizeof(out_enc);
Sami Tolvanenf3e46d42024-04-09 21:50:41 +00004162 res = ta_crypt_cmd_asymmetric_encrypt(c, &session, op,
Jens Wiklander1f06b7d2022-12-02 21:49:57 +01004163 algo_params, num_algo_params, tv->ptx,
Sami Tolvanenf3e46d42024-04-09 21:50:41 +00004164 tv->ptx_len, out_enc, &out_enc_size);
4165
4166 if (tv->algo == TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA256 &&
4167 res == TEEC_ERROR_NOT_SUPPORTED) {
4168 Do_ADBG_Log("RSA-OAEP with a different MGF1 hash not supported: skip subcase");
4169 break;
4170 }
4171
4172 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
Pascal Brandc639ac82015-07-02 08:53:34 +02004173 goto out;
4174
4175 /*
4176 * A PS which is random is added when formatting the
4177 * message internally of the algorithm so we can't
4178 * verify against precomputed values, instead we use the
4179 * decrypt operation to see that output is correct.
4180 */
4181
4182 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4183 ta_crypt_cmd_free_operation(c, &session, op)))
4184 goto out;
4185
4186 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4187 ta_crypt_cmd_allocate_operation(c, &session,
4188 &op, tv->algo, TEE_MODE_DECRYPT,
4189 max_key_size)))
4190 goto out;
4191
4192 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4193 ta_crypt_cmd_set_operation_key(c, &session, op,
4194 priv_key_handle)))
4195 goto out;
4196
4197 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4198 ta_crypt_cmd_free_transient_object(c, &session,
4199 priv_key_handle)))
4200 goto out;
4201
4202 priv_key_handle = TEE_HANDLE_NULL;
4203
4204 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4205 ta_crypt_cmd_asymmetric_decrypt(c, &session, op,
Sami Tolvanenf3e46d42024-04-09 21:50:41 +00004206 algo_params, num_algo_params, out_enc,
4207 out_enc_size, out, &out_size)))
Pascal Brandc639ac82015-07-02 08:53:34 +02004208 goto out;
4209
4210 (void)ADBG_EXPECT_BUFFER(c, tv->ptx, tv->ptx_len, out,
4211 out_size);
4212 break;
4213
4214 case TEE_MODE_DECRYPT:
4215 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4216 ta_crypt_cmd_allocate_operation(c, &session,
4217 &op, tv->algo, TEE_MODE_DECRYPT,
4218 max_key_size)))
4219 goto out;
4220
4221 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4222 ta_crypt_cmd_set_operation_key(c, &session, op,
4223 priv_key_handle)))
4224 goto out;
4225
4226 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4227 ta_crypt_cmd_free_transient_object(c, &session,
4228 priv_key_handle)))
4229 goto out;
4230
Sami Tolvanenf3e46d42024-04-09 21:50:41 +00004231 num_algo_params = 0;
4232 if (tv->algo == TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1 ||
4233 tv->algo == TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA256) {
4234 algo_params[0].attributeID =
4235 TEE_ATTR_RSA_OAEP_MGF_HASH;
4236 algo_params[0].content.ref.length =
4237 sizeof(sha1_algo_id);
4238 algo_params[0].content.ref.buffer =
4239 &sha1_algo_id;
4240 num_algo_params = 1;
4241 }
Pascal Brandc639ac82015-07-02 08:53:34 +02004242
Sami Tolvanenf3e46d42024-04-09 21:50:41 +00004243 priv_key_handle = TEE_HANDLE_NULL;
4244 res = ta_crypt_cmd_asymmetric_decrypt(c, &session, op,
4245 algo_params, num_algo_params, tv->ctx,
4246 tv->ctx_len, out, &out_size);
4247
4248 if (tv->algo == TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA256 &&
4249 res == TEEC_ERROR_NOT_SUPPORTED) {
4250 Do_ADBG_Log("RSA-OAEP with a different MGF1 hash not supported: skip subcase");
4251 break;
4252 }
4253
4254 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
Pascal Brandc639ac82015-07-02 08:53:34 +02004255 goto out;
4256
4257 (void)ADBG_EXPECT_BUFFER(c, tv->ptx, tv->ptx_len, out,
4258 out_size);
4259 break;
4260
4261 case TEE_MODE_VERIFY:
4262 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4263 ta_crypt_cmd_allocate_operation(c, &session,
4264 &op, tv->algo, TEE_MODE_VERIFY,
4265 max_key_size)))
4266 goto out;
4267
4268 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4269 ta_crypt_cmd_set_operation_key(c, &session, op,
4270 pub_key_handle)))
4271 goto out;
4272
4273 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4274 ta_crypt_cmd_free_transient_object(c, &session,
4275 pub_key_handle)))
4276 goto out;
4277
4278 pub_key_handle = TEE_HANDLE_NULL;
4279
4280 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4281 ta_crypt_cmd_asymmetric_verify(c, &session, op,
4282 algo_params, num_algo_params, ptx_hash,
4283 ptx_hash_size, tv->ctx, tv->ctx_len)))
4284 goto out;
4285 break;
4286
4287 case TEE_MODE_SIGN:
4288 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4289 ta_crypt_cmd_allocate_operation(c, &session,
4290 &op, tv->algo, TEE_MODE_SIGN,
4291 max_key_size)))
4292 goto out;
4293
4294 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4295 ta_crypt_cmd_set_operation_key(c, &session, op,
4296 priv_key_handle)))
4297 goto out;
4298
4299 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4300 ta_crypt_cmd_free_transient_object(c, &session,
4301 priv_key_handle)))
4302 goto out;
4303
4304 priv_key_handle = TEE_HANDLE_NULL;
4305
4306 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4307 ta_crypt_cmd_asymmetric_sign(c, &session, op,
4308 algo_params, num_algo_params, ptx_hash,
4309 ptx_hash_size, out, &out_size)))
4310 goto out;
4311
4312 if (TEE_ALG_GET_CHAIN_MODE(tv->algo) ==
4313 TEE_CHAIN_MODE_PKCS1_PSS_MGF1 ||
Pascal Brand3e143ee2015-07-15 17:17:16 +02004314 tv->algo == TEE_ALG_DSA_SHA1 ||
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02004315 tv->algo == TEE_ALG_DSA_SHA224 ||
4316 tv->algo == TEE_ALG_DSA_SHA256 ||
Pascal Brand3e143ee2015-07-15 17:17:16 +02004317 TEE_ALG_GET_MAIN_ALG(tv->algo) ==
Jerome Forissier849b57e2019-12-19 16:37:14 +01004318 TEE_MAIN_ALGO_ECDSA ||
4319 tv->algo == TEE_ALG_SM2_DSA_SM3) {
Pascal Brandc639ac82015-07-02 08:53:34 +02004320 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4321 ta_crypt_cmd_free_operation(c, &session,
4322 op)))
4323 goto out;
4324 /*
4325 * The salt or K is random so we can't verify
4326 * signing against precomputed values, instead
4327 * we use the verify operation to see that
4328 * output is correct.
4329 */
4330 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4331 ta_crypt_cmd_allocate_operation(c,
4332 &session, &op, tv->algo,
4333 TEE_MODE_VERIFY, max_key_size)))
4334 goto out;
4335
4336 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4337 ta_crypt_cmd_set_operation_key(c,
4338 &session, op, pub_key_handle)))
4339 goto out;
4340
4341 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4342 ta_crypt_cmd_free_transient_object(c,
4343 &session, pub_key_handle)))
4344 goto out;
4345
4346 pub_key_handle = TEE_HANDLE_NULL;
4347
4348 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4349 ta_crypt_cmd_asymmetric_verify(c,
4350 &session, op, algo_params,
4351 num_algo_params, ptx_hash,
4352 ptx_hash_size, out, out_size)))
4353 goto out;
4354 } else {
4355 (void)ADBG_EXPECT_BUFFER(c, tv->ctx,
4356 tv->ctx_len, out,
4357 out_size);
4358 }
4359 break;
4360
4361 default:
4362 break;
4363 }
4364
4365 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4366 ta_crypt_cmd_free_operation(c, &session, op)))
4367 goto out;
4368
4369 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4370 ta_crypt_cmd_free_transient_object(c, &session,
4371 pub_key_handle)))
4372 goto out;
4373 pub_key_handle = TEE_HANDLE_NULL;
4374
4375 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4376 ta_crypt_cmd_free_transient_object(c, &session,
4377 priv_key_handle)))
4378 goto out;
4379
4380 priv_key_handle = TEE_HANDLE_NULL;
4381
4382 Do_ADBG_EndSubCase(c, NULL);
4383 }
4384out:
4385 TEEC_CloseSession(&session);
4386}
Jens Wiklander14f48872018-06-29 15:30:13 +02004387ADBG_CASE_DEFINE(regression, 4006, xtest_tee_test_4006,
4388 "Test TEE Internal API Asymmetric Cipher operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02004389
4390#define KEY_ATTR(x, y) { #x, (x), y }
4391
4392struct key_attrs {
4393 const char *name;
4394 uint32_t attr;
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004395 /*
4396 * When keysize_check != 0: size of attribute is checked
4397 * Expected value is key_size bits except for DH in which case it is
4398 * the value of keysize_check.
4399 */
4400 uint32_t keysize_check;
Pascal Brandc639ac82015-07-02 08:53:34 +02004401};
4402
Clement Faure967368b2024-01-30 12:20:40 +01004403static bool is_caam_black_key(uint8_t *buf, size_t size)
4404{
4405 /*
4406 * This value is a magic number for the a CAAM Black key. This value
4407 * must match the value defined in optee-os
4408 * core/drivers/crypto/caam/caam_key.c
4409 */
4410 const uint8_t magic_number[4] = {0xFB, 0xBF, 0xAF, 0xCA};
4411
4412 if (size < sizeof(magic_number))
4413 return false;
4414
4415 return !memcmp(buf, magic_number, sizeof(magic_number));
4416}
4417
Pascal Brandc639ac82015-07-02 08:53:34 +02004418static bool test_keygen_attributes(ADBG_Case_t *c, TEEC_Session *s,
4419 TEE_ObjectHandle key, uint32_t key_size,
4420 struct key_attrs *attrs, size_t num_attrs)
4421{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004422 uint8_t out[2048] = { };
4423 size_t out_size = 0;
4424 size_t n = 0;
4425 size_t m = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004426
4427 for (m = 0; m < num_attrs; m++) {
4428 if ((attrs[m].attr & TEE_ATTR_BIT_VALUE) == 0) {
4429 out_size = sizeof(out);
4430 memset(out, 0, sizeof(out));
4431 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4432 ta_crypt_cmd_get_object_buffer_attribute(c, s,
4433 key, attrs[m].attr, out, &out_size)))
4434 return false;
4435
Clement Faure967368b2024-01-30 12:20:40 +01004436 /*
4437 * Check for CAAM black key header. If the buffer holds
4438 * a CAAM black key, do not check the key size as the
4439 * buffer size and the key size do not match.
4440 */
4441 if (attrs[m].keysize_check &&
4442 !is_caam_black_key(out, out_size))
Jerome Forissierfe94e562020-11-17 17:22:40 +01004443 ADBG_EXPECT_COMPARE_UNSIGNED(c, out_size, <=,
Pascal Brandc639ac82015-07-02 08:53:34 +02004444 key_size / 8);
4445
4446 if (out_size > 0) {
4447 /* Check that buffer isn't all zeroes */
4448 for (n = 0; n < out_size; n++)
4449 if (out[n] != 0)
4450 break;
4451 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, n, <,
4452 out_size))
4453 return false;
4454 }
4455 } else {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004456 uint32_t a = 0;
4457 uint32_t b = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004458
4459 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4460 ta_crypt_cmd_get_object_value_attribute(c, s, key,
4461 attrs[m].attr, &a, &b)))
4462 return false;
4463 }
4464 }
4465 return true;
4466}
4467
4468static bool test_secret_value(ADBG_Case_t *c, TEEC_Session *s,
4469 TEE_ObjectHandle key, uint32_t key_size)
4470{
4471 const struct key_attrs attrs[] = {
4472 KEY_ATTR(TEE_ATTR_SECRET_VALUE, true),
4473 };
4474
4475 return test_keygen_attributes(c, s, key, key_size,
4476 (struct key_attrs *)&attrs,
4477 ARRAY_SIZE(attrs));
4478}
4479
4480
4481static bool test_rsa_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4482 TEE_ObjectHandle key, uint32_t key_size)
4483{
4484 const struct key_attrs attrs[] = {
4485 KEY_ATTR(TEE_ATTR_RSA_MODULUS, true),
4486 KEY_ATTR(TEE_ATTR_RSA_PUBLIC_EXPONENT, false),
4487 KEY_ATTR(TEE_ATTR_RSA_PRIVATE_EXPONENT, false),
4488 KEY_ATTR(TEE_ATTR_RSA_PRIME1, false),
4489 KEY_ATTR(TEE_ATTR_RSA_PRIME2, false),
4490 KEY_ATTR(TEE_ATTR_RSA_EXPONENT1, false),
4491 KEY_ATTR(TEE_ATTR_RSA_EXPONENT2, false),
4492 KEY_ATTR(TEE_ATTR_RSA_COEFFICIENT, false),
4493 };
4494
4495 return test_keygen_attributes(c, s, key, key_size,
4496 (struct key_attrs *)&attrs,
4497 ARRAY_SIZE(attrs));
4498}
4499
Pascal Brande61133f2015-07-08 15:38:37 +02004500static bool test_ecc_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4501 TEE_ObjectHandle key, uint32_t key_size)
4502{
4503 const struct key_attrs attrs[] = {
4504 KEY_ATTR(TEE_ATTR_ECC_PRIVATE_VALUE, false),
4505 KEY_ATTR(TEE_ATTR_ECC_PUBLIC_VALUE_X , false),
4506 KEY_ATTR(TEE_ATTR_ECC_PUBLIC_VALUE_Y , false),
4507 /* KEY_ATTR(TEE_ATTR_ECC_CURVE, false), - do not test */
4508 };
4509
4510 return test_keygen_attributes(c, s, key, key_size,
4511 (struct key_attrs *)&attrs,
4512 ARRAY_SIZE(attrs));
4513}
4514
Pascal Brandc639ac82015-07-02 08:53:34 +02004515static bool test_dh_key_pair(ADBG_Case_t *c, TEEC_Session *s,
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004516 TEE_ObjectHandle key, uint32_t check_keysize)
Pascal Brandc639ac82015-07-02 08:53:34 +02004517{
4518 const struct key_attrs attrs[] = {
4519 KEY_ATTR(TEE_ATTR_DH_PRIME, false),
4520 KEY_ATTR(TEE_ATTR_DH_BASE, false),
4521 KEY_ATTR(TEE_ATTR_DH_PUBLIC_VALUE, false),
4522 KEY_ATTR(TEE_ATTR_DH_PRIVATE_VALUE, check_keysize),
4523 KEY_ATTR(TEE_ATTR_DH_X_BITS, false),
4524 };
4525
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004526 return test_keygen_attributes(c, s, key, check_keysize,
Pascal Brandc639ac82015-07-02 08:53:34 +02004527 (struct key_attrs *)&attrs,
4528 ARRAY_SIZE(attrs));
4529}
4530
4531static bool test_dsa_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4532 TEE_ObjectHandle key, uint32_t key_size)
4533{
4534 const struct key_attrs attrs[] = {
4535 KEY_ATTR(TEE_ATTR_DSA_PRIME, true),
4536 KEY_ATTR(TEE_ATTR_DSA_SUBPRIME, false),
4537 KEY_ATTR(TEE_ATTR_DSA_BASE, false),
4538 KEY_ATTR(TEE_ATTR_DSA_PUBLIC_VALUE, false),
4539 KEY_ATTR(TEE_ATTR_DSA_PRIVATE_VALUE, false),
4540 };
4541
4542 return test_keygen_attributes(c, s, key, key_size,
4543 (struct key_attrs *)&attrs,
4544 ARRAY_SIZE(attrs));
4545}
4546
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03004547static bool test_x25519_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4548 TEE_ObjectHandle key, uint32_t key_size)
4549{
4550 const struct key_attrs attrs[] = {
4551 KEY_ATTR(TEE_ATTR_X25519_PRIVATE_VALUE, false),
4552 KEY_ATTR(TEE_ATTR_X25519_PUBLIC_VALUE, false),
4553 };
4554
4555 return test_keygen_attributes(c, s, key, key_size,
4556 (struct key_attrs *)&attrs,
4557 ARRAY_SIZE(attrs));
4558}
4559
Valerii Chubarab9863c2022-08-12 07:42:29 +00004560static bool test_ed25519_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4561 TEE_ObjectHandle key, uint32_t key_size)
4562{
4563 const struct key_attrs attrs[] = {
4564 KEY_ATTR(TEE_ATTR_ED25519_PRIVATE_VALUE, false),
4565 KEY_ATTR(TEE_ATTR_ED25519_PUBLIC_VALUE, false),
4566 };
4567
4568 return test_keygen_attributes(c, s, key, key_size,
4569 (struct key_attrs *)&attrs,
4570 ARRAY_SIZE(attrs));
4571}
4572
Pascal Brandc639ac82015-07-02 08:53:34 +02004573static bool generate_and_test_key(ADBG_Case_t *c, TEEC_Session *s,
4574 uint32_t key_type, uint32_t check_keysize,
4575 uint32_t key_size,
4576 TEE_Attribute *params, size_t param_count)
4577{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004578 TEE_ObjectHandle key = TEE_HANDLE_NULL;
Pascal Brandc639ac82015-07-02 08:53:34 +02004579 bool ret_val = true;
4580
4581 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4582 ta_crypt_cmd_allocate_transient_object(c, s, key_type, key_size,
4583 &key)))
4584 return false;
4585
4586 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4587 ta_crypt_cmd_generate_key(c, s, key, key_size, params,
4588 param_count)))
4589 return false;
4590
4591 switch (key_type) {
4592 case TEE_TYPE_DES:
4593 case TEE_TYPE_DES3:
4594 ret_val = ADBG_EXPECT_TRUE(c,
4595 test_secret_value(c, s, key,
4596 key_size + key_size / 7));
4597 break;
4598 case TEE_TYPE_AES:
4599 case TEE_TYPE_HMAC_MD5:
4600 case TEE_TYPE_HMAC_SHA1:
4601 case TEE_TYPE_HMAC_SHA224:
4602 case TEE_TYPE_HMAC_SHA256:
4603 case TEE_TYPE_HMAC_SHA384:
4604 case TEE_TYPE_HMAC_SHA512:
4605 case TEE_TYPE_GENERIC_SECRET:
4606 ret_val = ADBG_EXPECT_TRUE(c,
4607 test_secret_value(c, s, key, key_size));
4608 break;
4609
4610 case TEE_TYPE_RSA_KEYPAIR:
4611 ret_val = ADBG_EXPECT_TRUE(c,
4612 test_rsa_key_pair(c, s, key, key_size));
4613 break;
4614
Pascal Brande61133f2015-07-08 15:38:37 +02004615 case TEE_TYPE_ECDSA_KEYPAIR:
4616 case TEE_TYPE_ECDH_KEYPAIR:
4617 ret_val = ADBG_EXPECT_TRUE(c,
4618 test_ecc_key_pair(c, s, key, key_size));
4619 break;
4620
Pascal Brandc639ac82015-07-02 08:53:34 +02004621 case TEE_TYPE_DH_KEYPAIR:
Pascal Brande61133f2015-07-08 15:38:37 +02004622 ret_val = ADBG_EXPECT_TRUE(c,
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004623 test_dh_key_pair(c, s, key, check_keysize));
Pascal Brandc639ac82015-07-02 08:53:34 +02004624 break;
4625
4626 case TEE_TYPE_DSA_KEYPAIR:
4627 ret_val = ADBG_EXPECT_TRUE(c,
4628 test_dsa_key_pair(c, s, key, key_size));
4629 break;
4630
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03004631 case TEE_TYPE_X25519_KEYPAIR:
4632 ret_val = ADBG_EXPECT_TRUE(c,
4633 test_x25519_key_pair(c, s, key, key_size));
4634 break;
4635
Valerii Chubarab9863c2022-08-12 07:42:29 +00004636 case TEE_TYPE_ED25519_KEYPAIR:
4637 ret_val = ADBG_EXPECT_TRUE(c,
4638 test_ed25519_key_pair(c, s, key, key_size));
4639 break;
4640
Pascal Brandc639ac82015-07-02 08:53:34 +02004641 default:
4642 ret_val = false;
4643 break;
4644 }
4645
4646 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4647 ta_crypt_cmd_free_transient_object(c, s, key)))
4648 return false;
4649
4650 return ret_val;
4651}
4652
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004653struct key_types_noparam {
4654 unsigned level;
4655 const char *name;
4656 uint32_t key_type;
4657 uint32_t quanta;
4658 uint32_t min_size;
4659 uint32_t max_size;
4660};
4661
4662static void keygen_noparams(ADBG_Case_t *c, TEEC_Session *session,
4663 const struct key_types_noparam *key_types,
4664 size_t num_key_types)
Pascal Brandc639ac82015-07-02 08:53:34 +02004665{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004666 size_t n = 0;
4667 uint32_t key_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004668
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004669 for (n = 0; n < num_key_types; n++) {
Pascal Brandc639ac82015-07-02 08:53:34 +02004670 uint32_t min_size = key_types[n].min_size;
4671 uint32_t max_size = key_types[n].max_size;
4672 uint32_t quanta = key_types[n].quanta;
4673
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004674 if (key_types[n].level > level)
4675 continue;
4676
Pascal Brandc639ac82015-07-02 08:53:34 +02004677 Do_ADBG_BeginSubCase(c, "Generate %s key", key_types[n].name);
4678
4679 for (key_size = min_size; key_size <= max_size;
4680 key_size += quanta) {
4681 if (!ADBG_EXPECT_TRUE(c,
4682 generate_and_test_key(c, session, key_types
4683 [n].key_type, 1, key_size, NULL, 0)))
4684 break;
4685 }
4686
4687 Do_ADBG_EndSubCase(c, "Generate %s key", key_types[n].name);
4688 }
4689}
4690
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004691static void xtest_tee_test_4007_symmetric(ADBG_Case_t *c)
Pascal Brandc639ac82015-07-02 08:53:34 +02004692{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004693 TEEC_Session session = { };
4694 uint32_t ret_orig = 0;
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004695 static const struct key_types_noparam key_types[] = {
4696 { 0, "AES", TEE_TYPE_AES, 64, 128,
4697 256 /* valid sizes 128, 192, 256 */ },
4698 { 0, "DES", TEE_TYPE_DES, 56, 56, 56 /* valid size 56 */ },
4699 { 0, "DES3", TEE_TYPE_DES3, 56, 112,
4700 168 /* valid sizes 112, 168 */ },
4701 { 0, "HMAC-MD5", TEE_TYPE_HMAC_MD5, 8, 64, 512 },
4702 { 0, "HMAC-SHA1", TEE_TYPE_HMAC_SHA1, 8, 80, 512 },
4703 { 0, "HMAC-SHA224", TEE_TYPE_HMAC_SHA224, 8, 112, 512 },
4704 { 0, "HMAC-SHA256", TEE_TYPE_HMAC_SHA256, 8, 192, 1024 },
4705 { 0, "HMAC-SHA384", TEE_TYPE_HMAC_SHA384, 8, 256, 1024 },
4706 { 0, "HMAC-SHA512", TEE_TYPE_HMAC_SHA512, 8, 256, 1024 },
4707 { 0, "Generic secret", TEE_TYPE_GENERIC_SECRET, 8, 128, 4096 },
4708 };
4709
4710 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4711 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4712 &ret_orig)))
4713 return;
4714
4715 keygen_noparams(c, &session, key_types, ARRAY_SIZE(key_types));
4716
4717 TEEC_CloseSession(&session);
4718}
4719ADBG_CASE_DEFINE(regression, 4007_symmetric, xtest_tee_test_4007_symmetric,
4720 "Test TEE Internal API Generate Symmetric key");
4721
4722static void xtest_tee_test_4007_rsa(ADBG_Case_t *c)
4723{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004724 TEEC_Session session = { };
4725 uint32_t ret_orig = 0;
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004726 static const struct key_types_noparam key_types[] = {
Jorge Ramirez-Ortizb657ea42022-02-17 10:15:25 +01004727#ifndef CFG_CRYPTO_SE05X
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004728 { 0, "RSA-256", TEE_TYPE_RSA_KEYPAIR, 1, 256, 256 },
4729 { 1, "RSA-384", TEE_TYPE_RSA_KEYPAIR, 1, 384, 384 },
Jorge Ramirez-Ortizb657ea42022-02-17 10:15:25 +01004730#endif
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004731 { 1, "RSA-512", TEE_TYPE_RSA_KEYPAIR, 1, 512, 512 },
Jorge Ramirez-Ortizb657ea42022-02-17 10:15:25 +01004732#ifndef CFG_CRYPTO_SE05X
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004733 { 1, "RSA-640", TEE_TYPE_RSA_KEYPAIR, 1, 640, 640 },
4734 { 1, "RSA-768", TEE_TYPE_RSA_KEYPAIR, 1, 768, 768 },
4735 { 1, "RSA-896", TEE_TYPE_RSA_KEYPAIR, 1, 896, 896 },
Jorge Ramirez-Ortizb657ea42022-02-17 10:15:25 +01004736#endif
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004737 { 1, "RSA-1024", TEE_TYPE_RSA_KEYPAIR, 1, 1024, 1024 },
4738 { 1, "RSA-2048", TEE_TYPE_RSA_KEYPAIR, 1, 2048, 2048 },
4739 { 1, "RSA-3072", TEE_TYPE_RSA_KEYPAIR, 1, 3072, 3072 },
4740 { 1, "RSA-4096", TEE_TYPE_RSA_KEYPAIR, 1, 4096, 4096 },
4741 };
4742
4743 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4744 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4745 &ret_orig)))
4746 return;
4747
4748 keygen_noparams(c, &session, key_types, ARRAY_SIZE(key_types));
4749
4750 TEEC_CloseSession(&session);
4751}
4752ADBG_CASE_DEFINE(regression, 4007_rsa, xtest_tee_test_4007_rsa,
4753 "Test TEE Internal API Generate RSA key");
4754
4755static void xtest_tee_test_4007_dh(ADBG_Case_t *c)
4756{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004757 TEEC_Session session = { };
4758 uint32_t ret_orig = 0;
4759 size_t n = 0;
4760 size_t param_count = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004761 /*
4762 * Note that the key size parameter is not used when creating the keys
4763 * but specifying these sizes make it possible to test the expected size
4764 * of the private value. This also means that the keysize must match the
4765 * size of p or what is specified in private_bits or the equvivalent
4766 * size of the subprime parameter.
4767 */
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004768 TEE_Attribute params[4] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02004769
4770#define XTEST_DH_GK_DATA(vect) \
4771 ARRAY(vect ## _p), \
4772 ARRAY(vect ## _g), \
4773 &vect ## _private_bits, \
4774 0, 0
4775#define XTEST_DH_GK_DATA_SUBPRIME(vect) \
4776 ARRAY(vect ## _p), \
4777 ARRAY(vect ## _g), \
4778 &vect ## _private_bits, \
4779 ARRAY(vect ## _subprime)
4780 static const struct {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004781 unsigned level;
Pascal Brandc639ac82015-07-02 08:53:34 +02004782 uint32_t key_size;
4783 const uint8_t *p;
4784 size_t p_len;
4785 const uint8_t *g;
4786 size_t g_len;
4787 const uint32_t *private_bits;
4788 const uint8_t *subprime;
4789 size_t subprime_len;
4790 } key_types[] = {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004791 { 0, 256, XTEST_DH_GK_DATA(keygen_dh256) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004792 { 0, 320, XTEST_DH_GK_DATA(keygen_dh320) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004793 { 1, 384, XTEST_DH_GK_DATA(keygen_dh384) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004794 { 1, 448, XTEST_DH_GK_DATA(keygen_dh448) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004795 { 1, 512, XTEST_DH_GK_DATA(keygen_dh512) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004796 { 1, 576, XTEST_DH_GK_DATA(keygen_dh576) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004797 { 1, 640, XTEST_DH_GK_DATA(keygen_dh640) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004798 { 1, 704, XTEST_DH_GK_DATA(keygen_dh704) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004799 { 1, 768, XTEST_DH_GK_DATA(keygen_dh768) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004800 { 1, 832, XTEST_DH_GK_DATA(keygen_dh832) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004801 { 1, 896, XTEST_DH_GK_DATA(keygen_dh896) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004802 { 1, 960, XTEST_DH_GK_DATA(keygen_dh960) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004803 { 1, 1024, XTEST_DH_GK_DATA(keygen_dh1024) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004804 { 1, 1088, XTEST_DH_GK_DATA(keygen_dh1088) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004805 { 1, 1152, XTEST_DH_GK_DATA(keygen_dh1152) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004806 { 1, 1216, XTEST_DH_GK_DATA(keygen_dh1216) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004807 { 1, 1280, XTEST_DH_GK_DATA(keygen_dh1280) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004808 { 1, 1344, XTEST_DH_GK_DATA(keygen_dh1344) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004809 { 1, 1408, XTEST_DH_GK_DATA(keygen_dh1408) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004810 { 1, 1472, XTEST_DH_GK_DATA(keygen_dh1472) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004811 { 1, 1536, XTEST_DH_GK_DATA(keygen_dh1536) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004812 { 1, 1600, XTEST_DH_GK_DATA(keygen_dh1600) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004813 { 1, 1664, XTEST_DH_GK_DATA(keygen_dh1664) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004814 { 1, 1728, XTEST_DH_GK_DATA(keygen_dh1728) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004815 { 1, 1792, XTEST_DH_GK_DATA(keygen_dh1792) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004816 { 1, 1856, XTEST_DH_GK_DATA(keygen_dh1856) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004817 { 1, 1920, XTEST_DH_GK_DATA(keygen_dh1920) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004818 { 1, 1984, XTEST_DH_GK_DATA(keygen_dh1984) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004819 { 1, 2048, XTEST_DH_GK_DATA(keygen_dh2048) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004820 { 1, 2048, XTEST_DH_GK_DATA_SUBPRIME(keygen_dh2048_subprime) }
Pascal Brandc639ac82015-07-02 08:53:34 +02004821 };
4822
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004823 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4824 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4825 &ret_orig)))
4826 return;
Pascal Brandc639ac82015-07-02 08:53:34 +02004827
4828 for (n = 0; n < ARRAY_SIZE(key_types); n++) {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004829 if (key_types[n].level > level)
4830 continue;
4831
Pascal Brandc639ac82015-07-02 08:53:34 +02004832 Do_ADBG_BeginSubCase(c,
4833 "Generate DH key %d bits - Private bits = %d",
4834 key_types[n].key_size,
4835 *key_types[n].private_bits);
4836 param_count = 0;
4837
4838 xtest_add_attr(&param_count, params,
4839 TEE_ATTR_DH_PRIME,
4840 key_types[n].p, key_types[n].p_len);
4841
4842 xtest_add_attr(&param_count, params, TEE_ATTR_DH_BASE,
4843 key_types[n].g, key_types[n].g_len);
4844
4845 if (key_types[n].private_bits != 0) {
4846 params[param_count].attributeID = TEE_ATTR_DH_X_BITS;
4847
4848 params[param_count].content.value.a =
4849 *key_types[n].private_bits;
4850
4851 params[param_count].content.value.b = 0;
4852 param_count++;
4853 }
4854
4855 if (key_types[n].subprime != 0) {
4856 xtest_add_attr(&param_count, params,
4857 TEE_ATTR_DH_SUBPRIME,
4858 key_types[n].subprime,
4859 key_types[n].subprime_len);
4860 }
4861
4862 if (!ADBG_EXPECT_TRUE(c,
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004863 generate_and_test_key(c, &session, TEE_TYPE_DH_KEYPAIR,
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004864 *key_types[n].private_bits,
Pascal Brandc639ac82015-07-02 08:53:34 +02004865 key_types[n]. key_size, params, param_count)))
4866 break;
4867
4868 Do_ADBG_EndSubCase(c,
4869 "Generate DH key %d bits - Private bits = %d",
4870 key_types[n].key_size,
4871 *key_types[n].private_bits);
4872 }
Pascal Brandc639ac82015-07-02 08:53:34 +02004873
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004874 TEEC_CloseSession(&session);
4875}
4876ADBG_CASE_DEFINE(regression, 4007_dh, xtest_tee_test_4007_dh,
4877 "Test TEE Internal API Generate DH key");
4878
4879static void xtest_tee_test_4007_dsa(ADBG_Case_t *c)
Pascal Brandc639ac82015-07-02 08:53:34 +02004880{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004881 TEEC_Session session = { };
4882 uint32_t ret_orig = 0;
4883 size_t n = 0;
4884 size_t param_count = 0;
4885 TEE_Attribute params[4] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02004886
4887#define XTEST_DSA_GK_DATA(vect) \
4888 ARRAY(vect ## _p), \
4889 ARRAY(vect ## _g), \
4890 ARRAY(vect ## _q)
4891 static const struct {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004892 unsigned level;
Pascal Brandc639ac82015-07-02 08:53:34 +02004893 uint32_t key_size;
4894 const uint8_t *prime;
4895 size_t prime_len;
4896 const uint8_t *base;
4897 size_t base_len;
4898 const uint8_t *sub_prime;
4899 size_t sub_prime_len;
4900 } key_types[] = {
Jerome Forissiereed7e652020-04-15 15:42:38 +02004901 { 0, 1024, XTEST_DSA_GK_DATA(keygen_dsa_test1) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004902 { 0, 512, XTEST_DSA_GK_DATA(keygen_dsa512) },
Jerome Forissiereed7e652020-04-15 15:42:38 +02004903 { 0, 576, XTEST_DSA_GK_DATA(keygen_dsa576) },
4904 { 0, 640, XTEST_DSA_GK_DATA(keygen_dsa640) },
4905 { 0, 704, XTEST_DSA_GK_DATA(keygen_dsa704) },
4906 { 0, 768, XTEST_DSA_GK_DATA(keygen_dsa768) },
4907 { 0, 832, XTEST_DSA_GK_DATA(keygen_dsa832) },
4908 { 0, 896, XTEST_DSA_GK_DATA(keygen_dsa896) },
4909 { 0, 960, XTEST_DSA_GK_DATA(keygen_dsa960) },
4910 { 0, 1024, XTEST_DSA_GK_DATA(keygen_dsa1024) },
Pascal Brandc639ac82015-07-02 08:53:34 +02004911 };
4912
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004913 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4914 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4915 &ret_orig)))
4916 return;
4917
Pascal Brandc639ac82015-07-02 08:53:34 +02004918 for (n = 0; n < ARRAY_SIZE(key_types); n++) {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004919 if (key_types[n].level > level)
4920 continue;
4921
Pascal Brandc639ac82015-07-02 08:53:34 +02004922 Do_ADBG_BeginSubCase(c, "Generate DSA key %d bits",
4923 key_types[n].key_size);
4924 param_count = 0;
4925
4926
4927 xtest_add_attr(&param_count, params, TEE_ATTR_DSA_PRIME,
4928 key_types[n].prime, key_types[n].prime_len);
4929
4930 xtest_add_attr(&param_count, params, TEE_ATTR_DSA_SUBPRIME,
4931 key_types[n].sub_prime,
4932 key_types[n].sub_prime_len);
4933
4934 xtest_add_attr(&param_count, params, TEE_ATTR_DSA_BASE,
4935 key_types[n].base, key_types[n].base_len);
4936
4937 if (!ADBG_EXPECT_TRUE(c,
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004938 generate_and_test_key(c, &session, TEE_TYPE_DSA_KEYPAIR,
Pascal Brandc639ac82015-07-02 08:53:34 +02004939 1, key_types[n]. key_size, params,
4940 param_count)))
4941 break;
4942
4943 Do_ADBG_EndSubCase(c, "Generate DSA key %d bits",
4944 key_types[n].key_size);
4945 }
Pascal Brandc639ac82015-07-02 08:53:34 +02004946
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004947 TEEC_CloseSession(&session);
4948}
4949ADBG_CASE_DEFINE(regression, 4007_dsa, xtest_tee_test_4007_dsa,
4950 "Test TEE Internal API Generate DSA key");
4951
4952static void xtest_tee_test_4007_ecc(ADBG_Case_t *c)
Pascal Brande61133f2015-07-08 15:38:37 +02004953{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004954 TEEC_Session session = { };
4955 uint32_t ret_orig = 0;
4956 size_t n = 0;
4957 size_t param_count = 0;
4958 TEE_Attribute params[4] = { };
Pascal Brande61133f2015-07-08 15:38:37 +02004959
4960 static const struct {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004961 unsigned level;
Pascal Brande61133f2015-07-08 15:38:37 +02004962 const char *name;
4963 uint32_t algo;
4964 uint32_t curve;
4965 uint32_t key_size;
4966 } key_types[] = {
4967 /* ECDSA */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004968 { 0, "ECDSA-192", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P192,
4969 192 },
4970 { 1, "ECDSA-224", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P224,
4971 224 },
4972 { 1, "ECDSA-256", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P256,
4973 256 },
4974 { 1, "ECDSA-384", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P384,
4975 384 },
4976 { 1, "ECDSA-521", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P521,
4977 521 },
Pascal Brande61133f2015-07-08 15:38:37 +02004978
4979 /* ECDH */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004980 { 0, "ECDH-192", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P192,
4981 192 },
4982 { 1, "ECDH-224", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P224,
4983 224 },
4984 { 1, "ECDH-256", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P256,
4985 256 },
4986 { 1, "ECDH-384", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P384,
4987 384 },
4988 { 1, "ECDH-521", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P521,
4989 521 },
Pascal Brande61133f2015-07-08 15:38:37 +02004990 };
4991
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004992 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4993 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4994 &ret_orig)))
4995 return;
4996
Pascal Brande61133f2015-07-08 15:38:37 +02004997 for (n = 0; n < ARRAY_SIZE(key_types); n++) {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004998 if (key_types[n].level > level)
4999 continue;
5000
Pascal Brande61133f2015-07-08 15:38:37 +02005001 Do_ADBG_BeginSubCase(c, "Generate %s", key_types[n].name);
5002 param_count = 0;
5003
5004 xtest_add_attr_value(&param_count, params, TEE_ATTR_ECC_CURVE,
5005 key_types[n].curve, 0);
5006
5007 if (!ADBG_EXPECT_TRUE(c,
Jens Wiklandera8c8f872018-12-14 11:41:36 +01005008 generate_and_test_key(c, &session, key_types[n].algo,
Pascal Brande61133f2015-07-08 15:38:37 +02005009 0, key_types[n].key_size, params,
5010 param_count)))
5011 break;
5012
5013 Do_ADBG_EndSubCase(c, "Generate %s", key_types[n].name);
5014 }
Pascal Brande61133f2015-07-08 15:38:37 +02005015
Pascal Brandc639ac82015-07-02 08:53:34 +02005016 TEEC_CloseSession(&session);
5017}
Jens Wiklandera8c8f872018-12-14 11:41:36 +01005018ADBG_CASE_DEFINE(regression, 4007_ecc, xtest_tee_test_4007_ecc,
5019 "Test TEE Internal API Generate ECC key");
Pascal Brandc639ac82015-07-02 08:53:34 +02005020
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03005021static void xtest_tee_test_4007_x25519(ADBG_Case_t *c)
5022{
5023 TEEC_Session session = { };
5024 uint32_t ret_orig = 0;
5025
5026 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5027 xtest_teec_open_session(&session, &crypt_user_ta_uuid,
5028 NULL, &ret_orig)))
5029 return;
5030
Jerome Forissier366179c2022-06-28 10:12:58 +02005031 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_X25519,
5032 TEE_ECC_CURVE_25519)) {
5033 Do_ADBG_Log("X25519 not supported: skip subcase");
5034 goto out;
5035 }
5036
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03005037 Do_ADBG_BeginSubCase(c, "Generate X25519 key");
5038
5039 if (!ADBG_EXPECT_TRUE(c,
5040 generate_and_test_key(c, &session,
5041 TEE_TYPE_X25519_KEYPAIR, 0, 256,
5042 NULL, 0)))
5043 return;
5044
5045 Do_ADBG_EndSubCase(c, "Generate X25519 key");
Jerome Forissier366179c2022-06-28 10:12:58 +02005046out:
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03005047 TEEC_CloseSession(&session);
5048}
5049ADBG_CASE_DEFINE(regression, 4007_x25519, xtest_tee_test_4007_x25519,
5050 "Test TEE Internal API Generate X25519 key");
5051
Valerii Chubarab9863c2022-08-12 07:42:29 +00005052
5053static void xtest_tee_test_4007_ed25519(ADBG_Case_t *c)
5054{
5055 TEEC_Session session = { };
5056 uint32_t ret_orig = 0;
5057
5058 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5059 xtest_teec_open_session(&session, &crypt_user_ta_uuid,
5060 NULL, &ret_orig)))
5061 return;
5062
5063 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_ED25519,
5064 TEE_ECC_CURVE_25519)) {
5065 Do_ADBG_Log("ED25519 not supported: skip subcase");
5066 goto out;
5067 }
5068
5069 Do_ADBG_BeginSubCase(c, "Generate Ed25519 key");
5070
5071 ADBG_EXPECT_TRUE(c, generate_and_test_key(c, &session,
5072 TEE_TYPE_ED25519_KEYPAIR,
5073 0, 256, NULL, 0));
5074
5075 Do_ADBG_EndSubCase(c, "Generate Ed25519 key");
5076out:
5077 TEEC_CloseSession(&session);
5078}
5079ADBG_CASE_DEFINE(regression, 4007_ed25519, xtest_tee_test_4007_ed25519,
5080 "Test TEE Internal API Generate ed25519 key");
5081
Pascal Brandc639ac82015-07-02 08:53:34 +02005082static void xtest_tee_test_4008(ADBG_Case_t *c)
5083{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005084 TEEC_Session session = { };
5085 uint32_t ret_orig = 0;
5086 TEE_OperationHandle op = TEE_HANDLE_NULL;
5087 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
5088 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
5089 TEE_Attribute params[4] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02005090 size_t param_count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005091 uint8_t out[2048] = { };
5092 size_t out_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02005093
5094 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5095 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5096 &ret_orig)))
5097 return;
5098
5099 Do_ADBG_BeginSubCase(c, "Derive DH key success");
5100
5101 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5102 ta_crypt_cmd_allocate_operation(c, &session, &op,
5103 TEE_ALG_DH_DERIVE_SHARED_SECRET, TEE_MODE_DERIVE,
5104 derive_key_max_keysize)))
5105 goto out;
5106
5107 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5108 ta_crypt_cmd_allocate_transient_object(c, & session,
5109 TEE_TYPE_DH_KEYPAIR, derive_key_max_keysize,
5110 &key_handle)))
5111 goto out;
5112
5113 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PRIME,
5114 ARRAY(derive_key_dh_prime));
5115
5116 xtest_add_attr(&param_count, params, TEE_ATTR_DH_BASE,
5117 ARRAY(derive_key_dh_base));
5118
5119 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PUBLIC_VALUE,
5120 ARRAY(derive_key_dh_public_value));
5121
5122 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PRIVATE_VALUE,
5123 ARRAY(derive_key_dh_private_value));
5124
5125 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5126 ta_crypt_cmd_populate_transient_object(c, &session, key_handle,
5127 params, param_count)))
5128 goto out;
5129
5130 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5131 ta_crypt_cmd_set_operation_key(c, &session, op, key_handle)))
5132 goto out;
5133
5134 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5135 ta_crypt_cmd_free_transient_object(c, & session, key_handle)))
5136 goto out;
5137
5138 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5139 ta_crypt_cmd_allocate_transient_object(c, &session,
5140 TEE_TYPE_GENERIC_SECRET, derive_key_max_keysize,
5141 &sv_handle)))
5142 goto out;
5143
Pascal Brand2b92b642015-07-16 13:29:42 +02005144 /* reuse but reset params and param-count */
Pascal Brandc639ac82015-07-02 08:53:34 +02005145 param_count = 0;
5146
5147 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PUBLIC_VALUE,
5148 ARRAY(derive_key_dh_public_value_2));
5149
5150 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5151 ta_crypt_cmd_derive_key(c, &session, op, sv_handle, params,
5152 param_count)))
5153 goto out;
5154
5155 out_size = sizeof(out);
5156 memset(out, 0, sizeof(out));
5157 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5158 ta_crypt_cmd_get_object_buffer_attribute(c, &session, sv_handle,
5159 TEE_ATTR_SECRET_VALUE, out, &out_size)))
5160 goto out;
5161
5162 if (!ADBG_EXPECT_BUFFER(c, derive_key_dh_shared_secret,
5163 sizeof(derive_key_dh_shared_secret), out,
5164 out_size))
5165 goto out;
5166
5167 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5168 ta_crypt_cmd_free_operation(c, &session, op)))
5169 goto out;
5170
5171 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5172 ta_crypt_cmd_free_transient_object(c, &session, sv_handle)))
5173 goto out;
5174out:
5175 Do_ADBG_EndSubCase(c, "Derive DH key success");
5176 TEEC_CloseSession(&session);
5177}
Jens Wiklander14f48872018-06-29 15:30:13 +02005178ADBG_CASE_DEFINE(regression, 4008, xtest_tee_test_4008,
5179 "Test TEE Internal API Derive key");
Pascal Brand2b92b642015-07-16 13:29:42 +02005180
5181static void xtest_tee_test_4009(ADBG_Case_t *c)
5182{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005183 TEEC_Session session = { };
5184 uint32_t ret_orig = 0;
5185 TEE_OperationHandle op = TEE_HANDLE_NULL;
5186 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
5187 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
5188 TEE_Attribute params[4] = { };
Pascal Brand2b92b642015-07-16 13:29:42 +02005189 size_t param_count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005190 uint8_t out[2048] = { };
5191 size_t out_size = 0;
5192 uint32_t size_bytes = 0;
5193 uint32_t i = 0;
Ruchika Gupta454b0b62020-10-30 13:23:19 +05305194 struct derive_key_ecdh_t const *pt = NULL;
Pascal Brand2b92b642015-07-16 13:29:42 +02005195
5196 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5197 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5198 &ret_orig)))
5199 return;
5200
5201 for (i = 0; i < ARRAY_SIZE(derive_key_ecdh); i++) {
5202 pt = &derive_key_ecdh[i];
5203
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02005204 if (pt->level > level)
5205 continue;
5206
Pascal Brand2b92b642015-07-16 13:29:42 +02005207 Do_ADBG_BeginSubCase(c, "Derive ECDH key - algo = 0x%x",
5208 pt->algo);
5209 size_bytes = (pt->keysize + 7) / 8;
5210 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5211 ta_crypt_cmd_allocate_operation(c, &session, &op,
5212 pt->algo,
5213 TEE_MODE_DERIVE, pt->keysize)))
5214 goto out;
5215
5216 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5217 ta_crypt_cmd_allocate_transient_object(c, & session,
5218 TEE_TYPE_ECDH_KEYPAIR, pt->keysize,
5219 &key_handle)))
5220 goto out;
5221
5222 param_count = 0;
5223 xtest_add_attr_value(&param_count, params,
5224 TEE_ATTR_ECC_CURVE, pt->curve, 0);
5225 xtest_add_attr(&param_count, params,
5226 TEE_ATTR_ECC_PRIVATE_VALUE,
5227 pt->private, size_bytes);
5228 /*
Cedric Auger719047c2019-09-11 12:08:14 +02005229 * The public value is not used, but we should provide a valid
5230 * one to avoid rejection in case TEE_PopulateTransientObject()
5231 * checks for key validity.
Pascal Brand2b92b642015-07-16 13:29:42 +02005232 */
5233 xtest_add_attr(&param_count, params,
Cedric Auger719047c2019-09-11 12:08:14 +02005234 TEE_ATTR_ECC_PUBLIC_VALUE_X,
5235 pt->public_x, size_bytes);
Pascal Brand2b92b642015-07-16 13:29:42 +02005236 xtest_add_attr(&param_count, params,
Cedric Auger719047c2019-09-11 12:08:14 +02005237 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5238 pt->public_y, size_bytes);
Pascal Brand2b92b642015-07-16 13:29:42 +02005239
5240 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5241 ta_crypt_cmd_populate_transient_object(c,
5242 &session,
5243 key_handle, params, param_count)))
5244 goto out;
5245
5246 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5247 ta_crypt_cmd_set_operation_key(c, &session, op,
5248 key_handle)))
5249 goto out;
5250
5251 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5252 ta_crypt_cmd_free_transient_object(c, & session,
5253 key_handle)))
5254 goto out;
5255
5256 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5257 ta_crypt_cmd_allocate_transient_object(c, &session,
5258 TEE_TYPE_GENERIC_SECRET, size_bytes * 8,
5259 &sv_handle)))
5260 goto out;
5261
5262 /* reuse but reset params and param-count */
5263 param_count = 0;
5264
5265 xtest_add_attr(&param_count, params,
5266 TEE_ATTR_ECC_PUBLIC_VALUE_X,
5267 pt->public_x, size_bytes);
5268 xtest_add_attr(&param_count, params,
5269 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5270 pt->public_y, size_bytes);
5271
5272 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5273 ta_crypt_cmd_derive_key(c, &session, op, sv_handle,
5274 params, param_count)))
5275 goto out;
5276
5277 out_size = sizeof(out);
5278 memset(out, 0, sizeof(out));
5279 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5280 ta_crypt_cmd_get_object_buffer_attribute(c, &session,
5281 sv_handle,
5282 TEE_ATTR_SECRET_VALUE, out, &out_size)))
5283 goto out;
5284
5285 if (!ADBG_EXPECT_BUFFER(c, pt->out, size_bytes,
5286 out, out_size))
5287 goto out;
5288
5289 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5290 ta_crypt_cmd_free_operation(c, &session, op)))
5291 goto out;
5292
5293 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5294 ta_crypt_cmd_free_transient_object(c, &session,
5295 sv_handle)))
5296 goto out;
5297
5298 Do_ADBG_EndSubCase(c, "Derive ECDH key - algo = 0x%x",
5299 pt->algo);
5300 }
5301
5302 goto noerror;
5303
5304out:
5305 Do_ADBG_EndSubCase(c, "Derive ECDH key - algo = 0x%x", pt->algo);
5306
5307noerror:
5308 TEEC_CloseSession(&session);
5309}
Jens Wiklander14f48872018-06-29 15:30:13 +02005310ADBG_CASE_DEFINE(regression, 4009, xtest_tee_test_4009,
5311 "Test TEE Internal API Derive key ECDH");
Jens Wiklander70a0b2c2016-05-18 08:39:35 +02005312
5313static void xtest_tee_test_4010(ADBG_Case_t *c)
5314{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005315 TEEC_Session session = { };
5316 uint32_t ret_orig = 0;
5317 TEE_ObjectHandle o = TEE_HANDLE_NULL;
Jens Wiklander70a0b2c2016-05-18 08:39:35 +02005318 static const uint8_t large_key[1024] = { 1, 2, 3, 4, 5, 6 };
5319 static const TEE_Attribute attr = {
5320 .attributeID = TEE_ATTR_SECRET_VALUE,
5321 .content.ref.buffer = (void *)large_key,
5322 .content.ref.length = sizeof(large_key),
5323 };
5324
5325 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5326 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5327 &ret_orig)))
5328 return;
5329
5330 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5331 ta_crypt_cmd_allocate_transient_object(c, &session,
5332 TEE_TYPE_HMAC_SHA256, 1024, &o)))
5333 goto out;
5334
5335 ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_TARGET_DEAD,
5336 ta_crypt_cmd_populate_transient_object(c, &session, o,
5337 &attr, 1));
5338
5339out:
5340 TEEC_CloseSession(&session);
5341}
Jens Wiklander14f48872018-06-29 15:30:13 +02005342ADBG_CASE_DEFINE(regression, 4010, xtest_tee_test_4010,
5343 "Test TEE Internal API create transient object (negative)");
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005344
5345static void xtest_tee_test_4011(ADBG_Case_t *c)
5346{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005347 TEEC_Session s = { };
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005348 size_t key_size = 512;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005349 TEE_ObjectHandle key = TEE_HANDLE_NULL;
5350 TEE_OperationHandle ops = TEE_HANDLE_NULL;
5351 TEE_OperationHandle opv = TEE_HANDLE_NULL;
5352 TEE_OperationHandle ope = TEE_HANDLE_NULL;
5353 TEE_OperationHandle opd = TEE_HANDLE_NULL;
5354 uint32_t ret_orig = 0;
5355 uint8_t in[TEE_SHA1_HASH_SIZE] = { };
5356 uint8_t out[1024] = { };
5357 uint8_t tmp[1024] = { };
5358 size_t out_size = 0;
5359 size_t tmp_size = 0;
5360 size_t n = 0;
5361 size_t m = 0;
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005362 size_t i = 0;
5363
5364 /* Setup session, initialize message to sign, create a keypair */
5365 if (!ADBG_EXPECT_TEEC_SUCCESS(c, xtest_teec_open_session(&s,
5366 &crypt_user_ta_uuid, NULL, &ret_orig)))
5367 return;
5368 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_random_number_generate(c,
5369 &s, in, sizeof(in))))
5370 goto out;
5371 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_transient_object(
5372 c, &s, TEE_TYPE_RSA_KEYPAIR, key_size, &key)))
5373 goto out;
5374 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_generate_key(c, &s,
5375 key, key_size, NULL, 0)))
5376 goto out;
5377
5378 /* Allocate operations for sign, verify, encrypt and decrypt */
5379 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
5380 &ops, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
5381 key_size)))
5382 goto out;
5383 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
5384 &opv, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
5385 key_size)))
5386 goto out;
5387 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
5388 &ope, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT, key_size)))
5389 goto out;
5390 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
5391 &opd, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT, key_size)))
5392 goto out;
5393
5394 /* Assign the keypair to all operations */
5395 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5396 ta_crypt_cmd_set_operation_key(c, &s, ops, key)))
5397 goto out;
5398 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5399 ta_crypt_cmd_set_operation_key(c, &s, opv, key)))
5400 goto out;
5401 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5402 ta_crypt_cmd_set_operation_key(c, &s, ope, key)))
5403 goto out;
5404 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5405 ta_crypt_cmd_set_operation_key(c, &s, opd, key)))
5406 goto out;
5407
5408 /*
5409 * The core of the test case is inspired by the one in libtomcrypt:
5410 * https://github.com/libtom/libtomcrypt/blob/6ad52252688bb34f90b5e79da4830a927e87b81f/testprof/rsa_test.c#L398
5411 *
5412 * Testcase for Bleichenbacher attack
5413 *
5414 * (1) Create a valid signature
5415 * (2) Check that it can be verified
5416 * (3) Transform the package to fetch plain text (using the encrypt
5417 * operation in GP TEE Internal API)
5418 * (4) Forge the structure of PKCS#1-EMSA encoded data
5419 * (4.1) Search for start and end of the padding string
5420 * (4.2) Move the signature to the front of the padding string
5421 * (4.3) Zero the message until the end
5422 * (5) Transform the package back (using the decrypt operation in
5423 * GP TEE Internal API)
5424 * (6) The result should not be valid if the implementation is robust.
5425 */
5426
5427
5428 for (i = 0; i < 9; i++) {
5429 Do_ADBG_Log("Iteration %zu", i);
5430
5431 /* 1 */
5432 out_size = sizeof(out);
5433 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5434 ta_crypt_cmd_asymmetric_sign(c, &s, ops, NULL, 0,
5435 in, sizeof(in), out, &out_size)))
5436 goto out;
5437
5438 /* 2 */
5439 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5440 ta_crypt_cmd_asymmetric_verify(c, &s, opv, NULL, 0,
5441 in, sizeof(in), out, out_size)))
5442 goto out;
5443
5444 /* 3 */
5445 tmp_size = sizeof(tmp);
5446 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5447 ta_crypt_cmd_asymmetric_encrypt(c, &s, ope, NULL, 0,
5448 out, out_size, tmp, &tmp_size)))
5449 goto out;
5450
Etienne Carriere0953bf02018-12-21 15:36:25 +01005451 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, tmp_size, <=, sizeof(tmp)))
5452 goto out;
5453
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005454 /* 4.1 */
Etienne Carriere0953bf02018-12-21 15:36:25 +01005455 for (n = 0; n < tmp_size - i; n++)
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005456 if (tmp[n] == 0xff)
5457 break;
Etienne Carriere0953bf02018-12-21 15:36:25 +01005458
5459 /* Shall find at least a padding start before buffer end */
5460 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, n, <, tmp_size - i - 1))
5461 goto out;
5462
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005463 for (m = n + 1; m < tmp_size; m++)
5464 if (tmp[m] != 0xff)
5465 break;
Etienne Carriere0953bf02018-12-21 15:36:25 +01005466
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005467 /* 4.2 */
5468 memmove(tmp + n + i, tmp + m, tmp_size - m);
Etienne Carriere0953bf02018-12-21 15:36:25 +01005469
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005470 /* 4.3 */
Etienne Carriere0953bf02018-12-21 15:36:25 +01005471 n = n + i + tmp_size - m;
Etienne Carriereacb81c42020-04-24 14:58:58 +02005472
5473 /* Prevent overrun when zeroing buffer end */
5474 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, n, <=, tmp_size))
5475 goto out;
5476
Etienne Carriere0953bf02018-12-21 15:36:25 +01005477 memset(tmp + n, 0, tmp_size - n);
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005478
5479 /* 5 */
5480 out_size = sizeof(out);
5481 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5482 ta_crypt_cmd_asymmetric_decrypt(c, &s, opd, NULL, 0,
5483 tmp, tmp_size, out, &out_size)))
5484 goto out;
5485
5486 /* 6 */
5487 if (!ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_SIGNATURE_INVALID,
5488 ta_crypt_cmd_asymmetric_verify(c, &s, opv, NULL, 0,
5489 in, sizeof(in), out, out_size)))
5490 goto out;
5491 }
5492
5493out:
5494 TEEC_CloseSession(&s);
5495}
Jens Wiklander14f48872018-06-29 15:30:13 +02005496ADBG_CASE_DEFINE(regression, 4011, xtest_tee_test_4011,
5497 "Test TEE Internal API Bleichenbacher attack (negative)");
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005498
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005499static void xtest_tee_test_4012(ADBG_Case_t *c)
5500{
Jens Wiklanderc44350d2022-12-02 20:56:49 +01005501 TEEC_Result res = TEEC_SUCCESS;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005502 TEEC_Session session = { };
5503 uint32_t ret_orig = 0;
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005504 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
5505 /* Fortuna PRNG requires seed <= 32 bytes */
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005506 uint8_t pool_input[32] = { };
5507 time_t t = 0;
5508 struct tm tm_local = { };
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005509
5510 t = time(NULL);
5511 tm_local = *localtime(&t);
5512
5513 memcpy((void *)pool_input, (void *)&tm_local,
5514 sizeof(pool_input) < sizeof(tm_local) ?
5515 sizeof(pool_input) : sizeof(tm_local));
5516
5517
5518 op.params[0].tmpref.buffer = pool_input;
5519 op.params[0].tmpref.size = sizeof(pool_input);
5520 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
5521 TEEC_NONE,
5522 TEEC_NONE,
5523 TEEC_NONE);
5524 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5525 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5526 &ret_orig)))
5527 return;
5528
Jens Wiklanderc44350d2022-12-02 20:56:49 +01005529 res = TEEC_InvokeCommand(&session, TA_CRYPT_CMD_SEED_RNG_POOL,
5530 &op, &ret_orig);
5531 if (res == TEEC_ERROR_ITEM_NOT_FOUND &&
5532 ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, ret_orig,
5533 TEEC_ORIGIN_TRUSTED_APP))
5534 Do_ADBG_Log("System PTA not available, skipping test 4012");
5535 else
5536 ADBG_EXPECT_TEEC_SUCCESS(c, res);
5537
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005538 TEEC_CloseSession(&session);
5539}
Jens Wiklander14f48872018-06-29 15:30:13 +02005540ADBG_CASE_DEFINE(regression, 4012, xtest_tee_test_4012,
5541 "Test seeding RNG entropy");
Joakim Bech83a30ca2019-05-29 11:22:27 +02005542
5543static void xtest_tee_test_4013(ADBG_Case_t *c)
5544{
Jens Wiklanderc44350d2022-12-02 20:56:49 +01005545 TEEC_Result res = TEEC_SUCCESS;
Joakim Bech83a30ca2019-05-29 11:22:27 +02005546 TEEC_Session session = { };
5547 uint32_t ret_orig = 0;
5548 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
5549 uint8_t key[32] = { };
5550 uint8_t extra_data[32] = { };
5551
5552 op.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
5553 TEEC_NONE,
5554 TEEC_NONE,
5555 TEEC_NONE);
5556 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5557 xtest_teec_open_session(&session, &crypt_user_ta_uuid,
5558 NULL, &ret_orig)))
5559 return;
5560
Jens Wiklanderc44350d2022-12-02 20:56:49 +01005561 res = TEEC_InvokeCommand(&session, TA_CRYPT_CMD_DERIVE_TA_UNIQUE_KEY,
5562 &op, &ret_orig);
5563 if (res == TEEC_ERROR_ITEM_NOT_FOUND &&
5564 ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, ret_orig,
5565 TEEC_ORIGIN_TRUSTED_APP)) {
5566 Do_ADBG_Log("System PTA not available, skipping test 4013");
5567 goto out;
5568 }
5569 ADBG_EXPECT_TEEC_SUCCESS(c, res);
Joakim Bech83a30ca2019-05-29 11:22:27 +02005570
5571 /* Negative test using non-secure memory */
5572 memset(&op, 0, sizeof(op));
5573 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
5574 TEEC_MEMREF_TEMP_OUTPUT,
5575 TEEC_NONE,
5576 TEEC_NONE);
5577
5578 op.params[0].tmpref.buffer = extra_data;
5579 op.params[0].tmpref.size = sizeof(extra_data);
5580 op.params[1].tmpref.buffer = key;
5581 op.params[1].tmpref.size = sizeof(key);
5582 (void)ADBG_EXPECT_TEEC_RESULT(c,
5583 TEEC_ERROR_SECURITY,
5584 TEEC_InvokeCommand(&session,
5585 TA_CRYPT_CMD_DERIVE_TA_UNIQUE_KEY_SHM,
5586 &op,
5587 &ret_orig));
5588
Jens Wiklanderc44350d2022-12-02 20:56:49 +01005589out:
Joakim Bech83a30ca2019-05-29 11:22:27 +02005590 TEEC_CloseSession(&session);
5591}
5592ADBG_CASE_DEFINE(regression, 4013, xtest_tee_test_4013,
5593 "Test generation of device unique TA keys");
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005594
5595static void xtest_tee_test_4014(ADBG_Case_t *c)
5596{
5597 TEEC_Session session = { };
5598 uint32_t ret_orig = 0;
5599 TEE_OperationHandle op = TEE_HANDLE_NULL;
5600 TEE_ObjectHandle keyA = TEE_HANDLE_NULL;
5601 TEE_ObjectHandle eph_keyA = TEE_HANDLE_NULL;
5602 TEE_ObjectHandle keyB = TEE_HANDLE_NULL;
5603 TEE_ObjectHandle eph_keyB = TEE_HANDLE_NULL;
5604 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
5605 TEE_Attribute params[9] = { };
5606 size_t param_count = 0;
5607 uint8_t out[128] = { };
5608 size_t out_size = 0;
5609 uint8_t conf_A[32] = { };
5610 uint8_t conf_B[32] = { };
5611
5612 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5613 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5614 &ret_orig)))
5615 return;
5616
5617 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_SM2_KEP,
5618 TEE_ECC_CURVE_SM2)) {
5619 Do_ADBG_Log("SM2 KEP not supported: skip subcase");
5620 goto out;
5621 }
5622
5623 Do_ADBG_BeginSubCase(c, "Initiator side");
5624
5625 /*
5626 * Key exchange protocol running on user A's side. A is initiator.
5627 */
5628
5629 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5630 ta_crypt_cmd_allocate_operation(c, &session, &op,
5631 TEE_ALG_SM2_KEP, TEE_MODE_DERIVE, 512)))
5632 goto out;
5633
5634 /* Allocate and initialize keypair of user A */
5635
5636 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5637 ta_crypt_cmd_allocate_transient_object(c, &session,
5638 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &keyA)))
5639 goto out;
5640
5641 param_count = 0;
5642
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005643 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5644 ARRAY(gmt_003_part5_b2_public_xA));
5645
5646 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5647 ARRAY(gmt_003_part5_b2_public_yA));
5648
5649 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5650 ARRAY(gmt_003_part5_b2_private_A));
5651
5652 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5653 ta_crypt_cmd_populate_transient_object(c, &session, keyA,
5654 params, param_count)))
5655 goto out;
5656
5657 /*
5658 * Allocate and set ephemeral key of user A. Note: it is a regular ECC
5659 * key -- we don't use the *_EPHEMERAL_* attributes flags which are
5660 * reserved for use in TEE_DeriveKey() to pass the ephermeral key of
5661 * user B.
5662 */
5663
5664 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5665 ta_crypt_cmd_allocate_transient_object(c, &session,
5666 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &eph_keyA)))
5667 goto out;
5668
5669 param_count = 0;
5670
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005671 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5672 ARRAY(gmt_003_part5_b2_eph_public_xA));
5673
5674 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5675 ARRAY(gmt_003_part5_b2_eph_public_yA));
5676
5677 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5678 ARRAY(gmt_003_part5_b2_eph_private_A));
5679
5680 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5681 ta_crypt_cmd_populate_transient_object(c, &session, eph_keyA,
5682 params, param_count)))
5683 goto out;
5684
5685 /* Associate user A keys with operation */
5686
5687 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5688 ta_crypt_cmd_set_operation_key2(c, &session, op, keyA,
5689 eph_keyA)))
5690 goto out;
5691
5692 /* Keys have been set, free key objects */
5693
5694 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5695 ta_crypt_cmd_free_transient_object(c, &session, keyA)))
5696 goto out;
5697
5698 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5699 ta_crypt_cmd_free_transient_object(c, &session, eph_keyA)))
5700 goto out;
5701
5702 /* Allocate output object */
5703
5704 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5705 ta_crypt_cmd_allocate_transient_object(c, &session,
5706 TEE_TYPE_GENERIC_SECRET,
5707 sizeof(gmt_003_part5_b2_shared_secret),
5708 &sv_handle)))
5709 goto out;
5710
5711 /* Set key derivation parameters: user A role, user B information */
5712
5713 params[0].attributeID = TEE_ATTR_SM2_KEP_USER;
5714 params[0].content.value.a = 0; /* Initiator role */
5715 params[0].content.value.b = 0; /* Not used */
5716 param_count = 1;
5717
5718 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5719 ARRAY(gmt_003_part5_b2_public_xB));
5720
5721 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5722 ARRAY(gmt_003_part5_b2_public_yB));
5723
5724 xtest_add_attr(&param_count, params,
5725 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_X,
5726 ARRAY(gmt_003_part5_b2_eph_public_xB));
5727
5728 xtest_add_attr(&param_count, params,
5729 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_Y,
5730 ARRAY(gmt_003_part5_b2_eph_public_yB));
5731
5732 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_INITIATOR,
5733 ARRAY(gmt_003_part5_b2_id_A));
5734
5735 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_RESPONDER,
5736 ARRAY(gmt_003_part5_b2_id_B));
5737
5738 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_IN,
5739 ARRAY(gmt_003_part5_b2_conf_B));
5740
5741 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_OUT,
5742 ARRAY(conf_A));
5743
5744 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5745 ta_crypt_cmd_derive_key(c, &session, op, sv_handle, params,
5746 param_count)))
5747 goto out;
5748
5749 out_size = sizeof(out);
5750 memset(out, 0, sizeof(out));
5751 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5752 ta_crypt_cmd_get_object_buffer_attribute(c, &session, sv_handle,
5753 TEE_ATTR_SECRET_VALUE, out, &out_size)))
5754 goto out;
5755
5756 /* Check derived key */
5757 if (!ADBG_EXPECT_BUFFER(c, gmt_003_part5_b2_shared_secret,
5758 sizeof(gmt_003_part5_b2_shared_secret), out,
5759 out_size))
5760 goto out;
5761
5762 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5763 ta_crypt_cmd_free_operation(c, &session, op)))
5764 goto out;
5765
5766 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5767 ta_crypt_cmd_free_transient_object(c, &session, sv_handle)))
5768 goto out;
5769
5770 Do_ADBG_EndSubCase(c, "Initiator side");
5771
5772 Do_ADBG_BeginSubCase(c, "Responder side");
5773
5774 /*
5775 * Key derivation on user B's side
5776 */
5777
5778 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5779 ta_crypt_cmd_allocate_operation(c, &session, &op,
5780 TEE_ALG_SM2_KEP, TEE_MODE_DERIVE, 512)))
5781 goto out;
5782
5783 /* Allocate and initialize keypair of user B */
5784
5785 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5786 ta_crypt_cmd_allocate_transient_object(c, &session,
5787 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &keyB)))
5788 goto out;
5789
5790 param_count = 0;
5791
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005792 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5793 ARRAY(gmt_003_part5_b2_public_xB));
5794
5795 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5796 ARRAY(gmt_003_part5_b2_public_yB));
5797
5798 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5799 ARRAY(gmt_003_part5_b2_private_B));
5800
5801 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5802 ta_crypt_cmd_populate_transient_object(c, &session, keyB,
5803 params, param_count)))
5804 goto out;
5805
5806 /* Allocate and set ephemeral key of user B */
5807
5808 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5809 ta_crypt_cmd_allocate_transient_object(c, &session,
5810 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &eph_keyB)))
5811 goto out;
5812
5813 param_count = 0;
5814
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005815 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5816 ARRAY(gmt_003_part5_b2_eph_public_xB));
5817
5818 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5819 ARRAY(gmt_003_part5_b2_eph_public_yB));
5820
5821 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5822 ARRAY(gmt_003_part5_b2_eph_private_B));
5823
5824 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5825 ta_crypt_cmd_populate_transient_object(c, &session, eph_keyB,
5826 params, param_count)))
5827 goto out;
5828
5829 /* Associate user B keys with operation */
5830
5831 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5832 ta_crypt_cmd_set_operation_key2(c, &session, op, keyB,
5833 eph_keyB)))
5834 goto out;
5835
5836 /* Keys have been set, free key objects */
5837
5838 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5839 ta_crypt_cmd_free_transient_object(c, &session, keyB)))
5840 goto out;
5841
5842 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5843 ta_crypt_cmd_free_transient_object(c, &session, eph_keyB)))
5844 goto out;
5845
5846 /* Allocate output object */
5847
5848 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5849 ta_crypt_cmd_allocate_transient_object(c, &session,
5850 TEE_TYPE_GENERIC_SECRET,
5851 sizeof(gmt_003_part5_b2_shared_secret),
5852 &sv_handle)))
5853 goto out;
5854
5855 /* Set key derivation parameters: user B role, user A information */
5856
5857 params[0].attributeID = TEE_ATTR_SM2_KEP_USER;
5858 params[0].content.value.a = 1; /* Responder role */
5859 params[0].content.value.b = 0; /* Not used */
5860 param_count = 1;
5861
5862 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5863 ARRAY(gmt_003_part5_b2_public_xA));
5864
5865 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5866 ARRAY(gmt_003_part5_b2_public_yA));
5867
5868 xtest_add_attr(&param_count, params,
5869 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_X,
5870 ARRAY(gmt_003_part5_b2_eph_public_xA));
5871
5872 xtest_add_attr(&param_count, params,
5873 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_Y,
5874 ARRAY(gmt_003_part5_b2_eph_public_yA));
5875
5876 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_INITIATOR,
5877 ARRAY(gmt_003_part5_b2_id_A));
5878
5879 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_RESPONDER,
5880 ARRAY(gmt_003_part5_b2_id_B));
5881
5882 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_IN,
5883 ARRAY(gmt_003_part5_b2_conf_A));
5884
5885 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_OUT,
5886 ARRAY(conf_B));
5887
5888 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5889 ta_crypt_cmd_derive_key(c, &session, op, sv_handle, params,
5890 param_count)))
5891 goto out;
5892
5893 out_size = sizeof(out);
5894 memset(out, 0, sizeof(out));
5895 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5896 ta_crypt_cmd_get_object_buffer_attribute(c, &session, sv_handle,
5897 TEE_ATTR_SECRET_VALUE, out, &out_size)))
5898 goto out;
5899
5900 /* Check derived key */
5901 if (!ADBG_EXPECT_BUFFER(c, gmt_003_part5_b2_shared_secret,
5902 sizeof(gmt_003_part5_b2_shared_secret), out,
5903 out_size))
5904 goto out;
5905
5906 Do_ADBG_EndSubCase(c, "Responder side");
5907
5908out:
5909 TEEC_CloseSession(&session);
5910}
5911ADBG_CASE_DEFINE(regression, 4014, xtest_tee_test_4014,
5912 "Test SM2 KEP (key derivation)");
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03005913
5914static void xtest_tee_test_4015(ADBG_Case_t *c)
5915{
5916 TEEC_Session session = { };
5917 uint32_t ret_orig = 0;
5918 TEE_OperationHandle op = TEE_HANDLE_NULL;
5919 TEE_ObjectHandle key_alice = TEE_HANDLE_NULL;
5920 TEE_ObjectHandle key_bob = TEE_HANDLE_NULL;
5921 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
5922 TEE_Attribute params[2] = { };
5923 size_t param_count = 0;
5924 uint8_t out[32] = { };
5925 size_t out_size = 0;
5926 char case_str[40] = "Alice side computes shared secret";
5927
5928 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5929 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5930 &ret_orig)))
5931 return;
5932
5933 Do_ADBG_BeginSubCase(c, "%s", case_str);
5934
5935 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_X25519,
5936 TEE_ECC_CURVE_25519)) {
5937 Do_ADBG_Log("X25519 not supported: skip subcase");
5938 goto out;
5939 }
5940
5941 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5942 ta_crypt_cmd_allocate_operation(c, &session, &op,
5943 TEE_ALG_X25519, TEE_MODE_DERIVE, 256)))
5944 goto out;
5945
5946 /* Allocate and initialize keypair of Alice */
5947 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5948 ta_crypt_cmd_allocate_transient_object(c, &session,
5949 TEE_TYPE_X25519_KEYPAIR, 256, &key_alice)))
5950 goto out;
5951
5952 param_count = 0;
5953
5954 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PUBLIC_VALUE,
5955 ARRAY(x25519_alice_public));
5956
5957 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PRIVATE_VALUE,
5958 ARRAY(x25519_alice_private));
5959
5960 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5961 ta_crypt_cmd_populate_transient_object(c, &session,
5962 key_alice, params, param_count)))
5963 goto out;
5964
5965 /* Associate Alices's keys with operation */
5966 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5967 ta_crypt_cmd_set_operation_key(c, &session, op,
5968 key_alice)))
5969 goto out;
5970
5971 /* Keys have been set, free key objects */
5972 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5973 ta_crypt_cmd_free_transient_object(c, &session,
5974 key_alice)))
5975 goto out;
5976
5977 /* Allocate shared secret output object */
5978 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5979 ta_crypt_cmd_allocate_transient_object(c, &session,
5980 TEE_TYPE_GENERIC_SECRET,
5981 sizeof(x25519_shared_secret), &sv_handle)))
5982 goto out;
5983
5984 /* Reset params */
5985 param_count = 0;
5986
5987 /* Set Bob's public key for Alice side */
5988 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PUBLIC_VALUE,
5989 ARRAY(x25519_bob_public));
5990
5991 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5992 ta_crypt_cmd_derive_key(c, &session, op, sv_handle,
5993 params, param_count)))
5994 goto out;
5995
5996 out_size = sizeof(out);
5997 memset(out, 0, sizeof(out));
5998 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5999 ta_crypt_cmd_get_object_buffer_attribute(c, &session,
6000 sv_handle, TEE_ATTR_SECRET_VALUE, out,
6001 &out_size)))
6002 goto out;
6003
6004 /* Check derived key */
6005 if (!ADBG_EXPECT_BUFFER(c, x25519_shared_secret,
6006 sizeof(x25519_shared_secret), out,
6007 out_size))
6008 goto out;
6009
6010 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6011 ta_crypt_cmd_free_operation(c, &session, op)))
6012 goto out;
6013
6014 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6015 ta_crypt_cmd_free_transient_object(c, &session,
6016 sv_handle)))
6017 goto out;
6018
6019 Do_ADBG_EndSubCase(c, "%s", case_str);
6020
6021 strncpy(case_str, "Bob side computes shared secret",
6022 sizeof(case_str) - 1);
6023
6024 Do_ADBG_BeginSubCase(c, "%s", case_str);
6025
6026 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6027 ta_crypt_cmd_allocate_operation(c, &session, &op,
6028 TEE_ALG_X25519, TEE_MODE_DERIVE, 256)))
6029 goto out;
6030
6031 /* Allocate and initialize keypair of Bob */
6032 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6033 ta_crypt_cmd_allocate_transient_object(c, &session,
6034 TEE_TYPE_X25519_KEYPAIR, 256, &key_bob)))
6035 goto out;
6036
6037 /* Reset params */
6038 param_count = 0;
6039
6040 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PUBLIC_VALUE,
6041 ARRAY(x25519_bob_public));
6042
6043 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PRIVATE_VALUE,
6044 ARRAY(x25519_bob_private));
6045
6046 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6047 ta_crypt_cmd_populate_transient_object(c, &session,
6048 key_bob, params, param_count)))
6049 goto out;
6050
6051 /* Associate Bob's keys with operation */
6052 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6053 ta_crypt_cmd_set_operation_key(c, &session, op,
6054 key_bob)))
6055 goto out;
6056
6057 /* Keys have been set, free key objects */
6058 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6059 ta_crypt_cmd_free_transient_object(c, &session,
6060 key_bob)))
6061 goto out;
6062
6063 /* Allocate shared secret output object */
6064 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6065 ta_crypt_cmd_allocate_transient_object(c, &session,
6066 TEE_TYPE_GENERIC_SECRET,
6067 sizeof(x25519_shared_secret), &sv_handle)))
6068 goto out;
6069
6070 /* Reset params */
6071 param_count = 0;
6072
6073 /* Set Alice's public key for Bob side */
6074 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PUBLIC_VALUE,
6075 ARRAY(x25519_alice_public));
6076
6077 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6078 ta_crypt_cmd_derive_key(c, &session, op, sv_handle,
6079 params, param_count)))
6080 goto out;
6081
6082 out_size = sizeof(out);
6083 memset(out, 0, sizeof(out));
6084 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6085 ta_crypt_cmd_get_object_buffer_attribute(c, &session,
6086 sv_handle, TEE_ATTR_SECRET_VALUE, out,
6087 &out_size)))
6088 goto out;
6089
6090 /* Check derived key */
6091 if (!ADBG_EXPECT_BUFFER(c, x25519_shared_secret,
6092 sizeof(x25519_shared_secret), out,
6093 out_size))
6094 goto out;
6095
6096 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6097 ta_crypt_cmd_free_operation(c, &session, op)))
6098 goto out;
6099
6100 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6101 ta_crypt_cmd_free_transient_object(c, &session,
6102 sv_handle)))
6103 goto out;
6104
6105out:
6106 Do_ADBG_EndSubCase(c, "%s", case_str);
6107 TEEC_CloseSession(&session);
6108}
6109ADBG_CASE_DEFINE(regression, 4015, xtest_tee_test_4015,
6110 "Test TEE Internal API Derive key X25519");
Valerii Chubarab9863c2022-08-12 07:42:29 +00006111
6112static void xtest_tee_test_4016_ed25519(ADBG_Case_t *c)
6113{
6114 TEEC_Session session = { };
6115 TEE_OperationHandle op = TEE_HANDLE_NULL;
6116 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
6117 TEE_Attribute key_attrs[2] = { };
6118 size_t num_key_attrs = 0;
6119 TEE_Attribute attrs[2] = { };
6120 size_t num_attrs = 0;
6121 uint8_t out[64] = { };
6122 size_t out_size = sizeof(out);
6123 size_t n = 0;
6124 uint32_t ret_orig = 0;
6125 size_t max_key_size = 0;
6126
6127 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6128 xtest_teec_open_session(&session, &crypt_user_ta_uuid,
6129 NULL, &ret_orig)))
6130 return;
6131
6132 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_ED25519,
6133 TEE_ECC_CURVE_25519)) {
6134 Do_ADBG_Log("ED25519 not supported: skip subcase");
6135 goto out;
6136 }
6137
6138 for (n = 0; n < ARRAY_SIZE(xtest_ac_eddsa_cases); n++) {
6139 const struct xtest_ac_case *tv = xtest_ac_eddsa_cases + n;
6140
6141 if (tv->algo != TEE_ALG_ED25519)
6142 continue;
6143
6144 num_attrs = 0;
6145 num_key_attrs = 0;
6146 max_key_size = tv->params.eddsa.private_len * 8;
6147
6148 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6149 ta_crypt_cmd_allocate_operation(c, &session, &op,
6150 TEE_ALG_ED25519, tv->mode, max_key_size)))
6151 goto out;
6152
6153 xtest_add_attr(&num_key_attrs, key_attrs,
6154 TEE_ATTR_ED25519_PUBLIC_VALUE,
6155 tv->params.eddsa.public,
6156 tv->params.eddsa.public_len);
6157
6158 if (tv->params.eddsa.flag == 1)
Jens Wiklander7596bd32022-12-02 15:43:37 +01006159 xtest_add_attr_value(&num_attrs, attrs,
6160 TEE_ATTR_EDDSA_PREHASH, 1, 0);
Valerii Chubarab9863c2022-08-12 07:42:29 +00006161
6162 if (tv->params.eddsa.context_len > 0)
6163 xtest_add_attr(&num_attrs, attrs, TEE_ATTR_EDDSA_CTX,
6164 tv->params.eddsa.context,
6165 tv->params.eddsa.context_len);
6166
6167 switch (tv->mode) {
6168 case TEE_MODE_SIGN:
6169 xtest_add_attr(&num_key_attrs, key_attrs,
6170 TEE_ATTR_ED25519_PRIVATE_VALUE,
6171 tv->params.eddsa.private,
6172 tv->params.eddsa.private_len);
6173
6174 if (!ADBG_EXPECT_TRUE(c,
6175 create_key(c, &session, max_key_size,
6176 TEE_TYPE_ED25519_KEYPAIR,
6177 key_attrs, num_key_attrs,
6178 &key_handle)))
6179 goto out;
6180
6181 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6182 ta_crypt_cmd_set_operation_key(c,
6183 &session, op, key_handle)))
6184 goto out;
6185
6186 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6187 ta_crypt_cmd_asymmetric_sign(c,
6188 &session, op,
6189 attrs, num_attrs, tv->ptx,
6190 tv->ptx_len, out, &out_size)))
6191 goto out;
6192
6193 ADBG_EXPECT_BUFFER(c, tv->ctx, tv->ctx_len, out, out_size);
6194
6195 break;
6196
6197 case TEE_MODE_VERIFY:
6198 if (!ADBG_EXPECT_TRUE(c,
6199 create_key(c, &session, max_key_size,
6200 TEE_TYPE_ED25519_PUBLIC_KEY,
6201 key_attrs, num_key_attrs,
6202 &key_handle)))
6203 goto out;
6204
6205 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6206 ta_crypt_cmd_set_operation_key(c,
6207 &session, op, key_handle)))
6208 goto out;
6209
6210 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6211 ta_crypt_cmd_asymmetric_verify(c, &session, op,
6212 attrs, num_attrs,
6213 tv->ptx,
6214 tv->ptx_len,
6215 tv->ctx,
6216 tv->ctx_len)))
6217 goto out;
6218 break;
6219
6220 default:
6221 break;
6222 }
6223
6224 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6225 ta_crypt_cmd_free_operation(c, &session, op)))
6226 goto out;
6227 }
6228out:
6229 TEEC_CloseSession(&session);
6230}
Jens Wiklander7b70ff82022-12-02 20:59:32 +01006231ADBG_CASE_DEFINE(regression, 4016, xtest_tee_test_4016_ed25519,
Valerii Chubarab9863c2022-08-12 07:42:29 +00006232 "Test TEE Internal API ED25519 sign/verify");
Jens Wiklanderc7e0b132024-04-18 17:47:52 +02006233
6234struct buf_state {
6235 bool buffer_two_blocks;
6236 bool auth_enc;
6237 bool decrypt;
6238 uint8_t *plain_text;
6239 uint8_t *ciph_text;
6240 uint8_t *tmp_text;
6241 size_t text_size;
6242 size_t block_size;
6243 uint8_t *iv;
6244 size_t iv_len;
6245 uint8_t tag[96 / 8];
6246 uint8_t tmp_tag[96 / 8];
6247 TEE_OperationHandle oph;
6248 TEEC_Session *s;
6249
6250 size_t in_count;
6251 size_t out_count;
6252 size_t buf_count;
6253};
6254
6255static bool process_bytes_4017(ADBG_Case_t *c, struct buf_state *bs,
6256 size_t count)
6257{
6258 TEE_Result res = TEEC_SUCCESS;
6259 size_t new_buf_count = 0;
6260 void *reference = NULL;
6261 void *src = NULL;
6262 size_t out = 0;
6263 size_t dlen = 0;
6264
6265 if (bs->decrypt) {
6266 src = bs->ciph_text + bs->in_count;
6267 reference = bs->plain_text + bs->out_count;
6268 } else {
6269 src = bs->plain_text + bs->in_count;
6270 reference = bs->ciph_text + bs->out_count;
6271 }
6272
6273 bs->in_count += count;
6274 if (bs->buffer_two_blocks) {
6275 if (bs->in_count > bs->block_size)
6276 new_buf_count = ((bs->in_count - 1) % bs->block_size) +
6277 bs->block_size + 1;
6278 else
6279 new_buf_count = bs->in_count;
6280 } else {
6281 new_buf_count = bs->in_count % bs->block_size;
6282 }
6283
6284 out = bs->buf_count + count - new_buf_count;
6285 bs->out_count += out;
6286 bs->buf_count = new_buf_count;
6287
6288 if (bs->auth_enc) {
6289 res = ta_crypt_cmd_ae_update(c, bs->s, bs->oph, src, count,
6290 NULL, &dlen);
6291 if (!res)
6292 return ADBG_EXPECT_COMPARE_UNSIGNED(c, dlen, ==, 0) &&
6293 ADBG_EXPECT_COMPARE_UNSIGNED(c, dlen, ==, out);
6294 if (!ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_SHORT_BUFFER, res) ||
6295 !ADBG_EXPECT_COMPARE_UNSIGNED(c, dlen, ==, out))
6296 return false;
6297 res = ta_crypt_cmd_ae_update(c, bs->s, bs->oph, src, count,
6298 bs->tmp_text, &dlen);
6299 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res) ||
6300 !ADBG_EXPECT_BUFFER(c, reference, out,
6301 bs->tmp_text, dlen))
6302 return false;
6303 } else {
6304 res = ta_crypt_cmd_cipher_update(c, bs->s, bs->oph, src, count,
6305 NULL, &dlen);
6306 if (!res)
6307 return ADBG_EXPECT_COMPARE_UNSIGNED(c, dlen, ==, out);
6308 if (!ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_SHORT_BUFFER, res) ||
6309 !ADBG_EXPECT_COMPARE_UNSIGNED(c, dlen, ==, out))
6310 return false;
6311 res = ta_crypt_cmd_cipher_update(c, bs->s, bs->oph, src, count,
6312 bs->tmp_text, &dlen);
6313 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res) ||
6314 !ADBG_EXPECT_BUFFER(c, reference, out,
6315 bs->tmp_text, dlen))
6316 return false;
6317 }
6318
6319 return true;
6320}
6321
6322static bool process_bytes_final_4017(ADBG_Case_t *c, struct buf_state *bs)
6323{
6324 TEEC_Result res = TEEC_SUCCESS;
6325 void *reference = NULL;
6326 size_t src_len = 0;
6327 void *src = NULL;
6328 size_t dlen = 0;
6329 size_t tlen = 0;
6330
6331 if (bs->decrypt) {
6332 src = bs->ciph_text + bs->in_count;
6333 reference = bs->plain_text + bs->out_count;
6334 } else {
6335 src = bs->plain_text + bs->in_count;
6336 reference = bs->ciph_text + bs->out_count;
6337 }
6338 src_len = bs->text_size - bs->in_count;
6339
6340 if (bs->auth_enc) {
6341 if (bs->decrypt)
6342 res = ta_crypt_cmd_ae_decrypt_final(c, bs->s, bs->oph,
6343 src, src_len,
6344 NULL, &dlen,
6345 bs->tag,
6346 sizeof(bs->tag));
6347 else
6348 res = ta_crypt_cmd_ae_encrypt_final(c, bs->s, bs->oph,
6349 src, src_len,
6350 NULL, &dlen, NULL,
6351 &tlen);
6352 if (!res && bs->decrypt)
6353 return ADBG_EXPECT_COMPARE_UNSIGNED(c, dlen, ==,
6354 src_len);
6355 if (!ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_SHORT_BUFFER, res) ||
6356 !ADBG_EXPECT_COMPARE_UNSIGNED(c, bs->text_size -
6357 bs->out_count, ==, dlen))
6358 return false;
6359 if (!bs->decrypt &&
6360 !ADBG_EXPECT_COMPARE_UNSIGNED(c, sizeof(bs->tag), ==, tlen))
6361 return false;
6362 if (bs->decrypt)
6363 res = ta_crypt_cmd_ae_decrypt_final(c, bs->s, bs->oph,
6364 src, src_len,
6365 bs->tmp_text, &dlen,
6366 bs->tag,
6367 sizeof(bs->tag));
6368 else
6369 res = ta_crypt_cmd_ae_encrypt_final(c, bs->s, bs->oph,
6370 src, src_len,
6371 bs->tmp_text, &dlen,
6372 bs->tmp_tag, &tlen);
6373 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res) ||
6374 !ADBG_EXPECT_BUFFER(c, reference,
6375 bs->text_size - bs->out_count,
6376 bs->tmp_text, dlen))
6377 return false;
6378 if (!bs->decrypt &&
6379 !ADBG_EXPECT_BUFFER(c, bs->tag, sizeof(bs->tag),
6380 bs->tmp_tag, tlen))
6381 return false;
6382 } else {
6383 res = ta_crypt_cmd_cipher_do_final(c, bs->s, bs->oph,
6384 src, src_len, NULL, &dlen);
6385 if (!res)
6386 return ADBG_EXPECT_COMPARE_UNSIGNED(c, dlen, ==,
6387 src_len);
6388 if (!ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_SHORT_BUFFER, res) ||
6389 !ADBG_EXPECT_COMPARE_UNSIGNED(c,
6390 bs->text_size -
6391 bs->out_count, ==, dlen))
6392 return false;
6393
6394 res = ta_crypt_cmd_cipher_do_final(c, bs->s, bs->oph,
6395 src, src_len,
6396 bs->tmp_text, &dlen);
6397 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res) ||
6398 !ADBG_EXPECT_BUFFER(c, reference,
6399 bs->text_size - bs->out_count,
6400 bs->tmp_text, dlen))
6401 return false;
6402 }
6403
6404 return true;
6405}
6406
6407static bool process_text_4017(ADBG_Case_t *c, struct buf_state *bs,
6408 size_t initial_count, size_t middle_count)
6409{
6410 TEEC_Result res = TEEC_SUCCESS;
6411 size_t n = 0;
6412
6413 bs->in_count = 0;
6414 bs->out_count = 0;
6415 bs->buf_count = 0;
6416
6417 if (bs->auth_enc)
6418 res = ta_crypt_cmd_ae_init(c, bs->s, bs->oph, bs->iv,
6419 bs->iv_len, sizeof(bs->tag), 0,
6420 bs->text_size);
6421 else
6422 res = ta_crypt_cmd_cipher_init(c, bs->s, bs->oph, bs->iv,
6423 bs->iv_len);
6424 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
6425 return false;
6426
6427 if (initial_count &&
6428 !ADBG_EXPECT_TRUE(c, process_bytes_4017(c, bs, initial_count)))
6429 return false;
6430
6431 for (n = 0; n < middle_count && n + initial_count < bs->text_size; n++)
6432 if (!ADBG_EXPECT_TRUE(c, process_bytes_4017(c, bs, 1)))
6433 return false;
6434
6435 return process_bytes_final_4017(c, bs);
6436}
6437
6438static bool alloc_oph_4017(ADBG_Case_t *c, TEEC_Session *s, uint32_t algo,
6439 uint32_t mode, void *key, size_t key_size,
6440 TEE_OperationHandle *oph)
6441{
6442 TEEC_Result res = TEEC_SUCCESS;
6443 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
6444 TEE_ObjectHandle key2_handle = TEE_HANDLE_NULL;
6445 TEE_Attribute key_attr = {
6446 .attributeID = TEE_ATTR_SECRET_VALUE,
6447 .content.ref.buffer = key,
6448 .content.ref.length = key_size,
6449 };
6450 bool ret = false;
6451
6452 res = ta_crypt_cmd_allocate_transient_object(c, s, TEE_TYPE_AES,
6453 key_size * 8, &key_handle);
6454 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
6455 goto out;
6456 res = ta_crypt_cmd_populate_transient_object(c, s, key_handle,
6457 &key_attr, 1);
6458 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
6459 goto out;
6460
6461 if (algo == TEE_ALG_AES_XTS) {
6462 res = ta_crypt_cmd_allocate_transient_object(c, s, TEE_TYPE_AES,
6463 key_size * 8,
6464 &key2_handle);
6465 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
6466 goto out;
6467 res = ta_crypt_cmd_populate_transient_object(c, s, key2_handle,
6468 &key_attr, 1);
6469 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
6470 goto out;
6471
6472 res = ta_crypt_cmd_allocate_operation(c, s, oph, algo, mode,
6473 key_size * 8 * 2);
6474 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
6475 goto out;
6476 res = ta_crypt_cmd_set_operation_key2(c, s, *oph, key_handle,
6477 key2_handle);
6478 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
6479 goto out;
6480 } else {
6481 res = ta_crypt_cmd_allocate_operation(c, s, oph, algo, mode,
6482 key_size * 8);
6483 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
6484 goto out;
6485 res = ta_crypt_cmd_set_operation_key(c, s, *oph, key_handle);
6486 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
6487 goto out;
6488 }
6489
6490 ret = true;
6491out:
6492 if (key2_handle)
6493 ta_crypt_cmd_free_transient_object(c, s, key2_handle);
6494 if (key_handle)
6495 ta_crypt_cmd_free_transient_object(c, s, key_handle);
6496 return ret;
6497}
6498
6499static bool do_algo_4017(ADBG_Case_t *c, TEEC_Session *s, uint32_t algo,
6500 size_t extra_size)
6501{
6502 TEEC_Result res = TEEC_SUCCESS;
6503 struct buf_state bs = { .s = s, };
6504 size_t middle_count = 0;
6505 uint8_t iv[16] = { };
6506 uint8_t key[16] = { };
6507 size_t prev_n = 0;
6508 bool ret = false;
6509 size_t dlen = 0;
6510 size_t tlen = 0;
6511 size_t n = 0;
6512
6513 if (level >= 12)
6514 middle_count = 2 * TEE_AES_BLOCK_SIZE;
6515
6516 bs.block_size = 16;
6517 bs.text_size = bs.block_size * 6 + extra_size;
6518 bs.plain_text = calloc(3, bs.text_size);
6519 if (!ADBG_EXPECT_NOT_NULL(c, bs.plain_text))
6520 return false;
6521 bs.ciph_text = bs.plain_text + bs.text_size;
6522 bs.tmp_text = bs.ciph_text + bs.text_size;
6523
6524 for (n = 0; n < bs.text_size; n++)
6525 bs.plain_text[n] = n + 1;
6526 for (n = 0; n < ARRAY_SIZE(iv); n++)
6527 iv[n] = n + 1;
6528 for (n = 0; n < ARRAY_SIZE(key); n++)
6529 key[n] = n + 1;
6530
6531 if (!ADBG_EXPECT_TRUE(c, alloc_oph_4017(c, s, algo, TEE_MODE_ENCRYPT,
6532 key, sizeof(key), &bs.oph)))
6533 return false;
6534
6535 if (algo != TEE_ALG_AES_ECB_NOPAD) {
6536 bs.iv = iv;
6537 bs.iv_len = sizeof(iv);
6538 }
6539 if (algo == TEE_ALG_AES_CCM)
6540 bs.iv_len = 13;
6541 if (algo == TEE_ALG_AES_CTR || algo == TEE_ALG_AES_GCM)
6542 bs.block_size = 1;
6543 else
6544 bs.block_size = TEE_AES_BLOCK_SIZE;
6545 if (algo == TEE_ALG_AES_CTS || algo == TEE_ALG_AES_XTS)
6546 bs.buffer_two_blocks = true;
6547 if (algo == TEE_ALG_AES_CCM || algo == TEE_ALG_AES_GCM)
6548 bs.auth_enc = true;
6549
6550 if (bs.auth_enc) {
6551 res = ta_crypt_cmd_ae_init(c, bs.s, bs.oph, bs.iv, bs.iv_len,
6552 sizeof(bs.tag), 0, bs.text_size);
6553 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
6554 goto out;
6555 res = ta_crypt_cmd_ae_encrypt_final(c, bs.s, bs.oph,
6556 bs.plain_text, bs.text_size,
6557 NULL, &dlen, NULL, &tlen);
6558 if (!ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_SHORT_BUFFER, res) ||
6559 !ADBG_EXPECT_COMPARE_UNSIGNED(c, bs.text_size, ==, dlen))
6560 goto out;
6561 res = ta_crypt_cmd_ae_encrypt_final(c, bs.s, bs.oph,
6562 bs.plain_text, bs.text_size,
6563 bs.ciph_text, &dlen, bs.tag,
6564 &tlen);
6565 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res) ||
6566 !ADBG_EXPECT_COMPARE_UNSIGNED(c, bs.text_size, ==, dlen))
6567 goto out;
6568 } else {
6569 res = ta_crypt_cmd_cipher_init(c, bs.s, bs.oph, bs.iv,
6570 bs.iv_len);
6571 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
6572 goto out;
6573 res = ta_crypt_cmd_cipher_do_final(c, bs.s, bs.oph,
6574 bs.plain_text, bs.text_size,
6575 NULL, &dlen);
6576 if (!ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_SHORT_BUFFER, res) ||
6577 !ADBG_EXPECT_COMPARE_UNSIGNED(c, bs.text_size, ==, dlen))
6578 goto out;
6579 res = ta_crypt_cmd_cipher_do_final(c, bs.s, bs.oph,
6580 bs.plain_text, bs.text_size,
6581 bs.ciph_text, &dlen);
6582 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res) ||
6583 !ADBG_EXPECT_COMPARE_UNSIGNED(c, bs.text_size, ==, dlen))
6584 goto out;
6585 }
6586
6587 for (n = 0; n < bs.text_size; n++) {
6588 /*
6589 * If level < 12 test with initial count of:
6590 * 0, 1, 15 for each AES block, that is,
6591 * 0, 1, 15, 16, 17, 31, 32, 33, 47, 48, 49, 63, 64, 65,
6592 * 79, 80, 81, and 95
6593 * If level >= 12 test with initial count of each n, an
6594 * exhaustive of every possible initial count.
6595 *
6596 * If level < 12 test with middle_count of 32 else 0.
6597 * (middle_count - n) bytes are processed one by one.
6598 *
6599 * The idea is to try to match all corner cases when
6600 * buffering AES blocks. With special focus on what happens
6601 * when a complete block has been buffered.
6602 */
6603 if (level < 12 && (n % TEE_AES_BLOCK_SIZE) > 1 &&
6604 (n % TEE_AES_BLOCK_SIZE) < (TEE_AES_BLOCK_SIZE - 1))
6605 continue;
6606 ret = process_text_4017(c, &bs, n, middle_count);
6607 if (!ADBG_EXPECT_TRUE(c, ret)) {
6608 Do_ADBG_Log("Failed processing with initial_count %zu (previous %zu)",
6609 n, prev_n);
6610 goto out;
6611 }
6612 prev_n = n;
6613 }
6614
6615 ta_crypt_cmd_free_operation(c, s, bs.oph);
6616 bs.oph = TEE_HANDLE_NULL;
6617 if (!ADBG_EXPECT_TRUE(c, alloc_oph_4017(c, s, algo, TEE_MODE_DECRYPT,
6618 key, sizeof(key), &bs.oph)))
6619 goto out;
6620 bs.decrypt = true;
6621
6622 /* Only test matching decryption for levels above 13 */
6623 for (n = 0; level > 13 && n < bs.text_size; n++) {
6624 if (level < 12 && (n % TEE_AES_BLOCK_SIZE) > 1 &&
6625 (n % TEE_AES_BLOCK_SIZE) < (TEE_AES_BLOCK_SIZE - 1))
6626 continue;
6627 ret = process_text_4017(c, &bs, n, middle_count);
6628 if (!ADBG_EXPECT_TRUE(c, ret)) {
6629 Do_ADBG_Log("Failed processing with initial_count %zu (previous %zu)",
6630 n, prev_n);
6631 goto out;
6632 }
6633 prev_n = n;
6634 }
6635
6636 ret = true;
6637out:
6638 if (bs.oph)
6639 ta_crypt_cmd_free_operation(c, s, bs.oph);
6640 free(bs.plain_text);
6641 return ret;
6642}
6643
6644static void xtest_tee_test_4017(ADBG_Case_t *c)
6645{
6646 TEEC_Result res = TEEC_SUCCESS;
6647 uint32_t ret_orig = 0;
6648 TEEC_Session sess = { };
6649
6650 res = xtest_teec_open_session(&sess, &crypt_user_ta_uuid, NULL,
6651 &ret_orig);
6652 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
6653 return;
6654
6655 Do_ADBG_BeginSubCase(c, "TEE_ALG_AES_ECB_NOPAD");
6656 ADBG_EXPECT_TRUE(c, do_algo_4017(c, &sess, TEE_ALG_AES_ECB_NOPAD, 0));
6657 Do_ADBG_EndSubCase(c, "TEE_ALG_AES_ECB_NOPAD");
6658
6659 Do_ADBG_BeginSubCase(c, "TEE_ALG_AES_CBC_NOPAD");
6660 ADBG_EXPECT_TRUE(c, do_algo_4017(c, &sess, TEE_ALG_AES_CBC_NOPAD, 0));
6661 Do_ADBG_EndSubCase(c, "TEE_ALG_AES_CBC_NOPAD");
6662
6663 Do_ADBG_BeginSubCase(c, "TEE_ALG_AES_CTR");
6664 ADBG_EXPECT_TRUE(c, do_algo_4017(c, &sess, TEE_ALG_AES_CTR, 0));
6665 Do_ADBG_EndSubCase(c, "TEE_ALG_AES_CTR");
6666
6667 Do_ADBG_BeginSubCase(c, "TEE_ALG_AES_CTR 1 extra byte");
6668 ADBG_EXPECT_TRUE(c, do_algo_4017(c, &sess, TEE_ALG_AES_CTR, 1));
6669 Do_ADBG_EndSubCase(c, "TEE_ALG_AES_CTR 1 extra byte");
6670
6671 Do_ADBG_BeginSubCase(c, "TEE_ALG_AES_CTS");
6672 ADBG_EXPECT_TRUE(c, do_algo_4017(c, &sess, TEE_ALG_AES_CTS, 0));
6673 Do_ADBG_EndSubCase(c, "TEE_ALG_AES_CTS");
6674
6675 Do_ADBG_BeginSubCase(c, "TEE_ALG_AES_CTS 1 extra byte");
6676 ADBG_EXPECT_TRUE(c, do_algo_4017(c, &sess, TEE_ALG_AES_CTS, 1));
6677 Do_ADBG_EndSubCase(c, "TEE_ALG_AES_CTS 1 extra byte");
6678
6679 Do_ADBG_BeginSubCase(c, "TEE_ALG_AES_XTS");
6680 ADBG_EXPECT_TRUE(c, do_algo_4017(c, &sess, TEE_ALG_AES_XTS, 0));
6681 Do_ADBG_EndSubCase(c, "TEE_ALG_AES_XTS");
6682
6683 Do_ADBG_BeginSubCase(c, "TEE_ALG_AES_XTS 1 extra byte");
6684 ADBG_EXPECT_TRUE(c, do_algo_4017(c, &sess, TEE_ALG_AES_XTS, 1));
6685 Do_ADBG_EndSubCase(c, "TEE_ALG_AES_XTS 1 extra byte");
6686
6687 Do_ADBG_BeginSubCase(c, "TEE_ALG_AES_GCM");
6688 ADBG_EXPECT_TRUE(c, do_algo_4017(c, &sess, TEE_ALG_AES_GCM, 0));
6689 Do_ADBG_EndSubCase(c, "TEE_ALG_AES_GCM");
6690
6691 Do_ADBG_BeginSubCase(c, "TEE_ALG_AES_GCM 1 extra byte");
6692 ADBG_EXPECT_TRUE(c, do_algo_4017(c, &sess, TEE_ALG_AES_GCM, 1));
6693 Do_ADBG_EndSubCase(c, "TEE_ALG_AES_GCM 1 extra byte");
6694
6695 Do_ADBG_BeginSubCase(c, "TEE_ALG_AES_CCM");
6696 ADBG_EXPECT_TRUE(c, do_algo_4017(c, &sess, TEE_ALG_AES_CCM, 0));
6697 Do_ADBG_EndSubCase(c, "TEE_ALG_AES_CCM");
6698
6699 Do_ADBG_BeginSubCase(c, "TEE_ALG_AES_CCM 1 extra byte");
6700 ADBG_EXPECT_TRUE(c, do_algo_4017(c, &sess, TEE_ALG_AES_CCM, 1));
6701 Do_ADBG_EndSubCase(c, "TEE_ALG_AES_CCM 1 extra byte");
6702
6703 TEEC_CloseSession(&sess);
6704}
6705
6706ADBG_CASE_DEFINE(regression, 4017, xtest_tee_test_4017,
6707 "Test TEE Internal API Cipher block buffering");