blob: c9a2fe0b47fc323df4d86e2e4cc5dc1042124895 [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
Pascal Brandc639ac82015-07-02 08:53:34 +02005 */
6
7#include <stdio.h>
8#include <string.h>
9#include <inttypes.h>
10#include <malloc.h>
Igor Opaniuk7ddaa782018-05-25 15:14:05 +030011#include <time.h>
Pascal Brandc639ac82015-07-02 08:53:34 +020012
13#include "xtest_test.h"
14#include "xtest_helpers.h"
15
16#include <tee_api_types.h>
Gabor Szekely2ad190f2018-09-14 14:05:06 +000017#include <tee_api_defines_extensions.h>
Jens Wiklandercbd8fd12022-11-26 20:38:47 +010018#include <tee_api_compat.h>
Pascal Brandc639ac82015-07-02 08:53:34 +020019#include <ta_crypt.h>
20#include <utee_defines.h>
21#include <util.h>
22
Jerome Forissier213ca8a2017-03-31 11:27:56 +020023#include <regression_4000_data.h>
Cedric Chaumontc7654962015-09-09 14:56:36 +020024#include <nist/186-2ecdsatestvectors.h>
Pascal Brandc639ac82015-07-02 08:53:34 +020025
26#include <assert.h>
27
Pascal Brandc639ac82015-07-02 08:53:34 +020028static TEEC_Result ta_crypt_cmd_reset_operation(ADBG_Case_t *c, TEEC_Session *s,
29 TEE_OperationHandle oph)
30{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010031 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +020032 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010033 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +020034
35 assert((uintptr_t)oph <= UINT32_MAX);
36 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
37 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE,
38 TEEC_NONE);
39 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_RESET_OPERATION, &op,
40 &ret_orig);
41 if (res != TEEC_SUCCESS) {
42 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
43 ret_orig);
44 }
45 return res;
46}
47
48static TEEC_Result ta_crypt_cmd_copy_operation(ADBG_Case_t *c,
49 TEEC_Session *s,
50 TEE_OperationHandle dst_oph,
51 TEE_OperationHandle src_oph)
52{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010053 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +020054 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010055 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +020056
57 assert((uintptr_t)dst_oph <= UINT32_MAX);
58 op.params[0].value.a = (uint32_t)(uintptr_t)dst_oph;
59
60 assert((uintptr_t)src_oph <= UINT32_MAX);
61 op.params[0].value.b = (uint32_t)(uintptr_t)src_oph;
62 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE,
63 TEEC_NONE);
64
65 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_COPY_OPERATION, &op,
66 &ret_orig);
67
68 if (res != TEEC_SUCCESS) {
69 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
70 ret_orig);
71 }
72 return res;
73}
74
75static TEEC_Result ta_crypt_cmd_digest_update(ADBG_Case_t *c, TEEC_Session *s,
76 TEE_OperationHandle oph,
77 const void *chunk,
78 size_t chunk_size)
79{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010080 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +020081 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010082 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +020083
84 assert((uintptr_t)oph <= UINT32_MAX);
85 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
86 op.params[1].tmpref.buffer = (void *)chunk;
87 op.params[1].tmpref.size = chunk_size;
88
89 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
90 TEEC_MEMREF_TEMP_INPUT, TEEC_NONE,
91 TEEC_NONE);
92
93 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_DIGEST_UPDATE, &op, &ret_orig);
94
95 if (res != TEEC_SUCCESS) {
96 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
97 ret_orig);
98 }
99
100 return res;
101}
102
103static TEEC_Result ta_crypt_cmd_digest_do_final(ADBG_Case_t *c, TEEC_Session *s,
104 TEE_OperationHandle oph,
105 const void *chunk,
106 size_t chunk_len, void *hash,
107 size_t *hash_len)
108{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100109 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200110 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100111 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200112
113 assert((uintptr_t)oph <= UINT32_MAX);
114 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
115
116 op.params[1].tmpref.buffer = (void *)chunk;
117 op.params[1].tmpref.size = chunk_len;
118
119 op.params[2].tmpref.buffer = (void *)hash;
120 op.params[2].tmpref.size = *hash_len;
121
122 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
123 TEEC_MEMREF_TEMP_INPUT,
124 TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE);
125
126 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_DIGEST_DO_FINAL, &op,
127 &ret_orig);
128
129 if (res != TEEC_SUCCESS) {
130 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
131 ret_orig);
132 }
133
134 if (res == TEEC_SUCCESS)
135 *hash_len = op.params[2].tmpref.size;
136
137 return res;
138}
139
Jens Wiklander92aded22022-12-07 09:43:56 +0100140static TEEC_Result ta_crypt_cmd_digest_extract(ADBG_Case_t *c, TEEC_Session *s,
141 TEE_OperationHandle oph,
142 void *hash, size_t *hash_len)
143{
144 TEEC_Result res = TEEC_ERROR_GENERIC;
145 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
146 uint32_t ret_orig = 0;
147
148 assert((uintptr_t)oph <= UINT32_MAX);
149 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
150
151 op.params[1].tmpref.buffer = (void *)hash;
152 op.params[1].tmpref.size = *hash_len;
153
154 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
155 TEEC_MEMREF_TEMP_OUTPUT,
156 TEEC_NONE, TEEC_NONE);
157
158 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_DIGEST_EXTRACT, &op,
159 &ret_orig);
160
161 if (res != TEEC_SUCCESS) {
162 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
163 ret_orig);
164 }
165
166 if (res == TEEC_SUCCESS)
167 *hash_len = op.params[1].tmpref.size;
168
169 return res;
170}
Pascal Brandc639ac82015-07-02 08:53:34 +0200171static TEE_Result ta_crypt_cmd_set_operation_key2(ADBG_Case_t *c,
172 TEEC_Session *s,
173 TEE_OperationHandle oph,
174 TEE_ObjectHandle key1,
175 TEE_ObjectHandle key2)
176{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100177 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200178 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100179 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200180
181 assert((uintptr_t)oph <= UINT32_MAX);
182 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
183
184 assert((uintptr_t)key1 <= UINT32_MAX);
185 op.params[0].value.b = (uint32_t)(uintptr_t)key1;
186
187 assert((uintptr_t)key2 <= UINT32_MAX);
188 op.params[1].value.a = (uint32_t)(uintptr_t)key2;
189 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_VALUE_INPUT,
190 TEEC_NONE, TEEC_NONE);
191
192 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_SET_OPERATION_KEY2, &op,
193 &ret_orig);
194
195 if (res != TEEC_SUCCESS) {
196 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
197 ret_orig);
198 }
199
200 return res;
201}
202
203static TEEC_Result ta_crypt_cmd_mac_init(ADBG_Case_t *c, TEEC_Session *s,
204 TEE_OperationHandle oph,
205 const void *iv, size_t iv_len)
206{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100207 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200208 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100209 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200210
211 assert((uintptr_t)oph <= UINT32_MAX);
212 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
213
214 if (iv != NULL) {
215 op.params[1].tmpref.buffer = (void *)iv;
216 op.params[1].tmpref.size = iv_len;
217 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
218 TEEC_MEMREF_TEMP_INPUT,
219 TEEC_NONE, TEEC_NONE);
220 } else {
221 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
222 TEEC_NONE, TEEC_NONE);
223 }
224
225 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_MAC_INIT, &op, &ret_orig);
226
227 if (res != TEEC_SUCCESS) {
228 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
229 ret_orig);
230 }
231
232 return res;
233}
234
235static TEEC_Result ta_crypt_cmd_mac_update(ADBG_Case_t *c, TEEC_Session *s,
236 TEE_OperationHandle oph,
237 const void *chunk, size_t chunk_size)
238{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100239 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200240 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100241 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200242
243 assert((uintptr_t)oph <= UINT32_MAX);
244 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
245
246 op.params[1].tmpref.buffer = (void *)chunk;
247 op.params[1].tmpref.size = chunk_size;
248
249 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
250 TEEC_MEMREF_TEMP_INPUT, TEEC_NONE,
251 TEEC_NONE);
252
253 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_MAC_UPDATE, &op, &ret_orig);
254
255 if (res != TEEC_SUCCESS) {
256 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
257 ret_orig);
258 }
259
260 return res;
261}
262
263static TEEC_Result ta_crypt_cmd_mac_final_compute(ADBG_Case_t *c,
264 TEEC_Session *s,
265 TEE_OperationHandle oph,
266 const void *chunk,
267 size_t chunk_len,
268 void *hash,
269 size_t *hash_len)
270{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100271 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200272 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100273 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200274
275 assert((uintptr_t)oph <= UINT32_MAX);
276 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
277
278 op.params[1].tmpref.buffer = (void *)chunk;
279 op.params[1].tmpref.size = chunk_len;
280
281 op.params[2].tmpref.buffer = (void *)hash;
282 op.params[2].tmpref.size = *hash_len;
283
284 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
285 TEEC_MEMREF_TEMP_INPUT,
286 TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE);
287
288 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_MAC_FINAL_COMPUTE, &op,
289 &ret_orig);
290
291 if (res != TEEC_SUCCESS) {
292 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
293 ret_orig);
294 }
295
296 if (res == TEEC_SUCCESS)
297 *hash_len = op.params[2].tmpref.size;
298
299 return res;
300}
301
Jerome Forissier4f419512021-07-07 14:56:10 +0200302static TEEC_Result ta_crypt_cmd_mac_final_compare(ADBG_Case_t *c,
303 TEEC_Session *s,
304 TEE_OperationHandle oph,
305 const void *chunk,
306 size_t chunk_len,
307 const uint8_t *hash,
308 size_t hash_len)
309{
310 TEEC_Result res = TEEC_ERROR_GENERIC;
311 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
312 uint32_t ret_orig = 0;
313
314 assert((uintptr_t)oph <= UINT32_MAX);
315 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
316
317 op.params[1].tmpref.buffer = (void *)chunk;
318 op.params[1].tmpref.size = chunk_len;
319
320 op.params[2].tmpref.buffer = (void *)hash;
321 op.params[2].tmpref.size = hash_len;
322
323 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
324 TEEC_MEMREF_TEMP_INPUT,
325 TEEC_MEMREF_TEMP_INPUT, TEEC_NONE);
326
327 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_MAC_FINAL_COMPARE, &op,
328 &ret_orig);
329
330 if (res != TEEC_SUCCESS) {
331 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
332 ret_orig);
333 }
334
335 return res;
336}
337
Pascal Brandc639ac82015-07-02 08:53:34 +0200338static TEEC_Result ta_crypt_cmd_cipher_init(ADBG_Case_t *c, TEEC_Session *s,
339 TEE_OperationHandle oph,
340 const void *iv, size_t iv_len)
341{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100342 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200343 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100344 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200345
346 assert((uintptr_t)oph <= UINT32_MAX);
347 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
348
349 if (iv != NULL) {
350 op.params[1].tmpref.buffer = (void *)iv;
351 op.params[1].tmpref.size = iv_len;
352
353 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
354 TEEC_MEMREF_TEMP_INPUT,
355 TEEC_NONE, TEEC_NONE);
356 } else {
357 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
358 TEEC_NONE, TEEC_NONE);
359 }
360
361 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_CIPHER_INIT, &op, &ret_orig);
362
363 if (res != TEEC_SUCCESS) {
364 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
365 ret_orig);
366 }
367
368 return res;
369}
370
371static TEEC_Result ta_crypt_cmd_cipher_update(ADBG_Case_t *c, TEEC_Session *s,
372 TEE_OperationHandle oph,
373 const void *src, size_t src_len,
374 void *dst, size_t *dst_len)
375{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100376 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200377 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100378 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200379
380 assert((uintptr_t)oph <= UINT32_MAX);
381 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
382
383 op.params[1].tmpref.buffer = (void *)src;
384 op.params[1].tmpref.size = src_len;
385
386 op.params[2].tmpref.buffer = dst;
387 op.params[2].tmpref.size = *dst_len;
388
389 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
390 TEEC_MEMREF_TEMP_INPUT,
391 TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE);
392
393 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_CIPHER_UPDATE, &op, &ret_orig);
394
395 if (res != TEEC_SUCCESS) {
396 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
397 ret_orig);
398 }
399
400 if (res == TEEC_SUCCESS)
401 *dst_len = op.params[2].tmpref.size;
402
403 return res;
404}
405
406static TEEC_Result ta_crypt_cmd_cipher_do_final(ADBG_Case_t *c,
407 TEEC_Session *s,
408 TEE_OperationHandle oph,
409 const void *src,
410 size_t src_len,
411 void *dst,
412 size_t *dst_len)
413{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100414 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200415 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100416 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200417
418 assert((uintptr_t)oph <= UINT32_MAX);
419 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
420
421 op.params[1].tmpref.buffer = (void *)src;
422 op.params[1].tmpref.size = src_len;
423
424 op.params[2].tmpref.buffer = (void *)dst;
425 op.params[2].tmpref.size = *dst_len;
426
427 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
428 TEEC_MEMREF_TEMP_INPUT,
429 TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE);
430
431 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_CIPHER_DO_FINAL, &op,
432 &ret_orig);
433
434 if (res != TEEC_SUCCESS) {
435 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
436 ret_orig);
437 }
438
439 if (res == TEEC_SUCCESS)
440 *dst_len = op.params[2].tmpref.size;
441
442 return res;
443}
444
445static TEEC_Result ta_crypt_cmd_random_number_generate(ADBG_Case_t *c,
446 TEEC_Session *s,
447 void *buf,
448 size_t blen)
449{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100450 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200451 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100452 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200453
454 op.params[0].tmpref.buffer = buf;
455 op.params[0].tmpref.size = blen;
456
457 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE,
458 TEEC_NONE, TEEC_NONE);
459
Joakim Bech81f97e32020-05-27 12:14:23 +0200460 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_RANDOM_NUMBER_GENERATE, &op,
Pascal Brandc639ac82015-07-02 08:53:34 +0200461 &ret_orig);
462
463 if (res != TEEC_SUCCESS) {
464 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
465 ret_orig);
466 }
467
468 (void)ADBG_EXPECT_COMPARE_UNSIGNED(c, blen, ==,
469 op.params[0].tmpref.size);
470 return res;
471}
472
473static TEEC_Result ta_crypt_cmd_ae_init(ADBG_Case_t *c, TEEC_Session *s,
474 TEE_OperationHandle oph,
475 const void *nonce, size_t nonce_len,
476 size_t tag_len, size_t aad_len,
477 size_t payload_len)
478{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100479 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200480 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100481 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200482
483 assert((uintptr_t)oph <= UINT32_MAX);
484 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
485 op.params[0].value.b = tag_len;
486
487 op.params[1].tmpref.buffer = (void *)nonce;
488 op.params[1].tmpref.size = nonce_len;
489
490 op.params[2].value.a = aad_len;
491 op.params[2].value.b = payload_len;
492
493 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
494 TEEC_MEMREF_TEMP_INPUT,
Jens Wiklander74a42302015-07-07 01:08:41 +0200495 TEEC_VALUE_INPUT, TEEC_NONE);
Pascal Brandc639ac82015-07-02 08:53:34 +0200496
497 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_AE_INIT, &op, &ret_orig);
498
499 if (res != TEEC_SUCCESS) {
500 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
501 ret_orig);
502 }
503 return res;
504}
505
506static TEEC_Result ta_crypt_cmd_ae_update_aad(ADBG_Case_t *c, TEEC_Session *s,
507 TEE_OperationHandle oph,
508 const void *aad, size_t aad_len)
509{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100510 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200511 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100512 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200513
514 assert((uintptr_t)oph <= UINT32_MAX);
515 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
516
517 op.params[1].tmpref.buffer = (void *)aad;
518 op.params[1].tmpref.size = aad_len;
519
520 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
521 TEEC_MEMREF_TEMP_INPUT, TEEC_NONE,
522 TEEC_NONE);
523
524 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_AE_UPDATE_AAD, &op, &ret_orig);
525
526 if (res != TEEC_SUCCESS) {
527 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
528 ret_orig);
529 }
530
531 return res;
532}
533
534static TEEC_Result ta_crypt_cmd_ae_update(ADBG_Case_t *c,
535 TEEC_Session *s,
536 TEE_OperationHandle oph,
537 const void *src,
538 size_t src_len,
539 void *dst,
540 size_t *dst_len)
541{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100542 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200543 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100544 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200545
546 assert((uintptr_t)oph <= UINT32_MAX);
547 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
548
549 op.params[1].tmpref.buffer = (void *)src;
550 op.params[1].tmpref.size = src_len;
551
552 op.params[2].tmpref.buffer = (void *)dst;
553 op.params[2].tmpref.size = *dst_len;
554
555 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
556 TEEC_MEMREF_TEMP_INPUT,
557 TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE);
558
559 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_AE_UPDATE, &op, &ret_orig);
560
561 if (res != TEEC_SUCCESS) {
562 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
563 ret_orig);
564 }
565
566 if (res == TEEC_SUCCESS)
567 *dst_len = op.params[2].tmpref.size;
568
569 return res;
570}
571
572static TEEC_Result ta_crypt_cmd_ae_encrypt_final(ADBG_Case_t *c,
573 TEEC_Session *s,
574 TEE_OperationHandle oph,
575 const void *src,
576 size_t src_len, void *dst,
577 size_t *dst_len, void *tag,
578 size_t *tag_len)
579{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100580 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200581 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100582 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200583
584 assert((uintptr_t)oph <= UINT32_MAX);
585 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
586
587 op.params[1].tmpref.buffer = (void *)src;
588 op.params[1].tmpref.size = src_len;
589
590 op.params[2].tmpref.buffer = (void *)dst;
591 op.params[2].tmpref.size = *dst_len;
592
593 op.params[3].tmpref.buffer = (void *)tag;
594 op.params[3].tmpref.size = *tag_len;
595
596 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
597 TEEC_MEMREF_TEMP_INPUT,
598 TEEC_MEMREF_TEMP_OUTPUT,
599 TEEC_MEMREF_TEMP_OUTPUT);
600
601 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_AE_ENCRYPT_FINAL, &op,
602 &ret_orig);
603
604 if (res != TEEC_SUCCESS) {
605 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
606 ret_orig);
607 }
608
609 if (res == TEEC_SUCCESS) {
610 *dst_len = op.params[2].tmpref.size;
611 *tag_len = op.params[3].tmpref.size;
612 }
613
614 return res;
615}
616
617static TEEC_Result ta_crypt_cmd_ae_decrypt_final(ADBG_Case_t *c,
618 TEEC_Session *s,
619 TEE_OperationHandle oph,
620 const void *src, size_t src_len,
621 void *dst, size_t *dst_len,
622 const void *tag, size_t tag_len)
623{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100624 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200625 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100626 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200627
628 assert((uintptr_t)oph <= UINT32_MAX);
629 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
630
631 op.params[1].tmpref.buffer = (void *)src;
632 op.params[1].tmpref.size = src_len;
633
634 op.params[2].tmpref.buffer = dst;
635 op.params[2].tmpref.size = *dst_len;
636
637 op.params[3].tmpref.buffer = (void *)tag;
638 op.params[3].tmpref.size = tag_len;
639
640 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
641 TEEC_MEMREF_TEMP_INPUT,
642 TEEC_MEMREF_TEMP_OUTPUT,
643 TEEC_MEMREF_TEMP_INPUT);
644
645 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_AE_DECRYPT_FINAL, &op,
646 &ret_orig);
647
648 if (res != TEEC_SUCCESS) {
649 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
650 ret_orig);
651 }
652
653 if (res == TEEC_SUCCESS)
654 *dst_len = op.params[2].tmpref.size;
655
656 return res;
657}
658
659static TEEC_Result ta_crypt_cmd_asymmetric_operate(ADBG_Case_t *c,
660 TEEC_Session *s,
661 TEE_OperationHandle oph,
662 uint32_t cmd,
663 const TEE_Attribute *params,
664 uint32_t paramCount,
665 const void *src,
666 size_t src_len,
667 void *dst,
668 size_t *dst_len)
669{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100670 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200671 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100672 uint32_t ret_orig = 0;
673 uint8_t *buf = NULL;
674 size_t blen = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200675
676 res = pack_attrs(params, paramCount, &buf, &blen);
677 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
678 return res;
679
680 assert((uintptr_t)oph <= UINT32_MAX);
681 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
682
683 op.params[1].tmpref.buffer = buf;
684 op.params[1].tmpref.size = blen;
685
686 op.params[2].tmpref.buffer = (void *)src;
687 op.params[2].tmpref.size = src_len;
688
689 op.params[3].tmpref.buffer = dst;
690 op.params[3].tmpref.size = *dst_len;
691
692 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
693 TEEC_MEMREF_TEMP_INPUT,
694 TEEC_MEMREF_TEMP_INPUT,
695 TEEC_MEMREF_TEMP_OUTPUT);
696
697 res = TEEC_InvokeCommand(s, cmd, &op, &ret_orig);
698
699 if (res != TEEC_SUCCESS) {
700 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
701 ret_orig);
702 }
703
704 if (res == TEEC_SUCCESS)
705 *dst_len = op.params[3].tmpref.size;
706
707 free(buf);
708 return res;
709}
710
711static TEEC_Result ta_crypt_cmd_asymmetric_encrypt(ADBG_Case_t *c,
712 TEEC_Session *s,
713 TEE_OperationHandle oph,
714 const TEE_Attribute *params,
715 uint32_t paramCount,
716 const void *src,
717 size_t src_len,
718 void *dst,
719 size_t *dst_len)
720{
721 return ta_crypt_cmd_asymmetric_operate(c, s, oph,
722 TA_CRYPT_CMD_ASYMMETRIC_ENCRYPT,
723 params, paramCount,
724 src, src_len, dst, dst_len);
725}
726
727static TEEC_Result ta_crypt_cmd_asymmetric_decrypt(ADBG_Case_t *c,
728 TEEC_Session *s,
729 TEE_OperationHandle oph,
730 const TEE_Attribute *params,
731 uint32_t paramCount,
732 const void *src,
733 size_t src_len,
734 void *dst,
735 size_t *dst_len)
736{
737 return ta_crypt_cmd_asymmetric_operate(c, s, oph,
738 TA_CRYPT_CMD_ASYMMETRIC_DECRYPT,
739 params, paramCount,
740 src, src_len, dst, dst_len);
741}
742
743static TEEC_Result ta_crypt_cmd_asymmetric_sign(ADBG_Case_t *c,
744 TEEC_Session *s,
745 TEE_OperationHandle oph,
746 const TEE_Attribute *params,
747 uint32_t paramCount,
748 const void *digest,
749 size_t digest_len,
750 void *signature,
751 size_t *signature_len)
752{
753 return ta_crypt_cmd_asymmetric_operate(c, s, oph,
754 TA_CRYPT_CMD_ASYMMETRIC_SIGN_DIGEST, params, paramCount,
755 digest, digest_len, signature, signature_len);
756}
757
758static TEEC_Result ta_crypt_cmd_asymmetric_verify(ADBG_Case_t *c,
759 TEEC_Session *s,
760 TEE_OperationHandle oph,
761 const TEE_Attribute *params,
762 uint32_t paramCount,
763 const void *digest,
764 size_t digest_len,
765 const void *signature,
766 size_t signature_len)
767{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100768 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200769 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100770 uint32_t ret_orig = 0;
771 uint8_t *buf = NULL;
772 size_t blen = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200773
774 res = pack_attrs(params, paramCount, &buf, &blen);
775 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
776 return res;
777
778 assert((uintptr_t)oph <= UINT32_MAX);
779 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
780
781 op.params[1].tmpref.buffer = buf;
782 op.params[1].tmpref.size = blen;
783
784 op.params[2].tmpref.buffer = (void *)digest;
785 op.params[2].tmpref.size = digest_len;
786
787 op.params[3].tmpref.buffer = (void *)signature;
788 op.params[3].tmpref.size = signature_len;
789
790 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
791 TEEC_MEMREF_TEMP_INPUT,
792 TEEC_MEMREF_TEMP_INPUT,
793 TEEC_MEMREF_TEMP_INPUT);
794
795 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_ASYMMETRIC_VERIFY_DIGEST,
796 &op, &ret_orig);
797
798 if (res != TEEC_SUCCESS) {
799 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
800 ret_orig);
801 }
802
803 free(buf);
804 return res;
805}
806
807static TEEC_Result ta_crypt_cmd_get_object_value_attribute(ADBG_Case_t *c,
808 TEEC_Session *s,
809 TEE_ObjectHandle o,
810 uint32_t attr_id,
811 uint32_t *valuea,
812 uint32_t *valueb)
813{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100814 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200815 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100816 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200817
818 assert((uintptr_t)o <= UINT32_MAX);
819 op.params[0].value.a = (uint32_t)(uintptr_t)o;
820 op.params[0].value.b = attr_id;
821 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_VALUE_OUTPUT,
822 TEEC_NONE, TEEC_NONE);
823
824 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_GET_OBJECT_VALUE_ATTRIBUTE,
825 &op, &ret_orig);
826
827 if (res != TEEC_SUCCESS) {
828 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
829 ret_orig);
830 }
831
832 if (res == TEEC_SUCCESS) {
833 *valuea = op.params[1].value.a;
834 *valueb = op.params[1].value.b;
835 }
836
837 return res;
838}
839
840static TEEC_Result ta_crypt_cmd_generate_key(ADBG_Case_t *c,
841 TEEC_Session *s,
842 TEE_ObjectHandle o,
843 uint32_t key_size,
844 const TEE_Attribute *params,
845 uint32_t paramCount)
846{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100847 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200848 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100849 uint32_t ret_orig = 0;
850 uint8_t *buf = NULL;
851 size_t blen = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200852
853 res = pack_attrs(params, paramCount, &buf, &blen);
854 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
855 return res;
856
857 assert((uintptr_t)o <= UINT32_MAX);
858 op.params[0].value.a = (uint32_t)(uintptr_t)o;
859 op.params[0].value.b = key_size;
860
861 op.params[1].tmpref.buffer = buf;
862 op.params[1].tmpref.size = blen;
863
864 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
865 TEEC_MEMREF_TEMP_INPUT, TEEC_NONE,
866 TEEC_NONE);
867
868 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_GENERATE_KEY, &op, &ret_orig);
869
870 if (res != TEEC_SUCCESS) {
871 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
872 ret_orig);
873 }
874
875 free(buf);
876 return res;
877}
878
879static const uint8_t hash_data_md5_in1[] = {
880 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'
881};
882
883static const uint8_t hash_data_md5_out1[] = {
884 0x61, 0x12, 0x71, 0x83, 0x70, 0x8d, 0x3a, 0xc7,
885 0xf1, 0x9b, 0x66, 0x06, 0xfc, 0xae, 0x7d, 0xf6
886};
887
888static const uint8_t hash_data_sha1_in1[] = {
889 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'
890};
891
892static const uint8_t hash_data_sha1_out1[] = {
893 0x4b, 0x98, 0x92, 0xb6, 0x52, 0x72, 0x14, 0xaf,
894 0xc6, 0x55, 0xb8, 0xaa, 0x52, 0xf4, 0xd2, 0x03,
895 0xc1, 0x5e, 0x7c, 0x9c
896};
897
898static const uint8_t hash_data_sha224_in1[] = {
899 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'
900};
901
902static const uint8_t hash_data_sha224_out1[] = {
903 0x08, 0x21, 0x69, 0xf9, 0x77, 0x1b, 0x80, 0x15,
904 0xf3, 0x97, 0xae, 0xde, 0x5b, 0xba, 0xa2, 0x72,
905 0x2d, 0x8f, 0x5c, 0x19, 0xfe, 0xd2, 0xe2, 0x68,
906 0x92, 0x49, 0xd8, 0x44
907};
908
909static const uint8_t hash_data_sha256_in1[] = { 'a', 'b', 'c' };
910
911static const uint8_t hash_data_sha256_out1[] = {
912 0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea,
913 0x41, 0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23,
914 0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c,
915 0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad
916};
917
918static const uint8_t hash_data_sha256_in2[] = { 'e', 'f', 'g' };
919
920static const uint8_t hash_data_sha256_out2[] = {
921 0xd4, 0xff, 0xe8, 0xe9, 0xee, 0x0b, 0x48, 0xeb,
922 0xa7, 0x16, 0x70, 0x61, 0x23, 0xa7, 0x18, 0x7f,
923 0x32, 0xea, 0xe3, 0xbd, 0xcb, 0x0e, 0x77, 0x63,
924 0xe4, 0x1e, 0x53, 0x32, 0x67, 0xbd, 0x8a, 0x53
925};
926
927
928static const uint8_t hash_data_sha384_in1[] = {
929 'a', 'b', 'c', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'
930};
931
932static const uint8_t hash_data_sha384_out1[] = {
933 0x4c, 0xab, 0x80, 0x9d, 0x96, 0x84, 0x01, 0x47,
934 0x67, 0x0a, 0xc1, 0x7a, 0xb6, 0xb9, 0xf7, 0x6e,
935 0x35, 0xa6, 0xb0, 0x8c, 0xf5, 0x2a, 0x3d, 0x64,
936 0x9a, 0x8c, 0x7e, 0x0c, 0x55, 0x45, 0xd3, 0x7d,
937 0x1f, 0x7f, 0x28, 0x34, 0x96, 0x14, 0x44, 0x2a,
938 0xf5, 0x98, 0xa2, 0x95, 0x24, 0x76, 0x53, 0x97
939};
940
941static const uint8_t hash_data_sha512_in1[] = {
942 'a', 'b', 'c', 'd', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'
943};
944
945static const uint8_t hash_data_sha512_out1[] = {
946 0x20, 0xd8, 0x64, 0x4f, 0x54, 0xa2, 0x5f, 0x6f,
947 0x0a, 0xf9, 0xd5, 0x27, 0x7d, 0x17, 0xa8, 0x99,
948 0x4c, 0x64, 0x3f, 0xd0, 0xf3, 0x83, 0x36, 0xee,
949 0x93, 0x12, 0x55, 0xcd, 0x2e, 0x12, 0x34, 0xa0,
950 0xc2, 0xaa, 0xf9, 0xbb, 0x15, 0xc5, 0xe9, 0xfa,
951 0xf7, 0xa7, 0xda, 0xb8, 0x2f, 0x72, 0xa0, 0x47,
952 0xe3, 0x02, 0x04, 0xe8, 0xa0, 0x35, 0x0c, 0x96,
953 0x26, 0xd1, 0xcb, 0x8b, 0x47, 0x45, 0x25, 0xd0
954};
955
Jens Wiklander72967ae2022-12-07 08:07:43 +0100956/* SHA-3 vectors from https://www.di-mgt.com.au/sha_testvectors.html */
957#define hash_data_sha3_in1 hash_data_sha256_in1
958
959static const uint8_t hash_data_sha3_224_out1[] = {
960 0xe6, 0x42, 0x82, 0x4c, 0x3f, 0x8c, 0xf2, 0x4a,
961 0xd0, 0x92, 0x34, 0xee, 0x7d, 0x3c, 0x76, 0x6f,
962 0xc9, 0xa3, 0xa5, 0x16, 0x8d, 0x0c, 0x94, 0xad,
963 0x73, 0xb4, 0x6f, 0xdf
964};
965
966static const uint8_t hash_data_sha3_256_out1[] = {
967 0x3a, 0x98, 0x5d, 0xa7, 0x4f, 0xe2, 0x25, 0xb2,
968 0x04, 0x5c, 0x17, 0x2d, 0x6b, 0xd3, 0x90, 0xbd,
969 0x85, 0x5f, 0x08, 0x6e, 0x3e, 0x9d, 0x52, 0x5b,
970 0x46, 0xbf, 0xe2, 0x45, 0x11, 0x43, 0x15, 0x32
971};
972
973static const uint8_t hash_data_sha3_384_out1[] = {
974 0xec, 0x01, 0x49, 0x82, 0x88, 0x51, 0x6f, 0xc9,
975 0x26, 0x45, 0x9f, 0x58, 0xe2, 0xc6, 0xad, 0x8d,
976 0xf9, 0xb4, 0x73, 0xcb, 0x0f, 0xc0, 0x8c, 0x25,
977 0x96, 0xda, 0x7c, 0xf0, 0xe4, 0x9b, 0xe4, 0xb2,
978 0x98, 0xd8, 0x8c, 0xea, 0x92, 0x7a, 0xc7, 0xf5,
979 0x39, 0xf1, 0xed, 0xf2, 0x28, 0x37, 0x6d, 0x25
980};
981
982static const uint8_t hash_data_sha3_512_out1[] = {
983 0xb7, 0x51, 0x85, 0x0b, 0x1a, 0x57, 0x16, 0x8a,
984 0x56, 0x93, 0xcd, 0x92, 0x4b, 0x6b, 0x09, 0x6e,
985 0x08, 0xf6, 0x21, 0x82, 0x74, 0x44, 0xf7, 0x0d,
986 0x88, 0x4f, 0x5d, 0x02, 0x40, 0xd2, 0x71, 0x2e,
987 0x10, 0xe1, 0x16, 0xe9, 0x19, 0x2a, 0xf3, 0xc9,
988 0x1a, 0x7e, 0xc5, 0x76, 0x47, 0xe3, 0x93, 0x40,
989 0x57, 0x34, 0x0b, 0x4c, 0xf4, 0x08, 0xd5, 0xa5,
990 0x65, 0x92, 0xf8, 0x27, 0x4e, 0xec, 0x53, 0xf0
991};
992
993/*
994 * SHAKE output generated with:
995 * https://asecuritysite.com/hash/shake?m=abc&l=54
996 */
997static const uint8_t hash_data_shake128_out1[] = {
998 0x58, 0x81, 0x09, 0x2d, 0xd8, 0x18, 0xbf, 0x5c,
999 0xf8, 0xa3, 0xdd, 0xb7, 0x93, 0xfb, 0xcb, 0xa7,
1000 0x40, 0x97, 0xd5, 0xc5, 0x26, 0xa6, 0xd3, 0x5f,
1001 0x97, 0xb8, 0x33, 0x51, 0x94, 0x0f, 0x2c, 0xc8,
1002 0x44, 0xc5, 0x0a, 0xf3, 0x2a, 0xcd, 0x3f, 0x2c,
1003 0xdd, 0x06, 0x65, 0x68, 0x70, 0x6f, 0x50, 0x9b,
1004 0xc1, 0xbd, 0xde, 0x58, 0x29, 0x5d
1005};
1006
1007static const uint8_t hash_data_shake256_out1[] = {
1008 0x48, 0x33, 0x66, 0x60, 0x13, 0x60, 0xa8, 0x77,
1009 0x1c, 0x68, 0x63, 0x08, 0x0c, 0xc4, 0x11, 0x4d,
1010 0x8d, 0xb4, 0x45, 0x30, 0xf8, 0xf1, 0xe1, 0xee,
1011 0x4f, 0x94, 0xea, 0x37, 0xe7, 0x8b, 0x57, 0x39,
1012 0xd5, 0xa1, 0x5b, 0xef, 0x18, 0x6a, 0x53, 0x86,
1013 0xc7, 0x57, 0x44, 0xc0, 0x52, 0x7e, 0x1f, 0xaa,
1014 0x9f, 0x87, 0x26, 0xe4, 0x62, 0xa1
1015};
1016
Jerome Forissier3ed850a2019-12-13 10:58:23 +01001017/*
1018 * SM3
1019 * https://tools.ietf.org/html/draft-sca-cfrg-sm3-02
Jerome Forissier9f17e262019-12-13 14:12:41 +01001020 * Appendix A.1
Jerome Forissier3ed850a2019-12-13 10:58:23 +01001021 */
1022static const uint8_t hash_data_sm3_a1_in[3] = "abc";
1023
1024static const uint8_t hash_data_sm3_a1_out[] = {
1025 0x66, 0xc7, 0xf0, 0xf4, 0x62, 0xee, 0xed, 0xd9,
1026 0xd1, 0xf2, 0xd4, 0x6b, 0xdc, 0x10, 0xe4, 0xe2,
1027 0x41, 0x67, 0xc4, 0x87, 0x5c, 0xf2, 0xf7, 0xa2,
1028 0x29, 0x7d, 0xa0, 0x2b, 0x8f, 0x4b, 0xa8, 0xe0
1029};
1030
1031/*
1032 * SM3
1033 * https://tools.ietf.org/html/draft-sca-cfrg-sm3-02
Jerome Forissier9f17e262019-12-13 14:12:41 +01001034 * Appendix A.2
Jerome Forissier3ed850a2019-12-13 10:58:23 +01001035 */
1036static const uint8_t hash_data_sm3_a2_in[] = {
1037 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
1038 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
1039 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
1040 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};
1046
1047static const uint8_t hash_data_sm3_a2_out[] = {
1048 0xde, 0xbe, 0x9f, 0xf9, 0x22, 0x75, 0xb8, 0xa1,
1049 0x38, 0x60, 0x48, 0x89, 0xc1, 0x8e, 0x5a, 0x4d,
1050 0x6f, 0xdb, 0x70, 0xe5, 0x38, 0x7e, 0x57, 0x65,
1051 0x29, 0x3d, 0xcb, 0xa3, 0x9c, 0x0c, 0x57, 0x32
1052};
1053
Pascal Brandc639ac82015-07-02 08:53:34 +02001054struct xtest_hash_case {
1055 uint32_t algo;
1056 size_t in_incr;
1057 const uint8_t *in;
1058 size_t in_len;
1059 const uint8_t *out;
1060 size_t out_len;
1061};
1062
1063#define XTEST_HASH_CASE(algo, in_incr, in, out) \
1064 { (algo), (in_incr), (in), ARRAY_SIZE(in), (out), ARRAY_SIZE(out) }
1065
1066static const struct xtest_hash_case hash_cases[] = {
1067 XTEST_HASH_CASE(TEE_ALG_MD5, 6, hash_data_md5_in1,
1068 hash_data_md5_out1),
1069 XTEST_HASH_CASE(TEE_ALG_SHA1, 3, hash_data_sha1_in1,
1070 hash_data_sha1_out1),
1071 XTEST_HASH_CASE(TEE_ALG_SHA224, 7, hash_data_sha224_in1,
1072 hash_data_sha224_out1),
1073 XTEST_HASH_CASE(TEE_ALG_SHA256, 1, hash_data_sha256_in1,
1074 hash_data_sha256_out1),
1075 XTEST_HASH_CASE(TEE_ALG_SHA256, 1, hash_data_sha256_in2,
1076 hash_data_sha256_out2),
1077 XTEST_HASH_CASE(TEE_ALG_SHA384, 1, hash_data_sha384_in1,
1078 hash_data_sha384_out1),
1079 XTEST_HASH_CASE(TEE_ALG_SHA512, 1, hash_data_sha512_in1,
1080 hash_data_sha512_out1),
Jens Wiklander72967ae2022-12-07 08:07:43 +01001081 XTEST_HASH_CASE(TEE_ALG_SHA3_224, 1, hash_data_sha3_in1,
1082 hash_data_sha3_224_out1),
1083 XTEST_HASH_CASE(TEE_ALG_SHA3_256, 1, hash_data_sha3_in1,
1084 hash_data_sha3_256_out1),
1085 XTEST_HASH_CASE(TEE_ALG_SHA3_384, 1, hash_data_sha3_in1,
1086 hash_data_sha3_384_out1),
1087 XTEST_HASH_CASE(TEE_ALG_SHA3_512, 1, hash_data_sha3_in1,
1088 hash_data_sha3_512_out1),
1089 XTEST_HASH_CASE(TEE_ALG_SHAKE128, 1, hash_data_sha3_in1,
1090 hash_data_shake128_out1),
1091 XTEST_HASH_CASE(TEE_ALG_SHAKE256, 1, hash_data_sha3_in1,
1092 hash_data_shake256_out1),
Jerome Forissier3ed850a2019-12-13 10:58:23 +01001093 XTEST_HASH_CASE(TEE_ALG_SM3, 2, hash_data_sm3_a1_in,
1094 hash_data_sm3_a1_out),
1095 XTEST_HASH_CASE(TEE_ALG_SM3, 19, hash_data_sm3_a2_in,
1096 hash_data_sm3_a2_out),
Pascal Brandc639ac82015-07-02 08:53:34 +02001097};
1098
1099static void xtest_tee_test_4001(ADBG_Case_t *c)
1100{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001101 TEEC_Session session = { };
1102 uint32_t ret_orig = 0;
1103 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001104
1105 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1106 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
1107 &ret_orig)))
1108 return;
1109
1110
1111 for (n = 0; n < ARRAY_SIZE(hash_cases); n++) {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001112 TEE_OperationHandle op1 = TEE_HANDLE_NULL;
1113 TEE_OperationHandle op2 = TEE_HANDLE_NULL;
1114 uint8_t out[64] = { };
1115 size_t out_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001116
Jerome Forissier87b00c02020-01-22 16:33:12 +01001117 if (hash_cases[n].algo == TEE_ALG_SM3 &&
1118 !ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_SM3,
1119 TEE_CRYPTO_ELEMENT_NONE)) {
1120 Do_ADBG_Log("SM3 not supported: skip subcase");
1121 continue;
1122 }
1123
Pascal Brandc639ac82015-07-02 08:53:34 +02001124 Do_ADBG_BeginSubCase(c, "Hash case %d algo 0x%x",
1125 (int)n, (unsigned int)hash_cases[n].algo);
1126
1127 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1128 ta_crypt_cmd_allocate_operation(c, &session, &op1,
1129 hash_cases[n].algo,
1130 TEE_MODE_DIGEST, 0)))
1131 goto out;
1132
1133 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1134 ta_crypt_cmd_allocate_operation(c, &session, &op2,
1135 hash_cases[n].algo,
1136 TEE_MODE_DIGEST, 0)))
1137 goto out;
1138
1139 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1140 ta_crypt_cmd_digest_update(c, &session, op1,
1141 hash_cases[n].in,
1142 hash_cases[n].in_incr)))
1143 goto out;
1144
1145 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1146 ta_crypt_cmd_copy_operation(c, &session, op2, op1)))
1147 goto out;
1148
Jens Wiklander72967ae2022-12-07 08:07:43 +01001149 out_size = hash_cases[n].out_len;
Pascal Brandc639ac82015-07-02 08:53:34 +02001150 memset(out, 0, sizeof(out));
1151 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1152 ta_crypt_cmd_digest_do_final(c, &session, op2,
1153 hash_cases[n].in + hash_cases[n].in_incr,
1154 hash_cases[n].in_len - hash_cases[n].in_incr,
1155 out, &out_size)))
1156 goto out;
1157
1158 (void)ADBG_EXPECT_BUFFER(c, hash_cases[n].out,
1159 hash_cases[n].out_len, out, out_size);
1160
1161 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1162 ta_crypt_cmd_reset_operation(c, &session, op1)))
1163 goto out;
1164
Jens Wiklander72967ae2022-12-07 08:07:43 +01001165 out_size = hash_cases[n].out_len;
Pascal Brandc639ac82015-07-02 08:53:34 +02001166 memset(out, 0, sizeof(out));
1167 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1168 ta_crypt_cmd_digest_do_final(c, &session, op1,
1169 hash_cases[n].in,
1170 hash_cases[n].in_len, out,
1171 &out_size)))
1172 goto out;
1173
1174 (void)ADBG_EXPECT_BUFFER(c, hash_cases[n].out,
1175 hash_cases[n].out_len, out, out_size);
1176
Jerome Forissier1e05e262015-07-29 16:09:07 +02001177 /*
1178 * Invoke TEE_DigestDoFinal() a second time to check that state
1179 * was properly reset
1180 */
Jens Wiklander72967ae2022-12-07 08:07:43 +01001181 out_size = hash_cases[n].out_len;
Jerome Forissier1e05e262015-07-29 16:09:07 +02001182 memset(out, 0, sizeof(out));
1183 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1184 ta_crypt_cmd_digest_do_final(c, &session, op1,
1185 hash_cases[n].in,
1186 hash_cases[n].in_len, out,
1187 &out_size)))
1188 goto out;
1189
1190 (void)ADBG_EXPECT_BUFFER(c, hash_cases[n].out,
1191 hash_cases[n].out_len, out, out_size);
1192
Jens Wiklander92aded22022-12-07 09:43:56 +01001193 /*
1194 * Test that TEE_DigestExtract() and TEE_DigestDoFinal()
1195 * work together.
1196 */
1197
1198 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1199 ta_crypt_cmd_digest_update(c, &session, op1,
1200 hash_cases[n].in,
1201 hash_cases[n].in_len)))
1202 goto out;
1203
1204 out_size = hash_cases[n].in_incr;
1205 memset(out, 0, sizeof(out));
1206 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1207 ta_crypt_cmd_digest_extract(c, &session, op1,
1208 out, &out_size)))
1209 goto out;
1210 ADBG_EXPECT_BUFFER(c, hash_cases[n].out,
1211 hash_cases[n].in_incr, out, out_size);
1212
1213 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1214 ta_crypt_cmd_copy_operation(c, &session, op2, op1)))
1215 goto out;
1216
1217 out_size = hash_cases[n].out_len - hash_cases[n].in_incr;
1218 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1219 ta_crypt_cmd_digest_do_final(c, &session, op1,
1220 NULL, 0, out, &out_size)))
1221 goto out;
1222 ADBG_EXPECT_BUFFER(c, hash_cases[n].out + hash_cases[n].in_incr,
1223 hash_cases[n].out_len -
1224 hash_cases[n].in_incr, out, out_size);
1225
1226 out_size = hash_cases[n].out_len - hash_cases[n].in_incr;
1227 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1228 ta_crypt_cmd_digest_extract(c, &session, op2,
1229 out, &out_size)))
1230 goto out;
1231 ADBG_EXPECT_BUFFER(c, hash_cases[n].out + hash_cases[n].in_incr,
1232 hash_cases[n].out_len -
1233 hash_cases[n].in_incr, out, out_size);
1234
Pascal Brandc639ac82015-07-02 08:53:34 +02001235 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1236 ta_crypt_cmd_free_operation(c, &session, op1)))
1237 goto out;
1238
1239 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1240 ta_crypt_cmd_free_operation(c, &session, op2)))
1241 goto out;
1242
1243 Do_ADBG_EndSubCase(c, NULL);
1244 }
1245
1246out:
1247 TEEC_CloseSession(&session);
1248}
Jens Wiklander14f48872018-06-29 15:30:13 +02001249ADBG_CASE_DEFINE(regression, 4001, xtest_tee_test_4001,
1250 "Test TEE Internal API hash operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02001251
Pascal Brandc639ac82015-07-02 08:53:34 +02001252struct xtest_mac_case {
1253 uint32_t algo;
1254 uint32_t key_type;
1255 const uint8_t *key;
1256 size_t key_len;
1257 size_t in_incr;
1258 const uint8_t *in;
1259 size_t in_len;
1260 const uint8_t *out;
1261 size_t out_len;
Jerome Forissier3dec7442019-01-30 17:50:05 +01001262 bool multiple_incr;
Pascal Brandc639ac82015-07-02 08:53:34 +02001263};
1264
Jerome Forissier3dec7442019-01-30 17:50:05 +01001265#define XTEST_MAC_CASE_1(algo, key_type, key, in_incr, in, out) \
Pascal Brandc639ac82015-07-02 08:53:34 +02001266 { (algo), (key_type), (key), ARRAY_SIZE(key), \
Jerome Forissier3dec7442019-01-30 17:50:05 +01001267 (in_incr), (in), ARRAY_SIZE(in), (out), ARRAY_SIZE(out), false }
1268
1269#define XTEST_MAC_CASE_MULT(algo, key_type, key, in_incr, in, out) \
1270 { (algo), (key_type), (key), ARRAY_SIZE(key), \
1271 (in_incr), (in), ARRAY_SIZE(in), (out), ARRAY_SIZE(out), true }
1272
1273#define XTEST_MAC_CASE(algo, key_type, key, in_incr, in, out) \
1274 XTEST_MAC_CASE_1((algo), (key_type), (key), (in_incr), (in), (out)), \
1275 XTEST_MAC_CASE_MULT((algo), (key_type), (key), (in_incr), (in), (out))
Pascal Brandc639ac82015-07-02 08:53:34 +02001276
1277#define XTEST_MAC_CBC_CASE(algo, key_type, vect, in_incr) \
1278 XTEST_MAC_CASE((algo), (key_type), \
1279 mac_cbc_ ## vect ## _key, (in_incr), \
1280 mac_cbc_ ## vect ## _data, mac_cbc_ ## vect ## _out)
1281
1282#define XTEST_MAC_CMAC_CASE(vect, in_incr) \
1283 XTEST_MAC_CASE(TEE_ALG_AES_CMAC, TEE_TYPE_AES, \
1284 mac_cmac_ ## vect ## _key, (in_incr), \
1285 mac_cmac_ ## vect ## _data, mac_cmac_ ## vect ## _out)
1286
Alexander Zakharov0afe00c2021-02-10 19:06:48 +01001287#define XTEST_MAC_DES3_CMAC_CASE(vect, in_incr) \
1288 XTEST_MAC_CASE(TEE_ALG_DES3_CMAC, TEE_TYPE_DES3, \
1289 mac_des3_cmac_ ## vect ## _key, (in_incr), \
1290 mac_des3_cmac_ ## vect ## _data, mac_des3_cmac_ ## vect ## _out)
1291
Pascal Brandc639ac82015-07-02 08:53:34 +02001292static const struct xtest_mac_case mac_cases[] = {
1293 XTEST_MAC_CASE(TEE_ALG_HMAC_MD5, TEE_TYPE_HMAC_MD5,
1294 mac_data_md5_key1,
1295 4, mac_data_md5_in1, mac_data_md5_out1),
1296 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA1, TEE_TYPE_HMAC_SHA1,
1297 mac_data_sha1_key1,
1298 5, mac_data_sha1_in1, mac_data_sha1_out1),
1299 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA224, TEE_TYPE_HMAC_SHA224,
1300 mac_data_sha224_key1,
1301 8, mac_data_sha224_in1, mac_data_sha224_out1),
1302 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA256, TEE_TYPE_HMAC_SHA256,
1303 mac_data_sha256_key1,
1304 1, mac_data_sha256_in1, mac_data_sha256_out1),
1305 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA256, TEE_TYPE_HMAC_SHA256,
1306 mac_data_sha256_key2,
1307 7, mac_data_sha256_in2, mac_data_sha256_out2),
1308 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA384, TEE_TYPE_HMAC_SHA384,
1309 mac_data_sha384_key1,
1310 11, mac_data_sha384_in1, mac_data_sha384_out1),
1311 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA512, TEE_TYPE_HMAC_SHA512,
1312 mac_data_sha512_key1,
1313 13, mac_data_sha512_in1, mac_data_sha512_out1),
1314
1315 XTEST_MAC_CBC_CASE(TEE_ALG_AES_CBC_MAC_NOPAD, TEE_TYPE_AES, vect1, 14),
1316 XTEST_MAC_CBC_CASE(TEE_ALG_DES_CBC_MAC_NOPAD, TEE_TYPE_DES, vect2, 16),
1317 XTEST_MAC_CBC_CASE(TEE_ALG_DES3_CBC_MAC_NOPAD, TEE_TYPE_DES3, vect3,
1318 17),
1319 XTEST_MAC_CBC_CASE(TEE_ALG_AES_CBC_MAC_PKCS5, TEE_TYPE_AES, vect4, 11),
1320 XTEST_MAC_CBC_CASE(TEE_ALG_DES_CBC_MAC_PKCS5, TEE_TYPE_DES, vect5, 9),
1321 XTEST_MAC_CBC_CASE(TEE_ALG_DES3_CBC_MAC_PKCS5, TEE_TYPE_DES3, vect6, 4),
1322 XTEST_MAC_CBC_CASE(TEE_ALG_AES_CBC_MAC_PKCS5, TEE_TYPE_AES, vect7, 3),
1323 XTEST_MAC_CBC_CASE(TEE_ALG_DES_CBC_MAC_PKCS5, TEE_TYPE_DES, vect8, 23),
1324 XTEST_MAC_CBC_CASE(TEE_ALG_DES3_CBC_MAC_PKCS5, TEE_TYPE_DES3, vect9,
1325 34),
Pascal Brand5c3d8092015-07-23 08:20:26 +02001326 XTEST_MAC_CBC_CASE(TEE_ALG_DES3_CBC_MAC_PKCS5, TEE_TYPE_DES3, vect10, 4),
Pascal Brandc639ac82015-07-02 08:53:34 +02001327
1328 { TEE_ALG_AES_CMAC, TEE_TYPE_AES, mac_cmac_vect1_key,
1329 ARRAY_SIZE(mac_cmac_vect1_key), 0, NULL, 0, mac_cmac_vect1_out,
1330 ARRAY_SIZE(mac_cmac_vect1_out) },
1331 XTEST_MAC_CMAC_CASE(vect2, 9),
1332 XTEST_MAC_CMAC_CASE(vect3, 9),
1333 XTEST_MAC_CMAC_CASE(vect4, 9),
1334 { TEE_ALG_AES_CMAC, TEE_TYPE_AES, mac_cmac_vect5_key,
1335 ARRAY_SIZE(mac_cmac_vect5_key), 0, NULL, 0, mac_cmac_vect5_out,
1336 ARRAY_SIZE(mac_cmac_vect5_out) },
1337 XTEST_MAC_CMAC_CASE(vect6, 9),
1338 XTEST_MAC_CMAC_CASE(vect7, 9),
1339 XTEST_MAC_CMAC_CASE(vect8, 9),
1340 { TEE_ALG_AES_CMAC, TEE_TYPE_AES, mac_cmac_vect9_key,
1341 ARRAY_SIZE(mac_cmac_vect9_key), 0, NULL, 0, mac_cmac_vect9_out,
1342 ARRAY_SIZE(mac_cmac_vect9_out) },
1343 XTEST_MAC_CMAC_CASE(vect10, 9),
1344 XTEST_MAC_CMAC_CASE(vect11, 9),
1345 XTEST_MAC_CMAC_CASE(vect12, 9),
Clement Faure21b347a2021-04-29 13:06:55 +02001346 XTEST_MAC_CMAC_CASE(vect12, 16),
Jerome Forissier9f17e262019-12-13 14:12:41 +01001347
Alexander Zakharov0afe00c2021-02-10 19:06:48 +01001348 { TEE_ALG_DES3_CMAC, TEE_TYPE_DES3, mac_des3_cmac_vect1_key,
1349 ARRAY_SIZE(mac_des3_cmac_vect1_key), 0, NULL, 0, mac_des3_cmac_vect1_out,
1350 ARRAY_SIZE(mac_des3_cmac_vect1_out) },
1351 XTEST_MAC_DES3_CMAC_CASE(vect2, 3),
1352 XTEST_MAC_DES3_CMAC_CASE(vect3, 9),
1353 XTEST_MAC_DES3_CMAC_CASE(vect4, 9),
1354 { TEE_ALG_DES3_CMAC, TEE_TYPE_DES3, mac_des3_cmac_vect5_key,
1355 ARRAY_SIZE(mac_des3_cmac_vect5_key), 0, NULL, 0, mac_des3_cmac_vect5_out,
1356 ARRAY_SIZE(mac_des3_cmac_vect5_out) },
1357 XTEST_MAC_DES3_CMAC_CASE(vect6, 3),
1358 XTEST_MAC_DES3_CMAC_CASE(vect7, 5),
1359 XTEST_MAC_DES3_CMAC_CASE(vect8, 9),
1360
Jerome Forissier9f17e262019-12-13 14:12:41 +01001361 XTEST_MAC_CASE(TEE_ALG_HMAC_SM3, TEE_TYPE_HMAC_SM3,
1362 mac_data_sm3_d31_key,
1363 13, mac_data_sm3_d31_in, mac_data_sm3_d31_out),
1364 XTEST_MAC_CASE(TEE_ALG_HMAC_SM3, TEE_TYPE_HMAC_SM3,
1365 mac_data_sm3_d32_key,
1366 13, mac_data_sm3_d32_in, mac_data_sm3_d32_out),
Pascal Brandc639ac82015-07-02 08:53:34 +02001367};
1368
1369static void xtest_tee_test_4002(ADBG_Case_t *c)
1370{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001371 TEEC_Session session = { };
1372 TEE_OperationHandle op1 = TEE_HANDLE_NULL;
1373 TEE_OperationHandle op2 = TEE_HANDLE_NULL;
Jerome Forissier4f419512021-07-07 14:56:10 +02001374 TEE_OperationHandle op3 = TEE_HANDLE_NULL;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001375 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
1376 uint8_t out[64] = { };
1377 size_t out_size = 0;
1378 uint32_t ret_orig = 0;
1379 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001380
1381 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1382 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
1383 &ret_orig)))
1384 return;
1385
1386 for (n = 0; n < ARRAY_SIZE(mac_cases); n++) {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001387 TEE_Attribute key_attr = { };
1388 size_t key_size = 0;
1389 size_t offs = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001390
1391 Do_ADBG_BeginSubCase(c, "MAC case %d algo 0x%x",
1392 (int)n, (unsigned int)mac_cases[n].algo);
1393
1394 key_attr.attributeID = TEE_ATTR_SECRET_VALUE;
1395 key_attr.content.ref.buffer = (void *)mac_cases[n].key;
1396 key_attr.content.ref.length = mac_cases[n].key_len;
1397
1398 key_size = key_attr.content.ref.length * 8;
1399 if (mac_cases[n].key_type == TEE_TYPE_DES ||
1400 mac_cases[n].key_type == TEE_TYPE_DES3)
1401 /* Exclude parity in bit size of key */
1402 key_size -= key_size / 8;
1403
1404 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1405 ta_crypt_cmd_allocate_operation(c, &session, &op1,
1406 mac_cases[n].algo, TEE_MODE_MAC, key_size)))
1407 goto out;
1408
1409 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1410 ta_crypt_cmd_allocate_operation(c, &session, &op2,
1411 mac_cases[n].algo, TEE_MODE_MAC, key_size)))
1412 goto out;
1413
1414 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jerome Forissier4f419512021-07-07 14:56:10 +02001415 ta_crypt_cmd_allocate_operation(c, &session, &op3,
1416 mac_cases[n].algo, TEE_MODE_MAC, key_size)))
1417 goto out;
1418
1419 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc639ac82015-07-02 08:53:34 +02001420 ta_crypt_cmd_allocate_transient_object(c, &session,
1421 mac_cases[n].key_type, key_size, &key_handle)))
1422 goto out;
1423
1424 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1425 ta_crypt_cmd_populate_transient_object(c, &session,
1426 key_handle, &key_attr, 1)))
1427 goto out;
1428
1429 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1430 ta_crypt_cmd_set_operation_key(c, &session, op1,
1431 key_handle)))
1432 goto out;
1433
1434 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1435 ta_crypt_cmd_free_transient_object(c, &session,
1436 key_handle)))
1437 goto out;
1438
1439 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1440 ta_crypt_cmd_mac_init(c, &session, op1, NULL, 0)))
1441 goto out;
1442
Jerome Forissier4f419512021-07-07 14:56:10 +02001443 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1444 ta_crypt_cmd_copy_operation(c, &session, op3, op1)))
1445 goto out;
1446
Jerome Forissier3dec7442019-01-30 17:50:05 +01001447 offs = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001448 if (mac_cases[n].in != NULL) {
Jerome Forissier3dec7442019-01-30 17:50:05 +01001449 while (offs + mac_cases[n].in_incr <
1450 mac_cases[n].in_len) {
1451 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1452 ta_crypt_cmd_mac_update(c, &session,
1453 op1, mac_cases[n].in + offs,
1454 mac_cases[n].in_incr)))
1455 goto out;
1456 offs += mac_cases[n].in_incr;
1457 if (!mac_cases[n].multiple_incr)
1458 break;
1459 }
Pascal Brandc639ac82015-07-02 08:53:34 +02001460 }
1461
1462 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1463 ta_crypt_cmd_copy_operation(c, &session, op2, op1)))
1464 goto out;
1465
1466 out_size = sizeof(out);
1467 memset(out, 0, sizeof(out));
1468 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1469 ta_crypt_cmd_mac_final_compute(c, &session, op2,
Jerome Forissier3dec7442019-01-30 17:50:05 +01001470 mac_cases[n].in + offs,
1471 mac_cases [n].in_len - offs,
Pascal Brandc639ac82015-07-02 08:53:34 +02001472 out, &out_size)))
1473 goto out;
1474
1475 (void)ADBG_EXPECT_BUFFER(c, mac_cases[n].out,
1476 mac_cases[n].out_len, out, out_size);
1477
1478 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1479 ta_crypt_cmd_mac_init(c, &session, op1, NULL, 0)))
1480 goto out;
1481
1482 out_size = sizeof(out);
1483 memset(out, 0, sizeof(out));
1484 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1485 ta_crypt_cmd_mac_final_compute(c, &session, op1,
1486 mac_cases[n].in, mac_cases[n].in_len, out,
1487 &out_size)))
1488 goto out;
1489
1490 (void)ADBG_EXPECT_BUFFER(c, mac_cases[n].out,
1491 mac_cases[n].out_len, out, out_size);
1492
1493 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jerome Forissier4f419512021-07-07 14:56:10 +02001494 ta_crypt_cmd_mac_final_compare(c, &session, op3,
1495 mac_cases[n].in, mac_cases[n].in_len,
1496 mac_cases[n].out, mac_cases[n].out_len)))
1497 goto out;
1498
1499 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc639ac82015-07-02 08:53:34 +02001500 ta_crypt_cmd_free_operation(c, &session, op1)))
1501 goto out;
1502
1503 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1504 ta_crypt_cmd_free_operation(c, &session, op2)))
1505 goto out;
1506
Jerome Forissier4f419512021-07-07 14:56:10 +02001507 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1508 ta_crypt_cmd_free_operation(c, &session, op3)))
1509 goto out;
1510
Pascal Brandc639ac82015-07-02 08:53:34 +02001511 Do_ADBG_EndSubCase(c, NULL);
1512 }
1513out:
1514 TEEC_CloseSession(&session);
1515}
Jens Wiklander14f48872018-06-29 15:30:13 +02001516ADBG_CASE_DEFINE(regression, 4002, xtest_tee_test_4002,
1517 "Test TEE Internal API MAC operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02001518
Pascal Brandc639ac82015-07-02 08:53:34 +02001519static const uint8_t ciph_data_aes_key1[] = {
1520 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1521 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1522};
1523
Jerome Forissier0780ad42018-06-05 15:02:37 +02001524static const uint8_t ciph_data_aes_key2[] = {
1525 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
1526 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
1527};
1528
Pascal Brandc639ac82015-07-02 08:53:34 +02001529static const uint8_t ciph_data_des_key1[] = {
1530 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37 /* 01234567 */
1531};
1532
1533static const uint8_t ciph_data_des_key2[] = {
1534 0x13, 0x34, 0x57, 0x79, 0x9B, 0xBC, 0xDF, 0xF1
1535};
1536
1537
1538static const uint8_t ciph_data_des3_key1[] = {
1539 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1540 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1541 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, /* 12345678 */
1542};
1543
1544static const uint8_t ciph_data_des3_key2[] = {
1545 0x13, 0x34, 0x57, 0x79, 0x9B, 0xBC, 0xDF, 0xF1,
1546 0x13, 0x34, 0x57, 0x79, 0x9B, 0xBC, 0xDF, 0xF1,
1547 0x13, 0x34, 0x57, 0x79, 0x9B, 0xBC, 0xDF, 0xF1
1548};
1549
1550static const uint8_t ciph_data_des2_key1[] = {
1551 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1552 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1553};
1554
1555static const uint8_t ciph_data_in1[] = {
1556 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, /* 23456789 */
1557 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, /* ABCDEF01 */
1558 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, /* 3456789A */
1559 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, /* BCDEF012 */
1560 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, /* 456789AB */
1561 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, 0x33, /* CDEF0123 */
1562};
1563
1564static const uint8_t ciph_data_in3[] = {
1565 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, /* 23456789 */
1566 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, /* ABCDEF01 */
1567 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, /* 3456789A */
1568 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, /* BCDEF012 */
1569 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, /* 456789AB */
1570 0x43, 0x44, 0x45, 0x46, 0x30, /* CDEF0 */
1571};
1572
Jerome Forissier45218eb2018-04-11 13:03:26 +02001573static const uint8_t ciph_data_in4[] = {
1574 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, /* 23456789 */
1575 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, /* ABCDEF01 */
1576 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, /* 3456789A */
1577 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, /* BCDEF012 */
1578 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, /* 456789AB */
1579 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, 0x33, /* CDEF0123 */
1580 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1581 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1582};
1583
Jerome Forissier0780ad42018-06-05 15:02:37 +02001584static const uint8_t ciph_data_in5[] = {
1585 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1586 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1587 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1588 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1589 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1590 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1591 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1592 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
Jerome Forissierbf9009e2018-06-05 18:44:42 +02001593 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1594 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
Jerome Forissier0780ad42018-06-05 15:02:37 +02001595 0x01, 0x01, 0x01
1596};
1597
Pascal Brandc639ac82015-07-02 08:53:34 +02001598static const uint8_t ciph_data_128_iv1[] = {
1599 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, /* 12345678 */
1600 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, /* 9ABCDEF0 */
1601};
1602
Jerome Forissier0780ad42018-06-05 15:02:37 +02001603static const uint8_t ciph_data_128_iv2[] = {
1604 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
1605 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
1606};
1607
Pascal Brandc639ac82015-07-02 08:53:34 +02001608static const uint8_t ciph_data_64_iv1[] = {
1609 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, /* 12345678 */
1610};
1611
1612static const uint8_t ciph_data_in2[] = {
1613 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef
1614};
1615
1616static const uint8_t ciph_data_aes_ecb_nopad_out1[] = {
1617 0xA5, 0xBE, 0x14, 0xD5, 0x01, 0x05, 0x24, 0x48, /* ......$H */
1618 0x58, 0x1A, 0x6B, 0x82, 0xD4, 0x41, 0xD2, 0xB3, /* X.k..A.. */
1619 0xBB, 0xF9, 0xAE, 0x37, 0x94, 0xAC, 0x18, 0x50, /* ...7...P */
1620 0x87, 0x09, 0xCC, 0x3F, 0x43, 0xD2, 0xC2, 0xB7, /* ...?C... */
1621 0xD7, 0x6F, 0x84, 0x07, 0xB4, 0x78, 0xCE, 0x34, /* .o...x.4 */
1622 0x48, 0xC9, 0x16, 0x86, 0x42, 0xB8, 0xFF, 0xCF, /* H...B... */
1623};
1624
1625static const uint8_t ciph_data_aes_cbc_nopad_out1[] = {
1626 0x8D, 0x9F, 0x88, 0xD8, 0xAF, 0x9F, 0xC1, 0x3B, /* .......; */
1627 0x02, 0x15, 0x43, 0x6A, 0x8C, 0x1E, 0x34, 0x5C, /* ..Cj..4\ */
1628 0x83, 0xF4, 0x85, 0x3E, 0x43, 0x0F, 0xE5, 0x5F, /* ...>C.._ */
1629 0x81, 0x4C, 0xC0, 0x28, 0x3F, 0xD9, 0x98, 0x53, /* .L.(?..S */
1630 0xB1, 0x44, 0x51, 0x38, 0x21, 0xAB, 0x10, 0xCE, /* .DQ8!... */
1631 0xC2, 0xEC, 0x65, 0x54, 0xDD, 0x5C, 0xEA, 0xDC, /* ..eT.\.. */
1632};
1633
1634static const uint8_t ciph_data_aes_ctr_out1[] = {
1635 0xD2, 0xDD, 0x11, 0xA8, 0xF7, 0xB0, 0xAE, 0x55, /* .......U */
1636 0xBE, 0x61, 0x7A, 0xE6, 0xA1, 0x6C, 0x79, 0xF4, /* .az..ly. */
1637 0x62, 0x51, 0x7B, 0xE9, 0x7C, 0xA0, 0x31, 0x0C, /* bQ{.|.1. */
1638 0x24, 0x15, 0x70, 0x7F, 0x47, 0x37, 0x69, 0xE0, /* $.p.G7i. */
1639 0x24, 0xC3, 0x29, 0xCD, 0xF2, 0x26, 0x69, 0xFF, /* $.)..&i. */
1640 0x72, 0x0E, 0x3C, 0xD1, 0xA1, 0x2F, 0x5D, 0x33, /* r.<../]3 */
1641};
1642
1643static const uint8_t ciph_data_aes_ctr_out2[] = {
1644 0xD2, 0xDD, 0x11, 0xA8, 0xF7, 0xB0, 0xAE, 0x55, /* .......U */
1645 0xBE, 0x61, 0x7A, 0xE6, 0xA1, 0x6C, 0x79, 0xF4, /* .az..ly. */
1646 0x62, 0x51, 0x7B, 0xE9, 0x7C, 0xA0, 0x31, 0x0C, /* bQ{.|.1. */
1647 0x24, 0x15, 0x70, 0x7F, 0x47, 0x37, 0x69, 0xE0, /* $.p.G7i. */
1648 0x24, 0xC3, 0x29, 0xCD, 0xF2, 0x26, 0x69, 0xFF, /* $.)..&i. */
1649 0x72, 0x0E, 0x3C, 0xD1, 0xA1, /* r.<.. */
1650};
1651
Jerome Forissier45218eb2018-04-11 13:03:26 +02001652static const uint8_t ciph_data_aes_ctr_out4[] = {
1653 0xD2, 0xDD, 0x11, 0xA8, 0xF7, 0xB0, 0xAE, 0x55, /* .......U */
1654 0xBE, 0x61, 0x7A, 0xE6, 0xA1, 0x6C, 0x79, 0xF4, /* .az..ly. */
1655 0x62, 0x51, 0x7B, 0xE9, 0x7C, 0xA0, 0x31, 0x0C, /* bQ{.|.1. */
1656 0x24, 0x15, 0x70, 0x7F, 0x47, 0x37, 0x69, 0xE0, /* $.p.G7i. */
1657 0x24, 0xC3, 0x29, 0xCD, 0xF2, 0x26, 0x69, 0xFF, /* $.)..&i. */
1658 0x72, 0x0E, 0x3C, 0xD1, 0xA1, 0x2F, 0x5D, 0x33, /* r.<../]3 */
1659 0x9F, 0xD7, 0x0C, 0x92, 0xD4, 0xA5, 0x9D, 0x06, /* ........ */
1660 0x01, 0x80, 0x38, 0xCD, 0xC2, 0x71, 0x5D, 0x4A, /* ..8..q]J */
1661};
1662
Jerome Forissier0780ad42018-06-05 15:02:37 +02001663static const uint8_t ciph_data_aes_ctr_out5[] = {
1664 0xbb, 0xfe, 0x07, 0x04, 0x1c, 0x8e, 0x09, 0x61,
1665 0xfb, 0xb1, 0x7c, 0xa5, 0x4d, 0x2b, 0x30, 0xf6,
1666 0x26, 0x9e, 0xff, 0x61, 0x18, 0x47, 0xc6, 0x06,
1667 0x81, 0x02, 0x84, 0xcd, 0x9c, 0x4b, 0x6d, 0x21,
1668 0xe2, 0x64, 0xa6, 0x50, 0x7f, 0x28, 0x81, 0x6f,
1669 0x29, 0xda, 0xd5, 0x56, 0x3f, 0x46, 0xac, 0xca,
1670 0x37, 0xe7, 0x77, 0x36, 0xbc, 0x76, 0x39, 0x57,
1671 0xaa, 0x67, 0x1b, 0x2a, 0xe6, 0x36, 0x57, 0x6d,
Jerome Forissierbf9009e2018-06-05 18:44:42 +02001672 0x2a, 0xb8, 0x77, 0x41, 0xc2, 0x4e, 0x4f, 0x27,
1673 0x4c, 0x34, 0x7a, 0x01, 0x6a, 0xda, 0x75, 0x75,
1674 0x3e, 0x68, 0xb2
Jerome Forissier0780ad42018-06-05 15:02:37 +02001675};
1676
Pascal Brandc639ac82015-07-02 08:53:34 +02001677static const uint8_t ciph_data_aes_cbc_vect1_key[] = {
1678 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1679 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1680};
1681
1682static const uint8_t ciph_data_aes_cbc_vect1_iv[] = {
1683 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
1684 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
1685};
1686
1687static const uint8_t ciph_data_aes_cbc_vect1_ptx[] = {
1688 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x20, 0x62, /* Cipher b */
1689 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x63, 0x68, 0x61, /* lock cha */
1690 0x69, 0x6E, 0x69, 0x6E, 0x67, 0x20, 0x28, 0x43, /* ining (C */
1691 0x42, 0x43, 0x29, 0x20, 0x69, 0x73, 0x20, 0x61, /* BC) is a */
1692 0x20, 0x63, 0x6F, 0x6D, 0x6D, 0x6F, 0x6E, 0x20, /* common */
1693 0x63, 0x68, 0x61, 0x69, 0x6E, 0x69, 0x6E, 0x67, /* chaining */
1694 0x20, 0x6D, 0x6F, 0x64, 0x65, 0x20, 0x69, 0x6E, /* mode in */
1695 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, /* which t */
1696 0x68, 0x65, 0x20, 0x70, 0x72, 0x65, 0x76, 0x69, /* he previ */
1697 0x6F, 0x75, 0x73, 0x20, 0x62, 0x6C, 0x6F, 0x63, /* ous bloc */
1698 0x6B, 0x27, 0x73, 0x20, 0x63, 0x69, 0x70, 0x68, /* k's ciph */
1699 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, 0x20, 0x69, /* ertext i */
1700 0x73, 0x20, 0x78, 0x6F, 0x72, 0x65, 0x64, 0x20, /* s xored */
1701 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, /* with the */
1702 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, /* current */
1703 0x20, 0x62, 0x6C, 0x6F, 0x63, 0x6B, 0x27, 0x73, /* block's */
1704 0x20, 0x70, 0x6C, 0x61, 0x69, 0x6E, 0x74, 0x65, /* plainte */
1705 0x78, 0x74, 0x20, 0x62, 0x65, 0x66, 0x6F, 0x72, /* xt befor */
1706 0x65, 0x20, 0x65, 0x6E, 0x63, 0x72, 0x79, 0x70, /* e encryp */
1707 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x2E, 0x2E, 0x2E, /* tion.... */
1708};
1709
1710static const uint8_t ciph_data_aes_cbc_vect1_ctx[] = {
1711 0xDD, 0x16, 0xC3, 0x47, 0x69, 0xEC, 0xF5, 0x86, /* ...Gi... */
1712 0x20, 0xB4, 0xF7, 0xE3, 0xB9, 0x36, 0xE8, 0xAC, /* ....6.. */
1713 0xC9, 0xA2, 0x11, 0x71, 0x3B, 0x10, 0x9D, 0x45, /* ...q;..E */
1714 0xCA, 0xE2, 0x49, 0xA6, 0x4E, 0x56, 0x07, 0xC5, /* ..I.NV.. */
1715 0xCE, 0xA3, 0x14, 0xB5, 0x30, 0x1B, 0x63, 0xBB, /* ....0.c. */
1716 0x2D, 0x6F, 0xE9, 0xCA, 0x0B, 0x00, 0x31, 0x3F, /* -o....1? */
1717 0xA4, 0x9A, 0x39, 0xE1, 0xC8, 0xD2, 0x24, 0x95, /* ..9...$. */
1718 0x14, 0xE9, 0xD2, 0x43, 0xE8, 0xA8, 0x1E, 0x0A, /* ...C.... */
1719 0xFE, 0x9D, 0x4F, 0xF5, 0xBB, 0x16, 0xB9, 0x54, /* ..O....T */
1720 0x78, 0x07, 0x94, 0x05, 0x8E, 0x47, 0xC3, 0xCB, /* x....G.. */
1721 0x7C, 0xEC, 0xF4, 0xF8, 0xF2, 0xA4, 0x59, 0x6E, /* |.....Yn */
1722 0xED, 0xAD, 0x7F, 0x62, 0xAF, 0x89, 0xA8, 0x5B, /* ...b...[ */
1723 0x75, 0xD4, 0x73, 0xE3, 0xBA, 0x9F, 0x9A, 0xD2, /* u.s..... */
1724 0x0F, 0xFD, 0x3C, 0xE6, 0xC6, 0xA4, 0xD6, 0x6C, /* ..<....l */
1725 0x6A, 0x09, 0xE2, 0x16, 0xB0, 0x8C, 0x69, 0x3C, /* j.....i< */
1726 0xC8, 0x1C, 0xE4, 0x3E, 0x86, 0x4D, 0xB0, 0x2B, /* ...>.M.+ */
1727 0x29, 0xA0, 0x5A, 0xA3, 0x67, 0xBA, 0xDC, 0x11, /* ).Z.g... */
1728 0x08, 0x5E, 0x69, 0xB4, 0x6F, 0xA5, 0xE2, 0xB8, /* .^i.o... */
1729 0xC9, 0x6E, 0x83, 0x7E, 0x35, 0xC8, 0xA7, 0xA0, /* .n.~5... */
1730 0x33, 0xA3, 0xB1, 0x4B, 0x5A, 0x92, 0x51, 0x2E, /* 3..KZ.Q. */
1731};
1732
1733/* AES-CTS test vectors from http://tools.ietf.org/html/rfc3962
1734 * and http://tools.ietf.org/html/draft-raeburn-krb-rijndael-krb-02 */
1735static const uint8_t ciph_data_aes_cts_vect1_key[] = {
1736 0x63, 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x20,
1737 0x74, 0x65, 0x72, 0x69, 0x79, 0x61, 0x6b, 0x69
1738};
1739
1740static const uint8_t ciph_data_aes_cts_vect1_iv[16] = {
1741 0x00
1742};
1743
1744static const uint8_t ciph_data_aes_cts_vect1_ptx[] = {
1745 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1746 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1747 0x20
1748};
1749
1750static const uint8_t ciph_data_aes_cts_vect1_ctx[] = {
1751 0xc6, 0x35, 0x35, 0x68, 0xf2, 0xbf, 0x8c, 0xb4,
1752 0xd8, 0xa5, 0x80, 0x36, 0x2d, 0xa7, 0xff, 0x7f,
1753 0x97
1754};
1755
1756#define ciph_data_aes_cts_vect2_key ciph_data_aes_cts_vect1_key
1757#define ciph_data_aes_cts_vect2_iv ciph_data_aes_cts_vect1_iv
1758static const uint8_t ciph_data_aes_cts_vect2_ptx[] = {
1759 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1760 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1761 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
1762 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20
1763};
1764
1765static const uint8_t ciph_data_aes_cts_vect2_ctx[] = {
1766 0xfc, 0x00, 0x78, 0x3e, 0x0e, 0xfd, 0xb2, 0xc1,
1767 0xd4, 0x45, 0xd4, 0xc8, 0xef, 0xf7, 0xed, 0x22,
1768 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
1769 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5
1770};
1771
1772#define ciph_data_aes_cts_vect3_key ciph_data_aes_cts_vect1_key
1773#define ciph_data_aes_cts_vect3_iv ciph_data_aes_cts_vect1_iv
1774static const uint8_t ciph_data_aes_cts_vect3_ptx[] = {
1775 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1776 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1777 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
1778 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43,
1779};
1780
1781static const uint8_t ciph_data_aes_cts_vect3_ctx[] = {
1782 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
1783 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8,
1784 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
1785 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
1786};
1787
1788#define ciph_data_aes_cts_vect4_key ciph_data_aes_cts_vect1_key
1789#define ciph_data_aes_cts_vect4_iv ciph_data_aes_cts_vect1_iv
1790static const uint8_t ciph_data_aes_cts_vect4_ptx[] = {
1791 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1792 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1793 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
1794 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43,
1795 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x2c, 0x20,
1796 0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2c,
1797};
1798
1799static const uint8_t ciph_data_aes_cts_vect4_ctx[] = {
1800 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
1801 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
1802 0xb3, 0xff, 0xfd, 0x94, 0x0c, 0x16, 0xa1, 0x8c,
1803 0x1b, 0x55, 0x49, 0xd2, 0xf8, 0x38, 0x02, 0x9e,
1804 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
1805 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5,
1806};
1807
1808#define ciph_data_aes_cts_vect5_key ciph_data_aes_cts_vect1_key
1809#define ciph_data_aes_cts_vect5_iv ciph_data_aes_cts_vect1_iv
1810static const uint8_t ciph_data_aes_cts_vect5_ptx[] = {
1811 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1812 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1813 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
1814 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43,
1815 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x2c, 0x20,
1816 0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2c, 0x20,
1817};
1818
1819static const uint8_t ciph_data_aes_cts_vect5_ctx[] = {
1820 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
1821 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
1822 0x9d, 0xad, 0x8b, 0xbb, 0x96, 0xc4, 0xcd, 0xc0,
1823 0x3b, 0xc1, 0x03, 0xe1, 0xa1, 0x94, 0xbb, 0xd8,
1824 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
1825 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8,
1826};
1827
1828#define ciph_data_aes_cts_vect6_key ciph_data_aes_cts_vect1_key
1829#define ciph_data_aes_cts_vect6_iv ciph_data_aes_cts_vect1_iv
1830static const uint8_t ciph_data_aes_cts_vect6_ptx[] = {
1831 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1832 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1833 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
1834 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43,
1835 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x2c, 0x20,
1836 0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2c, 0x20,
1837 0x61, 0x6e, 0x64, 0x20, 0x77, 0x6f, 0x6e, 0x74,
1838 0x6f, 0x6e, 0x20, 0x73, 0x6f, 0x75, 0x70, 0x2e,
1839};
1840
1841static const uint8_t ciph_data_aes_cts_vect6_ctx[] = {
1842 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
1843 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
1844 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
1845 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8,
1846 0x48, 0x07, 0xef, 0xe8, 0x36, 0xee, 0x89, 0xa5,
1847 0x26, 0x73, 0x0d, 0xbc, 0x2f, 0x7b, 0xc8, 0x40,
1848 0x9d, 0xad, 0x8b, 0xbb, 0x96, 0xc4, 0xcd, 0xc0,
1849 0x3b, 0xc1, 0x03, 0xe1, 0xa1, 0x94, 0xbb, 0xd8,
1850};
1851
Jerome Forissiered00e162017-01-20 09:22:52 +01001852/*
1853 * Test case for https://github.com/OP-TEE/optee_os/issues/1203
1854 * 80 bytes of data, processed in two steps (32 + 48).
1855 */
1856
1857#define ciph_data_aes_cts_issue1203_key ciph_data_aes_cts_vect1_key
1858
1859static const uint8_t ciph_data_aes_cts_issue1203_iv[] = {
1860 0x5b, 0x11, 0x7b, 0xf9, 0x83, 0x6a, 0x01, 0x27,
1861 0x1d, 0x2a, 0xae, 0x0a, 0xd3, 0x27, 0x35, 0x81,
1862};
1863
1864static const uint8_t ciph_data_aes_cts_issue1203_ptx[] = {
1865 0x33, 0x2a, 0xf4, 0x8c, 0x18, 0xa1, 0x30, 0x7c,
1866 0xa7, 0x52, 0x76, 0xca, 0xa6, 0x68, 0xad, 0xf6,
1867 0x1e, 0xba, 0xc9, 0x66, 0x66, 0x52, 0x1a, 0xe7,
1868 0x3e, 0xbc, 0xba, 0x60, 0x95, 0x71, 0x04, 0x5e,
1869 0xb4, 0xb7, 0x10, 0xd7, 0x93, 0x6d, 0x5f, 0x9a,
1870 0xb8, 0xbb, 0x6b, 0xb0, 0x6d, 0x47, 0x93, 0x41,
1871 0x29, 0x21, 0xf2, 0x84, 0xf5, 0xb2, 0xf2, 0x6d,
1872 0xbe, 0xe5, 0x8a, 0x2b, 0x58, 0x8d, 0x1b, 0x5e,
1873 0x41, 0x04, 0xba, 0x9e, 0x92, 0xe9, 0x52, 0xb6,
1874 0x8b, 0x1e, 0x36, 0x72, 0x91, 0xe4, 0x56, 0x66,
1875};
1876
1877/*
1878 * Ciphertext was generated by an online tool for AES CBC.
1879 * Since the input size is a multiple of the block size, and the ciphertext
1880 * format is CS3, the output is the same as plain AES CBC with the last
1881 * two blocks swapped.
1882 */
1883static const uint8_t ciph_data_aes_cts_issue1203_ctx[] = {
1884 0x6c, 0xfe, 0xef, 0x6a, 0x1c, 0x8f, 0xd3, 0xc3,
1885 0x66, 0xc4, 0xd9, 0x0e, 0xbe, 0x24, 0x17, 0x3f,
1886 0xcd, 0x19, 0xc9, 0xd2, 0x10, 0x3f, 0xcf, 0xdc,
1887 0xe9, 0x05, 0xab, 0xd5, 0x1a, 0x31, 0x41, 0x77,
1888 0x3b, 0xd7, 0x6a, 0x26, 0xae, 0x0d, 0xc9, 0x47,
1889 0x77, 0xd4, 0xa7, 0xd5, 0x73, 0x88, 0x9e, 0xde,
1890 0x72, 0x66, 0xe0, 0xe2, 0x3d, 0x62, 0x91, 0x22,
1891 0xae, 0x11, 0x01, 0x97, 0x22, 0x6a, 0x45, 0xa9,
1892 0xba, 0x56, 0xd2, 0xbc, 0x55, 0x2d, 0x99, 0x4d,
1893 0x3d, 0x22, 0x27, 0x9a, 0xac, 0x66, 0x2f, 0xf5,
1894};
1895
Pascal Brandc639ac82015-07-02 08:53:34 +02001896static const uint8_t ciph_data_des_ecb_nopad_out1[] = {
1897 0x46, 0x2B, 0x91, 0xA8, 0x55, 0xE6, 0x7E, 0x75, /* F+..U.~u */
1898 0x5E, 0x53, 0xF4, 0x8F, 0x29, 0x41, 0x4E, 0xEF, /* ^S..)AN. */
1899 0x32, 0x1B, 0x58, 0x42, 0x9B, 0xB4, 0x3A, 0x1F, /* 2.XB..:. */
1900 0x9A, 0xEA, 0xA4, 0xB4, 0xCD, 0xE9, 0x87, 0x7C, /* .......| */
1901 0xC0, 0x05, 0x34, 0xED, 0x86, 0x3C, 0x2A, 0x81, /* ..4..<.. */
1902 0x5E, 0x93, 0x0E, 0x86, 0xA9, 0xBB, 0x80, 0xFF, /* ^....... */
1903};
1904
1905static const uint8_t ciph_data_des_ecb_nopad_out2[] = {
1906 0x85, 0xE8, 0x13, 0x54, 0x0F, 0x0A, 0xB4, 0x05
1907};
1908
1909static const uint8_t ciph_data_des_cbc_nopad_out1[] = {
1910 0xAD, 0xD6, 0xD6, 0x3E, 0x88, 0xD0, 0xDD, 0xD4, /* ...>.... */
1911 0x9A, 0x93, 0x95, 0xA0, 0x86, 0x22, 0x5B, 0x9E, /* ....."[. */
1912 0x84, 0x0C, 0x6F, 0x12, 0x04, 0x11, 0x6F, 0xD4, /* ..o...o. */
1913 0x12, 0x29, 0xC6, 0x78, 0x0C, 0xFB, 0x58, 0x5B, /* .).x..X[ */
1914 0x66, 0x82, 0x0E, 0x52, 0xDC, 0x25, 0x16, 0x51, /* f..R.%.Q */
1915 0x69, 0xDF, 0xFE, 0x4E, 0x11, 0x1D, 0x9D, 0x08, /* i..N.... */
1916};
1917
1918static const uint8_t ciph_data_des3_ecb_nopad_out1[] = {
1919 0xA7, 0x46, 0xEC, 0xA8, 0x6A, 0x7F, 0x4A, 0xF1, /* .F..j.J. */
1920 0x44, 0x60, 0x37, 0x3B, 0x7F, 0x76, 0xE5, 0xFF, /* D`7;.v.. */
1921 0xC1, 0xE7, 0xA5, 0x04, 0x9C, 0x29, 0x5C, 0xA5, /* .....)\. */
1922 0xDD, 0xC8, 0xEE, 0x36, 0x1F, 0x48, 0xE0, 0xA9, /* ...6.H.. */
1923 0x82, 0x2D, 0x53, 0x84, 0x49, 0x69, 0x78, 0xFA, /* .-S.Iix. */
1924 0x23, 0x69, 0x1D, 0xF7, 0x08, 0x38, 0x44, 0x05, /* #i...8D. */
1925};
1926
1927static const uint8_t ciph_data_des3_cbc_nopad_out1[] = {
1928 0x18, 0x09, 0xEB, 0x98, 0xE4, 0x58, 0x72, 0x11, /* .....Xr. */
1929 0x30, 0x58, 0xAB, 0x38, 0xB0, 0xC9, 0x2B, 0xED, /* 0X.8..+. */
1930 0xDA, 0xC5, 0xE8, 0xA9, 0xF6, 0x8A, 0xA7, 0x80, /* ........ */
1931 0xBE, 0x54, 0x1F, 0x63, 0xF6, 0xEE, 0xA2, 0x4C, /* .T.c...L */
1932 0x7C, 0xEB, 0x84, 0x7D, 0xDA, 0xCA, 0x1E, 0xB2, /* |..}.... */
1933 0xED, 0x5E, 0x96, 0xB8, 0x01, 0x4B, 0x77, 0x02, /* .^...Kw. */
1934};
1935
1936static const uint8_t ciph_data_des2_ecb_nopad_out1[] = {
1937 0xAB, 0x12, 0xB6, 0xE2, 0x4A, 0x3A, 0x26, 0x14, /* ....J:&. */
1938 0xF0, 0x7D, 0x23, 0xD0, 0x55, 0xDF, 0x5C, 0x16, /* .}#.U.\. */
1939 0x43, 0x59, 0x1E, 0x44, 0x01, 0x76, 0xD7, 0x50, /* CY.D.v.P */
1940 0x44, 0xC0, 0x15, 0xDF, 0x2E, 0x7F, 0x8B, 0xC5, /* D....... */
1941 0xFF, 0x8B, 0x87, 0xFE, 0x33, 0xD7, 0xCB, 0x2C, /* ....3.., */
1942 0xDA, 0x79, 0x6F, 0xA4, 0x05, 0x2B, 0x30, 0xCE, /* .yo..+0. */
1943};
1944
1945static const uint8_t ciph_data_des2_cbc_nopad_out1[] = {
1946 0x47, 0x2F, 0xB1, 0x83, 0xC4, 0xBB, 0x93, 0x16, /* G/...... */
1947 0x73, 0xF9, 0xAD, 0x6F, 0x00, 0xF9, 0xCB, 0x4A, /* s..o...J */
1948 0x0F, 0x4F, 0x75, 0x75, 0xFB, 0x39, 0x0B, 0xFC, /* .Ouu.9.. */
1949 0x9F, 0x48, 0x52, 0xAD, 0xA2, 0x75, 0x2C, 0xF1, /* .HR..u, . */
1950 0x7D, 0xC3, 0x8F, 0x16, 0xCF, 0xC9, 0x76, 0x29, /* }.....v) */
1951 0x1A, 0xBF, 0xB3, 0xD9, 0x10, 0x7E, 0xAA, 0x49, /* .....~.I */
1952};
1953
Jerome Forissiere73e0fb2019-12-12 17:08:03 +01001954/* SM4 ECB */
1955
1956static const uint8_t ciph_data_sm4_key1[] = {
1957 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
1958 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
1959};
1960
1961static const uint8_t ciph_data_sm4_in1[] = {
1962 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
1963 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
1964};
1965
1966static const uint8_t ciph_data_sm4_ecb_nopad_out1[] = {
1967 0x68, 0x1e, 0xdf, 0x34, 0xd2, 0x06, 0x96, 0x5e,
1968 0x86, 0xb3, 0xe9, 0x4f, 0x53, 0x6e, 0x42, 0x46,
1969};
1970
1971/*
1972 * SM4 CBC
1973 * https://tools.ietf.org/html/draft-ribose-cfrg-sm4-10#appendix-A.2.2.1
1974 */
1975static const uint8_t ciph_data_sm4_cbc_a221_key[] = {
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_cbc_a221_iv[] = {
1981 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1982 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1983};
1984
1985static const uint8_t ciph_data_sm4_cbc_a221_in[] = {
1986 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb,
1987 0xcc, 0xcc, 0xcc, 0xcc, 0xdd, 0xdd, 0xdd, 0xdd,
1988 0xee, 0xee, 0xee, 0xee, 0xff, 0xff, 0xff, 0xff,
1989 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb,
1990};
1991
1992static const uint8_t ciph_data_sm4_cbc_a221_out[] = {
1993 0x78, 0xeb, 0xb1, 0x1c, 0xc4, 0x0b, 0x0a, 0x48,
1994 0x31, 0x2a, 0xae, 0xb2, 0x04, 0x02, 0x44, 0xcb,
1995 0x4c, 0xb7, 0x01, 0x69, 0x51, 0x90, 0x92, 0x26,
1996 0x97, 0x9b, 0x0d, 0x15, 0xdc, 0x6a, 0x8f, 0x6d,
1997};
1998
1999/*
2000 * SM4 CBC
2001 * https://tools.ietf.org/html/draft-ribose-cfrg-sm4-10#appendix-A.2.2.2
2002 */
2003static const uint8_t ciph_data_sm4_cbc_a222_key[] = {
2004 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
2005 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
2006};
2007
2008static const uint8_t ciph_data_sm4_cbc_a222_iv[] = {
2009 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2010 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
2011};
2012
2013static const uint8_t ciph_data_sm4_cbc_a222_in[] = {
2014 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb,
2015 0xcc, 0xcc, 0xcc, 0xcc, 0xdd, 0xdd, 0xdd, 0xdd,
2016 0xee, 0xee, 0xee, 0xee, 0xff, 0xff, 0xff, 0xff,
2017 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb,
2018};
2019
2020static const uint8_t ciph_data_sm4_cbc_a222_out[] = {
2021 0x0d, 0x3a, 0x6d, 0xdc, 0x2d, 0x21, 0xc6, 0x98,
2022 0x85, 0x72, 0x15, 0x58, 0x7b, 0x7b, 0xb5, 0x9a,
2023 0x91, 0xf2, 0xc1, 0x47, 0x91, 0x1a, 0x41, 0x44,
2024 0x66, 0x5e, 0x1f, 0xa1, 0xd4, 0x0b, 0xae, 0x38,
2025};
2026
2027/*
2028 * SM4 CTR
2029 * https://tools.ietf.org/html/draft-ribose-cfrg-sm4-10#appendix-A.2.5.1
2030 */
2031static const uint8_t ciph_data_sm4_ctr_a251_key[] = {
2032 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
2033 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
2034};
2035
2036static const uint8_t ciph_data_sm4_ctr_a251_iv[] = {
2037 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2038 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
2039};
2040
2041static const uint8_t ciph_data_sm4_ctr_a251_in[] = {
2042 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
2043 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
2044 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
2045 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
2046 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee,
2047 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2048 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
2049 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
2050};
2051
2052static const uint8_t ciph_data_sm4_ctr_a251_out[] = {
2053 0xac, 0x32, 0x36, 0xcb, 0x97, 0x0c, 0xc2, 0x07,
2054 0x91, 0x36, 0x4c, 0x39, 0x5a, 0x13, 0x42, 0xd1,
2055 0xa3, 0xcb, 0xc1, 0x87, 0x8c, 0x6f, 0x30, 0xcd,
2056 0x07, 0x4c, 0xce, 0x38, 0x5c, 0xdd, 0x70, 0xc7,
2057 0xf2, 0x34, 0xbc, 0x0e, 0x24, 0xc1, 0x19, 0x80,
2058 0xfd, 0x12, 0x86, 0x31, 0x0c, 0xe3, 0x7b, 0x92,
2059 0x6e, 0x02, 0xfc, 0xd0, 0xfa, 0xa0, 0xba, 0xf3,
2060 0x8b, 0x29, 0x33, 0x85, 0x1d, 0x82, 0x45, 0x14,
2061};
2062
2063/*
2064 * SM4 CTR
2065 * https://tools.ietf.org/html/draft-ribose-cfrg-sm4-10#appendix-A.2.5.2
2066 */
2067static const uint8_t ciph_data_sm4_ctr_a252_key[] = {
2068 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
2069 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
2070};
2071
2072static const uint8_t ciph_data_sm4_ctr_a252_iv[] = {
2073 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2074 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
2075};
2076
2077static const uint8_t ciph_data_sm4_ctr_a252_in[] = {
2078 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
2079 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
2080 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
2081 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
2082 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee,
2083 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2084 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
2085 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
2086};
2087
2088static const uint8_t ciph_data_sm4_ctr_a252_out[] = {
2089 0x5d, 0xcc, 0xcd, 0x25, 0xb9, 0x5a, 0xb0, 0x74,
2090 0x17, 0xa0, 0x85, 0x12, 0xee, 0x16, 0x0e, 0x2f,
2091 0x8f, 0x66, 0x15, 0x21, 0xcb, 0xba, 0xb4, 0x4c,
2092 0xc8, 0x71, 0x38, 0x44, 0x5b, 0xc2, 0x9e, 0x5c,
2093 0x0a, 0xe0, 0x29, 0x72, 0x05, 0xd6, 0x27, 0x04,
2094 0x17, 0x3b, 0x21, 0x23, 0x9b, 0x88, 0x7f, 0x6c,
2095 0x8c, 0xb5, 0xb8, 0x00, 0x91, 0x7a, 0x24, 0x88,
2096 0x28, 0x4b, 0xde, 0x9e, 0x16, 0xea, 0x29, 0x06,
2097};
2098
Pascal Brandc639ac82015-07-02 08:53:34 +02002099struct xtest_ciph_case {
2100 uint32_t algo;
2101 uint32_t mode;
2102 uint32_t key_type;
2103 const uint8_t *key1;
2104 size_t key1_len;
2105 const uint8_t *key2;
2106 size_t key2_len;
2107 const uint8_t *iv;
2108 size_t iv_len;
2109 size_t in_incr;
2110 const uint8_t *in;
2111 size_t in_len;
2112 const uint8_t *out;
2113 size_t out_len;
2114 size_t line;
2115};
2116
2117#define XTEST_CIPH_CASE_NO_IV(algo, key_type, key, in_incr, ptx, ctx) \
2118 { (algo), TEE_MODE_ENCRYPT, (key_type), (key), ARRAY_SIZE(key), \
2119 NULL, 0, NULL, 0, \
2120 (in_incr), (ptx), ARRAY_SIZE(ptx), (ctx), ARRAY_SIZE(ctx), \
2121 __LINE__ }, \
2122 { (algo), TEE_MODE_DECRYPT, (key_type), (key), ARRAY_SIZE(key), \
2123 NULL, 0, NULL, 0, \
2124 (in_incr), (ctx), ARRAY_SIZE(ctx), (ptx), ARRAY_SIZE(ptx), __LINE__ }
2125
2126#define XTEST_CIPH_CASE(algo, key_type, key, iv, in_incr, ptx, ctx) \
2127 { (algo), TEE_MODE_ENCRYPT, (key_type), (key), ARRAY_SIZE(key), \
2128 NULL, 0, iv, ARRAY_SIZE(iv), (in_incr), (ptx), ARRAY_SIZE(ptx), \
2129 (ctx), ARRAY_SIZE(ctx), __LINE__ }, \
2130 { (algo), TEE_MODE_DECRYPT, (key_type), (key), ARRAY_SIZE(key), \
2131 NULL, 0, iv, ARRAY_SIZE(iv), (in_incr), (ctx), ARRAY_SIZE(ctx), \
2132 (ptx), ARRAY_SIZE(ptx), __LINE__ }
2133
2134#define XTEST_CIPH_CASE_AES_XTS(vect, in_incr) \
2135 { TEE_ALG_AES_XTS, TEE_MODE_ENCRYPT, TEE_TYPE_AES, \
2136 ciph_data_aes_xts_ ## vect ## _key1, \
2137 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _key1), \
2138 ciph_data_aes_xts_ ## vect ## _key2, \
2139 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _key2), \
2140 ciph_data_aes_xts_ ## vect ## _iv, \
2141 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _iv), \
2142 (in_incr), \
2143 ciph_data_aes_xts_ ## vect ## _ptx, \
2144 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _ptx), \
2145 ciph_data_aes_xts_ ## vect ## _ctx, \
2146 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _ctx), __LINE__ }, \
2147 { TEE_ALG_AES_XTS, TEE_MODE_DECRYPT, TEE_TYPE_AES, \
2148 ciph_data_aes_xts_ ## vect ## _key1, \
2149 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _key1), \
2150 ciph_data_aes_xts_ ## vect ## _key2, \
2151 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _key2), \
2152 ciph_data_aes_xts_ ## vect ## _iv, \
2153 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _iv), \
2154 (in_incr), \
2155 ciph_data_aes_xts_ ## vect ## _ctx, \
2156 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _ctx), \
2157 ciph_data_aes_xts_ ## vect ## _ptx, \
2158 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _ptx), __LINE__ }
2159
2160#define XTEST_CIPH_CASE_AES_CBC(vect, in_incr) \
2161 XTEST_CIPH_CASE(TEE_ALG_AES_CBC_NOPAD, TEE_TYPE_AES, \
2162 ciph_data_aes_cbc_ ## vect ## _key, \
2163 ciph_data_aes_cbc_ ## vect ## _iv, \
2164 (in_incr), ciph_data_aes_cbc_ ## vect ## _ptx, \
2165 ciph_data_aes_cbc_ ## vect ## _ctx)
2166
2167#define XTEST_CIPH_CASE_AES_CTS(vect, in_incr) \
2168 XTEST_CIPH_CASE(TEE_ALG_AES_CTS, TEE_TYPE_AES, \
2169 ciph_data_aes_cts_ ## vect ## _key, \
2170 ciph_data_aes_cts_ ## vect ## _iv, \
2171 (in_incr), ciph_data_aes_cts_ ## vect ## _ptx, \
2172 ciph_data_aes_cts_ ## vect ## _ctx)
2173
2174static const struct xtest_ciph_case ciph_cases[] = {
2175 /* AES */
2176 XTEST_CIPH_CASE_NO_IV(TEE_ALG_AES_ECB_NOPAD, TEE_TYPE_AES,
2177 ciph_data_aes_key1, 11, ciph_data_in1,
2178 ciph_data_aes_ecb_nopad_out1),
2179 XTEST_CIPH_CASE(TEE_ALG_AES_CBC_NOPAD, TEE_TYPE_AES,
2180 ciph_data_aes_key1, ciph_data_128_iv1, 11,
2181 ciph_data_in1,
2182 ciph_data_aes_cbc_nopad_out1),
2183 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
2184 ciph_data_aes_key1, ciph_data_128_iv1, 13,
2185 ciph_data_in1,
2186 ciph_data_aes_ctr_out1),
2187 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
2188 ciph_data_aes_key1, ciph_data_128_iv1, 13,
2189 ciph_data_in3,
2190 ciph_data_aes_ctr_out2),
Jens Wiklander692efd12018-01-19 09:52:00 +01002191 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
2192 ciph_data_aes_key1, ciph_data_128_iv1, 16,
2193 ciph_data_in3,
2194 ciph_data_aes_ctr_out2),
Jerome Forissier45218eb2018-04-11 13:03:26 +02002195 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
2196 ciph_data_aes_key1, ciph_data_128_iv1, 16,
2197 ciph_data_in4,
2198 ciph_data_aes_ctr_out4),
Jerome Forissier0780ad42018-06-05 15:02:37 +02002199 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
2200 ciph_data_aes_key2, ciph_data_128_iv2, 11,
2201 ciph_data_in5,
2202 ciph_data_aes_ctr_out5),
Pascal Brandc639ac82015-07-02 08:53:34 +02002203
2204 XTEST_CIPH_CASE_AES_CBC(vect1, 11),
Jerome Forissierfc1bbc32018-06-12 10:13:04 +02002205 XTEST_CIPH_CASE_AES_CBC(vect1, 64),
Pascal Brandc639ac82015-07-02 08:53:34 +02002206
2207 /* AES-CTS */
2208 XTEST_CIPH_CASE_AES_CTS(vect1, 13),
2209 XTEST_CIPH_CASE_AES_CTS(vect2, 14),
2210 XTEST_CIPH_CASE_AES_CTS(vect3, 11),
2211 XTEST_CIPH_CASE_AES_CTS(vect4, 9),
2212 XTEST_CIPH_CASE_AES_CTS(vect5, 7),
2213 XTEST_CIPH_CASE_AES_CTS(vect6, 17),
2214 XTEST_CIPH_CASE_AES_CTS(vect6, 0x20),
Jerome Forissiered00e162017-01-20 09:22:52 +01002215 XTEST_CIPH_CASE_AES_CTS(issue1203, 32),
Pascal Brandc639ac82015-07-02 08:53:34 +02002216
2217 /* DES */
2218 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES_ECB_NOPAD, TEE_TYPE_DES,
2219 ciph_data_des_key1, 14, ciph_data_in1,
2220 ciph_data_des_ecb_nopad_out1),
2221 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES_ECB_NOPAD, TEE_TYPE_DES,
2222 ciph_data_des_key2, 3, ciph_data_in2,
2223 ciph_data_des_ecb_nopad_out2),
2224 XTEST_CIPH_CASE(TEE_ALG_DES_CBC_NOPAD, TEE_TYPE_DES,
2225 ciph_data_des_key1, ciph_data_64_iv1, 15, ciph_data_in1,
2226 ciph_data_des_cbc_nopad_out1),
2227
2228 /* DES3 */
2229 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES3_ECB_NOPAD, TEE_TYPE_DES3,
2230 ciph_data_des3_key1, 11, ciph_data_in1,
2231 ciph_data_des3_ecb_nopad_out1),
2232 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES3_ECB_NOPAD, TEE_TYPE_DES3,
2233 ciph_data_des3_key2, 3, ciph_data_in2,
2234 ciph_data_des_ecb_nopad_out2),
2235 XTEST_CIPH_CASE(TEE_ALG_DES3_CBC_NOPAD, TEE_TYPE_DES3,
2236 ciph_data_des3_key1, ciph_data_64_iv1, 11,
2237 ciph_data_in1,
2238 ciph_data_des3_cbc_nopad_out1),
2239
2240 /* DES2 */
2241 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES3_ECB_NOPAD, TEE_TYPE_DES3,
2242 ciph_data_des2_key1, 11, ciph_data_in1,
2243 ciph_data_des2_ecb_nopad_out1),
2244 XTEST_CIPH_CASE(TEE_ALG_DES3_CBC_NOPAD, TEE_TYPE_DES3,
2245 ciph_data_des2_key1, ciph_data_64_iv1, 11,
2246 ciph_data_in1,
2247 ciph_data_des2_cbc_nopad_out1),
Pascal Brandc639ac82015-07-02 08:53:34 +02002248
Pascal Brandc639ac82015-07-02 08:53:34 +02002249 /* AES-XTS */
2250 XTEST_CIPH_CASE_AES_XTS(vect1, 3),
2251 XTEST_CIPH_CASE_AES_XTS(vect2, 6),
2252 XTEST_CIPH_CASE_AES_XTS(vect3, 7),
2253 XTEST_CIPH_CASE_AES_XTS(vect4, 8),
2254 XTEST_CIPH_CASE_AES_XTS(vect5, 9),
2255 XTEST_CIPH_CASE_AES_XTS(vect6, 13),
2256 XTEST_CIPH_CASE_AES_XTS(vect7, 1),
2257 XTEST_CIPH_CASE_AES_XTS(vect8, 3),
2258 XTEST_CIPH_CASE_AES_XTS(vect9, 2),
2259 XTEST_CIPH_CASE_AES_XTS(vect10, 5),
2260 XTEST_CIPH_CASE_AES_XTS(vect11, 6),
2261 XTEST_CIPH_CASE_AES_XTS(vect12, 7),
2262 XTEST_CIPH_CASE_AES_XTS(vect13, 3),
2263 XTEST_CIPH_CASE_AES_XTS(vect14, 2),
2264 XTEST_CIPH_CASE_AES_XTS(vect15, 0),
2265 XTEST_CIPH_CASE_AES_XTS(vect16, 9),
2266 XTEST_CIPH_CASE_AES_XTS(vect17, 6),
2267 XTEST_CIPH_CASE_AES_XTS(vect18, 8),
2268 XTEST_CIPH_CASE_AES_XTS(vect19, 23),
Jerome Forissiere73e0fb2019-12-12 17:08:03 +01002269
2270 /* SM4 */
2271 XTEST_CIPH_CASE_NO_IV(TEE_ALG_SM4_ECB_NOPAD, TEE_TYPE_SM4,
2272 ciph_data_sm4_key1, 11, ciph_data_sm4_in1,
2273 ciph_data_sm4_ecb_nopad_out1),
2274 XTEST_CIPH_CASE(TEE_ALG_SM4_CBC_NOPAD, TEE_TYPE_SM4,
2275 ciph_data_sm4_cbc_a221_key, ciph_data_sm4_cbc_a221_iv,
2276 11, ciph_data_sm4_cbc_a221_in,
2277 ciph_data_sm4_cbc_a221_out),
2278 XTEST_CIPH_CASE(TEE_ALG_SM4_CBC_NOPAD, TEE_TYPE_SM4,
2279 ciph_data_sm4_cbc_a222_key, ciph_data_sm4_cbc_a222_iv,
2280 11, ciph_data_sm4_cbc_a222_in,
2281 ciph_data_sm4_cbc_a222_out),
2282 XTEST_CIPH_CASE(TEE_ALG_SM4_CTR, TEE_TYPE_SM4,
2283 ciph_data_sm4_ctr_a251_key, ciph_data_sm4_ctr_a251_iv,
2284 11, ciph_data_sm4_ctr_a251_in,
2285 ciph_data_sm4_ctr_a251_out),
2286 XTEST_CIPH_CASE(TEE_ALG_SM4_CTR, TEE_TYPE_SM4,
2287 ciph_data_sm4_ctr_a252_key, ciph_data_sm4_ctr_a252_iv,
2288 11, ciph_data_sm4_ctr_a252_in,
2289 ciph_data_sm4_ctr_a252_out),
Pascal Brandc639ac82015-07-02 08:53:34 +02002290};
2291
Jerome Forissier23256842018-02-16 09:25:35 +01002292static void xtest_tee_test_4003(ADBG_Case_t *c)
Pascal Brandc639ac82015-07-02 08:53:34 +02002293{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002294 TEEC_Session session = { };
2295 TEE_OperationHandle op = TEE_HANDLE_NULL;
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002296 TEE_OperationHandle op2 = TEE_HANDLE_NULL;
Pascal Brandc639ac82015-07-02 08:53:34 +02002297 TEE_ObjectHandle key1_handle = TEE_HANDLE_NULL;
2298 TEE_ObjectHandle key2_handle = TEE_HANDLE_NULL;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002299 uint8_t out[2048] = { };
2300 size_t out_size = 0;
2301 size_t out_offs = 0;
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002302 size_t out_offs2 = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002303 uint32_t ret_orig = 0;
2304 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02002305
2306 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2307 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
2308 &ret_orig)))
2309 return;
2310
2311 for (n = 0; n < ARRAY_SIZE(ciph_cases); n++) {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002312 TEE_Attribute key_attr = { };
2313 size_t key_size = 0;
2314 size_t op_key_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02002315
Jerome Forissier817d99f2020-01-22 16:33:12 +01002316 switch (ciph_cases[n].algo) {
2317 case TEE_ALG_SM4_CTR:
2318 case TEE_ALG_SM4_CBC_NOPAD:
2319 case TEE_ALG_SM4_ECB_NOPAD:
2320 if (!ta_crypt_cmd_is_algo_supported(c, &session,
2321 ciph_cases[n].algo, TEE_CRYPTO_ELEMENT_NONE)) {
2322 Do_ADBG_Log("SM4 not supported: skip subcase");
2323 continue;
2324 }
2325 break;
2326 default:
2327 break;
2328 }
2329
Pascal Brandc639ac82015-07-02 08:53:34 +02002330 Do_ADBG_BeginSubCase(c, "Cipher case %d algo 0x%x line %d",
2331 (int)n, (unsigned int)ciph_cases[n].algo,
2332 (int)ciph_cases[n].line);
2333
2334 key_attr.attributeID = TEE_ATTR_SECRET_VALUE;
2335 key_attr.content.ref.buffer = (void *)ciph_cases[n].key1;
2336 key_attr.content.ref.length = ciph_cases[n].key1_len;
2337
2338 key_size = key_attr.content.ref.length * 8;
2339 if (ciph_cases[n].key_type == TEE_TYPE_DES ||
2340 ciph_cases[n].key_type == TEE_TYPE_DES3)
2341 /* Exclude parity in bit size of key */
2342 key_size -= key_size / 8;
2343
2344 op_key_size = key_size;
2345 if (ciph_cases[n].key2 != NULL)
2346 op_key_size *= 2;
2347
2348 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2349 ta_crypt_cmd_allocate_operation(c, &session, &op,
2350 ciph_cases[n].algo, ciph_cases[n].mode,
2351 op_key_size)))
2352 goto out;
2353
2354 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002355 ta_crypt_cmd_allocate_operation(c, &session, &op2,
2356 ciph_cases[n].algo, ciph_cases[n].mode,
2357 op_key_size)))
2358 goto out;
2359
2360 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc639ac82015-07-02 08:53:34 +02002361 ta_crypt_cmd_allocate_transient_object(c, &session,
2362 ciph_cases[n].key_type, key_size,
2363 &key1_handle)))
2364 goto out;
2365
2366 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2367 ta_crypt_cmd_populate_transient_object(c, &session,
2368 key1_handle, &key_attr, 1)))
2369 goto out;
2370
2371 if (ciph_cases[n].key2 != NULL) {
2372 key_attr.content.ref.buffer =
2373 (void *)ciph_cases[n].key2;
2374 key_attr.content.ref.length = ciph_cases[n].key2_len;
2375
2376 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2377 ta_crypt_cmd_allocate_transient_object(c,
2378 &session, ciph_cases[n].key_type,
2379 key_attr.content.ref.length * 8,
2380 &key2_handle)))
2381 goto out;
2382
2383 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2384 ta_crypt_cmd_populate_transient_object(c,
2385 &session, key2_handle, &key_attr, 1)))
2386 goto out;
2387
2388 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2389 ta_crypt_cmd_set_operation_key2(c, &session, op,
2390 key1_handle, key2_handle)))
2391 goto out;
2392 } else {
2393 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2394 ta_crypt_cmd_set_operation_key(c, &session, op,
2395 key1_handle)))
2396 goto out;
2397 }
2398
2399 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2400 ta_crypt_cmd_free_transient_object(c, &session,
2401 key1_handle)))
2402 goto out;
2403 key1_handle = TEE_HANDLE_NULL;
2404
2405 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2406 ta_crypt_cmd_free_transient_object(c, &session,
2407 key2_handle)))
2408 goto out;
2409 key2_handle = TEE_HANDLE_NULL;
2410
2411 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2412 ta_crypt_cmd_cipher_init(c, &session, op,
2413 ciph_cases[n].iv, ciph_cases[n].iv_len)))
2414 goto out;
2415
2416 out_offs = 0;
2417 out_size = sizeof(out);
2418 memset(out, 0, sizeof(out));
2419 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2420 ta_crypt_cmd_cipher_update(c, &session, op,
2421 ciph_cases[n].in, ciph_cases[n].in_incr, out,
2422 &out_size)))
2423 goto out;
2424
Jerome Forissierd2d94b42017-06-02 16:39:34 +02002425 if (ciph_cases[n].algo == TEE_ALG_AES_CTR)
2426 ADBG_EXPECT_COMPARE_UNSIGNED(c, out_size, ==,
2427 ciph_cases[n].in_incr);
2428
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002429 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2430 ta_crypt_cmd_copy_operation(c, &session, op2, op)))
2431 goto out;
2432
Pascal Brandc639ac82015-07-02 08:53:34 +02002433 out_offs += out_size;
2434 out_size = sizeof(out) - out_offs;
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002435 out_offs2 = out_offs;
Pascal Brandc639ac82015-07-02 08:53:34 +02002436
2437 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2438 ta_crypt_cmd_cipher_do_final(c, &session, op,
2439 ciph_cases[n].in + ciph_cases[n].in_incr,
2440 ciph_cases[n].in_len - ciph_cases[n].in_incr,
2441 out + out_offs,
2442 &out_size)))
2443 goto out;
2444
2445 out_offs += out_size;
2446
2447 (void)ADBG_EXPECT_BUFFER(c, ciph_cases[n].out,
2448 ciph_cases[n].out_len, out, out_offs);
2449
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002450 /* test on the copied op2 */
2451 out_size = sizeof(out) - out_offs2;
2452
2453 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2454 ta_crypt_cmd_cipher_do_final(c, &session, op2,
2455 ciph_cases[n].in + ciph_cases[n].in_incr,
2456 ciph_cases[n].in_len - ciph_cases[n].in_incr,
2457 out + out_offs2,
2458 &out_size)))
2459 goto out;
2460
2461 out_offs2 += out_size;
2462
2463 ADBG_EXPECT_BUFFER(c, ciph_cases[n].out, ciph_cases[n].out_len,
2464 out, out_offs2);
2465
Pascal Brandc639ac82015-07-02 08:53:34 +02002466 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2467 ta_crypt_cmd_free_operation(c, &session, op)))
2468 goto out;
2469
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002470 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2471 ta_crypt_cmd_free_operation(c, &session, op2)))
2472 goto out;
2473
Pascal Brandc639ac82015-07-02 08:53:34 +02002474 Do_ADBG_EndSubCase(c, NULL);
2475 }
2476out:
2477 TEEC_CloseSession(&session);
2478}
Jens Wiklander14f48872018-06-29 15:30:13 +02002479ADBG_CASE_DEFINE(regression, 4003, xtest_tee_test_4003,
2480 "Test TEE Internal API cipher operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02002481
Pascal Brandc639ac82015-07-02 08:53:34 +02002482static void xtest_tee_test_4004(ADBG_Case_t *c)
2483{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002484 TEEC_Session session = { };
2485 uint32_t ret_orig = 0;
2486 uint8_t buf1[45] = { };
2487 uint8_t buf2[45] = { };
2488 static const uint8_t zeros[45];
Pascal Brandc639ac82015-07-02 08:53:34 +02002489
2490 Do_ADBG_BeginSubCase(c, "TEE get random");
2491 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2492 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
2493 &ret_orig)))
2494 return;
2495
2496 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2497 ta_crypt_cmd_random_number_generate(c, &session, buf1,
2498 sizeof(buf1))))
2499 goto out;
2500
2501 (void)ADBG_EXPECT_COMPARE_SIGNED(c,
2502 0, !=, memcmp(buf1, zeros, sizeof(buf1)));
2503
2504 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2505 ta_crypt_cmd_random_number_generate(c, &session, buf2,
2506 sizeof(buf2))))
2507 goto out;
2508
2509 (void)ADBG_EXPECT_COMPARE_SIGNED(c,
2510 0, !=, memcmp(buf2, zeros, sizeof(buf2)));
2511
2512 (void)ADBG_EXPECT_COMPARE_SIGNED(c,
2513 0, !=, memcmp(buf2, buf1, sizeof(buf1)));
2514out:
2515 TEEC_CloseSession(&session);
2516 Do_ADBG_EndSubCase(c, "TEE get random");
2517}
Jens Wiklander14f48872018-06-29 15:30:13 +02002518ADBG_CASE_DEFINE(regression, 4004, xtest_tee_test_4004,
2519 "Test TEE Internal API get random");
Pascal Brandc639ac82015-07-02 08:53:34 +02002520
2521struct xtest_ae_case {
2522 uint32_t algo;
2523 uint32_t mode;
2524 uint32_t key_type;
2525 const uint8_t *key;
2526 size_t key_len;
2527 const uint8_t *nonce;
2528 size_t nonce_len;
2529 size_t aad_incr;
2530 const uint8_t *aad;
2531 size_t aad_len;
2532 size_t in_incr;
2533 const uint8_t *ptx;
2534 size_t ptx_len;
2535 const uint8_t *ctx;
2536 size_t ctx_len;
2537 const uint8_t *tag;
2538 size_t tag_len;
2539 size_t line;
2540};
2541
2542
2543#define ARRAY(a) a, ARRAY_SIZE(a)
2544#define NULL_ARRAY(a) NULL, 0
2545
2546#define XTEST_AE_CASE(algo, vect, aad_incr, in_incr, \
2547 aad_array, ptx_array, ctx_array) \
2548 { (algo), TEE_MODE_ENCRYPT, TEE_TYPE_AES, ARRAY(vect ## _key), \
2549 ARRAY(vect ## _nonce), (aad_incr), \
2550 aad_array(vect ## _aad), (in_incr), \
2551 ptx_array(vect ## _ptx), ctx_array(vect ## _ctx), \
2552 ARRAY(vect ## _tag), \
2553 __LINE__ }, \
2554 { (algo), TEE_MODE_DECRYPT, TEE_TYPE_AES, ARRAY(vect ## _key), \
2555 ARRAY(vect ## _nonce), (aad_incr), \
2556 aad_array(vect ## _aad), (in_incr), \
2557 ptx_array(vect ## _ptx), ctx_array(vect ## _ctx), \
2558 ARRAY(vect ## _tag), \
2559 __LINE__ }
2560
2561#define XTEST_AE_CASE_AES_CCM(vect, aad_incr, in_incr) \
2562 XTEST_AE_CASE(TEE_ALG_AES_CCM, ae_data_aes_ccm_ ## vect, aad_incr, \
2563 in_incr, ARRAY, ARRAY, ARRAY)
2564
2565#define XTEST_AE_CASE_AES_GCM(vect, aad_incr, in_incr, \
2566 aad_array, ptx_array, ctx_array) \
2567 XTEST_AE_CASE(TEE_ALG_AES_GCM, ae_data_aes_gcm_ ## vect, aad_incr, \
2568 in_incr, aad_array, ptx_array, ctx_array)
2569
2570
2571
2572static const struct xtest_ae_case ae_cases[] = {
2573 XTEST_AE_CASE_AES_CCM(vect1, 3, 2),
2574 XTEST_AE_CASE_AES_CCM(vect2, 7, 13),
2575 XTEST_AE_CASE_AES_CCM(vect3, 5, 21),
2576
2577 XTEST_AE_CASE_AES_GCM(vect1, 0, 0, NULL_ARRAY, NULL_ARRAY, NULL_ARRAY),
2578 XTEST_AE_CASE_AES_GCM(vect2, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2579 XTEST_AE_CASE_AES_GCM(vect3, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
Jens Wiklander9fc63f52017-11-10 11:13:26 +01002580 XTEST_AE_CASE_AES_GCM(vect3, 0, 0x1F, NULL_ARRAY, ARRAY, ARRAY),
2581 XTEST_AE_CASE_AES_GCM(vect4, 5, 0x20, ARRAY, ARRAY, ARRAY),
Pascal Brandc639ac82015-07-02 08:53:34 +02002582 XTEST_AE_CASE_AES_GCM(vect5, 5, 9, ARRAY, ARRAY, ARRAY),
2583 XTEST_AE_CASE_AES_GCM(vect6, 5, 9, ARRAY, ARRAY, ARRAY),
2584 XTEST_AE_CASE_AES_GCM(vect7, 0, 0, NULL_ARRAY, NULL_ARRAY, NULL_ARRAY),
2585 XTEST_AE_CASE_AES_GCM(vect8, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2586 XTEST_AE_CASE_AES_GCM(vect9, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2587 XTEST_AE_CASE_AES_GCM(vect10, 5, 9, ARRAY, ARRAY, ARRAY),
2588 XTEST_AE_CASE_AES_GCM(vect11, 5, 9, ARRAY, ARRAY, ARRAY),
2589 XTEST_AE_CASE_AES_GCM(vect12, 5, 9, ARRAY, ARRAY, ARRAY),
2590 XTEST_AE_CASE_AES_GCM(vect13, 0, 0, NULL_ARRAY, NULL_ARRAY, NULL_ARRAY),
2591 XTEST_AE_CASE_AES_GCM(vect14, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2592 XTEST_AE_CASE_AES_GCM(vect15, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2593 XTEST_AE_CASE_AES_GCM(vect16, 5, 9, ARRAY, ARRAY, ARRAY),
2594 XTEST_AE_CASE_AES_GCM(vect17, 5, 9, ARRAY, ARRAY, ARRAY),
2595 XTEST_AE_CASE_AES_GCM(vect18, 5, 9, ARRAY, ARRAY, ARRAY),
Jens Wiklanderf6efe242017-11-06 13:16:43 +01002596#ifdef CFG_GCM_NIST_VECTORS
2597#include "gcmDecrypt128.h"
2598#include "gcmDecrypt192.h"
2599#include "gcmDecrypt256.h"
2600#include "gcmEncryptExtIV128.h"
2601#include "gcmEncryptExtIV192.h"
2602#include "gcmEncryptExtIV256.h"
2603#endif
Pascal Brandc639ac82015-07-02 08:53:34 +02002604};
2605
2606static void xtest_tee_test_4005(ADBG_Case_t *c)
2607{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002608 TEEC_Session session = { };
2609 TEE_OperationHandle op = TEE_HANDLE_NULL;
Jens Wiklander7404c072020-12-15 08:06:32 +01002610 TEE_OperationHandle op2 = TEE_HANDLE_NULL;
Pascal Brandc639ac82015-07-02 08:53:34 +02002611 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002612 TEE_Attribute key_attr = { };
2613 uint8_t out[512] = { };
2614 size_t out_size = 0;
2615 size_t out_offs = 0;
Jens Wiklander7404c072020-12-15 08:06:32 +01002616 size_t out_offs2 = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002617 uint32_t ret_orig = 0;
2618 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02002619
2620 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2621 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
2622 &ret_orig)))
2623 return;
2624
2625 for (n = 0; n < ARRAY_SIZE(ae_cases); n++) {
2626 Do_ADBG_BeginSubCase(c, "AE case %d algo 0x%x line %d",
2627 (int)n, (unsigned int)ae_cases[n].algo,
2628 (int)ae_cases[n].line);
2629
2630 key_attr.attributeID = TEE_ATTR_SECRET_VALUE;
2631 key_attr.content.ref.buffer = (void *)ae_cases[n].key;
2632 key_attr.content.ref.length = ae_cases[n].key_len;
2633
2634 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2635 ta_crypt_cmd_allocate_operation(c, &session, &op,
2636 ae_cases[n].algo, ae_cases[n].mode,
2637 key_attr.content.ref.length * 8)))
2638 goto out;
2639
2640 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jens Wiklander7404c072020-12-15 08:06:32 +01002641 ta_crypt_cmd_allocate_operation(c, &session, &op2,
2642 ae_cases[n].algo, ae_cases[n].mode,
2643 key_attr.content.ref.length * 8)))
2644 goto out;
2645
2646 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc639ac82015-07-02 08:53:34 +02002647 ta_crypt_cmd_allocate_transient_object(c, &session,
2648 ae_cases[n].key_type,
2649 key_attr.content.ref.length * 8,
2650 &key_handle)))
2651 goto out;
2652
2653 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2654 ta_crypt_cmd_populate_transient_object(c, &session,
2655 key_handle, &key_attr, 1)))
2656 goto out;
2657
2658 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2659 ta_crypt_cmd_set_operation_key(c, &session, op,
2660 key_handle)))
2661 goto out;
2662
2663 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2664 ta_crypt_cmd_free_transient_object(c, &session,
2665 key_handle)))
2666 goto out;
2667 key_handle = TEE_HANDLE_NULL;
2668
2669 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2670 ta_crypt_cmd_ae_init(c, &session, op, ae_cases[n].nonce,
2671 ae_cases[n].nonce_len, ae_cases[n].tag_len,
2672 ae_cases[n].aad_len, ae_cases[n].ptx_len)))
2673 goto out;
2674
2675 if (ae_cases[n].aad != NULL) {
2676 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2677 ta_crypt_cmd_ae_update_aad(c, &session, op,
2678 ae_cases[n].aad, ae_cases[n].aad_incr)))
2679 goto out;
2680
2681 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2682 ta_crypt_cmd_ae_update_aad(c, &session, op,
2683 ae_cases[n].aad + ae_cases[n].aad_incr,
2684 ae_cases [n].aad_len -
2685 ae_cases[n].aad_incr)))
2686 goto out;
2687 }
2688
2689 out_offs = 0;
2690 out_size = sizeof(out);
2691 memset(out, 0, sizeof(out));
2692 if (ae_cases[n].mode == TEE_MODE_ENCRYPT) {
2693 if (ae_cases[n].ptx != NULL) {
2694 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2695 ta_crypt_cmd_ae_update(c, &session, op,
2696 ae_cases[n].ptx,
2697 ae_cases[n].in_incr, out,
2698 &out_size)))
2699 goto out;
2700 out_offs += out_size;
Jerome Forissierc13fafa2017-06-01 15:49:07 +02002701 if (ae_cases[n].algo == TEE_ALG_AES_GCM)
2702 ADBG_EXPECT_COMPARE_UNSIGNED(c,
2703 out_size, ==, ae_cases[n].in_incr);
Pascal Brandc639ac82015-07-02 08:53:34 +02002704 }
2705 } else {
2706 if (ae_cases[n].ctx != NULL) {
2707 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2708 ta_crypt_cmd_ae_update(c, &session, op,
2709 ae_cases[n].ctx,
2710 ae_cases[n].in_incr, out,
2711 &out_size)))
2712 goto out;
2713 out_offs += out_size;
Jerome Forissierc13fafa2017-06-01 15:49:07 +02002714 if (ae_cases[n].algo == TEE_ALG_AES_GCM)
2715 ADBG_EXPECT_COMPARE_UNSIGNED(c,
2716 out_size, ==, ae_cases[n].in_incr);
Pascal Brandc639ac82015-07-02 08:53:34 +02002717 }
2718 }
2719
Jens Wiklander7404c072020-12-15 08:06:32 +01002720 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2721 ta_crypt_cmd_copy_operation(c, &session, op2, op)))
2722 goto out;
2723
Pascal Brandc639ac82015-07-02 08:53:34 +02002724 out_size = sizeof(out) - out_offs;
Jens Wiklander7404c072020-12-15 08:06:32 +01002725 out_offs2 = out_offs;
Pascal Brandc639ac82015-07-02 08:53:34 +02002726 if (ae_cases[n].mode == TEE_MODE_ENCRYPT) {
2727 uint8_t out_tag[64];
2728 size_t out_tag_len = MIN(sizeof(out_tag),
2729 ae_cases[n].tag_len);
2730
2731 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2732 ta_crypt_cmd_ae_encrypt_final(c, &session, op,
2733 ae_cases[n].ptx + ae_cases[n].in_incr,
2734 ae_cases[n].ptx_len -
2735 ae_cases[n].in_incr,
2736 out + out_offs,
2737 &out_size, out_tag, &out_tag_len)))
2738 goto out;
2739
2740 (void)ADBG_EXPECT_BUFFER(c,
2741 ae_cases[n].tag, ae_cases[n].tag_len, out_tag,
2742 out_tag_len);
2743
2744 out_offs += out_size;
2745
2746 (void)ADBG_EXPECT_BUFFER(c, ae_cases[n].ctx,
2747 ae_cases[n].ctx_len, out, out_offs);
2748 } else {
2749 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2750 ta_crypt_cmd_ae_decrypt_final(c, &session, op,
2751 ae_cases[n].ctx + ae_cases[n].in_incr,
2752 ae_cases[n].ctx_len -
2753 ae_cases[n].in_incr,
2754 out + out_offs,
2755 &out_size, ae_cases[n].tag,
2756 ae_cases[n].tag_len)))
2757 goto out;
2758
2759 out_offs += out_size;
2760
2761 (void)ADBG_EXPECT_BUFFER(c, ae_cases[n].ptx,
2762 ae_cases[n].ptx_len, out, out_offs);
2763 }
2764
Jens Wiklander7404c072020-12-15 08:06:32 +01002765 /* test on the copied op2 */
2766 out_size = sizeof(out) - out_offs2;
2767 memset(out + out_offs2, 0, out_size);
2768 if (ae_cases[n].mode == TEE_MODE_ENCRYPT) {
2769 uint8_t out_tag[64] = { 0 };
2770 size_t out_tag_len = MIN(sizeof(out_tag),
2771 ae_cases[n].tag_len);
2772
2773 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2774 ta_crypt_cmd_ae_encrypt_final(c, &session, op2,
2775 ae_cases[n].ptx + ae_cases[n].in_incr,
2776 ae_cases[n].ptx_len -
2777 ae_cases[n].in_incr,
2778 out + out_offs2,
2779 &out_size, out_tag, &out_tag_len)))
2780 goto out;
2781
2782 ADBG_EXPECT_BUFFER(c, ae_cases[n].tag,
2783 ae_cases[n].tag_len, out_tag,
2784 out_tag_len);
2785
2786 out_offs2 += out_size;
2787
2788 (void)ADBG_EXPECT_BUFFER(c, ae_cases[n].ctx,
2789 ae_cases[n].ctx_len, out, out_offs2);
2790 } else {
2791 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2792 ta_crypt_cmd_ae_decrypt_final(c, &session, op2,
2793 ae_cases[n].ctx + ae_cases[n].in_incr,
2794 ae_cases[n].ctx_len -
2795 ae_cases[n].in_incr,
2796 out + out_offs2,
2797 &out_size, ae_cases[n].tag,
2798 ae_cases[n].tag_len)))
2799 goto out;
2800
2801 out_offs2 += out_size;
2802
2803 (void)ADBG_EXPECT_BUFFER(c, ae_cases[n].ptx,
2804 ae_cases[n].ptx_len, out, out_offs2);
2805 }
2806
Pascal Brandc639ac82015-07-02 08:53:34 +02002807 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2808 ta_crypt_cmd_free_operation(c, &session, op)))
2809 goto out;
2810
Jens Wiklander7404c072020-12-15 08:06:32 +01002811 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2812 ta_crypt_cmd_free_operation(c, &session, op2)))
2813 goto out;
2814
Pascal Brandc639ac82015-07-02 08:53:34 +02002815 Do_ADBG_EndSubCase(c, NULL);
2816 }
2817out:
2818 TEEC_CloseSession(&session);
2819}
Jens Wiklander14f48872018-06-29 15:30:13 +02002820ADBG_CASE_DEFINE(regression, 4005, xtest_tee_test_4005,
2821 "Test TEE Internal API Authenticated Encryption operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02002822
2823struct xtest_ac_case {
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002824 unsigned int level;
Pascal Brandc639ac82015-07-02 08:53:34 +02002825 uint32_t algo;
2826 TEE_OperationMode mode;
2827
2828 union {
2829 struct {
2830 const uint8_t *modulus;
2831 size_t modulus_len;
2832
2833 const uint8_t *pub_exp;
2834 size_t pub_exp_len;
2835
2836 const uint8_t *priv_exp;
2837 size_t priv_exp_len;
2838
2839 const uint8_t *prime1; /* q */
2840 size_t prime1_len;
2841 const uint8_t *prime2; /* p */
2842 size_t prime2_len;
2843 const uint8_t *exp1; /* dp */
2844 size_t exp1_len;
2845 const uint8_t *exp2; /* dq */
2846 size_t exp2_len;
2847 const uint8_t *coeff; /* iq */
2848 size_t coeff_len;
2849
2850 int salt_len;
2851 } rsa;
2852 struct {
2853 const uint8_t *prime;
2854 size_t prime_len;
2855 const uint8_t *sub_prime;
2856 size_t sub_prime_len;
2857 const uint8_t *base;
2858 size_t base_len;
2859 const uint8_t *pub_val;
2860 size_t pub_val_len;
2861 const uint8_t *priv_val;
2862 size_t priv_val_len;
2863 } dsa;
Pascal Brand3e143ee2015-07-15 17:17:16 +02002864 struct {
2865 const uint8_t *private;
2866 size_t private_len;
2867 const uint8_t *public_x;
2868 size_t public_x_len;
2869 const uint8_t *public_y;
2870 size_t public_y_len;
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01002871 } ecc;
Valerii Chubarab9863c2022-08-12 07:42:29 +00002872 struct {
2873 const uint8_t *private;
2874 size_t private_len;
2875 const uint8_t *public;
2876 size_t public_len;
2877 const uint8_t flag;
2878 const uint8_t *context;
2879 size_t context_len;
2880 } eddsa;
Pascal Brandc639ac82015-07-02 08:53:34 +02002881 } params;
2882
2883 const uint8_t *ptx;
2884 size_t ptx_len;
2885 const uint8_t *ctx;
2886 size_t ctx_len;
2887 size_t line;
2888};
2889
2890#define WITHOUT_SALT(x) -1
2891#define WITH_SALT(x) x
2892
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002893#define XTEST_AC_CASE(level, algo, mode, vect, union_params) \
2894 { level, (algo), (mode), .params = union_params, \
Pascal Brandc639ac82015-07-02 08:53:34 +02002895 ARRAY(vect ## _ptx), \
2896 ARRAY(vect ## _out), \
2897 __LINE__ }
2898
2899#define XTEST_AC_RSA_UNION(vect, opt_crt_array, opt_salt) \
2900 { .rsa = { \
2901 ARRAY(vect ## _modulus), \
2902 ARRAY(vect ## _pub_exp), \
2903 ARRAY(vect ## _priv_exp), \
2904 opt_crt_array(vect ## _prime1), \
2905 opt_crt_array(vect ## _prime2), \
2906 opt_crt_array(vect ## _exp1), \
2907 opt_crt_array(vect ## _exp2), \
2908 opt_crt_array(vect ## _coeff), \
2909 opt_salt(vect ## _salt_len) \
2910 } }
2911
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002912#define XTEST_AC_RSA_CASE(level, algo, mode, vect, opt_crt_array, opt_salt) \
2913 XTEST_AC_CASE(level, algo, mode, vect, \
Pascal Brandc639ac82015-07-02 08:53:34 +02002914 XTEST_AC_RSA_UNION(vect, opt_crt_array, opt_salt))
2915
2916#define XTEST_AC_DSA_UNION(vect) \
2917 { .dsa = { \
2918 ARRAY(vect ## _prime), \
2919 ARRAY(vect ## _sub_prime), \
2920 ARRAY(vect ## _base), \
2921 ARRAY(vect ## _pub_val), \
2922 ARRAY(vect ## _priv_val), \
2923 } }
2924
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002925#define XTEST_AC_DSA_CASE(level, algo, mode, vect) \
2926 XTEST_AC_CASE(level, algo, mode, vect, XTEST_AC_DSA_UNION(vect))
Pascal Brandc639ac82015-07-02 08:53:34 +02002927
Pascal Brand3e143ee2015-07-15 17:17:16 +02002928#define XTEST_AC_ECDSA_UNION(vect) \
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01002929 { .ecc = { \
Pascal Brand3e143ee2015-07-15 17:17:16 +02002930 ARRAY(vect ## _private), \
2931 ARRAY(vect ## _public_x), \
2932 ARRAY(vect ## _public_y), \
2933 } }
2934
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01002935#define XTEST_AC_ECC_CASE(level, algo, mode, vect) \
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002936 XTEST_AC_CASE(level, algo, mode, vect, XTEST_AC_ECDSA_UNION(vect))
Pascal Brand3e143ee2015-07-15 17:17:16 +02002937
Valerii Chubarab9863c2022-08-12 07:42:29 +00002938#define XTEST_AC_EDDSA_UNION(vect, flag) \
2939 { .eddsa = { \
2940 ARRAY(vect ## _private), \
2941 ARRAY(vect ## _public), \
2942 flag, \
2943 } }
2944
2945#define XTEST_AC_EDDSA_CTX_UNION(vect, flag) \
2946 { .eddsa = { \
2947 ARRAY(vect ## _private), \
2948 ARRAY(vect ## _public), \
2949 flag, \
2950 ARRAY(vect ## _context), \
2951 } }
2952
2953#define XTEST_AC_EDDSA_CASE(level, algo, mode, vect, flag) \
2954 XTEST_AC_CASE(level, algo, mode, vect, XTEST_AC_EDDSA_UNION(vect, flag))
2955
2956#define XTEST_AC_EDDSA_CTX_CASE(level, algo, mode, vect, flag) \
2957 XTEST_AC_CASE(level, algo, mode, vect, XTEST_AC_EDDSA_CTX_UNION(vect, flag))
2958
Pascal Brandc639ac82015-07-02 08:53:34 +02002959static const struct xtest_ac_case xtest_ac_cases[] = {
2960 /* RSA test without crt parameters */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002961 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002962 ac_rsassa_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002963 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002964 ac_rsassa_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002965 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002966 ac_rsassa_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002967 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002968 ac_rsassa_vect2, NULL_ARRAY, WITHOUT_SALT),
Jerome Forissiere576f052018-03-23 21:24:21 +08002969 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
2970 ac_rsassa_vect18, NULL_ARRAY, WITHOUT_SALT),
2971 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
2972 ac_rsassa_vect18, NULL_ARRAY, WITHOUT_SALT),
Jerome Forissier0451e372018-03-27 00:10:23 +08002973 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
2974 ac_rsassa_vect19, NULL_ARRAY, WITHOUT_SALT),
2975 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
2976 ac_rsassa_vect19, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002977 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002978 ac_rsassa_vect3, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002979 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002980 ac_rsassa_vect3, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002981 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002982 ac_rsassa_vect4, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002983 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002984 ac_rsassa_vect4, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002985 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002986 ac_rsassa_vect5, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002987 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002988 ac_rsassa_vect5, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002989 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002990 ac_rsassa_vect6, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002991 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002992 ac_rsassa_vect6, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002993 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002994 ac_rsassa_vect7, 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_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002996 ac_rsassa_vect7, 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_SIGN,
2998 ac_rsassa_vect8, NULL_ARRAY, WITHOUT_SALT),
2999 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
3000 ac_rsassa_vect8, NULL_ARRAY, WITHOUT_SALT),
Pascal Brandc639ac82015-07-02 08:53:34 +02003001
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003002 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA224, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003003 ac_rsassa_vect16, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003004 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA224, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003005 ac_rsassa_vect16, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003006
Gabor Szekely2ad190f2018-09-14 14:05:06 +00003007#ifdef CFG_CRYPTO_RSASSA_NA1
3008 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5, TEE_MODE_SIGN,
3009 ac_rsassa_vect20, NULL_ARRAY, WITHOUT_SALT),
3010 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5, TEE_MODE_VERIFY,
3011 ac_rsassa_vect20, NULL_ARRAY, WITHOUT_SALT),
3012#endif
3013
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003014 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003015 ac_rsassa_vect9, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003016 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003017 ac_rsassa_vect9, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003018
3019 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003020 ac_rsassa_vect10, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003021 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003022 ac_rsassa_vect10, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003023
3024 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003025 ac_rsassa_vect11, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003026 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003027 ac_rsassa_vect11, NULL_ARRAY, WITHOUT_SALT),
3028
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003029 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1,
3030 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003031 ac_rsassa_vect12, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003032 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003033 ac_rsassa_vect12, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003034
3035 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
3036 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003037 ac_rsassa_vect17, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003038 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
3039 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003040 ac_rsassa_vect17, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003041
3042 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
3043 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003044 ac_rsassa_vect13, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003045 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
3046 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003047 ac_rsassa_vect13, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003048
3049 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
3050 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003051 ac_rsassa_vect14, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003052 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
3053 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003054 ac_rsassa_vect14, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003055
3056 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
3057 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003058 ac_rsassa_vect15, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003059 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
3060 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003061 ac_rsassa_vect15, NULL_ARRAY, WITH_SALT),
3062
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003063 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003064 ac_rsaes_pkcs1_v1_5_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003065 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003066 ac_rsaes_pkcs1_v1_5_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003067 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003068 ac_rsaes_pkcs1_v1_5_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003069 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003070 ac_rsaes_pkcs1_v1_5_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003071 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003072 ac_rsaes_pkcs1_v1_5_vect15, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003073 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003074 ac_rsaes_pkcs1_v1_5_vect15, NULL_ARRAY, WITHOUT_SALT),
3075
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003076 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3077 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003078 ac_rsaes_oaep_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003079 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3080 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003081 ac_rsaes_oaep_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003082 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3083 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003084 ac_rsaes_oaep_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003085 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3086 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003087 ac_rsaes_oaep_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003088 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3089 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003090 ac_rsaes_oaep_vect10, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003091 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3092 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003093 ac_rsaes_oaep_vect10, NULL_ARRAY, WITHOUT_SALT),
3094
3095 /* RSA test with crt parameters */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003096 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003097 ac_rsassa_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003098 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003099 ac_rsassa_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003100 XTEST_AC_RSA_CASE(1, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003101 ac_rsassa_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003102 XTEST_AC_RSA_CASE(1, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003103 ac_rsassa_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003104 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003105 ac_rsassa_vect3, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003106 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003107 ac_rsassa_vect3, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003108 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003109 ac_rsassa_vect4, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003110 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003111 ac_rsassa_vect4, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003112 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003113 ac_rsassa_vect5, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003114 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003115 ac_rsassa_vect5, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003116 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003117 ac_rsassa_vect6, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003118 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003119 ac_rsassa_vect6, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003120 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003121 ac_rsassa_vect7, 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_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003123 ac_rsassa_vect7, 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_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003125 ac_rsassa_vect8, 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_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003127 ac_rsassa_vect8, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003128 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003129 ac_rsassa_vect9, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003130 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003131 ac_rsassa_vect9, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003132 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003133 ac_rsassa_vect10, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003134 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003135 ac_rsassa_vect10, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003136 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003137 ac_rsassa_vect11, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003138 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003139 ac_rsassa_vect11, ARRAY, WITHOUT_SALT),
3140
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003141 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1,
3142 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003143 ac_rsassa_vect12, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003144 XTEST_AC_RSA_CASE(1,TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003145 ac_rsassa_vect12, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003146 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
3147 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003148 ac_rsassa_vect17, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003149 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
3150 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003151 ac_rsassa_vect17, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003152 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
3153 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003154 ac_rsassa_vect13, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003155 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
3156 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003157 ac_rsassa_vect13, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003158 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
3159 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003160 ac_rsassa_vect14, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003161 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
3162 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003163 ac_rsassa_vect14, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003164 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
3165 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003166 ac_rsassa_vect15, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003167 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
3168 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003169 ac_rsassa_vect15, ARRAY, WITH_SALT),
3170
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003171 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003172 ac_rsaes_pkcs1_v1_5_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003173 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003174 ac_rsaes_pkcs1_v1_5_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003175 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003176 ac_rsaes_pkcs1_v1_5_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003177 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003178 ac_rsaes_pkcs1_v1_5_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003179 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003180 ac_rsaes_pkcs1_v1_5_vect15, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003181 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003182 ac_rsaes_pkcs1_v1_5_vect15, ARRAY, WITHOUT_SALT),
3183
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003184 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3185 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003186 ac_rsaes_oaep_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003187 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3188 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003189 ac_rsaes_oaep_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003190 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3191 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003192 ac_rsaes_oaep_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003193 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3194 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003195 ac_rsaes_oaep_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003196 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3197 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003198 ac_rsaes_oaep_vect10, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003199 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3200 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003201 ac_rsaes_oaep_vect10, ARRAY, WITHOUT_SALT),
3202
3203 /* DSA tests */
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003204 /* [mod = L=1024, N=160, SHA-1] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003205 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect1),
3206 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect1),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003207 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect2),
3208 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect2),
3209 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect3),
3210 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect3),
3211 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect4),
3212 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect4),
3213 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect5),
3214 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect5),
3215 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect6),
3216 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect6),
3217 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect7),
3218 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect7),
3219 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect8),
3220 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect8),
3221 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect9),
3222 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect9),
3223 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect10),
3224 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect10),
3225 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect11),
3226 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect11),
3227 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect12),
3228 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect12),
3229 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect13),
3230 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect13),
3231 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect14),
3232 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect14),
3233 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect15),
3234 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect15),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003235 /* [mod = L=1024, N=160, SHA-224] - GP NOT SUPPORTED */
3236 /* [mod = L=1024, N=160, SHA-256] - GP NOT SUPPORTED */
3237 /* [mod = L=1024, N=160, SHA-384] - GP NOT SUPPORTED */
3238 /* [mod = L=1024, N=160, SHA-512] - GP NOT SUPPORTED */
3239 /* [mod = L=2048, N=224, SHA-1] - GP NOT SUPPORTED */
3240 /* [mod = L=2048, N=224, SHA-224] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003241 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect91),
3242 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect91),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003243 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect92),
3244 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect92),
3245 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect93),
3246 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect93),
3247 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect94),
3248 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect94),
3249 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect95),
3250 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect95),
3251 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect96),
3252 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect96),
3253 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect97),
3254 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect97),
3255 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect98),
3256 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect98),
3257 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect99),
3258 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect99),
3259 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect100),
3260 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect100),
3261 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect101),
3262 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect101),
3263 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect102),
3264 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect102),
3265 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect103),
3266 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect103),
3267 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect104),
3268 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect104),
3269 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect105),
3270 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect105),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003271 /* [mod = L=2048, N=224, SHA-256] */
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003272 XTEST_AC_DSA_CASE(0, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect106),
3273 XTEST_AC_DSA_CASE(0, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect106),
3274 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect107),
3275 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect107),
3276 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect108),
3277 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect108),
3278 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect109),
3279 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect109),
3280 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect110),
3281 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect110),
3282 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect111),
3283 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect111),
3284 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect112),
3285 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect112),
3286 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect113),
3287 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect113),
3288 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect114),
3289 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect114),
3290 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect115),
3291 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect115),
3292 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect116),
3293 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect116),
3294 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect117),
3295 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect117),
3296 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect118),
3297 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect118),
3298 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect119),
3299 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect119),
3300 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect120),
3301 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect120),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003302 /* [mod = L=2048, N=224, SHA-384] - GP NOT SUPPORTED */
3303 /* [mod = L=2048, N=224, SHA-512] - GP NOT SUPPORTED */
3304 /* [mod = L=2048, N=256, SHA-1] - GP NOT SUPPORTED */
3305 /* [mod = L=2048, N=256, SHA-224] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003306 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect166),
3307 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect166),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003308 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect167),
3309 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect167),
3310 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect168),
3311 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect168),
3312 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect169),
3313 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect169),
3314 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect170),
3315 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect170),
3316 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect171),
3317 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect171),
3318 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect172),
3319 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect172),
3320 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect173),
3321 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect173),
3322 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect174),
3323 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect174),
3324 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect175),
3325 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect175),
3326 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect176),
3327 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect176),
3328 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect177),
3329 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect177),
3330 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect178),
3331 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect178),
3332 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect179),
3333 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect179),
3334 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect180),
3335 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect180),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003336 /* [mod = L=2048, N=256, SHA-256] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003337 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect181),
3338 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect181),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003339 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect182),
3340 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect182),
3341 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect183),
3342 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect183),
3343 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect184),
3344 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect184),
3345 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect185),
3346 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect185),
3347 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect186),
3348 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect186),
3349 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect187),
3350 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect187),
3351 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect188),
3352 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect188),
3353 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect189),
3354 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect189),
3355 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect190),
3356 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect190),
3357 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect191),
3358 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect191),
3359 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect192),
3360 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect192),
3361 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect193),
3362 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect193),
3363 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect194),
3364 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect194),
3365 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect195),
3366 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect195),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003367 /* [mod = L=2048, N=256, SHA-384] - GP NOT SUPPORTED */
3368 /* [mod = L=2048, N=256, SHA-512] - GP NOT SUPPORTED */
3369 /* [mod = L=3072, N=256, SHA-1] - GP NOT SUPPORTED */
3370 /* [mod = L=3072, N=256, SHA-224] - GP NOT SUPPORTED */
3371 /* [mod = L=3072, N=256, SHA-256] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003372 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect256),
3373 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect256),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003374 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect257),
3375 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect257),
3376 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect258),
3377 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect258),
3378 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect259),
3379 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect259),
3380 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect260),
3381 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect260),
3382 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect261),
3383 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect261),
3384 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect262),
3385 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect262),
3386 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect263),
3387 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect263),
3388 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect264),
3389 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect264),
3390 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect265),
3391 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect265),
3392 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect266),
3393 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect266),
3394 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect267),
3395 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect267),
3396 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect268),
3397 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect268),
3398 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect269),
3399 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect269),
3400 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect270),
3401 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect270),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003402 /* [mod = L=3072, N=256, SHA-384] - GP NOT SUPPORTED */
3403 /* [mod = L=3072, N=256, SHA-512] - GP NOT SUPPORTED */
Pascal Brand3e143ee2015-07-15 17:17:16 +02003404
3405 /* ECDSA tests */
Cedric Chaumontc7654962015-09-09 14:56:36 +02003406 /* [P-192] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003407 XTEST_AC_ECC_CASE(0, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3408 nist_186_2_ecdsa_testvector_1),
3409 XTEST_AC_ECC_CASE(0, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3410 nist_186_2_ecdsa_testvector_1),
3411 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3412 nist_186_2_ecdsa_testvector_2),
3413 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3414 nist_186_2_ecdsa_testvector_2),
3415 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3416 nist_186_2_ecdsa_testvector_3),
3417 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3418 nist_186_2_ecdsa_testvector_3),
3419 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3420 nist_186_2_ecdsa_testvector_4),
3421 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3422 nist_186_2_ecdsa_testvector_4),
3423 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3424 nist_186_2_ecdsa_testvector_5),
3425 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3426 nist_186_2_ecdsa_testvector_5),
3427 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3428 nist_186_2_ecdsa_testvector_6),
3429 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3430 nist_186_2_ecdsa_testvector_6),
3431 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3432 nist_186_2_ecdsa_testvector_7),
3433 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3434 nist_186_2_ecdsa_testvector_7),
3435 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3436 nist_186_2_ecdsa_testvector_8),
3437 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3438 nist_186_2_ecdsa_testvector_8),
3439 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3440 nist_186_2_ecdsa_testvector_9),
3441 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3442 nist_186_2_ecdsa_testvector_9),
3443 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3444 nist_186_2_ecdsa_testvector_10),
3445 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3446 nist_186_2_ecdsa_testvector_10),
3447 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3448 nist_186_2_ecdsa_testvector_11),
3449 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3450 nist_186_2_ecdsa_testvector_11),
3451 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3452 nist_186_2_ecdsa_testvector_12),
3453 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3454 nist_186_2_ecdsa_testvector_12),
3455 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3456 nist_186_2_ecdsa_testvector_13),
3457 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3458 nist_186_2_ecdsa_testvector_13),
3459 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3460 nist_186_2_ecdsa_testvector_14),
3461 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3462 nist_186_2_ecdsa_testvector_14),
3463 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3464 nist_186_2_ecdsa_testvector_15),
3465 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3466 nist_186_2_ecdsa_testvector_15),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003467 /* [P-224] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003468 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3469 nist_186_2_ecdsa_testvector_16),
3470 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3471 nist_186_2_ecdsa_testvector_16),
3472 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3473 nist_186_2_ecdsa_testvector_17),
3474 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3475 nist_186_2_ecdsa_testvector_17),
3476 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3477 nist_186_2_ecdsa_testvector_18),
3478 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3479 nist_186_2_ecdsa_testvector_18),
3480 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3481 nist_186_2_ecdsa_testvector_19),
3482 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3483 nist_186_2_ecdsa_testvector_19),
3484 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3485 nist_186_2_ecdsa_testvector_20),
3486 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3487 nist_186_2_ecdsa_testvector_20),
3488 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3489 nist_186_2_ecdsa_testvector_21),
3490 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3491 nist_186_2_ecdsa_testvector_21),
3492 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3493 nist_186_2_ecdsa_testvector_22),
3494 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3495 nist_186_2_ecdsa_testvector_22),
3496 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3497 nist_186_2_ecdsa_testvector_23),
3498 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3499 nist_186_2_ecdsa_testvector_23),
3500 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3501 nist_186_2_ecdsa_testvector_24),
3502 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3503 nist_186_2_ecdsa_testvector_24),
3504 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3505 nist_186_2_ecdsa_testvector_25),
3506 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3507 nist_186_2_ecdsa_testvector_25),
3508 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3509 nist_186_2_ecdsa_testvector_26),
3510 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3511 nist_186_2_ecdsa_testvector_26),
3512 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3513 nist_186_2_ecdsa_testvector_27),
3514 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3515 nist_186_2_ecdsa_testvector_27),
3516 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3517 nist_186_2_ecdsa_testvector_28),
3518 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3519 nist_186_2_ecdsa_testvector_28),
3520 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3521 nist_186_2_ecdsa_testvector_29),
3522 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3523 nist_186_2_ecdsa_testvector_29),
3524 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3525 nist_186_2_ecdsa_testvector_30),
3526 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3527 nist_186_2_ecdsa_testvector_30),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003528 /* [P-256] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003529 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3530 nist_186_2_ecdsa_testvector_31),
3531 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3532 nist_186_2_ecdsa_testvector_31),
3533 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3534 nist_186_2_ecdsa_testvector_32),
3535 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3536 nist_186_2_ecdsa_testvector_32),
3537 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3538 nist_186_2_ecdsa_testvector_33),
3539 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3540 nist_186_2_ecdsa_testvector_33),
3541 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3542 nist_186_2_ecdsa_testvector_34),
3543 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3544 nist_186_2_ecdsa_testvector_34),
3545 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3546 nist_186_2_ecdsa_testvector_35),
3547 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3548 nist_186_2_ecdsa_testvector_35),
3549 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3550 nist_186_2_ecdsa_testvector_36),
3551 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3552 nist_186_2_ecdsa_testvector_36),
3553 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3554 nist_186_2_ecdsa_testvector_37),
3555 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3556 nist_186_2_ecdsa_testvector_37),
3557 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3558 nist_186_2_ecdsa_testvector_38),
3559 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3560 nist_186_2_ecdsa_testvector_38),
3561 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3562 nist_186_2_ecdsa_testvector_39),
3563 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3564 nist_186_2_ecdsa_testvector_39),
3565 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3566 nist_186_2_ecdsa_testvector_40),
3567 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3568 nist_186_2_ecdsa_testvector_40),
3569 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3570 nist_186_2_ecdsa_testvector_41),
3571 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3572 nist_186_2_ecdsa_testvector_41),
3573 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3574 nist_186_2_ecdsa_testvector_42),
3575 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3576 nist_186_2_ecdsa_testvector_42),
3577 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3578 nist_186_2_ecdsa_testvector_43),
3579 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3580 nist_186_2_ecdsa_testvector_43),
3581 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3582 nist_186_2_ecdsa_testvector_44),
3583 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3584 nist_186_2_ecdsa_testvector_44),
3585 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3586 nist_186_2_ecdsa_testvector_45),
3587 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3588 nist_186_2_ecdsa_testvector_45),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003589 /* [P-384] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003590 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3591 nist_186_2_ecdsa_testvector_46),
3592 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3593 nist_186_2_ecdsa_testvector_46),
3594 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3595 nist_186_2_ecdsa_testvector_47),
3596 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3597 nist_186_2_ecdsa_testvector_47),
3598 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3599 nist_186_2_ecdsa_testvector_48),
3600 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3601 nist_186_2_ecdsa_testvector_48),
3602 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3603 nist_186_2_ecdsa_testvector_49),
3604 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3605 nist_186_2_ecdsa_testvector_49),
3606 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3607 nist_186_2_ecdsa_testvector_50),
3608 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3609 nist_186_2_ecdsa_testvector_50),
3610 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3611 nist_186_2_ecdsa_testvector_51),
3612 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3613 nist_186_2_ecdsa_testvector_51),
3614 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3615 nist_186_2_ecdsa_testvector_52),
3616 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3617 nist_186_2_ecdsa_testvector_52),
3618 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3619 nist_186_2_ecdsa_testvector_53),
3620 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3621 nist_186_2_ecdsa_testvector_53),
3622 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3623 nist_186_2_ecdsa_testvector_54),
3624 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3625 nist_186_2_ecdsa_testvector_54),
3626 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3627 nist_186_2_ecdsa_testvector_55),
3628 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3629 nist_186_2_ecdsa_testvector_55),
3630 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3631 nist_186_2_ecdsa_testvector_56),
3632 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3633 nist_186_2_ecdsa_testvector_56),
3634 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3635 nist_186_2_ecdsa_testvector_57),
3636 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3637 nist_186_2_ecdsa_testvector_57),
3638 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3639 nist_186_2_ecdsa_testvector_58),
3640 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3641 nist_186_2_ecdsa_testvector_58),
3642 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3643 nist_186_2_ecdsa_testvector_59),
3644 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3645 nist_186_2_ecdsa_testvector_59),
3646 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3647 nist_186_2_ecdsa_testvector_60),
3648 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3649 nist_186_2_ecdsa_testvector_60),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003650 /* [P-521] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003651 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3652 nist_186_2_ecdsa_testvector_61),
3653 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3654 nist_186_2_ecdsa_testvector_61),
3655 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3656 nist_186_2_ecdsa_testvector_62),
3657 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3658 nist_186_2_ecdsa_testvector_62),
3659 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3660 nist_186_2_ecdsa_testvector_63),
3661 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3662 nist_186_2_ecdsa_testvector_63),
3663 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3664 nist_186_2_ecdsa_testvector_64),
3665 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3666 nist_186_2_ecdsa_testvector_64),
3667 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3668 nist_186_2_ecdsa_testvector_65),
3669 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3670 nist_186_2_ecdsa_testvector_65),
3671 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3672 nist_186_2_ecdsa_testvector_66),
3673 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3674 nist_186_2_ecdsa_testvector_66),
3675 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3676 nist_186_2_ecdsa_testvector_67),
3677 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3678 nist_186_2_ecdsa_testvector_67),
3679 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3680 nist_186_2_ecdsa_testvector_68),
3681 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3682 nist_186_2_ecdsa_testvector_68),
3683 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3684 nist_186_2_ecdsa_testvector_69),
3685 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3686 nist_186_2_ecdsa_testvector_69),
3687 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3688 nist_186_2_ecdsa_testvector_70),
3689 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3690 nist_186_2_ecdsa_testvector_70),
3691 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3692 nist_186_2_ecdsa_testvector_71),
3693 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3694 nist_186_2_ecdsa_testvector_71),
3695 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3696 nist_186_2_ecdsa_testvector_72),
3697 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3698 nist_186_2_ecdsa_testvector_72),
3699 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3700 nist_186_2_ecdsa_testvector_73),
3701 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3702 nist_186_2_ecdsa_testvector_73),
3703 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3704 nist_186_2_ecdsa_testvector_74),
3705 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3706 nist_186_2_ecdsa_testvector_74),
3707 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3708 nist_186_2_ecdsa_testvector_75),
3709 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3710 nist_186_2_ecdsa_testvector_75),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003711 /* [K-163] - GP NOT SUPPORTED */
3712 /* [K-233] - GP NOT SUPPORTED */
3713 /* [K-283] - GP NOT SUPPORTED */
3714 /* [K-409] - GP NOT SUPPORTED */
3715 /* [K-571] - GP NOT SUPPORTED */
3716 /* [B-163] - GP NOT SUPPORTED */
3717 /* [B-233] - GP NOT SUPPORTED */
3718 /* [B-283] - GP NOT SUPPORTED */
3719 /* [B-409] - GP NOT SUPPORTED */
3720 /* [B-571] - GP NOT SUPPORTED */
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003721
3722 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_PKE, TEE_MODE_ENCRYPT,
3723 gmt_0003_part5_c2_sm2_testvector),
3724 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_PKE, TEE_MODE_DECRYPT,
3725 gmt_0003_part5_c2_sm2_testvector),
3726 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_PKE, TEE_MODE_ENCRYPT,
3727 sm2_testvector2),
Jerome Forissier849b57e2019-12-19 16:37:14 +01003728
3729 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_DSA_SM3, TEE_MODE_VERIFY,
3730 gmt_003_part5_a2),
3731 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_DSA_SM3, TEE_MODE_SIGN,
3732 gmt_003_part5_a2),
Pascal Brandc639ac82015-07-02 08:53:34 +02003733};
3734
Valerii Chubarab9863c2022-08-12 07:42:29 +00003735static const struct xtest_ac_case xtest_ac_eddsa_cases[] = {
3736
3737 XTEST_AC_EDDSA_CASE(0, TEE_ALG_ED25519, TEE_MODE_SIGN,
3738 ed25519_rfc_8032_7_1, 0),
3739 XTEST_AC_EDDSA_CASE(0, TEE_ALG_ED25519, TEE_MODE_VERIFY,
3740 ed25519_rfc_8032_7_1, 0),
3741
3742 XTEST_AC_EDDSA_CTX_CASE(0, TEE_ALG_ED25519, TEE_MODE_SIGN,
3743 ed25519ctx_rfc_8032_7_2, 0),
3744 XTEST_AC_EDDSA_CTX_CASE(0, TEE_ALG_ED25519, TEE_MODE_VERIFY,
3745 ed25519ctx_rfc_8032_7_2, 0),
3746
3747 XTEST_AC_EDDSA_CASE(0, TEE_ALG_ED25519, TEE_MODE_SIGN,
3748 ed25519ph_rfc_8032_7_3, 1),
3749 XTEST_AC_EDDSA_CASE(0, TEE_ALG_ED25519, TEE_MODE_VERIFY,
3750 ed25519ph_rfc_8032_7_3, 1),
3751};
3752
Pascal Brandc639ac82015-07-02 08:53:34 +02003753static bool create_key(ADBG_Case_t *c, TEEC_Session *s,
3754 uint32_t max_key_size, uint32_t key_type,
3755 TEE_Attribute *attrs, size_t num_attrs,
3756 TEE_ObjectHandle *handle)
3757{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003758 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02003759
3760 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3761 ta_crypt_cmd_allocate_transient_object(c, s, key_type,
3762 max_key_size, handle)))
3763 return false;
3764
3765 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3766 ta_crypt_cmd_populate_transient_object(c, s, *handle, attrs,
3767 num_attrs)))
3768 return false;
3769
3770 for (n = 0; n < num_attrs; n++) {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003771 uint8_t out[512] = { };
3772 size_t out_size = sizeof(out);
Pascal Brand3e143ee2015-07-15 17:17:16 +02003773
3774 if (attrs[n].attributeID == TEE_ATTR_ECC_CURVE)
3775 continue;
3776
Pascal Brandc639ac82015-07-02 08:53:34 +02003777 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3778 ta_crypt_cmd_get_object_buffer_attribute(c, s, *handle,
3779 attrs[n].attributeID, out, &out_size)))
3780 return false;
3781
Pascal Brand3e143ee2015-07-15 17:17:16 +02003782 if (out_size < attrs[n].content.ref.length) {
3783 memmove(out + (attrs[n].content.ref.length - out_size),
3784 out,
3785 attrs[n].content.ref.length);
3786 memset(out, 0, attrs[n].content.ref.length - out_size);
3787 out_size = attrs[n].content.ref.length;
3788 }
3789
Pascal Brandc639ac82015-07-02 08:53:34 +02003790 if (!ADBG_EXPECT_BUFFER(c, attrs[n].content.ref.buffer,
3791 attrs[n].content.ref.length, out, out_size))
3792 return false;
3793 }
3794
3795 return true;
3796}
3797
Jerome Forissier26393882022-03-09 21:22:30 +01003798#define XTEST_NO_CURVE 0xFFFFFFFF /* implementation-defined as per GP spec */
3799
Pascal Brandc639ac82015-07-02 08:53:34 +02003800static void xtest_tee_test_4006(ADBG_Case_t *c)
3801{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003802 TEEC_Session session = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02003803 TEE_OperationHandle op = TEE_HANDLE_NULL;
3804 TEE_ObjectHandle priv_key_handle = TEE_HANDLE_NULL;
3805 TEE_ObjectHandle pub_key_handle = TEE_HANDLE_NULL;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003806 TEE_Attribute key_attrs[8] = { };
Jens Wiklander1f06b7d2022-12-02 21:49:57 +01003807 TEE_Attribute algo_params[2] = { };
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003808 size_t num_algo_params = 0;
3809 uint8_t out[512] = { };
3810 size_t out_size = 0;
3811 uint8_t out_enc[512] = { };
3812 size_t out_enc_size = 0;
3813 uint8_t ptx_hash[TEE_MAX_HASH_SIZE] = { };
Etienne Carriere481c6602019-01-22 13:27:26 +01003814 size_t ptx_hash_size = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003815 size_t max_key_size = 0;
3816 size_t num_key_attrs = 0;
3817 uint32_t ret_orig = 0;
3818 size_t n = 0;
3819 uint32_t curve = 0;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003820 uint32_t pub_key_type = 0;
3821 uint32_t priv_key_type = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003822 uint32_t hash_algo = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02003823
3824 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3825 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
3826 &ret_orig)))
3827 return;
3828
3829 for (n = 0; n < ARRAY_SIZE(xtest_ac_cases); n++) {
3830 const struct xtest_ac_case *tv = xtest_ac_cases + n;
3831
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003832 if (tv->level > level)
3833 continue;
3834
Jerome Forissier4b03e282020-01-22 16:33:12 +01003835 if ((tv->algo == TEE_ALG_SM2_PKE ||
3836 tv->algo == TEE_ALG_SM2_DSA_SM3) &&
3837 !ta_crypt_cmd_is_algo_supported(c, &session, tv->algo,
3838 TEE_ECC_CURVE_SM2)) {
3839 Do_ADBG_Log("SM2 not supported: skip subcase");
3840 continue;
3841 }
3842
Pascal Brandc639ac82015-07-02 08:53:34 +02003843 Do_ADBG_BeginSubCase(c, "Asym Crypto case %d algo 0x%x line %d",
3844 (int)n, (unsigned int)tv->algo,
3845 (int)tv->line);
3846
3847 /*
3848 * When signing or verifying we're working with the hash of
3849 * the payload.
3850 */
3851 if (tv->mode == TEE_MODE_VERIFY || tv->mode == TEE_MODE_SIGN) {
Pascal Brand3e143ee2015-07-15 17:17:16 +02003852 if (TEE_ALG_GET_MAIN_ALG(tv->algo) == TEE_MAIN_ALGO_ECDSA)
3853 hash_algo = TEE_ALG_SHA1;
Gabor Szekely2ad190f2018-09-14 14:05:06 +00003854#if defined(CFG_CRYPTO_RSASSA_NA1)
3855 else if (tv->algo == TEE_ALG_RSASSA_PKCS1_V1_5)
3856 hash_algo = TEE_ALG_SHA256;
3857#endif
Pascal Brand3e143ee2015-07-15 17:17:16 +02003858 else
3859 hash_algo = TEE_ALG_HASH_ALGO(
3860 TEE_ALG_GET_DIGEST_HASH(tv->algo));
Pascal Brandc639ac82015-07-02 08:53:34 +02003861
3862 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3863 ta_crypt_cmd_allocate_operation(c, &session,
3864 &op, hash_algo, TEE_MODE_DIGEST, 0)))
3865 goto out;
3866
3867 ptx_hash_size = sizeof(ptx_hash);
3868 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3869 ta_crypt_cmd_digest_do_final(c, & session, op,
3870 tv->ptx, tv->ptx_len, ptx_hash,
3871 &ptx_hash_size)))
3872 goto out;
3873
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003874 /*
3875 * When we use DSA algorithms, the size of the hash we
3876 * consider equals the min between the size of the
3877 * "subprime" in the key and the size of the hash
3878 */
3879 if (TEE_ALG_GET_MAIN_ALG(tv->algo) ==
3880 TEE_MAIN_ALGO_DSA) {
3881 if (tv->params.dsa.sub_prime_len <=
3882 ptx_hash_size)
3883 ptx_hash_size =
3884 tv->params.dsa.sub_prime_len;
3885 }
3886
Pascal Brandc639ac82015-07-02 08:53:34 +02003887 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3888 ta_crypt_cmd_free_operation(c, &session, op)))
3889 goto out;
3890 }
3891
3892 num_algo_params = 0;
3893 num_key_attrs = 0;
3894 switch (TEE_ALG_GET_MAIN_ALG(tv->algo)) {
3895 case TEE_MAIN_ALGO_RSA:
3896 if (tv->params.rsa.salt_len > 0) {
3897 algo_params[0].attributeID =
3898 TEE_ATTR_RSA_PSS_SALT_LENGTH;
3899 algo_params[0].content.value.a =
3900 tv->params.rsa.salt_len;
3901 algo_params[0].content.value.b = 0;
3902 num_algo_params = 1;
3903 }
3904
3905 max_key_size = tv->params.rsa.modulus_len * 8;
3906
3907 xtest_add_attr(&num_key_attrs, key_attrs,
3908 TEE_ATTR_RSA_MODULUS,
3909 tv->params.rsa.modulus,
3910 tv->params.rsa.modulus_len);
3911 xtest_add_attr(&num_key_attrs, key_attrs,
3912 TEE_ATTR_RSA_PUBLIC_EXPONENT,
3913 tv->params.rsa.pub_exp,
3914 tv->params.rsa.pub_exp_len);
3915
3916 if (!ADBG_EXPECT_TRUE(c,
3917 create_key(c, &session,
3918 max_key_size,
3919 TEE_TYPE_RSA_PUBLIC_KEY,
3920 key_attrs,
3921 num_key_attrs,
3922 &pub_key_handle)))
3923 goto out;
3924
3925 xtest_add_attr(&num_key_attrs, key_attrs,
3926 TEE_ATTR_RSA_PRIVATE_EXPONENT,
3927 tv->params.rsa.priv_exp,
3928 tv->params.rsa.priv_exp_len);
3929
3930 if (tv->params.rsa.prime1_len != 0) {
3931 xtest_add_attr(&num_key_attrs, key_attrs,
3932 TEE_ATTR_RSA_PRIME1,
3933 tv->params.rsa.prime1,
3934 tv->params.rsa.prime1_len);
3935 }
3936
3937 if (tv->params.rsa.prime2_len != 0) {
3938 xtest_add_attr(&num_key_attrs, key_attrs,
3939 TEE_ATTR_RSA_PRIME2,
3940 tv->params.rsa.prime2,
3941 tv->params.rsa.prime2_len);
3942 }
3943
3944 if (tv->params.rsa.exp1_len != 0) {
3945 xtest_add_attr(&num_key_attrs, key_attrs,
3946 TEE_ATTR_RSA_EXPONENT1,
3947 tv->params.rsa.exp1,
3948 tv->params.rsa.exp1_len);
3949 }
3950
3951 if (tv->params.rsa.exp2_len != 0) {
3952 xtest_add_attr(&num_key_attrs, key_attrs,
3953 TEE_ATTR_RSA_EXPONENT2,
3954 tv->params.rsa.exp2,
3955 tv->params.rsa.exp2_len);
3956 }
3957
3958 if (tv->params.rsa.coeff_len != 0) {
3959 xtest_add_attr(&num_key_attrs, key_attrs,
3960 TEE_ATTR_RSA_COEFFICIENT,
3961 tv->params.rsa.coeff,
3962 tv->params.rsa.coeff_len);
3963 }
3964
3965 if (!ADBG_EXPECT_TRUE(c,
3966 create_key(c, &session,
3967 max_key_size,
3968 TEE_TYPE_RSA_KEYPAIR,
3969 key_attrs,
3970 num_key_attrs,
3971 &priv_key_handle)))
3972 goto out;
3973 break;
3974
3975 case TEE_MAIN_ALGO_DSA:
3976 max_key_size = tv->params.dsa.prime_len * 8;
3977
3978 xtest_add_attr(&num_key_attrs, key_attrs,
3979 TEE_ATTR_DSA_PRIME,
3980 tv->params.dsa.prime,
3981 tv->params.dsa.prime_len);
3982 xtest_add_attr(&num_key_attrs, key_attrs,
3983 TEE_ATTR_DSA_SUBPRIME,
3984 tv->params.dsa.sub_prime,
3985 tv->params.dsa.sub_prime_len);
3986 xtest_add_attr(&num_key_attrs, key_attrs,
3987 TEE_ATTR_DSA_BASE,
3988 tv->params.dsa.base,
3989 tv->params.dsa.base_len);
3990 xtest_add_attr(&num_key_attrs, key_attrs,
3991 TEE_ATTR_DSA_PUBLIC_VALUE,
3992 tv->params.dsa.pub_val,
3993 tv->params.dsa.pub_val_len);
3994
3995 if (!ADBG_EXPECT_TRUE(c,
3996 create_key(c, &session, max_key_size,
3997 TEE_TYPE_DSA_PUBLIC_KEY, key_attrs,
3998 num_key_attrs, &pub_key_handle)))
3999 goto out;
4000
4001 xtest_add_attr(&num_key_attrs, key_attrs,
4002 TEE_ATTR_DSA_PRIVATE_VALUE,
4003 tv->params.dsa.priv_val,
4004 tv->params.dsa.priv_val_len);
4005
4006 if (!ADBG_EXPECT_TRUE(c,
4007 create_key(c, &session, max_key_size,
4008 TEE_TYPE_DSA_KEYPAIR, key_attrs,
4009 num_key_attrs, &priv_key_handle)))
4010 goto out;
4011 break;
4012
Pascal Brand3e143ee2015-07-15 17:17:16 +02004013 case TEE_MAIN_ALGO_ECDSA:
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004014 case TEE_MAIN_ALGO_SM2_PKE:
Jerome Forissier849b57e2019-12-19 16:37:14 +01004015 case TEE_MAIN_ALGO_SM2_DSA_SM3:
Pascal Brand3e143ee2015-07-15 17:17:16 +02004016 switch (tv->algo) {
4017 case TEE_ALG_ECDSA_P192:
4018 curve = TEE_ECC_CURVE_NIST_P192;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004019 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
4020 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02004021 break;
4022 case TEE_ALG_ECDSA_P224:
4023 curve = TEE_ECC_CURVE_NIST_P224;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004024 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
4025 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02004026 break;
4027 case TEE_ALG_ECDSA_P256:
4028 curve = TEE_ECC_CURVE_NIST_P256;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004029 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
4030 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02004031 break;
4032 case TEE_ALG_ECDSA_P384:
4033 curve = TEE_ECC_CURVE_NIST_P384;
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_P521:
4038 curve = TEE_ECC_CURVE_NIST_P521;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004039 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
4040 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
4041 break;
4042 case TEE_ALG_SM2_PKE:
Jerome Forissier26393882022-03-09 21:22:30 +01004043 curve = XTEST_NO_CURVE;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004044 pub_key_type = TEE_TYPE_SM2_PKE_PUBLIC_KEY;
4045 priv_key_type = TEE_TYPE_SM2_PKE_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02004046 break;
Jerome Forissier849b57e2019-12-19 16:37:14 +01004047 case TEE_ALG_SM2_DSA_SM3:
Jerome Forissier26393882022-03-09 21:22:30 +01004048 curve = XTEST_NO_CURVE;
Jerome Forissier849b57e2019-12-19 16:37:14 +01004049 pub_key_type = TEE_TYPE_SM2_DSA_PUBLIC_KEY;
4050 priv_key_type = TEE_TYPE_SM2_DSA_KEYPAIR;
4051 break;
Pascal Brand3e143ee2015-07-15 17:17:16 +02004052 default:
4053 curve = 0xFF;
4054 break;
4055 }
4056
4057 if (tv->algo == TEE_ALG_ECDSA_P521)
4058 max_key_size = 521;
4059 else
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01004060 max_key_size = tv->params.ecc.private_len * 8;
Pascal Brand3e143ee2015-07-15 17:17:16 +02004061
Jerome Forissier26393882022-03-09 21:22:30 +01004062 if (curve != XTEST_NO_CURVE)
4063 xtest_add_attr_value(&num_key_attrs, key_attrs,
Pascal Brand3e143ee2015-07-15 17:17:16 +02004064 TEE_ATTR_ECC_CURVE, curve, 0);
4065 xtest_add_attr(&num_key_attrs, key_attrs,
4066 TEE_ATTR_ECC_PUBLIC_VALUE_X,
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01004067 tv->params.ecc.public_x,
4068 tv->params.ecc.public_x_len);
Pascal Brand3e143ee2015-07-15 17:17:16 +02004069 xtest_add_attr(&num_key_attrs, key_attrs,
4070 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01004071 tv->params.ecc.public_y,
4072 tv->params.ecc.public_y_len);
Pascal Brand3e143ee2015-07-15 17:17:16 +02004073
4074 if (!ADBG_EXPECT_TRUE(c,
4075 create_key(c, &session, max_key_size,
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004076 pub_key_type, key_attrs,
Pascal Brand3e143ee2015-07-15 17:17:16 +02004077 num_key_attrs, &pub_key_handle)))
4078 goto out;
4079
4080 xtest_add_attr(&num_key_attrs, key_attrs,
4081 TEE_ATTR_ECC_PRIVATE_VALUE,
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01004082 tv->params.ecc.private,
4083 tv->params.ecc.private_len);
Pascal Brand3e143ee2015-07-15 17:17:16 +02004084
4085 if (!ADBG_EXPECT_TRUE(c,
4086 create_key(c, &session, max_key_size,
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004087 priv_key_type, key_attrs,
Pascal Brand3e143ee2015-07-15 17:17:16 +02004088 num_key_attrs, &priv_key_handle)))
4089 goto out;
4090 break;
4091
Pascal Brandc639ac82015-07-02 08:53:34 +02004092 default:
4093 ADBG_EXPECT_TRUE(c, false);
4094 goto out;
4095 }
4096
4097 out_size = sizeof(out);
4098 memset(out, 0, sizeof(out));
4099 switch (tv->mode) {
4100 case TEE_MODE_ENCRYPT:
4101 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4102 ta_crypt_cmd_allocate_operation(c, &session,
Pascal Brand3e143ee2015-07-15 17:17:16 +02004103 &op, tv->algo, TEE_MODE_ENCRYPT,
4104 max_key_size)))
Pascal Brandc639ac82015-07-02 08:53:34 +02004105 goto out;
4106
4107 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4108 ta_crypt_cmd_set_operation_key(c, &session, op,
4109 pub_key_handle)))
4110 goto out;
4111
4112 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4113 ta_crypt_cmd_free_transient_object(c, &session,
4114 pub_key_handle)))
4115 goto out;
4116 pub_key_handle = TEE_HANDLE_NULL;
4117
Jens Wiklander1f06b7d2022-12-02 21:49:57 +01004118 num_algo_params = 0;
4119 if (tv->algo == TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1) {
4120 algo_params[0].attributeID =
4121 TEE_ATTR_RSA_OAEP_MGF_HASH;
4122 algo_params[0].content.ref.length =
4123 sizeof(uint32_t);
4124 algo_params[0].content.ref.buffer =
4125 &(uint32_t){TEE_ALG_SHA1};
4126 num_algo_params = 1;
4127 }
4128
4129
Pascal Brandc639ac82015-07-02 08:53:34 +02004130 out_enc_size = sizeof(out_enc);
4131 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4132 ta_crypt_cmd_asymmetric_encrypt(c, &session, op,
Jens Wiklander1f06b7d2022-12-02 21:49:57 +01004133 algo_params, num_algo_params, tv->ptx,
4134 tv->ptx_len, out_enc, &out_enc_size)))
Pascal Brandc639ac82015-07-02 08:53:34 +02004135 goto out;
4136
4137 /*
4138 * A PS which is random is added when formatting the
4139 * message internally of the algorithm so we can't
4140 * verify against precomputed values, instead we use the
4141 * decrypt operation to see that output is correct.
4142 */
4143
4144 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4145 ta_crypt_cmd_free_operation(c, &session, op)))
4146 goto out;
4147
4148 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4149 ta_crypt_cmd_allocate_operation(c, &session,
4150 &op, tv->algo, TEE_MODE_DECRYPT,
4151 max_key_size)))
4152 goto out;
4153
4154 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4155 ta_crypt_cmd_set_operation_key(c, &session, op,
4156 priv_key_handle)))
4157 goto out;
4158
4159 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4160 ta_crypt_cmd_free_transient_object(c, &session,
4161 priv_key_handle)))
4162 goto out;
4163
4164 priv_key_handle = TEE_HANDLE_NULL;
4165
4166 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4167 ta_crypt_cmd_asymmetric_decrypt(c, &session, op,
4168 NULL, 0, out_enc, out_enc_size, out,
4169 &out_size)))
4170 goto out;
4171
4172 (void)ADBG_EXPECT_BUFFER(c, tv->ptx, tv->ptx_len, out,
4173 out_size);
4174 break;
4175
4176 case TEE_MODE_DECRYPT:
4177 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4178 ta_crypt_cmd_allocate_operation(c, &session,
4179 &op, tv->algo, TEE_MODE_DECRYPT,
4180 max_key_size)))
4181 goto out;
4182
4183 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4184 ta_crypt_cmd_set_operation_key(c, &session, op,
4185 priv_key_handle)))
4186 goto out;
4187
4188 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4189 ta_crypt_cmd_free_transient_object(c, &session,
4190 priv_key_handle)))
4191 goto out;
4192
4193 priv_key_handle = TEE_HANDLE_NULL;
4194
4195 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4196 ta_crypt_cmd_asymmetric_decrypt(c, &session, op,
4197 NULL, 0, tv->ctx, tv->ctx_len, out,
4198 &out_size)))
4199 goto out;
4200
4201 (void)ADBG_EXPECT_BUFFER(c, tv->ptx, tv->ptx_len, out,
4202 out_size);
4203 break;
4204
4205 case TEE_MODE_VERIFY:
4206 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4207 ta_crypt_cmd_allocate_operation(c, &session,
4208 &op, tv->algo, TEE_MODE_VERIFY,
4209 max_key_size)))
4210 goto out;
4211
4212 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4213 ta_crypt_cmd_set_operation_key(c, &session, op,
4214 pub_key_handle)))
4215 goto out;
4216
4217 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4218 ta_crypt_cmd_free_transient_object(c, &session,
4219 pub_key_handle)))
4220 goto out;
4221
4222 pub_key_handle = TEE_HANDLE_NULL;
4223
4224 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4225 ta_crypt_cmd_asymmetric_verify(c, &session, op,
4226 algo_params, num_algo_params, ptx_hash,
4227 ptx_hash_size, tv->ctx, tv->ctx_len)))
4228 goto out;
4229 break;
4230
4231 case TEE_MODE_SIGN:
4232 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4233 ta_crypt_cmd_allocate_operation(c, &session,
4234 &op, tv->algo, TEE_MODE_SIGN,
4235 max_key_size)))
4236 goto out;
4237
4238 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4239 ta_crypt_cmd_set_operation_key(c, &session, op,
4240 priv_key_handle)))
4241 goto out;
4242
4243 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4244 ta_crypt_cmd_free_transient_object(c, &session,
4245 priv_key_handle)))
4246 goto out;
4247
4248 priv_key_handle = TEE_HANDLE_NULL;
4249
4250 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4251 ta_crypt_cmd_asymmetric_sign(c, &session, op,
4252 algo_params, num_algo_params, ptx_hash,
4253 ptx_hash_size, out, &out_size)))
4254 goto out;
4255
4256 if (TEE_ALG_GET_CHAIN_MODE(tv->algo) ==
4257 TEE_CHAIN_MODE_PKCS1_PSS_MGF1 ||
Pascal Brand3e143ee2015-07-15 17:17:16 +02004258 tv->algo == TEE_ALG_DSA_SHA1 ||
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02004259 tv->algo == TEE_ALG_DSA_SHA224 ||
4260 tv->algo == TEE_ALG_DSA_SHA256 ||
Pascal Brand3e143ee2015-07-15 17:17:16 +02004261 TEE_ALG_GET_MAIN_ALG(tv->algo) ==
Jerome Forissier849b57e2019-12-19 16:37:14 +01004262 TEE_MAIN_ALGO_ECDSA ||
4263 tv->algo == TEE_ALG_SM2_DSA_SM3) {
Pascal Brandc639ac82015-07-02 08:53:34 +02004264 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4265 ta_crypt_cmd_free_operation(c, &session,
4266 op)))
4267 goto out;
4268 /*
4269 * The salt or K is random so we can't verify
4270 * signing against precomputed values, instead
4271 * we use the verify operation to see that
4272 * output is correct.
4273 */
4274 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4275 ta_crypt_cmd_allocate_operation(c,
4276 &session, &op, tv->algo,
4277 TEE_MODE_VERIFY, max_key_size)))
4278 goto out;
4279
4280 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4281 ta_crypt_cmd_set_operation_key(c,
4282 &session, op, pub_key_handle)))
4283 goto out;
4284
4285 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4286 ta_crypt_cmd_free_transient_object(c,
4287 &session, pub_key_handle)))
4288 goto out;
4289
4290 pub_key_handle = TEE_HANDLE_NULL;
4291
4292 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4293 ta_crypt_cmd_asymmetric_verify(c,
4294 &session, op, algo_params,
4295 num_algo_params, ptx_hash,
4296 ptx_hash_size, out, out_size)))
4297 goto out;
4298 } else {
4299 (void)ADBG_EXPECT_BUFFER(c, tv->ctx,
4300 tv->ctx_len, out,
4301 out_size);
4302 }
4303 break;
4304
4305 default:
4306 break;
4307 }
4308
4309 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4310 ta_crypt_cmd_free_operation(c, &session, op)))
4311 goto out;
4312
4313 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4314 ta_crypt_cmd_free_transient_object(c, &session,
4315 pub_key_handle)))
4316 goto out;
4317 pub_key_handle = TEE_HANDLE_NULL;
4318
4319 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4320 ta_crypt_cmd_free_transient_object(c, &session,
4321 priv_key_handle)))
4322 goto out;
4323
4324 priv_key_handle = TEE_HANDLE_NULL;
4325
4326 Do_ADBG_EndSubCase(c, NULL);
4327 }
4328out:
4329 TEEC_CloseSession(&session);
4330}
Jens Wiklander14f48872018-06-29 15:30:13 +02004331ADBG_CASE_DEFINE(regression, 4006, xtest_tee_test_4006,
4332 "Test TEE Internal API Asymmetric Cipher operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02004333
4334#define KEY_ATTR(x, y) { #x, (x), y }
4335
4336struct key_attrs {
4337 const char *name;
4338 uint32_t attr;
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004339 /*
4340 * When keysize_check != 0: size of attribute is checked
4341 * Expected value is key_size bits except for DH in which case it is
4342 * the value of keysize_check.
4343 */
4344 uint32_t keysize_check;
Pascal Brandc639ac82015-07-02 08:53:34 +02004345};
4346
4347static bool test_keygen_attributes(ADBG_Case_t *c, TEEC_Session *s,
4348 TEE_ObjectHandle key, uint32_t key_size,
4349 struct key_attrs *attrs, size_t num_attrs)
4350{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004351 uint8_t out[2048] = { };
4352 size_t out_size = 0;
4353 size_t n = 0;
4354 size_t m = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004355
4356 for (m = 0; m < num_attrs; m++) {
4357 if ((attrs[m].attr & TEE_ATTR_BIT_VALUE) == 0) {
4358 out_size = sizeof(out);
4359 memset(out, 0, sizeof(out));
4360 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4361 ta_crypt_cmd_get_object_buffer_attribute(c, s,
4362 key, attrs[m].attr, out, &out_size)))
4363 return false;
4364
4365 if (attrs[m].keysize_check)
Jerome Forissierfe94e562020-11-17 17:22:40 +01004366 ADBG_EXPECT_COMPARE_UNSIGNED(c, out_size, <=,
Pascal Brandc639ac82015-07-02 08:53:34 +02004367 key_size / 8);
4368
4369 if (out_size > 0) {
4370 /* Check that buffer isn't all zeroes */
4371 for (n = 0; n < out_size; n++)
4372 if (out[n] != 0)
4373 break;
4374 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, n, <,
4375 out_size))
4376 return false;
4377 }
4378 } else {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004379 uint32_t a = 0;
4380 uint32_t b = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004381
4382 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4383 ta_crypt_cmd_get_object_value_attribute(c, s, key,
4384 attrs[m].attr, &a, &b)))
4385 return false;
4386 }
4387 }
4388 return true;
4389}
4390
4391static bool test_secret_value(ADBG_Case_t *c, TEEC_Session *s,
4392 TEE_ObjectHandle key, uint32_t key_size)
4393{
4394 const struct key_attrs attrs[] = {
4395 KEY_ATTR(TEE_ATTR_SECRET_VALUE, true),
4396 };
4397
4398 return test_keygen_attributes(c, s, key, key_size,
4399 (struct key_attrs *)&attrs,
4400 ARRAY_SIZE(attrs));
4401}
4402
4403
4404static bool test_rsa_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4405 TEE_ObjectHandle key, uint32_t key_size)
4406{
4407 const struct key_attrs attrs[] = {
4408 KEY_ATTR(TEE_ATTR_RSA_MODULUS, true),
4409 KEY_ATTR(TEE_ATTR_RSA_PUBLIC_EXPONENT, false),
4410 KEY_ATTR(TEE_ATTR_RSA_PRIVATE_EXPONENT, false),
4411 KEY_ATTR(TEE_ATTR_RSA_PRIME1, false),
4412 KEY_ATTR(TEE_ATTR_RSA_PRIME2, false),
4413 KEY_ATTR(TEE_ATTR_RSA_EXPONENT1, false),
4414 KEY_ATTR(TEE_ATTR_RSA_EXPONENT2, false),
4415 KEY_ATTR(TEE_ATTR_RSA_COEFFICIENT, false),
4416 };
4417
4418 return test_keygen_attributes(c, s, key, key_size,
4419 (struct key_attrs *)&attrs,
4420 ARRAY_SIZE(attrs));
4421}
4422
Pascal Brande61133f2015-07-08 15:38:37 +02004423static bool test_ecc_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4424 TEE_ObjectHandle key, uint32_t key_size)
4425{
4426 const struct key_attrs attrs[] = {
4427 KEY_ATTR(TEE_ATTR_ECC_PRIVATE_VALUE, false),
4428 KEY_ATTR(TEE_ATTR_ECC_PUBLIC_VALUE_X , false),
4429 KEY_ATTR(TEE_ATTR_ECC_PUBLIC_VALUE_Y , false),
4430 /* KEY_ATTR(TEE_ATTR_ECC_CURVE, false), - do not test */
4431 };
4432
4433 return test_keygen_attributes(c, s, key, key_size,
4434 (struct key_attrs *)&attrs,
4435 ARRAY_SIZE(attrs));
4436}
4437
Pascal Brandc639ac82015-07-02 08:53:34 +02004438static bool test_dh_key_pair(ADBG_Case_t *c, TEEC_Session *s,
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004439 TEE_ObjectHandle key, uint32_t check_keysize)
Pascal Brandc639ac82015-07-02 08:53:34 +02004440{
4441 const struct key_attrs attrs[] = {
4442 KEY_ATTR(TEE_ATTR_DH_PRIME, false),
4443 KEY_ATTR(TEE_ATTR_DH_BASE, false),
4444 KEY_ATTR(TEE_ATTR_DH_PUBLIC_VALUE, false),
4445 KEY_ATTR(TEE_ATTR_DH_PRIVATE_VALUE, check_keysize),
4446 KEY_ATTR(TEE_ATTR_DH_X_BITS, false),
4447 };
4448
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004449 return test_keygen_attributes(c, s, key, check_keysize,
Pascal Brandc639ac82015-07-02 08:53:34 +02004450 (struct key_attrs *)&attrs,
4451 ARRAY_SIZE(attrs));
4452}
4453
4454static bool test_dsa_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4455 TEE_ObjectHandle key, uint32_t key_size)
4456{
4457 const struct key_attrs attrs[] = {
4458 KEY_ATTR(TEE_ATTR_DSA_PRIME, true),
4459 KEY_ATTR(TEE_ATTR_DSA_SUBPRIME, false),
4460 KEY_ATTR(TEE_ATTR_DSA_BASE, false),
4461 KEY_ATTR(TEE_ATTR_DSA_PUBLIC_VALUE, false),
4462 KEY_ATTR(TEE_ATTR_DSA_PRIVATE_VALUE, false),
4463 };
4464
4465 return test_keygen_attributes(c, s, key, key_size,
4466 (struct key_attrs *)&attrs,
4467 ARRAY_SIZE(attrs));
4468}
4469
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03004470static bool test_x25519_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4471 TEE_ObjectHandle key, uint32_t key_size)
4472{
4473 const struct key_attrs attrs[] = {
4474 KEY_ATTR(TEE_ATTR_X25519_PRIVATE_VALUE, false),
4475 KEY_ATTR(TEE_ATTR_X25519_PUBLIC_VALUE, false),
4476 };
4477
4478 return test_keygen_attributes(c, s, key, key_size,
4479 (struct key_attrs *)&attrs,
4480 ARRAY_SIZE(attrs));
4481}
4482
Valerii Chubarab9863c2022-08-12 07:42:29 +00004483static bool test_ed25519_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4484 TEE_ObjectHandle key, uint32_t key_size)
4485{
4486 const struct key_attrs attrs[] = {
4487 KEY_ATTR(TEE_ATTR_ED25519_PRIVATE_VALUE, false),
4488 KEY_ATTR(TEE_ATTR_ED25519_PUBLIC_VALUE, false),
4489 };
4490
4491 return test_keygen_attributes(c, s, key, key_size,
4492 (struct key_attrs *)&attrs,
4493 ARRAY_SIZE(attrs));
4494}
4495
Pascal Brandc639ac82015-07-02 08:53:34 +02004496static bool generate_and_test_key(ADBG_Case_t *c, TEEC_Session *s,
4497 uint32_t key_type, uint32_t check_keysize,
4498 uint32_t key_size,
4499 TEE_Attribute *params, size_t param_count)
4500{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004501 TEE_ObjectHandle key = TEE_HANDLE_NULL;
Pascal Brandc639ac82015-07-02 08:53:34 +02004502 bool ret_val = true;
4503
4504 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4505 ta_crypt_cmd_allocate_transient_object(c, s, key_type, key_size,
4506 &key)))
4507 return false;
4508
4509 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4510 ta_crypt_cmd_generate_key(c, s, key, key_size, params,
4511 param_count)))
4512 return false;
4513
4514 switch (key_type) {
4515 case TEE_TYPE_DES:
4516 case TEE_TYPE_DES3:
4517 ret_val = ADBG_EXPECT_TRUE(c,
4518 test_secret_value(c, s, key,
4519 key_size + key_size / 7));
4520 break;
4521 case TEE_TYPE_AES:
4522 case TEE_TYPE_HMAC_MD5:
4523 case TEE_TYPE_HMAC_SHA1:
4524 case TEE_TYPE_HMAC_SHA224:
4525 case TEE_TYPE_HMAC_SHA256:
4526 case TEE_TYPE_HMAC_SHA384:
4527 case TEE_TYPE_HMAC_SHA512:
4528 case TEE_TYPE_GENERIC_SECRET:
4529 ret_val = ADBG_EXPECT_TRUE(c,
4530 test_secret_value(c, s, key, key_size));
4531 break;
4532
4533 case TEE_TYPE_RSA_KEYPAIR:
4534 ret_val = ADBG_EXPECT_TRUE(c,
4535 test_rsa_key_pair(c, s, key, key_size));
4536 break;
4537
Pascal Brande61133f2015-07-08 15:38:37 +02004538 case TEE_TYPE_ECDSA_KEYPAIR:
4539 case TEE_TYPE_ECDH_KEYPAIR:
4540 ret_val = ADBG_EXPECT_TRUE(c,
4541 test_ecc_key_pair(c, s, key, key_size));
4542 break;
4543
Pascal Brandc639ac82015-07-02 08:53:34 +02004544 case TEE_TYPE_DH_KEYPAIR:
Pascal Brande61133f2015-07-08 15:38:37 +02004545 ret_val = ADBG_EXPECT_TRUE(c,
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004546 test_dh_key_pair(c, s, key, check_keysize));
Pascal Brandc639ac82015-07-02 08:53:34 +02004547 break;
4548
4549 case TEE_TYPE_DSA_KEYPAIR:
4550 ret_val = ADBG_EXPECT_TRUE(c,
4551 test_dsa_key_pair(c, s, key, key_size));
4552 break;
4553
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03004554 case TEE_TYPE_X25519_KEYPAIR:
4555 ret_val = ADBG_EXPECT_TRUE(c,
4556 test_x25519_key_pair(c, s, key, key_size));
4557 break;
4558
Valerii Chubarab9863c2022-08-12 07:42:29 +00004559 case TEE_TYPE_ED25519_KEYPAIR:
4560 ret_val = ADBG_EXPECT_TRUE(c,
4561 test_ed25519_key_pair(c, s, key, key_size));
4562 break;
4563
Pascal Brandc639ac82015-07-02 08:53:34 +02004564 default:
4565 ret_val = false;
4566 break;
4567 }
4568
4569 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4570 ta_crypt_cmd_free_transient_object(c, s, key)))
4571 return false;
4572
4573 return ret_val;
4574}
4575
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004576struct key_types_noparam {
4577 unsigned level;
4578 const char *name;
4579 uint32_t key_type;
4580 uint32_t quanta;
4581 uint32_t min_size;
4582 uint32_t max_size;
4583};
4584
4585static void keygen_noparams(ADBG_Case_t *c, TEEC_Session *session,
4586 const struct key_types_noparam *key_types,
4587 size_t num_key_types)
Pascal Brandc639ac82015-07-02 08:53:34 +02004588{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004589 size_t n = 0;
4590 uint32_t key_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004591
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004592 for (n = 0; n < num_key_types; n++) {
Pascal Brandc639ac82015-07-02 08:53:34 +02004593 uint32_t min_size = key_types[n].min_size;
4594 uint32_t max_size = key_types[n].max_size;
4595 uint32_t quanta = key_types[n].quanta;
4596
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004597 if (key_types[n].level > level)
4598 continue;
4599
Pascal Brandc639ac82015-07-02 08:53:34 +02004600 Do_ADBG_BeginSubCase(c, "Generate %s key", key_types[n].name);
4601
4602 for (key_size = min_size; key_size <= max_size;
4603 key_size += quanta) {
4604 if (!ADBG_EXPECT_TRUE(c,
4605 generate_and_test_key(c, session, key_types
4606 [n].key_type, 1, key_size, NULL, 0)))
4607 break;
4608 }
4609
4610 Do_ADBG_EndSubCase(c, "Generate %s key", key_types[n].name);
4611 }
4612}
4613
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004614static void xtest_tee_test_4007_symmetric(ADBG_Case_t *c)
Pascal Brandc639ac82015-07-02 08:53:34 +02004615{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004616 TEEC_Session session = { };
4617 uint32_t ret_orig = 0;
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004618 static const struct key_types_noparam key_types[] = {
4619 { 0, "AES", TEE_TYPE_AES, 64, 128,
4620 256 /* valid sizes 128, 192, 256 */ },
4621 { 0, "DES", TEE_TYPE_DES, 56, 56, 56 /* valid size 56 */ },
4622 { 0, "DES3", TEE_TYPE_DES3, 56, 112,
4623 168 /* valid sizes 112, 168 */ },
4624 { 0, "HMAC-MD5", TEE_TYPE_HMAC_MD5, 8, 64, 512 },
4625 { 0, "HMAC-SHA1", TEE_TYPE_HMAC_SHA1, 8, 80, 512 },
4626 { 0, "HMAC-SHA224", TEE_TYPE_HMAC_SHA224, 8, 112, 512 },
4627 { 0, "HMAC-SHA256", TEE_TYPE_HMAC_SHA256, 8, 192, 1024 },
4628 { 0, "HMAC-SHA384", TEE_TYPE_HMAC_SHA384, 8, 256, 1024 },
4629 { 0, "HMAC-SHA512", TEE_TYPE_HMAC_SHA512, 8, 256, 1024 },
4630 { 0, "Generic secret", TEE_TYPE_GENERIC_SECRET, 8, 128, 4096 },
4631 };
4632
4633 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4634 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4635 &ret_orig)))
4636 return;
4637
4638 keygen_noparams(c, &session, key_types, ARRAY_SIZE(key_types));
4639
4640 TEEC_CloseSession(&session);
4641}
4642ADBG_CASE_DEFINE(regression, 4007_symmetric, xtest_tee_test_4007_symmetric,
4643 "Test TEE Internal API Generate Symmetric key");
4644
4645static void xtest_tee_test_4007_rsa(ADBG_Case_t *c)
4646{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004647 TEEC_Session session = { };
4648 uint32_t ret_orig = 0;
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004649 static const struct key_types_noparam key_types[] = {
Jorge Ramirez-Ortizb657ea42022-02-17 10:15:25 +01004650#ifndef CFG_CRYPTO_SE05X
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004651 { 0, "RSA-256", TEE_TYPE_RSA_KEYPAIR, 1, 256, 256 },
4652 { 1, "RSA-384", TEE_TYPE_RSA_KEYPAIR, 1, 384, 384 },
Jorge Ramirez-Ortizb657ea42022-02-17 10:15:25 +01004653#endif
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004654 { 1, "RSA-512", TEE_TYPE_RSA_KEYPAIR, 1, 512, 512 },
Jorge Ramirez-Ortizb657ea42022-02-17 10:15:25 +01004655#ifndef CFG_CRYPTO_SE05X
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004656 { 1, "RSA-640", TEE_TYPE_RSA_KEYPAIR, 1, 640, 640 },
4657 { 1, "RSA-768", TEE_TYPE_RSA_KEYPAIR, 1, 768, 768 },
4658 { 1, "RSA-896", TEE_TYPE_RSA_KEYPAIR, 1, 896, 896 },
Jorge Ramirez-Ortizb657ea42022-02-17 10:15:25 +01004659#endif
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004660 { 1, "RSA-1024", TEE_TYPE_RSA_KEYPAIR, 1, 1024, 1024 },
4661 { 1, "RSA-2048", TEE_TYPE_RSA_KEYPAIR, 1, 2048, 2048 },
4662 { 1, "RSA-3072", TEE_TYPE_RSA_KEYPAIR, 1, 3072, 3072 },
4663 { 1, "RSA-4096", TEE_TYPE_RSA_KEYPAIR, 1, 4096, 4096 },
4664 };
4665
4666 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4667 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4668 &ret_orig)))
4669 return;
4670
4671 keygen_noparams(c, &session, key_types, ARRAY_SIZE(key_types));
4672
4673 TEEC_CloseSession(&session);
4674}
4675ADBG_CASE_DEFINE(regression, 4007_rsa, xtest_tee_test_4007_rsa,
4676 "Test TEE Internal API Generate RSA key");
4677
4678static void xtest_tee_test_4007_dh(ADBG_Case_t *c)
4679{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004680 TEEC_Session session = { };
4681 uint32_t ret_orig = 0;
4682 size_t n = 0;
4683 size_t param_count = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004684 /*
4685 * Note that the key size parameter is not used when creating the keys
4686 * but specifying these sizes make it possible to test the expected size
4687 * of the private value. This also means that the keysize must match the
4688 * size of p or what is specified in private_bits or the equvivalent
4689 * size of the subprime parameter.
4690 */
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004691 TEE_Attribute params[4] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02004692
4693#define XTEST_DH_GK_DATA(vect) \
4694 ARRAY(vect ## _p), \
4695 ARRAY(vect ## _g), \
4696 &vect ## _private_bits, \
4697 0, 0
4698#define XTEST_DH_GK_DATA_SUBPRIME(vect) \
4699 ARRAY(vect ## _p), \
4700 ARRAY(vect ## _g), \
4701 &vect ## _private_bits, \
4702 ARRAY(vect ## _subprime)
4703 static const struct {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004704 unsigned level;
Pascal Brandc639ac82015-07-02 08:53:34 +02004705 uint32_t key_size;
4706 const uint8_t *p;
4707 size_t p_len;
4708 const uint8_t *g;
4709 size_t g_len;
4710 const uint32_t *private_bits;
4711 const uint8_t *subprime;
4712 size_t subprime_len;
4713 } key_types[] = {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004714 { 0, 256, XTEST_DH_GK_DATA(keygen_dh256) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004715 { 0, 320, XTEST_DH_GK_DATA(keygen_dh320) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004716 { 1, 384, XTEST_DH_GK_DATA(keygen_dh384) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004717 { 1, 448, XTEST_DH_GK_DATA(keygen_dh448) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004718 { 1, 512, XTEST_DH_GK_DATA(keygen_dh512) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004719 { 1, 576, XTEST_DH_GK_DATA(keygen_dh576) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004720 { 1, 640, XTEST_DH_GK_DATA(keygen_dh640) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004721 { 1, 704, XTEST_DH_GK_DATA(keygen_dh704) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004722 { 1, 768, XTEST_DH_GK_DATA(keygen_dh768) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004723 { 1, 832, XTEST_DH_GK_DATA(keygen_dh832) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004724 { 1, 896, XTEST_DH_GK_DATA(keygen_dh896) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004725 { 1, 960, XTEST_DH_GK_DATA(keygen_dh960) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004726 { 1, 1024, XTEST_DH_GK_DATA(keygen_dh1024) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004727 { 1, 1088, XTEST_DH_GK_DATA(keygen_dh1088) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004728 { 1, 1152, XTEST_DH_GK_DATA(keygen_dh1152) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004729 { 1, 1216, XTEST_DH_GK_DATA(keygen_dh1216) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004730 { 1, 1280, XTEST_DH_GK_DATA(keygen_dh1280) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004731 { 1, 1344, XTEST_DH_GK_DATA(keygen_dh1344) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004732 { 1, 1408, XTEST_DH_GK_DATA(keygen_dh1408) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004733 { 1, 1472, XTEST_DH_GK_DATA(keygen_dh1472) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004734 { 1, 1536, XTEST_DH_GK_DATA(keygen_dh1536) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004735 { 1, 1600, XTEST_DH_GK_DATA(keygen_dh1600) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004736 { 1, 1664, XTEST_DH_GK_DATA(keygen_dh1664) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004737 { 1, 1728, XTEST_DH_GK_DATA(keygen_dh1728) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004738 { 1, 1792, XTEST_DH_GK_DATA(keygen_dh1792) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004739 { 1, 1856, XTEST_DH_GK_DATA(keygen_dh1856) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004740 { 1, 1920, XTEST_DH_GK_DATA(keygen_dh1920) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004741 { 1, 1984, XTEST_DH_GK_DATA(keygen_dh1984) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004742 { 1, 2048, XTEST_DH_GK_DATA(keygen_dh2048) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004743 { 1, 2048, XTEST_DH_GK_DATA_SUBPRIME(keygen_dh2048_subprime) }
Pascal Brandc639ac82015-07-02 08:53:34 +02004744 };
4745
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004746 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4747 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4748 &ret_orig)))
4749 return;
Pascal Brandc639ac82015-07-02 08:53:34 +02004750
4751 for (n = 0; n < ARRAY_SIZE(key_types); n++) {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004752 if (key_types[n].level > level)
4753 continue;
4754
Pascal Brandc639ac82015-07-02 08:53:34 +02004755 Do_ADBG_BeginSubCase(c,
4756 "Generate DH key %d bits - Private bits = %d",
4757 key_types[n].key_size,
4758 *key_types[n].private_bits);
4759 param_count = 0;
4760
4761 xtest_add_attr(&param_count, params,
4762 TEE_ATTR_DH_PRIME,
4763 key_types[n].p, key_types[n].p_len);
4764
4765 xtest_add_attr(&param_count, params, TEE_ATTR_DH_BASE,
4766 key_types[n].g, key_types[n].g_len);
4767
4768 if (key_types[n].private_bits != 0) {
4769 params[param_count].attributeID = TEE_ATTR_DH_X_BITS;
4770
4771 params[param_count].content.value.a =
4772 *key_types[n].private_bits;
4773
4774 params[param_count].content.value.b = 0;
4775 param_count++;
4776 }
4777
4778 if (key_types[n].subprime != 0) {
4779 xtest_add_attr(&param_count, params,
4780 TEE_ATTR_DH_SUBPRIME,
4781 key_types[n].subprime,
4782 key_types[n].subprime_len);
4783 }
4784
4785 if (!ADBG_EXPECT_TRUE(c,
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004786 generate_and_test_key(c, &session, TEE_TYPE_DH_KEYPAIR,
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004787 *key_types[n].private_bits,
Pascal Brandc639ac82015-07-02 08:53:34 +02004788 key_types[n]. key_size, params, param_count)))
4789 break;
4790
4791 Do_ADBG_EndSubCase(c,
4792 "Generate DH key %d bits - Private bits = %d",
4793 key_types[n].key_size,
4794 *key_types[n].private_bits);
4795 }
Pascal Brandc639ac82015-07-02 08:53:34 +02004796
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004797 TEEC_CloseSession(&session);
4798}
4799ADBG_CASE_DEFINE(regression, 4007_dh, xtest_tee_test_4007_dh,
4800 "Test TEE Internal API Generate DH key");
4801
4802static void xtest_tee_test_4007_dsa(ADBG_Case_t *c)
Pascal Brandc639ac82015-07-02 08:53:34 +02004803{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004804 TEEC_Session session = { };
4805 uint32_t ret_orig = 0;
4806 size_t n = 0;
4807 size_t param_count = 0;
4808 TEE_Attribute params[4] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02004809
4810#define XTEST_DSA_GK_DATA(vect) \
4811 ARRAY(vect ## _p), \
4812 ARRAY(vect ## _g), \
4813 ARRAY(vect ## _q)
4814 static const struct {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004815 unsigned level;
Pascal Brandc639ac82015-07-02 08:53:34 +02004816 uint32_t key_size;
4817 const uint8_t *prime;
4818 size_t prime_len;
4819 const uint8_t *base;
4820 size_t base_len;
4821 const uint8_t *sub_prime;
4822 size_t sub_prime_len;
4823 } key_types[] = {
Jerome Forissiereed7e652020-04-15 15:42:38 +02004824 { 0, 1024, XTEST_DSA_GK_DATA(keygen_dsa_test1) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004825 { 0, 512, XTEST_DSA_GK_DATA(keygen_dsa512) },
Jerome Forissiereed7e652020-04-15 15:42:38 +02004826 { 0, 576, XTEST_DSA_GK_DATA(keygen_dsa576) },
4827 { 0, 640, XTEST_DSA_GK_DATA(keygen_dsa640) },
4828 { 0, 704, XTEST_DSA_GK_DATA(keygen_dsa704) },
4829 { 0, 768, XTEST_DSA_GK_DATA(keygen_dsa768) },
4830 { 0, 832, XTEST_DSA_GK_DATA(keygen_dsa832) },
4831 { 0, 896, XTEST_DSA_GK_DATA(keygen_dsa896) },
4832 { 0, 960, XTEST_DSA_GK_DATA(keygen_dsa960) },
4833 { 0, 1024, XTEST_DSA_GK_DATA(keygen_dsa1024) },
Pascal Brandc639ac82015-07-02 08:53:34 +02004834 };
4835
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004836 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4837 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4838 &ret_orig)))
4839 return;
4840
Pascal Brandc639ac82015-07-02 08:53:34 +02004841 for (n = 0; n < ARRAY_SIZE(key_types); n++) {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004842 if (key_types[n].level > level)
4843 continue;
4844
Pascal Brandc639ac82015-07-02 08:53:34 +02004845 Do_ADBG_BeginSubCase(c, "Generate DSA key %d bits",
4846 key_types[n].key_size);
4847 param_count = 0;
4848
4849
4850 xtest_add_attr(&param_count, params, TEE_ATTR_DSA_PRIME,
4851 key_types[n].prime, key_types[n].prime_len);
4852
4853 xtest_add_attr(&param_count, params, TEE_ATTR_DSA_SUBPRIME,
4854 key_types[n].sub_prime,
4855 key_types[n].sub_prime_len);
4856
4857 xtest_add_attr(&param_count, params, TEE_ATTR_DSA_BASE,
4858 key_types[n].base, key_types[n].base_len);
4859
4860 if (!ADBG_EXPECT_TRUE(c,
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004861 generate_and_test_key(c, &session, TEE_TYPE_DSA_KEYPAIR,
Pascal Brandc639ac82015-07-02 08:53:34 +02004862 1, key_types[n]. key_size, params,
4863 param_count)))
4864 break;
4865
4866 Do_ADBG_EndSubCase(c, "Generate DSA key %d bits",
4867 key_types[n].key_size);
4868 }
Pascal Brandc639ac82015-07-02 08:53:34 +02004869
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004870 TEEC_CloseSession(&session);
4871}
4872ADBG_CASE_DEFINE(regression, 4007_dsa, xtest_tee_test_4007_dsa,
4873 "Test TEE Internal API Generate DSA key");
4874
4875static void xtest_tee_test_4007_ecc(ADBG_Case_t *c)
Pascal Brande61133f2015-07-08 15:38:37 +02004876{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004877 TEEC_Session session = { };
4878 uint32_t ret_orig = 0;
4879 size_t n = 0;
4880 size_t param_count = 0;
4881 TEE_Attribute params[4] = { };
Pascal Brande61133f2015-07-08 15:38:37 +02004882
4883 static const struct {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004884 unsigned level;
Pascal Brande61133f2015-07-08 15:38:37 +02004885 const char *name;
4886 uint32_t algo;
4887 uint32_t curve;
4888 uint32_t key_size;
4889 } key_types[] = {
4890 /* ECDSA */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004891 { 0, "ECDSA-192", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P192,
4892 192 },
4893 { 1, "ECDSA-224", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P224,
4894 224 },
4895 { 1, "ECDSA-256", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P256,
4896 256 },
4897 { 1, "ECDSA-384", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P384,
4898 384 },
4899 { 1, "ECDSA-521", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P521,
4900 521 },
Pascal Brande61133f2015-07-08 15:38:37 +02004901
4902 /* ECDH */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004903 { 0, "ECDH-192", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P192,
4904 192 },
4905 { 1, "ECDH-224", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P224,
4906 224 },
4907 { 1, "ECDH-256", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P256,
4908 256 },
4909 { 1, "ECDH-384", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P384,
4910 384 },
4911 { 1, "ECDH-521", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P521,
4912 521 },
Pascal Brande61133f2015-07-08 15:38:37 +02004913 };
4914
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004915 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4916 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4917 &ret_orig)))
4918 return;
4919
Pascal Brande61133f2015-07-08 15:38:37 +02004920 for (n = 0; n < ARRAY_SIZE(key_types); n++) {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004921 if (key_types[n].level > level)
4922 continue;
4923
Pascal Brande61133f2015-07-08 15:38:37 +02004924 Do_ADBG_BeginSubCase(c, "Generate %s", key_types[n].name);
4925 param_count = 0;
4926
4927 xtest_add_attr_value(&param_count, params, TEE_ATTR_ECC_CURVE,
4928 key_types[n].curve, 0);
4929
4930 if (!ADBG_EXPECT_TRUE(c,
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004931 generate_and_test_key(c, &session, key_types[n].algo,
Pascal Brande61133f2015-07-08 15:38:37 +02004932 0, key_types[n].key_size, params,
4933 param_count)))
4934 break;
4935
4936 Do_ADBG_EndSubCase(c, "Generate %s", key_types[n].name);
4937 }
Pascal Brande61133f2015-07-08 15:38:37 +02004938
Pascal Brandc639ac82015-07-02 08:53:34 +02004939 TEEC_CloseSession(&session);
4940}
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004941ADBG_CASE_DEFINE(regression, 4007_ecc, xtest_tee_test_4007_ecc,
4942 "Test TEE Internal API Generate ECC key");
Pascal Brandc639ac82015-07-02 08:53:34 +02004943
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03004944static void xtest_tee_test_4007_x25519(ADBG_Case_t *c)
4945{
4946 TEEC_Session session = { };
4947 uint32_t ret_orig = 0;
4948
4949 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4950 xtest_teec_open_session(&session, &crypt_user_ta_uuid,
4951 NULL, &ret_orig)))
4952 return;
4953
Jerome Forissier366179c2022-06-28 10:12:58 +02004954 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_X25519,
4955 TEE_ECC_CURVE_25519)) {
4956 Do_ADBG_Log("X25519 not supported: skip subcase");
4957 goto out;
4958 }
4959
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03004960 Do_ADBG_BeginSubCase(c, "Generate X25519 key");
4961
4962 if (!ADBG_EXPECT_TRUE(c,
4963 generate_and_test_key(c, &session,
4964 TEE_TYPE_X25519_KEYPAIR, 0, 256,
4965 NULL, 0)))
4966 return;
4967
4968 Do_ADBG_EndSubCase(c, "Generate X25519 key");
Jerome Forissier366179c2022-06-28 10:12:58 +02004969out:
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03004970 TEEC_CloseSession(&session);
4971}
4972ADBG_CASE_DEFINE(regression, 4007_x25519, xtest_tee_test_4007_x25519,
4973 "Test TEE Internal API Generate X25519 key");
4974
Valerii Chubarab9863c2022-08-12 07:42:29 +00004975
4976static void xtest_tee_test_4007_ed25519(ADBG_Case_t *c)
4977{
4978 TEEC_Session session = { };
4979 uint32_t ret_orig = 0;
4980
4981 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4982 xtest_teec_open_session(&session, &crypt_user_ta_uuid,
4983 NULL, &ret_orig)))
4984 return;
4985
4986 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_ED25519,
4987 TEE_ECC_CURVE_25519)) {
4988 Do_ADBG_Log("ED25519 not supported: skip subcase");
4989 goto out;
4990 }
4991
4992 Do_ADBG_BeginSubCase(c, "Generate Ed25519 key");
4993
4994 ADBG_EXPECT_TRUE(c, generate_and_test_key(c, &session,
4995 TEE_TYPE_ED25519_KEYPAIR,
4996 0, 256, NULL, 0));
4997
4998 Do_ADBG_EndSubCase(c, "Generate Ed25519 key");
4999out:
5000 TEEC_CloseSession(&session);
5001}
5002ADBG_CASE_DEFINE(regression, 4007_ed25519, xtest_tee_test_4007_ed25519,
5003 "Test TEE Internal API Generate ed25519 key");
5004
Pascal Brandc639ac82015-07-02 08:53:34 +02005005static void xtest_tee_test_4008(ADBG_Case_t *c)
5006{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005007 TEEC_Session session = { };
5008 uint32_t ret_orig = 0;
5009 TEE_OperationHandle op = TEE_HANDLE_NULL;
5010 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
5011 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
5012 TEE_Attribute params[4] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02005013 size_t param_count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005014 uint8_t out[2048] = { };
5015 size_t out_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02005016
5017 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5018 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5019 &ret_orig)))
5020 return;
5021
5022 Do_ADBG_BeginSubCase(c, "Derive DH key success");
5023
5024 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5025 ta_crypt_cmd_allocate_operation(c, &session, &op,
5026 TEE_ALG_DH_DERIVE_SHARED_SECRET, TEE_MODE_DERIVE,
5027 derive_key_max_keysize)))
5028 goto out;
5029
5030 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5031 ta_crypt_cmd_allocate_transient_object(c, & session,
5032 TEE_TYPE_DH_KEYPAIR, derive_key_max_keysize,
5033 &key_handle)))
5034 goto out;
5035
5036 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PRIME,
5037 ARRAY(derive_key_dh_prime));
5038
5039 xtest_add_attr(&param_count, params, TEE_ATTR_DH_BASE,
5040 ARRAY(derive_key_dh_base));
5041
5042 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PUBLIC_VALUE,
5043 ARRAY(derive_key_dh_public_value));
5044
5045 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PRIVATE_VALUE,
5046 ARRAY(derive_key_dh_private_value));
5047
5048 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5049 ta_crypt_cmd_populate_transient_object(c, &session, key_handle,
5050 params, param_count)))
5051 goto out;
5052
5053 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5054 ta_crypt_cmd_set_operation_key(c, &session, op, key_handle)))
5055 goto out;
5056
5057 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5058 ta_crypt_cmd_free_transient_object(c, & session, key_handle)))
5059 goto out;
5060
5061 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5062 ta_crypt_cmd_allocate_transient_object(c, &session,
5063 TEE_TYPE_GENERIC_SECRET, derive_key_max_keysize,
5064 &sv_handle)))
5065 goto out;
5066
Pascal Brand2b92b642015-07-16 13:29:42 +02005067 /* reuse but reset params and param-count */
Pascal Brandc639ac82015-07-02 08:53:34 +02005068 param_count = 0;
5069
5070 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PUBLIC_VALUE,
5071 ARRAY(derive_key_dh_public_value_2));
5072
5073 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5074 ta_crypt_cmd_derive_key(c, &session, op, sv_handle, params,
5075 param_count)))
5076 goto out;
5077
5078 out_size = sizeof(out);
5079 memset(out, 0, sizeof(out));
5080 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5081 ta_crypt_cmd_get_object_buffer_attribute(c, &session, sv_handle,
5082 TEE_ATTR_SECRET_VALUE, out, &out_size)))
5083 goto out;
5084
5085 if (!ADBG_EXPECT_BUFFER(c, derive_key_dh_shared_secret,
5086 sizeof(derive_key_dh_shared_secret), out,
5087 out_size))
5088 goto out;
5089
5090 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5091 ta_crypt_cmd_free_operation(c, &session, op)))
5092 goto out;
5093
5094 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5095 ta_crypt_cmd_free_transient_object(c, &session, sv_handle)))
5096 goto out;
5097out:
5098 Do_ADBG_EndSubCase(c, "Derive DH key success");
5099 TEEC_CloseSession(&session);
5100}
Jens Wiklander14f48872018-06-29 15:30:13 +02005101ADBG_CASE_DEFINE(regression, 4008, xtest_tee_test_4008,
5102 "Test TEE Internal API Derive key");
Pascal Brand2b92b642015-07-16 13:29:42 +02005103
5104static void xtest_tee_test_4009(ADBG_Case_t *c)
5105{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005106 TEEC_Session session = { };
5107 uint32_t ret_orig = 0;
5108 TEE_OperationHandle op = TEE_HANDLE_NULL;
5109 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
5110 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
5111 TEE_Attribute params[4] = { };
Pascal Brand2b92b642015-07-16 13:29:42 +02005112 size_t param_count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005113 uint8_t out[2048] = { };
5114 size_t out_size = 0;
5115 uint32_t size_bytes = 0;
5116 uint32_t i = 0;
Ruchika Gupta454b0b62020-10-30 13:23:19 +05305117 struct derive_key_ecdh_t const *pt = NULL;
Pascal Brand2b92b642015-07-16 13:29:42 +02005118
5119 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5120 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5121 &ret_orig)))
5122 return;
5123
5124 for (i = 0; i < ARRAY_SIZE(derive_key_ecdh); i++) {
5125 pt = &derive_key_ecdh[i];
5126
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02005127 if (pt->level > level)
5128 continue;
5129
Pascal Brand2b92b642015-07-16 13:29:42 +02005130 Do_ADBG_BeginSubCase(c, "Derive ECDH key - algo = 0x%x",
5131 pt->algo);
5132 size_bytes = (pt->keysize + 7) / 8;
5133 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5134 ta_crypt_cmd_allocate_operation(c, &session, &op,
5135 pt->algo,
5136 TEE_MODE_DERIVE, pt->keysize)))
5137 goto out;
5138
5139 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5140 ta_crypt_cmd_allocate_transient_object(c, & session,
5141 TEE_TYPE_ECDH_KEYPAIR, pt->keysize,
5142 &key_handle)))
5143 goto out;
5144
5145 param_count = 0;
5146 xtest_add_attr_value(&param_count, params,
5147 TEE_ATTR_ECC_CURVE, pt->curve, 0);
5148 xtest_add_attr(&param_count, params,
5149 TEE_ATTR_ECC_PRIVATE_VALUE,
5150 pt->private, size_bytes);
5151 /*
Cedric Auger719047c2019-09-11 12:08:14 +02005152 * The public value is not used, but we should provide a valid
5153 * one to avoid rejection in case TEE_PopulateTransientObject()
5154 * checks for key validity.
Pascal Brand2b92b642015-07-16 13:29:42 +02005155 */
5156 xtest_add_attr(&param_count, params,
Cedric Auger719047c2019-09-11 12:08:14 +02005157 TEE_ATTR_ECC_PUBLIC_VALUE_X,
5158 pt->public_x, size_bytes);
Pascal Brand2b92b642015-07-16 13:29:42 +02005159 xtest_add_attr(&param_count, params,
Cedric Auger719047c2019-09-11 12:08:14 +02005160 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5161 pt->public_y, size_bytes);
Pascal Brand2b92b642015-07-16 13:29:42 +02005162
5163 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5164 ta_crypt_cmd_populate_transient_object(c,
5165 &session,
5166 key_handle, params, param_count)))
5167 goto out;
5168
5169 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5170 ta_crypt_cmd_set_operation_key(c, &session, op,
5171 key_handle)))
5172 goto out;
5173
5174 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5175 ta_crypt_cmd_free_transient_object(c, & session,
5176 key_handle)))
5177 goto out;
5178
5179 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5180 ta_crypt_cmd_allocate_transient_object(c, &session,
5181 TEE_TYPE_GENERIC_SECRET, size_bytes * 8,
5182 &sv_handle)))
5183 goto out;
5184
5185 /* reuse but reset params and param-count */
5186 param_count = 0;
5187
5188 xtest_add_attr(&param_count, params,
5189 TEE_ATTR_ECC_PUBLIC_VALUE_X,
5190 pt->public_x, size_bytes);
5191 xtest_add_attr(&param_count, params,
5192 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5193 pt->public_y, size_bytes);
5194
5195 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5196 ta_crypt_cmd_derive_key(c, &session, op, sv_handle,
5197 params, param_count)))
5198 goto out;
5199
5200 out_size = sizeof(out);
5201 memset(out, 0, sizeof(out));
5202 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5203 ta_crypt_cmd_get_object_buffer_attribute(c, &session,
5204 sv_handle,
5205 TEE_ATTR_SECRET_VALUE, out, &out_size)))
5206 goto out;
5207
5208 if (!ADBG_EXPECT_BUFFER(c, pt->out, size_bytes,
5209 out, out_size))
5210 goto out;
5211
5212 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5213 ta_crypt_cmd_free_operation(c, &session, op)))
5214 goto out;
5215
5216 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5217 ta_crypt_cmd_free_transient_object(c, &session,
5218 sv_handle)))
5219 goto out;
5220
5221 Do_ADBG_EndSubCase(c, "Derive ECDH key - algo = 0x%x",
5222 pt->algo);
5223 }
5224
5225 goto noerror;
5226
5227out:
5228 Do_ADBG_EndSubCase(c, "Derive ECDH key - algo = 0x%x", pt->algo);
5229
5230noerror:
5231 TEEC_CloseSession(&session);
5232}
Jens Wiklander14f48872018-06-29 15:30:13 +02005233ADBG_CASE_DEFINE(regression, 4009, xtest_tee_test_4009,
5234 "Test TEE Internal API Derive key ECDH");
Jens Wiklander70a0b2c2016-05-18 08:39:35 +02005235
5236static void xtest_tee_test_4010(ADBG_Case_t *c)
5237{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005238 TEEC_Session session = { };
5239 uint32_t ret_orig = 0;
5240 TEE_ObjectHandle o = TEE_HANDLE_NULL;
Jens Wiklander70a0b2c2016-05-18 08:39:35 +02005241 static const uint8_t large_key[1024] = { 1, 2, 3, 4, 5, 6 };
5242 static const TEE_Attribute attr = {
5243 .attributeID = TEE_ATTR_SECRET_VALUE,
5244 .content.ref.buffer = (void *)large_key,
5245 .content.ref.length = sizeof(large_key),
5246 };
5247
5248 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5249 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5250 &ret_orig)))
5251 return;
5252
5253 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5254 ta_crypt_cmd_allocate_transient_object(c, &session,
5255 TEE_TYPE_HMAC_SHA256, 1024, &o)))
5256 goto out;
5257
5258 ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_TARGET_DEAD,
5259 ta_crypt_cmd_populate_transient_object(c, &session, o,
5260 &attr, 1));
5261
5262out:
5263 TEEC_CloseSession(&session);
5264}
Jens Wiklander14f48872018-06-29 15:30:13 +02005265ADBG_CASE_DEFINE(regression, 4010, xtest_tee_test_4010,
5266 "Test TEE Internal API create transient object (negative)");
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005267
5268static void xtest_tee_test_4011(ADBG_Case_t *c)
5269{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005270 TEEC_Session s = { };
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005271 size_t key_size = 512;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005272 TEE_ObjectHandle key = TEE_HANDLE_NULL;
5273 TEE_OperationHandle ops = TEE_HANDLE_NULL;
5274 TEE_OperationHandle opv = TEE_HANDLE_NULL;
5275 TEE_OperationHandle ope = TEE_HANDLE_NULL;
5276 TEE_OperationHandle opd = TEE_HANDLE_NULL;
5277 uint32_t ret_orig = 0;
5278 uint8_t in[TEE_SHA1_HASH_SIZE] = { };
5279 uint8_t out[1024] = { };
5280 uint8_t tmp[1024] = { };
5281 size_t out_size = 0;
5282 size_t tmp_size = 0;
5283 size_t n = 0;
5284 size_t m = 0;
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005285 size_t i = 0;
5286
5287 /* Setup session, initialize message to sign, create a keypair */
5288 if (!ADBG_EXPECT_TEEC_SUCCESS(c, xtest_teec_open_session(&s,
5289 &crypt_user_ta_uuid, NULL, &ret_orig)))
5290 return;
5291 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_random_number_generate(c,
5292 &s, in, sizeof(in))))
5293 goto out;
5294 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_transient_object(
5295 c, &s, TEE_TYPE_RSA_KEYPAIR, key_size, &key)))
5296 goto out;
5297 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_generate_key(c, &s,
5298 key, key_size, NULL, 0)))
5299 goto out;
5300
5301 /* Allocate operations for sign, verify, encrypt and decrypt */
5302 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
5303 &ops, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
5304 key_size)))
5305 goto out;
5306 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
5307 &opv, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
5308 key_size)))
5309 goto out;
5310 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
5311 &ope, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT, key_size)))
5312 goto out;
5313 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
5314 &opd, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT, key_size)))
5315 goto out;
5316
5317 /* Assign the keypair to all operations */
5318 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5319 ta_crypt_cmd_set_operation_key(c, &s, ops, key)))
5320 goto out;
5321 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5322 ta_crypt_cmd_set_operation_key(c, &s, opv, key)))
5323 goto out;
5324 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5325 ta_crypt_cmd_set_operation_key(c, &s, ope, key)))
5326 goto out;
5327 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5328 ta_crypt_cmd_set_operation_key(c, &s, opd, key)))
5329 goto out;
5330
5331 /*
5332 * The core of the test case is inspired by the one in libtomcrypt:
5333 * https://github.com/libtom/libtomcrypt/blob/6ad52252688bb34f90b5e79da4830a927e87b81f/testprof/rsa_test.c#L398
5334 *
5335 * Testcase for Bleichenbacher attack
5336 *
5337 * (1) Create a valid signature
5338 * (2) Check that it can be verified
5339 * (3) Transform the package to fetch plain text (using the encrypt
5340 * operation in GP TEE Internal API)
5341 * (4) Forge the structure of PKCS#1-EMSA encoded data
5342 * (4.1) Search for start and end of the padding string
5343 * (4.2) Move the signature to the front of the padding string
5344 * (4.3) Zero the message until the end
5345 * (5) Transform the package back (using the decrypt operation in
5346 * GP TEE Internal API)
5347 * (6) The result should not be valid if the implementation is robust.
5348 */
5349
5350
5351 for (i = 0; i < 9; i++) {
5352 Do_ADBG_Log("Iteration %zu", i);
5353
5354 /* 1 */
5355 out_size = sizeof(out);
5356 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5357 ta_crypt_cmd_asymmetric_sign(c, &s, ops, NULL, 0,
5358 in, sizeof(in), out, &out_size)))
5359 goto out;
5360
5361 /* 2 */
5362 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5363 ta_crypt_cmd_asymmetric_verify(c, &s, opv, NULL, 0,
5364 in, sizeof(in), out, out_size)))
5365 goto out;
5366
5367 /* 3 */
5368 tmp_size = sizeof(tmp);
5369 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5370 ta_crypt_cmd_asymmetric_encrypt(c, &s, ope, NULL, 0,
5371 out, out_size, tmp, &tmp_size)))
5372 goto out;
5373
Etienne Carriere0953bf02018-12-21 15:36:25 +01005374 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, tmp_size, <=, sizeof(tmp)))
5375 goto out;
5376
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005377 /* 4.1 */
Etienne Carriere0953bf02018-12-21 15:36:25 +01005378 for (n = 0; n < tmp_size - i; n++)
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005379 if (tmp[n] == 0xff)
5380 break;
Etienne Carriere0953bf02018-12-21 15:36:25 +01005381
5382 /* Shall find at least a padding start before buffer end */
5383 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, n, <, tmp_size - i - 1))
5384 goto out;
5385
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005386 for (m = n + 1; m < tmp_size; m++)
5387 if (tmp[m] != 0xff)
5388 break;
Etienne Carriere0953bf02018-12-21 15:36:25 +01005389
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005390 /* 4.2 */
5391 memmove(tmp + n + i, tmp + m, tmp_size - m);
Etienne Carriere0953bf02018-12-21 15:36:25 +01005392
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005393 /* 4.3 */
Etienne Carriere0953bf02018-12-21 15:36:25 +01005394 n = n + i + tmp_size - m;
Etienne Carriereacb81c42020-04-24 14:58:58 +02005395
5396 /* Prevent overrun when zeroing buffer end */
5397 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, n, <=, tmp_size))
5398 goto out;
5399
Etienne Carriere0953bf02018-12-21 15:36:25 +01005400 memset(tmp + n, 0, tmp_size - n);
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005401
5402 /* 5 */
5403 out_size = sizeof(out);
5404 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5405 ta_crypt_cmd_asymmetric_decrypt(c, &s, opd, NULL, 0,
5406 tmp, tmp_size, out, &out_size)))
5407 goto out;
5408
5409 /* 6 */
5410 if (!ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_SIGNATURE_INVALID,
5411 ta_crypt_cmd_asymmetric_verify(c, &s, opv, NULL, 0,
5412 in, sizeof(in), out, out_size)))
5413 goto out;
5414 }
5415
5416out:
5417 TEEC_CloseSession(&s);
5418}
Jens Wiklander14f48872018-06-29 15:30:13 +02005419ADBG_CASE_DEFINE(regression, 4011, xtest_tee_test_4011,
5420 "Test TEE Internal API Bleichenbacher attack (negative)");
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005421
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005422static void xtest_tee_test_4012(ADBG_Case_t *c)
5423{
Jens Wiklanderc44350d2022-12-02 20:56:49 +01005424 TEEC_Result res = TEEC_SUCCESS;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005425 TEEC_Session session = { };
5426 uint32_t ret_orig = 0;
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005427 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
5428 /* Fortuna PRNG requires seed <= 32 bytes */
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005429 uint8_t pool_input[32] = { };
5430 time_t t = 0;
5431 struct tm tm_local = { };
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005432
5433 t = time(NULL);
5434 tm_local = *localtime(&t);
5435
5436 memcpy((void *)pool_input, (void *)&tm_local,
5437 sizeof(pool_input) < sizeof(tm_local) ?
5438 sizeof(pool_input) : sizeof(tm_local));
5439
5440
5441 op.params[0].tmpref.buffer = pool_input;
5442 op.params[0].tmpref.size = sizeof(pool_input);
5443 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
5444 TEEC_NONE,
5445 TEEC_NONE,
5446 TEEC_NONE);
5447 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5448 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5449 &ret_orig)))
5450 return;
5451
Jens Wiklanderc44350d2022-12-02 20:56:49 +01005452 res = TEEC_InvokeCommand(&session, TA_CRYPT_CMD_SEED_RNG_POOL,
5453 &op, &ret_orig);
5454 if (res == TEEC_ERROR_ITEM_NOT_FOUND &&
5455 ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, ret_orig,
5456 TEEC_ORIGIN_TRUSTED_APP))
5457 Do_ADBG_Log("System PTA not available, skipping test 4012");
5458 else
5459 ADBG_EXPECT_TEEC_SUCCESS(c, res);
5460
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005461 TEEC_CloseSession(&session);
5462}
Jens Wiklander14f48872018-06-29 15:30:13 +02005463ADBG_CASE_DEFINE(regression, 4012, xtest_tee_test_4012,
5464 "Test seeding RNG entropy");
Joakim Bech83a30ca2019-05-29 11:22:27 +02005465
5466static void xtest_tee_test_4013(ADBG_Case_t *c)
5467{
Jens Wiklanderc44350d2022-12-02 20:56:49 +01005468 TEEC_Result res = TEEC_SUCCESS;
Joakim Bech83a30ca2019-05-29 11:22:27 +02005469 TEEC_Session session = { };
5470 uint32_t ret_orig = 0;
5471 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
5472 uint8_t key[32] = { };
5473 uint8_t extra_data[32] = { };
5474
5475 op.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
5476 TEEC_NONE,
5477 TEEC_NONE,
5478 TEEC_NONE);
5479 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5480 xtest_teec_open_session(&session, &crypt_user_ta_uuid,
5481 NULL, &ret_orig)))
5482 return;
5483
Jens Wiklanderc44350d2022-12-02 20:56:49 +01005484 res = TEEC_InvokeCommand(&session, TA_CRYPT_CMD_DERIVE_TA_UNIQUE_KEY,
5485 &op, &ret_orig);
5486 if (res == TEEC_ERROR_ITEM_NOT_FOUND &&
5487 ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, ret_orig,
5488 TEEC_ORIGIN_TRUSTED_APP)) {
5489 Do_ADBG_Log("System PTA not available, skipping test 4013");
5490 goto out;
5491 }
5492 ADBG_EXPECT_TEEC_SUCCESS(c, res);
Joakim Bech83a30ca2019-05-29 11:22:27 +02005493
5494 /* Negative test using non-secure memory */
5495 memset(&op, 0, sizeof(op));
5496 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
5497 TEEC_MEMREF_TEMP_OUTPUT,
5498 TEEC_NONE,
5499 TEEC_NONE);
5500
5501 op.params[0].tmpref.buffer = extra_data;
5502 op.params[0].tmpref.size = sizeof(extra_data);
5503 op.params[1].tmpref.buffer = key;
5504 op.params[1].tmpref.size = sizeof(key);
5505 (void)ADBG_EXPECT_TEEC_RESULT(c,
5506 TEEC_ERROR_SECURITY,
5507 TEEC_InvokeCommand(&session,
5508 TA_CRYPT_CMD_DERIVE_TA_UNIQUE_KEY_SHM,
5509 &op,
5510 &ret_orig));
5511
Jens Wiklanderc44350d2022-12-02 20:56:49 +01005512out:
Joakim Bech83a30ca2019-05-29 11:22:27 +02005513 TEEC_CloseSession(&session);
5514}
5515ADBG_CASE_DEFINE(regression, 4013, xtest_tee_test_4013,
5516 "Test generation of device unique TA keys");
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005517
5518static void xtest_tee_test_4014(ADBG_Case_t *c)
5519{
5520 TEEC_Session session = { };
5521 uint32_t ret_orig = 0;
5522 TEE_OperationHandle op = TEE_HANDLE_NULL;
5523 TEE_ObjectHandle keyA = TEE_HANDLE_NULL;
5524 TEE_ObjectHandle eph_keyA = TEE_HANDLE_NULL;
5525 TEE_ObjectHandle keyB = TEE_HANDLE_NULL;
5526 TEE_ObjectHandle eph_keyB = TEE_HANDLE_NULL;
5527 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
5528 TEE_Attribute params[9] = { };
5529 size_t param_count = 0;
5530 uint8_t out[128] = { };
5531 size_t out_size = 0;
5532 uint8_t conf_A[32] = { };
5533 uint8_t conf_B[32] = { };
5534
5535 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5536 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5537 &ret_orig)))
5538 return;
5539
5540 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_SM2_KEP,
5541 TEE_ECC_CURVE_SM2)) {
5542 Do_ADBG_Log("SM2 KEP not supported: skip subcase");
5543 goto out;
5544 }
5545
5546 Do_ADBG_BeginSubCase(c, "Initiator side");
5547
5548 /*
5549 * Key exchange protocol running on user A's side. A is initiator.
5550 */
5551
5552 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5553 ta_crypt_cmd_allocate_operation(c, &session, &op,
5554 TEE_ALG_SM2_KEP, TEE_MODE_DERIVE, 512)))
5555 goto out;
5556
5557 /* Allocate and initialize keypair of user A */
5558
5559 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5560 ta_crypt_cmd_allocate_transient_object(c, &session,
5561 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &keyA)))
5562 goto out;
5563
5564 param_count = 0;
5565
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005566 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5567 ARRAY(gmt_003_part5_b2_public_xA));
5568
5569 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5570 ARRAY(gmt_003_part5_b2_public_yA));
5571
5572 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5573 ARRAY(gmt_003_part5_b2_private_A));
5574
5575 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5576 ta_crypt_cmd_populate_transient_object(c, &session, keyA,
5577 params, param_count)))
5578 goto out;
5579
5580 /*
5581 * Allocate and set ephemeral key of user A. Note: it is a regular ECC
5582 * key -- we don't use the *_EPHEMERAL_* attributes flags which are
5583 * reserved for use in TEE_DeriveKey() to pass the ephermeral key of
5584 * user B.
5585 */
5586
5587 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5588 ta_crypt_cmd_allocate_transient_object(c, &session,
5589 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &eph_keyA)))
5590 goto out;
5591
5592 param_count = 0;
5593
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005594 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5595 ARRAY(gmt_003_part5_b2_eph_public_xA));
5596
5597 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5598 ARRAY(gmt_003_part5_b2_eph_public_yA));
5599
5600 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5601 ARRAY(gmt_003_part5_b2_eph_private_A));
5602
5603 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5604 ta_crypt_cmd_populate_transient_object(c, &session, eph_keyA,
5605 params, param_count)))
5606 goto out;
5607
5608 /* Associate user A keys with operation */
5609
5610 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5611 ta_crypt_cmd_set_operation_key2(c, &session, op, keyA,
5612 eph_keyA)))
5613 goto out;
5614
5615 /* Keys have been set, free key objects */
5616
5617 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5618 ta_crypt_cmd_free_transient_object(c, &session, keyA)))
5619 goto out;
5620
5621 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5622 ta_crypt_cmd_free_transient_object(c, &session, eph_keyA)))
5623 goto out;
5624
5625 /* Allocate output object */
5626
5627 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5628 ta_crypt_cmd_allocate_transient_object(c, &session,
5629 TEE_TYPE_GENERIC_SECRET,
5630 sizeof(gmt_003_part5_b2_shared_secret),
5631 &sv_handle)))
5632 goto out;
5633
5634 /* Set key derivation parameters: user A role, user B information */
5635
5636 params[0].attributeID = TEE_ATTR_SM2_KEP_USER;
5637 params[0].content.value.a = 0; /* Initiator role */
5638 params[0].content.value.b = 0; /* Not used */
5639 param_count = 1;
5640
5641 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5642 ARRAY(gmt_003_part5_b2_public_xB));
5643
5644 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5645 ARRAY(gmt_003_part5_b2_public_yB));
5646
5647 xtest_add_attr(&param_count, params,
5648 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_X,
5649 ARRAY(gmt_003_part5_b2_eph_public_xB));
5650
5651 xtest_add_attr(&param_count, params,
5652 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_Y,
5653 ARRAY(gmt_003_part5_b2_eph_public_yB));
5654
5655 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_INITIATOR,
5656 ARRAY(gmt_003_part5_b2_id_A));
5657
5658 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_RESPONDER,
5659 ARRAY(gmt_003_part5_b2_id_B));
5660
5661 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_IN,
5662 ARRAY(gmt_003_part5_b2_conf_B));
5663
5664 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_OUT,
5665 ARRAY(conf_A));
5666
5667 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5668 ta_crypt_cmd_derive_key(c, &session, op, sv_handle, params,
5669 param_count)))
5670 goto out;
5671
5672 out_size = sizeof(out);
5673 memset(out, 0, sizeof(out));
5674 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5675 ta_crypt_cmd_get_object_buffer_attribute(c, &session, sv_handle,
5676 TEE_ATTR_SECRET_VALUE, out, &out_size)))
5677 goto out;
5678
5679 /* Check derived key */
5680 if (!ADBG_EXPECT_BUFFER(c, gmt_003_part5_b2_shared_secret,
5681 sizeof(gmt_003_part5_b2_shared_secret), out,
5682 out_size))
5683 goto out;
5684
5685 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5686 ta_crypt_cmd_free_operation(c, &session, op)))
5687 goto out;
5688
5689 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5690 ta_crypt_cmd_free_transient_object(c, &session, sv_handle)))
5691 goto out;
5692
5693 Do_ADBG_EndSubCase(c, "Initiator side");
5694
5695 Do_ADBG_BeginSubCase(c, "Responder side");
5696
5697 /*
5698 * Key derivation on user B's side
5699 */
5700
5701 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5702 ta_crypt_cmd_allocate_operation(c, &session, &op,
5703 TEE_ALG_SM2_KEP, TEE_MODE_DERIVE, 512)))
5704 goto out;
5705
5706 /* Allocate and initialize keypair of user B */
5707
5708 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5709 ta_crypt_cmd_allocate_transient_object(c, &session,
5710 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &keyB)))
5711 goto out;
5712
5713 param_count = 0;
5714
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005715 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5716 ARRAY(gmt_003_part5_b2_public_xB));
5717
5718 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5719 ARRAY(gmt_003_part5_b2_public_yB));
5720
5721 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5722 ARRAY(gmt_003_part5_b2_private_B));
5723
5724 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5725 ta_crypt_cmd_populate_transient_object(c, &session, keyB,
5726 params, param_count)))
5727 goto out;
5728
5729 /* Allocate and set ephemeral key of user B */
5730
5731 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5732 ta_crypt_cmd_allocate_transient_object(c, &session,
5733 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &eph_keyB)))
5734 goto out;
5735
5736 param_count = 0;
5737
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005738 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5739 ARRAY(gmt_003_part5_b2_eph_public_xB));
5740
5741 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5742 ARRAY(gmt_003_part5_b2_eph_public_yB));
5743
5744 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5745 ARRAY(gmt_003_part5_b2_eph_private_B));
5746
5747 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5748 ta_crypt_cmd_populate_transient_object(c, &session, eph_keyB,
5749 params, param_count)))
5750 goto out;
5751
5752 /* Associate user B keys with operation */
5753
5754 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5755 ta_crypt_cmd_set_operation_key2(c, &session, op, keyB,
5756 eph_keyB)))
5757 goto out;
5758
5759 /* Keys have been set, free key objects */
5760
5761 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5762 ta_crypt_cmd_free_transient_object(c, &session, keyB)))
5763 goto out;
5764
5765 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5766 ta_crypt_cmd_free_transient_object(c, &session, eph_keyB)))
5767 goto out;
5768
5769 /* Allocate output object */
5770
5771 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5772 ta_crypt_cmd_allocate_transient_object(c, &session,
5773 TEE_TYPE_GENERIC_SECRET,
5774 sizeof(gmt_003_part5_b2_shared_secret),
5775 &sv_handle)))
5776 goto out;
5777
5778 /* Set key derivation parameters: user B role, user A information */
5779
5780 params[0].attributeID = TEE_ATTR_SM2_KEP_USER;
5781 params[0].content.value.a = 1; /* Responder role */
5782 params[0].content.value.b = 0; /* Not used */
5783 param_count = 1;
5784
5785 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5786 ARRAY(gmt_003_part5_b2_public_xA));
5787
5788 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5789 ARRAY(gmt_003_part5_b2_public_yA));
5790
5791 xtest_add_attr(&param_count, params,
5792 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_X,
5793 ARRAY(gmt_003_part5_b2_eph_public_xA));
5794
5795 xtest_add_attr(&param_count, params,
5796 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_Y,
5797 ARRAY(gmt_003_part5_b2_eph_public_yA));
5798
5799 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_INITIATOR,
5800 ARRAY(gmt_003_part5_b2_id_A));
5801
5802 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_RESPONDER,
5803 ARRAY(gmt_003_part5_b2_id_B));
5804
5805 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_IN,
5806 ARRAY(gmt_003_part5_b2_conf_A));
5807
5808 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_OUT,
5809 ARRAY(conf_B));
5810
5811 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5812 ta_crypt_cmd_derive_key(c, &session, op, sv_handle, params,
5813 param_count)))
5814 goto out;
5815
5816 out_size = sizeof(out);
5817 memset(out, 0, sizeof(out));
5818 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5819 ta_crypt_cmd_get_object_buffer_attribute(c, &session, sv_handle,
5820 TEE_ATTR_SECRET_VALUE, out, &out_size)))
5821 goto out;
5822
5823 /* Check derived key */
5824 if (!ADBG_EXPECT_BUFFER(c, gmt_003_part5_b2_shared_secret,
5825 sizeof(gmt_003_part5_b2_shared_secret), out,
5826 out_size))
5827 goto out;
5828
5829 Do_ADBG_EndSubCase(c, "Responder side");
5830
5831out:
5832 TEEC_CloseSession(&session);
5833}
5834ADBG_CASE_DEFINE(regression, 4014, xtest_tee_test_4014,
5835 "Test SM2 KEP (key derivation)");
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03005836
5837static void xtest_tee_test_4015(ADBG_Case_t *c)
5838{
5839 TEEC_Session session = { };
5840 uint32_t ret_orig = 0;
5841 TEE_OperationHandle op = TEE_HANDLE_NULL;
5842 TEE_ObjectHandle key_alice = TEE_HANDLE_NULL;
5843 TEE_ObjectHandle key_bob = TEE_HANDLE_NULL;
5844 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
5845 TEE_Attribute params[2] = { };
5846 size_t param_count = 0;
5847 uint8_t out[32] = { };
5848 size_t out_size = 0;
5849 char case_str[40] = "Alice side computes shared secret";
5850
5851 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5852 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5853 &ret_orig)))
5854 return;
5855
5856 Do_ADBG_BeginSubCase(c, "%s", case_str);
5857
5858 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_X25519,
5859 TEE_ECC_CURVE_25519)) {
5860 Do_ADBG_Log("X25519 not supported: skip subcase");
5861 goto out;
5862 }
5863
5864 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5865 ta_crypt_cmd_allocate_operation(c, &session, &op,
5866 TEE_ALG_X25519, TEE_MODE_DERIVE, 256)))
5867 goto out;
5868
5869 /* Allocate and initialize keypair of Alice */
5870 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5871 ta_crypt_cmd_allocate_transient_object(c, &session,
5872 TEE_TYPE_X25519_KEYPAIR, 256, &key_alice)))
5873 goto out;
5874
5875 param_count = 0;
5876
5877 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PUBLIC_VALUE,
5878 ARRAY(x25519_alice_public));
5879
5880 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PRIVATE_VALUE,
5881 ARRAY(x25519_alice_private));
5882
5883 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5884 ta_crypt_cmd_populate_transient_object(c, &session,
5885 key_alice, params, param_count)))
5886 goto out;
5887
5888 /* Associate Alices's keys with operation */
5889 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5890 ta_crypt_cmd_set_operation_key(c, &session, op,
5891 key_alice)))
5892 goto out;
5893
5894 /* Keys have been set, free key objects */
5895 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5896 ta_crypt_cmd_free_transient_object(c, &session,
5897 key_alice)))
5898 goto out;
5899
5900 /* Allocate shared secret output object */
5901 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5902 ta_crypt_cmd_allocate_transient_object(c, &session,
5903 TEE_TYPE_GENERIC_SECRET,
5904 sizeof(x25519_shared_secret), &sv_handle)))
5905 goto out;
5906
5907 /* Reset params */
5908 param_count = 0;
5909
5910 /* Set Bob's public key for Alice side */
5911 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PUBLIC_VALUE,
5912 ARRAY(x25519_bob_public));
5913
5914 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5915 ta_crypt_cmd_derive_key(c, &session, op, sv_handle,
5916 params, param_count)))
5917 goto out;
5918
5919 out_size = sizeof(out);
5920 memset(out, 0, sizeof(out));
5921 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5922 ta_crypt_cmd_get_object_buffer_attribute(c, &session,
5923 sv_handle, TEE_ATTR_SECRET_VALUE, out,
5924 &out_size)))
5925 goto out;
5926
5927 /* Check derived key */
5928 if (!ADBG_EXPECT_BUFFER(c, x25519_shared_secret,
5929 sizeof(x25519_shared_secret), out,
5930 out_size))
5931 goto out;
5932
5933 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5934 ta_crypt_cmd_free_operation(c, &session, op)))
5935 goto out;
5936
5937 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5938 ta_crypt_cmd_free_transient_object(c, &session,
5939 sv_handle)))
5940 goto out;
5941
5942 Do_ADBG_EndSubCase(c, "%s", case_str);
5943
5944 strncpy(case_str, "Bob side computes shared secret",
5945 sizeof(case_str) - 1);
5946
5947 Do_ADBG_BeginSubCase(c, "%s", case_str);
5948
5949 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5950 ta_crypt_cmd_allocate_operation(c, &session, &op,
5951 TEE_ALG_X25519, TEE_MODE_DERIVE, 256)))
5952 goto out;
5953
5954 /* Allocate and initialize keypair of Bob */
5955 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5956 ta_crypt_cmd_allocate_transient_object(c, &session,
5957 TEE_TYPE_X25519_KEYPAIR, 256, &key_bob)))
5958 goto out;
5959
5960 /* Reset params */
5961 param_count = 0;
5962
5963 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PUBLIC_VALUE,
5964 ARRAY(x25519_bob_public));
5965
5966 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PRIVATE_VALUE,
5967 ARRAY(x25519_bob_private));
5968
5969 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5970 ta_crypt_cmd_populate_transient_object(c, &session,
5971 key_bob, params, param_count)))
5972 goto out;
5973
5974 /* Associate Bob's keys with operation */
5975 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5976 ta_crypt_cmd_set_operation_key(c, &session, op,
5977 key_bob)))
5978 goto out;
5979
5980 /* Keys have been set, free key objects */
5981 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5982 ta_crypt_cmd_free_transient_object(c, &session,
5983 key_bob)))
5984 goto out;
5985
5986 /* Allocate shared secret output object */
5987 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5988 ta_crypt_cmd_allocate_transient_object(c, &session,
5989 TEE_TYPE_GENERIC_SECRET,
5990 sizeof(x25519_shared_secret), &sv_handle)))
5991 goto out;
5992
5993 /* Reset params */
5994 param_count = 0;
5995
5996 /* Set Alice's public key for Bob side */
5997 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PUBLIC_VALUE,
5998 ARRAY(x25519_alice_public));
5999
6000 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6001 ta_crypt_cmd_derive_key(c, &session, op, sv_handle,
6002 params, param_count)))
6003 goto out;
6004
6005 out_size = sizeof(out);
6006 memset(out, 0, sizeof(out));
6007 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6008 ta_crypt_cmd_get_object_buffer_attribute(c, &session,
6009 sv_handle, TEE_ATTR_SECRET_VALUE, out,
6010 &out_size)))
6011 goto out;
6012
6013 /* Check derived key */
6014 if (!ADBG_EXPECT_BUFFER(c, x25519_shared_secret,
6015 sizeof(x25519_shared_secret), out,
6016 out_size))
6017 goto out;
6018
6019 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6020 ta_crypt_cmd_free_operation(c, &session, op)))
6021 goto out;
6022
6023 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6024 ta_crypt_cmd_free_transient_object(c, &session,
6025 sv_handle)))
6026 goto out;
6027
6028out:
6029 Do_ADBG_EndSubCase(c, "%s", case_str);
6030 TEEC_CloseSession(&session);
6031}
6032ADBG_CASE_DEFINE(regression, 4015, xtest_tee_test_4015,
6033 "Test TEE Internal API Derive key X25519");
Valerii Chubarab9863c2022-08-12 07:42:29 +00006034
6035static void xtest_tee_test_4016_ed25519(ADBG_Case_t *c)
6036{
6037 TEEC_Session session = { };
6038 TEE_OperationHandle op = TEE_HANDLE_NULL;
6039 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
6040 TEE_Attribute key_attrs[2] = { };
6041 size_t num_key_attrs = 0;
6042 TEE_Attribute attrs[2] = { };
6043 size_t num_attrs = 0;
6044 uint8_t out[64] = { };
6045 size_t out_size = sizeof(out);
6046 size_t n = 0;
6047 uint32_t ret_orig = 0;
6048 size_t max_key_size = 0;
6049
6050 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6051 xtest_teec_open_session(&session, &crypt_user_ta_uuid,
6052 NULL, &ret_orig)))
6053 return;
6054
6055 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_ED25519,
6056 TEE_ECC_CURVE_25519)) {
6057 Do_ADBG_Log("ED25519 not supported: skip subcase");
6058 goto out;
6059 }
6060
6061 for (n = 0; n < ARRAY_SIZE(xtest_ac_eddsa_cases); n++) {
6062 const struct xtest_ac_case *tv = xtest_ac_eddsa_cases + n;
6063
6064 if (tv->algo != TEE_ALG_ED25519)
6065 continue;
6066
6067 num_attrs = 0;
6068 num_key_attrs = 0;
6069 max_key_size = tv->params.eddsa.private_len * 8;
6070
6071 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6072 ta_crypt_cmd_allocate_operation(c, &session, &op,
6073 TEE_ALG_ED25519, tv->mode, max_key_size)))
6074 goto out;
6075
6076 xtest_add_attr(&num_key_attrs, key_attrs,
6077 TEE_ATTR_ED25519_PUBLIC_VALUE,
6078 tv->params.eddsa.public,
6079 tv->params.eddsa.public_len);
6080
6081 if (tv->params.eddsa.flag == 1)
Jens Wiklander7596bd32022-12-02 15:43:37 +01006082 xtest_add_attr_value(&num_attrs, attrs,
6083 TEE_ATTR_EDDSA_PREHASH, 1, 0);
Valerii Chubarab9863c2022-08-12 07:42:29 +00006084
6085 if (tv->params.eddsa.context_len > 0)
6086 xtest_add_attr(&num_attrs, attrs, TEE_ATTR_EDDSA_CTX,
6087 tv->params.eddsa.context,
6088 tv->params.eddsa.context_len);
6089
6090 switch (tv->mode) {
6091 case TEE_MODE_SIGN:
6092 xtest_add_attr(&num_key_attrs, key_attrs,
6093 TEE_ATTR_ED25519_PRIVATE_VALUE,
6094 tv->params.eddsa.private,
6095 tv->params.eddsa.private_len);
6096
6097 if (!ADBG_EXPECT_TRUE(c,
6098 create_key(c, &session, max_key_size,
6099 TEE_TYPE_ED25519_KEYPAIR,
6100 key_attrs, num_key_attrs,
6101 &key_handle)))
6102 goto out;
6103
6104 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6105 ta_crypt_cmd_set_operation_key(c,
6106 &session, op, key_handle)))
6107 goto out;
6108
6109 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6110 ta_crypt_cmd_asymmetric_sign(c,
6111 &session, op,
6112 attrs, num_attrs, tv->ptx,
6113 tv->ptx_len, out, &out_size)))
6114 goto out;
6115
6116 ADBG_EXPECT_BUFFER(c, tv->ctx, tv->ctx_len, out, out_size);
6117
6118 break;
6119
6120 case TEE_MODE_VERIFY:
6121 if (!ADBG_EXPECT_TRUE(c,
6122 create_key(c, &session, max_key_size,
6123 TEE_TYPE_ED25519_PUBLIC_KEY,
6124 key_attrs, num_key_attrs,
6125 &key_handle)))
6126 goto out;
6127
6128 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6129 ta_crypt_cmd_set_operation_key(c,
6130 &session, op, key_handle)))
6131 goto out;
6132
6133 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6134 ta_crypt_cmd_asymmetric_verify(c, &session, op,
6135 attrs, num_attrs,
6136 tv->ptx,
6137 tv->ptx_len,
6138 tv->ctx,
6139 tv->ctx_len)))
6140 goto out;
6141 break;
6142
6143 default:
6144 break;
6145 }
6146
6147 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6148 ta_crypt_cmd_free_operation(c, &session, op)))
6149 goto out;
6150 }
6151out:
6152 TEEC_CloseSession(&session);
6153}
Jens Wiklander7b70ff82022-12-02 20:59:32 +01006154ADBG_CASE_DEFINE(regression, 4016, xtest_tee_test_4016_ed25519,
Valerii Chubarab9863c2022-08-12 07:42:29 +00006155 "Test TEE Internal API ED25519 sign/verify");