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