blob: 5e81211517f4626fc60c3d4e8f279a4c00b4ee69 [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
Clement Faure967368b2024-01-30 12:20:40 +01004371static bool is_caam_black_key(uint8_t *buf, size_t size)
4372{
4373 /*
4374 * This value is a magic number for the a CAAM Black key. This value
4375 * must match the value defined in optee-os
4376 * core/drivers/crypto/caam/caam_key.c
4377 */
4378 const uint8_t magic_number[4] = {0xFB, 0xBF, 0xAF, 0xCA};
4379
4380 if (size < sizeof(magic_number))
4381 return false;
4382
4383 return !memcmp(buf, magic_number, sizeof(magic_number));
4384}
4385
Pascal Brandc639ac82015-07-02 08:53:34 +02004386static bool test_keygen_attributes(ADBG_Case_t *c, TEEC_Session *s,
4387 TEE_ObjectHandle key, uint32_t key_size,
4388 struct key_attrs *attrs, size_t num_attrs)
4389{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004390 uint8_t out[2048] = { };
4391 size_t out_size = 0;
4392 size_t n = 0;
4393 size_t m = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004394
4395 for (m = 0; m < num_attrs; m++) {
4396 if ((attrs[m].attr & TEE_ATTR_BIT_VALUE) == 0) {
4397 out_size = sizeof(out);
4398 memset(out, 0, sizeof(out));
4399 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4400 ta_crypt_cmd_get_object_buffer_attribute(c, s,
4401 key, attrs[m].attr, out, &out_size)))
4402 return false;
4403
Clement Faure967368b2024-01-30 12:20:40 +01004404 /*
4405 * Check for CAAM black key header. If the buffer holds
4406 * a CAAM black key, do not check the key size as the
4407 * buffer size and the key size do not match.
4408 */
4409 if (attrs[m].keysize_check &&
4410 !is_caam_black_key(out, out_size))
Jerome Forissierfe94e562020-11-17 17:22:40 +01004411 ADBG_EXPECT_COMPARE_UNSIGNED(c, out_size, <=,
Pascal Brandc639ac82015-07-02 08:53:34 +02004412 key_size / 8);
4413
4414 if (out_size > 0) {
4415 /* Check that buffer isn't all zeroes */
4416 for (n = 0; n < out_size; n++)
4417 if (out[n] != 0)
4418 break;
4419 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, n, <,
4420 out_size))
4421 return false;
4422 }
4423 } else {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004424 uint32_t a = 0;
4425 uint32_t b = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004426
4427 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4428 ta_crypt_cmd_get_object_value_attribute(c, s, key,
4429 attrs[m].attr, &a, &b)))
4430 return false;
4431 }
4432 }
4433 return true;
4434}
4435
4436static bool test_secret_value(ADBG_Case_t *c, TEEC_Session *s,
4437 TEE_ObjectHandle key, uint32_t key_size)
4438{
4439 const struct key_attrs attrs[] = {
4440 KEY_ATTR(TEE_ATTR_SECRET_VALUE, true),
4441 };
4442
4443 return test_keygen_attributes(c, s, key, key_size,
4444 (struct key_attrs *)&attrs,
4445 ARRAY_SIZE(attrs));
4446}
4447
4448
4449static bool test_rsa_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4450 TEE_ObjectHandle key, uint32_t key_size)
4451{
4452 const struct key_attrs attrs[] = {
4453 KEY_ATTR(TEE_ATTR_RSA_MODULUS, true),
4454 KEY_ATTR(TEE_ATTR_RSA_PUBLIC_EXPONENT, false),
4455 KEY_ATTR(TEE_ATTR_RSA_PRIVATE_EXPONENT, false),
4456 KEY_ATTR(TEE_ATTR_RSA_PRIME1, false),
4457 KEY_ATTR(TEE_ATTR_RSA_PRIME2, false),
4458 KEY_ATTR(TEE_ATTR_RSA_EXPONENT1, false),
4459 KEY_ATTR(TEE_ATTR_RSA_EXPONENT2, false),
4460 KEY_ATTR(TEE_ATTR_RSA_COEFFICIENT, false),
4461 };
4462
4463 return test_keygen_attributes(c, s, key, key_size,
4464 (struct key_attrs *)&attrs,
4465 ARRAY_SIZE(attrs));
4466}
4467
Pascal Brande61133f2015-07-08 15:38:37 +02004468static bool test_ecc_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4469 TEE_ObjectHandle key, uint32_t key_size)
4470{
4471 const struct key_attrs attrs[] = {
4472 KEY_ATTR(TEE_ATTR_ECC_PRIVATE_VALUE, false),
4473 KEY_ATTR(TEE_ATTR_ECC_PUBLIC_VALUE_X , false),
4474 KEY_ATTR(TEE_ATTR_ECC_PUBLIC_VALUE_Y , false),
4475 /* KEY_ATTR(TEE_ATTR_ECC_CURVE, false), - do not test */
4476 };
4477
4478 return test_keygen_attributes(c, s, key, key_size,
4479 (struct key_attrs *)&attrs,
4480 ARRAY_SIZE(attrs));
4481}
4482
Pascal Brandc639ac82015-07-02 08:53:34 +02004483static bool test_dh_key_pair(ADBG_Case_t *c, TEEC_Session *s,
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004484 TEE_ObjectHandle key, uint32_t check_keysize)
Pascal Brandc639ac82015-07-02 08:53:34 +02004485{
4486 const struct key_attrs attrs[] = {
4487 KEY_ATTR(TEE_ATTR_DH_PRIME, false),
4488 KEY_ATTR(TEE_ATTR_DH_BASE, false),
4489 KEY_ATTR(TEE_ATTR_DH_PUBLIC_VALUE, false),
4490 KEY_ATTR(TEE_ATTR_DH_PRIVATE_VALUE, check_keysize),
4491 KEY_ATTR(TEE_ATTR_DH_X_BITS, false),
4492 };
4493
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004494 return test_keygen_attributes(c, s, key, check_keysize,
Pascal Brandc639ac82015-07-02 08:53:34 +02004495 (struct key_attrs *)&attrs,
4496 ARRAY_SIZE(attrs));
4497}
4498
4499static bool test_dsa_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4500 TEE_ObjectHandle key, uint32_t key_size)
4501{
4502 const struct key_attrs attrs[] = {
4503 KEY_ATTR(TEE_ATTR_DSA_PRIME, true),
4504 KEY_ATTR(TEE_ATTR_DSA_SUBPRIME, false),
4505 KEY_ATTR(TEE_ATTR_DSA_BASE, false),
4506 KEY_ATTR(TEE_ATTR_DSA_PUBLIC_VALUE, false),
4507 KEY_ATTR(TEE_ATTR_DSA_PRIVATE_VALUE, false),
4508 };
4509
4510 return test_keygen_attributes(c, s, key, key_size,
4511 (struct key_attrs *)&attrs,
4512 ARRAY_SIZE(attrs));
4513}
4514
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03004515static bool test_x25519_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4516 TEE_ObjectHandle key, uint32_t key_size)
4517{
4518 const struct key_attrs attrs[] = {
4519 KEY_ATTR(TEE_ATTR_X25519_PRIVATE_VALUE, false),
4520 KEY_ATTR(TEE_ATTR_X25519_PUBLIC_VALUE, false),
4521 };
4522
4523 return test_keygen_attributes(c, s, key, key_size,
4524 (struct key_attrs *)&attrs,
4525 ARRAY_SIZE(attrs));
4526}
4527
Valerii Chubarab9863c2022-08-12 07:42:29 +00004528static bool test_ed25519_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4529 TEE_ObjectHandle key, uint32_t key_size)
4530{
4531 const struct key_attrs attrs[] = {
4532 KEY_ATTR(TEE_ATTR_ED25519_PRIVATE_VALUE, false),
4533 KEY_ATTR(TEE_ATTR_ED25519_PUBLIC_VALUE, false),
4534 };
4535
4536 return test_keygen_attributes(c, s, key, key_size,
4537 (struct key_attrs *)&attrs,
4538 ARRAY_SIZE(attrs));
4539}
4540
Pascal Brandc639ac82015-07-02 08:53:34 +02004541static bool generate_and_test_key(ADBG_Case_t *c, TEEC_Session *s,
4542 uint32_t key_type, uint32_t check_keysize,
4543 uint32_t key_size,
4544 TEE_Attribute *params, size_t param_count)
4545{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004546 TEE_ObjectHandle key = TEE_HANDLE_NULL;
Pascal Brandc639ac82015-07-02 08:53:34 +02004547 bool ret_val = true;
4548
4549 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4550 ta_crypt_cmd_allocate_transient_object(c, s, key_type, key_size,
4551 &key)))
4552 return false;
4553
4554 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4555 ta_crypt_cmd_generate_key(c, s, key, key_size, params,
4556 param_count)))
4557 return false;
4558
4559 switch (key_type) {
4560 case TEE_TYPE_DES:
4561 case TEE_TYPE_DES3:
4562 ret_val = ADBG_EXPECT_TRUE(c,
4563 test_secret_value(c, s, key,
4564 key_size + key_size / 7));
4565 break;
4566 case TEE_TYPE_AES:
4567 case TEE_TYPE_HMAC_MD5:
4568 case TEE_TYPE_HMAC_SHA1:
4569 case TEE_TYPE_HMAC_SHA224:
4570 case TEE_TYPE_HMAC_SHA256:
4571 case TEE_TYPE_HMAC_SHA384:
4572 case TEE_TYPE_HMAC_SHA512:
4573 case TEE_TYPE_GENERIC_SECRET:
4574 ret_val = ADBG_EXPECT_TRUE(c,
4575 test_secret_value(c, s, key, key_size));
4576 break;
4577
4578 case TEE_TYPE_RSA_KEYPAIR:
4579 ret_val = ADBG_EXPECT_TRUE(c,
4580 test_rsa_key_pair(c, s, key, key_size));
4581 break;
4582
Pascal Brande61133f2015-07-08 15:38:37 +02004583 case TEE_TYPE_ECDSA_KEYPAIR:
4584 case TEE_TYPE_ECDH_KEYPAIR:
4585 ret_val = ADBG_EXPECT_TRUE(c,
4586 test_ecc_key_pair(c, s, key, key_size));
4587 break;
4588
Pascal Brandc639ac82015-07-02 08:53:34 +02004589 case TEE_TYPE_DH_KEYPAIR:
Pascal Brande61133f2015-07-08 15:38:37 +02004590 ret_val = ADBG_EXPECT_TRUE(c,
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004591 test_dh_key_pair(c, s, key, check_keysize));
Pascal Brandc639ac82015-07-02 08:53:34 +02004592 break;
4593
4594 case TEE_TYPE_DSA_KEYPAIR:
4595 ret_val = ADBG_EXPECT_TRUE(c,
4596 test_dsa_key_pair(c, s, key, key_size));
4597 break;
4598
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03004599 case TEE_TYPE_X25519_KEYPAIR:
4600 ret_val = ADBG_EXPECT_TRUE(c,
4601 test_x25519_key_pair(c, s, key, key_size));
4602 break;
4603
Valerii Chubarab9863c2022-08-12 07:42:29 +00004604 case TEE_TYPE_ED25519_KEYPAIR:
4605 ret_val = ADBG_EXPECT_TRUE(c,
4606 test_ed25519_key_pair(c, s, key, key_size));
4607 break;
4608
Pascal Brandc639ac82015-07-02 08:53:34 +02004609 default:
4610 ret_val = false;
4611 break;
4612 }
4613
4614 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4615 ta_crypt_cmd_free_transient_object(c, s, key)))
4616 return false;
4617
4618 return ret_val;
4619}
4620
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004621struct key_types_noparam {
4622 unsigned level;
4623 const char *name;
4624 uint32_t key_type;
4625 uint32_t quanta;
4626 uint32_t min_size;
4627 uint32_t max_size;
4628};
4629
4630static void keygen_noparams(ADBG_Case_t *c, TEEC_Session *session,
4631 const struct key_types_noparam *key_types,
4632 size_t num_key_types)
Pascal Brandc639ac82015-07-02 08:53:34 +02004633{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004634 size_t n = 0;
4635 uint32_t key_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004636
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004637 for (n = 0; n < num_key_types; n++) {
Pascal Brandc639ac82015-07-02 08:53:34 +02004638 uint32_t min_size = key_types[n].min_size;
4639 uint32_t max_size = key_types[n].max_size;
4640 uint32_t quanta = key_types[n].quanta;
4641
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004642 if (key_types[n].level > level)
4643 continue;
4644
Pascal Brandc639ac82015-07-02 08:53:34 +02004645 Do_ADBG_BeginSubCase(c, "Generate %s key", key_types[n].name);
4646
4647 for (key_size = min_size; key_size <= max_size;
4648 key_size += quanta) {
4649 if (!ADBG_EXPECT_TRUE(c,
4650 generate_and_test_key(c, session, key_types
4651 [n].key_type, 1, key_size, NULL, 0)))
4652 break;
4653 }
4654
4655 Do_ADBG_EndSubCase(c, "Generate %s key", key_types[n].name);
4656 }
4657}
4658
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004659static void xtest_tee_test_4007_symmetric(ADBG_Case_t *c)
Pascal Brandc639ac82015-07-02 08:53:34 +02004660{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004661 TEEC_Session session = { };
4662 uint32_t ret_orig = 0;
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004663 static const struct key_types_noparam key_types[] = {
4664 { 0, "AES", TEE_TYPE_AES, 64, 128,
4665 256 /* valid sizes 128, 192, 256 */ },
4666 { 0, "DES", TEE_TYPE_DES, 56, 56, 56 /* valid size 56 */ },
4667 { 0, "DES3", TEE_TYPE_DES3, 56, 112,
4668 168 /* valid sizes 112, 168 */ },
4669 { 0, "HMAC-MD5", TEE_TYPE_HMAC_MD5, 8, 64, 512 },
4670 { 0, "HMAC-SHA1", TEE_TYPE_HMAC_SHA1, 8, 80, 512 },
4671 { 0, "HMAC-SHA224", TEE_TYPE_HMAC_SHA224, 8, 112, 512 },
4672 { 0, "HMAC-SHA256", TEE_TYPE_HMAC_SHA256, 8, 192, 1024 },
4673 { 0, "HMAC-SHA384", TEE_TYPE_HMAC_SHA384, 8, 256, 1024 },
4674 { 0, "HMAC-SHA512", TEE_TYPE_HMAC_SHA512, 8, 256, 1024 },
4675 { 0, "Generic secret", TEE_TYPE_GENERIC_SECRET, 8, 128, 4096 },
4676 };
4677
4678 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4679 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4680 &ret_orig)))
4681 return;
4682
4683 keygen_noparams(c, &session, key_types, ARRAY_SIZE(key_types));
4684
4685 TEEC_CloseSession(&session);
4686}
4687ADBG_CASE_DEFINE(regression, 4007_symmetric, xtest_tee_test_4007_symmetric,
4688 "Test TEE Internal API Generate Symmetric key");
4689
4690static void xtest_tee_test_4007_rsa(ADBG_Case_t *c)
4691{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004692 TEEC_Session session = { };
4693 uint32_t ret_orig = 0;
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004694 static const struct key_types_noparam key_types[] = {
Jorge Ramirez-Ortizb657ea42022-02-17 10:15:25 +01004695#ifndef CFG_CRYPTO_SE05X
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004696 { 0, "RSA-256", TEE_TYPE_RSA_KEYPAIR, 1, 256, 256 },
4697 { 1, "RSA-384", TEE_TYPE_RSA_KEYPAIR, 1, 384, 384 },
Jorge Ramirez-Ortizb657ea42022-02-17 10:15:25 +01004698#endif
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004699 { 1, "RSA-512", TEE_TYPE_RSA_KEYPAIR, 1, 512, 512 },
Jorge Ramirez-Ortizb657ea42022-02-17 10:15:25 +01004700#ifndef CFG_CRYPTO_SE05X
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004701 { 1, "RSA-640", TEE_TYPE_RSA_KEYPAIR, 1, 640, 640 },
4702 { 1, "RSA-768", TEE_TYPE_RSA_KEYPAIR, 1, 768, 768 },
4703 { 1, "RSA-896", TEE_TYPE_RSA_KEYPAIR, 1, 896, 896 },
Jorge Ramirez-Ortizb657ea42022-02-17 10:15:25 +01004704#endif
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004705 { 1, "RSA-1024", TEE_TYPE_RSA_KEYPAIR, 1, 1024, 1024 },
4706 { 1, "RSA-2048", TEE_TYPE_RSA_KEYPAIR, 1, 2048, 2048 },
4707 { 1, "RSA-3072", TEE_TYPE_RSA_KEYPAIR, 1, 3072, 3072 },
4708 { 1, "RSA-4096", TEE_TYPE_RSA_KEYPAIR, 1, 4096, 4096 },
4709 };
4710
4711 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4712 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4713 &ret_orig)))
4714 return;
4715
4716 keygen_noparams(c, &session, key_types, ARRAY_SIZE(key_types));
4717
4718 TEEC_CloseSession(&session);
4719}
4720ADBG_CASE_DEFINE(regression, 4007_rsa, xtest_tee_test_4007_rsa,
4721 "Test TEE Internal API Generate RSA key");
4722
4723static void xtest_tee_test_4007_dh(ADBG_Case_t *c)
4724{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004725 TEEC_Session session = { };
4726 uint32_t ret_orig = 0;
4727 size_t n = 0;
4728 size_t param_count = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004729 /*
4730 * Note that the key size parameter is not used when creating the keys
4731 * but specifying these sizes make it possible to test the expected size
4732 * of the private value. This also means that the keysize must match the
4733 * size of p or what is specified in private_bits or the equvivalent
4734 * size of the subprime parameter.
4735 */
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004736 TEE_Attribute params[4] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02004737
4738#define XTEST_DH_GK_DATA(vect) \
4739 ARRAY(vect ## _p), \
4740 ARRAY(vect ## _g), \
4741 &vect ## _private_bits, \
4742 0, 0
4743#define XTEST_DH_GK_DATA_SUBPRIME(vect) \
4744 ARRAY(vect ## _p), \
4745 ARRAY(vect ## _g), \
4746 &vect ## _private_bits, \
4747 ARRAY(vect ## _subprime)
4748 static const struct {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004749 unsigned level;
Pascal Brandc639ac82015-07-02 08:53:34 +02004750 uint32_t key_size;
4751 const uint8_t *p;
4752 size_t p_len;
4753 const uint8_t *g;
4754 size_t g_len;
4755 const uint32_t *private_bits;
4756 const uint8_t *subprime;
4757 size_t subprime_len;
4758 } key_types[] = {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004759 { 0, 256, XTEST_DH_GK_DATA(keygen_dh256) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004760 { 0, 320, XTEST_DH_GK_DATA(keygen_dh320) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004761 { 1, 384, XTEST_DH_GK_DATA(keygen_dh384) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004762 { 1, 448, XTEST_DH_GK_DATA(keygen_dh448) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004763 { 1, 512, XTEST_DH_GK_DATA(keygen_dh512) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004764 { 1, 576, XTEST_DH_GK_DATA(keygen_dh576) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004765 { 1, 640, XTEST_DH_GK_DATA(keygen_dh640) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004766 { 1, 704, XTEST_DH_GK_DATA(keygen_dh704) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004767 { 1, 768, XTEST_DH_GK_DATA(keygen_dh768) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004768 { 1, 832, XTEST_DH_GK_DATA(keygen_dh832) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004769 { 1, 896, XTEST_DH_GK_DATA(keygen_dh896) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004770 { 1, 960, XTEST_DH_GK_DATA(keygen_dh960) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004771 { 1, 1024, XTEST_DH_GK_DATA(keygen_dh1024) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004772 { 1, 1088, XTEST_DH_GK_DATA(keygen_dh1088) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004773 { 1, 1152, XTEST_DH_GK_DATA(keygen_dh1152) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004774 { 1, 1216, XTEST_DH_GK_DATA(keygen_dh1216) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004775 { 1, 1280, XTEST_DH_GK_DATA(keygen_dh1280) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004776 { 1, 1344, XTEST_DH_GK_DATA(keygen_dh1344) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004777 { 1, 1408, XTEST_DH_GK_DATA(keygen_dh1408) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004778 { 1, 1472, XTEST_DH_GK_DATA(keygen_dh1472) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004779 { 1, 1536, XTEST_DH_GK_DATA(keygen_dh1536) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004780 { 1, 1600, XTEST_DH_GK_DATA(keygen_dh1600) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004781 { 1, 1664, XTEST_DH_GK_DATA(keygen_dh1664) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004782 { 1, 1728, XTEST_DH_GK_DATA(keygen_dh1728) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004783 { 1, 1792, XTEST_DH_GK_DATA(keygen_dh1792) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004784 { 1, 1856, XTEST_DH_GK_DATA(keygen_dh1856) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004785 { 1, 1920, XTEST_DH_GK_DATA(keygen_dh1920) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004786 { 1, 1984, XTEST_DH_GK_DATA(keygen_dh1984) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004787 { 1, 2048, XTEST_DH_GK_DATA(keygen_dh2048) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004788 { 1, 2048, XTEST_DH_GK_DATA_SUBPRIME(keygen_dh2048_subprime) }
Pascal Brandc639ac82015-07-02 08:53:34 +02004789 };
4790
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004791 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4792 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4793 &ret_orig)))
4794 return;
Pascal Brandc639ac82015-07-02 08:53:34 +02004795
4796 for (n = 0; n < ARRAY_SIZE(key_types); n++) {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004797 if (key_types[n].level > level)
4798 continue;
4799
Pascal Brandc639ac82015-07-02 08:53:34 +02004800 Do_ADBG_BeginSubCase(c,
4801 "Generate DH key %d bits - Private bits = %d",
4802 key_types[n].key_size,
4803 *key_types[n].private_bits);
4804 param_count = 0;
4805
4806 xtest_add_attr(&param_count, params,
4807 TEE_ATTR_DH_PRIME,
4808 key_types[n].p, key_types[n].p_len);
4809
4810 xtest_add_attr(&param_count, params, TEE_ATTR_DH_BASE,
4811 key_types[n].g, key_types[n].g_len);
4812
4813 if (key_types[n].private_bits != 0) {
4814 params[param_count].attributeID = TEE_ATTR_DH_X_BITS;
4815
4816 params[param_count].content.value.a =
4817 *key_types[n].private_bits;
4818
4819 params[param_count].content.value.b = 0;
4820 param_count++;
4821 }
4822
4823 if (key_types[n].subprime != 0) {
4824 xtest_add_attr(&param_count, params,
4825 TEE_ATTR_DH_SUBPRIME,
4826 key_types[n].subprime,
4827 key_types[n].subprime_len);
4828 }
4829
4830 if (!ADBG_EXPECT_TRUE(c,
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004831 generate_and_test_key(c, &session, TEE_TYPE_DH_KEYPAIR,
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004832 *key_types[n].private_bits,
Pascal Brandc639ac82015-07-02 08:53:34 +02004833 key_types[n]. key_size, params, param_count)))
4834 break;
4835
4836 Do_ADBG_EndSubCase(c,
4837 "Generate DH key %d bits - Private bits = %d",
4838 key_types[n].key_size,
4839 *key_types[n].private_bits);
4840 }
Pascal Brandc639ac82015-07-02 08:53:34 +02004841
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004842 TEEC_CloseSession(&session);
4843}
4844ADBG_CASE_DEFINE(regression, 4007_dh, xtest_tee_test_4007_dh,
4845 "Test TEE Internal API Generate DH key");
4846
4847static void xtest_tee_test_4007_dsa(ADBG_Case_t *c)
Pascal Brandc639ac82015-07-02 08:53:34 +02004848{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004849 TEEC_Session session = { };
4850 uint32_t ret_orig = 0;
4851 size_t n = 0;
4852 size_t param_count = 0;
4853 TEE_Attribute params[4] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02004854
4855#define XTEST_DSA_GK_DATA(vect) \
4856 ARRAY(vect ## _p), \
4857 ARRAY(vect ## _g), \
4858 ARRAY(vect ## _q)
4859 static const struct {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004860 unsigned level;
Pascal Brandc639ac82015-07-02 08:53:34 +02004861 uint32_t key_size;
4862 const uint8_t *prime;
4863 size_t prime_len;
4864 const uint8_t *base;
4865 size_t base_len;
4866 const uint8_t *sub_prime;
4867 size_t sub_prime_len;
4868 } key_types[] = {
Jerome Forissiereed7e652020-04-15 15:42:38 +02004869 { 0, 1024, XTEST_DSA_GK_DATA(keygen_dsa_test1) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004870 { 0, 512, XTEST_DSA_GK_DATA(keygen_dsa512) },
Jerome Forissiereed7e652020-04-15 15:42:38 +02004871 { 0, 576, XTEST_DSA_GK_DATA(keygen_dsa576) },
4872 { 0, 640, XTEST_DSA_GK_DATA(keygen_dsa640) },
4873 { 0, 704, XTEST_DSA_GK_DATA(keygen_dsa704) },
4874 { 0, 768, XTEST_DSA_GK_DATA(keygen_dsa768) },
4875 { 0, 832, XTEST_DSA_GK_DATA(keygen_dsa832) },
4876 { 0, 896, XTEST_DSA_GK_DATA(keygen_dsa896) },
4877 { 0, 960, XTEST_DSA_GK_DATA(keygen_dsa960) },
4878 { 0, 1024, XTEST_DSA_GK_DATA(keygen_dsa1024) },
Pascal Brandc639ac82015-07-02 08:53:34 +02004879 };
4880
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004881 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4882 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4883 &ret_orig)))
4884 return;
4885
Pascal Brandc639ac82015-07-02 08:53:34 +02004886 for (n = 0; n < ARRAY_SIZE(key_types); n++) {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004887 if (key_types[n].level > level)
4888 continue;
4889
Pascal Brandc639ac82015-07-02 08:53:34 +02004890 Do_ADBG_BeginSubCase(c, "Generate DSA key %d bits",
4891 key_types[n].key_size);
4892 param_count = 0;
4893
4894
4895 xtest_add_attr(&param_count, params, TEE_ATTR_DSA_PRIME,
4896 key_types[n].prime, key_types[n].prime_len);
4897
4898 xtest_add_attr(&param_count, params, TEE_ATTR_DSA_SUBPRIME,
4899 key_types[n].sub_prime,
4900 key_types[n].sub_prime_len);
4901
4902 xtest_add_attr(&param_count, params, TEE_ATTR_DSA_BASE,
4903 key_types[n].base, key_types[n].base_len);
4904
4905 if (!ADBG_EXPECT_TRUE(c,
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004906 generate_and_test_key(c, &session, TEE_TYPE_DSA_KEYPAIR,
Pascal Brandc639ac82015-07-02 08:53:34 +02004907 1, key_types[n]. key_size, params,
4908 param_count)))
4909 break;
4910
4911 Do_ADBG_EndSubCase(c, "Generate DSA key %d bits",
4912 key_types[n].key_size);
4913 }
Pascal Brandc639ac82015-07-02 08:53:34 +02004914
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004915 TEEC_CloseSession(&session);
4916}
4917ADBG_CASE_DEFINE(regression, 4007_dsa, xtest_tee_test_4007_dsa,
4918 "Test TEE Internal API Generate DSA key");
4919
4920static void xtest_tee_test_4007_ecc(ADBG_Case_t *c)
Pascal Brande61133f2015-07-08 15:38:37 +02004921{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004922 TEEC_Session session = { };
4923 uint32_t ret_orig = 0;
4924 size_t n = 0;
4925 size_t param_count = 0;
4926 TEE_Attribute params[4] = { };
Pascal Brande61133f2015-07-08 15:38:37 +02004927
4928 static const struct {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004929 unsigned level;
Pascal Brande61133f2015-07-08 15:38:37 +02004930 const char *name;
4931 uint32_t algo;
4932 uint32_t curve;
4933 uint32_t key_size;
4934 } key_types[] = {
4935 /* ECDSA */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004936 { 0, "ECDSA-192", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P192,
4937 192 },
4938 { 1, "ECDSA-224", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P224,
4939 224 },
4940 { 1, "ECDSA-256", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P256,
4941 256 },
4942 { 1, "ECDSA-384", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P384,
4943 384 },
4944 { 1, "ECDSA-521", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P521,
4945 521 },
Pascal Brande61133f2015-07-08 15:38:37 +02004946
4947 /* ECDH */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004948 { 0, "ECDH-192", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P192,
4949 192 },
4950 { 1, "ECDH-224", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P224,
4951 224 },
4952 { 1, "ECDH-256", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P256,
4953 256 },
4954 { 1, "ECDH-384", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P384,
4955 384 },
4956 { 1, "ECDH-521", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P521,
4957 521 },
Pascal Brande61133f2015-07-08 15:38:37 +02004958 };
4959
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004960 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4961 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4962 &ret_orig)))
4963 return;
4964
Pascal Brande61133f2015-07-08 15:38:37 +02004965 for (n = 0; n < ARRAY_SIZE(key_types); n++) {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004966 if (key_types[n].level > level)
4967 continue;
4968
Pascal Brande61133f2015-07-08 15:38:37 +02004969 Do_ADBG_BeginSubCase(c, "Generate %s", key_types[n].name);
4970 param_count = 0;
4971
4972 xtest_add_attr_value(&param_count, params, TEE_ATTR_ECC_CURVE,
4973 key_types[n].curve, 0);
4974
4975 if (!ADBG_EXPECT_TRUE(c,
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004976 generate_and_test_key(c, &session, key_types[n].algo,
Pascal Brande61133f2015-07-08 15:38:37 +02004977 0, key_types[n].key_size, params,
4978 param_count)))
4979 break;
4980
4981 Do_ADBG_EndSubCase(c, "Generate %s", key_types[n].name);
4982 }
Pascal Brande61133f2015-07-08 15:38:37 +02004983
Pascal Brandc639ac82015-07-02 08:53:34 +02004984 TEEC_CloseSession(&session);
4985}
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004986ADBG_CASE_DEFINE(regression, 4007_ecc, xtest_tee_test_4007_ecc,
4987 "Test TEE Internal API Generate ECC key");
Pascal Brandc639ac82015-07-02 08:53:34 +02004988
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03004989static void xtest_tee_test_4007_x25519(ADBG_Case_t *c)
4990{
4991 TEEC_Session session = { };
4992 uint32_t ret_orig = 0;
4993
4994 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4995 xtest_teec_open_session(&session, &crypt_user_ta_uuid,
4996 NULL, &ret_orig)))
4997 return;
4998
Jerome Forissier366179c2022-06-28 10:12:58 +02004999 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_X25519,
5000 TEE_ECC_CURVE_25519)) {
5001 Do_ADBG_Log("X25519 not supported: skip subcase");
5002 goto out;
5003 }
5004
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03005005 Do_ADBG_BeginSubCase(c, "Generate X25519 key");
5006
5007 if (!ADBG_EXPECT_TRUE(c,
5008 generate_and_test_key(c, &session,
5009 TEE_TYPE_X25519_KEYPAIR, 0, 256,
5010 NULL, 0)))
5011 return;
5012
5013 Do_ADBG_EndSubCase(c, "Generate X25519 key");
Jerome Forissier366179c2022-06-28 10:12:58 +02005014out:
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03005015 TEEC_CloseSession(&session);
5016}
5017ADBG_CASE_DEFINE(regression, 4007_x25519, xtest_tee_test_4007_x25519,
5018 "Test TEE Internal API Generate X25519 key");
5019
Valerii Chubarab9863c2022-08-12 07:42:29 +00005020
5021static void xtest_tee_test_4007_ed25519(ADBG_Case_t *c)
5022{
5023 TEEC_Session session = { };
5024 uint32_t ret_orig = 0;
5025
5026 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5027 xtest_teec_open_session(&session, &crypt_user_ta_uuid,
5028 NULL, &ret_orig)))
5029 return;
5030
5031 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_ED25519,
5032 TEE_ECC_CURVE_25519)) {
5033 Do_ADBG_Log("ED25519 not supported: skip subcase");
5034 goto out;
5035 }
5036
5037 Do_ADBG_BeginSubCase(c, "Generate Ed25519 key");
5038
5039 ADBG_EXPECT_TRUE(c, generate_and_test_key(c, &session,
5040 TEE_TYPE_ED25519_KEYPAIR,
5041 0, 256, NULL, 0));
5042
5043 Do_ADBG_EndSubCase(c, "Generate Ed25519 key");
5044out:
5045 TEEC_CloseSession(&session);
5046}
5047ADBG_CASE_DEFINE(regression, 4007_ed25519, xtest_tee_test_4007_ed25519,
5048 "Test TEE Internal API Generate ed25519 key");
5049
Pascal Brandc639ac82015-07-02 08:53:34 +02005050static void xtest_tee_test_4008(ADBG_Case_t *c)
5051{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005052 TEEC_Session session = { };
5053 uint32_t ret_orig = 0;
5054 TEE_OperationHandle op = TEE_HANDLE_NULL;
5055 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
5056 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
5057 TEE_Attribute params[4] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02005058 size_t param_count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005059 uint8_t out[2048] = { };
5060 size_t out_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02005061
5062 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5063 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5064 &ret_orig)))
5065 return;
5066
5067 Do_ADBG_BeginSubCase(c, "Derive DH key success");
5068
5069 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5070 ta_crypt_cmd_allocate_operation(c, &session, &op,
5071 TEE_ALG_DH_DERIVE_SHARED_SECRET, TEE_MODE_DERIVE,
5072 derive_key_max_keysize)))
5073 goto out;
5074
5075 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5076 ta_crypt_cmd_allocate_transient_object(c, & session,
5077 TEE_TYPE_DH_KEYPAIR, derive_key_max_keysize,
5078 &key_handle)))
5079 goto out;
5080
5081 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PRIME,
5082 ARRAY(derive_key_dh_prime));
5083
5084 xtest_add_attr(&param_count, params, TEE_ATTR_DH_BASE,
5085 ARRAY(derive_key_dh_base));
5086
5087 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PUBLIC_VALUE,
5088 ARRAY(derive_key_dh_public_value));
5089
5090 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PRIVATE_VALUE,
5091 ARRAY(derive_key_dh_private_value));
5092
5093 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5094 ta_crypt_cmd_populate_transient_object(c, &session, key_handle,
5095 params, param_count)))
5096 goto out;
5097
5098 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5099 ta_crypt_cmd_set_operation_key(c, &session, op, key_handle)))
5100 goto out;
5101
5102 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5103 ta_crypt_cmd_free_transient_object(c, & session, key_handle)))
5104 goto out;
5105
5106 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5107 ta_crypt_cmd_allocate_transient_object(c, &session,
5108 TEE_TYPE_GENERIC_SECRET, derive_key_max_keysize,
5109 &sv_handle)))
5110 goto out;
5111
Pascal Brand2b92b642015-07-16 13:29:42 +02005112 /* reuse but reset params and param-count */
Pascal Brandc639ac82015-07-02 08:53:34 +02005113 param_count = 0;
5114
5115 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PUBLIC_VALUE,
5116 ARRAY(derive_key_dh_public_value_2));
5117
5118 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5119 ta_crypt_cmd_derive_key(c, &session, op, sv_handle, params,
5120 param_count)))
5121 goto out;
5122
5123 out_size = sizeof(out);
5124 memset(out, 0, sizeof(out));
5125 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5126 ta_crypt_cmd_get_object_buffer_attribute(c, &session, sv_handle,
5127 TEE_ATTR_SECRET_VALUE, out, &out_size)))
5128 goto out;
5129
5130 if (!ADBG_EXPECT_BUFFER(c, derive_key_dh_shared_secret,
5131 sizeof(derive_key_dh_shared_secret), out,
5132 out_size))
5133 goto out;
5134
5135 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5136 ta_crypt_cmd_free_operation(c, &session, op)))
5137 goto out;
5138
5139 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5140 ta_crypt_cmd_free_transient_object(c, &session, sv_handle)))
5141 goto out;
5142out:
5143 Do_ADBG_EndSubCase(c, "Derive DH key success");
5144 TEEC_CloseSession(&session);
5145}
Jens Wiklander14f48872018-06-29 15:30:13 +02005146ADBG_CASE_DEFINE(regression, 4008, xtest_tee_test_4008,
5147 "Test TEE Internal API Derive key");
Pascal Brand2b92b642015-07-16 13:29:42 +02005148
5149static void xtest_tee_test_4009(ADBG_Case_t *c)
5150{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005151 TEEC_Session session = { };
5152 uint32_t ret_orig = 0;
5153 TEE_OperationHandle op = TEE_HANDLE_NULL;
5154 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
5155 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
5156 TEE_Attribute params[4] = { };
Pascal Brand2b92b642015-07-16 13:29:42 +02005157 size_t param_count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005158 uint8_t out[2048] = { };
5159 size_t out_size = 0;
5160 uint32_t size_bytes = 0;
5161 uint32_t i = 0;
Ruchika Gupta454b0b62020-10-30 13:23:19 +05305162 struct derive_key_ecdh_t const *pt = NULL;
Pascal Brand2b92b642015-07-16 13:29:42 +02005163
5164 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5165 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5166 &ret_orig)))
5167 return;
5168
5169 for (i = 0; i < ARRAY_SIZE(derive_key_ecdh); i++) {
5170 pt = &derive_key_ecdh[i];
5171
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02005172 if (pt->level > level)
5173 continue;
5174
Pascal Brand2b92b642015-07-16 13:29:42 +02005175 Do_ADBG_BeginSubCase(c, "Derive ECDH key - algo = 0x%x",
5176 pt->algo);
5177 size_bytes = (pt->keysize + 7) / 8;
5178 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5179 ta_crypt_cmd_allocate_operation(c, &session, &op,
5180 pt->algo,
5181 TEE_MODE_DERIVE, pt->keysize)))
5182 goto out;
5183
5184 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5185 ta_crypt_cmd_allocate_transient_object(c, & session,
5186 TEE_TYPE_ECDH_KEYPAIR, pt->keysize,
5187 &key_handle)))
5188 goto out;
5189
5190 param_count = 0;
5191 xtest_add_attr_value(&param_count, params,
5192 TEE_ATTR_ECC_CURVE, pt->curve, 0);
5193 xtest_add_attr(&param_count, params,
5194 TEE_ATTR_ECC_PRIVATE_VALUE,
5195 pt->private, size_bytes);
5196 /*
Cedric Auger719047c2019-09-11 12:08:14 +02005197 * The public value is not used, but we should provide a valid
5198 * one to avoid rejection in case TEE_PopulateTransientObject()
5199 * checks for key validity.
Pascal Brand2b92b642015-07-16 13:29:42 +02005200 */
5201 xtest_add_attr(&param_count, params,
Cedric Auger719047c2019-09-11 12:08:14 +02005202 TEE_ATTR_ECC_PUBLIC_VALUE_X,
5203 pt->public_x, size_bytes);
Pascal Brand2b92b642015-07-16 13:29:42 +02005204 xtest_add_attr(&param_count, params,
Cedric Auger719047c2019-09-11 12:08:14 +02005205 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5206 pt->public_y, size_bytes);
Pascal Brand2b92b642015-07-16 13:29:42 +02005207
5208 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5209 ta_crypt_cmd_populate_transient_object(c,
5210 &session,
5211 key_handle, params, param_count)))
5212 goto out;
5213
5214 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5215 ta_crypt_cmd_set_operation_key(c, &session, op,
5216 key_handle)))
5217 goto out;
5218
5219 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5220 ta_crypt_cmd_free_transient_object(c, & session,
5221 key_handle)))
5222 goto out;
5223
5224 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5225 ta_crypt_cmd_allocate_transient_object(c, &session,
5226 TEE_TYPE_GENERIC_SECRET, size_bytes * 8,
5227 &sv_handle)))
5228 goto out;
5229
5230 /* reuse but reset params and param-count */
5231 param_count = 0;
5232
5233 xtest_add_attr(&param_count, params,
5234 TEE_ATTR_ECC_PUBLIC_VALUE_X,
5235 pt->public_x, size_bytes);
5236 xtest_add_attr(&param_count, params,
5237 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5238 pt->public_y, size_bytes);
5239
5240 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5241 ta_crypt_cmd_derive_key(c, &session, op, sv_handle,
5242 params, param_count)))
5243 goto out;
5244
5245 out_size = sizeof(out);
5246 memset(out, 0, sizeof(out));
5247 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5248 ta_crypt_cmd_get_object_buffer_attribute(c, &session,
5249 sv_handle,
5250 TEE_ATTR_SECRET_VALUE, out, &out_size)))
5251 goto out;
5252
5253 if (!ADBG_EXPECT_BUFFER(c, pt->out, size_bytes,
5254 out, out_size))
5255 goto out;
5256
5257 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5258 ta_crypt_cmd_free_operation(c, &session, op)))
5259 goto out;
5260
5261 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5262 ta_crypt_cmd_free_transient_object(c, &session,
5263 sv_handle)))
5264 goto out;
5265
5266 Do_ADBG_EndSubCase(c, "Derive ECDH key - algo = 0x%x",
5267 pt->algo);
5268 }
5269
5270 goto noerror;
5271
5272out:
5273 Do_ADBG_EndSubCase(c, "Derive ECDH key - algo = 0x%x", pt->algo);
5274
5275noerror:
5276 TEEC_CloseSession(&session);
5277}
Jens Wiklander14f48872018-06-29 15:30:13 +02005278ADBG_CASE_DEFINE(regression, 4009, xtest_tee_test_4009,
5279 "Test TEE Internal API Derive key ECDH");
Jens Wiklander70a0b2c2016-05-18 08:39:35 +02005280
5281static void xtest_tee_test_4010(ADBG_Case_t *c)
5282{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005283 TEEC_Session session = { };
5284 uint32_t ret_orig = 0;
5285 TEE_ObjectHandle o = TEE_HANDLE_NULL;
Jens Wiklander70a0b2c2016-05-18 08:39:35 +02005286 static const uint8_t large_key[1024] = { 1, 2, 3, 4, 5, 6 };
5287 static const TEE_Attribute attr = {
5288 .attributeID = TEE_ATTR_SECRET_VALUE,
5289 .content.ref.buffer = (void *)large_key,
5290 .content.ref.length = sizeof(large_key),
5291 };
5292
5293 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5294 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5295 &ret_orig)))
5296 return;
5297
5298 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5299 ta_crypt_cmd_allocate_transient_object(c, &session,
5300 TEE_TYPE_HMAC_SHA256, 1024, &o)))
5301 goto out;
5302
5303 ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_TARGET_DEAD,
5304 ta_crypt_cmd_populate_transient_object(c, &session, o,
5305 &attr, 1));
5306
5307out:
5308 TEEC_CloseSession(&session);
5309}
Jens Wiklander14f48872018-06-29 15:30:13 +02005310ADBG_CASE_DEFINE(regression, 4010, xtest_tee_test_4010,
5311 "Test TEE Internal API create transient object (negative)");
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005312
5313static void xtest_tee_test_4011(ADBG_Case_t *c)
5314{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005315 TEEC_Session s = { };
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005316 size_t key_size = 512;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005317 TEE_ObjectHandle key = TEE_HANDLE_NULL;
5318 TEE_OperationHandle ops = TEE_HANDLE_NULL;
5319 TEE_OperationHandle opv = TEE_HANDLE_NULL;
5320 TEE_OperationHandle ope = TEE_HANDLE_NULL;
5321 TEE_OperationHandle opd = TEE_HANDLE_NULL;
5322 uint32_t ret_orig = 0;
5323 uint8_t in[TEE_SHA1_HASH_SIZE] = { };
5324 uint8_t out[1024] = { };
5325 uint8_t tmp[1024] = { };
5326 size_t out_size = 0;
5327 size_t tmp_size = 0;
5328 size_t n = 0;
5329 size_t m = 0;
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005330 size_t i = 0;
5331
5332 /* Setup session, initialize message to sign, create a keypair */
5333 if (!ADBG_EXPECT_TEEC_SUCCESS(c, xtest_teec_open_session(&s,
5334 &crypt_user_ta_uuid, NULL, &ret_orig)))
5335 return;
5336 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_random_number_generate(c,
5337 &s, in, sizeof(in))))
5338 goto out;
5339 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_transient_object(
5340 c, &s, TEE_TYPE_RSA_KEYPAIR, key_size, &key)))
5341 goto out;
5342 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_generate_key(c, &s,
5343 key, key_size, NULL, 0)))
5344 goto out;
5345
5346 /* Allocate operations for sign, verify, encrypt and decrypt */
5347 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
5348 &ops, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
5349 key_size)))
5350 goto out;
5351 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
5352 &opv, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
5353 key_size)))
5354 goto out;
5355 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
5356 &ope, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT, key_size)))
5357 goto out;
5358 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
5359 &opd, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT, key_size)))
5360 goto out;
5361
5362 /* Assign the keypair to all operations */
5363 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5364 ta_crypt_cmd_set_operation_key(c, &s, ops, key)))
5365 goto out;
5366 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5367 ta_crypt_cmd_set_operation_key(c, &s, opv, key)))
5368 goto out;
5369 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5370 ta_crypt_cmd_set_operation_key(c, &s, ope, key)))
5371 goto out;
5372 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5373 ta_crypt_cmd_set_operation_key(c, &s, opd, key)))
5374 goto out;
5375
5376 /*
5377 * The core of the test case is inspired by the one in libtomcrypt:
5378 * https://github.com/libtom/libtomcrypt/blob/6ad52252688bb34f90b5e79da4830a927e87b81f/testprof/rsa_test.c#L398
5379 *
5380 * Testcase for Bleichenbacher attack
5381 *
5382 * (1) Create a valid signature
5383 * (2) Check that it can be verified
5384 * (3) Transform the package to fetch plain text (using the encrypt
5385 * operation in GP TEE Internal API)
5386 * (4) Forge the structure of PKCS#1-EMSA encoded data
5387 * (4.1) Search for start and end of the padding string
5388 * (4.2) Move the signature to the front of the padding string
5389 * (4.3) Zero the message until the end
5390 * (5) Transform the package back (using the decrypt operation in
5391 * GP TEE Internal API)
5392 * (6) The result should not be valid if the implementation is robust.
5393 */
5394
5395
5396 for (i = 0; i < 9; i++) {
5397 Do_ADBG_Log("Iteration %zu", i);
5398
5399 /* 1 */
5400 out_size = sizeof(out);
5401 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5402 ta_crypt_cmd_asymmetric_sign(c, &s, ops, NULL, 0,
5403 in, sizeof(in), out, &out_size)))
5404 goto out;
5405
5406 /* 2 */
5407 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5408 ta_crypt_cmd_asymmetric_verify(c, &s, opv, NULL, 0,
5409 in, sizeof(in), out, out_size)))
5410 goto out;
5411
5412 /* 3 */
5413 tmp_size = sizeof(tmp);
5414 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5415 ta_crypt_cmd_asymmetric_encrypt(c, &s, ope, NULL, 0,
5416 out, out_size, tmp, &tmp_size)))
5417 goto out;
5418
Etienne Carriere0953bf02018-12-21 15:36:25 +01005419 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, tmp_size, <=, sizeof(tmp)))
5420 goto out;
5421
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005422 /* 4.1 */
Etienne Carriere0953bf02018-12-21 15:36:25 +01005423 for (n = 0; n < tmp_size - i; n++)
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005424 if (tmp[n] == 0xff)
5425 break;
Etienne Carriere0953bf02018-12-21 15:36:25 +01005426
5427 /* Shall find at least a padding start before buffer end */
5428 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, n, <, tmp_size - i - 1))
5429 goto out;
5430
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005431 for (m = n + 1; m < tmp_size; m++)
5432 if (tmp[m] != 0xff)
5433 break;
Etienne Carriere0953bf02018-12-21 15:36:25 +01005434
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005435 /* 4.2 */
5436 memmove(tmp + n + i, tmp + m, tmp_size - m);
Etienne Carriere0953bf02018-12-21 15:36:25 +01005437
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005438 /* 4.3 */
Etienne Carriere0953bf02018-12-21 15:36:25 +01005439 n = n + i + tmp_size - m;
Etienne Carriereacb81c42020-04-24 14:58:58 +02005440
5441 /* Prevent overrun when zeroing buffer end */
5442 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, n, <=, tmp_size))
5443 goto out;
5444
Etienne Carriere0953bf02018-12-21 15:36:25 +01005445 memset(tmp + n, 0, tmp_size - n);
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005446
5447 /* 5 */
5448 out_size = sizeof(out);
5449 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5450 ta_crypt_cmd_asymmetric_decrypt(c, &s, opd, NULL, 0,
5451 tmp, tmp_size, out, &out_size)))
5452 goto out;
5453
5454 /* 6 */
5455 if (!ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_SIGNATURE_INVALID,
5456 ta_crypt_cmd_asymmetric_verify(c, &s, opv, NULL, 0,
5457 in, sizeof(in), out, out_size)))
5458 goto out;
5459 }
5460
5461out:
5462 TEEC_CloseSession(&s);
5463}
Jens Wiklander14f48872018-06-29 15:30:13 +02005464ADBG_CASE_DEFINE(regression, 4011, xtest_tee_test_4011,
5465 "Test TEE Internal API Bleichenbacher attack (negative)");
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005466
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005467static void xtest_tee_test_4012(ADBG_Case_t *c)
5468{
Jens Wiklanderc44350d2022-12-02 20:56:49 +01005469 TEEC_Result res = TEEC_SUCCESS;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005470 TEEC_Session session = { };
5471 uint32_t ret_orig = 0;
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005472 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
5473 /* Fortuna PRNG requires seed <= 32 bytes */
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005474 uint8_t pool_input[32] = { };
5475 time_t t = 0;
5476 struct tm tm_local = { };
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005477
5478 t = time(NULL);
5479 tm_local = *localtime(&t);
5480
5481 memcpy((void *)pool_input, (void *)&tm_local,
5482 sizeof(pool_input) < sizeof(tm_local) ?
5483 sizeof(pool_input) : sizeof(tm_local));
5484
5485
5486 op.params[0].tmpref.buffer = pool_input;
5487 op.params[0].tmpref.size = sizeof(pool_input);
5488 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
5489 TEEC_NONE,
5490 TEEC_NONE,
5491 TEEC_NONE);
5492 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5493 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5494 &ret_orig)))
5495 return;
5496
Jens Wiklanderc44350d2022-12-02 20:56:49 +01005497 res = TEEC_InvokeCommand(&session, TA_CRYPT_CMD_SEED_RNG_POOL,
5498 &op, &ret_orig);
5499 if (res == TEEC_ERROR_ITEM_NOT_FOUND &&
5500 ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, ret_orig,
5501 TEEC_ORIGIN_TRUSTED_APP))
5502 Do_ADBG_Log("System PTA not available, skipping test 4012");
5503 else
5504 ADBG_EXPECT_TEEC_SUCCESS(c, res);
5505
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005506 TEEC_CloseSession(&session);
5507}
Jens Wiklander14f48872018-06-29 15:30:13 +02005508ADBG_CASE_DEFINE(regression, 4012, xtest_tee_test_4012,
5509 "Test seeding RNG entropy");
Joakim Bech83a30ca2019-05-29 11:22:27 +02005510
5511static void xtest_tee_test_4013(ADBG_Case_t *c)
5512{
Jens Wiklanderc44350d2022-12-02 20:56:49 +01005513 TEEC_Result res = TEEC_SUCCESS;
Joakim Bech83a30ca2019-05-29 11:22:27 +02005514 TEEC_Session session = { };
5515 uint32_t ret_orig = 0;
5516 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
5517 uint8_t key[32] = { };
5518 uint8_t extra_data[32] = { };
5519
5520 op.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
5521 TEEC_NONE,
5522 TEEC_NONE,
5523 TEEC_NONE);
5524 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5525 xtest_teec_open_session(&session, &crypt_user_ta_uuid,
5526 NULL, &ret_orig)))
5527 return;
5528
Jens Wiklanderc44350d2022-12-02 20:56:49 +01005529 res = TEEC_InvokeCommand(&session, TA_CRYPT_CMD_DERIVE_TA_UNIQUE_KEY,
5530 &op, &ret_orig);
5531 if (res == TEEC_ERROR_ITEM_NOT_FOUND &&
5532 ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, ret_orig,
5533 TEEC_ORIGIN_TRUSTED_APP)) {
5534 Do_ADBG_Log("System PTA not available, skipping test 4013");
5535 goto out;
5536 }
5537 ADBG_EXPECT_TEEC_SUCCESS(c, res);
Joakim Bech83a30ca2019-05-29 11:22:27 +02005538
5539 /* Negative test using non-secure memory */
5540 memset(&op, 0, sizeof(op));
5541 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
5542 TEEC_MEMREF_TEMP_OUTPUT,
5543 TEEC_NONE,
5544 TEEC_NONE);
5545
5546 op.params[0].tmpref.buffer = extra_data;
5547 op.params[0].tmpref.size = sizeof(extra_data);
5548 op.params[1].tmpref.buffer = key;
5549 op.params[1].tmpref.size = sizeof(key);
5550 (void)ADBG_EXPECT_TEEC_RESULT(c,
5551 TEEC_ERROR_SECURITY,
5552 TEEC_InvokeCommand(&session,
5553 TA_CRYPT_CMD_DERIVE_TA_UNIQUE_KEY_SHM,
5554 &op,
5555 &ret_orig));
5556
Jens Wiklanderc44350d2022-12-02 20:56:49 +01005557out:
Joakim Bech83a30ca2019-05-29 11:22:27 +02005558 TEEC_CloseSession(&session);
5559}
5560ADBG_CASE_DEFINE(regression, 4013, xtest_tee_test_4013,
5561 "Test generation of device unique TA keys");
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005562
5563static void xtest_tee_test_4014(ADBG_Case_t *c)
5564{
5565 TEEC_Session session = { };
5566 uint32_t ret_orig = 0;
5567 TEE_OperationHandle op = TEE_HANDLE_NULL;
5568 TEE_ObjectHandle keyA = TEE_HANDLE_NULL;
5569 TEE_ObjectHandle eph_keyA = TEE_HANDLE_NULL;
5570 TEE_ObjectHandle keyB = TEE_HANDLE_NULL;
5571 TEE_ObjectHandle eph_keyB = TEE_HANDLE_NULL;
5572 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
5573 TEE_Attribute params[9] = { };
5574 size_t param_count = 0;
5575 uint8_t out[128] = { };
5576 size_t out_size = 0;
5577 uint8_t conf_A[32] = { };
5578 uint8_t conf_B[32] = { };
5579
5580 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5581 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5582 &ret_orig)))
5583 return;
5584
5585 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_SM2_KEP,
5586 TEE_ECC_CURVE_SM2)) {
5587 Do_ADBG_Log("SM2 KEP not supported: skip subcase");
5588 goto out;
5589 }
5590
5591 Do_ADBG_BeginSubCase(c, "Initiator side");
5592
5593 /*
5594 * Key exchange protocol running on user A's side. A is initiator.
5595 */
5596
5597 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5598 ta_crypt_cmd_allocate_operation(c, &session, &op,
5599 TEE_ALG_SM2_KEP, TEE_MODE_DERIVE, 512)))
5600 goto out;
5601
5602 /* Allocate and initialize keypair of user A */
5603
5604 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5605 ta_crypt_cmd_allocate_transient_object(c, &session,
5606 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &keyA)))
5607 goto out;
5608
5609 param_count = 0;
5610
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005611 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5612 ARRAY(gmt_003_part5_b2_public_xA));
5613
5614 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5615 ARRAY(gmt_003_part5_b2_public_yA));
5616
5617 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5618 ARRAY(gmt_003_part5_b2_private_A));
5619
5620 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5621 ta_crypt_cmd_populate_transient_object(c, &session, keyA,
5622 params, param_count)))
5623 goto out;
5624
5625 /*
5626 * Allocate and set ephemeral key of user A. Note: it is a regular ECC
5627 * key -- we don't use the *_EPHEMERAL_* attributes flags which are
5628 * reserved for use in TEE_DeriveKey() to pass the ephermeral key of
5629 * user B.
5630 */
5631
5632 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5633 ta_crypt_cmd_allocate_transient_object(c, &session,
5634 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &eph_keyA)))
5635 goto out;
5636
5637 param_count = 0;
5638
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005639 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5640 ARRAY(gmt_003_part5_b2_eph_public_xA));
5641
5642 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5643 ARRAY(gmt_003_part5_b2_eph_public_yA));
5644
5645 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5646 ARRAY(gmt_003_part5_b2_eph_private_A));
5647
5648 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5649 ta_crypt_cmd_populate_transient_object(c, &session, eph_keyA,
5650 params, param_count)))
5651 goto out;
5652
5653 /* Associate user A keys with operation */
5654
5655 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5656 ta_crypt_cmd_set_operation_key2(c, &session, op, keyA,
5657 eph_keyA)))
5658 goto out;
5659
5660 /* Keys have been set, free key objects */
5661
5662 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5663 ta_crypt_cmd_free_transient_object(c, &session, keyA)))
5664 goto out;
5665
5666 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5667 ta_crypt_cmd_free_transient_object(c, &session, eph_keyA)))
5668 goto out;
5669
5670 /* Allocate output object */
5671
5672 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5673 ta_crypt_cmd_allocate_transient_object(c, &session,
5674 TEE_TYPE_GENERIC_SECRET,
5675 sizeof(gmt_003_part5_b2_shared_secret),
5676 &sv_handle)))
5677 goto out;
5678
5679 /* Set key derivation parameters: user A role, user B information */
5680
5681 params[0].attributeID = TEE_ATTR_SM2_KEP_USER;
5682 params[0].content.value.a = 0; /* Initiator role */
5683 params[0].content.value.b = 0; /* Not used */
5684 param_count = 1;
5685
5686 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5687 ARRAY(gmt_003_part5_b2_public_xB));
5688
5689 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5690 ARRAY(gmt_003_part5_b2_public_yB));
5691
5692 xtest_add_attr(&param_count, params,
5693 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_X,
5694 ARRAY(gmt_003_part5_b2_eph_public_xB));
5695
5696 xtest_add_attr(&param_count, params,
5697 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_Y,
5698 ARRAY(gmt_003_part5_b2_eph_public_yB));
5699
5700 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_INITIATOR,
5701 ARRAY(gmt_003_part5_b2_id_A));
5702
5703 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_RESPONDER,
5704 ARRAY(gmt_003_part5_b2_id_B));
5705
5706 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_IN,
5707 ARRAY(gmt_003_part5_b2_conf_B));
5708
5709 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_OUT,
5710 ARRAY(conf_A));
5711
5712 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5713 ta_crypt_cmd_derive_key(c, &session, op, sv_handle, params,
5714 param_count)))
5715 goto out;
5716
5717 out_size = sizeof(out);
5718 memset(out, 0, sizeof(out));
5719 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5720 ta_crypt_cmd_get_object_buffer_attribute(c, &session, sv_handle,
5721 TEE_ATTR_SECRET_VALUE, out, &out_size)))
5722 goto out;
5723
5724 /* Check derived key */
5725 if (!ADBG_EXPECT_BUFFER(c, gmt_003_part5_b2_shared_secret,
5726 sizeof(gmt_003_part5_b2_shared_secret), out,
5727 out_size))
5728 goto out;
5729
5730 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5731 ta_crypt_cmd_free_operation(c, &session, op)))
5732 goto out;
5733
5734 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5735 ta_crypt_cmd_free_transient_object(c, &session, sv_handle)))
5736 goto out;
5737
5738 Do_ADBG_EndSubCase(c, "Initiator side");
5739
5740 Do_ADBG_BeginSubCase(c, "Responder side");
5741
5742 /*
5743 * Key derivation on user B's side
5744 */
5745
5746 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5747 ta_crypt_cmd_allocate_operation(c, &session, &op,
5748 TEE_ALG_SM2_KEP, TEE_MODE_DERIVE, 512)))
5749 goto out;
5750
5751 /* Allocate and initialize keypair of user B */
5752
5753 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5754 ta_crypt_cmd_allocate_transient_object(c, &session,
5755 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &keyB)))
5756 goto out;
5757
5758 param_count = 0;
5759
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005760 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5761 ARRAY(gmt_003_part5_b2_public_xB));
5762
5763 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5764 ARRAY(gmt_003_part5_b2_public_yB));
5765
5766 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5767 ARRAY(gmt_003_part5_b2_private_B));
5768
5769 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5770 ta_crypt_cmd_populate_transient_object(c, &session, keyB,
5771 params, param_count)))
5772 goto out;
5773
5774 /* Allocate and set ephemeral key of user B */
5775
5776 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5777 ta_crypt_cmd_allocate_transient_object(c, &session,
5778 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &eph_keyB)))
5779 goto out;
5780
5781 param_count = 0;
5782
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005783 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5784 ARRAY(gmt_003_part5_b2_eph_public_xB));
5785
5786 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5787 ARRAY(gmt_003_part5_b2_eph_public_yB));
5788
5789 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5790 ARRAY(gmt_003_part5_b2_eph_private_B));
5791
5792 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5793 ta_crypt_cmd_populate_transient_object(c, &session, eph_keyB,
5794 params, param_count)))
5795 goto out;
5796
5797 /* Associate user B keys with operation */
5798
5799 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5800 ta_crypt_cmd_set_operation_key2(c, &session, op, keyB,
5801 eph_keyB)))
5802 goto out;
5803
5804 /* Keys have been set, free key objects */
5805
5806 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5807 ta_crypt_cmd_free_transient_object(c, &session, keyB)))
5808 goto out;
5809
5810 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5811 ta_crypt_cmd_free_transient_object(c, &session, eph_keyB)))
5812 goto out;
5813
5814 /* Allocate output object */
5815
5816 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5817 ta_crypt_cmd_allocate_transient_object(c, &session,
5818 TEE_TYPE_GENERIC_SECRET,
5819 sizeof(gmt_003_part5_b2_shared_secret),
5820 &sv_handle)))
5821 goto out;
5822
5823 /* Set key derivation parameters: user B role, user A information */
5824
5825 params[0].attributeID = TEE_ATTR_SM2_KEP_USER;
5826 params[0].content.value.a = 1; /* Responder role */
5827 params[0].content.value.b = 0; /* Not used */
5828 param_count = 1;
5829
5830 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5831 ARRAY(gmt_003_part5_b2_public_xA));
5832
5833 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5834 ARRAY(gmt_003_part5_b2_public_yA));
5835
5836 xtest_add_attr(&param_count, params,
5837 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_X,
5838 ARRAY(gmt_003_part5_b2_eph_public_xA));
5839
5840 xtest_add_attr(&param_count, params,
5841 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_Y,
5842 ARRAY(gmt_003_part5_b2_eph_public_yA));
5843
5844 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_INITIATOR,
5845 ARRAY(gmt_003_part5_b2_id_A));
5846
5847 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_RESPONDER,
5848 ARRAY(gmt_003_part5_b2_id_B));
5849
5850 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_IN,
5851 ARRAY(gmt_003_part5_b2_conf_A));
5852
5853 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_OUT,
5854 ARRAY(conf_B));
5855
5856 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5857 ta_crypt_cmd_derive_key(c, &session, op, sv_handle, params,
5858 param_count)))
5859 goto out;
5860
5861 out_size = sizeof(out);
5862 memset(out, 0, sizeof(out));
5863 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5864 ta_crypt_cmd_get_object_buffer_attribute(c, &session, sv_handle,
5865 TEE_ATTR_SECRET_VALUE, out, &out_size)))
5866 goto out;
5867
5868 /* Check derived key */
5869 if (!ADBG_EXPECT_BUFFER(c, gmt_003_part5_b2_shared_secret,
5870 sizeof(gmt_003_part5_b2_shared_secret), out,
5871 out_size))
5872 goto out;
5873
5874 Do_ADBG_EndSubCase(c, "Responder side");
5875
5876out:
5877 TEEC_CloseSession(&session);
5878}
5879ADBG_CASE_DEFINE(regression, 4014, xtest_tee_test_4014,
5880 "Test SM2 KEP (key derivation)");
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03005881
5882static void xtest_tee_test_4015(ADBG_Case_t *c)
5883{
5884 TEEC_Session session = { };
5885 uint32_t ret_orig = 0;
5886 TEE_OperationHandle op = TEE_HANDLE_NULL;
5887 TEE_ObjectHandle key_alice = TEE_HANDLE_NULL;
5888 TEE_ObjectHandle key_bob = TEE_HANDLE_NULL;
5889 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
5890 TEE_Attribute params[2] = { };
5891 size_t param_count = 0;
5892 uint8_t out[32] = { };
5893 size_t out_size = 0;
5894 char case_str[40] = "Alice side computes shared secret";
5895
5896 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5897 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5898 &ret_orig)))
5899 return;
5900
5901 Do_ADBG_BeginSubCase(c, "%s", case_str);
5902
5903 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_X25519,
5904 TEE_ECC_CURVE_25519)) {
5905 Do_ADBG_Log("X25519 not supported: skip subcase");
5906 goto out;
5907 }
5908
5909 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5910 ta_crypt_cmd_allocate_operation(c, &session, &op,
5911 TEE_ALG_X25519, TEE_MODE_DERIVE, 256)))
5912 goto out;
5913
5914 /* Allocate and initialize keypair of Alice */
5915 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5916 ta_crypt_cmd_allocate_transient_object(c, &session,
5917 TEE_TYPE_X25519_KEYPAIR, 256, &key_alice)))
5918 goto out;
5919
5920 param_count = 0;
5921
5922 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PUBLIC_VALUE,
5923 ARRAY(x25519_alice_public));
5924
5925 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PRIVATE_VALUE,
5926 ARRAY(x25519_alice_private));
5927
5928 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5929 ta_crypt_cmd_populate_transient_object(c, &session,
5930 key_alice, params, param_count)))
5931 goto out;
5932
5933 /* Associate Alices's keys with operation */
5934 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5935 ta_crypt_cmd_set_operation_key(c, &session, op,
5936 key_alice)))
5937 goto out;
5938
5939 /* Keys have been set, free key objects */
5940 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5941 ta_crypt_cmd_free_transient_object(c, &session,
5942 key_alice)))
5943 goto out;
5944
5945 /* Allocate shared secret output object */
5946 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5947 ta_crypt_cmd_allocate_transient_object(c, &session,
5948 TEE_TYPE_GENERIC_SECRET,
5949 sizeof(x25519_shared_secret), &sv_handle)))
5950 goto out;
5951
5952 /* Reset params */
5953 param_count = 0;
5954
5955 /* Set Bob's public key for Alice side */
5956 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PUBLIC_VALUE,
5957 ARRAY(x25519_bob_public));
5958
5959 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5960 ta_crypt_cmd_derive_key(c, &session, op, sv_handle,
5961 params, param_count)))
5962 goto out;
5963
5964 out_size = sizeof(out);
5965 memset(out, 0, sizeof(out));
5966 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5967 ta_crypt_cmd_get_object_buffer_attribute(c, &session,
5968 sv_handle, TEE_ATTR_SECRET_VALUE, out,
5969 &out_size)))
5970 goto out;
5971
5972 /* Check derived key */
5973 if (!ADBG_EXPECT_BUFFER(c, x25519_shared_secret,
5974 sizeof(x25519_shared_secret), out,
5975 out_size))
5976 goto out;
5977
5978 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5979 ta_crypt_cmd_free_operation(c, &session, op)))
5980 goto out;
5981
5982 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5983 ta_crypt_cmd_free_transient_object(c, &session,
5984 sv_handle)))
5985 goto out;
5986
5987 Do_ADBG_EndSubCase(c, "%s", case_str);
5988
5989 strncpy(case_str, "Bob side computes shared secret",
5990 sizeof(case_str) - 1);
5991
5992 Do_ADBG_BeginSubCase(c, "%s", case_str);
5993
5994 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5995 ta_crypt_cmd_allocate_operation(c, &session, &op,
5996 TEE_ALG_X25519, TEE_MODE_DERIVE, 256)))
5997 goto out;
5998
5999 /* Allocate and initialize keypair of Bob */
6000 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6001 ta_crypt_cmd_allocate_transient_object(c, &session,
6002 TEE_TYPE_X25519_KEYPAIR, 256, &key_bob)))
6003 goto out;
6004
6005 /* Reset params */
6006 param_count = 0;
6007
6008 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PUBLIC_VALUE,
6009 ARRAY(x25519_bob_public));
6010
6011 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PRIVATE_VALUE,
6012 ARRAY(x25519_bob_private));
6013
6014 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6015 ta_crypt_cmd_populate_transient_object(c, &session,
6016 key_bob, params, param_count)))
6017 goto out;
6018
6019 /* Associate Bob's keys with operation */
6020 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6021 ta_crypt_cmd_set_operation_key(c, &session, op,
6022 key_bob)))
6023 goto out;
6024
6025 /* Keys have been set, free key objects */
6026 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6027 ta_crypt_cmd_free_transient_object(c, &session,
6028 key_bob)))
6029 goto out;
6030
6031 /* Allocate shared secret output object */
6032 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6033 ta_crypt_cmd_allocate_transient_object(c, &session,
6034 TEE_TYPE_GENERIC_SECRET,
6035 sizeof(x25519_shared_secret), &sv_handle)))
6036 goto out;
6037
6038 /* Reset params */
6039 param_count = 0;
6040
6041 /* Set Alice's public key for Bob side */
6042 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PUBLIC_VALUE,
6043 ARRAY(x25519_alice_public));
6044
6045 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6046 ta_crypt_cmd_derive_key(c, &session, op, sv_handle,
6047 params, param_count)))
6048 goto out;
6049
6050 out_size = sizeof(out);
6051 memset(out, 0, sizeof(out));
6052 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6053 ta_crypt_cmd_get_object_buffer_attribute(c, &session,
6054 sv_handle, TEE_ATTR_SECRET_VALUE, out,
6055 &out_size)))
6056 goto out;
6057
6058 /* Check derived key */
6059 if (!ADBG_EXPECT_BUFFER(c, x25519_shared_secret,
6060 sizeof(x25519_shared_secret), out,
6061 out_size))
6062 goto out;
6063
6064 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6065 ta_crypt_cmd_free_operation(c, &session, op)))
6066 goto out;
6067
6068 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6069 ta_crypt_cmd_free_transient_object(c, &session,
6070 sv_handle)))
6071 goto out;
6072
6073out:
6074 Do_ADBG_EndSubCase(c, "%s", case_str);
6075 TEEC_CloseSession(&session);
6076}
6077ADBG_CASE_DEFINE(regression, 4015, xtest_tee_test_4015,
6078 "Test TEE Internal API Derive key X25519");
Valerii Chubarab9863c2022-08-12 07:42:29 +00006079
6080static void xtest_tee_test_4016_ed25519(ADBG_Case_t *c)
6081{
6082 TEEC_Session session = { };
6083 TEE_OperationHandle op = TEE_HANDLE_NULL;
6084 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
6085 TEE_Attribute key_attrs[2] = { };
6086 size_t num_key_attrs = 0;
6087 TEE_Attribute attrs[2] = { };
6088 size_t num_attrs = 0;
6089 uint8_t out[64] = { };
6090 size_t out_size = sizeof(out);
6091 size_t n = 0;
6092 uint32_t ret_orig = 0;
6093 size_t max_key_size = 0;
6094
6095 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6096 xtest_teec_open_session(&session, &crypt_user_ta_uuid,
6097 NULL, &ret_orig)))
6098 return;
6099
6100 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_ED25519,
6101 TEE_ECC_CURVE_25519)) {
6102 Do_ADBG_Log("ED25519 not supported: skip subcase");
6103 goto out;
6104 }
6105
6106 for (n = 0; n < ARRAY_SIZE(xtest_ac_eddsa_cases); n++) {
6107 const struct xtest_ac_case *tv = xtest_ac_eddsa_cases + n;
6108
6109 if (tv->algo != TEE_ALG_ED25519)
6110 continue;
6111
6112 num_attrs = 0;
6113 num_key_attrs = 0;
6114 max_key_size = tv->params.eddsa.private_len * 8;
6115
6116 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6117 ta_crypt_cmd_allocate_operation(c, &session, &op,
6118 TEE_ALG_ED25519, tv->mode, max_key_size)))
6119 goto out;
6120
6121 xtest_add_attr(&num_key_attrs, key_attrs,
6122 TEE_ATTR_ED25519_PUBLIC_VALUE,
6123 tv->params.eddsa.public,
6124 tv->params.eddsa.public_len);
6125
6126 if (tv->params.eddsa.flag == 1)
Jens Wiklander7596bd32022-12-02 15:43:37 +01006127 xtest_add_attr_value(&num_attrs, attrs,
6128 TEE_ATTR_EDDSA_PREHASH, 1, 0);
Valerii Chubarab9863c2022-08-12 07:42:29 +00006129
6130 if (tv->params.eddsa.context_len > 0)
6131 xtest_add_attr(&num_attrs, attrs, TEE_ATTR_EDDSA_CTX,
6132 tv->params.eddsa.context,
6133 tv->params.eddsa.context_len);
6134
6135 switch (tv->mode) {
6136 case TEE_MODE_SIGN:
6137 xtest_add_attr(&num_key_attrs, key_attrs,
6138 TEE_ATTR_ED25519_PRIVATE_VALUE,
6139 tv->params.eddsa.private,
6140 tv->params.eddsa.private_len);
6141
6142 if (!ADBG_EXPECT_TRUE(c,
6143 create_key(c, &session, max_key_size,
6144 TEE_TYPE_ED25519_KEYPAIR,
6145 key_attrs, num_key_attrs,
6146 &key_handle)))
6147 goto out;
6148
6149 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6150 ta_crypt_cmd_set_operation_key(c,
6151 &session, op, key_handle)))
6152 goto out;
6153
6154 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6155 ta_crypt_cmd_asymmetric_sign(c,
6156 &session, op,
6157 attrs, num_attrs, tv->ptx,
6158 tv->ptx_len, out, &out_size)))
6159 goto out;
6160
6161 ADBG_EXPECT_BUFFER(c, tv->ctx, tv->ctx_len, out, out_size);
6162
6163 break;
6164
6165 case TEE_MODE_VERIFY:
6166 if (!ADBG_EXPECT_TRUE(c,
6167 create_key(c, &session, max_key_size,
6168 TEE_TYPE_ED25519_PUBLIC_KEY,
6169 key_attrs, num_key_attrs,
6170 &key_handle)))
6171 goto out;
6172
6173 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6174 ta_crypt_cmd_set_operation_key(c,
6175 &session, op, key_handle)))
6176 goto out;
6177
6178 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6179 ta_crypt_cmd_asymmetric_verify(c, &session, op,
6180 attrs, num_attrs,
6181 tv->ptx,
6182 tv->ptx_len,
6183 tv->ctx,
6184 tv->ctx_len)))
6185 goto out;
6186 break;
6187
6188 default:
6189 break;
6190 }
6191
6192 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6193 ta_crypt_cmd_free_operation(c, &session, op)))
6194 goto out;
6195 }
6196out:
6197 TEEC_CloseSession(&session);
6198}
Jens Wiklander7b70ff82022-12-02 20:59:32 +01006199ADBG_CASE_DEFINE(regression, 4016, xtest_tee_test_4016_ed25519,
Valerii Chubarab9863c2022-08-12 07:42:29 +00006200 "Test TEE Internal API ED25519 sign/verify");