blob: e3db5d65a60d3fe8bb28706b8adc5d7aa04a0de7 [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;
2554};
2555
2556
2557#define ARRAY(a) a, ARRAY_SIZE(a)
2558#define NULL_ARRAY(a) NULL, 0
2559
2560#define XTEST_AE_CASE(algo, vect, aad_incr, in_incr, \
2561 aad_array, ptx_array, ctx_array) \
2562 { (algo), TEE_MODE_ENCRYPT, TEE_TYPE_AES, ARRAY(vect ## _key), \
2563 ARRAY(vect ## _nonce), (aad_incr), \
2564 aad_array(vect ## _aad), (in_incr), \
2565 ptx_array(vect ## _ptx), ctx_array(vect ## _ctx), \
2566 ARRAY(vect ## _tag), \
2567 __LINE__ }, \
2568 { (algo), TEE_MODE_DECRYPT, TEE_TYPE_AES, ARRAY(vect ## _key), \
2569 ARRAY(vect ## _nonce), (aad_incr), \
2570 aad_array(vect ## _aad), (in_incr), \
2571 ptx_array(vect ## _ptx), ctx_array(vect ## _ctx), \
2572 ARRAY(vect ## _tag), \
2573 __LINE__ }
2574
2575#define XTEST_AE_CASE_AES_CCM(vect, aad_incr, in_incr) \
2576 XTEST_AE_CASE(TEE_ALG_AES_CCM, ae_data_aes_ccm_ ## vect, aad_incr, \
2577 in_incr, ARRAY, ARRAY, ARRAY)
2578
2579#define XTEST_AE_CASE_AES_GCM(vect, aad_incr, in_incr, \
2580 aad_array, ptx_array, ctx_array) \
2581 XTEST_AE_CASE(TEE_ALG_AES_GCM, ae_data_aes_gcm_ ## vect, aad_incr, \
2582 in_incr, aad_array, ptx_array, ctx_array)
2583
2584
2585
2586static const struct xtest_ae_case ae_cases[] = {
2587 XTEST_AE_CASE_AES_CCM(vect1, 3, 2),
2588 XTEST_AE_CASE_AES_CCM(vect2, 7, 13),
2589 XTEST_AE_CASE_AES_CCM(vect3, 5, 21),
2590
2591 XTEST_AE_CASE_AES_GCM(vect1, 0, 0, NULL_ARRAY, NULL_ARRAY, NULL_ARRAY),
2592 XTEST_AE_CASE_AES_GCM(vect2, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2593 XTEST_AE_CASE_AES_GCM(vect3, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
Jens Wiklander9fc63f52017-11-10 11:13:26 +01002594 XTEST_AE_CASE_AES_GCM(vect3, 0, 0x1F, NULL_ARRAY, ARRAY, ARRAY),
2595 XTEST_AE_CASE_AES_GCM(vect4, 5, 0x20, ARRAY, ARRAY, ARRAY),
Pascal Brandc639ac82015-07-02 08:53:34 +02002596 XTEST_AE_CASE_AES_GCM(vect5, 5, 9, ARRAY, ARRAY, ARRAY),
2597 XTEST_AE_CASE_AES_GCM(vect6, 5, 9, ARRAY, ARRAY, ARRAY),
2598 XTEST_AE_CASE_AES_GCM(vect7, 0, 0, NULL_ARRAY, NULL_ARRAY, NULL_ARRAY),
2599 XTEST_AE_CASE_AES_GCM(vect8, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2600 XTEST_AE_CASE_AES_GCM(vect9, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2601 XTEST_AE_CASE_AES_GCM(vect10, 5, 9, ARRAY, ARRAY, ARRAY),
2602 XTEST_AE_CASE_AES_GCM(vect11, 5, 9, ARRAY, ARRAY, ARRAY),
2603 XTEST_AE_CASE_AES_GCM(vect12, 5, 9, ARRAY, ARRAY, ARRAY),
2604 XTEST_AE_CASE_AES_GCM(vect13, 0, 0, NULL_ARRAY, NULL_ARRAY, NULL_ARRAY),
2605 XTEST_AE_CASE_AES_GCM(vect14, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2606 XTEST_AE_CASE_AES_GCM(vect15, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2607 XTEST_AE_CASE_AES_GCM(vect16, 5, 9, ARRAY, ARRAY, ARRAY),
2608 XTEST_AE_CASE_AES_GCM(vect17, 5, 9, ARRAY, ARRAY, ARRAY),
2609 XTEST_AE_CASE_AES_GCM(vect18, 5, 9, ARRAY, ARRAY, ARRAY),
Jens Wiklanderf6efe242017-11-06 13:16:43 +01002610#ifdef CFG_GCM_NIST_VECTORS
2611#include "gcmDecrypt128.h"
2612#include "gcmDecrypt192.h"
2613#include "gcmDecrypt256.h"
2614#include "gcmEncryptExtIV128.h"
2615#include "gcmEncryptExtIV192.h"
2616#include "gcmEncryptExtIV256.h"
2617#endif
Pascal Brandc639ac82015-07-02 08:53:34 +02002618};
2619
2620static void xtest_tee_test_4005(ADBG_Case_t *c)
2621{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002622 TEEC_Session session = { };
2623 TEE_OperationHandle op = TEE_HANDLE_NULL;
Jens Wiklander7404c072020-12-15 08:06:32 +01002624 TEE_OperationHandle op2 = TEE_HANDLE_NULL;
Pascal Brandc639ac82015-07-02 08:53:34 +02002625 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002626 TEE_Attribute key_attr = { };
2627 uint8_t out[512] = { };
2628 size_t out_size = 0;
2629 size_t out_offs = 0;
Jens Wiklander7404c072020-12-15 08:06:32 +01002630 size_t out_offs2 = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002631 uint32_t ret_orig = 0;
2632 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02002633
2634 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2635 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
2636 &ret_orig)))
2637 return;
2638
2639 for (n = 0; n < ARRAY_SIZE(ae_cases); n++) {
2640 Do_ADBG_BeginSubCase(c, "AE case %d algo 0x%x line %d",
2641 (int)n, (unsigned int)ae_cases[n].algo,
2642 (int)ae_cases[n].line);
2643
2644 key_attr.attributeID = TEE_ATTR_SECRET_VALUE;
2645 key_attr.content.ref.buffer = (void *)ae_cases[n].key;
2646 key_attr.content.ref.length = ae_cases[n].key_len;
2647
2648 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2649 ta_crypt_cmd_allocate_operation(c, &session, &op,
2650 ae_cases[n].algo, ae_cases[n].mode,
2651 key_attr.content.ref.length * 8)))
2652 goto out;
2653
2654 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jens Wiklander7404c072020-12-15 08:06:32 +01002655 ta_crypt_cmd_allocate_operation(c, &session, &op2,
2656 ae_cases[n].algo, ae_cases[n].mode,
2657 key_attr.content.ref.length * 8)))
2658 goto out;
2659
2660 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc639ac82015-07-02 08:53:34 +02002661 ta_crypt_cmd_allocate_transient_object(c, &session,
2662 ae_cases[n].key_type,
2663 key_attr.content.ref.length * 8,
2664 &key_handle)))
2665 goto out;
2666
2667 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2668 ta_crypt_cmd_populate_transient_object(c, &session,
2669 key_handle, &key_attr, 1)))
2670 goto out;
2671
2672 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2673 ta_crypt_cmd_set_operation_key(c, &session, op,
2674 key_handle)))
2675 goto out;
2676
2677 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2678 ta_crypt_cmd_free_transient_object(c, &session,
2679 key_handle)))
2680 goto out;
2681 key_handle = TEE_HANDLE_NULL;
2682
2683 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2684 ta_crypt_cmd_ae_init(c, &session, op, ae_cases[n].nonce,
2685 ae_cases[n].nonce_len, ae_cases[n].tag_len,
2686 ae_cases[n].aad_len, ae_cases[n].ptx_len)))
2687 goto out;
2688
2689 if (ae_cases[n].aad != NULL) {
2690 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2691 ta_crypt_cmd_ae_update_aad(c, &session, op,
2692 ae_cases[n].aad, ae_cases[n].aad_incr)))
2693 goto out;
2694
2695 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2696 ta_crypt_cmd_ae_update_aad(c, &session, op,
2697 ae_cases[n].aad + ae_cases[n].aad_incr,
2698 ae_cases [n].aad_len -
2699 ae_cases[n].aad_incr)))
2700 goto out;
2701 }
2702
2703 out_offs = 0;
2704 out_size = sizeof(out);
2705 memset(out, 0, sizeof(out));
2706 if (ae_cases[n].mode == TEE_MODE_ENCRYPT) {
2707 if (ae_cases[n].ptx != NULL) {
2708 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2709 ta_crypt_cmd_ae_update(c, &session, op,
2710 ae_cases[n].ptx,
2711 ae_cases[n].in_incr, out,
2712 &out_size)))
2713 goto out;
2714 out_offs += out_size;
Jerome Forissierc13fafa2017-06-01 15:49:07 +02002715 if (ae_cases[n].algo == TEE_ALG_AES_GCM)
2716 ADBG_EXPECT_COMPARE_UNSIGNED(c,
2717 out_size, ==, ae_cases[n].in_incr);
Pascal Brandc639ac82015-07-02 08:53:34 +02002718 }
2719 } else {
2720 if (ae_cases[n].ctx != NULL) {
2721 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2722 ta_crypt_cmd_ae_update(c, &session, op,
2723 ae_cases[n].ctx,
2724 ae_cases[n].in_incr, out,
2725 &out_size)))
2726 goto out;
2727 out_offs += out_size;
Jerome Forissierc13fafa2017-06-01 15:49:07 +02002728 if (ae_cases[n].algo == TEE_ALG_AES_GCM)
2729 ADBG_EXPECT_COMPARE_UNSIGNED(c,
2730 out_size, ==, ae_cases[n].in_incr);
Pascal Brandc639ac82015-07-02 08:53:34 +02002731 }
2732 }
2733
Jens Wiklander7404c072020-12-15 08:06:32 +01002734 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2735 ta_crypt_cmd_copy_operation(c, &session, op2, op)))
2736 goto out;
2737
Pascal Brandc639ac82015-07-02 08:53:34 +02002738 out_size = sizeof(out) - out_offs;
Jens Wiklander7404c072020-12-15 08:06:32 +01002739 out_offs2 = out_offs;
Pascal Brandc639ac82015-07-02 08:53:34 +02002740 if (ae_cases[n].mode == TEE_MODE_ENCRYPT) {
2741 uint8_t out_tag[64];
2742 size_t out_tag_len = MIN(sizeof(out_tag),
2743 ae_cases[n].tag_len);
2744
2745 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2746 ta_crypt_cmd_ae_encrypt_final(c, &session, op,
2747 ae_cases[n].ptx + ae_cases[n].in_incr,
2748 ae_cases[n].ptx_len -
2749 ae_cases[n].in_incr,
2750 out + out_offs,
2751 &out_size, out_tag, &out_tag_len)))
2752 goto out;
2753
2754 (void)ADBG_EXPECT_BUFFER(c,
2755 ae_cases[n].tag, ae_cases[n].tag_len, out_tag,
2756 out_tag_len);
2757
2758 out_offs += out_size;
2759
2760 (void)ADBG_EXPECT_BUFFER(c, ae_cases[n].ctx,
2761 ae_cases[n].ctx_len, out, out_offs);
2762 } else {
2763 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2764 ta_crypt_cmd_ae_decrypt_final(c, &session, op,
2765 ae_cases[n].ctx + ae_cases[n].in_incr,
2766 ae_cases[n].ctx_len -
2767 ae_cases[n].in_incr,
2768 out + out_offs,
2769 &out_size, ae_cases[n].tag,
2770 ae_cases[n].tag_len)))
2771 goto out;
2772
2773 out_offs += out_size;
2774
2775 (void)ADBG_EXPECT_BUFFER(c, ae_cases[n].ptx,
2776 ae_cases[n].ptx_len, out, out_offs);
2777 }
2778
Jens Wiklander7404c072020-12-15 08:06:32 +01002779 /* test on the copied op2 */
2780 out_size = sizeof(out) - out_offs2;
2781 memset(out + out_offs2, 0, out_size);
2782 if (ae_cases[n].mode == TEE_MODE_ENCRYPT) {
2783 uint8_t out_tag[64] = { 0 };
2784 size_t out_tag_len = MIN(sizeof(out_tag),
2785 ae_cases[n].tag_len);
2786
2787 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2788 ta_crypt_cmd_ae_encrypt_final(c, &session, op2,
2789 ae_cases[n].ptx + ae_cases[n].in_incr,
2790 ae_cases[n].ptx_len -
2791 ae_cases[n].in_incr,
2792 out + out_offs2,
2793 &out_size, out_tag, &out_tag_len)))
2794 goto out;
2795
2796 ADBG_EXPECT_BUFFER(c, ae_cases[n].tag,
2797 ae_cases[n].tag_len, out_tag,
2798 out_tag_len);
2799
2800 out_offs2 += out_size;
2801
2802 (void)ADBG_EXPECT_BUFFER(c, ae_cases[n].ctx,
2803 ae_cases[n].ctx_len, out, out_offs2);
2804 } else {
2805 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2806 ta_crypt_cmd_ae_decrypt_final(c, &session, op2,
2807 ae_cases[n].ctx + ae_cases[n].in_incr,
2808 ae_cases[n].ctx_len -
2809 ae_cases[n].in_incr,
2810 out + out_offs2,
2811 &out_size, ae_cases[n].tag,
2812 ae_cases[n].tag_len)))
2813 goto out;
2814
2815 out_offs2 += out_size;
2816
2817 (void)ADBG_EXPECT_BUFFER(c, ae_cases[n].ptx,
2818 ae_cases[n].ptx_len, out, out_offs2);
2819 }
2820
Pascal Brandc639ac82015-07-02 08:53:34 +02002821 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2822 ta_crypt_cmd_free_operation(c, &session, op)))
2823 goto out;
2824
Jens Wiklander7404c072020-12-15 08:06:32 +01002825 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2826 ta_crypt_cmd_free_operation(c, &session, op2)))
2827 goto out;
2828
Pascal Brandc639ac82015-07-02 08:53:34 +02002829 Do_ADBG_EndSubCase(c, NULL);
2830 }
2831out:
2832 TEEC_CloseSession(&session);
2833}
Jens Wiklander14f48872018-06-29 15:30:13 +02002834ADBG_CASE_DEFINE(regression, 4005, xtest_tee_test_4005,
2835 "Test TEE Internal API Authenticated Encryption operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02002836
2837struct xtest_ac_case {
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002838 unsigned int level;
Pascal Brandc639ac82015-07-02 08:53:34 +02002839 uint32_t algo;
2840 TEE_OperationMode mode;
2841
2842 union {
2843 struct {
2844 const uint8_t *modulus;
2845 size_t modulus_len;
2846
2847 const uint8_t *pub_exp;
2848 size_t pub_exp_len;
2849
2850 const uint8_t *priv_exp;
2851 size_t priv_exp_len;
2852
2853 const uint8_t *prime1; /* q */
2854 size_t prime1_len;
2855 const uint8_t *prime2; /* p */
2856 size_t prime2_len;
2857 const uint8_t *exp1; /* dp */
2858 size_t exp1_len;
2859 const uint8_t *exp2; /* dq */
2860 size_t exp2_len;
2861 const uint8_t *coeff; /* iq */
2862 size_t coeff_len;
2863
2864 int salt_len;
2865 } rsa;
2866 struct {
2867 const uint8_t *prime;
2868 size_t prime_len;
2869 const uint8_t *sub_prime;
2870 size_t sub_prime_len;
2871 const uint8_t *base;
2872 size_t base_len;
2873 const uint8_t *pub_val;
2874 size_t pub_val_len;
2875 const uint8_t *priv_val;
2876 size_t priv_val_len;
2877 } dsa;
Pascal Brand3e143ee2015-07-15 17:17:16 +02002878 struct {
2879 const uint8_t *private;
2880 size_t private_len;
2881 const uint8_t *public_x;
2882 size_t public_x_len;
2883 const uint8_t *public_y;
2884 size_t public_y_len;
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01002885 } ecc;
Valerii Chubarab9863c2022-08-12 07:42:29 +00002886 struct {
2887 const uint8_t *private;
2888 size_t private_len;
2889 const uint8_t *public;
2890 size_t public_len;
2891 const uint8_t flag;
2892 const uint8_t *context;
2893 size_t context_len;
2894 } eddsa;
Pascal Brandc639ac82015-07-02 08:53:34 +02002895 } params;
2896
2897 const uint8_t *ptx;
2898 size_t ptx_len;
2899 const uint8_t *ctx;
2900 size_t ctx_len;
2901 size_t line;
2902};
2903
2904#define WITHOUT_SALT(x) -1
2905#define WITH_SALT(x) x
2906
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002907#define XTEST_AC_CASE(level, algo, mode, vect, union_params) \
2908 { level, (algo), (mode), .params = union_params, \
Pascal Brandc639ac82015-07-02 08:53:34 +02002909 ARRAY(vect ## _ptx), \
2910 ARRAY(vect ## _out), \
2911 __LINE__ }
2912
2913#define XTEST_AC_RSA_UNION(vect, opt_crt_array, opt_salt) \
2914 { .rsa = { \
2915 ARRAY(vect ## _modulus), \
2916 ARRAY(vect ## _pub_exp), \
2917 ARRAY(vect ## _priv_exp), \
2918 opt_crt_array(vect ## _prime1), \
2919 opt_crt_array(vect ## _prime2), \
2920 opt_crt_array(vect ## _exp1), \
2921 opt_crt_array(vect ## _exp2), \
2922 opt_crt_array(vect ## _coeff), \
2923 opt_salt(vect ## _salt_len) \
2924 } }
2925
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002926#define XTEST_AC_RSA_CASE(level, algo, mode, vect, opt_crt_array, opt_salt) \
2927 XTEST_AC_CASE(level, algo, mode, vect, \
Pascal Brandc639ac82015-07-02 08:53:34 +02002928 XTEST_AC_RSA_UNION(vect, opt_crt_array, opt_salt))
2929
2930#define XTEST_AC_DSA_UNION(vect) \
2931 { .dsa = { \
2932 ARRAY(vect ## _prime), \
2933 ARRAY(vect ## _sub_prime), \
2934 ARRAY(vect ## _base), \
2935 ARRAY(vect ## _pub_val), \
2936 ARRAY(vect ## _priv_val), \
2937 } }
2938
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002939#define XTEST_AC_DSA_CASE(level, algo, mode, vect) \
2940 XTEST_AC_CASE(level, algo, mode, vect, XTEST_AC_DSA_UNION(vect))
Pascal Brandc639ac82015-07-02 08:53:34 +02002941
Pascal Brand3e143ee2015-07-15 17:17:16 +02002942#define XTEST_AC_ECDSA_UNION(vect) \
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01002943 { .ecc = { \
Pascal Brand3e143ee2015-07-15 17:17:16 +02002944 ARRAY(vect ## _private), \
2945 ARRAY(vect ## _public_x), \
2946 ARRAY(vect ## _public_y), \
2947 } }
2948
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01002949#define XTEST_AC_ECC_CASE(level, algo, mode, vect) \
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002950 XTEST_AC_CASE(level, algo, mode, vect, XTEST_AC_ECDSA_UNION(vect))
Pascal Brand3e143ee2015-07-15 17:17:16 +02002951
Valerii Chubarab9863c2022-08-12 07:42:29 +00002952#define XTEST_AC_EDDSA_UNION(vect, flag) \
2953 { .eddsa = { \
2954 ARRAY(vect ## _private), \
2955 ARRAY(vect ## _public), \
2956 flag, \
2957 } }
2958
2959#define XTEST_AC_EDDSA_CTX_UNION(vect, flag) \
2960 { .eddsa = { \
2961 ARRAY(vect ## _private), \
2962 ARRAY(vect ## _public), \
2963 flag, \
2964 ARRAY(vect ## _context), \
2965 } }
2966
2967#define XTEST_AC_EDDSA_CASE(level, algo, mode, vect, flag) \
2968 XTEST_AC_CASE(level, algo, mode, vect, XTEST_AC_EDDSA_UNION(vect, flag))
2969
2970#define XTEST_AC_EDDSA_CTX_CASE(level, algo, mode, vect, flag) \
2971 XTEST_AC_CASE(level, algo, mode, vect, XTEST_AC_EDDSA_CTX_UNION(vect, flag))
2972
Pascal Brandc639ac82015-07-02 08:53:34 +02002973static const struct xtest_ac_case xtest_ac_cases[] = {
2974 /* RSA test without crt parameters */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002975 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002976 ac_rsassa_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002977 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002978 ac_rsassa_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002979 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002980 ac_rsassa_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002981 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002982 ac_rsassa_vect2, NULL_ARRAY, WITHOUT_SALT),
Jerome Forissiere576f052018-03-23 21:24:21 +08002983 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
2984 ac_rsassa_vect18, NULL_ARRAY, WITHOUT_SALT),
2985 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
2986 ac_rsassa_vect18, NULL_ARRAY, WITHOUT_SALT),
Jerome Forissier0451e372018-03-27 00:10:23 +08002987 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
2988 ac_rsassa_vect19, NULL_ARRAY, WITHOUT_SALT),
2989 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
2990 ac_rsassa_vect19, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002991 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002992 ac_rsassa_vect3, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002993 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002994 ac_rsassa_vect3, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002995 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002996 ac_rsassa_vect4, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002997 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002998 ac_rsassa_vect4, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002999 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003000 ac_rsassa_vect5, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003001 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003002 ac_rsassa_vect5, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003003 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003004 ac_rsassa_vect6, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003005 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003006 ac_rsassa_vect6, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003007 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003008 ac_rsassa_vect7, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003009 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003010 ac_rsassa_vect7, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003011 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
3012 ac_rsassa_vect8, NULL_ARRAY, WITHOUT_SALT),
3013 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
3014 ac_rsassa_vect8, NULL_ARRAY, WITHOUT_SALT),
Pascal Brandc639ac82015-07-02 08:53:34 +02003015
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003016 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA224, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003017 ac_rsassa_vect16, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003018 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA224, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003019 ac_rsassa_vect16, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003020
Gabor Szekely2ad190f2018-09-14 14:05:06 +00003021#ifdef CFG_CRYPTO_RSASSA_NA1
3022 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5, TEE_MODE_SIGN,
3023 ac_rsassa_vect20, NULL_ARRAY, WITHOUT_SALT),
3024 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5, TEE_MODE_VERIFY,
3025 ac_rsassa_vect20, NULL_ARRAY, WITHOUT_SALT),
3026#endif
3027
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003028 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003029 ac_rsassa_vect9, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003030 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003031 ac_rsassa_vect9, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003032
3033 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003034 ac_rsassa_vect10, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003035 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003036 ac_rsassa_vect10, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003037
3038 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003039 ac_rsassa_vect11, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003040 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003041 ac_rsassa_vect11, NULL_ARRAY, WITHOUT_SALT),
3042
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003043 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1,
3044 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003045 ac_rsassa_vect12, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003046 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003047 ac_rsassa_vect12, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003048
3049 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
3050 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003051 ac_rsassa_vect17, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003052 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
3053 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003054 ac_rsassa_vect17, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003055
3056 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
3057 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003058 ac_rsassa_vect13, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003059 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
3060 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003061 ac_rsassa_vect13, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003062
3063 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
3064 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003065 ac_rsassa_vect14, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003066 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
3067 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003068 ac_rsassa_vect14, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003069
3070 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
3071 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003072 ac_rsassa_vect15, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003073 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
3074 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003075 ac_rsassa_vect15, NULL_ARRAY, WITH_SALT),
3076
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003077 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003078 ac_rsaes_pkcs1_v1_5_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003079 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003080 ac_rsaes_pkcs1_v1_5_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003081 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003082 ac_rsaes_pkcs1_v1_5_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003083 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003084 ac_rsaes_pkcs1_v1_5_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003085 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003086 ac_rsaes_pkcs1_v1_5_vect15, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003087 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003088 ac_rsaes_pkcs1_v1_5_vect15, NULL_ARRAY, WITHOUT_SALT),
3089
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003090 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3091 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003092 ac_rsaes_oaep_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003093 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3094 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003095 ac_rsaes_oaep_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003096 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3097 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003098 ac_rsaes_oaep_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003099 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3100 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003101 ac_rsaes_oaep_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003102 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3103 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003104 ac_rsaes_oaep_vect10, 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_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003107 ac_rsaes_oaep_vect10, NULL_ARRAY, WITHOUT_SALT),
3108
3109 /* RSA test with crt parameters */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003110 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003111 ac_rsassa_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003112 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003113 ac_rsassa_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003114 XTEST_AC_RSA_CASE(1, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003115 ac_rsassa_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003116 XTEST_AC_RSA_CASE(1, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003117 ac_rsassa_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003118 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003119 ac_rsassa_vect3, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003120 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003121 ac_rsassa_vect3, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003122 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003123 ac_rsassa_vect4, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003124 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003125 ac_rsassa_vect4, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003126 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003127 ac_rsassa_vect5, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003128 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003129 ac_rsassa_vect5, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003130 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003131 ac_rsassa_vect6, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003132 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003133 ac_rsassa_vect6, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003134 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003135 ac_rsassa_vect7, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003136 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003137 ac_rsassa_vect7, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003138 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003139 ac_rsassa_vect8, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003140 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003141 ac_rsassa_vect8, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003142 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003143 ac_rsassa_vect9, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003144 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003145 ac_rsassa_vect9, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003146 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003147 ac_rsassa_vect10, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003148 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003149 ac_rsassa_vect10, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003150 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003151 ac_rsassa_vect11, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003152 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003153 ac_rsassa_vect11, ARRAY, WITHOUT_SALT),
3154
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003155 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1,
3156 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003157 ac_rsassa_vect12, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003158 XTEST_AC_RSA_CASE(1,TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003159 ac_rsassa_vect12, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003160 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
3161 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003162 ac_rsassa_vect17, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003163 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
3164 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003165 ac_rsassa_vect17, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003166 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
3167 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003168 ac_rsassa_vect13, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003169 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
3170 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003171 ac_rsassa_vect13, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003172 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
3173 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003174 ac_rsassa_vect14, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003175 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
3176 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003177 ac_rsassa_vect14, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003178 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
3179 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003180 ac_rsassa_vect15, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003181 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
3182 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003183 ac_rsassa_vect15, ARRAY, WITH_SALT),
3184
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003185 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003186 ac_rsaes_pkcs1_v1_5_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003187 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003188 ac_rsaes_pkcs1_v1_5_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003189 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003190 ac_rsaes_pkcs1_v1_5_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003191 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003192 ac_rsaes_pkcs1_v1_5_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003193 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003194 ac_rsaes_pkcs1_v1_5_vect15, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003195 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003196 ac_rsaes_pkcs1_v1_5_vect15, ARRAY, WITHOUT_SALT),
3197
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003198 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3199 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003200 ac_rsaes_oaep_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003201 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3202 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003203 ac_rsaes_oaep_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003204 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3205 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003206 ac_rsaes_oaep_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003207 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3208 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003209 ac_rsaes_oaep_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003210 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3211 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003212 ac_rsaes_oaep_vect10, 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_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003215 ac_rsaes_oaep_vect10, ARRAY, WITHOUT_SALT),
3216
3217 /* DSA tests */
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003218 /* [mod = L=1024, N=160, SHA-1] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003219 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect1),
3220 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect1),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003221 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect2),
3222 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect2),
3223 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect3),
3224 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect3),
3225 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect4),
3226 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect4),
3227 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect5),
3228 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect5),
3229 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect6),
3230 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect6),
3231 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect7),
3232 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect7),
3233 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect8),
3234 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect8),
3235 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect9),
3236 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect9),
3237 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect10),
3238 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect10),
3239 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect11),
3240 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect11),
3241 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect12),
3242 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect12),
3243 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect13),
3244 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect13),
3245 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect14),
3246 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect14),
3247 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect15),
3248 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect15),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003249 /* [mod = L=1024, N=160, SHA-224] - GP NOT SUPPORTED */
3250 /* [mod = L=1024, N=160, SHA-256] - GP NOT SUPPORTED */
3251 /* [mod = L=1024, N=160, SHA-384] - GP NOT SUPPORTED */
3252 /* [mod = L=1024, N=160, SHA-512] - GP NOT SUPPORTED */
3253 /* [mod = L=2048, N=224, SHA-1] - GP NOT SUPPORTED */
3254 /* [mod = L=2048, N=224, SHA-224] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003255 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect91),
3256 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect91),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003257 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect92),
3258 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect92),
3259 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect93),
3260 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect93),
3261 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect94),
3262 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect94),
3263 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect95),
3264 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect95),
3265 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect96),
3266 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect96),
3267 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect97),
3268 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect97),
3269 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect98),
3270 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect98),
3271 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect99),
3272 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect99),
3273 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect100),
3274 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect100),
3275 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect101),
3276 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect101),
3277 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect102),
3278 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect102),
3279 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect103),
3280 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect103),
3281 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect104),
3282 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect104),
3283 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect105),
3284 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect105),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003285 /* [mod = L=2048, N=224, SHA-256] */
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003286 XTEST_AC_DSA_CASE(0, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect106),
3287 XTEST_AC_DSA_CASE(0, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect106),
3288 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect107),
3289 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect107),
3290 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect108),
3291 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect108),
3292 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect109),
3293 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect109),
3294 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect110),
3295 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect110),
3296 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect111),
3297 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect111),
3298 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect112),
3299 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect112),
3300 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect113),
3301 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect113),
3302 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect114),
3303 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect114),
3304 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect115),
3305 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect115),
3306 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect116),
3307 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect116),
3308 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect117),
3309 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect117),
3310 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect118),
3311 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect118),
3312 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect119),
3313 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect119),
3314 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect120),
3315 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect120),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003316 /* [mod = L=2048, N=224, SHA-384] - GP NOT SUPPORTED */
3317 /* [mod = L=2048, N=224, SHA-512] - GP NOT SUPPORTED */
3318 /* [mod = L=2048, N=256, SHA-1] - GP NOT SUPPORTED */
3319 /* [mod = L=2048, N=256, SHA-224] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003320 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect166),
3321 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect166),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003322 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect167),
3323 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect167),
3324 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect168),
3325 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect168),
3326 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect169),
3327 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect169),
3328 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect170),
3329 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect170),
3330 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect171),
3331 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect171),
3332 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect172),
3333 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect172),
3334 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect173),
3335 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect173),
3336 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect174),
3337 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect174),
3338 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect175),
3339 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect175),
3340 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect176),
3341 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect176),
3342 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect177),
3343 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect177),
3344 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect178),
3345 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect178),
3346 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect179),
3347 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect179),
3348 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect180),
3349 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect180),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003350 /* [mod = L=2048, N=256, SHA-256] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003351 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect181),
3352 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect181),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003353 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect182),
3354 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect182),
3355 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect183),
3356 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect183),
3357 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect184),
3358 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect184),
3359 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect185),
3360 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect185),
3361 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect186),
3362 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect186),
3363 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect187),
3364 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect187),
3365 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect188),
3366 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect188),
3367 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect189),
3368 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect189),
3369 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect190),
3370 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect190),
3371 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect191),
3372 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect191),
3373 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect192),
3374 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect192),
3375 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect193),
3376 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect193),
3377 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect194),
3378 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect194),
3379 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect195),
3380 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect195),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003381 /* [mod = L=2048, N=256, SHA-384] - GP NOT SUPPORTED */
3382 /* [mod = L=2048, N=256, SHA-512] - GP NOT SUPPORTED */
3383 /* [mod = L=3072, N=256, SHA-1] - GP NOT SUPPORTED */
3384 /* [mod = L=3072, N=256, SHA-224] - GP NOT SUPPORTED */
3385 /* [mod = L=3072, N=256, SHA-256] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003386 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect256),
3387 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect256),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003388 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect257),
3389 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect257),
3390 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect258),
3391 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect258),
3392 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect259),
3393 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect259),
3394 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect260),
3395 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect260),
3396 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect261),
3397 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect261),
3398 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect262),
3399 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect262),
3400 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect263),
3401 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect263),
3402 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect264),
3403 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect264),
3404 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect265),
3405 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect265),
3406 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect266),
3407 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect266),
3408 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect267),
3409 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect267),
3410 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect268),
3411 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect268),
3412 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect269),
3413 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect269),
3414 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect270),
3415 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect270),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003416 /* [mod = L=3072, N=256, SHA-384] - GP NOT SUPPORTED */
3417 /* [mod = L=3072, N=256, SHA-512] - GP NOT SUPPORTED */
Pascal Brand3e143ee2015-07-15 17:17:16 +02003418
3419 /* ECDSA tests */
Cedric Chaumontc7654962015-09-09 14:56:36 +02003420 /* [P-192] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003421 XTEST_AC_ECC_CASE(0, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3422 nist_186_2_ecdsa_testvector_1),
3423 XTEST_AC_ECC_CASE(0, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3424 nist_186_2_ecdsa_testvector_1),
3425 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3426 nist_186_2_ecdsa_testvector_2),
3427 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3428 nist_186_2_ecdsa_testvector_2),
3429 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3430 nist_186_2_ecdsa_testvector_3),
3431 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3432 nist_186_2_ecdsa_testvector_3),
3433 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3434 nist_186_2_ecdsa_testvector_4),
3435 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3436 nist_186_2_ecdsa_testvector_4),
3437 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3438 nist_186_2_ecdsa_testvector_5),
3439 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3440 nist_186_2_ecdsa_testvector_5),
3441 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3442 nist_186_2_ecdsa_testvector_6),
3443 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3444 nist_186_2_ecdsa_testvector_6),
3445 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3446 nist_186_2_ecdsa_testvector_7),
3447 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3448 nist_186_2_ecdsa_testvector_7),
3449 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3450 nist_186_2_ecdsa_testvector_8),
3451 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3452 nist_186_2_ecdsa_testvector_8),
3453 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3454 nist_186_2_ecdsa_testvector_9),
3455 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3456 nist_186_2_ecdsa_testvector_9),
3457 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3458 nist_186_2_ecdsa_testvector_10),
3459 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3460 nist_186_2_ecdsa_testvector_10),
3461 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3462 nist_186_2_ecdsa_testvector_11),
3463 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3464 nist_186_2_ecdsa_testvector_11),
3465 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3466 nist_186_2_ecdsa_testvector_12),
3467 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3468 nist_186_2_ecdsa_testvector_12),
3469 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3470 nist_186_2_ecdsa_testvector_13),
3471 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3472 nist_186_2_ecdsa_testvector_13),
3473 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3474 nist_186_2_ecdsa_testvector_14),
3475 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3476 nist_186_2_ecdsa_testvector_14),
3477 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3478 nist_186_2_ecdsa_testvector_15),
3479 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3480 nist_186_2_ecdsa_testvector_15),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003481 /* [P-224] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003482 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3483 nist_186_2_ecdsa_testvector_16),
3484 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3485 nist_186_2_ecdsa_testvector_16),
3486 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3487 nist_186_2_ecdsa_testvector_17),
3488 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3489 nist_186_2_ecdsa_testvector_17),
3490 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3491 nist_186_2_ecdsa_testvector_18),
3492 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3493 nist_186_2_ecdsa_testvector_18),
3494 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3495 nist_186_2_ecdsa_testvector_19),
3496 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3497 nist_186_2_ecdsa_testvector_19),
3498 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3499 nist_186_2_ecdsa_testvector_20),
3500 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3501 nist_186_2_ecdsa_testvector_20),
3502 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3503 nist_186_2_ecdsa_testvector_21),
3504 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3505 nist_186_2_ecdsa_testvector_21),
3506 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3507 nist_186_2_ecdsa_testvector_22),
3508 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3509 nist_186_2_ecdsa_testvector_22),
3510 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3511 nist_186_2_ecdsa_testvector_23),
3512 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3513 nist_186_2_ecdsa_testvector_23),
3514 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3515 nist_186_2_ecdsa_testvector_24),
3516 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3517 nist_186_2_ecdsa_testvector_24),
3518 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3519 nist_186_2_ecdsa_testvector_25),
3520 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3521 nist_186_2_ecdsa_testvector_25),
3522 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3523 nist_186_2_ecdsa_testvector_26),
3524 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3525 nist_186_2_ecdsa_testvector_26),
3526 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3527 nist_186_2_ecdsa_testvector_27),
3528 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3529 nist_186_2_ecdsa_testvector_27),
3530 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3531 nist_186_2_ecdsa_testvector_28),
3532 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3533 nist_186_2_ecdsa_testvector_28),
3534 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3535 nist_186_2_ecdsa_testvector_29),
3536 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3537 nist_186_2_ecdsa_testvector_29),
3538 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3539 nist_186_2_ecdsa_testvector_30),
3540 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3541 nist_186_2_ecdsa_testvector_30),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003542 /* [P-256] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003543 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3544 nist_186_2_ecdsa_testvector_31),
3545 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3546 nist_186_2_ecdsa_testvector_31),
3547 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3548 nist_186_2_ecdsa_testvector_32),
3549 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3550 nist_186_2_ecdsa_testvector_32),
3551 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3552 nist_186_2_ecdsa_testvector_33),
3553 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3554 nist_186_2_ecdsa_testvector_33),
3555 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3556 nist_186_2_ecdsa_testvector_34),
3557 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3558 nist_186_2_ecdsa_testvector_34),
3559 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3560 nist_186_2_ecdsa_testvector_35),
3561 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3562 nist_186_2_ecdsa_testvector_35),
3563 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3564 nist_186_2_ecdsa_testvector_36),
3565 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3566 nist_186_2_ecdsa_testvector_36),
3567 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3568 nist_186_2_ecdsa_testvector_37),
3569 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3570 nist_186_2_ecdsa_testvector_37),
3571 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3572 nist_186_2_ecdsa_testvector_38),
3573 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3574 nist_186_2_ecdsa_testvector_38),
3575 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3576 nist_186_2_ecdsa_testvector_39),
3577 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3578 nist_186_2_ecdsa_testvector_39),
3579 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3580 nist_186_2_ecdsa_testvector_40),
3581 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3582 nist_186_2_ecdsa_testvector_40),
3583 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3584 nist_186_2_ecdsa_testvector_41),
3585 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3586 nist_186_2_ecdsa_testvector_41),
3587 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3588 nist_186_2_ecdsa_testvector_42),
3589 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3590 nist_186_2_ecdsa_testvector_42),
3591 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3592 nist_186_2_ecdsa_testvector_43),
3593 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3594 nist_186_2_ecdsa_testvector_43),
3595 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3596 nist_186_2_ecdsa_testvector_44),
3597 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3598 nist_186_2_ecdsa_testvector_44),
3599 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3600 nist_186_2_ecdsa_testvector_45),
3601 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3602 nist_186_2_ecdsa_testvector_45),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003603 /* [P-384] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003604 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3605 nist_186_2_ecdsa_testvector_46),
3606 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3607 nist_186_2_ecdsa_testvector_46),
3608 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3609 nist_186_2_ecdsa_testvector_47),
3610 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3611 nist_186_2_ecdsa_testvector_47),
3612 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3613 nist_186_2_ecdsa_testvector_48),
3614 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3615 nist_186_2_ecdsa_testvector_48),
3616 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3617 nist_186_2_ecdsa_testvector_49),
3618 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3619 nist_186_2_ecdsa_testvector_49),
3620 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3621 nist_186_2_ecdsa_testvector_50),
3622 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3623 nist_186_2_ecdsa_testvector_50),
3624 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3625 nist_186_2_ecdsa_testvector_51),
3626 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3627 nist_186_2_ecdsa_testvector_51),
3628 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3629 nist_186_2_ecdsa_testvector_52),
3630 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3631 nist_186_2_ecdsa_testvector_52),
3632 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3633 nist_186_2_ecdsa_testvector_53),
3634 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3635 nist_186_2_ecdsa_testvector_53),
3636 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3637 nist_186_2_ecdsa_testvector_54),
3638 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3639 nist_186_2_ecdsa_testvector_54),
3640 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3641 nist_186_2_ecdsa_testvector_55),
3642 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3643 nist_186_2_ecdsa_testvector_55),
3644 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3645 nist_186_2_ecdsa_testvector_56),
3646 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3647 nist_186_2_ecdsa_testvector_56),
3648 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3649 nist_186_2_ecdsa_testvector_57),
3650 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3651 nist_186_2_ecdsa_testvector_57),
3652 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3653 nist_186_2_ecdsa_testvector_58),
3654 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3655 nist_186_2_ecdsa_testvector_58),
3656 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3657 nist_186_2_ecdsa_testvector_59),
3658 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3659 nist_186_2_ecdsa_testvector_59),
3660 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3661 nist_186_2_ecdsa_testvector_60),
3662 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3663 nist_186_2_ecdsa_testvector_60),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003664 /* [P-521] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003665 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3666 nist_186_2_ecdsa_testvector_61),
3667 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3668 nist_186_2_ecdsa_testvector_61),
3669 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3670 nist_186_2_ecdsa_testvector_62),
3671 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3672 nist_186_2_ecdsa_testvector_62),
3673 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3674 nist_186_2_ecdsa_testvector_63),
3675 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3676 nist_186_2_ecdsa_testvector_63),
3677 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3678 nist_186_2_ecdsa_testvector_64),
3679 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3680 nist_186_2_ecdsa_testvector_64),
3681 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3682 nist_186_2_ecdsa_testvector_65),
3683 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3684 nist_186_2_ecdsa_testvector_65),
3685 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3686 nist_186_2_ecdsa_testvector_66),
3687 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3688 nist_186_2_ecdsa_testvector_66),
3689 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3690 nist_186_2_ecdsa_testvector_67),
3691 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3692 nist_186_2_ecdsa_testvector_67),
3693 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3694 nist_186_2_ecdsa_testvector_68),
3695 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3696 nist_186_2_ecdsa_testvector_68),
3697 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3698 nist_186_2_ecdsa_testvector_69),
3699 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3700 nist_186_2_ecdsa_testvector_69),
3701 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3702 nist_186_2_ecdsa_testvector_70),
3703 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3704 nist_186_2_ecdsa_testvector_70),
3705 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3706 nist_186_2_ecdsa_testvector_71),
3707 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3708 nist_186_2_ecdsa_testvector_71),
3709 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3710 nist_186_2_ecdsa_testvector_72),
3711 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3712 nist_186_2_ecdsa_testvector_72),
3713 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3714 nist_186_2_ecdsa_testvector_73),
3715 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3716 nist_186_2_ecdsa_testvector_73),
3717 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3718 nist_186_2_ecdsa_testvector_74),
3719 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3720 nist_186_2_ecdsa_testvector_74),
3721 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3722 nist_186_2_ecdsa_testvector_75),
3723 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3724 nist_186_2_ecdsa_testvector_75),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003725 /* [K-163] - GP NOT SUPPORTED */
3726 /* [K-233] - GP NOT SUPPORTED */
3727 /* [K-283] - GP NOT SUPPORTED */
3728 /* [K-409] - GP NOT SUPPORTED */
3729 /* [K-571] - GP NOT SUPPORTED */
3730 /* [B-163] - GP NOT SUPPORTED */
3731 /* [B-233] - GP NOT SUPPORTED */
3732 /* [B-283] - GP NOT SUPPORTED */
3733 /* [B-409] - GP NOT SUPPORTED */
3734 /* [B-571] - GP NOT SUPPORTED */
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003735
3736 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_PKE, TEE_MODE_ENCRYPT,
3737 gmt_0003_part5_c2_sm2_testvector),
3738 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_PKE, TEE_MODE_DECRYPT,
3739 gmt_0003_part5_c2_sm2_testvector),
3740 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_PKE, TEE_MODE_ENCRYPT,
3741 sm2_testvector2),
Jerome Forissier849b57e2019-12-19 16:37:14 +01003742
3743 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_DSA_SM3, TEE_MODE_VERIFY,
3744 gmt_003_part5_a2),
3745 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_DSA_SM3, TEE_MODE_SIGN,
3746 gmt_003_part5_a2),
Pascal Brandc639ac82015-07-02 08:53:34 +02003747};
3748
Valerii Chubarab9863c2022-08-12 07:42:29 +00003749static const struct xtest_ac_case xtest_ac_eddsa_cases[] = {
3750
3751 XTEST_AC_EDDSA_CASE(0, TEE_ALG_ED25519, TEE_MODE_SIGN,
3752 ed25519_rfc_8032_7_1, 0),
3753 XTEST_AC_EDDSA_CASE(0, TEE_ALG_ED25519, TEE_MODE_VERIFY,
3754 ed25519_rfc_8032_7_1, 0),
3755
3756 XTEST_AC_EDDSA_CTX_CASE(0, TEE_ALG_ED25519, TEE_MODE_SIGN,
3757 ed25519ctx_rfc_8032_7_2, 0),
3758 XTEST_AC_EDDSA_CTX_CASE(0, TEE_ALG_ED25519, TEE_MODE_VERIFY,
3759 ed25519ctx_rfc_8032_7_2, 0),
3760
3761 XTEST_AC_EDDSA_CASE(0, TEE_ALG_ED25519, TEE_MODE_SIGN,
3762 ed25519ph_rfc_8032_7_3, 1),
3763 XTEST_AC_EDDSA_CASE(0, TEE_ALG_ED25519, TEE_MODE_VERIFY,
3764 ed25519ph_rfc_8032_7_3, 1),
3765};
3766
Pascal Brandc639ac82015-07-02 08:53:34 +02003767static bool create_key(ADBG_Case_t *c, TEEC_Session *s,
3768 uint32_t max_key_size, uint32_t key_type,
3769 TEE_Attribute *attrs, size_t num_attrs,
3770 TEE_ObjectHandle *handle)
3771{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003772 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02003773
3774 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3775 ta_crypt_cmd_allocate_transient_object(c, s, key_type,
3776 max_key_size, handle)))
3777 return false;
3778
3779 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3780 ta_crypt_cmd_populate_transient_object(c, s, *handle, attrs,
3781 num_attrs)))
3782 return false;
3783
3784 for (n = 0; n < num_attrs; n++) {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003785 uint8_t out[512] = { };
3786 size_t out_size = sizeof(out);
Pascal Brand3e143ee2015-07-15 17:17:16 +02003787
3788 if (attrs[n].attributeID == TEE_ATTR_ECC_CURVE)
3789 continue;
3790
Pascal Brandc639ac82015-07-02 08:53:34 +02003791 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3792 ta_crypt_cmd_get_object_buffer_attribute(c, s, *handle,
3793 attrs[n].attributeID, out, &out_size)))
3794 return false;
3795
Pascal Brand3e143ee2015-07-15 17:17:16 +02003796 if (out_size < attrs[n].content.ref.length) {
3797 memmove(out + (attrs[n].content.ref.length - out_size),
3798 out,
3799 attrs[n].content.ref.length);
3800 memset(out, 0, attrs[n].content.ref.length - out_size);
3801 out_size = attrs[n].content.ref.length;
3802 }
3803
Pascal Brandc639ac82015-07-02 08:53:34 +02003804 if (!ADBG_EXPECT_BUFFER(c, attrs[n].content.ref.buffer,
3805 attrs[n].content.ref.length, out, out_size))
3806 return false;
3807 }
3808
3809 return true;
3810}
3811
Jerome Forissier26393882022-03-09 21:22:30 +01003812#define XTEST_NO_CURVE 0xFFFFFFFF /* implementation-defined as per GP spec */
3813
Pascal Brandc639ac82015-07-02 08:53:34 +02003814static void xtest_tee_test_4006(ADBG_Case_t *c)
3815{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003816 TEEC_Session session = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02003817 TEE_OperationHandle op = TEE_HANDLE_NULL;
3818 TEE_ObjectHandle priv_key_handle = TEE_HANDLE_NULL;
3819 TEE_ObjectHandle pub_key_handle = TEE_HANDLE_NULL;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003820 TEE_Attribute key_attrs[8] = { };
Jens Wiklander1f06b7d2022-12-02 21:49:57 +01003821 TEE_Attribute algo_params[2] = { };
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003822 size_t num_algo_params = 0;
3823 uint8_t out[512] = { };
3824 size_t out_size = 0;
3825 uint8_t out_enc[512] = { };
3826 size_t out_enc_size = 0;
3827 uint8_t ptx_hash[TEE_MAX_HASH_SIZE] = { };
Etienne Carriere481c6602019-01-22 13:27:26 +01003828 size_t ptx_hash_size = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003829 size_t max_key_size = 0;
3830 size_t num_key_attrs = 0;
3831 uint32_t ret_orig = 0;
3832 size_t n = 0;
3833 uint32_t curve = 0;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003834 uint32_t pub_key_type = 0;
3835 uint32_t priv_key_type = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003836 uint32_t hash_algo = 0;
Etienne Carrierea286b572023-06-28 14:30:19 +02003837 uint32_t sha1_algo_id = TEE_ALG_SHA1;
Pascal Brandc639ac82015-07-02 08:53:34 +02003838
3839 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3840 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
3841 &ret_orig)))
3842 return;
3843
3844 for (n = 0; n < ARRAY_SIZE(xtest_ac_cases); n++) {
3845 const struct xtest_ac_case *tv = xtest_ac_cases + n;
3846
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003847 if (tv->level > level)
3848 continue;
3849
Jerome Forissier4b03e282020-01-22 16:33:12 +01003850 if ((tv->algo == TEE_ALG_SM2_PKE ||
3851 tv->algo == TEE_ALG_SM2_DSA_SM3) &&
3852 !ta_crypt_cmd_is_algo_supported(c, &session, tv->algo,
3853 TEE_ECC_CURVE_SM2)) {
3854 Do_ADBG_Log("SM2 not supported: skip subcase");
3855 continue;
3856 }
3857
Pascal Brandc639ac82015-07-02 08:53:34 +02003858 Do_ADBG_BeginSubCase(c, "Asym Crypto case %d algo 0x%x line %d",
3859 (int)n, (unsigned int)tv->algo,
3860 (int)tv->line);
3861
3862 /*
3863 * When signing or verifying we're working with the hash of
3864 * the payload.
3865 */
3866 if (tv->mode == TEE_MODE_VERIFY || tv->mode == TEE_MODE_SIGN) {
Pascal Brand3e143ee2015-07-15 17:17:16 +02003867 if (TEE_ALG_GET_MAIN_ALG(tv->algo) == TEE_MAIN_ALGO_ECDSA)
3868 hash_algo = TEE_ALG_SHA1;
Gabor Szekely2ad190f2018-09-14 14:05:06 +00003869#if defined(CFG_CRYPTO_RSASSA_NA1)
3870 else if (tv->algo == TEE_ALG_RSASSA_PKCS1_V1_5)
3871 hash_algo = TEE_ALG_SHA256;
3872#endif
Pascal Brand3e143ee2015-07-15 17:17:16 +02003873 else
3874 hash_algo = TEE_ALG_HASH_ALGO(
3875 TEE_ALG_GET_DIGEST_HASH(tv->algo));
Pascal Brandc639ac82015-07-02 08:53:34 +02003876
3877 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3878 ta_crypt_cmd_allocate_operation(c, &session,
3879 &op, hash_algo, TEE_MODE_DIGEST, 0)))
3880 goto out;
3881
3882 ptx_hash_size = sizeof(ptx_hash);
3883 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3884 ta_crypt_cmd_digest_do_final(c, & session, op,
3885 tv->ptx, tv->ptx_len, ptx_hash,
3886 &ptx_hash_size)))
3887 goto out;
3888
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003889 /*
3890 * When we use DSA algorithms, the size of the hash we
3891 * consider equals the min between the size of the
3892 * "subprime" in the key and the size of the hash
3893 */
3894 if (TEE_ALG_GET_MAIN_ALG(tv->algo) ==
3895 TEE_MAIN_ALGO_DSA) {
3896 if (tv->params.dsa.sub_prime_len <=
3897 ptx_hash_size)
3898 ptx_hash_size =
3899 tv->params.dsa.sub_prime_len;
3900 }
3901
Pascal Brandc639ac82015-07-02 08:53:34 +02003902 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3903 ta_crypt_cmd_free_operation(c, &session, op)))
3904 goto out;
3905 }
3906
3907 num_algo_params = 0;
3908 num_key_attrs = 0;
3909 switch (TEE_ALG_GET_MAIN_ALG(tv->algo)) {
3910 case TEE_MAIN_ALGO_RSA:
3911 if (tv->params.rsa.salt_len > 0) {
3912 algo_params[0].attributeID =
3913 TEE_ATTR_RSA_PSS_SALT_LENGTH;
3914 algo_params[0].content.value.a =
3915 tv->params.rsa.salt_len;
3916 algo_params[0].content.value.b = 0;
3917 num_algo_params = 1;
3918 }
3919
3920 max_key_size = tv->params.rsa.modulus_len * 8;
3921
3922 xtest_add_attr(&num_key_attrs, key_attrs,
3923 TEE_ATTR_RSA_MODULUS,
3924 tv->params.rsa.modulus,
3925 tv->params.rsa.modulus_len);
3926 xtest_add_attr(&num_key_attrs, key_attrs,
3927 TEE_ATTR_RSA_PUBLIC_EXPONENT,
3928 tv->params.rsa.pub_exp,
3929 tv->params.rsa.pub_exp_len);
3930
3931 if (!ADBG_EXPECT_TRUE(c,
3932 create_key(c, &session,
3933 max_key_size,
3934 TEE_TYPE_RSA_PUBLIC_KEY,
3935 key_attrs,
3936 num_key_attrs,
3937 &pub_key_handle)))
3938 goto out;
3939
3940 xtest_add_attr(&num_key_attrs, key_attrs,
3941 TEE_ATTR_RSA_PRIVATE_EXPONENT,
3942 tv->params.rsa.priv_exp,
3943 tv->params.rsa.priv_exp_len);
3944
3945 if (tv->params.rsa.prime1_len != 0) {
3946 xtest_add_attr(&num_key_attrs, key_attrs,
3947 TEE_ATTR_RSA_PRIME1,
3948 tv->params.rsa.prime1,
3949 tv->params.rsa.prime1_len);
3950 }
3951
3952 if (tv->params.rsa.prime2_len != 0) {
3953 xtest_add_attr(&num_key_attrs, key_attrs,
3954 TEE_ATTR_RSA_PRIME2,
3955 tv->params.rsa.prime2,
3956 tv->params.rsa.prime2_len);
3957 }
3958
3959 if (tv->params.rsa.exp1_len != 0) {
3960 xtest_add_attr(&num_key_attrs, key_attrs,
3961 TEE_ATTR_RSA_EXPONENT1,
3962 tv->params.rsa.exp1,
3963 tv->params.rsa.exp1_len);
3964 }
3965
3966 if (tv->params.rsa.exp2_len != 0) {
3967 xtest_add_attr(&num_key_attrs, key_attrs,
3968 TEE_ATTR_RSA_EXPONENT2,
3969 tv->params.rsa.exp2,
3970 tv->params.rsa.exp2_len);
3971 }
3972
3973 if (tv->params.rsa.coeff_len != 0) {
3974 xtest_add_attr(&num_key_attrs, key_attrs,
3975 TEE_ATTR_RSA_COEFFICIENT,
3976 tv->params.rsa.coeff,
3977 tv->params.rsa.coeff_len);
3978 }
3979
3980 if (!ADBG_EXPECT_TRUE(c,
3981 create_key(c, &session,
3982 max_key_size,
3983 TEE_TYPE_RSA_KEYPAIR,
3984 key_attrs,
3985 num_key_attrs,
3986 &priv_key_handle)))
3987 goto out;
3988 break;
3989
3990 case TEE_MAIN_ALGO_DSA:
3991 max_key_size = tv->params.dsa.prime_len * 8;
3992
3993 xtest_add_attr(&num_key_attrs, key_attrs,
3994 TEE_ATTR_DSA_PRIME,
3995 tv->params.dsa.prime,
3996 tv->params.dsa.prime_len);
3997 xtest_add_attr(&num_key_attrs, key_attrs,
3998 TEE_ATTR_DSA_SUBPRIME,
3999 tv->params.dsa.sub_prime,
4000 tv->params.dsa.sub_prime_len);
4001 xtest_add_attr(&num_key_attrs, key_attrs,
4002 TEE_ATTR_DSA_BASE,
4003 tv->params.dsa.base,
4004 tv->params.dsa.base_len);
4005 xtest_add_attr(&num_key_attrs, key_attrs,
4006 TEE_ATTR_DSA_PUBLIC_VALUE,
4007 tv->params.dsa.pub_val,
4008 tv->params.dsa.pub_val_len);
4009
4010 if (!ADBG_EXPECT_TRUE(c,
4011 create_key(c, &session, max_key_size,
4012 TEE_TYPE_DSA_PUBLIC_KEY, key_attrs,
4013 num_key_attrs, &pub_key_handle)))
4014 goto out;
4015
4016 xtest_add_attr(&num_key_attrs, key_attrs,
4017 TEE_ATTR_DSA_PRIVATE_VALUE,
4018 tv->params.dsa.priv_val,
4019 tv->params.dsa.priv_val_len);
4020
4021 if (!ADBG_EXPECT_TRUE(c,
4022 create_key(c, &session, max_key_size,
4023 TEE_TYPE_DSA_KEYPAIR, key_attrs,
4024 num_key_attrs, &priv_key_handle)))
4025 goto out;
4026 break;
4027
Pascal Brand3e143ee2015-07-15 17:17:16 +02004028 case TEE_MAIN_ALGO_ECDSA:
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004029 case TEE_MAIN_ALGO_SM2_PKE:
Jerome Forissier849b57e2019-12-19 16:37:14 +01004030 case TEE_MAIN_ALGO_SM2_DSA_SM3:
Pascal Brand3e143ee2015-07-15 17:17:16 +02004031 switch (tv->algo) {
4032 case TEE_ALG_ECDSA_P192:
4033 curve = TEE_ECC_CURVE_NIST_P192;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004034 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
4035 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02004036 break;
4037 case TEE_ALG_ECDSA_P224:
4038 curve = TEE_ECC_CURVE_NIST_P224;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004039 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
4040 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02004041 break;
4042 case TEE_ALG_ECDSA_P256:
4043 curve = TEE_ECC_CURVE_NIST_P256;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004044 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
4045 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02004046 break;
4047 case TEE_ALG_ECDSA_P384:
4048 curve = TEE_ECC_CURVE_NIST_P384;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004049 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
4050 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02004051 break;
4052 case TEE_ALG_ECDSA_P521:
4053 curve = TEE_ECC_CURVE_NIST_P521;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004054 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
4055 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
4056 break;
4057 case TEE_ALG_SM2_PKE:
Jerome Forissier26393882022-03-09 21:22:30 +01004058 curve = XTEST_NO_CURVE;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004059 pub_key_type = TEE_TYPE_SM2_PKE_PUBLIC_KEY;
4060 priv_key_type = TEE_TYPE_SM2_PKE_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02004061 break;
Jerome Forissier849b57e2019-12-19 16:37:14 +01004062 case TEE_ALG_SM2_DSA_SM3:
Jerome Forissier26393882022-03-09 21:22:30 +01004063 curve = XTEST_NO_CURVE;
Jerome Forissier849b57e2019-12-19 16:37:14 +01004064 pub_key_type = TEE_TYPE_SM2_DSA_PUBLIC_KEY;
4065 priv_key_type = TEE_TYPE_SM2_DSA_KEYPAIR;
4066 break;
Pascal Brand3e143ee2015-07-15 17:17:16 +02004067 default:
4068 curve = 0xFF;
4069 break;
4070 }
4071
4072 if (tv->algo == TEE_ALG_ECDSA_P521)
4073 max_key_size = 521;
4074 else
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01004075 max_key_size = tv->params.ecc.private_len * 8;
Pascal Brand3e143ee2015-07-15 17:17:16 +02004076
Jerome Forissier26393882022-03-09 21:22:30 +01004077 if (curve != XTEST_NO_CURVE)
4078 xtest_add_attr_value(&num_key_attrs, key_attrs,
Pascal Brand3e143ee2015-07-15 17:17:16 +02004079 TEE_ATTR_ECC_CURVE, curve, 0);
4080 xtest_add_attr(&num_key_attrs, key_attrs,
4081 TEE_ATTR_ECC_PUBLIC_VALUE_X,
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01004082 tv->params.ecc.public_x,
4083 tv->params.ecc.public_x_len);
Pascal Brand3e143ee2015-07-15 17:17:16 +02004084 xtest_add_attr(&num_key_attrs, key_attrs,
4085 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01004086 tv->params.ecc.public_y,
4087 tv->params.ecc.public_y_len);
Pascal Brand3e143ee2015-07-15 17:17:16 +02004088
4089 if (!ADBG_EXPECT_TRUE(c,
4090 create_key(c, &session, max_key_size,
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004091 pub_key_type, key_attrs,
Pascal Brand3e143ee2015-07-15 17:17:16 +02004092 num_key_attrs, &pub_key_handle)))
4093 goto out;
4094
4095 xtest_add_attr(&num_key_attrs, key_attrs,
4096 TEE_ATTR_ECC_PRIVATE_VALUE,
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01004097 tv->params.ecc.private,
4098 tv->params.ecc.private_len);
Pascal Brand3e143ee2015-07-15 17:17:16 +02004099
4100 if (!ADBG_EXPECT_TRUE(c,
4101 create_key(c, &session, max_key_size,
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004102 priv_key_type, key_attrs,
Pascal Brand3e143ee2015-07-15 17:17:16 +02004103 num_key_attrs, &priv_key_handle)))
4104 goto out;
4105 break;
4106
Pascal Brandc639ac82015-07-02 08:53:34 +02004107 default:
4108 ADBG_EXPECT_TRUE(c, false);
4109 goto out;
4110 }
4111
4112 out_size = sizeof(out);
4113 memset(out, 0, sizeof(out));
4114 switch (tv->mode) {
4115 case TEE_MODE_ENCRYPT:
4116 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4117 ta_crypt_cmd_allocate_operation(c, &session,
Pascal Brand3e143ee2015-07-15 17:17:16 +02004118 &op, tv->algo, TEE_MODE_ENCRYPT,
4119 max_key_size)))
Pascal Brandc639ac82015-07-02 08:53:34 +02004120 goto out;
4121
4122 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4123 ta_crypt_cmd_set_operation_key(c, &session, op,
4124 pub_key_handle)))
4125 goto out;
4126
4127 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4128 ta_crypt_cmd_free_transient_object(c, &session,
4129 pub_key_handle)))
4130 goto out;
4131 pub_key_handle = TEE_HANDLE_NULL;
4132
Jens Wiklander1f06b7d2022-12-02 21:49:57 +01004133 num_algo_params = 0;
4134 if (tv->algo == TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1) {
4135 algo_params[0].attributeID =
4136 TEE_ATTR_RSA_OAEP_MGF_HASH;
4137 algo_params[0].content.ref.length =
Etienne Carrierea286b572023-06-28 14:30:19 +02004138 sizeof(sha1_algo_id);
Jens Wiklander1f06b7d2022-12-02 21:49:57 +01004139 algo_params[0].content.ref.buffer =
Etienne Carrierea286b572023-06-28 14:30:19 +02004140 &sha1_algo_id;
Jens Wiklander1f06b7d2022-12-02 21:49:57 +01004141 num_algo_params = 1;
4142 }
4143
4144
Pascal Brandc639ac82015-07-02 08:53:34 +02004145 out_enc_size = sizeof(out_enc);
4146 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4147 ta_crypt_cmd_asymmetric_encrypt(c, &session, op,
Jens Wiklander1f06b7d2022-12-02 21:49:57 +01004148 algo_params, num_algo_params, tv->ptx,
4149 tv->ptx_len, out_enc, &out_enc_size)))
Pascal Brandc639ac82015-07-02 08:53:34 +02004150 goto out;
4151
4152 /*
4153 * A PS which is random is added when formatting the
4154 * message internally of the algorithm so we can't
4155 * verify against precomputed values, instead we use the
4156 * decrypt operation to see that output is correct.
4157 */
4158
4159 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4160 ta_crypt_cmd_free_operation(c, &session, op)))
4161 goto out;
4162
4163 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4164 ta_crypt_cmd_allocate_operation(c, &session,
4165 &op, tv->algo, TEE_MODE_DECRYPT,
4166 max_key_size)))
4167 goto out;
4168
4169 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4170 ta_crypt_cmd_set_operation_key(c, &session, op,
4171 priv_key_handle)))
4172 goto out;
4173
4174 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4175 ta_crypt_cmd_free_transient_object(c, &session,
4176 priv_key_handle)))
4177 goto out;
4178
4179 priv_key_handle = TEE_HANDLE_NULL;
4180
4181 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4182 ta_crypt_cmd_asymmetric_decrypt(c, &session, op,
4183 NULL, 0, out_enc, out_enc_size, out,
4184 &out_size)))
4185 goto out;
4186
4187 (void)ADBG_EXPECT_BUFFER(c, tv->ptx, tv->ptx_len, out,
4188 out_size);
4189 break;
4190
4191 case TEE_MODE_DECRYPT:
4192 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4193 ta_crypt_cmd_allocate_operation(c, &session,
4194 &op, tv->algo, TEE_MODE_DECRYPT,
4195 max_key_size)))
4196 goto out;
4197
4198 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4199 ta_crypt_cmd_set_operation_key(c, &session, op,
4200 priv_key_handle)))
4201 goto out;
4202
4203 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4204 ta_crypt_cmd_free_transient_object(c, &session,
4205 priv_key_handle)))
4206 goto out;
4207
4208 priv_key_handle = TEE_HANDLE_NULL;
4209
4210 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4211 ta_crypt_cmd_asymmetric_decrypt(c, &session, op,
4212 NULL, 0, tv->ctx, tv->ctx_len, out,
4213 &out_size)))
4214 goto out;
4215
4216 (void)ADBG_EXPECT_BUFFER(c, tv->ptx, tv->ptx_len, out,
4217 out_size);
4218 break;
4219
4220 case TEE_MODE_VERIFY:
4221 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4222 ta_crypt_cmd_allocate_operation(c, &session,
4223 &op, tv->algo, TEE_MODE_VERIFY,
4224 max_key_size)))
4225 goto out;
4226
4227 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4228 ta_crypt_cmd_set_operation_key(c, &session, op,
4229 pub_key_handle)))
4230 goto out;
4231
4232 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4233 ta_crypt_cmd_free_transient_object(c, &session,
4234 pub_key_handle)))
4235 goto out;
4236
4237 pub_key_handle = TEE_HANDLE_NULL;
4238
4239 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4240 ta_crypt_cmd_asymmetric_verify(c, &session, op,
4241 algo_params, num_algo_params, ptx_hash,
4242 ptx_hash_size, tv->ctx, tv->ctx_len)))
4243 goto out;
4244 break;
4245
4246 case TEE_MODE_SIGN:
4247 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4248 ta_crypt_cmd_allocate_operation(c, &session,
4249 &op, tv->algo, TEE_MODE_SIGN,
4250 max_key_size)))
4251 goto out;
4252
4253 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4254 ta_crypt_cmd_set_operation_key(c, &session, op,
4255 priv_key_handle)))
4256 goto out;
4257
4258 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4259 ta_crypt_cmd_free_transient_object(c, &session,
4260 priv_key_handle)))
4261 goto out;
4262
4263 priv_key_handle = TEE_HANDLE_NULL;
4264
4265 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4266 ta_crypt_cmd_asymmetric_sign(c, &session, op,
4267 algo_params, num_algo_params, ptx_hash,
4268 ptx_hash_size, out, &out_size)))
4269 goto out;
4270
4271 if (TEE_ALG_GET_CHAIN_MODE(tv->algo) ==
4272 TEE_CHAIN_MODE_PKCS1_PSS_MGF1 ||
Pascal Brand3e143ee2015-07-15 17:17:16 +02004273 tv->algo == TEE_ALG_DSA_SHA1 ||
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02004274 tv->algo == TEE_ALG_DSA_SHA224 ||
4275 tv->algo == TEE_ALG_DSA_SHA256 ||
Pascal Brand3e143ee2015-07-15 17:17:16 +02004276 TEE_ALG_GET_MAIN_ALG(tv->algo) ==
Jerome Forissier849b57e2019-12-19 16:37:14 +01004277 TEE_MAIN_ALGO_ECDSA ||
4278 tv->algo == TEE_ALG_SM2_DSA_SM3) {
Pascal Brandc639ac82015-07-02 08:53:34 +02004279 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4280 ta_crypt_cmd_free_operation(c, &session,
4281 op)))
4282 goto out;
4283 /*
4284 * The salt or K is random so we can't verify
4285 * signing against precomputed values, instead
4286 * we use the verify operation to see that
4287 * output is correct.
4288 */
4289 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4290 ta_crypt_cmd_allocate_operation(c,
4291 &session, &op, tv->algo,
4292 TEE_MODE_VERIFY, max_key_size)))
4293 goto out;
4294
4295 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4296 ta_crypt_cmd_set_operation_key(c,
4297 &session, op, pub_key_handle)))
4298 goto out;
4299
4300 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4301 ta_crypt_cmd_free_transient_object(c,
4302 &session, pub_key_handle)))
4303 goto out;
4304
4305 pub_key_handle = TEE_HANDLE_NULL;
4306
4307 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4308 ta_crypt_cmd_asymmetric_verify(c,
4309 &session, op, algo_params,
4310 num_algo_params, ptx_hash,
4311 ptx_hash_size, out, out_size)))
4312 goto out;
4313 } else {
4314 (void)ADBG_EXPECT_BUFFER(c, tv->ctx,
4315 tv->ctx_len, out,
4316 out_size);
4317 }
4318 break;
4319
4320 default:
4321 break;
4322 }
4323
4324 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4325 ta_crypt_cmd_free_operation(c, &session, op)))
4326 goto out;
4327
4328 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4329 ta_crypt_cmd_free_transient_object(c, &session,
4330 pub_key_handle)))
4331 goto out;
4332 pub_key_handle = TEE_HANDLE_NULL;
4333
4334 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4335 ta_crypt_cmd_free_transient_object(c, &session,
4336 priv_key_handle)))
4337 goto out;
4338
4339 priv_key_handle = TEE_HANDLE_NULL;
4340
4341 Do_ADBG_EndSubCase(c, NULL);
4342 }
4343out:
4344 TEEC_CloseSession(&session);
4345}
Jens Wiklander14f48872018-06-29 15:30:13 +02004346ADBG_CASE_DEFINE(regression, 4006, xtest_tee_test_4006,
4347 "Test TEE Internal API Asymmetric Cipher operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02004348
4349#define KEY_ATTR(x, y) { #x, (x), y }
4350
4351struct key_attrs {
4352 const char *name;
4353 uint32_t attr;
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004354 /*
4355 * When keysize_check != 0: size of attribute is checked
4356 * Expected value is key_size bits except for DH in which case it is
4357 * the value of keysize_check.
4358 */
4359 uint32_t keysize_check;
Pascal Brandc639ac82015-07-02 08:53:34 +02004360};
4361
4362static bool test_keygen_attributes(ADBG_Case_t *c, TEEC_Session *s,
4363 TEE_ObjectHandle key, uint32_t key_size,
4364 struct key_attrs *attrs, size_t num_attrs)
4365{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004366 uint8_t out[2048] = { };
4367 size_t out_size = 0;
4368 size_t n = 0;
4369 size_t m = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004370
4371 for (m = 0; m < num_attrs; m++) {
4372 if ((attrs[m].attr & TEE_ATTR_BIT_VALUE) == 0) {
4373 out_size = sizeof(out);
4374 memset(out, 0, sizeof(out));
4375 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4376 ta_crypt_cmd_get_object_buffer_attribute(c, s,
4377 key, attrs[m].attr, out, &out_size)))
4378 return false;
4379
4380 if (attrs[m].keysize_check)
Jerome Forissierfe94e562020-11-17 17:22:40 +01004381 ADBG_EXPECT_COMPARE_UNSIGNED(c, out_size, <=,
Pascal Brandc639ac82015-07-02 08:53:34 +02004382 key_size / 8);
4383
4384 if (out_size > 0) {
4385 /* Check that buffer isn't all zeroes */
4386 for (n = 0; n < out_size; n++)
4387 if (out[n] != 0)
4388 break;
4389 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, n, <,
4390 out_size))
4391 return false;
4392 }
4393 } else {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004394 uint32_t a = 0;
4395 uint32_t b = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004396
4397 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4398 ta_crypt_cmd_get_object_value_attribute(c, s, key,
4399 attrs[m].attr, &a, &b)))
4400 return false;
4401 }
4402 }
4403 return true;
4404}
4405
4406static bool test_secret_value(ADBG_Case_t *c, TEEC_Session *s,
4407 TEE_ObjectHandle key, uint32_t key_size)
4408{
4409 const struct key_attrs attrs[] = {
4410 KEY_ATTR(TEE_ATTR_SECRET_VALUE, true),
4411 };
4412
4413 return test_keygen_attributes(c, s, key, key_size,
4414 (struct key_attrs *)&attrs,
4415 ARRAY_SIZE(attrs));
4416}
4417
4418
4419static bool test_rsa_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4420 TEE_ObjectHandle key, uint32_t key_size)
4421{
4422 const struct key_attrs attrs[] = {
4423 KEY_ATTR(TEE_ATTR_RSA_MODULUS, true),
4424 KEY_ATTR(TEE_ATTR_RSA_PUBLIC_EXPONENT, false),
4425 KEY_ATTR(TEE_ATTR_RSA_PRIVATE_EXPONENT, false),
4426 KEY_ATTR(TEE_ATTR_RSA_PRIME1, false),
4427 KEY_ATTR(TEE_ATTR_RSA_PRIME2, false),
4428 KEY_ATTR(TEE_ATTR_RSA_EXPONENT1, false),
4429 KEY_ATTR(TEE_ATTR_RSA_EXPONENT2, false),
4430 KEY_ATTR(TEE_ATTR_RSA_COEFFICIENT, false),
4431 };
4432
4433 return test_keygen_attributes(c, s, key, key_size,
4434 (struct key_attrs *)&attrs,
4435 ARRAY_SIZE(attrs));
4436}
4437
Pascal Brande61133f2015-07-08 15:38:37 +02004438static bool test_ecc_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4439 TEE_ObjectHandle key, uint32_t key_size)
4440{
4441 const struct key_attrs attrs[] = {
4442 KEY_ATTR(TEE_ATTR_ECC_PRIVATE_VALUE, false),
4443 KEY_ATTR(TEE_ATTR_ECC_PUBLIC_VALUE_X , false),
4444 KEY_ATTR(TEE_ATTR_ECC_PUBLIC_VALUE_Y , false),
4445 /* KEY_ATTR(TEE_ATTR_ECC_CURVE, false), - do not test */
4446 };
4447
4448 return test_keygen_attributes(c, s, key, key_size,
4449 (struct key_attrs *)&attrs,
4450 ARRAY_SIZE(attrs));
4451}
4452
Pascal Brandc639ac82015-07-02 08:53:34 +02004453static bool test_dh_key_pair(ADBG_Case_t *c, TEEC_Session *s,
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004454 TEE_ObjectHandle key, uint32_t check_keysize)
Pascal Brandc639ac82015-07-02 08:53:34 +02004455{
4456 const struct key_attrs attrs[] = {
4457 KEY_ATTR(TEE_ATTR_DH_PRIME, false),
4458 KEY_ATTR(TEE_ATTR_DH_BASE, false),
4459 KEY_ATTR(TEE_ATTR_DH_PUBLIC_VALUE, false),
4460 KEY_ATTR(TEE_ATTR_DH_PRIVATE_VALUE, check_keysize),
4461 KEY_ATTR(TEE_ATTR_DH_X_BITS, false),
4462 };
4463
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004464 return test_keygen_attributes(c, s, key, check_keysize,
Pascal Brandc639ac82015-07-02 08:53:34 +02004465 (struct key_attrs *)&attrs,
4466 ARRAY_SIZE(attrs));
4467}
4468
4469static bool test_dsa_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4470 TEE_ObjectHandle key, uint32_t key_size)
4471{
4472 const struct key_attrs attrs[] = {
4473 KEY_ATTR(TEE_ATTR_DSA_PRIME, true),
4474 KEY_ATTR(TEE_ATTR_DSA_SUBPRIME, false),
4475 KEY_ATTR(TEE_ATTR_DSA_BASE, false),
4476 KEY_ATTR(TEE_ATTR_DSA_PUBLIC_VALUE, false),
4477 KEY_ATTR(TEE_ATTR_DSA_PRIVATE_VALUE, false),
4478 };
4479
4480 return test_keygen_attributes(c, s, key, key_size,
4481 (struct key_attrs *)&attrs,
4482 ARRAY_SIZE(attrs));
4483}
4484
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03004485static bool test_x25519_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4486 TEE_ObjectHandle key, uint32_t key_size)
4487{
4488 const struct key_attrs attrs[] = {
4489 KEY_ATTR(TEE_ATTR_X25519_PRIVATE_VALUE, false),
4490 KEY_ATTR(TEE_ATTR_X25519_PUBLIC_VALUE, false),
4491 };
4492
4493 return test_keygen_attributes(c, s, key, key_size,
4494 (struct key_attrs *)&attrs,
4495 ARRAY_SIZE(attrs));
4496}
4497
Valerii Chubarab9863c2022-08-12 07:42:29 +00004498static bool test_ed25519_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4499 TEE_ObjectHandle key, uint32_t key_size)
4500{
4501 const struct key_attrs attrs[] = {
4502 KEY_ATTR(TEE_ATTR_ED25519_PRIVATE_VALUE, false),
4503 KEY_ATTR(TEE_ATTR_ED25519_PUBLIC_VALUE, false),
4504 };
4505
4506 return test_keygen_attributes(c, s, key, key_size,
4507 (struct key_attrs *)&attrs,
4508 ARRAY_SIZE(attrs));
4509}
4510
Pascal Brandc639ac82015-07-02 08:53:34 +02004511static bool generate_and_test_key(ADBG_Case_t *c, TEEC_Session *s,
4512 uint32_t key_type, uint32_t check_keysize,
4513 uint32_t key_size,
4514 TEE_Attribute *params, size_t param_count)
4515{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004516 TEE_ObjectHandle key = TEE_HANDLE_NULL;
Pascal Brandc639ac82015-07-02 08:53:34 +02004517 bool ret_val = true;
4518
4519 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4520 ta_crypt_cmd_allocate_transient_object(c, s, key_type, key_size,
4521 &key)))
4522 return false;
4523
4524 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4525 ta_crypt_cmd_generate_key(c, s, key, key_size, params,
4526 param_count)))
4527 return false;
4528
4529 switch (key_type) {
4530 case TEE_TYPE_DES:
4531 case TEE_TYPE_DES3:
4532 ret_val = ADBG_EXPECT_TRUE(c,
4533 test_secret_value(c, s, key,
4534 key_size + key_size / 7));
4535 break;
4536 case TEE_TYPE_AES:
4537 case TEE_TYPE_HMAC_MD5:
4538 case TEE_TYPE_HMAC_SHA1:
4539 case TEE_TYPE_HMAC_SHA224:
4540 case TEE_TYPE_HMAC_SHA256:
4541 case TEE_TYPE_HMAC_SHA384:
4542 case TEE_TYPE_HMAC_SHA512:
4543 case TEE_TYPE_GENERIC_SECRET:
4544 ret_val = ADBG_EXPECT_TRUE(c,
4545 test_secret_value(c, s, key, key_size));
4546 break;
4547
4548 case TEE_TYPE_RSA_KEYPAIR:
4549 ret_val = ADBG_EXPECT_TRUE(c,
4550 test_rsa_key_pair(c, s, key, key_size));
4551 break;
4552
Pascal Brande61133f2015-07-08 15:38:37 +02004553 case TEE_TYPE_ECDSA_KEYPAIR:
4554 case TEE_TYPE_ECDH_KEYPAIR:
4555 ret_val = ADBG_EXPECT_TRUE(c,
4556 test_ecc_key_pair(c, s, key, key_size));
4557 break;
4558
Pascal Brandc639ac82015-07-02 08:53:34 +02004559 case TEE_TYPE_DH_KEYPAIR:
Pascal Brande61133f2015-07-08 15:38:37 +02004560 ret_val = ADBG_EXPECT_TRUE(c,
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004561 test_dh_key_pair(c, s, key, check_keysize));
Pascal Brandc639ac82015-07-02 08:53:34 +02004562 break;
4563
4564 case TEE_TYPE_DSA_KEYPAIR:
4565 ret_val = ADBG_EXPECT_TRUE(c,
4566 test_dsa_key_pair(c, s, key, key_size));
4567 break;
4568
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03004569 case TEE_TYPE_X25519_KEYPAIR:
4570 ret_val = ADBG_EXPECT_TRUE(c,
4571 test_x25519_key_pair(c, s, key, key_size));
4572 break;
4573
Valerii Chubarab9863c2022-08-12 07:42:29 +00004574 case TEE_TYPE_ED25519_KEYPAIR:
4575 ret_val = ADBG_EXPECT_TRUE(c,
4576 test_ed25519_key_pair(c, s, key, key_size));
4577 break;
4578
Pascal Brandc639ac82015-07-02 08:53:34 +02004579 default:
4580 ret_val = false;
4581 break;
4582 }
4583
4584 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4585 ta_crypt_cmd_free_transient_object(c, s, key)))
4586 return false;
4587
4588 return ret_val;
4589}
4590
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004591struct key_types_noparam {
4592 unsigned level;
4593 const char *name;
4594 uint32_t key_type;
4595 uint32_t quanta;
4596 uint32_t min_size;
4597 uint32_t max_size;
4598};
4599
4600static void keygen_noparams(ADBG_Case_t *c, TEEC_Session *session,
4601 const struct key_types_noparam *key_types,
4602 size_t num_key_types)
Pascal Brandc639ac82015-07-02 08:53:34 +02004603{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004604 size_t n = 0;
4605 uint32_t key_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004606
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004607 for (n = 0; n < num_key_types; n++) {
Pascal Brandc639ac82015-07-02 08:53:34 +02004608 uint32_t min_size = key_types[n].min_size;
4609 uint32_t max_size = key_types[n].max_size;
4610 uint32_t quanta = key_types[n].quanta;
4611
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004612 if (key_types[n].level > level)
4613 continue;
4614
Pascal Brandc639ac82015-07-02 08:53:34 +02004615 Do_ADBG_BeginSubCase(c, "Generate %s key", key_types[n].name);
4616
4617 for (key_size = min_size; key_size <= max_size;
4618 key_size += quanta) {
4619 if (!ADBG_EXPECT_TRUE(c,
4620 generate_and_test_key(c, session, key_types
4621 [n].key_type, 1, key_size, NULL, 0)))
4622 break;
4623 }
4624
4625 Do_ADBG_EndSubCase(c, "Generate %s key", key_types[n].name);
4626 }
4627}
4628
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004629static void xtest_tee_test_4007_symmetric(ADBG_Case_t *c)
Pascal Brandc639ac82015-07-02 08:53:34 +02004630{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004631 TEEC_Session session = { };
4632 uint32_t ret_orig = 0;
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004633 static const struct key_types_noparam key_types[] = {
4634 { 0, "AES", TEE_TYPE_AES, 64, 128,
4635 256 /* valid sizes 128, 192, 256 */ },
4636 { 0, "DES", TEE_TYPE_DES, 56, 56, 56 /* valid size 56 */ },
4637 { 0, "DES3", TEE_TYPE_DES3, 56, 112,
4638 168 /* valid sizes 112, 168 */ },
4639 { 0, "HMAC-MD5", TEE_TYPE_HMAC_MD5, 8, 64, 512 },
4640 { 0, "HMAC-SHA1", TEE_TYPE_HMAC_SHA1, 8, 80, 512 },
4641 { 0, "HMAC-SHA224", TEE_TYPE_HMAC_SHA224, 8, 112, 512 },
4642 { 0, "HMAC-SHA256", TEE_TYPE_HMAC_SHA256, 8, 192, 1024 },
4643 { 0, "HMAC-SHA384", TEE_TYPE_HMAC_SHA384, 8, 256, 1024 },
4644 { 0, "HMAC-SHA512", TEE_TYPE_HMAC_SHA512, 8, 256, 1024 },
4645 { 0, "Generic secret", TEE_TYPE_GENERIC_SECRET, 8, 128, 4096 },
4646 };
4647
4648 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4649 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4650 &ret_orig)))
4651 return;
4652
4653 keygen_noparams(c, &session, key_types, ARRAY_SIZE(key_types));
4654
4655 TEEC_CloseSession(&session);
4656}
4657ADBG_CASE_DEFINE(regression, 4007_symmetric, xtest_tee_test_4007_symmetric,
4658 "Test TEE Internal API Generate Symmetric key");
4659
4660static void xtest_tee_test_4007_rsa(ADBG_Case_t *c)
4661{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004662 TEEC_Session session = { };
4663 uint32_t ret_orig = 0;
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004664 static const struct key_types_noparam key_types[] = {
Jorge Ramirez-Ortizb657ea42022-02-17 10:15:25 +01004665#ifndef CFG_CRYPTO_SE05X
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004666 { 0, "RSA-256", TEE_TYPE_RSA_KEYPAIR, 1, 256, 256 },
4667 { 1, "RSA-384", TEE_TYPE_RSA_KEYPAIR, 1, 384, 384 },
Jorge Ramirez-Ortizb657ea42022-02-17 10:15:25 +01004668#endif
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004669 { 1, "RSA-512", TEE_TYPE_RSA_KEYPAIR, 1, 512, 512 },
Jorge Ramirez-Ortizb657ea42022-02-17 10:15:25 +01004670#ifndef CFG_CRYPTO_SE05X
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004671 { 1, "RSA-640", TEE_TYPE_RSA_KEYPAIR, 1, 640, 640 },
4672 { 1, "RSA-768", TEE_TYPE_RSA_KEYPAIR, 1, 768, 768 },
4673 { 1, "RSA-896", TEE_TYPE_RSA_KEYPAIR, 1, 896, 896 },
Jorge Ramirez-Ortizb657ea42022-02-17 10:15:25 +01004674#endif
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004675 { 1, "RSA-1024", TEE_TYPE_RSA_KEYPAIR, 1, 1024, 1024 },
4676 { 1, "RSA-2048", TEE_TYPE_RSA_KEYPAIR, 1, 2048, 2048 },
4677 { 1, "RSA-3072", TEE_TYPE_RSA_KEYPAIR, 1, 3072, 3072 },
4678 { 1, "RSA-4096", TEE_TYPE_RSA_KEYPAIR, 1, 4096, 4096 },
4679 };
4680
4681 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4682 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4683 &ret_orig)))
4684 return;
4685
4686 keygen_noparams(c, &session, key_types, ARRAY_SIZE(key_types));
4687
4688 TEEC_CloseSession(&session);
4689}
4690ADBG_CASE_DEFINE(regression, 4007_rsa, xtest_tee_test_4007_rsa,
4691 "Test TEE Internal API Generate RSA key");
4692
4693static void xtest_tee_test_4007_dh(ADBG_Case_t *c)
4694{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004695 TEEC_Session session = { };
4696 uint32_t ret_orig = 0;
4697 size_t n = 0;
4698 size_t param_count = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004699 /*
4700 * Note that the key size parameter is not used when creating the keys
4701 * but specifying these sizes make it possible to test the expected size
4702 * of the private value. This also means that the keysize must match the
4703 * size of p or what is specified in private_bits or the equvivalent
4704 * size of the subprime parameter.
4705 */
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004706 TEE_Attribute params[4] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02004707
4708#define XTEST_DH_GK_DATA(vect) \
4709 ARRAY(vect ## _p), \
4710 ARRAY(vect ## _g), \
4711 &vect ## _private_bits, \
4712 0, 0
4713#define XTEST_DH_GK_DATA_SUBPRIME(vect) \
4714 ARRAY(vect ## _p), \
4715 ARRAY(vect ## _g), \
4716 &vect ## _private_bits, \
4717 ARRAY(vect ## _subprime)
4718 static const struct {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004719 unsigned level;
Pascal Brandc639ac82015-07-02 08:53:34 +02004720 uint32_t key_size;
4721 const uint8_t *p;
4722 size_t p_len;
4723 const uint8_t *g;
4724 size_t g_len;
4725 const uint32_t *private_bits;
4726 const uint8_t *subprime;
4727 size_t subprime_len;
4728 } key_types[] = {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004729 { 0, 256, XTEST_DH_GK_DATA(keygen_dh256) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004730 { 0, 320, XTEST_DH_GK_DATA(keygen_dh320) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004731 { 1, 384, XTEST_DH_GK_DATA(keygen_dh384) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004732 { 1, 448, XTEST_DH_GK_DATA(keygen_dh448) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004733 { 1, 512, XTEST_DH_GK_DATA(keygen_dh512) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004734 { 1, 576, XTEST_DH_GK_DATA(keygen_dh576) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004735 { 1, 640, XTEST_DH_GK_DATA(keygen_dh640) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004736 { 1, 704, XTEST_DH_GK_DATA(keygen_dh704) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004737 { 1, 768, XTEST_DH_GK_DATA(keygen_dh768) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004738 { 1, 832, XTEST_DH_GK_DATA(keygen_dh832) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004739 { 1, 896, XTEST_DH_GK_DATA(keygen_dh896) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004740 { 1, 960, XTEST_DH_GK_DATA(keygen_dh960) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004741 { 1, 1024, XTEST_DH_GK_DATA(keygen_dh1024) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004742 { 1, 1088, XTEST_DH_GK_DATA(keygen_dh1088) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004743 { 1, 1152, XTEST_DH_GK_DATA(keygen_dh1152) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004744 { 1, 1216, XTEST_DH_GK_DATA(keygen_dh1216) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004745 { 1, 1280, XTEST_DH_GK_DATA(keygen_dh1280) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004746 { 1, 1344, XTEST_DH_GK_DATA(keygen_dh1344) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004747 { 1, 1408, XTEST_DH_GK_DATA(keygen_dh1408) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004748 { 1, 1472, XTEST_DH_GK_DATA(keygen_dh1472) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004749 { 1, 1536, XTEST_DH_GK_DATA(keygen_dh1536) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004750 { 1, 1600, XTEST_DH_GK_DATA(keygen_dh1600) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004751 { 1, 1664, XTEST_DH_GK_DATA(keygen_dh1664) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004752 { 1, 1728, XTEST_DH_GK_DATA(keygen_dh1728) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004753 { 1, 1792, XTEST_DH_GK_DATA(keygen_dh1792) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004754 { 1, 1856, XTEST_DH_GK_DATA(keygen_dh1856) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004755 { 1, 1920, XTEST_DH_GK_DATA(keygen_dh1920) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004756 { 1, 1984, XTEST_DH_GK_DATA(keygen_dh1984) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004757 { 1, 2048, XTEST_DH_GK_DATA(keygen_dh2048) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004758 { 1, 2048, XTEST_DH_GK_DATA_SUBPRIME(keygen_dh2048_subprime) }
Pascal Brandc639ac82015-07-02 08:53:34 +02004759 };
4760
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004761 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4762 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4763 &ret_orig)))
4764 return;
Pascal Brandc639ac82015-07-02 08:53:34 +02004765
4766 for (n = 0; n < ARRAY_SIZE(key_types); n++) {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004767 if (key_types[n].level > level)
4768 continue;
4769
Pascal Brandc639ac82015-07-02 08:53:34 +02004770 Do_ADBG_BeginSubCase(c,
4771 "Generate DH key %d bits - Private bits = %d",
4772 key_types[n].key_size,
4773 *key_types[n].private_bits);
4774 param_count = 0;
4775
4776 xtest_add_attr(&param_count, params,
4777 TEE_ATTR_DH_PRIME,
4778 key_types[n].p, key_types[n].p_len);
4779
4780 xtest_add_attr(&param_count, params, TEE_ATTR_DH_BASE,
4781 key_types[n].g, key_types[n].g_len);
4782
4783 if (key_types[n].private_bits != 0) {
4784 params[param_count].attributeID = TEE_ATTR_DH_X_BITS;
4785
4786 params[param_count].content.value.a =
4787 *key_types[n].private_bits;
4788
4789 params[param_count].content.value.b = 0;
4790 param_count++;
4791 }
4792
4793 if (key_types[n].subprime != 0) {
4794 xtest_add_attr(&param_count, params,
4795 TEE_ATTR_DH_SUBPRIME,
4796 key_types[n].subprime,
4797 key_types[n].subprime_len);
4798 }
4799
4800 if (!ADBG_EXPECT_TRUE(c,
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004801 generate_and_test_key(c, &session, TEE_TYPE_DH_KEYPAIR,
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004802 *key_types[n].private_bits,
Pascal Brandc639ac82015-07-02 08:53:34 +02004803 key_types[n]. key_size, params, param_count)))
4804 break;
4805
4806 Do_ADBG_EndSubCase(c,
4807 "Generate DH key %d bits - Private bits = %d",
4808 key_types[n].key_size,
4809 *key_types[n].private_bits);
4810 }
Pascal Brandc639ac82015-07-02 08:53:34 +02004811
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004812 TEEC_CloseSession(&session);
4813}
4814ADBG_CASE_DEFINE(regression, 4007_dh, xtest_tee_test_4007_dh,
4815 "Test TEE Internal API Generate DH key");
4816
4817static void xtest_tee_test_4007_dsa(ADBG_Case_t *c)
Pascal Brandc639ac82015-07-02 08:53:34 +02004818{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004819 TEEC_Session session = { };
4820 uint32_t ret_orig = 0;
4821 size_t n = 0;
4822 size_t param_count = 0;
4823 TEE_Attribute params[4] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02004824
4825#define XTEST_DSA_GK_DATA(vect) \
4826 ARRAY(vect ## _p), \
4827 ARRAY(vect ## _g), \
4828 ARRAY(vect ## _q)
4829 static const struct {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004830 unsigned level;
Pascal Brandc639ac82015-07-02 08:53:34 +02004831 uint32_t key_size;
4832 const uint8_t *prime;
4833 size_t prime_len;
4834 const uint8_t *base;
4835 size_t base_len;
4836 const uint8_t *sub_prime;
4837 size_t sub_prime_len;
4838 } key_types[] = {
Jerome Forissiereed7e652020-04-15 15:42:38 +02004839 { 0, 1024, XTEST_DSA_GK_DATA(keygen_dsa_test1) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004840 { 0, 512, XTEST_DSA_GK_DATA(keygen_dsa512) },
Jerome Forissiereed7e652020-04-15 15:42:38 +02004841 { 0, 576, XTEST_DSA_GK_DATA(keygen_dsa576) },
4842 { 0, 640, XTEST_DSA_GK_DATA(keygen_dsa640) },
4843 { 0, 704, XTEST_DSA_GK_DATA(keygen_dsa704) },
4844 { 0, 768, XTEST_DSA_GK_DATA(keygen_dsa768) },
4845 { 0, 832, XTEST_DSA_GK_DATA(keygen_dsa832) },
4846 { 0, 896, XTEST_DSA_GK_DATA(keygen_dsa896) },
4847 { 0, 960, XTEST_DSA_GK_DATA(keygen_dsa960) },
4848 { 0, 1024, XTEST_DSA_GK_DATA(keygen_dsa1024) },
Pascal Brandc639ac82015-07-02 08:53:34 +02004849 };
4850
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004851 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4852 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4853 &ret_orig)))
4854 return;
4855
Pascal Brandc639ac82015-07-02 08:53:34 +02004856 for (n = 0; n < ARRAY_SIZE(key_types); n++) {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004857 if (key_types[n].level > level)
4858 continue;
4859
Pascal Brandc639ac82015-07-02 08:53:34 +02004860 Do_ADBG_BeginSubCase(c, "Generate DSA key %d bits",
4861 key_types[n].key_size);
4862 param_count = 0;
4863
4864
4865 xtest_add_attr(&param_count, params, TEE_ATTR_DSA_PRIME,
4866 key_types[n].prime, key_types[n].prime_len);
4867
4868 xtest_add_attr(&param_count, params, TEE_ATTR_DSA_SUBPRIME,
4869 key_types[n].sub_prime,
4870 key_types[n].sub_prime_len);
4871
4872 xtest_add_attr(&param_count, params, TEE_ATTR_DSA_BASE,
4873 key_types[n].base, key_types[n].base_len);
4874
4875 if (!ADBG_EXPECT_TRUE(c,
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004876 generate_and_test_key(c, &session, TEE_TYPE_DSA_KEYPAIR,
Pascal Brandc639ac82015-07-02 08:53:34 +02004877 1, key_types[n]. key_size, params,
4878 param_count)))
4879 break;
4880
4881 Do_ADBG_EndSubCase(c, "Generate DSA key %d bits",
4882 key_types[n].key_size);
4883 }
Pascal Brandc639ac82015-07-02 08:53:34 +02004884
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004885 TEEC_CloseSession(&session);
4886}
4887ADBG_CASE_DEFINE(regression, 4007_dsa, xtest_tee_test_4007_dsa,
4888 "Test TEE Internal API Generate DSA key");
4889
4890static void xtest_tee_test_4007_ecc(ADBG_Case_t *c)
Pascal Brande61133f2015-07-08 15:38:37 +02004891{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004892 TEEC_Session session = { };
4893 uint32_t ret_orig = 0;
4894 size_t n = 0;
4895 size_t param_count = 0;
4896 TEE_Attribute params[4] = { };
Pascal Brande61133f2015-07-08 15:38:37 +02004897
4898 static const struct {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004899 unsigned level;
Pascal Brande61133f2015-07-08 15:38:37 +02004900 const char *name;
4901 uint32_t algo;
4902 uint32_t curve;
4903 uint32_t key_size;
4904 } key_types[] = {
4905 /* ECDSA */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004906 { 0, "ECDSA-192", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P192,
4907 192 },
4908 { 1, "ECDSA-224", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P224,
4909 224 },
4910 { 1, "ECDSA-256", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P256,
4911 256 },
4912 { 1, "ECDSA-384", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P384,
4913 384 },
4914 { 1, "ECDSA-521", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P521,
4915 521 },
Pascal Brande61133f2015-07-08 15:38:37 +02004916
4917 /* ECDH */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004918 { 0, "ECDH-192", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P192,
4919 192 },
4920 { 1, "ECDH-224", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P224,
4921 224 },
4922 { 1, "ECDH-256", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P256,
4923 256 },
4924 { 1, "ECDH-384", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P384,
4925 384 },
4926 { 1, "ECDH-521", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P521,
4927 521 },
Pascal Brande61133f2015-07-08 15:38:37 +02004928 };
4929
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004930 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4931 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4932 &ret_orig)))
4933 return;
4934
Pascal Brande61133f2015-07-08 15:38:37 +02004935 for (n = 0; n < ARRAY_SIZE(key_types); n++) {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004936 if (key_types[n].level > level)
4937 continue;
4938
Pascal Brande61133f2015-07-08 15:38:37 +02004939 Do_ADBG_BeginSubCase(c, "Generate %s", key_types[n].name);
4940 param_count = 0;
4941
4942 xtest_add_attr_value(&param_count, params, TEE_ATTR_ECC_CURVE,
4943 key_types[n].curve, 0);
4944
4945 if (!ADBG_EXPECT_TRUE(c,
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004946 generate_and_test_key(c, &session, key_types[n].algo,
Pascal Brande61133f2015-07-08 15:38:37 +02004947 0, key_types[n].key_size, params,
4948 param_count)))
4949 break;
4950
4951 Do_ADBG_EndSubCase(c, "Generate %s", key_types[n].name);
4952 }
Pascal Brande61133f2015-07-08 15:38:37 +02004953
Pascal Brandc639ac82015-07-02 08:53:34 +02004954 TEEC_CloseSession(&session);
4955}
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004956ADBG_CASE_DEFINE(regression, 4007_ecc, xtest_tee_test_4007_ecc,
4957 "Test TEE Internal API Generate ECC key");
Pascal Brandc639ac82015-07-02 08:53:34 +02004958
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03004959static void xtest_tee_test_4007_x25519(ADBG_Case_t *c)
4960{
4961 TEEC_Session session = { };
4962 uint32_t ret_orig = 0;
4963
4964 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4965 xtest_teec_open_session(&session, &crypt_user_ta_uuid,
4966 NULL, &ret_orig)))
4967 return;
4968
Jerome Forissier366179c2022-06-28 10:12:58 +02004969 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_X25519,
4970 TEE_ECC_CURVE_25519)) {
4971 Do_ADBG_Log("X25519 not supported: skip subcase");
4972 goto out;
4973 }
4974
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03004975 Do_ADBG_BeginSubCase(c, "Generate X25519 key");
4976
4977 if (!ADBG_EXPECT_TRUE(c,
4978 generate_and_test_key(c, &session,
4979 TEE_TYPE_X25519_KEYPAIR, 0, 256,
4980 NULL, 0)))
4981 return;
4982
4983 Do_ADBG_EndSubCase(c, "Generate X25519 key");
Jerome Forissier366179c2022-06-28 10:12:58 +02004984out:
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03004985 TEEC_CloseSession(&session);
4986}
4987ADBG_CASE_DEFINE(regression, 4007_x25519, xtest_tee_test_4007_x25519,
4988 "Test TEE Internal API Generate X25519 key");
4989
Valerii Chubarab9863c2022-08-12 07:42:29 +00004990
4991static void xtest_tee_test_4007_ed25519(ADBG_Case_t *c)
4992{
4993 TEEC_Session session = { };
4994 uint32_t ret_orig = 0;
4995
4996 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4997 xtest_teec_open_session(&session, &crypt_user_ta_uuid,
4998 NULL, &ret_orig)))
4999 return;
5000
5001 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_ED25519,
5002 TEE_ECC_CURVE_25519)) {
5003 Do_ADBG_Log("ED25519 not supported: skip subcase");
5004 goto out;
5005 }
5006
5007 Do_ADBG_BeginSubCase(c, "Generate Ed25519 key");
5008
5009 ADBG_EXPECT_TRUE(c, generate_and_test_key(c, &session,
5010 TEE_TYPE_ED25519_KEYPAIR,
5011 0, 256, NULL, 0));
5012
5013 Do_ADBG_EndSubCase(c, "Generate Ed25519 key");
5014out:
5015 TEEC_CloseSession(&session);
5016}
5017ADBG_CASE_DEFINE(regression, 4007_ed25519, xtest_tee_test_4007_ed25519,
5018 "Test TEE Internal API Generate ed25519 key");
5019
Pascal Brandc639ac82015-07-02 08:53:34 +02005020static void xtest_tee_test_4008(ADBG_Case_t *c)
5021{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005022 TEEC_Session session = { };
5023 uint32_t ret_orig = 0;
5024 TEE_OperationHandle op = TEE_HANDLE_NULL;
5025 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
5026 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
5027 TEE_Attribute params[4] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02005028 size_t param_count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005029 uint8_t out[2048] = { };
5030 size_t out_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02005031
5032 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5033 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5034 &ret_orig)))
5035 return;
5036
5037 Do_ADBG_BeginSubCase(c, "Derive DH key success");
5038
5039 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5040 ta_crypt_cmd_allocate_operation(c, &session, &op,
5041 TEE_ALG_DH_DERIVE_SHARED_SECRET, TEE_MODE_DERIVE,
5042 derive_key_max_keysize)))
5043 goto out;
5044
5045 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5046 ta_crypt_cmd_allocate_transient_object(c, & session,
5047 TEE_TYPE_DH_KEYPAIR, derive_key_max_keysize,
5048 &key_handle)))
5049 goto out;
5050
5051 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PRIME,
5052 ARRAY(derive_key_dh_prime));
5053
5054 xtest_add_attr(&param_count, params, TEE_ATTR_DH_BASE,
5055 ARRAY(derive_key_dh_base));
5056
5057 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PUBLIC_VALUE,
5058 ARRAY(derive_key_dh_public_value));
5059
5060 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PRIVATE_VALUE,
5061 ARRAY(derive_key_dh_private_value));
5062
5063 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5064 ta_crypt_cmd_populate_transient_object(c, &session, key_handle,
5065 params, param_count)))
5066 goto out;
5067
5068 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5069 ta_crypt_cmd_set_operation_key(c, &session, op, key_handle)))
5070 goto out;
5071
5072 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5073 ta_crypt_cmd_free_transient_object(c, & session, key_handle)))
5074 goto out;
5075
5076 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5077 ta_crypt_cmd_allocate_transient_object(c, &session,
5078 TEE_TYPE_GENERIC_SECRET, derive_key_max_keysize,
5079 &sv_handle)))
5080 goto out;
5081
Pascal Brand2b92b642015-07-16 13:29:42 +02005082 /* reuse but reset params and param-count */
Pascal Brandc639ac82015-07-02 08:53:34 +02005083 param_count = 0;
5084
5085 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PUBLIC_VALUE,
5086 ARRAY(derive_key_dh_public_value_2));
5087
5088 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5089 ta_crypt_cmd_derive_key(c, &session, op, sv_handle, params,
5090 param_count)))
5091 goto out;
5092
5093 out_size = sizeof(out);
5094 memset(out, 0, sizeof(out));
5095 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5096 ta_crypt_cmd_get_object_buffer_attribute(c, &session, sv_handle,
5097 TEE_ATTR_SECRET_VALUE, out, &out_size)))
5098 goto out;
5099
5100 if (!ADBG_EXPECT_BUFFER(c, derive_key_dh_shared_secret,
5101 sizeof(derive_key_dh_shared_secret), out,
5102 out_size))
5103 goto out;
5104
5105 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5106 ta_crypt_cmd_free_operation(c, &session, op)))
5107 goto out;
5108
5109 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5110 ta_crypt_cmd_free_transient_object(c, &session, sv_handle)))
5111 goto out;
5112out:
5113 Do_ADBG_EndSubCase(c, "Derive DH key success");
5114 TEEC_CloseSession(&session);
5115}
Jens Wiklander14f48872018-06-29 15:30:13 +02005116ADBG_CASE_DEFINE(regression, 4008, xtest_tee_test_4008,
5117 "Test TEE Internal API Derive key");
Pascal Brand2b92b642015-07-16 13:29:42 +02005118
5119static void xtest_tee_test_4009(ADBG_Case_t *c)
5120{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005121 TEEC_Session session = { };
5122 uint32_t ret_orig = 0;
5123 TEE_OperationHandle op = TEE_HANDLE_NULL;
5124 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
5125 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
5126 TEE_Attribute params[4] = { };
Pascal Brand2b92b642015-07-16 13:29:42 +02005127 size_t param_count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005128 uint8_t out[2048] = { };
5129 size_t out_size = 0;
5130 uint32_t size_bytes = 0;
5131 uint32_t i = 0;
Ruchika Gupta454b0b62020-10-30 13:23:19 +05305132 struct derive_key_ecdh_t const *pt = NULL;
Pascal Brand2b92b642015-07-16 13:29:42 +02005133
5134 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5135 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5136 &ret_orig)))
5137 return;
5138
5139 for (i = 0; i < ARRAY_SIZE(derive_key_ecdh); i++) {
5140 pt = &derive_key_ecdh[i];
5141
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02005142 if (pt->level > level)
5143 continue;
5144
Pascal Brand2b92b642015-07-16 13:29:42 +02005145 Do_ADBG_BeginSubCase(c, "Derive ECDH key - algo = 0x%x",
5146 pt->algo);
5147 size_bytes = (pt->keysize + 7) / 8;
5148 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5149 ta_crypt_cmd_allocate_operation(c, &session, &op,
5150 pt->algo,
5151 TEE_MODE_DERIVE, pt->keysize)))
5152 goto out;
5153
5154 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5155 ta_crypt_cmd_allocate_transient_object(c, & session,
5156 TEE_TYPE_ECDH_KEYPAIR, pt->keysize,
5157 &key_handle)))
5158 goto out;
5159
5160 param_count = 0;
5161 xtest_add_attr_value(&param_count, params,
5162 TEE_ATTR_ECC_CURVE, pt->curve, 0);
5163 xtest_add_attr(&param_count, params,
5164 TEE_ATTR_ECC_PRIVATE_VALUE,
5165 pt->private, size_bytes);
5166 /*
Cedric Auger719047c2019-09-11 12:08:14 +02005167 * The public value is not used, but we should provide a valid
5168 * one to avoid rejection in case TEE_PopulateTransientObject()
5169 * checks for key validity.
Pascal Brand2b92b642015-07-16 13:29:42 +02005170 */
5171 xtest_add_attr(&param_count, params,
Cedric Auger719047c2019-09-11 12:08:14 +02005172 TEE_ATTR_ECC_PUBLIC_VALUE_X,
5173 pt->public_x, size_bytes);
Pascal Brand2b92b642015-07-16 13:29:42 +02005174 xtest_add_attr(&param_count, params,
Cedric Auger719047c2019-09-11 12:08:14 +02005175 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5176 pt->public_y, size_bytes);
Pascal Brand2b92b642015-07-16 13:29:42 +02005177
5178 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5179 ta_crypt_cmd_populate_transient_object(c,
5180 &session,
5181 key_handle, params, param_count)))
5182 goto out;
5183
5184 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5185 ta_crypt_cmd_set_operation_key(c, &session, op,
5186 key_handle)))
5187 goto out;
5188
5189 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5190 ta_crypt_cmd_free_transient_object(c, & session,
5191 key_handle)))
5192 goto out;
5193
5194 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5195 ta_crypt_cmd_allocate_transient_object(c, &session,
5196 TEE_TYPE_GENERIC_SECRET, size_bytes * 8,
5197 &sv_handle)))
5198 goto out;
5199
5200 /* reuse but reset params and param-count */
5201 param_count = 0;
5202
5203 xtest_add_attr(&param_count, params,
5204 TEE_ATTR_ECC_PUBLIC_VALUE_X,
5205 pt->public_x, size_bytes);
5206 xtest_add_attr(&param_count, params,
5207 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5208 pt->public_y, size_bytes);
5209
5210 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5211 ta_crypt_cmd_derive_key(c, &session, op, sv_handle,
5212 params, param_count)))
5213 goto out;
5214
5215 out_size = sizeof(out);
5216 memset(out, 0, sizeof(out));
5217 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5218 ta_crypt_cmd_get_object_buffer_attribute(c, &session,
5219 sv_handle,
5220 TEE_ATTR_SECRET_VALUE, out, &out_size)))
5221 goto out;
5222
5223 if (!ADBG_EXPECT_BUFFER(c, pt->out, size_bytes,
5224 out, out_size))
5225 goto out;
5226
5227 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5228 ta_crypt_cmd_free_operation(c, &session, op)))
5229 goto out;
5230
5231 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5232 ta_crypt_cmd_free_transient_object(c, &session,
5233 sv_handle)))
5234 goto out;
5235
5236 Do_ADBG_EndSubCase(c, "Derive ECDH key - algo = 0x%x",
5237 pt->algo);
5238 }
5239
5240 goto noerror;
5241
5242out:
5243 Do_ADBG_EndSubCase(c, "Derive ECDH key - algo = 0x%x", pt->algo);
5244
5245noerror:
5246 TEEC_CloseSession(&session);
5247}
Jens Wiklander14f48872018-06-29 15:30:13 +02005248ADBG_CASE_DEFINE(regression, 4009, xtest_tee_test_4009,
5249 "Test TEE Internal API Derive key ECDH");
Jens Wiklander70a0b2c2016-05-18 08:39:35 +02005250
5251static void xtest_tee_test_4010(ADBG_Case_t *c)
5252{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005253 TEEC_Session session = { };
5254 uint32_t ret_orig = 0;
5255 TEE_ObjectHandle o = TEE_HANDLE_NULL;
Jens Wiklander70a0b2c2016-05-18 08:39:35 +02005256 static const uint8_t large_key[1024] = { 1, 2, 3, 4, 5, 6 };
5257 static const TEE_Attribute attr = {
5258 .attributeID = TEE_ATTR_SECRET_VALUE,
5259 .content.ref.buffer = (void *)large_key,
5260 .content.ref.length = sizeof(large_key),
5261 };
5262
5263 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5264 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5265 &ret_orig)))
5266 return;
5267
5268 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5269 ta_crypt_cmd_allocate_transient_object(c, &session,
5270 TEE_TYPE_HMAC_SHA256, 1024, &o)))
5271 goto out;
5272
5273 ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_TARGET_DEAD,
5274 ta_crypt_cmd_populate_transient_object(c, &session, o,
5275 &attr, 1));
5276
5277out:
5278 TEEC_CloseSession(&session);
5279}
Jens Wiklander14f48872018-06-29 15:30:13 +02005280ADBG_CASE_DEFINE(regression, 4010, xtest_tee_test_4010,
5281 "Test TEE Internal API create transient object (negative)");
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005282
5283static void xtest_tee_test_4011(ADBG_Case_t *c)
5284{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005285 TEEC_Session s = { };
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005286 size_t key_size = 512;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005287 TEE_ObjectHandle key = TEE_HANDLE_NULL;
5288 TEE_OperationHandle ops = TEE_HANDLE_NULL;
5289 TEE_OperationHandle opv = TEE_HANDLE_NULL;
5290 TEE_OperationHandle ope = TEE_HANDLE_NULL;
5291 TEE_OperationHandle opd = TEE_HANDLE_NULL;
5292 uint32_t ret_orig = 0;
5293 uint8_t in[TEE_SHA1_HASH_SIZE] = { };
5294 uint8_t out[1024] = { };
5295 uint8_t tmp[1024] = { };
5296 size_t out_size = 0;
5297 size_t tmp_size = 0;
5298 size_t n = 0;
5299 size_t m = 0;
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005300 size_t i = 0;
5301
5302 /* Setup session, initialize message to sign, create a keypair */
5303 if (!ADBG_EXPECT_TEEC_SUCCESS(c, xtest_teec_open_session(&s,
5304 &crypt_user_ta_uuid, NULL, &ret_orig)))
5305 return;
5306 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_random_number_generate(c,
5307 &s, in, sizeof(in))))
5308 goto out;
5309 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_transient_object(
5310 c, &s, TEE_TYPE_RSA_KEYPAIR, key_size, &key)))
5311 goto out;
5312 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_generate_key(c, &s,
5313 key, key_size, NULL, 0)))
5314 goto out;
5315
5316 /* Allocate operations for sign, verify, encrypt and decrypt */
5317 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
5318 &ops, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
5319 key_size)))
5320 goto out;
5321 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
5322 &opv, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
5323 key_size)))
5324 goto out;
5325 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
5326 &ope, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT, key_size)))
5327 goto out;
5328 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
5329 &opd, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT, key_size)))
5330 goto out;
5331
5332 /* Assign the keypair to all operations */
5333 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5334 ta_crypt_cmd_set_operation_key(c, &s, ops, key)))
5335 goto out;
5336 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5337 ta_crypt_cmd_set_operation_key(c, &s, opv, key)))
5338 goto out;
5339 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5340 ta_crypt_cmd_set_operation_key(c, &s, ope, key)))
5341 goto out;
5342 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5343 ta_crypt_cmd_set_operation_key(c, &s, opd, key)))
5344 goto out;
5345
5346 /*
5347 * The core of the test case is inspired by the one in libtomcrypt:
5348 * https://github.com/libtom/libtomcrypt/blob/6ad52252688bb34f90b5e79da4830a927e87b81f/testprof/rsa_test.c#L398
5349 *
5350 * Testcase for Bleichenbacher attack
5351 *
5352 * (1) Create a valid signature
5353 * (2) Check that it can be verified
5354 * (3) Transform the package to fetch plain text (using the encrypt
5355 * operation in GP TEE Internal API)
5356 * (4) Forge the structure of PKCS#1-EMSA encoded data
5357 * (4.1) Search for start and end of the padding string
5358 * (4.2) Move the signature to the front of the padding string
5359 * (4.3) Zero the message until the end
5360 * (5) Transform the package back (using the decrypt operation in
5361 * GP TEE Internal API)
5362 * (6) The result should not be valid if the implementation is robust.
5363 */
5364
5365
5366 for (i = 0; i < 9; i++) {
5367 Do_ADBG_Log("Iteration %zu", i);
5368
5369 /* 1 */
5370 out_size = sizeof(out);
5371 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5372 ta_crypt_cmd_asymmetric_sign(c, &s, ops, NULL, 0,
5373 in, sizeof(in), out, &out_size)))
5374 goto out;
5375
5376 /* 2 */
5377 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5378 ta_crypt_cmd_asymmetric_verify(c, &s, opv, NULL, 0,
5379 in, sizeof(in), out, out_size)))
5380 goto out;
5381
5382 /* 3 */
5383 tmp_size = sizeof(tmp);
5384 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5385 ta_crypt_cmd_asymmetric_encrypt(c, &s, ope, NULL, 0,
5386 out, out_size, tmp, &tmp_size)))
5387 goto out;
5388
Etienne Carriere0953bf02018-12-21 15:36:25 +01005389 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, tmp_size, <=, sizeof(tmp)))
5390 goto out;
5391
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005392 /* 4.1 */
Etienne Carriere0953bf02018-12-21 15:36:25 +01005393 for (n = 0; n < tmp_size - i; n++)
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005394 if (tmp[n] == 0xff)
5395 break;
Etienne Carriere0953bf02018-12-21 15:36:25 +01005396
5397 /* Shall find at least a padding start before buffer end */
5398 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, n, <, tmp_size - i - 1))
5399 goto out;
5400
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005401 for (m = n + 1; m < tmp_size; m++)
5402 if (tmp[m] != 0xff)
5403 break;
Etienne Carriere0953bf02018-12-21 15:36:25 +01005404
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005405 /* 4.2 */
5406 memmove(tmp + n + i, tmp + m, tmp_size - m);
Etienne Carriere0953bf02018-12-21 15:36:25 +01005407
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005408 /* 4.3 */
Etienne Carriere0953bf02018-12-21 15:36:25 +01005409 n = n + i + tmp_size - m;
Etienne Carriereacb81c42020-04-24 14:58:58 +02005410
5411 /* Prevent overrun when zeroing buffer end */
5412 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, n, <=, tmp_size))
5413 goto out;
5414
Etienne Carriere0953bf02018-12-21 15:36:25 +01005415 memset(tmp + n, 0, tmp_size - n);
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005416
5417 /* 5 */
5418 out_size = sizeof(out);
5419 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5420 ta_crypt_cmd_asymmetric_decrypt(c, &s, opd, NULL, 0,
5421 tmp, tmp_size, out, &out_size)))
5422 goto out;
5423
5424 /* 6 */
5425 if (!ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_SIGNATURE_INVALID,
5426 ta_crypt_cmd_asymmetric_verify(c, &s, opv, NULL, 0,
5427 in, sizeof(in), out, out_size)))
5428 goto out;
5429 }
5430
5431out:
5432 TEEC_CloseSession(&s);
5433}
Jens Wiklander14f48872018-06-29 15:30:13 +02005434ADBG_CASE_DEFINE(regression, 4011, xtest_tee_test_4011,
5435 "Test TEE Internal API Bleichenbacher attack (negative)");
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005436
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005437static void xtest_tee_test_4012(ADBG_Case_t *c)
5438{
Jens Wiklanderc44350d2022-12-02 20:56:49 +01005439 TEEC_Result res = TEEC_SUCCESS;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005440 TEEC_Session session = { };
5441 uint32_t ret_orig = 0;
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005442 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
5443 /* Fortuna PRNG requires seed <= 32 bytes */
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005444 uint8_t pool_input[32] = { };
5445 time_t t = 0;
5446 struct tm tm_local = { };
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005447
5448 t = time(NULL);
5449 tm_local = *localtime(&t);
5450
5451 memcpy((void *)pool_input, (void *)&tm_local,
5452 sizeof(pool_input) < sizeof(tm_local) ?
5453 sizeof(pool_input) : sizeof(tm_local));
5454
5455
5456 op.params[0].tmpref.buffer = pool_input;
5457 op.params[0].tmpref.size = sizeof(pool_input);
5458 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
5459 TEEC_NONE,
5460 TEEC_NONE,
5461 TEEC_NONE);
5462 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5463 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5464 &ret_orig)))
5465 return;
5466
Jens Wiklanderc44350d2022-12-02 20:56:49 +01005467 res = TEEC_InvokeCommand(&session, TA_CRYPT_CMD_SEED_RNG_POOL,
5468 &op, &ret_orig);
5469 if (res == TEEC_ERROR_ITEM_NOT_FOUND &&
5470 ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, ret_orig,
5471 TEEC_ORIGIN_TRUSTED_APP))
5472 Do_ADBG_Log("System PTA not available, skipping test 4012");
5473 else
5474 ADBG_EXPECT_TEEC_SUCCESS(c, res);
5475
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005476 TEEC_CloseSession(&session);
5477}
Jens Wiklander14f48872018-06-29 15:30:13 +02005478ADBG_CASE_DEFINE(regression, 4012, xtest_tee_test_4012,
5479 "Test seeding RNG entropy");
Joakim Bech83a30ca2019-05-29 11:22:27 +02005480
5481static void xtest_tee_test_4013(ADBG_Case_t *c)
5482{
Jens Wiklanderc44350d2022-12-02 20:56:49 +01005483 TEEC_Result res = TEEC_SUCCESS;
Joakim Bech83a30ca2019-05-29 11:22:27 +02005484 TEEC_Session session = { };
5485 uint32_t ret_orig = 0;
5486 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
5487 uint8_t key[32] = { };
5488 uint8_t extra_data[32] = { };
5489
5490 op.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
5491 TEEC_NONE,
5492 TEEC_NONE,
5493 TEEC_NONE);
5494 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5495 xtest_teec_open_session(&session, &crypt_user_ta_uuid,
5496 NULL, &ret_orig)))
5497 return;
5498
Jens Wiklanderc44350d2022-12-02 20:56:49 +01005499 res = TEEC_InvokeCommand(&session, TA_CRYPT_CMD_DERIVE_TA_UNIQUE_KEY,
5500 &op, &ret_orig);
5501 if (res == TEEC_ERROR_ITEM_NOT_FOUND &&
5502 ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, ret_orig,
5503 TEEC_ORIGIN_TRUSTED_APP)) {
5504 Do_ADBG_Log("System PTA not available, skipping test 4013");
5505 goto out;
5506 }
5507 ADBG_EXPECT_TEEC_SUCCESS(c, res);
Joakim Bech83a30ca2019-05-29 11:22:27 +02005508
5509 /* Negative test using non-secure memory */
5510 memset(&op, 0, sizeof(op));
5511 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
5512 TEEC_MEMREF_TEMP_OUTPUT,
5513 TEEC_NONE,
5514 TEEC_NONE);
5515
5516 op.params[0].tmpref.buffer = extra_data;
5517 op.params[0].tmpref.size = sizeof(extra_data);
5518 op.params[1].tmpref.buffer = key;
5519 op.params[1].tmpref.size = sizeof(key);
5520 (void)ADBG_EXPECT_TEEC_RESULT(c,
5521 TEEC_ERROR_SECURITY,
5522 TEEC_InvokeCommand(&session,
5523 TA_CRYPT_CMD_DERIVE_TA_UNIQUE_KEY_SHM,
5524 &op,
5525 &ret_orig));
5526
Jens Wiklanderc44350d2022-12-02 20:56:49 +01005527out:
Joakim Bech83a30ca2019-05-29 11:22:27 +02005528 TEEC_CloseSession(&session);
5529}
5530ADBG_CASE_DEFINE(regression, 4013, xtest_tee_test_4013,
5531 "Test generation of device unique TA keys");
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005532
5533static void xtest_tee_test_4014(ADBG_Case_t *c)
5534{
5535 TEEC_Session session = { };
5536 uint32_t ret_orig = 0;
5537 TEE_OperationHandle op = TEE_HANDLE_NULL;
5538 TEE_ObjectHandle keyA = TEE_HANDLE_NULL;
5539 TEE_ObjectHandle eph_keyA = TEE_HANDLE_NULL;
5540 TEE_ObjectHandle keyB = TEE_HANDLE_NULL;
5541 TEE_ObjectHandle eph_keyB = TEE_HANDLE_NULL;
5542 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
5543 TEE_Attribute params[9] = { };
5544 size_t param_count = 0;
5545 uint8_t out[128] = { };
5546 size_t out_size = 0;
5547 uint8_t conf_A[32] = { };
5548 uint8_t conf_B[32] = { };
5549
5550 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5551 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5552 &ret_orig)))
5553 return;
5554
5555 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_SM2_KEP,
5556 TEE_ECC_CURVE_SM2)) {
5557 Do_ADBG_Log("SM2 KEP not supported: skip subcase");
5558 goto out;
5559 }
5560
5561 Do_ADBG_BeginSubCase(c, "Initiator side");
5562
5563 /*
5564 * Key exchange protocol running on user A's side. A is initiator.
5565 */
5566
5567 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5568 ta_crypt_cmd_allocate_operation(c, &session, &op,
5569 TEE_ALG_SM2_KEP, TEE_MODE_DERIVE, 512)))
5570 goto out;
5571
5572 /* Allocate and initialize keypair of user A */
5573
5574 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5575 ta_crypt_cmd_allocate_transient_object(c, &session,
5576 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &keyA)))
5577 goto out;
5578
5579 param_count = 0;
5580
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005581 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5582 ARRAY(gmt_003_part5_b2_public_xA));
5583
5584 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5585 ARRAY(gmt_003_part5_b2_public_yA));
5586
5587 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5588 ARRAY(gmt_003_part5_b2_private_A));
5589
5590 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5591 ta_crypt_cmd_populate_transient_object(c, &session, keyA,
5592 params, param_count)))
5593 goto out;
5594
5595 /*
5596 * Allocate and set ephemeral key of user A. Note: it is a regular ECC
5597 * key -- we don't use the *_EPHEMERAL_* attributes flags which are
5598 * reserved for use in TEE_DeriveKey() to pass the ephermeral key of
5599 * user B.
5600 */
5601
5602 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5603 ta_crypt_cmd_allocate_transient_object(c, &session,
5604 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &eph_keyA)))
5605 goto out;
5606
5607 param_count = 0;
5608
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005609 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5610 ARRAY(gmt_003_part5_b2_eph_public_xA));
5611
5612 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5613 ARRAY(gmt_003_part5_b2_eph_public_yA));
5614
5615 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5616 ARRAY(gmt_003_part5_b2_eph_private_A));
5617
5618 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5619 ta_crypt_cmd_populate_transient_object(c, &session, eph_keyA,
5620 params, param_count)))
5621 goto out;
5622
5623 /* Associate user A keys with operation */
5624
5625 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5626 ta_crypt_cmd_set_operation_key2(c, &session, op, keyA,
5627 eph_keyA)))
5628 goto out;
5629
5630 /* Keys have been set, free key objects */
5631
5632 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5633 ta_crypt_cmd_free_transient_object(c, &session, keyA)))
5634 goto out;
5635
5636 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5637 ta_crypt_cmd_free_transient_object(c, &session, eph_keyA)))
5638 goto out;
5639
5640 /* Allocate output object */
5641
5642 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5643 ta_crypt_cmd_allocate_transient_object(c, &session,
5644 TEE_TYPE_GENERIC_SECRET,
5645 sizeof(gmt_003_part5_b2_shared_secret),
5646 &sv_handle)))
5647 goto out;
5648
5649 /* Set key derivation parameters: user A role, user B information */
5650
5651 params[0].attributeID = TEE_ATTR_SM2_KEP_USER;
5652 params[0].content.value.a = 0; /* Initiator role */
5653 params[0].content.value.b = 0; /* Not used */
5654 param_count = 1;
5655
5656 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5657 ARRAY(gmt_003_part5_b2_public_xB));
5658
5659 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5660 ARRAY(gmt_003_part5_b2_public_yB));
5661
5662 xtest_add_attr(&param_count, params,
5663 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_X,
5664 ARRAY(gmt_003_part5_b2_eph_public_xB));
5665
5666 xtest_add_attr(&param_count, params,
5667 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_Y,
5668 ARRAY(gmt_003_part5_b2_eph_public_yB));
5669
5670 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_INITIATOR,
5671 ARRAY(gmt_003_part5_b2_id_A));
5672
5673 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_RESPONDER,
5674 ARRAY(gmt_003_part5_b2_id_B));
5675
5676 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_IN,
5677 ARRAY(gmt_003_part5_b2_conf_B));
5678
5679 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_OUT,
5680 ARRAY(conf_A));
5681
5682 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5683 ta_crypt_cmd_derive_key(c, &session, op, sv_handle, params,
5684 param_count)))
5685 goto out;
5686
5687 out_size = sizeof(out);
5688 memset(out, 0, sizeof(out));
5689 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5690 ta_crypt_cmd_get_object_buffer_attribute(c, &session, sv_handle,
5691 TEE_ATTR_SECRET_VALUE, out, &out_size)))
5692 goto out;
5693
5694 /* Check derived key */
5695 if (!ADBG_EXPECT_BUFFER(c, gmt_003_part5_b2_shared_secret,
5696 sizeof(gmt_003_part5_b2_shared_secret), out,
5697 out_size))
5698 goto out;
5699
5700 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5701 ta_crypt_cmd_free_operation(c, &session, op)))
5702 goto out;
5703
5704 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5705 ta_crypt_cmd_free_transient_object(c, &session, sv_handle)))
5706 goto out;
5707
5708 Do_ADBG_EndSubCase(c, "Initiator side");
5709
5710 Do_ADBG_BeginSubCase(c, "Responder side");
5711
5712 /*
5713 * Key derivation on user B's side
5714 */
5715
5716 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5717 ta_crypt_cmd_allocate_operation(c, &session, &op,
5718 TEE_ALG_SM2_KEP, TEE_MODE_DERIVE, 512)))
5719 goto out;
5720
5721 /* Allocate and initialize keypair of user B */
5722
5723 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5724 ta_crypt_cmd_allocate_transient_object(c, &session,
5725 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &keyB)))
5726 goto out;
5727
5728 param_count = 0;
5729
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005730 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5731 ARRAY(gmt_003_part5_b2_public_xB));
5732
5733 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5734 ARRAY(gmt_003_part5_b2_public_yB));
5735
5736 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5737 ARRAY(gmt_003_part5_b2_private_B));
5738
5739 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5740 ta_crypt_cmd_populate_transient_object(c, &session, keyB,
5741 params, param_count)))
5742 goto out;
5743
5744 /* Allocate and set ephemeral key of user B */
5745
5746 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5747 ta_crypt_cmd_allocate_transient_object(c, &session,
5748 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &eph_keyB)))
5749 goto out;
5750
5751 param_count = 0;
5752
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005753 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5754 ARRAY(gmt_003_part5_b2_eph_public_xB));
5755
5756 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5757 ARRAY(gmt_003_part5_b2_eph_public_yB));
5758
5759 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5760 ARRAY(gmt_003_part5_b2_eph_private_B));
5761
5762 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5763 ta_crypt_cmd_populate_transient_object(c, &session, eph_keyB,
5764 params, param_count)))
5765 goto out;
5766
5767 /* Associate user B keys with operation */
5768
5769 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5770 ta_crypt_cmd_set_operation_key2(c, &session, op, keyB,
5771 eph_keyB)))
5772 goto out;
5773
5774 /* Keys have been set, free key objects */
5775
5776 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5777 ta_crypt_cmd_free_transient_object(c, &session, keyB)))
5778 goto out;
5779
5780 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5781 ta_crypt_cmd_free_transient_object(c, &session, eph_keyB)))
5782 goto out;
5783
5784 /* Allocate output object */
5785
5786 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5787 ta_crypt_cmd_allocate_transient_object(c, &session,
5788 TEE_TYPE_GENERIC_SECRET,
5789 sizeof(gmt_003_part5_b2_shared_secret),
5790 &sv_handle)))
5791 goto out;
5792
5793 /* Set key derivation parameters: user B role, user A information */
5794
5795 params[0].attributeID = TEE_ATTR_SM2_KEP_USER;
5796 params[0].content.value.a = 1; /* Responder role */
5797 params[0].content.value.b = 0; /* Not used */
5798 param_count = 1;
5799
5800 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5801 ARRAY(gmt_003_part5_b2_public_xA));
5802
5803 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5804 ARRAY(gmt_003_part5_b2_public_yA));
5805
5806 xtest_add_attr(&param_count, params,
5807 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_X,
5808 ARRAY(gmt_003_part5_b2_eph_public_xA));
5809
5810 xtest_add_attr(&param_count, params,
5811 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_Y,
5812 ARRAY(gmt_003_part5_b2_eph_public_yA));
5813
5814 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_INITIATOR,
5815 ARRAY(gmt_003_part5_b2_id_A));
5816
5817 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_RESPONDER,
5818 ARRAY(gmt_003_part5_b2_id_B));
5819
5820 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_IN,
5821 ARRAY(gmt_003_part5_b2_conf_A));
5822
5823 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_OUT,
5824 ARRAY(conf_B));
5825
5826 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5827 ta_crypt_cmd_derive_key(c, &session, op, sv_handle, params,
5828 param_count)))
5829 goto out;
5830
5831 out_size = sizeof(out);
5832 memset(out, 0, sizeof(out));
5833 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5834 ta_crypt_cmd_get_object_buffer_attribute(c, &session, sv_handle,
5835 TEE_ATTR_SECRET_VALUE, out, &out_size)))
5836 goto out;
5837
5838 /* Check derived key */
5839 if (!ADBG_EXPECT_BUFFER(c, gmt_003_part5_b2_shared_secret,
5840 sizeof(gmt_003_part5_b2_shared_secret), out,
5841 out_size))
5842 goto out;
5843
5844 Do_ADBG_EndSubCase(c, "Responder side");
5845
5846out:
5847 TEEC_CloseSession(&session);
5848}
5849ADBG_CASE_DEFINE(regression, 4014, xtest_tee_test_4014,
5850 "Test SM2 KEP (key derivation)");
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03005851
5852static void xtest_tee_test_4015(ADBG_Case_t *c)
5853{
5854 TEEC_Session session = { };
5855 uint32_t ret_orig = 0;
5856 TEE_OperationHandle op = TEE_HANDLE_NULL;
5857 TEE_ObjectHandle key_alice = TEE_HANDLE_NULL;
5858 TEE_ObjectHandle key_bob = TEE_HANDLE_NULL;
5859 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
5860 TEE_Attribute params[2] = { };
5861 size_t param_count = 0;
5862 uint8_t out[32] = { };
5863 size_t out_size = 0;
5864 char case_str[40] = "Alice side computes shared secret";
5865
5866 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5867 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5868 &ret_orig)))
5869 return;
5870
5871 Do_ADBG_BeginSubCase(c, "%s", case_str);
5872
5873 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_X25519,
5874 TEE_ECC_CURVE_25519)) {
5875 Do_ADBG_Log("X25519 not supported: skip subcase");
5876 goto out;
5877 }
5878
5879 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5880 ta_crypt_cmd_allocate_operation(c, &session, &op,
5881 TEE_ALG_X25519, TEE_MODE_DERIVE, 256)))
5882 goto out;
5883
5884 /* Allocate and initialize keypair of Alice */
5885 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5886 ta_crypt_cmd_allocate_transient_object(c, &session,
5887 TEE_TYPE_X25519_KEYPAIR, 256, &key_alice)))
5888 goto out;
5889
5890 param_count = 0;
5891
5892 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PUBLIC_VALUE,
5893 ARRAY(x25519_alice_public));
5894
5895 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PRIVATE_VALUE,
5896 ARRAY(x25519_alice_private));
5897
5898 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5899 ta_crypt_cmd_populate_transient_object(c, &session,
5900 key_alice, params, param_count)))
5901 goto out;
5902
5903 /* Associate Alices's keys with operation */
5904 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5905 ta_crypt_cmd_set_operation_key(c, &session, op,
5906 key_alice)))
5907 goto out;
5908
5909 /* Keys have been set, free key objects */
5910 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5911 ta_crypt_cmd_free_transient_object(c, &session,
5912 key_alice)))
5913 goto out;
5914
5915 /* Allocate shared secret output object */
5916 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5917 ta_crypt_cmd_allocate_transient_object(c, &session,
5918 TEE_TYPE_GENERIC_SECRET,
5919 sizeof(x25519_shared_secret), &sv_handle)))
5920 goto out;
5921
5922 /* Reset params */
5923 param_count = 0;
5924
5925 /* Set Bob's public key for Alice side */
5926 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PUBLIC_VALUE,
5927 ARRAY(x25519_bob_public));
5928
5929 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5930 ta_crypt_cmd_derive_key(c, &session, op, sv_handle,
5931 params, param_count)))
5932 goto out;
5933
5934 out_size = sizeof(out);
5935 memset(out, 0, sizeof(out));
5936 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5937 ta_crypt_cmd_get_object_buffer_attribute(c, &session,
5938 sv_handle, TEE_ATTR_SECRET_VALUE, out,
5939 &out_size)))
5940 goto out;
5941
5942 /* Check derived key */
5943 if (!ADBG_EXPECT_BUFFER(c, x25519_shared_secret,
5944 sizeof(x25519_shared_secret), out,
5945 out_size))
5946 goto out;
5947
5948 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5949 ta_crypt_cmd_free_operation(c, &session, op)))
5950 goto out;
5951
5952 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5953 ta_crypt_cmd_free_transient_object(c, &session,
5954 sv_handle)))
5955 goto out;
5956
5957 Do_ADBG_EndSubCase(c, "%s", case_str);
5958
5959 strncpy(case_str, "Bob side computes shared secret",
5960 sizeof(case_str) - 1);
5961
5962 Do_ADBG_BeginSubCase(c, "%s", case_str);
5963
5964 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5965 ta_crypt_cmd_allocate_operation(c, &session, &op,
5966 TEE_ALG_X25519, TEE_MODE_DERIVE, 256)))
5967 goto out;
5968
5969 /* Allocate and initialize keypair of Bob */
5970 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5971 ta_crypt_cmd_allocate_transient_object(c, &session,
5972 TEE_TYPE_X25519_KEYPAIR, 256, &key_bob)))
5973 goto out;
5974
5975 /* Reset params */
5976 param_count = 0;
5977
5978 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PUBLIC_VALUE,
5979 ARRAY(x25519_bob_public));
5980
5981 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PRIVATE_VALUE,
5982 ARRAY(x25519_bob_private));
5983
5984 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5985 ta_crypt_cmd_populate_transient_object(c, &session,
5986 key_bob, params, param_count)))
5987 goto out;
5988
5989 /* Associate Bob's keys with operation */
5990 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5991 ta_crypt_cmd_set_operation_key(c, &session, op,
5992 key_bob)))
5993 goto out;
5994
5995 /* Keys have been set, free key objects */
5996 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5997 ta_crypt_cmd_free_transient_object(c, &session,
5998 key_bob)))
5999 goto out;
6000
6001 /* Allocate shared secret output object */
6002 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6003 ta_crypt_cmd_allocate_transient_object(c, &session,
6004 TEE_TYPE_GENERIC_SECRET,
6005 sizeof(x25519_shared_secret), &sv_handle)))
6006 goto out;
6007
6008 /* Reset params */
6009 param_count = 0;
6010
6011 /* Set Alice's public key for Bob side */
6012 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PUBLIC_VALUE,
6013 ARRAY(x25519_alice_public));
6014
6015 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6016 ta_crypt_cmd_derive_key(c, &session, op, sv_handle,
6017 params, param_count)))
6018 goto out;
6019
6020 out_size = sizeof(out);
6021 memset(out, 0, sizeof(out));
6022 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6023 ta_crypt_cmd_get_object_buffer_attribute(c, &session,
6024 sv_handle, TEE_ATTR_SECRET_VALUE, out,
6025 &out_size)))
6026 goto out;
6027
6028 /* Check derived key */
6029 if (!ADBG_EXPECT_BUFFER(c, x25519_shared_secret,
6030 sizeof(x25519_shared_secret), out,
6031 out_size))
6032 goto out;
6033
6034 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6035 ta_crypt_cmd_free_operation(c, &session, op)))
6036 goto out;
6037
6038 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6039 ta_crypt_cmd_free_transient_object(c, &session,
6040 sv_handle)))
6041 goto out;
6042
6043out:
6044 Do_ADBG_EndSubCase(c, "%s", case_str);
6045 TEEC_CloseSession(&session);
6046}
6047ADBG_CASE_DEFINE(regression, 4015, xtest_tee_test_4015,
6048 "Test TEE Internal API Derive key X25519");
Valerii Chubarab9863c2022-08-12 07:42:29 +00006049
6050static void xtest_tee_test_4016_ed25519(ADBG_Case_t *c)
6051{
6052 TEEC_Session session = { };
6053 TEE_OperationHandle op = TEE_HANDLE_NULL;
6054 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
6055 TEE_Attribute key_attrs[2] = { };
6056 size_t num_key_attrs = 0;
6057 TEE_Attribute attrs[2] = { };
6058 size_t num_attrs = 0;
6059 uint8_t out[64] = { };
6060 size_t out_size = sizeof(out);
6061 size_t n = 0;
6062 uint32_t ret_orig = 0;
6063 size_t max_key_size = 0;
6064
6065 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6066 xtest_teec_open_session(&session, &crypt_user_ta_uuid,
6067 NULL, &ret_orig)))
6068 return;
6069
6070 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_ED25519,
6071 TEE_ECC_CURVE_25519)) {
6072 Do_ADBG_Log("ED25519 not supported: skip subcase");
6073 goto out;
6074 }
6075
6076 for (n = 0; n < ARRAY_SIZE(xtest_ac_eddsa_cases); n++) {
6077 const struct xtest_ac_case *tv = xtest_ac_eddsa_cases + n;
6078
6079 if (tv->algo != TEE_ALG_ED25519)
6080 continue;
6081
6082 num_attrs = 0;
6083 num_key_attrs = 0;
6084 max_key_size = tv->params.eddsa.private_len * 8;
6085
6086 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6087 ta_crypt_cmd_allocate_operation(c, &session, &op,
6088 TEE_ALG_ED25519, tv->mode, max_key_size)))
6089 goto out;
6090
6091 xtest_add_attr(&num_key_attrs, key_attrs,
6092 TEE_ATTR_ED25519_PUBLIC_VALUE,
6093 tv->params.eddsa.public,
6094 tv->params.eddsa.public_len);
6095
6096 if (tv->params.eddsa.flag == 1)
Jens Wiklander7596bd32022-12-02 15:43:37 +01006097 xtest_add_attr_value(&num_attrs, attrs,
6098 TEE_ATTR_EDDSA_PREHASH, 1, 0);
Valerii Chubarab9863c2022-08-12 07:42:29 +00006099
6100 if (tv->params.eddsa.context_len > 0)
6101 xtest_add_attr(&num_attrs, attrs, TEE_ATTR_EDDSA_CTX,
6102 tv->params.eddsa.context,
6103 tv->params.eddsa.context_len);
6104
6105 switch (tv->mode) {
6106 case TEE_MODE_SIGN:
6107 xtest_add_attr(&num_key_attrs, key_attrs,
6108 TEE_ATTR_ED25519_PRIVATE_VALUE,
6109 tv->params.eddsa.private,
6110 tv->params.eddsa.private_len);
6111
6112 if (!ADBG_EXPECT_TRUE(c,
6113 create_key(c, &session, max_key_size,
6114 TEE_TYPE_ED25519_KEYPAIR,
6115 key_attrs, num_key_attrs,
6116 &key_handle)))
6117 goto out;
6118
6119 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6120 ta_crypt_cmd_set_operation_key(c,
6121 &session, op, key_handle)))
6122 goto out;
6123
6124 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6125 ta_crypt_cmd_asymmetric_sign(c,
6126 &session, op,
6127 attrs, num_attrs, tv->ptx,
6128 tv->ptx_len, out, &out_size)))
6129 goto out;
6130
6131 ADBG_EXPECT_BUFFER(c, tv->ctx, tv->ctx_len, out, out_size);
6132
6133 break;
6134
6135 case TEE_MODE_VERIFY:
6136 if (!ADBG_EXPECT_TRUE(c,
6137 create_key(c, &session, max_key_size,
6138 TEE_TYPE_ED25519_PUBLIC_KEY,
6139 key_attrs, num_key_attrs,
6140 &key_handle)))
6141 goto out;
6142
6143 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6144 ta_crypt_cmd_set_operation_key(c,
6145 &session, op, key_handle)))
6146 goto out;
6147
6148 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6149 ta_crypt_cmd_asymmetric_verify(c, &session, op,
6150 attrs, num_attrs,
6151 tv->ptx,
6152 tv->ptx_len,
6153 tv->ctx,
6154 tv->ctx_len)))
6155 goto out;
6156 break;
6157
6158 default:
6159 break;
6160 }
6161
6162 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6163 ta_crypt_cmd_free_operation(c, &session, op)))
6164 goto out;
6165 }
6166out:
6167 TEEC_CloseSession(&session);
6168}
Jens Wiklander7b70ff82022-12-02 20:59:32 +01006169ADBG_CASE_DEFINE(regression, 4016, xtest_tee_test_4016_ed25519,
Valerii Chubarab9863c2022-08-12 07:42:29 +00006170 "Test TEE Internal API ED25519 sign/verify");